ZGlmZiAtLWdpdCBhL01hYy9Db250cmliL0JCUHkubG0vQkJQeS5jIGIvTWFjL0NvbnRyaWIvQkJQeS5sbS9CQlB5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVmMGRkMgotLS0gL2Rldi9udWxsCisrKyBiL01hYy9Db250cmliL0JCUHkubG0vQkJQeS5jCkBAIC0wLDAgKzEsNDU2IEBACisjaW5jbHVkZSA8QUVEYXRhTW9kZWwuaD4KKworI2RlZmluZSBERUJVRyAwCisKKyNkZWZpbmUga0NvbXBvbmVudFNpZ25hdHVyZVN0cmluZyAiQkJQeS5MTSIgICAgICAgICAgICAgICAgIAorI2luY2x1ZGUgPERlYnVnZ2luZy5oPgorCisKKyNpbmNsdWRlIDxCQkxNSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8QkJYVEludGVyZmFjZS5oPgorLy8jaW5jbHVkZSA8QkJMTVRleHRJdGVyYXRvci5oPgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSA8U291bmQuaD4KKworI2lmIERFQlVHCit2b2lkIGRlYnVnZl8oY29uc3QgY2hhciogZnVuYyxjb25zdCBjaGFyKiBmaWxlTmFtZSxsb25nIGxpbmUsIGNvbnN0IGNoYXIqZm10LC4uLikKK3sKKwl2YV9saXN0IGFyZzsKKwljaGFyIG1zZ1syNTZdOworCXZhX3N0YXJ0KGFyZywgZm10KTsKKwl2c25wcmludGYobXNnLDI1NiAsZm10LCBhcmcpOworICAgIERlYnVnQXNzZXJ0KENPTVBPTkVOVF9TSUdOQVRVUkUsIERFQlVHX05PX09QVElPTlMsIGtDb21wb25lbnRTaWduYXR1cmVTdHJpbmcgIjogIiAsIG1zZywgbmlsLCBmaWxlTmFtZSwgbGluZSwgMCApOworCisJLy9kZWJ1Z19zdHJpbmcobXNnKTsKK30KKyNkZWZpbmUgZGVidWdmKEZNVCwuLi4pICBkZWJ1Z2ZfKCBfX0ZVTkNUSU9OX18sX19GSUxFX18sIF9fTElORV9fLEZNVCxfX1ZBX0FSR1NfXyk7CisjZWxzZQorI2RlZmluZSBkZWJ1Z2YoRk1ULC4uLikgCisjZW5kaWYKKwordHlwZWRlZiBjb25zdCBjaGFyICpTdHI7IAorCisKK2VudW17CisJa1B5QkJMTVN0cmluZ1N1YnN0ID0gIGtCQkxNRmlyc3RVc2VyUnVuS2luZAorfTsKKworI2RlZmluZSBpc3dvcmRjaGFyKHgpIChpc2FsbnVtKHgpfHx4PT0nXycpCisKKworc3RydWN0IHJ1bmxvY3sKKwlib29sIHBhc3RfZ2FwOworCWxvbmcgcG9zOworCWxvbmcgbGFzdF9zdGFydDsKKwl1bnNpZ25lZCBjaGFyKnA7Cit9OworCitjaGFyIHN0YXJ0KHN0cnVjdCBydW5sb2MmIHIsQkJMTVBhcmFtQmxvY2sgJnBiKQoreworCXIucGFzdF9nYXAgPSBmYWxzZTsKKwlyLmxhc3Rfc3RhcnQgPSBwYi5mQ2FsY1J1blBhcmFtcy5mU3RhcnRPZmZzZXQ7CisJci5wb3MgPSBwYi5mQ2FsY1J1blBhcmFtcy5mU3RhcnRPZmZzZXQ7CisJci5wID0gKCh1bnNpZ25lZCBjaGFyKilwYi5mVGV4dCkgKyBwYi5mQ2FsY1J1blBhcmFtcy5mU3RhcnRPZmZzZXQ7CisJLy8gQWRqdXN0IGZvciB0aGUgZ2FwIGlmIHdluXJlIG5vdCBhbHJlYWR5IHBhc3QgaXQuCisJaWYgKCghci5wYXN0X2dhcCkgJiYgKHIucG9zID49IHBiLmZUZXh0R2FwTG9jYXRpb24pKXsKKwkJci5wICs9IHBiLmZUZXh0R2FwTGVuZ3RoOworCQlyLnBhc3RfZ2FwID0gdHJ1ZTsKKwl9CisJcmV0dXJuICpyLnA7CisKK30KKworY2hhciBuZXh0Y2hhcihzdHJ1Y3QgcnVubG9jJnIsQkJMTVBhcmFtQmxvY2sgJnBiKQoreworCWlmICggci5wb3M8IHBiLmZUZXh0TGVuZ3RoKXsKKwkJKytyLnBvczsKKwkJKytyLnA7CisJCWlmICgoIXIucGFzdF9nYXApICYmIChyLnBvcyA+PSBwYi5mVGV4dEdhcExvY2F0aW9uKSl7CisJCQlyLnAgKz0gcGIuZlRleHRHYXBMZW5ndGg7CisJCQlyLnBhc3RfZ2FwID0gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gKnIucDsKKwl9CisJZWxzZXsKKwkJcmV0dXJuIDA7CisJfQorfQorCitib29sIGFkZFJ1bihCQkxNUnVuQ29kZSBraW5kLCBpbnQgIHN0YXJ0LGludCBsZW4gLCBjb25zdCBCQkxNQ2FsbGJhY2tCbG9jayYgYmJsbV9jYWxsYmFja3MpCit7CisJaWYgKGxlbiA+IDApeyAvLyBUaWUgb2ZmIHRoZSBjb2RlIHJ1biB3ZSB3ZXJlIGluLCB1bmxlc3MgdGhlIGxlbmd0aCBpcyB6ZXJvLgorCQlkZWJ1Z2YoIlJ1biAlZCAlZDolZCIsIGtpbmQsIHN0YXJ0LCBzdGFydCtsZW4tMSApOworCQlyZXR1cm4gYmJsbUFkZFJ1bigJJmJibG1fY2FsbGJhY2tzLCAnUHl0aCcsCisJCQkJCQkJa2luZCwgc3RhcnQsIGxlbiwgZmFsc2UpOworCQkJCQkJCQorCX0KKwllbHNleworCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CQkJCQkKKworYm9vbCBhZGRSdW5CZWZvcmUgKEJCTE1SdW5Db2RlIGtpbmQsc3RydWN0IHJ1bmxvYyYgciwgY29uc3QgQkJMTUNhbGxiYWNrQmxvY2smIGJibG1fY2FsbGJhY2tzKQoreworCWJvb2wgbW9yZV9ydW5zID0gYWRkUnVuKGtpbmQsIHIubGFzdF9zdGFydCwgci5wb3MgLSByLmxhc3Rfc3RhcnQsIGJibG1fY2FsbGJhY2tzKTsKKwlyLmxhc3Rfc3RhcnQgPSAgci5wb3M7CisJcmV0dXJuIG1vcmVfcnVuczsKK30KKworYm9vbCBhZGRSdW5UbyAoQkJMTVJ1bkNvZGUga2luZCwgc3RydWN0IHJ1bmxvYyYgciwgY29uc3QgQkJMTUNhbGxiYWNrQmxvY2smIGJibG1fY2FsbGJhY2tzKQoreworCWJvb2wgbW9yZV9ydW5zID0gYWRkUnVuKGtpbmQsIHIubGFzdF9zdGFydCwgci5wb3MgLSByLmxhc3Rfc3RhcnQrMSwgYmJsbV9jYWxsYmFja3MpOworCXIubGFzdF9zdGFydCA9ICByLnBvcysxOworCXJldHVybiBtb3JlX3J1bnM7Cit9CisKKworYm9vbCBjb2xvcnN0cigJY2hhciBkZWxpbSwKKwkJCQlCQkxNUGFyYW1CbG9jayAmcGIsCisJCQkJc3RydWN0IHJ1bmxvYyAmciwKKwkJCQljb25zdCBCQkxNQ2FsbGJhY2tCbG9jayAmYmJsbV9jYWxsYmFja3MpCit7CisJYm9vbCB0cmlwcGxlID0gZmFsc2UgLCBwZXJzID0gZmFsc2UsIGxvb2t1cCA9IGZhbHNlLCBtb3JlX3J1bnMgPSB0cnVlOworCWNoYXIgYyA9IG5leHRjaGFyKHIscGIpOworCisJaWYgKGMgPT0gZGVsaW0peworCQljID0gbmV4dGNoYXIocixwYik7CisJCWlmIChjID09IGRlbGltKXsKKwkJCXRyaXBwbGUgPSB0cnVlOworCQkJYyA9IG5leHRjaGFyKHIscGIpOworCQl9ICAKKwkJZWxzZXsKKwkJCS8vZG91YmxlCisJCQlyZXR1cm4gYWRkUnVuQmVmb3JlKGtCQkxNUnVuSXNTaW5nbGVTdHJpbmcscixiYmxtX2NhbGxiYWNrcyk7CisJCX0JCisJfQorCXdoaWxlIChjICYmIG1vcmVfcnVucyl7CisJCWlmIChwZXJzICl7CisJCQlpZiAoaXNhbHBoYShjKSl7CisJCQkJbW9yZV9ydW5zID0gYWRkUnVuVG8oa1B5QkJMTVN0cmluZ1N1YnN0LHIsYmJsbV9jYWxsYmFja3MpOworCQkJfQorCQkJZWxzZSBpZiAoYyA9PSAnKCcpeworCQkJCWxvb2t1cCA9IHRydWU7CisJCQl9CisJCX0KKwkJcGVycyA9IGZhbHNlOworCQlpZiAoYyA9PSBkZWxpbSl7CisJCQlpZiAodHJpcHBsZSl7CisJCQkJaWYgKChjID0gbmV4dGNoYXIocixwYikpPT0gZGVsaW0gJiYgKGMgPSBuZXh0Y2hhcihyLHBiKSkgPT0gZGVsaW0peworCQkJCQlicmVhazsgLy8gZW5kIG9mIHRyaXBwbGUtcXVvdGUuCisJCQkJfSAgCisJCQl9CisJCQllbHNleworCQkJCWJyZWFrOyAvLyBlbmQgb2Ygc2luZ2xlLXF1b3RlLgorCQkJfQorCQkJCisJCX0KKwkJZWxzZSBpZiAoYz09ICdcXCcpeworCQkJbmV4dGNoYXIocixwYik7CisJCX0KKwkJZWxzZSBpZiAoYz09J1xyJ3x8Yz09J1xuJyl7CisJCQlpZiAoIXRyaXBwbGUpewkKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChjPT0nJScpeworCQkJbW9yZV9ydW5zID0gYWRkUnVuQmVmb3JlKGtCQkxNUnVuSXNTaW5nbGVTdHJpbmcscixiYmxtX2NhbGxiYWNrcyk7CisJCQlwZXJzID0gdHJ1ZTsKKwkJfQorCQllbHNlIGlmIChjPT0nKScgJiYgbG9va3VwKXsKKwkJCW1vcmVfcnVucyA9IGFkZFJ1blRvKGtQeUJCTE1TdHJpbmdTdWJzdCxyLGJibG1fY2FsbGJhY2tzKTsKKwkJCWxvb2t1cCA9IGZhbHNlOworCQl9CisJCWMgPSBuZXh0Y2hhcihyLHBiKTsKKwl9CisJcmV0dXJuIG1vcmVfcnVucyAmJiBhZGRSdW5Ubyhsb29rdXA/a1B5QkJMTVN0cmluZ1N1YnN0OmtCQkxNUnVuSXNTaW5nbGVTdHJpbmcscixiYmxtX2NhbGxiYWNrcyk7Cit9CisKK2Jvb2wgY29sb3Jjb21tZW50KEJCTE1QYXJhbUJsb2NrICZwYiwKKwkJCQlzdHJ1Y3QgcnVubG9jICZyLAorCQkJCWNvbnN0IEJCTE1DYWxsYmFja0Jsb2NrICZiYmxtX2NhbGxiYWNrcykKK3sKKwl3aGlsZSAoY2hhciBjID0gbmV4dGNoYXIocixwYikpeworCQlpZiAoYz09J1xyJ3x8IGM9PSdcbicpeworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGFkZFJ1blRvKGtCQkxNUnVuSXNMaW5lQ29tbWVudCxyLGJibG1fY2FsbGJhY2tzKTsKK30KKwordm9pZCBDYWxjdWxhdGVSdW5zKEJCTE1QYXJhbUJsb2NrICZwYiwKKwkJCWNvbnN0IEJCTE1DYWxsYmFja0Jsb2NrICZiYmxtX2NhbGxiYWNrcykKKworeworCWNvbnN0IHN0cnVjdCBydW5kZXNjCSpzdGF0ZSA9IE5VTEw7CisJYm9vbCBtb3JlX3J1bnM9dHJ1ZTsKKwkJCisJc3RydWN0IHJ1bmxvYyByOworCQorCWNoYXIgYyA9IHN0YXJ0KHIscGIpOworCQorCXdoaWxlIChjICYmIG1vcmVfcnVucyl7CisJbG9vcDoKKwkJLy8gUHJvY2VzcyBhIGNoYXIKKwkJaWYgKHN0YXRlPT1OVUxMKXsKKwkJCS8vSWYgd2UncmUgaW4gdGhlIGJhc2ljICdjb2RlJyBzdGF0ZSwgY2hlY2sgZm9yIGVhY2ggaW50ZXJlc3RpbmcgY2hhciAocnVuZGVsaW1zW2ldLnN0YXJ0KS4KKwkJCXN3aXRjaCAoYyl7CisJCQljYXNlICdcJyc6CisJCQljYXNlICciJzogCisJCQkJbW9yZV9ydW5zID0gYWRkUnVuQmVmb3JlKGtCQkxNUnVuSXNDb2RlLHIsYmJsbV9jYWxsYmFja3MpOworCQkJCWlmIChtb3JlX3J1bnMpeworCQkJCQltb3JlX3J1bnMgPSBjb2xvcnN0cihjLHBiLHIsYmJsbV9jYWxsYmFja3MpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgJyMnIDoKKwkJCQltb3JlX3J1bnMgPSBhZGRSdW5CZWZvcmUoa0JCTE1SdW5Jc0NvZGUscixiYmxtX2NhbGxiYWNrcyk7CisJCQkJaWYgKG1vcmVfcnVucyl7CisJCQkJCW1vcmVfcnVucyA9IGNvbG9yY29tbWVudChwYixyLGJibG1fY2FsbGJhY2tzKTsgCisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKworCQl9CisJCWMgPSBuZXh0Y2hhcihyLHBiKTsKKwl9CisJaWYgKG1vcmVfcnVucyl7CisJCWFkZFJ1bkJlZm9yZShrQkJMTVJ1bklzQ29kZSxyLGJibG1fY2FsbGJhY2tzKTsKKwl9CisJCisKK30KK3N0YXRpYyB2b2lkIEFkanVzdFJhbmdlKEJCTE1QYXJhbUJsb2NrICZwYXJhbXMsCisJCQkJCQljb25zdCBCQkxNQ2FsbGJhY2tCbG9jayAmY2FsbGJhY2tzKQorewkKKwlEZXNjVHlwZSBsYW5ndWFnZTsKKwlCQkxNUnVuQ29kZSBraW5kOworCVNJbnQzMiBjaGFyUG9zOworCVNJbnQzMiBsZW5ndGg7CisJVUludDMyIGluZGV4ID0gcGFyYW1zLmZBZGp1c3RSYW5nZVBhcmFtcy5mU3RhcnRJbmRleDsKKwkKKwl3aGlsZSgJaW5kZXggPiAwICYmCisJCQliYmxtR2V0UnVuKCZjYWxsYmFja3MsIGluZGV4LCBsYW5ndWFnZSwga2luZCwgY2hhclBvcywgbGVuZ3RoKSAmJgorCQkgCShraW5kPT1rUHlCQkxNU3RyaW5nU3Vic3R8fGtpbmQ9PWtCQkxNUnVuSXNTaW5nbGVTdHJpbmcpKXsKKwkgCWluZGV4LS07CisJfTsKKwkgcGFyYW1zLmZBZGp1c3RSYW5nZVBhcmFtcy5mU3RhcnRJbmRleCA9IGluZGV4OworfQorCisKKy8vIFRoZSBuZXh0IGNvdXBsZSBmdW5jcyBwcm9jZXNzIHRoZSB0ZXh0IG9mIGEgZmlsZSBhc3N1bW1pbmcgaXQncyBpbiAxIHBpZWNlIGluIG1lbW9yeSwKKy8vIHNvIHRoZXkgbWF5IG5vdCBiZSBjYWxsZWQgZnJvbSBDYWxjdWxhdGVSdW5zLgorCitib29sIG1hdGNod29yZChCQkxNUGFyYW1CbG9jayAmcGIsIGNvbnN0IGNoYXIgKnBhdCAsdW5zaWduZWQgbG9uZyAqcG9zKQorewkKKwljb25zdCBjaGFyICphc2NpVGV4dCA9IChjb25zdCBjaGFyICopIChwYi5mVGV4dElzVW5pY29kZT9OVUxMOnBiLmZUZXh0KTsKKworCWludCBpOworCWZvciAoaT0wOyBwYXRbaV07IGkrKyl7CisJCWlmICgqcG9zK2k+PXBiLmZUZXh0TGVuZ3RoKXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoYXNjaVRleHRbKnBvcytpXSAhPSBwYXRbaV0peworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCWlmICgoKnBvcytpPHBiLmZUZXh0TGVuZ3RoKSYmaXN3b3JkY2hhcihhc2NpVGV4dFsqcG9zK2ldKSl7CisJCXJldHVybiBmYWxzZTsKKwl9CisJKnBvcys9aTsKKwlyZXR1cm4gdHJ1ZTsKK30JCisKK2ludCBtYXRjaGluZGVudChCQkxNUGFyYW1CbG9jayAmcGIsIFVJbnQzMiAqcG9zKQorewkKKwljb25zdCBjaGFyICphc2NpVGV4dCA9IChjb25zdCBjaGFyICopIChwYi5mVGV4dElzVW5pY29kZT9OVUxMOnBiLmZUZXh0KTsKKwlpbnQgaW5kZW50PTA7CisJCQorCXdoaWxlKCpwb3M8cGIuZlRleHRMZW5ndGgpeworCQlzd2l0Y2ggKC8qKGNoYXIpKHBiLmZUZXh0SXNVbmljb2RlP3VuaVRleHRbcG9zXToqL2FzY2lUZXh0Wypwb3NdLyopKi8peworCQljYXNlICcgJzoKKwkJCSsrKnBvczsKKwkJCWluZGVudCsrOworCQkJYnJlYWs7CQorCQljYXNlICdcdCc6CisJCQkrKypwb3M7CQkKKwkJCWluZGVudCs9ODsKKwkJCWJyZWFrOworCQljYXNlICcjJzoKKwkJCXJldHVybiAtMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGluZGVudDsKKwkJCWJyZWFrOworCQl9CisJfQkKK30KKworCit2b2lkIGVhdF9saW5lKEJCTE1QYXJhbUJsb2NrICZwYiwgdW5zaWduZWQgbG9uZyogcG9zKQoreworCWNvbnN0IGNoYXIgKmFzY2lUZXh0ID0gKGNvbnN0IGNoYXIgKikgKHBiLmZUZXh0SXNVbmljb2RlP05VTEw6cGIuZlRleHQpOworCXdoaWxlIChhc2NpVGV4dFsqcG9zXSE9J1xyJyAmJiBhc2NpVGV4dFsqcG9zXSE9J1xuJyAmJiAqcG9zPHBiLmZUZXh0TGVuZ3RoKSB7KysqcG9zO30KKwl3aGlsZSAoKGFzY2lUZXh0Wypwb3NdPT0nXHInIHx8IGFzY2lUZXh0Wypwb3NdPT0nXG4nKSAmJiAqcG9zPHBiLmZUZXh0TGVuZ3RoKSB7KysqcG9zO30KKworfQorCit2b2lkIGFkZEl0ZW0oQkJMTVBhcmFtQmxvY2sgJnBiLCBVSW50MzIgcG9zLCBpbnQgbmVzdCwgQkJMTUZ1bmN0aW9uS2luZHMga2luZCwKKwkJCWNvbnN0IEJCTE1DYWxsYmFja0Jsb2NrICpiYmxtX2NhbGxiYWNrcykKK3sKKwlVSW50MzIgZnVuY3N0YXJ0cG9zID0gcG9zOworCVVJbnQzMiBmdW5jbmFtZWxlbj0wOworCVVJbnQzMiBvZmZzZXQ9MDsKKwljb25zdCBjaGFyICphc2NpVGV4dCA9IChjb25zdCBjaGFyICopIHBiLmZUZXh0OworCVVJbnQzMiBpbmRleDsKKwlPU0VyciBlcnI7CisJCisJd2hpbGUgKGlzc3BhY2UoYXNjaVRleHRbcG9zXSkgJiYgcG9zPHBiLmZUZXh0TGVuZ3RoKSB7Kytwb3M7fQorCVVJbnQzMiBmbmFtZXN0YXJ0ID0gcG9zOworCXdoaWxlICgoaXNhbG51bShhc2NpVGV4dFtwb3NdKXx8YXNjaVRleHRbcG9zXT09J18nKSAmJiBwb3M8cGIuZlRleHRMZW5ndGgpIHtwb3MrKzsgZnVuY25hbWVsZW4rKzt9CisJCisJZXJyID0gYmJsbUFkZFRva2VuVG9CdWZmZXIoCWJibG1fY2FsbGJhY2tzLCAKKwkJCQkJCQkJcGIuZkZjblBhcmFtcy5mVG9rZW5CdWZmZXIsCisJCQkJCQkJCSh2b2lkKikmYXNjaVRleHRbZm5hbWVzdGFydF0sCisJCQkJCQkJCWZ1bmNuYW1lbGVuLAorCQkJCQkJCQlwYi5mVGV4dElzVW5pY29kZSwKKwkJCQkJCQkJJm9mZnNldCk7CisJQkJMTVByb2NJbmZvIHByb2NJbmZvOyAKKwlwcm9jSW5mby5mRnVuY3Rpb25TdGFydCA9IGZuYW1lc3RhcnQ7CS8vCWNoYXIgb2Zmc2V0IGluIGZpbGUgb2YgZmlyc3QgY2hhcmFjdGVyIG9mIGZ1bmN0aW9uCisJcHJvY0luZm8uZkZ1bmN0aW9uRW5kID0gcG9zOwkvLwljaGFyIG9mZnNldCBvZiBsYXN0IGNoYXJhY3RlciBvZiBmdW5jdGlvbgorCQorCXByb2NJbmZvLmZTZWxTdGFydCA9IGZuYW1lc3RhcnQ7CQkvLwlmaXJzdCBjaGFyYWN0ZXIgdG8gc2VsZWN0IHdoZW4gY2hvb3NpbmcgZnVuY3Rpb24KKwlwcm9jSW5mby5mU2VsRW5kID0gcG9zOwkJLy8JbGFzdCBjaGFyYWN0ZXIgdG8gc2VsZWN0IHdoZW4gY2hvb3NpbmcgZnVuY3Rpb24KKwkKKwlwcm9jSW5mby5mRmlyc3RDaGFyID0gZm5hbWVzdGFydDsJCS8vCWZpcnN0IGNoYXJhY3RlciB0byBtYWtlIHZpc2libGUgd2hlbiBjaG9vc2luZyBmdW5jdGlvbgorCQorCXByb2NJbmZvLmZLaW5kID0ga2luZDsKKwkKKwlwcm9jSW5mby5mSW5kZW50TGV2ZWwgPSBuZXN0OwkvLwlpbmRlbnRhdGlvbiBsZXZlbCBvZiB0b2tlbgorCXByb2NJbmZvLmZGbGFncyA9IDA7CQkJLy8JdG9rZW4gZmxhZ3MgKHNlZSBCQkxNRnVuY3Rpb25GbGFncykKKwlwcm9jSW5mby5mTmFtZVN0YXJ0ID0gb2Zmc2V0OwkJLy8JY2hhciBvZmZzZXQgaW4gdG9rZW4gYnVmZmVyIG9mIHRva2VuIG5hbWUKKwlwcm9jSW5mby5mTmFtZUxlbmd0aCA9IGZ1bmNuYW1lbGVuOwkvLwlsZW5ndGggb2YgdG9rZW4gbmFtZQorCQkJCQkJCQkJCQkJCQkJCQorCWVyciA9IGJibG1BZGRGdW5jdGlvblRvTGlzdChiYmxtX2NhbGxiYWNrcywJCisJCQkJCQkJCXBiLmZGY25QYXJhbXMuZkZjbkxpc3QsCisJCQkJCQkJCXByb2NJbmZvLAorCQkJCQkJCQkmaW5kZXgpOworfQorCisKKworZW51bXsKKwltYXhuZXN0PTUKK307CisKK3ZvaWQgU2NhbkZvckZ1bmN0aW9ucyhCQkxNUGFyYW1CbG9jayAmcGIsCisJCQljb25zdCBCQkxNQ2FsbGJhY2tCbG9jayAmYmJsbV9jYWxsYmFja3MpCit7CisKKwljb25zdCBjaGFyICphc2NpVGV4dCA9IChjb25zdCBjaGFyICopIChwYi5mVGV4dElzVW5pY29kZT9OVUxMOnBiLmZUZXh0KTsKKwlVbmlDaGFyUHRyIHVuaVRleHQgPSAoVW5pQ2hhclB0cikgKHBiLmZUZXh0SXNVbmljb2RlP3BiLmZUZXh0Ok5VTEwpOworCQorCWludCBpbmRlbnRzW21heG5lc3RdPSB7MH07CisJaW50IG5lc3QgPSAwOworCQorCVVJbnQzMiBwb3M9MDsgLy8gY3VycmVudCBjaGFyYWN0ZXIgb2Zmc2V0CisKKwkKKwl3aGlsZSAocG9zPHBiLmZUZXh0TGVuZ3RoKXsKKwkJCisJCWludCBpbmRlbnQgPSBtYXRjaGluZGVudChwYiwgJnBvcyk7CisJCQorCQlpZiAoaW5kZW50ID49IDApeworCQkJZm9yIChpbnQgaT0wOyBpIDw9IG5lc3Q7IGkrKyl7CisJCQkJaWYgKGluZGVudDw9aW5kZW50c1tpXSl7CisJCQkJCW5lc3QgPSBpOworCQkJCQlpbmRlbnRzW25lc3RdPWluZGVudDsKKwkJCQkJZ290byB4OworCQkJCX0KKwkJCX0KKwkJCWluZGVudHNbKytuZXN0XT1pbmRlbnQ7CisJCQl4OgorCQkKKwkJCWlmIChtYXRjaHdvcmQocGIsImRlZiIsJnBvcykpeworCQkJCWFkZEl0ZW0oIHBiLCBwb3MsIG5lc3QsIGtCQkxNRnVuY3Rpb25NYXJrLCAmYmJsbV9jYWxsYmFja3MpOworCQkJfQorCQkJZWxzZSBpZiAobWF0Y2h3b3JkKHBiLCAiY2xhc3MiLCAmcG9zKSl7CisJCQkJYWRkSXRlbSggcGIsIHBvcywgbmVzdCwga0JCTE1UeXBlZGVmLCAmYmJsbV9jYWxsYmFja3MpOworCQkJfQorCQl9CisJCWVhdF9saW5lKHBiLCZwb3MpOworCX0KKwkKK30KKworT1NFcnIgbWFpbigJQkJMTVBhcmFtQmxvY2sgJnBhcmFtcywKKwkJCWNvbnN0IEJCTE1DYWxsYmFja0Jsb2NrICZiYmxtX2NhbGxiYWNrcywKKwkJCWNvbnN0IEJCWFRDYWxsYmFja0Jsb2NrICZiYnh0X2NhbGxiYWNrcykKK3sKKwlPU0VyciByZXN1bHQ7CisKKwlpZiAoKHBhcmFtcy5mU2lnbmF0dXJlICE9IGtCQkxNUGFyYW1CbG9ja1NpZ25hdHVyZSkgfHwKKwkJKHBhcmFtcy5mTGVuZ3RoIDwgc2l6ZW9mKEJCTE1QYXJhbUJsb2NrKSkpCisJeworCQlyZXR1cm4gcGFyYW1FcnI7CisJfQorCQorCXN3aXRjaCAocGFyYW1zLmZNZXNzYWdlKQorCXsKKwkJY2FzZSBrQkJMTUluaXRNZXNzYWdlOgorCQljYXNlIGtCQkxNRGlzcG9zZU1lc3NhZ2U6CisJCXsKKwkJCXJlc3VsdCA9IG5vRXJyOwkvLyBub3RoaW5nIHRvIGRvCisJCQlicmVhazsKKwkJfQorCQkKKwkJY2FzZSBrQkJMTUNhbGN1bGF0ZVJ1bnNNZXNzYWdlOgorCQkJQ2FsY3VsYXRlUnVucyhwYXJhbXMsIGJibG1fY2FsbGJhY2tzKTsKKwkJCXJlc3VsdCA9IG5vRXJyOworCQkJYnJlYWs7CisKKwkJY2FzZSBrQkJMTVNjYW5Gb3JGdW5jdGlvbnNNZXNzYWdlOgorCQkJU2NhbkZvckZ1bmN0aW9ucyhwYXJhbXMsIGJibG1fY2FsbGJhY2tzKTsKKwkJCXJlc3VsdCA9IG5vRXJyOworCQkJYnJlYWs7CisKKwkJY2FzZSBrQkJMTUFkanVzdFJhbmdlTWVzc2FnZToKKwkJCUFkanVzdFJhbmdlKHBhcmFtcywgYmJsbV9jYWxsYmFja3MpOworCQkJcmVzdWx0ID0gbm9FcnI7CisJCQlicmVhazsKKwkJCisJCWNhc2Uga0JCTE1NYXBSdW5LaW5kVG9Db2xvckNvZGVNZXNzYWdlOgorCQkJc3dpdGNoIChwYXJhbXMuZk1hcFJ1blBhcmFtcy5mUnVuS2luZCl7CisJCQljYXNlIGtQeUJCTE1TdHJpbmdTdWJzdDoKKwkJCQlwYXJhbXMuZk1hcFJ1blBhcmFtcy5mQ29sb3JDb2RlID0ga0JCTE1TR01MQXR0cmlidXRlTmFtZUNvbG9yOworCQkJCXBhcmFtcy5mTWFwUnVuUGFyYW1zLmZNYXBwZWQgPQl0cnVlOworCQkJCWJyZWFrOwkKKwkJCWRlZmF1bHQ6CisJCQkJcGFyYW1zLmZNYXBSdW5QYXJhbXMuZk1hcHBlZCA9CWZhbHNlOworCQkJfQorCQkJcmVzdWx0ID0gbm9FcnI7CisJCQlicmVhazsKKworCQljYXNlIGtCQkxNRXNjYXBlU3RyaW5nTWVzc2FnZToKKwkJY2FzZSBrQkJMTUFkanVzdEVuZE1lc3NhZ2U6CisJCWNhc2Uga0JCTE1NYXBDb2xvckNvZGVUb0NvbG9yTWVzc2FnZToKKwkJY2FzZSBrQkJMTVNldENhdGVnb3JpZXNNZXNzYWdlOgorCQljYXNlIGtCQkxNTWF0Y2hLZXl3b3JkTWVzc2FnZToKKwkJeworCQkJcmVzdWx0ID0gdXNlckNhbmNlbGVkRXJyOworCQkJYnJlYWs7CisJCX0KKwkJCQorCQlkZWZhdWx0OgorCQl7CisJCQlyZXN1bHQgPSBwYXJhbUVycjsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXN1bHQ7CQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL01hYy9Db250cmliL0JCUHkubG0vQkJQeXRob25MTS5tY3AgYi9NYWMvQ29udHJpYi9CQlB5LmxtL0JCUHl0aG9uTE0ubWNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YmU1MjQKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvQ29udHJpYi9CQlB5LmxtL0JCUHl0aG9uTE0ubWNwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL01hYy9Db250cmliL0JCUHkubG0vQkJweS5yIGIvTWFjL0NvbnRyaWIvQkJQeS5sbS9CQnB5LnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q4MGI0YQotLS0gL2Rldi9udWxsCisrKyBiL01hYy9Db250cmliL0JCUHkubG0vQkJweS5yCkBAIC0wLDAgKzEsMzUgQEAKKyNpbmNsdWRlICJCQkxNVHlwZXMuciIKKyNpbmNsdWRlICJNYWNUeXBlcy5yIgorCisjZGVmaW5lIAlrS2V5V29yZHMJMTA1NworCityZXNvdXJjZQknQkJMRicJKDEyOCwgIlB5dGhvbiBMYW5ndWFnZSBNYXBwaW5ncyIsIHB1cmdlYWJsZSkKK3sKKwlrQ3VycmVudEJCTEZWZXJzaW9uLAorCQorCXsKKwkJa0xhbmd1YWdlUHl0aG9uLAorCQkoa0JCTE1TY2Fuc0Z1bmN0aW9uc3xrQkJMTUNvbG9yc1N5bnRheHxrQkJMTUlzQ2FzZVNlbnNpdGl2ZSksCisJCWtLZXlXb3JkcywKKwkJIlB5dGhvbiIsCisJCXsKKwkJCWtOZWl0aGVyU291cmNlTm9ySW5jbHVkZSwgIi5weSIsCisJCX0KKwl9Cit9OworCisjZGVmaW5lIFZFUlNJT04JMHgxLCAweDAsIGZpbmFsLCAweDAKKworcmVzb3VyY2UgJ3ZlcnMnICgxKSB7CisJVkVSU0lPTiwKKwl2ZXJVUywKKwkiMS4xIiwKKwkiMS4xLCIKK307CisKK3Jlc291cmNlICd2ZXJzJyAoMikgeworCVZFUlNJT04sCisJdmVyVVMsCisJJCREYXRlLAorCSQkRGF0ZQorfTsKZGlmZiAtLWdpdCBhL01hYy9Db250cmliL0JCUHkubG0vUHl0aG9uIGIvTWFjL0NvbnRyaWIvQkJQeS5sbS9QeXRob24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdlZTcwZgotLS0gL2Rldi9udWxsCisrKyBiL01hYy9Db250cmliL0JCUHkubG0vUHl0aG9uCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL01hYy9Db250cmliL0JCUHkubG0vUHl0aG9uIEtleXdvcmRzLnJzcmMgYi9NYWMvQ29udHJpYi9CQlB5LmxtL1B5dGhvbiBLZXl3b3Jkcy5yc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ODllOTAKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvQ29udHJpYi9CQlB5LmxtL1B5dGhvbiBLZXl3b3Jkcy5yc3JjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL01hYy9Db250cmliL0JCUHkubG0vUHl0aG9uQkJMTS50eHQgYi9NYWMvQ29udHJpYi9CQlB5LmxtL1B5dGhvbkJCTE0udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYjEyNDIKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvQ29udHJpYi9CQlB5LmxtL1B5dGhvbkJCTE0udHh0CkBAIC0wLDAgKzEsMTYgQEAKK1RoaXMgaXMgdGhlIFB5dGhvbiBMYW5ndWFnZSBNb2R1bGUgZm9yIEJCRWRpdC4KKworVGhpcyBzb2Z0d2FyZSBpcyBhIHBsdWdpbiB0byAgQmFyZSBCb25lcyBTb2Z0d2FyZSdzIEJCRWRpdCA2LjAuMiAob3IgbW9yZSksIGRlc2lnbmVkIHRvIG1ha2UgZWRpdGluZyAmIGJyb3dzaW5nIFB5dGhvbiBMYW5ndWFnZSBmaWxlcyBlYXNlci4KKworSXQgcGFyc2VzIGFueSBmaWxlIGVuZGluZyBpbiAucHkgKG9yIGV4dGVudGlvbnMgb2YgeW91ciBjaG9pY2UuKSBwcm92aWRpbmcgQkJFZGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIEJCRWRpdCBuZWVkcyB0byBwcm92aWRlIHNlcnZpY2VzIGZvciBweXRob24gZmlsZXMgc2ltaWxhciB0byB0aG9zZSBpdCBwcm92aWRlcyBmb3IgJ0MnLiBOYW1lbHk6IHN5bnRheCBjb2xvcmluZyBhbmQgcG9wdWxhdGluZyBCQkVkaXQncyAnnycgcG9wdXAgbWVudSB3aXRoIGZpbGUncyBmdW5jdGlvbnMgYW5kIGNsYXNzZXMuCisKK1RoaXMgUGx1Zy1pbiBuZWVkcyB0byBiZSBwbGFjZWQgaW4geW91ciA6QkJFZGl0IDYuMDpCQkVkaXQgU3VwcG9ydDpMYW5ndWFnZSBNb2R1bGVzOiBmb2xkZXIuCisKK0lmIHlvdSB3aXNoLCBJIGhhdmUgbm8gb2JqZWN0aW9ucyB0byByZWRpc3RyaWJ1dGluZyBpdCBpbiB3aG9sZSBvciBpbiBwYXJ0LCBtb2RpZnkgaXQsIG9yIGJlYXRpbmcgc21hbGwgZnVyeSBhbmltYWxzIHRvIGRlYXRoIHdpdGggcm9sbGVkIHVwIHByaW50b3V0cyBvZiB0aGUgc291cmNlIGNvZGUuCisKK0NocmlzdG9waGVyIFN0ZXJuCitjaXN0ZXJuQGVhcnRobGluay5uZXQKKworTm90ZSBieSBKYWNrOgorCUFsc28gY2hlY2sgb3V0IHRoZSBCQlB5IGNvbnRyaWJ1dGVkIHNvZnR3YXJlLCB3aGljaCBhbGxvd3MgeW91IHRvIGV4ZWN1dGUKKwlQeXRob24gY29kZSBmcm9tIHdpdGhpbiBCQkVkaXQuCg==