ZGlmZiAtLWdpdCBhL3NlY3VyZS9mdHBkLmMgYi9zZWN1cmUvZnRwZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWFhNWU2Li4wMDAwMDAwCi0tLSBhL3NlY3VyZS9mdHBkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKiBmdHBkLmMKLSoqIFJ1bWF0YUBtZwotKiogMTMuNi4xOTk5Ci0qKgotKiogRXJtaXR0bHVuZyBkZXIgWnVncmlmZnNyZWNodGUgYXVzIGRlbiBVc2VyZGF0ZW4uCi0qKgotKiogRGllc2VzIE9iamVrdCB3aXJkIHZvbSBmdHBpbXAgYXVzIGF1ZmdlcnVmZW4sIGRlciB3aWVkZXJ1bSB2b20gbWFzdGVyCi0qKiBhdWZnZXJ1ZmVuIHdpcmQsIHVtIGRpZSBadWdyaWZmc3JlY2h0ZSB6dSBwcnVlZmVuLgotKioKLSoqIEZ1a3Rpb25zd2Vpc2U6Ci0qKiArIEltIE1hc3RlciB3aXJkIHZvbSBVTklYLWZ0cGQgYXVzIEZ0cEFjY2VzcyAoL3NlY3VyZS9tYXN0ZXIvbmV0d29yaykKLSoqICAgYXVmZ2VydWZlbi4KLSoqICsgRGllc2VzIHJ1ZnQgZGFubiwgc29iYWxkIGVpbiBadWdyaWZmIGVya2FubnQgd2lyZAotKiogICBRdWVyeVJlYWQsIFF1ZXJ5V3JpdGUgb2RlciBRdWVyeURpciBhdWYuCi0qKiArIERpZXNlIGZyYWdlbiBkZW4gTWFzdGVyLCBvYiBkZXIgWnVncmlmZiBsZWdhbCBpc3QuCi0qKiArIFF1ZXJ5RGlyIGxpZWZlcnQgYXVjaCBnbGVpY2ggZGFzIEVyZ2VibmlzIG1pdC4KLSoqCi0qKiBVbSBmdHAtenVncmlmZmUg/GJlcndhY2hlbiB6dSBr9m5uZW4sIGthbm4gZGVyIGZ0cGQgZWluZSBsaXN0ZSBkZXIKLSoqIHVlYmVyd2FjaHRlbiBzcGllbGVyIGxpZWZlcm4gdW5kIGRlcmVuIFp1Z3JpZmZlIGF1ZiBkZW0gRlRQIEthbmFsIGF1c2dlYmVuLgotKioKLSoqIGFkZCggbmFtZSwgemVpdCApIC0gRlRQIFp1Z3JpZmZlIGRlcyBTcGllbGVycyAnbmFtZScgd2VyZGVuIHByb3Rva29sbGllcnQuCi0qKiAgICAgICAgICAgICAgICAgICAgIE5hY2ggJ3plaXQnIHdpcmQgZGllc2VyIFp1Z3JpZmYgYXV0b21hdGlzY2ggYmVlbmRldC4KLSoqICAgICAgICAgICAgICAgICAgICAgSXN0ICd6ZWl0JyA8PSAwLCB3aXIgYXVmIGV3aWcgdWViZXJ3YWNodC4gCi0qKiBzdWIoIG5hbWUgKSAgICAgICAtIEZUUCBTbm9vcCBmdWVyIFNwaWVsZXIgJ25hbWUnIGRpcmVrdCBhdWZoZWJlbi4KLSoqIGxpc3QoKSAgICAgICAgICAgIC0gTWFwcGluZyBkZXIgdWViZXJ3YWNodGVuIFNwaWVsZXIgenVydWVja2dlYmVuLgotKioKLSoqIEZJTEVTOgotKiogICAvc2VjdXJlL21hc3Rlci9uZXR3b3JrLmMKLSoqICAgL3NlY3VyZS9mdHBkLmMKLSoqICAgL3N0ZC9zaGVsbHMvZmlsZXN5cy9mdHBpbXAuYwotKiogICAvc2VjdXJlL0FSQ0gvZnRwZC5vCi0qKiAgIC9wL2RhZW1vbi9jaGFubmVsZC5pbml0Ci0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKLSNpbmNsdWRlICIvc3lzL2RhZW1vbi5oIgotCi0jZGVmaW5lIEZUUERTQVZFICIvc2VjdXJlL0FSQ0gvZnRwZCIKLSNkZWZpbmUgRlRQRF9DSCAiRlRQIgotI2RlZmluZSBCQk1BU1RFUiAiL3NlY3VyZS9iYm1hc3RlciIKLQotbWFwcGluZyBtb25pdG9yZWQ7Ci0vLyBadSBqZWRlbSBTcGllbGVybmFtZW4gd2lyZCB2ZXJtZXJrdCwgd2llIGxhbmdlIGRpZSBVZWJlcndhY2h1bmcgZGF1ZXJuIHNvbGwuCi0vLyBaYWhsZW4gPD0gMCBiZWRldXRlbiBmdWVyIGltbWVyLgotCi1ub21hc2sgdm9pZCBjcmVhdGUoKSB7Ci0gIGlmKCBjbG9uZXAodGhpc19vYmplY3QoKSkgKSB7Ci0gICAgZGVzdHJ1Y3QoIHRoaXNfb2JqZWN0KCkgKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgc2V0ZXVpZCggZ2V0dWlkKCkgKTsKLSAgaWYoICFyZXN0b3JlX29iamVjdChGVFBEU0FWRSkgKQotICAgIG1vbml0b3JlZCA9IChbXSk7Ci19Ci0KLW5vbWFzayBpbnQgcGxheWVyX2V4aXN0cyggc3RyaW5nIHVzZXIgKSB7Ci0gIHVzZXIgPSBsb3dlcl9jYXNlKHVzZXIpOwotICBpZiggIXN0cmluZ3AoIHVzZXIgKSB8fCBzaXplb2YoIHVzZXIgKSA8IDEgKSByZXR1cm4gMDsKLSAgcmV0dXJuIG1hc3RlcigpLT5maW5kX3VzZXJpbmZvKHVzZXIpOwotfQotCi1ub21hc2sgdmFyYXJncyBpbnQgYWRkKCBzdHJpbmcgdXNlciwgaW50IHRpbWVvdXQgKSB7Ci0gIGlmKCAhQVJDSF9TRUNVUklUWSApIHJldHVybiAtMTsKLSAgaWYoICFwbGF5ZXJfZXhpc3RzKHVzZXIpICkgcmV0dXJuIC0yOwotICBtb25pdG9yZWRbdXNlcl0gPSB0aW1lb3V0OwotICBzYXZlX29iamVjdCggRlRQRFNBVkUgKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLW5vbWFzayBpbnQgc3ViKCBzdHJpbmcgdXNlciApIHsKLSAgaWYoICFBUkNIX1NFQ1VSSVRZICkgcmV0dXJuIC0xOwotICBpZiggIXBsYXllcl9leGlzdHModXNlcikgKSByZXR1cm4gLTI7Ci0gIG1vbml0b3JlZCAtPSAoWyB1c2VyIF0pOwotICBzYXZlX29iamVjdCggRlRQRFNBVkUgKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLW5vbWFzayBtaXhlZCBsaXN0KCkgewotICBpZiggIUFSQ0hfU0VDVVJJVFkgKSByZXR1cm4gLTE7Ci0gIHJldHVybiBkZWVwX2NvcHkobW9uaXRvcmVkKTsKLX0KLQotI2RlZmluZSBORVdJTVAgInllcyIKLQotcHJpdmF0ZSBvYmplY3QgZmluZEZ0cEltcEZvciggc3RyaW5nIHVzZXIgKSB7Ci0jaWZkZWYgTkVXSU1QCi0gIHJldHVybiAiL3NlY3VyZS9pbXBmZXRjaCItPmltcEZvciggbG93ZXJfY2FzZSh1c2VyKSApOwotI2Vsc2UKLSAgb2JqZWN0IGltcDsKLSAgc3RyaW5nIGZuYW1lOwotCi0gIHVzZXIgPSBsb3dlcl9jYXNlKCB1c2VyICk7Ci0gIGZuYW1lID0gIi9mdHBpbXA6IiArIHVzZXI7Ci0gIGltcCA9IGZpbmRfb2JqZWN0KCBmbmFtZSApOwotICBpZiggIW9iamVjdHAoaW1wKSApIHsKLSAgICBpbXAgPSBjbG9uZV9vYmplY3QoICJzZWN1cmUvZnRwaW1wIiApOwotICAgIGltcC0+U2V0VXNlcih1c2VyKTsKLSAgICByZW5hbWVfb2JqZWN0KCBpbXAsIGZuYW1lICk7Ci0gIH0KLSAgcmV0dXJuIGltcDsKLSNlbmRpZgotfQotCi1wcml2YXRlIG5vbWFzayB2b2lkIG1zZyggc3RyaW5nIHVzZXIsIHN0cmluZyBtICkgewotICBpbnQgdGltZW91dDsKLSAgb2JqZWN0IHI7Ci0KLSAgaWYoICFzdHJpbmdwKHVzZXIpICkgcmV0dXJuOwotICBtICs9ICJcbiI7Ci0gIGlmKCAocj1maW5kX3BsYXllcigicnVtYXRhIikpICYmIHVzZXI9PSJhdGFtdXIiICkgewotICAgICB0aW1lb3V0ID0gQ0hNQVNURVItPnNlbmQoRlRQRF9DSCxmaW5kRnRwSW1wRm9yKHVzZXIpLCBtICk7Ci0gICAgIHRlbGxfb2JqZWN0KCByLCBzcHJpbnRmKCIlT1xuIiwgZmluZEZ0cEltcEZvcih1c2VyKSApICk7Ci0gIH0KLSAgQkJNQVNURVItPmZ0cGJiKHVzZXIsbSk7Ci0gIGlmKCAhbWVtYmVyKG1vbml0b3JlZCx1c2VyKSApIHJldHVybjsKLSAgdGltZW91dCA9IG1vbml0b3JlZFt1c2VyXTsKLSAgaWYoIHRpbWVvdXQgPiAwICYmIHRpbWVvdXQgPCB0aW1lKCkgKSB7Ci0gICAgc3ViKCB1c2VyICk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENITUFTVEVSLT5zZW5kKEZUUERfQ0gsZmluZEZ0cEltcEZvcih1c2VyKSwgbSApOwotfQotCi1ub21hc2sgaW50IHNlY3VyZSgpIHsKLSAgcmV0dXJuIHByZXZpb3VzX29iamVjdCgpPT1maW5kX29iamVjdChNQVNURVIpOwotfQotCi1ub21hc2sgbWl4ZWQgUXVlcnlSZWFkKCBzdHJpbmcgdXNlciwgc3RyaW5nIGZpbGUgKSB7Ci0gIGlmKCAhc2VjdXJlKCkgKSByZXR1cm4gLTE7Ci0gIGlmKCAoSVNfV0laQVJEKHVzZXIpIHx8IGZpbGVbMC4uNF09PSIvb3BlbiIpCi0gICAgICAmJiBmaWxlWzBdID09ICcvJwotICAgICAgJiYgTUFTVEVSLT52YWxpZF9yZWFkKGZpbGUsIHVzZXIsICJyZWFkX2ZpbGUiLCAwKQotICAgICAgKSB7Ci0gICAgbXNnKCB1c2VyLCAicmVhZCAiICsgZmlsZSApOwotICAgIHJldHVybiAiT0siOwotICB9IGVsc2UgewotICAgIHJldHVybiAiRkFJTCI7Ci0gIH0KLX0KLQotbm9tYXNrIG1peGVkIFF1ZXJ5V3JpdGUoIHN0cmluZyB1c2VyLCBzdHJpbmcgZmlsZSApIHsKLSAgaWYoICFzZWN1cmUoKSApIHJldHVybiAtMTsKLSAgaWYoIGZpbGVbMF0gPT0gJy8nCi0gICAgICAmJiBNQVNURVItPnZhbGlkX3dyaXRlKCBmaWxlLCB1c2VyLCAid3JpdGVfZmlsZSIsIDApCi0gICAgICApIHsKLSAgICBtc2coIHVzZXIsICJ3cml0ZSAiICsgZmlsZSApOwotICAgIHJldHVybiAiT0siOwotICB9IGVsc2UgewotICAgIHJldHVybiAiRkFJTCI7Ci0gIH0KLX0KLQotI2RlZmluZSBEQkcoeCkgaWYoZmluZF9wbGF5ZXIoInJ1bWF0YSIpKXt0ZWxsX29iamVjdChmaW5kX3BsYXllcigicnVtYXRhIiksIkZUUEQ6Iit4KyJcbiIpO30KLQotLy9ub21hc2sgbWl4ZWQgUXVlcnlEaXIoIHN0cmluZyB1c2VyLCBzdHJpbmcgZmlsZSApIHsKLS8vICBzdHJpbmcgcmVwbHk7Ci0vLyAgb2JqZWN0IGltcDsKLS8vCi0vLyAgaWYoICFzZWN1cmUoKSApIHJldHVybiAtMTsKLS8vICByZXBseSA9IFF1ZXJ5UmVhZCggdXNlciwgZmlsZSApOwotLy8gIGlmKCByZXBseT09IkZBSUwiICkgcmV0dXJuIC0xOwotLy8KLS8vICBpbXAgPSBmaW5kRnRwSW1wRm9yKCB1c2VyICk7Ci0vLyAgaWYoICFvYmplY3RwKGltcCkgKSByZXR1cm4gLTE7IC8vIHNob3VsZCBuZXZlciBoYXBwZW4KLS8vCi0vLyAgcmV0dXJuIGltcC0+R2V0RGlyKCBmaWxlICk7Ci0vL30KLQotbm9tYXNrIG1peGVkIFF1ZXJ5RGlyKCBzdHJpbmcgdXNlciwgc3RyaW5nIGZpbGUgKSB7Ci0gIGlmKCAhc2VjdXJlKCkgKSByZXR1cm4gLTE7Ci0gIGlmKCBmaWxlWzBdID09ICcvJwotICAgICAgJiYgTUFTVEVSLT52YWxpZF9yZWFkKCBmaWxlKyIvKiIsIHVzZXIsICJnZXRfZGlyIiwgMCkpCi0gICAgICByZXR1cm4gIk9LIjsKLSAgZWxzZSAKLSAgICByZXR1cm4gIkZBSUwiOwotfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL2Z0cGltcC5jIGIvc2VjdXJlL2Z0cGltcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWVlMzRjLi4wMDAwMDAwCi0tLSBhL3NlY3VyZS9mdHBpbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8vIE1vcmdlbkdyYXVlbiBNVURsaWIKLS8vCi0vLyBtYXN0ZXIvZnRwaW1wLmMgLS0gRlRQIEF2YXRhcgotLy8KLS8vICRJZDogZnRwaW1wLmMgNjQ0MCAyMDA3LTA4LTE4IDIzOjAwOjQ5WiBaZXNzdHJhICQKLS8vCi0vLyBzaWVoZSAvc2VjdXJlL2Z0cGQKLQotI3ByYWdtYSBzdHJvbmdfdHlwZXMKLQotI2luY2x1ZGUgIi9zZWN1cmUvbWFzdGVyLmgiCi0jZGVmaW5lIEZUUEQgIi9zZWN1cmUvZnRwZCIKLQotLy9wcml2YXRlIGluaGVyaXQgIi9zdGQvc2hlbGxzL2ZpbGVzeXMvZmlsZXN5cyI7Ci1wcml2YXRlIGluaGVyaXQgIi9zZWN1cmUvbWlzYy9maWxlc3lzL2ZpbGVzeXMiOwotCi1zdGF0aWMgc3RyaW5nIHVzZXI7IC8vIE5hbWUgZGVzIHp1Z2Vob2VyaWdlbiBVc2VycwotCi1ub21hc2sgcHJpdmF0ZSBpbnQgc2VjdXJlX2ltcGNhbGwoKSB7Ci0gIHJldHVybgotICAgIGdldHVpZChwcmV2aW91c19vYmplY3QoKSkgPT0gUk9PVElEICYmCi0gICAgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkgPT0gUk9PVElEOwotCi19Ci0KLS8vIE5hY2ggZGVtIEF1ZnJ1ZiB2b24gU2V0VXNlciB3aXJkIGRlciBGaWxlbmFtZSBnZWFlZG5lcnQsIHNvZGFzcwotLy8gZGFzIG5vcm1hbGUgY2xvbmVwIGluIGdldF9kaXIgbmljaHQgbWVociBnZWh0LiBIaWVyIGVpbiBlcnNhdHouCi1wcml2YXRlIG5vbWFzayBpbnQgbXlfaXNfY2xvbmUoKSB7Ci0gIHJldHVybiBtZW1iZXIob2JqZWN0X25hbWUodGhpc19vYmplY3QoKSksJzonKT49MDsKLX0KLQotbm9tYXNrIHZvaWQgY3JlYXRlKCkgewotICBpZiggIWNsb25lcCh0aGlzX29iamVjdCgpKSApIHsKLSAgICBzZXRfbmV4dF9yZXNldCggLTEgKTsgLy8gYmx1ZXByaW50IHNvbGwgbmljaHQgc3RlcmJlbgotICAgIHJldHVybjsKLSAgfQotICAvL2lmKCBzZWN1cmVfaW1wY2FsbCgpICkgOjpjcmVhdGUoKTsKLX0KLQotbm9tYXNrIGludCBTZXRVc2VyKCBzdHJpbmcgbmFtZSApIHsKLSAgaWYoICFzZWN1cmVfaW1wY2FsbCgpIHx8ICFjbG9uZXAodGhpc19vYmplY3QoKSkgKSByZXR1cm4gLTI7Ci0gIGlmKCBzdHJpbmdwKHVzZXIpICYmIHVzZXIgIT0gIiIgKSB7Ci0gICAgLy93cml0ZSggIlVzZXI9Iit1c2VyKyJcbiIgKTsKLSAgICByZXR1cm4gLTE7IC8vIHNjaG9uIGVpbiBuYW1lIGRhIQotICB9Ci0gIHVzZXIgPSBsb3dlcl9jYXNlKG5hbWUpOwotICBzZXRldWlkKCB1c2VyICk7Ci0gIHNldF9uZXh0X3Jlc2V0KCAxODAwICk7Ci19Ci0KLS8vIEdpYnQgZWluZW4gbmVnYXRpdmVuIFdlcnQgenVy/GNrLCB3ZW5uIGRpZSBEYXRlaSBuaWNodCBnZWxlc2VuIHdlcmRlbgotLy8ga2FubiBvZGVyIGVpbmVuIHN0cmluZywgZGVyIGRpZSBnZXNhbXRlbiBEYXRlbiBkZXMgVmVyemVpY2huaXNzZXMKLS8vIGVudGjkbHQuCi1ub21hc2sgbWl4ZWQgR2V0RGlyKHN0cmluZyBkaXIpCi17Ci0gIG1peGVkIHJldDsgcmV0ID0gIiI7Ci0gIGlmKCAhc2VjdXJlX2ltcGNhbGwoKSB8fCAhbXlfaXNfY2xvbmUoKSkgcmV0dXJuIC0yOwotICBpZiggIXN0cmluZ3AodXNlcikgfHwgdXNlcj09IiIgKSByZXR1cm4gLTE7Ci0gIF9sc19vdXRwdXQoIGRpciwgJnJldCwgdXNlciwgMHg4MyApOwotICBzZXRfbmV4dF9yZXNldCggMTgwMCApOwotICByZXR1cm4gcmV0OwotfQotCi1ub21hc2sgdm9pZCByZXNldCgpIHsKLSAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7Ci19Ci0KLXZhcmFyZ3MgbWl4ZWQgbW92ZSgpIHsKLSAgcmV0dXJuIC0xOwotfQotCi0vLyBGdWVyIGRpZSBNZWxkdW5nIGF1ZiBGVFAKLW5vbWFzayBzdHJpbmcgbmFtZSgpIHsKLSAgcmV0dXJuIGNhcGl0YWxpemUodXNlcik7Ci19CmRpZmYgLS1naXQgYS9zZWN1cmUvbWFzdGVyL25ldHdvcmsuYyBiL3NlY3VyZS9tYXN0ZXIvbmV0d29yay5jCmluZGV4IGU2ODFmODIuLmY2MGNjNDAgMTAwNjQ0Ci0tLSBhL3NlY3VyZS9tYXN0ZXIvbmV0d29yay5jCisrKyBiL3NlY3VyZS9tYXN0ZXIvbmV0d29yay5jCkBAIC02MCwxMjggKzYwLDYgQEAKICAgICByZXR1cm4gKHBhc3N3ZCA9PSBwd2hhc2gpOwogfQogCi0KLXN0YXRpYyB2b2lkIEZ0cEFjY2Vzcyggc3RyaW5nIGhvc3QsIHN0cmluZyBtZXNzYWdlLCBpbnQgcG9ydCApCi17Ci0gICAgc3RyaW5nICpjb21wLCByZXBseSwgaGVhZDsKLSNpZiBfX0VGVU5fREVGSU5FRF9fKHNlbmRfdWRwKQotICAgIGNvbXAgPSBlZnVuOjpleHBsb2RlKCBtZXNzYWdlLCAiXHQiICk7Ci0jZGVmaW5lIEZUUF9JRCAgIDAKLSNkZWZpbmUgRlRQX1NFUSAgMQotI2RlZmluZSBGVFBfVEFHICAyCi0jZGVmaW5lIEZUUF9DTUQgIDMKLSNkZWZpbmUgRlRQX0FSRzEgNAotI2RlZmluZSBGVFBfQVJHMiA1Ci0jZGVmaW5lIEZUUF9BUkczIDYKLQotICBpZiAoIHNpemVvZihjb21wKSA8PSBGVFBfQ01EIHx8IGxvd2VyX2Nhc2UoY29tcFtGVFBfVEFHXSkgIT0gInJlcSIgKXsKLSAgICAgIGxvZ19maWxlKCAiSU1QX01TR1MiLCAiSG9zdDogIiArIGhvc3QgKyAiOiIgKyBwb3J0ICsgIiAtICciICsKLSAgICAgICAgICAgICAgICBtZXNzYWdlICsgIidcbiIgKTsKLSAgICAgIHJldHVybjsKLSAgfQotCi0gIHJlcGx5ID0gIklOVkFMSUQiOwotCi0gIGhlYWQgPSBzcHJpbnRmKCAiJXNcdCVzXHRSUExZXHQlc1x0IiwKLSAgICAgICAgICAgICAgICAgIGNvbXBbRlRQX0lEXSwgY29tcFtGVFBfU0VRXSwgY29tcFtGVFBfQ01EXSApOwotCi0gIHN3aXRjaCAoIGxvd2VyX2Nhc2UoY29tcFtGVFBfQ01EXSkgKXsKLSAgY2FzZSAidXNlciI6Ci0gICAgICBpZiAoIHNpemVvZihjb21wKSA8PSBGVFBfQVJHMSApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmICggSVNfTEVBUk5FUihsb3dlcl9jYXNlKGNvbXBbRlRQX0FSRzFdKSkgKQotICAgICAgICAgIHJlcGx5ID0gIi9wbGF5ZXJzLyIgKyBsb3dlcl9jYXNlKGNvbXBbRlRQX0FSRzFdKTsKLSAgICAgIGVsc2UKLSAgICAgICAgICByZXBseSA9ICJOT05FIjsKLSAgICAgIGJyZWFrOwotCi0gIGNhc2UgInBhc3MiOgotICAgICAgaWYgKCBzaXplb2YoY29tcCkgPD0gRlRQX0FSRzIgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICBjb21wW0ZUUF9BUkcxXSA9IGxvd2VyX2Nhc2UoY29tcFtGVFBfQVJHMV0pOwotCi0gICAgICBpZiAoIElTX0xFQVJORVIoY29tcFtGVFBfQVJHMV0pICYmCi0gICAgICAgICAgICEiL3NlY3VyZS9tYXN0ZXIiLT5RdWVyeVRCYW5pc2hlZChjb21wW0ZUUF9BUkcxXSkgKXsKLSAgICAgICAgICBpZiAoIENoZWNrUGFzc3dkKCBjb21wW0ZUUF9BUkcxXSwgY29tcFtGVFBfQVJHMl0gKSApCi0gICAgICAgICAgICAgIHJlcGx5ID0gIk9LIjsKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgaWYgKCBnZXRfd2l6X2xldmVsKCBjb21wW0ZUUF9BUkcxXSApIDwgQVJDSF9MVkwgKQotICAgICAgICAgICAgICAgICAgbG9nX2ZpbGUoICJMT0dJTkZBSUwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICJQQVNTV09SRDogICAgICAoRlRQKSAgICAgJXMgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcFtGVFBfQVJHMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RpbWUodGltZSgpKSApICk7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIGxvZ19maWxlKCAiQVJDSC9MT0dJTkZBSUwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICJQQVNTV09SRDogICAgICAoRlRQKSAgICAgJXMgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcFtGVFBfQVJHMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RpbWUodGltZSgpKSApICk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICAgIHJlcGx5ID0gIkZBSUwiOwotICAgICAgYnJlYWs7Ci0KLSAgY2FzZSAicmVhZCI6Ci1ERUJVRygiLUZ0cEFjY2Vzcy0tLS1cbkhvc3Q6Iitob3N0KyJNZXNzYWdlOlxuIittZXNzYWdlKyJcbi0tLS0tLS0tLS0tLS0tXG4iKTsKLSAgICAgIGlmICggc2l6ZW9mKGNvbXApIDw9IEZUUF9BUkcyICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgaWYgKCBjb21wW0ZUUF9BUkcyXVswXSA9PSAnLycgJiYKLSAgICAgICAgICAgdmFsaWRfcmVhZCggY29tcFtGVFBfQVJHMl0sIGxvd2VyX2Nhc2UoY29tcFtGVFBfQVJHMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAicmVhZF9maWxlIiwgMCApICl7Ci0KLSAgICAgICAgICBCQk1BU1RFUi0+ZnRwYmIoIGxvd2VyX2Nhc2UoY29tcFtGVFBfQVJHMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWQgIiArIGNvbXBbRlRQX0FSRzJdICsgIlxuIiApOwotICAgICAgICAgIHJlcGx5ID0gIk9LIjsKLSAgICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgICAgcmVwbHkgPSAiRkFJTCI7Ci0gICAgICBicmVhazsKLQotICBjYXNlICJ3cml0IjoKLURFQlVHKCItRnRwQWNjZXNzLS0tLVxuSG9zdDoiK2hvc3QrIk1lc3NhZ2U6XG4iK21lc3NhZ2UrIlxuLS0tLS0tLS0tLS0tLS1cbiIpOwotICAgICAgaWYgKCBzaXplb2YoY29tcCkgPD0gRlRQX0FSRzIgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICBpZiAoIGNvbXBbRlRQX0FSRzJdWzBdID09ICcvJyAmJgotICAgICAgICAgICB2YWxpZF93cml0ZSggY29tcFtGVFBfQVJHMl0sIGxvd2VyX2Nhc2UoY29tcFtGVFBfQVJHMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfZmlsZSIsIDAgKSApewotCi0gICAgICAgICAgQkJNQVNURVItPmZ0cGJiKCBsb3dlcl9jYXNlKGNvbXBbRlRQX0FSRzFdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSAiICsgY29tcFtGVFBfQVJHMl0gKyAiXG4iICk7Ci0gICAgICAgICAgcmVwbHkgPSAiT0siOwotICAgICAgICAgIH0KLSAgICAgICBlbHNlCi0gICAgICAgICAgcmVwbHkgPSAiRkFJTCI7Ci0gICAgICBicmVhazsKLQotICBjYXNlICJsaXN0IjoKLURFQlVHKCItRnRwQWNjZXNzLS0tLVxuSG9zdDoiK2hvc3QrIk1lc3NhZ2U6XG4iK21lc3NhZ2UrIlxuLS0tLS0tLS0tLS0tLS1cbiIpOwotICAgICAgaWYgKCBzaXplb2YoY29tcCkgPD0gRlRQX0FSRzIgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICBpZiAoIGNvbXBbRlRQX0FSRzJdWzBdID09ICcvJyAmJgotICAgICAgICAgICB2YWxpZF9yZWFkKCBjb21wW0ZUUF9BUkcyXSwgbG93ZXJfY2FzZShjb21wW0ZUUF9BUkcxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICJyZWFkX2ZpbGUiLCAwICkgKQotICAgICAgICAgIHJlcGx5ID0gIk9LIjsKLSAgICAgIGVsc2UKLSAgICAgICAgICByZXBseSA9ICJGQUlMIjsKLSAgICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6Ci1ERUJVRygiLUZ0cEFjY2Vzcy0tLS1cbkhvc3Q6Iitob3N0KyJNZXNzYWdlOlxuIittZXNzYWdlKyJcbi0tLS0tLS0tLS0tLS0tXG4iKTsKLSAgICAgIGxvZ19maWxlKCAiSU1QX01TR1MiLCAiSG9zdDogIiArIGhvc3QgKyAiOiIgKyBwb3J0ICsgIiAtICciICsKLSAgICAgICAgICAgICAgICBtZXNzYWdlICsgIidcbiIgKTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgc2VuZF91ZHAoIGhvc3QsIHBvcnQsIGhlYWQrcmVwbHkgKTsKLSNlbmRpZgotfQotCi0KIHN0YXRpYyBpbnQgZG9SZWFkTWFpbCggc3RyaW5nIGZpbGUgKQogewogICAgIHN0cmluZyBzdHIsICpsaW5lcywgKnBhcnRzLCAqdG1wOwpAQCAtNDEwLDE3ICsyODgsNiBAQAogICAgIHJldHVybjsKICAgfQogCi0gIGlmIChtZXNzYWdlWzAuLjRdPT0iTkZUUEQiKSB7Ci0jaWYgX19IT1NUX05BTUVfXz09TVVESE9TVAotICAgIGlmIChob3N0IT1GVFBEX0lQKSB7Ci0gICAgICBERUJVRyhzcHJpbnRmKCJJTlZBTElEIEhPU1Q6ICVzXG4iLGhvc3QpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLSAgICBGdHBBY2Nlc3MoaG9zdCxtZXNzYWdlLHBvcnQpOwotICAgIHJldHVybjsKLSAgfQotCiAgIGlmIChtZXNzYWdlWzAuLjldPT0idWRwX3F1ZXJ5OiIpIHsKICAgICByZXR1cm4gdWRwX3F1ZXJ5KG1lc3NhZ2VbMTAuLl0saG9zdCxwb3J0KTsKICAgfQo=