ZGlmZiAtLWdpdCBhL3NvdXJjZS9QbHVnaW5zL0luc3RydWN0aW9uL0FSTS9FbXVsYXRlSW5zdHJ1Y3Rpb25BUk0uY3BwIGIvc291cmNlL1BsdWdpbnMvSW5zdHJ1Y3Rpb24vQVJNL0VtdWxhdGVJbnN0cnVjdGlvbkFSTS5jcHAKaW5kZXggZmIzMzFmMi4uOTFmMWYxYyAxMDA2NDQKLS0tIGEvc291cmNlL1BsdWdpbnMvSW5zdHJ1Y3Rpb24vQVJNL0VtdWxhdGVJbnN0cnVjdGlvbkFSTS5jcHAKKysrIGIvc291cmNlL1BsdWdpbnMvSW5zdHJ1Y3Rpb24vQVJNL0VtdWxhdGVJbnN0cnVjdGlvbkFSTS5jcHAKQEAgLTUwMSw5ICs1MDEsNyBAQAogICAgICAgICAgICAgICAgIGRhdGEgPSBNZW1BUmVhZChjb250ZXh0LCBhZGRyLCA0LCAwLCAmc3VjY2Vzcyk7CiAgICAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgIAotICAgICAgICAgICAgICAgIFJlZ2lzdGVySW5mbyByZWdfaW5mbzsKLSAgICAgICAgICAgICAgICBHZXRSZWdpc3RlckluZm8gKGVSZWdpc3RlcktpbmREV0FSRiwgZHdhcmZfcjAgKyBpLCByZWdfaW5mbyk7Ci0gICAgICAgICAgICAgICAgaWYgKCFXcml0ZVJlZ2lzdGVyVW5zaWduZWQoY29udGV4dCwgcmVnX2luZm8sIGRhdGEpKQorICAgICAgICAgICAgICAgIGlmICghV3JpdGVSZWdpc3RlclVuc2lnbmVkKGNvbnRleHQsIGVSZWdpc3RlcktpbmREV0FSRiwgZHdhcmZfcjAgKyBpLCBkYXRhKSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIGFkZHIgKz0gYWRkcl9ieXRlX3NpemU7CiAgICAgICAgICAgICB9CkBAIC04MDIsMTIgKzgwMCwxMiBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBjYXNlIGVFbmNvZGluZ0ExOgotICAgICAgICAgICAgICAgIC8vIGQgPSBVSW50KFJkKTsgc2V0ZmxhZ3MgPSAoUyA9PSDigJgx4oCZKTsgKGltbTMyLCBjYXJyeSkgPSBBUk1FeHBhbmRJbW1fQyhpbW0xMiwgQVBTUi5DKTsKKyAgICAgICAgICAgICAgICAvLyBkID0gVUludChSZCk7IHNldGZsYWdzID0gKFMgPT0g1DHVKTsgKGltbTMyLCBjYXJyeSkgPSBBUk1FeHBhbmRJbW1fQyhpbW0xMiwgQVBTUi5DKTsKICAgICAgICAgICAgICAgICBSZCA9IEJpdHMzMiAob3Bjb2RlLCAxNSwgMTIpOwogICAgICAgICAgICAgICAgIHNldGZsYWdzID0gQml0SXNTZXQgKG9wY29kZSwgMjApOwogICAgICAgICAgICAgICAgIGltbTMyID0gQVJNRXhwYW5kSW1tX0MgKG9wY29kZSwgQVBTUl9DLCBjYXJyeSk7CiAKLSAgICAgICAgICAgICAgICAvLyBpZiBSZCA9PSDigJgxMTEx4oCZICYmIFMgPT0g4oCYMeKAmSB0aGVuIFNFRSBTVUJTIFBDLCBMUiBhbmQgcmVsYXRlZCBpbnN0cnVjdGlvbnM7CisgICAgICAgICAgICAgICAgLy8gaWYgUmQgPT0g1DExMTHVICYmIFMgPT0g1DHVIHRoZW4gU0VFIFNVQlMgUEMsIExSIGFuZCByZWxhdGVkIGluc3RydWN0aW9uczsKICAgICAgICAgICAgICAgICBpZiAoKFJkID09IDE1KSAmJiBzZXRmbGFncykKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVtdWxhdGVTVUJTUGNMckV0YyAob3Bjb2RlLCBlbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgICAKQEAgLTE5ODEsNyArMTk3OSw3IEBACiAgICAgICAgICAgICBHZXRSZWdpc3RlckluZm8gKGVSZWdpc3RlcktpbmREV0FSRiwgc3RhcnRfcmVnICsgZCArIGksIGR3YXJmX3JlZyk7CiAgICAgICAgICAgICBjb250ZXh0LlNldFJlZ2lzdGVyVG9SZWdpc3RlclBsdXNPZmZzZXQgKCBkd2FyZl9yZWcsIHNwX3JlZywgYWRkciAtIHNwKTsKICAgICAgICAgICAgIC8vIHVpbnQ2NF90IHRvIGFjY29tbW9kYXRlIDY0LWJpdCByZWdpc3RlcnMuCi0gICAgICAgICAgICB1aW50NjRfdCByZWdfdmFsdWUgPSBSZWFkUmVnaXN0ZXJVbnNpZ25lZChkd2FyZl9yZWcsIDAsICZzdWNjZXNzKTsKKyAgICAgICAgICAgIHVpbnQ2NF90IHJlZ192YWx1ZSA9IFJlYWRSZWdpc3RlclVuc2lnbmVkICgmZHdhcmZfcmVnLCAwLCAmc3VjY2Vzcyk7CiAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgaWYgKCFNZW1BV3JpdGUgKGNvbnRleHQsIGFkZHIsIHJlZ192YWx1ZSwgcmVnX2J5dGVfc2l6ZSkpCkBAIC0yMDc3LDcgKzIwNzUsNyBAQAogICAgICAgICAgICAgZGF0YSA9IE1lbUFSZWFkKGNvbnRleHQsIGFkZHIsIHJlZ19ieXRlX3NpemUsIDAsICZzdWNjZXNzKTsKICAgICAgICAgICAgIGlmICghc3VjY2VzcykKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgIAotICAgICAgICAgICAgaWYgKCFXcml0ZVJlZ2lzdGVyVW5zaWduZWQoY29udGV4dCwgZHdhcmZfcmVnLCBkYXRhKSkKKyAgICAgICAgICAgIGlmICghV3JpdGVSZWdpc3RlclVuc2lnbmVkKGNvbnRleHQsICZkd2FyZl9yZWcsIGRhdGEpKQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIGFkZHIgKz0gcmVnX2J5dGVfc2l6ZTsKICAgICAgICAgfQpAQCAtNDIzMiw3ICs0MjMwLDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgY2FzZSBlRW5jb2RpbmdBMToKLSAgICAgICAgICAgICAgICAvLyBpZiBXID09ICcxJyAmJiBSbiA9PSAnMTEwMeKAmSAmJiBCaXRDb3VudChyZWdpc3Rlcl9saXN0KSA+PSAyIHRoZW4gU0VFIFBVU0g7IAorICAgICAgICAgICAgICAgIC8vIGlmIFcgPT0gJzEnICYmIFJuID09ICcxMTAx1SAmJiBCaXRDb3VudChyZWdpc3Rlcl9saXN0KSA+PSAyIHRoZW4gU0VFIFBVU0g7IAogICAgICAgICAgICAgICAgIGlmIChCaXRJc1NldCAob3Bjb2RlLCAyMSkgJiYgKEJpdHMzMiAob3Bjb2RlLCAxOSwgMTYpID09IDEzKSAmJiBCaXRDb3VudCAoQml0czMyIChvcGNvZGUsIDE1LCAwKSkgPj0gMikKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSBQdXNoCkBAIC05Mjc1LDcgKzkyNzMsNyBAQAogICAgIGlmIENvbmRpdGlvblBhc3NlZCgpIHRoZW4KICAgICAgICAgRW5jb2RpbmdTcGVjaWZpY09wZXJhdGlvbnMoKTsKICAgICAgICAgc2hpZnRlZCA9IFNoaWZ0KFJbbV0sIHNoaWZ0X3QsIHNoaWZ0X24sIEFQU1IuQyk7Ci0gICAgICAgIChyZXN1bHQsIGNhcnJ5LCBvdmVyZmxvdykgPSBBZGRXaXRoQ2FycnkoU1AsIE5PVChzaGlmdGVkKSwg4oCYMeKAmSk7CisgICAgICAgIChyZXN1bHQsIGNhcnJ5LCBvdmVyZmxvdykgPSBBZGRXaXRoQ2FycnkoU1AsIE5PVChzaGlmdGVkKSwg1DHVKTsKICAgICAgICAgaWYgZCA9PSAxNSB0aGVuIC8vIENhbiBvbmx5IG9jY3VyIGZvciBBUk0gZW5jb2RpbmcKICAgICAgICAgICAgIEFMVVdyaXRlUEMocmVzdWx0KTsgLy8gc2V0ZmxhZ3MgaXMgYWx3YXlzIEZBTFNFIGhlcmUKICAgICAgICAgZWxzZQpAQCAtOTMwMCw3ICs5Mjk4LDcgQEAKICAgICAgICAgc3dpdGNoIChlbmNvZGluZykKICAgICAgICAgewogICAgICAgICAgICAgY2FzZSBlRW5jb2RpbmdUMToKLSAgICAgICAgICAgICAgICAvLyBkID0gVUludChSZCk7IG0gPSBVSW50KFJtKTsgc2V0ZmxhZ3MgPSAoUyA9PSDigJgx4oCZKTsKKyAgICAgICAgICAgICAgICAvLyBkID0gVUludChSZCk7IG0gPSBVSW50KFJtKTsgc2V0ZmxhZ3MgPSAoUyA9PSDUMdUpOwogICAgICAgICAgICAgICAgIGQgPSBCaXRzMzIgKG9wY29kZSwgMTEsIDgpOwogICAgICAgICAgICAgICAgIG0gPSBCaXRzMzIgKG9wY29kZSwgMywgMCk7CiAgICAgICAgICAgICAgICAgc2V0ZmxhZ3MgPSBCaXRJc1NldCAob3Bjb2RlLCAyMCk7CkBAIC05MzE4LDEyICs5MzE2LDEyIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgZUVuY29kaW5nQTE6Ci0gICAgICAgICAgICAgICAgLy8gZCA9IFVJbnQoUmQpOyBtID0gVUludChSbSk7IHNldGZsYWdzID0gKFMgPT0g4oCYMeKAmSk7CisgICAgICAgICAgICAgICAgLy8gZCA9IFVJbnQoUmQpOyBtID0gVUludChSbSk7IHNldGZsYWdzID0gKFMgPT0g1DHVKTsKICAgICAgICAgICAgICAgICBkID0gQml0czMyIChvcGNvZGUsIDE1LCAxMik7CiAgICAgICAgICAgICAgICAgbSA9IEJpdHMzMiAob3Bjb2RlLCAzLCAwKTsKICAgICAgICAgICAgICAgICBzZXRmbGFncyA9IEJpdElzU2V0IChvcGNvZGUsIDIwKTsKICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBpZiBSZCA9PSDigJgxMTEx4oCZICYmIFMgPT0g4oCYMeKAmSB0aGVuIFNFRSBTVUJTIFBDLCBMUiBhbmQgcmVsYXRlZCBpbnN0cnVjdGlvbnM7CisgICAgICAgICAgICAgICAgLy8gaWYgUmQgPT0g1DExMTHVICYmIFMgPT0g1DHVIHRoZW4gU0VFIFNVQlMgUEMsIExSIGFuZCByZWxhdGVkIGluc3RydWN0aW9uczsKICAgICAgICAgICAgICAgICBpZiAoZCA9PSAxNSAmJiBzZXRmbGFncykKICAgICAgICAgICAgICAgICAgICAgRW11bGF0ZVNVQlNQY0xyRXRjIChvcGNvZGUsIGVuY29kaW5nKTsKIApAQCAtOTM0Miw3ICs5MzQwLDcgQEAKIAogICAgICAgICB1aW50MzJfdCBzaGlmdGVkID0gU2hpZnQgKFJtLCBzaGlmdF90LCBzaGlmdF9uLCBBUFNSX0MpOwogCi0gICAgICAgIC8vIChyZXN1bHQsIGNhcnJ5LCBvdmVyZmxvdykgPSBBZGRXaXRoQ2FycnkoU1AsIE5PVChzaGlmdGVkKSwg4oCYMeKAmSk7CisgICAgICAgIC8vIChyZXN1bHQsIGNhcnJ5LCBvdmVyZmxvdykgPSBBZGRXaXRoQ2FycnkoU1AsIE5PVChzaGlmdGVkKSwg1DHVKTsKICAgICAgICAgdWludDMyX3Qgc3BfdmFsID0gUmVhZENvcmVSZWcgKFNQX1JFRywgJnN1Y2Nlc3MpOwogICAgICAgICBpZiAoIXN1Y2Nlc3MpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC05MzczLDcgKzkzNzEsNyBAQAogICAgICAgICBFbmNvZGluZ1NwZWNpZmljT3BlcmF0aW9ucygpOwogICAgICAgICBzaGlmdF9uID0gVUludChSW3NdPDc6MD4pOwogICAgICAgICBzaGlmdGVkID0gU2hpZnQoUlttXSwgc2hpZnRfdCwgc2hpZnRfbiwgQVBTUi5DKTsKLSAgICAgICAgKHJlc3VsdCwgY2FycnksIG92ZXJmbG93KSA9IEFkZFdpdGhDYXJyeShSW25dLCBzaGlmdGVkLCDigJgw4oCZKTsKKyAgICAgICAgKHJlc3VsdCwgY2FycnksIG92ZXJmbG93KSA9IEFkZFdpdGhDYXJyeShSW25dLCBzaGlmdGVkLCDUMNUpOwogICAgICAgICBSW2RdID0gcmVzdWx0OwogICAgICAgICBpZiBzZXRmbGFncyB0aGVuCiAgICAgICAgICAgICBBUFNSLk4gPSByZXN1bHQ8MzE+OwpAQCAtOTQwMiw3ICs5NDAwLDcgQEAKICAgICAgICAgICAgICAgICBtID0gQml0czMyIChvcGNvZGUsIDMsIDApOwogICAgICAgICAgICAgICAgIHMgPSBCaXRzMzIgKG9wY29kZSwgMTEsIDgpOwogICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gc2V0ZmxhZ3MgPSAoUyA9PSDigJgx4oCZKTsgc2hpZnRfdCA9IERlY29kZVJlZ1NoaWZ0KHR5cGUpOworICAgICAgICAgICAgICAgIC8vIHNldGZsYWdzID0gKFMgPT0g1DHVKTsgc2hpZnRfdCA9IERlY29kZVJlZ1NoaWZ0KHR5cGUpOwogICAgICAgICAgICAgICAgIHNldGZsYWdzID0gQml0SXNTZXQgKG9wY29kZSwgMjApOwogICAgICAgICAgICAgICAgIHNoaWZ0X3QgPSBEZWNvZGVSZWdTaGlmdCAoQml0czMyIChvcGNvZGUsIDYsIDUpKTsKICAgICAgICAgICAgICAgICAgIApAQCAtOTQyOSw3ICs5NDI3LDcgQEAKICAgICAgICAgICAgICAgICAgIAogICAgICAgICB1aW50MzJfdCBzaGlmdGVkID0gU2hpZnQgKFJtLCBzaGlmdF90LCBzaGlmdF9uLCBBUFNSX0MpOyAgICAgICAgICAKICAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gKHJlc3VsdCwgY2FycnksIG92ZXJmbG93KSA9IEFkZFdpdGhDYXJyeShSW25dLCBzaGlmdGVkLCDigJgw4oCZKTsKKyAgICAgICAgLy8gKHJlc3VsdCwgY2FycnksIG92ZXJmbG93KSA9IEFkZFdpdGhDYXJyeShSW25dLCBzaGlmdGVkLCDUMNUpOwogICAgICAgICB1aW50MzJfdCBSbiA9IFJlYWRDb3JlUmVnIChuLCAmc3VjY2Vzcyk7CiAgICAgICAgIGlmICghc3VjY2VzcykKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTk0NjgsNyArOTQ2Niw3IEBACiAgICAgaWYgQ29uZGl0aW9uUGFzc2VkKCkgdGhlbgogICAgICAgICBFbmNvZGluZ1NwZWNpZmljT3BlcmF0aW9ucygpOwogICAgICAgICBzaGlmdGVkID0gU2hpZnQoUlttXSwgc2hpZnRfdCwgc2hpZnRfbiwgQVBTUi5DKTsKLSAgICAgICAgKHJlc3VsdCwgY2FycnksIG92ZXJmbG93KSA9IEFkZFdpdGhDYXJyeShSW25dLCBOT1Qoc2hpZnRlZCksIOKAmDHigJkpOworICAgICAgICAocmVzdWx0LCBjYXJyeSwgb3ZlcmZsb3cpID0gQWRkV2l0aENhcnJ5KFJbbl0sIE5PVChzaGlmdGVkKSwg1DHVKTsKICAgICAgICAgaWYgZCA9PSAxNSB0aGVuIC8vIENhbiBvbmx5IG9jY3VyIGZvciBBUk0gZW5jb2RpbmcKICAgICAgICAgICAgIEFMVVdyaXRlUEMocmVzdWx0KTsgLy8gc2V0ZmxhZ3MgaXMgYWx3YXlzIEZBTFNFIGhlcmUKICAgICAgICAgZWxzZQpAQCAtOTUwNyw5ICs5NTA1LDkgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgY2FzZSBlRW5jb2RpbmdUMjoKLSAgICAgICAgICAgICAgICAvLyBpZiBSZCA9PSDigJgxMTEx4oCZICYmIFMgPT0g4oCYMeKAmSB0aGVuIFNFRSBDTVAgKHJlZ2lzdGVyKTsKLSAgICAgICAgICAgICAgICAvLyBpZiBSbiA9PSDigJgxMTAx4oCZIHRoZW4gU0VFIFNVQiAoU1AgbWludXMgcmVnaXN0ZXIpOwotICAgICAgICAgICAgICAgIC8vIGQgPSBVSW50KFJkKTsgbiA9IFVJbnQoUm4pOyBtID0gVUludChSbSk7IHNldGZsYWdzID0gKFMgPT0g4oCYMeKAmSk7CisgICAgICAgICAgICAgICAgLy8gaWYgUmQgPT0g1DExMTHVICYmIFMgPT0g1DHVIHRoZW4gU0VFIENNUCAocmVnaXN0ZXIpOworICAgICAgICAgICAgICAgIC8vIGlmIFJuID09INQxMTAx1SB0aGVuIFNFRSBTVUIgKFNQIG1pbnVzIHJlZ2lzdGVyKTsKKyAgICAgICAgICAgICAgICAvLyBkID0gVUludChSZCk7IG4gPSBVSW50KFJuKTsgbSA9IFVJbnQoUm0pOyBzZXRmbGFncyA9IChTID09INQx1Sk7CiAgICAgICAgICAgICAgICAgZCA9IEJpdHMzMiAob3Bjb2RlLCAxMSwgOCk7CiAgICAgICAgICAgICAgICAgbiA9IEJpdHMzMiAob3Bjb2RlLCAxOSwgMTYpOwogICAgICAgICAgICAgICAgIG0gPSBCaXRzMzIgKG9wY29kZSwgMywgMCk7CkBAIC05NTI1LDE0ICs5NTIzLDE0IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGNhc2UgZUVuY29kaW5nQTE6Ci0gICAgICAgICAgICAgICAgLy8gaWYgUm4gPT0g4oCYMTEwMeKAmSB0aGVuIFNFRSBTVUIgKFNQIG1pbnVzIHJlZ2lzdGVyKTsKLSAgICAgICAgICAgICAgICAvLyBkID0gVUludChSZCk7IG4gPSBVSW50KFJuKTsgbSA9IFVJbnQoUm0pOyBzZXRmbGFncyA9IChTID09IOKAmDHigJkpOworICAgICAgICAgICAgICAgIC8vIGlmIFJuID09INQxMTAx1SB0aGVuIFNFRSBTVUIgKFNQIG1pbnVzIHJlZ2lzdGVyKTsKKyAgICAgICAgICAgICAgICAvLyBkID0gVUludChSZCk7IG4gPSBVSW50KFJuKTsgbSA9IFVJbnQoUm0pOyBzZXRmbGFncyA9IChTID09INQx1Sk7CiAgICAgICAgICAgICAgICAgZCA9IEJpdHMzMiAob3Bjb2RlLCAxNSwgMTIpOwogICAgICAgICAgICAgICAgIG4gPSBCaXRzMzIgKG9wY29kZSwgMTksIDE2KTsKICAgICAgICAgICAgICAgICBtID0gQml0czMyIChvcGNvZGUsIDMsIDApOwogICAgICAgICAgICAgICAgIHNldGZsYWdzID0gQml0SXNTZXQgKG9wY29kZSwgMjApOwogICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGlmIFJkID09IOKAmDExMTHigJkgJiYgUyA9PSDigJgx4oCZIHRoZW4gU0VFIFNVQlMgUEMsIExSIGFuZCByZWxhdGVkIGluc3RydWN0aW9uczsKKyAgICAgICAgICAgICAgICAvLyBpZiBSZCA9PSDUMTExMdUgJiYgUyA9PSDUMdUgdGhlbiBTRUUgU1VCUyBQQywgTFIgYW5kIHJlbGF0ZWQgaW5zdHJ1Y3Rpb25zOwogICAgICAgICAgICAgICAgIGlmICgoZCA9PSAxNSkgJiYgc2V0ZmxhZ3MpCiAgICAgICAgICAgICAgICAgICAgIEVtdWxhdGVTVUJTUGNMckV0YyAob3Bjb2RlLCBlbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgICAKQEAgLTk1NTIsNyArOTU1MCw3IEBACiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgdWludDMyX3Qgc2hpZnRlZCA9IFNoaWZ0IChSbSwgc2hpZnRfdCwgc2hpZnRfbiwgQVBTUl9DKTsKICAgICAgICAgICAgICAgICAgIAotICAgICAgICAvLyAocmVzdWx0LCBjYXJyeSwgb3ZlcmZsb3cpID0gQWRkV2l0aENhcnJ5KFJbbl0sIE5PVChzaGlmdGVkKSwg4oCYMeKAmSk7CisgICAgICAgIC8vIChyZXN1bHQsIGNhcnJ5LCBvdmVyZmxvdykgPSBBZGRXaXRoQ2FycnkoUltuXSwgTk9UKHNoaWZ0ZWQpLCDUMdUpOwogICAgICAgICB1aW50MzJfdCBSbiA9IFJlYWRDb3JlUmVnIChuLCAmc3VjY2Vzcyk7CiAgICAgICAgIGlmICghc3VjY2VzcykKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTk2MTMsNyArOTYxMSw3IEBACiAgICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgZUVuY29kaW5nVDE6Ci0gICAgICAgICAgICAgICAgLy8gZCA9IFVJbnQoUmQpOyB0ID0gVUludChSdCk7IG4gPSBVSW50KFJuKTsgaW1tMzIgPSBaZXJvRXh0ZW5kKGltbTg64oCZMDDigJksIDMyKTsKKyAgICAgICAgICAgICAgICAvLyBkID0gVUludChSZCk7IHQgPSBVSW50KFJ0KTsgbiA9IFVJbnQoUm4pOyBpbW0zMiA9IFplcm9FeHRlbmQoaW1tODrVMDDVLCAzMik7CiAgICAgICAgICAgICAgICAgZCA9IEJpdHMzMiAob3Bjb2RlLCAxMSwgOCk7CiAgICAgICAgICAgICAgICAgdCA9IEJpdHMzMiAob3Bjb2RlLCAxNSwgMTIpOwogICAgICAgICAgICAgICAgIG4gPSBCaXRzMzIgKG9wY29kZSwgMTksIDE2KTsKQEAgLTk3MTksMTMgKzk3MTcsMTMgQEAKICAgICAgICAgc3dpdGNoIChlbmNvZGluZykKICAgICAgICAgewogICAgICAgICAgICAgY2FzZSBlRW5jb2RpbmdBMToKLSAgICAgICAgICAgICAgICAvLyBpZiBQID09IOKAmDDigJkgJiYgVyA9PSDigJgx4oCZIHRoZW4gU0VFIFNUUkJUOworICAgICAgICAgICAgICAgIC8vIGlmIFAgPT0g1DDVICYmIFcgPT0g1DHVIHRoZW4gU0VFIFNUUkJUOwogICAgICAgICAgICAgICAgIC8vIHQgPSBVSW50KFJ0KTsgbiA9IFVJbnQoUm4pOyBpbW0zMiA9IFplcm9FeHRlbmQoaW1tMTIsIDMyKTsKICAgICAgICAgICAgICAgICB0ID0gQml0czMyIChvcGNvZGUsIDE1LCAxMik7CiAgICAgICAgICAgICAgICAgbiA9IEJpdHMzMiAob3Bjb2RlLCAxOSwgMTYpOwogICAgICAgICAgICAgICAgIGltbTMyID0gQml0czMyIChvcGNvZGUsIDExLCAwKTsKICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGluZGV4ID0gKFAgPT0g4oCYMeKAmSk7IGFkZCA9IChVID09IOKAmDHigJkpOyB3YmFjayA9IChQID09IOKAmDDigJkpIHx8IChXID09IOKAmDHigJkpOworICAgICAgICAgICAgICAgIC8vIGluZGV4ID0gKFAgPT0g1DHVKTsgYWRkID0gKFUgPT0g1DHVKTsgd2JhY2sgPSAoUCA9PSDUMNUpIHx8IChXID09INQx1Sk7CiAgICAgICAgICAgICAgICAgaW5kZXggPSBCaXRJc1NldCAob3Bjb2RlLCAyNCk7CiAgICAgICAgICAgICAgICAgYWRkID0gQml0SXNTZXQgKG9wY29kZSwgMjMpOwogICAgICAgICAgICAgICAgIHdiYWNrID0gQml0SXNDbGVhciAob3Bjb2RlLCAyNCkgfHwgQml0SXNTZXQgKG9wY29kZSwgMjEpOwpAQCAtOTgxNywxNCArOTgxNSwxNCBAQAogICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKQogICAgICAgICB7CiAgICAgICAgICAgICBjYXNlIGVFbmNvZGluZ0ExOgotICAgICAgICAgICAgICAgIC8vIGlmIFAgPT0g4oCYMOKAmSAmJiBXID09IOKAmDHigJkgdGhlbiBTRUUgU1RSVDsKLSAgICAgICAgICAgICAgICAvLyBpZiBSbiA9PSDigJgxMTAx4oCZICYmIFAgPT0g4oCYMeKAmSAmJiBVID09IOKAmDDigJkgJiYgVyA9PSDigJgx4oCZICYmIGltbTEyID09IOKAmDAwMDAwMDAwMDEwMOKAmSB0aGVuIFNFRSBQVVNIOworICAgICAgICAgICAgICAgIC8vIGlmIFAgPT0g1DDVICYmIFcgPT0g1DHVIHRoZW4gU0VFIFNUUlQ7CisgICAgICAgICAgICAgICAgLy8gaWYgUm4gPT0g1DExMDHVICYmIFAgPT0g1DHVICYmIFUgPT0g1DDVICYmIFcgPT0g1DHVICYmIGltbTEyID09INQwMDAwMDAwMDAxMDDVIHRoZW4gU0VFIFBVU0g7CiAgICAgICAgICAgICAgICAgLy8gdCA9IFVJbnQoUnQpOyBuID0gVUludChSbik7IGltbTMyID0gWmVyb0V4dGVuZChpbW0xMiwgMzIpOwogICAgICAgICAgICAgICAgIHQgPSBCaXRzMzIgKG9wY29kZSwgMTUsIDEyKTsKICAgICAgICAgICAgICAgICBuID0gQml0czMyIChvcGNvZGUsIDE5LCAxNik7CiAgICAgICAgICAgICAgICAgaW1tMzIgPSBCaXRzMzIgKG9wY29kZSwgMTEsIDApOwogICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gaW5kZXggPSAoUCA9PSDigJgx4oCZKTsgYWRkID0gKFUgPT0g4oCYMeKAmSk7IHdiYWNrID0gKFAgPT0g4oCYMOKAmSkgfHwgKFcgPT0g4oCYMeKAmSk7CisgICAgICAgICAgICAgICAgLy8gaW5kZXggPSAoUCA9PSDUMdUpOyBhZGQgPSAoVSA9PSDUMdUpOyB3YmFjayA9IChQID09INQw1SkgfHwgKFcgPT0g1DHVKTsKICAgICAgICAgICAgICAgICBpbmRleCA9IEJpdElzU2V0IChvcGNvZGUsIDI0KTsKICAgICAgICAgICAgICAgICBhZGQgPSBCaXRJc1NldCAob3Bjb2RlLCAyMyk7CiAgICAgICAgICAgICAgICAgd2JhY2sgPSBCaXRJc0NsZWFyIChvcGNvZGUsIDI0KSB8fCBCaXRJc1NldCAob3Bjb2RlLCAyMSk7CkBAIC05OTI5LDE1ICs5OTI3LDE1IEBACiAgICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgZUVuY29kaW5nVDE6Ci0gICAgICAgICAgICAgICAgLy9pZiBQID09IOKAmDDigJkgJiYgVyA9PSDigJgw4oCZIHRoZW4gU0VFIOKAnFJlbGF0ZWQgZW5jb2Rpbmdz4oCdOwotICAgICAgICAgICAgICAgIC8vaWYgUm4gPT0g4oCYMTExMeKAmSB0aGVuIFNFRSBMRFJEIChsaXRlcmFsKTsKLSAgICAgICAgICAgICAgICAvL3QgPSBVSW50KFJ0KTsgdDIgPSBVSW50KFJ0Mik7IG4gPSBVSW50KFJuKTsgaW1tMzIgPSBaZXJvRXh0ZW5kKGltbTg64oCZMDDigJksIDMyKTsKKyAgICAgICAgICAgICAgICAvL2lmIFAgPT0g1DDVICYmIFcgPT0g1DDVIHRoZW4gU0VFINJSZWxhdGVkIGVuY29kaW5nc9M7CisgICAgICAgICAgICAgICAgLy9pZiBSbiA9PSDUMTExMdUgdGhlbiBTRUUgTERSRCAobGl0ZXJhbCk7CisgICAgICAgICAgICAgICAgLy90ID0gVUludChSdCk7IHQyID0gVUludChSdDIpOyBuID0gVUludChSbik7IGltbTMyID0gWmVyb0V4dGVuZChpbW04OtUwMNUsIDMyKTsKICAgICAgICAgICAgICAgICB0ID0gQml0czMyIChvcGNvZGUsIDE1LCAxMik7CiAgICAgICAgICAgICAgICAgdDIgPSBCaXRzMzIgKG9wY29kZSwgMTEsIDgpOwogICAgICAgICAgICAgICAgIG4gPSBCaXRzMzIgKG9wY29kZSwgMTksIDE2KTsKICAgICAgICAgICAgICAgICBpbW0zMiA9IEJpdHMzMiAob3Bjb2RlLCA3LCAwKSA8PCAyOwogICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy9pbmRleCA9IChQID09IOKAmDHigJkpOyBhZGQgPSAoVSA9PSDigJgx4oCZKTsgd2JhY2sgPSAoVyA9PSDigJgx4oCZKTsKKyAgICAgICAgICAgICAgICAvL2luZGV4ID0gKFAgPT0g1DHVKTsgYWRkID0gKFUgPT0g1DHVKTsgd2JhY2sgPSAoVyA9PSDUMdUpOwogICAgICAgICAgICAgICAgIGluZGV4ID0gQml0SXNTZXQgKG9wY29kZSwgMjQpOwogICAgICAgICAgICAgICAgIGFkZCA9IEJpdElzU2V0IChvcGNvZGUsIDIzKTsKICAgICAgICAgICAgICAgICB3YmFjayA9IEJpdElzU2V0IChvcGNvZGUsIDIxKTsKQEAgLTk5NTMsOCArOTk1MSw4IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGNhc2UgZUVuY29kaW5nQTE6Ci0gICAgICAgICAgICAgICAgLy9pZiBSbiA9PSDigJgxMTEx4oCZIHRoZW4gU0VFIExEUkQgKGxpdGVyYWwpOwotICAgICAgICAgICAgICAgIC8vaWYgUnQ8MD4gPT0g4oCYMeKAmSB0aGVuIFVOUFJFRElDVEFCTEU7CisgICAgICAgICAgICAgICAgLy9pZiBSbiA9PSDUMTExMdUgdGhlbiBTRUUgTERSRCAobGl0ZXJhbCk7CisgICAgICAgICAgICAgICAgLy9pZiBSdDwwPiA9PSDUMdUgdGhlbiBVTlBSRURJQ1RBQkxFOwogICAgICAgICAgICAgICAgIC8vdCA9IFVJbnQoUnQpOyB0MiA9IHQrMTsgbiA9IFVJbnQoUm4pOyBpbW0zMiA9IFplcm9FeHRlbmQoaW1tNEg6aW1tNEwsIDMyKTsKICAgICAgICAgICAgICAgICB0ID0gQml0czMyIChvcGNvZGUsIDE1LCAxMik7CiAgICAgICAgICAgICAgICAgaWYgKEJpdElzU2V0ICh0LCAwKSkKQEAgLTk5NjMsMTIgKzk5NjEsMTIgQEAKICAgICAgICAgICAgICAgICBuID0gQml0czMyIChvcGNvZGUsIDE5LCAxNik7CiAgICAgICAgICAgICAgICAgaW1tMzIgPSAoQml0czMyIChvcGNvZGUsIDExLCA4KSA8PCA0KSB8IEJpdHMzMiAob3Bjb2RlLCAzLCAwKTsKICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vaW5kZXggPSAoUCA9PSDigJgx4oCZKTsgYWRkID0gKFUgPT0g4oCYMeKAmSk7IHdiYWNrID0gKFAgPT0g4oCYMOKAmSkgfHwgKFcgPT0g4oCYMeKAmSk7CisgICAgICAgICAgICAgICAgLy9pbmRleCA9IChQID09INQx1Sk7IGFkZCA9IChVID09INQx1Sk7IHdiYWNrID0gKFAgPT0g1DDVKSB8fCAoVyA9PSDUMdUpOwogICAgICAgICAgICAgICAgIGluZGV4ID0gQml0SXNTZXQgKG9wY29kZSwgMjQpOwogICAgICAgICAgICAgICAgIGFkZCA9IEJpdElzU2V0IChvcGNvZGUsIDIzKTsKICAgICAgICAgICAgICAgICB3YmFjayA9IEJpdElzQ2xlYXIgKG9wY29kZSwgMjQpIHx8IEJpdElzU2V0IChvcGNvZGUsIDIxKTsKICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vaWYgUCA9PSDigJgw4oCZICYmIFcgPT0g4oCYMeKAmSB0aGVuIFVOUFJFRElDVEFCTEU7CisgICAgICAgICAgICAgICAgLy9pZiBQID09INQw1SAmJiBXID09INQx1SB0aGVuIFVOUFJFRElDVEFCTEU7CiAgICAgICAgICAgICAgICAgaWYgKEJpdElzQ2xlYXIgKG9wY29kZSwgMjQpICYmIEJpdElzU2V0IChvcGNvZGUsIDIxKSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgCkBAIC0xMDA3NCw3ICsxMDA3Miw3IEBACiAgICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgZUVuY29kaW5nQTE6Ci0gICAgICAgICAgICAgICAgLy8gaWYgUnQ8MD4gPT0g4oCYMeKAmSB0aGVuIFVOUFJFRElDVEFCTEU7CisgICAgICAgICAgICAgICAgLy8gaWYgUnQ8MD4gPT0g1DHVIHRoZW4gVU5QUkVESUNUQUJMRTsKICAgICAgICAgICAgICAgICAvLyB0ID0gVUludChSdCk7IHQyID0gdCsxOyBuID0gVUludChSbik7IG0gPSBVSW50KFJtKTsKICAgICAgICAgICAgICAgICB0ID0gQml0czMyIChvcGNvZGUsIDE1LCAxMik7CiAgICAgICAgICAgICAgICAgaWYgKEJpdElzU2V0ICh0LCAwKSkKQEAgLTEwMDgzLDEyICsxMDA4MSwxMiBAQAogICAgICAgICAgICAgICAgIG4gPSBCaXRzMzIgKG9wY29kZSwgMTksIDE2KTsKICAgICAgICAgICAgICAgICBtID0gQml0czMyIChvcGNvZGUsIDMsIDApOwogICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gaW5kZXggPSAoUCA9PSDigJgx4oCZKTsgYWRkID0gKFUgPT0g4oCYMeKAmSk7IHdiYWNrID0gKFAgPT0g4oCYMOKAmSkgfHwgKFcgPT0g4oCYMeKAmSk7CisgICAgICAgICAgICAgICAgLy8gaW5kZXggPSAoUCA9PSDUMdUpOyBhZGQgPSAoVSA9PSDUMdUpOyB3YmFjayA9IChQID09INQw1SkgfHwgKFcgPT0g1DHVKTsKICAgICAgICAgICAgICAgICBpbmRleCA9IEJpdElzU2V0IChvcGNvZGUsIDI0KTsKICAgICAgICAgICAgICAgICBhZGQgPSBCaXRJc1NldCAob3Bjb2RlLCAyMyk7CiAgICAgICAgICAgICAgICAgd2JhY2sgPSBCaXRJc0NsZWFyIChvcGNvZGUsIDI0KSB8fCBCaXRJc1NldCAob3Bjb2RlLCAyMSk7CiAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBpZiBQID09IOKAmDDigJkgJiYgVyA9PSDigJgx4oCZIHRoZW4gVU5QUkVESUNUQUJMRTsKKyAgICAgICAgICAgICAgICAvLyBpZiBQID09INQw1SAmJiBXID09INQx1SB0aGVuIFVOUFJFRElDVEFCTEU7CiAgICAgICAgICAgICAgICAgICBpZiAoQml0SXNDbGVhciAob3Bjb2RlLCAyNCkgJiYgQml0SXNTZXQgKG9wY29kZSwgMjEpKQogICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgCkBAIC0xMDIwMSwxNCArMTAxOTksMTQgQEAKICAgICAgICAgc3dpdGNoIChlbmNvZGluZykKICAgICAgICAgewogICAgICAgICAgICAgY2FzZSBlRW5jb2RpbmdUMToKLSAgICAgICAgICAgICAgICAvLyBpZiBQID09IOKAmDDigJkgJiYgVyA9PSDigJgw4oCZIHRoZW4gU0VFIOKAnFJlbGF0ZWQgZW5jb2Rpbmdz4oCdOwotICAgICAgICAgICAgICAgIC8vIHQgPSBVSW50KFJ0KTsgdDIgPSBVSW50KFJ0Mik7IG4gPSBVSW50KFJuKTsgaW1tMzIgPSBaZXJvRXh0ZW5kKGltbTg64oCZMDDigJksIDMyKTsKKyAgICAgICAgICAgICAgICAvLyBpZiBQID09INQw1SAmJiBXID09INQw1SB0aGVuIFNFRSDSUmVsYXRlZCBlbmNvZGluZ3PTOworICAgICAgICAgICAgICAgIC8vIHQgPSBVSW50KFJ0KTsgdDIgPSBVSW50KFJ0Mik7IG4gPSBVSW50KFJuKTsgaW1tMzIgPSBaZXJvRXh0ZW5kKGltbTg61TAw1SwgMzIpOwogICAgICAgICAgICAgICAgIHQgPSBCaXRzMzIgKG9wY29kZSwgMTUsIDEyKTsKICAgICAgICAgICAgICAgICB0MiA9IEJpdHMzMiAob3Bjb2RlLCAxMSwgOCk7CiAgICAgICAgICAgICAgICAgbiA9IEJpdHMzMiAob3Bjb2RlLCAxOSwgMTYpOwogICAgICAgICAgICAgICAgIGltbTMyID0gQml0czMyIChvcGNvZGUsIDcsIDApIDw8IDI7CiAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBpbmRleCA9IChQID09IOKAmDHigJkpOyBhZGQgPSAoVSA9PSDigJgx4oCZKTsgd2JhY2sgPSAoVyA9PSDigJgx4oCZKTsKKyAgICAgICAgICAgICAgICAvLyBpbmRleCA9IChQID09INQx1Sk7IGFkZCA9IChVID09INQx1Sk7IHdiYWNrID0gKFcgPT0g1DHVKTsKICAgICAgICAgICAgICAgICBpbmRleCA9IEJpdElzU2V0IChvcGNvZGUsIDI0KTsKICAgICAgICAgICAgICAgICBhZGQgPSBCaXRJc1NldCAob3Bjb2RlLCAyMyk7CiAgICAgICAgICAgICAgICAgd2JhY2sgPSBCaXRJc1NldCAob3Bjb2RlLCAyMSk7CkBAIC0xMDIyNCw3ICsxMDIyMiw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGNhc2UgZUVuY29kaW5nQTE6Ci0gICAgICAgICAgICAgICAgLy8gaWYgUnQ8MD4gPT0g4oCYMeKAmSB0aGVuIFVOUFJFRElDVEFCTEU7CisgICAgICAgICAgICAgICAgLy8gaWYgUnQ8MD4gPT0g1DHVIHRoZW4gVU5QUkVESUNUQUJMRTsKICAgICAgICAgICAgICAgICAvLyB0ID0gVUludChSdCk7IHQyID0gdCsxOyBuID0gVUludChSbik7IGltbTMyID0gWmVyb0V4dGVuZChpbW00SDppbW00TCwgMzIpOwogICAgICAgICAgICAgICAgIHQgPSBCaXRzMzIgKG9wY29kZSwgMTUsIDEyKTsKICAgICAgICAgICAgICAgICBpZiAoQml0SXNTZXQgKHQsIDApKQpAQCAtMTAyMzQsMTIgKzEwMjMyLDEyIEBACiAgICAgICAgICAgICAgICAgbiA9IEJpdHMzMiAob3Bjb2RlLCAxOSwgMTYpOwogICAgICAgICAgICAgICAgIGltbTMyID0gKEJpdHMzMiAob3Bjb2RlLCAxMSwgOCkgPDwgNCkgfCBCaXRzMzIgKG9wY29kZSwgMywgMCk7CiAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBpbmRleCA9IChQID09IOKAmDHigJkpOyBhZGQgPSAoVSA9PSDigJgx4oCZKTsgd2JhY2sgPSAoUCA9PSDigJgw4oCZKSB8fCAoVyA9PSDigJgx4oCZKTsKKyAgICAgICAgICAgICAgICAvLyBpbmRleCA9IChQID09INQx1Sk7IGFkZCA9IChVID09INQx1Sk7IHdiYWNrID0gKFAgPT0g1DDVKSB8fCAoVyA9PSDUMdUpOwogICAgICAgICAgICAgICAgIGluZGV4ID0gQml0SXNTZXQgKG9wY29kZSwgMjQpOwogICAgICAgICAgICAgICAgIGFkZCA9IEJpdElzU2V0IChvcGNvZGUsIDIzKTsKICAgICAgICAgICAgICAgICB3YmFjayA9IEJpdElzQ2xlYXIgKG9wY29kZSwgMjQpIHx8IEJpdElzU2V0IChvcGNvZGUsIDIxKTsKICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGlmIFAgPT0g4oCYMOKAmSAmJiBXID09IOKAmDHigJkgdGhlbiBVTlBSRURJQ1RBQkxFOworICAgICAgICAgICAgICAgIC8vIGlmIFAgPT0g1DDVICYmIFcgPT0g1DHVIHRoZW4gVU5QUkVESUNUQUJMRTsKICAgICAgICAgICAgICAgICBpZiAoQml0SXNDbGVhciAob3Bjb2RlLCAyNCkgJiYgQml0SXNTZXQgKG9wY29kZSwgMjEpKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAKQEAgLTEwMzQ5LDcgKzEwMzQ3LDcgQEAKICAgICAgICAgc3dpdGNoIChlbmNvZGluZykKICAgICAgICAgewogICAgICAgICAgICAgY2FzZSBlRW5jb2RpbmdBMToKLSAgICAgICAgICAgICAgICAvLyBpZiBSdDwwPiA9PSDigJgx4oCZIHRoZW4gVU5QUkVESUNUQUJMRTsKKyAgICAgICAgICAgICAgICAvLyBpZiBSdDwwPiA9PSDUMdUgdGhlbiBVTlBSRURJQ1RBQkxFOwogICAgICAgICAgICAgICAgIC8vIHQgPSBVSW50KFJ0KTsgdDIgPSB0KzE7IG4gPSBVSW50KFJuKTsgbSA9IFVJbnQoUm0pOwogICAgICAgICAgICAgICAgIHQgPSBCaXRzMzIgKG9wY29kZSwgMTUsIDEyKTsKICAgICAgICAgICAgICAgICBpZiAoQml0SXNTZXQgKHQsIDApKQpAQCAtMTAzNTksMTIgKzEwMzU3LDEyIEBACiAgICAgICAgICAgICAgICAgbiA9IEJpdHMzMiAob3Bjb2RlLCAxOSwgMTYpOwogICAgICAgICAgICAgICAgIG0gPSBCaXRzMzIgKG9wY29kZSwgMywgMCk7CiAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBpbmRleCA9IChQID09IOKAmDHigJkpOyBhZGQgPSAoVSA9PSDigJgx4oCZKTsgd2JhY2sgPSAoUCA9PSDigJgw4oCZKSB8fCAoVyA9PSDigJgx4oCZKTsKKyAgICAgICAgICAgICAgICAvLyBpbmRleCA9IChQID09INQx1Sk7IGFkZCA9IChVID09INQx1Sk7IHdiYWNrID0gKFAgPT0g1DDVKSB8fCAoVyA9PSDUMdUpOwogICAgICAgICAgICAgICAgIGluZGV4ID0gQml0SXNTZXQgKG9wY29kZSwgMjQpOwogICAgICAgICAgICAgICAgIGFkZCA9IEJpdElzU2V0IChvcGNvZGUsIDIzKTsKICAgICAgICAgICAgICAgICB3YmFjayA9IEJpdElzQ2xlYXIgKG9wY29kZSwgMjQpIHx8IEJpdElzU2V0IChvcGNvZGUsIDIxKTsKICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGlmIFAgPT0g4oCYMOKAmSAmJiBXID09IOKAmDHigJkgdGhlbiBVTlBSRURJQ1RBQkxFOworICAgICAgICAgICAgICAgIC8vIGlmIFAgPT0g1DDVICYmIFcgPT0g1DHVIHRoZW4gVU5QUkVESUNUQUJMRTsKICAgICAgICAgICAgICAgICBpZiAoQml0SXNDbGVhciAob3Bjb2RlLCAyNCkgJiYgQml0SXNTZXQgKG9wY29kZSwgMjEpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgIApAQCAtMTA0OTAsMjUgKzEwNDg4LDI1IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgZUVuY29kaW5nVDE6CiAgICAgICAgICAgICBjYXNlIGVFbmNvZGluZ0ExOgotICAgICAgICAgICAgICAgIC8vIGlmIFAgPT0g4oCYMOKAmSAmJiBVID09IOKAmDDigJkgJiYgVyA9PSDigJgw4oCZIHRoZW4gU0VFIOKAnFJlbGF0ZWQgZW5jb2Rpbmdz4oCdOwotICAgICAgICAgICAgICAgIC8vIGlmIFAgPT0g4oCYMOKAmSAmJiBVID09IOKAmDHigJkgJiYgVyA9PSDigJgx4oCZICYmIFJuID09IOKAmDExMDHigJkgdGhlbiBTRUUgVlBPUDsKLSAgICAgICAgICAgICAgICAvLyBpZiBQID09IOKAmDHigJkgJiYgVyA9PSDigJgw4oCZIHRoZW4gU0VFIFZMRFI7Ci0gICAgICAgICAgICAgICAgLy8gaWYgUCA9PSBVICYmIFcgPT0g4oCYMeKAmSB0aGVuIFVOREVGSU5FRDsKKyAgICAgICAgICAgICAgICAvLyBpZiBQID09INQw1SAmJiBVID09INQw1SAmJiBXID09INQw1SB0aGVuIFNFRSDSUmVsYXRlZCBlbmNvZGluZ3PTOworICAgICAgICAgICAgICAgIC8vIGlmIFAgPT0g1DDVICYmIFUgPT0g1DHVICYmIFcgPT0g1DHVICYmIFJuID09INQxMTAx1SB0aGVuIFNFRSBWUE9QOworICAgICAgICAgICAgICAgIC8vIGlmIFAgPT0g1DHVICYmIFcgPT0g1DDVIHRoZW4gU0VFIFZMRFI7CisgICAgICAgICAgICAgICAgLy8gaWYgUCA9PSBVICYmIFcgPT0g1DHVIHRoZW4gVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgIGlmICgoQml0MzIgKG9wY29kZSwgMjQpID09IEJpdDMyIChvcGNvZGUsIDIzKSkgJiYgQml0SXNTZXQgKG9wY29kZSwgMjEpKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgLy8gLy8gUmVtYWluaW5nIGNvbWJpbmF0aW9ucyBhcmUgUFVXID0gMDEwIChJQSB3aXRob3V0ICEpLCAwMTEgKElBIHdpdGggISksIDEwMSAoREIgd2l0aCAhKQotICAgICAgICAgICAgICAgIC8vIHNpbmdsZV9yZWdzID0gRkFMU0U7IGFkZCA9IChVID09IOKAmDHigJkpOyB3YmFjayA9IChXID09IOKAmDHigJkpOworICAgICAgICAgICAgICAgIC8vIHNpbmdsZV9yZWdzID0gRkFMU0U7IGFkZCA9IChVID09INQx1Sk7IHdiYWNrID0gKFcgPT0g1DHVKTsKICAgICAgICAgICAgICAgICBzaW5nbGVfcmVncyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGFkZCA9IEJpdElzU2V0IChvcGNvZGUsIDIzKTsKICAgICAgICAgICAgICAgICB3YmFjayA9IEJpdElzU2V0IChvcGNvZGUsIDIxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBkID0gVUludChEOlZkKTsgbiA9IFVJbnQoUm4pOyBpbW0zMiA9IFplcm9FeHRlbmQoaW1tODrigJkwMOKAmSwgMzIpOworICAgICAgICAgICAgICAgIC8vIGQgPSBVSW50KEQ6VmQpOyBuID0gVUludChSbik7IGltbTMyID0gWmVyb0V4dGVuZChpbW04OtUwMNUsIDMyKTsKICAgICAgICAgICAgICAgICBkID0gKEJpdDMyIChvcGNvZGUsIDIyKSA8PCA0KSB8IEJpdHMzMiAob3Bjb2RlLCAxNSwgMTIpOwogICAgICAgICAgICAgICAgIG4gPSBCaXRzMzIgKG9wY29kZSwgMTksIDE2KTsKICAgICAgICAgICAgICAgICBpbW0zMiA9IEJpdHMzMiAob3Bjb2RlLCA3LCAwKSA8PCAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHJlZ3MgPSBVSW50KGltbTgpIERJViAyOyAvLyBJZiBVSW50KGltbTgpIGlzIG9kZCwgc2VlIOKAnEZMRE1Y4oCdLgorICAgICAgICAgICAgICAgIC8vIHJlZ3MgPSBVSW50KGltbTgpIERJViAyOyAvLyBJZiBVSW50KGltbTgpIGlzIG9kZCwgc2VlINJGTERNWNMuCiAgICAgICAgICAgICAgICAgcmVncyA9IEJpdHMzMiAob3Bjb2RlLCA3LCAwKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgLy8gaWYgbiA9PSAxNSAmJiAod2JhY2sgfHwgQ3VycmVudEluc3RyU2V0KCkgIT0gSW5zdHJTZXRfQVJNKSB0aGVuIFVOUFJFRElDVEFCTEU7CkBAIC0xMDUyMywyMiArMTA1MjEsMjIgQEAKICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgY2FzZSBlRW5jb2RpbmdUMjoKICAgICAgICAgICAgIGNhc2UgZUVuY29kaW5nQTI6Ci0gICAgICAgICAgICAgICAgLy8gaWYgUCA9PSDigJgw4oCZICYmIFUgPT0g4oCYMOKAmSAmJiBXID09IOKAmDDigJkgdGhlbiBTRUUg4oCcUmVsYXRlZCBlbmNvZGluZ3PigJ07Ci0gICAgICAgICAgICAgICAgLy8gaWYgUCA9PSDigJgw4oCZICYmIFUgPT0g4oCYMeKAmSAmJiBXID09IOKAmDHigJkgJiYgUm4gPT0g4oCYMTEwMeKAmSB0aGVuIFNFRSBWUE9QOwotICAgICAgICAgICAgICAgIC8vIGlmIFAgPT0g4oCYMeKAmSAmJiBXID09IOKAmDDigJkgdGhlbiBTRUUgVkxEUjsKLSAgICAgICAgICAgICAgICAvLyBpZiBQID09IFUgJiYgVyA9PSDigJgx4oCZIHRoZW4gVU5ERUZJTkVEOworICAgICAgICAgICAgICAgIC8vIGlmIFAgPT0g1DDVICYmIFUgPT0g1DDVICYmIFcgPT0g1DDVIHRoZW4gU0VFINJSZWxhdGVkIGVuY29kaW5nc9M7CisgICAgICAgICAgICAgICAgLy8gaWYgUCA9PSDUMNUgJiYgVSA9PSDUMdUgJiYgVyA9PSDUMdUgJiYgUm4gPT0g1DExMDHVIHRoZW4gU0VFIFZQT1A7CisgICAgICAgICAgICAgICAgLy8gaWYgUCA9PSDUMdUgJiYgVyA9PSDUMNUgdGhlbiBTRUUgVkxEUjsKKyAgICAgICAgICAgICAgICAvLyBpZiBQID09IFUgJiYgVyA9PSDUMdUgdGhlbiBVTkRFRklORUQ7CiAgICAgICAgICAgICAgICAgaWYgKChCaXQzMiAob3Bjb2RlLCAyNCkgPT0gQml0MzIgKG9wY29kZSwgMjMpKSAmJiBCaXRJc1NldCAob3Bjb2RlLCAyMSkpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAvLyAvLyBSZW1haW5pbmcgY29tYmluYXRpb25zIGFyZSBQVVcgPSAwMTAgKElBIHdpdGhvdXQgISksIDAxMSAoSUEgd2l0aCAhKSwgMTAxIChEQiB3aXRoICEpCi0gICAgICAgICAgICAgICAgLy8gc2luZ2xlX3JlZ3MgPSBUUlVFOyBhZGQgPSAoVSA9PSDigJgx4oCZKTsgd2JhY2sgPSAoVyA9PSDigJgx4oCZKTsgZCA9IFVJbnQoVmQ6RCk7IG4gPSBVSW50KFJuKTsKKyAgICAgICAgICAgICAgICAvLyBzaW5nbGVfcmVncyA9IFRSVUU7IGFkZCA9IChVID09INQx1Sk7IHdiYWNrID0gKFcgPT0g1DHVKTsgZCA9IFVJbnQoVmQ6RCk7IG4gPSBVSW50KFJuKTsKICAgICAgICAgICAgICAgICBzaW5nbGVfcmVncyA9IHRydWU7CiAgICAgICAgICAgICAgICAgYWRkID0gQml0SXNTZXQgKG9wY29kZSwgMjMpOwogICAgICAgICAgICAgICAgIHdiYWNrID0gQml0SXNTZXQgKG9wY29kZSwgMjEpOwogICAgICAgICAgICAgICAgIGQgPSAoQml0czMyIChvcGNvZGUsIDE1LCAxMikgPDwgMSkgfCBCaXQzMiAob3Bjb2RlLCAyMik7CiAgICAgICAgICAgICAgICAgbiA9IEJpdHMzMiAob3Bjb2RlLCAxOSwgMTYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGltbTMyID0gWmVyb0V4dGVuZChpbW04OuKAmTAw4oCZLCAzMik7IHJlZ3MgPSBVSW50KGltbTgpOworICAgICAgICAgICAgICAgIC8vIGltbTMyID0gWmVyb0V4dGVuZChpbW04OtUwMNUsIDMyKTsgcmVncyA9IFVJbnQoaW1tOCk7CiAgICAgICAgICAgICAgICAgaW1tMzIgPSBCaXRzMzIgKG9wY29kZSwgNywgMCkgPDwgMjsKICAgICAgICAgICAgICAgICByZWdzID0gQml0czMyIChvcGNvZGUsIDcsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApAQCAtMTA2ODIsMjUgKzEwNjgwLDI1IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgZUVuY29kaW5nVDE6CiAgICAgICAgICAgICBjYXNlIGVFbmNvZGluZ0ExOgotICAgICAgICAgICAgICAgIC8vIGlmIFAgPT0g4oCYMOKAmSAmJiBVID09IOKAmDDigJkgJiYgVyA9PSDigJgw4oCZIHRoZW4gU0VFIOKAnFJlbGF0ZWQgZW5jb2Rpbmdz4oCdOwotICAgICAgICAgICAgICAgIC8vIGlmIFAgPT0g4oCYMeKAmSAmJiBVID09IOKAmDDigJkgJiYgVyA9PSDigJgx4oCZICYmIFJuID09IOKAmDExMDHigJkgdGhlbiBTRUUgVlBVU0g7Ci0gICAgICAgICAgICAgICAgLy8gaWYgUCA9PSDigJgx4oCZICYmIFcgPT0g4oCYMOKAmSB0aGVuIFNFRSBWU1RSOwotICAgICAgICAgICAgICAgIC8vIGlmIFAgPT0gVSAmJiBXID09IOKAmDHigJkgdGhlbiBVTkRFRklORUQ7CisgICAgICAgICAgICAgICAgLy8gaWYgUCA9PSDUMNUgJiYgVSA9PSDUMNUgJiYgVyA9PSDUMNUgdGhlbiBTRUUg0lJlbGF0ZWQgZW5jb2Rpbmdz0zsKKyAgICAgICAgICAgICAgICAvLyBpZiBQID09INQx1SAmJiBVID09INQw1SAmJiBXID09INQx1SAmJiBSbiA9PSDUMTEwMdUgdGhlbiBTRUUgVlBVU0g7CisgICAgICAgICAgICAgICAgLy8gaWYgUCA9PSDUMdUgJiYgVyA9PSDUMNUgdGhlbiBTRUUgVlNUUjsKKyAgICAgICAgICAgICAgICAvLyBpZiBQID09IFUgJiYgVyA9PSDUMdUgdGhlbiBVTkRFRklORUQ7CiAgICAgICAgICAgICAgICAgaWYgKChCaXQzMiAob3Bjb2RlLCAyNCkgPT0gQml0MzIgKG9wY29kZSwgMjMpKSAmJiBCaXRJc1NldCAob3Bjb2RlLCAyMSkpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgLy8gLy8gUmVtYWluaW5nIGNvbWJpbmF0aW9ucyBhcmUgUFVXID0gMDEwIChJQSB3aXRob3V0ICEpLCAwMTEgKElBIHdpdGggISksIDEwMSAoREIgd2l0aCAhKQotICAgICAgICAgICAgICAgIC8vIHNpbmdsZV9yZWdzID0gRkFMU0U7IGFkZCA9IChVID09IOKAmDHigJkpOyB3YmFjayA9IChXID09IOKAmDHigJkpOworICAgICAgICAgICAgICAgIC8vIHNpbmdsZV9yZWdzID0gRkFMU0U7IGFkZCA9IChVID09INQx1Sk7IHdiYWNrID0gKFcgPT0g1DHVKTsKICAgICAgICAgICAgICAgICBzaW5nbGVfcmVncyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGFkZCA9IEJpdElzU2V0IChvcGNvZGUsIDIzKTsKICAgICAgICAgICAgICAgICB3YmFjayA9IEJpdElzU2V0IChvcGNvZGUsIDIxKTsKICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBkID0gVUludChEOlZkKTsgbiA9IFVJbnQoUm4pOyBpbW0zMiA9IFplcm9FeHRlbmQoaW1tODrigJkwMOKAmSwgMzIpOworICAgICAgICAgICAgICAgIC8vIGQgPSBVSW50KEQ6VmQpOyBuID0gVUludChSbik7IGltbTMyID0gWmVyb0V4dGVuZChpbW04OtUwMNUsIDMyKTsKICAgICAgICAgICAgICAgICBkID0gKEJpdDMyIChvcGNvZGUsIDIyKSA8PCA0KSB8IEJpdHMzMiAob3Bjb2RlLCAxNSwgMTIpOwogICAgICAgICAgICAgICAgIG4gPSBCaXRzMzIgKG9wY29kZSwgMTksIDE2KTsKICAgICAgICAgICAgICAgICBpbW0zMiA9IEJpdHMzMiAob3Bjb2RlLCA3LCAwKSA8PCAyOwogICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHJlZ3MgPSBVSW50KGltbTgpIERJViAyOyAvLyBJZiBVSW50KGltbTgpIGlzIG9kZCwgc2VlIOKAnEZTVE1Y4oCdLgorICAgICAgICAgICAgICAgIC8vIHJlZ3MgPSBVSW50KGltbTgpIERJViAyOyAvLyBJZiBVSW50KGltbTgpIGlzIG9kZCwgc2VlINJGU1RNWNMuCiAgICAgICAgICAgICAgICAgcmVncyA9IEJpdHMzMiAob3Bjb2RlLCA3LCAwKSAvIDI7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgLy8gaWYgbiA9PSAxNSAmJiAod2JhY2sgfHwgQ3VycmVudEluc3RyU2V0KCkgIT0gSW5zdHJTZXRfQVJNKSB0aGVuIFVOUFJFRElDVEFCTEU7CkBAIC0xMDcxNSwyMiArMTA3MTMsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGNhc2UgZUVuY29kaW5nVDI6CiAgICAgICAgICAgICBjYXNlIGVFbmNvZGluZ0EyOgotICAgICAgICAgICAgICAgIC8vIGlmIFAgPT0g4oCYMOKAmSAmJiBVID09IOKAmDDigJkgJiYgVyA9PSDigJgw4oCZIHRoZW4gU0VFIOKAnFJlbGF0ZWQgZW5jb2Rpbmdz4oCdOwotICAgICAgICAgICAgICAgIC8vIGlmIFAgPT0g4oCYMeKAmSAmJiBVID09IOKAmDDigJkgJiYgVyA9PSDigJgx4oCZICYmIFJuID09IOKAmDExMDHigJkgdGhlbiBTRUUgVlBVU0g7Ci0gICAgICAgICAgICAgICAgLy8gaWYgUCA9PSDigJgx4oCZICYmIFcgPT0g4oCYMOKAmSB0aGVuIFNFRSBWU1RSOwotICAgICAgICAgICAgICAgIC8vIGlmIFAgPT0gVSAmJiBXID09IOKAmDHigJkgdGhlbiBVTkRFRklORUQ7CisgICAgICAgICAgICAgICAgLy8gaWYgUCA9PSDUMNUgJiYgVSA9PSDUMNUgJiYgVyA9PSDUMNUgdGhlbiBTRUUg0lJlbGF0ZWQgZW5jb2Rpbmdz0zsKKyAgICAgICAgICAgICAgICAvLyBpZiBQID09INQx1SAmJiBVID09INQw1SAmJiBXID09INQx1SAmJiBSbiA9PSDUMTEwMdUgdGhlbiBTRUUgVlBVU0g7CisgICAgICAgICAgICAgICAgLy8gaWYgUCA9PSDUMdUgJiYgVyA9PSDUMNUgdGhlbiBTRUUgVlNUUjsKKyAgICAgICAgICAgICAgICAvLyBpZiBQID09IFUgJiYgVyA9PSDUMdUgdGhlbiBVTkRFRklORUQ7CiAgICAgICAgICAgICAgICAgaWYgKChCaXQzMiAob3Bjb2RlLCAyNCkgPT0gQml0MzIgKG9wY29kZSwgMjMpKSAmJiBCaXRJc1NldCAob3Bjb2RlLCAyMSkpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgLy8gLy8gUmVtYWluaW5nIGNvbWJpbmF0aW9ucyBhcmUgUFVXID0gMDEwIChJQSB3aXRob3V0ICEpLCAwMTEgKElBIHdpdGggISksIDEwMSAoREIgd2l0aCAhKQotICAgICAgICAgICAgICAgIC8vIHNpbmdsZV9yZWdzID0gVFJVRTsgYWRkID0gKFUgPT0g4oCYMeKAmSk7IHdiYWNrID0gKFcgPT0g4oCYMeKAmSk7IGQgPSBVSW50KFZkOkQpOyBuID0gVUludChSbik7CisgICAgICAgICAgICAgICAgLy8gc2luZ2xlX3JlZ3MgPSBUUlVFOyBhZGQgPSAoVSA9PSDUMdUpOyB3YmFjayA9IChXID09INQx1Sk7IGQgPSBVSW50KFZkOkQpOyBuID0gVUludChSbik7CiAgICAgICAgICAgICAgICAgc2luZ2xlX3JlZ3MgPSB0cnVlOwogICAgICAgICAgICAgICAgIGFkZCA9IEJpdElzU2V0IChvcGNvZGUsIDIzKTsKICAgICAgICAgICAgICAgICB3YmFjayA9IEJpdElzU2V0IChvcGNvZGUsIDIxKTsKICAgICAgICAgICAgICAgICBkID0gKEJpdHMzMiAob3Bjb2RlLCAxNSwgMTIpIDw8IDEpIHwgQml0MzIgKG9wY29kZSwgMjIpOwogICAgICAgICAgICAgICAgIG4gPSBCaXRzMzIgKG9wY29kZSwgMTksIDE2KTsKICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBpbW0zMiA9IFplcm9FeHRlbmQoaW1tODrigJkwMOKAmSwgMzIpOyByZWdzID0gVUludChpbW04KTsKKyAgICAgICAgICAgICAgICAvLyBpbW0zMiA9IFplcm9FeHRlbmQoaW1tODrVMDDVLCAzMik7IHJlZ3MgPSBVSW50KGltbTgpOwogICAgICAgICAgICAgICAgIGltbTMyID0gQml0czMyIChvcGNvZGUsIDcsIDApIDw8IDI7CiAgICAgICAgICAgICAgICAgcmVncyA9IEJpdHMzMiAob3Bjb2RlLCA3LCAwKTsKICAgICAgICAgICAgICAgICAKQEAgLTEwODc1LDcgKzEwODczLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgY2FzZSBlRW5jb2RpbmdUMToKICAgICAgICAgICAgIGNhc2UgZUVuY29kaW5nQTE6Ci0gICAgICAgICAgICAgICAgLy8gc2luZ2xlX3JlZyA9IEZBTFNFOyBhZGQgPSAoVSA9PSDigJgx4oCZKTsgaW1tMzIgPSBaZXJvRXh0ZW5kKGltbTg64oCZMDDigJksIDMyKTsKKyAgICAgICAgICAgICAgICAvLyBzaW5nbGVfcmVnID0gRkFMU0U7IGFkZCA9IChVID09INQx1Sk7IGltbTMyID0gWmVyb0V4dGVuZChpbW04OtUwMNUsIDMyKTsKICAgICAgICAgICAgICAgICBzaW5nbGVfcmVnID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgYWRkID0gQml0SXNTZXQgKG9wY29kZSwgMjMpOwogICAgICAgICAgICAgICAgIGltbTMyID0gQml0czMyIChvcGNvZGUsIDcsIDApIDw8IDI7CkBAIC0xMDg4OCw3ICsxMDg4Niw3IEBACiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBjYXNlIGVFbmNvZGluZ1QyOgogICAgICAgICAgICAgY2FzZSBlRW5jb2RpbmdBMjoKLSAgICAgICAgICAgICAgICAvLyBzaW5nbGVfcmVnID0gVFJVRTsgYWRkID0gKFUgPT0g4oCYMeKAmSk7IGltbTMyID0gWmVyb0V4dGVuZChpbW04OuKAmTAw4oCZLCAzMik7CisgICAgICAgICAgICAgICAgLy8gc2luZ2xlX3JlZyA9IFRSVUU7IGFkZCA9IChVID09INQx1Sk7IGltbTMyID0gWmVyb0V4dGVuZChpbW04OtUwMNUsIDMyKTsKICAgICAgICAgICAgICAgICBzaW5nbGVfcmVnID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBhZGQgPSBCaXRJc1NldCAob3Bjb2RlLCAyMyk7CiAgICAgICAgICAgICAgICAgaW1tMzIgPSBCaXRzMzIgKG9wY29kZSwgNywgMCkgPDwgMjsKQEAgLTExMDA0LDcgKzExMDAyLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgY2FzZSBlRW5jb2RpbmdUMToKICAgICAgICAgICAgIGNhc2UgZUVuY29kaW5nQTE6Ci0gICAgICAgICAgICAgICAgLy8gc2luZ2xlX3JlZyA9IEZBTFNFOyBhZGQgPSAoVSA9PSDigJgx4oCZKTsgaW1tMzIgPSBaZXJvRXh0ZW5kKGltbTg64oCZMDDigJksIDMyKTsKKyAgICAgICAgICAgICAgICAvLyBzaW5nbGVfcmVnID0gRkFMU0U7IGFkZCA9IChVID09INQx1Sk7IGltbTMyID0gWmVyb0V4dGVuZChpbW04OtUwMNUsIDMyKTsKICAgICAgICAgICAgICAgICBzaW5nbGVfcmVnID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgYWRkID0gQml0SXNTZXQgKG9wY29kZSwgMjMpOwogICAgICAgICAgICAgICAgIGltbTMyID0gQml0czMyIChvcGNvZGUsIDcsIDApIDw8IDI7CkBAIC0xMTAyMSw3ICsxMTAxOSw3IEBACiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBjYXNlIGVFbmNvZGluZ1QyOgogICAgICAgICAgICAgY2FzZSBlRW5jb2RpbmdBMjoKLSAgICAgICAgICAgICAgICAvLyBzaW5nbGVfcmVnID0gVFJVRTsgYWRkID0gKFUgPT0g4oCYMeKAmSk7IGltbTMyID0gWmVyb0V4dGVuZChpbW04OuKAmTAw4oCZLCAzMik7CisgICAgICAgICAgICAgICAgLy8gc2luZ2xlX3JlZyA9IFRSVUU7IGFkZCA9IChVID09INQx1Sk7IGltbTMyID0gWmVyb0V4dGVuZChpbW04OtUwMNUsIDMyKTsKICAgICAgICAgICAgICAgICBzaW5nbGVfcmVnID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBhZGQgPSBCaXRJc1NldCAob3Bjb2RlLCAyMyk7CiAgICAgICAgICAgICAgICAgaW1tMzIgPSBCaXRzMzIgKG9wY29kZSwgNywgMCkgPDwgMjsKQEAgLTExMTQzLDE2ICsxMTE0MSwxNiBAQAogICAgICAgICAgICAgY2FzZSBlRW5jb2RpbmdBMToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBjYXNlIHR5cGUgb2YKLSAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiDigJgwMTEx4oCZCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdzID0gMTsgaWYgYWxpZ248MT4gPT0g4oCYMeKAmSB0aGVuIFVOREVGSU5FRDsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiDigJgxMDEw4oCZCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdzID0gMjsgaWYgYWxpZ24gPT0g4oCYMTHigJkgdGhlbiBVTkRFRklORUQ7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdoZW4g4oCYMDExMOKAmQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVncyA9IDM7IGlmIGFsaWduPDE+ID09IOKAmDHigJkgdGhlbiBVTkRFRklORUQ7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdoZW4g4oCYMDAxMOKAmQorICAgICAgICAgICAgICAgICAgICAvLyB3aGVuINQwMTEx1QorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVncyA9IDE7IGlmIGFsaWduPDE+ID09INQx1SB0aGVuIFVOREVGSU5FRDsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiDUMTAxMNUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ3MgPSAyOyBpZiBhbGlnbiA9PSDUMTHVIHRoZW4gVU5ERUZJTkVEOworICAgICAgICAgICAgICAgICAgICAvLyB3aGVuINQwMTEw1QorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVncyA9IDM7IGlmIGFsaWduPDE+ID09INQx1SB0aGVuIFVOREVGSU5FRDsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiDUMDAxMNUKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ3MgPSA0OwogICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNFRSDigJxSZWxhdGVkIGVuY29kaW5nc+KAnTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNFRSDSUmVsYXRlZCBlbmNvZGluZ3PTOwogICAgICAgICAgICAgICAgIHVpbnQzMl90IHR5cGUgPSBCaXRzMzIgKG9wY29kZSwgMTEsIDgpOwogICAgICAgICAgICAgICAgIHVpbnQzMl90IGFsaWduID0gQml0czMyIChvcGNvZGUsIDUsIDQpOwogICAgICAgICAgICAgICAgIGlmICh0eXBlID09IDcpIC8vICcwMTExJwpAQCAtMTExODEsNyArMTExNzksNyBAQAogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGFsaWdubWVudCA9IGlmIGFsaWduID09IOKAmDAw4oCZIHRoZW4gMSBlbHNlIDQgPDwgVUludChhbGlnbik7CisgICAgICAgICAgICAgICAgLy8gYWxpZ25tZW50ID0gaWYgYWxpZ24gPT0g1DAw1SB0aGVuIDEgZWxzZSA0IDw8IFVJbnQoYWxpZ24pOwogICAgICAgICAgICAgICAgIGlmIChhbGlnbiA9PSAwKQogICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQgPSAxOwogICAgICAgICAgICAgICAgIGVsc2UKQEAgLTExMzA2LDEzICsxMTMwNCwxMyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUgPSBCaXRzMzIgKG9wY29kZSwgMTEsIDEwKTsKICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbmRleF9hbGlnbiA9IEJpdHMzMiAob3Bjb2RlLCA3LCA0KTsKLSAgICAgICAgICAgICAgICAvLyBpZiBzaXplID09IOKAmDEx4oCZIHRoZW4gU0VFIFZMRDEgKHNpbmdsZSBlbGVtZW50IHRvIGFsbCBsYW5lcyk7CisgICAgICAgICAgICAgICAgLy8gaWYgc2l6ZSA9PSDUMTHVIHRoZW4gU0VFIFZMRDEgKHNpbmdsZSBlbGVtZW50IHRvIGFsbCBsYW5lcyk7CiAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRW11bGF0ZVZMRDFTaW5nbGVBbGwgKG9wY29kZSwgZW5jb2RpbmcpOwogICAgICAgICAgICAgICAgIC8vIGNhc2Ugc2l6ZSBvZgogICAgICAgICAgICAgICAgIGlmIChzaXplID09IDApIC8vIHdoZW4gJzAwJwogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgaW5kZXhfYWxpZ248MD4gIT0g4oCYMOKAmSB0aGVuIFVOREVGSU5FRDsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgaW5kZXhfYWxpZ248MD4gIT0g1DDVIHRoZW4gVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgICAgICBpZiAoQml0SXNDbGVhciAoaW5kZXhfYWxpZ24sIDApKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgCkBAIC0xMTMyMiw5ICsxMTMyMCw5IEBACiAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gQml0czMyIChpbmRleF9hbGlnbiwgMywgMSk7CiAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudCA9IDE7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gMSkgLy8gd2hlbiDigJgwMeKAmQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gMSkgLy8gd2hlbiDUMDHVCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBpZiBpbmRleF9hbGlnbjwxPiAhPSDigJgw4oCZIHRoZW4gVU5ERUZJTkVEOworICAgICAgICAgICAgICAgICAgICAvLyBpZiBpbmRleF9hbGlnbjwxPiAhPSDUMNUgdGhlbiBVTkRFRklORUQ7CiAgICAgICAgICAgICAgICAgICAgIGlmIChCaXRJc0NsZWFyIChpbmRleF9hbGlnbiwgMSkpCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAKQEAgLTExMzMzLDE5ICsxMTMzMSwxOSBAQAogICAgICAgICAgICAgICAgICAgICBlc2l6ZSA9IDE2OwogICAgICAgICAgICAgICAgICAgICBpbmRleCA9IEJpdHMzMiAoaW5kZXhfYWxpZ24sIDMsIDIpOwogICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gYWxpZ25tZW50ID0gaWYgaW5kZXhfYWxpZ248MD4gPT0g4oCYMOKAmSB0aGVuIDEgZWxzZSAyOworICAgICAgICAgICAgICAgICAgICAvLyBhbGlnbm1lbnQgPSBpZiBpbmRleF9hbGlnbjwwPiA9PSDUMNUgdGhlbiAxIGVsc2UgMjsKICAgICAgICAgICAgICAgICAgICAgaWYgKEJpdElzQ2xlYXIgKGluZGV4X2FsaWduLCAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudCA9IDE7CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudCA9IDI7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gMikgLy8gd2hlbiDigJgxMOKAmQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gMikgLy8gd2hlbiDUMTDVCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBpZiBpbmRleF9hbGlnbjwyPiAhPSDigJgw4oCZIHRoZW4gVU5ERUZJTkVEOworICAgICAgICAgICAgICAgICAgICAvLyBpZiBpbmRleF9hbGlnbjwyPiAhPSDUMNUgdGhlbiBVTkRFRklORUQ7CiAgICAgICAgICAgICAgICAgICAgIGlmIChCaXRJc0NsZWFyIChpbmRleF9hbGlnbiwgMikpCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgaW5kZXhfYWxpZ248MTowPiAhPSDigJgwMOKAmSAmJiBpbmRleF9hbGlnbjwxOjA+ICE9IOKAmDEx4oCZIHRoZW4gVU5ERUZJTkVEOworICAgICAgICAgICAgICAgICAgICAvLyBpZiBpbmRleF9hbGlnbjwxOjA+ICE9INQwMNUgJiYgaW5kZXhfYWxpZ248MTowPiAhPSDUMTHVIHRoZW4gVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgICAgICBpZiAoKEJpdHMzMiAoaW5kZXhfYWxpZ24sIDEsIDApICE9IDApICYmIChCaXRzMzIgKGluZGV4X2FsaWduLCAxLCAwKSAhPSAzKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIApAQCAtMTEzNTQsNyArMTEzNTIsNyBAQAogICAgICAgICAgICAgICAgICAgICBlc2l6ZSA9IDMyOwogICAgICAgICAgICAgICAgICAgICBpbmRleCA9IEJpdDMyIChpbmRleF9hbGlnbiwgMyk7CiAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBhbGlnbm1lbnQgPSBpZiBpbmRleF9hbGlnbjwxOjA+ID09IOKAmDAw4oCZIHRoZW4gMSBlbHNlIDQ7CisgICAgICAgICAgICAgICAgICAgIC8vIGFsaWdubWVudCA9IGlmIGluZGV4X2FsaWduPDE6MD4gPT0g1DAw1SB0aGVuIDEgZWxzZSA0OwogICAgICAgICAgICAgICAgICAgICBpZiAoQml0czMyIChpbmRleF9hbGlnbiwgMSwgMCkgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudCA9IDE7CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKQEAgLTExNDg0LDM1ICsxMTQ4MiwzNSBAQAogICAgICAgICAgICAgICAgIHVpbnQzMl90IGFsaWduID0gQml0czMyIChvcGNvZGUsIDUsIDQpOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIC8vIGNhc2UgdHlwZSBvZgotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IDcpICAgIC8vIHdoZW4g4oCYMDExMeKAmQorICAgICAgICAgICAgICAgIGlmICh0eXBlID09IDcpICAgIC8vIHdoZW4g1DAxMTHVCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyByZWdzID0gMTsgaWYgYWxpZ248MT4gPT0g4oCYMeKAmSB0aGVuIFVOREVGSU5FRDsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVncyA9IDE7IGlmIGFsaWduPDE+ID09INQx1SB0aGVuIFVOREVGSU5FRDsKICAgICAgICAgICAgICAgICAgICAgcmVncyA9IDE7CiAgICAgICAgICAgICAgICAgICAgIGlmIChCaXRJc1NldCAoYWxpZ24sIDEpKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IDEwKSAvLyB3aGVuIOKAmDEwMTDigJkKKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IDEwKSAvLyB3aGVuINQxMDEw1QogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVncyA9IDI7IGlmIGFsaWduID09IOKAmDEx4oCZIHRoZW4gVU5ERUZJTkVEOworICAgICAgICAgICAgICAgICAgICAvLyByZWdzID0gMjsgaWYgYWxpZ24gPT0g1DEx1SB0aGVuIFVOREVGSU5FRDsKICAgICAgICAgICAgICAgICAgICAgcmVncyA9IDI7CiAgICAgICAgICAgICAgICAgICAgIGlmIChhbGlnbiA9PSAzKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IDYpIC8vIHdoZW4g4oCYMDExMOKAmQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gNikgLy8gd2hlbiDUMDExMNUKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlZ3MgPSAzOyBpZiBhbGlnbjwxPiA9PSDigJgx4oCZIHRoZW4gVU5ERUZJTkVEOworICAgICAgICAgICAgICAgICAgICAvLyByZWdzID0gMzsgaWYgYWxpZ248MT4gPT0g1DHVIHRoZW4gVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgICAgICByZWdzID0gMzsKICAgICAgICAgICAgICAgICAgICAgaWYgKEJpdElzU2V0IChhbGlnbiwgMSkpCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMikgLy8gd2hlbiDigJgwMDEw4oCZCisgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAyKSAvLyB3aGVuINQwMDEw1QogICAgICAgICAgICAgICAgICAgICAvLyByZWdzID0gNDsKICAgICAgICAgICAgICAgICAgICAgcmVncyA9IDQ7CiAgICAgICAgICAgICAgICAgZWxzZSAvLyBvdGhlcndpc2UKLSAgICAgICAgICAgICAgICAgICAgLy8gU0VFIOKAnFJlbGF0ZWQgZW5jb2Rpbmdz4oCdOworICAgICAgICAgICAgICAgICAgICAvLyBTRUUg0lJlbGF0ZWQgZW5jb2Rpbmdz0zsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBhbGlnbm1lbnQgPSBpZiBhbGlnbiA9PSDigJgwMOKAmSB0aGVuIDEgZWxzZSA0IDw8IFVJbnQoYWxpZ24pOworICAgICAgICAgICAgICAgIC8vIGFsaWdubWVudCA9IGlmIGFsaWduID09INQwMNUgdGhlbiAxIGVsc2UgNCA8PCBVSW50KGFsaWduKTsKICAgICAgICAgICAgICAgICBpZiAoYWxpZ24gPT0gMCkKICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gMDsKICAgICAgICAgICAgICAgICBlbHNlCkBAIC0xMTY0MiwxNCArMTE2NDAsMTQgQEAKICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplID0gQml0czMyIChvcGNvZGUsIDExLCAxMCk7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5kZXhfYWxpZ24gPSBCaXRzMzIgKG9wY29kZSwgNywgNCk7CiAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gaWYgc2l6ZSA9PSDigJgxMeKAmSB0aGVuIFVOREVGSU5FRDsKKyAgICAgICAgICAgICAgICAvLyBpZiBzaXplID09INQxMdUgdGhlbiBVTkRFRklORUQ7CiAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMykKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAvLyBjYXNlIHNpemUgb2YKLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKSAvLyB3aGVuIOKAmDAw4oCZCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkgLy8gd2hlbiDUMDDVCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBpZiBpbmRleF9hbGlnbjwwPiAhPSDigJgw4oCZIHRoZW4gVU5ERUZJTkVEOworICAgICAgICAgICAgICAgICAgICAvLyBpZiBpbmRleF9hbGlnbjwwPiAhPSDUMNUgdGhlbiBVTkRFRklORUQ7CiAgICAgICAgICAgICAgICAgICAgIGlmIChCaXRJc0NsZWFyIChpbmRleF9hbGlnbiwgMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIC8vIGVieXRlcyA9IDE7IGVzaXplID0gODsgaW5kZXggPSBVSW50KGluZGV4X2FsaWduPDM6MT4pOyBhbGlnbm1lbnQgPSAxOwpAQCAtMTE2NTgsOSArMTE2NTYsOSBAQAogICAgICAgICAgICAgICAgICAgICBpbmRleCA9IEJpdHMzMiAoaW5kZXhfYWxpZ24sIDMsIDEpOwogICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQgPSAxOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDEpIC8vIHdoZW4g4oCYMDHigJkKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDEpIC8vIHdoZW4g1DAx1QogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgaW5kZXhfYWxpZ248MT4gIT0g4oCYMOKAmSB0aGVuIFVOREVGSU5FRDsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgaW5kZXhfYWxpZ248MT4gIT0g1DDVIHRoZW4gVU5ERUZJTkVEOwogICAgICAgICAgICAgICAgICAgICBpZiAoQml0SXNDbGVhciAoaW5kZXhfYWxpZ24sIDEpKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIApAQCAtMTE2NjksMTkgKzExNjY3LDE5IEBACiAgICAgICAgICAgICAgICAgICAgIGVzaXplID0gMTY7CiAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gQml0czMyIChpbmRleF9hbGlnbiwgMywgMik7CiAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBhbGlnbm1lbnQgPSBpZiBpbmRleF9hbGlnbjwwPiA9PSDigJgw4oCZIHRoZW4gMSBlbHNlIDI7CisgICAgICAgICAgICAgICAgICAgIC8vIGFsaWdubWVudCA9IGlmIGluZGV4X2FsaWduPDA+ID09INQw1SB0aGVuIDEgZWxzZSAyOwogICAgICAgICAgICAgICAgICAgICBpZiAoQml0SXNDbGVhciAoaW5kZXhfYWxpZ24sIDApKQogICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gMTsKICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gMjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAyKSAvLyB3aGVuIOKAmDEw4oCZCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAyKSAvLyB3aGVuINQxMNUKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIGluZGV4X2FsaWduPDI+ICE9IOKAmDDigJkgdGhlbiBVTkRFRklORUQ7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIGluZGV4X2FsaWduPDI+ICE9INQw1SB0aGVuIFVOREVGSU5FRDsKICAgICAgICAgICAgICAgICAgICAgaWYgKEJpdElzQ2xlYXIgKGluZGV4X2FsaWduLCAyKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBpZiBpbmRleF9hbGlnbjwxOjA+ICE9IOKAmDAw4oCZICYmIGluZGV4X2FsaWduPDE6MD4gIT0g4oCYMTHigJkgdGhlbiBVTkRFRklORUQ7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIGluZGV4X2FsaWduPDE6MD4gIT0g1DAw1SAmJiBpbmRleF9hbGlnbjwxOjA+ICE9INQxMdUgdGhlbiBVTkRFRklORUQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICgoQml0czMyIChpbmRleF9hbGlnbiwgMSwgMCkgIT0gMCkgJiYgKEJpdHMzMiAoaW5kZXhfYWxpZ24sIDEsIDApICE9IDMpKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgCkBAIC0xMTY5MCw3ICsxMTY4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGVzaXplID0gMzI7CiAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gQml0MzIgKGluZGV4X2FsaWduLCAzKTsKICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIGFsaWdubWVudCA9IGlmIGluZGV4X2FsaWduPDE6MD4gPT0g4oCYMDDigJkgdGhlbiAxIGVsc2UgNDsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxpZ25tZW50ID0gaWYgaW5kZXhfYWxpZ248MTowPiA9PSDUMDDVIHRoZW4gMSBlbHNlIDQ7CiAgICAgICAgICAgICAgICAgICAgIGlmIChCaXRzMzIgKGluZGV4X2FsaWduLCAxLCAwKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gMTsKICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtMTE3OTksMTIgKzExNzk3LDEyIEBACiAgICAgICAgICAgICBjYXNlIGVFbmNvZGluZ1QxOgogICAgICAgICAgICAgY2FzZSBlRW5jb2RpbmdBMToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL2lmIHNpemUgPT0g4oCYMTHigJkgfHwgKHNpemUgPT0g4oCYMDDigJkgJiYgYSA9PSDigJgx4oCZKSB0aGVuIFVOREVGSU5FRDsKKyAgICAgICAgICAgICAgICAvL2lmIHNpemUgPT0g1DEx1SB8fCAoc2l6ZSA9PSDUMDDVICYmIGEgPT0g1DHVKSB0aGVuIFVOREVGSU5FRDsKICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplID0gQml0czMyIChvcGNvZGUsIDcsIDYpOwogICAgICAgICAgICAgICAgIGlmICgoc2l6ZSA9PSAzKSB8fCAoKHNpemUgPT0gMCkgJiYgQml0SXNTZXQgKG9wY29kZSwgNCkpKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vZWJ5dGVzID0gMSA8PCBVSW50KHNpemUpOyBlbGVtZW50cyA9IDggRElWIGVieXRlczsgcmVncyA9IGlmIFQgPT0g4oCYMOKAmSB0aGVuIDEgZWxzZSAyOworICAgICAgICAgICAgICAgIC8vZWJ5dGVzID0gMSA8PCBVSW50KHNpemUpOyBlbGVtZW50cyA9IDggRElWIGVieXRlczsgcmVncyA9IGlmIFQgPT0g1DDVIHRoZW4gMSBlbHNlIDI7CiAgICAgICAgICAgICAgICAgZWJ5dGVzID0gMSA8PCBzaXplOwogICAgICAgICAgICAgICAgIGVsZW1lbnRzID0gOCAvIGVieXRlczsKICAgICAgICAgICAgICAgICBpZiAoQml0SXNDbGVhciAob3Bjb2RlLCA1KSkKQEAgLTExODEyLDcgKzExODEwLDcgQEAKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHJlZ3MgPSAyOwogICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvL2FsaWdubWVudCA9IGlmIGEgPT0g4oCYMOKAmSB0aGVuIDEgZWxzZSBlYnl0ZXM7CisgICAgICAgICAgICAgICAgLy9hbGlnbm1lbnQgPSBpZiBhID09INQw1SB0aGVuIDEgZWxzZSBlYnl0ZXM7CiAgICAgICAgICAgICAgICAgaWYgKEJpdElzQ2xlYXIgKG9wY29kZSwgNCkpCiAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudCA9IDE7CiAgICAgICAgICAgICAgICAgZWxzZQpAQCAtMTE5MDksMTkgKzExOTA3LDE5IEBACiAgICAgICAgICAgICBVTlBSRURJQ1RBQkxFOwogICAgICAgICBvcGVyYW5kMiA9IGlmIHJlZ2lzdGVyX2Zvcm0gdGhlbiBTaGlmdChSW21dLCBzaGlmdF90LCBzaGlmdF9uLCBBUFNSLkMpIGVsc2UgaW1tMzI7CiAgICAgICAgIGNhc2Ugb3Bjb2RlIG9mCi0gICAgICAgICAgICB3aGVuIOKAmDAwMDDigJkgcmVzdWx0ID0gUltuXSBBTkQgb3BlcmFuZDI7IC8vIEFORAotICAgICAgICAgICAgd2hlbiDigJgwMDAx4oCZIHJlc3VsdCA9IFJbbl0gRU9SIG9wZXJhbmQyOyAvLyBFT1IKLSAgICAgICAgICAgIHdoZW4g4oCYMDAxMOKAmSAocmVzdWx0LCAtLCAtKSA9IEFkZFdpdGhDYXJyeShSW25dLCBOT1Qob3BlcmFuZDIpLCDigJgx4oCZKTsgLy8gU1VCCi0gICAgICAgICAgICB3aGVuIOKAmDAwMTHigJkgKHJlc3VsdCwgLSwgLSkgPSBBZGRXaXRoQ2FycnkoTk9UKFJbbl0pLCBvcGVyYW5kMiwg4oCYMeKAmSk7IC8vIFJTQgotICAgICAgICAgICAgd2hlbiDigJgwMTAw4oCZIChyZXN1bHQsIC0sIC0pID0gQWRkV2l0aENhcnJ5KFJbbl0sIG9wZXJhbmQyLCDigJgw4oCZKTsgLy8gQURECi0gICAgICAgICAgICB3aGVuIOKAmDAxMDHigJkgKHJlc3VsdCwgLSwgLSkgPSBBZGRXaXRoQ2FycnkoUltuXSwgb3BlcmFuZDIsIEFQU1IuYyk7IC8vIEFEQwotICAgICAgICAgICAgd2hlbiDigJgwMTEw4oCZIChyZXN1bHQsIC0sIC0pID0gQWRkV2l0aENhcnJ5KFJbbl0sIE5PVChvcGVyYW5kMiksIEFQU1IuQyk7IC8vIFNCQwotICAgICAgICAgICAgd2hlbiDigJgwMTEx4oCZIChyZXN1bHQsIC0sIC0pID0gQWRkV2l0aENhcnJ5KE5PVChSW25dKSwgb3BlcmFuZDIsIEFQU1IuQyk7IC8vIFJTQwotICAgICAgICAgICAgd2hlbiDigJgxMTAw4oCZIHJlc3VsdCA9IFJbbl0gT1Igb3BlcmFuZDI7IC8vIE9SUgotICAgICAgICAgICAgd2hlbiDigJgxMTAx4oCZIHJlc3VsdCA9IG9wZXJhbmQyOyAvLyBNT1YKLSAgICAgICAgICAgIHdoZW4g4oCYMTExMOKAmSByZXN1bHQgPSBSW25dIEFORCBOT1Qob3BlcmFuZDIpOyAvLyBCSUMKLSAgICAgICAgICAgIHdoZW4g4oCYMTExMeKAmSByZXN1bHQgPSBOT1Qob3BlcmFuZDIpOyAvLyBNVk4KLSAgICAgICAgQ1BTUldyaXRlQnlJbnN0cihTUFNSW10sIOKAmDExMTHigJksIFRSVUUpOworICAgICAgICAgICAgd2hlbiDUMDAwMNUgcmVzdWx0ID0gUltuXSBBTkQgb3BlcmFuZDI7IC8vIEFORAorICAgICAgICAgICAgd2hlbiDUMDAwMdUgcmVzdWx0ID0gUltuXSBFT1Igb3BlcmFuZDI7IC8vIEVPUgorICAgICAgICAgICAgd2hlbiDUMDAxMNUgKHJlc3VsdCwgLSwgLSkgPSBBZGRXaXRoQ2FycnkoUltuXSwgTk9UKG9wZXJhbmQyKSwg1DHVKTsgLy8gU1VCCisgICAgICAgICAgICB3aGVuINQwMDEx1SAocmVzdWx0LCAtLCAtKSA9IEFkZFdpdGhDYXJyeShOT1QoUltuXSksIG9wZXJhbmQyLCDUMdUpOyAvLyBSU0IKKyAgICAgICAgICAgIHdoZW4g1DAxMDDVIChyZXN1bHQsIC0sIC0pID0gQWRkV2l0aENhcnJ5KFJbbl0sIG9wZXJhbmQyLCDUMNUpOyAvLyBBREQKKyAgICAgICAgICAgIHdoZW4g1DAxMDHVIChyZXN1bHQsIC0sIC0pID0gQWRkV2l0aENhcnJ5KFJbbl0sIG9wZXJhbmQyLCBBUFNSLmMpOyAvLyBBREMKKyAgICAgICAgICAgIHdoZW4g1DAxMTDVIChyZXN1bHQsIC0sIC0pID0gQWRkV2l0aENhcnJ5KFJbbl0sIE5PVChvcGVyYW5kMiksIEFQU1IuQyk7IC8vIFNCQworICAgICAgICAgICAgd2hlbiDUMDExMdUgKHJlc3VsdCwgLSwgLSkgPSBBZGRXaXRoQ2FycnkoTk9UKFJbbl0pLCBvcGVyYW5kMiwgQVBTUi5DKTsgLy8gUlNDCisgICAgICAgICAgICB3aGVuINQxMTAw1SByZXN1bHQgPSBSW25dIE9SIG9wZXJhbmQyOyAvLyBPUlIKKyAgICAgICAgICAgIHdoZW4g1DExMDHVIHJlc3VsdCA9IG9wZXJhbmQyOyAvLyBNT1YKKyAgICAgICAgICAgIHdoZW4g1DExMTDVIHJlc3VsdCA9IFJbbl0gQU5EIE5PVChvcGVyYW5kMik7IC8vIEJJQworICAgICAgICAgICAgd2hlbiDUMTExMdUgcmVzdWx0ID0gTk9UKG9wZXJhbmQyKTsgLy8gTVZOCisgICAgICAgIENQU1JXcml0ZUJ5SW5zdHIoU1BTUltdLCDUMTExMdUsIFRSVUUpOwogICAgICAgICBCcmFuY2hXcml0ZVBDKHJlc3VsdCk7CiAjZW5kaWYKIApAQCAtMTE5NDEsNyArMTE5MzksNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBjYXNlIGVFbmNvZGluZ1QxOgogICAgICAgICAgICAgICAgIC8vIGlmIEN1cnJlbnRJbnN0clNldCgpID09IEluc3RyU2V0X1RodW1iRUUgdGhlbiBVTlBSRURJQ1RBQkxFCi0gICAgICAgICAgICAgICAgLy8gbiA9IDE0OyBpbW0zMiA9IFplcm9FeHRlbmQoaW1tOCwgMzIpOyByZWdpc3Rlcl9mb3JtID0gRkFMU0U7IG9wY29kZSA9IOKAmDAwMTDigJk7IC8vID0gU1VCCisgICAgICAgICAgICAgICAgLy8gbiA9IDE0OyBpbW0zMiA9IFplcm9FeHRlbmQoaW1tOCwgMzIpOyByZWdpc3Rlcl9mb3JtID0gRkFMU0U7IG9wY29kZSA9INQwMDEw1TsgLy8gPSBTVUIKICAgICAgICAgICAgICAgICBuID0gMTQ7CiAgICAgICAgICAgICAgICAgaW1tMzIgPSBCaXRzMzIgKG9wY29kZSwgNywgMCk7CiAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfZm9ybSA9IGZhbHNlOwpAQCAtMTIwMDIsNjIgKzEyMDAwLDYyIEBACiAgICAgICAgIC8vIGNhc2Ugb3Bjb2RlIG9mCiAgICAgICAgIHN3aXRjaCAoY29kZSkKICAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOiAvLyB3aGVuIOKAmDAwMDDigJkgCisgICAgICAgICAgICBjYXNlIDA6IC8vIHdoZW4g1DAwMDDVIAogICAgICAgICAgICAgICAgIC8vIHJlc3VsdCA9IFJbbl0gQU5EIG9wZXJhbmQyOyAvLyBBTkQKICAgICAgICAgICAgICAgICByZXN1bHQucmVzdWx0ID0gUm4gJiBvcGVyYW5kMjsKICAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgY2FzZSAxOiAvLyB3aGVuIOKAmDAwMDHigJkgCisgICAgICAgICAgICBjYXNlIDE6IC8vIHdoZW4g1DAwMDHVIAogICAgICAgICAgICAgICAgIC8vIHJlc3VsdCA9IFJbbl0gRU9SIG9wZXJhbmQyOyAvLyBFT1IKICAgICAgICAgICAgICAgICByZXN1bHQucmVzdWx0ID0gUm4gXiBvcGVyYW5kMjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgMjogLy8gd2hlbiDigJgwMDEw4oCZIAotICAgICAgICAgICAgICAgIC8vIChyZXN1bHQsIC0sIC0pID0gQWRkV2l0aENhcnJ5KFJbbl0sIE5PVChvcGVyYW5kMiksIOKAmDHigJkpOyAvLyBTVUIKKyAgICAgICAgICAgIGNhc2UgMjogLy8gd2hlbiDUMDAxMNUgCisgICAgICAgICAgICAgICAgLy8gKHJlc3VsdCwgLSwgLSkgPSBBZGRXaXRoQ2FycnkoUltuXSwgTk9UKG9wZXJhbmQyKSwg1DHVKTsgLy8gU1VCCiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQWRkV2l0aENhcnJ5IChSbiwgfihvcGVyYW5kMiksIDEpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSAzOiAvLyB3aGVuIOKAmDAwMTHigJkgCi0gICAgICAgICAgICAgICAgLy8gKHJlc3VsdCwgLSwgLSkgPSBBZGRXaXRoQ2FycnkoTk9UKFJbbl0pLCBvcGVyYW5kMiwg4oCYMeKAmSk7IC8vIFJTQgorICAgICAgICAgICAgY2FzZSAzOiAvLyB3aGVuINQwMDEx1SAKKyAgICAgICAgICAgICAgICAvLyAocmVzdWx0LCAtLCAtKSA9IEFkZFdpdGhDYXJyeShOT1QoUltuXSksIG9wZXJhbmQyLCDUMdUpOyAvLyBSU0IKICAgICAgICAgICAgICAgICByZXN1bHQgPSBBZGRXaXRoQ2FycnkgKH4oUm4pLCBvcGVyYW5kMiwgMSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIDQ6IC8vIHdoZW4g4oCYMDEwMOKAmSAKLSAgICAgICAgICAgICAgICAvLyAocmVzdWx0LCAtLCAtKSA9IEFkZFdpdGhDYXJyeShSW25dLCBvcGVyYW5kMiwg4oCYMOKAmSk7IC8vIEFERAorICAgICAgICAgICAgY2FzZSA0OiAvLyB3aGVuINQwMTAw1SAKKyAgICAgICAgICAgICAgICAvLyAocmVzdWx0LCAtLCAtKSA9IEFkZFdpdGhDYXJyeShSW25dLCBvcGVyYW5kMiwg1DDVKTsgLy8gQURECiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQWRkV2l0aENhcnJ5IChSbiwgb3BlcmFuZDIsIDApOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSA1OiAvLyB3aGVuIOKAmDAxMDHigJkgCisgICAgICAgICAgICBjYXNlIDU6IC8vIHdoZW4g1DAxMDHVIAogICAgICAgICAgICAgICAgIC8vIChyZXN1bHQsIC0sIC0pID0gQWRkV2l0aENhcnJ5KFJbbl0sIG9wZXJhbmQyLCBBUFNSLmMpOyAvLyBBREMKICAgICAgICAgICAgICAgICByZXN1bHQgPSBBZGRXaXRoQ2FycnkgKFJuLCBvcGVyYW5kMiwgQVBTUl9DKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgNjogLy8gd2hlbiDigJgwMTEw4oCZIAorICAgICAgICAgICAgY2FzZSA2OiAvLyB3aGVuINQwMTEw1SAKICAgICAgICAgICAgICAgICAvLyAocmVzdWx0LCAtLCAtKSA9IEFkZFdpdGhDYXJyeShSW25dLCBOT1Qob3BlcmFuZDIpLCBBUFNSLkMpOyAvLyBTQkMKICAgICAgICAgICAgICAgICByZXN1bHQgPSBBZGRXaXRoQ2FycnkgKFJuLCB+KG9wZXJhbmQyKSwgQVBTUl9DKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgNzogLy8gd2hlbiDigJgwMTEx4oCZIAorICAgICAgICAgICAgY2FzZSA3OiAvLyB3aGVuINQwMTEx1SAKICAgICAgICAgICAgICAgICAvLyAocmVzdWx0LCAtLCAtKSA9IEFkZFdpdGhDYXJyeShOT1QoUltuXSksIG9wZXJhbmQyLCBBUFNSLkMpOyAvLyBSU0MKICAgICAgICAgICAgICAgICByZXN1bHQgPSBBZGRXaXRoQ2FycnkgKH4oUm4pLCBvcGVyYW5kMiwgQVBTUl9DKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgMTA6IC8vIHdoZW4g4oCYMTEwMOKAmSAKKyAgICAgICAgICAgIGNhc2UgMTA6IC8vIHdoZW4g1DExMDDVIAogICAgICAgICAgICAgICAgIC8vIHJlc3VsdCA9IFJbbl0gT1Igb3BlcmFuZDI7IC8vIE9SUgogICAgICAgICAgICAgICAgIHJlc3VsdC5yZXN1bHQgPSBSbiB8IG9wZXJhbmQyOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSAxMTogLy8gd2hlbiDigJgxMTAx4oCZIAorICAgICAgICAgICAgY2FzZSAxMTogLy8gd2hlbiDUMTEwMdUgCiAgICAgICAgICAgICAgICAgLy8gcmVzdWx0ID0gb3BlcmFuZDI7IC8vIE1PVgogICAgICAgICAgICAgICAgIHJlc3VsdC5yZXN1bHQgPSBvcGVyYW5kMjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgMTI6IC8vIHdoZW4g4oCYMTExMOKAmSAKKyAgICAgICAgICAgIGNhc2UgMTI6IC8vIHdoZW4g1DExMTDVIAogICAgICAgICAgICAgICAgIC8vIHJlc3VsdCA9IFJbbl0gQU5EIE5PVChvcGVyYW5kMik7IC8vIEJJQwogICAgICAgICAgICAgICAgIHJlc3VsdC5yZXN1bHQgPSBSbiAmIH4ob3BlcmFuZDIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSAxNTogLy8gd2hlbiDigJgxMTEx4oCZIAorICAgICAgICAgICAgY2FzZSAxNTogLy8gd2hlbiDUMTExMdUgCiAgICAgICAgICAgICAgICAgLy8gcmVzdWx0ID0gTk9UKG9wZXJhbmQyKTsgLy8gTVZOCiAgICAgICAgICAgICAgICAgcmVzdWx0LnJlc3VsdCA9IH4ob3BlcmFuZDIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTIwNjUsNyArMTIwNjMsNyBAQAogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgLy8gQ1BTUldyaXRlQnlJbnN0cihTUFNSW10sIOKAmDExMTHigJksIFRSVUUpOworICAgICAgICAvLyBDUFNSV3JpdGVCeUluc3RyKFNQU1JbXSwg1DExMTHVLCBUUlVFKTsKICAgICAgICAgCiAgICAgICAgIC8vIEZvciBub3csIGluIGVtdWxhdGlvbiBtb2RlLCB3ZSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgU1BTUiwgc28gd2Ugd2lsbCB1c2UgdGhlIENQU1IgaW5zdGVhZCwgYW5kIGhvcGUgZm9yCiAgICAgICAgIC8vIHRoZSBiZXN0LgpAQCAtMTMyNDksOSArMTMyNDcsOSBAQAogICAgIGlmIChtX29wY29kZV9jcHNyID09IDAgfHwgbV9pZ25vcmVfY29uZGl0aW9ucyA9PSBmYWxzZSkKICAgICB7CiAgICAgICAgIG1fb3Bjb2RlX2Nwc3IgPSBSZWFkUmVnaXN0ZXJVbnNpZ25lZCAoZVJlZ2lzdGVyS2luZERXQVJGLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd2FyZl9jcHNyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWNjZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3YXJmX2Nwc3IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWNjZXNzKTsKICAgICB9CiAKICAgICAvLyBPbmx5IHJldHVybiBmYWxzZSBpZiB3ZSBhcmUgdW5hYmxlIHRvIHJlYWQgdGhlIENQU1IgaWYgd2UgY2FyZSBhYm91dCBjb25kaXRpb25zCg==