Ly8gYmFzaXN1X3RyYW5zY29kZXJfaW50ZXJuYWwuaCAtIFVuaXZlcnNhbCB0ZXh0dXJlIGZvcm1hdCB0cmFuc2NvZGVyIGxpYnJhcnkuCi8vIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IEJpbm9taWFsIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLy8KLy8gSW1wb3J0YW50OiBJZiBjb21waWxpbmcgd2l0aCBnY2MsIGJlIHN1cmUgc3RyaWN0IGFsaWFzaW5nIGlzIGRpc2FibGVkOiAtZm5vLXN0cmljdC1hbGlhc2luZwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi8vCi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiNwcmFnbWEgb25jZQoKI2lmZGVmIF9NU0NfVkVSCiNwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogNDEyNykgLy8gIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaXMgY29uc3RhbnQKI2VuZGlmCgovLyB2MS41MDogQWRkZWQgVUFTVEMgSERSIDR4NCBzdXBwb3J0Ci8vIHYxLjYwOiBBZGRlZCBSRE8gQVNUQyBIRFIgNng2IGFuZCBpbnRlcm1lZGlhdGUgc3VwcG9ydAovLyB2MS42NTogQWRkZWQgQVNUQyBMRFIgNHg0LTEyeDEyIGFuZCBYVUFTVEMgTERSIDR4NC0xMngxMiAobm90IHB1YmxpY2FsbHkgcmVsZWFzZWQpCi8vIHYyLjAwOiBBZGRlZCB1bmlmaWVkIGVmZm9ydC9xdWFsaXR5IG9wdGlvbnMgYWNyb3NzIGFsbCBmb3JtYXRzLCBmYXN0IGRpcmVjdCB0cmFuc2NvZGluZyBvZiBYVUFTVEMgNHg0LzZ4Ni84eDYgdG8gQkM3LCBhZGFwdGl2ZSBkZWJsb2NraW5nLCBaU3RkIG9yIGFyaXRobWV0aWMgcHJvZmlsZXMsIHdlaWdodCBncmlkIERDVAovLyB2Mi4xMDogS2hyb25vcyBtb2RpZmljYXRpb25zIHRvIEtUWDIgZmlsZSBmb3JtYXQgZm9yIFVBU1RDIEhEUiA2eDZpIHN1cHBvcnQgZm9yIEtUWC1Tb2Z0d2FyZSBjb21wYXRpYmxpdHkgKHdlJ3JlIGFsc28gbW9kaWZ5aW5nIGhvdyBYVUFTVEMgTERSIGZpbGVzIHVzZSBLVFgyIHRvIGJlIGNvbXBhdGlibGUpCi8vIHYyLjUwOiBTQ0QsIGluLWxvb3AgZGVibG9ja2luZywgc3RhbmRhcmRpemVkIGRlYmxvY2tpbmcgb3BlcmF0b3IgYXN0Y2YgZW5jb2RlciwgYmM3LT5hc3RjIDR4NCB0cmFuc2NvZGVyLCBhc3RjIGxkciA0eDQgZW5jb2RlciB1c2luZyBiYzdmLT50cmFuc2NvZGluZywgYXN0YyBsZHIgZW5jb2RlciBvcHRpbWl6YXRpb25zLCBYVUJDNyBmb3JtYXQsIEREUyB0cmFuc2NvZGluZy91bnBhY2tpbmcvaW5mbyBzdXBwb3J0CiNkZWZpbmUgQkFTSVNEX0xJQl9WRVJTSU9OIDI1MAojZGVmaW5lIEJBU0lTRF9WRVJTSU9OX1NUUklORyAiMDIuNTAiCgojaWZkZWYgX0RFQlVHCiNkZWZpbmUgQkFTSVNEX0JVSUxEX0RFQlVHCiNlbHNlCiNkZWZpbmUgQkFTSVNEX0JVSUxEX1JFTEVBU0UKI2VuZGlmCgojaW5jbHVkZSAiYmFzaXN1LmgiCiNpbmNsdWRlICJiYXNpc3VfYXN0Y19oZWxwZXJzLmgiCgojZGVmaW5lIEJBU0lTRF96bmV3ICh6ID0gMzY5NjkgKiAoeiAmIDY1NTM1KSArICh6ID4+IDE2KSkKCm5hbWVzcGFjZSBiYXNpc3UKewoJZXh0ZXJuIGJvb2wgZ19kZWJ1Z19wcmludGY7Cn0KCm5hbWVzcGFjZSBiYXNpc3QKewoJLy8gTG93LWxldmVsIGZvcm1hdHMgZGlyZWN0bHkgc3VwcG9ydGVkIGJ5IHRoZSB0cmFuc2NvZGVyIChvdGhlciBzdXBwb3J0ZWQgdGV4dHVyZSBmb3JtYXRzIGFyZSBjb21iaW5hdGlvbnMgb2YgdGhlc2UgbG93LWxldmVsIGJsb2NrIGZvcm1hdHMpLgoJLy8gWW91IHByb2JhYmx5IGRvbid0IGNhcmUgYWJvdXQgdGhlc2UgZW51bSdzIHVubGVzcyB5b3UgYXJlIGdvaW5nIHByZXR0eSBsb3ctbGV2ZWwgYW5kIGNhbGxpbmcgdGhlIHRyYW5zY29kZXIgdG8gZGVjb2RlIGluZGl2aWR1YWwgc2xpY2VzLgoJZW51bSBjbGFzcyBibG9ja19mb3JtYXQKCXsKCQljRVRDMSwJCQkJCQkJCS8vIEVUQzFTIFJHQiAKCQljRVRDMl9SR0JBLAkJCQkJCQkvLyBmdWxsIEVUQzIgRUFDIFJHQkE4IGJsb2NrCgkJY0JDMSwJCQkJCQkJCS8vIERYVDEgUkdCIAoJCWNCQzMsCQkJCQkJCQkvLyBCQzQgYmxvY2sgZm9sbG93ZWQgYnkgYSBmb3VyIGNvbG9yIEJDMSBibG9jawoJCWNCQzQsCQkJCQkJCQkvLyBEWFQ1QSAoYWxwaGEgYmxvY2sgb25seSkKCQljQkM1LAkJCQkJCQkJLy8gdHdvIEJDNCBibG9ja3MKCQljUFZSVEMxXzRfUkdCLAkJCQkJCS8vIG9wYXF1ZS1vbmx5IFBWUlRDMSA0YnBwCgkJY1BWUlRDMV80X1JHQkEsCQkJCQkJLy8gUFZSVEMxIDRicHAgUkdCQQoJCWNCQzcsCQkJCQkJCQkvLyBGdWxsIEJDNyBibG9jaywgYW55IG1vZGUKCQljQkM3X001X0NPTE9SLAkJCQkJCS8vIFJHQiBCQzcgbW9kZSA1IGNvbG9yICh3cml0ZXMgYW4gb3BhcXVlIG1vZGUgNSBibG9jaykKCQljQkM3X001X0FMUEhBLAkJCQkJCS8vIGFscGhhIHBvcnRpb24gb2YgQkM3IG1vZGUgNSAoY0JDN19NNV9DT0xPUiBvdXRwdXQgZGF0YSBtdXN0IGhhdmUgYmVlbiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgYnVmZmVyIGZpcnN0IHRvIHNldCB0aGUgbW9kZS9yb3QgZmllbGRzIGV0Yy4pCgkJY0VUQzJfRUFDX0E4LAkJCQkJCS8vIGFscGhhIGJsb2NrIG9mIEVUQzIgRUFDIChmaXJzdCA4IGJ5dGVzIG9mIHRoZSAxNi1iaXQgRVRDMiBFQUMgUkdCQSBmb3JtYXQpCgkJY0FTVENfTERSXzR4NCwJCQkJCQkvLyBBU1RDIExEUiA0eDQgKGVpdGhlciBjb2xvci1vbmx5IG9yIGNvbG9yK2FscGhhKS4gTm90ZSB0aGF0IHRoZSB0cmFuc2NvZGVyIGFsd2F5cyBjdXJyZW50bHkgYXNzdW1lcyBzUkdCIGRlY29kZSBtb2RlIGlzIG5vdCBlbmFibGVkIHdoZW4gb3V0cHV0dGluZyBBU1RDIExEUiBmb3IgRVRDMVMvVUFTVEMgTERSIDR4NC4KCQkJCQkJCQkJCQkvLyBkYXRhLiBJZiB5b3UgdXNlIGEgc1JHQiBBU1RDIGZvcm1hdCB5b3UnbGwgZ2V0IH4xIExTQiBvZiBhZGRpdGlvbmFsIGVycm9yLCBiZWNhdXNlIG9mIHRoZSBkaWZmZXJlbnQgd2F5IEFTVEMgZGVjb2RlcnMgc2NhbGUgOC1iaXQgZW5kcG9pbnRzIHRvIDE2LWJpdHMgZHVyaW5nIHVucGFja2luZy4KCQkKCQljQVRDX1JHQiwKCQljQVRDX1JHQkFfSU5URVJQT0xBVEVEX0FMUEhBLAoJCWNGWFQxX1JHQiwJCQkJCQkJLy8gT3BhcXVlLW9ubHksIGhhcyBvZGRiYWxsIDh4NCBwaXhlbCBibG9jayBzaXplCgoJCWNQVlJUQzJfNF9SR0IsCgkJY1BWUlRDMl80X1JHQkEsCgoJCWNFVEMyX0VBQ19SMTEsCgkJY0VUQzJfRUFDX1JHMTEsCgkJCQkJCQkJCQkJCQoJCWNJbmRpY2VzLAkJCQkJCQkvLyBVc2VkIGludGVybmFsbHk6IFdyaXRlIDE2LWJpdCBlbmRwb2ludCBhbmQgc2VsZWN0b3IgaW5kaWNlcyBkaXJlY3RseSB0byBvdXRwdXQgKG91dHB1dCBibG9jayBtdXN0IGJlIGF0IGxlYXN0IDMyLWJpdHMpCgoJCWNSR0IzMiwJCQkJCQkJCS8vIFdyaXRlcyBSR0IgY29tcG9uZW50cyB0byAzMmJwcCBvdXRwdXQgcGl4ZWxzCgkJY1JHQkEzMiwJCQkJCQkJLy8gV3JpdGVzIFJHQjI1NSBjb21wb25lbnRzIHRvIDMyYnBwIG91dHB1dCBwaXhlbHMKCQljQTMyLAkJCQkJCQkJLy8gV3JpdGVzIGFscGhhIGNvbXBvbmVudCB0byAzMmJwcCBvdXRwdXQgcGl4ZWxzCgkJCQkKCQljUkdCNTY1LAoJCWNCR1I1NjUsCgkJCgkJY1JHQkE0NDQ0X0NPTE9SLAoJCWNSR0JBNDQ0NF9BTFBIQSwKCQljUkdCQTQ0NDRfQ09MT1JfT1BBUVVFLAoJCWNSR0JBNDQ0NCwKCQljUkdCQV9IQUxGLAoJCWNSR0JfSEFMRiwKCQljUkdCXzlFNSwKCgkJY1VBU1RDXzR4NCwJCQkJCQkJLy8gTERSLCB1bml2ZXJzYWwKCQljVUFTVENfSERSXzR4NCwJCQkJCQkvLyBIRFIsIHRyYW5zY29kZXMgb25seSB0byA0eDQgSERSIEFTVEMsIEJDNkgsIG9yIHVuY29tcHJlc3NlZAoJCWNCQzZILAoJCQoJCWNBU1RDX0hEUl80eDQsCgkJY0FTVENfSERSXzZ4NiwKCgkJLy8gVGhlIHJlbWFpbmluZyBBU1RDIExEUiBibG9jayBzaXplcy4KCQljQVNUQ19MRFJfNXg0LAoJCWNBU1RDX0xEUl81eDUsCgkJY0FTVENfTERSXzZ4NSwKCQljQVNUQ19MRFJfNng2LAoJCWNBU1RDX0xEUl84eDUsCgkJY0FTVENfTERSXzh4NiwKCQljQVNUQ19MRFJfMTB4NSwKCQljQVNUQ19MRFJfMTB4NiwKCQljQVNUQ19MRFJfOHg4LAoJCWNBU1RDX0xEUl8xMHg4LAoJCWNBU1RDX0xEUl8xMHgxMCwKCQljQVNUQ19MRFJfMTJ4MTAsCgkJY0FTVENfTERSXzEyeDEyLAoJCQkJCQkJCQkJCgkJY1RvdGFsQmxvY2tGb3JtYXRzCgl9OwoKCWlubGluZSBib29sIGJsb2NrX2Zvcm1hdF9pc19oZHIoYmxvY2tfZm9ybWF0IGZtdCkKCXsKCQlzd2l0Y2ggKGZtdCkKCQl7CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNVQVNUQ19IRFJfNHg0OgoJCWNhc2UgYmxvY2tfZm9ybWF0OjpjQkM2SDoKCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0FTVENfSERSXzR4NDoKCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0FTVENfSERSXzZ4NjoKCQkJcmV0dXJuIHRydWU7CgkJZGVmYXVsdDoKCQkJYnJlYWs7CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLy8gTERSIG9yIEhEUiBBU1RDPwoJaW5saW5lIGJvb2wgYmxvY2tfZm9ybWF0X2lzX2FzdGMoYmxvY2tfZm9ybWF0IGZtdCkKCXsKCQlzd2l0Y2ggKGZtdCkKCQl7CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNBU1RDX0xEUl80eDQ6CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNBU1RDX0xEUl81eDQ6CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNBU1RDX0xEUl81eDU6CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNBU1RDX0xEUl82eDU6CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNBU1RDX0xEUl82eDY6CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNBU1RDX0xEUl84eDU6CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNBU1RDX0xEUl84eDY6CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNBU1RDX0xEUl8xMHg1OgoJCWNhc2UgYmxvY2tfZm9ybWF0OjpjQVNUQ19MRFJfMTB4NjoKCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0FTVENfTERSXzh4ODoKCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0FTVENfTERSXzEweDg6CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNBU1RDX0xEUl8xMHgxMDoKCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0FTVENfTERSXzEyeDEwOgoJCWNhc2UgYmxvY2tfZm9ybWF0OjpjQVNUQ19MRFJfMTJ4MTI6CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNBU1RDX0hEUl80eDQ6CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNBU1RDX0hEUl82eDY6CgkJCXJldHVybiB0cnVlOwoJCWRlZmF1bHQ6CgkJCWJyZWFrOwoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfQoKCWlubGluZSB1aW50MzJfdCBnZXRfYmxvY2tfd2lkdGgoYmxvY2tfZm9ybWF0IGZtdCkKCXsKCQlzd2l0Y2ggKGZtdCkKCQl7CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNGWFQxX1JHQjoKCQkJcmV0dXJuIDg7CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNBU1RDX0hEUl82eDY6CgkJCXJldHVybiA2OwoKCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0FTVENfTERSXzV4NDogcmV0dXJuIDU7CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNBU1RDX0xEUl81eDU6IHJldHVybiA1OwoJCWNhc2UgYmxvY2tfZm9ybWF0OjpjQVNUQ19MRFJfNng1OiByZXR1cm4gNjsKCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0FTVENfTERSXzZ4NjogcmV0dXJuIDY7CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNBU1RDX0xEUl84eDU6IHJldHVybiA4OwoJCWNhc2UgYmxvY2tfZm9ybWF0OjpjQVNUQ19MRFJfOHg2OiByZXR1cm4gODsKCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0FTVENfTERSXzEweDU6IHJldHVybiAxMDsKCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0FTVENfTERSXzEweDY6IHJldHVybiAxMDsKCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0FTVENfTERSXzh4ODogcmV0dXJuIDg7CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNBU1RDX0xEUl8xMHg4OiByZXR1cm4gMTA7CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNBU1RDX0xEUl8xMHgxMDogcmV0dXJuIDEwOwoJCWNhc2UgYmxvY2tfZm9ybWF0OjpjQVNUQ19MRFJfMTJ4MTA6IHJldHVybiAxMjsKCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0FTVENfTERSXzEyeDEyOiByZXR1cm4gMTI7CgoJCWRlZmF1bHQ6CgkJCWJyZWFrOwoJCX0KCQlyZXR1cm4gNDsKCX0KCglpbmxpbmUgdWludDMyX3QgZ2V0X2Jsb2NrX2hlaWdodChibG9ja19mb3JtYXQgZm10KQoJewoJCXN3aXRjaCAoZm10KQoJCXsKCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0FTVENfSERSXzZ4NjoKCQkJcmV0dXJuIDY7CgkJCQkJCgkJY2FzZSBibG9ja19mb3JtYXQ6OmNBU1RDX0xEUl81eDU6IHJldHVybiA1OwoJCWNhc2UgYmxvY2tfZm9ybWF0OjpjQVNUQ19MRFJfNng1OiByZXR1cm4gNTsKCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0FTVENfTERSXzZ4NjogcmV0dXJuIDY7CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNBU1RDX0xEUl84eDU6IHJldHVybiA1OwoJCWNhc2UgYmxvY2tfZm9ybWF0OjpjQVNUQ19MRFJfOHg2OiByZXR1cm4gNjsKCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0FTVENfTERSXzEweDU6IHJldHVybiA1OwoJCWNhc2UgYmxvY2tfZm9ybWF0OjpjQVNUQ19MRFJfMTB4NjogcmV0dXJuIDY7CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNBU1RDX0xEUl84eDg6IHJldHVybiA4OwoJCWNhc2UgYmxvY2tfZm9ybWF0OjpjQVNUQ19MRFJfMTB4ODogcmV0dXJuIDg7CgkJY2FzZSBibG9ja19mb3JtYXQ6OmNBU1RDX0xEUl8xMHgxMDogcmV0dXJuIDEwOwoJCWNhc2UgYmxvY2tfZm9ybWF0OjpjQVNUQ19MRFJfMTJ4MTA6IHJldHVybiAxMDsKCQljYXNlIGJsb2NrX2Zvcm1hdDo6Y0FTVENfTERSXzEyeDEyOiByZXR1cm4gMTI7CgoJCWRlZmF1bHQ6CgkJCWJyZWFrOwoJCX0KCQlyZXR1cm4gNDsKCX0KCglzdHJ1Y3QgYmM3X2Jsb2NrCgl7CgkJdWludDY0X3QgbV9xd29yZHNbMl07Cgl9OwoKCXN0cnVjdCBiYzFfYmxvY2sKCXsKCQllbnVtIHsgY1RvdGFsRW5kcG9pbnRCeXRlcyA9IDIsIGNUb3RhbFNlbGVjdG9yQnl0ZXMgPSA0IH07CgoJCXVpbnQ4X3QgbV9sb3dfY29sb3JbY1RvdGFsRW5kcG9pbnRCeXRlc107CgkJdWludDhfdCBtX2hpZ2hfY29sb3JbY1RvdGFsRW5kcG9pbnRCeXRlc107CgkJdWludDhfdCBtX3NlbGVjdG9yc1tjVG90YWxTZWxlY3RvckJ5dGVzXTsKCgkJaW5saW5lIHVpbnQzMl90IGdldF9oaWdoX2NvbG9yKCkgY29uc3QgeyByZXR1cm4gbV9oaWdoX2NvbG9yWzBdIHwgKG1faGlnaF9jb2xvclsxXSA8PCA4VSk7IH0KCQlpbmxpbmUgdWludDMyX3QgZ2V0X2xvd19jb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fbG93X2NvbG9yWzBdIHwgKG1fbG93X2NvbG9yWzFdIDw8IDhVKTsgfQoKCQlzdGF0aWMgdm9pZCB1bnBhY2tfY29sb3IodWludDMyX3QgYywgdWludDMyX3QmIHIsIHVpbnQzMl90JiBnLCB1aW50MzJfdCYgYikKCQl7CgkJCXIgPSAoYyA+PiAxMSkgJiAzMTsKCQkJZyA9IChjID4+IDUpICYgNjM7CgkJCWIgPSBjICYgMzE7CgoJCQlyID0gKHIgPDwgMykgfCAociA+PiAyKTsKCQkJZyA9IChnIDw8IDIpIHwgKGcgPj4gNCk7CgkJCWIgPSAoYiA8PCAzKSB8IChiID4+IDIpOwoJCX0KCgkJaW5saW5lIHVpbnQzMl90IGdldF9zZWxlY3Rvcih1aW50MzJfdCB4LCB1aW50MzJfdCB5KSBjb25zdCB7IGFzc2VydCgoeCA8IDRVKSAmJiAoeSA8IDRVKSk7IHJldHVybiAobV9zZWxlY3RvcnNbeV0gPj4gKHggKiAyKSkgJiAzOyB9Cgl9OwoKCWNvbnN0IGludCBDT0xPUjVfUEFMMF9QUkVWX0hJID0gOSwgQ09MT1I1X1BBTDBfREVMVEFfTE8gPSAtOSwgQ09MT1I1X1BBTDBfREVMVEFfSEkgPSAzMTsKCWNvbnN0IGludCBDT0xPUjVfUEFMMV9QUkVWX0hJID0gMjEsIENPTE9SNV9QQUwxX0RFTFRBX0xPID0gLTIxLCBDT0xPUjVfUEFMMV9ERUxUQV9ISSA9IDIxOwoJY29uc3QgaW50IENPTE9SNV9QQUwyX1BSRVZfSEkgPSAzMSwgQ09MT1I1X1BBTDJfREVMVEFfTE8gPSAtMzEsIENPTE9SNV9QQUwyX0RFTFRBX0hJID0gOTsKCWNvbnN0IGludCBDT0xPUjVfUEFMX01JTl9ERUxUQV9CX1JVTkxFTiA9IDMsIENPTE9SNV9QQUxfREVMVEFfNV9SVU5MRU5fVkxDX0JJVFMgPSAzOwoKCWNvbnN0IHVpbnQzMl90IEVORFBPSU5UX1BSRURfVE9UQUxfU1lNQk9MUyA9ICg0ICogNCAqIDQgKiA0KSArIDE7Cgljb25zdCB1aW50MzJfdCBFTkRQT0lOVF9QUkVEX1JFUEVBVF9MQVNUX1NZTUJPTCA9IEVORFBPSU5UX1BSRURfVE9UQUxfU1lNQk9MUyAtIDE7Cgljb25zdCB1aW50MzJfdCBFTkRQT0lOVF9QUkVEX01JTl9SRVBFQVRfQ09VTlQgPSAzOwoJY29uc3QgdWludDMyX3QgRU5EUE9JTlRfUFJFRF9DT1VOVF9WTENfQklUUyA9IDQ7CgoJY29uc3QgdWludDMyX3QgTlVNX0VORFBPSU5UX1BSRURTID0gMzsvLyBCQVNJU1VfQVJSQVlfU0laRShnX2VuZHBvaW50X3ByZWRzKTsKCWNvbnN0IHVpbnQzMl90IENSX0VORFBPSU5UX1BSRURfSU5ERVggPSBOVU1fRU5EUE9JTlRfUFJFRFMgLSAxOwoJY29uc3QgdWludDMyX3QgTk9fRU5EUE9JTlRfUFJFRF9JTkRFWCA9IDM7Ly9OVU1fRU5EUE9JTlRfUFJFRFM7Cgljb25zdCB1aW50MzJfdCBNQVhfU0VMRUNUT1JfSElTVE9SWV9CVUZfU0laRSA9IDY0OwoJY29uc3QgdWludDMyX3QgU0VMRUNUT1JfSElTVE9SWV9CVUZfUkxFX0NPVU5UX1RIUkVTSCA9IDM7Cgljb25zdCB1aW50MzJfdCBTRUxFQ1RPUl9ISVNUT1JZX0JVRl9STEVfQ09VTlRfQklUUyA9IDY7Cgljb25zdCB1aW50MzJfdCBTRUxFQ1RPUl9ISVNUT1JZX0JVRl9STEVfQ09VTlRfVE9UQUwgPSAoMSA8PCBTRUxFQ1RPUl9ISVNUT1JZX0JVRl9STEVfQ09VTlRfQklUUyk7CgkJCgl1aW50MTZfdCBjcmMxNihjb25zdCB2b2lkICpyLCBzaXplX3Qgc2l6ZSwgdWludDE2X3QgY3JjKTsKCgl1aW50MzJfdCBoYXNoX2hzaWVoKGNvbnN0IHVpbnQ4X3QqIHBCdWYsIHNpemVfdCBsZW4pOwoKCXRlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CglzdHJ1Y3QgYml0X2hhc2hlcgoJewoJCWlubGluZSBzdGQ6OnNpemVfdCBvcGVyYXRvcigpKGNvbnN0IEtleSYgaykgY29uc3QKCQl7CgkJCXJldHVybiBoYXNoX2hzaWVoKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCZrKSwgc2l6ZW9mKGspKTsKCQl9Cgl9OwoKCXN0cnVjdCBzdHJpbmdfaGFzaGVyCgl7CgkJaW5saW5lIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpzdHJpbmcmIGspIGNvbnN0CgkJewoJCQlzaXplX3QgbCA9IGsuc2l6ZSgpOwoJCQlpZiAoIWwpCgkJCQlyZXR1cm4gMDsKCQkJcmV0dXJuIGhhc2hfaHNpZWgocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oay5jX3N0cigpKSwgbCk7CgkJfQoJfTsKCgljbGFzcyBodWZmbWFuX2RlY29kaW5nX3RhYmxlCgl7CgkJZnJpZW5kIGNsYXNzIGJpdHdpc2VfZGVjb2RlcjsKCglwdWJsaWM6CgkJaHVmZm1hbl9kZWNvZGluZ190YWJsZSgpCgkJewoJCX0KCgkJdm9pZCBjbGVhcigpCgkJewoJCQliYXNpc3U6OmNsZWFyX3ZlY3RvcihtX2NvZGVfc2l6ZXMpOwoJCQliYXNpc3U6OmNsZWFyX3ZlY3RvcihtX2xvb2t1cCk7CgkJCWJhc2lzdTo6Y2xlYXJfdmVjdG9yKG1fdHJlZSk7CgkJfQoKCQlib29sIGluaXQodWludDMyX3QgdG90YWxfc3ltcywgY29uc3QgdWludDhfdCAqcENvZGVfc2l6ZXMsIHVpbnQzMl90IGZhc3RfbG9va3VwX2JpdHMgPSBiYXNpc3U6OmNIdWZmbWFuRmFzdExvb2t1cEJpdHMpCgkJewoJCQlpZiAoIXRvdGFsX3N5bXMpCgkJCXsKCQkJCWNsZWFyKCk7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoKCQkJbV9jb2RlX3NpemVzLnJlc2l6ZSh0b3RhbF9zeW1zKTsKCQkJbWVtY3B5KCZtX2NvZGVfc2l6ZXNbMF0sIHBDb2RlX3NpemVzLCB0b3RhbF9zeW1zKTsKCgkJCWNvbnN0IHVpbnQzMl90IGh1ZmZtYW5fZmFzdF9sb29rdXBfc2l6ZSA9IDEgPDwgZmFzdF9sb29rdXBfYml0czsKCgkJCW1fbG9va3VwLnJlc2l6ZSgwKTsKCQkJbV9sb29rdXAucmVzaXplKGh1ZmZtYW5fZmFzdF9sb29rdXBfc2l6ZSk7CgoJCQltX3RyZWUucmVzaXplKDApOwoJCQltX3RyZWUucmVzaXplKHRvdGFsX3N5bXMgKiAyKTsKCgkJCXVpbnQzMl90IHN5bXNfdXNpbmdfY29kZXNpemVbYmFzaXN1OjpjSHVmZm1hbk1heFN1cHBvcnRlZEludGVybmFsQ29kZVNpemUgKyAxXTsKCQkJYmFzaXN1OjpjbGVhcl9vYmooc3ltc191c2luZ19jb2Rlc2l6ZSk7CgkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCB0b3RhbF9zeW1zOyBpKyspCgkJCXsKCQkJCWlmIChwQ29kZV9zaXplc1tpXSA+IGJhc2lzdTo6Y0h1ZmZtYW5NYXhTdXBwb3J0ZWRJbnRlcm5hbENvZGVTaXplKQoJCQkJCXJldHVybiBmYWxzZTsKCQkJCXN5bXNfdXNpbmdfY29kZXNpemVbcENvZGVfc2l6ZXNbaV1dKys7CgkJCX0KCgkJCXVpbnQzMl90IG5leHRfY29kZVtiYXNpc3U6OmNIdWZmbWFuTWF4U3VwcG9ydGVkSW50ZXJuYWxDb2RlU2l6ZSArIDFdOwoJCQluZXh0X2NvZGVbMF0gPSBuZXh0X2NvZGVbMV0gPSAwOwoKCQkJdWludDMyX3QgdXNlZF9zeW1zID0gMCwgdG90YWwgPSAwOwoJCQlmb3IgKHVpbnQzMl90IGkgPSAxOyBpIDwgYmFzaXN1OjpjSHVmZm1hbk1heFN1cHBvcnRlZEludGVybmFsQ29kZVNpemU7IGkrKykKCQkJewoJCQkJdXNlZF9zeW1zICs9IHN5bXNfdXNpbmdfY29kZXNpemVbaV07CgkJCQluZXh0X2NvZGVbaSArIDFdID0gKHRvdGFsID0gKCh0b3RhbCArIHN5bXNfdXNpbmdfY29kZXNpemVbaV0pIDw8IDEpKTsKCQkJfQoKCQkJaWYgKCgoMVUgPDwgYmFzaXN1OjpjSHVmZm1hbk1heFN1cHBvcnRlZEludGVybmFsQ29kZVNpemUpICE9IHRvdGFsKSAmJiAodXNlZF9zeW1zICE9IDFVKSkKCQkJCXJldHVybiBmYWxzZTsKCgkJCWZvciAoaW50IHRyZWVfbmV4dCA9IC0xLCBzeW1faW5kZXggPSAwOyBzeW1faW5kZXggPCAoaW50KXRvdGFsX3N5bXM7ICsrc3ltX2luZGV4KQoJCQl7CgkJCQl1aW50MzJfdCByZXZfY29kZSA9IDAsIGwsIGN1cl9jb2RlLCBjb2RlX3NpemUgPSBwQ29kZV9zaXplc1tzeW1faW5kZXhdOwoJCQkJaWYgKCFjb2RlX3NpemUpCgkJCQkJY29udGludWU7CgoJCQkJY3VyX2NvZGUgPSBuZXh0X2NvZGVbY29kZV9zaXplXSsrOwoKCQkJCWZvciAobCA9IGNvZGVfc2l6ZTsgbCA+IDA7IGwtLSwgY3VyX2NvZGUgPj49IDEpCgkJCQkJcmV2X2NvZGUgPSAocmV2X2NvZGUgPDwgMSkgfCAoY3VyX2NvZGUgJiAxKTsKCgkJCQlpZiAoY29kZV9zaXplIDw9IGZhc3RfbG9va3VwX2JpdHMpCgkJCQl7CgkJCQkJdWludDMyX3QgayA9IChjb2RlX3NpemUgPDwgMTYpIHwgc3ltX2luZGV4OwoJCQkJCXdoaWxlIChyZXZfY29kZSA8IGh1ZmZtYW5fZmFzdF9sb29rdXBfc2l6ZSkKCQkJCQl7CgkJCQkJCWlmIChtX2xvb2t1cFtyZXZfY29kZV0gIT0gMCkKCQkJCQkJewoJCQkJCQkJLy8gU3VwcGxpZWQgY29kZXNpemVzIGNhbid0IGNyZWF0ZSBhIHZhbGlkIHByZWZpeCBjb2RlLgoJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQl9CgoJCQkJCQltX2xvb2t1cFtyZXZfY29kZV0gPSBrOwoJCQkJCQlyZXZfY29kZSArPSAoMSA8PCBjb2RlX3NpemUpOwoJCQkJCX0KCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQlpbnQgdHJlZV9jdXI7CgkJCQlpZiAoMCA9PSAodHJlZV9jdXIgPSBtX2xvb2t1cFtyZXZfY29kZSAmIChodWZmbWFuX2Zhc3RfbG9va3VwX3NpemUgLSAxKV0pKQoJCQkJewoJCQkJCWNvbnN0IHVpbnQzMl90IGlkeCA9IHJldl9jb2RlICYgKGh1ZmZtYW5fZmFzdF9sb29rdXBfc2l6ZSAtIDEpOwoJCQkJCWlmIChtX2xvb2t1cFtpZHhdICE9IDApCgkJCQkJewoJCQkJCQkvLyBTdXBwbGllZCBjb2Rlc2l6ZXMgY2FuJ3QgY3JlYXRlIGEgdmFsaWQgcHJlZml4IGNvZGUuCgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgoJCQkJCW1fbG9va3VwW2lkeF0gPSB0cmVlX25leHQ7CgkJCQkJdHJlZV9jdXIgPSB0cmVlX25leHQ7CgkJCQkJdHJlZV9uZXh0IC09IDI7CgkJCQl9CgoJCQkJaWYgKHRyZWVfY3VyID49IDApCgkJCQl7CgkJCQkJLy8gU3VwcGxpZWQgY29kZXNpemVzIGNhbid0IGNyZWF0ZSBhIHZhbGlkIHByZWZpeCBjb2RlLgoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCgkJCQlyZXZfY29kZSA+Pj0gKGZhc3RfbG9va3VwX2JpdHMgLSAxKTsKCgkJCQlmb3IgKGludCBqID0gY29kZV9zaXplOyBqID4gKChpbnQpZmFzdF9sb29rdXBfYml0cyArIDEpOyBqLS0pCgkJCQl7CgkJCQkJdHJlZV9jdXIgLT0gKChyZXZfY29kZSA+Pj0gMSkgJiAxKTsKCgkJCQkJY29uc3QgaW50IGlkeCA9IC10cmVlX2N1ciAtIDE7CgkJCQkJaWYgKGlkeCA8IDApCgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQllbHNlIGlmIChpZHggPj0gKGludCltX3RyZWUuc2l6ZSgpKQoJCQkJCQltX3RyZWUucmVzaXplKGlkeCArIDEpOwoJCQkJCQkJCQkJCgkJCQkJaWYgKCFtX3RyZWVbaWR4XSkKCQkJCQl7CgkJCQkJCW1fdHJlZVtpZHhdID0gKGludDE2X3QpdHJlZV9uZXh0OwoJCQkJCQl0cmVlX2N1ciA9IHRyZWVfbmV4dDsKCQkJCQkJdHJlZV9uZXh0IC09IDI7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXRyZWVfY3VyID0gbV90cmVlW2lkeF07CgkJCQkJCWlmICh0cmVlX2N1ciA+PSAwKQoJCQkJCQl7CgkJCQkJCQkvLyBTdXBwbGllZCBjb2Rlc2l6ZXMgY2FuJ3QgY3JlYXRlIGEgdmFsaWQgcHJlZml4IGNvZGUuCgkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgoJCQkJdHJlZV9jdXIgLT0gKChyZXZfY29kZSA+Pj0gMSkgJiAxKTsKCgkJCQljb25zdCBpbnQgaWR4ID0gLXRyZWVfY3VyIC0gMTsKCQkJCWlmIChpZHggPCAwKQoJCQkJCXJldHVybiBmYWxzZTsKCQkJCWVsc2UgaWYgKGlkeCA+PSAoaW50KW1fdHJlZS5zaXplKCkpCgkJCQkJbV90cmVlLnJlc2l6ZShpZHggKyAxKTsKCgkJCQlpZiAobV90cmVlW2lkeF0gIT0gMCkKCQkJCXsKCQkJCQkvLyBTdXBwbGllZCBjb2Rlc2l6ZXMgY2FuJ3QgY3JlYXRlIGEgdmFsaWQgcHJlZml4IGNvZGUuCgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoKCQkJCW1fdHJlZVtpZHhdID0gKGludDE2X3Qpc3ltX2luZGV4OwoJCQl9CgoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCWNvbnN0IGJhc2lzdTo6dWludDhfdmVjICZnZXRfY29kZV9zaXplcygpIGNvbnN0IHsgcmV0dXJuIG1fY29kZV9zaXplczsgfQoJCWNvbnN0IGJhc2lzdTo6aW50X3ZlYyAmZ2V0X2xvb2t1cCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9va3VwOyB9CgkJY29uc3QgYmFzaXN1OjppbnQxNl92ZWMgJmdldF90cmVlKCkgY29uc3QgeyByZXR1cm4gbV90cmVlOyB9CgoJCWJvb2wgaXNfdmFsaWQoKSBjb25zdCB7IHJldHVybiBtX2NvZGVfc2l6ZXMuc2l6ZSgpID4gMDsgfQoKCXByaXZhdGU6CgkJYmFzaXN1Ojp1aW50OF92ZWMgbV9jb2RlX3NpemVzOwoJCWJhc2lzdTo6aW50X3ZlYyBtX2xvb2t1cDsKCQliYXNpc3U6OmludDE2X3ZlYyBtX3RyZWU7Cgl9OwoKCWNsYXNzIGJpdHdpc2VfZGVjb2RlcgoJewoJcHVibGljOgoJCWJpdHdpc2VfZGVjb2RlcigpIDoKCQkJbV9idWZfc2l6ZSgwKSwKCQkJbV9wQnVmKG51bGxwdHIpLAoJCQltX3BCdWZfc3RhcnQobnVsbHB0ciksCgkJCW1fcEJ1Zl9lbmQobnVsbHB0ciksCgkJCW1fYml0X2J1ZigwKSwKCQkJbV9iaXRfYnVmX3NpemUoMCkKCQl7CgkJfQoKCQl2b2lkIGNsZWFyKCkKCQl7CgkJCW1fYnVmX3NpemUgPSAwOwoJCQltX3BCdWYgPSBudWxscHRyOwoJCQltX3BCdWZfc3RhcnQgPSBudWxscHRyOwoJCQltX3BCdWZfZW5kID0gbnVsbHB0cjsKCQkJbV9iaXRfYnVmID0gMDsKCQkJbV9iaXRfYnVmX3NpemUgPSAwOwoJCX0KCgkJYm9vbCBpbml0KGNvbnN0IHVpbnQ4X3QgKnBCdWYsIHVpbnQzMl90IGJ1Zl9zaXplKQoJCXsKCQkJaWYgKCghcEJ1ZikgJiYgKGJ1Zl9zaXplKSkKCQkJCXJldHVybiBmYWxzZTsKCgkJCW1fYnVmX3NpemUgPSBidWZfc2l6ZTsKCQkJbV9wQnVmID0gcEJ1ZjsKCQkJbV9wQnVmX3N0YXJ0ID0gcEJ1ZjsKCQkJbV9wQnVmX2VuZCA9IHBCdWYgKyBidWZfc2l6ZTsKCQkJbV9iaXRfYnVmID0gMDsKCQkJbV9iaXRfYnVmX3NpemUgPSAwOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCXZvaWQgc3RvcCgpCgkJewoJCX0KCQkJCQoJCWlubGluZSB1aW50MzJfdCBwZWVrX2JpdHModWludDMyX3QgbnVtX2JpdHMpCgkJewoJCQlpZiAoIW51bV9iaXRzKQoJCQkJcmV0dXJuIDA7CgoJCQlhc3NlcnQobnVtX2JpdHMgPD0gMjUpOwoKCQkJd2hpbGUgKG1fYml0X2J1Zl9zaXplIDwgbnVtX2JpdHMpCgkJCXsKCQkJCXVpbnQzMl90IGMgPSAwOwoJCQkJaWYgKG1fcEJ1ZiA8IG1fcEJ1Zl9lbmQpCgkJCQkJYyA9ICptX3BCdWYrKzsKCgkJCQltX2JpdF9idWYgfD0gKGMgPDwgbV9iaXRfYnVmX3NpemUpOwoJCQkJbV9iaXRfYnVmX3NpemUgKz0gODsKCQkJCWFzc2VydChtX2JpdF9idWZfc2l6ZSA8PSAzMik7CgkJCX0KCgkJCXJldHVybiBtX2JpdF9idWYgJiAoKDEgPDwgbnVtX2JpdHMpIC0gMSk7CgkJfQoKCQl2b2lkIHJlbW92ZV9iaXRzKHVpbnQzMl90IG51bV9iaXRzKQoJCXsKCQkJYXNzZXJ0KG1fYml0X2J1Zl9zaXplID49IG51bV9iaXRzKTsKCgkJCW1fYml0X2J1ZiA+Pj0gbnVtX2JpdHM7CgkJCW1fYml0X2J1Zl9zaXplIC09IG51bV9iaXRzOwoJCX0KCgkJdWludDMyX3QgZ2V0X2JpdHModWludDMyX3QgbnVtX2JpdHMpCgkJewoJCQlpZiAobnVtX2JpdHMgPiAyNSkKCQkJewoJCQkJYXNzZXJ0KG51bV9iaXRzIDw9IDMyKTsKCgkJCQljb25zdCB1aW50MzJfdCBiaXRzMCA9IHBlZWtfYml0cygyNSk7CgkJCQltX2JpdF9idWYgPj49IDI1OwoJCQkJbV9iaXRfYnVmX3NpemUgLT0gMjU7CgkJCQludW1fYml0cyAtPSAyNTsKCgkJCQljb25zdCB1aW50MzJfdCBiaXRzID0gcGVla19iaXRzKG51bV9iaXRzKTsKCQkJCW1fYml0X2J1ZiA+Pj0gbnVtX2JpdHM7CgkJCQltX2JpdF9idWZfc2l6ZSAtPSBudW1fYml0czsKCgkJCQlyZXR1cm4gYml0czAgfCAoYml0cyA8PCAyNSk7CgkJCX0KCgkJCWNvbnN0IHVpbnQzMl90IGJpdHMgPSBwZWVrX2JpdHMobnVtX2JpdHMpOwoKCQkJbV9iaXRfYnVmID4+PSBudW1fYml0czsKCQkJbV9iaXRfYnVmX3NpemUgLT0gbnVtX2JpdHM7CgoJCQlyZXR1cm4gYml0czsKCQl9CgoJCXVpbnQzMl90IGRlY29kZV90cnVuY2F0ZWRfYmluYXJ5KHVpbnQzMl90IG4pCgkJewoJCQlhc3NlcnQobiA+PSAyKTsKCgkJCWNvbnN0IHVpbnQzMl90IGsgPSBiYXNpc3U6OmZsb29yX2xvZzJpKG4pOwoJCQljb25zdCB1aW50MzJfdCB1ID0gKDEgPDwgKGsgKyAxKSkgLSBuOwoKCQkJdWludDMyX3QgcmVzdWx0ID0gZ2V0X2JpdHMoayk7CgoJCQlpZiAocmVzdWx0ID49IHUpCgkJCQlyZXN1bHQgPSAoKHJlc3VsdCA8PCAxKSB8IGdldF9iaXRzKDEpKSAtIHU7CgoJCQlyZXR1cm4gcmVzdWx0OwoJCX0KCgkJdWludDMyX3QgZGVjb2RlX3JpY2UodWludDMyX3QgbSkKCQl7CgkJCWFzc2VydChtKTsKCgkJCXVpbnQzMl90IHEgPSAwOwoJCQlmb3IgKDs7KQoJCQl7CgkJCQl1aW50MzJfdCBrID0gcGVla19iaXRzKDE2KTsKCQkJCQoJCQkJdWludDMyX3QgbCA9IDA7CgkJCQl3aGlsZSAoayAmIDEpCgkJCQl7CgkJCQkJbCsrOwoJCQkJCWsgPj49IDE7CgkJCQl9CgkJCQkKCQkJCXEgKz0gbDsKCgkJCQlyZW1vdmVfYml0cyhsKTsKCgkJCQlpZiAobCA8IDE2KQoJCQkJCWJyZWFrOwoJCQl9CgoJCQlyZXR1cm4gKHEgPDwgbSkgKyAoZ2V0X2JpdHMobSArIDEpID4+IDEpOwoJCX0KCgkJaW5saW5lIHVpbnQzMl90IGRlY29kZV92bGModWludDMyX3QgY2h1bmtfYml0cykKCQl7CgkJCWFzc2VydChjaHVua19iaXRzKTsKCgkJCWNvbnN0IHVpbnQzMl90IGNodW5rX3NpemUgPSAxIDw8IGNodW5rX2JpdHM7CgkJCWNvbnN0IHVpbnQzMl90IGNodW5rX21hc2sgPSBjaHVua19zaXplIC0gMTsKCQkJCQkKCQkJdWludDMyX3QgdiA9IDA7CgkJCXVpbnQzMl90IG9mcyA9IDA7CgoJCQlmb3IgKCA7IDsgKQoJCQl7CgkJCQl1aW50MzJfdCBzID0gZ2V0X2JpdHMoY2h1bmtfYml0cyArIDEpOwoJCQkJdiB8PSAoKHMgJiBjaHVua19tYXNrKSA8PCBvZnMpOwoJCQkJb2ZzICs9IGNodW5rX2JpdHM7CgoJCQkJaWYgKChzICYgY2h1bmtfc2l6ZSkgPT0gMCkKCQkJCQlicmVhazsKCQkJCQoJCQkJaWYgKG9mcyA+PSAzMikKCQkJCXsKCQkJCQlhc3NlcnQoMCk7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCgkJCXJldHVybiB2OwoJCX0KCgkJaW5saW5lIHVpbnQzMl90IGRlY29kZV9odWZmbWFuKGNvbnN0IGh1ZmZtYW5fZGVjb2RpbmdfdGFibGUgJmN0LCBpbnQgZmFzdF9sb29rdXBfYml0cyA9IGJhc2lzdTo6Y0h1ZmZtYW5GYXN0TG9va3VwQml0cykKCQl7CgkJCWFzc2VydChjdC5tX2NvZGVfc2l6ZXMuc2l6ZSgpKTsKCgkJCWNvbnN0IHVpbnQzMl90IGh1ZmZtYW5fZmFzdF9sb29rdXBfc2l6ZSA9IDEgPDwgZmFzdF9sb29rdXBfYml0czsKCQkJCQkJCgkJCXdoaWxlIChtX2JpdF9idWZfc2l6ZSA8IDE2KQoJCQl7CgkJCQl1aW50MzJfdCBjID0gMDsKCQkJCWlmIChtX3BCdWYgPCBtX3BCdWZfZW5kKQoJCQkJCWMgPSAqbV9wQnVmKys7CgoJCQkJbV9iaXRfYnVmIHw9IChjIDw8IG1fYml0X2J1Zl9zaXplKTsKCQkJCW1fYml0X2J1Zl9zaXplICs9IDg7CgkJCQlhc3NlcnQobV9iaXRfYnVmX3NpemUgPD0gMzIpOwoJCQl9CgkJCQkJCQoJCQlpbnQgY29kZV9sZW47CgoJCQlpbnQgc3ltOwoJCQlpZiAoKHN5bSA9IGN0Lm1fbG9va3VwW21fYml0X2J1ZiAmIChodWZmbWFuX2Zhc3RfbG9va3VwX3NpemUgLSAxKV0pID49IDApCgkJCXsKCQkJCWNvZGVfbGVuID0gc3ltID4+IDE2OwoJCQkJc3ltICY9IDB4RkZGRjsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWNvZGVfbGVuID0gZmFzdF9sb29rdXBfYml0czsKCQkJCWRvCgkJCQl7CgkJCQkJc3ltID0gY3QubV90cmVlW35zeW0gKyAoKG1fYml0X2J1ZiA+PiBjb2RlX2xlbisrKSAmIDEpXTsgLy8gfnN5bSA9IC1zeW0gLSAxCgkJCQl9IHdoaWxlIChzeW0gPCAwKTsKCQkJfQoKCQkJbV9iaXRfYnVmID4+PSBjb2RlX2xlbjsKCQkJbV9iaXRfYnVmX3NpemUgLT0gY29kZV9sZW47CgoJCQlyZXR1cm4gc3ltOwoJCX0KCgkJYm9vbCByZWFkX2h1ZmZtYW5fdGFibGUoaHVmZm1hbl9kZWNvZGluZ190YWJsZSAmY3QpCgkJewoJCQljdC5jbGVhcigpOwoKCQkJY29uc3QgdWludDMyX3QgdG90YWxfdXNlZF9zeW1zID0gZ2V0X2JpdHMoYmFzaXN1OjpjSHVmZm1hbk1heFN5bXNMb2cyKTsKCgkJCWlmICghdG90YWxfdXNlZF9zeW1zKQoJCQkJcmV0dXJuIHRydWU7CgkJCWlmICh0b3RhbF91c2VkX3N5bXMgPiBiYXNpc3U6OmNIdWZmbWFuTWF4U3ltcykKCQkJCXJldHVybiBmYWxzZTsKCgkJCXVpbnQ4X3QgY29kZV9sZW5ndGhfY29kZV9zaXplc1tiYXNpc3U6OmNIdWZmbWFuVG90YWxDb2RlbGVuZ3RoQ29kZXNdOwoJCQliYXNpc3U6OmNsZWFyX29iaihjb2RlX2xlbmd0aF9jb2RlX3NpemVzKTsKCgkJCWNvbnN0IHVpbnQzMl90IG51bV9jb2RlbGVuZ3RoX2NvZGVzID0gZ2V0X2JpdHMoNSk7CgkJCWlmICgobnVtX2NvZGVsZW5ndGhfY29kZXMgPCAxKSB8fCAobnVtX2NvZGVsZW5ndGhfY29kZXMgPiBiYXNpc3U6OmNIdWZmbWFuVG90YWxDb2RlbGVuZ3RoQ29kZXMpKQoJCQkJcmV0dXJuIGZhbHNlOwoKCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bV9jb2RlbGVuZ3RoX2NvZGVzOyBpKyspCgkJCQljb2RlX2xlbmd0aF9jb2RlX3NpemVzW2Jhc2lzdTo6Z19odWZmbWFuX3NvcnRlZF9jb2RlbGVuZ3RoX2NvZGVzW2ldXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGdldF9iaXRzKDMpKTsKCgkJCWh1ZmZtYW5fZGVjb2RpbmdfdGFibGUgY29kZV9sZW5ndGhfdGFibGU7CgkJCWlmICghY29kZV9sZW5ndGhfdGFibGUuaW5pdChiYXNpc3U6OmNIdWZmbWFuVG90YWxDb2RlbGVuZ3RoQ29kZXMsIGNvZGVfbGVuZ3RoX2NvZGVfc2l6ZXMpKQoJCQkJcmV0dXJuIGZhbHNlOwoKCQkJaWYgKCFjb2RlX2xlbmd0aF90YWJsZS5pc192YWxpZCgpKQoJCQkJcmV0dXJuIGZhbHNlOwoKCQkJYmFzaXN1Ojp1aW50OF92ZWMgY29kZV9zaXplcyh0b3RhbF91c2VkX3N5bXMpOwoKCQkJdWludDMyX3QgY3VyID0gMDsKCQkJd2hpbGUgKGN1ciA8IHRvdGFsX3VzZWRfc3ltcykKCQkJewoJCQkJaW50IGMgPSBkZWNvZGVfaHVmZm1hbihjb2RlX2xlbmd0aF90YWJsZSk7CgoJCQkJaWYgKGMgPD0gMTYpCgkJCQkJY29kZV9zaXplc1tjdXIrK10gPSBzdGF0aWNfY2FzdDx1aW50OF90PihjKTsKCQkJCWVsc2UgaWYgKGMgPT0gYmFzaXN1OjpjSHVmZm1hblNtYWxsWmVyb1J1bkNvZGUpCgkJCQkJY3VyICs9IGdldF9iaXRzKGJhc2lzdTo6Y0h1ZmZtYW5TbWFsbFplcm9SdW5FeHRyYUJpdHMpICsgYmFzaXN1OjpjSHVmZm1hblNtYWxsWmVyb1J1blNpemVNaW47CgkJCQllbHNlIGlmIChjID09IGJhc2lzdTo6Y0h1ZmZtYW5CaWdaZXJvUnVuQ29kZSkKCQkJCQljdXIgKz0gZ2V0X2JpdHMoYmFzaXN1OjpjSHVmZm1hbkJpZ1plcm9SdW5FeHRyYUJpdHMpICsgYmFzaXN1OjpjSHVmZm1hbkJpZ1plcm9SdW5TaXplTWluOwoJCQkJZWxzZQoJCQkJewoJCQkJCWlmICghY3VyKQoJCQkJCQlyZXR1cm4gZmFsc2U7CgoJCQkJCXVpbnQzMl90IGw7CgkJCQkJaWYgKGMgPT0gYmFzaXN1OjpjSHVmZm1hblNtYWxsUmVwZWF0Q29kZSkKCQkJCQkJbCA9IGdldF9iaXRzKGJhc2lzdTo6Y0h1ZmZtYW5TbWFsbFJlcGVhdEV4dHJhQml0cykgKyBiYXNpc3U6OmNIdWZmbWFuU21hbGxSZXBlYXRTaXplTWluOwoJCQkJCWVsc2UKCQkJCQkJbCA9IGdldF9iaXRzKGJhc2lzdTo6Y0h1ZmZtYW5CaWdSZXBlYXRFeHRyYUJpdHMpICsgYmFzaXN1OjpjSHVmZm1hbkJpZ1JlcGVhdFNpemVNaW47CgoJCQkJCWNvbnN0IHVpbnQ4X3QgcHJldiA9IGNvZGVfc2l6ZXNbY3VyIC0gMV07CgkJCQkJaWYgKHByZXYgPT0gMCkKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCWRvCgkJCQkJewoJCQkJCQlpZiAoY3VyID49IHRvdGFsX3VzZWRfc3ltcykKCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJY29kZV9zaXplc1tjdXIrK10gPSBwcmV2OwoJCQkJCX0gd2hpbGUgKC0tbCA+IDApOwoJCQkJfQoJCQl9CgoJCQlpZiAoY3VyICE9IHRvdGFsX3VzZWRfc3ltcykKCQkJCXJldHVybiBmYWxzZTsKCgkJCXJldHVybiBjdC5pbml0KHRvdGFsX3VzZWRfc3ltcywgJmNvZGVfc2l6ZXNbMF0pOwoJCX0KCgkJc2l6ZV90IGdldF9iaXRzX3JlbWFpbmluZygpIGNvbnN0CgkJewoJCQlzaXplX3QgdG90YWxfYnl0ZXNfcmVtYWluaW5nID0gbV9wQnVmX2VuZCAtIG1fcEJ1ZjsKCQkJcmV0dXJuIHRvdGFsX2J5dGVzX3JlbWFpbmluZyAqIDggKyBtX2JpdF9idWZfc2l6ZTsKCQl9CgoJcHJpdmF0ZToKCQl1aW50MzJfdCBtX2J1Zl9zaXplOwoJCWNvbnN0IHVpbnQ4X3QgKm1fcEJ1ZjsKCQljb25zdCB1aW50OF90ICptX3BCdWZfc3RhcnQ7CgkJY29uc3QgdWludDhfdCAqbV9wQnVmX2VuZDsKCgkJdWludDMyX3QgbV9iaXRfYnVmOwoJCXVpbnQzMl90IG1fYml0X2J1Zl9zaXplOwoJfTsKCgljbGFzcyBzaW1wbGlmaWVkX2JpdHdpc2VfZGVjb2RlcgoJewoJcHVibGljOgoJCXNpbXBsaWZpZWRfYml0d2lzZV9kZWNvZGVyKCkgOgoJCQltX3BCdWYobnVsbHB0ciksCgkJCW1fcEJ1Zl9lbmQobnVsbHB0ciksCgkJCW1fYml0X2J1ZigwKQoJCXsKCQl9CgoJCXZvaWQgY2xlYXIoKQoJCXsKCQkJbV9wQnVmID0gbnVsbHB0cjsKCQkJbV9wQnVmX2VuZCA9IG51bGxwdHI7CgkJCW1fYml0X2J1ZiA9IDA7CgkJfQoKCQlib29sIGluaXQoY29uc3QgdWludDhfdCogcEJ1Ziwgc2l6ZV90IGJ1Zl9zaXplKQoJCXsKCQkJaWYgKCghcEJ1ZikgJiYgKGJ1Zl9zaXplKSkKCQkJCXJldHVybiBmYWxzZTsKCgkJCW1fcEJ1ZiA9IHBCdWY7CgkJCW1fcEJ1Zl9lbmQgPSBwQnVmICsgYnVmX3NpemU7CgkJCW1fYml0X2J1ZiA9IDE7CgkJCXJldHVybiB0cnVlOwoJCX0KCgkJYm9vbCBpbml0KGNvbnN0IGJhc2lzdTo6dWludDhfdmVjJiBidWYpCgkJewoJCQlyZXR1cm4gaW5pdChidWYuZGF0YSgpLCBidWYuc2l6ZSgpKTsKCQl9CgoJCS8vIG51bV9iaXRzIG11c3QgYmUgMSwgMiwgNCBvciA4IGFuZCBjb2RlcyBjYW5ub3QgY3Jvc3MgYnl0ZXMKCQlpbmxpbmUgdWludDMyX3QgZ2V0X2JpdHModWludDMyX3QgbnVtX2JpdHMpCgkJewoJCQlhc3NlcnQobV9wQnVmKTsKCgkJCWlmIChtX2JpdF9idWYgPD0gMSkKCQkJCW1fYml0X2J1ZiA9IDI1NiB8ICgobV9wQnVmIDwgbV9wQnVmX2VuZCkgPyAqbV9wQnVmKysgOiAwKTsKCgkJCWNvbnN0IHVpbnQzMl90IG1hc2sgPSAoMSA8PCBudW1fYml0cykgLSAxOwoJCQljb25zdCB1aW50MzJfdCByZXMgPSBtX2JpdF9idWYgJiBtYXNrOwoJCQltX2JpdF9idWYgPj49IG51bV9iaXRzOwoJCQlhc3NlcnQobV9iaXRfYnVmID49IDEpOwoKCQkJcmV0dXJuIHJlczsKCQl9CgoJCWlubGluZSB1aW50MzJfdCBnZXRfYml0czEoKQoJCXsKCQkJYXNzZXJ0KG1fcEJ1Zik7CgkJCWlmIChtX2JpdF9idWYgPD0gMSkKCQkJCW1fYml0X2J1ZiA9IDI1NiB8ICgobV9wQnVmIDwgbV9wQnVmX2VuZCkgPyAqbV9wQnVmKysgOiAwKTsKCQkJY29uc3QgdWludDMyX3QgcmVzID0gbV9iaXRfYnVmICYgMTsKCQkJbV9iaXRfYnVmID4+PSAxOwoJCQlhc3NlcnQobV9iaXRfYnVmID49IDEpOwoJCQlyZXR1cm4gcmVzOwoJCX0KCgkJaW5saW5lIHVpbnQzMl90IGdldF9iaXRzMigpCgkJewoJCQlhc3NlcnQobV9wQnVmKTsKCQkJaWYgKG1fYml0X2J1ZiA8PSAxKQoJCQkJbV9iaXRfYnVmID0gMjU2IHwgKChtX3BCdWYgPCBtX3BCdWZfZW5kKSA/ICptX3BCdWYrKyA6IDApOwoJCQljb25zdCB1aW50MzJfdCByZXMgPSBtX2JpdF9idWYgJiAzOwoJCQltX2JpdF9idWYgPj49IDI7CgkJCWFzc2VydChtX2JpdF9idWYgPj0gMSk7CgkJCXJldHVybiByZXM7CgkJfQoKCQlpbmxpbmUgdWludDMyX3QgZ2V0X2JpdHM0KCkKCQl7CgkJCWFzc2VydChtX3BCdWYpOwoJCQlpZiAobV9iaXRfYnVmIDw9IDEpCgkJCQltX2JpdF9idWYgPSAyNTYgfCAoKG1fcEJ1ZiA8IG1fcEJ1Zl9lbmQpID8gKm1fcEJ1ZisrIDogMCk7CgkJCWNvbnN0IHVpbnQzMl90IHJlcyA9IG1fYml0X2J1ZiAmIDE1OwoJCQltX2JpdF9idWYgPj49IDQ7CgkJCWFzc2VydChtX2JpdF9idWYgPj0gMSk7CgkJCXJldHVybiByZXM7CgkJfQoKCQkvLyBObyBiaXRidWZmZXIsIGNhbiBvbmx5IGV2ZXIgcmV0cmlldmUgYnl0ZXMgY29ycmVjdGx5LgoJCWlubGluZSB1aW50MzJfdCBnZXRfYml0czgoKQoJCXsKCQkJYXNzZXJ0KG1fcEJ1Zik7CgkJCXJldHVybiAobV9wQnVmIDwgbV9wQnVmX2VuZCkgPyAqbV9wQnVmKysgOiAwOwoJCX0KCgkJY29uc3QgdWludDhfdCogbV9wQnVmOwoJCWNvbnN0IHVpbnQ4X3QqIG1fcEJ1Zl9lbmQ7CgkJdWludDMyX3QgbV9iaXRfYnVmOwoJfTsKCglpbmxpbmUgdWludDMyX3QgYmFzaXNkX3JhbmQodWludDMyX3Qgc2VlZCkKCXsKCQlpZiAoIXNlZWQpCgkJCXNlZWQrKzsKCQl1aW50MzJfdCB6ID0gc2VlZDsKCQlCQVNJU0Rfem5ldzsKCQlyZXR1cm4gejsKCX0KCgkvLyBSZXR1cm5zIHJhbmRvbSBudW1iZXIgaW4gWzAsbGltaXQpLiBNYXggbGltaXQgaXMgMHhGRkZGLgoJaW5saW5lIHVpbnQzMl90IGJhc2lzZF91cmFuZCh1aW50MzJfdCYgc2VlZCwgdWludDMyX3QgbGltaXQpCgl7CgkJc2VlZCA9IGJhc2lzZF9yYW5kKHNlZWQpOwoJCXJldHVybiAoKChzZWVkIF4gKHNlZWQgPj4gMTYpKSAmIDB4RkZGRikgKiBsaW1pdCkgPj4gMTY7Cgl9CgoJY2xhc3MgYXBwcm94X21vdmVfdG9fZnJvbnQKCXsKCXB1YmxpYzoKCQlhcHByb3hfbW92ZV90b19mcm9udCh1aW50MzJfdCBuKQoJCXsKCQkJaW5pdChuKTsKCQl9CgoJCXZvaWQgaW5pdCh1aW50MzJfdCBuKQoJCXsKCQkJbV92YWx1ZXMucmVzaXplKG4pOwoJCQltX3JvdmVyID0gbiAvIDI7CgkJfQoKCQljb25zdCBiYXNpc3U6OmludF92ZWMmIGdldF92YWx1ZXMoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlczsgfQoJCWJhc2lzdTo6aW50X3ZlYyYgZ2V0X3ZhbHVlcygpIHsgcmV0dXJuIG1fdmFsdWVzOyB9CgoJCXVpbnQzMl90IHNpemUoKSBjb25zdCB7IHJldHVybiAodWludDMyX3QpbV92YWx1ZXMuc2l6ZSgpOyB9CgoJCWNvbnN0IGludCYgb3BlcmF0b3JbXSAodWludDMyX3QgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzW2luZGV4XTsgfQoJCWludCBvcGVyYXRvcltdICh1aW50MzJfdCBpbmRleCkgeyByZXR1cm4gbV92YWx1ZXNbaW5kZXhdOyB9CgoJCXZvaWQgYWRkKGludCBuZXdfdmFsdWUpCgkJewoJCQltX3ZhbHVlc1ttX3JvdmVyKytdID0gbmV3X3ZhbHVlOwoJCQlpZiAobV9yb3ZlciA9PSBtX3ZhbHVlcy5zaXplKCkpCgkJCQltX3JvdmVyID0gKHVpbnQzMl90KW1fdmFsdWVzLnNpemUoKSAvIDI7CgkJfQoKCQl2b2lkIHVzZSh1aW50MzJfdCBpbmRleCkKCQl7CgkJCWlmIChpbmRleCkKCQkJewoJCQkJLy9zdGQ6OnN3YXAobV92YWx1ZXNbaW5kZXggLyAyXSwgbV92YWx1ZXNbaW5kZXhdKTsKCQkJCWludCB4ID0gbV92YWx1ZXNbaW5kZXggLyAyXTsKCQkJCWludCB5ID0gbV92YWx1ZXNbaW5kZXhdOwoJCQkJbV92YWx1ZXNbaW5kZXggLyAyXSA9IHk7CgkJCQltX3ZhbHVlc1tpbmRleF0gPSB4OwoJCQl9CgkJfQoKCQkvLyByZXR1cm5zIC0xIGlmIG5vdCBmb3VuZAoJCWludCBmaW5kKGludCB2YWx1ZSkgY29uc3QKCQl7CgkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX3ZhbHVlcy5zaXplKCk7IGkrKykKCQkJCWlmIChtX3ZhbHVlc1tpXSA9PSB2YWx1ZSkKCQkJCQlyZXR1cm4gaTsKCQkJcmV0dXJuIC0xOwoJCX0KCgkJdm9pZCByZXNldCgpCgkJewoJCQljb25zdCB1aW50MzJfdCBuID0gKHVpbnQzMl90KW1fdmFsdWVzLnNpemUoKTsKCgkJCW1fdmFsdWVzLmNsZWFyKCk7CgoJCQlpbml0KG4pOwoJCX0KCglwcml2YXRlOgoJCWJhc2lzdTo6aW50X3ZlYyBtX3ZhbHVlczsKCQl1aW50MzJfdCBtX3JvdmVyOwoJfTsKCglzdHJ1Y3QgZGVjb2Rlcl9ldGNfYmxvY2s7CgkKCWlubGluZSB1aW50OF90IGNsYW1wMjU1KGludDMyX3QgaSkKCXsKCQlyZXR1cm4gKHVpbnQ4X3QpKChpICYgMHhGRkZGRkYwMFUpID8gKH4oaSA+PiAzMSkpIDogaSk7Cgl9CgoJZW51bSBlTm9DbGFtcAoJewoJCWNOb0NsYW1wID0gMAoJfTsKCglzdHJ1Y3QgY29sb3IzMgoJewoJCXVuaW9uCgkJewoJCQlzdHJ1Y3QKCQkJewoJCQkJdWludDhfdCByOwoJCQkJdWludDhfdCBnOwoJCQkJdWludDhfdCBiOwoJCQkJdWludDhfdCBhOwoJCQl9OwoKCQkJdWludDhfdCBjWzRdOwoJCQkKCQkJdWludDMyX3QgbTsKCQl9OwoKCQljb2xvcjMyKCkgPSBkZWZhdWx0OwoKCQkvLyBib3RoIGNvbnN0cnVjdG9ycyBhcmUgbm8gY2xhbXBpbmcgbm93IChub3QgdGhpcyBjbGFzc2VzIG9yaWdpbmFsIGludGVudGlvbiAtIG9wdGltaXphdGlvbikKCQljb2xvcjMyKHVpbnQzMl90IHZyLCB1aW50MzJfdCB2ZywgdWludDMyX3QgdmIsIHVpbnQzMl90IHZhKSB7IHNldCh2ciwgdmcsIHZiLCB2YSk7IH0KCQljb2xvcjMyKGVOb0NsYW1wIHVudXNlZCwgdWludDMyX3QgdnIsIHVpbnQzMl90IHZnLCB1aW50MzJfdCB2YiwgdWludDMyX3QgdmEpIHsgKHZvaWQpdW51c2VkOyBzZXRfbm9jbGFtcF9yZ2JhKHZyLCB2ZywgdmIsIHZhKTsgfQoKCQkvLyBubyBjbGFtcGluZwoJCXZvaWQgc2V0KHVpbnQzMl90IHZyLCB1aW50MzJfdCB2ZywgdWludDMyX3QgdmIsIHVpbnQzMl90IHZhKSB7IGNbMF0gPSBzdGF0aWNfY2FzdDx1aW50OF90Pih2cik7IGNbMV0gPSBzdGF0aWNfY2FzdDx1aW50OF90Pih2Zyk7IGNbMl0gPSBzdGF0aWNfY2FzdDx1aW50OF90Pih2Yik7IGNbM10gPSBzdGF0aWNfY2FzdDx1aW50OF90Pih2YSk7IH0KCgkJdm9pZCBzZXRfbm9jbGFtcF9yZ2IodWludDMyX3QgdnIsIHVpbnQzMl90IHZnLCB1aW50MzJfdCB2YikgeyBjWzBdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odnIpOyBjWzFdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odmcpOyBjWzJdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odmIpOyB9CgkJdm9pZCBzZXRfbm9jbGFtcF9yZ2JhKHVpbnQzMl90IHZyLCB1aW50MzJfdCB2ZywgdWludDMyX3QgdmIsIHVpbnQzMl90IHZhKSB7IHNldCh2ciwgdmcsIHZiLCB2YSk7IH0KCgkJLy8gY2xhbXBlZCB0byBbMCwyNTVdCgkJdm9pZCBzZXRfY2xhbXBlZChpbnQgdnIsIGludCB2ZywgaW50IHZiLCBpbnQgdmEpIHsgY1swXSA9IGNsYW1wMjU1KHZyKTsgY1sxXSA9IGNsYW1wMjU1KHZnKTsgY1syXSA9IGNsYW1wMjU1KHZiKTsgY1szXSA9IGNsYW1wMjU1KHZhKTsgfQoKCQl1aW50OF90IG9wZXJhdG9yW10gKHVpbnQzMl90IGlkeCkgY29uc3QgeyBhc3NlcnQoaWR4IDwgNCk7IHJldHVybiBjW2lkeF07IH0KCQl1aW50OF90ICZvcGVyYXRvcltdICh1aW50MzJfdCBpZHgpIHsgYXNzZXJ0KGlkeCA8IDQpOyByZXR1cm4gY1tpZHhdOyB9CgoJCWJvb2wgb3BlcmF0b3I9PSAoY29uc3QgY29sb3IzMiZyaHMpIGNvbnN0IHsgcmV0dXJuIG0gPT0gcmhzLm07IH0KCgkJc3RhdGljIGNvbG9yMzIgY29tcF9taW4oY29uc3QgY29sb3IzMiYgYSwgY29uc3QgY29sb3IzMiYgYikgeyByZXR1cm4gY29sb3IzMihjTm9DbGFtcCwgYmFzaXN1OjptaW5pbXVtKGFbMF0sIGJbMF0pLCBiYXNpc3U6Om1pbmltdW0oYVsxXSwgYlsxXSksIGJhc2lzdTo6bWluaW11bShhWzJdLCBiWzJdKSwgYmFzaXN1OjptaW5pbXVtKGFbM10sIGJbM10pKTsgfQoJCXN0YXRpYyBjb2xvcjMyIGNvbXBfbWF4KGNvbnN0IGNvbG9yMzImIGEsIGNvbnN0IGNvbG9yMzImIGIpIHsgcmV0dXJuIGNvbG9yMzIoY05vQ2xhbXAsIGJhc2lzdTo6bWF4aW11bShhWzBdLCBiWzBdKSwgYmFzaXN1OjptYXhpbXVtKGFbMV0sIGJbMV0pLCBiYXNpc3U6Om1heGltdW0oYVsyXSwgYlsyXSksIGJhc2lzdTo6bWF4aW11bShhWzNdLCBiWzNdKSk7IH0KCX07CgoJc3RydWN0IGVuZHBvaW50Cgl7CgkJY29sb3IzMiBtX2NvbG9yNTsKCQl1aW50OF90IG1faW50ZW41OwoJCWJvb2wgb3BlcmF0b3I9PSAoY29uc3QgZW5kcG9pbnQmIHJocykgY29uc3QKCQl7CgkJCXJldHVybiAobV9jb2xvcjUuciA9PSByaHMubV9jb2xvcjUucikgJiYgKG1fY29sb3I1LmcgPT0gcmhzLm1fY29sb3I1LmcpICYmIChtX2NvbG9yNS5iID09IHJocy5tX2NvbG9yNS5iKSAmJiAobV9pbnRlbjUgPT0gcmhzLm1faW50ZW41KTsKCQl9CgkJYm9vbCBvcGVyYXRvciE9IChjb25zdCBlbmRwb2ludCYgcmhzKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHJocyk7IH0KCX07CgoJLy8gVGhpcyBkdXBsaWNhdGVzIGtleSBmdW5jdGlvbmFsaXR5IGluIHRoZSBlbmNvZGVyIGxpYnJhcnkncyBjb2xvcl9yZ2JhIGNsYXNzLiBQb3J0aW5nIGFuZCByZXRlc3RpbmcgY29kZSB0aGF0IHVzZXMgaXQgdG8gY29sb3IzMiBpcyBpbXByYWN0aWNhbC4KCWNsYXNzIGNvbG9yX3JnYmEKCXsKCXB1YmxpYzoKCQl1bmlvbgoJCXsKCQkJdWludDhfdCBtX2NvbXBzWzRdOwoKCQkJc3RydWN0CgkJCXsKCQkJCXVpbnQ4X3QgcjsKCQkJCXVpbnQ4X3QgZzsKCQkJCXVpbnQ4X3QgYjsKCQkJCXVpbnQ4X3QgYTsKCQkJfTsKCQl9OwoKCQlpbmxpbmUgY29sb3JfcmdiYSgpCgkJewoJCQlzdGF0aWNfYXNzZXJ0KHNpemVvZigqdGhpcykgPT0gNCwgInNpemVvZigqdGhpcykgIT0gNCIpOwoJCQlzdGF0aWNfYXNzZXJ0KHNpemVvZigqdGhpcykgPT0gc2l6ZW9mKGNvbG9yMzIpLCAic2l6ZW9mKCp0aGlzKSAhPSBzaXplb2YoYmFzaXN0Ojpjb2xvcjMyKSIpOwoJCX0KCgkJaW5saW5lIGNvbG9yX3JnYmEoY29uc3QgY29sb3IzMiYgb3RoZXIpIDoKCQkJcihvdGhlci5yKSwKCQkJZyhvdGhlci5nKSwKCQkJYihvdGhlci5iKSwKCQkJYShvdGhlci5hKQoJCXsKCQl9CgoJCWNvbG9yX3JnYmEmIG9wZXJhdG9yPSAoY29uc3QgYmFzaXN0Ojpjb2xvcjMyJiByaHMpCgkJewoJCQlyID0gcmhzLnI7CgkJCWcgPSByaHMuZzsKCQkJYiA9IHJocy5iOwoJCQlhID0gcmhzLmE7CgkJCXJldHVybiAqdGhpczsKCQl9CgoJCWlubGluZSBjb2xvcl9yZ2JhKGludCB5KQoJCXsKCQkJc2V0KHkpOwoJCX0KCgkJaW5saW5lIGNvbG9yX3JnYmEoaW50IHksIGludCBuYSkKCQl7CgkJCXNldCh5LCBuYSk7CgkJfQoKCQlpbmxpbmUgY29sb3JfcmdiYShpbnQgc3IsIGludCBzZywgaW50IHNiLCBpbnQgc2EpCgkJewoJCQlzZXQoc3IsIHNnLCBzYiwgc2EpOwoJCX0KCgkJaW5saW5lIGNvbG9yX3JnYmEoZU5vQ2xhbXAsIGludCBzciwgaW50IHNnLCBpbnQgc2IsIGludCBzYSkKCQl7CgkJCXNldF9ub2NsYW1wX3JnYmEoKHVpbnQ4X3Qpc3IsICh1aW50OF90KXNnLCAodWludDhfdClzYiwgKHVpbnQ4X3Qpc2EpOwoJCX0KCgkJaW5saW5lIGNvbG9yX3JnYmEmIHNldF9ub2NsYW1wX3koaW50IHkpCgkJewoJCQltX2NvbXBzWzBdID0gKHVpbnQ4X3QpeTsKCQkJbV9jb21wc1sxXSA9ICh1aW50OF90KXk7CgkJCW1fY29tcHNbMl0gPSAodWludDhfdCl5OwoJCQltX2NvbXBzWzNdID0gKHVpbnQ4X3QpMjU1OwoJCQlyZXR1cm4gKnRoaXM7CgkJfQoKCQlpbmxpbmUgY29sb3JfcmdiYSYgc2V0X25vY2xhbXBfcmdiYShpbnQgc3IsIGludCBzZywgaW50IHNiLCBpbnQgc2EpCgkJewoJCQltX2NvbXBzWzBdID0gKHVpbnQ4X3Qpc3I7CgkJCW1fY29tcHNbMV0gPSAodWludDhfdClzZzsKCQkJbV9jb21wc1syXSA9ICh1aW50OF90KXNiOwoJCQltX2NvbXBzWzNdID0gKHVpbnQ4X3Qpc2E7CgkJCXJldHVybiAqdGhpczsKCQl9CgoJCWlubGluZSBjb2xvcl9yZ2JhJiBzZXQoaW50IHkpCgkJewoJCQltX2NvbXBzWzBdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oYmFzaXN1OjpjbGFtcDxpbnQ+KHksIDAsIDI1NSkpOwoJCQltX2NvbXBzWzFdID0gbV9jb21wc1swXTsKCQkJbV9jb21wc1syXSA9IG1fY29tcHNbMF07CgkJCW1fY29tcHNbM10gPSAyNTU7CgkJCXJldHVybiAqdGhpczsKCQl9CgoJCWlubGluZSBjb2xvcl9yZ2JhJiBzZXQoaW50IHksIGludCBuYSkKCQl7CgkJCW1fY29tcHNbMF0gPSBzdGF0aWNfY2FzdDx1aW50OF90PihiYXNpc3U6OmNsYW1wPGludD4oeSwgMCwgMjU1KSk7CgkJCW1fY29tcHNbMV0gPSBtX2NvbXBzWzBdOwoJCQltX2NvbXBzWzJdID0gbV9jb21wc1swXTsKCQkJbV9jb21wc1szXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGJhc2lzdTo6Y2xhbXA8aW50PihuYSwgMCwgMjU1KSk7CgkJCXJldHVybiAqdGhpczsKCQl9CgoJCWlubGluZSBjb2xvcl9yZ2JhJiBzZXQoaW50IHNyLCBpbnQgc2csIGludCBzYiwgaW50IHNhKQoJCXsKCQkJbV9jb21wc1swXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGJhc2lzdTo6Y2xhbXA8aW50PihzciwgMCwgMjU1KSk7CgkJCW1fY29tcHNbMV0gPSBzdGF0aWNfY2FzdDx1aW50OF90PihiYXNpc3U6OmNsYW1wPGludD4oc2csIDAsIDI1NSkpOwoJCQltX2NvbXBzWzJdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oYmFzaXN1OjpjbGFtcDxpbnQ+KHNiLCAwLCAyNTUpKTsKCQkJbV9jb21wc1szXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGJhc2lzdTo6Y2xhbXA8aW50PihzYSwgMCwgMjU1KSk7CgkJCXJldHVybiAqdGhpczsKCQl9CgoJCWlubGluZSBjb2xvcl9yZ2JhJiBzZXRfcmdiKGludCBzciwgaW50IHNnLCBpbnQgc2IpCgkJewoJCQltX2NvbXBzWzBdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oYmFzaXN1OjpjbGFtcDxpbnQ+KHNyLCAwLCAyNTUpKTsKCQkJbV9jb21wc1sxXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGJhc2lzdTo6Y2xhbXA8aW50PihzZywgMCwgMjU1KSk7CgkJCW1fY29tcHNbMl0gPSBzdGF0aWNfY2FzdDx1aW50OF90PihiYXNpc3U6OmNsYW1wPGludD4oc2IsIDAsIDI1NSkpOwoJCQlyZXR1cm4gKnRoaXM7CgkJfQoKCQlpbmxpbmUgY29sb3JfcmdiYSYgc2V0X3JnYihjb25zdCBjb2xvcl9yZ2JhJiBvdGhlcikKCQl7CgkJCXIgPSBvdGhlci5yOwoJCQlnID0gb3RoZXIuZzsKCQkJYiA9IG90aGVyLmI7CgkJCXJldHVybiAqdGhpczsKCQl9CgoJCWlubGluZSBjb25zdCB1aW50OF90JiBvcGVyYXRvcltdICh1aW50MzJfdCBpbmRleCkgY29uc3QgeyBhc3NlcnQoaW5kZXggPCA0KTsgcmV0dXJuIG1fY29tcHNbaW5kZXhdOyB9CgkJaW5saW5lIHVpbnQ4X3QmIG9wZXJhdG9yW10gKHVpbnQzMl90IGluZGV4KSB7IGFzc2VydChpbmRleCA8IDQpOyByZXR1cm4gbV9jb21wc1tpbmRleF07IH0KCgkJaW5saW5lIHZvaWQgY2xlYXIoKQoJCXsKCQkJbV9jb21wc1swXSA9IDA7CgkJCW1fY29tcHNbMV0gPSAwOwoJCQltX2NvbXBzWzJdID0gMDsKCQkJbV9jb21wc1szXSA9IDA7CgkJfQoKCQlpbmxpbmUgYm9vbCBvcGVyYXRvcj09IChjb25zdCBjb2xvcl9yZ2JhJiByaHMpIGNvbnN0CgkJewoJCQlpZiAobV9jb21wc1swXSAhPSByaHMubV9jb21wc1swXSkgcmV0dXJuIGZhbHNlOwoJCQlpZiAobV9jb21wc1sxXSAhPSByaHMubV9jb21wc1sxXSkgcmV0dXJuIGZhbHNlOwoJCQlpZiAobV9jb21wc1syXSAhPSByaHMubV9jb21wc1syXSkgcmV0dXJuIGZhbHNlOwoJCQlpZiAobV9jb21wc1szXSAhPSByaHMubV9jb21wc1szXSkgcmV0dXJuIGZhbHNlOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCWlubGluZSBib29sIG9wZXJhdG9yIT0gKGNvbnN0IGNvbG9yX3JnYmEmIHJocykgY29uc3QKCQl7CgkJCXJldHVybiAhKCp0aGlzID09IHJocyk7CgkJfQoKCQlpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgY29sb3JfcmdiYSYgcmhzKSBjb25zdAoJCXsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspCgkJCXsKCQkJCWlmIChtX2NvbXBzW2ldIDwgcmhzLm1fY29tcHNbaV0pCgkJCQkJcmV0dXJuIHRydWU7CgkJCQllbHNlIGlmIChtX2NvbXBzW2ldICE9IHJocy5tX2NvbXBzW2ldKQoJCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlpbmxpbmUgY29sb3IzMiBnZXRfY29sb3IzMigpIGNvbnN0CgkJewoJCQlyZXR1cm4gY29sb3IzMihyLCBnLCBiLCBhKTsKCQl9CgoJCWlubGluZSBpbnQgZ2V0XzcwOV9sdW1hKCkgY29uc3QgeyByZXR1cm4gKDEzOTM4VSAqIG1fY29tcHNbMF0gKyA0Njg2OVUgKiBtX2NvbXBzWzFdICsgNDcyOVUgKiBtX2NvbXBzWzJdICsgMzI3NjhVKSA+PiAxNlU7IH0KCX07CgoJc3RydWN0IHNlbGVjdG9yCgl7CgkJLy8gUGxhaW4gc2VsZWN0b3JzICgyLWJpdHMgcGVyIHZhbHVlKQoJCXVpbnQ4X3QgbV9zZWxlY3RvcnNbNF07CgoJCS8vIEVUQzEgc2VsZWN0b3JzCgkJdWludDhfdCBtX2J5dGVzWzRdOwoKCQl1aW50OF90IG1fbG9fc2VsZWN0b3IsIG1faGlfc2VsZWN0b3I7CgkJdWludDhfdCBtX251bV91bmlxdWVfc2VsZWN0b3JzOwoJCWJvb2wgb3BlcmF0b3I9PSAoY29uc3Qgc2VsZWN0b3ImIHJocykgY29uc3QKCQl7CgkJCXJldHVybiAobV9zZWxlY3RvcnNbMF0gPT0gcmhzLm1fc2VsZWN0b3JzWzBdKSAmJgoJCQkJKG1fc2VsZWN0b3JzWzFdID09IHJocy5tX3NlbGVjdG9yc1sxXSkgJiYKCQkJCShtX3NlbGVjdG9yc1syXSA9PSByaHMubV9zZWxlY3RvcnNbMl0pICYmCgkJCQkobV9zZWxlY3RvcnNbM10gPT0gcmhzLm1fc2VsZWN0b3JzWzNdKTsKCQl9CgkJYm9vbCBvcGVyYXRvciE9IChjb25zdCBzZWxlY3RvciYgcmhzKSBjb25zdAoJCXsKCQkJcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsKCQl9CgoJCXZvaWQgaW5pdF9mbGFncygpCgkJewoJCQl1aW50MzJfdCBoaXN0WzRdID0geyAwLCAwLCAwLCAwIH07CgkJCWZvciAodWludDMyX3QgeSA9IDA7IHkgPCA0OyB5KyspCgkJCXsKCQkJCWZvciAodWludDMyX3QgeCA9IDA7IHggPCA0OyB4KyspCgkJCQl7CgkJCQkJdWludDMyX3QgcyA9IGdldF9zZWxlY3Rvcih4LCB5KTsKCQkJCQloaXN0W3NdKys7CgkJCQl9CgkJCX0KCgkJCW1fbG9fc2VsZWN0b3IgPSAzOwoJCQltX2hpX3NlbGVjdG9yID0gMDsKCQkJbV9udW1fdW5pcXVlX3NlbGVjdG9ycyA9IDA7CgoJCQlmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNDsgaSsrKQoJCQl7CgkJCQlpZiAoaGlzdFtpXSkKCQkJCXsKCQkJCQltX251bV91bmlxdWVfc2VsZWN0b3JzKys7CgkJCQkJaWYgKGkgPCBtX2xvX3NlbGVjdG9yKSBtX2xvX3NlbGVjdG9yID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oaSk7CgkJCQkJaWYgKGkgPiBtX2hpX3NlbGVjdG9yKSBtX2hpX3NlbGVjdG9yID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oaSk7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIFJldHVybmVkIHNlbGVjdG9yIHZhbHVlIHJhbmdlcyBmcm9tIDAtMyBhbmQgaXMgYSBkaXJlY3QgaW5kZXggaW50byBnX2V0YzFfaW50ZW5fdGFibGVzLgoJCWlubGluZSB1aW50MzJfdCBnZXRfc2VsZWN0b3IodWludDMyX3QgeCwgdWludDMyX3QgeSkgY29uc3QKCQl7CgkJCWFzc2VydCgoeCA8IDQpICYmICh5IDwgNCkpOwoJCQlyZXR1cm4gKG1fc2VsZWN0b3JzW3ldID4+ICh4ICogMikpICYgMzsKCQl9CgoJCXZvaWQgc2V0X3NlbGVjdG9yKHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHZhbCkKCQl7CgkJCXN0YXRpYyBjb25zdCB1aW50OF90IHNfc2VsZWN0b3JfaW5kZXhfdG9fZXRjMVs0XSA9IHsgMywgMiwgMCwgMSB9OwoKCQkJYXNzZXJ0KCh4IHwgeSB8IHZhbCkgPCA0KTsKCgkJCW1fc2VsZWN0b3JzW3ldICY9IH4oMyA8PCAoeCAqIDIpKTsKCQkJbV9zZWxlY3RvcnNbeV0gfD0gKHZhbCA8PCAoeCAqIDIpKTsKCgkJCWNvbnN0IHVpbnQzMl90IGV0YzFfYml0X2luZGV4ID0geCAqIDQgKyB5OwoKCQkJdWludDhfdCAqcCA9ICZtX2J5dGVzWzMgLSAoZXRjMV9iaXRfaW5kZXggPj4gMyldOwoKCQkJY29uc3QgdWludDMyX3QgYnl0ZV9iaXRfb2ZzID0gZXRjMV9iaXRfaW5kZXggJiA3OwoJCQljb25zdCB1aW50MzJfdCBtYXNrID0gMSA8PCBieXRlX2JpdF9vZnM7CgoJCQljb25zdCB1aW50MzJfdCBldGMxX3ZhbCA9IHNfc2VsZWN0b3JfaW5kZXhfdG9fZXRjMVt2YWxdOwoKCQkJY29uc3QgdWludDMyX3QgbHNiID0gZXRjMV92YWwgJiAxOwoJCQljb25zdCB1aW50MzJfdCBtc2IgPSBldGMxX3ZhbCA+PiAxOwoKCQkJcFswXSAmPSB+bWFzazsKCQkJcFswXSB8PSAobHNiIDw8IGJ5dGVfYml0X29mcyk7CgoJCQlwWy0yXSAmPSB+bWFzazsKCQkJcFstMl0gfD0gKG1zYiA8PCBieXRlX2JpdF9vZnMpOwoJCX0KCX07CgoJYm9vbCBiYXNpc19ibG9ja19mb3JtYXRfaXNfdW5jb21wcmVzc2VkKGJsb2NrX2Zvcm1hdCB0ZXhfdHlwZSk7CgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgl0eXBlZGVmIHVpbnQxNl90IGhhbGZfZmxvYXQ7CgoJY29uc3QgZG91YmxlIE1JTl9ERU5PUk1fSEFMRl9GTE9BVCA9IDAuMDAwMDAwMDU5NjA0NjQ1OyAvLyBzbWFsbGVzdCBwb3NpdGl2ZSBzdWJub3JtYWwgbnVtYmVyCgljb25zdCBkb3VibGUgTUlOX0hBTEZfRkxPQVQgPSAwLjAwMDA2MTAzNTE1NjI1OyAvLyBzbWFsbGVzdCBwb3NpdGl2ZSBub3JtYWwgbnVtYmVyCgljb25zdCBkb3VibGUgTUFYX0hBTEZfRkxPQVQgPSA2NTUwNC4wOyAvLyBsYXJnZXN0IG5vcm1hbCBudW1iZXIKCWNvbnN0IHVpbnQzMl90IE1BWF9IQUxGX0ZMT0FUX0FTX0lOVF9CSVRTID0gMHg3QkZGOyAvLyB0aGUgaGFsZiBmbG9hdCByZXAgZm9yIDY1NTA0LjAKCglpbmxpbmUgdWludDMyX3QgZ2V0X2JpdHModWludDMyX3QgdmFsLCBpbnQgbG93LCBpbnQgaGlnaCkKCXsKCQljb25zdCBpbnQgbnVtX2JpdHMgPSAoaGlnaCAtIGxvdykgKyAxOwoJCWFzc2VydCgobnVtX2JpdHMgPj0gMSkgJiYgKG51bV9iaXRzIDw9IDMyKSk7CgoJCXZhbCA+Pj0gbG93OwoJCWlmIChudW1fYml0cyAhPSAzMikKCQkJdmFsICY9ICgoMXUgPDwgbnVtX2JpdHMpIC0gMSk7CgoJCXJldHVybiB2YWw7Cgl9CgoJaW5saW5lIGJvb2wgaXNfaGFsZl9pbmZfb3JfbmFuKGhhbGZfZmxvYXQgdikKCXsKCQlyZXR1cm4gZ2V0X2JpdHModiwgMTAsIDE0KSA9PSAzMTsKCX0KCglpbmxpbmUgYm9vbCBpc19oYWxmX2Rlbm9ybShoYWxmX2Zsb2F0IHYpCgl7CgkJaW50IGUgPSAodiA+PiAxMCkgJiAzMTsKCQlyZXR1cm4gIWU7Cgl9CgoJaW5saW5lIGludCBnZXRfaGFsZl9leHAoaGFsZl9mbG9hdCB2KQoJewoJCWludCBlID0gKCh2ID4+IDEwKSAmIDMxKTsKCQlyZXR1cm4gZSA/IChlIC0gMTUpIDogLTE0OwoJfQoKCWlubGluZSBpbnQgZ2V0X2hhbGZfbWFudGlzc2EoaGFsZl9mbG9hdCB2KQoJewoJCWlmIChpc19oYWxmX2Rlbm9ybSh2KSkKCQkJcmV0dXJuIHYgJiAweDNGRjsKCQlyZXR1cm4gKHYgJiAweDNGRikgfCAweDQwMDsKCX0KCglpbmxpbmUgZmxvYXQgZ2V0X2hhbGZfbWFudGlzc2FmKGhhbGZfZmxvYXQgdikKCXsKCQlyZXR1cm4gKChmbG9hdClnZXRfaGFsZl9tYW50aXNzYSh2KSkgLyAxMDI0LjBmOwoJfQoKCWlubGluZSBpbnQgZ2V0X2hhbGZfc2lnbihoYWxmX2Zsb2F0IHYpCgl7CgkJcmV0dXJuIHYgPyAoKHYgJiAweDgwMDApID8gLTEgOiAxKSA6IDA7Cgl9CgoJaW5saW5lIGJvb2wgaGFsZl9pc19zaWduZWQoaGFsZl9mbG9hdCB2KQoJewoJCXJldHVybiAodiAmIDB4ODAwMCkgIT0gMDsKCX0KCiNpZiAwCglpbnQgaGV4cCA9IGdldF9oYWxmX2V4cChDZik7CglmbG9hdCBobWFuID0gZ2V0X2hhbGZfbWFudGlzc2FmKENmKTsKCWludCBoc2lnbiA9IGdldF9oYWxmX3NpZ24oQ2YpOwoJZmxvYXQgayA9IHBvd2YoMi4wZiwgaGV4cCkgKiBobWFuICogaHNpZ247CglpZiAoaXNfaGFsZl9pbmZfb3JfbmFuKENmKSkKCQlrID0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OnF1aWV0X05hTigpOwojZW5kaWYKCgloYWxmX2Zsb2F0IGZsb2F0X3RvX2hhbGYoZmxvYXQgdmFsKTsKCglpbmxpbmUgZmxvYXQgaGFsZl90b19mbG9hdChoYWxmX2Zsb2F0IGh2YWwpCgl7CgkJdW5pb24geyBmbG9hdCBmOyB1aW50MzJfdCB1OyB9IHggPSB7IDAgfTsKCgkJdWludDMyX3QgcyA9ICgodWludDMyX3QpaHZhbCA+PiAxNSkgJiAxOwoJCXVpbnQzMl90IGUgPSAoKHVpbnQzMl90KWh2YWwgPj4gMTApICYgMHgxRjsKCQl1aW50MzJfdCBtID0gKHVpbnQzMl90KWh2YWwgJiAweDNGRjsKCgkJaWYgKCFlKQoJCXsKCQkJaWYgKCFtKQoJCQl7CgkJCQkvLyArLSAwCgkJCQl4LnUgPSBzIDw8IDMxOwoJCQkJcmV0dXJuIHguZjsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCS8vIGRlbm9ybWFsaXplZAoJCQkJd2hpbGUgKCEobSAmIDB4MDAwMDA0MDApKQoJCQkJewoJCQkJCW0gPDw9IDE7CgkJCQkJLS1lOwoJCQkJfQoKCQkJCSsrZTsKCQkJCW0gJj0gfjB4MDAwMDA0MDA7CgkJCX0KCQl9CgkJZWxzZSBpZiAoZSA9PSAzMSkKCQl7CgkJCWlmIChtID09IDApCgkJCXsKCQkJCS8vICsvLSBJTkYKCQkJCXgudSA9IChzIDw8IDMxKSB8IDB4N2Y4MDAwMDA7CgkJCQlyZXR1cm4geC5mOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJLy8gKy8tIE5hTgoJCQkJeC51ID0gKHMgPDwgMzEpIHwgMHg3ZjgwMDAwMCB8IChtIDw8IDEzKTsKCQkJCXJldHVybiB4LmY7CgkJCX0KCQl9CgoJCWUgPSBlICsgKDEyNyAtIDE1KTsKCQltID0gbSA8PCAxMzsKCgkJYXNzZXJ0KHMgPD0gMSk7CgkJYXNzZXJ0KG0gPD0gMHg3RkZGRkYpOwoJCWFzc2VydChlIDw9IDI1NSk7CgoJCXgudSA9IG0gfCAoZSA8PCAyMykgfCAocyA8PCAzMSk7CgkJcmV0dXJuIHguZjsKCX0KCgkvLyBPcmlnaW5hbGx5IGZyb20gYmM2aF9lbmMuaAoKCXZvaWQgYmM2aF9lbmNfaW5pdCgpOwoKCWNvbnN0IHVpbnQzMl90IE1BWF9CTE9HMTZfVkFMID0gMHhGRkZGOwoKCS8vIEJDNkggaW50ZXJuYWxzCgljb25zdCB1aW50MzJfdCBOVU1fQkM2SF9NT0RFUyA9IDE0OwoJY29uc3QgdWludDMyX3QgQkM2SF9MQVNUX01PREVfSU5ERVggPSAxMzsKCWNvbnN0IHVpbnQzMl90IEJDNkhfRklSU1RfMVNVQlNFVF9NT0RFX0lOREVYID0gMTA7IC8vIGluIHRoZSBNUyBkb2NzLCB0aGlzIGlzICJtb2RlIDExIiAod2hlcmUgdGhlIGZpcnN0IG1vZGUgaXMgMSksIDYwIGJpdHMgZm9yIGVuZHBvaW50cyAoMTAuMTAsIDEwLjEwLCAxMC4xMCksIDYzIGJpdHMgZm9yIHdlaWdodHMKCWNvbnN0IHVpbnQzMl90IFRPVEFMX0JDNkhfUEFSVElUSU9OX1BBVFRFUk5TID0gMzI7CgoJZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ19iYzZoX21vZGVfc2lnX2JpdHNbTlVNX0JDNkhfTU9ERVNdWzRdOyAvLyBiYXNlLCByLCBnLCBiCgoJc3RydWN0IGJjNmhfYml0X2xheW91dAoJewoJCWludDhfdCBtX2NvbXA7IC8vIFI9MCxHPTEsQj0yLEQ9MyAoRD1wYXJ0aXRpb24gaW5kZXgpCgkJaW50OF90IG1faW5kZXg7IC8vIDAtMywgMC0xIExvdy9IaWdoIHN1YnNldCAxLCAyLTMgTG93L0hpZ2ggc3Vic2V0IDIsIC0xPXBhcnRpdGlvbiBpbmRleCAoZCkKCQlpbnQ4X3QgbV9sYXN0X2JpdDsKCQlpbnQ4X3QgbV9maXJzdF9iaXQ7IC8vIG1heSBiZSAtMSBpZiBhIHNpbmdsZSBiaXQsIG1heSBiZSA+bV9sYXN0X2JpdCBpZiByZXZlcnNlZAoJfTsKCgljb25zdCB1aW50MzJfdCBNQVhfQkM2SF9MQVlPVVRfSU5ERVggPSAyNTsKCWV4dGVybiBjb25zdCBiYzZoX2JpdF9sYXlvdXQgZ19iYzZoX2JpdF9sYXlvdXRzW05VTV9CQzZIX01PREVTXVtNQVhfQkM2SF9MQVlPVVRfSU5ERVhdOwoKCWV4dGVybiBjb25zdCB1aW50OF90IGdfYmM2aF8yc3Vic2V0X3BhdHRlcm5zW1RPVEFMX0JDNkhfUEFSVElUSU9OX1BBVFRFUk5TXVs0XVs0XTsgLy8gW3ldW3hdCgoJZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ19iYzZoX3dlaWdodDNbOF07CglleHRlcm4gY29uc3QgdWludDhfdCBnX2JjNmhfd2VpZ2h0NFsxNl07CgoJZXh0ZXJuIGNvbnN0IGludDhfdCBnX2JjNmhfbW9kZV9sb29rdXBbMzJdOwoJCQoJLy8gQ29udmVydHMgYjE2IHRvIGhhbGYgZmxvYXQKCWlubGluZSBoYWxmX2Zsb2F0IGJjNmhfYmxvZzE2X3RvX2hhbGYodWludDMyX3QgY29tcCkKCXsKCQlhc3NlcnQoY29tcCA8PSAweEZGRkYpOwoKCQkvLyBzY2FsZSB0aGUgbWFnbml0dWRlIGJ5IDMxLzY0CgkJY29tcCA9IChjb21wICogMzF1KSA+PiA2dTsKCQlyZXR1cm4gKGhhbGZfZmxvYXQpY29tcDsKCX0KCgljb25zdCB1aW50MzJfdCBNQVhfQkM2SF9IQUxGX0ZMT0FUX0FTX1VJTlQgPSAweDdCRkY7CgoJLy8gSW52ZXJ0cyBiYzZoX2Jsb2cxNl90b19oYWxmKCkuCgkvLyBSZXR1cm5zIHRoZSBuZWFyZXN0IGJsb2cxNiBnaXZlbiBhIGhhbGYgdmFsdWUuIAoJaW5saW5lIHVpbnQzMl90IGJjNmhfaGFsZl90b19ibG9nMTYoaGFsZl9mbG9hdCBoKQoJewoJCWFzc2VydChoIDw9IE1BWF9CQzZIX0hBTEZfRkxPQVRfQVNfVUlOVCk7CgkJcmV0dXJuIChoICogNjQgKyAzMCkgLyAzMTsKCX0KCgkvLyBTdWJvcHRpbWFsLCBidXQgdmVyeSBjbG9zZS4KCWlubGluZSB1aW50MzJfdCBiYzZoX2hhbGZfdG9fYmxvZyhoYWxmX2Zsb2F0IGgsIHVpbnQzMl90IG51bV9iaXRzKQoJewoJCWFzc2VydChoIDw9IE1BWF9CQzZIX0hBTEZfRkxPQVRfQVNfVUlOVCk7CgkJcmV0dXJuIChoICogNjQgKyAzMCkgLyAoMzEgKiAoMSA8PCAoMTYgLSBudW1fYml0cykpKTsKCX0KCglzdHJ1Y3QgYmM2aF9ibG9jawoJewoJCXVpbnQ4X3QgbV9ieXRlc1sxNl07Cgl9OwoKCXZvaWQgYmM2aF9lbmNfYmxvY2tfbW9kZTEwKGJjNmhfYmxvY2sqIHBQYWNrZWRfYmxvY2ssIGNvbnN0IGhhbGZfZmxvYXQgcEVuZHBvaW50c1szXVsyXSwgY29uc3QgdWludDhfdCogcFdlaWdodHMpOwoJdm9pZCBiYzZoX2VuY19ibG9ja18xc3Vic2V0XzRiaXRfd2VpZ2h0cyhiYzZoX2Jsb2NrKiBwUGFja2VkX2Jsb2NrLCBjb25zdCBoYWxmX2Zsb2F0IHBFbmRwb2ludHNbM11bMl0sIGNvbnN0IHVpbnQ4X3QqIHBXZWlnaHRzKTsKCXZvaWQgYmM2aF9lbmNfYmxvY2tfMXN1YnNldF9tb2RlOV8zYml0X3dlaWdodHMoYmM2aF9ibG9jayogcFBhY2tlZF9ibG9jaywgY29uc3QgaGFsZl9mbG9hdCBwRW5kcG9pbnRzWzNdWzJdLCBjb25zdCB1aW50OF90KiBwV2VpZ2h0cyk7Cgl2b2lkIGJjNmhfZW5jX2Jsb2NrXzFzdWJzZXRfM2JpdF93ZWlnaHRzKGJjNmhfYmxvY2sqIHBQYWNrZWRfYmxvY2ssIGNvbnN0IGhhbGZfZmxvYXQgcEVuZHBvaW50c1szXVsyXSwgY29uc3QgdWludDhfdCogcFdlaWdodHMpOwoJdm9pZCBiYzZoX2VuY19ibG9ja18yc3Vic2V0X21vZGU5XzNiaXRfd2VpZ2h0cyhiYzZoX2Jsb2NrKiBwUGFja2VkX2Jsb2NrLCB1aW50MzJfdCBjb21tb25fcGFydF9pbmRleCwgY29uc3QgaGFsZl9mbG9hdCBwRW5kcG9pbnRzWzJdWzNdWzJdLCBjb25zdCB1aW50OF90KiBwV2VpZ2h0cyk7IC8vIHBFbmRwb2ludHNbc3Vic2V0XVtjb21wXVtsaF9pbmRleF0KCXZvaWQgYmM2aF9lbmNfYmxvY2tfMnN1YnNldF8zYml0X3dlaWdodHMoYmM2aF9ibG9jayogcFBhY2tlZF9ibG9jaywgdWludDMyX3QgY29tbW9uX3BhcnRfaW5kZXgsIGNvbnN0IGhhbGZfZmxvYXQgcEVuZHBvaW50c1syXVszXVsyXSwgY29uc3QgdWludDhfdCogcFdlaWdodHMpOyAvLyBwRW5kcG9pbnRzW3N1YnNldF1bY29tcF1bbGhfaW5kZXhdCglib29sIGJjNmhfZW5jX2Jsb2NrX3NvbGlkX2NvbG9yKGJjNmhfYmxvY2sqIHBQYWNrZWRfYmxvY2ssIGNvbnN0IGhhbGZfZmxvYXQgcENvbG9yWzNdKTsKCglzdHJ1Y3QgYmM2aF9sb2dpY2FsX2Jsb2NrCgl7CgkJdWludDMyX3QgbV9tb2RlOwoJCXVpbnQzMl90IG1fcGFydGl0aW9uX3BhdHRlcm47CS8vIG11c3QgYmUgMCBpZiAxIHN1YnNldAoJCXVpbnQzMl90IG1fZW5kcG9pbnRzWzNdWzRdOwkJLy8gW2NvbXBdW3N1YnNldCoyK2xoX2luZGV4XSAtIG11c3QgYmUgYWxyZWFkeSBwcm9wZXJseSBwYWNrZWQKCQl1aW50OF90IG1fd2VpZ2h0c1sxNl07CQkJLy8gd2VpZ2h0cyBtdXN0IGJlIG9mIHRoZSBwcm9wZXIgc2l6ZSwgdGFraW5nIGludG8gYWNjb3VudCBza2lwcGVkIE1TQidzIHdoaWNoIG11c3QgYmUgMAoKCQl2b2lkIGNsZWFyKCkKCQl7CgkJCWJhc2lzdTo6Y2xlYXJfb2JqKCp0aGlzKTsKCQl9Cgl9OwoKCXZvaWQgcGFja19iYzZoX2Jsb2NrKGJjNmhfYmxvY2smIGRzdF9ibGssIGJjNmhfbG9naWNhbF9ibG9jayYgbG9nX2Jsayk7CgkJCgluYW1lc3BhY2UgYmM3X21vZGVfNV9lbmNvZGVyCgl7CgkJdm9pZCBlbmNvZGVfYmM3X21vZGVfNV9ibG9jayh2b2lkKiBwRHN0X2Jsb2NrLCBjb2xvcjMyKiBwUGl4ZWxzLCBib29sIGhxX21vZGUpOwoJfQoKCW5hbWVzcGFjZSBhc3RjXzZ4Nl9oZHIKCXsKCQlleHRlcm4gdWludDhfdCBnX3F1YW50aXplX3RhYmxlc19wcmVzZXJ2ZTJbMjEgLSAxXVsyNTZdOyAvLyBhc3RjX2hlbHBlcnM6OlRPVEFMX0lTRV9SQU5HRVM9MjEKCQlleHRlcm4gdWludDhfdCBnX3F1YW50aXplX3RhYmxlc19wcmVzZXJ2ZTNbMjEgLSAxXVsyNTZdOwoJfSAvLyBuYW1lc3BhY2UgYXN0Y182eDZfaGRyCgojaWYgQkFTSVNEX1NVUFBPUlRfWFVBU1RDCgluYW1lc3BhY2UgYXN0Y19sZHJfdAoJewoJCWNvbnN0IHVpbnQzMl90IEFSSVRIX0hFQURFUl9NQVJLRVIgPSAweDAxOwoJCWNvbnN0IHVpbnQzMl90IEFSSVRIX0hFQURFUl9NQVJLRVJfQklUUyA9IDU7CgoJCWNvbnN0IHVpbnQzMl90IEZVTExfWlNURF9IRUFERVJfTUFSS0VSID0gMHgwMTsKCQljb25zdCB1aW50MzJfdCBGVUxMX1pTVERfSEVBREVSX01BUktFUl9CSVRTID0gNTsKCgkJY29uc3QgdWludDMyX3QgRklOQUxfU1lOQ19NQVJLRVIgPSAweEFGOwoJCWNvbnN0IHVpbnQzMl90IEZJTkFMX1NZTkNfTUFSS0VSX0JJVFMgPSA4OwoKCQljb25zdCB1aW50MzJfdCBjTWF4Q29uZmlnUmV1c2VOZWlnaGJvcnMgPSAzOwoKI3ByYWdtYSBwYWNrKHB1c2gsIDEpCgkJc3RydWN0IHh1YXN0Y19sZHJfYXJpdGhfaGVhZGVyCgkJewoJCQl1aW50OF90IG1fZmxhZ3M7CgkJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV9hcml0aF9ieXRlc19sZW47CgkJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV9tZWFuMF9iaXRzX2xlbjsKCQkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX21lYW4xX2J5dGVzX2xlbjsKCQkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX3J1bl9ieXRlc19sZW47CgkJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV9jb2VmZl9ieXRlc19sZW47CgkJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV9zaWduX2JpdHNfbGVuOwoJCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+IG1fd2VpZ2h0Ml9iaXRzX2xlbjsgLy8gMi1iaXQgd2VpZ2h0cyAoNCBwZXIgYnl0ZSksIHVwIHRvIEJJU0VfNF9MRVZFTFMKCQkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX3dlaWdodDNfYml0c19sZW47IC8vIDMtYml0IHdlaWdodHMgKDIgcGVyIGJ5dGUpLCB1cCB0byBCSVNFXzhfTEVWRUxTCgkJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV93ZWlnaHQ0X2JpdHNfbGVuOyAvLyA0LWJpdCB3ZWlnaHRzICgyIHBlciBieXRlKSwgdXAgdG8gQklTRV8xNl9MRVZFTFMKCQkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX3dlaWdodDhfYnl0ZXNfbGVuOyAvLyA4LWJpdCB3ZWlnaHRzICgxIHBlciBieXRlKSwgdXAgdG8gQklTRV8zMl9MRVZFTFMKCQkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX3VudXNlZDsJCQkvLyBGdXR1cmUgZXhwYW5zaW9uCgkJfTsKCgkJc3RydWN0IHh1YXN0Y19sZHJfZnVsbF96c3RkX2hlYWRlcgoJCXsKCQkJdWludDhfdCBtX2ZsYWdzOwoKCQkJLy8gQ29udHJvbAoJCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+IG1fcmF3X2JpdHNfbGVuOyAvLyB1bmNvbXByZXNzZWQKCQkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX21vZGVfYnl0ZXNfbGVuOwoJCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+IG1fc29saWRfZHBjbV9ieXRlc19sZW47CgkJCQoJCQkvLyBFbmRwb2ludCBEUENNCgkJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV9lbmRwb2ludF9kcGNtX3JldXNlX2luZGljZXNfbGVuOwoJCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+IG1fdXNlX2JjX2JpdHNfbGVuOwoJCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+IG1fZW5kcG9pbnRfZHBjbV8zYml0X2xlbjsKCQkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX2VuZHBvaW50X2RwY21fNGJpdF9sZW47CgkJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV9lbmRwb2ludF9kcGNtXzViaXRfbGVuOwoJCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+IG1fZW5kcG9pbnRfZHBjbV82Yml0X2xlbjsKCQkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX2VuZHBvaW50X2RwY21fN2JpdF9sZW47CgkJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV9lbmRwb2ludF9kcGNtXzhiaXRfbGVuOwoKCQkJLy8gV2VpZ2h0IGdyaWQgRENUCgkJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV9tZWFuMF9iaXRzX2xlbjsKCQkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX21lYW4xX2J5dGVzX2xlbjsKCQkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX3J1bl9ieXRlc19sZW47CgkJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV9jb2VmZl9ieXRlc19sZW47CgkJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV9zaWduX2JpdHNfbGVuOwoJCQkKCQkJLy8gV2VpZ2h0IERQQ00KCQkJYmFzaXN1OjpwYWNrZWRfdWludDw0PiBtX3dlaWdodDJfYml0c19sZW47IC8vIDItYml0IHdlaWdodHMgKDQgcGVyIGJ5dGUpLCB1cCB0byBCSVNFXzRfTEVWRUxTCgkJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV93ZWlnaHQzX2JpdHNfbGVuOyAvLyAzLWJpdCB3ZWlnaHRzICg0IHBlciBieXRlKSwgdXAgdG8gQklTRV84X0xFVkVMUwoJCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+IG1fd2VpZ2h0NF9iaXRzX2xlbjsgLy8gNC1iaXQgd2VpZ2h0cyAoMiBwZXIgYnl0ZSksIHVwIHRvIEJJU0VfMTZfTEVWRUxTCgkJCWJhc2lzdTo6cGFja2VkX3VpbnQ8ND4gbV93ZWlnaHQ4X2J5dGVzX2xlbjsgLy8gOC1iaXQgd2VpZ2h0cyAoMSBwZXIgYnl0ZSksIHVwIHRvIEJJU0VfMzJfTEVWRUxTCgoJCQliYXNpc3U6OnBhY2tlZF91aW50PDQ+IG1fdW51c2VkOwkJCS8vIEZ1dHVyZSBleHBhbnNpb24KCQl9OwojcHJhZ21hIHBhY2socG9wKQoKCQljb25zdCB1aW50MzJfdCBEQ1RfUlVOX0xFTl9FT0JfU1lNX0lOREVYID0gNjQ7CgkJY29uc3QgdWludDMyX3QgRENUX01BWF9BUklUSF9DT0VGRl9NQUcgPSAyNTU7CgkJCgkJY29uc3QgdWludDMyX3QgRENUX01FQU5fTEVWRUxTMCA9IDksIERDVF9NRUFOX0xFVkVMUzEgPSAzMzsKCQkKCQljb25zdCB1aW50MzJfdCBQQVJUX0hBU0hfQklUUyA9IDZ1OwoJCWNvbnN0IHVpbnQzMl90IFBBUlRfSEFTSF9TSVpFID0gMXUgPDwgUEFSVF9IQVNIX0JJVFM7CgoJCWNvbnN0IHVpbnQzMl90IFRNX0hBU0hfQklUUyA9IDd1OwoJCWNvbnN0IHVpbnQzMl90IFRNX0hBU0hfU0laRSA9IDF1IDw8IFRNX0hBU0hfQklUUzsKCQkJCQoJCXR5cGVkZWYgYmFzaXN1Ojp2ZWN0b3I8ZmxvYXQ+IGZ2ZWM7CgoJCWV4dGVybiBjb25zdCB1aW50MTZfdCBnX3RvdGFsX3VuaXF1ZV9wYXR0ZXJuc1thc3RjX2hlbHBlcnM6Ok5VTV9BU1RDX0JMT0NLX1NJWkVTXVsyXTsKCQl1aW50MzJfdCBnZXRfdG90YWxfdW5pcXVlX3BhdHRlcm5zKHVpbnQzMl90IGFzdGNfYmxvY2tfc2l6ZV9pbmRleCwgdWludDMyX3QgbnVtX3BhcnRzKTsKCQlleHRlcm4gY29uc3QgdWludDE2X3QqIGdfdW5pcXVlX2luZGV4X3RvX2FzdGNfcGFydF9zZWVkWzJdW2FzdGNfaGVscGVyczo6TlVNX0FTVENfQkxPQ0tfU0laRVNdOyAvLyBbbnVtX3BhcnRzXVthc3RjX2Jsb2NrX3NpemVfaW5kZXhdCgkJdWludDE2X3QgdW5pcXVlX3BhdF9pbmRleF90b19wYXJ0X3NlZWQodWludDMyX3QgYXN0Y19ibG9ja19zaXplX2luZGV4LCB1aW50MzJfdCBudW1fcGFydHMsIHVpbnQzMl90IHVuaXF1ZV9wYXRfaW5kZXgpOwoJCQkJCQkKCQl2b2lkIGluaXQoKTsKCgkJY29sb3JfcmdiYSBibHVlX2NvbnRyYWN0X2VuYyhjb2xvcl9yZ2JhIG9yaWcsIGJvb2wmIGRpZF9jbGFtcCwgaW50IGVuY29kZWRfYik7CgkJY29sb3JfcmdiYSBibHVlX2NvbnRyYWN0X2RlYyhpbnQgZW5jX3IsIGludCBlbmNfZywgaW50IGVuY19iLCBpbnQgZW5jX2EpOwoJCQkJCQkJCQoJCXN0cnVjdCBhc3RjX2Jsb2NrX2dyaWRfY29uZmlnCgkJewoJCQl1aW50MTZfdCBtX2Jsb2NrX3dpZHRoLCBtX2Jsb2NrX2hlaWdodDsKCQkJdWludDE2X3QgbV9ncmlkX3dpZHRoLCBtX2dyaWRfaGVpZ2h0OwoKCQkJYXN0Y19ibG9ja19ncmlkX2NvbmZpZygpIHt9CgoJCQlhc3RjX2Jsb2NrX2dyaWRfY29uZmlnKHVpbnQzMl90IGJsb2NrX3dpZHRoLCB1aW50MzJfdCBibG9ja19oZWlnaHQsIHVpbnQzMl90IGdyaWRfd2lkdGgsIHVpbnQzMl90IGdyaWRfaGVpZ2h0KQoJCQl7CgkJCQlzdGF0aWNfYXNzZXJ0KHNpemVvZigqdGhpcykgPT0gc2l6ZW9mKHVpbnQxNl90KSAqIDQsICJiYWQgc3RydWN0IHNpemUiKTsKCgkJCQlhc3NlcnQoKGJsb2NrX3dpZHRoID49IDQpICYmIChibG9ja193aWR0aCA8PSAxMikpOwoJCQkJYXNzZXJ0KChibG9ja19oZWlnaHQgPj0gNCkgJiYgKGJsb2NrX2hlaWdodCA8PSAxMikpOwoJCQkJbV9ibG9ja193aWR0aCA9ICh1aW50MTZfdClibG9ja193aWR0aDsKCQkJCW1fYmxvY2tfaGVpZ2h0ID0gKHVpbnQxNl90KWJsb2NrX2hlaWdodDsKCgkJCQlhc3NlcnQoKGdyaWRfd2lkdGggPj0gMikgJiYgKGdyaWRfd2lkdGggPD0gYmxvY2tfd2lkdGgpKTsKCQkJCWFzc2VydCgoZ3JpZF9oZWlnaHQgPj0gMikgJiYgKGdyaWRfaGVpZ2h0IDw9IGJsb2NrX2hlaWdodCkpOwoJCQkJbV9ncmlkX3dpZHRoID0gKHVpbnQxNl90KWdyaWRfd2lkdGg7CgkJCQltX2dyaWRfaGVpZ2h0ID0gKHVpbnQxNl90KWdyaWRfaGVpZ2h0OwoJCQl9CgoJCQlib29sIG9wZXJhdG9yPT0oY29uc3QgYXN0Y19ibG9ja19ncmlkX2NvbmZpZyYgb3RoZXIpIGNvbnN0CgkJCXsKCQkJCXJldHVybiAobV9ibG9ja193aWR0aCA9PSBvdGhlci5tX2Jsb2NrX3dpZHRoKSAmJiAobV9ibG9ja19oZWlnaHQgPT0gb3RoZXIubV9ibG9ja19oZWlnaHQpICYmCgkJCQkJKG1fZ3JpZF93aWR0aCA9PSBvdGhlci5tX2dyaWRfd2lkdGgpICYmIChtX2dyaWRfaGVpZ2h0ID09IG90aGVyLm1fZ3JpZF9oZWlnaHQpOwoJCQl9CgkJfTsKCgkJc3RydWN0IGFzdGNfYmxvY2tfZ3JpZF9kYXRhCgkJewojaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChfREVCVUcpCgkJCXVpbnQzMl90IG1fYncsIG1fYmgsIG1fZ3csIG1fZ2g7CiNlbmRpZgoKCQkJZmxvYXQgbV93ZWlnaHRfZ2FtbWE7CgoJCQkvLyBBbiB1bmZvcnR1bmF0ZSBkaWZmZXJlbmNlIG9mIGNvbnRhaW5lcnMsIGJ1dCBpbiBtZW1vcnkgdGhlc2UgbWF0cmljZXMgYXJlIGJvdGggYWRkcmVzc2VkIGFzIFtyXVtjXS4KCQkJYmFzaXN1Ojp2ZWN0b3IyRDxmbG9hdD4gbV91cHNhbXBsZV9tYXRyaXg7IC8vIHJvd3M9b3V0cHV0IG51bV9ibG9ja19zYW1wbGVzICh0ZXhlbHMpLCBjb2xzPWlucHV0IG51bV9ncmlkX3NhbXBsZXMKCQkJCgkJCWJhc2lzdTo6dmVjdG9yPGZsb2F0PiBtX2Rvd25zYW1wbGVfbWF0cml4OyAvLyByb3dzPW91dHB1dCBudW1fZ3JpZF9zYW1wbGVzcywgY29scz1pbnB1dCBudW1fYmxvY2tfc2FtcGxlcyAodGV4ZWxzKQoKCQkJLy8gZW5jb2Rpbmcgb25seQoJCQkKCQkJLy8gRm9yIGVhY2ggZ3JpZCBlbnRyeTogYSBsaXN0IG9mIHRleGVsIGluZGljZXMgdGhhdCBhcmUgaW1wYWN0ZWQgYnkgdGhhdCBncmlkIHdlaWdodAoJCQliYXNpc3U6OnZlY3RvcjwgYmFzaXN1Ojp1aW50MTZfdmVjID4gbV9ncmlkX3RvX3RleGVsX2luZmx1ZW5jZV9saXN0OwoJCQkKCQkJYmFzaXN1Ojp2ZWN0b3I8YXN0Y19oZWxwZXJzOjp3ZWlnaHRlZF9zYW1wbGU+IG1fdXBzYW1wbGVfd2VpZ2h0czsKCgkJCS8vIGZvciBncmFkaWVudCBkZXNjZW50CgkJCWJhc2lzdTo6dmVjdG9yPGZsb2F0PiBtX3Vud2VpZ2h0ZWRfZG93bnNhbXBsZV9tYXRyaXgsIG1fb25lX292ZXJfZGlhZ19BdEE7CgoJCQlhc3RjX2Jsb2NrX2dyaWRfZGF0YSgpIHt9CgkJCWFzdGNfYmxvY2tfZ3JpZF9kYXRhKGZsb2F0IHdlaWdodF9nYW1tYSkgOiBtX3dlaWdodF9nYW1tYSh3ZWlnaHRfZ2FtbWEpIHt9CgkJfTsKCgkJLy90eXBlZGVmIGJhc2lzdTo6aGFzaF9tYXA8YXN0Y19ibG9ja19ncmlkX2NvbmZpZywgYXN0Y19ibG9ja19ncmlkX2RhdGEsIGJpdF9oYXNoZXI8YXN0Y19ibG9ja19ncmlkX2NvbmZpZz4gPiBhc3RjX2Jsb2NrX2dyaWRfZGF0YV9oYXNoX3Q7CgkJCQkKCQlzdHJ1Y3QgYXN0Y19ibG9ja19ncmlkX2RhdGFfaGFzaF90CgkJewoJCQlzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IEJXSF9NSU4gPSA0LCBCV0hfTUFYID0gMTI7CgkJCXN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgR1dIX01JTiA9IDIsIEdXSF9NQVggPSAxMjsKCgkJCXN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgQldIX0NPVU5UID0gOTsKCQkJc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBHV0hfQ09VTlQgPSAxMTsKCgkJCS8vIDk4MDEgZW50cmllcwoJCQlzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IExVVF9TSVpFID0gQldIX0NPVU5UICogQldIX0NPVU5UICogR1dIX0NPVU5UICogR1dIX0NPVU5UOwoJCQkKCQkJLy8gW2J3XVtiaF1bZ3ddW2doXQoJCQlzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IEJXX01VTCA9IEJXSF9DT1VOVCAqIEdXSF9DT1VOVCAqIEdXSF9DT1VOVDsKCQkJc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBCSF9NVUwgPSBHV0hfQ09VTlQgKiBHV0hfQ09VTlQ7CgkJCXN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgR1dfTVVMID0gR1dIX0NPVU5UOwoKCQkJc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBJTkRFWF9CSUFTID0gKEJXX01VTCAqIDQpICsgKEJIX01VTCAqIDQpICsgKDIgKiBHV19NVUwpICsgMjsKCgkJCXN0YXRpYyBpbmxpbmUgdWludDMyX3QgYXN0Y19jZmdfaW5kZXgodWludDMyX3QgYncsIHVpbnQzMl90IGJoLCB1aW50MzJfdCBndywgdWludDMyX3QgZ2gpCgkJCXsKCQkJCWFzc2VydChhc3RjX2hlbHBlcnM6OmlzX3ZhbGlkX2Jsb2NrX3NpemUoYncsIGJoKSk7CgkJCQlhc3NlcnQoKGJ3ID49IDQpICYmIChidyA8PSAxMikpOwoJCQkJYXNzZXJ0KChiaCA+PSA0KSAmJiAoYmggPD0gMTIpKTsKCQkJCWFzc2VydCgoZ3cgPj0gMikgJiYgKGd3IDw9IGJ3KSk7CgkJCQlhc3NlcnQoKGdoID49IDIpICYmIChnaCA8PSBiaCkpOwoJCQkJYXNzZXJ0KChndyAqIGdoKSA8PSBhc3RjX2hlbHBlcnM6Ok1BWF9HUklEX1dFSUdIVFMpOwoKCQkJCWludCBpZHggPSBidyAqIEJXX01VTCArIGJoICogQkhfTVVMICsgZ3cgKiBHV19NVUwgKyBnaDsKCQkJCWlkeCAtPSBJTkRFWF9CSUFTOwoKCQkJCWFzc2VydCgodWludDMyX3QpaWR4ID09IChnaCAtIEdXSF9NSU4pICsgKGd3IC0gR1dIX01JTikgKiBHV0hfQ09VTlQgKyAoYmggLSBCV0hfTUlOKSAqIEdXSF9DT1VOVCAqIEdXSF9DT1VOVCArIChidyAtIEJXSF9NSU4pICogR1dIX0NPVU5UICogR1dIX0NPVU5UICogQldIX0NPVU5UKTsKCgkJCQlhc3NlcnQoaWR4IDwgKGludClMVVRfU0laRSk7CgkJCQlyZXR1cm4gaWR4OwoJCQl9CgoJCQlzdGF0aWMgaW5saW5lIHZvaWQgYXN0Y19jZmdfZnJvbV9pbmRleCh1aW50MzJfdCBpZHgsIHVpbnQzMl90JiBidywgdWludDMyX3QmIGJoLCB1aW50MzJfdCYgZ3csIHVpbnQzMl90JiBnaCkKCQkJewoJCQkJYXNzZXJ0KGlkeCA8IExVVF9TSVpFKTsKCgkJCQlidyA9IChpZHggLyBCV19NVUwpICsgQldIX01JTjsKCQkJCWlkeCAlPSBCV19NVUw7CgoJCQkJYmggPSAoaWR4IC8gQkhfTVVMKSArIEJXSF9NSU47CgkJCQlpZHggJT0gQkhfTVVMOwoKCQkJCWd3ID0gKGlkeCAvIEdXX01VTCkgKyBHV0hfTUlOOwoJCQkJZ2ggPSAoaWR4ICUgR1dfTVVMKSArIEdXSF9NSU47CgoJCQkJYXNzZXJ0KGFzdGNfaGVscGVyczo6aXNfdmFsaWRfYmxvY2tfc2l6ZShidywgYmgpKTsKCQkJCWFzc2VydCgoYncgPj0gQldIX01JTikgJiYgKGJ3IDw9IEJXSF9NQVgpKTsgCgkJCQlhc3NlcnQoKGJoID49IEJXSF9NSU4pICYmIChiaCA8PSBCV0hfTUFYKSk7CgkJCQlhc3NlcnQoKGd3ID49IEdXSF9NSU4pICYmIChndyA8PSBHV0hfTUFYKSk7CgkJCQlhc3NlcnQoKGdoID49IEdXSF9NSU4pICYmIChnaCA8PSBHV0hfTUFYKSk7CgkJCQlhc3NlcnQoKGd3IDw9IGJ3KSAmJiAoZ2ggPD0gYmgpICYmIChndyAqIGdoIDw9IGFzdGNfaGVscGVyczo6TUFYX0dSSURfV0VJR0hUUykpOwoJCQl9CgkJCQkJCQoJCQl1aW50MTZfdCBtX2hhc2hbTFVUX1NJWkVdID0geyAwIH07CgoJCQliYXNpc3U6OnZlY3Rvcjxhc3RjX2Jsb2NrX2dyaWRfZGF0YT4gbV9ncmlkX2RhdGE7CgoJCQl2b2lkIGluc2VydCh1aW50MzJfdCBibG9ja193aWR0aCwgdWludDMyX3QgYmxvY2tfaGVpZ2h0LCB1aW50MzJfdCBncmlkX3dpZHRoLCB1aW50MzJfdCBncmlkX2hlaWdodCwgY29uc3QgYXN0Y19ibG9ja19ncmlkX2RhdGEmIGRhdGEpCgkJCXsKCQkJCWNvbnN0IHVpbnQzMl90IGlkeCA9IGFzdGNfY2ZnX2luZGV4KGJsb2NrX3dpZHRoLCBibG9ja19oZWlnaHQsIGdyaWRfd2lkdGgsIGdyaWRfaGVpZ2h0KTsKCiNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKF9ERUJVRykKCQkJCXsKCQkJCQl1aW50MzJfdCByYncsIHJiaCwgcmd3LCByZ2g7CgkJCQkJYXN0Y19jZmdfZnJvbV9pbmRleChpZHgsIHJidywgcmJoLCByZ3csIHJnaCk7CgkJCQkJYXNzZXJ0KChibG9ja193aWR0aCA9PSByYncpICYmIChibG9ja19oZWlnaHQgPT0gcmJoKSAmJiAoZ3JpZF93aWR0aCA9PSByZ3cpICYmIChncmlkX2hlaWdodCA9PSByZ2gpKTsKCQkJCX0KI2VuZGlmCgoJCQkJYXNzZXJ0KG1faGFzaFtpZHhdID09IDApOwoJCQkJCQkJCQoJCQkJbV9oYXNoW2lkeF0gPSBiYXNpc3U6OnNhZmVfY2FzdF91aW50MTYobV9ncmlkX2RhdGEuc2l6ZV91MzIoKSArIDEpOwoJCQkJbV9ncmlkX2RhdGEucHVzaF9iYWNrKGRhdGEpOwoKI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoX0RFQlVHKQoJCQkJbV9ncmlkX2RhdGEuYmFjaygpLm1fYncgPSBibG9ja193aWR0aDsKCQkJCW1fZ3JpZF9kYXRhLmJhY2soKS5tX2JoID0gYmxvY2tfaGVpZ2h0OwoJCQkJbV9ncmlkX2RhdGEuYmFjaygpLm1fZ3cgPSBncmlkX3dpZHRoOwoJCQkJbV9ncmlkX2RhdGEuYmFjaygpLm1fZ2ggPSBncmlkX2hlaWdodDsKI2VuZGlmCgkJCX0KCgkJCWlubGluZSBjb25zdCBhc3RjX2Jsb2NrX2dyaWRfZGF0YSogZmluZCh1aW50MzJfdCBibG9ja193aWR0aCwgdWludDMyX3QgYmxvY2tfaGVpZ2h0LCB1aW50MzJfdCBncmlkX3dpZHRoLCB1aW50MzJfdCBncmlkX2hlaWdodCkgY29uc3QKCQkJewoJCQkJY29uc3QgdWludDMyX3QgaGFzaF9pZHggPSBhc3RjX2NmZ19pbmRleChibG9ja193aWR0aCwgYmxvY2tfaGVpZ2h0LCBncmlkX3dpZHRoLCBncmlkX2hlaWdodCk7CgkJCQkKCQkJCXVpbnQzMl90IGdyaWRfZGF0YV9pZHggPSBtX2hhc2hbaGFzaF9pZHhdOwoJCQkJYXNzZXJ0KGdyaWRfZGF0YV9pZHgpOwoJCQkJCgkJCQljb25zdCBhc3RjX2Jsb2NrX2dyaWRfZGF0YSogcCA9ICZtX2dyaWRfZGF0YVtncmlkX2RhdGFfaWR4IC0gMV07CgojaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChfREVCVUcpCgkJCQlhc3NlcnQocC0+bV9idyA9PSBibG9ja193aWR0aCk7CgkJCQlhc3NlcnQocC0+bV9iaCA9PSBibG9ja19oZWlnaHQpOwoJCQkJYXNzZXJ0KHAtPm1fZ3cgPT0gZ3JpZF93aWR0aCk7CgkJCQlhc3NlcnQocC0+bV9naCA9PSBncmlkX2hlaWdodCk7CiNlbmRpZgoKCQkJCXJldHVybiBwOwoJCQl9CgkJfTsKCgkJZXh0ZXJuIGFzdGNfYmxvY2tfZ3JpZF9kYXRhX2hhc2hfdCBnX2FzdGNfYmxvY2tfZ3JpZF9kYXRhX2hhc2g7CgoJCWlubGluZSBjb25zdCBhc3RjX2Jsb2NrX2dyaWRfZGF0YSogZmluZF9hc3RjX2Jsb2NrX2dyaWRfZGF0YSh1aW50MzJfdCBibG9ja193aWR0aCwgdWludDMyX3QgYmxvY2tfaGVpZ2h0LCB1aW50MzJfdCBncmlkX3dpZHRoLCB1aW50MzJfdCBncmlkX2hlaWdodCkKCQl7CgkJCXJldHVybiBnX2FzdGNfYmxvY2tfZ3JpZF9kYXRhX2hhc2guZmluZChibG9ja193aWR0aCwgYmxvY2tfaGVpZ2h0LCBncmlkX3dpZHRoLCBncmlkX2hlaWdodCk7CgkJfQoJCQkJCQkKCQl2b2lkIGRlY29kZV9lbmRwb2ludHNfaXNlMjAodWludDMyX3QgY2VtX2luZGV4LCBjb25zdCB1aW50OF90KiBwRW5kcG9pbnRfdmFscywgY29sb3IzMiYgbCwgY29sb3IzMiYgaCk7CgkJdm9pZCBkZWNvZGVfZW5kcG9pbnRzKHVpbnQzMl90IGNlbV9pbmRleCwgY29uc3QgdWludDhfdCogcEVuZHBvaW50X3ZhbHMsIHVpbnQzMl90IGVuZHBvaW50X2lzZV9pbmRleCwgY29sb3IzMiYgbCwgY29sb3IzMiYgaCwgZmxvYXQqIHBTY2FsZSA9IG51bGxwdHIpOwoKCQl2b2lkIGRlY29kZV9lbmRwb2ludHNfaXNlMjAodWludDMyX3QgY2VtX2luZGV4LCBjb25zdCB1aW50OF90KiBwRW5kcG9pbnRfdmFscywgY29sb3JfcmdiYSYgbCwgY29sb3JfcmdiYSYgaCk7CgkJdm9pZCBkZWNvZGVfZW5kcG9pbnRzKHVpbnQzMl90IGNlbV9pbmRleCwgY29uc3QgdWludDhfdCogcEVuZHBvaW50X3ZhbHMsIHVpbnQzMl90IGVuZHBvaW50X2lzZV9pbmRleCwgY29sb3JfcmdiYSYgbCwgY29sb3JfcmdiYSYgaCwgZmxvYXQqIHBTY2FsZSA9IG51bGxwdHIpOwoKCQl2b2lkIGNvbXB1dGVfYWRqb2ludF9kb3duc2FtcGxlX21hdHJpeChiYXNpc3U6OnZlY3RvcjxmbG9hdD4mIGRvd25zYW1wbGVfbWF0cml4LCB1aW50MzJfdCBibG9ja193aWR0aCwgdWludDMyX3QgYmxvY2tfaGVpZ2h0LCB1aW50MzJfdCBncmlkX3dpZHRoLCB1aW50MzJfdCBncmlkX2hlaWdodCk7CgkJdm9pZCBjb21wdXRlX3Vwc2FtcGxlX21hdHJpeChiYXNpc3U6OnZlY3RvcjJEPGZsb2F0PiYgdXBzYW1wbGVfbWF0cml4LCB1aW50MzJfdCBibG9ja193aWR0aCwgdWludDMyX3QgYmxvY2tfaGVpZ2h0LCB1aW50MzJfdCBncmlkX3dpZHRoLCB1aW50MzJfdCBncmlkX2hlaWdodCk7CgoJCWNsYXNzIGRjdDJmCgkJewoJCQllbnVtIHsgY01heFNpemUgPSAxMiB9OwoKCQlwdWJsaWM6CgkJCWRjdDJmKCkgOiBtX3Jvd3MoMHUpLCBtX2NvbHMoMHUpIHt9CgoJCQkvLyBjYWxsIHdpdGggZ3JpZF9oZWlnaHQvZ3JpZF93aWR0aCAoSU5WRVJURUQpCgkJCWJvb2wgaW5pdCh1aW50MzJfdCByb3dzLCB1aW50MzJfdCBjb2xzKTsKCQkJCgkJCXVpbnQzMl90IHJvd3MoKSBjb25zdCB7IHJldHVybiBtX3Jvd3M7IH0KCQkJdWludDMyX3QgY29scygpIGNvbnN0IHsgcmV0dXJuIG1fY29sczsgfQoKCQkJdm9pZCBmb3J3YXJkKGNvbnN0IGZsb2F0KiBwU3JjLCBmbG9hdCogcERzdCwgZnZlYyYgd29yaykgY29uc3Q7CgkJCQoJCQl2b2lkIGludmVyc2UoY29uc3QgZmxvYXQqIHBTcmMsIGZsb2F0KiBwRHN0LCBmdmVjJiB3b3JrKSBjb25zdDsKCQkJCgkJCS8vIGNoZWNrIHZhcmlhbnRzIHVzZSBhIGxlc3Mgb3B0aW1pemVkIGltcGxlbWVudGF0aW9uLCB1c2VkIGZvciBzYW5pdHkgY2hlY2tpbmcKCQkJdm9pZCBpbnZlcnNlX2NoZWNrKGNvbnN0IGZsb2F0KiBwU3JjLCBmbG9hdCogcERzdCwgZnZlYyYgd29yaykgY29uc3Q7CgkJCQoJCQl2b2lkIGZvcndhcmQoY29uc3QgZmxvYXQqIHBTcmMsIHVpbnQzMl90IHNyY19zdHJpZGUsCgkJCQlmbG9hdCogcERzdCwgdWludDMyX3QgZHN0X3N0cmlkZSwgZnZlYyYgd29yaykgY29uc3Q7CgoJCQl2b2lkIGZvcndhcmQoY29uc3QgZmxvYXQqIHBTcmMsIHVpbnQzMl90IHNyY19zdHJpZGUsCgkJCQlmbG9hdCogcERzdCwgdWludDMyX3QgZHN0X3N0cmlkZSwgZmxvYXQqIHBXb3JrKSBjb25zdDsKCQkJCgkJCXZvaWQgaW52ZXJzZShjb25zdCBmbG9hdCogcFNyYywgdWludDMyX3Qgc3JjX3N0cmlkZSwKCQkJCWZsb2F0KiBwRHN0LCB1aW50MzJfdCBkc3Rfc3RyaWRlLCBmdmVjJiB3b3JrKSBjb25zdDsKCQkJCgkJCXZvaWQgaW52ZXJzZV9jaGVjayhjb25zdCBmbG9hdCogcFNyYywgdWludDMyX3Qgc3JjX3N0cmlkZSwKCQkJCWZsb2F0KiBwRHN0LCB1aW50MzJfdCBkc3Rfc3RyaWRlLCBmdmVjJiB3b3JrKSBjb25zdDsKCgkJcHJpdmF0ZToKCQkJdWludDMyX3QgbV9yb3dzLCBtX2NvbHM7CgkJCWZ2ZWMgbV9jX2NvbDsgICAvLyBbdSptX3Jvd3MgKyB4XQoJCQlmdmVjIG1fY19yb3c7ICAgLy8gW3YqbV9jb2xzICsgeV0KCQkJZnZlYyBtX2FfY29sOyAgIC8vIGFscGhhKHUpCgkJCWZ2ZWMgbV9hX3JvdzsgICAvLyBhbHBoYSh2KQoJCX07CgoJCXN0cnVjdCBkY3Rfc3ltcwoJCXsKCQkJZGN0X3N5bXMoKQoJCQl7CgkJCQljbGVhcigpOwoJCQl9CgoJCQl2b2lkIGNsZWFyKCkKCQkJewoJCQkJbV9kY19zeW0gPSAwOwoJCQkJbV9udW1fZGNfbGV2ZWxzID0gMDsKCQkJCW1fY29lZmZzLnJlc2l6ZSgwKTsKCQkJCW1fbWF4X2NvZWZmX21hZyA9IDA7CgkJCQltX21heF96aWd6YWdfaW5kZXggPSAwOwoJCQl9CgoJCQl1aW50MzJfdCBtX2RjX3N5bTsKCQkJdWludDMyX3QgbV9udW1fZGNfbGV2ZWxzOwoKCQkJc3RydWN0IGNvZWZmCgkJCXsKCQkJCXVpbnQxNl90IG1fbnVtX3plcm9zOwoJCQkJaW50MTZfdCBtX2NvZWZmOyAvLyBvciBJTlQxNl9NQVggaWYgaW52YWxpZAoKCQkJCWNvZWZmKCkge30KCQkJCWNvZWZmKHVpbnQxNl90IG51bV96ZXJvcywgaW50MTZfdCBjb2VmZikgOiBtX251bV96ZXJvcyhudW1femVyb3MpLCBtX2NvZWZmKGNvZWZmKSB7fQoJCQl9OwoKCQkJLy9iYXNpc3U6OnN0YXRpY192ZWN0b3I8Y29lZmYsIDY1PiBtX2NvZWZmczsKCQkJYmFzaXN1Ojp2ZWN0b3I8Y29lZmY+IG1fY29lZmZzOwoKCQkJdWludDMyX3QgbV9tYXhfY29lZmZfbWFnOwoJCQl1aW50MzJfdCBtX21heF96aWd6YWdfaW5kZXg7CgkJfTsKCQkJCQoJCXN0cnVjdCBncmlkX2RpbV9rZXkKCQl7CgkJCWludCBtX2dyaWRfd2lkdGg7CgkJCWludCBtX2dyaWRfaGVpZ2h0OwoKCQkJZ3JpZF9kaW1fa2V5KCkge30KCgkJCWdyaWRfZGltX2tleShpbnQgdywgaW50IGgpIDogbV9ncmlkX3dpZHRoKHcpLCBtX2dyaWRfaGVpZ2h0KGgpIHt9CgoJCQlib29sIG9wZXJhdG9yPT0gKGNvbnN0IGdyaWRfZGltX2tleSYgcmhzKSBjb25zdAoJCQl7CgkJCQlyZXR1cm4gKG1fZ3JpZF93aWR0aCA9PSByaHMubV9ncmlkX3dpZHRoKSAmJiAobV9ncmlkX2hlaWdodCA9PSByaHMubV9ncmlkX2hlaWdodCk7CgkJCX0KCQl9OwoKCQlzdHJ1Y3QgZ3JpZF9kaW1fdmFsdWUKCQl7CgkJCWJhc2lzdTo6aW50X3ZlYyBtX3ppZ3phZzsKCQkJZGN0MmYgbV9kY3Q7CgkJfTsKCgkJdHlwZWRlZiBiYXNpc3U6Omhhc2hfbWFwPGdyaWRfZGltX2tleSwgZ3JpZF9kaW1fdmFsdWUsIGJpdF9oYXNoZXI8Z3JpZF9kaW1fa2V5PiA+IGdyaWRfZGltX2hhc2hfbWFwOwoKCQl2b2lkIGluaXRfYXN0Y19ibG9ja19ncmlkX2RhdGFfaGFzaCgpOwoJCQkJCgkJY29uc3QgZmxvYXQgREVBRFpPTkVfQUxQSEEgPSAuNWY7CgkJY29uc3QgZmxvYXQgU0NBTEVEX1dFSUdIVF9CQVNFX0NPRElOR19TQ0FMRSA9IC41ZjsgLy8gdHlwaWNhbGx5IH41IGJpdHMgWzAsMzJdLCBvciAzIFswLDhdCgoJCXN0cnVjdCBzYW1wbGVfcXVhbnRfdGFibGVfc3RhdGUKCQl7CgkJCWZsb2F0IG1fcSwgbV9zeCwgbV9zeSwgbV9sZXZlbF9zY2FsZTsKCgkJCXZvaWQgaW5pdChmbG9hdCBxLAoJCQkJdWludDMyX3QgYmxvY2tfd2lkdGgsIHVpbnQzMl90IGJsb2NrX2hlaWdodCwKCQkJCWZsb2F0IGxldmVsX3NjYWxlKQoJCQl7CgkJCQltX3EgPSBxOwoJCQkJbV9sZXZlbF9zY2FsZSA9IGxldmVsX3NjYWxlOwoKCQkJCWNvbnN0IGludCBCeCA9IGJsb2NrX3dpZHRoLCBCeSA9IGJsb2NrX2hlaWdodDsKCgkJCQltX3N4ID0gKGZsb2F0KTguMGYgLyAoZmxvYXQpQng7CgkJCQltX3N5ID0gKGZsb2F0KTguMGYgLyAoZmxvYXQpQnk7CgkJCX0KCQl9OwoKCQljbGFzcyBncmlkX3dlaWdodF9kY3QKCQl7CgkJcHVibGljOgoJCQlncmlkX3dlaWdodF9kY3QoKSB7IH0KCgkJCXZvaWQgaW5pdCh1aW50MzJfdCBibG9ja193aWR0aCwgdWludDMyX3QgYmxvY2tfaGVpZ2h0KTsKCQkJCgkJCXN0YXRpYyB1aW50MzJfdCBnZXRfbnVtX3dlaWdodF9kY19sZXZlbHModWludDMyX3Qgd2VpZ2h0X2lzZV9yYW5nZSkKCQkJewoJCQkJZmxvYXQgc2NhbGVkX3dlaWdodF9jb2Rpbmdfc2NhbGUgPSBTQ0FMRURfV0VJR0hUX0JBU0VfQ09ESU5HX1NDQUxFOwoJCQkJaWYgKHdlaWdodF9pc2VfcmFuZ2UgPD0gYXN0Y19oZWxwZXJzOjpCSVNFXzhfTEVWRUxTKQoJCQkJCXNjYWxlZF93ZWlnaHRfY29kaW5nX3NjYWxlID0gMS4wZiAvIDguMGY7CgoJCQkJcmV0dXJuICh1aW50MzJfdCkoNjQuMGYgKiBzY2FsZWRfd2VpZ2h0X2NvZGluZ19zY2FsZSkgKyAxOwoJCQl9CgoJCQlzdHJ1Y3QgYmxvY2tfc3RhdHMKCQkJewoJCQkJZmxvYXQgbV9tZWFuX3dlaWdodDsKCQkJCXVpbnQzMl90IG1fdG90YWxfY29kZWRfYWNzOwoJCQkJdWludDMyX3QgbV9tYXhfYWNfY29lZmY7CgkJCX07CgoJCQlib29sIGRlY29kZV9ibG9ja193ZWlnaHRzKAoJCQkJZmxvYXQgcSwgdWludDMyX3QgcGxhbmVfaW5kZXgsIC8vIHBsYW5lIG9mIHdlaWdodHMgdG8gZGVjb2RlIGFuZCBJRENUIGZyb20gc3RyZWFtCgkJCQlhc3RjX2hlbHBlcnM6OmxvZ19hc3RjX2Jsb2NrJiBsb2dfYmxrLCAvLyBtdXN0IGJlIGluaXRpYWxpemVkIGV4Y2VwdCBmb3IgdGhlIHBsYW5lIHdlaWdodHMgd2hpY2ggYXJlIGRlY29kZWQKCQkJCWJhc2lzdDo6Yml0d2lzZV9kZWNvZGVyKiBwRGVjLAoJCQkJYmxvY2tfc3RhdHMqIHBTLAoJCQkJZnZlYyYgZGN0X3dvcmssIC8vIHRocmVhZCBsb2NhbAoJCQkJY29uc3QgZGN0X3N5bXMqIHBTeW1zID0gbnVsbHB0cikgY29uc3Q7CgkJCQkJCQoJCQllbnVtIHsgbV96ZXJvX3J1biA9IDMsIG1fY29lZmYgPSAyIH07CgoJCQl1aW50MzJfdCBtX2Jsb2NrX3dpZHRoLCBtX2Jsb2NrX2hlaWdodDsKCgkJCWdyaWRfZGltX2hhc2hfbWFwIG1fZ3JpZF9kaW1fa2V5X3ZhbHM7CgkJCQkJCQoJCQkvLyBBZGFwdGl2ZWx5IGNvbXBlbnNhdGUgZm9yIHdlaWdodCBsZXZlbCBxdWFudGl6YXRpb24gbm9pc2UgYmVpbmcgZmVkIGludG8gdGhlIERDVC4gCgkJCS8vIFRoZSBtb3JlIGNvdXJzZWx5IHRoZSB3ZWlnaHQgbGV2ZWxzIGFyZSBxdWFudGl6ZWQsIHRoZSBtb3JlIG5vaXNlIGluamVjdGVkLCBhbmQgdGhlIG1vcmUgbm9pc2Ugd2lsbCBiZSBzcHJlYWQgYmV0d2VlbiBtdWx0aXBsZSBBQyBjb2VmZmljaWVudHMuCgkJCS8vIFRoaXMgd2lsbCBjYXVzZSBzb21lIHByZXZpb3VzbHkgMCBjb2VmZmljaWVudHMgdG8gaW5jcmVhc2UgaW4gbWFnLCBidXQgdGhleSdyZSBsaWtlbHkgbm9pc2UuIFNvIGNhcmVmdWxseSBudWRnZSB0aGUgcXVhbnQgc3RlcCBzaXplIHRvIGNvbXBlbnNhdGUuCgkJCXN0YXRpYyBmbG9hdCBzY2FsZV9xdWFudF9zdGVwcyhpbnQgUV9hc3RjLCBmbG9hdCBnYW1tYSA9IDAuMWYgLyouMTNmKi8sIGZsb2F0IGNsYW1wX21heCA9IDIuMGYpCgkJCXsKCQkJCWFzc2VydChRX2FzdGMgPj0gMik7CgkJCQlmbG9hdCBmYWN0b3IgPSA2My4wZiAvIChRX2FzdGMgLSAxKTsKCQkJCS8vIFRPRE86IEFwcHJveGltYXRlIHBvd2YoKQoJCQkJZmxvYXQgc2NhbGVkID0gcG93ZihmYWN0b3IsIGdhbW1hKTsKCQkJCXNjYWxlZCA9IGJhc2lzdTo6Y2xhbXA8ZmxvYXQ+KHNjYWxlZCwgMS4wZiwgY2xhbXBfbWF4KTsKCQkJCXJldHVybiBzY2FsZWQ7CgkJCX0KCgkJCWZsb2F0IGNvbXB1dGVfbGV2ZWxfc2NhbGUoZmxvYXQgcSwgZmxvYXQgc3Bhbl9sZW4sIHVpbnQzMl90IGdyaWRfd2lkdGgsIHVpbnQzMl90IGdyaWRfaGVpZ2h0LCB1aW50MzJfdCB3ZWlnaHRfaXNlX3JhbmdlKSBjb25zdDsKCgkJCWludCBzYW1wbGVfcXVhbnRfdGFibGUoc2FtcGxlX3F1YW50X3RhYmxlX3N0YXRlJiBzdGF0ZSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgY29uc3Q7CgoJCQl2b2lkIGNvbXB1dGVfcXVhbnRfdGFibGUoZmxvYXQgcSwKCQkJCXVpbnQzMl90IGdyaWRfd2lkdGgsIHVpbnQzMl90IGdyaWRfaGVpZ2h0LAoJCQkJZmxvYXQgbGV2ZWxfc2NhbGUsIGludCogZGN0X3F1YW50X3RhYikgY29uc3Q7CgkJCQoJCQlmbG9hdCBnZXRfbWF4X3NwYW5fbGVuKGNvbnN0IGFzdGNfaGVscGVyczo6bG9nX2FzdGNfYmxvY2smIGxvZ19ibGssIHVpbnQzMl90IHBsYW5lX2luZGV4KSBjb25zdDsKCQkJCgkJCWlubGluZSBpbnQgcXVhbnRpemVfZGVhZHpvbmUoZmxvYXQgZCwgaW50IEwsIGZsb2F0IGFscGhhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSBjb25zdAoJCQl7CgkJCQlhc3NlcnQoKHggPCBtX2Jsb2NrX3dpZHRoKSAmJiAoeSA8IG1fYmxvY2tfaGVpZ2h0KSk7CgoJCQkJaWYgKCgoeCA9PSAxKSAmJiAoeSA9PSAwKSkgfHwKCQkJCQkoKHggPT0gMCkgJiYgKHkgPT0gMSkpKQoJCQkJewoJCQkJCXJldHVybiAoaW50KXN0ZDo6cm91bmQoZCAvIChmbG9hdClMKTsKCQkJCX0KCgkJCQkvLyBMID0gcXVhbnQgc3RlcCwgYWxwaGEgaW4gWzAsMS4yXSAodHlwaWNhbCAwLjeWMC44NSkKCQkJCWlmIChMIDw9IDApIAoJCQkJCXJldHVybiAwOwoKCQkJCWZsb2F0IHMgPSBmYWJzZihkKTsKCQkJCWZsb2F0IHRhdSA9IGFscGhhICogZmxvYXQoTCk7ICAgICAgICAgICAgICAgICAvLyBoYWxmLXdpZHRoIG9mIHRoZSB6ZXJvIGJhbmQKCgkJCQlpZiAocyA8PSB0YXUpIAoJCQkJCXJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zaWRlIGRlYWQtem9uZSB0b3dhcmRzIHplcm8KCgkJCQkvLyBRdWFudGl6ZSB0aGUgcmVzaWR1YWwgb3V0c2lkZSB0aGUgZGVhZC16b25lIHdpdGggbWlkLXRyZWFkIHJvdW5kaW5nCgkJCQlmbG9hdCBxZiA9IChzIC0gdGF1KSAvIGZsb2F0KEwpOwoJCQkJaW50ICAgcSA9IChpbnQpZmxvb3JmKHFmICsgMC41Zik7ICAgICAgICAgICAgLy8gdGllcy1uZWFyZXN0CgkJCQlyZXR1cm4gKGQgPCAwLjBmKSA/IC1xIDogcTsKCQkJfQoKCQkJaW5saW5lIGZsb2F0IGRlcXVhbnRfZGVhZHpvbmUoaW50IHEsIGludCBMLCBmbG9hdCBhbHBoYSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgY29uc3QKCQkJewoJCQkJYXNzZXJ0KCh4IDwgbV9ibG9ja193aWR0aCkgJiYgKHkgPCBtX2Jsb2NrX2hlaWdodCkpOwoKCQkJCWlmICgoKHggPT0gMSkgJiYgKHkgPT0gMCkpIHx8CgkJCQkJKCh4ID09IDApICYmICh5ID09IDEpKSkKCQkJCXsKCQkJCQlyZXR1cm4gKGZsb2F0KXEgKiAoZmxvYXQpTDsKCQkJCX0KCgkJCQlpZiAocSA9PSAwIHx8IEwgPD0gMCkgCgkJCQkJcmV0dXJuIDAuMGY7CgoJCQkJZmxvYXQgdGF1ID0gYWxwaGEgKiBmbG9hdChMKTsKCQkJCWZsb2F0IG1hZyA9IHRhdSArIGZsb2F0KGFicyhxKSkgKiBmbG9hdChMKTsgICAvLyBjZW50ZXIgb2YgdGhlIChub256ZXJvKSBiaW4KCQkJCXJldHVybiAocSA8IDApID8gLW1hZyA6IG1hZzsKCQkJfQoJCX07CgoJCXN0cnVjdCB0cmlhbF9tb2RlCgkJewoJCQl1aW50MzJfdCBtX2dyaWRfd2lkdGg7CgkJCXVpbnQzMl90IG1fZ3JpZF9oZWlnaHQ7CgkJCXVpbnQzMl90IG1fY2VtOwoJCQlpbnQgbV9jY3NfaW5kZXg7CgkJCXVpbnQzMl90IG1fZW5kcG9pbnRfaXNlX3JhbmdlOwoJCQl1aW50MzJfdCBtX3dlaWdodF9pc2VfcmFuZ2U7CgkJCXVpbnQzMl90IG1fbnVtX3BhcnRzOwoKCQkJYm9vbCBvcGVyYXRvcj09KGNvbnN0IHRyaWFsX21vZGUmIG90aGVyKSBjb25zdAoJCQl7CiNkZWZpbmUgQlVfQ09NUChhKSBpZiAoYSAhPSBvdGhlci5hKSByZXR1cm4gZmFsc2U7CgkJCQlCVV9DT01QKG1fZ3JpZF93aWR0aCk7CgkJCQlCVV9DT01QKG1fZ3JpZF9oZWlnaHQpOwoJCQkJQlVfQ09NUChtX2NlbSk7CgkJCQlCVV9DT01QKG1fY2NzX2luZGV4KTsKCQkJCUJVX0NPTVAobV9lbmRwb2ludF9pc2VfcmFuZ2UpOwoJCQkJQlVfQ09NUChtX3dlaWdodF9pc2VfcmFuZ2UpOwoJCQkJQlVfQ09NUChtX251bV9wYXJ0cyk7CiN1bmRlZiBCVV9DT01QCgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoKCQkJYm9vbCBvcGVyYXRvcjwoY29uc3QgdHJpYWxfbW9kZSYgcmhzKSBjb25zdAoJCQl7CiNkZWZpbmUgQlVfQ09NUChhKSBpZiAoYSA8IHJocy5hKSByZXR1cm4gdHJ1ZTsgZWxzZSBpZiAoYSA+IHJocy5hKSByZXR1cm4gZmFsc2U7CgkJCQlCVV9DT01QKG1fZ3JpZF93aWR0aCk7CgkJCQlCVV9DT01QKG1fZ3JpZF9oZWlnaHQpOwoJCQkJQlVfQ09NUChtX2NlbSk7CgkJCQlCVV9DT01QKG1fY2NzX2luZGV4KTsKCQkJCUJVX0NPTVAobV9lbmRwb2ludF9pc2VfcmFuZ2UpOwoJCQkJQlVfQ09NUChtX3dlaWdodF9pc2VfcmFuZ2UpOwoJCQkJQlVfQ09NUChtX251bV9wYXJ0cyk7CiN1bmRlZiBCVV9DT01QCgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCgkJCW9wZXJhdG9yIHNpemVfdCgpIGNvbnN0CgkJCXsKCQkJCXNpemVfdCBoID0gMHhBQkMxRjQxOTsKI2RlZmluZSBCVV9GSUVMRChhKSBkbyB7IGggXj0gaGFzaF9oc2llaChyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oJmEpLCBzaXplb2YoYSkpOyB9IHdoaWxlKDApCgkJCQlCVV9GSUVMRChtX2dyaWRfd2lkdGgpOwoJCQkJQlVfRklFTEQobV9ncmlkX2hlaWdodCk7CgkJCQlCVV9GSUVMRChtX2NlbSk7CgkJCQlCVV9GSUVMRChtX2Njc19pbmRleCk7CgkJCQlCVV9GSUVMRChtX2VuZHBvaW50X2lzZV9yYW5nZSk7CgkJCQlCVV9GSUVMRChtX3dlaWdodF9pc2VfcmFuZ2UpOwoJCQkJQlVfRklFTEQobV9udW1fcGFydHMpOwojdW5kZWYgQlVfRklFTEQKCQkJCXJldHVybiBoOwoJCQl9CgkJfTsKCgkJLy8gT3JnYW5pemUgdHJpYWwgbW9kZXMgZm9yIGZhc3RlciBpbml0aWFsIG1vZGUgdHJpYWdpbmcuCgkJY29uc3QgdWludDMyX3QgT1RNX05VTV9DRU1TID0gMTQ7IC8vIDAtMTMgKDEzPWhpZ2hlc3QgdmFsaWQgTERSIENFTSkKCQljb25zdCB1aW50MzJfdCBPVE1fTlVNX1NVQlNFVFMgPSAzOyAvLyAxLTMKCQljb25zdCB1aW50MzJfdCBPVE1fTlVNX0NDUyA9IDU7IC8vIC0xIHRvIDMKCQljb25zdCB1aW50MzJfdCBPVE1fTlVNX0dSSURfU0laRVMgPSAyOyAvLyAwPXNtYWxsIG9yIDE9bGFyZ2UgKGdyaWRfdz49YmxvY2tfdy0xIGFuZCBncmlkX2g+PWJsb2NrX2gtMSkKCQljb25zdCB1aW50MzJfdCBPVE1fTlVNX0dSSURfQU5JU09TID0gMzsgLy8gMD1XPUgsIDE9Vz5ILCAyPVc8SAoJCQkJCgkJaW5saW5lIHVpbnQzMl90IGNhbGNfZ3JpZF9zaXplX3ZhbCh1aW50MzJfdCBncmlkX3dpZHRoLCB1aW50MzJfdCBncmlkX2hlaWdodCwgdWludDMyX3QgYmxvY2tfd2lkdGgsIHVpbnQzMl90IGJsb2NrX2hlaWdodCkKCQl7CgkJCXJldHVybiAoZ3JpZF93aWR0aCA+PSAoYmxvY2tfd2lkdGggLSAxKSkgJiYgKGdyaWRfaGVpZ2h0ID49IChibG9ja19oZWlnaHQgLSAxKSk7CgkJfQoKCQlpbmxpbmUgdWludDMyX3QgY2FsY19ncmlkX2FuaXNvX3ZhbCh1aW50MzJfdCBndywgdWludDMyX3QgZ2gsIHVpbnQzMl90IGJ3LCB1aW50MzJfdCBiaCkKCQl7CgkJCWFzc2VydCgoZ3cgPiAwKSAmJiAoZ2ggPiAwKSk7CgkJCWFzc2VydCgoYncgPiAwKSAmJiAoYmggPiAwKSk7CgkJCWFzc2VydCgoZ3cgPD0gMTIpICYmIChnaCA8PSAxMikgJiYgKGJ3IDw9IDEyKSAmJiAoYmggPD0gMTIpKTsKCQkJYXNzZXJ0KChndyA8PSBidykgJiYgKGdoIDw9IGJoKSk7CgkJCQkJCQojaWYgMAoJCQkvLyBQcmV2LiBjb2RlOgoJCQl1aW50MzJfdCBncmlkX2FuaXNvID0gMDsKCQkJaWYgKHRtLm1fZ3JpZF93aWR0aCAhPSB0bS5tX2dyaWRfaGVpZ2h0KSAvLyBub3Qgb3B0aW1hbCBmb3Igbm9uLXNxdWFyZSBibG9jayBzaXplcwoJCQl7CgkJCQljb25zdCBmbG9hdCBncmlkX3hfZnJhY3QgPSAoZmxvYXQpdG0ubV9ncmlkX3dpZHRoIC8gKGZsb2F0KWJsb2NrX3dpZHRoOwoJCQkJY29uc3QgZmxvYXQgZ3JpZF95X2ZyYWN0ID0gKGZsb2F0KXRtLm1fZ3JpZF9oZWlnaHQgLyAoZmxvYXQpYmxvY2tfaGVpZ2h0OwoJCQkJaWYgKGdyaWRfeF9mcmFjdCA+PSBncmlkX3lfZnJhY3QpCgkJCQkJZ3JpZF9hbmlzbyA9IDE7CgkJCQllbHNlIGlmIChncmlkX3hfZnJhY3QgPCBncmlkX3lfZnJhY3QpCgkJCQkJZ3JpZF9hbmlzbyA9IDI7CgkJCX0KI2VuZGlmCgkJCS8vIENvbXBhcmUgZ3cvYncgdnMuIGdoL2JoIHVzaW5nIGludGVnZXIgbWF0aDoKCQkJLy8gZ3cqYmggPj0gZ2gqYncgIC0+IFgtZG9taW5hbnQgKDEpLCBlbHNlIFktZG9taW5hbnQgKDIpCgkJCWNvbnN0IHVpbnQzMl90IGxocyA9IGd3ICogYmg7CgkJCWNvbnN0IHVpbnQzMl90IHJocyA9IGdoICogYnc7CgoJCQkvLyBFcXVhbCAoaXNvdHJvcGljKSwgWD1ZCgkJCWlmIChsaHMgPT0gcmhzKQoJCQkJcmV0dXJuIDA7CgoJCQkvLyBBbmlzb3Ryb3BpYyAtIDE9WCwgMj1ZCgkJCXJldHVybiAobGhzID49IHJocykgPyAxIDogMjsKCQl9CgoJCXN0cnVjdCBncm91cGVkX3RyaWFsX21vZGVzCgkJewoJCQliYXNpc3U6OnVpbnRfdmVjIG1fdG1fZ3JvdXBzW09UTV9OVU1fQ0VNU11bT1RNX05VTV9TVUJTRVRTXVtPVE1fTlVNX0NDU11bT1RNX05VTV9HUklEX1NJWkVTXVtPVE1fTlVNX0dSSURfQU5JU09TXTsgLy8gaW5kaWNlcyBvZiBlbmNvZGVyIHRyaWFsIG1vZGVzIGluIGVhY2ggYnVja2V0CgoJCQl2b2lkIGNsZWFyKCkKCQkJewoJCQkJZm9yICh1aW50MzJfdCBjZW1faXRlciA9IDA7IGNlbV9pdGVyIDwgT1RNX05VTV9DRU1TOyBjZW1faXRlcisrKQoJCQkJCWZvciAodWludDMyX3Qgc3Vic2V0c19pdGVyID0gMDsgc3Vic2V0c19pdGVyIDwgT1RNX05VTV9TVUJTRVRTOyBzdWJzZXRzX2l0ZXIrKykKCQkJCQkJZm9yICh1aW50MzJfdCBjY3NfaXRlciA9IDA7IGNjc19pdGVyIDwgT1RNX05VTV9DQ1M7IGNjc19pdGVyKyspCgkJCQkJCQlmb3IgKHVpbnQzMl90IGdyaWRfc2l6ZXNfaXRlciA9IDA7IGdyaWRfc2l6ZXNfaXRlciA8IE9UTV9OVU1fR1JJRF9TSVpFUzsgZ3JpZF9zaXplc19pdGVyKyspCgkJCQkJCQkJZm9yICh1aW50MzJfdCBncmlkX2FuaXNvc19pdGVyID0gMDsgZ3JpZF9hbmlzb3NfaXRlciA8IE9UTV9OVU1fR1JJRF9BTklTT1M7IGdyaWRfYW5pc29zX2l0ZXIrKykKCQkJCQkJCQkJbV90bV9ncm91cHNbY2VtX2l0ZXJdW3N1YnNldHNfaXRlcl1bY2NzX2l0ZXJdW2dyaWRfc2l6ZXNfaXRlcl1bZ3JpZF9hbmlzb3NfaXRlcl0uY2xlYXIoKTsKCQkJfQoKCQkJdm9pZCBhZGQodWludDMyX3QgYmxvY2tfd2lkdGgsIHVpbnQzMl90IGJsb2NrX2hlaWdodCwKCQkJCWNvbnN0IHRyaWFsX21vZGUmIHRtLCB1aW50MzJfdCB0bV9pbmRleCkKCQkJewoJCQkJY29uc3QgdWludDMyX3QgY2VtX2luZGV4ID0gdG0ubV9jZW07CgkJCQlhc3NlcnQoY2VtX2luZGV4IDwgT1RNX05VTV9DRU1TKTsKCgkJCQljb25zdCB1aW50MzJfdCBzdWJzZXRfaW5kZXggPSB0bS5tX251bV9wYXJ0cyAtIDE7CgkJCQlhc3NlcnQoc3Vic2V0X2luZGV4IDwgT1RNX05VTV9TVUJTRVRTKTsKCgkJCQljb25zdCB1aW50MzJfdCBjY3NfaW5kZXggPSB0bS5tX2Njc19pbmRleCArIDE7CgkJCQlhc3NlcnQoY2NzX2luZGV4IDwgT1RNX05VTV9DQ1MpOwoKCQkJCWNvbnN0IHVpbnQzMl90IGdyaWRfc2l6ZSA9ICh0bS5tX2dyaWRfd2lkdGggPj0gKGJsb2NrX3dpZHRoIC0gMSkpICYmICh0bS5tX2dyaWRfaGVpZ2h0ID49IChibG9ja19oZWlnaHQgLSAxKSk7CgkJCQljb25zdCB1aW50MzJfdCBncmlkX2FuaXNvID0gY2FsY19ncmlkX2FuaXNvX3ZhbCh0bS5tX2dyaWRfd2lkdGgsIHRtLm1fZ3JpZF9oZWlnaHQsIGJsb2NrX3dpZHRoLCBibG9ja19oZWlnaHQpOwoKCQkJCWJhc2lzdTo6dWludF92ZWMmIHYgPSBtX3RtX2dyb3Vwc1tjZW1faW5kZXhdW3N1YnNldF9pbmRleF1bY2NzX2luZGV4XVtncmlkX3NpemVdW2dyaWRfYW5pc29dOwoJCQkJaWYgKCF2LmNhcGFjaXR5KCkpCgkJCQkJdi5yZXNlcnZlKDY0KTsKCgkJCQl2LnB1c2hfYmFjayh0bV9pbmRleCk7CgkJCX0KCgkJCXVpbnQzMl90IGNvdW50X3VzZWRfZ3JvdXBzKCkgY29uc3QKCQkJewoJCQkJdWludDMyX3QgbiA9IDA7CgoJCQkJZm9yICh1aW50MzJfdCBjZW1faXRlciA9IDA7IGNlbV9pdGVyIDwgT1RNX05VTV9DRU1TOyBjZW1faXRlcisrKQoJCQkJCWZvciAodWludDMyX3Qgc3Vic2V0c19pdGVyID0gMDsgc3Vic2V0c19pdGVyIDwgT1RNX05VTV9TVUJTRVRTOyBzdWJzZXRzX2l0ZXIrKykKCQkJCQkJZm9yICh1aW50MzJfdCBjY3NfaXRlciA9IDA7IGNjc19pdGVyIDwgT1RNX05VTV9DQ1M7IGNjc19pdGVyKyspCgkJCQkJCQlmb3IgKHVpbnQzMl90IGdyaWRfc2l6ZXNfaXRlciA9IDA7IGdyaWRfc2l6ZXNfaXRlciA8IE9UTV9OVU1fR1JJRF9TSVpFUzsgZ3JpZF9zaXplc19pdGVyKyspCgkJCQkJCQkJZm9yICh1aW50MzJfdCBncmlkX2FuaXNvc19pdGVyID0gMDsgZ3JpZF9hbmlzb3NfaXRlciA8IE9UTV9OVU1fR1JJRF9BTklTT1M7IGdyaWRfYW5pc29zX2l0ZXIrKykKCQkJCQkJCQl7CgkJCQkJCQkJCWlmIChtX3RtX2dyb3Vwc1tjZW1faXRlcl1bc3Vic2V0c19pdGVyXVtjY3NfaXRlcl1bZ3JpZF9zaXplc19pdGVyXVtncmlkX2FuaXNvc19pdGVyXS5zaXplKCkpCgkJCQkJCQkJCQluKys7CgkJCQkJCQkJfQoJCQkJcmV0dXJuIG47CgkJCX0KCQl9OwoKCQlleHRlcm4gZ3JvdXBlZF90cmlhbF9tb2RlcyBnX2dyb3VwZWRfZW5jb2Rlcl90cmlhbF9tb2Rlc1thc3RjX2hlbHBlcnM6OmNUT1RBTF9CTE9DS19TSVpFU107CgoJCWlubGluZSBjb25zdCBiYXNpc3U6OnVpbnRfdmVjJiBnZXRfdG1fY2FuZGlkYXRlcyhjb25zdCBncm91cGVkX3RyaWFsX21vZGVzJiBncm91cGVkX2VuY190cmlhbF9tb2RlcywKCQkJdWludDMyX3QgY2VtX2luZGV4LCB1aW50MzJfdCBzdWJzZXRfaW5kZXgsIHVpbnQzMl90IGNjc19pbmRleCwgdWludDMyX3QgZ3JpZF9zaXplLCB1aW50MzJfdCBncmlkX2FuaXNvKQoJCXsKCQkJYXNzZXJ0KGNlbV9pbmRleCA8IE9UTV9OVU1fQ0VNUyk7CgkJCWFzc2VydChzdWJzZXRfaW5kZXggPCBPVE1fTlVNX1NVQlNFVFMpOwoJCQlhc3NlcnQoY2NzX2luZGV4IDwgT1RNX05VTV9DQ1MpOwoJCQlhc3NlcnQoZ3JpZF9zaXplIDwgT1RNX05VTV9HUklEX1NJWkVTKTsKCQkJYXNzZXJ0KGdyaWRfYW5pc28gPCBPVE1fTlVNX0dSSURfQU5JU09TKTsKCgkJCWNvbnN0IGJhc2lzdTo6dWludF92ZWMmIG1vZGVzID0gZ3JvdXBlZF9lbmNfdHJpYWxfbW9kZXMubV90bV9ncm91cHNbY2VtX2luZGV4XVtzdWJzZXRfaW5kZXhdW2Njc19pbmRleF1bZ3JpZF9zaXplXVtncmlkX2FuaXNvXTsKCQkJcmV0dXJuIG1vZGVzOwoJCX0KCgkJY29uc3QgdWludDMyX3QgQ0ZHX1BBQ0tfR1JJRF9CSVRTID0gNzsKCQljb25zdCB1aW50MzJfdCBDRkdfUEFDS19DRU1fQklUUyA9IDM7CgkJY29uc3QgdWludDMyX3QgQ0ZHX1BBQ0tfQ0NTX0JJVFMgPSAzOwoJCWNvbnN0IHVpbnQzMl90IENGR19QQUNLX1NVQlNFVFNfQklUUyA9IDI7CgkJY29uc3QgdWludDMyX3QgQ0ZHX1BBQ0tfV0lTRV9CSVRTID0gNDsKCQljb25zdCB1aW50MzJfdCBDRkdfUEFDS19FSVNFX0JJVFMgPSA1OwoKCQlleHRlcm4gY29uc3QgaW50IHNfdW5pcXVlX2xkcl9pbmRleF90b19hc3RjX2NlbVs2XTsKCgkJZW51bSBjbGFzcyB4dWFzdGNfbW9kZQoJCXsKCQkJY01PREVfU09MSUQgPSAwLAoJCQljTU9ERV9SQVcgPSAxLAoKCQkJLy8gRnVsbCBjZmcsIHBhcnRpdGlvbiBJRCwgYW5kIGFsbCBlbmRwb2ludCB2YWx1ZSByZXVzZS4KCQkJY01PREVfUkVVU0VfQ0ZHX0VORFBPSU5UU19MRUZUID0gMiwKCQkJY01PREVfUkVVU0VfQ0ZHX0VORFBPSU5UU19VUCA9IDMsCgkJCWNNT0RFX1JFVVNFX0NGR19FTkRQT0lOVFNfRElBRyA9IDQsCgoJCQljTU9ERV9SVU4gPSA1LAoKCQkJY01PREVfVE9UQUwsCgkJfTsKCgkJZW51bSBjbGFzcyB4dWFzdGNfenN0ZF9tb2RlCgkJewoJCQkvLyBsZW49MSBiaXRzCgkJCWNNT0RFX1JBVyA9IDBiMCwKCgkJCS8vIGxlbj0yIGJpdHMKCQkJY01PREVfUlVOID0gMGIwMSwKCgkJCS8vIGxlbj00IGJpdHMKCQkJY01PREVfU09MSUQgPSAwYjAwMTEsCgkJCWNNT0RFX1JFVVNFX0NGR19FTkRQT0lOVFNfTEVGVCA9IDBiMDExMSwgCgkJCWNNT0RFX1JFVVNFX0NGR19FTkRQT0lOVFNfVVAgPSAwYjEwMTEsICAgCgkJCWNNT0RFX1JFVVNFX0NGR19FTkRQT0lOVFNfRElBRyA9IDBiMTExMSAgCgkJfTsKCgkJY29uc3QgdWludDMyX3QgWFVBU1RDX0xEUl9NT0RFX0JZVEVfSVNfQkFTRV9PRlNfRkxBRyA9IDEgPDwgMzsKCQljb25zdCB1aW50MzJfdCBYVUFTVENfTERSX01PREVfQllURV9QQVJUX0hBU0hfSElUID0gMSA8PCA0OwoJCWNvbnN0IHVpbnQzMl90IFhVQVNUQ19MRFJfTU9ERV9CWVRFX0RQQ01fRU5EUE9JTlRTX0ZMQUcgPSAxIDw8IDU7CgkJY29uc3QgdWludDMyX3QgWFVBU1RDX0xEUl9NT0RFX0JZVEVfVE1fSEFTSF9ISVRfRkxBRyA9IDEgPDwgNjsKCQljb25zdCB1aW50MzJfdCBYVUFTVENfTERSX01PREVfQllURV9VU0VfRENUID0gMSA8PCA3OwoKCQllbnVtIGNsYXNzIHh1YXN0Y19sZHJfc3ludGF4CgkJewoJCQljRnVsbEFyaXRoID0gMCwKCQkJY0h5YnJpZEFyaXRoWlN0ZCA9IDEsCgkJCWNGdWxsWlN0ZCA9IDIsCgoJCQljVG90YWwKCQl9OwoKCQl2b2lkIGNyZWF0ZV9lbmNvZGVyX3RyaWFsX21vZGVzX3RhYmxlKHVpbnQzMl90IGJsb2NrX3dpZHRoLCB1aW50MzJfdCBibG9ja19oZWlnaHQsCgkJCWJhc2lzdTo6dmVjdG9yPHRyaWFsX21vZGU+JiBlbmNvZGVyX3RyaWFsX21vZGVzLCBncm91cGVkX3RyaWFsX21vZGVzJiBncm91cGVkX2VuY29kZXJfdHJpYWxfbW9kZXMsCgkJCWJvb2wgcHJpbnRfZGVidWdfaW5mbywgYm9vbCBwcmludF9tb2Rlcyk7CgoJCWV4dGVybiBiYXNpc3U6OnZlY3Rvcjx0cmlhbF9tb2RlPiBnX2VuY29kZXJfdHJpYWxfbW9kZXNbYXN0Y19oZWxwZXJzOjpjVE9UQUxfQkxPQ0tfU0laRVNdOwoJCQkJCgkJaW5saW5lIHVpbnQzMl90IHBhcnRfaGFzaF9pbmRleCh1aW50MzJfdCB4KQoJCXsKCQkJLy8gZmliIGhhc2gKCQkJcmV0dXJuICh4ICogMjY1NDQzNTc2OXUpICYgKFBBUlRfSEFTSF9TSVpFIC0gMSk7CgkJfQoKCQkvLyBGdWxsIFpTdGQgc3ludGF4IG9ubHkKCQlpbmxpbmUgdWludDMyX3QgdG1faGFzaF9pbmRleCh1aW50MzJfdCB4KQoJCXsKCQkJLy8gZmliIGhhc2gKCQkJcmV0dXJuICh4ICogMjY1NDQzNTc2OXUpICYgKFRNX0hBU0hfU0laRSAtIDEpOwoJCX0KCgkJLy8gVE9ETzogU29tZSBmaWVsZHMgYXJlIHVudXNlZCBkdXJpbmcgdHJhbnNjb2RpbmcuCgkJc3RydWN0IHByZXZfYmxvY2tfc3RhdGUKCQl7CgkJCWJvb2wgbV93YXNfc29saWRfY29sb3I7CgkJCWJvb2wgbV91c2VkX3dlaWdodF9kY3Q7CgkJCWJvb2wgbV9maXJzdF9lbmRwb2ludF91c2VzX2JjOwoJCQlib29sIG1fcmV1c2VkX2Z1bGxfY2ZnOwoJCQlib29sIG1fdXNlZF9wYXJ0X2hhc2g7CgoJCQlpbnQgbV90bV9pbmRleDsgLy8gLTEgaWYgaW52YWxpZCAoc29saWQgY29sb3IgYmxvY2spCgkJCXVpbnQzMl90IG1fYmFzZV9jZW1faW5kZXg7IC8vIGRvZXNuJ3QgaW5jbHVkZSBiYXNlK29mcwoJCQl1aW50MzJfdCBtX3N1YnNldF9pbmRleCwgbV9jY3NfaW5kZXgsIG1fZ3JpZF9zaXplLCBtX2dyaWRfYW5pc287CgoJCQlwcmV2X2Jsb2NrX3N0YXRlKCkKCQkJewoJCQkJY2xlYXIoKTsKCQkJfQoKCQkJdm9pZCBjbGVhcigpCgkJCXsKCQkJCWJhc2lzdTo6Y2xlYXJfb2JqKCp0aGlzKTsKCQkJfQoJCX07CgoJCXN0cnVjdCBwcmV2X2Jsb2NrX3N0YXRlX2Z1bGxfenN0ZAoJCXsKCQkJaW50IG1fdG1faW5kZXg7IC8vIC0xIGlmIGludmFsaWQgKHNvbGlkIGNvbG9yIGJsb2NrKQoJCQkKCQkJYm9vbCB3YXNfc29saWRfY29sb3IoKSBjb25zdCB7IHJldHVybiBtX3RtX2luZGV4IDwgMDsgfQoKCQkJcHJldl9ibG9ja19zdGF0ZV9mdWxsX3pzdGQoKQoJCQl7CgkJCQljbGVhcigpOwoJCQl9CgoJCQl2b2lkIGNsZWFyKCkKCQkJewoJCQkJYmFzaXN1OjpjbGVhcl9vYmooKnRoaXMpOwoJCQl9CgkJfTsKCgkJaW5saW5lIHVpbnQzMl90IGNlbV90b19sZHJjZW1faW5kZXgodWludDMyX3QgY2VtKQoJCXsKCQkJc3dpdGNoIChjZW0pCgkJCXsKCQkJY2FzZSBhc3RjX2hlbHBlcnM6OkNFTV9MRFJfTFVNX0RJUkVDVDogcmV0dXJuIDA7CgkJCWNhc2UgYXN0Y19oZWxwZXJzOjpDRU1fTERSX0xVTV9BTFBIQV9ESVJFQ1Q6IHJldHVybiAxOwoJCQljYXNlIGFzdGNfaGVscGVyczo6Q0VNX0xEUl9SR0JfQkFTRV9TQ0FMRTogcmV0dXJuIDI7CgkJCWNhc2UgYXN0Y19oZWxwZXJzOjpDRU1fTERSX1JHQl9ESVJFQ1Q6IHJldHVybiAzOwoJCQljYXNlIGFzdGNfaGVscGVyczo6Q0VNX0xEUl9SR0JfQkFTRV9QTFVTX09GRlNFVDogcmV0dXJuIDQ7CgkJCWNhc2UgYXN0Y19oZWxwZXJzOjpDRU1fTERSX1JHQl9CQVNFX1NDQUxFX1BMVVNfVFdPX0E6IHJldHVybiA1OwoJCQljYXNlIGFzdGNfaGVscGVyczo6Q0VNX0xEUl9SR0JBX0RJUkVDVDogcmV0dXJuIDY7CgkJCWNhc2UgYXN0Y19oZWxwZXJzOjpDRU1fTERSX1JHQkFfQkFTRV9QTFVTX09GRlNFVDogcmV0dXJuIDc7CgkJCWRlZmF1bHQ6CgkJCQlhc3NlcnQoMCk7CgkJCQlicmVhazsKCQkJfQoKCQkJcmV0dXJuIDA7CgkJfQoKCQlib29sIHJlcXVhbnRpemVfaXNlX2VuZHBvaW50cyh1aW50MzJfdCBjZW0sCgkJCXVpbnQzMl90IHNyY19pc2VfZW5kcG9pbnRfcmFuZ2UsIGNvbnN0IHVpbnQ4X3QqIHBTcmNfZW5kcG9pbnRzLAoJCQl1aW50MzJfdCBkc3RfaXNlX2VuZHBvaW50X3JhbmdlLCB1aW50OF90KiBwRHN0X2VuZHBvaW50cyk7CgkJCQkKCQlib29sIHBhY2tfYmFzZV9vZmZzZXQoCgkJCXVpbnQzMl90IGNlbV9pbmRleCwgdWludDMyX3QgZHN0X2lzZV9lbmRwb2ludF9yYW5nZSwgdWludDhfdCogcFBhY2tlZF9lbmRwb2ludHMsCgkJCWNvbnN0IGNvbG9yX3JnYmEmIGwsIGNvbnN0IGNvbG9yX3JnYmEmIGgsCgkJCWJvb2wgdXNlX2JsdWVfY29udHJhY3Rpb24sIGJvb2wgYXV0b19kaXNhYmxlX2JsdWVfY29udHJhY3Rpb25faWZfY2xhbXBlZCwKCQkJYm9vbCYgYmx1ZV9jb250cmFjdGlvbl9jbGFtcGVkX2ZsYWcsIGJvb2wmIGJhc2Vfb2ZzX2NsYW1wZWRfZmxhZywgYm9vbCYgZW5kcG9pbnRzX3N3YXBwZWQpOwoKCQlib29sIGNvbnZlcnRfZW5kcG9pbnRzX2Fjcm9zc19jZW1zKAoJCQl1aW50MzJfdCBwcmV2X2NlbSwgdWludDMyX3QgcHJldl9lbmRwb2ludF9pc2VfcmFuZ2UsIGNvbnN0IHVpbnQ4X3QqIHBQcmV2X2VuZHBvaW50cywKCQkJdWludDMyX3QgZHN0X2NlbSwgdWludDMyX3QgZHN0X2VuZHBvaW50X2lzZV9yYW5nZSwgdWludDhfdCogcERzdF9lbmRwb2ludHMsCgkJCWJvb2wgYWx3YXlzX3JlcGFjaywKCQkJYm9vbCB1c2VfYmx1ZV9jb250cmFjdGlvbiwgYm9vbCBhdXRvX2Rpc2FibGVfYmx1ZV9jb250cmFjdGlvbl9pZl9jbGFtcGVkLAoJCQlib29sJiBibHVlX2NvbnRyYWN0aW9uX2NsYW1wZWRfZmxhZywgYm9vbCYgYmFzZV9vZnNfY2xhbXBlZF9mbGFnKTsKCgkJdWludDMyX3QgZ2V0X3RvdGFsX3VuaXF1ZV9wYXR0ZXJucyh1aW50MzJfdCBhc3RjX2Jsb2NrX3NpemVfaW5kZXgsIHVpbnQzMl90IG51bV9wYXJ0cyk7CgkJLy91aW50MTZfdCB1bmlxdWVfcGF0X2luZGV4X3RvX3BhcnRfc2VlZCh1aW50MzJfdCBhc3RjX2Jsb2NrX3NpemVfaW5kZXgsIHVpbnQzMl90IG51bV9wYXJ0cywgdWludDMyX3QgdW5pcXVlX3BhdF9pbmRleCk7CgoJCXR5cGVkZWYgYm9vbCAoKnh1YXN0Y19kZWNvbXBfaW1hZ2VfaW5pdF9jYWxsYmFja19wdHIpKHVpbnQzMl90IG51bV9ibG9ja3NfeCwgdWludDMyX3QgbnVtX2Jsb2Nrc195LCB1aW50MzJfdCBibG9ja193aWR0aCwgdWludDMyX3QgYmxvY2tfaGVpZ2h0LCBib29sIHNyZ2JfZGVjb2RlX3Byb2ZpbGUsIGZsb2F0IGRjdF9xLCBib29sIGhhc19hbHBoYSwgdm9pZCogcERhdGEpOwoJCXR5cGVkZWYgYm9vbCAoKnh1YXN0Y19kZWNvbXBfaW1hZ2VfYmxvY2tfY2FsbGJhY2tfcHRyKSh1aW50MzJfdCBieCwgdWludDMyX3QgYnksIGNvbnN0IGFzdGNfaGVscGVyczo6bG9nX2FzdGNfYmxvY2smIGxvZ19ibGssIHZvaWQqIHBEYXRhKTsKCQkJCQoJCWJvb2wgeHVhc3RjX2xkcl9kZWNvbXByZXNzX2ltYWdlKAoJCQljb25zdCB1aW50OF90KiBwQ29tcF9kYXRhLCBzaXplX3QgY29tcF9kYXRhX3NpemUsCgkJCXVpbnQzMl90JiBhc3RjX2Jsb2NrX3dpZHRoLCB1aW50MzJfdCYgYXN0Y19ibG9ja19oZWlnaHQsCgkJCXVpbnQzMl90JiBhY3R1YWxfd2lkdGgsIHVpbnQzMl90JiBhY3R1YWxfaGVpZ2h0LCBib29sJiBoYXNfYWxwaGEsIGJvb2wmIHVzZXNfc3JnYl9hc3RjX2RlY29kZV9tb2RlLAoJCQlib29sIGRlYnVnX291dHB1dCwKCQkJeHVhc3RjX2RlY29tcF9pbWFnZV9pbml0X2NhbGxiYWNrX3B0ciBwSW5pdF9jYWxsYmFjaywgdm9pZCAqcEluaXRfY2FsbGJhY2tfZGF0YSwKCQkJeHVhc3RjX2RlY29tcF9pbWFnZV9ibG9ja19jYWxsYmFja19wdHIgcEJsb2NrX2NhbGxiYWNrLCB2b2lkICpwQmxvY2tfY2FsbGJhY2tfZGF0YSk7CgkJCgl9IC8vIG5hbWVzcGFjZSBhc3RjX2xkcl90CgoJbmFtZXNwYWNlIGFyaXRoX2Zhc3RiaXRzX2YzMgoJewoJCWVudW0geyBUQUJMRV9CSVRTID0gOCB9OyAgICAgICAgICAgICAgIC8vIDI1Ni4uMTAyNCBlbnRyaWVzIHR5cGljYWwgKDguLjEwKQoJCWVudW0geyBUQUJMRV9TSVpFID0gMSA8PCBUQUJMRV9CSVRTIH07CgkJZW51bSB7IE1BTlRfQklUUyA9IDIzIH07CgkJZW51bSB7IEZSQUNfQklUUyA9IE1BTlRfQklUUyAtIFRBQkxFX0JJVFMgfTsKCQllbnVtIHsgRlJBQ19NQVNLID0gKDF1IDw8IEZSQUNfQklUUykgLSAxdSB9OwoKCQlleHRlcm4gYm9vbCBnX2luaXRpYWxpemVkOwoJCWV4dGVybiBmbG9hdCBnX2x1dF9lZGdlW1RBQkxFX1NJWkUgKyAxXTsgLy8gc2FtcGxlcyBhdCBtID0gMSArIGkvVEFCTEVfU0laRSAoZm9yIGxpbmVhcikKCgkJaW5saW5lIHZvaWQgaW5pdCgpCgkJewoJCQlpZiAoZ19pbml0aWFsaXplZCkKCQkJCXJldHVybjsKCgkJCWNvbnN0IGZsb2F0IGludl9sbjIgPSAxLjQ0MjY5NTA0MDg4ODk2MzRmOyAvLyAxL2xuKDIpCgoJCQlmb3IgKGludCBpID0gMDsgaSA8PSBUQUJMRV9TSVpFOyArK2kpCgkJCXsKCQkJCWZsb2F0IG0gPSAxLjBmICsgZmxvYXQoaSkgLyBmbG9hdChUQUJMRV9TSVpFKTsgICAgICAvLyBtIGluIFsxLDJdCgkJCQlnX2x1dF9lZGdlW2ldID0gbG9nZihtKSAqIGludl9sbjI7ICAgICAgICAgICAgIC8vIGxvZzIobSkKCQkJfQoKCQkJZ19pbml0aWFsaXplZCA9IHRydWU7CgkJfQoKCQlpbmxpbmUgdm9pZCB1bnBhY2soZmxvYXQgcCwgaW50JiBlX3VuYmlhc2VkLCB1aW50MzJfdCYgbWFudCkKCQl7CgkJCS8vIGtpbGwgYW55IGRlbm9ybXMKCQkJaWYgKHAgPCBGTFRfTUlOKQoJCQkJcCA9IDA7CgoJCQl1bmlvbiB7IGZsb2F0IGY7IHVpbnQzMl90IHU7IH0geDsKCQkJeC5mID0gcDsKCQkJZV91bmJpYXNlZCA9IGludCgoeC51ID4+IDIzKSAmIDB4RkYpIC0gMTI3OwoJCQltYW50ID0gKHgudSAmIDB4N0ZGRkZGdSk7IC8vIDIzLWJpdCBtYW50aXNzYQoJCX0KCgkJLy8gUmV0dXJucyBlc3RpbWF0ZWQgYml0cyBnaXZlbiBwcm9iYWJpbGl0eSBwLCBhcHByb3hpbWF0ZXMgLWxvZzJmKHApLgoJCWlubGluZSBmbG9hdCBiaXRzX2Zyb21fcHJvYl9saW5lYXIoZmxvYXQgcCkKCQl7CgkJCWFzc2VydCgocCA+IDAuMGYpICYmIChwIDw9IDEuMGYpKTsKCQkJaWYgKCFnX2luaXRpYWxpemVkKQoJCQkJaW5pdCgpOwoKCQkJaW50IGU7IHVpbnQzMl90IG1hbnQ7CgkJCXVucGFjayhwLCBlLCBtYW50KTsKCgkJCXVpbnQzMl90IGlkeCA9IG1hbnQgPj4gRlJBQ19CSVRTOyAgICAgICAgICAgIC8vIDAuLlRBQkxFX1NJWkUtMQoJCQl1aW50MzJfdCBmcmFjID0gbWFudCAmIEZSQUNfTUFTSzsgICAgICAgICAgICAgLy8gbG93IEZSQUNfQklUUwoJCQljb25zdCBmbG9hdCBpbnZfc2NhbGUgPSAxLjBmIC8gZmxvYXQoMXUgPDwgRlJBQ19CSVRTKTsKCQkJZmxvYXQgdCA9IGZsb2F0KGZyYWMpICogaW52X3NjYWxlOyAgICAgICAgICAgICAgICAgLy8gWzAsMSkKCgkJCWZsb2F0IHkwID0gZ19sdXRfZWRnZVtpZHhdOwoJCQlmbG9hdCB5MSA9IGdfbHV0X2VkZ2VbaWR4ICsgMV07CgkJCWZsb2F0IGxvZzJtID0geTAgKyB0ICogKHkxIC0geTApOwoKCQkJcmV0dXJuIC0oZmxvYXQoZSkgKyBsb2cybSk7CgkJfQoKCX0gLy8gbmFtZXNwYWNlIGFyaXRoX2Zhc3RiaXRzX2YzMgoKCW5hbWVzcGFjZSBhcml0aAoJewoJCS8vIEEgc2ltcGxlIHJhbmdlIGNvZGVyCgkJY29uc3QgdWludDMyX3QgQXJpdGhNYXhTeW1zID0gMjA0ODsKCQljb25zdCB1aW50MzJfdCBETUxlblNoaWZ0ID0gMTV1OwoJCWNvbnN0IHVpbnQzMl90IERNTWF4Q291bnQgPSAxdSA8PCBETUxlblNoaWZ0OwoJCWNvbnN0IHVpbnQzMl90IEJNTGVuU2hpZnQgPSAxM3U7CgkJY29uc3QgdWludDMyX3QgQk1NYXhDb3VudCA9IDF1IDw8IEJNTGVuU2hpZnQ7CgkJY29uc3QgdWludDMyX3QgQXJpdGhNaW5MZW4gPSAxdSA8PCAyNHU7CgkJY29uc3QgdWludDMyX3QgQXJpdGhNYXhMZW4gPSBVSU5UMzJfTUFYOwoJCWNvbnN0IHVpbnQzMl90IEFyaXRoTWluRXhwZWN0ZWREYXRhQnVmU2l6ZSA9IDU7CgoJCWNsYXNzIGFyaXRoX2JpdF9tb2RlbAoJCXsKCQlwdWJsaWM6CgkJCWFyaXRoX2JpdF9tb2RlbCgpCgkJCXsKCQkJCXJlc2V0KCk7CgkJCX0KCgkJCXZvaWQgaW5pdCgpCgkJCXsKCQkJCXJlc2V0KCk7CgkJCX0KCgkJCXZvaWQgcmVzZXQoKQoJCQl7CgkJCQltX2JpdDBfY291bnQgPSAxOwoJCQkJbV9iaXRfY291bnQgPSAyOwoJCQkJbV9iaXQwX3Byb2IgPSAxVSA8PCAoQk1MZW5TaGlmdCAtIDEpOwoJCQkJbV91cGRhdGVfaW50ZXJ2YWwgPSA0OwoJCQkJbV9iaXRzX3VudGlsX3VwZGF0ZSA9IDQ7CgkJCX0KCgkJCWZsb2F0IGdldF9wcmljZShib29sIGJpdCkgY29uc3QKCQkJewoJCQkJY29uc3QgZmxvYXQgcHJvYl8wID0gKGZsb2F0KW1fYml0MF9wcm9iIC8gKGZsb2F0KUJNTWF4Q291bnQ7CgkJCQljb25zdCBmbG9hdCBwcm9iID0gYml0ID8gKDEuMGYgLSBwcm9iXzApIDogcHJvYl8wOwoJCQkJY29uc3QgZmxvYXQgYml0cyA9IGFyaXRoX2Zhc3RiaXRzX2YzMjo6Yml0c19mcm9tX3Byb2JfbGluZWFyKHByb2IpOwoJCQkJYXNzZXJ0KGZhYnMoYml0cyAtICgtbG9nMmYocHJvYikpKSA8IC4wMDEyNWYpOyAvLyBiYXNpYyBzYW5pdHkgY2hlY2sKCQkJCXJldHVybiBiaXRzOwoJCQl9CgoJCQl2b2lkIHVwZGF0ZSgpCgkJCXsKCQkJCWFzc2VydChtX2JpdF9jb3VudCA+PSAyKTsKCQkJCWFzc2VydChtX2JpdDBfY291bnQgPCBtX2JpdF9jb3VudCk7CgoJCQkJaWYgKG1fYml0X2NvdW50ID49IEJNTWF4Q291bnQpCgkJCQl7CgkJCQkJYXNzZXJ0KG1fYml0X2NvdW50ICYmIG1fYml0MF9jb3VudCk7CgoJCQkJCW1fYml0X2NvdW50ID0gKG1fYml0X2NvdW50ICsgMSkgPj4gMTsKCQkJCQltX2JpdDBfY291bnQgPSAobV9iaXQwX2NvdW50ICsgMSkgPj4gMTsKCgkJCQkJaWYgKG1fYml0MF9jb3VudCA9PSBtX2JpdF9jb3VudCkKCQkJCQkJKyttX2JpdF9jb3VudDsKCgkJCQkJYXNzZXJ0KG1fYml0MF9jb3VudCA8IG1fYml0X2NvdW50KTsKCQkJCX0KCgkJCQljb25zdCB1aW50MzJfdCBzY2FsZSA9IDB4ODAwMDAwMDBVIC8gbV9iaXRfY291bnQ7CgkJCQltX2JpdDBfcHJvYiA9IChtX2JpdDBfY291bnQgKiBzY2FsZSkgPj4gKDMxIC0gQk1MZW5TaGlmdCk7CgoJCQkJbV91cGRhdGVfaW50ZXJ2YWwgPSBiYXNpc3U6OmNsYW1wPHVpbnQzMl90PigoNSAqIG1fdXBkYXRlX2ludGVydmFsKSA+PiAyLCA0dSwgMTI4KTsKCgkJCQltX2JpdHNfdW50aWxfdXBkYXRlID0gbV91cGRhdGVfaW50ZXJ2YWw7CgkJCX0KCgkJCXZvaWQgcHJpbnRfcHJpY2VzKGNvbnN0IGNoYXIqIHBEZXNjKQoJCQl7CgkJCQlpZiAocERlc2MpCgkJCQkJcHJpbnRmKCJhcml0aF9kYXRhX21vZGVsIGJpdCBwcmljZXMgZm9yIG1vZGVsICVzOlxuIiwgcERlc2MpOwoJCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDI7IGkrKykKCQkJCQlwcmludGYoIiV1OiAlMy4zZiBiaXRzXG4iLCBpLCBnZXRfcHJpY2UoaSkpOwoJCQkJcHJpbnRmKCJcbiIpOwoJCQl9CgoJCXByaXZhdGU6CgkJCWZyaWVuZCBjbGFzcyBhcml0aF9lbmM7CgkJCWZyaWVuZCBjbGFzcyBhcml0aF9kZWM7CgoJCQl1aW50MzJfdCBtX2JpdDBfcHJvYjsJLy8gc25hcHNob3QgbWFkZSBhdCBsYXN0IHVwZGF0ZQoKCQkJdWludDMyX3QgbV9iaXQwX2NvdW50OwkvLyBsaXZlCgkJCXVpbnQzMl90IG1fYml0X2NvdW50OwkvLyBsaXZlCgoJCQlpbnQgbV9iaXRzX3VudGlsX3VwZGF0ZTsKCQkJdWludDMyX3QgbV91cGRhdGVfaW50ZXJ2YWw7CgkJfTsKCgkJZW51bSB7IGNBUklUSF9HQU1NQV9NQVhfVEFJTF9DVFggPSA0LCBjQVJJVEhfR0FNTUFfTUFYX1BSRUZJWF9DVFggPSAzIH07CgkJc3RydWN0IGFyaXRoX2dhbW1hX2NvbnRleHRzCgkJewoJCQlhcml0aF9iaXRfbW9kZWwgbV9jdHhfcHJlZml4W2NBUklUSF9HQU1NQV9NQVhfUFJFRklYX0NUWF07IC8vIGZvciB1bmFyeSBjb250aW51ZSBwcmVmaXgKCQkJYXJpdGhfYml0X21vZGVsIG1fY3R4X3RhaWxbY0FSSVRIX0dBTU1BX01BWF9UQUlMX0NUWF07ICAgICAvLyBmb3IgYmluYXJ5IHN1ZmZpeCBiaXRzCgkJfTsKCgkJY2xhc3MgYXJpdGhfZGF0YV9tb2RlbAoJCXsKCQlwdWJsaWM6CgkJCWFyaXRoX2RhdGFfbW9kZWwoKSA6CgkJCQltX251bV9kYXRhX3N5bXMoMCksCgkJCQltX3RvdGFsX3N5bV9mcmVxKDApLAoJCQkJbV91cGRhdGVfaW50ZXJ2YWwoMCksCgkJCQltX251bV9zeW1zX3VudGlsX25leHRfdXBkYXRlKDApCgkJCXsKCQkJfQoKCQkJYXJpdGhfZGF0YV9tb2RlbCh1aW50MzJfdCBudW1fc3ltcywgYm9vbCBmYXN0ZXJfdXBkYXRlID0gZmFsc2UpIDoKCQkJCW1fbnVtX2RhdGFfc3ltcygwKSwKCQkJCW1fdG90YWxfc3ltX2ZyZXEoMCksCgkJCQltX3VwZGF0ZV9pbnRlcnZhbCgwKSwKCQkJCW1fbnVtX3N5bXNfdW50aWxfbmV4dF91cGRhdGUoMCkKCQkJewoJCQkJaW5pdChudW1fc3ltcywgZmFzdGVyX3VwZGF0ZSk7CgkJCX0KCgkJCXZvaWQgY2xlYXIoKQoJCQl7CgkJCQltX2N1bV9zeW1fZnJlcXMuY2xlYXIoKTsKCQkJCW1fc3ltX2ZyZXFzLmNsZWFyKCk7CgoJCQkJbV9udW1fZGF0YV9zeW1zID0gMDsKCQkJCW1fdG90YWxfc3ltX2ZyZXEgPSAwOwoJCQkJbV91cGRhdGVfaW50ZXJ2YWwgPSAwOwoJCQkJbV9udW1fc3ltc191bnRpbF9uZXh0X3VwZGF0ZSA9IDA7CgkJCX0KCgkJCXZvaWQgaW5pdCh1aW50MzJfdCBudW1fc3ltcywgYm9vbCBmYXN0ZXJfdXBkYXRlID0gZmFsc2UpCgkJCXsKCQkJCWFzc2VydCgobnVtX3N5bXMgPj0gMikgJiYgKG51bV9zeW1zIDw9IEFyaXRoTWF4U3ltcykpOwoKCQkJCW1fbnVtX2RhdGFfc3ltcyA9IG51bV9zeW1zOwoKCQkJCW1fc3ltX2ZyZXFzLnJlc2l6ZShudW1fc3ltcyk7CgkJCQltX2N1bV9zeW1fZnJlcXMucmVzaXplKG51bV9zeW1zICsgMSk7CgoJCQkJcmVzZXQoZmFzdGVyX3VwZGF0ZSk7CgkJCX0KCgkJCXZvaWQgcmVzZXQoYm9vbCBmYXN0ZXJfdXBkYXRlID0gZmFsc2UpCgkJCXsKCQkJCWlmICghbV9udW1fZGF0YV9zeW1zKQoJCQkJCXJldHVybjsKCgkJCQltX3N5bV9mcmVxcy5zZXRfYWxsKDEpOwoJCQkJbV90b3RhbF9zeW1fZnJlcSA9IG1fbnVtX2RhdGFfc3ltczsKCgkJCQltX3VwZGF0ZV9pbnRlcnZhbCA9IG1fbnVtX2RhdGFfc3ltczsKCQkJCW1fbnVtX3N5bXNfdW50aWxfbmV4dF91cGRhdGUgPSAwOwoKCQkJCXVwZGF0ZShmYWxzZSk7CgoJCQkJaWYgKGZhc3Rlcl91cGRhdGUpCgkJCQl7CgkJCQkJbV91cGRhdGVfaW50ZXJ2YWwgPSBiYXNpc3U6OmNsYW1wPHVpbnQzMl90PigobV9udW1fZGF0YV9zeW1zICsgNykgLyA4LCA0dSwgKG1fbnVtX2RhdGFfc3ltcyArIDYpIDw8IDMpOwoJCQkJCW1fbnVtX3N5bXNfdW50aWxfbmV4dF91cGRhdGUgPSBtX3VwZGF0ZV9pbnRlcnZhbDsKCQkJCX0KCQkJfQoKCQkJdm9pZCB1cGRhdGUoYm9vbCBlbmNfZmxhZykKCQkJewoJCQkJYXNzZXJ0KG1fbnVtX2RhdGFfc3ltcyk7CgkJCQlCQVNJU1VfTk9URV9VTlVTRUQoZW5jX2ZsYWcpOwoKCQkJCWlmICghbV9udW1fZGF0YV9zeW1zKQoJCQkJCXJldHVybjsKCgkJCQl3aGlsZSAobV90b3RhbF9zeW1fZnJlcSA+PSBETU1heENvdW50KQoJCQkJewoJCQkJCW1fdG90YWxfc3ltX2ZyZXEgPSAwOwoKCQkJCQlmb3IgKHVpbnQzMl90IG4gPSAwOyBuIDwgbV9udW1fZGF0YV9zeW1zOyBuKyspCgkJCQkJewoJCQkJCQltX3N5bV9mcmVxc1tuXSA9IChtX3N5bV9mcmVxc1tuXSArIDF1KSA+PiAxdTsKCQkJCQkJbV90b3RhbF9zeW1fZnJlcSArPSBtX3N5bV9mcmVxc1tuXTsKCQkJCQl9CgkJCQl9CgoJCQkJY29uc3QgdWludDMyX3Qgc2NhbGUgPSAweDgwMDAwMDAwVSAvIG1fdG90YWxfc3ltX2ZyZXE7CgoJCQkJdWludDMyX3Qgc3VtID0gMDsKCQkJCWZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX251bV9kYXRhX3N5bXM7ICsraSkKCQkJCXsKCQkJCQlhc3NlcnQoKCh1aW50NjRfdClzY2FsZSAqIHN1bSkgPD0gVUlOVDMyX01BWCk7CgkJCQkJbV9jdW1fc3ltX2ZyZXFzW2ldID0gKHNjYWxlICogc3VtKSA+PiAoMzEgLSBETUxlblNoaWZ0KTsKCQkJCQlzdW0gKz0gbV9zeW1fZnJlcXNbaV07CgkJCQl9CgkJCQlhc3NlcnQoc3VtID09IG1fdG90YWxfc3ltX2ZyZXEpOwoKCQkJCW1fY3VtX3N5bV9mcmVxc1ttX251bV9kYXRhX3N5bXNdID0gRE1NYXhDb3VudDsKCgkJCQltX3VwZGF0ZV9pbnRlcnZhbCA9IGJhc2lzdTo6Y2xhbXA8dWludDMyX3Q+KCg1ICogbV91cGRhdGVfaW50ZXJ2YWwpID4+IDIsIDR1LCAobV9udW1fZGF0YV9zeW1zICsgNikgPDwgMyk7CgoJCQkJbV9udW1fc3ltc191bnRpbF9uZXh0X3VwZGF0ZSA9IG1fdXBkYXRlX2ludGVydmFsOwoJCQl9CgoJCQlmbG9hdCBnZXRfcHJpY2UodWludDMyX3Qgc3ltX2luZGV4KSBjb25zdAoJCQl7CgkJCQlhc3NlcnQoc3ltX2luZGV4IDwgbV9udW1fZGF0YV9zeW1zKTsKCgkJCQlpZiAoc3ltX2luZGV4ID49IG1fbnVtX2RhdGFfc3ltcykKCQkJCQlyZXR1cm4gMC4wZjsKCgkJCQljb25zdCBmbG9hdCBwcm9iID0gKGZsb2F0KShtX2N1bV9zeW1fZnJlcXNbc3ltX2luZGV4ICsgMV0gLSBtX2N1bV9zeW1fZnJlcXNbc3ltX2luZGV4XSkgLyAoZmxvYXQpRE1NYXhDb3VudDsKCgkJCQljb25zdCBmbG9hdCBiaXRzID0gYXJpdGhfZmFzdGJpdHNfZjMyOjpiaXRzX2Zyb21fcHJvYl9saW5lYXIocHJvYik7CgkJCQlhc3NlcnQoZmFicyhiaXRzIC0gKC1sb2cyZihwcm9iKSkpIDwgLjAwMTI1Zik7IC8vIGJhc2ljIHNhbml0eSBjaGVjawoJCQkJcmV0dXJuIGJpdHM7CgkJCX0KCgkJCXZvaWQgcHJpbnRfcHJpY2VzKGNvbnN0IGNoYXIqIHBEZXNjKQoJCQl7CgkJCQlpZiAocERlc2MpCgkJCQkJcHJpbnRmKCJhcml0aF9kYXRhX21vZGVsIGJpdCBwcmljZXMgZm9yIG1vZGVsICVzOlxuIiwgcERlc2MpOwoJCQkJZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fbnVtX2RhdGFfc3ltczsgaSsrKQoJCQkJCXByaW50ZigiJXU6ICUzLjNmIGJpdHNcbiIsIGksIGdldF9wcmljZShpKSk7CgkJCQlwcmludGYoIlxuIik7CgkJCX0KCgkJCXVpbnQzMl90IGdldF9udW1fZGF0YV9zeW1zKCkgY29uc3QgeyByZXR1cm4gbV9udW1fZGF0YV9zeW1zOyB9CgoJCXByaXZhdGU6CgkJCWZyaWVuZCBjbGFzcyBhcml0aF9lbmM7CgkJCWZyaWVuZCBjbGFzcyBhcml0aF9kZWM7CgoJCQl1aW50MzJfdCBtX251bV9kYXRhX3N5bXM7CgoJCQliYXNpc3U6OnVpbnRfdmVjIG1fc3ltX2ZyZXFzOwkJLy8gbGl2ZSBoaXN0b2dyYW0KCQkJdWludDMyX3QgbV90b3RhbF9zeW1fZnJlcTsgLy8gYWx3YXlzIGxpdmUgdnMuIG1fc3ltX2ZyZXFzCgoJCQliYXNpc3U6OnVpbnRfdmVjIG1fY3VtX3N5bV9mcmVxczsgLy8gaGFzIDEgZXh0cmEgZW50cnksIHNuYXBzaG90IGZyb20gbGFzdCB1cGRhdGUKCgkJCXVpbnQzMl90IG1fdXBkYXRlX2ludGVydmFsOwoJCQlpbnQgbV9udW1fc3ltc191bnRpbF9uZXh0X3VwZGF0ZTsKCgkJCXVpbnQzMl90IGdldF9sYXN0X3N5bV9pbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fbnVtX2RhdGFfc3ltcyAtIDE7IH0KCQl9OwoKCQljbGFzcyBhcml0aF9lbmMKCQl7CgkJcHVibGljOgoJCQlhcml0aF9lbmMoKQoJCQl7CgkJCQljbGVhcigpOwoJCQl9CgoJCQl2b2lkIGNsZWFyKCkKCQkJewoJCQkJbV9kYXRhX2J1Zi5jbGVhcigpOwoKCQkJCW1fYmFzZSA9IDA7CgkJCQltX2xlbmd0aCA9IEFyaXRoTWF4TGVuOwoJCQl9CgoJCQl2b2lkIGluaXQoc2l6ZV90IHJlc2VydmVfc2l6ZSkKCQkJewoJCQkJbV9kYXRhX2J1Zi5yZXNlcnZlKHJlc2VydmVfc2l6ZSk7CgkJCQltX2RhdGFfYnVmLnJlc2l6ZSgwKTsKCgkJCQltX2Jhc2UgPSAwOwoJCQkJbV9sZW5ndGggPSBBcml0aE1heExlbjsKCgkJCQkvLyBQbGFjZSA4LWJpdCBtYXJrZXIgYXQgYmVnaW5uaW5nLiAKCQkJCS8vIFRoaXMgdmlydHVhbGx5IGFsd2F5cyBndWFyYW50ZWVzIG5vIGJhY2t3YXJkcyBjYXJyaWVzIGNhbiBiZSBsb3N0IGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtLiAoU2hvdWxkIGJlIGltcG9zc2libGUgd2l0aCB0aGlzIGRlc2lnbi4pCgkJCQkvLyBJdCBhbHdheXMgcHVzaGVzIG91dCAxIDAgYnl0ZSBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgdG8gYWJzb3JiIGZ1dHVyZSBjYXJyaWVzLgoJCQkJLy8gQ2FsbGVyIGRvZXMgdGhpcyBub3csIHdlIHNlbmQgYSB0aW55IGhlYWRlciBhbnl3YXkKCQkJCS8vcHV0X2JpdHMoMHgxLCA4KTsKCQkJCS8vYXNzZXJ0KG1fZGF0YV9idWZbMF0gIT0gMHhGRik7CgkJCX0KCgkJCXZvaWQgcHV0X2JpdCh1aW50MzJfdCBiaXQpCgkJCXsKCQkJCW1fbGVuZ3RoID4+PSAxOwoKCQkJCWlmIChiaXQpCgkJCQl7CgkJCQkJY29uc3QgdWludDMyX3Qgb3JpZ19iYXNlID0gbV9iYXNlOwoKCQkJCQltX2Jhc2UgKz0gbV9sZW5ndGg7CgoJCQkJCWlmIChvcmlnX2Jhc2UgPiBtX2Jhc2UpCgkJCQkJCXByb3BfY2FycnkoKTsKCQkJCX0KCgkJCQlpZiAobV9sZW5ndGggPCBBcml0aE1pbkxlbikKCQkJCQlyZW5vcm0oKTsKCQkJfQoKCQkJZW51bSB7IGNNYXhQdXRCaXRzTGVuID0gMjAgfTsKCQkJdm9pZCBwdXRfYml0cyh1aW50MzJfdCB2YWwsIHVpbnQzMl90IG51bV9iaXRzKQoJCQl7CgkJCQlhc3NlcnQobnVtX2JpdHMgJiYgKG51bV9iaXRzIDw9IGNNYXhQdXRCaXRzTGVuKSk7CgkJCQlhc3NlcnQodmFsIDwgKDF1IDw8IG51bV9iaXRzKSk7CgoJCQkJbV9sZW5ndGggPj49IG51bV9iaXRzOwoKCQkJCWNvbnN0IHVpbnQzMl90IG9yaWdfYmFzZSA9IG1fYmFzZTsKCgkJCQltX2Jhc2UgKz0gdmFsICogbV9sZW5ndGg7CgoJCQkJaWYgKG9yaWdfYmFzZSA+IG1fYmFzZSkKCQkJCQlwcm9wX2NhcnJ5KCk7CgoJCQkJaWYgKG1fbGVuZ3RoIDwgQXJpdGhNaW5MZW4pCgkJCQkJcmVub3JtKCk7CgkJCX0KCgkJCS8vIHJldHVybnMgIyBvZiBiaXRzIGFjdHVhbGx5IHdyaXR0ZW4KCQkJaW5saW5lIHVpbnQzMl90IHB1dF90cnVuY2F0ZWRfYmluYXJ5KHVpbnQzMl90IHYsIHVpbnQzMl90IG4pCgkJCXsKCQkJCWFzc2VydCgobiA+PSAyKSAmJiAodiA8IG4pKTsKCgkJCQl1aW50MzJfdCBrID0gYmFzaXN1OjpmbG9vcl9sb2cyaShuKTsKCQkJCXVpbnQzMl90IHUgPSAoMSA8PCAoayArIDEpKSAtIG47CgoJCQkJaWYgKHYgPCB1KQoJCQkJewoJCQkJCXB1dF9iaXRzKHYsIGspOwoJCQkJCXJldHVybiBrOwoJCQkJfQoKCQkJCXVpbnQzMl90IHggPSB2ICsgdTsKCQkJCWFzc2VydCgoeCA+PiAxKSA+PSB1KTsKCgkJCQlwdXRfYml0cyh4ID4+IDEsIGspOwoJCQkJcHV0X2JpdHMoeCAmIDEsIDEpOwoJCQkJcmV0dXJuIGsgKyAxOwoJCQl9CgoJCQlzdGF0aWMgaW5saW5lIHVpbnQzMl90IGdldF90cnVuY2F0ZWRfYmluYXJ5X2JpdHModWludDMyX3QgdiwgdWludDMyX3QgbikKCQkJewoJCQkJYXNzZXJ0KChuID49IDIpICYmICh2IDwgbikpOwoKCQkJCXVpbnQzMl90IGsgPSBiYXNpc3U6OmZsb29yX2xvZzJpKG4pOwoJCQkJdWludDMyX3QgdSA9ICgxIDw8IChrICsgMSkpIC0gbjsKCgkJCQlpZiAodiA8IHUpCgkJCQkJcmV0dXJuIGs7CgojaWZkZWYgX0RFQlVHCgkJCQl1aW50MzJfdCB4ID0gdiArIHU7CgkJCQlhc3NlcnQoKHggPj4gMSkgPj0gdSk7CiNlbmRpZgoKCQkJCXJldHVybiBrICsgMTsKCQkJfQoKCQkJaW5saW5lIHVpbnQzMl90IHB1dF9yaWNlKHVpbnQzMl90IHYsIHVpbnQzMl90IG0pCgkJCXsKCQkJCWFzc2VydChtKTsKCgkJCQl1aW50MzJfdCBxID0gdiA+PiBtLCByID0gdiAmICgoMSA8PCBtKSAtIDEpOwoKCQkJCS8vIHJpY2UgY29kaW5nIHNhbml0eSBjaGVjawoJCQkJYXNzZXJ0KHEgPD0gNjQpOwoKCQkJCXVpbnQzMl90IHRvdGFsX2JpdHMgPSBxOwoKCQkJCS8vIFRPRE86IHB1dF9iaXRzIHRoZSBwYXR0ZXJuIGludmVydGVkIGluIGJpdCBvcmRlcgoJCQkJd2hpbGUgKHEpCgkJCQl7CgkJCQkJcHV0X2JpdCgxKTsKCQkJCQlxLS07CgkJCQl9CgoJCQkJcHV0X2JpdCgwKTsKCgkJCQlwdXRfYml0cyhyLCBtKTsKCgkJCQl0b3RhbF9iaXRzICs9IChtICsgMSk7CgoJCQkJcmV0dXJuIHRvdGFsX2JpdHM7CgkJCX0KCgkJCXN0YXRpYyBpbmxpbmUgdWludDMyX3QgZ2V0X3JpY2VfcHJpY2UodWludDMyX3QgdiwgdWludDMyX3QgbSkKCQkJewoJCQkJYXNzZXJ0KG0pOwoKCQkJCXVpbnQzMl90IHEgPSB2ID4+IG07CgoJCQkJLy8gcmljZSBjb2Rpbmcgc2FuaXR5IGNoZWNrCgkJCQlhc3NlcnQocSA8PSA2NCk7CgoJCQkJdWludDMyX3QgdG90YWxfYml0cyA9IHEgKyAxICsgbTsKCgkJCQlyZXR1cm4gdG90YWxfYml0czsKCQkJfQoKCQkJaW5saW5lIHZvaWQgcHV0X2dhbW1hKHVpbnQzMl90IG4sIGFyaXRoX2dhbW1hX2NvbnRleHRzJiBjdHhzKQoJCQl7CgkJCQlhc3NlcnQobik7CgkJCQlpZiAoIW4pCgkJCQkJcmV0dXJuOwoKCQkJCWNvbnN0IGludCBrID0gYmFzaXN1OjpmbG9vcl9sb2cyaShuKTsKCQkJCWlmIChrID4gMTYpCgkJCQl7CgkJCQkJYXNzZXJ0KDApOwoJCQkJCXJldHVybjsKCQkJCX0KCgkJCQkvLyBwcmVmaXg6IGsgdGltZXMgJzEnIHRoZW4gYSAnMCcKCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgazsgKytpKQoJCQkJCWVuY29kZSgxLCBjdHhzLm1fY3R4X3ByZWZpeFtiYXNpc3U6Om1pbmltdW08aW50PihpLCBjQVJJVEhfR0FNTUFfTUFYX1BSRUZJWF9DVFggLSAxKV0pOwoKCQkJCWVuY29kZSgwLCBjdHhzLm1fY3R4X3ByZWZpeFtiYXNpc3U6Om1pbmltdW0oaywgY0FSSVRIX0dBTU1BX01BWF9QUkVGSVhfQ1RYIC0gMSldKTsKCgkJCQkvLyBzdWZmaXg6IHRoZSBrIGxvdyBiaXRzIG9mIG4KCQkJCWZvciAoaW50IGkgPSBrIC0gMTsgaSA+PSAwOyAtLWkpCgkJCQl7CgkJCQkJdWludDMyX3QgYml0ID0gKG4gPj4gaSkgJiAxdTsKCQkJCQllbmNvZGUoYml0LCBjdHhzLm1fY3R4X3RhaWxbYmFzaXN1OjptaW5pbXVtPGludD4oaSwgY0FSSVRIX0dBTU1BX01BWF9UQUlMX0NUWCAtIDEpXSk7CgkJCQl9CgkJCX0KCgkJCWlubGluZSBmbG9hdCBwdXRfZ2FtbWFfYW5kX3JldHVybl9wcmljZSh1aW50MzJfdCBuLCBhcml0aF9nYW1tYV9jb250ZXh0cyYgY3R4cykKCQkJewoJCQkJYXNzZXJ0KG4pOwoJCQkJaWYgKCFuKQoJCQkJCXJldHVybiAwLjBmOwoKCQkJCWNvbnN0IGludCBrID0gYmFzaXN1OjpmbG9vcl9sb2cyaShuKTsKCQkJCWlmIChrID4gMTYpCgkJCQl7CgkJCQkJYXNzZXJ0KDApOwoJCQkJCXJldHVybiAwLjBmOwoJCQkJfQoKCQkJCWZsb2F0IHRvdGFsX3ByaWNlID0gMC4wZjsKCgkJCQkvLyBwcmVmaXg6IGsgdGltZXMgJzEnIHRoZW4gYSAnMCcKCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgazsgKytpKQoJCQkJewoJCQkJCXRvdGFsX3ByaWNlICs9IGN0eHMubV9jdHhfcHJlZml4W2Jhc2lzdTo6bWluaW11bTxpbnQ+KGksIGNBUklUSF9HQU1NQV9NQVhfUFJFRklYX0NUWCAtIDEpXS5nZXRfcHJpY2UoMSk7CgkJCQkJZW5jb2RlKDEsIGN0eHMubV9jdHhfcHJlZml4W2Jhc2lzdTo6bWluaW11bTxpbnQ+KGksIGNBUklUSF9HQU1NQV9NQVhfUFJFRklYX0NUWCAtIDEpXSk7CgkJCQl9CgoJCQkJdG90YWxfcHJpY2UgKz0gY3R4cy5tX2N0eF9wcmVmaXhbYmFzaXN1OjptaW5pbXVtKGssIGNBUklUSF9HQU1NQV9NQVhfUFJFRklYX0NUWCAtIDEpXS5nZXRfcHJpY2UoMCk7CgkJCQllbmNvZGUoMCwgY3R4cy5tX2N0eF9wcmVmaXhbYmFzaXN1OjptaW5pbXVtKGssIGNBUklUSF9HQU1NQV9NQVhfUFJFRklYX0NUWCAtIDEpXSk7CgoJCQkJLy8gc3VmZml4OiB0aGUgayBsb3cgYml0cyBvZiBuCgkJCQlmb3IgKGludCBpID0gayAtIDE7IGkgPj0gMDsgLS1pKQoJCQkJewoJCQkJCXVpbnQzMl90IGJpdCA9IChuID4+IGkpICYgMXU7CgkJCQkJdG90YWxfcHJpY2UgKz0gY3R4cy5tX2N0eF90YWlsW2Jhc2lzdTo6bWluaW11bTxpbnQ+KGksIGNBUklUSF9HQU1NQV9NQVhfVEFJTF9DVFggLSAxKV0uZ2V0X3ByaWNlKGJpdCk7CgkJCQkJZW5jb2RlKGJpdCwgY3R4cy5tX2N0eF90YWlsW2Jhc2lzdTo6bWluaW11bTxpbnQ+KGksIGNBUklUSF9HQU1NQV9NQVhfVEFJTF9DVFggLSAxKV0pOwoJCQkJfQoKCQkJCXJldHVybiB0b3RhbF9wcmljZTsKCQkJfQoKCQkJLy8gcHJlZGljZWQgcHJpY2UsIHdvbid0IGJlIGFjY3VyYXRlIGlmIGEgYmluYXJ5IGFyaXRoIG1vZGVsIGRlY2lkZXMgdG8gdXBkYXRlIGluIGJldHdlZW4KCQkJaW5saW5lIGZsb2F0IGdldF9nYW1tYV9wcmljZSh1aW50MzJfdCBuLCBjb25zdCBhcml0aF9nYW1tYV9jb250ZXh0cyYgY3R4cykKCQkJewoJCQkJYXNzZXJ0KG4pOwoJCQkJaWYgKCFuKQoJCQkJCXJldHVybiAwLjBmOwoKCQkJCWNvbnN0IGludCBrID0gYmFzaXN1OjpmbG9vcl9sb2cyaShuKTsKCQkJCWlmIChrID4gMTYpCgkJCQl7CgkJCQkJYXNzZXJ0KDApOwoJCQkJCXJldHVybiAwLjBmOwoJCQkJfQoKCQkJCWZsb2F0IHRvdGFsX3ByaWNlID0gMC4wZjsKCgkJCQkvLyBwcmVmaXg6IGsgdGltZXMgJzEnIHRoZW4gYSAnMCcKCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgazsgKytpKQoJCQkJCXRvdGFsX3ByaWNlICs9IGN0eHMubV9jdHhfcHJlZml4W2Jhc2lzdTo6bWluaW11bTxpbnQ+KGksIGNBUklUSF9HQU1NQV9NQVhfUFJFRklYX0NUWCAtIDEpXS5nZXRfcHJpY2UoMSk7CgoJCQkJdG90YWxfcHJpY2UgKz0gY3R4cy5tX2N0eF9wcmVmaXhbYmFzaXN1OjptaW5pbXVtKGssIGNBUklUSF9HQU1NQV9NQVhfUFJFRklYX0NUWCAtIDEpXS5nZXRfcHJpY2UoMCk7CgoJCQkJLy8gc3VmZml4OiB0aGUgayBsb3cgYml0cyBvZiBuCgkJCQlmb3IgKGludCBpID0gayAtIDE7IGkgPj0gMDsgLS1pKQoJCQkJewoJCQkJCXVpbnQzMl90IGJpdCA9IChuID4+IGkpICYgMXU7CgkJCQkJdG90YWxfcHJpY2UgKz0gY3R4cy5tX2N0eF90YWlsW2Jhc2lzdTo6bWluaW11bTxpbnQ+KGksIGNBUklUSF9HQU1NQV9NQVhfVEFJTF9DVFggLSAxKV0uZ2V0X3ByaWNlKGJpdCk7CgkJCQl9CgoJCQkJcmV0dXJuIHRvdGFsX3ByaWNlOwoJCQl9CgoJCQl2b2lkIGVuY29kZSh1aW50MzJfdCBiaXQsIGFyaXRoX2JpdF9tb2RlbCYgZG0pCgkJCXsKCQkJCXVpbnQzMl90IHggPSBkbS5tX2JpdDBfcHJvYiAqIChtX2xlbmd0aCA+PiBCTUxlblNoaWZ0KTsKCgkJCQlpZiAoIWJpdCkKCQkJCXsKCQkJCQltX2xlbmd0aCA9IHg7CgkJCQkJKytkbS5tX2JpdDBfY291bnQ7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJY29uc3QgdWludDMyX3Qgb3JpZ19iYXNlID0gbV9iYXNlOwoJCQkJCW1fYmFzZSArPSB4OwoJCQkJCW1fbGVuZ3RoIC09IHg7CgoJCQkJCWlmIChvcmlnX2Jhc2UgPiBtX2Jhc2UpCgkJCQkJCXByb3BfY2FycnkoKTsKCQkJCX0KCQkJCSsrZG0ubV9iaXRfY291bnQ7CgoJCQkJaWYgKG1fbGVuZ3RoIDwgQXJpdGhNaW5MZW4pCgkJCQkJcmVub3JtKCk7CgoJCQkJaWYgKC0tZG0ubV9iaXRzX3VudGlsX3VwZGF0ZSA8PSAwKQoJCQkJCWRtLnVwZGF0ZSgpOwoJCQl9CgoJCQlmbG9hdCBlbmNvZGVfYW5kX3JldHVybl9wcmljZSh1aW50MzJfdCBiaXQsIGFyaXRoX2JpdF9tb2RlbCYgZG0pCgkJCXsKCQkJCWNvbnN0IGZsb2F0IHByaWNlID0gZG0uZ2V0X3ByaWNlKGJpdCk7CgkJCQllbmNvZGUoYml0LCBkbSk7CgkJCQlyZXR1cm4gcHJpY2U7CgkJCX0KCgkJCXZvaWQgZW5jb2RlKHVpbnQzMl90IHN5bSwgYXJpdGhfZGF0YV9tb2RlbCYgZG0pCgkJCXsKCQkJCWFzc2VydChzeW0gPCBkbS5tX251bV9kYXRhX3N5bXMpOwoKCQkJCWNvbnN0IHVpbnQzMl90IG9yaWdfYmFzZSA9IG1fYmFzZTsKCgkJCQlpZiAoc3ltID09IGRtLmdldF9sYXN0X3N5bV9pbmRleCgpKQoJCQkJewoJCQkJCXVpbnQzMl90IHggPSBkbS5tX2N1bV9zeW1fZnJlcXNbc3ltXSAqIChtX2xlbmd0aCA+PiBETUxlblNoaWZ0KTsKCQkJCQltX2Jhc2UgKz0geDsKCQkJCQltX2xlbmd0aCAtPSB4OwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCW1fbGVuZ3RoID4+PSBETUxlblNoaWZ0OwoJCQkJCXVpbnQzMl90IHggPSBkbS5tX2N1bV9zeW1fZnJlcXNbc3ltXSAqIG1fbGVuZ3RoOwoJCQkJCW1fYmFzZSArPSB4OwoJCQkJCW1fbGVuZ3RoID0gZG0ubV9jdW1fc3ltX2ZyZXFzW3N5bSArIDFdICogbV9sZW5ndGggLSB4OwoJCQkJfQoKCQkJCWlmIChvcmlnX2Jhc2UgPiBtX2Jhc2UpCgkJCQkJcHJvcF9jYXJyeSgpOwoKCQkJCWlmIChtX2xlbmd0aCA8IEFyaXRoTWluTGVuKQoJCQkJCXJlbm9ybSgpOwoKCQkJCSsrZG0ubV9zeW1fZnJlcXNbc3ltXTsKCQkJCSsrZG0ubV90b3RhbF9zeW1fZnJlcTsKCgkJCQlpZiAoLS1kbS5tX251bV9zeW1zX3VudGlsX25leHRfdXBkYXRlIDw9IDApCgkJCQkJZG0udXBkYXRlKHRydWUpOwoJCQl9CgoJCQlmbG9hdCBlbmNvZGVfYW5kX3JldHVybl9wcmljZSh1aW50MzJfdCBzeW0sIGFyaXRoX2RhdGFfbW9kZWwmIGRtKQoJCQl7CgkJCQljb25zdCBmbG9hdCBwcmljZSA9IGRtLmdldF9wcmljZShzeW0pOwoJCQkJZW5jb2RlKHN5bSwgZG0pOwoJCQkJcmV0dXJuIHByaWNlOwoJCQl9CgoJCQl2b2lkIGZsdXNoKCkKCQkJewoJCQkJY29uc3QgdWludDMyX3Qgb3JpZ19iYXNlID0gbV9iYXNlOwoKCQkJCWlmIChtX2xlbmd0aCA8PSAoMiAqIEFyaXRoTWluTGVuKSkKCQkJCXsKCQkJCQltX2Jhc2UgKz0gQXJpdGhNaW5MZW4gPj4gMTsKCQkJCQltX2xlbmd0aCA9IEFyaXRoTWluTGVuID4+IDk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJbV9iYXNlICs9IEFyaXRoTWluTGVuOwoJCQkJCW1fbGVuZ3RoID0gQXJpdGhNaW5MZW4gPj4gMTsKCQkJCX0KCgkJCQlpZiAob3JpZ19iYXNlID4gbV9iYXNlKQoJCQkJCXByb3BfY2FycnkoKTsKCgkJCQlyZW5vcm0oKTsKCgkJCQkvLyBQYWQgb3V0cHV0IHRvIG1pbiA1IGJ5dGVzIC0gcXVpdGUgY29uc2VydmF0aXZlOyB3ZSdyZSB0eXBpY2FsbHkgY29tcHJlc3NpbmcgbGFyZ2Ugc3RyZWFtcyBzbyB0aGUgb3ZlcmhlYWQgc2hvdWxkbid0IG1hdHRlci4KCQkJCWlmIChtX2RhdGFfYnVmLnNpemUoKSA8IEFyaXRoTWluRXhwZWN0ZWREYXRhQnVmU2l6ZSkKCQkJCQltX2RhdGFfYnVmLnJlc2l6ZShBcml0aE1pbkV4cGVjdGVkRGF0YUJ1ZlNpemUpOwoJCQl9CgoJCQliYXNpc3U6OnVpbnQ4X3ZlYyYgZ2V0X2RhdGFfYnVmKCkgeyByZXR1cm4gbV9kYXRhX2J1ZjsgfQoJCQljb25zdCBiYXNpc3U6OnVpbnQ4X3ZlYyYgZ2V0X2RhdGFfYnVmKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhX2J1ZjsgfQoKCQlwcml2YXRlOgoJCQliYXNpc3U6OnVpbnQ4X3ZlYyBtX2RhdGFfYnVmOwoJCQl1aW50MzJfdCBtX2Jhc2UsIG1fbGVuZ3RoOwoKCQkJaW5saW5lIHZvaWQgcHJvcF9jYXJyeSgpCgkJCXsKCQkJCWludDY0X3Qgb2ZzID0gbV9kYXRhX2J1Zi5zaXplKCkgLSAxOwoKCQkJCWZvciAoOyAob2ZzID49IDApICYmIChtX2RhdGFfYnVmWyhzaXplX3Qpb2ZzXSA9PSAweEZGKTsgLS1vZnMpCgkJCQkJbV9kYXRhX2J1Zlsoc2l6ZV90KW9mc10gPSAwOwoKCQkJCWlmIChvZnMgPj0gMCkKCQkJCQkrK21fZGF0YV9idWZbKHNpemVfdClvZnNdOwoJCQl9CgoJCQlpbmxpbmUgdm9pZCByZW5vcm0oKQoJCQl7CgkJCQlhc3NlcnQobV9sZW5ndGggPCBBcml0aE1pbkxlbik7CgkJCQlkbwoJCQkJewoJCQkJCW1fZGF0YV9idWYucHVzaF9iYWNrKCh1aW50OF90KShtX2Jhc2UgPj4gMjR1KSk7CgkJCQkJbV9iYXNlIDw8PSA4dTsKCQkJCQltX2xlbmd0aCA8PD0gOHU7CgkJCQl9IHdoaWxlIChtX2xlbmd0aCA8IEFyaXRoTWluTGVuKTsKCQkJfQoJCX07CgoJCWNsYXNzIGFyaXRoX2RlYwoJCXsKCQlwdWJsaWM6CgkJCWFyaXRoX2RlYygpCgkJCXsKCQkJCWNsZWFyKCk7CgkJCX0KCgkJCXZvaWQgY2xlYXIoKQoJCQl7CgkJCQltX3BEYXRhX2J1ZiA9IG51bGxwdHI7CgkJCQltX3BEYXRhX2J1Zl9sYXN0X2J5dGUgPSBudWxscHRyOwoJCQkJbV9wRGF0YV9idWZfY3VyID0gbnVsbHB0cjsKCQkJCW1fZGF0YV9idWZfc2l6ZSA9IDA7CgoJCQkJbV92YWx1ZSA9IDA7CgkJCQltX2xlbmd0aCA9IDA7CgkJCX0KCgkJCWJvb2wgaW5pdChjb25zdCB1aW50OF90KiBwQnVmLCBzaXplX3QgYnVmX3NpemUpCgkJCXsKCQkJCWlmIChidWZfc2l6ZSA8IEFyaXRoTWluRXhwZWN0ZWREYXRhQnVmU2l6ZSkKCQkJCXsKCQkJCQlhc3NlcnQoMCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoKCQkJCW1fcERhdGFfYnVmID0gcEJ1ZjsKCQkJCW1fcERhdGFfYnVmX2xhc3RfYnl0ZSA9IHBCdWYgKyBidWZfc2l6ZSAtIDE7CgkJCQltX3BEYXRhX2J1Zl9jdXIgPSBtX3BEYXRhX2J1ZiArIDQ7CgkJCQltX2RhdGFfYnVmX3NpemUgPSBidWZfc2l6ZTsKCgkJCQltX3ZhbHVlID0gKCh1aW50MzJfdCkocEJ1ZlswXSkgPDwgMjR1KSB8ICgodWludDMyX3QpKHBCdWZbMV0pIDw8IDE2dSkgfCAoKHVpbnQzMl90KShwQnVmWzJdKSA8PCA4dSkgfCAodWludDMyX3QpKHBCdWZbM10pOwoJCQkJbV9sZW5ndGggPSBBcml0aE1heExlbjsKCgkJCQkvLyBDaGVjayBmb3IgdGhlIDgtYml0IG1hcmtlciB3ZSBhbHdheXMgcGxhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtLgoJCQkJLy91aW50MzJfdCBtYXJrZXIgPSBnZXRfYml0cyg4KTsKCQkJCS8vaWYgKG1hcmtlciAhPSAweDEpCgkJCQkvLwlyZXR1cm4gZmFsc2U7CgoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCgkJCXVpbnQzMl90IGdldF9iaXQoKQoJCQl7CgkJCQlhc3NlcnQobV9kYXRhX2J1Zl9zaXplKTsKCgkJCQltX2xlbmd0aCA+Pj0gMTsKCgkJCQl1aW50MzJfdCBiaXQgPSAobV92YWx1ZSA+PSBtX2xlbmd0aCk7CgoJCQkJaWYgKGJpdCkKCQkJCQltX3ZhbHVlIC09IG1fbGVuZ3RoOwoKCQkJCWlmIChtX2xlbmd0aCA8IEFyaXRoTWluTGVuKQoJCQkJCXJlbm9ybSgpOwoKCQkJCXJldHVybiBiaXQ7CgkJCX0KCgkJCWVudW0geyBjTWF4R2V0Qml0c0xlbiA9IDIwIH07CgoJCQl1aW50MzJfdCBnZXRfYml0cyh1aW50MzJfdCBudW1fYml0cykKCQkJewoJCQkJYXNzZXJ0KG1fZGF0YV9idWZfc2l6ZSk7CgoJCQkJaWYgKChudW1fYml0cyA8IDEpIHx8IChudW1fYml0cyA+IGNNYXhHZXRCaXRzTGVuKSkKCQkJCXsKCQkJCQlhc3NlcnQoMCk7CgkJCQkJcmV0dXJuIDA7CgkJCQl9CgoJCQkJbV9sZW5ndGggPj49IG51bV9iaXRzOwoJCQkJYXNzZXJ0KG1fbGVuZ3RoKTsKCgkJCQljb25zdCB1aW50MzJfdCB2ID0gbV92YWx1ZSAvIG1fbGVuZ3RoOwoKCQkJCW1fdmFsdWUgLT0gbV9sZW5ndGggKiB2OwoKCQkJCWlmIChtX2xlbmd0aCA8IEFyaXRoTWluTGVuKQoJCQkJCXJlbm9ybSgpOwoKCQkJCXJldHVybiB2OwoJCQl9CgoJCQl1aW50MzJfdCBkZWNvZGVfdHJ1bmNhdGVkX2JpbmFyeSh1aW50MzJfdCBuKQoJCQl7CgkJCQlhc3NlcnQobiA+PSAyKTsKCgkJCQljb25zdCB1aW50MzJfdCBrID0gYmFzaXN1OjpmbG9vcl9sb2cyaShuKTsKCQkJCWNvbnN0IHVpbnQzMl90IHUgPSAoMSA8PCAoayArIDEpKSAtIG47CgoJCQkJdWludDMyX3QgcmVzdWx0ID0gZ2V0X2JpdHMoayk7CgoJCQkJaWYgKHJlc3VsdCA+PSB1KQoJCQkJCXJlc3VsdCA9ICgocmVzdWx0IDw8IDEpIHwgZ2V0X2JpdHMoMSkpIC0gdTsKCgkJCQlyZXR1cm4gcmVzdWx0OwoJCQl9CgoJCQl1aW50MzJfdCBkZWNvZGVfcmljZSh1aW50MzJfdCBtKQoJCQl7CgkJCQlhc3NlcnQobSk7CgoJCQkJdWludDMyX3QgcSA9IDA7CgkJCQlmb3IgKDs7KQoJCQkJewoJCQkJCXVpbnQzMl90IGsgPSBnZXRfYml0KCk7CgkJCQkJaWYgKCFrKQoJCQkJCQlicmVhazsKCgkJCQkJcSsrOwoJCQkJCWlmIChxID4gNjQpCgkJCQkJewoJCQkJCQlhc3NlcnQoMCk7CgkJCQkJCXJldHVybiAwOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gKHEgPDwgbSkgKyBnZXRfYml0cyhtKTsKCQkJfQoKCQkJdWludDMyX3QgZGVjb2RlX2JpdChhcml0aF9iaXRfbW9kZWwmIGRtKQoJCQl7CgkJCQlhc3NlcnQobV9kYXRhX2J1Zl9zaXplKTsKCgkJCQl1aW50MzJfdCB4ID0gZG0ubV9iaXQwX3Byb2IgKiAobV9sZW5ndGggPj4gQk1MZW5TaGlmdCk7CgkJCQl1aW50MzJfdCBiaXQgPSAobV92YWx1ZSA+PSB4KTsKCgkJCQlpZiAoYml0ID09IDApCgkJCQl7CgkJCQkJbV9sZW5ndGggPSB4OwoJCQkJCSsrZG0ubV9iaXQwX2NvdW50OwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCW1fdmFsdWUgLT0geDsKCQkJCQltX2xlbmd0aCAtPSB4OwoJCQkJfQoJCQkJKytkbS5tX2JpdF9jb3VudDsKCgkJCQlpZiAobV9sZW5ndGggPCBBcml0aE1pbkxlbikKCQkJCQlyZW5vcm0oKTsKCgkJCQlpZiAoLS1kbS5tX2JpdHNfdW50aWxfdXBkYXRlIDw9IDApCgkJCQkJZG0udXBkYXRlKCk7CgoJCQkJcmV0dXJuIGJpdDsKCQkJfQoKCQkJaW5saW5lIHVpbnQzMl90IGRlY29kZV9nYW1tYShhcml0aF9nYW1tYV9jb250ZXh0cyYgY3R4cykKCQkJewoJCQkJaW50IGsgPSAwOwoJCQkJd2hpbGUgKGRlY29kZV9iaXQoY3R4cy5tX2N0eF9wcmVmaXhbYmFzaXN1OjptaW5pbXVtPGludD4oaywgY0FSSVRIX0dBTU1BX01BWF9QUkVGSVhfQ1RYIC0gMSldKSkKCQkJCXsKCQkJCQkrK2s7CgoJCQkJCWlmIChrID4gMTYpCgkJCQkJewoJCQkJCQkvLyBzb21ldGhpbmcgaXMgdmVyeSB3cm9uZwoJCQkJCQlhc3NlcnQoMCk7CgkJCQkJCXJldHVybiAwOwoJCQkJCX0KCQkJCX0KCgkJCQlpbnQgbiA9IDEgPDwgazsKCQkJCWZvciAoaW50IGkgPSBrIC0gMTsgaSA+PSAwOyAtLWkpCgkJCQl7CgkJCQkJdWludDMyX3QgYml0ID0gZGVjb2RlX2JpdChjdHhzLm1fY3R4X3RhaWxbYmFzaXN1OjptaW5pbXVtPGludD4oaSwgY0FSSVRIX0dBTU1BX01BWF9UQUlMX0NUWCAtIDEpXSk7CgkJCQkJbiB8PSAoYml0IDw8IGkpOwoJCQkJfQoKCQkJCXJldHVybiBuOwoJCQl9CgoJCQl1aW50MzJfdCBkZWNvZGVfc3ltKGFyaXRoX2RhdGFfbW9kZWwmIGRtKQoJCQl7CgkJCQlhc3NlcnQobV9kYXRhX2J1Zl9zaXplKTsKCQkJCWFzc2VydChkbS5tX251bV9kYXRhX3N5bXMpOwoKCQkJCXVpbnQzMl90IHggPSAwLCB5ID0gbV9sZW5ndGg7CgoJCQkJbV9sZW5ndGggPj49IERNTGVuU2hpZnQ7CgoJCQkJdWludDMyX3QgbG93X2lkeCA9IDAsIGhpX2lkeCA9IGRtLm1fbnVtX2RhdGFfc3ltczsKCQkJCXVpbnQzMl90IG1pZF9pZHggPSBoaV9pZHggPj4gMTsKCgkJCQlkbwoJCQkJewoJCQkJCXVpbnQzMl90IHogPSBtX2xlbmd0aCAqIGRtLm1fY3VtX3N5bV9mcmVxc1ttaWRfaWR4XTsKCgkJCQkJaWYgKHogPiBtX3ZhbHVlKQoJCQkJCXsKCQkJCQkJaGlfaWR4ID0gbWlkX2lkeDsKCQkJCQkJeSA9IHo7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCWxvd19pZHggPSBtaWRfaWR4OwoJCQkJCQl4ID0gejsKCQkJCQl9CgkJCQkJbWlkX2lkeCA9IChsb3dfaWR4ICsgaGlfaWR4KSA+PiAxOwoKCQkJCX0gd2hpbGUgKG1pZF9pZHggIT0gbG93X2lkeCk7CgoJCQkJbV92YWx1ZSAtPSB4OwoJCQkJbV9sZW5ndGggPSB5IC0geDsKCgkJCQlpZiAobV9sZW5ndGggPCBBcml0aE1pbkxlbikKCQkJCQlyZW5vcm0oKTsKCgkJCQkrK2RtLm1fc3ltX2ZyZXFzW2xvd19pZHhdOwoJCQkJKytkbS5tX3RvdGFsX3N5bV9mcmVxOwoKCQkJCWlmICgtLWRtLm1fbnVtX3N5bXNfdW50aWxfbmV4dF91cGRhdGUgPD0gMCkKCQkJCQlkbS51cGRhdGUoZmFsc2UpOwoKCQkJCXJldHVybiBsb3dfaWR4OwoJCQl9CgoJCXByaXZhdGU6CgkJCWNvbnN0IHVpbnQ4X3QqIG1fcERhdGFfYnVmOwoJCQljb25zdCB1aW50OF90KiBtX3BEYXRhX2J1Zl9sYXN0X2J5dGU7CgkJCWNvbnN0IHVpbnQ4X3QqIG1fcERhdGFfYnVmX2N1cjsKCQkJc2l6ZV90IG1fZGF0YV9idWZfc2l6ZTsKCgkJCXVpbnQzMl90IG1fdmFsdWUsIG1fbGVuZ3RoOwoKCQkJaW5saW5lIHZvaWQgcmVub3JtKCkKCQkJewoJCQkJZG8KCQkJCXsKCQkJCQljb25zdCB1aW50MzJfdCBuZXh0X2J5dGUgPSAobV9wRGF0YV9idWZfY3VyID4gbV9wRGF0YV9idWZfbGFzdF9ieXRlKSA/IDAgOiAqbV9wRGF0YV9idWZfY3VyKys7CgoJCQkJCW1fdmFsdWUgPSAobV92YWx1ZSA8PCA4dSkgfCBuZXh0X2J5dGU7CgoJCQkJfSB3aGlsZSAoKG1fbGVuZ3RoIDw8PSA4dSkgPCBBcml0aE1pbkxlbik7CgkJCX0KCQl9OwoKCX0gLy8gbmFtZXNwYWNlIGFyaXRoCiNlbmRpZiAvLyBCQVNJU0RfU1VQUE9SVF9YVUFTVEMKCiNpZiBCQVNJU0RfU1VQUE9SVF9YVUFTVEMKCW5hbWVzcGFjZSBiYzd1Cgl7CgkJaW50IGRldGVybWluZV9iYzdfbW9kZShjb25zdCB2b2lkKiBwQmxvY2spOwoJCWludCBkZXRlcm1pbmVfYmM3X21vZGVfNF9pbmRleF9tb2RlKGNvbnN0IHZvaWQqIHBCbG9jayk7CgkJaW50IGRldGVybWluZV9iYzdfbW9kZV80X29yXzVfcm90YXRpb24oY29uc3Qgdm9pZCogcEJsb2NrKTsKCQlib29sIHVucGFja19iYzdfbW9kZTYoY29uc3Qgdm9pZCogcEJsb2NrX2JpdHMsIGNvbG9yX3JnYmEqIHBQaXhlbHMpOwoJCWJvb2wgdW5wYWNrX2JjNyhjb25zdCB2b2lkKiBwQmxvY2ssIGNvbG9yX3JnYmEqIHBQaXhlbHMpOwoKCQlleHRlcm4gdWludDhfdCBnX3dlaWdodF9xdWFudFszXVs2NV07IC8vIFsyLTRdWzAtNjRdIC0gbWFwcyBbMCw2NF0gbm9ybWFsaXplZCB3ZWlnaHQgdG8gbmVhcmVzdCBxdWFudGl6ZWQgdmFsdWUKCgkJdm9pZCBpbml0X3dlaWdodF9xdWFudCgpOwoKCQkvLyBBIGxvZ2ljYWwgQkM3IGJsb2NrIGRpcmVjdGx5IGNvcnJlc3BvbmRzIHRvIHRoZSBkYXRhIHBhY2tlZCBpbnRvIGVhY2ggcGh5c2ljYWwgYmxvY2suCgkJLy8gVW5wYWNraW5nIGZyb20gcGh5c2ljYWwgYW5kIHRoZW4gcGFja2luZyBiYWNrIHRvIHBoeXNpY2FsIGlzIGFsd2F5cyAxMDAlIGxvc3NsZXNzLgoJCXN0cnVjdCBsb2dfYmM3X2Jsb2NrCgkJewoJCQlpbnQ4X3QgbV9tb2RlOyAvLyAwLTcsIC0xPWludmFsaWQKCgkJCXVpbnQ4X3QgbV9udW1fcGFydGl0aW9uczsgLy8gMS0zIHN1YnNldHMKCQkJdWludDhfdCBtX3BhdHRlcm5fYml0czsgLy8gMCwgNCBvciA2CgkJCXVpbnQ4X3QgbV9wYXR0ZXJuX2luZGV4OyAvLyAwLTE1IChtb2RlIDApIG9yIDAtNjMgKG1vZGVzIDEtMykKCgkJCXVpbnQ4X3QgbV9udW1fcGxhbmVzOyAvLyAxLTIKCQkJdWludDhfdCBtX2RwX3JvdGF0aW9uX2luZGV4OyAvLyAwLTMgZm9yIG1vZGUgNC81LCAwIGZvciBvdGhlciBtb2RlcwoKCQkJLy8gRm9yIGR1YWwgcGxhbmUgKG1vZGUgNC01KTogbm9ybWFsbHkgd2VpZ2h0IHBsYW5lIDAgaXMgZm9yIFJHQiAodmVjdG9yIHBsYW5lKSBhbmQgd2VpZ2h0IHBsYW5lIDEgaXMgZm9yIEEgKHNjYWxhciBwbGFuZSksIGJ1dCBmb3IgbW9kZSA0IHRoaXMgY2FuIGJlIGludmVydGVkLgoJCQkvLyBUaGlzIGlzIHRoZSB2ZWN0b3IgcGxhbmUncyB3ZWlnaHQgcGxhbmUgKEJFRk9SRSBmaW5hbCBjb21wb25lbnQgcm90YXRpb24vc3dhcHBpbmcpLgoJCQkvLyBDb3VsZCBhbHNvIGJlIGNhbGxlZCAibV9kcF9yZ2JfdmVjdG9yX3dlaWdodF9wbGFuZV9pbmRleCIuCgkJCXVpbnQ4X3QgbV9tb2RlNF9pbmRleF9zZWxlY3RvcjsgLy8gMCBvciAxIGZvciBtb2RlIDQgKHdoaWNoIHdlaWdodCBwbGFuZSdzIHdlaWdodHMgaGFzIFJHQiwgdGhlIG90aGVyIHBsYW5lIGhhcyBhbHBoYSksIG90aGVyd2lzZSBhbHdheXMgMAoKCQkJdWludDhfdCBtX2VuZHBvaW50X2JpdHNbMl07IC8vIFtyZ2Igb3IgYV0sIDAgb3IgWzQsN10gLSBub3RlIGZvciBtb2RlIDQvNSAoZHVhbCBwbGFuZSkgdGhpcyBpcyBCRUZPUkUgdGhlIGNvbXBvbmVudCByb3RhdGlvbi9zd2FwcGluZyBhdCB0aGUgZW5kIG9mIGRlY29kaW5nCgkJCXVpbnQ4X3QgbV9lbmRwb2ludHNbM11bMl1bNF07IC8vIFtzdWJzZXRdW2wgb3IgaF1bY29tcG9uZW50XQoKCQkJLy8gRm9yIG1vZGUgNDogd2VpZ2h0IHBsYW5lIDAgaXMgYWx3YXlzIDItYml0cywgcGxhbmUgMSBpcyAzLWJpdHMuIEZvciBtb2RlIDUsIGJvdGggYXJlIGFsd2F5cyAyLWJpdHMuIFRoaXMgYWxsb2NhdGlvbiBpcyBwZXItbW9kZSBhbmQgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSBtb2RlIDQgaW5kZXggc2VsZWN0b3IgYml0LgoJCQkvLyBGb3IgbW9kZSA0OiBtX21vZGU0X2luZGV4X3NlbGVjdG9yIGlzIHRoZSBpbmRleCBvZiB0aGUgdmVjdG9yIHBsYW5lLiBGb3IgbW9kZSA1LCBwbGFuZSAwPXZlY3RvciwgcGxhbmUgMT1zY2FsYXIuCgkJCXVpbnQ4X3QgbV93ZWlnaHRfYml0c1syXTsgLy8gW3BsYW5lXSwgWzIsNF0gLSBub3RlIGZvciBtb2RlIDQgdGhpcyBhcmUgYWx3YXlzIGZpeGVkIHRvIDIsMyAoaS5lLiBtX21vZGU0X2luZGV4X3NlbGVjdG9yIGRldGVybWluZXMgd2hpY2ggcGxhbmUgY29udGFpbnMgdGhlIFJHQiB3ZWlnaHRzKQoJCQl1aW50OF90IG1fd2VpZ2h0c1syXVsxNl07IC8vIFtwbGFuZV1bdGV4ZWxfaW5kZXhdCgoJCQl1aW50OF90IG1fbnVtX3BiaXRzOyAvLyAwLTYsIHRvdGFsIHAtYml0cyBmb3IgYWxsIHN1YnNldHMKCQkJYm9vbCBtX3NoYXJlZF9wYml0czsgLy8gdHJ1ZTogcC1iaXRzIHNoYXJlZCBwZXIgZW5kcG9pbnQgcGFpciwgZmFsc2U6IHVuaXF1ZSBwLWJpdCBwZXIgZW5kcG9pbnQKCQkJdWludDhfdCBtX3BiaXRzWzZdOwoKCQkJYm9vbCBpc192YWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1fbW9kZSA+PSAwOyB9CgoJCQlib29sIGlzX2R1YWxfcGxhbmUoKSBjb25zdCB7IHJldHVybiBtX251bV9wbGFuZXMgPT0gMjsgfQoKCQkJdWludDMyX3QgZ2V0X251bV93ZWlnaHRfdmFscyh1aW50MzJfdCBwbGFuZV9pbmRleCkgY29uc3QgeyBhc3NlcnQocGxhbmVfaW5kZXggPCAyKTsgcmV0dXJuIDF1IDw8IG1fd2VpZ2h0X2JpdHNbcGxhbmVfaW5kZXhdOyB9CgoJCQl1aW50MzJfdCBnZXRfbnVtX2VuZHBvaW50X3ZhbHModWludDMyX3QgcmdiX29yX2FfaW5kZXgpIGNvbnN0IHsgYXNzZXJ0KHJnYl9vcl9hX2luZGV4IDwgMik7IHJldHVybiAxdSA8PCBtX2VuZHBvaW50X2JpdHNbcmdiX29yX2FfaW5kZXhdOyB9CgoJCQl1aW50MzJfdCBnZXRfdmVjdG9yX3dlaWdodF9wbGFuZV9pbmRleCgpIGNvbnN0CgkJCXsKCQkJCXJldHVybiBtX21vZGU0X2luZGV4X3NlbGVjdG9yOwoJCQl9CgoJCQl1aW50MzJfdCBnZXRfc2NhbGFyX3dlaWdodF9wbGFuZV9pbmRleCgpIGNvbnN0CgkJCXsKCQkJCXJldHVybiAxIC0gbV9tb2RlNF9pbmRleF9zZWxlY3RvcjsKCQkJfQoKCQkJLy8gcmV0dXJucyB0aGUgY29sb3IgY2hhbm5lbCBzZXBhcmF0ZWx5IGludGVycG9sYXRlZCBvbiB0aGUgc2NhbGFyIHBsYW5lIChub3QgbmVjZXNzYXJpbHkgcGxhbmUgMSEpCgkJCWludCBnZXRfY29sb3JfY29tcG9uZW50X3NlbGVjdG9yKCkgY29uc3QKCQkJewoJCQkJaWYgKCFpc19kdWFsX3BsYW5lKCkpCgkJCQkJcmV0dXJuIC0xOwoJCQkJZWxzZQoJCQkJCXJldHVybiAobV9kcF9yb3RhdGlvbl9pbmRleCArIDMpICYgMzsKCQkJfSAKCgkJCS8vIEZvciBlbmRwb2ludCBjaGFubmVsIGMgKE5PVCBkZWNvZGVkIHRleGVsIGNoYW5uZWwgYyk6IHdoaWNoIHdlaWdodCBwbGFuZSB3aWxsIGJlIHVzZWQgdG8gaW50ZXJwb2xhdGUgaXQgYXQgdGhlIGVuZHBvaW50IGxldmVsCgkJCXVpbnQzMl90IGdldF9lbmRwb2ludF9jaGFubmVsX3dlaWdodF9wbGFuZSh1aW50MzJfdCBjKSBjb25zdAoJCQl7CgkJCQlhc3NlcnQoYyA8PSAzKTsKCgkJCQkvLyBhbHdheXMgMCBpbiBTUAoJCQkJaWYgKCFpc19kdWFsX3BsYW5lKCkpCgkJCQkJcmV0dXJuIDA7CgoJCQkJLy8gc2NhbGFyIHBsYW5lIGluZGV4IGlzIGFsd2F5cyBlbmRwb2ludCBjaGFubmVsIDMgKGFscGhhKTogdW50aWwgdGhlIGZpbmFsIG1vZGUgNC81IGNoYW5uZWwgcm90YXRpb24vc3dhcAoJCQkJaWYgKGMgPT0gMykKCQkJCQlyZXR1cm4gMSAtIG1fbW9kZTRfaW5kZXhfc2VsZWN0b3I7IAoKCQkJCXJldHVybiBtX21vZGU0X2luZGV4X3NlbGVjdG9yOyAvLyB2ZWN0b3IgcGxhbmUgaW5kZXgKCQkJfQoJCQoJCQkvLyBGb3IgZWFjaCBmdWxseSBkZWNvZGVkIHBpeGVsOiBSZXR1cm5zIHRoZSB3ZWlnaHQgcGxhbmUgaW5kZXggWzAsMV0gdGhhdCBpcyB1c2VkIGZvciBkZWNvZGVkIHBpeGVsIGNoYW5uZWwgYyBbMCwzXSwgdGFraW5nIGludG8gYWNjb3VudCBtb2RlIDQvNSBjaGFubmVsIHJvdGF0aW9uIGFuZCB0aGUgbW9kZSA0IGluZGV4IHNlbGVjdG9yIGJpdAoJCQl1aW50MzJfdCBnZXRfZGVjb2RlZF9jaGFubmVsX3dlaWdodF9wbGFuZSh1aW50MzJfdCBjKSBjb25zdAoJCQl7CgkJCQlhc3NlcnQoYyA8PSAzKTsKCgkJCQkvLyBhbHdheXMgMCBpbiBTUAoJCQkJaWYgKCFpc19kdWFsX3BsYW5lKCkpCgkJCQkJcmV0dXJuIDA7IAoKCQkJCS8vIGRldGVybWluZSB3aGljaCBjaGFubmVsIHVzZXMgdGhlIG90aGVyIHNjYWxhciBwbGFuZQoJCQkJY29uc3QgdWludDMyX3QgY2NzX2luZGV4ID0gKG1fZHBfcm90YXRpb25faW5kZXggKyAzKSAmIDM7CgoJCQkJaWYgKGMgIT0gY2NzX2luZGV4KQoJCQkJCXJldHVybiBtX21vZGU0X2luZGV4X3NlbGVjdG9yOyAvLyB2ZWN0b3IgcGxhbmUgaW5kZXgKCgkJCQlyZXR1cm4gMSAtIG1fbW9kZTRfaW5kZXhfc2VsZWN0b3I7IC8vIHNjYWxhciBwbGFuZSBpbmRleAoJCQl9CgkJCQoJCQlib29sIGhhc19hbHBoYSgpIGNvbnN0IHsgcmV0dXJuIG1fZW5kcG9pbnRfYml0c1sxXSAhPSAwOyB9CgoJCQkvLyB0aGlzIGlzIHRoZSAjIG9mIGVuZHBvaW50IGNvbXBzCgkJCXVpbnQzMl90IGdldF9udW1fY29tcHMoKSBjb25zdCB7IHJldHVybiBtX2VuZHBvaW50X2JpdHNbMV0gPyA0IDogMzsgfQoKCQkJdWludDMyX3QgZ2V0X251bV9wYml0c19wZXJfc3Vic2V0KCkgY29uc3QgeyByZXR1cm4gbV9udW1fcGJpdHMgPyAobV9zaGFyZWRfcGJpdHMgPyAxIDogMikgOiAwOyB9CgoJCQl2b2lkIGNsZWFyKCkKCQkJewoJCQkJbWVtc2V0KHRoaXMsIDAsIHNpemVvZigqdGhpcykpOwoJCQl9CgkJfTsKCgkJc3RydWN0IHBoeXNfYmM3X2Jsb2NrCgkJewoJCQl1aW50OF90IG1fYnl0ZXNbMTZdOwoJCX07CgoJCWJvb2wgdW5wYWNrX2JjNyhjb25zdCB2b2lkKiBwUGh5c19ibG9jaywgbG9nX2JjN19ibG9jayYgbG9nX2Jsayk7CgoJCXZvaWQgdW5wYWNrX2VuZHBvaW50cyhjb25zdCBsb2dfYmM3X2Jsb2NrJiBsb2dfYmxrLCBjb2xvcl9yZ2JhIHBFbmRwb2ludHNbMl0sIHVpbnQzMl90IHN1YnNldCk7IC8vIHJldHVybnMgcmF3IGVuZHBvaW50cyAobm90ZSBmb3IgZHVhbCBwbGFuZSAxIGNvbXBvbmVudCBtYXkgYmUgc3dhcHBlZCB3aXRoIGEsIHdoaWNoIGlzIGhhbmRsZWQgZHVyaW5nIGRlY29kaW5nKQoKCQlzdHJ1Y3QgZW5kcG9pbnRfZm9ybWF0CgkJewoJCQl1aW50OF90IG1fbnVtX3JnYl9iaXRzOwoJCQl1aW50OF90IG1fbnVtX2FfYml0czsKCQkJdWludDhfdCBtX251bV9wYml0czsgLy8gcC1iaXRzIHBlci1zdWJzZXQ6IDAsIDEgKHNoYXJlZCkgb3IgMiAodW5pcXVlKQoJCX07CgoJCWV4dGVybiBjb25zdCBlbmRwb2ludF9mb3JtYXQgZ19lbmRwb2ludF9mb3JtYXRzWzhdOwoKCQkvLyBkZXF1YW50aXplcyBhIEJDNyB3ZWlnaHQgdG8gYSBub3JtYWxpemVkIFswLDY0XSB2YWx1ZTsgdyBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIFswLCAyXm51bV93ZWlnaHRfYml0cyAtIDFdCgkJaW50IGRlcXVhbnRfd2VpZ2h0KHVpbnQzMl90IHcsIHVpbnQzMl90IG51bV93ZWlnaHRfYml0cyk7CgkJCQkKCQkvLyBxdWFudGl6ZXMgYSBub3JtYWxpemVkIFswLDY0XSB3ZWlnaHQgdG8gbmVhcmVzdCBxdWFudGl6ZWQgQkM3IHdlaWdodCB2YWx1ZQoJCS8vIHZhbCBzaG91bGQgcmFuZ2UgZnJvbSBbMCw2NF0gKGl0J3Mgc2lsZW50bHkgY2xhbXBlZCkKCQkvLyBudW1fd2VpZ2h0X2JpdHMgc2hvdWxkIGJlIFsyLDRdCgkJaW5saW5lIHVpbnQ4X3QgcXVhbnRfd2VpZ2h0KGludCB2YWwsIHVpbnQzMl90IG51bV93ZWlnaHRfYml0cykKCQl7CgkJCWFzc2VydCgobnVtX3dlaWdodF9iaXRzID49IDIpICYmIChudW1fd2VpZ2h0X2JpdHMgPD0gNCkpOwoJCQlhc3NlcnQoZ193ZWlnaHRfcXVhbnRbMl1bNjRdKTsKCQkJCgkJCXZhbCA9IGJhc2lzdTo6Y2xhbXA8aW50Pih2YWwsIDAsIDY0KTsKCgkJCXJldHVybiBnX3dlaWdodF9xdWFudFtudW1fd2VpZ2h0X2JpdHMgLSAyXVt2YWxdOwoJCX0KCgkJdm9pZCBpbml0X2xvZ19ibGsobG9nX2JjN19ibG9jayYgbG9nX2JsaywgdWludDMyX3QgbW9kZSk7CgoJCXZvaWQgY3JlYXRlX3NvbGlkX2Jsayhsb2dfYmM3X2Jsb2NrJiBsb2dfYmxrLCBjb25zdCBjb2xvcl9yZ2JhJiBjKTsKCgkJYm9vbCBpc19zb2xpZF9ibGsoY29uc3QgbG9nX2JjN19ibG9jayYgbG9nX2Jsayk7CgoJCWJvb2wgdmFsaWRhdGVfbG9nX2Jsayhjb25zdCBsb2dfYmM3X2Jsb2NrJiBsb2dfYmxrKTsKCgkJdm9pZCBwYWNrX2VuZHBvaW50cygKCQkJdWludDMyX3QgbW9kZV9pbmRleCwKCQkJY29uc3QgY29sb3JfcmdiYSBwU3JjX2VuZHBvaW50c1syXSwgLy8gYWx3YXlzIDgtYml0cyAodW5wYWNrZWQpCgkJCWNvbG9yX3JnYmEgcERzdF9lbmRwb2ludHNbMl0sIHVpbnQ4X3QgcERzdF9wYml0c1syXSk7IC8vIEJDNyBwYWNrZWQgd2l0aCBvcHRpb25hbCBzaGFyZWQgb3IgdW5pcXVlIHAtYml0cywgbm90IHRoaXMgZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgYW55IG1vZGUgNC81IGNoYW5uZWwgc3dhcHBpbmcgd2l0aCBBCgoJCXZvaWQgZW5kcG9pbnRfZHBjbSgKCQkJYm9vbCBkZWNvZGVfZmxhZywKCQkJY29uc3QgbG9nX2JjN19ibG9jayYgcHJlZGljdG9yX2xvZ19ibGssIHVpbnQzMl90IHByZWRpY3Rvcl9zdWJzZXRfaW5kZXgsIC8vIHRoZSBsb2dpY2FsIGJsb2NrIHdlIGFyZSBwcmVkaWN0aW5nIGZyb20KCQkJbG9nX2JjN19ibG9jayYgbG9nX2JsaywgdWludDMyX3Qgc3Vic2V0X2luZGV4LCAvLyB0aGUgbG9naWNhbCBibG9jayB3aGljaCBoYXMgdGhlIGVuZHBvaW50IHdlIHdhbnQgdG8gY29kZS9kZWNvZGUKCQkJdWludDhfdCogcFJlc2lkdWFscywgdWludDMyX3QmIG51bV9yZXNpZHVhbHMsIHVpbnQ4X3QqIHBCaXRzLCB1aW50MzJfdCYgbnVtX3BiaXRzKTsgLy8gdGhlIERQQ00gZW5jb2RlZCB2YWx1ZXMsIGluIFJSLCBHRywgQkIsIEFBIG9yZGVyLCBwUmVzaWR1YWxzW10gaXMgYWx3YXlzIG1vZGlmaWVkIQoKCQl2b2lkIHNldF9lbmRwb2ludHMobG9nX2JjN19ibG9jayYgbG9nX2JsaywgdWludDMyX3Qgc3Vic2V0LCBjb25zdCBjb2xvcl9yZ2JhIHBFbmRwb2ludHNbMl0sIGNvbnN0IHVpbnQ4X3QgcGJpdHNbMl0pOyAvLyBtdXN0IGJlIHBhY2tlZAoKCQlib29sIHVucGFja19iYzcoY29uc3QgbG9nX2JjN19ibG9jayYgbG9nX2JsaywgY29sb3JfcmdiYSogcFBpeGVscyk7CgoJCWJvb2wgdW5wYWNrX2JjN190ZXhlbChjb25zdCBsb2dfYmM3X2Jsb2NrJiBsb2dfYmxrLCBjb2xvcl9yZ2JhJiBwaXhlbCwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CgoJCXVpbnQzMl90IGdldF90ZXhlbF9zdWJzZXQobG9nX2JjN19ibG9jayYgbG9nX2JsaywgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CgoJCXZvaWQgY2Fub25pY2FsaXplX2VuZHBvaW50cyhsb2dfYmM3X2Jsb2NrJiBsb2dfYmxrKTsKCQkKCQkvLyBub3RlIHRoZSBwYWNraW5nIGNvZGUgbWF5IHN3YXAgZW5kcG9pbnRzIGlmIG5lZWRlZCB0byBwYWNrIHRoZSB3ZWlnaHRzLCB3aGljaCBpcyBsb3NzbGVzcyBmb3IgZGVjb2RpbmcgdG8gcGl4ZWxzCgkJYm9vbCBwYWNrX2JjNyhjb25zdCBsb2dfYmM3X2Jsb2NrJiBsb2dfYmxrLCB2b2lkKiBwUGh5c19ibG9jayk7CgoJCWJvb2wgY29tcGFyZV9ibG9ja19jb25maWdzKGNvbnN0IGxvZ19iYzdfYmxvY2smIGEsIGNvbnN0IGxvZ19iYzdfYmxvY2smIGIsIGJvb2wgY29tcGFyZV9wYXJ0aXRpb25faW5kZXggPSB0cnVlKTsgLy8gdHJ1ZSBpZiBhJ3MgbW9kZS9jb25maWcgbWF0Y2hlcyBiJ3MgKGV2ZXJ5dGhpbmcgRVhDRVBUIGVuZHBvaW50L3BiaXRzL3dlaWdodCkKCQkKCQlib29sIGNvbXBhcmVfYmxvY2tfZW5kcG9pbnRzKGNvbnN0IGxvZ19iYzdfYmxvY2smIGEsIGNvbnN0IGxvZ19iYzdfYmxvY2smIGIpOyAKCgkJYm9vbCBjb21wYXJlX2Jsb2NrX3BiaXRzKGNvbnN0IGxvZ19iYzdfYmxvY2smIGEsIGNvbnN0IGxvZ19iYzdfYmxvY2smIGIpOwoKCQlib29sIGNvbXBhcmVfYmxvY2tfd2VpZ2h0cyhjb25zdCBsb2dfYmM3X2Jsb2NrJiBhLCBjb25zdCBsb2dfYmM3X2Jsb2NrJiBiKTsKCgkJYm9vbCBjb21wYXJlX2Jsb2NrX2Z1bGwoY29uc3QgbG9nX2JjN19ibG9jayYgYSwgY29uc3QgbG9nX2JjN19ibG9jayYgYik7CgoJfSAvLyBuYW1lc3BhY2UgYmM3dQoKCW5hbWVzcGFjZSBiYzdmIAoJewoJCWVudW0KCQl7CgkJCS8vIExvdy1sZXZlbCBCQzcgZW5jb2RlciBjb25maWd1cmF0aW9uIGZsYWdzLgoJCQljUGFja0JDN0ZsYWdVc2UyU3Vic2V0c1JHQiA9IDEsIC8vIHVzZSBtb2RlIDEvMyBmb3IgUkdCIGJsb2NrcwoJCQljUGFja0JDN0ZsYWdVc2UyU3Vic2V0c1JHQkEgPSAyLCAvLyB1c2UgbW9kZSA3IGZvciBSR0JBIGJsb2NrcwoKCQkJY1BhY2tCQzdGbGFnVXNlM1N1YnNldHNSR0IgPSA0LCAvLyBhbHNvIHVzZSBtb2RlIDAvMiwgY1BhY2tCQzdGbGFnVXNlMlN1YnNldHNSR0IgTVVTVCBiZSBlbmFibGVkIHRvbwoKCQkJY1BhY2tCQzdGbGFnVXNlRHVhbFBsYW5lUkdCID0gOCwgLy8gZW5hYmxlIG1vZGUgNC81IHVzYWdlIGZvciBSR0IgYmxvY2tzCgkJCWNQYWNrQkM3RmxhZ1VzZUR1YWxQbGFuZVJHQkEgPSAxNiwgLy8gZW5hYmxlIG1vZGUgNC81IHVzYWdlIGZvciBSR0JBIGJsb2NrcwoKCQkJY1BhY2tCQzdGbGFnUEJpdE9wdCA9IDMyLCAvLyBlbmFibGUgdG8gZGlzYWJsZSB1c2FnZSBvZiBmaXhlZCBwLWJpdHMgb24gc29tZSBtb2Rlczsgc2xvd2VyCgkJCWNQYWNrQkM3RmxhZ1BCaXRPcHRNb2RlNiA9IDY0LCAvLyBlbmFibGUgdG8gZGlzYWJsZSB1c2FnZSBvZiBmaXhlZCBwLWJpdHMgb24gbW9kZSA2LCBhbHBoYSBvbiBmdWxseSBvcGFxdWUgYmxvY2tzIG1heSBiZSAyNTQgaG93ZXZlcjsgc2xvd2VyCgoJCQljUGFja0JDN0ZsYWdVc2VUcml2aWFsTW9kZTYgPSAxMjgsIC8vIGVuYWJsZSB0cml2aWFsIGZhc3QgbW9kZSA2IGVuY29kZXIgb24gYmxvY2tzIHdpdGggdmVyeSBsb3cgdmFyaWFuY2VzIChoaWdobHkgcmVjb21tZW5kZWQpCgoJCQljUGFja0JDN0ZsYWdQYXJ0aWFsbHlBbmFseXRpY2FsUkdCID0gMjU2LCAvLyBwYXJ0aWFsbHkgYW5hbHl0aWNhbCBtb2RlIGZvciBSR0IgYmxvY2tzLCBzbG93ZXIgYnV0IGhpZ2hlciBxdWFsaXR5LCBjb21wdXRlcyBhY3R1YWwgU1NFJ3Mgb24gY29tcGxleCBibG9ja3MgdG8gcmVzb2x2ZSB3aGljaCBtb2RlIHRvIHVzZSB2cy4gcHJlZGljdGlvbnMKCQkJY1BhY2tCQzdGbGFnUGFydGlhbGx5QW5hbHl0aWNhbFJHQkEgPSA1MTIsIC8vIHBhcnRpYWxseSBhbmFseXRpY2FsIG1vZGUgZm9yIFJHQkEgYmxvY2tzLCBzbG93ZXIgYnV0IGhpZ2hlciBxdWFsaXR5LCBjb21wdXRlcyBhY3R1YWwgU1NFJ3Mgb24gY29tcGxleCBibG9ja3MgdG8gcmVzb2x2ZSB3aGljaCBtb2RlIHRvIHVzZSB2cy4gcHJlZGljdGlvbnMKCgkJCS8vIE5vbi1hbmFseXRpY2FsIGlzIHJlYWxseSBzdGlsbCBwYXJ0aWFsbHkgYW5hbHl0aWNhbCBvbiB0aGUgbW9kZSBwYWlycyAoMCB2cy4gMiwgMSB2cyAzLCA0IHZzLiA1KS4KCQkJY1BhY2tCQzdGbGFnTm9uQW5hbHl0aWNhbFJHQiA9IDEwMjQsIC8vIHZlcnkgc2xvdy9icnV0ZSBmb3JjZSwgdG90YWxseSBhYnVzZXMgdGhlIGVuY29kZXIsIE1VU1QgdXNlIHdpdGggY1BhY2tCQzdGbGFnUGFydGlhbGx5QW5hbHl0aWNhbFJHQiBmbGFnCgkJCWNQYWNrQkM3RmxhZ05vbkFuYWx5dGljYWxSR0JBID0gMjA0OCwgLy8gdmVyeSBzbG93L2JydXRlIGZvcmNlLCB0b3RhbGx5IGFidXNlcyB0aGUgZW5jb2RlciwgTVVTVCB1c2Ugd2l0aCBjUGFja0JDN0ZsYWdQYXJ0aWFsbHlBbmFseXRpY2FsUkdCQSBmbGFnCgoJCQljUGFja0JDN0ZsYWdBU1RDQ29tcGF0aWJsZSA9IDQwOTYsIC8vIGRpc2FsbG93IDIvMyBwYXJ0aXRpb24gcGF0dGVybnMgbm90IGluIGNvbW1vbiB3aXRoIEFTVEMgTERSIDR4NAoKCQkJY1BhY2tCQzdGbGFnRGlzYWJsZVJHQkR1YWxQbGFuZSA9IDgxOTIsIC8vIGRvbid0IHVzZSBSR0IgZHVhbCBwbGFuZSBjaGFubmVscyAoYnV0IEEgaXMgT0spCgoJCQkvLyBEZWZhdWx0IHRvIHVzZSBmaXJzdDoKCgkJCS8vIERlY2VudCBhbmFseXRpY2FsIEJDNyBkZWZhdWx0cwoJCQljUGFja0JDN0ZsYWdEZWZhdWx0RmFzdGVzdCA9IGNQYWNrQkM3RmxhZ1VzZVRyaXZpYWxNb2RlNiwgLy8gdmVyeSB3ZWFrIHBhcnRpY3VsYXJseSBvbiBhbHBoYSwgbW9kZSA2IG9ubHkgZm9yIFJHQi9SR0JBLCAKCgkJCS8vIE1vZGUgNiB3aXRoIHBiaXRzIGZvciBSR0IsIE1vZGVzIDQsNSw2IGZvciBhbHBoYS4KCQkJY1BhY2tCQzdGbGFnRGVmYXVsdEZhc3RlciA9IGNQYWNrQkM3RmxhZ1BCaXRPcHQgfCBjUGFja0JDN0ZsYWdVc2VEdWFsUGxhbmVSR0JBIHwgY1BhY2tCQzdGbGFnVXNlVHJpdmlhbE1vZGU2LAoKCQkJY1BhY2tCQzdGbGFnRGVmYXVsdEZhc3QgPSBjUGFja0JDN0ZsYWdVc2UyU3Vic2V0c1JHQiB8IGNQYWNrQkM3RmxhZ1VzZTJTdWJzZXRzUkdCQSB8IGNQYWNrQkM3RmxhZ1VzZUR1YWxQbGFuZVJHQkEgfAoJCQkJY1BhY2tCQzdGbGFnUEJpdE9wdCB8IGNQYWNrQkM3RmxhZ1VzZVRyaXZpYWxNb2RlNiwKCgkJCS8vIFJlYXNvbmFibGUgZGVmYXVsdHMsIGJ1dCBub3QgaGlnaGVzdCBxdWFsaXR5IGJ1dCBmYXN0CgkJCWNQYWNrQkM3RmxhZ0RlZmF1bHQgPSAoY1BhY2tCQzdGbGFnVXNlMlN1YnNldHNSR0IgfCBjUGFja0JDN0ZsYWdVc2UyU3Vic2V0c1JHQkEgfCBjUGFja0JDN0ZsYWdVc2UzU3Vic2V0c1JHQikgfAoJCQkJKGNQYWNrQkM3RmxhZ1VzZUR1YWxQbGFuZVJHQiB8IGNQYWNrQkM3RmxhZ1VzZUR1YWxQbGFuZVJHQkEpIHwKCQkJCShjUGFja0JDN0ZsYWdQQml0T3B0IHwgY1BhY2tCQzdGbGFnUEJpdE9wdE1vZGU2KSB8CgkJCQljUGFja0JDN0ZsYWdVc2VUcml2aWFsTW9kZTYsCgoJCQkvLyBEZWZhdWx0IHBhcnRpYWxseSBhbmFseXRpY2FsIEJDNyBkZWZhdWx0cyAoc2xvd2VyKQoJCQljUGFja0JDN0ZsYWdEZWZhdWx0UGFydGlhbGx5QW5hbHl0aWNhbCA9IGNQYWNrQkM3RmxhZ0RlZmF1bHQgfCAoY1BhY2tCQzdGbGFnUGFydGlhbGx5QW5hbHl0aWNhbFJHQiB8IGNQYWNrQkM3RmxhZ1BhcnRpYWxseUFuYWx5dGljYWxSR0JBKSwKCgkJCS8vIERlZmF1bHQgbm9uLWFuYWx5dGljYWwgQkM3IGRlZmF1bHRzICh2ZXJ5IHNsb3cpLiBJbiByZWFsaXR5IHRoZSBlbmNvZGVyIGlzIHN0aWxsIGFuYWx5dGljYWwgb24gdGhlIG1vZGUgcGFpcnMsIGJ1dCBhdCB0aGUgaGlnaGVzdCBsZXZlbCBpcyBub24tYW5hbHl0aWNhbC4KCQkJY1BhY2tCQzdGbGFnRGVmYXVsdE5vbkFuYWx5dGljYWwgPSAoY1BhY2tCQzdGbGFnRGVmYXVsdFBhcnRpYWxseUFuYWx5dGljYWwgfCAoY1BhY2tCQzdGbGFnTm9uQW5hbHl0aWNhbFJHQiB8IGNQYWNrQkM3RmxhZ05vbkFuYWx5dGljYWxSR0JBKSkgJiB+Y1BhY2tCQzdGbGFnVXNlVHJpdmlhbE1vZGU2CgkJfTsKCgkJdm9pZCBpbml0KCk7CgkJCgkJLy8gQXN1bWVzIGJsb2NrIGhhcyBOTyBBTFBIQS4KCQl2b2lkIGZhc3RfcGFja19iYzdfcmdiX2FuYWx5dGljYWwodWludDhfdCogcEJsb2NrLCBjb25zdCBjb2xvcl9yZ2JhKiBwUGl4ZWxzLCB1aW50MzJfdCBmbGFncyk7CgkJdWludDMyX3QgZmFzdF9wYWNrX2JjN19yZ2JfcGFydGlhbF9hbmFseXRpY2FsKHVpbnQ4X3QqIHBCbG9jaywgY29uc3QgY29sb3JfcmdiYSogcFBpeGVscywgdWludDMyX3QgZmxhZ3MpOwoKCQkvLyBBc3N1bWVzIGJsb2NrIEhBUyBBTFBIQTogSW1wb3J0YW50bHksIG5vdGUgaWYgdGhlIGJsb2NrIGRvZXNuJ3QgYWN0dWFsbHkgaGF2ZSBhbHBoYSwgdGhpcyBpc24ndCB3aGF0IHlvdSB3YW50IGJlY2F1c2UgaXQgd29uJ3QgdXRpbGl6ZSB0aGUgMi0zIHN1YnNldCBSR0IgY29uZmlncy4KCQl2b2lkIGZhc3RfcGFja19iYzdfcmdiYV9hbmFseXRpY2FsKHVpbnQ4X3QqIHBCbG9jaywgY29uc3QgY29sb3JfcmdiYSogcFBpeGVscywgdWludDMyX3QgZmxhZ3MpOwoJCXVpbnQzMl90IGZhc3RfcGFja19iYzdfcmdiYV9wYXJ0aWFsX2FuYWx5dGljYWwodWludDhfdCogcEJsb2NrLCBjb25zdCBjb2xvcl9yZ2JhKiBwUGl4ZWxzLCB1aW50MzJfdCBmbGFncyk7CgkJCgkJLy8gQXV0b21hdGljYWxseSBkZXRlcm1pbmVzIGlmIHRoZSBibG9jayBoYXMgYWxwaGEgYW5kIGRpc3BhdGNoZXMgdG8gdGhlIGFwcHJvcHJpYXRlIGZ1bmN0aW9uIChSR0IgdnMuIFJHQkEpLgoJCS8vIGJhc2lzdTo6Y3JlYXRlX2JjN19kZWJ1Z19pbWFnZXMoKSBjYW4gYmUgdXNlZCB0byBwcmludCBhbmQgdmlzdWFsaXplIEJDNyBjb25maWcgc3RhdGlzdGljcy4KCQl1aW50MzJfdCBmYXN0X3BhY2tfYmM3X2F1dG9fcmdiYSh1aW50OF90KiBwQmxvY2ssIGNvbnN0IGNvbG9yX3JnYmEqIHBQaXhlbHMsIHVpbnQzMl90IGZsYWdzKTsKCgkJdm9pZCBwcmludF9wZXJmX3N0YXRzKCk7CgoJCWJvb2wgZmFzdF9wYWNrX2FzdGMoYXN0Y19oZWxwZXJzOjpsb2dfYXN0Y19ibG9jayYgbG9nX2JsaywgY29uc3QgY29sb3JfcmdiYSogcFBpeGVscywgdWludDMyX3QgYmM3Zl9vdmVycmlkZV9mbGFncyA9IDApOwoJCWJvb2wgZmFzdF9wYWNrX2FzdGMoY29uc3QgYmFzaXN0OjpiYzdfYmxvY2smIHBoeXNfYmM3X2Jsb2NrLCBhc3RjX2hlbHBlcnM6OmxvZ19hc3RjX2Jsb2NrJiBsb2dfYmxrLCBjb25zdCBjb2xvcl9yZ2JhKiBwUGl4ZWxzKTsgLy8gcFBpeGVscyBtYXkgYmUgbnVsbHB0cgoJCWJvb2wgZmFzdF9wYWNrX2FzdGModm9pZCogcEFTVENfYmxvY2ssIGNvbnN0IGNvbG9yX3JnYmEqIHBQaXhlbHMsIHVpbnQzMl90IGJjN2Zfb3ZlcnJpZGVfZmxhZ3MgPSAwKTsKCgkJYm9vbCBmYXN0X3BhY2tfYXN0Yyhhc3RjX2hlbHBlcnM6OmxvZ19hc3RjX2Jsb2NrJiBsb2dfYXN0Y19ibGssIGNvbnN0IGJhc2lzdDo6YmM3X2Jsb2NrJiBwaHlzX2JjN19ibG9jaywgdWludDMyX3QgYmM3Zl9vdmVycmlkZV9mbGFncyA9IDApOwoJCWJvb2wgZmFzdF9wYWNrX2FzdGModm9pZCogcEFTVENfYmxvY2ssIGNvbnN0IGJhc2lzdDo6YmM3X2Jsb2NrJiBwaHlzX2JjN19ibG9jaywgdWludDMyX3QgYmM3Zl9vdmVycmlkZV9mbGFncyA9IDApOwoJCQkJCgkJdWludDMyX3QgY2FsY19zc2UoY29uc3QgdWludDhfdCogcEJsb2NrLCBjb25zdCBjb2xvcl9yZ2JhKiBwUGl4ZWxzKTsKCgl9IC8vIG5hbWVzcGFjZSBiYzdmCgoJbmFtZXNwYWNlIGV0YzFmCgl7CgkJc3RydWN0IHBhY2tfZXRjMV9zdGF0ZQoJCXsKCQkJdWludDY0X3QgbV9wcmV2X3NvbGlkX2Jsb2NrOwoJCQkvL2RlY29kZXJfZXRjX2Jsb2NrIG1fcHJldl9zb2xpZF9ibG9jazsKCgkJCWludCBtX3ByZXZfc29saWRfcjg7CgkJCWludCBtX3ByZXZfc29saWRfZzg7CgkJCWludCBtX3ByZXZfc29saWRfYjg7CgoJCQlwYWNrX2V0YzFfc3RhdGUoKQoJCQl7CgkJCQljbGVhcigpOwoJCQl9CgoJCQl2b2lkIGNsZWFyKCkKCQkJewoJCQkJbV9wcmV2X3NvbGlkX3I4ID0gLTE7CgkJCQltX3ByZXZfc29saWRfZzggPSAtMTsKCQkJCW1fcHJldl9zb2xpZF9iOCA9IC0xOwoJCQl9CgkJfTsKCgkJdm9pZCBpbml0KCk7CgoJCXZvaWQgcGFja19ldGMxX3NvbGlkKHVpbnQ4X3QqIHBCbG9jaywgY29uc3QgY29sb3JfcmdiYSYgY29sb3IsIHBhY2tfZXRjMV9zdGF0ZSYgc3RhdGUsIGJvb2wgaW5pdF9mbGFnID0gZmFsc2UpOwoKCQl2b2lkIHBhY2tfZXRjMSh1aW50OF90KiBwQmxvY2ssIGNvbnN0IGNvbG9yX3JnYmEqIHBQaXhlbHMsIHBhY2tfZXRjMV9zdGF0ZSYgc3RhdGUpOwoJCQoJCXZvaWQgcGFja19ldGMxX2dyYXlzY2FsZSh1aW50OF90KiBwQmxvY2ssIGNvbnN0IHVpbnQ4X3QqIHBQaXhlbHMsIHBhY2tfZXRjMV9zdGF0ZSYgc3RhdGUpOwoKCX0gLy8gbmFtZXNwYWNlIGV0YzFmCiNlbmRpZiAvLyBCQVNJU0RfU1VQUE9SVF9YVUFTVEMKCgkvLyBQcml2YXRlL2ludGVybmFsIFhVQVNUQyBMRFIgdHJhbnNjb2RpbmcgaGVscGVycwoKCS8vIFhVQVNUQyBMRFIgZm9ybWF0cyBvbmx5CgllbnVtIGNsYXNzIHRyYW5zY29kZXJfdGV4dHVyZV9mb3JtYXQ7CglibG9ja19mb3JtYXQgeHVhc3RjX2dldF9ibG9ja19mb3JtYXQodHJhbnNjb2Rlcl90ZXh0dXJlX2Zvcm1hdCB0ZXhfZm10KTsKCiNpZiBCQVNJU0RfU1VQUE9SVF9YVUFTVEMKCS8vIExvdy1xdWFsaXR5LCBidXQgZmFzdCwgUFZSVEMxIFJHQi9SR0JBIGVuY29kZXIuIFBvd2VyIG9mIDIgdGV4dHVyZSBkaW1lbnNpb25zIHJlcXVpcmVkLgoJLy8gTm90ZTogTm90IHlldCBwYXJ0IG9mIG91ciBwdWJsaWMgQVBJOiB0aGlzIEFQSSBtYXkgY2hhbmdlISAKCXZvaWQgZW5jb2RlX3B2cnRjMSgKCQlibG9ja19mb3JtYXQgZm10LCB2b2lkKiBwRHN0X2Jsb2NrcywKCQljb25zdCBiYXNpc3U6OnZlY3RvcjJEPGNvbG9yMzI+JiB0ZW1wX2ltYWdlLAoJCXVpbnQzMl90IGRzdF9udW1fYmxvY2tzX3gsIHVpbnQzMl90IGRzdF9udW1fYmxvY2tzX3ksIGJvb2wgZnJvbV9hbHBoYSk7CgkJCglib29sIHRyYW5zY29kZV80eDRfYmxvY2soCgkJYmxvY2tfZm9ybWF0IGZtdCwgLy8gZGVzaXJlZCBvdXRwdXQgYmxvY2sgZm9ybWF0CgkJdWludDMyX3QgYmxvY2tfeCwgdWludDMyX3QgYmxvY2tfeSwgLy8gNHg0IGJsb2NrIGJlaW5nIHByb2Nlc3NlZAoJCXZvaWQqIHBEc3RfYmxvY2tzLCAvLyBiYXNlIHBvaW50ZXIgdG8gb3V0cHV0IGJ1ZmZlci9iaXRtYXAKCQl1aW50OF90KiBwRHN0X2Jsb2NrX3U4LCAvLyBwb2ludGVyIHRvIG91dHB1dCBibG9jay9vciBmaXJzdCBwaXhlbCB0byB3cml0ZQoJCWNvbnN0IGNvbG9yMzIqIGJsb2NrX3BpeGVscywgLy8gcG9pbnRlciB0byA0eDQgKDE2KSAzMmJwcCBSR0JBIHBpeGVscwoJCXVpbnQzMl90IG91dHB1dF9ibG9ja19vcl9waXhlbF9zdHJpZGVfaW5fYnl0ZXMsIHVpbnQzMl90IG91dHB1dF9yb3dfcGl0Y2hfaW5fYmxvY2tzX29yX3BpeGVscywgdWludDMyX3Qgb3V0cHV0X3Jvd3NfaW5fcGl4ZWxzLCAvLyBvdXRwdXQgYnVmZmVyIGRpbWVuc2lvbnMKCQlpbnQgY2hhbm5lbDAsIGludCBjaGFubmVsMSwgLy8gY2hhbm5lbHMgdG8gcHJvY2VzcywgdXNlZCBieSBzb21lIGJsb2NrIGZvcm1hdHMKCQlib29sIGhpZ2hfcXVhbGl0eSwgYm9vbCBmcm9tX2FscGhhLAkvLyBGbGFncyBzcGVjaWZpYyB0byBjZXJ0YWluIGJsb2NrIGZvcm1hdHMKCQl1aW50MzJfdCBiYzdmX2ZsYWdzLCAvLyBSZWFsLXRpbWUgYmM3ZiBCQzcgZW5jb2RlciBmbGFncywgc2VlIGJjN2Y6OmNQYWNrQkM3RmxhZ0RlZmF1bHQgZXRjLgoJCWV0YzFmOjpwYWNrX2V0YzFfc3RhdGUmIGV0YzFfcGFja19zdGF0ZSwgIC8vIGV0YzFmIHRocmVhZCBsb2NhbCBzdGF0ZQoJCWludCBoYXNfYWxwaGEgPSAtMSk7IC8vIGhhc19hbHBoYSA9IC0xIHVua25vd24sIDA9ZGVmaW5pdGVseSBubyAoYSBhbGwgMjU1J3MpLCAxPXBvdGVudGlhbGx5IHllcwojZW5kaWYgLy8gQkFTSVNEX1NVUFBPUlRfWFVBU1RDCgoJc3RydWN0IGJjN19tb2RlXzUKCXsKCQl1bmlvbgoJCXsKCQkJc3RydWN0CgkJCXsKCQkJCXVpbnQ2NF90IG1fbW9kZSA6IDY7CgkJCQl1aW50NjRfdCBtX3JvdCA6IDI7CgoJCQkJdWludDY0X3QgbV9yMCA6IDc7CgkJCQl1aW50NjRfdCBtX3IxIDogNzsKCQkJCXVpbnQ2NF90IG1fZzAgOiA3OwoJCQkJdWludDY0X3QgbV9nMSA6IDc7CgkJCQl1aW50NjRfdCBtX2IwIDogNzsKCQkJCXVpbnQ2NF90IG1fYjEgOiA3OwoJCQkJdWludDY0X3QgbV9hMCA6IDg7CgkJCQl1aW50NjRfdCBtX2ExXzAgOiA2OwoKCQkJfSBtX2xvOwoKCQkJdWludDY0X3QgbV9sb19iaXRzOwoJCX07CgoJCXVuaW9uCgkJewoJCQlzdHJ1Y3QKCQkJewoJCQkJdWludDY0X3QgbV9hMV8xIDogMjsKCgkJCQkvLyBiaXQgMgoJCQkJdWludDY0X3QgbV9jMDAgOiAxOwoJCQkJdWludDY0X3QgbV9jMTAgOiAyOwoJCQkJdWludDY0X3QgbV9jMjAgOiAyOwoJCQkJdWludDY0X3QgbV9jMzAgOiAyOwoKCQkJCXVpbnQ2NF90IG1fYzAxIDogMjsKCQkJCXVpbnQ2NF90IG1fYzExIDogMjsKCQkJCXVpbnQ2NF90IG1fYzIxIDogMjsKCQkJCXVpbnQ2NF90IG1fYzMxIDogMjsKCgkJCQl1aW50NjRfdCBtX2MwMiA6IDI7CgkJCQl1aW50NjRfdCBtX2MxMiA6IDI7CgkJCQl1aW50NjRfdCBtX2MyMiA6IDI7CgkJCQl1aW50NjRfdCBtX2MzMiA6IDI7CgoJCQkJdWludDY0X3QgbV9jMDMgOiAyOwoJCQkJdWludDY0X3QgbV9jMTMgOiAyOwoJCQkJdWludDY0X3QgbV9jMjMgOiAyOwoJCQkJdWludDY0X3QgbV9jMzMgOiAyOwoKCQkJCS8vIGJpdCAzMwoJCQkJdWludDY0X3QgbV9hMDAgOiAxOwoJCQkJdWludDY0X3QgbV9hMTAgOiAyOwoJCQkJdWludDY0X3QgbV9hMjAgOiAyOwoJCQkJdWludDY0X3QgbV9hMzAgOiAyOwoKCQkJCXVpbnQ2NF90IG1fYTAxIDogMjsKCQkJCXVpbnQ2NF90IG1fYTExIDogMjsKCQkJCXVpbnQ2NF90IG1fYTIxIDogMjsKCQkJCXVpbnQ2NF90IG1fYTMxIDogMjsKCgkJCQl1aW50NjRfdCBtX2EwMiA6IDI7CgkJCQl1aW50NjRfdCBtX2ExMiA6IDI7CgkJCQl1aW50NjRfdCBtX2EyMiA6IDI7CgkJCQl1aW50NjRfdCBtX2EzMiA6IDI7CgoJCQkJdWludDY0X3QgbV9hMDMgOiAyOwoJCQkJdWludDY0X3QgbV9hMTMgOiAyOwoJCQkJdWludDY0X3QgbV9hMjMgOiAyOwoJCQkJdWludDY0X3QgbV9hMzMgOiAyOwoKCQkJfSBtX2hpOwoKCQkJdWludDY0X3QgbV9oaV9iaXRzOwoJCX07Cgl9OwoKCS8vIC0tLS0tLS0tLS0tLS0tLS0gRml4ZWQtcG9pbnQgbWF0aCBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0KCS8vIE1vdmVkIGhlcmUgZnJvbSBlbmNvZGVyL2Jhc2lzdV9tYXRoLmggKHdhcyBuYW1lc3BhY2UgYnVfbWF0aCkgc28gdGhlCgkvLyB0cmFuc2NvZGVyICsgWEJDNyBkZWNvZGUgcGF0aCBjYW4gdXNlIHRoZW0uIFB1cmUgaW50ZWdlciBRKDMxLUZSQUMpLkZSQUM7CgkvLyBubyBlbmNvZGVyIGRlcGVuZGVuY2llcy4gVGhlIHNlbGYtdGVzdCBzdGlsbCBsaXZlcyBpbiBiYXNpc3VfbWF0aC5oLgoJbmFtZXNwYWNlIGZpeGVkX2RldGFpbAoJewoJCWNvbnN0ZXhwciBpbnQgY2x6NjQodWludDY0X3QgeCkgICAvLyB4ICE9IDAKCQl7CiNpZiAoZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX2NsYW5nX18pKSAmJiAhZGVmaW5lZChGSVhFRF9QT1JUQUJMRV9DTFopCgkJCXJldHVybiBfX2J1aWx0aW5fY2x6bGwoeCk7CiNlbHNlCgkJCS8vIFBvcnRhYmxlIGNvbnN0ZXhwciBiaW5hcnkgc2VhcmNoICg2IGNvbXBhcmVzKS4gVXNlZCBieSBNU1ZDIG9uCgkJCS8vIHg4NiAvIHg2NCAvIEFSTSAvIEFSTTY0OiB0aGUgX0JpdFNjYW5SZXZlcnNlIGludHJpbnNpY3MgYXJlIG5vdAoJCQkvLyB1c2FibGUgaW4gY29uc3RleHByLCBhbmQgQysrMTcgaGFzIG5vIGlzX2NvbnN0YW50X2V2YWx1YXRlZCgpIHRvCgkJCS8vIHNwbGl0IGNvbXBpbGUtdGltZSBmcm9tIHJ1bnRpbWUsIHNvIG9uZSBzdGFuZGFyZC1DKysgcGF0aCBzZXJ2ZXMKCQkJLy8gYm90aC4gKElmIHlvdSBtb3ZlIHRvIC9zdGQ6YysrMjAgeW91IGNvdWxkIHJvdXRlIHRoZSBydW50aW1lIHBhdGgKCQkJLy8gdGhyb3VnaCB0aGUgaW50cmluc2ljczsgdGhlIGdhaW4gaXMgbWlub3IgbmV4dCB0byB0aGUgZGl2aWRlLikKCQkJaW50IG4gPSAwOwoJCQlpZiAoeCA8PSAweDAwMDAwMDAwRkZGRkZGRkZ1bGwpIHsgbiArPSAzMjsgeCA8PD0gMzI7IH0KCQkJaWYgKHggPD0gMHgwMDAwRkZGRkZGRkZGRkZGdWxsKSB7IG4gKz0gMTY7IHggPDw9IDE2OyB9CgkJCWlmICh4IDw9IDB4MDBGRkZGRkZGRkZGRkZGRnVsbCkgeyBuICs9IDg7IHggPDw9IDg7IH0KCQkJaWYgKHggPD0gMHgwRkZGRkZGRkZGRkZGRkZGdWxsKSB7IG4gKz0gNDsgeCA8PD0gNDsgfQoJCQlpZiAoeCA8PSAweDNGRkZGRkZGRkZGRkZGRkZ1bGwpIHsgbiArPSAyOyB4IDw8PSAyOyB9CgkJCWlmICh4IDw9IDB4N0ZGRkZGRkZGRkZGRkZGRnVsbCkgeyBuICs9IDE7IH0KCQkJcmV0dXJuIG47CiNlbmRpZgoJCX0KCgkJY29uc3RleHByIHVpbnQ2NF90IGlzcXJ0X2Zsb29yKHVpbnQ2NF90IHgpICAgLy8gZXhhY3QgZmxvb3Ioc3FydCh4KSkKCQl7CgkJCWlmICh4ID09IDApIHJldHVybiAwOwoJCQl1aW50NjRfdCByID0gMDsKCQkJdWludDY0X3QgYml0ID0gdWludDY0X3QoMSkgPDwgKCg2MyAtIGNsejY0KHgpKSAmIH4xKTsKCQkJd2hpbGUgKGJpdCkgewoJCQkJY29uc3QgdWludDY0X3QgdCA9IHIgKyBiaXQ7CgkJCQljb25zdCB1aW50NjRfdCBtYXNrID0gdWludDY0X3QoMCkgLSB1aW50NjRfdCh4ID49IHQpOwoJCQkJeCAtPSB0ICYgbWFzazsKCQkJCXIgPSAociA+PiAxKSArIChiaXQgJiBtYXNrKTsKCQkJCWJpdCA+Pj0gMjsKCQkJfQoJCQlyZXR1cm4gcjsKCQl9CgoJCS8vIFNlZWQgdGFibGUgZm9yIHNxcnRfZmFzdDogZW50cnkgaSB+IHNxcnQoKGkgKyAwLjUpICogMl41NykgZm9yIHRoZQoJCS8vIG5vcm1hbGl6ZWQgYXJndW1lbnQgWCBpbiBbMl42MiwgMl42NCksIGluZGV4ZWQgYnkgaXRzIHRvcCA3IGJpdHMuCgkJLy8gSW5kZXggPSBYID4+IDU3LCBhbmQgWCA+PSAyXjYyIG1lYW5zIHRoZSBpbmRleCBpcyBhbHdheXMgPj0gMzIsIHNvCgkJLy8gZW50cmllcyBbMCwgMzFdIGFyZSB1bnJlYWNoYWJsZTsgdGhleSBzdGF5IHplcm8taW5pdGlhbGl6ZWQsIHdoaWNoCgkJLy8gZmFpbHMgbG91ZGx5IChkaXZpZGUgYnkgemVybyBpbiB0aGUgTmV3dG9uIHN0ZXApIGlmIHRoZSBub3JtYWxpemF0aW9uCgkJLy8gaXMgZXZlciBicm9rZW4uIEJ1cm5pbmcgMzIgc2xvdHMgYmVhdHMgYSBzdWJ0cmFjdCBpbiB0aGUgaG90IHBhdGguCgkJLy8gRlJBQ19CSVRTLWluZGVwZW5kZW50LCBidWlsdCBhdCBjb21waWxlIHRpbWUgZnJvbSB0aGUgZXhhY3QgaXNxcnQuCgkJc3RydWN0IHNxcnRfbHV0X3QgeyB1aW50MzJfdCBlWzEyOF07IH07CgkJY29uc3RleHByIHNxcnRfbHV0X3QgbWFrZV9zcXJ0X2x1dCgpCgkJewoJCQlzcXJ0X2x1dF90IGx7fTsKCQkJZm9yIChpbnQgaSA9IDMyOyBpIDwgMTI4OyBpKyspICAgLy8gWCA+PSAyXjYyIC0+IGluZGV4ID49IDMyCgkJCQlsLmVbaV0gPSB1aW50MzJfdCgyICogaXNxcnRfZmxvb3IodWludDY0X3QoMiAqIGkgKyAxKSA8PCA1NCkpOwoJCQlyZXR1cm4gbDsKCQl9CgkJaW5saW5lIGNvbnN0ZXhwciBzcXJ0X2x1dF90IFNRUlRfTFVUID0gbWFrZV9zcXJ0X2x1dCgpOwoJfQoKCS8vIEMrKzE3IGZpeGVkLXBvaW50IG51bWJlciwgUSgzMS1GUkFDX0JJVFMpLkZSQUNfQklUUyBzaWduZWQgZm9ybWF0LgoJLy8gRnVsbHkgY29uc3RleHByOiBjb25zdGFudHMgY2FuIGJlIGJ1aWx0IGF0IGNvbXBpbGUgdGltZSwgZS5nLgoJLy8gICBjb25zdGV4cHIgYXV0byBQSSA9IGZpeGVkPDE2Pjo6ZnJvbV9mbG9hdCgzLjE0MTU5MjY1Zik7CgkvLyBSb3VuZGluZyBjb252ZW50aW9uIGV2ZXJ5d2hlcmU6IHJvdW5kIGhhbGYgYXdheSBmcm9tIHplcm8KCS8vIChtYXRjaGVzIHRoZSBvcmlnaW5hbCByb3VuZF90b19pbnQgLyBvcGVyYXRvciogYmVoYXZpb3VyKS4KCS8vCgkvLyBEZWJ1ZyBidWlsZHMgKE5ERUJVRyBub3QgZGVmaW5lZCkgYXNzZXJ0IG9uOgoJLy8gICAtIGFyaXRobWV0aWMgb3ZlcmZsb3cgb2YgdGhlIGludDMyX3QgcmVzdWx0ICgrLCAtLCAqLCAvLCBzY2FsaW5nLAoJLy8gICAgIGZyb21faW50LCBmcm9tX2Zsb2F0L2RvdWJsZSwgY2VpbCwgPDwpCgkvLyAgIC0gZGl2aXNpb24gYnkgemVybyAoZml4ZWQgb3IgaW50ZWdlciBkaXZpc29yKQoJLy8gICAtIG91dC1vZi1yYW5nZSBzaGlmdCBjb3VudHMKCS8vICAgLSBJTlQzMl9NSU4gcGFzc2VkIHRvIG9wZXJhdG9yLSgpIG9yIGFicygpCgkvLyBJbiBjb25zdGV4cHIgZXZhbHVhdGlvbiBhIGZhaWxlZCBhc3NlcnQgaXMgYSBjb21waWxlIGVycm9yLgoJLy8gV2l0aCBOREVCVUcgdGhlIGFzc2VydHMgdmFuaXNoIGFuZCB0aGUgcHJlY29uZGl0aW9ucyBhcmUgdGhlCgkvLyBjYWxsZXIncyByZXNwb25zaWJpbGl0eSwgdW5jaGVja2VkLgoJLy8KCS8vIFBvcnRhYmlsaXR5IGFzc3VtcHRpb25zIChob2xkIG9uIGFsbCBtYWluc3RyZWFtIHRhcmdldHM6CgkvLyB4ODYveDY0LCBBUk0sIFJJU0MtViwgV0FTTSk6CgkvLyAgIC0gPj4gb24gbmVnYXRpdmUgc2lnbmVkIHZhbHVlcyBpcyBhbiBhcml0aG1ldGljIHNoaWZ0CgkvLyAgICAgKGltcGxlbWVudGF0aW9uLWRlZmluZWQgaW4gQysrMTcsIGd1YXJhbnRlZWQgaW4gQysrMjApLgoJLy8gICAtIFR3bydzIGNvbXBsZW1lbnQgcmVwcmVzZW50YXRpb24gKGZsb29yL2NlaWwvZnJhYyBiaXQgbWFza3MgcmVseSBvbiBpdDsKCS8vICAgICBndWFyYW50ZWVkIGluIEMrKzIwKS4KCXRlbXBsYXRlPGludCBGUkFDX0JJVFM+CglzdHJ1Y3QgZml4ZWQKCXsKCQlzdGF0aWNfYXNzZXJ0KEZSQUNfQklUUyA+IDAgJiYgRlJBQ19CSVRTIDwgMzEsICJGUkFDX0JJVFMgbXVzdCBiZSBpbiBbMSwgMzBdIik7CgoJCWludDMyX3QgdjsKCgkJc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IE9ORSA9IGludDMyX3QoMSkgPDwgRlJBQ19CSVRTOwoKCQkvLyAtLS0tIGNvbnN0cnVjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoJCWNvbnN0ZXhwciBmaXhlZCgpIDogdigwKSB7fQoKCQlzdGF0aWMgY29uc3RleHByIGZpeGVkIGZyb21fcmF3KGludDMyX3QgcmF3KSB7IHJldHVybiBmaXhlZChyYXcsIHJhd190YWd7fSk7IH0KCgkJc3RhdGljIGNvbnN0ZXhwciBmaXhlZCBmcm9tX2ludChpbnQzMl90IHgpCgkJewoJCQkvLyB4ICogT05FIGluc3RlYWQgb2YgeCA8PCBGUkFDX0JJVFM6IHNoaWZ0aW5nIG5lZ2F0aXZlcyBpcyBVQiB1bnRpbAoJCQkvLyBDKysyMCwgYW5kIHRoZSBtdWx0aXBseSBjb21waWxlcyB0byB0aGUgc2FtZSBzaGlmdCBhbnl3YXkuCgkJCXJldHVybiBmaXhlZChjaGVja2VkMzIoaW50NjRfdCh4KSAqIE9ORSksIHJhd190YWd7fSk7CgkJfQoKCQkvLyBDb21waWxlLXRpbWUgY2FwYWJsZTogZmxvYXQvZG91YmxlIGFyaXRobWV0aWMgYW5kIHRoZSBmbG9hdC0+aW50CgkJLy8gY29udmVyc2lvbiBhcmUgdmFsaWQgaW4gY29uc3RleHByIGFzIGxvbmcgYXMgdGhlIHZhbHVlIGZpdHMuCgkJc3RhdGljIGNvbnN0ZXhwciBmaXhlZCBmcm9tX2Zsb2F0KGZsb2F0IGYpIHsgcmV0dXJuIGZyb21fZG91YmxlKGRvdWJsZShmKSk7IH0KCgkJLy8gRm9yIGZpeGVkIGNvbnN0YW50cyB0aGF0IHNob3VsZCBiZSByZWFkYWJsZSBhcyBkZWNpbWFsIHZhbHVlcyB3aGlsZQoJCS8vIHN0aWxsIHVzaW5nIHRoZSByYXcgaW50ZWdlciBhcyB0aGUgc291cmNlIG9mIHRydXRoLiBEZWJ1ZyBidWlsZHMKCQkvLyByZXBhY2sgdGhlIGZsb2F0IHRvIHJhdyBmaXhlZC1wb2ludCBhbmQgdmVyaWZ5IGl0IG1hdGNoZXMgdGhlIHN1cHBsaWVkCgkJLy8gcmF3IHZhbHVlOyByZWxlYXNlIGJ1aWxkcyBpZ25vcmUgdGhlIGZsb2F0IGFyZ3VtZW50LgoJCXN0YXRpYyBjb25zdGV4cHIgZml4ZWQgZnJvbV9mbG9hdF9hbmRfcmF3KGZsb2F0IGYsIGludDMyX3QgcmF3KQoJCXsKI2lmbmRlZiBOREVCVUcKCQkJY29uc3QgaW50MzJfdCByZXBhY2tlZF9yYXcgPSBmcm9tX2Zsb2F0KGYpLnY7CgkJCWFzc2VydChyZXBhY2tlZF9yYXcgPT0gcmF3ICYmICJmaXhlZDogcmF3IGNvbnN0YW50IGRvZXMgbm90IG1hdGNoIGZsb2F0IHZhbHVlIik7CiNlbHNlCgkJCSh2b2lkKWY7CiNlbmRpZgoJCQlyZXR1cm4gZnJvbV9yYXcocmF3KTsKCQl9CgoJCXN0YXRpYyBjb25zdGV4cHIgZml4ZWQgZnJvbV9kb3VibGUoZG91YmxlIGQpCgkJewoJCQljb25zdCBkb3VibGUgc2NhbGVkID0gZCAqIGRvdWJsZShPTkUpICsgKGQgPj0gMC4wID8gMC41IDogLTAuNSk7CgkJCWFzc2VydChzY2FsZWQgPj0gZG91YmxlKElOVDMyX01JTikgJiYgc2NhbGVkIDw9IGRvdWJsZShJTlQzMl9NQVgpICYmCgkJCQkiZml4ZWQ6IGZyb21fZmxvYXQvZnJvbV9kb3VibGUgb3V0IG9mIHJhbmdlIik7CgkJCXJldHVybiBmaXhlZChpbnQzMl90KHNjYWxlZCksIHJhd190YWd7fSk7CgkJfQoKCQkvLyAtLS0tIGNvbnZlcnNpb24gb3V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCQljb25zdGV4cHIgZmxvYXQgIHRvX2Zsb2F0KCkgIGNvbnN0IHsgcmV0dXJuIGZsb2F0KHYpIC8gZmxvYXQoT05FKTsgfQoJCWNvbnN0ZXhwciBkb3VibGUgdG9fZG91YmxlKCkgY29uc3QgeyByZXR1cm4gZG91YmxlKHYpIC8gZG91YmxlKE9ORSk7IH0KCgkJY29uc3RleHByIGludDMyX3QgdG9faW50KCkgY29uc3QgICAgICAgICAgICAgICAgICAvLyB0cnVuY2F0ZSB0b3dhcmQgLWluZgoJCXsKCQkJcmV0dXJuIHYgPj4gRlJBQ19CSVRTOwoJCX0KCgkJY29uc3RleHByIGludDMyX3QgdHJ1bmNfdG9faW50KCkgY29uc3QgICAgICAgICAgICAvLyB0cnVuY2F0ZSB0b3dhcmQgMAoJCXsKCQkJLy8gQysrIGludGVnZXIgZGl2aXNpb24gdHJ1bmNhdGVzIHRvd2FyZCB6ZXJvOyBkZWZpbmVkIGZvciBuZWdhdGl2ZXMKCQkJLy8gYW5kIElOVDMyX01JTi1zYWZlIChubyBuZWdhdGlvbiBpbnZvbHZlZCkuCgkJCXJldHVybiB2IC8gT05FOwoJCX0KCgkJY29uc3RleHByIGludDMyX3Qgcm91bmRfdG9faW50KCkgY29uc3QgICAgICAgICAgICAvLyByb3VuZCBoYWxmIGF3YXkgZnJvbSAwCgkJewoJCQkvLyBXaWRlbiBiZWZvcmUgbmVnYXRpbmc6IC12IG92ZXJmbG93cyBmb3IgdiA9PSBJTlQzMl9NSU4uCgkJCWNvbnN0IGludDY0X3QgdyA9IHY7CgkJCXJldHVybiB3ID49IDAKCQkJCT8gaW50MzJfdCgodyArIChPTkUgPj4gMSkpID4+IEZSQUNfQklUUykKCQkJCTogLWludDMyX3QoKCgtdykgKyAoT05FID4+IDEpKSA+PiBGUkFDX0JJVFMpOwoJCX0KCgkJLy8gTXVsdGlwbHkgYnkgYiBhbmQgcm91bmQgdGhlIG1hdGhlbWF0aWNhbCBwcm9kdWN0IHRvIHRoZSBuZWFyZXN0CgkJLy8gaW50ZWdlciAoaGFsZiBhd2F5IGZyb20gemVybyksIGNvbXB1dGVkIGVudGlyZWx5IGluIDY0IGJpdHMgd2l0aCBOTwoJCS8vIGZpeGVkLXBvaW50IGludGVybWVkaWF0ZS4gVXNlIHRoaXMgd2hlbiAoKnRoaXMgKiBiKSBleGNlZWRzIHRoZSBmaXhlZAoJCS8vIHJhbmdlIGJ1dCB0aGUgcm91bmRlZCBJTlRFR0VSIHJlc3VsdCBpcyB3aGF0J3Mgd2FudGVkIGFueXdheSAoZS5nLgoJCS8vIHF1YW50aXphdGlvbiB0YWJsZXMgYXQgdmVyeSBsb3cgcXVhbGl0eTogYmFzZSAqIGxldmVsX3NjYWxlIGNhbiByZWFjaAoJCS8vIH40MTcwMCBhdCBxPTEsIGZhciBwYXN0IFExNS4xNiwgd2hpbGUgdGhlIGludCByZXN1bHQgaXMgZmluZSkuCgkJLy8KCQkvLyBUb3RhbCBmb3IgZml4ZWQxNl8xNjogdGhlIFEoMipGUkFDKSBwcm9kdWN0IG9mIGFueSB0d28gcmF3cyBpcwoJCS8vIDw9IDJeNjIgKGZpdHMgaW50NjQpLCBhbmQgdGhlIHJvdW5kZWQgaW50ZWdlciBvZiB0d28gUTE1LjE2IHZhbHVlcyBpcwoJCS8vIDw9IDJeMzAgKGZpdHMgaW50MzIpLiBGb3IgbG93LUZSQUMgZm9ybWF0cyB0aGUgaW50IHJlc3VsdCBjYW4gZXhjZWVkCgkJLy8gaW50MzIsIHNvIGl0IG5hcnJvd3MgdGhyb3VnaCBjaGVja2VkMzIgbGlrZSBldmVyeXRoaW5nIGVsc2UuCgkJY29uc3RleHByIGludDMyX3QgbXVsX3JvdW5kX3RvX2ludChmaXhlZCBiKSBjb25zdAoJCXsKCQkJY29uc3QgaW50NjRfdCBwID0gaW50NjRfdCh2KSAqIGludDY0X3QoYi52KTsgICAvLyBRKDIqRlJBQ19CSVRTKSwgZXhhY3QKCQkJcmV0dXJuIGNoZWNrZWQzMihyb3VuZGVkX3JzaGlmdChwLCAyICogRlJBQ19CSVRTKSk7CgkJfQoKCQkvLyAtLS0tIGFyaXRobWV0aWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCQljb25zdGV4cHIgZml4ZWQgb3BlcmF0b3IrKGZpeGVkIGIpIGNvbnN0CgkJewoJCQlyZXR1cm4gZnJvbV9yYXcoY2hlY2tlZDMyKGludDY0X3QodikgKyBpbnQ2NF90KGIudikpKTsKCQl9CgoJCWNvbnN0ZXhwciBmaXhlZCBvcGVyYXRvci0oZml4ZWQgYikgY29uc3QKCQl7CgkJCXJldHVybiBmcm9tX3JhdyhjaGVja2VkMzIoaW50NjRfdCh2KSAtIGludDY0X3QoYi52KSkpOwoJCX0KCgkJY29uc3RleHByIGZpeGVkIG9wZXJhdG9yLSgpIGNvbnN0CgkJewoJCQlhc3NlcnQodiAhPSBJTlQzMl9NSU4gJiYgImZpeGVkOiBuZWdhdGluZyBJTlQzMl9NSU4iKTsKCQkJcmV0dXJuIGZyb21fcmF3KC12KTsKCQl9CgoJCWNvbnN0ZXhwciBmaXhlZCBvcGVyYXRvcisoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQoKCQljb25zdGV4cHIgZml4ZWQgb3BlcmF0b3IqKGZpeGVkIGIpIGNvbnN0CgkJewoJCQlyZXR1cm4gZnJvbV9yYXcoY2hlY2tlZDMyKHJvdW5kZWRfcnNoaWZ0KGludDY0X3QodikgKiBpbnQ2NF90KGIudiksIEZSQUNfQklUUykpKTsKCQl9CgoJCWNvbnN0ZXhwciBmaXhlZCBvcGVyYXRvci8oZml4ZWQgYikgY29uc3QKCQl7CgkJCWFzc2VydChiLnYgIT0gMCAmJiAiZml4ZWQ6IGRpdmlzaW9uIGJ5IHplcm8iKTsKCQkJLy8gQ29tcHV0ZSB3aXRoIG9uZSBleHRyYSBiaXQgc28gd2UgY2FuIHJvdW5kIGhhbGYgYXdheSBmcm9tIHplcm8uCgkJCS8vIE11bHRpcGx5IGluc3RlYWQgb2YgbGVmdC1zaGlmdGluZyB2OiBzaGlmdGluZyBhIG5lZ2F0aXZlIHZhbHVlIGlzCgkJCS8vIFVCIHVudGlsIEMrKzIwLiB8dnwgKiAyXihGUkFDX0JJVFMrMSkgPD0gMl42MiwgZml0cyBpbiBpbnQ2NC4KCQkJY29uc3QgaW50NjRfdCBxID0gKGludDY0X3QodikgKiAoaW50NjRfdCgxKSA8PCAoRlJBQ19CSVRTICsgMSkpKSAvIGludDY0X3QoYi52KTsKCQkJcmV0dXJuIGZyb21fcmF3KGNoZWNrZWQzMihyb3VuZGVkX3JzaGlmdChxLCAxKSkpOwoJCX0KCgkJLy8gQ2hlYXAgc2NhbGluZyBieSBwbGFpbiBpbnRlZ2VycyAobm8gc2hpZnQvcHJlY2lzaW9uIGxvc3Mgb24gbXVsdGlwbHkpLgoJCWNvbnN0ZXhwciBmaXhlZCBvcGVyYXRvciooaW50MzJfdCBzKSBjb25zdAoJCXsKCQkJcmV0dXJuIGZyb21fcmF3KGNoZWNrZWQzMihpbnQ2NF90KHYpICogaW50NjRfdChzKSkpOwoJCX0KCgkJY29uc3RleHByIGZpeGVkIG9wZXJhdG9yLyhpbnQzMl90IHMpIGNvbnN0CgkJewoJCQlhc3NlcnQocyAhPSAwICYmICJmaXhlZDogZGl2aXNpb24gYnkgemVybyIpOwoJCQlyZXR1cm4gZnJvbV9yYXcocm91bmRlZF9kaXYodiwgcykpOwoJCX0KCgkJZnJpZW5kIGNvbnN0ZXhwciBmaXhlZCBvcGVyYXRvciooaW50MzJfdCBzLCBmaXhlZCBhKSB7IHJldHVybiBhICogczsgfQoKCQkvLyAtLS0tIHdpZGUgYWNjdW11bGF0ZSBwYXR0ZXJuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkvLyBGb3IgZG90IHByb2R1Y3RzIC8gZmlsdGVyczogc3VtIG11bF93aWRlKCkgcHJvZHVjdHMgaW4gYW4gaW50NjRfdCwgdGhlbgoJCS8vIGNvbnZlcnQgYmFjayB3aXRoIE9ORSByb3VuZGluZyB2aWEgZnJvbV9zdW0uIEZhciBmYXN0ZXIgdGhhbiByb3VuZGluZwoJCS8vIGV2ZXJ5IG11bHRpcGx5ICh2ZWN0b3JpemVzKSwgc2FtZSBhY2N1cmFjeSBpbiBwcmFjdGljZS4KCQljb25zdGV4cHIgaW50NjRfdCBtdWxfd2lkZShmaXhlZCBiKSBjb25zdCB7IHJldHVybiBpbnQ2NF90KHYpICogaW50NjRfdChiLnYpOyB9CgoJCXN0YXRpYyBjb25zdGV4cHIgZml4ZWQgZnJvbV9zdW0oaW50NjRfdCBzKSAgICAgIC8vIHMgaW4gUSgyKkZSQUNfQklUUykKCQl7CgkJCS8vIHxzfCBtdXN0IHN0YXkgYmVsb3cgfjJeNjIgKGFueSBzdW0gd2hvc2UgcmVzdWx0IGZpdHMgaW50MzIgZG9lcywgYnkKCQkJLy8gYSB3aWRlIG1hcmdpbik7IHRoZSByb3VuZGluZyBhZGQgaXRzZWxmIHdvdWxkIG92ZXJmbG93IGludDY0IGJleW9uZC4KCQkJcmV0dXJuIGZyb21fcmF3KGNoZWNrZWQzMihyb3VuZGVkX3JzaGlmdChzLCBGUkFDX0JJVFMpKSk7CgkJfQoKCQkvLyBhICsgKGIgLSBhKSp0LCByb3VuZGVkOyBkaWZmIGFuZCBwcm9kdWN0IGNvbXB1dGVkIGluIDY0LWJpdCBzbyBhbnkKCQkvLyByZXByZXNlbnRhYmxlIGEsIGIgYXJlIHNhZmUuIEV4YWN0IGF0IHQ9MCBhbmQgdD0xLiB0IGluIFswLDFdIGlzIGFsd2F5cwoJCS8vIHNhZmU7IGV4dHJhcG9sYXRpb24gaXMgZmluZSB3aGlsZSAoYi1hKSp0IGZpdHMgaW4gaW50NjQuCgkJc3RhdGljIGNvbnN0ZXhwciBmaXhlZCBsZXJwKGZpeGVkIGEsIGZpeGVkIGIsIGZpeGVkIHQpCgkJewoJCQlyZXR1cm4gZnJvbV9yYXcoY2hlY2tlZDMyKGEudiArIHJvdW5kZWRfcnNoaWZ0KChpbnQ2NF90KGIudikgLSBhLnYpICogdC52LCBGUkFDX0JJVFMpKSk7CgkJfQoKCQkvLyAtLS0tIGZhc3QgKHRydW5jYXRpbmcpIHZhcmlhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCS8vIFNraXAgdGhlIHJvdW5kLWhhbGYtYXdheS1mcm9tLXplcm8gd29yazogb25lIG11bHRpcGx5ICsgb25lIHNoaWZ0IChvcgoJCS8vIG9uZSBkaXZpZGUpLiBSZXN1bHQgZGlmZmVycyBmcm9tIHRoZSByb3VuZGluZyB2ZXJzaW9ucyBieSBhdCBtb3N0IDEgdWxwLgoJCS8vIE5vdGUgdGhlIHRydW5jYXRpb24gZGlyZWN0aW9ucyBkaWZmZXIsIGFzIGlzIGNvbnZlbnRpb25hbDoKCQkvLyAgIG11bF9mYXN0IHRydW5jYXRlcyB0b3dhcmQgLWluZiAoYXJpdGhtZXRpYyBzaGlmdCksCgkJLy8gICBkaXZfZmFzdCB0cnVuY2F0ZXMgdG93YXJkIHplcm8gKEMrKyBpbnRlZ2VyIGRpdmlzaW9uKS4KCgkJY29uc3RleHByIGZpeGVkIG11bF9mYXN0KGZpeGVkIGIpIGNvbnN0CgkJewoJCQlyZXR1cm4gZnJvbV9yYXcoY2hlY2tlZDMyKChpbnQ2NF90KHYpICogaW50NjRfdChiLnYpKSA+PiBGUkFDX0JJVFMpKTsKCQl9CgoJCWNvbnN0ZXhwciBmaXhlZCBkaXZfZmFzdChmaXhlZCBiKSBjb25zdAoJCXsKCQkJYXNzZXJ0KGIudiAhPSAwICYmICJmaXhlZDogZGl2aXNpb24gYnkgemVybyIpOwoJCQlyZXR1cm4gZnJvbV9yYXcoY2hlY2tlZDMyKChpbnQ2NF90KHYpICogT05FKSAvIGludDY0X3QoYi52KSkpOwoJCX0KCgkJY29uc3RleHByIGZpeGVkIGRpdl9mYXN0KGludDMyX3QgcykgY29uc3QKCQl7CgkJCWFzc2VydChzICE9IDAgJiYgImZpeGVkOiBkaXZpc2lvbiBieSB6ZXJvIik7CgkJCS8vIHRoZSBvbmUgaW5wdXQgcGFpciB3aGVyZSAzMi1iaXQgZGl2aXNpb24gaXRzZWxmIG92ZXJmbG93cyAoVUIvdHJhcCkKCQkJYXNzZXJ0KCEodiA9PSBJTlQzMl9NSU4gJiYgcyA9PSAtMSkgJiYgImZpeGVkOiBvdmVyZmxvdyIpOwoJCQlyZXR1cm4gZnJvbV9yYXcodiAvIHMpOwoJCX0KCgkJLy8gTXVsdGlwbHkgaW5zdGVhZCBvZiA8PDogbGVmdC1zaGlmdGluZyBhIG5lZ2F0aXZlIHZhbHVlIGlzIFVCIHVudGlsIEMrKzIwLgoJCWNvbnN0ZXhwciBmaXhlZCBvcGVyYXRvcjw8KGludCBzKSBjb25zdAoJCXsKCQkJYXNzZXJ0KHMgPj0gMCAmJiBzIDwgMzEgJiYgImZpeGVkOiBzaGlmdCBjb3VudCBvdXQgb2YgcmFuZ2UiKTsKCQkJcmV0dXJuIGZyb21fcmF3KGNoZWNrZWQzMihpbnQ2NF90KHYpICogKGludDY0X3QoMSkgPDwgcykpKTsKCQl9CgoJCWNvbnN0ZXhwciBmaXhlZCBvcGVyYXRvcj4+KGludCBzKSBjb25zdAoJCXsKCQkJYXNzZXJ0KHMgPj0gMCAmJiBzIDwgMzIgJiYgImZpeGVkOiBzaGlmdCBjb3VudCBvdXQgb2YgcmFuZ2UiKTsKCQkJcmV0dXJuIGZyb21fcmF3KHYgPj4gcyk7CgkJfQoKCQkvLyAtLS0tIGNvbXBvdW5kIGFzc2lnbm1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgkJY29uc3RleHByIGZpeGVkJiBvcGVyYXRvcis9KGZpeGVkIGIpIHsgKnRoaXMgPSAqdGhpcyArIGI7IHJldHVybiAqdGhpczsgfQoJCWNvbnN0ZXhwciBmaXhlZCYgb3BlcmF0b3ItPShmaXhlZCBiKSB7ICp0aGlzID0gKnRoaXMgLSBiOyByZXR1cm4gKnRoaXM7IH0KCQljb25zdGV4cHIgZml4ZWQmIG9wZXJhdG9yKj0oZml4ZWQgYikgeyAqdGhpcyA9ICp0aGlzICogYjsgcmV0dXJuICp0aGlzOyB9CgkJY29uc3RleHByIGZpeGVkJiBvcGVyYXRvci89KGZpeGVkIGIpIHsgKnRoaXMgPSAqdGhpcyAvIGI7IHJldHVybiAqdGhpczsgfQoJCWNvbnN0ZXhwciBmaXhlZCYgb3BlcmF0b3IqPShpbnQzMl90IHMpIHsgKnRoaXMgPSAqdGhpcyAqIHM7IHJldHVybiAqdGhpczsgfQoJCWNvbnN0ZXhwciBmaXhlZCYgb3BlcmF0b3IvPShpbnQzMl90IHMpIHsgKnRoaXMgPSAqdGhpcyAvIHM7IHJldHVybiAqdGhpczsgfQoJCWNvbnN0ZXhwciBmaXhlZCYgb3BlcmF0b3I8PD0oaW50IHMpIHsgKnRoaXMgPSAqdGhpcyA8PCBzOyByZXR1cm4gKnRoaXM7IH0KCQljb25zdGV4cHIgZml4ZWQmIG9wZXJhdG9yPj49KGludCBzKSB7ICp0aGlzID0gKnRoaXMgPj4gczsgcmV0dXJuICp0aGlzOyB9CgoJCS8vIC0tLS0gY29tcGFyaXNvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgkJY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShmaXhlZCBiKSBjb25zdCB7IHJldHVybiB2ID09IGIudjsgfQoJCWNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oZml4ZWQgYikgY29uc3QgeyByZXR1cm4gdiAhPSBiLnY7IH0KCQljb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwgKGZpeGVkIGIpIGNvbnN0IHsgcmV0dXJuIHYgPCBiLnY7IH0KCQljb25zdGV4cHIgYm9vbCBvcGVyYXRvcjw9KGZpeGVkIGIpIGNvbnN0IHsgcmV0dXJuIHYgPD0gYi52OyB9CgkJY29uc3RleHByIGJvb2wgb3BlcmF0b3I+IChmaXhlZCBiKSBjb25zdCB7IHJldHVybiB2ID4gYi52OyB9CgkJY29uc3RleHByIGJvb2wgb3BlcmF0b3I+PShmaXhlZCBiKSBjb25zdCB7IHJldHVybiB2ID49IGIudjsgfQoKCQkvLyAtLS0tIG1pc2MgaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgkJY29uc3RleHByIGZpeGVkIGFicygpIGNvbnN0CgkJewoJCQlhc3NlcnQodiAhPSBJTlQzMl9NSU4gJiYgImZpeGVkOiBhYnMoSU5UMzJfTUlOKSIpOwoJCQlyZXR1cm4gdiA+PSAwID8gKnRoaXMgOiBmcm9tX3Jhdygtdik7CgkJfQoKCQljb25zdGV4cHIgZml4ZWQgZmxvb3IoKSBjb25zdCB7IHJldHVybiBmcm9tX3Jhdyh2ICYgfihPTkUgLSAxKSk7IH0KCgkJY29uc3RleHByIGZpeGVkIGNlaWwoKSBjb25zdAoJCXsKCQkJcmV0dXJuIGZyb21fcmF3KGNoZWNrZWQzMigoaW50NjRfdCh2KSArIChPTkUgLSAxKSkgJiB+aW50NjRfdChPTkUgLSAxKSkpOwoJCX0KCgkJLy8gbmVhcmVzdCBpbnRlZ2VyLCBoYWxmIGF3YXkgZnJvbSB6ZXJvLCBrZXB0IGFzIGZpeGVkIHBvaW50CgkJLy8gKHRoZSBmaXhlZC12YWx1ZWQgYW5hbG9nIG9mIHJvdW5kX3RvX2ludCwgbGlrZSBmbG9vcigpL2NlaWwoKSkKCQljb25zdGV4cHIgZml4ZWQgcm91bmQoKSBjb25zdAoJCXsKCQkJcmV0dXJuIGZyb21fcmF3KGNoZWNrZWQzMihpbnQ2NF90KHJvdW5kX3RvX2ludCgpKSAqIE9ORSkpOwoJCX0KCgkJLy8gaW50ZWdlciBwYXJ0LCB0b3dhcmQgemVybywga2VwdCBhcyBmaXhlZCBwb2ludCAoYW5hbG9nIG9mIHRydW5jX3RvX2ludCkuCgkJLy8gTWFnbml0dWRlIG5ldmVyIGdyb3dzLCBzbyBubyBvdmVyZmxvdyBjaGVjayBuZWVkZWQ7IElOVDMyX01JTi1zYWZlLgoJCWNvbnN0ZXhwciBmaXhlZCB0cnVuYygpIGNvbnN0IHsgcmV0dXJuIGZyb21fcmF3KCh2IC8gT05FKSAqIE9ORSk7IH0KCgkJY29uc3RleHByIGZpeGVkIGZyYWMoKSBjb25zdCB7IHJldHVybiBmcm9tX3Jhdyh2ICYgKE9ORSAtIDEpKTsgfSAgIC8vIGFsd2F5cyA+PSAwCgoJCS8vIERldGVybWluaXN0aWMgc3F1YXJlIHJvb3QsIHJvdW5kLXRvLW5lYXJlc3QsIG1heCBlcnJvciAxLzIgdWxwLgoJCS8vIFB1cmUgaW50ZWdlciBzaGlmdC1zdWJ0cmFjdCBvbiBzcXJ0KHYgKiAyXkZSQUNfQklUUyk6IGlkZW50aWNhbCByZXN1bHRzCgkJLy8gb24gZXZlcnkgcGxhdGZvcm0vY29tcGlsZXIsIG5vIEZQVS4gdiBtdXN0IGJlID49IDAuCgkJY29uc3RleHByIGZpeGVkIHNxcnQoKSBjb25zdAoJCXsKCQkJYXNzZXJ0KHYgPj0gMCAmJiAiZml4ZWQ6IHNxcnQgb2YgbmVnYXRpdmUiKTsKCQkJY29uc3QgdWludDY0X3QgeCA9IHVpbnQ2NF90KHVpbnQzMl90KHYpKSA8PCBGUkFDX0JJVFM7CgkJCWNvbnN0IHVpbnQ2NF90IGYgPSBmaXhlZF9kZXRhaWw6OmlzcXJ0X2Zsb29yKHgpOwoJCQkvLyByb3VuZCB0byBuZWFyZXN0OiByZW1haW5kZXIgeCAtIGZeMiA+IGYgbWVhbnMgbmVhcmVyIHRvIGYrMQoJCQlyZXR1cm4gZnJvbV9yYXcoY2hlY2tlZDMyKGludDY0X3QoZiArICh4IC0gZiAqIGYgPiBmKSkpKTsKCQl9CgoJCS8vIEFwcHJveGltYXRlIHNxdWFyZSByb290OiBMVVQgc2VlZCArIG9uZSBOZXd0b24tUmFwaHNvbiBzdGVwLgoJCS8vIFB1cmUgaW50ZWdlciwgZGV0ZXJtaW5pc3RpYywgY29uc3RleHByLCB+MTV4IGZhc3RlciB0aGFuIHNxcnQoKS4KCQkvLyBSZWxhdGl2ZSBlcnJvciA8PSB+Ml4tMTUgKH4wLjAwMyUpIHBsdXMgfjEgdWxwIG9mIG91dHB1dCBxdWFudGl6YXRpb24KCQkvLyAod2hpY2ggZG9taW5hdGVzIGZvciByZXN1bHRzIG5lYXIgemVybykuIFNsaWdodCB1cHdhcmQgYmlhcwoJCS8vIChOZXd0b24gY29udmVyZ2VzIGZyb20gYWJvdmUpLiB2IG11c3QgYmUgPj0gMC4KCQljb25zdGV4cHIgZml4ZWQgc3FydF9mYXN0KCkgY29uc3QKCQl7CgkJCWFzc2VydCh2ID49IDAgJiYgImZpeGVkOiBzcXJ0IG9mIG5lZ2F0aXZlIik7CgkJCWNvbnN0IHVpbnQ2NF90IHggPSB1aW50NjRfdCh1aW50MzJfdCh2KSkgPDwgRlJBQ19CSVRTOwoJCQlpZiAoeCA9PSAwKSByZXR1cm4gZml4ZWQoKTsKCQkJLy8gbm9ybWFsaXplIGJ5IGFuIGV2ZW4gc2hpZnQ6IFggPSB4IDw8IHQgaW4gWzJeNjIsIDJeNjQpCgkJCWNvbnN0IGludCB0ID0gZml4ZWRfZGV0YWlsOjpjbHo2NCh4KSAmIH4xOwoJCQljb25zdCB1aW50NjRfdCBYID0geCA8PCB0OwoJCQkvLyB+Ny1iaXQgc2VlZCBmcm9tIHRoZSB0YWJsZSwgb25lIE5ld3RvbiBzdGVwIC0+IH4xNSBiaXRzIHJlbGF0aXZlCgkJCWNvbnN0IHVpbnQ2NF90IHIwID0gZml4ZWRfZGV0YWlsOjpTUVJUX0xVVC5lW1ggPj4gNTddOwoJCQljb25zdCB1aW50NjRfdCByMSA9IChyMCArIFggLyByMCkgPj4gMTsKCQkJLy8gc3FydCh4KSA9IHNxcnQoWCkgPj4gKHQvMiksIHJvdW5kZWQKCQkJY29uc3QgaW50IHMgPSB0ID4+IDE7CgkJCWNvbnN0IHVpbnQ2NF90IGhhbGYgPSBzID8gKHVpbnQ2NF90KDEpIDw8IChzIC0gMSkpIDogMDsKCQkJcmV0dXJuIGZyb21fcmF3KGNoZWNrZWQzMihpbnQ2NF90KChyMSArIGhhbGYpID4+IHMpKSk7CgkJfQoKCXByaXZhdGU6CgkJc3RydWN0IHJhd190YWcge307CgkJY29uc3RleHByIGZpeGVkKGludDMyX3QgcmF3LCByYXdfdGFnKSA6IHYocmF3KSB7fQoKCQkvLyBBc3NlcnRzIHRoYXQgYSB3aWRlbmVkIGludGVybWVkaWF0ZSBmaXRzIGJhY2sgaW50byBpbnQzMl90LgoJCXN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBjaGVja2VkMzIoaW50NjRfdCB4KQoJCXsKCQkJYXNzZXJ0KHggPj0gSU5UMzJfTUlOICYmIHggPD0gSU5UMzJfTUFYICYmICJmaXhlZDogb3ZlcmZsb3ciKTsKCQkJcmV0dXJuIGludDMyX3QoeCk7CgkJfQoKCQkvLyAoeCArIGhhbGYpID4+IGJpdHMsIHJvdW5kaW5nIGhhbGYgYXdheSBmcm9tIHplcm8sIHZhbGlkIGZvciBuZWdhdGl2ZXMuCgkJLy8gUmV0dXJucyBpbnQ2NCBzbyB0aGUgY2FsbGVyIGNhbiByYW5nZS1jaGVjayBiZWZvcmUgbmFycm93aW5nLgoJCXN0YXRpYyBjb25zdGV4cHIgaW50NjRfdCByb3VuZGVkX3JzaGlmdChpbnQ2NF90IHgsIGludCBiaXRzKQoJCXsKCQkJY29uc3QgaW50NjRfdCBoYWxmID0gaW50NjRfdCgxKSA8PCAoYml0cyAtIDEpOwoJCQlyZXR1cm4geCA+PSAwCgkJCQk/ICgoeCArIGhhbGYpID4+IGJpdHMpCgkJCQk6IC0oKCgteCkgKyBoYWxmKSA+PiBiaXRzKTsKCQl9CgoJCXN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCByb3VuZGVkX2RpdihpbnQ2NF90IG51bSwgaW50NjRfdCBkZW4pCgkJewoJCQkvLyByb3VuZCBoYWxmIGF3YXkgZnJvbSB6ZXJvIGZvciBhbnkgc2lnbiBjb21iaW5hdGlvbgoJCQljb25zdCBpbnQ2NF90IGhhbGYgPSBkZW4gPj0gMCA/IGRlbiAvIDIgOiAtZGVuIC8gMjsKCQkJY29uc3QgYm9vbCBuZWcgPSAobnVtIDwgMCkgIT0gKGRlbiA8IDApOwoJCQljb25zdCBpbnQ2NF90IG4gPSBudW0gPCAwID8gLW51bSA6IG51bTsKCQkJY29uc3QgaW50NjRfdCBkID0gZGVuIDwgMCA/IC1kZW4gOiBkZW47CgkJCWNvbnN0IGludDY0X3QgcSA9IChuICsgaGFsZikgLyBkOwoJCQkvLyBjaGVja2VkOiBJTlQzMl9NSU4gLyAtMSBpcyB0aGUgb25lIHF1b3RpZW50IHRoYXQgZG9lc24ndCBmaXQgYmFjawoJCQlyZXR1cm4gY2hlY2tlZDMyKG5lZyA/IC1xIDogcSk7CgkJfQoJfTsKCgkvLyBDb21tb24gaW5zdGFudGlhdGlvbnMKCXVzaW5nIGZpeGVkMjRfOCA9IGZpeGVkPDg+OwkJLy8gUTIzLjgKCXVzaW5nIGZpeGVkMjJfMTAgPSBmaXhlZDwxMD47ICAgLy8gUTIxLjEwCgl1c2luZyBmaXhlZDE2XzE2ID0gZml4ZWQ8MTY+OyAgIC8vIFExNS4xNgoJdXNpbmcgZml4ZWQ4XzI0ID0gZml4ZWQ8MjQ+OwkvLyBRNy4yNAoKI2RlZmluZSBCVV9GMTZfMTYoeCkgYmFzaXN0OjpmaXhlZDE2XzE2Ojpmcm9tX2Zsb2F0KHgpCn0gLy8gbmFtZXNwYWNlIGJhc2lzdAoKCgo=