LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogTW9kdWxlIE5hbWUgU2lJRGVlcENvbG9yCiAqIE1vZHVsZSBEZXNjcmlwdGlvbjogdGhpcyBmaWxlIGlzIHVzZWQgdG8gaGFuZGxlIERlZXAgQ29sb3IgZnVuY3Rpb25zCiAqCiAqIENvcHlyaWdodCCpIDIwMDItMjAwNSwgU2lsaWNvbiBJbWFnZSwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogTm8gcGFydCBvZiB0aGlzIHdvcmsgbWF5IGJlIHJlcHJvZHVjZWQsIG1vZGlmaWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCiAqIHRyYW5zY3JpYmVkLCBvciB0cmFuc2xhdGVkIGludG8gYW55IGxhbmd1YWdlIG9yIGNvbXB1dGVyIGZvcm1hdCwgaW4gYW55IGZvcm0KICogb3IgYnkgYW55IG1lYW5zIHdpdGhvdXQgd3JpdHRlbiBwZXJtaXNzaW9uIG9mOiBTaWxpY29uIEltYWdlLCBJbmMuLAogKiAxMDYwIEVhc3QgQXJxdWVzIEF2ZW51ZSwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhIDk0MDg1CiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCiNpbmNsdWRlICJTaUlHbG9iLmgiCiNpbmNsdWRlICJTaUlSWElPLmgiCiNpbmNsdWRlICJTaUlSWERlZnMuaCIKI2luY2x1ZGUgIlNpSURlZXBDb2xvci5oIgojaW5jbHVkZSAiU2lJVmlkRi5oIgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogRnVuY3Rpb24gTmFtZTogVmlkZW9GSUZPX1Jlc2V0CiAqIEZ1bmN0aW9uIERlc2NyaXB0aW9uOiBNYWtlcyBWaWRlbyBGSUZPIHJlc2V0CiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kdm9pZCBzaWlWaWRlb0ZJRk9fUmVzZXQodm9pZCkKewoJc2lpSUlDX1JYX1JXQml0c0luQnl0ZVAwKFJYX1NXUlNUX0FERFIyLCBSWF9CSVRfRENGSUZPX1JTVCwgU0VUKTsKCXNpaUlJQ19SWF9SV0JpdHNJbkJ5dGVQMChSWF9TV1JTVF9BRERSMiwgUlhfQklUX0RDRklGT19SU1QsIENMUik7Cgp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBGdW5jdGlvbiBOYW1lOiBzaWlDaGVja1N1cHBvcnREZWVwQ29sb3JNb2RlCiAqIEZ1bmN0aW9uIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGNoZWNocyBEZWVwIENvbG9yIG1vZGUgc3VwcG9ydAogKgogKiBBY2NlcHRzOiBUUlVFL0ZBTFNFCiAqIFJldHVybnM6IG5vbmUKICogR2xvYmFsczogbm9uZQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCkJPT0wgc2lpQ2hlY2tTdXBwb3J0RGVlcENvbG9yTW9kZSh2b2lkKQp7CglCT09MIHFSZXN1bHQgPSBGQUxTRTsKCglpZiAoKFNpSV9DdHJsLmJEZXZJZCA9PSBSWF9TaUk5MTMzKQoJCXx8IChTaUlfQ3RybC5iRGV2SWQgPT0gUlhfU2lJOTEyNSkKCQl8fCAoU2lJX0N0cmwuYkRldklkID09IFJYX1NpSTkxMzUpCgkJLyogfHwgKFNpSV9DdHJsW2JIRE1JRGV2XS5iRGV2SWQgPT0gUlhfU2lJODUwMCkgKi8KCQkpIHsKCQlxUmVzdWx0ID0gVFJVRTsKCX0KCXJldHVybiBxUmVzdWx0Owp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBGdW5jdGlvbiBOYW1lOiBzaWlSZXNldERlZXBDb2xvck1vZGUKICogRnVuY3Rpb24gRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gc2V0cyBUTURTIHJlZ2lzdGVycyByZXNwZWN0aW5nIGlucHV0CiAqICAgICAgICAgICAgICAgICAgICAgICBjb2xvciBjb2xvciBkZXB0aAogKiBBY2NlcHRzOiBub25lCiAqIFJldHVybnM6IG5vbmUKICogR2xvYmFsczogbm9uZQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCnZvaWQgc2lpUmVzZXREZWVwQ29sb3JNb2RlKHZvaWQpCnsKCS8qIHJlc2V0IHZpZGVvIEZJRk8gZmVhdHVyZSBvbmx5IGluIDkxMzUgYW5kL29yIGFmdGVyICovCglpZiAoU2lJX0N0cmwuYkRldklkICE9IFJYX1NpSTkxMzMpCgkJc2lpVmlkZW9GSUZPX1Jlc2V0KCk7IC8qIHJlc2V0IGFuZCBmbHVzaCAgICB2aWRlbyBGSUZPICovCglzaWlJSUNfUlhfUk1XX0J5dGVQMChSWF9UTURTX0VDVFJMX0FERFIsCgkJUlhfRENfQ0xLX0NUUkxfTUFTSywgUlhfRENfQ0xLXzhCUFBfMVgpOwoJU2lJX0luZi5BVkkuYklucHV0Q29sb3JEZXB0aCA9IFNpSV9SWF9DRF8yNEJQUDsKCS8qIGJSZWdPbGRDb2xvckRlcHRoU3RhdCA9IFNpSV9SWF9DRF8yNEJQUDsgKi8KfQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBGdW5jdGlvbiBOYW1lOiBTaUlfUlhfU2V0T3V0cHV0Q29sb3JEZXB0aAogKiBGdW5jdGlvbiBEZXNjcmlwdGlvbjoKICoKICogQWNjZXB0czogbm9uZQogKiBSZXR1cm5zOiBub25lCiAqIEdsb2JhbHM6IG5vbmUKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwpCWVRFIFNpSV9SWF9TZXRPdXRwdXRDb2xvckRlcHRoKEJZVEUgYk91dHB1dENvbG9yRGVwdGgpCnsKCUJZVEUgYkVycm9yID0gRkFMU0U7CgoJc3dpdGNoIChiT3V0cHV0Q29sb3JEZXB0aCkgewoJY2FzZSBTaUlfUlhfQ0RfMjRCUFA6CgkJc2lpSUlDX1JYX1JNV19CeXRlUDAoUlhfVklEX01PREUyX0FERFIsCgkJCVJYX0RJVEhFUl9NT0RFX01BU0ssIFJYX0RJVEhFUl84QklUUyk7CgkJYnJlYWs7CgljYXNlIFNpSV9SWF9DRF8zMEJQUDoKCQlzaWlJSUNfUlhfUk1XX0J5dGVQMChSWF9WSURfTU9ERTJfQUREUiwKCQkJUlhfRElUSEVSX01PREVfTUFTSywgUlhfRElUSEVSXzEwQklUUyk7CgkJYnJlYWs7CgljYXNlIFNpSV9SWF9DRF8zNkJQUDoKCQlzaWlJSUNfUlhfUk1XX0J5dGVQMChSWF9WSURfTU9ERTJfQUREUiwKCQkJUlhfRElUSEVSX01PREVfTUFTSywgUlhfRElUSEVSXzEyQklUUyk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCWJFcnJvciA9IFNpSV9FQ19VbnN1cHBvcnRlZENvbG9yRGVwdGg7Cgl9CgoJcmV0dXJuIGJFcnJvcjsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogRnVuY3Rpb24gTmFtZTogc2lpU2V0RGVlcENvbG9yTW9kZQogKiBGdW5jdGlvbiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBzZXRzIFRNRFMgcmVnaXN0ZXJzIHJlc3BlY3RpbmcKICogICAgICAgICAgICAgICAgICAgICAgIGlucHV0IGNvbG9yIGNvbG9yIGRlcHRoCiAqIEFjY2VwdHM6IG5vbmUKICogUmV0dXJuczogRXJyb3Igc3RhdHVzCiAqIEdsb2JhbHM6IG5vbmUKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKQllURSBzaWlTZXREZWVwQ29sb3JNb2RlKHZvaWQpCnsKCUJZVEUgYkNvbG9yRGVwdGg7CglCWVRFIGJFcnJvciA9IEZBTFNFOwoKCWlmIChzaWlDaGVja1N1cHBvcnREZWVwQ29sb3JNb2RlKCkpIHsKCQkvKiBSZWFkIGluY29taW5nIHBpeGVsIGRlcHRoIGZyb20KCQkgKmxhdGVzdCBHZW5lcmFsIENvbnRyb2wgUGFja2V0CgkJICovCgkJYkNvbG9yRGVwdGggPSBzaWlSZWFkQnl0ZUhETUlSWFAwKFJYX0RDX1NUQVRVU19BRERSKSAmCgkJCQlSWF9EQ19QSVhFTERFUFRIX01BU0s7CgoJCS8qIElmIGl0IGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudCBzZXR0aW5nICovCgkJaWYgKGJDb2xvckRlcHRoICE9IFNpSV9JbmYuQVZJLmJJbnB1dENvbG9yRGVwdGgpIHsKCgkJCXNpaU11dGVWaWRlbyhPTik7CgoJCQkvKiByZXNldCB2aWRlbyBGSUZPIGZlYXR1cmUgb25seSBpbiA5MTM1IGFuZC9vciBhZnRlciAqLwoJCQlpZiAoU2lJX0N0cmwuYkRldklkID09IFJYX1NpSTkxMzUgfHwKCQkJCVNpSV9DdHJsLmJEZXZJZCA9PSBSWF9TaUk5MTI1KSB7CgkJCQkvKiByZXNldCBhbmQgZmx1c2ggICAgdmlkZW8gRklGTyAqLwoJCQkJc2lpVmlkZW9GSUZPX1Jlc2V0KCk7CgkJCX0KCQkJLyogVXBkYXRlIHRoZSBjdXJyZW50IHNldHRpbmcgKi8KCQkJU2lJX0luZi5BVkkuYklucHV0Q29sb3JEZXB0aCA9IGJDb2xvckRlcHRoOwoKCQkJc3dpdGNoIChiQ29sb3JEZXB0aCkgeyAvKiBVcGRhdGUgdGhlIHZhbHVlIGluIGhhcmR3YXJlKi8KCQkJY2FzZSBSWF9EQ184QlBQX1ZBTDoKCQkJCXNpaUlJQ19SWF9STVdfQnl0ZVAwKFJYX1RNRFNfRUNUUkxfQUREUiwKCQkJCQlSWF9EQ19DTEtfQ1RSTF9NQVNLLCBSWF9EQ19DTEtfOEJQUF8xWCk7CgkJCQlicmVhazsKCQkJY2FzZSBSWF9EQ18xMEJQUF9WQUw6CgkJCQlzaWlJSUNfUlhfUk1XX0J5dGVQMChSWF9UTURTX0VDVFJMX0FERFIsCgkJCQkJUlhfRENfQ0xLX0NUUkxfTUFTSywKCQkJCQlSWF9EQ19DTEtfMTBCUFBfMVgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgUlhfRENfMTJCUFBfVkFMOgoJCQkJc2lpSUlDX1JYX1JNV19CeXRlUDAoUlhfVE1EU19FQ1RSTF9BRERSLAoJCQkJCVJYX0RDX0NMS19DVFJMX01BU0ssCgkJCQkJUlhfRENfQ0xLXzEyQlBQXzFYKTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJYkVycm9yID0gU2lJX0VDX1Vuc3VwcG9ydGVkQ29sb3JEZXB0aDsKCQkJfQoKCQkJc2lpTXV0ZVZpZGVvKE9GRik7CgkJfQoJfQoJcmV0dXJuIGJFcnJvcjsKfQo=