LyogCiAqIEltcGxlbWVudGF0aW9uIG9mIFZFUi5ETEwKICogCiAqIENvcHlyaWdodCAxOTk2IE1hcmN1cyBNZWlzc25lcgogKi8KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgIndpbmRvd3MuaCIKI2luY2x1ZGUgIndpbi5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgImhlYXAuaCIKI2luY2x1ZGUgInZlci5oIgojaW5jbHVkZSAibHpleHBhbmQuaCIKI2luY2x1ZGUgIm1vZHVsZS5oIgojaW5jbHVkZSAibmVleGUuaCIKI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiNpbmNsdWRlICJkZWJ1Zy5oIgojaW5jbHVkZSAieG1hbGxvYy5oIgojaW5jbHVkZSAid2lucmVnLmgiCgojZGVmaW5lIExaUkVBRCh3aGF0KSBcCiAgaWYgKHNpemVvZigqd2hhdCkhPUxaUmVhZDMyKGx6ZmQsd2hhdCxzaXplb2YoKndoYXQpKSkgcmV0dXJuIDA7CiNkZWZpbmUgTFpURUxMKGx6ZmQpIExaU2VlazMyKGx6ZmQsIDAsIFNFRUtfQ1VSKTsKCmludApyZWFkX25lX2hlYWRlcihIRklMRTMyIGx6ZmQsc3RydWN0IG5lX2hlYWRlcl9zICpuZWhkKSB7CglzdHJ1Y3QJbXpfaGVhZGVyX3MJbXpoOwoKCUxaU2VlazMyKGx6ZmQsMCxTRUVLX1NFVCk7CglpZiAoc2l6ZW9mKG16aCkhPUxaUmVhZDMyKGx6ZmQsJm16aCxzaXplb2YobXpoKSkpCgkJcmV0dXJuIDA7CglpZiAobXpoLm16X21hZ2ljIT1NWl9TSUdOQVRVUkUpCgkJcmV0dXJuIDA7CglMWlNlZWszMihsemZkLG16aC5uZV9vZmZzZXQsU0VFS19TRVQpOwoJTFpSRUFEKG5laGQpOwoJaWYgKG5laGQtPm5lX21hZ2ljID09IE5FX1NJR05BVFVSRSkgewoJCUxaU2VlazMyKGx6ZmQsbXpoLm5lX29mZnNldCxTRUVLX1NFVCk7CgkJcmV0dXJuIDE7Cgl9CglmcHJpbnRmKHN0ZGVyciwibWlzYy92ZXIuYzpyZWFkX25lX2hlYWRlcjpjYW4ndCBoYW5kbGUgUEUgZmlsZXMgeWV0LlxuIik7CgkvKiBtdXN0IGhhbmRsZSBQRSBmaWxlcyB0b28uIExhdGVyLiAqLwoJcmV0dXJuIDA7Cn0KCgppbnQKZmluZF9uZV9yZXNvdXJjZSgKCUhGSUxFMzIgbHpmZCxzdHJ1Y3QgbmVfaGVhZGVyX3MgKm5laGQsU0VHUFRSIHR5cGVpZCxTRUdQVFIgcmVzaWQsCglCWVRFICoqcmVzZGF0YSxpbnQgKnJlc2xlbixEV09SRCAqb2ZmCikgewoJTkVfVFlQRUlORk8JdGk7CglORV9OQU1FSU5GTwluaTsKCWludAkJaTsKCVdPUkQJCXNoaWZ0Y291bnQ7CglEV09SRAkJbmVoZG9mZnNldDsKCgluZWhkb2Zmc2V0ID0gTFpURUxMKGx6ZmQpOwoJTFpTZWVrMzIobHpmZCxuZWhkLT5yZXNvdXJjZV90YWJfb2Zmc2V0LFNFRUtfQ1VSKTsKCUxaUkVBRCgmc2hpZnRjb3VudCk7CglkcHJpbnRmX3ZlcihzdGRkZWIsInNoaWZ0Y291bnQgaXMgJWRcbiIsc2hpZnRjb3VudCk7CglkcHJpbnRmX3ZlcihzdGRkZWIsInJlYWRpbmcgcmVzb3VyY2UgdHlwZWluZm8gZGlyLlxuIik7CgoJaWYgKCFISVdPUkQodHlwZWlkKSkgdHlwZWlkID0gKFNFR1BUUikoTE9XT1JEKHR5cGVpZCkgfCAweDgwMDApOwoJaWYgKCFISVdPUkQocmVzaWQpKSAgcmVzaWQgID0gKFNFR1BUUikoTE9XT1JEKHJlc2lkKSB8IDB4ODAwMCk7Cgl3aGlsZSAoMSkgewoJCWludAlza2lwZmxhZzsKCgkJTFpSRUFEKCZ0aSk7CgkJaWYgKCF0aS50eXBlX2lkKQoJCQlyZXR1cm4gMDsKCQlkcHJpbnRmX3ZlcihzdGRkZWIsIiAgICB0aS50eXBlaWQgPSUwNHgsY291bnQ9JWRcbiIsdGkudHlwZV9pZCx0aS5jb3VudCk7CgkJc2tpcGZsYWc9MDsKCQlpZiAoIUhJV09SRCh0eXBlaWQpKSB7CgkJCWlmICgodGkudHlwZV9pZCYweDgwMDApJiYodHlwZWlkIT10aS50eXBlX2lkKSkKCQkJCXNraXBmbGFnPTE7CgkJfSBlbHNlIHsKCQkJaWYgKHRpLnR5cGVfaWQgJiAweDgwMDApIHsKCQkJCXNraXBmbGFnPTE7IAoJCQl9IGVsc2UgewoJCQkJQllURQlsZW47CgkJCQljaGFyCSpzdHI7CgkJCQlEV09SRAl3aGVyZWxlZnQ7CgoJCQkJd2hlcmVsZWZ0ID0gTFpURUxMKGx6ZmQpOwoJCQkJTFpTZWVrMzIoCgkJCQkJbHpmZCwKCQkJCQluZWhkb2Zmc2V0K25laGQtPnJlc291cmNlX3RhYl9vZmZzZXQrdGkudHlwZV9pZCwKCQkJCQlTRUVLX1NFVAoJCQkJKTsKCQkJCUxaUkVBRCgmbGVuKTsKCQkJCXN0cj14bWFsbG9jKGxlbik7CgkJCQlpZiAobGVuIT1MWlJlYWQzMihsemZkLHN0cixsZW4pKQoJCQkJCXJldHVybiAwOwoJCQkJZHByaW50Zl92ZXIoc3RkZGViLCJyZWFkICVzIHRvIGNvbXBhcmUgaXQgd2l0aCAlc1xuIiwKCQkJCQlzdHIsKGNoYXIqKVBUUl9TRUdfVE9fTElOKHR5cGVpZCkKCQkJCSk7CgkJCQlpZiAobHN0cmNtcGkzMkEoc3RyLChjaGFyKilQVFJfU0VHX1RPX0xJTih0eXBlaWQpKSkKCQkJCQlza2lwZmxhZz0xOwoJCQkJZnJlZShzdHIpOwoJCQkJTFpTZWVrMzIobHpmZCx3aGVyZWxlZnQsU0VFS19TRVQpOwoJCQl9CgkJfQoJCWlmIChza2lwZmxhZykgewoJCQlMWlNlZWszMihsemZkLHRpLmNvdW50KnNpemVvZihuaSksU0VFS19DVVIpOwoJCQljb250aW51ZTsKCQl9CgkJZm9yIChpPTA7aTx0aS5jb3VudDtpKyspIHsKCQkJV09SRAkqcmRhdGE7CgkJCWludAlsZW47CgoJCQlMWlJFQUQoJm5pKTsKCQkJZHByaW50Zl92ZXIoc3RkZGViLCIJbmkuaWQ9JTR4LG9mZnNldD0lZCxsZW5ndGg9JWRcbiIsCgkJCQluaS5pZCxuaS5vZmZzZXQsbmkubGVuZ3RoCgkJCSk7CgkJCXNraXBmbGFnPTE7CgkJCWlmICghSElXT1JEKHJlc2lkKSkgewoJCQkJaWYgKG5pLmlkID09IHJlc2lkKQoJCQkJCXNraXBmbGFnPTA7CgkJCX0gZWxzZSB7CgkJCQlpZiAoIShuaS5pZCAmIDB4ODAwMCkpIHsKCQkJCQlCWVRFCWxlbjsKCQkJCQljaGFyCSpzdHI7CgkJCQkJRFdPUkQJd2hlcmVsZWZ0OwoKCQkJCQl3aGVyZWxlZnQgPSBMWlRFTEwobHpmZCk7CgkJCQkJICBMWlNlZWszMigKCQkJCQkJbHpmZCwKCQkJCQkJbmVoZG9mZnNldCtuZWhkLT5yZXNvdXJjZV90YWJfb2Zmc2V0K25pLmlkLAoJCQkJCQlTRUVLX1NFVAoJCQkJCSk7CgkJCQkJTFpSRUFEKCZsZW4pOwoJCQkJCXN0cj14bWFsbG9jKGxlbik7CgkJCQkJaWYgKGxlbiE9TFpSZWFkMzIobHpmZCxzdHIsbGVuKSkKCQkJCQkJcmV0dXJuIDA7CgkJCQkJZHByaW50Zl92ZXIoc3RkZGViLCJyZWFkICVzIHRvIGNvbXBhcmUgaXQgd2l0aCAlc1xuIiwKCQkJCQkJc3RyLChjaGFyKilQVFJfU0VHX1RPX0xJTih0eXBlaWQpCgkJCQkJKTsKCQkJCQlpZiAoIWxzdHJjbXBpMzJBKHN0ciwoY2hhciopUFRSX1NFR19UT19MSU4odHlwZWlkKSkpCgkJCQkJCXNraXBmbGFnPTA7CgkJCQkJZnJlZShzdHIpOwoJCQkJCUxaU2VlazMyKGx6ZmQsd2hlcmVsZWZ0LFNFRUtfU0VUKTsKCQkJCX0KCQkJfQoJCQlpZiAoc2tpcGZsYWcpCgkJCQljb250aW51ZTsKCQkJTFpTZWVrMzIobHpmZCwoKGludCluaS5vZmZzZXQ8PHNoaWZ0Y291bnQpLFNFRUtfU0VUKTsKCQkJKm9mZgk9IChpbnQpbmkub2Zmc2V0PDxzaGlmdGNvdW50OwoJCQlsZW4JPSBuaS5sZW5ndGg8PHNoaWZ0Y291bnQ7CgkJCXJkYXRhPShXT1JEKil4bWFsbG9jKGxlbik7CgkJCWlmIChsZW4hPUxaUmVhZDMyKGx6ZmQscmRhdGEsbGVuKSkgewoJCQkJZnJlZShyZGF0YSk7CgkJCQlyZXR1cm4gMDsKCQkJfQoJCQlkcHJpbnRmX3ZlcihzdGRkZWIsInJlc291cmNlIGZvdW5kLlxuIik7CgkJCSpyZXNkYXRhPSAoQllURSopcmRhdGE7CgkJCSpyZXNsZW4JPSBsZW47CgkJCXJldHVybiAxOwoJCX0KCX0KfQoKLyogR2V0RmlsZVJlc291cmNlU2l6ZQkJCQlbVkVSLjJdICovCkRXT1JECkdldEZpbGVSZXNvdXJjZVNpemUoTFBDU1RSIGZpbGVuYW1lLFNFR1BUUiByZXN0eXBlLFNFR1BUUiByZXNpZCxMUERXT1JEIG9mZikgewoJSEZJTEUzMglsemZkOwoJT0ZTVFJVQ1QJb2ZzOwoJQllURQkqcmVzZGF0YTsKCWludAlyZXNsZW47CglzdHJ1Y3QJbmVfaGVhZGVyX3MJbmVoZDsKCglkcHJpbnRmX3ZlcihzdGRkZWIsIkdldEZpbGVSZXNvdXJjZVNpemUoJXMsJWx4LCVseCwlcClcbiIsCgkJZmlsZW5hbWUsKExPTkcpcmVzdHlwZSwoTE9ORylyZXNpZCxvZmYKCSk7CglsemZkPUxaT3BlbkZpbGUzMkEoZmlsZW5hbWUsJm9mcyxPRl9SRUFEKTsKCWlmIChsemZkPT0wKQoJCXJldHVybiAwOwoJaWYgKCFyZWFkX25lX2hlYWRlcihsemZkLCZuZWhkKSkgewoJCUxaQ2xvc2UzMihsemZkKTsKCQlyZXR1cm4gMDsKCX0KCWlmICghZmluZF9uZV9yZXNvdXJjZShsemZkLCZuZWhkLHJlc3R5cGUscmVzaWQsJnJlc2RhdGEsJnJlc2xlbixvZmYpKSB7CgkJTFpDbG9zZTMyKGx6ZmQpOwoJCXJldHVybiAwOwoJfQoJZnJlZShyZXNkYXRhKTsKCUxaQ2xvc2UzMihsemZkKTsKCXJldHVybiByZXNsZW47Cn0KCi8qIEdldEZpbGVSZXNvdXJjZQkJCQlbVkVSLjNdICovCkRXT1JECkdldEZpbGVSZXNvdXJjZShMUENTVFIgZmlsZW5hbWUsU0VHUFRSIHJlc3R5cGUsU0VHUFRSIHJlc2lkLAoJCURXT1JEIG9mZixEV09SRCBkYXRhbGVuLExQVk9JRCBkYXRhCikgewoJSEZJTEUzMglsemZkOwoJT0ZTVFJVQ1QJb2ZzOwoJQllURQkqcmVzZGF0YTsKCWludAlyZXNsZW49ZGF0YWxlbjsKCXN0cnVjdAluZV9oZWFkZXJfcwluZWhkOwoJZHByaW50Zl92ZXIoc3RkZGViLCJHZXRGaWxlUmVzb3VyY2UoJXMsJWx4LCVseCwlbGQsJWxkLCVwKVxuIiwKCQlmaWxlbmFtZSwoTE9ORylyZXN0eXBlLChMT05HKXJlc2lkLG9mZixkYXRhbGVuLGRhdGEKCSk7CgoJbHpmZD1MWk9wZW5GaWxlMzJBKGZpbGVuYW1lLCZvZnMsT0ZfUkVBRCk7CglpZiAobHpmZD09MCkKCQlyZXR1cm4gMDsKCWlmICghb2ZmKSB7CgkJaWYgKCFyZWFkX25lX2hlYWRlcihsemZkLCZuZWhkKSkgewoJCQlMWkNsb3NlMzIobHpmZCk7CgkJCXJldHVybiAwOwoJCX0KCQlpZiAoIWZpbmRfbmVfcmVzb3VyY2UobHpmZCwmbmVoZCxyZXN0eXBlLHJlc2lkLCZyZXNkYXRhLCZyZXNsZW4sJm9mZikpIHsKCQkJTFpDbG9zZTMyKGx6ZmQpOwoJCQlyZXR1cm4gMDsKCQl9CgkJZnJlZShyZXNkYXRhKTsKCX0KCUxaU2VlazMyKGx6ZmQsb2ZmLFNFRUtfU0VUKTsKCWlmIChyZXNsZW4+ZGF0YWxlbikKCQlyZXNsZW49ZGF0YWxlbjsKCUxaUmVhZDMyKGx6ZmQsZGF0YSxyZXNsZW4pOwoJTFpDbG9zZTMyKGx6ZmQpOwoJcmV0dXJuIHJlc2xlbjsKfQoKLyogR2V0RmlsZVZlcnNpb25JbmZvU2l6ZQkJCVtWRVIuNl0gKi8KRFdPUkQKR2V0RmlsZVZlcnNpb25JbmZvU2l6ZTE2KExQQ1NUUiBmaWxlbmFtZSxMUERXT1JEIGhhbmRsZSkgewoJRFdPUkQJbGVuLHJldDsKCUJZVEUJYnVmWzcyXTsKCVZTX0ZJWEVERklMRUlORk8gKnZmZmk7CgoJZHByaW50Zl92ZXIoc3RkZGViLCJHZXRGaWxlVmVyc2lvbkluZm9TaXplMTYoJXMsJXApXG4iLGZpbGVuYW1lLGhhbmRsZSk7CglsZW49R2V0RmlsZVJlc291cmNlU2l6ZShmaWxlbmFtZSxWU19GSUxFX0lORk8sVlNfVkVSU0lPTl9JTkZPLGhhbmRsZSk7CglpZiAoIWxlbikKCQlyZXR1cm4gMDsKCXJldD1HZXRGaWxlUmVzb3VyY2UoCgkJZmlsZW5hbWUsVlNfRklMRV9JTkZPLFZTX1ZFUlNJT05fSU5GTywqaGFuZGxlLHNpemVvZihidWYpLGJ1ZgoJKTsKCWlmICghcmV0KQoJCXJldHVybiAwOwoKCXZmZmk9KFZTX0ZJWEVERklMRUlORk8qKShidWYrMHgxNCk7CglpZiAodmZmaS0+ZHdTaWduYXR1cmUgIT0gVlNfRkZJX1NJR05BVFVSRSkKCQlyZXR1cm4gMDsKCWlmICgqKFdPUkQqKWJ1ZiA8IGxlbikKCQlsZW4gPSAqKFdPUkQqKWJ1ZjsKCWRwcmludGZfdmVyKHN0ZGRlYiwiLT5zdHJ1Y3Zlcj0lbGQuJWxkLGZpbGV2ZXI9JWxkLiVsZCxwcm9kdWN0dmVyPSVsZC4lbGQsZmxhZ21hc2s9JWx4LGZsYWdzPSVseCxPUz0iLAoJCSh2ZmZpLT5kd1N0cnVjVmVyc2lvbj4+MTYpLHZmZmktPmR3U3RydWNWZXJzaW9uJjB4RkZGRiwKCQl2ZmZpLT5kd0ZpbGVWZXJzaW9uTVMsdmZmaS0+ZHdGaWxlVmVyc2lvbkxTLAoJCXZmZmktPmR3UHJvZHVjdFZlcnNpb25NUyx2ZmZpLT5kd1Byb2R1Y3RWZXJzaW9uTFMsCgkJdmZmaS0+ZHdGaWxlRmxhZ3NNYXNrLHZmZmktPmR3RmlsZUZsYWdzCgkpOwoJc3dpdGNoICh2ZmZpLT5kd0ZpbGVPUyYweEZGRkYwMDAwKSB7CgljYXNlIFZPU19ET1M6ZHByaW50Zl92ZXIoc3RkZGViLCJET1MsIik7YnJlYWs7CgljYXNlIFZPU19PUzIxNjpkcHJpbnRmX3ZlcihzdGRkZWIsIk9TLzItMTYsIik7YnJlYWs7CgljYXNlIFZPU19PUzIzMjpkcHJpbnRmX3ZlcihzdGRkZWIsIk9TLzItMzIsIik7YnJlYWs7CgljYXNlIFZPU19OVDpkcHJpbnRmX3ZlcihzdGRkZWIsIk5ULCIpO2JyZWFrOwoJY2FzZSBWT1NfVU5LTk9XTjoKCWRlZmF1bHQ6CgkJZHByaW50Zl92ZXIoc3RkZGViLCJVTktOT1dOKCVsZCksIix2ZmZpLT5kd0ZpbGVPUyYweEZGRkYwMDAwKTticmVhazsKCX0KCXN3aXRjaCAodmZmaS0+ZHdGaWxlT1MgJiAweEZGRkYpIHsKCWNhc2UgVk9TX19CQVNFOmRwcmludGZfdmVyKHN0ZGRlYiwiQkFTRSIpO2JyZWFrOwoJY2FzZSBWT1NfX1dJTkRPV1MxNjpkcHJpbnRmX3ZlcihzdGRkZWIsIldJTjE2Iik7YnJlYWs7CgljYXNlIFZPU19fV0lORE9XUzMyOmRwcmludGZfdmVyKHN0ZGRlYiwiV0lOMzIiKTticmVhazsKCWNhc2UgVk9TX19QTTE2OmRwcmludGZfdmVyKHN0ZGRlYiwiUE0xNiIpO2JyZWFrOwoJY2FzZSBWT1NfX1BNMzI6ZHByaW50Zl92ZXIoc3RkZGViLCJQTTMyIik7YnJlYWs7CglkZWZhdWx0OmRwcmludGZfdmVyKHN0ZGRlYiwiVU5LTk9XTiglbGQpIix2ZmZpLT5kd0ZpbGVPUyYweEZGRkYpO2JyZWFrOwoJfQoJc3dpdGNoICh2ZmZpLT5kd0ZpbGVUeXBlKSB7CglkZWZhdWx0OgoJY2FzZSBWRlRfVU5LTk9XTjoKCQlkcHJpbnRmX3ZlcihzdGRkZWIsImZpbGV0eXBlPVVua25vd24oJWxkKSIsdmZmaS0+ZHdGaWxlVHlwZSk7CgkJYnJlYWs7CgljYXNlIFZGVF9BUFA6ZHByaW50Zl92ZXIoc3RkZGViLCJmaWxldHlwZT1BUFAiKTticmVhazsKCWNhc2UgVkZUX0RMTDpkcHJpbnRmX3ZlcihzdGRkZWIsImZpbGV0eXBlPURMTCIpO2JyZWFrOwoJY2FzZSBWRlRfRFJWOgoJCWRwcmludGZfdmVyKHN0ZGRlYiwiZmlsZXR5cGU9RFJWLCIpOwoJCXN3aXRjaCh2ZmZpLT5kd0ZpbGVTdWJ0eXBlKSB7CgkJZGVmYXVsdDoKCQljYXNlIFZGVDJfVU5LTk9XTjoKCQkJZHByaW50Zl92ZXIoc3RkZGViLCJVTktOT1dOKCVsZCkiLHZmZmktPmR3RmlsZVN1YnR5cGUpOwoJCQlicmVhazsKCQljYXNlIFZGVDJfRFJWX1BSSU5URVI6CgkJCWRwcmludGZfdmVyKHN0ZGRlYiwiUFJJTlRFUiIpOwoJCQlicmVhazsKCQljYXNlIFZGVDJfRFJWX0tFWUJPQVJEOgoJCQlkcHJpbnRmX3ZlcihzdGRkZWIsIktFWUJPQVJEIik7CgkJCWJyZWFrOwoJCWNhc2UgVkZUMl9EUlZfTEFOR1VBR0U6CgkJCWRwcmludGZfdmVyKHN0ZGRlYiwiTEFOR1VBR0UiKTsKCQkJYnJlYWs7CgkJY2FzZSBWRlQyX0RSVl9ESVNQTEFZOgoJCQlkcHJpbnRmX3ZlcihzdGRkZWIsIkRJU1BMQVkiKTsKCQkJYnJlYWs7CgkJY2FzZSBWRlQyX0RSVl9NT1VTRToKCQkJZHByaW50Zl92ZXIoc3RkZGViLCJNT1VTRSIpOwoJCQlicmVhazsKCQljYXNlIFZGVDJfRFJWX05FVFdPUks6CgkJCWRwcmludGZfdmVyKHN0ZGRlYiwiTkVUV09SSyIpOwoJCQlicmVhazsKCQljYXNlIFZGVDJfRFJWX1NZU1RFTToKCQkJZHByaW50Zl92ZXIoc3RkZGViLCJTWVNURU0iKTsKCQkJYnJlYWs7CgkJY2FzZSBWRlQyX0RSVl9JTlNUQUxMQUJMRToKCQkJZHByaW50Zl92ZXIoc3RkZGViLCJJTlNUQUxMQUJMRSIpOwoJCQlicmVhazsKCQljYXNlIFZGVDJfRFJWX1NPVU5EOgoJCQlkcHJpbnRmX3ZlcihzdGRkZWIsIlNPVU5EIik7CgkJCWJyZWFrOwoJCWNhc2UgVkZUMl9EUlZfQ09NTToKCQkJZHByaW50Zl92ZXIoc3RkZGViLCJDT01NIik7CgkJCWJyZWFrOwoJCWNhc2UgVkZUMl9EUlZfSU5QVVRNRVRIT0Q6CgkJCWRwcmludGZfdmVyKHN0ZGRlYiwiSU5QVVRNRVRIT0QiKTsKCQkJYnJlYWs7CgkJfQoJCWJyZWFrOwoJY2FzZSBWRlRfRk9OVDoKCQlkcHJpbnRmX3ZlcihzdGRkZWIsImZpbGV0eXBlPUZPTlQuIik7CgkJc3dpdGNoICh2ZmZpLT5kd0ZpbGVTdWJ0eXBlKSB7CgkJZGVmYXVsdDoKCQkJZHByaW50Zl92ZXIoc3RkZGViLCJVTktOT1dOKCVsZCkiLHZmZmktPmR3RmlsZVN1YnR5cGUpOwoJCQlicmVhazsKCQljYXNlIFZGVDJfRk9OVF9SQVNURVI6ZHByaW50Zl92ZXIoc3RkZGViLCJSQVNURVIiKTticmVhazsKCQljYXNlIFZGVDJfRk9OVF9WRUNUT1I6ZHByaW50Zl92ZXIoc3RkZGViLCJWRUNUT1IiKTticmVhazsKCQljYXNlIFZGVDJfRk9OVF9UUlVFVFlQRTpkcHJpbnRmX3ZlcihzdGRkZWIsIlRSVUVUWVBFIik7YnJlYWs7CgkJfQoJCWJyZWFrOwoJY2FzZSBWRlRfVlhEOmRwcmludGZfdmVyKHN0ZGRlYiwiZmlsZXR5cGU9VlhEIik7YnJlYWs7CgljYXNlIFZGVF9TVEFUSUNfTElCOmRwcmludGZfdmVyKHN0ZGRlYiwiZmlsZXR5cGU9U1RBVElDX0xJQiIpO2JyZWFrOwoJfQoJZHByaW50Zl92ZXIoc3RkZGViLCJmaWxlZGF0YT0lbHguJWx4XG4iLHZmZmktPmR3RmlsZURhdGVNUyx2ZmZpLT5kd0ZpbGVEYXRlTFMpOwoJcmV0dXJuIGxlbjsKfQoKLyogR2V0RmlsZVZlcnNpb25JbmZvU2l6ZTMyQQkJCVtWRVJTSU9OLjFdICovCkRXT1JECkdldEZpbGVWZXJzaW9uSW5mb1NpemUzMkEoTFBDU1RSIGZpbGVuYW1lLExQRFdPUkQgaGFuZGxlKSB7CglkcHJpbnRmX3ZlcihzdGRkZWIsIkdldEZpbGVWZXJzaW9uSW5mb1NpemUzMkEoJXMsJXApXG4iLGZpbGVuYW1lLGhhbmRsZSk7CglyZXR1cm4gR2V0RmlsZVZlcnNpb25JbmZvU2l6ZTE2KGZpbGVuYW1lLGhhbmRsZSk7Cn0KCi8qIEdldEZpbGVWZXJzaW9uSW5mb1NpemUzMlcJCQlbVkVSU0lPTi4yXSAqLwpEV09SRCBHZXRGaWxlVmVyc2lvbkluZm9TaXplMzJXKCBMUENXU1RSIGZpbGVuYW1lLCBMUERXT1JEIGhhbmRsZSApCnsKICAgIExQU1RSIHhmbiA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZmlsZW5hbWUgKTsKICAgIERXT1JEIHJldCA9IEdldEZpbGVWZXJzaW9uSW5mb1NpemUxNiggeGZuLCBoYW5kbGUgKTsKICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB4Zm4gKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qIEdldEZpbGVWZXJzaW9uSW5mbwkJCQlbVkVSLjddICovCkRXT1JEIApHZXRGaWxlVmVyc2lvbkluZm8xNihMUENTVFIgZmlsZW5hbWUsRFdPUkQgaGFuZGxlLERXT1JEIGRhdGFzaXplLExQVk9JRCBkYXRhKSB7CglkcHJpbnRmX3ZlcihzdGRkZWIsIkdldEZpbGVWZXJzaW9uSW5mbzE2KCVzLCVsZCwlbGQsJXApXG4tPiIsCgkJZmlsZW5hbWUsaGFuZGxlLGRhdGFzaXplLGRhdGEKCSk7CglyZXR1cm4gR2V0RmlsZVJlc291cmNlKAoJCWZpbGVuYW1lLFZTX0ZJTEVfSU5GTyxWU19WRVJTSU9OX0lORk8saGFuZGxlLGRhdGFzaXplLGRhdGEKCSk7Cn0KCi8qIEdldEZpbGVWZXJzaW9uSW5mb0EJCQkJW1ZFUlNJT04uMF0gKi8KRFdPUkQgCkdldEZpbGVWZXJzaW9uSW5mbzMyQShMUENTVFIgZmlsZW5hbWUsRFdPUkQgaGFuZGxlLERXT1JEIGRhdGFzaXplLExQVk9JRCBkYXRhKSB7CglyZXR1cm4gR2V0RmlsZVZlcnNpb25JbmZvMTYoZmlsZW5hbWUsaGFuZGxlLGRhdGFzaXplLGRhdGEpOwp9CgovKiBHZXRGaWxlVmVyc2lvbkluZm9XCQkJCVtWRVJTSU9OLjNdICovCkRXT1JEIEdldEZpbGVWZXJzaW9uSW5mbzMyVyggTFBDV1NUUiBmaWxlbmFtZSwgRFdPUkQgaGFuZGxlLCBEV09SRCBkYXRhc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgZGF0YSkKewogICAgTFBTVFIgZm4gPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIGZpbGVuYW1lICk7CiAgICBEV09SRCByZXQgPSBHZXRGaWxlVmVyc2lvbkluZm8xNiggZm4sIGhhbmRsZSwgZGF0YXNpemUsIGRhdGEgKTsKICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBmbiApOwogICAgcmV0dXJuIHJldDsKfQoKLyogVmVyRmluZEZpbGUJCQkJW1ZFUi44XSAqLwpEV09SRApWZXJGaW5kRmlsZTE2KAoJVUlOVDE2IGZsYWdzLExQQ1NUUiBmaWxlbmFtZSxMUENTVFIgd2luZGlyLExQQ1NUUiBhcHBkaXIsCglMUFNUUiBjdXJkaXIsVUlOVDE2ICpjdXJkaXJsZW4sTFBTVFIgZGVzdGRpcixVSU5UMTYgKmRlc3RkaXJsZW4KKSB7CglkcHJpbnRmX3ZlcihzdGRkZWIsIlZlckZpbmRGaWxlKCV4LCVzLCVzLCVzLCVwLCVkLCVwLCVkKVxuIiwKCQlmbGFncyxmaWxlbmFtZSx3aW5kaXIsYXBwZGlyLGN1cmRpciwqY3VyZGlybGVuLGRlc3RkaXIsKmRlc3RkaXJsZW4KCSk7CglzdHJjcHkoY3VyZGlyLCJaOlxcUk9PVFxcLldJTkVcXCIpOy8qRklYTUUqLwoJKmN1cmRpcmxlbj1zdHJsZW4oY3VyZGlyKTsKCXN0cmNweShkZXN0ZGlyLCJaOlxcUk9PVFxcLldJTkVcXCIpOy8qRklYTUUqLwoJKmRlc3RkaXJsZW49c3RybGVuKGRlc3RkaXIpOwoJcmV0dXJuIDA7Cn0KCi8qIFZlckZpbmRGaWxlQQkJCQkJCVtWRVJTSU9OLjVdICovCkRXT1JEClZlckZpbmRGaWxlMzJBKAoJVUlOVDMyIGZsYWdzLExQQ1NUUiBmaWxlbmFtZSxMUENTVFIgd2luZGlyLExQQ1NUUiBhcHBkaXIsCglMUFNUUiBjdXJkaXIsVUlOVDMyICpwY3VyZGlybGVuLExQU1RSIGRlc3RkaXIsVUlOVDMyICpwZGVzdGRpcmxlbiApCnsKICAgIFVJTlQxNiBjdXJkaXJsZW4sIGRlc3RkaXJsZW47CiAgICBEV09SRCByZXQgPSBWZXJGaW5kRmlsZTE2KGZsYWdzLGZpbGVuYW1lLHdpbmRpcixhcHBkaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmRpciwmY3VyZGlybGVuLGRlc3RkaXIsJmRlc3RkaXJsZW4pOwogICAgKnBjdXJkaXJsZW4gPSBjdXJkaXJsZW47CiAgICAqcGRlc3RkaXJsZW4gPSBkZXN0ZGlybGVuOwogICAgcmV0dXJuIHJldDsKfQoKLyogVmVyRmluZEZpbGVXCQkJCQkJW1ZFUlNJT04uNl0gKi8KRFdPUkQKVmVyRmluZEZpbGUzMlcoCglVSU5UMzIgZmxhZ3MsTFBDV1NUUiBmaWxlbmFtZSxMUENXU1RSIHdpbmRpcixMUENXU1RSIGFwcGRpciwKCUxQV1NUUiBjdXJkaXIsVUlOVDMyICpwY3VyZGlybGVuLExQV1NUUiBkZXN0ZGlyLFVJTlQzMiAqcGRlc3RkaXJsZW4gKQp7CiAgICBVSU5UMTYgY3VyZGlybGVuLCBkZXN0ZGlybGVuOwogICAgTFBTVFIgd2ZuLHd3ZCx3YWQsd2RkLHdjZDsKICAgIERXT1JEIHJldDsKCiAgICB3Zm4gPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIGZpbGVuYW1lICk7CiAgICB3d2QgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHdpbmRpciApOwogICAgd2FkID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBhcHBkaXIgKTsKICAgIHdjZCA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKnBjdXJkaXJsZW4gKTsKICAgIHdkZCA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKnBkZXN0ZGlybGVuICk7CiAgICByZXQgPSBWZXJGaW5kRmlsZTE2KGZsYWdzLHdmbix3d2Qsd2FkLHdjZCwmY3VyZGlybGVuLHdkZCwmZGVzdGRpcmxlbik7CiAgICBsc3RyY3B5bkF0b1coY3VyZGlyLHdjZCwqcGN1cmRpcmxlbik7CiAgICBsc3RyY3B5bkF0b1coZGVzdGRpcix3ZGQsKnBkZXN0ZGlybGVuKTsKICAgICpwY3VyZGlybGVuID0gc3RybGVuKHdjZCk7CiAgICAqcGRlc3RkaXJsZW4gPSBzdHJsZW4od2RkKTsKICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB3Zm4gKTsKICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB3d2QgKTsKICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB3YWQgKTsKICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB3Y2QgKTsKICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB3ZGQgKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qIFZlckluc3RhbGxGaWxlCQkJCQlbVkVSLjldICovCkRXT1JEClZlckluc3RhbGxGaWxlMTYoCglVSU5UMTYgZmxhZ3MsTFBDU1RSIHNyY2ZpbGVuYW1lLExQQ1NUUiBkZXN0ZmlsZW5hbWUsTFBDU1RSIHNyY2RpciwKIAlMUENTVFIgZGVzdGRpcixMUENTVFIgY3VyZGlyLExQU1RSIHRtcGZpbGUsVUlOVDE2ICp0bXBmaWxlbGVuICkKewogICAgVUlOVDMyCWZpbGVsZW47CiAgICBEV09SRCByZXQ9IFZlckluc3RhbGxGaWxlMzJBKGZsYWdzLHNyY2ZpbGVuYW1lLGRlc3RmaWxlbmFtZSxzcmNkaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RkaXIsY3VyZGlyLHRtcGZpbGUsJmZpbGVsZW4pOwoKICAgICp0bXBmaWxlbGVuID0gZmlsZWxlbjsKICAgIHJldHVybiByZXQ7Cn0KCi8qIFZlckluc3RhbGxGaWxlQQkJCQlbVkVSU0lPTi43XSAqLwpzdGF0aWMgTFBCWVRFCl9mZXRjaF92ZXJzaW9uaW5mbyhMUFNUUiBmbikgewogICAgRFdPUkQJYWxsb2NsZW47CiAgICBMUEJZVEUJYnVmOwogICAgRFdPUkQJcmV0OwoKICAgIGFsbG9jbGVuID0gMTAwMDsKICAgIGJ1Zj0geG1hbGxvYyhhbGxvY2xlbik7CiAgICB3aGlsZSAoMSkgewogICAgCXJldCA9IEdldEZpbGVWZXJzaW9uSW5mbzMyQShmbiwwLGFsbG9jbGVuLGJ1Zik7CglpZiAoIXJldCkgewoJICAgIGZyZWUoYnVmKTsKCSAgICByZXR1cm4gMDsKCX0KCWlmIChhbGxvY2xlbjwqKFdPUkQqKWJ1ZikgewoJICAgIGZyZWUoYnVmKTsKCSAgICBhbGxvY2xlbiA9ICooV09SRCopYnVmOwoJICAgIGJ1ZiA9IHhtYWxsb2MoYWxsb2NsZW4pOwoJfSBlbHNlCgkgICAgcmV0dXJuIGJ1ZjsKICAgIH0KfQoKc3RhdGljIERXT1JECl9lcnJvcjJ2aWYoRFdPUkQgZXJyb3IpIHsKICAgIHN3aXRjaCAoZXJyb3IpIHsKICAgIGNhc2UgRVJST1JfQUNDRVNTX0RFTklFRDoKICAgIAlyZXR1cm4gVklGX0FDQ0VTU1ZJT0xBVElPTjsKICAgIGNhc2UgRVJST1JfU0hBUklOR19WSU9MQVRJT046CiAgICAJcmV0dXJuIFZJRl9TSEFSSU5HVklPTEFUSU9OOwogICAgZGVmYXVsdDoKICAgIAlyZXR1cm4gMDsKICAgIH0KfQoKRFdPUkQKVmVySW5zdGFsbEZpbGUzMkEoCglVSU5UMzIgZmxhZ3MsTFBDU1RSIHNyY2ZpbGVuYW1lLExQQ1NUUiBkZXN0ZmlsZW5hbWUsTFBDU1RSIHNyY2RpciwKIAlMUENTVFIgZGVzdGRpcixMUENTVFIgY3VyZGlyLExQU1RSIHRtcGZpbGUsVUlOVDMyICp0bXBmaWxlbGVuICkKewogICAgY2hhcglkZXN0Zm5bMjYwXSx0bXBmblsyNjBdLHNyY2ZuWzI2MF07CiAgICBIRklMRTMyCWhmc3JjLGhmZHN0OwogICAgRFdPUkQJYXR0cixyZXQseHJldCx0bXBsYXN0OwogICAgTFBCWVRFCWJ1ZjEsYnVmMjsKICAgIE9GU1RSVUNUCW9mczsKCiAgICBmcHJpbnRmKHN0ZGRlYiwiVmVySW5zdGFsbEZpbGUoJXgsJXMsJXMsJXMsJXMsJXMsJXAsJWQpXG4iLAoJICAgIGZsYWdzLHNyY2ZpbGVuYW1lLGRlc3RmaWxlbmFtZSxzcmNkaXIsZGVzdGRpcixjdXJkaXIsdG1wZmlsZSwqdG1wZmlsZWxlbgogICAgKTsKICAgIHhyZXQgPSAwOwogICAgc3ByaW50ZihzcmNmbiwiJXNcXCVzIixzcmNkaXIsc3JjZmlsZW5hbWUpOwogICAgc3ByaW50ZihkZXN0Zm4sIiVzXFwlcyIsZGVzdGRpcixkZXN0ZmlsZW5hbWUpOwogICAgaGZzcmM9TFpPcGVuRmlsZTMyQShzcmNmbiwmb2ZzLE9GX1JFQUQpOwogICAgaWYgKGhmc3JjPT1IRklMRV9FUlJPUjMyKQogICAgCXJldHVybiBWSUZfQ0FOTk9UUkVBRFNSQzsKICAgIHNwcmludGYodG1wZm4sIiVzXFwlcyIsZGVzdGRpcixkZXN0ZmlsZW5hbWUpOwogICAgdG1wbGFzdD1zdHJsZW4oZGVzdGRpcikrMTsKICAgIGF0dHIgPSBHZXRGaWxlQXR0cmlidXRlczMyQSh0bXBmbik7CiAgICBpZiAoYXR0ciE9LTEpIHsKCWlmIChhdHRyICYgRklMRV9BVFRSSUJVVEVfUkVBRE9OTFkpIHsKCSAgICBMWkNsb3NlMzIoaGZzcmMpOwoJICAgIHJldHVybiBWSUZfV1JJVEVQUk9UOwoJfQoJLyogRklYTUU6IGNoZWNrIGlmIGZpbGUgY3VycmVudGx5IGluIHVzZSBhbmQgcmV0dXJuIFZJRl9GSUxFSU5VU0UgKi8KICAgIH0KICAgIGF0dHIgPSAtMTsKICAgIGlmIChmbGFncyAmIFZJRkZfRk9SQ0VJTlNUQUxMKSB7CiAgICAJaWYgKHRtcGZpbGVbMF0pIHsKCSAgICBzcHJpbnRmKHRtcGZuLCIlc1xcJXMiLGRlc3RkaXIsdG1wZmlsZSk7CgkgICAgdG1wbGFzdCA9IHN0cmxlbihkZXN0ZGlyKSsxOwoJICAgIGF0dHIgPSBHZXRGaWxlQXR0cmlidXRlczMyQSh0bXBmbik7CgkgICAgLyogaWYgaXQgZXhpc3RzLCBpdCBoYXMgYmVlbiBjb3BpZWQgYnkgdGhlIGNhbGwgYmVmb3JlLgoJICAgICAqIHdlIGp1bXAgb3ZlciB0aGUgY29weSBwYXJ0Li4uIAoJICAgICAqLwoJfQogICAgfQogICAgaWYgKGF0dHIgPT0gLTEpIHsKICAgIAljaGFyCSpzOwoKCUdldFRlbXBGaWxlTmFtZTMyQShkZXN0ZGlyLCJ2ZXIiLDAsdG1wZm4pOyAvKiBzaG91bGQgbm90IGZhaWwgLi4uICovCglzPXN0cnJjaHIodG1wZm4sJ1xcJyk7CglpZiAocykKCSAgICB0bXBsYXN0ID0gcy10bXBmbjsKCWVsc2UKCSAgICB0bXBsYXN0ID0gMDsKCWhmZHN0ID0gT3BlbkZpbGUzMih0bXBmbiwmb2ZzLE9GX0NSRUFURSk7CglpZiAoaGZkc3QgPT0gSEZJTEVfRVJST1IzMikgewoJICAgIExaQ2xvc2UzMihoZnNyYyk7CgkgICAgcmV0dXJuIFZJRl9DQU5OT1RDUkVBVEU7IC8qIHwgdHJhbnNsYXRlZCBkb3MgZXJyb3IgKi8KCX0KCXJldCA9IExaQ29weTMyKGhmc3JjLGhmZHN0KTsKCV9sY2xvc2UzMihoZmRzdCk7CglpZiAocmV0PDApIHsKCSAgICAvKiB0cmFuc2xhdGUgTFogZXJyb3JzIGludG8gVklGX3h4eCAqLwoJICAgIHN3aXRjaCAocmV0KSB7CgkgICAgY2FzZSBMWkVSUk9SX0JBRElOSEFORExFOgoJICAgIGNhc2UgTFpFUlJPUl9SRUFEOgoJICAgIGNhc2UgTFpFUlJPUl9CQURWQUxVRToKCSAgICBjYXNlIExaRVJST1JfVU5LTk9XTkFMRzoKCQlyZXQgPSBWSUZfQ0FOTk9UUkVBRFNSQzsKCQlicmVhazsKCSAgICBjYXNlIExaRVJST1JfQkFET1VUSEFORExFOgoJICAgIGNhc2UgTFpFUlJPUl9XUklURToKCQlyZXQgPSBWSUZfT1VUT0ZNRU1PUlk7IC8qIEZJWE1FOiBjb3JyZWN0PyAqLwoJCWJyZWFrOwoJICAgIGNhc2UgTFpFUlJPUl9HTE9CQUxMT0M6CgkgICAgY2FzZSBMWkVSUk9SX0dMT0JMT0NLOgoJCXJldCA9IFZJRl9PVVRPRlNQQUNFOwoJCWJyZWFrOwoJICAgIGRlZmF1bHQ6IC8qIHVua25vd24gZXJyb3IsIHNob3VsZCBub3QgaGFwcGVuICovCgkJcmV0ID0gMDsKCQlicmVhazsKCSAgICB9CgkgICAgaWYgKHJldCkgewoJCUxaQ2xvc2UzMihoZnNyYyk7CgkJcmV0dXJuIHJldDsKCSAgICB9Cgl9CiAgICB9CiAgICB4cmV0ID0gMDsKICAgIGlmICghKGZsYWdzICYgVklGRl9GT1JDRUlOU1RBTEwpKSB7CiAgICAJYnVmMSA9IF9mZXRjaF92ZXJzaW9uaW5mbyhkZXN0Zm4pOwoJaWYgKGJ1ZjEpIHsKCSAgICBidWYyID0gX2ZldGNoX3ZlcnNpb25pbmZvKHRtcGZuKTsKCSAgICBpZiAoIWJ1ZjIpIHsKCSAgICAJY2hhcgkqdGJ1ZjEsKnRidWYyOwoJCVZTX0ZJWEVERklMRUlORk8gKmRlc3R2ZmZpLCp0bXB2ZmZpOwoJCVVJTlQzMglsZW4xLGxlbjI7CgoJCWRlc3R2ZmZpPSAoVlNfRklYRURGSUxFSU5GTyopKGJ1ZjErMHgxNCk7CgkJdG1wdmZmaSA9IChWU19GSVhFREZJTEVJTkZPKikoYnVmMisweDE0KTsKCQlsZW4xPWxlbjI9NDA7CgoJCS8qIGNvbXBhcmUgZmlsZSB2ZXJzaW9ucyAqLwoJCWlmICgoZGVzdHZmZmktPmR3RmlsZVZlcnNpb25NUyA+IHRtcHZmZmktPmR3RmlsZVZlcnNpb25NUyl8fAoJCSAgICAoKGRlc3R2ZmZpLT5kd0ZpbGVWZXJzaW9uTVM9PXRtcHZmZmktPmR3RmlsZVZlcnNpb25NUykmJgoJCSAgICAgKGRlc3R2ZmZpLT5kd0ZpbGVWZXJzaW9uTFMgPiB0bXB2ZmZpLT5kd0ZpbGVWZXJzaW9uTFMpCgkJICAgICkKCQkpCgkJICAgIHhyZXQgfD0gVklGX01JU01BVENIfFZJRl9TUkNPTEQ7CgkJLyogY29tcGFyZSBmaWxldHlwZXMgYW5kIGZpbGVzdWJ0eXBlcyAqLwoJCWlmICgoZGVzdHZmZmktPmR3RmlsZVR5cGUhPXRtcHZmZmktPmR3RmlsZVR5cGUpIHx8CgkJICAgIChkZXN0dmZmaS0+ZHdGaWxlU3VidHlwZSE9dG1wdmZmaS0+ZHdGaWxlU3VidHlwZSkKCQkpCgkJICAgIHhyZXQgfD0gVklGX01JU01BVENIfFZJRl9ESUZGVFlQRTsKCQlpZiAoVmVyUXVlcnlWYWx1ZTMyQShidWYxLCJcXFZhckZpbGVJbmZvXFxUcmFuc2xhdGlvbiIsKExQVk9JRCopJnRidWYxLCZsZW4xKSAmJgoJCSAgICBWZXJRdWVyeVZhbHVlMzJBKGJ1ZjIsIlxcVmFyRmlsZUluZm9cXFRyYW5zbGF0aW9uIiwoTFBWT0lEKikmdGJ1ZjIsJmxlbjIpCgkJKSB7CgkJICAgIC8qIGlyZ2VuZHdhcyBtaXQgdGJ1ZjEgdW5kIHRidWYyIG1hY2hlbiAKCQkgICAgICogZ2VuZXJpZXJ0IERJRkZMQU5HfE1JU01BVENICgkJICAgICAqLwoJCX0KCQlmcmVlKGJ1ZjIpOwoJICAgIH0gZWxzZQoJCXhyZXQ9VklGX01JU01BVENIfFZJRl9TUkNPTEQ7CgkgICAgZnJlZShidWYxKTsKCX0KICAgIH0KICAgIGlmICh4cmV0KSB7CglpZiAoKnRtcGZpbGVsZW48c3RybGVuKHRtcGZuK3RtcGxhc3QpKSB7CgkgICAgeHJldHw9VklGX0JVRlRPU01BTEw7CgkgICAgRGVsZXRlRmlsZTMyQSh0bXBmbik7Cgl9IGVsc2UgewoJICAgIHN0cmNweSh0bXBmaWxlLHRtcGZuK3RtcGxhc3QpOwoJICAgICp0bXBmaWxlbGVuID0gc3RybGVuKHRtcGZuK3RtcGxhc3QpKzE7CgkgICAgeHJldHw9VklGX1RFTVBGSUxFOwoJfQogICAgfSBlbHNlIHsKICAgIAlpZiAoLTEhPUdldEZpbGVBdHRyaWJ1dGVzMzJBKGRlc3RmbikpCgkgICAgaWYgKCFEZWxldGVGaWxlMzJBKGRlc3RmbikpIHsKCQl4cmV0fD1fZXJyb3IydmlmKEdldExhc3RFcnJvcigpKXxWSUZfQ0FOTk9UREVMRVRFOwoJCURlbGV0ZUZpbGUzMkEodG1wZm4pOwoJCUxaQ2xvc2UzMihoZnNyYyk7CgkJcmV0dXJuIHhyZXQ7CgkgICAgfQoJaWYgKCghKGZsYWdzICYgVklGRl9ET05UREVMRVRFT0xEKSkJJiYgCgkgICAgY3VyZGlyCQkJCSYmIAoJICAgICpjdXJkaXIJCQkJJiYKCSAgICBsc3RyY21waTMyQShjdXJkaXIsZGVzdGRpcikKCSkgewoJICAgIGNoYXIgY3VyZm5bMjYwXTsKCgkgICAgc3ByaW50ZihjdXJmbiwiJXNcXCVzIixjdXJkaXIsZGVzdGZpbGVuYW1lKTsKCSAgICBpZiAoLTEhPUdldEZpbGVBdHRyaWJ1dGVzMzJBKGN1cmZuKSkgewoJCS8qIEZJWE1FOiBjaGVjayBpZiBpbiB1c2UgLi4uIGlmIGl0IGlzLCBWSUZfQ0FOTk9UREVMRVRFQ1VSICovCgkJaWYgKCFEZWxldGVGaWxlMzJBKGN1cmZuKSkKCSAgICAJICAgIHhyZXR8PV9lcnJvcjJ2aWYoR2V0TGFzdEVycm9yKCkpfFZJRl9DQU5OT1RERUxFVEVDVVI7CgkgICAgfQoJfQoJaWYgKCFNb3ZlRmlsZTMyQSh0bXBmbixkZXN0Zm4pKSB7CgkgICAgeHJldHw9X2Vycm9yMnZpZihHZXRMYXN0RXJyb3IoKSl8VklGX0NBTk5PVFJFTkFNRTsKCSAgICBEZWxldGVGaWxlMzJBKHRtcGZuKTsKCX0KICAgIH0KICAgIExaQ2xvc2UzMihoZnNyYyk7CiAgICByZXR1cm4geHJldDsKfQoKLyogVmVySW5zdGFsbEZpbGVXCQkJCVtWRVJTSU9OLjhdICovCkRXT1JEClZlckluc3RhbGxGaWxlMzJXKAoJVUlOVDMyIGZsYWdzLExQQ1dTVFIgc3JjZmlsZW5hbWUsTFBDV1NUUiBkZXN0ZmlsZW5hbWUsTFBDV1NUUiBzcmNkaXIsCglMUENXU1RSIGRlc3RkaXIsTFBDV1NUUiBjdXJkaXIsTFBXU1RSIHRtcGZpbGUsVUlOVDMyICp0bXBmaWxlbGVuICkKewogICAgTFBTVFIgd3NyY2Ysd3NyY2Qsd2Rlc3RmLHdkZXN0ZCx3dG1wZix3Y3VyZDsKICAgIERXT1JEIHJldDsKCiAgICB3c3JjZiAgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY2ZpbGVuYW1lICk7CiAgICB3c3JjZCAgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY2RpciApOwogICAgd2Rlc3RmID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBkZXN0ZmlsZW5hbWUgKTsKICAgIHdkZXN0ZCA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZGVzdGRpciApOwogICAgd3RtcGYgID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB0bXBmaWxlICk7CiAgICB3Y3VyZCAgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIGN1cmRpciApOwogICAgcmV0ID0gVmVySW5zdGFsbEZpbGUzMkEoZmxhZ3Msd3NyY2Ysd2Rlc3RmLHdzcmNkLHdkZXN0ZCx3Y3VyZCx3dG1wZix0bXBmaWxlbGVuKTsKICAgIGlmICghcmV0KQogICAgCWxzdHJjcHluQXRvVyh0bXBmaWxlLHd0bXBmLCp0bXBmaWxlbGVuKTsKICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB3c3JjZiApOwogICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHdzcmNkICk7CiAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd2Rlc3RmICk7CiAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd2Rlc3RkICk7CiAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd3RtcGYgKTsKICAgIGlmICh3Y3VyZCkgCiAgICAJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHdjdXJkICk7CiAgICByZXR1cm4gcmV0Owp9CgovKiBGSVhNRTogVGhpcyB0YWJsZSBzaG91bGQsIG9mIGNvdXJzZSwgYmUgbGFuZ3VhZ2UgZGVwZW5kZW5kICovCnN0YXRpYyBjb25zdCBzdHJ1Y3QgbWFwX2lkMnN0ciB7CglVSU5UMTYJbGFuZ2lkOwoJY29uc3QgY2hhciAqbGFuZ25hbWU7Cn0gbGFuZ3VhZ2VzW109ewoJezB4MDQwMSwiQXJhYmlzY2gifSwKCXsweDA0MDIsIkJ1bGdhcmlzY2gifSwKCXsweDA0MDMsIkthdGFsYW5pc2NoIn0sCgl7MHgwNDA0LCJUcmFkaXRpb25hbGVzIENoaW5lc2lzY2gifSwKCXsweDA0MDUsIlRzY2hlY2lzY2gifSwKCXsweDA0MDYsIkTkbmlzY2gifSwKCXsweDA0MDcsIkRldXRzY2gifSwKCXsweDA0MDgsIkdyaWVjaGlzY2gifSwKCXsweDA0MDksIkFtZXJpa2FuaXNjaGVzIEVuZ2xpc2NoIn0sCgl7MHgwNDBBLCJLYXN0aWxpc2NoZXMgU3BhbmlzY2gifSwKCXsweDA0MEIsIkZpbm5pc2NoIn0sCgl7MHgwNDBDLCJGcmFuevZzaXNjaCJ9LAoJezB4MDQwRCwiSGVicuRpc2NoIn0sCgl7MHgwNDBFLCJVbmdhcmlzY2gifSwKCXsweDA0MEYsIklzbORuZGlzY2gifSwKCXsweDA0MTAsIkl0YWxpZW5pc2NoIn0sCgl7MHgwNDExLCJKYXBhbmlzY2gifSwKCXsweDA0MTIsIktvcmVhbmlzY2gifSwKCXsweDA0MTMsIk5pZWRlcmzkbmRpc2NoIn0sCgl7MHgwNDE0LCJOb3J3ZWdpc2NoLUJva21hbCJ9LAoJezB4MDQxNSwiUG9sbmlzY2gifSwKCXsweDA0MTYsIkJyYXNpbGlhbmlzY2hlcyBQb3J0dWdpZXNpc2NoIn0sCgl7MHgwNDE3LCJS5HRvcm9tYW5pc2NoIn0sCgl7MHgwNDE4LCJSdW3kbmlzY2gifSwKCXsweDA0MTksIlJ1c3Npc2NoIn0sCgl7MHgwNDFBLCJLcm9hdG9zZXJiaXNjaCAobGF0ZWluaXNjaCkifSwKCXsweDA0MUIsIlNsb3dlbmlzY2gifSwKCXsweDA0MUMsIkFsYmFuaXNjaCJ9LAoJezB4MDQxRCwiU2Nod2VkaXNjaCJ9LAoJezB4MDQxRSwiVGhhaSJ9LAoJezB4MDQxRiwiVPxya2lzY2gifSwKCXsweDA0MjAsIlVyZHUifSwKCXsweDA0MjEsIkJhaGFzYSJ9LAoJezB4MDgwNCwiVmVyZWluZmFjaHRlcyBDaGluZXNpc2NoIn0sCgl7MHgwODA3LCJTY2h3ZWl6ZXJkZXV0c2NoIn0sCgl7MHgwODA5LCJCcml0aXNjaGVzIEVuZ2xpc2NoIn0sCgl7MHgwODBBLCJNZXhpa2FuaXNjaGVzIFNwYW5pc2NoIn0sCgl7MHgwODBDLCJCZWxnaXNjaGVzIEZyYW569nNpc2NoIn0sCgl7MHgwODEwLCJTY2h3ZWl6ZXJpc2NoZXMgSXRhbGllbmlzY2gifSwKCXsweDA4MTMsIkJlbGdpc2NoZXMgTmllZGVybORuZGlzY2gifSwKCXsweDA4MTQsIk5vcmd3ZWdpc2NoLU55bm9yc2sifSwKCXsweDA4MTYsIlBvcnR1Z2llc2lzY2gifSwKCXsweDA4MUEsIlNlcmJva3JhdGlzY2ggKGt5cmlsbGlzY2gpIn0sCgl7MHgwQzFDLCJLYW5hZGlzY2hlcyBGcmFuevZzaXNjaCJ9LAoJezB4MTAwQywiU2Nod2VpemVyaXNjaGVzIEZyYW569nNpc2NoIn0sCgl7MHgwMDAwLCJVbmJla2FubnQifSwKfTsKCi8qIFZlckxhbmd1YWdlTmFtZQkJCQlbVkVSLjEwXSAqLwpEV09SRApWZXJMYW5ndWFnZU5hbWUxNihVSU5UMTYgbGFuZ2lkLExQU1RSIGxhbmduYW1lLFVJTlQxNiBsYW5nbmFtZWxlbikgewoJaW50CWk7CgljaGFyCSpidWY7CgoJZHByaW50Zl92ZXIoc3RkZGViLCJWZXJMYW5ndWFnZU5hbWUoJWQsJXAsJWQpXG4iLGxhbmdpZCxsYW5nbmFtZSxsYW5nbmFtZWxlbik7CgkvKiBGaXJzdCwgY2hlY2sgXFN5c3RlbVxDdXJyZW50Q29udHJvbFNldFxjb250cm9sXE5sc1xMb2NhbGVcPGxhbmdpZD4KCSAqIGZyb20gdGhlIHJlZ2lzdHJ5LiAKCSAqLwoJYnVmPShjaGFyKiltYWxsb2Moc3RybGVuKCJcXFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwiKSs5KTsKCXNwcmludGYoYnVmLCJcXFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwlMDh4IixsYW5naWQpOwoJaWYgKEVSUk9SX1NVQ0NFU1M9PVJlZ1F1ZXJ5VmFsdWUxNihIS0VZX0xPQ0FMX01BQ0hJTkUsYnVmLGxhbmduYW1lLChMUERXT1JEKSZsYW5nbmFtZWxlbikpIHsKCQlsYW5nbmFtZVtsYW5nbmFtZWxlbi0xXT0nXDAnOwoJCXJldHVybiBsYW5nbmFtZWxlbjsKCX0KCS8qIGlmIHRoYXQgZmFpbHMsIHVzZSB0aGUgaW50ZXJhbCB0YWJsZSAqLwoJZm9yIChpPTA7bGFuZ3VhZ2VzW2ldLmxhbmdpZCE9MDtpKyspCgkJaWYgKGxhbmdpZD09bGFuZ3VhZ2VzW2ldLmxhbmdpZCkKCQkJYnJlYWs7CglzdHJuY3B5KGxhbmduYW1lLGxhbmd1YWdlc1tpXS5sYW5nbmFtZSxsYW5nbmFtZWxlbik7CglsYW5nbmFtZVtsYW5nbmFtZWxlbi0xXT0nXDAnOwoJcmV0dXJuIHN0cmxlbihsYW5ndWFnZXNbaV0ubGFuZ25hbWUpOwp9CgovKiBWZXJMYW5ndWFnZU5hbWVBCQkJCVtWRVJTSU9OLjldICovCkRXT1JEClZlckxhbmd1YWdlTmFtZTMyQShVSU5UMzIgbGFuZ2lkLExQU1RSIGxhbmduYW1lLFVJTlQzMiBsYW5nbmFtZWxlbikgewoJcmV0dXJuIFZlckxhbmd1YWdlTmFtZTE2KGxhbmdpZCxsYW5nbmFtZSxsYW5nbmFtZWxlbik7Cn0KCi8qIFZlckxhbmd1YWdlTmFtZVcJCQkJW1ZFUlNJT04uMTBdICovCkRXT1JEClZlckxhbmd1YWdlTmFtZTMyVyhVSU5UMzIgbGFuZ2lkLExQV1NUUiBsYW5nbmFtZSxVSU5UMzIgbGFuZ25hbWVsZW4pIHsKCWludAlpOwoJY2hhcglidWZmZXJbODBdOwoJTFBXU1RSCWtleW5hbWU7CgoJLyogRmlyc3QsIGNoZWNrIFxTeXN0ZW1cQ3VycmVudENvbnRyb2xTZXRcY29udHJvbFxObHNcTG9jYWxlXDxsYW5naWQ+CgkgKiBmcm9tIHRoZSByZWdpc3RyeS4gCgkgKi8KCXNwcmludGYoYnVmZmVyLCJcXFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwlMDh4IixsYW5naWQpOwoJa2V5bmFtZSA9IEhFQVBfc3RyZHVwQXRvVyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYnVmZmVyICk7CglpZiAoRVJST1JfU1VDQ0VTUz09UmVnUXVlcnlWYWx1ZTMyVyhIS0VZX0xPQ0FMX01BQ0hJTkUsa2V5bmFtZSxsYW5nbmFtZSwoTFBEV09SRCkmbGFuZ25hbWVsZW4pKSB7CgkJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGtleW5hbWUgKTsKCQlyZXR1cm4gbGFuZ25hbWVsZW47Cgl9CiAgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGtleW5hbWUgKTsKCS8qIGlmIHRoYXQgZmFpbHMsIHVzZSB0aGUgaW50ZXJhbCB0YWJsZSAqLwoJZm9yIChpPTA7bGFuZ3VhZ2VzW2ldLmxhbmdpZCE9MDtpKyspCgkJaWYgKGxhbmdpZD09bGFuZ3VhZ2VzW2ldLmxhbmdpZCkKCQkJYnJlYWs7CiAgICAgICAgbHN0cmNweUF0b1coIGxhbmduYW1lLCBsYW5ndWFnZXNbaV0ubGFuZ25hbWUgKTsKCXJldHVybiBzdHJsZW4obGFuZ3VhZ2VzW2ldLmxhbmduYW1lKTsgLyogc2FtZSBhcyBzdHJsZW5XKGxhbmduYW1lKTsgKi8KfQoKLyogRklYTUU6IFVOSUNPREU/ICovCnN0cnVjdCBkYiB7CglXT1JECW5leHRvZmY7CglXT1JECWRhdGFsZW47Ci8qIGluIG1lbW9yeSBzdHJ1Y3R1cmUuLi4gKi8KCWNoYXIJbmFtZVsxXTsgCS8qIHBhZGRlZCB0byBkd29yZCBhbGlnbm1lbnQgKi8KLyogLi4uLiAKCWNoYXIJZGF0YVtkYXRhbGVuXTsgICAgIHBhZGRlZCB0byBkd29yZCBhbGlnbmVtbnQKCUJZVEUJc3ViZGlyZGF0YVtdOyAgICAgIHVudGlsIG5leHRvZmYKICovCn07CgpzdGF0aWMgQllURSoKX2ZpbmRfZGF0YShCWVRFICpibG9jayxMUENTVFIgc3RyKSB7CgljaGFyCSpuZXh0c2xhc2g7CglpbnQJc3Vic3RybGVuOwoJc3RydWN0CWRiCSpkYjsKCgl3aGlsZSAoKnN0ciAmJiAqc3RyPT0nXFwnKQoJCXN0cisrOwoJaWYgKE5VTEwhPShuZXh0c2xhc2g9c3RyY2hyKHN0ciwnXFwnKSkpCgkJc3Vic3RybGVuPW5leHRzbGFzaC1zdHI7CgllbHNlCgkJc3Vic3RybGVuPXN0cmxlbihzdHIpOwoJaWYgKG5leHRzbGFzaCE9TlVMTCkgewoJCXdoaWxlICgqbmV4dHNsYXNoICYmICpuZXh0c2xhc2g9PSdcXCcpCgkJCW5leHRzbGFzaCsrOwoJCWlmICghKm5leHRzbGFzaCkKCQkJbmV4dHNsYXNoPU5VTEw7Cgl9CgoKCXdoaWxlICgxKSB7CgkJZGI9KHN0cnVjdCBkYiopYmxvY2s7CgkJZHByaW50Zl92ZXIoc3RkZGViLCJkYj0lcCxkYi0+bmV4dG9mZj0lZCxkYi0+ZGF0YWxlbj0lZCxkYi0+bmFtZT0lcyxkYi0+ZGF0YT0lc1xuIiwKCQkJZGIsZGItPm5leHRvZmYsZGItPmRhdGFsZW4sZGItPm5hbWUsKGNoYXIqKSgoY2hhciopZGIrNCsoKHN0cmxlbihkYi0+bmFtZSkrNCkmfjMpKQoJCSk7CgkJaWYgKCFkYi0+bmV4dG9mZikKCQkJcmV0dXJuIE5VTEw7CgoJCWRwcmludGZfdmVyKHN0ZGRlYiwiY29tcGFyaW5nIHdpdGggJXNcbiIsZGItPm5hbWUpOwoJCWlmICghc3RybmNtcChkYi0+bmFtZSxzdHIsc3Vic3RybGVuKSkgewoJCQlpZiAobmV4dHNsYXNoKQoJCQkJcmV0dXJuIF9maW5kX2RhdGEoCgkJCQkJYmxvY2srNCsoKHN0cmxlbihkYi0+bmFtZSkrNCkmfjMpKygoZGItPmRhdGFsZW4rMykmfjMpCgkJCQkJLG5leHRzbGFzaAoJCQkJKTsKCQkJZWxzZQoJCQkJcmV0dXJuIGJsb2NrOwoJCX0KCQlibG9jaz1ibG9jaysoKGRiLT5uZXh0b2ZmKzMpJn4zKTsKCX0KfQoKLyogVmVyUXVlcnlWYWx1ZSAJCQlbVkVSLjExXSAqLwovKiB0YWtlIGNhcmUsICdidWZmZXInIGlzIE5PVCBhIFNFR1BUUiwgaXQganVzdCBwb2ludHMgdG8gb25lICovCkRXT1JEClZlclF1ZXJ5VmFsdWUxNihTRUdQVFIgc2VnYmxvY2ssTFBDU1RSIHN1YmJsb2NrLFNFR1BUUiAqYnVmZmVyLFVJTlQxNiAqYnVmbGVuKQp7CglCWVRFCSpibG9jaz1QVFJfU0VHX1RPX0xJTihzZWdibG9jayksKmI7CglzdHJ1Y3QJZGIJKmRiOwoJY2hhcgkqczsKCglkcHJpbnRmX3ZlcihzdGRkZWIsIlZlclF1ZXJ5VmFsdWUxNiglcCwlcywlcCwlZClcbiIsCgkJYmxvY2ssc3ViYmxvY2ssYnVmZmVyLCpidWZsZW4KCSk7CglzPShjaGFyKil4bWFsbG9jKHN0cmxlbigiVlNfVkVSU0lPTl9JTkZPXFwiKStzdHJsZW4oc3ViYmxvY2spKzEpOwoJc3RyY3B5KHMsIlZTX1ZFUlNJT05fSU5GT1xcIik7c3RyY2F0KHMsc3ViYmxvY2spOwoJYj1fZmluZF9kYXRhKGJsb2NrLHMpOwoJaWYgKGI9PU5VTEwpIHsKCQkqYnVmbGVuPTA7CgkJcmV0dXJuIDA7Cgl9CglkYj0oc3RydWN0IGRiKiliOwoJKmJ1Zmxlbgk9IGRiLT5kYXRhbGVuOwoJLyogbGV0IGIgcG9pbnQgdG8gZGF0YSBhcmVhICovCgliCT0gYis0Kygoc3RybGVuKGRiLT5uYW1lKSs0KSZ+Myk7CgkvKiBub3cgbG9vayB1cCB3aGF0IHRoZSByZXNwLiBTRUdQVFIgd291bGQgYmUgLi4uICovCgkqYnVmZmVyCT0gKGItYmxvY2spK3NlZ2Jsb2NrOwoJZHByaW50Zl92ZXIoc3RkZGViLCIJLT4gJXM9JXNcbiIsc3ViYmxvY2ssYik7CglyZXR1cm4gMTsKfQoKRFdPUkQKVmVyUXVlcnlWYWx1ZTMyQShMUFZPSUQgdmJsb2NrLExQQ1NUUiBzdWJibG9jayxMUFZPSUQgKnZidWZmZXIsVUlOVDMyICpidWZsZW4pCnsKCUJZVEUJKmIsKmJsb2NrPShMUEJZVEUpdmJsb2NrLCoqYnVmZmVyPShMUEJZVEUqKXZidWZmZXI7CglzdHJ1Y3QJZGIJKmRiOwoJY2hhcgkqczsKCglkcHJpbnRmX3ZlcihzdGRkZWIsIlZlclF1ZXJ5VmFsdWUzMkEoJXAsJXMsJXAsJWQpXG4iLAoJCWJsb2NrLHN1YmJsb2NrLGJ1ZmZlciwqYnVmbGVuCgkpOwoJcz0oY2hhciopeG1hbGxvYyhzdHJsZW4oIlZTX1ZFUlNJT05fSU5GT1xcIikrc3RybGVuKHN1YmJsb2NrKSsxKTsKCXN0cmNweShzLCJWU19WRVJTSU9OX0lORk9cXCIpO3N0cmNhdChzLHN1YmJsb2NrKTsKCWI9X2ZpbmRfZGF0YShibG9jayxzKTsKCWlmIChiPT1OVUxMKSB7CgkJKmJ1Zmxlbj0wOwoJCXJldHVybiAwOwoJfQoJZGI9KHN0cnVjdCBkYiopYjsKCSpidWZsZW4JPSBkYi0+ZGF0YWxlbjsKCS8qIGxldCBiIHBvaW50IHRvIGRhdGEgYXJlYSAqLwoJYgk9IGIrNCsoKHN0cmxlbihkYi0+bmFtZSkrNCkmfjMpOwoJKmJ1ZmZlcgk9IGI7CglkcHJpbnRmX3ZlcihzdGRkZWIsIgktPiAlcz0lc1xuIixzdWJibG9jayxiKTsKCXJldHVybiAxOwp9CgpEV09SRApWZXJRdWVyeVZhbHVlMzJXKExQVk9JRCB2YmxvY2ssTFBDV1NUUiBzdWJibG9jayxMUFZPSUQgKnZidWZmZXIsVUlOVDMyICpidWZsZW4pCnsKCS8qIEZJWE1FOiBobW0sIHdlIG5vdCBvbmx5IG5lZWQgdG8gY29udmVydCBzdWJibG9jaywgYnV0IGFsc28gCgkgKiAgICAgICAgdGhlIGNvbnRlbnQuLi5vcj8KCSAqIEFuZCB3aGF0IGFib3V0IFVOSUNPREUgdmVyc2lvbiBpbmZvPwoJICogQW5kIHRoZSBOQU1FUyBvZiB0aGUgdmFsdWVzPwoJICovCglCWVRFCQkqYiwqKmJ1ZmZlcj0oTFBCWVRFKil2YnVmZmVyLCpibG9jaz0oTFBCWVRFKXZibG9jazsKCXN0cnVjdAlkYgkqZGI7CgljaGFyCQkqcywqc2I7CgoJc2IgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHN1YmJsb2NrICk7CglzPShjaGFyKil4bWFsbG9jKHN0cmxlbigiVlNfVkVSU0lPTl9JTkZPXFwiKStzdHJsZW4oc2IpKzEpOwoJc3RyY3B5KHMsIlZTX1ZFUlNJT05fSU5GT1xcIik7c3RyY2F0KHMsc2IpOwoJYj1fZmluZF9kYXRhKGJsb2NrLHMpOwoJaWYgKGI9PU5VTEwpIHsKCQkqYnVmbGVuPTA7CgkJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNiICk7CgkJcmV0dXJuIDA7Cgl9CglkYj0oc3RydWN0IGRiKiliOwoJKmJ1Zmxlbgk9IGRiLT5kYXRhbGVuOwoJLyogbGV0IGIgcG9pbnQgdG8gZGF0YSBhcmVhICovCgliCT0gYis0Kygoc3RybGVuKGRiLT5uYW1lKSs0KSZ+Myk7CgkqYnVmZmVyCT0gYjsKCWRwcmludGZfdmVyKHN0ZGRlYiwiCS0+ICVzPSVzXG4iLHNiLGIpOwogICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzYiApOwoJcmV0dXJuIDE7Cn0KLyogMjAgR0VURklMRVZFUlNJT05JTkZPUkFXICovCg==