LyoKIElOVEVMIENPTkZJREVOVElBTAogQ29weXJpZ2h0IDIwMTEgSW50ZWwgQ29ycG9yYXRpb24gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIFRoZSBzb3VyY2UgY29kZSBjb250YWluZWQgb3IgZGVzY3JpYmVkIGhlcmVpbiBhbmQgYWxsIGRvY3VtZW50cyByZWxhdGVkIHRvIHRoZSBzb3VyY2UgY29kZSAoIk1hdGVyaWFsIikgYXJlIG93bmVkIGJ5IEludGVsIENvcnBvcmF0aW9uIG9yIGl0cyBzdXBwbGllcnMgb3IgbGljZW5zb3JzLiBUaXRsZSB0byB0aGUgTWF0ZXJpYWwgcmVtYWlucyB3aXRoIEludGVsIENvcnBvcmF0aW9uIG9yIGl0cyBzdXBwbGllcnMgYW5kIGxpY2Vuc29ycy4gVGhlIE1hdGVyaWFsIGNvbnRhaW5zIHRyYWRlIHNlY3JldHMgYW5kIHByb3ByaWV0YXJ5IGFuZCBjb25maWRlbnRpYWwgaW5mb3JtYXRpb24gb2YgSW50ZWwgb3IgaXRzIHN1cHBsaWVycyBhbmQgbGljZW5zb3JzLiBUaGUgTWF0ZXJpYWwgaXMgcHJvdGVjdGVkIGJ5IHdvcmxkd2lkZSBjb3B5cmlnaHQgYW5kIHRyYWRlIHNlY3JldCBsYXdzIGFuZCB0cmVhdHkgcHJvdmlzaW9ucy4gTm8gcGFydCBvZiB0aGUgTWF0ZXJpYWwgbWF5IGJlIHVzZWQsIGNvcGllZCwgcmVwcm9kdWNlZCwgbW9kaWZpZWQsIHB1Ymxpc2hlZCwgdXBsb2FkZWQsIHBvc3RlZCwgdHJhbnNtaXR0ZWQsIGRpc3RyaWJ1dGVkLCBvciBkaXNjbG9zZWQgaW4gYW55IHdheSB3aXRob3V0IEludGVsknMgcHJpb3IgZXhwcmVzcyB3cml0dGVuIHBlcm1pc3Npb24uCgogTm8gbGljZW5zZSB1bmRlciBhbnkgcGF0ZW50LCBjb3B5cmlnaHQsIHRyYWRlIHNlY3JldCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHQgaXMgZ3JhbnRlZCB0byBvciBjb25mZXJyZWQgdXBvbiB5b3UgYnkgZGlzY2xvc3VyZSBvciBkZWxpdmVyeSBvZiB0aGUgTWF0ZXJpYWxzLCBlaXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgaW5kdWNlbWVudCwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbnkgbGljZW5zZSB1bmRlciBzdWNoIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbXVzdCBiZSBleHByZXNzIGFuZCBhcHByb3ZlZCBieSBJbnRlbCBpbiB3cml0aW5nLgogKi8KCiNpbmNsdWRlICJWaWRlb0VuY29kZXJNUDQuaCIKI2luY2x1ZGUgIlZpZGVvRW5jb2RlckgyNjMuaCIKI2luY2x1ZGUgIlZpZGVvRW5jb2RlckFWQy5oIgojaW5jbHVkZSAiVmlkZW9FbmNvZGVyVlA4LmgiCiNpZm5kZWYgSU1HX0dGWAojaW5jbHVkZSAiUFZTb2Z0TVBFRzRFbmNvZGVyLmgiCiNlbmRpZgojaW5jbHVkZSAiVmlkZW9FbmNvZGVySG9zdC5oIgojaW5jbHVkZSAiVmlkZW9FbmNvZGVyTG9nLmgiCiNpbmNsdWRlIDxzdHJpbmcuaD4KCklWaWRlb0VuY29kZXIgKmNyZWF0ZVZpZGVvRW5jb2Rlcihjb25zdCBjaGFyICptaW1lVHlwZSkgewoKICAgIGlmIChtaW1lVHlwZSA9PSBOVUxMKSB7CiAgICAgICAgTE9HX0UoIk5VTEwgbWltZSB0eXBlIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKHN0cmNhc2VjbXAobWltZVR5cGUsICJ2aWRlby9hdmMiKSA9PSAwIHx8CiAgICAgICAgICAgIHN0cmNhc2VjbXAobWltZVR5cGUsICJ2aWRlby9oMjY0IikgPT0gMCkgewogICAgICAgIFZpZGVvRW5jb2RlckFWQyAqcCA9IG5ldyBWaWRlb0VuY29kZXJBVkMoKTsKICAgICAgICByZXR1cm4gKElWaWRlb0VuY29kZXIgKilwOwogICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKG1pbWVUeXBlLCAidmlkZW8vaDI2MyIpID09IDApIHsKI2lmZGVmIElNR19HRlgKICAgICAgICBWaWRlb0VuY29kZXJIMjYzICpwID0gbmV3IFZpZGVvRW5jb2RlckgyNjMoKTsKI2Vsc2UKICAgICAgICBQVlNvZnRNUEVHNEVuY29kZXIgKnAgPSBuZXcgUFZTb2Z0TVBFRzRFbmNvZGVyKCJPTVguZ29vZ2xlLmgyNjMuZW5jb2RlciIpOwojZW5kaWYKICAgICAgICByZXR1cm4gKElWaWRlb0VuY29kZXIgKilwOwogICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKG1pbWVUeXBlLCAidmlkZW8vbXBlZzQiKSA9PSAwIHx8CiAgICAgICAgICAgIHN0cmNhc2VjbXAobWltZVR5cGUsICJ2aWRlby9tcDR2LWVzIikgPT0gMCkgewojaWZkZWYgSU1HX0dGWAogICAgICAgIFZpZGVvRW5jb2Rlck1QNCAqcCA9IG5ldyBWaWRlb0VuY29kZXJNUDQoKTsKI2Vsc2UKICAgICAgICBQVlNvZnRNUEVHNEVuY29kZXIgKnAgPSBuZXcgUFZTb2Z0TVBFRzRFbmNvZGVyKCJPTVguZ29vZ2xlLm1wZWc0LmVuY29kZXIiKTsKI2VuZGlmCiAgICAgICAgcmV0dXJuIChJVmlkZW9FbmNvZGVyICopcDsKICAgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChtaW1lVHlwZSwgInZpZGVvL3gtd2VibSIpID09IDApIHsKICAgICAgICBWaWRlb0VuY29kZXJWUDggKnAgPSBuZXcgVmlkZW9FbmNvZGVyVlA4KCk7CiAgICAgICAgcmV0dXJuIChJVmlkZW9FbmNvZGVyICopcDsKICAgIH0gZWxzZSB7CiAgICAgICAgTE9HX0UgKCJVbmtub3duIG1pbWUgdHlwZTogJXMiLCBtaW1lVHlwZSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKdm9pZCByZWxlYXNlVmlkZW9FbmNvZGVyKElWaWRlb0VuY29kZXIgKnApIHsKICAgIGlmIChwKSBkZWxldGUgcDsKfQoK