Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gRGVzY3JpcHRpb246Ci8vCi8vIFRoaXMgZmlsZSBpcyBmb3IgUlRMODcyM0EgQ28tZXhpc3QgbWVjaGFuaXNtCi8vCi8vIEhpc3RvcnkKLy8gMjAxMi8wOC8yMiBDb3NhIGZpcnN0IGNoZWNrIGluLgovLyAyMDEyLzExLzE0IENvc2EgUmV2aXNlIGZvciA4NzIzQSAyQW50IG91dCBzb3VyY2luZy4KLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIGluY2x1ZGUgZmlsZXMKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KI2luY2x1ZGUgIk1wX1ByZWNvbXAuaCIKI2lmKEJUXzMwX1NVUFBPUlQgPT0gMSkKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gR2xvYmFsIHZhcmlhYmxlcywgdGhlc2UgYXJlIHN0YXRpYyB2YXJpYWJsZXMKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0Kc3RhdGljIENPRVhfRE1fODcyM0FfMkFOVAlHTENvZXhEbTg3MjNhMkFudDsKc3RhdGljIFBDT0VYX0RNXzg3MjNBXzJBTlQgCXBDb2V4RG09JkdMQ29leERtODcyM2EyQW50OwpzdGF0aWMgQ09FWF9TVEFfODcyM0FfMkFOVAlHTENvZXhTdGE4NzIzYTJBbnQ7CnN0YXRpYyBQQ09FWF9TVEFfODcyM0FfMkFOVAlwQ29leFN0YT0mR0xDb2V4U3RhODcyM2EyQW50OwoKY29uc3QgY2hhciAqY29uc3QgR0xCdEluZm9TcmM4NzIzYTJBbnRbXT17CgkiQlQgSW5mb1t3aWZpIGZ3XSIsCgkiQlQgSW5mb1tidCByc3BdIiwKCSJCVCBJbmZvW2J0IGF1dG8gcmVwb3J0XSIsCn07CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBsb2NhbCBmdW5jdGlvbiBwcm90byB0eXBlIGlmIG5lZWRlZAovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBsb2NhbCBmdW5jdGlvbiBzdGFydCB3aXRoIGhhbGJ0Yzg3MjNhMmFudF8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQk9PTEVBTgpoYWxidGM4NzIzYTJhbnRfSXNXaWZpSWRsZSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CglCT09MRUFOCQliV2lmaUNvbm5lY3RlZD1GQUxTRSwgYlNjYW49RkFMU0UsIGJMaW5rPUZBTFNFLCBiUm9hbT1GQUxTRTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZiV2lmaUNvbm5lY3RlZCk7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9TQ0FOLCAmYlNjYW4pOwoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfTElOSywgJmJMaW5rKTsKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1JPQU0sICZiUm9hbSk7CgoJaWYoYldpZmlDb25uZWN0ZWQpCgkJcmV0dXJuIEZBTFNFOwoJaWYoYlNjYW4pCgkJcmV0dXJuIEZBTFNFOwoJaWYoYkxpbmspCgkJcmV0dXJuIEZBTFNFOwoJaWYoYlJvYW0pCgkJcmV0dXJuIEZBTFNFOwoKCXJldHVybiB0cnVlOwp9Cgp1MUJ5dGUKaGFsYnRjODcyM2EyYW50X0J0UnNzaVN0YXRlKAoJdTFCeXRlCQkJbGV2ZWxOdW0sCgl1MUJ5dGUJCQlyc3NpVGhyZXNoLAoJdTFCeXRlCQkJcnNzaVRocmVzaDEKCSkKewoJczRCeXRlCQkJYnRSc3NpPTA7Cgl1MUJ5dGUJCQlidFJzc2lTdGF0ZT1wQ29leFN0YS0+cHJlQnRSc3NpU3RhdGU7CgoJYnRSc3NpID0gcENvZXhTdGEtPmJ0UnNzaTsKCglpZihsZXZlbE51bSA9PSAyKQoJewkJCQoJCWlmKCAocENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKCQkJKHBDb2V4U3RhLT5wcmVCdFJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVykpCgkJewoJCQlpZihidFJzc2kgPj0gKHJzc2lUaHJlc2grQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg3MjNBXzJBTlQpKQoJCQl7CgkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVzsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJaWYoYnRSc3NpIDwgcnNzaVRocmVzaCkKCQkJewoJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gTG93XG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSDsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN0YXkgYXQgSGlnaFxuIikpOwoJCQl9CgkJfQoJfQoJZWxzZSBpZihsZXZlbE51bSA9PSAzKQoJewoJCWlmKHJzc2lUaHJlc2ggPiByc3NpVGhyZXNoMSkKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHRocmVzaCBlcnJvciEhXG4iKSk7CgkJCXJldHVybiBwQ29leFN0YS0+cHJlQnRSc3NpU3RhdGU7CgkJfQoJCQoJCWlmKCAocENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKCQkJKHBDb2V4U3RhLT5wcmVCdFJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVykpCgkJewoJCQlpZihidFJzc2kgPj0gKHJzc2lUaHJlc2grQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg3MjNBXzJBTlQpKQoJCQl7CgkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX01FRElVTTsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN3aXRjaCB0byBNZWRpdW1cbiIpKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWJ0UnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1c7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IExvd1xuIikpOwoJCQl9CgkJfQoJCWVsc2UgaWYoIChwQ29leFN0YS0+cHJlQnRSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfTUVESVVNKSB8fAoJCQkocENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNKSkKCQl7CgkJCWlmKGJ0UnNzaSA+PSAocnNzaVRocmVzaDErQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg3MjNBXzJBTlQpKQoJCQl7CgkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOwoJCQl9CgkJCWVsc2UgaWYoYnRSc3NpIDwgcnNzaVRocmVzaCkKCQkJewoJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gTG93XG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3RheSBhdCBNZWRpdW1cbiIpKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlpZihidFJzc2kgPCByc3NpVGhyZXNoMSkKCQkJewoJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9NRURJVU07CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSDsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN0YXkgYXQgSGlnaFxuIikpOwoJCQl9CgkJfQoJfQoJCQoJcENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlID0gYnRSc3NpU3RhdGU7CgoJcmV0dXJuIGJ0UnNzaVN0YXRlOwp9Cgp1MUJ5dGUKaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTgl1MUJ5dGUJCQlpbmRleCwKCUlOCXUxQnl0ZQkJCWxldmVsTnVtLAoJSU4JdTFCeXRlCQkJcnNzaVRocmVzaCwKCUlOCXUxQnl0ZQkJCXJzc2lUaHJlc2gxCgkpCnsKCXM0Qnl0ZQkJCXdpZmlSc3NpPTA7Cgl1MUJ5dGUJCQl3aWZpUnNzaVN0YXRlPXBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfUzRfV0lGSV9SU1NJLCAmd2lmaVJzc2kpOwoJCglpZihsZXZlbE51bSA9PSAyKQoJewoJCWlmKCAocENvZXhTdGEtPnByZVdpZmlSc3NpU3RhdGVbaW5kZXhdID09IEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKCQkJKHBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVykpCgkJewoJCQlpZih3aWZpUnNzaSA+PSAocnNzaVRocmVzaCtCVENfUlNTSV9DT0VYX1RIUkVTSF9UT0xfODcyM0FfMkFOVCkpCgkJCXsKCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9ISUdIOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1c7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3RheSBhdCBMb3dcbiIpKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlpZih3aWZpUnNzaSA8IHJzc2lUaHJlc2gpCgkJCXsKCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSDsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpKTsKCQkJfQoJCX0KCX0KCWVsc2UgaWYobGV2ZWxOdW0gPT0gMykKCXsKCQlpZihyc3NpVGhyZXNoID4gcnNzaVRocmVzaDEpCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgdGhyZXNoIGVycm9yISFcbiIpKTsKCQkJcmV0dXJuIHBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XTsKCQl9CgkJCgkJaWYoIChwQ29leFN0YS0+cHJlV2lmaVJzc2lTdGF0ZVtpbmRleF0gPT0gQlRDX1JTU0lfU1RBVEVfTE9XKSB8fAoJCQkocENvZXhTdGEtPnByZVdpZmlSc3NpU3RhdGVbaW5kZXhdID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XKSkKCQl7CgkJCWlmKHdpZmlSc3NpID49IChyc3NpVGhyZXNoK0JUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84NzIzQV8yQU5UKSkKCQkJewoJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX01FRElVTTsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1c7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3RheSBhdCBMb3dcbiIpKTsKCQkJfQoJCX0KCQllbHNlIGlmKCAocENvZXhTdGEtPnByZVdpZmlSc3NpU3RhdGVbaW5kZXhdID09IEJUQ19SU1NJX1NUQVRFX01FRElVTSkgfHwKCQkJKHBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX01FRElVTSkpCgkJewoJCQlpZih3aWZpUnNzaSA+PSAocnNzaVRocmVzaDErQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg3MjNBXzJBTlQpKQoJCQl7CgkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfSElHSDsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOwoJCQl9CgkJCWVsc2UgaWYod2lmaVJzc2kgPCByc3NpVGhyZXNoKQoJCQl7CgkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfTE9XOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN3aXRjaCB0byBMb3dcbiIpKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX01FRElVTTsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzdGF5IGF0IE1lZGl1bVxuIikpOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKHdpZmlSc3NpIDwgcnNzaVRocmVzaDEpCgkJCXsKCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9NRURJVU07CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIikpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSDsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpKTsKCQkJfQoJCX0KCX0KCQkKCXBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XSA9IHdpZmlSc3NpU3RhdGU7CgoJcmV0dXJuIHdpZmlSc3NpU3RhdGU7Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X0luZGljYXRlV2lmaUNobmxCd0luZm8oCglJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJCXR5cGUKCSkKewoJdTFCeXRlCQkJSDJDX1BhcmFtZXRlclszXSA9ezB9OwoJdTRCeXRlCQkJd2lmaUJ3OwoJdTFCeXRlCQkJd2lmaUNlbnRyYWxDaG5sOwoJCgkvLyBvbmx5IDIuNEcgd2UgbmVlZCB0byBpbmZvcm0gYnQgdGhlIGNobmwgbWFzawoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1UxX1dJRklfQ0VOVFJBTF9DSE5MLCAmd2lmaUNlbnRyYWxDaG5sKTsKCWlmKCAoQlRDX01FRElBX0NPTk5FQ1QgPT0gdHlwZSkgJiYKCQkod2lmaUNlbnRyYWxDaG5sIDw9IDE0KSApCgl7CgkJSDJDX1BhcmFtZXRlclswXSA9IDB4MTsKCQlIMkNfUGFyYW1ldGVyWzFdID0gd2lmaUNlbnRyYWxDaG5sOwoJCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKCQlpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKCQkJSDJDX1BhcmFtZXRlclsyXSA9IDB4MzA7CgkJZWxzZQoJCQlIMkNfUGFyYW1ldGVyWzJdID0gMHgyMDsKCX0KCQkKCXBDb2V4RG0tPndpZmlDaG5sSW5mb1swXSA9IEgyQ19QYXJhbWV0ZXJbMF07CglwQ29leERtLT53aWZpQ2hubEluZm9bMV0gPSBIMkNfUGFyYW1ldGVyWzFdOwoJcENvZXhEbS0+d2lmaUNobmxJbmZvWzJdID0gSDJDX1BhcmFtZXRlclsyXTsKCQoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIEZXIHdyaXRlIDB4MTk9MHgleFxuIiwgCgkJSDJDX1BhcmFtZXRlclswXTw8MTZ8SDJDX1BhcmFtZXRlclsxXTw8OHxIMkNfUGFyYW1ldGVyWzJdKSk7CgoJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4MTksIDMsIEgyQ19QYXJhbWV0ZXIpOwp9CgpWT0lECmhhbGJ0Yzg3MjNhMmFudF9RdWVyeUJ0SW5mbygKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7Cgl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzFdID17MH07CgoJcENvZXhTdGEtPmJDMmhCdEluZm9SZXFTZW50ID0gdHJ1ZTsKCglIMkNfUGFyYW1ldGVyWzBdIHw9IEJJVDA7CS8vIHRyaWdnZXIKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgUXVlcnkgQnQgSW5mbywgRlcgd3JpdGUgMHgzOD0weCV4XG4iLCAKCQlIMkNfUGFyYW1ldGVyWzBdKSk7CgoJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4MzgsIDEsIEgyQ19QYXJhbWV0ZXIpOwp9CnUxQnl0ZQpoYWxidGM4NzIzYTJhbnRfQWN0aW9uQWxnb3JpdGhtKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCVBCVENfU1RBQ0tfSU5GTwkJcFN0YWNrSW5mbz0mcEJ0Q29leGlzdC0+c3RhY2tfaW5mbzsKCUJPT0xFQU4JCQkJYkJ0SHNPbj1GQUxTRSwgYkJ0QnVzeT1GQUxTRSwgbGltaXRlZF9kaWc9RkFMU0U7Cgl1MUJ5dGUJCQkJYWxnb3JpdGhtPUJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1VOREVGSU5FRDsKCXUxQnl0ZQkJCQludW1PZkRpZmZQcm9maWxlPTA7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJCdEhzT24pOwoKCS8vPT09PT09PT09PT09PT09PT09PT09PQoJLy8gaGVyZSB3ZSBnZXQgQlQgc3RhdHVzIGZpcnN0CgkvLz09PT09PT09PT09PT09PT09PT09PT0KCXBDb2V4RG0tPmJ0U3RhdHVzID0gQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfSURMRTsKCQoJaWYoKHBTdGFja0luZm8tPmJTY29FeGlzdCkgfHwoYkJ0SHNPbikgfHwocFN0YWNrSW5mby0+YkhpZEV4aXN0KSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyBvciBISUQgb3IgSFMgZXhpc3RzLCBzZXQgQlQgbm9uLWlkbGUgISEhXG4iKSk7CgkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19OT05fSURMRTsKCX0KCWVsc2UKCXsKCQkvLyBBMmRwIHByb2ZpbGUKCQlpZiggKHBCdENvZXhpc3QtPnN0YWNrX2luZm8ubnVtT2ZMaW5rID09IDEpICYmCgkJCShwU3RhY2tJbmZvLT5iQTJkcEV4aXN0KSApCgkJewkJCgkJCWlmKCAocENvZXhTdGEtPmxvd1ByaW9yaXR5VHgrCXBDb2V4U3RhLT5sb3dQcmlvcml0eVJ4KSA8IDEwMCkKCQkJewoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBMkRQLCBsb3cgcHJpb3JpdHkgdHgrcnggPCAxMDAsIHNldCBCVCBjb25uZWN0ZWQtaWRsZSEhIVxuIikpOwoJCQkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCwgbG93IHByaW9yaXR5IHR4K3J4ID49IDEwMCwgc2V0IEJUIG5vbi1pZGxlISEhXG4iKSk7CgkJCQlwQ29leERtLT5idFN0YXR1cyA9IEJUXzg3MjNBXzJBTlRfQlRfU1RBVFVTX05PTl9JRExFOwoJCQl9CgkJfQoJCS8vIFBhbiBwcm9maWxlCgkJaWYoIChwQnRDb2V4aXN0LT5zdGFja19pbmZvLm51bU9mTGluayA9PSAxKSAmJgoJCQkocFN0YWNrSW5mby0+YlBhbkV4aXN0KSApCgkJewkJCgkJCWlmKChwQ29leFN0YS0+bG93UHJpb3JpdHlUeCsJcENvZXhTdGEtPmxvd1ByaW9yaXR5UngpIDwgNjAwKQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFBBTiwgbG93IHByaW9yaXR5IHR4K3J4IDwgNjAwLCBzZXQgQlQgY29ubmVjdGVkLWlkbGUhISFcbiIpKTsKCQkJCXBDb2V4RG0tPmJ0U3RhdHVzID0gQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEU7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlpZihwQ29leFN0YS0+bG93UHJpb3JpdHlUeCkKCQkJCXsKCQkJCQlpZigocENvZXhTdGEtPmxvd1ByaW9yaXR5UnggL3BDb2V4U3RhLT5sb3dQcmlvcml0eVR4KT45ICkKCQkJCQl7CgkJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUEFOLCBsb3cgcHJpb3JpdHkgcngvdHggPiA5LCBzZXQgQlQgY29ubmVjdGVkLWlkbGUhISFcbiIpKTsKCQkJCQkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJaWYoQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgIT0gcENvZXhEbS0+YnRTdGF0dXMpCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUEFOLCBzZXQgQlQgbm9uLWlkbGUhISFcbiIpKTsKCQkJCXBDb2V4RG0tPmJ0U3RhdHVzID0gQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfTk9OX0lETEU7CgkJCX0KCQl9CgkJLy8gUGFuK0EyZHAgcHJvZmlsZQoJCWlmKCAocEJ0Q29leGlzdC0+c3RhY2tfaW5mby5udW1PZkxpbmsgPT0gMikgJiYKCQkJKHBTdGFja0luZm8tPmJBMmRwRXhpc3QpICYmCgkJCShwU3RhY2tJbmZvLT5iUGFuRXhpc3QpICkKCQl7CgkJCWlmKChwQ29leFN0YS0+bG93UHJpb3JpdHlUeCsJcENvZXhTdGEtPmxvd1ByaW9yaXR5UngpIDwgNjAwKQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFBBTitBMkRQLCBsb3cgcHJpb3JpdHkgdHgrcnggPCA2MDAsIHNldCBCVCBjb25uZWN0ZWQtaWRsZSEhIVxuIikpOwoJCQkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWlmKHBDb2V4U3RhLT5sb3dQcmlvcml0eVR4KQoJCQkJewoJCQkJCWlmKChwQ29leFN0YS0+bG93UHJpb3JpdHlSeCAvcENvZXhTdGEtPmxvd1ByaW9yaXR5VHgpPjkgKQoJCQkJCXsKCQkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBQQU4rQTJEUCwgbG93IHByaW9yaXR5IHJ4L3R4ID4gOSwgc2V0IEJUIGNvbm5lY3RlZC1pZGxlISEhXG4iKSk7CgkJCQkJCXBDb2V4RG0tPmJ0U3RhdHVzID0gQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEU7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWlmKEJUXzg3MjNBXzJBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFICE9IHBDb2V4RG0tPmJ0U3RhdHVzKQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFBBTitBMkRQLCBzZXQgQlQgbm9uLWlkbGUhISFcbiIpKTsKCQkJCXBDb2V4RG0tPmJ0U3RhdHVzID0gQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfTk9OX0lETEU7CgkJCX0KCQl9Cgl9CglpZihCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19JRExFICE9IHBDb2V4RG0tPmJ0U3RhdHVzKQoJewoJCWJCdEJ1c3kgPSB0cnVlOwoJCWxpbWl0ZWRfZGlnID0gdHJ1ZTsKCX0KCWVsc2UKCXsKCQliQnRCdXN5ID0gRkFMU0U7CgkJbGltaXRlZF9kaWcgPSBGQUxTRTsKCX0KCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9CTF9CVF9UUkFGRklDX0JVU1ksICZiQnRCdXN5KTsKCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9CTF9CVF9MSU1JVEVEX0RJRywgJmxpbWl0ZWRfZGlnKTsKCS8vPT09PT09PT09PT09PT09PT09PT09PQoKCWlmKCFwU3RhY2tJbmZvLT5iQnRMaW5rRXhpc3QpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBObyBwcm9maWxlIGV4aXN0cyEhIVxuIikpOwoJCXJldHVybiBhbGdvcml0aG07Cgl9CgoJaWYocFN0YWNrSW5mby0+YlNjb0V4aXN0KQoJCW51bU9mRGlmZlByb2ZpbGUrKzsKCWlmKHBTdGFja0luZm8tPmJIaWRFeGlzdCkKCQludW1PZkRpZmZQcm9maWxlKys7CglpZihwU3RhY2tJbmZvLT5iUGFuRXhpc3QpCgkJbnVtT2ZEaWZmUHJvZmlsZSsrOwoJaWYocFN0YWNrSW5mby0+YkEyZHBFeGlzdCkKCQludW1PZkRpZmZQcm9maWxlKys7CgkKCWlmKG51bU9mRGlmZlByb2ZpbGUgPT0gMSkKCXsKCQlpZihwU3RhY2tJbmZvLT5iU2NvRXhpc3QpCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyBvbmx5XG4iKSk7CgkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1NDTzsKCQl9CgkJZWxzZQoJCXsKCQkJaWYocFN0YWNrSW5mby0+YkhpZEV4aXN0KQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCBvbmx5XG4iKSk7CgkJCQlhbGdvcml0aG0gPSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19ISUQ7CgkJCX0KCQkJZWxzZSBpZihwU3RhY2tJbmZvLT5iQTJkcEV4aXN0KQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEEyRFAgb25seVxuIikpOwoJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fQTJEUDsKCQkJfQoJCQllbHNlIGlmKHBTdGFja0luZm8tPmJQYW5FeGlzdCkKCQkJewoJCQkJaWYoYkJ0SHNPbikKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFBBTihIUykgb25seVxuIikpOwoJCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1BBTkhTOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUEFOKEVEUikgb25seVxuIikpOwoJCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1BBTkVEUjsKCQkJCX0KCQkJfQoJCX0KCX0KCWVsc2UgaWYobnVtT2ZEaWZmUHJvZmlsZSA9PSAyKQoJewoJCWlmKHBTdGFja0luZm8tPmJTY29FeGlzdCkKCQl7CgkJCWlmKHBTdGFja0luZm8tPmJIaWRFeGlzdCkKCQkJewoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISURcbiIpKTsKCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX0hJRDsKCQkJfQoJCQllbHNlIGlmKHBTdGFja0luZm8tPmJBMmRwRXhpc3QpCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgQTJEUCA9PT4gU0NPXG4iKSk7CgkJCQlhbGdvcml0aG0gPSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19TQ087CgkJCX0KCQkJZWxzZSBpZihwU3RhY2tJbmZvLT5iUGFuRXhpc3QpCgkJCXsKCQkJCWlmKGJCdEhzT24pCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBQQU4oSFMpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fU0NPOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgUEFOKEVEUilcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOwoJCQkJfQoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKCBwU3RhY2tJbmZvLT5iSGlkRXhpc3QgJiYKCQkJCXBTdGFja0luZm8tPmJBMmRwRXhpc3QgKQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIEEyRFBcbiIpKTsKCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOwoJCQl9CgkJCWVsc2UgaWYoIHBTdGFja0luZm8tPmJIaWRFeGlzdCAmJgoJCQkJcFN0YWNrSW5mby0+YlBhbkV4aXN0ICkKCQkJewoJCQkJaWYoYkJ0SHNPbikKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIFBBTihIUylcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIFBBTihFRFIpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKCQkJCX0KCQkJfQoJCQllbHNlIGlmKCBwU3RhY2tJbmZvLT5iUGFuRXhpc3QgJiYKCQkJCXBTdGFja0luZm8tPmJBMmRwRXhpc3QgKQoJCQl7CgkJCQlpZihiQnRIc09uKQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCArIFBBTihIUylcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19BMkRQOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCArIFBBTihFRFIpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fUEFORURSX0EyRFA7CgkJCQl9CgkJCX0KCQl9Cgl9CgllbHNlIGlmKG51bU9mRGlmZlByb2ZpbGUgPT0gMykKCXsKCQlpZihwU3RhY2tJbmZvLT5iU2NvRXhpc3QpCgkJewoJCQlpZiggcFN0YWNrSW5mby0+YkhpZEV4aXN0ICYmCgkJCQlwU3RhY2tJbmZvLT5iQTJkcEV4aXN0ICkKCQkJewoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISUQgKyBBMkRQID09PiBISURcbiIpKTsKCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX0hJRDsKCQkJfQoJCQllbHNlIGlmKCBwU3RhY2tJbmZvLT5iSGlkRXhpc3QgJiYKCQkJCXBTdGFja0luZm8tPmJQYW5FeGlzdCApCgkJCXsKCQkJCWlmKGJCdEhzT24pCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISUQgKyBQQU4oSFMpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fSElEX0EyRFA7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISUQgKyBQQU4oRURSKVxuIikpOwoJCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7CgkJCQl9CgkJCX0KCQkJZWxzZSBpZiggcFN0YWNrSW5mby0+YlBhbkV4aXN0ICYmCgkJCQlwU3RhY2tJbmZvLT5iQTJkcEV4aXN0ICkKCQkJewoJCQkJaWYoYkJ0SHNPbikKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEEyRFAgKyBQQU4oSFMpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fU0NPOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgQTJEUCArIFBBTihFRFIpID09PiBISURcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOwoJCQkJfQoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKCBwU3RhY2tJbmZvLT5iSGlkRXhpc3QgJiYKCQkJCXBTdGFja0luZm8tPmJQYW5FeGlzdCAmJgoJCQkJcFN0YWNrSW5mby0+YkEyZHBFeGlzdCApCgkJCXsKCQkJCWlmKGJCdEhzT24pCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBBMkRQICsgUEFOKEhTKVxuIikpOwoJCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUCArIFBBTihFRFIpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fSElEX0EyRFBfUEFORURSOwoJCQkJfQoJCQl9CgkJfQoJfQoJZWxzZSBpZihudW1PZkRpZmZQcm9maWxlID49IDMpCgl7CgkJaWYocFN0YWNrSW5mby0+YlNjb0V4aXN0KQoJCXsKCQkJaWYoIHBTdGFja0luZm8tPmJIaWRFeGlzdCAmJgoJCQkJcFN0YWNrSW5mby0+YlBhbkV4aXN0ICYmCgkJCQlwU3RhY2tJbmZvLT5iQTJkcEV4aXN0ICkKCQkJewoJCQkJaWYoYkJ0SHNPbikKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEVycm9yISEhIFNDTyArIEhJRCArIEEyRFAgKyBQQU4oSFMpXG4iKSk7CgoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgSElEICsgQTJEUCArIFBBTihFRFIpPT0+UEFOKEVEUikrSElEXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4gYWxnb3JpdGhtOwp9CgpCT09MRUFOCmhhbGJ0Yzg3MjNhMmFudF9OZWVkVG9EZWNCdFB3cigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CglCT09MRUFOCQliUmV0PUZBTFNFOwoJQk9PTEVBTgkJYkJ0SHNPbj1GQUxTRSwgYldpZmlDb25uZWN0ZWQ9RkFMU0U7CglzNEJ5dGUJCWJ0SHNSc3NpPTA7CgoJaWYoIXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZiQnRIc09uKSkKCQlyZXR1cm4gRkFMU0U7CglpZighcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELCAmYldpZmlDb25uZWN0ZWQpKQoJCXJldHVybiBGQUxTRTsKCWlmKCFwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfUzRfSFNfUlNTSSwgJmJ0SHNSc3NpKSkKCQlyZXR1cm4gRkFMU0U7CgoJaWYoYldpZmlDb25uZWN0ZWQpCgl7CgkJaWYoYkJ0SHNPbikKCQl7CgkJCWlmKGJ0SHNSc3NpID4gMzcpCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgTmVlZCB0byBkZWNyZWFzZSBidCBwb3dlciBmb3IgSFMgbW9kZSEhXG4iKSk7CgkJCQliUmV0ID0gdHJ1ZTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sIE5lZWQgdG8gZGVjcmVhc2UgYnQgcG93ZXIgZm9yIFdpZmkgaXMgY29ubmVjdGVkISFcbiIpKTsKCQkJYlJldCA9IHRydWU7CgkJfQoJfQoJCglyZXR1cm4gYlJldDsKfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfU2V0RndEYWNTd2luZ0xldmVsKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJZGFjU3dpbmdMdmwKCSkKewoJdTFCeXRlCQkJSDJDX1BhcmFtZXRlclsxXSA9ezB9OwoKCS8vIFRoZXJlIGFyZSBzZXZlcmFsIHR5cGUgb2YgZGFjc3dpbmcKCS8vIDB4MTgvIDB4MTAvIDB4Yy8gMHg4LyAweDQvIDB4NgoJSDJDX1BhcmFtZXRlclswXSA9IGRhY1N3aW5nTHZsOwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBTZXQgRGFjIFN3aW5nIExldmVsPTB4JXhcbiIsIGRhY1N3aW5nTHZsKSk7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgRlcgd3JpdGUgMHgyOT0weCV4XG4iLCBIMkNfUGFyYW1ldGVyWzBdKSk7CgoJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4MjksIDEsIEgyQ19QYXJhbWV0ZXIpOwp9CgpWT0lECmhhbGJ0Yzg3MjNhMmFudF9TZXRGd0RlY0J0UHdyKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJEZWNCdFB3cgoJKQp7Cgl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzFdID17MH07CgkKCUgyQ19QYXJhbWV0ZXJbMF0gPSAwOwoKCWlmKGJEZWNCdFB3cikKCXsKCQlIMkNfUGFyYW1ldGVyWzBdIHw9IEJJVDE7Cgl9CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIGRlY3JlYXNlIEJ0IFBvd2VyIDogJXMsIEZXIHdyaXRlIDB4MjE9MHgleFxuIiwgCgkJKGJEZWNCdFB3cj8gIlllcyEhIjoiTm8hISIpLCBIMkNfUGFyYW1ldGVyWzBdKSk7CgoJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4MjEsIDEsIEgyQ19QYXJhbWV0ZXIpOwkKfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJYkZvcmNlRXhlYywKCUlOCUJPT0xFQU4JCQliRGVjQnRQd3IKCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyBEZWMgQlQgcG93ZXIgPSAlc1xuIiwgIAoJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgKChiRGVjQnRQd3IpPyAiT04iOiJPRkYiKSkpOwoJcENvZXhEbS0+YkN1ckRlY0J0UHdyID0gYkRlY0J0UHdyOwoKCWlmKCFiRm9yY2VFeGVjKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVEZWNCdFB3cj0lZCwgYkN1ckRlY0J0UHdyPSVkXG4iLCAKCQkJcENvZXhEbS0+YlByZURlY0J0UHdyLCBwQ29leERtLT5iQ3VyRGVjQnRQd3IpKTsKCgkJaWYocENvZXhEbS0+YlByZURlY0J0UHdyID09IHBDb2V4RG0tPmJDdXJEZWNCdFB3cikgCgkJCXJldHVybjsKCX0KCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd0RlY0J0UHdyKHBCdENvZXhpc3QsIHBDb2V4RG0tPmJDdXJEZWNCdFB3cik7CgoJcENvZXhEbS0+YlByZURlY0J0UHdyID0gcENvZXhEbS0+YkN1ckRlY0J0UHdyOwp9CgpWT0lECmhhbGJ0Yzg3MjNhMmFudF9Gd0RhY1N3aW5nTHZsKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCglJTgl1MUJ5dGUJCQlmd0RhY1N3aW5nTHZsCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgc2V0IEZXIERhYyBTd2luZyBsZXZlbCA9ICVkXG4iLCAgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCBmd0RhY1N3aW5nTHZsKSk7CglwQ29leERtLT5jdXJGd0RhY1N3aW5nTHZsID0gZndEYWNTd2luZ0x2bDsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBwcmVGd0RhY1N3aW5nTHZsPSVkLCBjdXJGd0RhY1N3aW5nTHZsPSVkXG4iLCAKCQkJcENvZXhEbS0+cHJlRndEYWNTd2luZ0x2bCwgcENvZXhEbS0+Y3VyRndEYWNTd2luZ0x2bCkpOwoKCQlpZihwQ29leERtLT5wcmVGd0RhY1N3aW5nTHZsID09IHBDb2V4RG0tPmN1ckZ3RGFjU3dpbmdMdmwpIAoJCQlyZXR1cm47Cgl9CgoJaGFsYnRjODcyM2EyYW50X1NldEZ3RGFjU3dpbmdMZXZlbChwQnRDb2V4aXN0LCBwQ29leERtLT5jdXJGd0RhY1N3aW5nTHZsKTsKCglwQ29leERtLT5wcmVGd0RhY1N3aW5nTHZsID0gcENvZXhEbS0+Y3VyRndEYWNTd2luZ0x2bDsKfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfU2V0U3dSZlJ4THBmQ29ybmVyKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJSeFJmU2hyaW5rT24KCSkKewoJaWYoYlJ4UmZTaHJpbmtPbikKCXsKCQkvL1NocmluayBSRiBSeCBMUEYgY29ybmVyCgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFNocmluayBSRiBSeCBMUEYgY29ybmVyISFcbiIpKTsKCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgxZSwgMHhmZmZmZiwgMHhmMGZmNyk7Cgl9CgllbHNlCgl7CgkJLy9SZXN1bWUgUkYgUnggTFBGIGNvcm5lcgoJCS8vIEFmdGVyIGluaXRpYWxpemVkLCB3ZSBjYW4gdXNlIHBDb2V4RG0tPmJ0UmYweDFlQmFja3VwCgkJaWYocEJ0Q29leGlzdC0+aW5pdGlsaXplZCkKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBSZXN1bWUgUkYgUnggTFBGIGNvcm5lciEhXG4iKSk7CgkJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDFlLCAweGZmZmZmLCBwQ29leERtLT5idFJmMHgxZUJhY2t1cCk7CgkJfQoJfQp9CgpWT0lECmhhbGJ0Yzg3MjNhMmFudF9SZlNocmluaygKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JQk9PTEVBTgkJCWJSeFJmU2hyaW5rT24KCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLCAoIltCVENvZXhdLCAlcyB0dXJuIFJ4IFJGIFNocmluayA9ICVzXG4iLCAgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGJSeFJmU2hyaW5rT24pPyAiT04iOiJPRkYiKSkpOwoJcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbmsgPSBiUnhSZlNocmlua09uOwoKCWlmKCFiRm9yY2VFeGVjKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVSZlJ4THBmU2hyaW5rPSVkLCBiQ3VyUmZSeExwZlNocmluaz0lZFxuIiwgCgkJCXBDb2V4RG0tPmJQcmVSZlJ4THBmU2hyaW5rLCBwQ29leERtLT5iQ3VyUmZSeExwZlNocmluaykpOwoKCQlpZihwQ29leERtLT5iUHJlUmZSeExwZlNocmluayA9PSBwQ29leERtLT5iQ3VyUmZSeExwZlNocmluaykgCgkJCXJldHVybjsKCX0KCWhhbGJ0Yzg3MjNhMmFudF9TZXRTd1JmUnhMcGZDb3JuZXIocEJ0Q29leGlzdCwgcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbmspOwoKCXBDb2V4RG0tPmJQcmVSZlJ4THBmU2hyaW5rID0gcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbms7Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X1NldFN3UGVuYWx0eVR4UmF0ZUFkYXB0aXZlKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJMb3dQZW5hbHR5UmEKCSkKewoJdTFCeXRlCXRtcFUxOwoKCXRtcFUxID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg0ZmQpOwoJdG1wVTEgfD0gQklUMDsKCWlmKGJMb3dQZW5hbHR5UmEpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFR4IHJhdGUgYWRhcHRpdmUsIHNldCBsb3cgcGVuYWx0eSEhXG4iKSk7CgkJdG1wVTEgJj0gfkJJVDI7Cgl9CgllbHNlCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFR4IHJhdGUgYWRhcHRpdmUsIHNldCBub3JtYWwhIVxuIikpOwoJCXRtcFUxIHw9IEJJVDI7Cgl9CgoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NGZkLCB0bXBVMSk7Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X0xvd1BlbmFsdHlSYSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JQk9PTEVBTgkJCWJMb3dQZW5hbHR5UmEKCSkKewoJcmV0dXJuOwoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLCAoIltCVENvZXhdLCAlcyB0dXJuIExvd1BlbmFsdHlSQSA9ICVzXG4iLCAgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGJMb3dQZW5hbHR5UmEpPyAiT04iOiJPRkYiKSkpOwoJcENvZXhEbS0+YkN1ckxvd1BlbmFsdHlSYSA9IGJMb3dQZW5hbHR5UmE7CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZUxvd1BlbmFsdHlSYT0lZCwgYkN1ckxvd1BlbmFsdHlSYT0lZFxuIiwgCgkJCXBDb2V4RG0tPmJQcmVMb3dQZW5hbHR5UmEsIHBDb2V4RG0tPmJDdXJMb3dQZW5hbHR5UmEpKTsKCgkJaWYocENvZXhEbS0+YlByZUxvd1BlbmFsdHlSYSA9PSBwQ29leERtLT5iQ3VyTG93UGVuYWx0eVJhKSAKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODcyM2EyYW50X1NldFN3UGVuYWx0eVR4UmF0ZUFkYXB0aXZlKHBCdENvZXhpc3QsIHBDb2V4RG0tPmJDdXJMb3dQZW5hbHR5UmEpOwoKCXBDb2V4RG0tPmJQcmVMb3dQZW5hbHR5UmEgPSBwQ29leERtLT5iQ3VyTG93UGVuYWx0eVJhOwp9CgpWT0lECmhhbGJ0Yzg3MjNhMmFudF9TZXRTd0Z1bGxUaW1lRGFjU3dpbmcoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJYlN3RGFjU3dpbmdPbiwKCUlOCXU0Qnl0ZQkJCXN3RGFjU3dpbmdMdmwKCSkKewoJaWYoYlN3RGFjU3dpbmdPbikKCXsKCQlwQnRDb2V4aXN0LT5idGNfc2V0QmJSZWcocEJ0Q29leGlzdCwgMHg4ODAsIDB4ZmYwMDAwMDAsIHN3RGFjU3dpbmdMdmwpOwoJfQoJZWxzZQoJewoJCXBCdENvZXhpc3QtPmJ0Y19zZXRCYlJlZyhwQnRDb2V4aXN0LCAweDg4MCwgMHhmZjAwMDAwMCwgMHhjMCk7Cgl9Cn0KCgpWT0lECmhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZygKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JQk9PTEVBTgkJCWJEYWNTd2luZ09uLAoJSU4JdTRCeXRlCQkJZGFjU3dpbmdMdmwKCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLCAoIltCVENvZXhdLCAlcyB0dXJuIERhY1N3aW5nPSVzLCBkYWNTd2luZ0x2bD0weCV4XG4iLCAgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGJEYWNTd2luZ09uKT8gIk9OIjoiT0ZGIiksIGRhY1N3aW5nTHZsKSk7CglwQ29leERtLT5iQ3VyRGFjU3dpbmdPbiA9IGJEYWNTd2luZ09uOwoJcENvZXhEbS0+Y3VyRGFjU3dpbmdMdmwgPSBkYWNTd2luZ0x2bDsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlRGFjU3dpbmdPbj0lZCwgcHJlRGFjU3dpbmdMdmw9MHgleCwgYkN1ckRhY1N3aW5nT249JWQsIGN1ckRhY1N3aW5nTHZsPTB4JXhcbiIsIAoJCQlwQ29leERtLT5iUHJlRGFjU3dpbmdPbiwgcENvZXhEbS0+cHJlRGFjU3dpbmdMdmwsCgkJCXBDb2V4RG0tPmJDdXJEYWNTd2luZ09uLCBwQ29leERtLT5jdXJEYWNTd2luZ0x2bCkpOwoKCQlpZiggKHBDb2V4RG0tPmJQcmVEYWNTd2luZ09uID09IHBDb2V4RG0tPmJDdXJEYWNTd2luZ09uKSAmJgoJCQkocENvZXhEbS0+cHJlRGFjU3dpbmdMdmwgPT0gcENvZXhEbS0+Y3VyRGFjU3dpbmdMdmwpICkKCQkJcmV0dXJuOwoJfQoJbWRlbGF5KDMwKTsKCWhhbGJ0Yzg3MjNhMmFudF9TZXRTd0Z1bGxUaW1lRGFjU3dpbmcocEJ0Q29leGlzdCwgYkRhY1N3aW5nT24sIGRhY1N3aW5nTHZsKTsKCglwQ29leERtLT5iUHJlRGFjU3dpbmdPbiA9IHBDb2V4RG0tPmJDdXJEYWNTd2luZ09uOwoJcENvZXhEbS0+cHJlRGFjU3dpbmdMdmwgPSBwQ29leERtLT5jdXJEYWNTd2luZ0x2bDsKfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfU2V0QWRjQmFja09mZigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliQWRjQmFja09mZgoJKQp7CglpZihiQWRjQmFja09mZikKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgQkIgQmFja09mZiBMZXZlbCBPbiFcbiIpKTsKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHhjMDQsMHgzYTA3NjExKTsKCX0KCWVsc2UKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgQkIgQmFja09mZiBMZXZlbCBPZmYhXG4iKSk7CQkKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHhjMDQsMHgzYTA1NjExKTsKCX0KfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JQk9PTEVBTgkJCWJBZGNCYWNrT2ZmCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgdHVybiBBZGNCYWNrT2ZmID0gJXNcbiIsICAKCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksICgoYkFkY0JhY2tPZmYpPyAiT04iOiJPRkYiKSkpOwoJcENvZXhEbS0+YkN1ckFkY0JhY2tPZmYgPSBiQWRjQmFja09mZjsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlQWRjQmFja09mZj0lZCwgYkN1ckFkY0JhY2tPZmY9JWRcbiIsIAoJCQlwQ29leERtLT5iUHJlQWRjQmFja09mZiwgcENvZXhEbS0+YkN1ckFkY0JhY2tPZmYpKTsKCgkJaWYocENvZXhEbS0+YlByZUFkY0JhY2tPZmYgPT0gcENvZXhEbS0+YkN1ckFkY0JhY2tPZmYpIAoJCQlyZXR1cm47Cgl9CgloYWxidGM4NzIzYTJhbnRfU2V0QWRjQmFja09mZihwQnRDb2V4aXN0LCBwQ29leERtLT5iQ3VyQWRjQmFja09mZik7CgoJcENvZXhEbS0+YlByZUFkY0JhY2tPZmYgPSBwQ29leERtLT5iQ3VyQWRjQmFja09mZjsKfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfU2V0QWdjVGFibGUoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJYkFnY1RhYmxlRW4KCSkKewoJdTFCeXRlCQlyc3NpQWRqdXN0VmFsPTA7CgoJaWYoYkFnY1RhYmxlRW4pCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIEFnYyBUYWJsZSBPbiFcbiIpKTsKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHhjNzgsMHg0ZTFjMDAwMSk7CgkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4Yzc4LDB4NGQxZDAwMDEpOwoJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweGM3OCwweDRjMWUwMDAxKTsKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHhjNzgsMHg0YjFmMDAwMSk7CgkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4Yzc4LDB4NGEyMDAwMDEpOwoJCQoJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDEyLCAweGZmZmZmLCAweGRjMDAwKTsKCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgxMiwgMHhmZmZmZiwgMHg5MDAwMCk7CgkJcEJ0Q29leGlzdC0+YnRjX3NldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4MTIsIDB4ZmZmZmYsIDB4NTEwMDApOwoJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDEyLCAweGZmZmZmLCAweDEyMDAwKTsKCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgxYSwgMHhmZmZmZiwgMHgwMDM1NSk7CgkJCgkJcnNzaUFkanVzdFZhbCA9IDY7Cgl9CgllbHNlCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIEFnYyBUYWJsZSBPZmYhXG4iKSk7CgkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4Yzc4LDB4NjQxYzAwMDEpOwoJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweGM3OCwweDYzMWQwMDAxKTsKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHhjNzgsMHg2MjFlMDAwMSk7CgkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4Yzc4LDB4NjExZjAwMDEpOwoJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweGM3OCwweDYwMjAwMDAxKTsKCgkJcEJ0Q29leGlzdC0+YnRjX3NldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4MTIsIDB4ZmZmZmYsIDB4MzIwMDApOwoJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDEyLCAweGZmZmZmLCAweDcxMDAwKTsKCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgxMiwgMHhmZmZmZiwgMHhiMDAwMCk7CgkJcEJ0Q29leGlzdC0+YnRjX3NldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4MTIsIDB4ZmZmZmYsIDB4ZmMwMDApOwoJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDFhLCAweGZmZmZmLCAweDMwMzU1KTsKCX0KCgkvLyBzZXQgcnNzaUFkanVzdFZhbCBmb3Igd2lmaSBtb2R1bGUuCglwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfVTFfUlNTSV9BREpfVkFMX0ZPUl9BR0NfVEFCTEVfT04sICZyc3NpQWRqdXN0VmFsKTsKfQoKClZPSUQKaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCglJTglCT09MRUFOCQkJYkFnY1RhYmxlRW4KCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLCAoIltCVENvZXhdLCAlcyAlcyBBZ2MgVGFibGVcbiIsICAKCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksICgoYkFnY1RhYmxlRW4pPyAiRW5hYmxlIjoiRGlzYWJsZSIpKSk7CglwQ29leERtLT5iQ3VyQWdjVGFibGVFbiA9IGJBZ2NUYWJsZUVuOwoKCWlmKCFiRm9yY2VFeGVjKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVBZ2NUYWJsZUVuPSVkLCBiQ3VyQWdjVGFibGVFbj0lZFxuIiwgCgkJCXBDb2V4RG0tPmJQcmVBZ2NUYWJsZUVuLCBwQ29leERtLT5iQ3VyQWdjVGFibGVFbikpOwoKCQlpZihwQ29leERtLT5iUHJlQWdjVGFibGVFbiA9PSBwQ29leERtLT5iQ3VyQWdjVGFibGVFbikgCgkJCXJldHVybjsKCX0KCWhhbGJ0Yzg3MjNhMmFudF9TZXRBZ2NUYWJsZShwQnRDb2V4aXN0LCBiQWdjVGFibGVFbik7CgoJcENvZXhEbS0+YlByZUFnY1RhYmxlRW4gPSBwQ29leERtLT5iQ3VyQWdjVGFibGVFbjsKfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfU2V0Q29leFRhYmxlKAoJSU4JUEJUQ19DT0VYSVNUCXBCdENvZXhpc3QsCglJTgl1NEJ5dGUJCXZhbDB4NmMwLAoJSU4JdTRCeXRlCQl2YWwweDZjOCwKCUlOCXUxQnl0ZQkJdmFsMHg2Y2MKCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIHNldCBjb2V4IHRhYmxlLCBzZXQgMHg2YzA9MHgleFxuIiwgdmFsMHg2YzApKTsKCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweDZjMCwgdmFsMHg2YzApOwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBzZXQgY29leCB0YWJsZSwgc2V0IDB4NmM4PTB4JXhcbiIsIHZhbDB4NmM4KSk7CglwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHg2YzgsIHZhbDB4NmM4KTsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgc2V0IGNvZXggdGFibGUsIHNldCAweDZjYz0weCV4XG4iLCB2YWwweDZjYykpOwoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NmNjLCB2YWwweDZjYyk7Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X0NvZXhUYWJsZSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JdTRCeXRlCQkJdmFsMHg2YzAsCglJTgl1NEJ5dGUJCQl2YWwweDZjOCwKCUlOCXUxQnl0ZQkJCXZhbDB4NmNjCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgd3JpdGUgQ29leCBUYWJsZSAweDZjMD0weCV4LCAweDZjOD0weCV4LCAweDZjYz0weCV4XG4iLCAKCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksIHZhbDB4NmMwLCB2YWwweDZjOCwgdmFsMHg2Y2MpKTsKCXBDb2V4RG0tPmN1clZhbDB4NmMwID0gdmFsMHg2YzA7CglwQ29leERtLT5jdXJWYWwweDZjOCA9IHZhbDB4NmM4OwoJcENvZXhEbS0+Y3VyVmFsMHg2Y2MgPSB2YWwweDZjYzsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBwcmVWYWwweDZjMD0weCV4LCBwcmVWYWwweDZjOD0weCV4LCBwcmVWYWwweDZjYz0weCV4ICEhXG4iLCAKCQkJcENvZXhEbS0+cHJlVmFsMHg2YzAsIHBDb2V4RG0tPnByZVZhbDB4NmM4LCBwQ29leERtLT5wcmVWYWwweDZjYykpOwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIGN1clZhbDB4NmMwPTB4JXgsIGN1clZhbDB4NmM4PTB4JXgsIGN1clZhbDB4NmNjPTB4JXggISFcbiIsIAoJCQlwQ29leERtLT5jdXJWYWwweDZjMCwgcENvZXhEbS0+Y3VyVmFsMHg2YzgsIHBDb2V4RG0tPmN1clZhbDB4NmNjKSk7CgkKCQlpZiggKHBDb2V4RG0tPnByZVZhbDB4NmMwID09IHBDb2V4RG0tPmN1clZhbDB4NmMwKSAmJgoJCQkocENvZXhEbS0+cHJlVmFsMHg2YzggPT0gcENvZXhEbS0+Y3VyVmFsMHg2YzgpICYmCgkJCShwQ29leERtLT5wcmVWYWwweDZjYyA9PSBwQ29leERtLT5jdXJWYWwweDZjYykgKQoJCQlyZXR1cm47Cgl9CgloYWxidGM4NzIzYTJhbnRfU2V0Q29leFRhYmxlKHBCdENvZXhpc3QsIHZhbDB4NmMwLCB2YWwweDZjOCwgdmFsMHg2Y2MpOwoKCXBDb2V4RG0tPnByZVZhbDB4NmMwID0gcENvZXhEbS0+Y3VyVmFsMHg2YzA7CglwQ29leERtLT5wcmVWYWwweDZjOCA9IHBDb2V4RG0tPmN1clZhbDB4NmM4OwoJcENvZXhEbS0+cHJlVmFsMHg2Y2MgPSBwQ29leERtLT5jdXJWYWwweDZjYzsKfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfU2V0RndJZ25vcmVXbGFuQWN0KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJFbmFibGUKCSkKewoJdTFCeXRlCQkJSDJDX1BhcmFtZXRlclsxXSA9ezB9OwoJCQoJaWYoYkVuYWJsZSkKCXsKCQlIMkNfUGFyYW1ldGVyWzBdIHw9IEJJVDA7CQkvLyBmdW5jdGlvbiBlbmFibGUKCX0KCQoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIHNldCBGVyBmb3IgQlQgSWdub3JlIFdsYW5fQWN0LCBGVyB3cml0ZSAweDI1PTB4JXhcbiIsIAoJCUgyQ19QYXJhbWV0ZXJbMF0pKTsKCglwQnRDb2V4aXN0LT5idGNfZmlsbF9oMmMocEJ0Q29leGlzdCwgMHgyNSwgMSwgSDJDX1BhcmFtZXRlcik7CQp9CgpWT0lECmhhbGJ0Yzg3MjNhMmFudF9JZ25vcmVXbGFuQWN0KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCglJTglCT09MRUFOCQkJYkVuYWJsZQoJKQp7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIHR1cm4gSWdub3JlIFdsYW5BY3QgJXNcbiIsIAoJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgKGJFbmFibGU/ICJPTiI6Ik9GRiIpKSk7CglwQ29leERtLT5iQ3VySWdub3JlV2xhbkFjdCA9IGJFbmFibGU7CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZUlnbm9yZVdsYW5BY3QgPSAlZCwgYkN1cklnbm9yZVdsYW5BY3QgPSAlZCEhXG4iLCAKCQkJcENvZXhEbS0+YlByZUlnbm9yZVdsYW5BY3QsIHBDb2V4RG0tPmJDdXJJZ25vcmVXbGFuQWN0KSk7CgoJCWlmKHBDb2V4RG0tPmJQcmVJZ25vcmVXbGFuQWN0ID09IHBDb2V4RG0tPmJDdXJJZ25vcmVXbGFuQWN0KQoJCQlyZXR1cm47Cgl9CgloYWxidGM4NzIzYTJhbnRfU2V0RndJZ25vcmVXbGFuQWN0KHBCdENvZXhpc3QsIGJFbmFibGUpOwoKCXBDb2V4RG0tPmJQcmVJZ25vcmVXbGFuQWN0ID0gcENvZXhEbS0+YkN1cklnbm9yZVdsYW5BY3Q7Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X1NldEZ3UHN0ZG1hKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJYnl0ZTEsCglJTgl1MUJ5dGUJCQlieXRlMiwKCUlOCXUxQnl0ZQkJCWJ5dGUzLAoJSU4JdTFCeXRlCQkJYnl0ZTQsCglJTgl1MUJ5dGUJCQlieXRlNQoJKQp7Cgl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzVdID17MH07CgoJSDJDX1BhcmFtZXRlclswXSA9IGJ5dGUxOwkKCUgyQ19QYXJhbWV0ZXJbMV0gPSBieXRlMjsJCglIMkNfUGFyYW1ldGVyWzJdID0gYnl0ZTM7CglIMkNfUGFyYW1ldGVyWzNdID0gYnl0ZTQ7CglIMkNfUGFyYW1ldGVyWzRdID0gYnl0ZTU7CgoJcENvZXhEbS0+cHNUZG1hUGFyYVswXSA9IGJ5dGUxOwoJcENvZXhEbS0+cHNUZG1hUGFyYVsxXSA9IGJ5dGUyOwoJcENvZXhEbS0+cHNUZG1hUGFyYVsyXSA9IGJ5dGUzOwoJcENvZXhEbS0+cHNUZG1hUGFyYVszXSA9IGJ5dGU0OwoJcENvZXhEbS0+cHNUZG1hUGFyYVs0XSA9IGJ5dGU1OwoJCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgRlcgd3JpdGUgMHgzYSg1Ynl0ZXMpPTB4JXglMDh4XG4iLCAKCQlIMkNfUGFyYW1ldGVyWzBdLCAKCQlIMkNfUGFyYW1ldGVyWzFdPDwyNHxIMkNfUGFyYW1ldGVyWzJdPDwxNnxIMkNfUGFyYW1ldGVyWzNdPDw4fEgyQ19QYXJhbWV0ZXJbNF0pKTsKCglwQnRDb2V4aXN0LT5idGNfZmlsbF9oMmMocEJ0Q29leGlzdCwgMHgzYSwgNSwgSDJDX1BhcmFtZXRlcik7Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X1BzVGRtYSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JQk9PTEVBTgkJCWJUdXJuT24sCglJTgl1MUJ5dGUJCQl0eXBlCgkpCnsKCXU0Qnl0ZQlidFR4UnhDbnQ9MDsKCglidFR4UnhDbnQgPSBwQ29leFN0YS0+aGlnaFByaW9yaXR5VHgrcENvZXhTdGEtPmhpZ2hQcmlvcml0eVJ4KwoJCQkJcENvZXhTdGEtPmxvd1ByaW9yaXR5VHgrcENvZXhTdGEtPmxvd1ByaW9yaXR5Ung7CgoJaWYoYnRUeFJ4Q250ID4gMzAwMCkKCXsJCQoJCXBDb2V4RG0tPmJDdXJQc1RkbWFPbiA9IHRydWU7CgkJcENvZXhEbS0+Y3VyUHNUZG1hID0gODsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sIHR1cm4gT04gUFMgVERNQSwgdHlwZT0lZCBmb3IgQlQgdHgvcnggY291bnRlcnM9JWQoPjMwMDApXG4iLCAKCQkJcENvZXhEbS0+Y3VyUHNUZG1hLCBidFR4UnhDbnQpKTsKCX0KCWVsc2UKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIHR1cm4gJXMgUFMgVERNQSwgdHlwZT0lZFxuIiwgCgkJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgKGJUdXJuT24/ICJPTiI6Ik9GRiIpLCB0eXBlKSk7CQkKCQlwQ29leERtLT5iQ3VyUHNUZG1hT24gPSBiVHVybk9uOwoJCXBDb2V4RG0tPmN1clBzVGRtYSA9IHR5cGU7Cgl9CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZVBzVGRtYU9uID0gJWQsIGJDdXJQc1RkbWFPbiA9ICVkISFcbiIsIAoJCQlwQ29leERtLT5iUHJlUHNUZG1hT24sIHBDb2V4RG0tPmJDdXJQc1RkbWFPbikpOwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIHByZVBzVGRtYSA9ICVkLCBjdXJQc1RkbWEgPSAlZCEhXG4iLCAKCQkJcENvZXhEbS0+cHJlUHNUZG1hLCBwQ29leERtLT5jdXJQc1RkbWEpKTsKCgkJaWYoIChwQ29leERtLT5iUHJlUHNUZG1hT24gPT0gcENvZXhEbS0+YkN1clBzVGRtYU9uKSAmJgoJCQkocENvZXhEbS0+cHJlUHNUZG1hID09IHBDb2V4RG0tPmN1clBzVGRtYSkgKQoJCQlyZXR1cm47Cgl9CQoJaWYocENvZXhEbS0+YkN1clBzVGRtYU9uKQoJewoJCXN3aXRjaChwQ29leERtLT5jdXJQc1RkbWEpCgkJewoJCQljYXNlIDE6CgkJCWRlZmF1bHQ6CgkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHgxYSwgMHgxYSwgMHhlMSwgMHg5OCk7CgkJCQlicmVhazsKCQkJY2FzZSAyOgoJCQkJaGFsYnRjODcyM2EyYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4ZTMsIDB4MTIsIDB4MTIsIDB4ZTEsIDB4OTgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgMzoKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweGEsIDB4YSwgMHhlMSwgMHg5OCk7CgkJCQlicmVhazsKCQkJY2FzZSA0OgoJCQkJaGFsYnRjODcyM2EyYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4YTMsIDB4NSwgMHg1LCAweGUxLCAweDgwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDU6CgkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHgxYSwgMHgxYSwgMHg2MCwgMHg5OCk7CgkJCQlicmVhazsKCQkJY2FzZSA2OgoJCQkJaGFsYnRjODcyM2EyYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4ZTMsIDB4MTIsIDB4MTIsIDB4NjAsIDB4OTgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgNzoKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweGEsIDB4YSwgMHg2MCwgMHg5OCk7CgkJCQlicmVhazsKCQkJY2FzZSA4OiAKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGEzLCAweDUsIDB4NSwgMHg2MCwgMHg4MCk7CgkJCQlicmVhazsKCQkJY2FzZSA5OiAKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweDFhLCAweDFhLCAweGUxLCAweDk4KTsKCQkJCWJyZWFrOwoJCQljYXNlIDEwOgkKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweDEyLCAweDEyLCAweGUxLCAweDk4KTsKCQkJCWJyZWFrOwoJCQljYXNlIDExOgkKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweGEsIDB4YSwgMHhlMSwgMHg5OCk7CgkJCQlicmVhazsKCQkJY2FzZSAxMjoKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweDUsIDB4NSwgMHhlMSwgMHg5OCk7CgkJCQlicmVhazsKCQkJY2FzZSAxMzoKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweDFhLCAweDFhLCAweDYwLCAweDk4KTsKCQkJCWJyZWFrOwoJCQljYXNlIDE0OgoJCQkJaGFsYnRjODcyM2EyYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4ZTMsIDB4MTIsIDB4MTIsIDB4NjAsIDB4OTgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgMTU6CgkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHhhLCAweGEsIDB4NjAsIDB4OTgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgMTY6CgkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHg1LCAweDUsIDB4NjAsIDB4OTgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgMTc6CgkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhhMywgMHgyZiwgMHgyZiwgMHg2MCwgMHg4MCk7CgkJCQlicmVhazsKCQkJY2FzZSAxODoKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweDUsIDB4NSwgMHhlMSwgMHg5OCk7CgkJCQlicmVhazsJCQkKCQkJY2FzZSAxOToKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweDI1LCAweDI1LCAweGUxLCAweDk4KTsKCQkJCWJyZWFrOwoJCQljYXNlIDIwOgoJCQkJaGFsYnRjODcyM2EyYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4ZTMsIDB4MjUsIDB4MjUsIDB4NjAsIDB4OTgpOwoJCQkJYnJlYWs7CgkJfQoJfQoJZWxzZQoJewoJCS8vIGRpc2FibGUgUFMgdGRtYQoJCXN3aXRjaChwQ29leERtLT5jdXJQc1RkbWEpCgkJewoJCQljYXNlIDA6CgkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHgwLCAweDAsIDB4MCwgMHg4LCAweDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgMToKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCk7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDAsIDB4MCwgMHgwLCAweDgsIDB4MCk7CgkJCQlicmVhazsKCQl9Cgl9CgoJLy8gdXBkYXRlIHByZSBzdGF0ZQoJcENvZXhEbS0+YlByZVBzVGRtYU9uID0gcENvZXhEbS0+YkN1clBzVGRtYU9uOwoJcENvZXhEbS0+cHJlUHNUZG1hID0gcENvZXhEbS0+Y3VyUHNUZG1hOwp9CgoKVk9JRApoYWxidGM4NzIzYTJhbnRfQ29leEFsbE9mZigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CgkvLyBmdyBhbGwgb2ZmCgloYWxidGM4NzIzYTJhbnRfSWdub3JlV2xhbkFjdChwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOwoJaGFsYnRjODcyM2EyYW50X0Z3RGFjU3dpbmdMdmwocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4MjApOwoJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgoJLy8gc3cgYWxsIG9mZgoJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJaGFsYnRjODcyM2EyYW50X0xvd1BlbmFsdHlSYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJaGFsYnRjODcyM2EyYW50X1JmU2hyaW5rKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCgkvLyBodyBhbGwgb2ZmCgloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X0luaXRDb2V4RG0oCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJLy8gZm9yY2UgdG8gcmVzZXQgY29leCBtZWNoYW5pc20KCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBGQUxTRSwgMCk7CgloYWxidGM4NzIzYTJhbnRfRndEYWNTd2luZ0x2bChwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCAweDIwKTsKCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBGQUxTRSk7CgloYWxidGM4NzIzYTJhbnRfSWdub3JlV2xhbkFjdChwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBGQUxTRSk7CgoJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEZBTFNFKTsKCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEZBTFNFKTsKCWhhbGJ0Yzg3MjNhMmFudF9Mb3dQZW5hbHR5UmEocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgRkFMU0UpOwoJaGFsYnRjODcyM2EyYW50X1JmU2hyaW5rKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEZBTFNFKTsKCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBGQUxTRSwgMHhjMCk7Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X0J0SW5xdWlyeVBhZ2UoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJQk9PTEVBTgliTG93UHdyRGlzYWJsZT10cnVlOwoJCglwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQUNUX0RJU0FCTEVfTE9XX1BPV0VSLCAmYkxvd1B3ckRpc2FibGUpOwoKCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCWhhbGJ0Yzg3MjNhMmFudF9JZ25vcmVXbGFuQWN0KHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA4KTsKfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfQnRFbmFibGVBY3Rpb24oCglJTiAJUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCUJPT0xFQU4JCWJXaWZpQ29ubmVjdGVkPUZBTFNFOwoJCgkvLyBIZXJlIHdlIG5lZWQgdG8gcmVzZW5kIHNvbWUgd2lmaSBpbmZvIHRvIEJUCgkvLyBiZWNhdXNlIGJ0IGlzIHJlc2V0IGFuZCBsb3NzIG9mIHRoZSBpbmZvLgkJCQkJCQoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELCAmYldpZmlDb25uZWN0ZWQpOwoJaWYoYldpZmlDb25uZWN0ZWQpCgl7CgkJaGFsYnRjODcyM2EyYW50X0luZGljYXRlV2lmaUNobmxCd0luZm8ocEJ0Q29leGlzdCwgQlRDX01FRElBX0NPTk5FQ1QpOwoJfQoJZWxzZQoJewoJCWhhbGJ0Yzg3MjNhMmFudF9JbmRpY2F0ZVdpZmlDaG5sQndJbmZvKHBCdENvZXhpc3QsIEJUQ19NRURJQV9ESVNDT05ORUNUKTsKCX0KCgloYWxidGM4NzIzYTJhbnRfSWdub3JlV2xhbkFjdChwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBGQUxTRSk7Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X01vbml0b3JCdEN0cigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7Cgl1NEJ5dGUgCQkJcmVnSFBUeFJ4LCByZWdMUFR4UngsIHU0VG1wOwoJdTRCeXRlCQkJcmVnSFBUeD0wLCByZWdIUFJ4PTAsIHJlZ0xQVHg9MCwgcmVnTFBSeD0wOwoJdTFCeXRlCQkJdTFUbXA7CgkKCXJlZ0hQVHhSeCA9IDB4NzcwOwoJcmVnTFBUeFJ4ID0gMHg3NzQ7CgoJdTRUbXAgPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCByZWdIUFR4UngpOwoJcmVnSFBUeCA9IHU0VG1wICYgTUFTS0xXT1JEOwoJcmVnSFBSeCA9ICh1NFRtcCAmIE1BU0tIV09SRCk+PjE2OwoKCXU0VG1wID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgcmVnTFBUeFJ4KTsKCXJlZ0xQVHggPSB1NFRtcCAmIE1BU0tMV09SRDsKCXJlZ0xQUnggPSAodTRUbXAgJiBNQVNLSFdPUkQpPj4xNjsKCQkKCXBDb2V4U3RhLT5oaWdoUHJpb3JpdHlUeCA9IHJlZ0hQVHg7CglwQ29leFN0YS0+aGlnaFByaW9yaXR5UnggPSByZWdIUFJ4OwoJcENvZXhTdGEtPmxvd1ByaW9yaXR5VHggPSByZWdMUFR4OwoJcENvZXhTdGEtPmxvd1ByaW9yaXR5UnggPSByZWdMUFJ4OwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLCAoIltCVENvZXhdLCBIaWdoIFByaW9yaXR5IFR4L1J4IChyZWcgMHgleCk9MHgleCglZCkvMHgleCglZClcbiIsIAoJCXJlZ0hQVHhSeCwgcmVnSFBUeCwgcmVnSFBUeCwgcmVnSFBSeCwgcmVnSFBSeCkpOwoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIExvdyBQcmlvcml0eSBUeC9SeCAocmVnIDB4JXgpPTB4JXgoJWQpLzB4JXgoJWQpXG4iLCAKCQlyZWdMUFR4UngsIHJlZ0xQVHgsIHJlZ0xQVHgsIHJlZ0xQUngsIHJlZ0xQUngpKTsKCgkvLyByZXNldCBjb3VudGVyCglwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg3NmUsIDB4Yyk7Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X01vbml0b3JCdEVuYWJsZURpc2FibGUoCglJTiAJUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCXN0YXRpYyBCT09MRUFOCWJQcmVCdERpc2FibGVkPUZBTFNFOwoJc3RhdGljIHU0Qnl0ZQlidERpc2FibGVDbnQ9MDsKCUJPT0xFQU4JCQliQnRBY3RpdmU9dHJ1ZSwgYkJ0RGlzYWJsZWQ9RkFMU0U7CgoJLy8gVGhpcyBmdW5jdGlvbiBjaGVjayBpZiBidCBpcyBkaXNhYmxlZAoKCWlmKAlwQ29leFN0YS0+aGlnaFByaW9yaXR5VHggPT0gMCAmJgoJCXBDb2V4U3RhLT5oaWdoUHJpb3JpdHlSeCA9PSAwICYmCgkJcENvZXhTdGEtPmxvd1ByaW9yaXR5VHggPT0gMCAmJgoJCXBDb2V4U3RhLT5sb3dQcmlvcml0eVJ4ID09IDApCgl7CgkJYkJ0QWN0aXZlID0gRkFMU0U7Cgl9CglpZigJcENvZXhTdGEtPmhpZ2hQcmlvcml0eVR4ID09IDB4ZmZmZiAmJgoJCXBDb2V4U3RhLT5oaWdoUHJpb3JpdHlSeCA9PSAweGZmZmYgJiYKCQlwQ29leFN0YS0+bG93UHJpb3JpdHlUeCA9PSAweGZmZmYgJiYKCQlwQ29leFN0YS0+bG93UHJpb3JpdHlSeCA9PSAweGZmZmYpCgl7CgkJYkJ0QWN0aXZlID0gRkFMU0U7Cgl9CglpZihiQnRBY3RpdmUpCgl7CgkJYnREaXNhYmxlQ250ID0gMDsKCQliQnREaXNhYmxlZCA9IEZBTFNFOwoJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9CTF9CVF9ESVNBQkxFLCAmYkJ0RGlzYWJsZWQpOwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLCAoIltCVENvZXhdLCBCVCBpcyBlbmFibGVkICEhXG4iKSk7Cgl9CgllbHNlCgl7CgkJYnREaXNhYmxlQ250Kys7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIGJ0IGFsbCBjb3VudGVycz0wLCAlZCB0aW1lcyEhXG4iLCAKCQkJCWJ0RGlzYWJsZUNudCkpOwoJCWlmKGJ0RGlzYWJsZUNudCA+PSAyKQoJCXsKCQkJYkJ0RGlzYWJsZWQgPSB0cnVlOwoJCQlwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQkxfQlRfRElTQUJMRSwgJmJCdERpc2FibGVkKTsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIEJUIGlzIGRpc2FibGVkICEhXG4iKSk7CgkJfQoJfQoJaWYoYlByZUJ0RGlzYWJsZWQgIT0gYkJ0RGlzYWJsZWQpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIEJUIGlzIGZyb20gJXMgdG8gJXMhIVxuIiwgCgkJCShiUHJlQnREaXNhYmxlZCA/ICJkaXNhYmxlZCI6ImVuYWJsZWQiKSwgCgkJCShiQnREaXNhYmxlZCA/ICJkaXNhYmxlZCI6ImVuYWJsZWQiKSkpOwoJCWJQcmVCdERpc2FibGVkID0gYkJ0RGlzYWJsZWQ7CgkJaWYoIWJCdERpc2FibGVkKQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X0J0RW5hYmxlQWN0aW9uKHBCdENvZXhpc3QpOwoJCX0KCX0KfQoKQk9PTEVBTgpoYWxidGM4NzIzYTJhbnRfSXNDb21tb25BY3Rpb24oCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJUEJUQ19TVEFDS19JTkZPCQlwU3RhY2tJbmZvPSZwQnRDb2V4aXN0LT5zdGFja19pbmZvOwoJQk9PTEVBTgkJCWJDb21tb249RkFMU0UsIGJXaWZpQ29ubmVjdGVkPUZBTFNFOwoJQk9PTEVBTgkJCWJMb3dQd3JEaXNhYmxlPUZBTFNFOwoKCWlmKCFwU3RhY2tJbmZvLT5iQnRMaW5rRXhpc3QpCgl7CgkJYkxvd1B3ckRpc2FibGUgPSBGQUxTRTsKCQlwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQUNUX0RJU0FCTEVfTE9XX1BPV0VSLCAmYkxvd1B3ckRpc2FibGUpOwoJfQoJZWxzZQoJewoJCWJMb3dQd3JEaXNhYmxlID0gdHJ1ZTsKCQlwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQUNUX0RJU0FCTEVfTE9XX1BPV0VSLCAmYkxvd1B3ckRpc2FibGUpOwoJfQoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJmJXaWZpQ29ubmVjdGVkKTsKCglpZihoYWxidGM4NzIzYTJhbnRfSXNXaWZpSWRsZShwQnRDb2V4aXN0KSAmJiAKCQlCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19JRExFID09IHBDb2V4RG0tPmJ0U3RhdHVzKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgV2lmaSBpZGxlICsgQnQgaWRsZSEhXG4iKSk7CgkJCQoJCWhhbGJ0Yzg3MjNhMmFudF9Mb3dQZW5hbHR5UmEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfUmZTaHJpbmsocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CgoJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAwKTsKCQloYWxidGM4NzIzYTJhbnRfRndEYWNTd2luZ0x2bChwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMHgyMCk7CgkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgoJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CgoJCWJDb21tb24gPSB0cnVlOwoJfQoJZWxzZSBpZighaGFsYnRjODcyM2EyYW50X0lzV2lmaUlkbGUocEJ0Q29leGlzdCkgJiYgCgkJCShCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19JRExFID09IHBDb2V4RG0tPmJ0U3RhdHVzKSApCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBXaWZpIG5vbi1pZGxlICsgQlQgaWRsZSEhXG4iKSk7CgoJCWhhbGJ0Yzg3MjNhMmFudF9Mb3dQZW5hbHR5UmEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCWhhbGJ0Yzg3MjNhMmFudF9SZlNocmluayhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCgkJaGFsYnRjODcyM2EyYW50X0lnbm9yZVdsYW5BY3QocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CgkJaGFsYnRjODcyM2EyYW50X0Z3RGFjU3dpbmdMdmwocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4MjApOwoJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgoJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CgoJCWJDb21tb24gPSB0cnVlOwoJfQoJZWxzZSBpZihoYWxidGM4NzIzYTJhbnRfSXNXaWZpSWRsZShwQnRDb2V4aXN0KSAmJiAKCQkoQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gcENvZXhEbS0+YnRTdGF0dXMpICkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFdpZmkgaWRsZSArIEJ0IGNvbm5lY3RlZCBpZGxlISFcbiIpKTsKCQkKCQloYWxidGM4NzIzYTJhbnRfTG93UGVuYWx0eVJhKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQloYWxidGM4NzIzYTJhbnRfUmZTaHJpbmsocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCgkJaGFsYnRjODcyM2EyYW50X0lnbm9yZVdsYW5BY3QocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CgkJaGFsYnRjODcyM2EyYW50X0Z3RGFjU3dpbmdMdmwocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4MjApOwoJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoKCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOwoKCQliQ29tbW9uID0gdHJ1ZTsKCX0KCWVsc2UgaWYoIWhhbGJ0Yzg3MjNhMmFudF9Jc1dpZmlJZGxlKHBCdENvZXhpc3QpICYmIAoJCShCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cykgKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgV2lmaSBub24taWRsZSArIEJ0IGNvbm5lY3RlZCBpZGxlISFcbiIpKTsKCgkJaGFsYnRjODcyM2EyYW50X0xvd1BlbmFsdHlSYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJaGFsYnRjODcyM2EyYW50X1JmU2hyaW5rKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CgoJCWhhbGJ0Yzg3MjNhMmFudF9JZ25vcmVXbGFuQWN0KHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOwoJCWhhbGJ0Yzg3MjNhMmFudF9Gd0RhY1N3aW5nTHZsKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDIwKTsKCQloYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCgkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCgkJYkNvbW1vbiA9IHRydWU7Cgl9CgllbHNlIGlmKGhhbGJ0Yzg3MjNhMmFudF9Jc1dpZmlJZGxlKHBCdENvZXhpc3QpICYmIAoJCQkoQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfTk9OX0lETEUgPT0gcENvZXhEbS0+YnRTdGF0dXMpICkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFdpZmkgaWRsZSArIEJUIG5vbi1pZGxlISFcbiIpKTsKCQkKCQloYWxidGM4NzIzYTJhbnRfTG93UGVuYWx0eVJhKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQloYWxidGM4NzIzYTJhbnRfUmZTaHJpbmsocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCgkJaGFsYnRjODcyM2EyYW50X0lnbm9yZVdsYW5BY3QocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CgkJaGFsYnRjODcyM2EyYW50X0Z3RGFjU3dpbmdMdmwocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4MjApOwoJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoKCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOwoJCQoJCWJDb21tb24gPSB0cnVlOwoJfQoJZWxzZQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgV2lmaSBub24taWRsZSArIEJUIG5vbi1pZGxlISFcbiIpKTsKCQloYWxidGM4NzIzYTJhbnRfTG93UGVuYWx0eVJhKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQloYWxidGM4NzIzYTJhbnRfUmZTaHJpbmsocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCWhhbGJ0Yzg3MjNhMmFudF9JZ25vcmVXbGFuQWN0KHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJaGFsYnRjODcyM2EyYW50X0Z3RGFjU3dpbmdMdmwocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4MjApOwoJCQoJCWJDb21tb24gPSBGQUxTRTsKCX0KCQoJcmV0dXJuIGJDb21tb247Cn0KVk9JRApoYWxidGM4NzIzYTJhbnRfVGRtYUR1cmF0aW9uQWRqdXN0KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJTY29IaWQsCglJTglCT09MRUFOCQkJYlR4UGF1c2UsCglJTgl1MUJ5dGUJCQltYXhJbnRlcnZhbAoJKQp7CglzdGF0aWMgczRCeXRlCQl1cCxkbixtLG4sV2FpdENvdW50OwoJczRCeXRlCQkJcmVzdWx0OyAgIC8vMDogbm8gY2hhbmdlLCArMTogaW5jcmVhc2UgV2lGaSBkdXJhdGlvbiwgLTE6IGRlY3JlYXNlIFdpRmkgZHVyYXRpb24KCXUxQnl0ZQkJCXJldHJ5Q291bnQ9MDsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sIFRkbWFEdXJhdGlvbkFkanVzdCgpXG4iKSk7CgoJaWYocENvZXhEbS0+YlJlc2V0VGRtYUFkanVzdCkKCXsKCQlwQ29leERtLT5iUmVzZXRUZG1hQWRqdXN0ID0gRkFMU0U7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgZmlyc3QgcnVuIFRkbWFEdXJhdGlvbkFkanVzdCgpISFcbiIpKTsKCQl7CgkJCWlmKGJTY29IaWQpCgkJCXsKCQkJCWlmKGJUeFBhdXNlKQoJCQkJewoJCQkJCWlmKG1heEludGVydmFsID09IDEpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMyk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEzOwkKCQkJCQl9CgkJCQkJZWxzZSBpZihtYXhJbnRlcnZhbCA9PSAyKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTQpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsJCgkJCQkJfQoJCQkJCWVsc2UgaWYobWF4SW50ZXJ2YWwgPT0gMykKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE1KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTU7CQoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwoJCQkJCX0KCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlpZihtYXhJbnRlcnZhbCA9PSAxKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDk7CQoJCQkJCX0KCQkJCQllbHNlIGlmKG1heEludGVydmFsID09IDIpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMCk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEwOwkKCQkJCQl9CgkJCQkJZWxzZSBpZihtYXhJbnRlcnZhbCA9PSAzKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlpZihiVHhQYXVzZSkKCQkJCXsKCQkJCQlpZihtYXhJbnRlcnZhbCA9PSAxKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDU7CQoJCQkJCX0KCQkJCQllbHNlIGlmKG1heEludGVydmFsID09IDIpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA2KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNjsJCgkJCQkJfQoJCQkJCWVsc2UgaWYobWF4SW50ZXJ2YWwgPT0gMykKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDcpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA3OwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA3KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNzsKCQkJCQl9CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJaWYobWF4SW50ZXJ2YWwgPT0gMSkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxOwkKCQkJCQl9CgkJCQkJZWxzZSBpZihtYXhJbnRlcnZhbCA9PSAyKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDI7CQoJCQkJCX0KCQkJCQllbHNlIGlmKG1heEludGVydmFsID09IDMpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMzsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMyk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDM7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCS8vPT09PT09PT09PT09CgkJdXAgPSAwOwoJCWRuID0gMDsKCQltID0gMTsKCQluPSAzOwoJCXJlc3VsdCA9IDA7CgkJV2FpdENvdW50ID0gMDsKCX0KCWVsc2UKCXsKCQkvL2FjY3F1aXJlIHRoZSBCVCBUUnggcmV0cnkgY291bnQgZnJvbSBCVF9JbmZvIGJ5dGUyCgkJcmV0cnlDb3VudCA9IHBDb2V4U3RhLT5idFJldHJ5Q250OwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIHJldHJ5Q291bnQgPSAlZFxuIiwgcmV0cnlDb3VudCkpOwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIHVwPSVkLCBkbj0lZCwgbT0lZCwgbj0lZCwgV2FpdENvdW50PSVkXG4iLCAKCQkJdXAsIGRuLCBtLCBuLCBXYWl0Q291bnQpKTsKCQlyZXN1bHQgPSAwOwoJCVdhaXRDb3VudCsrOyAKCQkgIAoJCWlmKHJldHJ5Q291bnQgPT0gMCkgIC8vIG5vIHJldHJ5IGluIHRoZSBsYXN0IDItc2Vjb25kIGR1cmF0aW9uCgkJewoJCQl1cCsrOwoJCQlkbi0tOwoKCQkJaWYgKGRuIDw9IDApCgkJCQlkbiA9IDA7CQkJCSAKCgkJCWlmKHVwID49IG4pCS8vIGlmILNzxPIgbiCt0zKs7SByZXRyeSBjb3VudKywMCwgq2i91bxlV2lGaSBkdXJhdGlvbgoJCQl7CgkJCQlXYWl0Q291bnQgPSAwOyAKCQkJCW4gPSAzOwoJCQkJdXAgPSAwOwoJCQkJZG4gPSAwOwoJCQkJcmVzdWx0ID0gMTsgCgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBJbmNyZWFzZSB3aWZpIGR1cmF0aW9uISFcbiIpKTsKCQkJfQoJCX0KCQllbHNlIGlmIChyZXRyeUNvdW50IDw9IDMpCS8vIDw9MyByZXRyeSBpbiB0aGUgbGFzdCAyLXNlY29uZCBkdXJhdGlvbgoJCXsKCQkJdXAtLTsgCgkJCWRuKys7CgoJCQlpZiAodXAgPD0gMCkKCQkJCXVwID0gMDsKCgkJCWlmIChkbiA9PSAyKQkvLyBpZiCzc8TyIDIgrdMyrO0gcmV0cnkgY291bnQ8IDMsIKtovdWvtldpRmkgZHVyYXRpb24KCQkJewoJCQkJaWYgKFdhaXRDb3VudCA8PSAyKQoJCQkJCW0rKzsgLy8gwdenS6RAqr2mYqjirdNsZXZlbKSkqNOmXgoJCQkJZWxzZQoJCQkJCW0gPSAxOwoKCQkJCWlmICggbSA+PSAyMCkgLy9tILPMpGqtyCA9IDIwICcgs8ykajEyMKztIHJlY2hlY2usT6dfvdW+4yBXaUZpIGR1cmF0aW9uLgoJCQkJCW0gPSAyMDsKCgkJCQluID0gMyptOwoJCQkJdXAgPSAwOwoJCQkJZG4gPSAwOwoJCQkJV2FpdENvdW50ID0gMDsKCQkJCXJlc3VsdCA9IC0xOyAKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIERlY3JlYXNlIHdpZmkgZHVyYXRpb24gZm9yIHJldHJ5Q291bnRlcjwzISFcbiIpKTsKCQkJfQoJCX0KCQllbHNlICAvL3JldHJ5IGNvdW50ID4gMywgpXWtbjGmuCByZXRyeSBjb3VudCA+IDMsIKtovdWvtldpRmkgZHVyYXRpb24KCQl7CgkJCWlmIChXYWl0Q291bnQgPT0gMSkKCQkJCW0rKzsgLy8gwdenS6RAqr2mYqjirdNsZXZlbKSkqNOmXgoJCQllbHNlCgkJCQltID0gMTsKCgkJCWlmICggbSA+PSAyMCkgLy9tILPMpGqtyCA9IDIwICcgs8ykajEyMKztIHJlY2hlY2usT6dfvdW+4yBXaUZpIGR1cmF0aW9uLgoJCQkJbSA9IDIwOwoKCQkJbiA9IDMqbTsKCQkJdXAgPSAwOwoJCQlkbiA9IDA7CgkJCVdhaXRDb3VudCA9IDA7IAoJCQlyZXN1bHQgPSAtMTsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgRGVjcmVhc2Ugd2lmaSBkdXJhdGlvbiBmb3IgcmV0cnlDb3VudGVyPjMhIVxuIikpOwoJCX0KCgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgbWF4IEludGVydmFsID0gJWRcbiIsIG1heEludGVydmFsKSk7CgkJaWYobWF4SW50ZXJ2YWwgPT0gMSkKCQl7CgkJCWlmKGJUeFBhdXNlKQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBUeFBhdXNlID0gMVxuIikpOwoKCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxKQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDUpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDU7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyKQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDYpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDY7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAzKQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDcpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDc7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA0KQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDgpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDg7CgkJCQl9CgkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOSkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMyk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTM7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMCkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNCk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTQ7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMSkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNSk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTU7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMikKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNik7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTY7CgkJCQl9CgkJCQkKCQkJCWlmKHJlc3VsdCA9PSAtMSkKCQkJCXsJCQkJCQoJCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA1KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDY7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDYpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA3KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNzsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNykKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDgpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA4OwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMykKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE0KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTQ7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE0KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTUpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTUpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNik7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE2OwoJCQkJCX0KCQkJCX0gCgkJCQllbHNlIGlmIChyZXN1bHQgPT0gMSkKCQkJCXsKCQkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOCkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDcpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA3OwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA3KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDY7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDYpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA1KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNTsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTYpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNSkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE0KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTQ7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE0KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTMpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMzsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBUeFBhdXNlID0gMFxuIikpOwoJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDUpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMSk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDYpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMjsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDcpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMyk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMzsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDgpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNCk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNDsKCQkJCX0KCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMykKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA5KTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA5OwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTQpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTApOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEwOwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTUpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDExOwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTYpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTIpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEyOwoJCQkJfQoJCQkJCgkJCQlpZihyZXN1bHQgPT0gLTEpCgkJCQl7CgkJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMjsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMikKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAzOwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAzKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNCk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDQ7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDkpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMCk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEwOwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMCkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTE7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDExKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTIpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMjsKCQkJCQl9CgkJCQl9IAoJCQkJZWxzZSBpZiAocmVzdWx0ID09IDEpCgkJCQl7CgkJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDQpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMzsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMykKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyOwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEyKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTEpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMCk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEwOwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMCkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDkpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA5OwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQllbHNlIGlmKG1heEludGVydmFsID09IDIpCgkJewoJCQlpZihiVHhQYXVzZSkKCQkJewoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgVHhQYXVzZSA9IDFcbiIpKTsKCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxKQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDYpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDY7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyKQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDYpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDY7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAzKQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDcpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDc7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA0KQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDgpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDg7CgkJCQl9CgkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOSkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNCk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTQ7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMCkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNCk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTQ7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMSkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNSk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTU7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMikKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNik7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTY7CgkJCQl9CgkJCQlpZihyZXN1bHQgPT0gLTEpCgkJCQl7CgkJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDUpIAoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDY7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDYpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA3KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNzsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNykKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDgpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA4OwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMykKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE0KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTQ7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE0KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTUpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTUpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNik7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE2OwoJCQkJCX0KCQkJCX0gCgkJCQllbHNlIGlmIChyZXN1bHQgPT0gMSkKCQkJCXsKCQkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOCkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDcpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA3OwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA3KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDY7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDYpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA2KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNjsKCQkJCQl9CQkJCQkKCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNikKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE1KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTU7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE1KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTQpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTQpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNCk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE0OwoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIFR4UGF1c2UgPSAwXG4iKSk7CgkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNSkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyOwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNikKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyOwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNykKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzKTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAzOwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOCkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA0KTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA0OwoJCQkJfQoJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEzKQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEwKTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMDsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE0KQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEwKTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMDsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE1KQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE2KQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEyKTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMjsKCQkJCX0KCQkJCWlmKHJlc3VsdCA9PSAtMSkKCQkJCXsKCQkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMSkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyOwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMyk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDM7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDMpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA0KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNDsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOSkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEwKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTA7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEwKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTEpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMik7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEyOwoJCQkJCX0KCQkJCX0gCgkJCQllbHNlIGlmIChyZXN1bHQgPT0gMSkKCQkJCXsKCQkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNCkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAzOwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAzKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDI7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDIpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMjsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTIpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDExOwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMSkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEwKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTA7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEwKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTApOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMDsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJZWxzZSBpZihtYXhJbnRlcnZhbCA9PSAzKQoJCXsKCQkJaWYoYlR4UGF1c2UpCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIFR4UGF1c2UgPSAxXG4iKSk7CgkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMSkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA3KTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA3OwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMikKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA3KTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA3OwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMykKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA3KTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA3OwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNCkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA4KTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA4OwoJCQkJfQoJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDkpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTUpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTApCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTUpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTEpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTUpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTIpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTYpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE2OwoJCQkJfQoJCQkJaWYocmVzdWx0ID09IC0xKQoJCQkJewoJCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA1KSAKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDcpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA3OwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA2KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNyk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDc7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDcpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA4KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gODsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTMpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNCkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE1KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTU7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE1KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTYpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNjsKCQkJCQl9CgkJCQl9IAoJCQkJZWxzZSBpZiAocmVzdWx0ID09IDEpCgkJCQl7CgkJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDgpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA3KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNzsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNykKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDcpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA3OwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA2KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNyk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDc7CgkJCQkJfQkJCQkJCgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTYpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNSkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE1KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTU7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE0KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTUpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBUeFBhdXNlID0gMFxuIikpOwoJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDUpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMyk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMzsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDYpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMyk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMzsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDcpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMyk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMzsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDgpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNCk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNDsKCQkJCX0KCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMykKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTE7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNCkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTE7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNSkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTE7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNikKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMik7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTI7CgkJCQl9CgkJCQlpZihyZXN1bHQgPT0gLTEpCgkJCQl7CgkJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMzsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMikKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAzOwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAzKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNCk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDQ7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDkpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDExOwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMCkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTE7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDExKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTIpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMjsKCQkJCQl9CgkJCQl9IAoJCQkJZWxzZSBpZiAocmVzdWx0ID09IDEpCgkJCQl7CgkJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDQpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMzsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMykKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAzOwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMyk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDM7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEyKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTEpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDExOwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMCkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTE7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCS8vIGlmIGN1cnJlbnQgUHNUZG1hIG5vdCBtYXRjaCB3aXRoIHRoZSByZWNvcmRlZCBvbmUgKHdoZW4gc2NhbiwgZGhjcC4uLiksIAoJLy8gdGhlbiB3ZSBoYXZlIHRvIGFkanVzdCBpdCBiYWNrIHRvIHRoZSBwcmV2aW91cyByZWNvcmQgb25lLgoJaWYocENvZXhEbS0+Y3VyUHNUZG1hICE9IHBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSkKCXsKCQlCT09MRUFOCWJTY2FuPUZBTFNFLCBiTGluaz1GQUxTRSwgYlJvYW09RkFMU0U7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgUHNUZG1hIHR5cGUgZGlzbWF0Y2ghISEsIGN1clBzVGRtYT0lZCwgcmVjb3JkUHNUZG1hPSVkXG4iLCAKCQkJcENvZXhEbS0+Y3VyUHNUZG1hLCBwQ29leERtLT5wc1RkbWFEdUFkalR5cGUpKTsKCgkJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfU0NBTiwgJmJTY2FuKTsKCQlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9MSU5LLCAmYkxpbmspOwoJCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1JPQU0sICZiUm9hbSk7CgkJCgkJaWYoICFiU2NhbiAmJiAhYkxpbmsgJiYgIWJSb2FtKQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlKTsKCQl9CgkJZWxzZQoJCXsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcm9hbWluZy9saW5rL3NjYW4gaXMgdW5kZXIgcHJvZ3Jlc3MsIHdpbGwgYWRqdXN0IG5leHQgdGltZSEhIVxuIikpOwoJCX0KCX0KfQoKLy8gU0NPIG9ubHkgb3IgU0NPK1BBTihIUykKVk9JRApoYWxidGM4NzIzYTJhbnRfQWN0aW9uU2NvKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCXUxQnl0ZQl3aWZpUnNzaVN0YXRlLCB3aWZpUnNzaVN0YXRlMTsKCXU0Qnl0ZQl3aWZpQnc7CgoJaWYoaGFsYnRjODcyM2EyYW50X05lZWRUb0RlY0J0UHdyKHBCdENvZXhpc3QpKQoJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgllbHNlCQoJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJaGFsYnRjODcyM2EyYW50X0NvZXhUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoJCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CglpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKCXsKCQl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMzcsIDApOwoJCS8vIGZ3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTUpOwoJCX0KCgkJLy8gc3cgbWVjaGFuaXNtCQkKCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7Cgl9CgllbHNlCgl7CgkJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDI3LCAwKTsKCQl3aWZpUnNzaVN0YXRlMSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDEsIDIsIDQ3LCAwKTsKCQkKCQkvLyBmdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE1KTsKCQl9CgkJCgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlMSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZTEgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CgkJfQkJCgl9Cn0KCgpWT0lECmhhbGJ0Yzg3MjNhMmFudF9BY3Rpb25IaWQoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJdTFCeXRlCXdpZmlSc3NpU3RhdGUsIHdpZmlSc3NpU3RhdGUxOwoJdTRCeXRlCXdpZmlCdzsKCglpZihoYWxidGM4NzIzYTJhbnRfTmVlZFRvRGVjQnRQd3IocEJ0Q29leGlzdCkpCgkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCWVsc2UJCgkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOwoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCgl7CgkJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDM3LCAwKTsKCQkvLyBmdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA5KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTMpOwoJCX0KCgkJLy8gc3cgbWVjaGFuaXNtCgkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCX0KCWVsc2UKCXsKCQl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMjcsIDApOwoJCXdpZmlSc3NpU3RhdGUxID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMSwgMiwgNDcsIDApOwoKCQkvLyBmdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA5KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTMpOwoJCX0KCgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlMSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZTEgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CgkJfQkJCgl9Cn0KCi8vQTJEUCBvbmx5IC8gUEFOKEVEUikgb25seS8gQTJEUCtQQU4oSFMpClZPSUQKaGFsYnRjODcyM2EyYW50X0FjdGlvbkEyZHAoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJdTFCeXRlCQl3aWZpUnNzaVN0YXRlLCB3aWZpUnNzaVN0YXRlMSwgYnRJbmZvRXh0OwoJdTRCeXRlCQl3aWZpQnc7CgoJYnRJbmZvRXh0ID0gcENvZXhTdGEtPmJ0SW5mb0V4dDsKCglpZihoYWxidGM4NzIzYTJhbnRfTmVlZFRvRGVjQnRQd3IocEJ0Q29leGlzdCkpCgkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCWVsc2UJCgkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CgkKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQoJewoJCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAzNywgMCk7CgoJCS8vIGZ3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWlmKGJ0SW5mb0V4dCZCSVQwKQkvL2EyZHAgcmF0ZSwgMTpiYXNpYyAvMDplZHIKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdChwQnRDb2V4aXN0LCBGQUxTRSwgRkFMU0UsIDMpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdChwQnRDb2V4aXN0LCBGQUxTRSwgRkFMU0UsIDEpOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKGJ0SW5mb0V4dCZCSVQwKQkvL2EyZHAgcmF0ZSwgMTpiYXNpYyAvMDplZHIKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdChwQnRDb2V4aXN0LCBGQUxTRSwgdHJ1ZSwgMyk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfVGRtYUR1cmF0aW9uQWRqdXN0KHBCdENvZXhpc3QsIEZBTFNFLCB0cnVlLCAxKTsKCQkJfQoJCX0KCgkJLy8gc3cgbWVjaGFuaXNtCQkKCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7Cgl9CgllbHNlCgl7CgkJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDI3LCAwKTsKCQl3aWZpUnNzaVN0YXRlMSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDEsIDIsIDQ3LCAwKTsKCQkKCQkvLyBmdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQlpZihidEluZm9FeHQmQklUMCkJLy9hMmRwIHJhdGUsIDE6YmFzaWMgLzA6ZWRyCgkJCXsKCQkJCWhhbGJ0Yzg3MjNhMmFudF9UZG1hRHVyYXRpb25BZGp1c3QocEJ0Q29leGlzdCwgRkFMU0UsIEZBTFNFLCAzKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWhhbGJ0Yzg3MjNhMmFudF9UZG1hRHVyYXRpb25BZGp1c3QocEJ0Q29leGlzdCwgRkFMU0UsIEZBTFNFLCAxKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlpZihidEluZm9FeHQmQklUMCkJLy9hMmRwIHJhdGUsIDE6YmFzaWMgLzA6ZWRyCgkJCXsKCQkJCWhhbGJ0Yzg3MjNhMmFudF9UZG1hRHVyYXRpb25BZGp1c3QocEJ0Q29leGlzdCwgRkFMU0UsIHRydWUsIDMpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdChwQnRDb2V4aXN0LCBGQUxTRSwgdHJ1ZSwgMSk7CgkJCX0KCQl9CgkJCgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlMSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZTEgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CgkJfQkJCgl9Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X0FjdGlvblBhbkVkcigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7Cgl1MUJ5dGUJCXdpZmlSc3NpU3RhdGUsIHdpZmlSc3NpU3RhdGUxLCBidEluZm9FeHQ7Cgl1NEJ5dGUJCXdpZmlCdzsKCQoJYnRJbmZvRXh0ID0gcENvZXhTdGEtPmJ0SW5mb0V4dDsKCglpZihoYWxidGM4NzIzYTJhbnRfTmVlZFRvRGVjQnRQd3IocEJ0Q29leGlzdCkpCgkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCWVsc2UJCgkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOwoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCgl7CgkJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDM3LCAwKTsKCQkJCgkJLy8gZncgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDYpOwoJCX0KCgkJLy8gc3cgbWVjaGFuaXNtCgkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOwoJfQoJZWxzZQoJewoJCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAyNywgMCk7CgkJd2lmaVJzc2lTdGF0ZTEgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAxLCAyLCA0NywgMCk7CgkJCgkJLy8gZncgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDYpOwoJCX0KCgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlMSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZTEgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CgkJfQoJfQp9CgoKLy9QQU4oSFMpIG9ubHkKVk9JRApoYWxidGM4NzIzYTJhbnRfQWN0aW9uUGFuSHMoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJdTFCeXRlCQl3aWZpUnNzaVN0YXRlOwoJdTRCeXRlCQl3aWZpQnc7CgoJaGFsYnRjODcyM2EyYW50X0NvZXhUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQoJewoJCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAzNywgMCk7CgoJCS8vIGZ3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCX0KCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CgoJCS8vIHN3IG1lY2hhbmlzbQkJCgkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOwoJfQoJZWxzZQoJewoJCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAzNywgMCk7CgoJCS8vIGZ3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAwKTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAwKTsKCQl9CgoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCQl9Cgl9Cn0KCi8vUEFOKEVEUikrQTJEUApWT0lECmhhbGJ0Yzg3MjNhMmFudF9BY3Rpb25QYW5FZHJBMmRwKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCXUxQnl0ZQkJd2lmaVJzc2lTdGF0ZSwgd2lmaVJzc2lTdGF0ZTEsIGJ0SW5mb0V4dDsKCXU0Qnl0ZQkJd2lmaUJ3OwoKCWJ0SW5mb0V4dCA9IHBDb2V4U3RhLT5idEluZm9FeHQ7CgoJaWYoaGFsYnRjODcyM2EyYW50X05lZWRUb0RlY0J0UHdyKHBCdENvZXhpc3QpKQoJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgllbHNlCQoJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJaGFsYnRjODcyM2EyYW50X0NvZXhUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQoJewoJCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAzNywgMCk7CgoJCS8vIGZ3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWlmKGJ0SW5mb0V4dCZCSVQwKQkvL2EyZHAgYmFzaWMgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA0KTsKCQkJfQoJCQllbHNlCQkJCS8vYTJkcCBlZHIgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlpZihidEluZm9FeHQmQklUMCkJLy9hMmRwIGJhc2ljIHJhdGUKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOCk7CgkJCX0KCQkJZWxzZQkJCQkvL2EyZHAgZWRyIHJhdGUKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CgkJCX0KCQl9CgoJCS8vIHN3IG1lY2hhbmlzbQoJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCX0KCWVsc2UKCXsKCQl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMjcsIDApOwoJCXdpZmlSc3NpU3RhdGUxID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgNDcsIDApOwoJCQoJCS8vIGZ3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWlmKGJ0SW5mb0V4dCZCSVQwKQkvL2EyZHAgYmFzaWMgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA0KTsKCQkJfQoJCQllbHNlCQkJCS8vYTJkcCBlZHIgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlpZihidEluZm9FeHQmQklUMCkJLy9hMmRwIGJhc2ljIHJhdGUKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOCk7CgkJCX0KCQkJZWxzZQkJCQkvL2EyZHAgZWRyIHJhdGUKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CgkJCX0KCQl9CgoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZTEgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUxID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOwoJCX0KCX0KfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfQWN0aW9uUGFuRWRySGlkKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCXUxQnl0ZQkJd2lmaVJzc2lTdGF0ZSwgd2lmaVJzc2lTdGF0ZTE7Cgl1NEJ5dGUJCXdpZmlCdzsKCglpZihoYWxidGM4NzIzYTJhbnRfTmVlZFRvRGVjQnRQd3IocEJ0Q29leGlzdCkpCgkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCWVsc2UJCgkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOwoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCgl7CgkJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDM3LCAwKTsKCgkJLy8gZncgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTApOyAKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTQpOyAKCQl9CgoJCS8vIHN3IG1lY2hhbmlzbQoJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCX0KCWVsc2UKCXsKCQl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMjcsIDApOwoJCXdpZmlSc3NpU3RhdGUxID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMSwgMiwgNDcsIDApOwoJCQoJCS8vIGZ3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEwKTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTQpOwoJCX0KCQkKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CgkJfQoJfQp9CgovLyBISUQrQTJEUCtQQU4oRURSKQpWT0lECmhhbGJ0Yzg3MjNhMmFudF9BY3Rpb25IaWRBMmRwUGFuRWRyKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCXUxQnl0ZQkJd2lmaVJzc2lTdGF0ZSwgd2lmaVJzc2lTdGF0ZTEsIGJ0SW5mb0V4dDsKCXU0Qnl0ZQkJd2lmaUJ3OwoKCWJ0SW5mb0V4dCA9IHBDb2V4U3RhLT5idEluZm9FeHQ7CgoJaWYoaGFsYnRjODcyM2EyYW50X05lZWRUb0RlY0J0UHdyKHBCdENvZXhpc3QpKQoJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgllbHNlCQoJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJaGFsYnRjODcyM2EyYW50X0NvZXhUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQoJewoJCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAzNywgMCk7CgkJCQoJCS8vIGZ3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWlmKGJ0SW5mb0V4dCZCSVQwKQkvL2EyZHAgYmFzaWMgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMik7CgkJCX0KCQkJZWxzZQkJCQkvL2EyZHAgZWRyIHJhdGUKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTApOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKGJ0SW5mb0V4dCZCSVQwKQkvL2EyZHAgYmFzaWMgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNik7CgkJCX0KCQkJZWxzZQkJCQkvL2EyZHAgZWRyIHJhdGUKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTQpOwoJCQl9CgkJfQoJCQoJCS8vIHN3IG1lY2hhbmlzbQoJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCX0KCWVsc2UKCXsKCQl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMjcsIDApOwoJCXdpZmlSc3NpU3RhdGUxID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMSwgMiwgNDcsIDApOwoJCQoJCS8vIGZ3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWlmKGJ0SW5mb0V4dCZCSVQwKQkvL2EyZHAgYmFzaWMgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMik7CgkJCX0KCQkJZWxzZQkJCQkvL2EyZHAgZWRyIHJhdGUKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTApOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKGJ0SW5mb0V4dCZCSVQwKQkvL2EyZHAgYmFzaWMgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNik7CgkJCX0KCQkJZWxzZQkJCQkvL2EyZHAgZWRyIHJhdGUKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTQpOwoJCQl9CgkJfQoKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUxID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlMSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCQl9Cgl9Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X0FjdGlvbkhpZEEyZHAoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJdTFCeXRlCQl3aWZpUnNzaVN0YXRlLCB3aWZpUnNzaVN0YXRlMSwgYnRJbmZvRXh0OwoJdTRCeXRlCQl3aWZpQnc7CgoJYnRJbmZvRXh0ID0gcENvZXhTdGEtPmJ0SW5mb0V4dDsKCglpZihoYWxidGM4NzIzYTJhbnRfTmVlZFRvRGVjQnRQd3IocEJ0Q29leGlzdCkpCgkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCWVsc2UJCgkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOwoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCgl7CgkJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDM3LCAwKTsKCQkKCQkvLyBmdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQlpZihidEluZm9FeHQmQklUMCkJLy9hMmRwIGJhc2ljIHJhdGUKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdChwQnRDb2V4aXN0LCB0cnVlLCBGQUxTRSwgMyk7CgkJCX0KCQkJZWxzZQkJCQkvL2EyZHAgZWRyIHJhdGUKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdChwQnRDb2V4aXN0LCB0cnVlLCBGQUxTRSwgMSk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJaWYoYnRJbmZvRXh0JkJJVDApCS8vYTJkcCBiYXNpYyByYXRlCgkJCXsKCQkJCWhhbGJ0Yzg3MjNhMmFudF9UZG1hRHVyYXRpb25BZGp1c3QocEJ0Q29leGlzdCwgdHJ1ZSwgdHJ1ZSwgMyk7CgkJCX0KCQkJZWxzZQkJCQkvL2EyZHAgZWRyIHJhdGUKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdChwQnRDb2V4aXN0LCB0cnVlLCB0cnVlLCAxKTsKCQkJfQoJCX0KCQkKCQkvLyBzdyBtZWNoYW5pc20KCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7Cgl9CgllbHNlCgl7CgkJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDI3LCAwKTsKCQl3aWZpUnNzaVN0YXRlMSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDEsIDIsIDQ3LCAwKTsKCQkKCQkvLyBmdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQlpZihidEluZm9FeHQmQklUMCkJLy9hMmRwIGJhc2ljIHJhdGUKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdChwQnRDb2V4aXN0LCB0cnVlLCBGQUxTRSwgMyk7CgkJCX0KCQkJZWxzZQkJCQkvL2EyZHAgZWRyIHJhdGUKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdChwQnRDb2V4aXN0LCB0cnVlLCBGQUxTRSwgMSk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJaWYoYnRJbmZvRXh0JkJJVDApCS8vYTJkcCBiYXNpYyByYXRlCgkJCXsKCQkJCWhhbGJ0Yzg3MjNhMmFudF9UZG1hRHVyYXRpb25BZGp1c3QocEJ0Q29leGlzdCwgdHJ1ZSwgdHJ1ZSwgMyk7CgkJCX0KCQkJZWxzZQkJCQkvL2EyZHAgZWRyIHJhdGUKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdChwQnRDb2V4aXN0LCB0cnVlLCB0cnVlLCAxKTsKCQkJfQoJCX0KCgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlMSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZTEgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CgkJfQoJfQp9CgpWT0lECmhhbGJ0Yzg3MjNhMmFudF9SdW5Db2V4aXN0TWVjaGFuaXNtKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCVBCVENfU1RBQ0tfSU5GTwkJcFN0YWNrSW5mbz0mcEJ0Q29leGlzdC0+c3RhY2tfaW5mbzsKCXUxQnl0ZQkJCQlidEluZm9PcmlnaW5hbD0wLCBidFJldHJ5Q250PTA7Cgl1MUJ5dGUJCQkJYWxnb3JpdGhtPTA7CgoJaWYocEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBNYW51YWwgY29udHJvbCEhIVxuIikpOwoJCXJldHVybjsKCX0KCglpZihwU3RhY2tJbmZvLT5iUHJvZmlsZU5vdGlmaWVkKQoJewoJCWlmKHBDb2V4U3RhLT5iSG9sZEZvclN0YWNrT3BlcmF0aW9uKQoJCXsKCQkJLy8gaWYgYnQgaW5xdWlyeS9wYWdlL3BhaXIsIGRvIG5vdCBleGVjdXRlLgoJCQlyZXR1cm47CgkJfQoJCQoJCWFsZ29yaXRobSA9IGhhbGJ0Yzg3MjNhMmFudF9BY3Rpb25BbGdvcml0aG0ocEJ0Q29leGlzdCk7CgkJaWYocENvZXhTdGEtPmJIb2xkUGVyaW9kQ250ICYmIChCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19QQU5IUyE9YWxnb3JpdGhtKSkKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSxIb2xkIEJUIGlucXVpcnkvcGFnZSBzY2FuIHNldHRpbmcgKGNudCA9ICVkKSEhXG4iLCAKCQkJCXBDb2V4U3RhLT5iSG9sZFBlcmlvZENudCkpOwoJCQlpZihwQ29leFN0YS0+YkhvbGRQZXJpb2RDbnQgPj0gNikKCQkJewoJCQkJcENvZXhTdGEtPmJIb2xkUGVyaW9kQ250ID0gMDsKCQkJCS8vIG5leHQgdGltZSB0aGUgY29leGlzdCBwYXJhbWV0ZXJzIHNob3VsZCBiZSByZXNldCBhZ2Fpbi4KCQkJfQoJCQllbHNlCgkJCQlwQ29leFN0YS0+YkhvbGRQZXJpb2RDbnQrKzsKCQkJcmV0dXJuOwoJCX0KCgkJcENvZXhEbS0+Y3VyQWxnb3JpdGhtID0gYWxnb3JpdGhtOwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWxnb3JpdGhtID0gJWQgXG4iLCBwQ29leERtLT5jdXJBbGdvcml0aG0pKTsKCQlpZihoYWxidGM4NzIzYTJhbnRfSXNDb21tb25BY3Rpb24ocEJ0Q29leGlzdCkpCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiAyLUFudCBjb21tb24uXG4iKSk7CgkJCXBDb2V4RG0tPmJSZXNldFRkbWFBZGp1c3QgPSB0cnVlOwoJCX0KCQllbHNlCgkJewoJCQlpZihwQ29leERtLT5jdXJBbGdvcml0aG0gIT0gcENvZXhEbS0+cHJlQWxnb3JpdGhtKQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIHByZUFsZ29yaXRobT0lZCwgY3VyQWxnb3JpdGhtPSVkXG4iLCAKCQkJCQlwQ29leERtLT5wcmVBbGdvcml0aG0sIHBDb2V4RG0tPmN1ckFsZ29yaXRobSkpOwoJCQkJcENvZXhEbS0+YlJlc2V0VGRtYUFkanVzdCA9IHRydWU7CgkJCX0KCQkJc3dpdGNoKHBDb2V4RG0tPmN1ckFsZ29yaXRobSkKCQkJewoJCQkJY2FzZSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19TQ086CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IFNDTy5cbiIpKTsKCQkJCQloYWxidGM4NzIzYTJhbnRfQWN0aW9uU2NvKHBCdENvZXhpc3QpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19ISUQ6CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IEhJRC5cbiIpKTsKCQkJCQloYWxidGM4NzIzYTJhbnRfQWN0aW9uSGlkKHBCdENvZXhpc3QpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19BMkRQOgoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBBMkRQLlxuIikpOwoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9BY3Rpb25BMmRwKHBCdENvZXhpc3QpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19QQU5FRFI6CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IFBBTihFRFIpLlxuIikpOwoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9BY3Rpb25QYW5FZHIocEJ0Q29leGlzdCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1BBTkhTOgoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBIUyBtb2RlLlxuIikpOwoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9BY3Rpb25QYW5IcyhwQnRDb2V4aXN0KTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fUEFORURSX0EyRFA6CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IFBBTitBMkRQLlxuIikpOwoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9BY3Rpb25QYW5FZHJBMmRwKHBCdENvZXhpc3QpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOgoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBQQU4oRURSKStISUQuXG4iKSk7CgkJCQkJaGFsYnRjODcyM2EyYW50X0FjdGlvblBhbkVkckhpZChwQnRDb2V4aXN0KTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fSElEX0EyRFBfUEFORURSOgoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBISUQrQTJEUCtQQU4uXG4iKSk7CgkJCQkJaGFsYnRjODcyM2EyYW50X0FjdGlvbkhpZEEyZHBQYW5FZHIocEJ0Q29leGlzdCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOgoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBISUQrQTJEUC5cbiIpKTsKCQkJCQloYWxidGM4NzIzYTJhbnRfQWN0aW9uSGlkQTJkcChwQnRDb2V4aXN0KTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IGNvZXhpc3QgQWxsIE9mZiEhXG4iKSk7CgkJCQkJaGFsYnRjODcyM2EyYW50X0NvZXhBbGxPZmYocEJ0Q29leGlzdCk7CgkJCQkJYnJlYWs7CgkJCX0KCQkJcENvZXhEbS0+cHJlQWxnb3JpdGhtID0gcENvZXhEbS0+Y3VyQWxnb3JpdGhtOwoJCX0KCX0KfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gd29yayBhcm91bmQgZnVuY3Rpb24gc3RhcnQgd2l0aCB3YV9oYWxidGM4NzIzYTJhbnRfCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClZPSUQKd2FfaGFsYnRjODcyM2EyYW50X01vbml0b3JDMmgoCglJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0CgkpCnsKCXUxQnl0ZQl0bXAxYj0weDA7Cgl1NEJ5dGUJY3VyQzJoVG90YWxDbnQ9MHgwOwoJc3RhdGljIHU0Qnl0ZQlwcmVDMmhUb3RhbENudD0weDAsIHNhbWVDbnRQb2xsaW5nVGltZT0weDA7CgoJY3VyQzJoVG90YWxDbnQrPXBDb2V4U3RhLT5idEluZm9DMmhDbnRbQlRfSU5GT19TUkNfODcyM0FfMkFOVF9CVF9SU1BdOwoKCWlmKGN1ckMyaFRvdGFsQ250ID09IHByZUMyaFRvdGFsQ250KQoJewoJCXNhbWVDbnRQb2xsaW5nVGltZSsrOwoJfQoJZWxzZQoJewoJCXByZUMyaFRvdGFsQ250ID0gY3VyQzJoVG90YWxDbnQ7CgkJc2FtZUNudFBvbGxpbmdUaW1lID0gMDsKCX0KCglpZihzYW1lQ250UG9sbGluZ1RpbWUgPj0gMikKCXsKCQl0bXAxYiA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4MWFmKTsKCQlpZih0bXAxYiAhPSAweDApCgkJewoJCQlwQ29leFN0YS0+YzJoSGFuZ0RldGVjdENudCsrOwoJCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHgxYWYsIDB4MCk7CgkJfQoJfQp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBleHRlcm4gZnVuY3Rpb24gc3RhcnQgd2l0aCBFWGhhbGJ0Yzg3MjNhMmFudF8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVk9JRApFWGhhbGJ0Yzg3MjNhMmFudF9Jbml0SHdDb25maWcoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJdTRCeXRlCXU0VG1wPTA7Cgl1MUJ5dGUJdTFUbXA9MDsKCglCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwgKCJbQlRDb2V4XSwgMkFudCBJbml0IEhXIENvbmZpZyEhXG4iKSk7CgoJLy8gYmFja3VwIHJmIDB4MWUgdmFsdWUKCXBDb2V4RG0tPmJ0UmYweDFlQmFja3VwID0gCgkJcEJ0Q29leGlzdC0+YnRjX2dldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4MWUsIDB4ZmZmZmYpOwoKCS8vIEVuYWJsZSBjb3VudGVyIHN0YXRpc3RpY3MKCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDc2ZSwgMHg0KTsKCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDc3OCwgMHgzKTsKCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDQwLCAweDIwKTsKfQoKVk9JRApFWGhhbGJ0Yzg3MjNhMmFudF9Jbml0Q29leERtKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9JTklULCAoIltCVENvZXhdLCBDb2V4IE1lY2hhbmlzbSBJbml0ISFcbiIpKTsKCQoJaGFsYnRjODcyM2EyYW50X0luaXRDb2V4RG0ocEJ0Q29leGlzdCk7Cn0KClZPSUQKRVhoYWxidGM4NzIzYTJhbnRfRGlzcGxheUNvZXhJbmZvKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCXN0cnVjdCBidGNfYm9hcmRfaW5mbyAqCQlwQm9hcmRJbmZvPSZwQnRDb2V4aXN0LT5ib2FyZF9pbmZvOwoJUEJUQ19TVEFDS19JTkZPCQlwU3RhY2tJbmZvPSZwQnRDb2V4aXN0LT5zdGFja19pbmZvOwoJcHUxQnl0ZQkJCQljbGlCdWY9cEJ0Q29leGlzdC0+Y2xpX2J1ZjsKCXUxQnl0ZQkJCQl1MVRtcFs0XSwgaSwgYnRJbmZvRXh0LCBwc1RkbWFDYXNlPTA7Cgl1NEJ5dGUJCQkJdTRUbXBbNF07CglCT09MRUFOCQkJCWJSb2FtPUZBTFNFLCBiU2Nhbj1GQUxTRSwgYkxpbms9RkFMU0UsIGJXaWZpVW5kZXI1Rz1GQUxTRTsKCUJPT0xFQU4JCQkJYkJ0SHNPbj1GQUxTRSwgYldpZmlCdXN5PUZBTFNFOwoJczRCeXRlCQkJCXdpZmlSc3NpPTAsIGJ0SHNSc3NpPTA7Cgl1NEJ5dGUJCQkJd2lmaUJ3LCB3aWZpVHJhZmZpY0RpcjsKCXUxQnl0ZQkJCQl3aWZpRG90MTFDaG5sLCB3aWZpSHNDaG5sOwoKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuID09PT09PT09PT09PVtCVCBDb2V4aXN0IGluZm9dPT09PT09PT09PT09Iik7CglDTF9QUklOVEYoY2xpQnVmKTsKCglpZighcEJvYXJkSW5mby0+YnRfZXhpc3QpCgl7CgkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gQlQgbm90IGV4aXN0cyAhISEiKTsKCQlDTF9QUklOVEYoY2xpQnVmKTsKCQlyZXR1cm47Cgl9CgoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQgIiwgIkFudCBQRyBudW1iZXIvIEFudCBtZWNoYW5pc206IiwgXAoJCXBCb2FyZEluZm8tPnBnX2FudF9udW0sIHBCb2FyZEluZm8tPmJ0ZG1fYW50X251bSk7CglDTF9QUklOVEYoY2xpQnVmKTsJCgkKCWlmKHBCdENvZXhpc3QtPm1hbnVhbF9jb250cm9sKQoJewoJCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzIiwgIltBY3Rpb24gTWFudWFsIGNvbnRyb2xdISEiKTsKCQlDTF9QUklOVEYoY2xpQnVmKTsKCX0KCQoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcyAvICVkIiwgIkJUIHN0YWNrLyBoY2kgZXh0IHZlciIsIFwKCQkoKHBTdGFja0luZm8tPmJQcm9maWxlTm90aWZpZWQpPyAiWWVzIjoiTm8iKSwgcFN0YWNrSW5mby0+aGNpVmVyc2lvbik7CglDTF9QUklOVEYoY2xpQnVmKTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYkJ0SHNPbik7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTFfV0lGSV9ET1QxMV9DSE5MLCAmd2lmaURvdDExQ2hubCk7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTFfV0lGSV9IU19DSE5MLCAmd2lmaUhzQ2hubCk7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkIC8gJWQoJWQpIiwgIkRvdDExIGNoYW5uZWwgLyBIc0NobmwoSHNNb2RlKSIsIFwKCQl3aWZpRG90MTFDaG5sLCB3aWZpSHNDaG5sLCBiQnRIc09uKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJTAyeCAlMDJ4ICUwMnggIiwgIkgyQyBXaWZpIGluZm9ybSBidCBjaG5sIEluZm8iLCBcCgkJcENvZXhEbS0+d2lmaUNobmxJbmZvWzBdLCBwQ29leERtLT53aWZpQ2hubEluZm9bMV0sCgkJcENvZXhEbS0+d2lmaUNobmxJbmZvWzJdKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9TNF9XSUZJX1JTU0ksICZ3aWZpUnNzaSk7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfUzRfSFNfUlNTSSwgJmJ0SHNSc3NpKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkIiwgIldpZmkgcnNzaS8gSFMgcnNzaSIsIFwKCQl3aWZpUnNzaSwgYnRIc1Jzc2kpOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfU0NBTiwgJmJTY2FuKTsKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0xJTkssICZiTGluayk7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9ST0FNLCAmYlJvYW0pOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQvICVkICIsICJXaWZpIGJMaW5rLyBiUm9hbS8gYlNjYW4iLCBcCgkJYkxpbmssIGJSb2FtLCBiU2Nhbik7CglDTF9QUklOVEYoY2xpQnVmKTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9VTkRFUl81RywgJmJXaWZpVW5kZXI1Ryk7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9CVVNZLCAmYldpZmlCdXN5KTsKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX1RSQUZGSUNfRElSRUNUSU9OLCAmd2lmaVRyYWZmaWNEaXIpOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcyAvICVzLyAlcyAiLCAiV2lmaSBzdGF0dXMiLCBcCgkJKGJXaWZpVW5kZXI1Rz8gIjVHIjoiMi40RyIpLAoJCSgoQlRDX1dJRklfQldfTEVHQUNZPT13aWZpQncpPyAiTGVnYWN5IjogKCgoQlRDX1dJRklfQldfSFQ0MD09d2lmaUJ3KT8gIkhUNDAiOiJIVDIwIikpKSwKCQkoKCFiV2lmaUJ1c3kpPyAiaWRsZSI6ICgoQlRDX1dJRklfVFJBRkZJQ19UWD09d2lmaVRyYWZmaWNEaXIpPyAidXBsaW5rIjoiZG93bmxpbmsiKSkpOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSBbJXMvICVkLyAlZF0gIiwgIkJUIFtzdGF0dXMvIHJzc2kvIHJldHJ5Q250XSIsIFwKCQkoKHBDb2V4U3RhLT5iQzJoQnRJbnF1aXJ5UGFnZSk/KCJpbnF1aXJ5L3BhZ2Ugc2NhbiIpOigoQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cyk/ICJpZGxlIjooICAoQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gcENvZXhEbS0+YnRTdGF0dXMpPyAiY29ubmVjdGVkLWlkbGUiOiJidXN5IikpKSwKCQlwQ29leFN0YS0+YnRSc3NpLCBwQ29leFN0YS0+YnRSZXRyeUNudCk7CglDTF9QUklOVEYoY2xpQnVmKTsKCQoJaWYocFN0YWNrSW5mby0+YlByb2ZpbGVOb3RpZmllZCkKCXsJCQkKCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkIC8gJWQgLyAlZCAvICVkIiwgIlNDTy9ISUQvUEFOL0EyRFAiLCBcCgkJCXBTdGFja0luZm8tPmJTY29FeGlzdCwgcFN0YWNrSW5mby0+YkhpZEV4aXN0LCBwU3RhY2tJbmZvLT5iUGFuRXhpc3QsIHBTdGFja0luZm8tPmJBMmRwRXhpc3QpOwoJCUNMX1BSSU5URihjbGlCdWYpOwkKCgkJcEJ0Q29leGlzdC0+YnRjX2Rpc3BfZGJnX21zZyhwQnRDb2V4aXN0LCBCVENfREJHX0RJU1BfQlRfTElOS19JTkZPKTsKCX0KCglidEluZm9FeHQgPSBwQ29leFN0YS0+YnRJbmZvRXh0OwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcyIsICJCVCBJbmZvIEEyRFAgcmF0ZSIsIFwKCQkoYnRJbmZvRXh0JkJJVDApPyAiQmFzaWMgcmF0ZSI6IkVEUiByYXRlIik7CglDTF9QUklOVEYoY2xpQnVmKTsJCgoJZm9yKGk9MDsgaTxCVF9JTkZPX1NSQ184NzIzQV8yQU5UX01BWDsgaSsrKQoJewoJCWlmKHBDb2V4U3RhLT5idEluZm9DMmhDbnRbaV0pCgkJewkJCQkKCQkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4KCVkKSIsIEdMQnRJbmZvU3JjODcyM2EyQW50W2ldLCBcCgkJCQlwQ29leFN0YS0+YnRJbmZvQzJoW2ldWzBdLCBwQ29leFN0YS0+YnRJbmZvQzJoW2ldWzFdLAoJCQkJcENvZXhTdGEtPmJ0SW5mb0MyaFtpXVsyXSwgcENvZXhTdGEtPmJ0SW5mb0MyaFtpXVszXSwKCQkJCXBDb2V4U3RhLT5idEluZm9DMmhbaV1bNF0sIHBDb2V4U3RhLT5idEluZm9DMmhbaV1bNV0sCgkJCQlwQ29leFN0YS0+YnRJbmZvQzJoW2ldWzZdLCBwQ29leFN0YS0+YnRJbmZvQzJoQ250W2ldKTsKCQkJQ0xfUFJJTlRGKGNsaUJ1Zik7CgkJfQoJfQoKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQiLCAid3JpdGUgMHgxYWY9MHgwIG51bSIsIFwKCQlwQ29leFN0YS0+YzJoSGFuZ0RldGVjdENudCk7CglDTF9QUklOVEYoY2xpQnVmKTsKCQoJLy8gU3cgbWVjaGFuaXNtCQoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLCAiPT09PT09PT09PT09W1N3IG1lY2hhbmlzbV09PT09PT09PT09PT0iKTsKCUNMX1BSSU5URihjbGlCdWYpOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQvICVkIiwgIlNNMVtTaFJmLyBMcFJBLyBMaW1EaWddIiwgXAoJCXBDb2V4RG0tPmJDdXJSZlJ4THBmU2hyaW5rLCBwQ29leERtLT5iQ3VyTG93UGVuYWx0eVJhLCBwQ29leERtLT5saW1pdGVkX2RpZyk7CglDTF9QUklOVEYoY2xpQnVmKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkLyAlZCgweCV4KSAiLCAiU00yW0FnY1QvIEFkY0IvIFN3RGFjU3dpbmcobHZsKV0iLCBcCgkJcENvZXhEbS0+YkN1ckFnY1RhYmxlRW4sIHBDb2V4RG0tPmJDdXJBZGNCYWNrT2ZmLCBwQ29leERtLT5iQ3VyRGFjU3dpbmdPbiwgcENvZXhEbS0+Y3VyRGFjU3dpbmdMdmwpOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJLy8gRncgbWVjaGFuaXNtCQkKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzIiwgIj09PT09PT09PT09PVtGdyBtZWNoYW5pc21dPT09PT09PT09PT09Iik7CglDTF9QUklOVEYoY2xpQnVmKTsJCgkKCWlmKCFwQnRDb2V4aXN0LT5tYW51YWxfY29udHJvbCkKCXsKCQlwc1RkbWFDYXNlID0gcENvZXhEbS0+Y3VyUHNUZG1hOwoJCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IGNhc2UtJWQiLCAiUFMgVERNQSIsIFwKCQkJcENvZXhEbS0+cHNUZG1hUGFyYVswXSwgcENvZXhEbS0+cHNUZG1hUGFyYVsxXSwKCQkJcENvZXhEbS0+cHNUZG1hUGFyYVsyXSwgcENvZXhEbS0+cHNUZG1hUGFyYVszXSwKCQkJcENvZXhEbS0+cHNUZG1hUGFyYVs0XSwgcHNUZG1hQ2FzZSk7CgkJQ0xfUFJJTlRGKGNsaUJ1Zik7CgkKCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCAiLCAiRGVjQnRQd3IvIElnbldsYW5BY3QiLCBcCgkJCXBDb2V4RG0tPmJDdXJEZWNCdFB3ciwgcENvZXhEbS0+YkN1cklnbm9yZVdsYW5BY3QpOwoJCUNMX1BSSU5URihjbGlCdWYpOwoJfQoKCS8vIEh3IHNldHRpbmcJCQoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLCAiPT09PT09PT09PT09W0h3IHNldHRpbmddPT09PT09PT09PT09Iik7CglDTF9QUklOVEYoY2xpQnVmKTsJCgoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4IiwgIlJGLUEsIDB4MWUgaW5pdFZhbCIsIFwKCQlwQ29leERtLT5idFJmMHgxZUJhY2t1cCk7CglDTF9QUklOVEYoY2xpQnVmKTsKCgl1MVRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4Nzc4KTsKCXUxVG1wWzFdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg3ODMpOwoJdTFUbXBbMl0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDc5Nik7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgvIDB4JXgiLCAiMHg3NzgvIDB4NzgzLyAweDc5NiIsIFwKCQl1MVRtcFswXSwgdTFUbXBbMV0sIHUxVG1wWzJdKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCXU0VG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHg4ODApOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4IiwgIjB4ODgwIiwgXAoJCXU0VG1wWzBdKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCXUxVG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg0MCk7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiMHg0MCIsIFwKCQl1MVRtcFswXSk7CglDTF9QUklOVEYoY2xpQnVmKTsKCgl1NFRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4NTUwKTsKCXUxVG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg1MjIpOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4IiwgIjB4NTUwKGJjbiBjdHJsKS8weDUyMiIsIFwKCQl1NFRtcFswXSwgdTFUbXBbMF0pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJdTRUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweDQ4NCk7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiMHg0ODQocmF0ZSBhZGFwdGl2ZSkiLCBcCgkJdTRUbXBbMF0pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJdTRUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweGM1MCk7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiMHhjNTAoZGlnKSIsIFwKCQl1NFRtcFswXSk7CglDTF9QUklOVEYoY2xpQnVmKTsKCgl1NFRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4ZGEwKTsKCXU0VG1wWzFdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHhkYTQpOwoJdTRUbXBbMl0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweGRhOCk7Cgl1NFRtcFszXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4ZGFjKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleC8gMHgleC8gMHgleCIsICIweGRhMC8weGRhNC8weGRhOC8weGRhYyhGQSBjbnQpIiwgXAoJCXU0VG1wWzBdLCB1NFRtcFsxXSwgdTRUbXBbMl0sIHU0VG1wWzNdKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCXU0VG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHg2YzApOwoJdTRUbXBbMV0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweDZjNCk7Cgl1NFRtcFsyXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4NmM4KTsKCXUxVG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg2Y2MpOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4LyAweCV4LyAweCV4IiwgIjB4NmMwLzB4NmM0LzB4NmM4LzB4NmNjKGNvZXhUYWJsZSkiLCBcCgkJdTRUbXBbMF0sIHU0VG1wWzFdLCB1NFRtcFsyXSwgdTFUbXBbMF0pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQiLCAiMHg3NzAgKGhwIHJ4WzMxOjE2XS90eFsxNTowXSkiLCBcCgkJcENvZXhTdGEtPmhpZ2hQcmlvcml0eVJ4LCBwQ29leFN0YS0+aGlnaFByaW9yaXR5VHgpOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCIsICIweDc3NChscCByeFszMToxNl0vdHhbMTU6MF0pIiwgXAoJCXBDb2V4U3RhLT5sb3dQcmlvcml0eVJ4LCBwQ29leFN0YS0+bG93UHJpb3JpdHlUeCk7CglDTF9QUklOVEYoY2xpQnVmKTsKCgkvLyBUeCBtZ250IHF1ZXVlIGhhbmcgb3Igbm90LCAweDQxYiBzaG91bGQgPSAweGYsIGV4OiAweGQgPT0+aGFuZwoJdTFUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDQxYik7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiMHg0MWIgKG1nbnRRIGhhbmcgY2hrID09IDB4ZikiLCBcCgkJdTFUbXBbMF0pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CQoKCXBCdENvZXhpc3QtPmJ0Y19kaXNwX2RiZ19tc2cocEJ0Q29leGlzdCwgQlRDX0RCR19ESVNQX0NPRVhfU1RBVElTVElDUyk7Cn0KCgpWT0lECkVYaGFsYnRjODcyM2EyYW50X0lwc05vdGlmeSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCXUxQnl0ZQkJCXR5cGUKCSkKewoJaWYoQlRDX0lQU19FTlRFUiA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIElQUyBFTlRFUiBub3RpZnlcbiIpKTsKCQloYWxidGM4NzIzYTJhbnRfQ29leEFsbE9mZihwQnRDb2V4aXN0KTsKCX0KCWVsc2UgaWYoQlRDX0lQU19MRUFWRSA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIElQUyBMRUFWRSBub3RpZnlcbiIpKTsKCQkvL2hhbGJ0Yzg3MjNhMmFudF9Jbml0Q29leERtKHBCdENvZXhpc3QpOwoJfQp9CgpWT0lECkVYaGFsYnRjODcyM2EyYW50X0xwc05vdGlmeSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCXUxQnl0ZQkJCXR5cGUKCSkKewoJaWYoQlRDX0xQU19FTkFCTEUgPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBMUFMgRU5BQkxFIG5vdGlmeVxuIikpOwoJfQoJZWxzZSBpZihCVENfTFBTX0RJU0FCTEUgPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBMUFMgRElTQUJMRSBub3RpZnlcbiIpKTsKCX0KfQoKVk9JRApFWGhhbGJ0Yzg3MjNhMmFudF9TY2FuTm90aWZ5KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJdHlwZQoJKQp7CglpZihCVENfU0NBTl9TVEFSVCA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFNDQU4gU1RBUlQgbm90aWZ5XG4iKSk7Cgl9CgllbHNlIGlmKEJUQ19TQ0FOX0ZJTklTSCA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFNDQU4gRklOSVNIIG5vdGlmeVxuIikpOwoJfQp9CgpWT0lECkVYaGFsYnRjODcyM2EyYW50X0Nvbm5lY3ROb3RpZnkoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTgl1MUJ5dGUJCQl0eXBlCgkpCnsKCWlmKEJUQ19BU1NPQ0lBVEVfU1RBUlQgPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBDT05ORUNUIFNUQVJUIG5vdGlmeVxuIikpOwoJfQoJZWxzZSBpZihCVENfQVNTT0NJQVRFX0ZJTklTSCA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIENPTk5FQ1QgRklOSVNIIG5vdGlmeVxuIikpOwoJfQp9CgpWT0lECkVYaGFsYnRjODcyM2EyYW50X01lZGlhU3RhdHVzTm90aWZ5KAoJSU4JUEJUQ19DT0VYSVNUCQkJcEJ0Q29leGlzdCwKCUlOCXUxQnl0ZQkJCQl0eXBlCgkpCnsKCWlmKEJUQ19NRURJQV9DT05ORUNUID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgTUVESUEgY29ubmVjdCBub3RpZnlcbiIpKTsKCX0KCWVsc2UKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBNRURJQSBkaXNjb25uZWN0IG5vdGlmeVxuIikpOwoJfQoKCWhhbGJ0Yzg3MjNhMmFudF9JbmRpY2F0ZVdpZmlDaG5sQndJbmZvKHBCdENvZXhpc3QsIHR5cGUpOwp9CgpWT0lECkVYaGFsYnRjODcyM2EyYW50X1NwZWNpYWxQYWNrZXROb3RpZnkoCglJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJCXR5cGUKCSkKewoJaWYodHlwZSA9PSBCVENfUEFDS0VUX0RIQ1ApCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgREhDUCBQYWNrZXQgbm90aWZ5XG4iKSk7Cgl9Cn0KClZPSUQKRVhoYWxidGM4NzIzYTJhbnRfQnRJbmZvTm90aWZ5KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JcHUxQnl0ZQkJCXRtcEJ1ZiwKCUlOCXUxQnl0ZQkJCWxlbmd0aAoJKQp7Cgl1MUJ5dGUJCQlidEluZm89MDsKCXUxQnl0ZQkJCWksIHJzcFNvdXJjZT0wOwoJQk9PTEVBTgkJCWJCdEJ1c3k9RkFMU0UsIGxpbWl0ZWRfZGlnPUZBTFNFOwoJQk9PTEVBTgkJCWJXaWZpQ29ubmVjdGVkPUZBTFNFLCBiQnRIc09uPUZBTFNFOwoKCXBDb2V4U3RhLT5iQzJoQnRJbmZvUmVxU2VudCA9IEZBTFNFOwoJCglyc3BTb3VyY2UgPSBCVF9JTkZPX1NSQ184NzIzQV8yQU5UX0JUX1JTUDsKCXBDb2V4U3RhLT5idEluZm9DMmhDbnRbcnNwU291cmNlXSsrOwoKCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIEJ0IGluZm9bJWRdLCBsZW5ndGg9JWQsIGhleCBkYXRhPVsiLCByc3BTb3VyY2UsIGxlbmd0aCkpOwoJZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKCXsKCQlwQ29leFN0YS0+YnRJbmZvQzJoW3JzcFNvdXJjZV1baV0gPSB0bXBCdWZbaV07CgkJaWYoaSA9PSAwKQoJCQlidEluZm8gPSB0bXBCdWZbaV07CgkJaWYoaSA9PSBsZW5ndGgtMSkKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiMHglMDJ4XVxuIiwgdG1wQnVmW2ldKSk7CgkJfQoJCWVsc2UKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiMHglMDJ4LCAiLCB0bXBCdWZbaV0pKTsKCQl9Cgl9CgoJaWYoQlRfSU5GT19TUkNfODcyM0FfMkFOVF9XSUZJX0ZXICE9IHJzcFNvdXJjZSkKCXsKCQlwQ29leFN0YS0+YnRSZXRyeUNudCA9CgkJCXBDb2V4U3RhLT5idEluZm9DMmhbcnNwU291cmNlXVsxXTsKCgkJcENvZXhTdGEtPmJ0UnNzaSA9CgkJCXBDb2V4U3RhLT5idEluZm9DMmhbcnNwU291cmNlXVsyXSoyKzEwOwoKCQlwQ29leFN0YS0+YnRJbmZvRXh0ID0gCgkJCXBDb2V4U3RhLT5idEluZm9DMmhbcnNwU291cmNlXVszXTsKCX0KCQkKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZiQnRIc09uKTsKCS8vIGNoZWNrIEJJVDIgZmlyc3QgPT0+IGNoZWNrIGlmIGJ0IGlzIHVuZGVyIGlucXVpcnkgb3IgcGFnZSBzY2FuCglpZihidEluZm8gJiBCVF9JTkZPXzg3MjNBXzJBTlRfQl9JTlFfUEFHRSkKCXsKCQlwQ29leFN0YS0+YkMyaEJ0SW5xdWlyeVBhZ2UgPSB0cnVlOwoJfQoJZWxzZQoJewoJCXBDb2V4U3RhLT5iQzJoQnRJbnF1aXJ5UGFnZSA9IEZBTFNFOwoJfQp9CgpWT0lECkVYaGFsYnRjODcyM2EyYW50X1N0YWNrT3BlcmF0aW9uTm90aWZ5KAoJSU4JUEJUQ19DT0VYSVNUCQkJcEJ0Q29leGlzdCwKCUlOCXUxQnl0ZQkJCQl0eXBlCgkpCnsKCWlmKEJUQ19TVEFDS19PUF9JTlFfUEFHRV9QQUlSX1NUQVJUID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgU3RhY2tPUCBJbnF1aXJ5L3BhZ2UvcGFpciBzdGFydCBub3RpZnlcbiIpKTsKCQlwQ29leFN0YS0+YkhvbGRGb3JTdGFja09wZXJhdGlvbiA9IHRydWU7CgkJcENvZXhTdGEtPmJIb2xkUGVyaW9kQ250ID0gMTsKCQloYWxidGM4NzIzYTJhbnRfQnRJbnF1aXJ5UGFnZShwQnRDb2V4aXN0KTsKCX0KCWVsc2UgaWYoQlRDX1NUQUNLX09QX0lOUV9QQUdFX1BBSVJfRklOSVNIID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgU3RhY2tPUCBJbnF1aXJ5L3BhZ2UvcGFpciBmaW5pc2ggbm90aWZ5XG4iKSk7CgkJcENvZXhTdGEtPmJIb2xkRm9yU3RhY2tPcGVyYXRpb24gPSBGQUxTRTsKCX0KfQoKVk9JRApFWGhhbGJ0Yzg3MjNhMmFudF9IYWx0Tm90aWZ5KAoJSU4JUEJUQ19DT0VYSVNUCQkJcEJ0Q29leGlzdAoJKQp7CglCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBIYWx0IG5vdGlmeVxuIikpOwoKCWhhbGJ0Yzg3MjNhMmFudF9JZ25vcmVXbGFuQWN0KHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIHRydWUpOwoJRVhoYWxidGM4NzIzYTJhbnRfTWVkaWFTdGF0dXNOb3RpZnkocEJ0Q29leGlzdCwgQlRDX01FRElBX0RJU0NPTk5FQ1QpOwp9CgpWT0lECkVYaGFsYnRjODcyM2EyYW50X1BlcmlvZGljYWwoCglJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0CgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIDJBbnQgUGVyaW9kaWNhbCEhXG4iKSk7CgoJLy8gd29yayBhcm91bmQgZm9yIGMyaCBoYW5nCgl3YV9oYWxidGM4NzIzYTJhbnRfTW9uaXRvckMyaChwQnRDb2V4aXN0KTsKCQoJaGFsYnRjODcyM2EyYW50X1F1ZXJ5QnRJbmZvKHBCdENvZXhpc3QpOwoJaGFsYnRjODcyM2EyYW50X01vbml0b3JCdEN0cihwQnRDb2V4aXN0KTsKCWhhbGJ0Yzg3MjNhMmFudF9Nb25pdG9yQnRFbmFibGVEaXNhYmxlKHBCdENvZXhpc3QpOwoKCWhhbGJ0Yzg3MjNhMmFudF9SdW5Db2V4aXN0TWVjaGFuaXNtKHBCdENvZXhpc3QpOwp9CgoKI2VuZGlmCgo=