LyogICRWRVI6IHZiY2MgKHR5cGVfZXhwci5jKSAkUmV2aXNpb246IDEuNjQgJCAgICovCgojaW5jbHVkZSAidmJjLmgiCgpzdGF0aWMgY2hhciBGSUxFX1tdPV9fRklMRV9fOwoKI2RlZmluZSBDT05TVEFERFIgMjU2CgoKLyogaWYgTUFTSyBpcyBzZXQsIGEgc3BlY2lhbGl6ZWQgdmVyc2lvbiB3aWxsIGJlIGdlbmVyYXRlZCAqLwojZGVmaW5lIFVTRUhBTEYgICgxTDw8MSkKI2RlZmluZSBVU0VMT05HICAoMUw8PDIpCiNkZWZpbmUgVVNFTExPTkcgKDFMPDwzKQojZGVmaW5lIFVTRUZMT0FUICgxTDw8NCkKI2RlZmluZSBVU0VIRVhMICAoMUw8PDUpCiNkZWZpbmUgVVNFSEVYVSAgKDFMPDw2KQojZGVmaW5lIFVTRURFQyAgICgxTDw8NykKI2RlZmluZSBVU0VPQ1QgICAoMUw8PDgpCiNkZWZpbmUgVVNFSU5UICAgKDFMPDw5KQojZGVmaW5lIFVTRVVOUyAgICgxTDw8MTApCiNkZWZpbmUgVVNFU1RSICAgKDFMPDwxMSkKI2RlZmluZSBVU0VDSEFSICAoMUw8PDEyKQojZGVmaW5lIFVTRVBFUkMgICgxTDw8MTMpCiNkZWZpbmUgVVNFQ05UICAgKDFMPDwxNCkKI2RlZmluZSBVU0VBTFQgICAoMUw8PDE1KQojZGVmaW5lIFVTRVpQQUQgICgxTDw8MTYpCiNkZWZpbmUgVVNFTEFMR04gKDFMPDwxNykKI2RlZmluZSBVU0VCTEFOSyAoMUw8PDE4KQojZGVmaW5lIFVTRVNJR04gICgxTDw8MTkpCiNkZWZpbmUgVVNFV0lEVEggKDFMPDwyMCkKI2RlZmluZSBVU0VBU1QgICAoMUw8PDIxKQojZGVmaW5lIFVTRVBSRUMgICgxTDw8MjIpCiNkZWZpbmUgVVNFU1BFQyAgKDFMPDwyMykKI2RlZmluZSBVU0VSRVhQICAoMUw8PDI0KQoKaW50IGFsZ19vcHQobnAsdHlwZSAqKTsKdm9pZCBzaW1wbGVfYWxnX29wdChucCk7CmludCB0ZXN0X2Fzc2lnbm1lbnQodHlwZSAqLG5wKTsKaW50IHR5cGVfZXhwcmVzc2lvbjIobnAsdHlwZSAqKTsKdm9pZCBtYWtlX2NleHByKG5wKTsKCmludCBkb250b3B0OwppbnQgbm9fY2FzdF9mcmVlOwoKdHlwZSB1Y3Q9e1VOU0lHTkVEfENIQVJ9Owp0eXBlIHVzdD17VU5TSUdORUR8U0hPUlR9Owp0eXBlIHVpdD17VU5TSUdORUR8SU5UfTsKdHlwZSB1bHQ9e1VOU0lHTkVEfExPTkd9OwoKI2lmZGVmIEhBVkVfRUNQUAovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwojZW5kaWYKCiNpZmRlZiBIQVZFX01JU1JBCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCiNlbmRpZgoKCgoKCnZvaWQgaW5zZXJ0X2NvbnN0bihucCBwKQovKiAgU3BlemlhbGZhbGwgZnVlciBucCAqLwp7CiAgICBpZighcHx8IXAtPm50eXApIGllcnJvcigwKTsKICAgIGluc2VydF9jb25zdCgmcC0+dmFsLHAtPm50eXAtPmZsYWdzKTsKfQppbnQgY29uc3RfdHlwKHR5cGUgKnApCi8qICBUZXN0ZXQsIG9iIFR5cCBrb25zdGFudCBpc3Qgb2RlciBrb25zdGFudGUgRWxlbWVudGUgZW50aGFlbHQgICAgKi8KewogICAgaW50IGk7c3RydWN0X2RlY2xhcmF0aW9uICpzZDsKICAgIGlmKHAtPmZsYWdzJkNPTlNUKSByZXR1cm4oMSk7CiAgICBpZihJU1NUUlVDVChwLT5mbGFncyl8fElTVU5JT04ocC0+ZmxhZ3MpKQogICAgICAgIGZvcihpPTA7aTxwLT5leGFjdC0+Y291bnQ7aSsrKQogICAgICAgICAgICBpZihjb25zdF90eXAoKCpwLT5leGFjdC0+c2wpW2ldLnN0eXApKSByZXR1cm4oMSk7CiAgICByZXR1cm4gMDsKfQppbnQgYXJpdGhfZmxhZyhpbnQgdGEsaW50IHRiKQp7CiAgLyogVE9ETzogdm9sYXRpbGU/ICovCiAgdGEmPU5VO3RiJj1OVTsKICBpZih0YT09TERPVUJMRXx8dGI9PUxET1VCTEUpIHJldHVybiBMRE9VQkxFOwogIGlmKHRhPT1ET1VCTEV8fHRiPT1ET1VCTEUpIHJldHVybiBET1VCTEU7CiAgaWYodGE9PUZMT0FUfHx0Yj09RkxPQVQpIHJldHVybiBGTE9BVDsKICB0YT1pbnRfZXJ3KHRhKTt0Yj1pbnRfZXJ3KHRiKTsKICBpZih0YT09KFVOU0lHTkVEfExMT05HKXx8dGI9PShVTlNJR05FRHxMTE9ORykpIHJldHVybiBVTlNJR05FRHxMTE9ORzsKICBpZih0YT09TExPTkd8fHRiPT1MTE9ORykgcmV0dXJuIExMT05HOwogIGlmKHRhPT0oVU5TSUdORUR8TE9ORyl8fHRiPT0oVU5TSUdORUR8TE9ORykpIHJldHVybiBVTlNJR05FRHxMT05HOwogIGlmKCh0YT09TE9ORyYmdGI9PShVTlNJR05FRHxJTlQpKXx8KHRhPT0oVU5TSUdORUR8SU5UKSYmdGI9PUxPTkcpKXsKICAgIGlmKHp1bWxlcSh0X21heChVTlNJR05FRHxJTlQpLHRfbWF4KExPTkcpKSkgCiAgICAgIHJldHVybiBMT05HOwogICAgZWxzZQogICAgICByZXR1cm4gVU5TSUdORUR8TE9ORzsKICB9CiAgaWYodGE9PUxPTkd8fHRiPT1MT05HKSByZXR1cm4gTE9ORzsKICBpZih0YT09KFVOU0lHTkVEfElOVCl8fHRiPT0oVU5TSUdORUR8SU5UKSkgcmV0dXJuIFVOU0lHTkVEfElOVDsKICByZXR1cm4gSU5UOwp9Cgp0eXBlICphcml0aF90eXAodHlwZSAqYSx0eXBlICpiKQovKiAgRXJ6ZXVndCBUeXAgZnVlciBhcml0aG1ldGlzY2hlIFVtd2FuZGx1bmcgdm9uIHp3ZWkgT3BlcmFuZGVuICAgICovCnsKICBpbnQgdGEsdGIsdmEsdm9sO3R5cGUgKm5ldzsKICAgIG5ldz1uZXdfdHlwKCk7CiAgICB0YT1hLT5mbGFncyZOVTt0Yj1iLT5mbGFncyZOVTsKICAgIHZvbD0oYS0+ZmxhZ3MmVk9MQVRJTEUpfChiLT5mbGFncyZWT0xBVElMRSk7CiAgICBpZih0YT09TERPVUJMRXx8dGI9PUxET1VCTEUpe25ldy0+ZmxhZ3M9TERPVUJMRXx2b2w7cmV0dXJuIG5ldzt9CiAgICBpZih0YT09RE9VQkxFfHx0Yj09RE9VQkxFKXtuZXctPmZsYWdzPURPVUJMRXx2b2w7cmV0dXJuIG5ldzt9CiAgICBpZih0YT09RkxPQVR8fHRiPT1GTE9BVCl7bmV3LT5mbGFncz1GTE9BVHx2b2w7cmV0dXJuIG5ldzt9CiAgICB0YT1pbnRfZXJ3KHRhKTt0Yj1pbnRfZXJ3KHRiKTsKICAgIGlmKHRhPT0oVU5TSUdORUR8TExPTkcpfHx0Yj09KFVOU0lHTkVEfExMT05HKSl7bmV3LT5mbGFncz1VTlNJR05FRHxMTE9OR3x2b2w7cmV0dXJuIG5ldzt9CiAgICBpZih0YT09TExPTkd8fHRiPT1MTE9ORyl7bmV3LT5mbGFncz1MTE9OR3x2b2w7cmV0dXJuIG5ldzt9CiAgICBpZih0YT09KFVOU0lHTkVEfExPTkcpfHx0Yj09KFVOU0lHTkVEfExPTkcpKXtuZXctPmZsYWdzPVVOU0lHTkVEfExPTkd8dm9sO3JldHVybiBuZXc7fQogICAgaWYoKHRhPT1MT05HJiZ0Yj09KFVOU0lHTkVEfElOVCkpfHwodGE9PShVTlNJR05FRHxJTlQpJiZ0Yj09TE9ORykpewogICAgICAgIGlmKHp1bWxlcSh0X21heChVTlNJR05FRHxJTlQpLHRfbWF4KExPTkcpKSkgbmV3LT5mbGFncz1MT05HfHZvbDsgZWxzZSBuZXctPmZsYWdzPVVOU0lHTkVEfExPTkd8dm9sOwogICAgICAgIHJldHVybiBuZXc7CiAgICB9CiAgICBpZih0YT09TE9OR3x8dGI9PUxPTkcpe25ldy0+ZmxhZ3M9TE9OR3x2b2w7cmV0dXJuIG5ldzt9CiAgICBpZih0YT09KFVOU0lHTkVEfElOVCl8fHRiPT0oVU5TSUdORUR8SU5UKSl7bmV3LT5mbGFncz1VTlNJR05FRHxJTlR8dm9sO3JldHVybiBuZXc7fQogICAgbmV3LT5mbGFncz1JTlR8dm9sOwogICAgcmV0dXJuIG5ldzsKfQppbnQgaW50X2VydyhpbnQgdCkKLyogIEZ1ZWhydCBJbnRlZ2VyX0Vyd2VpdGVydW5nIGVpbmVzIFR5cGVuIGR1cmNoICAgICAgICAgICAgICAgICovCnsKICAgIGlmKCh0Jk5RKT49SU5UKSByZXR1cm4gdDsKICAgIGlmKHQmVU5TSUdORUQpewogICAgICBpZigodCZOUSk8PUNIQVImJnp1bWxlcSh0X21heChVTlNJR05FRHxDSEFSKSx0X21heChJTlQpKSkgcmV0dXJuIElOVDsKICAgICAgaWYoKHQmTlEpPD1TSE9SVCYmenVtbGVxKHRfbWF4KFVOU0lHTkVEfFNIT1JUKSx0X21heChJTlQpKSkgcmV0dXJuIElOVDsKICAgICAgcmV0dXJuIFVOU0lHTkVEfElOVDsKICAgIH0KICAgIHJldHVybiBJTlQ7Cn0KI2lmIEhBVkVfQU9TNApzdGF0aWMgaW50IGFvczRlcnI7CmludCBhb3M0X2F0dHIodHlwZSAqcCxjaGFyICpzKQp7CiAgaWYocC0+YXR0ciYmc3Ryc3RyKHAtPmF0dHIscykpCiAgICByZXR1cm4gMTsKICBpZihwLT5uZXh0KQogICAgcmV0dXJuIGFvczRfYXR0cihwLT5uZXh0LHMpOwogIGVsc2UKICAgIHJldHVybiAwOwp9CnN0YXRpYyBucCBhb3M0X2Nsb25lX3RyZWUobnAgcCkKewogIG5wIG5ldzsKICBpZighcCkgcmV0dXJuIDA7CiAgbmV3PW5ld19ub2RlKCk7CiAgKm5ldz0qcDsKICBuZXctPm50eXA9Y2xvbmVfdHlwKHAtPm50eXApOwogIG5ldy0+bGVmdD1hb3M0X2Nsb25lX3RyZWUocC0+bGVmdCk7CiAgbmV3LT5yaWdodD1hb3M0X2Nsb25lX3RyZWUocC0+cmlnaHQpOwogIG5ldy0+YWxpc3Q9MDtuZXctPmNsPTA7bmV3LT5kc2l6ZT0wOwogIGlmKHAtPmZsYWdzPT1DQUxMLyp8fHAtPmNsfHxwLT5kc2l6ZSovKSBhb3M0ZXJyPTE7CiAgcmV0dXJuIG5ldzsKfQojZW5kaWYKI2lmZGVmIEhBVkVfTUlTUkEKLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwojZW5kaWYKaW50IHR5cGVfZXhwcmVzc2lvbihucCBwLHR5cGUgKnR0eXApCi8qICBBcnQgRnJvbnRlbmQgZnVlciB0eXBlX2V4cHJlc3Npb24yKCkuIFNldHp0IGRvbnRvcHQgYXVmIDAgICAqLwp7CgkJaW50IHJldF92YWw7CiAgICBkb250b3B0PTA7CiAgICBzaW1wbGVfYWxnX29wdChwKTsKI2lmZGVmIEhBVkVfTUlTUkEKLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwojZW5kaWYKICAgcmV0X3ZhbCA9IHR5cGVfZXhwcmVzc2lvbjIocCx0dHlwKTsKI2lmZGVmIEhBVkVfTUlTUkEKLyogcmVtb3ZlZCAqLwojZW5kaWYKCQlyZXR1cm4gcmV0X3ZhbDsKCn0KCnN0YXRpYyB2b2lkIGZpeF9hZGRyX3B0eXBlKG5wIG9wKQp7CiAgbnAgcD1vcDsKICB3aGlsZShwLT5mbGFncz09RklSU1RFTEVNRU5UKSBwPXAtPmxlZnQ7CiAgaWYocC0+bGVmdC0+ZmxhZ3M9PUNPTlRFTlQpewogICAgaW50IHB0PXAtPmxlZnQtPmxlZnQtPm50eXAtPmZsYWdzOwogICAgaWYoIUlTUE9JTlRFUihwdCkpIGllcnJvcigwKTsKICAgIGlmKCFJU1BPSU5URVIob3AtPm50eXAtPmZsYWdzKSkgaWVycm9yKDApOwogICAgb3AtPm50eXAtPmZsYWdzPXB0OwogIH0KfQoKc3RhdGljIGludCBwdHlwZShucCBvcCkKewojaWZkZWYgUE9JTlRFUl9WQVJBRFIKICBWYXIgKnY9MDsKICBucCBwPW9wOwoKICB3aGlsZShwLT5mbGFncz09RklSU1RFTEVNRU5ULyp8fHAtPmZsYWdzPT1DT05URU5UKi8pIHA9cC0+bGVmdDsKICAKICBpZihwLT5mbGFncz09SURFTlRJRklFUikKICAgIHY9ZmluZF92YXIocC0+aWRlbnRpZmllciwwKTsKICBpZih2KSAKICAgIHJldHVybiBQT0lOVEVSX1ZBUkFEUih2KTsKICBlbHNlCiAgICByZXR1cm4gUE9JTlRFUl9UWVBFKG9wLT5udHlwKTsKI2Vsc2UKICByZXR1cm4gUE9JTlRFUl9UWVBFKG9wLT5udHlwKTsKI2VuZGlmCn0KCnN0YXRpYyBpbnQgZGVjaWRlX3Nob3J0Y3V0KG5wIHAsdHlwZSAqdHR5cCkKewogIGludCB0dGY9dHR5cC0+ZmxhZ3MsZj1wLT5mbGFnczsKICBpZihmPT1QTVVMVCkgZj1NVUxUOwogIGlmKCFzaG9ydGN1dChmLHR0eXAtPmZsYWdzJk5VKXx8CiAgICAgSVNGTE9BVCh0dGYpfHxJU0ZMT0FUKHAtPmxlZnQtPm50eXAtPmZsYWdzKXx8SVNGTE9BVChwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpCiAgICAgKQogICAgcmV0dXJuIDA7CiAgdHRmJj1OUTsKICBpZih0dGY8SU5UKSByZXR1cm4gMTsKICBpZih6bTJsKHNpemV0YWJbdHRmXSk8em0ybChzaXpldGFiWyhwLT5sZWZ0LT5udHlwLT5mbGFncyZOUSldKSkgcmV0dXJuIDE7CiAgaWYoem0ybChzaXpldGFiW3R0Zl0pPHptMmwoc2l6ZXRhYlsocC0+cmlnaHQtPm50eXAtPmZsYWdzJk5RKV0pKSByZXR1cm4gMTsKICByZXR1cm4gMDsKfQoKCgpzdGF0aWMgdHlwZSAqYmVzdF9hZGRpMnB0KHptYXggc3opCnsKICBpZighem1lcXRvKHNpemV0YWJbQ0hBUl0sc2l6ZXRhYltJTlRdKSYmIXptZXF0byhzeixaMCkmJk1JTkFEREkyUDw9Q0hBUiYmenVtbGVxKHptMnp1bShzeiksenVtYWRkKHR1X21heFtDSEFSXSxaVTEpKSl7CiAgICByZXR1cm4gJnVjdDsKICB9ZWxzZSBpZighem1lcXRvKHNpemV0YWJbU0hPUlRdLHNpemV0YWJbSU5UXSkmJiF6bWVxdG8oc3osWjApJiZNSU5BRERJMlA8PVNIT1JUJiZ6dW1sZXEoem0yenVtKHN6KSx6dW1hZGQodHVfbWF4W1NIT1JUXSxaVTEpKSl7CiAgICByZXR1cm4gJnVzdDsKICB9CiAgcmV0dXJuIDA7Cn0KCnR5cGUgKmFuZGNvbXAobnAgYW5kLG5wIGNtcCkKewogIGludCBpPTA7em1heCBzdmFsO3p1bWF4IHV2YWw7CiAgaWYoY21wKXsKICAgIGlmKChjbXAtPmZsYWdzPT1DRVhQUnx8Y21wLT5mbGFncz09UENFWFBSKSl7aT0xO2V2YWxfY29uc3RuKGNtcCk7c3ZhbD12bWF4O3V2YWw9dnVtYXg7fQogIH1lbHNlewogICAgc3ZhbD1aMDt1dmFsPVpVMDsKICAgIGk9MTsKICB9CiAgaWYoYW5kLT5mbGFncz09QU5EJiYoYW5kLT5sZWZ0LT5mbGFncz09Q0VYUFJ8fGFuZC0+bGVmdC0+ZmxhZ3M9PVBDRVhQUikpe2l8PTI7ZXZhbF9jb25zdG4oYW5kLT5sZWZ0KTt9CiAgaWYoYW5kLT5mbGFncz09QU5EJiYoYW5kLT5yaWdodC0+ZmxhZ3M9PUNFWFBSfHxhbmQtPnJpZ2h0LT5mbGFncz09UENFWFBSKSl7aXw9MjtldmFsX2NvbnN0bihhbmQtPnJpZ2h0KTt9CiAgaWYoaSYyKXsKICAgIC8qcHJpbnRmKCJDSEVDSzogeCYlbGQgPT0vIT0gJWxkXG4iLHptMmwodm1heCksKGkmMSk/em0ybChzdmFsKTotMUwpOyovCiAgICBpZihzaG9ydGN1dChDT01QQVJFLFVOU0lHTkVEfENIQVIpJiZzaG9ydGN1dChBTkQsVU5TSUdORUR8Q0hBUikmJiF6bWVxdG8oc2l6ZXRhYltDSEFSXSxzaXpldGFiW1NIT1JUXSkpewogICAgICBpZih6bWxlcSh2bWF4LHRfbWF4W0NIQVJdKSkKCXJldHVybiAmdWN0OwogICAgICBlbHNlIGlmKChpJjEpJiZ6dW1sZXEodnVtYXgsdHVfbWF4W0NIQVJdKSYmenVtbGVxKHV2YWwsdHVfbWF4W0NIQVJdKSkKCXJldHVybiAmdWN0OwogICAgfQogICAgaWYoc2hvcnRjdXQoQ09NUEFSRSxVTlNJR05FRHxTSE9SVCkmJnNob3J0Y3V0KEFORCxVTlNJR05FRHxTSE9SVCkmJiF6bWVxdG8oc2l6ZXRhYltTSE9SVF0sc2l6ZXRhYltJTlRdKSl7CiAgICAgIGlmKHptbGVxKHZtYXgsdF9tYXhbU0hPUlRdKSkKCXJldHVybiAmdXN0OwogICAgICBlbHNlIGlmKChpJjEpJiZ6dW1sZXEodnVtYXgsdHVfbWF4W1NIT1JUXSkmJnp1bWxlcSh1dmFsLHR1X21heFtTSE9SVF0pKQoJcmV0dXJuICZ1c3Q7CiAgICB9CiAgICBpZighem1lcXRvKHNpemV0YWJbSU5UXSxzaXpldGFiW0xPTkddKSl7CiAgICAgIGlmKHptbGVxKHZtYXgsdF9tYXhbSU5UXSkpCglyZXR1cm4gJnVpdDsKICAgICAgZWxzZSBpZigoaSYxKSYmenVtbGVxKHZ1bWF4LHR1X21heFtJTlRdKSYmenVtbGVxKHV2YWwsdHVfbWF4W0lOVF0pKQoJcmV0dXJuICZ1aXQ7CiAgICB9CiAgICBpZighem1lcXRvKHNpemV0YWJbTE9OR10sc2l6ZXRhYltMTE9OR10pKXsKICAgICAgaWYoem1sZXEodm1heCx0X21heFtMT05HXSkpCglyZXR1cm4gJnVsdDsKICAgICAgZWxzZSBpZigoaSYxKSYmenVtbGVxKHZ1bWF4LHR1X21heFtMT05HXSkmJnp1bWxlcSh1dmFsLHR1X21heFtMT05HXSkpCglyZXR1cm4gJnVsdDsKICAgIH0KICB9CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgbnVsbHBvaW50ZXIobnAgcCkKewogIGlmKHAtPmZsYWdzIT1DRVhQUikgcmV0dXJuIDA7CiAgZXZhbF9jb25zdG4ocCk7IC8qIFRPRE86IGRvIHdlIG5lZWQgdG8gdXNlIG90aGVyIG1lYXN1cmUgdG8gdmVyaWZ5IG51bGwgcG9pbnRlcj8gKi8KICBpZih6bWVxdG8oWjAsdm1heCkpIHJldHVybiAxOwogIHJldHVybiAwOwp9CgppbnQgdHlwZV9leHByZXNzaW9uMihucCBwLHR5cGUgKnR0eXApCi8qICBFcnpldWd0IFR5cC1TdHJ1a3R1cmVuIGZ1ZXIgamVkZW4gS25vdGVuIGRlcyBCYXVtZXMgdW5kICAgICAqLwovKiAgbGllZmVydCBlaW5zIHp1cnVlY2ssIHdlbm4gZGVyIEJhdW0gb2sgaXN0LCBzb25zdCAwICAgICAgICAgKi8KLyogIERpZSBCZXJlY2hudW5nIHZvbiBLb25zdGFudGVuIHVuZCBhbmRlcmUgVmVyZWluZmFjaHVuZ2VuICAgICovCi8qICBzb2xsdGVuIHZpZWxsZWljaHQgaW4gZWlnZW5lIEZ1bmt0aW9uIGtvbW1lbiAgICAgICAgICAgICAgICAqLwp7CiAgaW50IG9rLGY9cC0+ZmxhZ3MsbW9wdD1kb250b3B0LHR0ZjsKICB0eXBlICpzaG9ydHR5cDsKICBzdGF0aWMgaW50IGFzc2lnbm9wOwogIGludCBhb2ZsYWc7CiNpZiBIQVZFX0FPUzQKICBucCB0aGlzcD0wOwojZW5kaWYKI2lmZGVmIEhBVkVfRUNQUAovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCiNlbmRpZgogIGlmKCFwKXtpZXJyb3IoMCk7cmV0dXJuKDEpO30KICBpZih0dHlwKSB0dGY9dHR5cC0+ZmxhZ3MmTlE7CiAgLyogICAgaWYocC0+bnR5cCkgcHJpbnRmKCJXYXJudW5nOiBudHlwIT0wXG4iKTsqLwogIHAtPmx2YWx1ZT0wOwogIHAtPnNpZGVmeD0wOwogIG9rPTE7CiAgaWYoIWVjcHAmJmY9PUNBTEwmJnAtPmxlZnQtPmZsYWdzPT1JREVOVElGSUVSJiYhZmluZF92YXIocC0+bGVmdC0+aWRlbnRpZmllciwwKSl7CiAgICAvKiAgaW1wbGl6aXRlIERla2xhcmF0aW9uIGJlaSBBdWZydWYgZWluZXIgRnVua3Rpb24gICAgICovCiAgICBzdHJ1Y3RfZGVjbGFyYXRpb24gKnNkO3R5cGUgKnQ7VmFyICp2OwojaWZkZWYgSEFWRV9NSVNSQQovKiByZW1vdmVkICovCiNlbmRpZgogICAgZXJyb3IoMTYxLHAtPmxlZnQtPmlkZW50aWZpZXIpOwogICAgaWYodj1maW5kX2V4dF92YXIocC0+bGVmdC0+aWRlbnRpZmllcikpewogICAgICBpZighSVNGVU5DKHYtPnZ0eXAtPmZsYWdzKXx8di0+dnR5cC0+bmV4dC0+ZmxhZ3MhPUlOVCl7CgllcnJvcig2OCxwLT5sZWZ0LT5pZGVudGlmaWVyKTsKI2lmZGVmIEhBVkVfTUlTUkEKLyogcmVtb3ZlZCAqLwojZW5kaWYKICAgICAgfQogICAgICB2LT5mbGFncyY9fk5PVElOVFU7CiAgICB9ZWxzZXsJCiAgICAgIHNkPW15bWFsbG9jKHNpemVvZigqc2QpKTsKICAgICAgc2QtPmNvdW50PTA7CiAgICAgIHQ9bmV3X3R5cCgpOwogICAgICB0LT5mbGFncz1GVU5LVDsKICAgICAgdC0+ZXhhY3Q9YWRkX3NkKHNkLEZVTktUKTsKICAgICAgdC0+bmV4dD1uZXdfdHlwKCk7CiAgICAgIHQtPm5leHQtPmZsYWdzPUlOVDsKICAgICAgYWRkX3ZhcihwLT5sZWZ0LT5pZGVudGlmaWVyLHQsRVhURVJOLDApOwogICAgfQogIH0KI2lmIEhBVkVfQU9TNAogIGlmKGY9PUNBTEwmJnAtPmxlZnQtPmZsYWdzPT1EU1RSVUNUKXsKICAgIHRoaXNwPW5ld19ub2RlKCk7CiAgICB0aGlzcC0+ZmxhZ3M9QUREUkVTUzsKICAgIGFvczRlcnI9MDsKICAgIHRoaXNwLT5sZWZ0PWFvczRfY2xvbmVfdHJlZShwLT5sZWZ0LT5sZWZ0KTsKICAgIHRoaXNwLT5yaWdodD0wOwogICAgdGhpc3AtPmFsaXN0PTA7dGhpc3AtPmNsPTA7dGhpc3AtPmRzaXplPTA7dGhpc3AtPm50eXA9MDsKICB9CiNlbmRpZgojaWYgSEFWRV9FQ1BQCiAgaWYoZWNwcCYmZj09Q0FMTCl7CiAgICBhcmd1bWVudF9saXN0ICphbD1wLT5hbGlzdDsKICAgIGlmKGFsLyomJiFhbC0+YXJnLT5udHlwKi8pewogICAgICB3aGlsZShhbCl7CiAgICAgICAgaWYoIWFsLT5hcmcpIGllcnJvcigwKTsKICAgICAgICBpZighdHlwZV9leHByZXNzaW9uMihhbC0+YXJnLDApKSByZXR1cm4gMDsKICAgICAgICBhbC0+YXJnPW1ha2Vwb2ludGVyKGFsLT5hcmcpOwogICAgICAgIGlmKHR5cGVfdW5jb21wbGV0ZShhbC0+YXJnLT5udHlwKSkgZXJyb3IoMzkpOwogICAgICAgIGFsPWFsLT5uZXh0OwogICAgICB9CiAgICB9CiAgfQogIGlmKGVjcHAmJmY9PUNBTEwpewogICAgZWNwcF9tZXJrX2FsPWVjcHBfYWw7CiAgICBlY3BwX2FsPXAtPmFsaXN0OwogIH0KI2VuZGlmCiAgZG9udG9wdD0wOwogIGlmKGY9PUFERFJFU1MmJnAtPmxlZnQtPmZsYWdzPT1JREVOVElGSUVSKSB7cC0+bGVmdC0+ZmxhZ3N8PUNPTlNUQUREUjsvKnB1dHMoIiZjb25zdCIpOyovfQogIGlmKHR0eXAmJihmPT1PUnx8Zj09QU5EfHxmPT1YT1J8fGY9PUFERHx8Zj09U1VCfHxmPT1NVUxUfHxmPT1QTVVMVHx8Zj09RElWfHxmPT1NT0R8fGY9PUtPTVBMRU1FTlR8fGY9PU1JTlVTKSYmIUlTUE9JTlRFUih0dHlwLT5mbGFncykmJnNob3J0Y3V0KGY9PVBNVUxUP01VTFQ6Zix0dHlwLT5mbGFncyZOVSkpCiAgICBzaG9ydHR5cD10dHlwOwogIGVsc2UKICAgIHNob3J0dHlwPTA7CiAgaWYoYXNzaWdub3ApewogICAgYW9mbGFnPTE7CiAgICBhc3NpZ25vcD0wOwogIH1lbHNlCiAgICBhb2ZsYWc9MDsKCiAgaWYoIXNob3J0dHlwKXsKICAgIGlmKGY9PUVRVUFMfHxmPT1JTkVRVUFMKXsKICAgICAgaWYocC0+bGVmdC0+ZmxhZ3M9PUFORCkgc2hvcnR0eXA9YW5kY29tcChwLT5sZWZ0LHAtPnJpZ2h0KTsKICAgICAgaWYocC0+cmlnaHQtPmZsYWdzPT1BTkQpIHNob3J0dHlwPWFuZGNvbXAocC0+cmlnaHQscC0+bGVmdCk7CiAgICB9CiAgfQogIGlmKCFzaG9ydHR5cCYmKGY9PUxBTkR8fGY9PUxPUikmJnAtPmxlZnQtPmZsYWdzPT1BTkQpIHNob3J0dHlwPWFuZGNvbXAocC0+bGVmdCwwKTsKICBpZihwLT5sZWZ0JiZwLT5mbGFncyE9QVNTSUdOT1ApewogICAgc3RydWN0X2RlY2xhcmF0aW9uICpzZDsKICAgIC8qICBiZWkgQVNTSUdOT1Agd2lyZCBkZXIgbGlua2UgWndlaWcgZHVyY2ggZGVuIExpbmsgYmV3ZXJ0ZXQgICovCiAgICBpZighcC0+bGVmdCkgaWVycm9yKDApOwogICAgaWYocC0+ZmxhZ3M9PUNBU1QpCiAgICAgIG9rJj10eXBlX2V4cHJlc3Npb24yKHAtPmxlZnQscC0+bnR5cCk7CiAgICBlbHNlCiAgICAgIG9rJj10eXBlX2V4cHJlc3Npb24yKHAtPmxlZnQsc2hvcnR0eXApOwogICAgaWYocC0+bGVmdCkgcC0+c2lkZWZ4fD1wLT5sZWZ0LT5zaWRlZng7CiAgICBpZighb2spIHJldHVybiAwOwogIH0KICBpZihhb2ZsYWcpewogICAgaWYoIXAtPmxlZnR8fCFwLT5yaWdodCkgaWVycm9yKDApOwogICAgc2hvcnR0eXA9cC0+bGVmdC0+bnR5cDsKICAgIHR0eXA9c2hvcnR0eXA7CiAgICB0dGY9dHR5cC0+ZmxhZ3MmTlE7CiAgfQoKICBpZihmPT1MQU5EfHxmPT1MT1IpewogICAgc2hvcnR0eXA9MDsKICAgIGlmKHAtPnJpZ2h0LT5mbGFncz09QU5EKSBzaG9ydHR5cD1hbmRjb21wKHAtPnJpZ2h0LDApOwogIH0KCiAgaWYoZj09QUREKXsKICAgIGlmKHAtPmxlZnQtPmZsYWdzPT1BRERSRVNTU3x8cC0+bGVmdC0+ZmxhZ3M9PUFERFJFU1NBfHxwLT5sZWZ0LT5mbGFncz09QUREUkVTU1MpewogICAgICB6bWF4IHN6PXN6b2YocC0+bGVmdC0+bGVmdC0+bnR5cCk7CiAgICAgIHNob3J0dHlwPWJlc3RfYWRkaTJwdChzeik7CiAgICB9CiAgICBpZigocC0+bGVmdC0+bnR5cC0+ZmxhZ3MmTlEpPT1BUlJBWSl7CiAgICAgIHptYXggc3o9c3pvZihwLT5sZWZ0LT5udHlwKTsKICAgICAgc2hvcnR0eXA9YmVzdF9hZGRpMnB0KHN6KTsKICAgICAgaWYoc2hvcnR0eXApewoJbnAgbmV3PW5ld19ub2RlKCk7CgluZXctPmZsYWdzPUNBU1Q7CgluZXctPm50eXA9Y2xvbmVfdHlwKHNob3J0dHlwKTsKCW5ldy0+bGVmdD1wLT5yaWdodDsKCXAtPnJpZ2h0PW5ldzsKICAgICAgfQogICAgfQogIH0KICBpZihwLT5yaWdodCYmcC0+cmlnaHQtPmZsYWdzIT1NRU1CRVIpewogICAgc3RydWN0X2RlY2xhcmF0aW9uICpzZDsKICAgIGlmKHAtPmZsYWdzPT1BU1NJR05PUCl7CiAgICAgIGRvbnRvcHQ9MTsKICAgICAgYXNzaWdub3A9MTsKICAgIH1lbHNlCiAgICAgIGRvbnRvcHQ9MDsKICAgIGlmKHAtPmZsYWdzPT1BU1NJR04pCiAgICAgIG9rJj10eXBlX2V4cHJlc3Npb24yKHAtPnJpZ2h0LHAtPmxlZnQtPm50eXApOwogICAgZWxzZQogICAgICBvayY9dHlwZV9leHByZXNzaW9uMihwLT5yaWdodCxzaG9ydHR5cCk7CiAgICBwLT5zaWRlZnh8PXAtPnJpZ2h0LT5zaWRlZng7CiAgICBpZighb2spIHJldHVybiAwOwogIH0KI2lmIEhBVkVfQU9TNAogIGlmKHRoaXNwKXsKICAgIGlmKGFvczRfYXR0cihwLT5sZWZ0LT5udHlwLCJsaWJjYWxsIikpewogICAgICBhcmd1bWVudF9saXN0ICpuPW15bWFsbG9jKHNpemVvZigqbikpOwogICAgICBuLT5hcmc9dGhpc3A7CiAgICAgIG4tPm5leHQ9cC0+YWxpc3Q7CiAgICAgIG4tPnB1c2hpYz0wOwogICAgICBwLT5hbGlzdD1uOwogICAgICBpZihhb3M0ZXJyKSB7cHJlKHN0ZG91dCx0aGlzcCk7aWVycm9yKDApO30KICAgIH1lbHNlewogICAgICBmcmVlX2V4cHJlc3Npb24odGhpc3ApOwogICAgfQogIH0KI2VuZGlmCiNpZiBIQVZFX0VDUFAKICBpZihlY3BwJiZmPT1DQUxMKXsKICAgIGVjcHBfYWw9ZWNwcF9tZXJrX2FsOwogIH0KI2VuZGlmCi8qICAgIHByaW50ZigiYmVhcmJlaXRlICVzXG4iLGVuYW1lW3AtPmZsYWdzXSk7Ki8KLyogIEVyemV1Z3VuZyB2b24gWmVpZ2VybiBhdXMgQXJyYXlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBIaWVyIG11c3Mgbm9jaCBlaW5pZ2VzIGdlbmF1ZXIgd2VyZGVuICh3aWUgZ2Vob2VydCBkYXM/KSAgICAqLwogIGlmKHAtPmxlZnQmJmYhPVBDRVhQUiYmKElTQVJSQVkocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpfHxJU0ZVTkMocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKSl7CiAgICBpZihmIT1BRERSRVNTJiZmIT1BRERSRVNTQSYmZiE9QUREUkVTU1MmJmYhPUZJUlNURUxFTUVOVCYmZiE9RFNUUlVDVCYmKGY8UFJFSU5DfHxmPlBPU1RERUMpJiYoZjxBU1NJR058fGY+QVNTSUdOT1ApKXsKICAgICAgbnAgbmV3PW5ld19ub2RlKCk7CiAgICAgIHptYXggc3o9c3pvZihwLT5sZWZ0LT5udHlwKTsKICAgICAgaWYoKHAtPmxlZnQtPm50eXAtPmZsYWdzJk5RKT09QVJSQVkpIG5ldy0+ZmxhZ3M9QUREUkVTU0E7CiAgICAgIGVsc2UgbmV3LT5mbGFncz1BRERSRVNTOwogICAgICBuZXctPm50eXA9MDsKICAgICAgbmV3LT5sZWZ0PXAtPmxlZnQ7CiAgICAgIG5ldy0+cmlnaHQ9MDtuZXctPmx2YWx1ZT0wO25ldy0+c2lkZWZ4PTA7IC8qIHNpbmQgc2lkZWZ4IGltbWVyIDA/ICovCiAgICAgIHAtPmxlZnQ9bmV3OwogICAgICBvayY9dHlwZV9leHByZXNzaW9uMihwLT5sZWZ0LDApOwogICAgfQogIH0KICBpZihwLT5yaWdodCYmZiE9UENFWFBSJiZmIT1GSVJTVEVMRU1FTlQmJmYhPURTVFJVQ1QmJmYhPUFERFJFU1NTJiZwLT5yaWdodC0+bnR5cCYmKElTQVJSQVkocC0+cmlnaHQtPm50eXAtPmZsYWdzKXx8SVNGVU5DKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpKXsKICAgIG5wIG5ldz1uZXdfbm9kZSgpOwogICAgaWYoSVNBUlJBWShwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpKSBuZXctPmZsYWdzPUFERFJFU1NBOwogICAgZWxzZSBuZXctPmZsYWdzPUFERFJFU1M7CiAgICBuZXctPm50eXA9MDsKICAgIG5ldy0+bGVmdD1wLT5yaWdodDsKICAgIG5ldy0+cmlnaHQ9MDtuZXctPmx2YWx1ZT0wO25ldy0+c2lkZWZ4PTA7IC8qIHNpbmQgc2lkZWZ4IGltbWVyIDA/ICovCiAgICBwLT5yaWdodD1uZXc7CiAgICBvayY9dHlwZV9leHByZXNzaW9uMihwLT5yaWdodCwwKTsKICB9CgogIGlmKGY9PUlERU5USUZJRVJ8fGY9PShJREVOVElGSUVSfENPTlNUQUREUikpewogICAgaW50IGZmO1ZhciAqdjsKI2lmZGVmIEhBVkVfRUNQUAovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCiNlbmRpZgogICAgaWYoIWVjcHApewogICAgICBpZihwLT5pZGVudGlmaWVyPT1lbXB0eSkKCS8qIHZhcmlhYmxlIHNpemVvZi1leHByZXNzaW9uICovCgl2PXAtPmRzaXplOwogICAgICBlbHNlewoJY2hhciBidWZbMjBdOwoJdj1maW5kX3ZhcihwLT5pZGVudGlmaWVyLDApOwoJaWYodiYmdi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKCSAgaWYoIXN0cmNtcChwLT5pZGVudGlmaWVyLCJzdHJ0b2QiKSl7c3ByaW50ZihidWYsInZmc2NhbmYuJWxkIiwxfFVTRUZMT0FUKTtuZWVkcyhidWYpO30KCSAgaWYoIXN0cmNtcChwLT5pZGVudGlmaWVyLCJzdHJ0b2YiKSl7c3ByaW50ZihidWYsInZzY2FuZi4lbGQiLDF8VVNFRkxPQVQpO25lZWRzKGJ1Zik7fQoJICBpZighc3RyY21wKHAtPmlkZW50aWZpZXIsImF0b2YiKSl7c3ByaW50ZihidWYsInZzY2FuZi4lbGQiLDF8VVNFRkxPQVQpO25lZWRzKGJ1Zik7fQoJICBpZighc3RyY21wKHAtPmlkZW50aWZpZXIsInRtcG5hbSIpKXtzcHJpbnRmKGJ1ZiwidmZwcmludGYuJWxkIiwxfFVTRURFQyk7bmVlZHMoYnVmKTt9CgkgIGlmKCFzdHJjbXAocC0+aWRlbnRpZmllciwiZm9wZW4iKSl7CgkgICAgbmVlZHMoIl9fcmVhZC4yIik7CgkgICAgbmVlZHMoIl9fd3JpdGUuMiIpOwoJICAgIG5lZWRzKCJzdGRpbi4yIik7CgkgICAgbmVlZHMoInN0ZG91dC4yIik7CgkgICAgbmVlZHMoInN0ZGVyci4yIik7CgkgIH0KCX0KICAgICAgfQogICAgfQogICAgaWYodj09MCl7ZXJyb3IoODIscC0+aWRlbnRpZmllcik7cmV0dXJuKDApO30KICAgIGlmKGRpc2FsbG93X3N0YXRpY3MmJnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQyYmdi0+bmVzdGluZz09MCYmKnYtPmlkZW50aWZpZXIpewogICAgICBlcnJvcigzMDIsdi0+aWRlbnRpZmllcik7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgZmY9di0+dnR5cC0+ZmxhZ3MmTlE7CiAgICBpZihJU0FSSVRIKGZmKXx8SVNQT0lOVEVSKGZmKXx8SVNTVFJVQ1QoZmYpfHxJU1VOSU9OKGZmKXx8SVNWRUNUT1IoZmYpKSBwLT5sdmFsdWU9MTsKICAgIHAtPm50eXA9Y2xvbmVfdHlwKHYtPnZ0eXApOwogICAgLyogIGFyaXRobWV0aXNjaGVuIGNvbnN0IFR5cCBhbHMgS29uc3RhbnRlIGJlaGFuZGVsbiwgZGFzIG11c3Mgbm9jaAoJZGV1dGxpY2ggYW5kZXJzIHdlcmRlbiwgYmV2b3IgbWFuIGVzIHdpcmtsaWNoIHNvIG1hY2hlbiBrYW5uCiAgICAgICAgaWYoKHAtPm50eXAtPmZsYWdzJkNPTlNUKSYmSVNBUklUSChwLT5udHlwLT5mbGFncykmJnYtPmNsaXN0JiYhKGYmQ09OU1RBRERSKSl7CglwLT5mbGFncz1DRVhQUjsKCXAtPnZhbD12LT5jbGlzdC0+dmFsOwoJdi0+ZmxhZ3N8PVVTRURBU1NPVVJDRTsKICAgICAgICB9Ki8KICAgIHAtPmZsYWdzJj1+Q09OU1RBRERSOwogICAgaWYoKHAtPm50eXAtPmZsYWdzJk5RKT09RU5VTSl7CiAgICAgIC8qICBlbnVtZXJhdGlvbnMgYXVjaCBhbHMgS29uc3RhbnRlIChpbnQpIGJlaGFuZGVsbiAqLwogICAgICBwLT5mbGFncz1DRVhQUjsKICAgICAgaWYoIXYtPmNsaXN0KSBpZXJyb3IoMCk7CiAgICAgIHAtPnZhbD12LT5jbGlzdC0+dmFsOwogICAgICBwLT5udHlwLT5mbGFncz1DT05TVHxJTlQ7CiAgICB9CiAgICBwLT5vLnY9djsKICAgIGlmIChwLT5udHlwLT5mbGFncyZWT0xBVElMRSkgcC0+c2lkZWZ4PTE7IC8qIFRvdWNoaW5nIGEgdm9sYXRpbGUgbWF5IGhhdmUgc2lkZSBlZmZlY3RzICovCiAgICByZXR1cm4gMTsKICB9CgogIGlmKGY9PUNFWFBSfHxmPT1QQ0VYUFJ8fGY9PVNUUklORykgcmV0dXJuIDE7CgogIGlmKGY9PVJFSU5URVJQUkVUKXsKICAgIC8qIHRvZG86IGFkZCBjaGVja3MgKi8KICAgIHJldHVybiAxOwogIH0KCiAgaWYoZj09QklURklFTEQpIHJldHVybiAxOwoKICBpZihmPT1MSVRFUkFMKXsKICAgIHAtPmx2YWx1ZT0xOwogICAgcmV0dXJuIDE7CiAgfQoKICBpZihmPT1LT01NQSl7CiAgICBpZihjb25zdF9leHByKXtlcnJvcig0Nik7cmV0dXJuIDA7fQogICAgcC0+bnR5cD1jbG9uZV90eXAocC0+cmlnaHQtPm50eXApOwogICAgaWYoZj09Q0VYUFIpIHAtPnZhbD1wLT5yaWdodC0+dmFsOwogICAgcmV0dXJuIG9rOwogIH0KICBpZihmPT1BU1NJR058fGY9PUFTU0lHTk9QKXsKICAgIGlmKCFwKSBpZXJyb3IoMCk7CiAgICBpZighcC0+bGVmdCkgaWVycm9yKDApOwogICAgaWYocC0+bGVmdC0+bHZhbHVlPT0wKSB7ZXJyb3IoODYpOy8qcHJkKHAtPmxlZnQtPm50eXApOyovcmV0dXJuIDA7fQogICAgaWYoY29uc3RfdHlwKHAtPmxlZnQtPm50eXApKSB7ZXJyb3IoODcpO3JldHVybiAwO30KICAgIGlmKHR5cGVfdW5jb21wbGV0ZShwLT5sZWZ0LT5udHlwKSkge2Vycm9yKDg4KTtyZXR1cm4gMDt9CiAgICBpZih0eXBlX3VuY29tcGxldGUocC0+cmlnaHQtPm50eXApKSB7ZXJyb3IoODgpO3JldHVybiAwO30KICAgIHAtPm50eXA9Y2xvbmVfdHlwKHAtPmxlZnQtPm50eXApOwogICAgcC0+c2lkZWZ4PTE7CiAgICByZXR1cm4odGVzdF9hc3NpZ25tZW50KHAtPmxlZnQtPm50eXAscC0+cmlnaHQpKTsKICB9CiAgaWYoZj09TE9SfHxmPT1MQU5EKXsKICAgIGludCBhMT0tMSxhMj0tMSxtOwogICAgaWYoSVNWRUNUT1IocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXsKICAgICAgaWYoSVNWRUNUT1IocC0+cmlnaHQtPm50eXAtPmZsYWdzKSl7CglpZigocC0+bGVmdC0+bnR5cC0+ZmxhZ3MmTlUpIT0ocC0+cmlnaHQtPm50eXAtPmZsYWdzJk5VKSl7ZXJyb3IoODkpO3JldHVybiAwO30KICAgICAgfWVsc2V7CglpZighSVNJTlQocC0+cmlnaHQtPm50eXAtPmZsYWdzKSl7ZXJyb3IoODkpO3JldHVybiAwO30KICAgICAgfQogICAgICBwLT5udHlwPW5ld190eXAoKTsKICAgICAgcC0+bnR5cC0+ZmxhZ3M9cC0+bGVmdC0+bnR5cC0+ZmxhZ3MmTlE7CiAgICAgIHJldHVybiBvazsKICAgIH0KICAgIGlmKElTVkVDVE9SKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpewogICAgICBpZighSVNJTlQocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXtlcnJvcig4OSk7cmV0dXJuIDA7fQogICAgICBwLT5udHlwLT5mbGFncz1wLT5yaWdodC0+bnR5cC0+ZmxhZ3MmTlE7CiAgICAgIHJldHVybiBvazsKICAgIH0KICAgIGlmKGY9PUxBTkQpIG09MTsgZWxzZSBtPTA7CiNpZmRlZiBIQVZFX01JU1JBCi8qIHJlbW92ZWQgKi8KI2VuZGlmCiAgICBwLT5udHlwPW5ld190eXAoKTsKICAgIHAtPm50eXAtPmZsYWdzPUlOVDsKICAgIGlmKCFJU0FSSVRIKHAtPmxlZnQtPm50eXAtPmZsYWdzKSYmIUlTUE9JTlRFUihwLT5sZWZ0LT5udHlwLT5mbGFncykpCiAgICAgIHtlcnJvcig4OSk7b2s9MDt9CiAgICBpZighSVNBUklUSChwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpJiYhSVNQT0lOVEVSKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpCiAgICAgIHtlcnJvcig4OSk7b2s9MDt9CiAgICBpZihwLT5sZWZ0LT5mbGFncz09Q0VYUFIpewogICAgICBldmFsX2NvbnN0bihwLT5sZWZ0KTsKICAgICAgaWYoIXpsZGVxdG8odmxkb3VibGUsZDJ6bGQoMC4wKSl8fCF6dW1lcXRvKHZ1bWF4LHVsMnp1bSgwVUwpKXx8IXptZXF0byh2bWF4LGwyem0oMEwpKSkgYTE9MTsgZWxzZSBhMT0wOwogICAgfQogICAgaWYocC0+cmlnaHQtPmZsYWdzPT1DRVhQUil7CiAgICAgIGV2YWxfY29uc3RuKHAtPnJpZ2h0KTsKICAgICAgaWYoIXpsZGVxdG8odmxkb3VibGUsZDJ6bGQoMC4wKSl8fCF6dW1lcXRvKHZ1bWF4LHVsMnp1bSgwVUwpKXx8IXptZXF0byh2bWF4LGwyem0oMEwpKSkgYTI9MTsgZWxzZSBhMj0wOwogICAgfQogICAgaWYoYTE9PTEtbXx8YTI9PTEtbXx8KGExPT1tJiZhMj09bSkpewogICAgICBwLT5mbGFncz1DRVhQUjtwLT5zaWRlZng9MDsKICAgICAgaWYoIXAtPmxlZnQtPnNpZGVmeCkge2ZyZWVfZXhwcmVzc2lvbihwLT5sZWZ0KTtwLT5sZWZ0PTA7fSBlbHNlIHAtPnNpZGVmeD0xOwogICAgICBpZighcC0+cmlnaHQtPnNpZGVmeHx8YTE9PTEtbSkge2ZyZWVfZXhwcmVzc2lvbihwLT5yaWdodCk7cC0+cmlnaHQ9MDt9IGVsc2UgcC0+c2lkZWZ4PTA7CiAgICAgIGlmKGExPT0xLW18fGEyPT0xLW0pIHtwLT52YWwudmludD16bTJ6aShsMnptKChsb25nKSgxLW0pKSk7fQogICAgICBlbHNlIHtwLT52YWwudmludD16bTJ6aShsMnptKChsb25nKW0pKTt9CiAgICB9CiAgICByZXR1cm4gb2s7CiAgfQogIGlmKGY9PU9SfHxmPT1BTkR8fGY9PVhPUil7CiAgICBpZihJU1ZFQ1RPUihwLT5sZWZ0LT5udHlwLT5mbGFncykpewogICAgICBpZighSVNJTlQoVkVDVFlQRShwLT5sZWZ0LT5udHlwLT5mbGFncykpKXtlcnJvcig5MCk7cmV0dXJuIDA7fQogICAgICBpZihJU1ZFQ1RPUihwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpKXsKCWlmKChwLT5sZWZ0LT5udHlwLT5mbGFncyZOVSkhPShwLT5yaWdodC0+bnR5cC0+ZmxhZ3MmTlUpKXtlcnJvcig5OCk7cmV0dXJuIDA7fQogICAgICB9ZWxzZXsKCWlmKCFJU0lOVChwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpKXtlcnJvcig5MCk7cmV0dXJuIDA7fQogICAgICB9CiAgICAgIHAtPm50eXA9Y2xvbmVfdHlwKHAtPmxlZnQtPm50eXApOwogICAgICByZXR1cm4gb2s7CiAgICB9CiAgICBpZihJU1ZFQ1RPUihwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpKXsKICAgICAgaWYoIUlTSU5UKFZFQ1RZUEUocC0+cmlnaHQtPm50eXAtPmZsYWdzKSkpe2Vycm9yKDkwKTtyZXR1cm4gMDt9CiAgICAgIGlmKCFJU0lOVChwLT5sZWZ0LT5udHlwLT5mbGFncykpe2Vycm9yKDkwKTtyZXR1cm4gMDt9CiAgICAgIHAtPm50eXA9Y2xvbmVfdHlwKHAtPnJpZ2h0LT5udHlwKTsKICAgICAgcmV0dXJuIG9rOwogICAgfQogICAgaWYoIUlTSU5UKHAtPmxlZnQtPm50eXAtPmZsYWdzKSl7ZXJyb3IoOTApO3JldHVybiAwO30KICAgIGlmKCFJU0lOVChwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpKXtlcnJvcig5MCk7cmV0dXJuIDA7fQojaWZkZWYgSEFWRV9NSVNSQQovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KI2VuZGlmCiAgICBpZih0dHlwJiZkZWNpZGVfc2hvcnRjdXQocCx0dHlwKSkKICAgICAgcC0+bnR5cD1jbG9uZV90eXAodHR5cCk7CiAgICBlbHNlCiAgICAgIHAtPm50eXA9YXJpdGhfdHlwKHAtPmxlZnQtPm50eXAscC0+cmlnaHQtPm50eXApOwogICAgaWYoIW1vcHQpewogICAgICBpZighYWxnX29wdChwLHR0eXApKSBpZXJyb3IoMCk7CiAgICB9CiAgICByZXR1cm4gb2s7CiAgfQogIGlmKGY9PUxFU1N8fGY9PUxFU1NFUXx8Zj09R1JFQVRFUnx8Zj09R1JFQVRFUkVRfHxmPT1FUVVBTHx8Zj09SU5FUVVBTCl7CiAgICAvKiAgaGllciBub2NoIGVpbmlnZSBBYmZyYWdlbiBmdWVyIHNpY2hlcmUgRW50c2NoZWlkdW5nZW4gZWluYmF1ZW4gICovCiAgICAvKiAgei5CLiB1bmlnbmVkL3NpZ25lZC1WZXJnbGVpY2hlIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAvKiAgZGllIHZhbC52aW50PTAvMS1adXdlaXN1bmdlbiBtdWVzc2VuIG5vY2ggYW4gemludCBhbmdlcGFzc3QgICAgICovCiAgICAvKiAgd2VyZGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB6bWF4IHMxLHMyO3p1bWF4IHUxLHUyO3psZG91YmxlIGQxLGQyO2ludCBjPTA7CiAgICB0eXBlICp0OwogICAgaWYoSVNWRUNUT1IocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXsKICAgICAgaWYoSVNWRUNUT1IocC0+cmlnaHQtPm50eXAtPmZsYWdzKSl7CglpZigocC0+bGVmdC0+bnR5cC0+ZmxhZ3MmTlUpIT0ocC0+cmlnaHQtPm50eXAtPmZsYWdzJk5VKSl7ZXJyb3IoODkpO3JldHVybiAwO30KICAgICAgfQogICAgICBwLT5udHlwPW5ld190eXAoKTsKICAgICAgaWYoSVNGTE9BVChWRUNUWVBFKHAtPmxlZnQtPm50eXAtPmZsYWdzKSkpCglwLT5udHlwLT5mbGFncz1ta3ZlYyhJTlQsVkVDRElNKHAtPmxlZnQtPm50eXAtPmZsYWdzKSk7CiAgICAgIGVsc2UKCXAtPm50eXAtPmZsYWdzPXAtPmxlZnQtPm50eXAtPmZsYWdzJk5ROwogICAgICByZXR1cm4gb2s7CiAgICB9CiAgICBpZihJU1ZFQ1RPUihwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpKXsKICAgICAgcC0+bnR5cD1uZXdfdHlwKCk7CiAgICAgIGlmKElTRkxPQVQoVkVDVFlQRShwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpKSkKCXAtPm50eXAtPmZsYWdzPW1rdmVjKElOVCxWRUNESU0ocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKTsKICAgICAgZWxzZQoJcC0+bnR5cC0+ZmxhZ3M9cC0+cmlnaHQtPm50eXAtPmZsYWdzJk5ROwogICAgICByZXR1cm4gb2s7CiAgICB9CiNpZmRlZiBIQVZFX01JU1JBCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KI2VuZGlmCiAgICBpZighSVNBUklUSChwLT5sZWZ0LT5udHlwLT5mbGFncyl8fCFJU0FSSVRIKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpewogICAgICBpZighSVNQT0lOVEVSKHAtPmxlZnQtPm50eXAtPmZsYWdzKXx8IUlTUE9JTlRFUihwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpKXsKCWlmKGYhPUVRVUFMJiZmIT1JTkVRVUFMKXsKCSAgZXJyb3IoOTIpO3JldHVybiAwOwoJfWVsc2V7CgkgIGlmKCghSVNQT0lOVEVSKHAtPmxlZnQtPm50eXAtPmZsYWdzKXx8cC0+cmlnaHQtPmZsYWdzIT1DRVhQUikmJgoJICAgICAoIUlTUE9JTlRFUihwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpfHxwLT5sZWZ0LT5mbGFncyE9Q0VYUFIpKXsKCSAgICBlcnJvcig5Myk7cmV0dXJuIDA7CgkgIH1lbHNlewoJICAgIGlmKHAtPmxlZnQtPmZsYWdzPT1DRVhQUikgZXZhbF9jb25zdG4ocC0+bGVmdCk7CgkgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgIGV2YWxfY29uc3RuKHAtPnJpZ2h0KTsKCSAgICBpZighemxkZXF0byh2bGRvdWJsZSxkMnpsZCgwLjApKXx8IXptZXF0byh2bWF4LGwyem0oMEwpKXx8IXp1bWVxdG8odnVtYXgsdWwyenVtKDBVTCkpKQoJICAgICAge2Vycm9yKDQwKTtyZXR1cm4gMDt9CgkgIH0KCX0KICAgICAgfWVsc2V7CglpZihjb21wYXRpYmxlX3R5cGVzKHAtPmxlZnQtPm50eXAtPm5leHQscC0+cmlnaHQtPm50eXAtPm5leHQsTlEpKXsKCX1lbHNlewoJICBpZihmIT1FUVVBTCYmZiE9SU5FUVVBTCkgZXJyb3IoNDEpOwoJICBpZigocC0+bGVmdC0+bnR5cC0+bmV4dC0+ZmxhZ3MmTlEpIT1WT0lEJiYocC0+cmlnaHQtPm50eXAtPm5leHQtPmZsYWdzJk5RKSE9Vk9JRCkKCSAgICB7ZXJyb3IoNDEpO30KCX0KICAgICAgfQogICAgfQogICAgaWYocC0+bGVmdC0+ZmxhZ3M9PUNFWFBSKXsKICAgICAgZXZhbF9jb25zdG4ocC0+bGVmdCk7CiAgICAgIGQxPXZsZG91YmxlO3UxPXZ1bWF4O3MxPXZtYXg7Y3w9MTsKICAgICAgaWYoKHAtPnJpZ2h0LT5udHlwLT5mbGFncyZVTlNJR05FRCkmJiEocC0+bGVmdC0+bnR5cC0+ZmxhZ3MmVU5TSUdORUQpKXsKCWlmKHpsZGxlcShkMSxkMnpsZCgwLjApKSYmem1sZXEoczEsbDJ6bSgwTCkpKXsKCSAgaWYoIXpsZGVxdG8oZDEsZDJ6bGQoMC4wKSl8fCF6bWVxdG8oczEsbDJ6bSgwTCkpKXsKCSAgICBpZih6dW1sZXEodHVfbWF4W3AtPnJpZ2h0LT5udHlwLT5mbGFncyZOUV0sdF9tYXhbcC0+bGVmdC0+bnR5cC0+ZmxhZ3MmTlFdKSkKCSAgICAgIGVycm9yKDE2NSk7CgkgIH1lbHNlewoJICAgIGlmKGY9PUdSRUFURVJ8fGY9PUxFU1NFUSkgZXJyb3IoMTY1KTsKCSAgfQoJfQogICAgICB9CiAgICB9CiAgICBpZihwLT5yaWdodC0+ZmxhZ3M9PUNFWFBSKXsKICAgICAgZXZhbF9jb25zdG4ocC0+cmlnaHQpOwogICAgICBkMj12bGRvdWJsZTt1Mj12dW1heDtzMj12bWF4O2N8PTI7CiAgICAgIGlmKChwLT5sZWZ0LT5udHlwLT5mbGFncyZVTlNJR05FRCkmJiEocC0+cmlnaHQtPm50eXAtPmZsYWdzJlVOU0lHTkVEKSl7CglpZih6bGRsZXEoZDIsZDJ6bGQoMC4wKSkmJnptbGVxKHMyLGwyem0oMEwpKSl7CgkgIGlmKCF6bGRlcXRvKGQyLGQyemxkKDAuMCkpfHwhem1lcXRvKHMyLGwyem0oMEwpKSl7CgkgICAgaWYoenVtbGVxKHR1X21heFtwLT5sZWZ0LT5udHlwLT5mbGFncyZOUV0sdF9tYXhbcC0+cmlnaHQtPm50eXAtPmZsYWdzJk5RXSkpCgkgICAgICBlcnJvcigxNjUpOwoJICB9ZWxzZXsKCSAgICBpZihmPT1MRVNTfHxmPT1HUkVBVEVSRVEpIGVycm9yKDE2NSk7CgkgIH0KCX0KICAgICAgfQogICAgfQogICAgcC0+bnR5cD1uZXdfdHlwKCk7CiAgICBwLT5udHlwLT5mbGFncz1JTlQ7CiAgICBpZihjPT0zKXsKICAgICAgcC0+ZmxhZ3M9Q0VYUFI7CiAgICAgIHQ9YXJpdGhfdHlwKHAtPmxlZnQtPm50eXAscC0+cmlnaHQtPm50eXApOwogICAgICBpZighcC0+bGVmdC0+c2lkZWZ4KSB7ZnJlZV9leHByZXNzaW9uKHAtPmxlZnQpO3AtPmxlZnQ9MDt9CiAgICAgIGlmKCFwLT5yaWdodC0+c2lkZWZ4KSB7ZnJlZV9leHByZXNzaW9uKHAtPnJpZ2h0KTtwLT5yaWdodD0wO30KICAgICAgaWYoSVNGTE9BVCh0LT5mbGFncykpewoJaWYoZj09RVFVQUwpIHAtPnZhbC52aW50PXptMnppKGwyem0oKGxvbmcpemxkZXF0byhkMSxkMikpKTsKCWlmKGY9PUlORVFVQUwpIHAtPnZhbC52aW50PXptMnppKGwyem0oKGxvbmcpIXpsZGVxdG8oZDEsZDIpKSk7CglpZihmPT1MRVNTRVEpIHAtPnZhbC52aW50PXptMnppKGwyem0oKGxvbmcpemxkbGVxKGQxLGQyKSkpOwoJaWYoZj09R1JFQVRFUikgcC0+dmFsLnZpbnQ9em0yemkobDJ6bSgobG9uZykhemxkbGVxKGQxLGQyKSkpOwoJaWYoZj09TEVTUyl7CgkgIGlmKHpsZGxlcShkMSxkMikmJiF6bGRlcXRvKGQxLGQyKSkKCSAgICBwLT52YWwudmludD16bTJ6aShsMnptKDFMKSk7CgkgIGVsc2UKCSAgICBwLT52YWwudmludD16bTJ6aShsMnptKDBMKSk7Cgl9CglpZihmPT1HUkVBVEVSRVEpewoJICBpZighemxkbGVxKGQxLGQyKXx8emxkZXF0byhkMSxkMikpCgkgICAgcC0+dmFsLnZpbnQ9em0yemkobDJ6bSgxTCkpOwoJICBlbHNlCgkgICAgcC0+dmFsLnZpbnQ9em0yemkobDJ6bSgwTCkpOwoJfQogICAgICB9ZWxzZXsKCWlmKHQtPmZsYWdzJlVOU0lHTkVEKXsKCSAgaWYoZj09RVFVQUwpIHAtPnZhbC52aW50PXptMnppKGwyem0oKGxvbmcpenVtZXF0byh1MSx1MikpKTsKCSAgaWYoZj09SU5FUVVBTCkgcC0+dmFsLnZpbnQ9em0yemkobDJ6bSgobG9uZykhenVtZXF0byh1MSx1MikpKTsKCSAgaWYoZj09TEVTU0VRKSBwLT52YWwudmludD16bTJ6aShsMnptKChsb25nKXp1bWxlcSh1MSx1MikpKTsKCSAgaWYoZj09R1JFQVRFUikgcC0+dmFsLnZpbnQ9em0yemkobDJ6bSgobG9uZykhenVtbGVxKHUxLHUyKSkpOwoJICBpZihmPT1MRVNTKXsKCSAgICBpZih6dW1sZXEodTEsdTIpJiYhenVtZXF0byh1MSx1MikpCgkgICAgICBwLT52YWwudmludD16bTJ6aShsMnptKDFMKSk7CgkgICAgZWxzZQoJICAgICAgcC0+dmFsLnZpbnQ9em0yemkobDJ6bSgwTCkpOwoJICB9CgkgIGlmKGY9PUdSRUFURVJFUSl7CgkgICAgaWYoIXp1bWxlcSh1MSx1Mil8fHp1bWVxdG8odTEsdTIpKQoJICAgICAgcC0+dmFsLnZpbnQ9em0yemkobDJ6bSgxTCkpOwoJICAgIGVsc2UgCgkgICAgICBwLT52YWwudmludD16bTJ6aShsMnptKDBMKSk7CgkgIH0KCX1lbHNlewoJICBpZihmPT1FUVVBTCkgcC0+dmFsLnZpbnQ9em0yemkobDJ6bSgobG9uZyl6bWVxdG8oczEsczIpKSk7CgkgIGlmKGY9PUlORVFVQUwpIHAtPnZhbC52aW50PXptMnppKGwyem0oKGxvbmcpIXptZXF0byhzMSxzMikpKTsKCSAgaWYoZj09TEVTU0VRKSBwLT52YWwudmludD16bTJ6aShsMnptKChsb25nKXptbGVxKHMxLHMyKSkpOwoJICBpZihmPT1HUkVBVEVSKSBwLT52YWwudmludD16bTJ6aShsMnptKChsb25nKSF6bWxlcShzMSxzMikpKTsKCSAgaWYoZj09TEVTUyl7CgkgICAgaWYoem1sZXEoczEsczIpJiYhem1lcXRvKHMxLHMyKSkKCSAgICAgIHAtPnZhbC52aW50PXptMnppKGwyem0oMUwpKTsKCSAgICBlbHNlIAoJICAgICAgcC0+dmFsLnZpbnQ9em0yemkobDJ6bSgwTCkpOwoJICB9CgkgIGlmKGY9PUdSRUFURVJFUSl7CgkgICAgaWYoIXptbGVxKHMxLHMyKXx8em1lcXRvKHMxLHMyKSkKCSAgICAgIHAtPnZhbC52aW50PXptMnppKGwyem0oMUwpKTsKCSAgICBlbHNlIAoJICAgICAgcC0+dmFsLnZpbnQ9em0yemkobDJ6bSgwTCkpOwoJICB9Cgl9CiAgICAgIH0KICAgICAgZnJlZXR5cCh0KTsKICAgIH0KICAgIHJldHVybiBvazsKICB9CiAgaWYoZj09QUREfHxmPT1TVUJ8fGY9PU1VTFR8fGY9PURJVnx8Zj09TU9EfHxmPT1MU0hJRlR8fGY9PVJTSElGVHx8Zj09UE1VTFQpewogICAgaWYoSVNWRUNUT1IocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXsKICAgICAgaWYoKGY9PU1PRHx8Zj09TFNISUZUfHxmPT1SU0hJRlQpJiZJU0ZMT0FUKFZFQ1RZUEUocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKSl7CgllcnJvcig5OCk7CglyZXR1cm4gMDsKICAgICAgfQogICAgICBpZihJU0FSSVRIKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpewoJcC0+bnR5cD1jbG9uZV90eXAocC0+bGVmdC0+bnR5cCk7CglyZXR1cm4gb2s7CiAgICAgIH0KICAgICAgaWYoKHAtPmxlZnQtPm50eXAtPmZsYWdzJk5VKT09KHAtPnJpZ2h0LT5udHlwLT5mbGFncyZOVSkpewoJcC0+bnR5cD1jbG9uZV90eXAocC0+bGVmdC0+bnR5cCk7CglyZXR1cm4gb2s7CiAgICAgIH0KICAgICAgZXJyb3IoOTgpOwogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmKElTVkVDVE9SKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpewogICAgICBpZigoZj09TU9EfHxmPT1MU0hJRlR8fGY9PVJTSElGVCkmJklTRkxPQVQoVkVDVFlQRShwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpKSl7CgllcnJvcig5OCk7CglyZXR1cm4gMDsKICAgICAgfQogICAgICBpZihJU0FSSVRIKHAtPmxlZnQtPm50eXAtPmZsYWdzKSl7CglwLT5udHlwPWNsb25lX3R5cChwLT5yaWdodC0+bnR5cCk7CglyZXR1cm4gb2s7CiAgICAgIH0KICAgICAgZXJyb3IoOTgpOwogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmKCFJU0FSSVRIKHAtPmxlZnQtPm50eXAtPmZsYWdzKXx8IUlTQVJJVEgocC0+cmlnaHQtPm50eXAtPmZsYWdzKSl7CiAgICAgIG5wIG5ldzt6bWF4IHN6OyBpbnQgdHlwZj0wOwojaWZkZWYgTUFYQURESTJQCiAgICAgIHN0YXRpYyB0eXBlIHBtdD17TUFYQURESTJQfTsKI2VuZGlmCiAgICAgIGlmKGYhPUFERCYmZiE9U1VCKXtlcnJvcig5NCk7cmV0dXJuIDA7fQojaWZkZWYgSEFWRV9NSVNSQQovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KI2VuZGlmCiAgICAgIGlmKElTUE9JTlRFUihwLT5sZWZ0LT5udHlwLT5mbGFncykpewoJaWYoKHAtPmxlZnQtPm50eXAtPm5leHQtPmZsYWdzJk5RKT09Vk9JRCkKCSAge2Vycm9yKDk1KTtyZXR1cm4gMDt9CglpZihJU1BPSU5URVIocC0+cmlnaHQtPm50eXAtPmZsYWdzKSl7CgkgIGlmKChwLT5yaWdodC0+bnR5cC0+bmV4dC0+ZmxhZ3MmTlEpPT1WT0lEKQoJICAgIHtlcnJvcig5NSk7cmV0dXJuIDA7fQoJICBpZighY29tcGF0aWJsZV90eXBlcyhwLT5sZWZ0LT5udHlwLT5uZXh0LHAtPnJpZ2h0LT5udHlwLT5uZXh0LE5RKSkKCSAgICB7ZXJyb3IoNDEpO30KCSAgaWYoZiE9U1VCKXsKCSAgICBlcnJvcig5Nik7CgkgICAgcmV0dXJuIDA7CgkgIH1lbHNlewoJICAgIHR5cGY9MzsKCSAgfQoJfWVsc2V7CgkgIGlmKCFJU0lOVChwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpKQoJICAgIHtlcnJvcig5NyxlbmFtZVtmXSk7cmV0dXJuIDA7fQoJICBpZihwLT5yaWdodC0+ZmxhZ3MhPVBNVUxUJiZwLT5yaWdodC0+ZmxhZ3MhPVBDRVhQUil7CgkgICAgbmV3PW5ld19ub2RlKCk7CgkgICAgbmV3LT5mbGFncz1QTVVMVDsKCSAgICBuZXctPm50eXA9MDsKCSAgICBuZXctPmxlZnQ9cC0+cmlnaHQ7CgkgICAgbmV3LT5yaWdodD1uZXdfbm9kZSgpOwoJICAgIGlmKGlzX3ZsZW5ndGgocC0+bGVmdC0+bnR5cC0+bmV4dCkpewoJICAgICAgbmV3LT5yaWdodC0+ZmxhZ3M9SURFTlRJRklFUjsKCSAgICAgIG5ldy0+cmlnaHQtPmlkZW50aWZpZXI9ZW1wdHk7CgkgICAgICBuZXctPnJpZ2h0LT5kc2l6ZT12bGVuZ3RoX3N6b2YocC0+bGVmdC0+bnR5cC0+bmV4dCk7CgkgICAgICBuZXctPnJpZ2h0LT52YWwudm1heD1sMnptKDBMKTsKCSAgICAgIG5ldy0+cmlnaHQtPnNpZGVmeD0wOwoJICAgIH1lbHNlewoJICAgICAgbmV3LT5yaWdodC0+ZmxhZ3M9UENFWFBSOwoJICAgICAgc3o9c3pvZihwLT5sZWZ0LT5udHlwLT5uZXh0KTsKCSAgICAgIGlmKHptZXF0byhsMnptKDBMKSxzeikpIGVycm9yKDc4KTsKI2lmIEhBVkVfSU5UX1NJWkVUCgkgICAgICBuZXctPnJpZ2h0LT52YWwudmludD16bTJ6aShzeik7CiNlbHNlCgkgICAgICBuZXctPnJpZ2h0LT52YWwudmxvbmc9em0yemwoc3opOwojZW5kaWYKCSAgICB9CgkgICAgbmV3LT5yaWdodC0+bGVmdD1uZXctPnJpZ2h0LT5yaWdodD0wOwoJICAgIG5ldy0+cmlnaHQtPm50eXA9bmV3X3R5cCgpOwojaWYgSEFWRV9JTlRfU0laRVQKCSAgICBuZXctPnJpZ2h0LT5udHlwLT5mbGFncz1JTlQ7CiNlbHNlCgkgICAgbmV3LT5yaWdodC0+bnR5cC0+ZmxhZ3M9TE9ORzsKI2VuZGlmCgkgICAgcC0+cmlnaHQ9bmV3OwojaWZkZWYgTUFYQURESTJQCgkgICAgb2smPXR5cGVfZXhwcmVzc2lvbjIobmV3LChzaG9ydHR5cCYmKHNob3J0dHlwLT5mbGFncyZOUSk8TUFYQURESTJQKT9zaG9ydHR5cDomcG10KTsKI2Vsc2UKCSAgICBvayY9dHlwZV9leHByZXNzaW9uMihuZXcsc2hvcnR0eXApOwojZW5kaWYKCSAgfQoJICB0eXBmPTE7Cgl9CiAgICAgIH1lbHNlewoJbnAgbWVyazsKCWlmKCFJU1BPSU5URVIocC0+cmlnaHQtPm50eXAtPmZsYWdzKSkKCSAge2Vycm9yKDk4KTtyZXR1cm4gMDt9CglpZigocC0+cmlnaHQtPm50eXAtPm5leHQtPmZsYWdzJk5RKT09Vk9JRCkKCSAge2Vycm9yKDk1KTtyZXR1cm4gMDt9CglpZighSVNJTlQocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKQoJICB7ZXJyb3IoOTgpO3JldHVybiAwO30KCWlmKHAtPmZsYWdzPT1TVUIpe2Vycm9yKDk5KTtyZXR1cm4gMDt9CglpZihwLT5sZWZ0LT5mbGFncyE9UE1VTFQmJnAtPmxlZnQtPmZsYWdzIT1QQ0VYUFIpewoJICBuZXc9bmV3X25vZGUoKTsKCSAgbmV3LT5mbGFncz1QTVVMVDsKCSAgbmV3LT5udHlwPTA7CgkgIG5ldy0+bGVmdD1wLT5sZWZ0OwoJICBuZXctPnJpZ2h0PW5ld19ub2RlKCk7CgkgIGlmKGlzX3ZsZW5ndGgocC0+cmlnaHQtPm50eXAtPm5leHQpKXsKCSAgICBuZXctPnJpZ2h0LT5mbGFncz1JREVOVElGSUVSOwoJICAgIG5ldy0+cmlnaHQtPmlkZW50aWZpZXI9ZW1wdHk7CgkgICAgbmV3LT5yaWdodC0+ZHNpemU9dmxlbmd0aF9zem9mKHAtPnJpZ2h0LT5udHlwLT5uZXh0KTsKCSAgICBuZXctPnJpZ2h0LT52YWwudm1heD1sMnptKDBMKTsKCSAgICBuZXctPnJpZ2h0LT5zaWRlZng9MDsKCSAgfWVsc2V7CgkgICAgbmV3LT5yaWdodC0+ZmxhZ3M9UENFWFBSOwoJICAgIHN6PXN6b2YocC0+cmlnaHQtPm50eXAtPm5leHQpOwoJICAgIGlmKHptZXF0byhsMnptKDBMKSxzeikpIGVycm9yKDc4KTsKI2lmIEhBVkVfSU5UX1NJWkVUCgkgICAgbmV3LT5yaWdodC0+dmFsLnZpbnQ9em0yemkoc3opOwojZWxzZQoJICAgIG5ldy0+cmlnaHQtPnZhbC52bG9uZz16bTJ6bChzeik7CiNlbmRpZgoJICB9CgkgIG5ldy0+cmlnaHQtPmxlZnQ9bmV3LT5yaWdodC0+cmlnaHQ9MDsKCSAgbmV3LT5yaWdodC0+bnR5cD1uZXdfdHlwKCk7CiNpZiBIQVZFX0lOVF9TSVpFVAoJICBuZXctPnJpZ2h0LT5udHlwLT5mbGFncz1JTlQ7CiNlbHNlCgkgIG5ldy0+cmlnaHQtPm50eXAtPmZsYWdzPUxPTkc7CiNlbmRpZgoJICBwLT5sZWZ0PW5ldzsKI2lmZGVmIE1BWEFEREkyUAoJICBvayY9dHlwZV9leHByZXNzaW9uMihuZXcsJnBtdCk7CiNlbHNlCgkgIG9rJj10eXBlX2V4cHJlc3Npb24yKG5ldywwKTsKI2VuZGlmCgl9Cgl0eXBmPTI7CgltZXJrPXAtPmxlZnQ7cC0+bGVmdD1wLT5yaWdodDtwLT5yaWdodD1tZXJrOwogICAgICB9CiAgICAgIGlmKHR5cGY9PTApe2llcnJvcigwKTtyZXR1cm4oMCk7fQogICAgICBlbHNlewoJaWYodHlwZj09Myl7CgkgIHAtPm50eXA9bmV3X3R5cCgpOwoJICBwLT5udHlwLT5mbGFncz1QVFJESUZGX1QocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpOwoJfWVsc2V7CgkgIC8qaWYodHlwZj09MSkqLyBwLT5udHlwPWNsb25lX3R5cChwLT5sZWZ0LT5udHlwKTsKCSAgLyogZWxzZSAgICAgICBwLT5udHlwPWNsb25lX3R5cChwLT5yaWdodC0+bnR5cCk7Ki8KCSAgLyogIEFiZnJhZ2Ugd2VnZW4gVmVydGF1c2NoZW4gZGVyIEtub3RlbiB1bm5vZXRpZyAgICovCgl9CiAgICAgIH0KICAgIH1lbHNlewogICAgICBpZihmPT1MU0hJRlR8fGY9PVJTSElGVCl7CglpZih0dHlwJiZmPT1MU0hJRlQmJih0dGY8PUlOVHx8dHRmPChwLT5sZWZ0LT5udHlwLT5mbGFncyZOUSkpJiZzaG9ydGN1dChmLHR0eXAtPmZsYWdzJk5VKSl7CgkgIHAtPm50eXA9Y2xvbmVfdHlwKHR0eXApOwoJfWVsc2UgaWYodHR5cCYmZj09UlNISUZUJiZ0dGY8PUlOVCYmdHRmPD0ocC0+bGVmdC0+bnR5cC0+ZmxhZ3MmTlEpJiZzaG9ydGN1dChmLHAtPmxlZnQtPm50eXAtPmZsYWdzJk5VKSl7CgkgIHAtPm50eXA9Y2xvbmVfdHlwKHAtPmxlZnQtPm50eXApOwoJfWVsc2V7CgkgIHAtPm50eXA9YXJpdGhfdHlwKHAtPmxlZnQtPm50eXAscC0+bGVmdC0+bnR5cCk7CgkgIHAtPm50eXAtPmZsYWdzJj1+TlE7CgkgIHAtPm50eXAtPmZsYWdzfD1pbnRfZXJ3KHAtPmxlZnQtPm50eXAtPmZsYWdzKTsKCX0KCWlmKHAtPnJpZ2h0LT5mbGFncz09Q0VYUFIpewoJICBldmFsX2NvbnN0bihwLT5yaWdodCk7CgkgIGlmKCF6bWxlcShsMnptKDBMKSx2bWF4KSkgZXJyb3IoMzY2KTsKCSAgaWYoem1sZXEoem1tdWx0KHNpemV0YWJbcC0+bnR5cC0+ZmxhZ3MmTlFdLGNoYXJfYml0KSx2bWF4KSYmem1sZXEoem1tdWx0KHNpemV0YWJbcC0+bGVmdC0+bnR5cC0+ZmxhZ3MmTlFdLGNoYXJfYml0KSx2bWF4KSkgZXJyb3IoMzY3KTsKCX0KI2lmZGVmIEhBVkVfTUlTUkEKLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCiNlbmRpZgogICAgICB9ZWxzZXsKCS8qIGdnZnMuIGluIGtsZWluZXJlbSBaaWVsdHlwIGF1c3dlcnRlbiAtIGJlaSBmbG9hdCBrZWluZW4gc2hvcnRjdXQgKHfkcmUgZXZ0bC4gZG91YmxlPT5mbG9hdCB1bmtyaXRpc2NoPykgKi8KCWlmKHR0eXAmJmRlY2lkZV9zaG9ydGN1dChwLHR0eXApKQoJICBwLT5udHlwPWNsb25lX3R5cCh0dHlwKTsKCWVsc2UKCSAgcC0+bnR5cD1hcml0aF90eXAocC0+bGVmdC0+bnR5cCxwLT5yaWdodC0+bnR5cCk7CglpZighSVNJTlQocC0+bnR5cC0+ZmxhZ3MpJiYoZj09TU9EfHxmPT1MU0hJRlR8fGY9PVJTSElGVCkpCgkgIHtlcnJvcigxMDEpO29rPTA7fQogICAgICB9CiAgICB9CiAgICAvKiAgZnVlZ3QgJmEreCB6dXNhbW1lbiwgbm9jaCBzdWIgdW5kIGxlZnQ8LT5yaWdodCBtYWNoZW4gICAqLwogICAgLyogIEJlaSBDRVhQUiBzdGF0dCBQQ0VYUFIgYXVjaCBtYWNoZW4/ICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGlmKChwLT5mbGFncz09QUREfHxwLT5mbGFncz09U1VCKSl7CiAgICAgIG5wIG0sYz0wLGE9MDsKICAgICAgaWYocC0+bGVmdC0+ZmxhZ3M9PVBDRVhQUiYmcC0+ZmxhZ3M9PUFERCkgYz1wLT5sZWZ0OwogICAgICBpZihwLT5yaWdodC0+ZmxhZ3M9PVBDRVhQUikgYz1wLT5yaWdodDsKICAgICAgaWYocC0+bGVmdC0+ZmxhZ3M9PUFERFJFU1N8fHAtPmxlZnQtPmZsYWdzPT1BRERSRVNTQXx8cC0+bGVmdC0+ZmxhZ3M9PUFERFJFU1NTKSBhPXAtPmxlZnQ7CiAgICAgIGlmKHAtPnJpZ2h0LT5mbGFncz09QUREUkVTU3x8cC0+cmlnaHQtPmZsYWdzPT1BRERSRVNTQXx8cC0+cmlnaHQtPmZsYWdzPT1BRERSRVNTUykgYT1wLT5yaWdodDsKICAgICAgaWYoYyYmYSl7CgltPWEtPmxlZnQ7CgkvKiAga2FubiBtYW4gZGFzIGhpZXIgc28gbWFjaGVuIG9kZXIgbXVzcyBtYW4gZGEgbWVociB0ZXN0ZW4gPyAgKi8KCXdoaWxlKG0tPmZsYWdzPT1GSVJTVEVMRU1FTlR8fG0tPmZsYWdzPT1BRERSRVNTfHxtLT5mbGFncz09QUREUkVTU0F8fG0tPmZsYWdzPT1BRERSRVNTUykgbT1tLT5sZWZ0OwoJaWYoKG0tPmZsYWdzPT1JREVOVElGSUVSfHxtLT5mbGFncz09U1RSSU5HKSYmIWlzX3ZsZW5ndGgobS0+bnR5cCkpewoJICBpZihERUJVRyYxKSBwcmludGYoIiZhK3ggd2l0aCAlcyBjb21iaW5lZFxuIixlbmFtZVtwLT5sZWZ0LT5mbGFnc10pOwoJICBldmFsX2NvbnN0KCZjLT52YWwsYy0+bnR5cC0+ZmxhZ3MpOwoJICBpZihwLT5mbGFncz09QUREKQoJICAgIG0tPnZhbC52bWF4PXp1bWFkZChtLT52YWwudm1heCx2bWF4KTsKCSAgZWxzZSAKCSAgICBtLT52YWwudm1heD16bXN1YihtLT52YWwudm1heCx2bWF4KTsKCSAgdm1heD1zem9mKG0tPm50eXApOwoJICBpZighem1lcXRvKHZtYXgsbDJ6bSgwTCkpJiZ6dW1sZXEodm1heCxtLT52YWwudm1heCkpewoJICAgIGlmKHp1bWVxdG8odm1heCxtLT52YWwudm1heCkpCgkgICAgICBlcnJvcig3OSk7CgkgICAgZWxzZQoJICAgICAgZXJyb3IoODApOwoJICB9CgkgIHZtYXg9bDJ6bSgwTCk7CgkgIGlmKCF6bWVxdG8obS0+dmFsLnZtYXgsbDJ6bSgwTCkpJiZ6dW1sZXEobS0+dmFsLnZtYXgsdm1heCkpIGVycm9yKDgwKTsKCSAgZnJlZV9leHByZXNzaW9uKGMpOwoJICBpZihwLT5udHlwKSBmcmVldHlwKHAtPm50eXApOwoJICAqcD0qYTsKCSAgZnJlZShhKTsKCSAgcmV0dXJuIHR5cGVfZXhwcmVzc2lvbjIocCwwKTsKCX0KICAgICAgfQogICAgfQogICAgaWYoIW1vcHQpewogICAgICBpZighYWxnX29wdChwLHR0eXApKSBpZXJyb3IoMCk7CiAgICB9CiAgICByZXR1cm4gb2s7CiAgfQogIGlmKGY9PUNBU1QpewogICAgaW50IGZyb209KHAtPmxlZnQtPm50eXAtPmZsYWdzKSx0bz0ocC0+bnR5cC0+ZmxhZ3MpOwojaWZkZWYgSEFWRV9NSVNSQQovKiByZW1vdmVkICovCiNlbmRpZgogICAgZnJvbSY9TlE7dG8mPU5ROwogICAgaWYodG89PVZPSUQpIHJldHVybiBvazsKICAgIGlmKGZyb209PVZPSUQpCiAgICAgIHtlcnJvcigxMDIpO3JldHVybiAwO30KICAgIGlmKCghSVNBUklUSCh0byl8fCFJU0FSSVRIKGZyb20pKSYmCiAgICAgICAoIUlTUE9JTlRFUih0byl8fCFJU1BPSU5URVIoZnJvbSkpKXsKICAgICAgaWYoSVNQT0lOVEVSKHRvKSl7CglpZihJU0lOVChmcm9tKSl7CiNpZmRlZiBIQVZFX01JU1JBCi8qIHJlbW92ZWQgKi8KI2VuZGlmCgkgIGlmKCF6bWxlcShzaXpldGFiW2Zyb21dLHNpemV0YWJbdG9dKSl7CgkgICAgZXJyb3IoMTAzKTsKCSAgfQoJfWVsc2V7CgkgIGVycm9yKDEwNCk7cmV0dXJuIDA7Cgl9CiAgICAgIH1lbHNlewoJaWYoIUlTUE9JTlRFUihmcm9tKSkKCSAge2Vycm9yKDEwNSk7cmV0dXJuIDA7fQoJaWYoSVNJTlQodG8pKXsKI2lmZGVmIEhBVkVfTUlTUkEKLyogcmVtb3ZlZCAqLwojZW5kaWYKCSAgaWYoIXptbGVxKHNpemV0YWJbZnJvbV0sc2l6ZXRhYlt0b10pKXsKCSAgICBlcnJvcigxMDYpOwoJICB9Cgl9ZWxzZXsKCSAgZXJyb3IoMTA0KTtyZXR1cm4gMDsKCX0KICAgICAgfQogICAgfQogICAgaWYoSVNJTlQoZnJvbSkmJklTSU5UKHRvKSYmIXptbGVxKHNpemV0YWJbZnJvbV0sc2l6ZXRhYlt0b10pJiZwLT5sZWZ0LT5mbGFncyE9Q0VYUFIpIGVycm9yKDE2Nik7CiAgICBpZihJU1BPSU5URVIodG8pJiZJU1BPSU5URVIoZnJvbSkmJiF6bWxlcShmYWxpZ24ocC0+bnR5cC0+bmV4dCksZmFsaWduKHAtPmxlZnQtPm50eXAtPm5leHQpKSkKICAgICAgZXJyb3IoMTY3KTsKICAgIGlmKHAtPmxlZnQtPmZsYWdzPT1DRVhQUil7CiAgICAgIGV2YWxfY29uc3RuKHAtPmxlZnQpOwogICAgICBpZihJU1BPSU5URVIocC0+bnR5cC0+ZmxhZ3MpKQoJaWYoIXp1bWVxdG8odnVtYXgsdWwyenVtKDBVTCkpfHwhem1lcXRvKHZtYXgsbDJ6bSgwTCkpfHwhemxkZXF0byh2bGRvdWJsZSxkMnpsZCgwLjApKSkKCSAgZXJyb3IoODEpOwogICAgICBpbnNlcnRfY29uc3RuKHApOwogICAgICBwLT5mbGFncz1DRVhQUjsKICAgICAgaWYoIXAtPmxlZnQtPnNpZGVmeCl7CglpZighbm9fY2FzdF9mcmVlKSAKCSAgZnJlZV9leHByZXNzaW9uKHAtPmxlZnQpOwoJcC0+bGVmdD0wOwogICAgICB9CiAgICB9CiNpZmRlZiBIQVZFX0VDUFAKLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwojZW5kaWYKICAgIHJldHVybiBvazsKICB9CiAgaWYoZj09TUlOVVN8fGY9PUtPTVBMRU1FTlR8fGY9PU5FR0FUSU9OKXsKICAgIGlmKElTVkVDVE9SKHAtPmxlZnQtPm50eXAtPmZsYWdzKSl7CiAgICAgIGlmKGY9PU5FR0FUSU9OKXsKCWlmKElTRkxPQVQoVkVDVFlQRShwLT5sZWZ0LT5udHlwLT5mbGFncykpKXtlcnJvcig5OCk7cmV0dXJuIDA7fQoJcC0+bnR5cD1uZXdfdHlwKCk7CglwLT5udHlwLT5mbGFncz1wLT5sZWZ0LT5udHlwLT5mbGFncyZOUTsKCXJldHVybiBvazsKICAgICAgfQogICAgICBpZihmPT1LT01QTEVNRU5UJiZJU0ZMT0FUKFZFQ1RZUEUocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKSl7ZXJyb3IoMTA5KTtyZXR1cm4gMDt9CiAgICAgIHAtPm50eXA9Y2xvbmVfdHlwKHAtPmxlZnQtPm50eXApOwogICAgICByZXR1cm4gb2s7CiAgICB9CiAgICBpZighSVNBUklUSChwLT5sZWZ0LT5udHlwLT5mbGFncykpewogICAgICBpZihmIT1ORUdBVElPTil7CgllcnJvcigxMDcpO3JldHVybiAwOwogICAgICB9ZWxzZXsKCWlmKCFJU1BPSU5URVIocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKQoJICB7ZXJyb3IoMTA4KTtyZXR1cm4gMDt9CiAgICAgIH0KICAgIH0KI2lmZGVmIEhBVkVfTUlTUkEKLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCiNlbmRpZgogICAgaWYoZj09S09NUExFTUVOVCYmIUlTSU5UKHAtPmxlZnQtPm50eXAtPmZsYWdzKSkKICAgICAge2Vycm9yKDEwOSk7cmV0dXJuIDA7fQogICAgaWYoZj09TkVHQVRJT04pewogICAgICBwLT5udHlwPW5ld190eXAoKTsKICAgICAgcC0+bnR5cC0+ZmxhZ3M9SU5UOwogICAgfWVsc2V7CiAgICAgIGlmKCFwLT5sZWZ0LT5udHlwKSBpZXJyb3IoMCk7CiAgICAgIHAtPm50eXA9Y2xvbmVfdHlwKHAtPmxlZnQtPm50eXApOwogICAgICBpZihJU0lOVChwLT5udHlwLT5mbGFncykpewoJaWYoIXR0eXB8fCFzaG9ydGN1dChmLHR0eXAtPmZsYWdzJk5VKSl7CgkgIHAtPm50eXAtPmZsYWdzPWludF9lcncocC0+bnR5cC0+ZmxhZ3MpOwoJfWVsc2V7IAoJICBpZigoZj09TUlOVVMmJiF6bWxlcShzaXpldGFiW3R0eXAtPmZsYWdzJk5RXSxzaXpldGFiW3AtPm50eXAtPmZsYWdzJk5RXSkpfHwKCSAgICAgKGY9PUtPTVBMRU1FTlQmJiF6bWxlcShzaXpldGFiW3R0eXAtPmZsYWdzJk5RXSxzaXpldGFiW3AtPm50eXAtPmZsYWdzJk5RXSkmJihwLT5udHlwLT5mbGFncyZVTlNJR05FRCkpKQoJICAgIHAtPm50eXAtPmZsYWdzPWludF9lcncocC0+bnR5cC0+ZmxhZ3MpOwoJfQogICAgICB9CiAgICB9CiAgICBpZihwLT5sZWZ0LT5mbGFncz09Q0VYUFIpewogICAgICBldmFsX2NvbnN0bihwLT5sZWZ0KTsKICAgICAgaWYoZj09S09NUExFTUVOVCl7CglpZihwLT5udHlwLT5mbGFncyZVTlNJR05FRCl7CgkgIGd2YWwudnVtYXg9enVta29tcGwodnVtYXgpOwoJICBldmFsX2NvbnN0KCZndmFsLChVTlNJR05FRHxNQVhJTlQpKTsKCX1lbHNlewoJICBndmFsLnZtYXg9em1rb21wbCh2bWF4KTsKCSAgZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOwoJfQogICAgICB9CiAgICAgIGlmKGY9PU1JTlVTKXsKCWlmKElTRkxPQVQocC0+bnR5cC0+ZmxhZ3MpKXsKCSAgZ3ZhbC52bGRvdWJsZT16bGRzdWIoZDJ6bGQoMC4wKSx2bGRvdWJsZSk7CgkgIGV2YWxfY29uc3QoJmd2YWwsTERPVUJMRSk7Cgl9ZWxzZXsKCSAgaWYocC0+bnR5cC0+ZmxhZ3MmVU5TSUdORUQpewoJICAgIGd2YWwudnVtYXg9enVtc3ViKHVsMnp1bSgwVUwpLHZ1bWF4KTsKCSAgICBldmFsX2NvbnN0KCZndmFsLChVTlNJR05FRHxNQVhJTlQpKTsKCSAgfWVsc2V7CgkgICAgZ3ZhbC52bWF4PXptc3ViKGwyem0oMEwpLHZtYXgpOwoJICAgIGV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKCSAgfQoJfQogICAgICB9CiAgICAgIGlmKGY9PU5FR0FUSU9OKXsKCWlmKHpsZGVxdG8odmxkb3VibGUsZDJ6bGQoMC4wKSkmJnp1bWVxdG8odnVtYXgsdWwyenVtKDBVTCkpJiZ6bWVxdG8odm1heCxsMnptKDBMKSkpCgkgIGd2YWwudm1heD1sMnptKDFMKTsgCgllbHNlIAoJICBndmFsLnZtYXg9bDJ6bSgwTCk7CglldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CiAgICAgIH0KICAgICAgaW5zZXJ0X2NvbnN0bihwKTsKICAgICAgcC0+ZmxhZ3M9Q0VYUFI7CiAgICAgIGlmKCFwLT5sZWZ0LT5zaWRlZngmJnAtPmxlZnQpIHtmcmVlX2V4cHJlc3Npb24ocC0+bGVmdCk7cC0+bGVmdD0wO30KICAgIH0KICAgIHJldHVybiBvazsKICB9CiAgaWYoZj09Q09OVEVOVCl7CiAgICBpZighSVNQT0lOVEVSKHAtPmxlZnQtPm50eXAtPmZsYWdzKSkKICAgICAge2Vycm9yKDExMSk7cmV0dXJuIDA7fQogICAgaWYoIUlTQVJSQVkocC0+bGVmdC0+bnR5cC0+bmV4dC0+ZmxhZ3MpJiZ0eXBlX3VuY29tcGxldGUocC0+bGVmdC0+bnR5cC0+bmV4dCkpCiAgICAgIHtlcnJvcigxMTIpO3JldHVybiAwO30KICAgIHAtPm50eXA9Y2xvbmVfdHlwKHAtPmxlZnQtPm50eXAtPm5leHQpOwogICAgaWYoIUlTQVJSQVkocC0+bnR5cC0+ZmxhZ3MpKSBwLT5sdmFsdWU9MTsKICAgIGlmKHAtPmxlZnQtPmZsYWdzPT1BRERSRVNTJiZ6dW1lcXRvKHAtPmxlZnQtPnZhbC52dW1heCx1bDJ6dW0oMFVMKSkpewogICAgICAvKiAgKiZ4IGR1cmNoIHggZXJzZXR6ZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgIG5wIG1lcms7CiAgICAgIG1lcms9cC0+bGVmdDsKICAgICAgaWYocC0+bnR5cCkgZnJlZXR5cChwLT5udHlwKTsKICAgICAgaWYocC0+bGVmdC0+bnR5cCkgZnJlZXR5cChwLT5sZWZ0LT5udHlwKTsKICAgICAgKnA9KnAtPmxlZnQtPmxlZnQ7CiAgICAgIGZyZWUobWVyay0+bGVmdCk7CiAgICAgIGZyZWUobWVyayk7CiAgICAgIHJldHVybiBvazsKICAgIH0KICAgIC8qICAqJmF4IGR1cmNoIGZpcnN0ZWxlbWVudC1vZih4KSBlcnNldHplbiAgKi8KICAgIGlmKHAtPmxlZnQtPmZsYWdzPT1BRERSRVNTQXx8cC0+bGVmdC0+ZmxhZ3M9PUFERFJFU1NTKXsKICAgICAgaWYoIWlzX3ZsZW5ndGgocC0+bGVmdC0+bGVmdC0+bnR5cCkpewoJbnAgbWVyazsKCWlmKERFQlVHJjEpIHByaW50Zigic3Vic3RpdHV0ZXQgKiBhbmQgJXMgd2l0aCBGSVJTVEVMRU1FTlRcbiIsZW5hbWVbcC0+bGVmdC0+ZmxhZ3NdKTsKCXAtPmZsYWdzPUZJUlNURUxFTUVOVDsKCXAtPmx2YWx1ZT0xOyAgICAvKiAgZXZ0bC4gaGllciBlcnN0IEFiZnJhZ2UgPyAgICovCgltZXJrPXAtPmxlZnQ7CglwLT5sZWZ0PW1lcmstPmxlZnQ7CglwLT5yaWdodD1tZXJrLT5yaWdodDsKCWlmKG1lcmstPm50eXApIGZyZWV0eXAobWVyay0+bnR5cCk7CglmcmVlKG1lcmspOwogICAgICB9CiAgICB9CiAgICBpZiAocC0+bnR5cC0+ZmxhZ3MmVk9MQVRJTEUpIHAtPnNpZGVmeD0xOwogICAgcmV0dXJuIG9rOwogIH0KICBpZihmPT1GSVJTVEVMRU1FTlQpewogICAgaWYoSVNBUlJBWShwLT5sZWZ0LT5udHlwLT5mbGFncykpewogICAgICBwLT5udHlwPWNsb25lX3R5cChwLT5sZWZ0LT5udHlwLT5uZXh0KTsKICAgIH1lbHNlewogICAgICBpbnQgaSxuPS0xOwogICAgICBmb3IoaT0wO2k8cC0+bGVmdC0+bnR5cC0+ZXhhY3QtPmNvdW50O2krKykKCWlmKCFzdHJjbXAoKCpwLT5sZWZ0LT5udHlwLT5leGFjdC0+c2wpW2ldLmlkZW50aWZpZXIscC0+cmlnaHQtPmlkZW50aWZpZXIpKSBuPWk7CiAgICAgIGlmKG48MCkgaWVycm9yKDApOwogICAgICBwLT5udHlwPWNsb25lX3R5cCgoKnAtPmxlZnQtPm50eXAtPmV4YWN0LT5zbClbbl0uc3R5cCk7CiAgICB9CiAgICBwLT5sdmFsdWU9MTsgICAgLyogIGhpZXIgbm9jaCBnZW5hdWVyIHRlc3RlbiA/ICAqLwogICAgcmV0dXJuIG9rOwogIH0KICBpZihmPT1BRERSRVNTKXsKICAgIGlmKCFJU0ZVTkMocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpJiYhSVNBUlJBWShwLT5sZWZ0LT5udHlwLT5mbGFncykpewogICAgICBpZighcC0+bGVmdC0+bHZhbHVlKXtlcnJvcigxMTUpO3JldHVybiAwO30KICAgICAgaWYocC0+bGVmdC0+ZmxhZ3M9PUlERU5USUZJRVIpewoJVmFyICp2OwoJdj1maW5kX3ZhcihwLT5sZWZ0LT5pZGVudGlmaWVyLDApOwoJaWYoIXYpe2Vycm9yKDExNixwLT5sZWZ0LT5pZGVudGlmaWVyKTtyZXR1cm4gMDt9CglpZih2LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikKCSAge2Vycm9yKDExNyk7cmV0dXJuIDA7fQogICAgICB9CiAgICB9CiAgICBwLT5udHlwPW5ld190eXAoKTsKICAgIHAtPm50eXAtPmZsYWdzPXB0eXBlKHAtPmxlZnQpOwogICAgcC0+bnR5cC0+bmV4dD1jbG9uZV90eXAocC0+bGVmdC0+bnR5cCk7CiAgICBmaXhfYWRkcl9wdHlwZShwKTsKICAgIHJldHVybiBvazsKICB9CiAgaWYoZj09QUREUkVTU0EpewogICAgcC0+bnR5cD1jbG9uZV90eXAocC0+bGVmdC0+bnR5cCk7CiAgICBwLT5udHlwLT5mbGFncz1wdHlwZShwLT5sZWZ0KTsKICAgIGZpeF9hZGRyX3B0eXBlKHApOwogICAgcmV0dXJuIG9rOwogIH0KICBpZihmPT1BRERSRVNTUyl7CiAgICBpbnQgaSxuPS0xOwogICAgc3RydWN0X2xpc3QgKnNsPTA7CiAgICBpZighZWNwcCl7CiAgICAgIGZvcihpPTA7aTxwLT5sZWZ0LT5udHlwLT5leGFjdC0+Y291bnQ7aSsrKQoJaWYoIXN0cmNtcCgoKnAtPmxlZnQtPm50eXAtPmV4YWN0LT5zbClbaV0uaWRlbnRpZmllcixwLT5yaWdodC0+aWRlbnRpZmllcikpIG49aTsKICAgICAgaWYobjwwKQogICAgICAgIHJldHVybiAwOwogICAgICBlbHNlCiAgICAgICAgc2w9JigqcC0+bGVmdC0+bnR5cC0+ZXhhY3QtPnNsKVtuXTsKICAgIH0KI2lmZGVmIEhBVkVfRUNQUAovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KI2VuZGlmCiAgICBwLT5udHlwPW5ld190eXAoKTsKICAgIGlmKCFwLT5sZWZ0LT5udHlwKSBpZXJyb3IoMCk7CiAgICBpZighcC0+bGVmdC0+bnR5cC0+ZXhhY3QpIGllcnJvcigwKTsKICAgIGlmKCFzbC0+c3R5cCkgaWVycm9yKDApOwogICAgcC0+bnR5cC0+bmV4dD1jbG9uZV90eXAoc2wtPnN0eXApOwogICAgcC0+bnR5cC0+ZmxhZ3M9cHR5cGUocC0+bGVmdCk7CiAgICBmaXhfYWRkcl9wdHlwZShwKTsKICAgIHJldHVybiBvazsKICB9CiAgaWYoZj09RFNUUlVDVCl7CiAgICBzdHJ1Y3RfZGVjbGFyYXRpb24gKnNkPXAtPmxlZnQtPm50eXAtPmV4YWN0OwogICAgY2hhciAqaWRlbnRpZmllcj1wLT5yaWdodC0+aWRlbnRpZmllcjsKICAgIGludCBpPTAsZixiZnM9LTEsYmZvPS0xO3R5cGUgKnQ7bnAgbmV3O3ptYXggb2Zmc2V0PWwyem0oMEwpOwogICAgaWYoIUlTU1RSVUNUKHAtPmxlZnQtPm50eXAtPmZsYWdzKSYmIUlTVU5JT04ocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKQogICAgICB7ZXJyb3IoOCk7cmV0dXJuIDA7fQogICAgaWYodHlwZV91bmNvbXBsZXRlKHAtPmxlZnQtPm50eXApKXtlcnJvcigxMSk7cmV0dXJuIDA7fQogICAgaWYocC0+cmlnaHQtPmZsYWdzIT1NRU1CRVIpIGllcnJvcigwKTsKICAgIGlmKGk+PXAtPmxlZnQtPm50eXAtPmV4YWN0LT5jb3VudCkge2Vycm9yKDIzLHAtPnJpZ2h0LT5pZGVudGlmaWVyKTtyZXR1cm4gMDt9CiAgICBpZighZWNwcCl7CiAgICAgIG9mZnNldD1zdHJ1Y3Rfb2Zmc2V0KHNkLGlkZW50aWZpZXIpOwogICAgfQojaWZkZWYgSEFWRV9FQ1BQCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KI2VuZGlmCiAgICBpZihJU1VOSU9OKHAtPmxlZnQtPm50eXAtPmZsYWdzKSkgb2Zmc2V0PWwyem0oMEwpOwogICAgcC0+ZmxhZ3M9Q09OVEVOVDsKICAgIGlmKHAtPm50eXApIHtmcmVldHlwKHAtPm50eXApO3AtPm50eXA9MDt9CiAgICBuZXc9bmV3X25vZGUoKTsKICAgIG5ldy0+ZmxhZ3M9QUREOwogICAgbmV3LT5udHlwPTA7CiAgICBuZXctPnJpZ2h0PW5ld19ub2RlKCk7CiAgICBuZXctPnJpZ2h0LT5sZWZ0PW5ldy0+cmlnaHQtPnJpZ2h0PTA7CiAgICBuZXctPnJpZ2h0LT5mbGFncz1QQ0VYUFI7CiAgICBuZXctPnJpZ2h0LT5udHlwPW5ld190eXAoKTsKICAgIGlmKC8qTUlOQURESTJQPD1JTlQmJiovenVtbGVxKHptMnp1bShvZmZzZXQpLHRfbWF4KElOVCkpKXsKICAgICAgbmV3LT5yaWdodC0+bnR5cC0+ZmxhZ3M9SU5UOwogICAgICBuZXctPnJpZ2h0LT52YWwudmludD16bTJ6aShvZmZzZXQpOwogICAgfWVsc2V7CiAgICAgIG5ldy0+cmlnaHQtPm50eXAtPmZsYWdzPUxPTkc7CiAgICAgIG5ldy0+cmlnaHQtPm50eXAtPm5leHQ9MDsKICAgICAgbmV3LT5yaWdodC0+dmFsLnZsb25nPXptMnpsKG9mZnNldCk7CiAgICB9CiAgICBuZXctPmxlZnQ9bmV3X25vZGUoKTsKICAgIG5ldy0+bGVmdC0+ZmxhZ3M9QUREUkVTU1M7CiAgICBuZXctPmxlZnQtPmxlZnQ9cC0+bGVmdDsKICAgIG5ldy0+bGVmdC0+cmlnaHQ9cC0+cmlnaHQ7CiAgICBuZXctPmxlZnQtPm50eXA9MDsKICAgIHAtPmxlZnQ9bmV3O3AtPnJpZ2h0PTA7CgogICAgLyogQ2hlY2sgZm9yIGJpdGZpZWxkcyAqLwogICAgaT0wOwogICAgd2hpbGUoaTxzZC0+Y291bnQmJnN0cmNtcCgoKnNkLT5zbClbaV0uaWRlbnRpZmllcixpZGVudGlmaWVyKSl7CiAgICAgIGkrKzsKICAgIH0KICAgIGlmKGk8c2QtPmNvdW50KXsKICAgICAgYmZvPSgqc2QtPnNsKVtpXS5iZm9mZnNldDsKICAgICAgYmZzPSgqc2QtPnNsKVtpXS5iZnNpemU7CiAgICB9ZWxzZQogICAgICBiZnM9LTE7CiAgICBpZihiZnMhPS0xKXsKICAgICAgLyogY3JlYXRlIGEgc3BlY2lhbCBub2RlIGZvciBiaXRmaWVsZHMgKi8KICAgICAgb2t8PXR5cGVfZXhwcmVzc2lvbjIocCwwKTsKICAgICAgbmV3PW5ld19ub2RlKCk7CiAgICAgICpuZXc9KnA7CiAgICAgIHAtPmZsYWdzPUJJVEZJRUxEOwogICAgICBwLT5sZWZ0PW5ldzsKICAgICAgcC0+cmlnaHQ9MDsKICAgICAgcC0+c2lkZWZ4PTA7CiAgICAgIHAtPmJmcz1iZnM7CiAgICAgIHAtPmJmbz1iZm87CiAgICAgIHAtPm50eXA9Y2xvbmVfdHlwKG5ldy0+bnR5cCk7CiAgICAgIHJldHVybiBvazsKICAgIH0KICAgIHJldHVybiB0eXBlX2V4cHJlc3Npb24yKHAsMCk7CiAgfQogIGlmKGY9PVBSRUlOQ3x8Zj09UE9TVElOQ3x8Zj09UFJFREVDfHxmPT1QT1NUREVDKXsKICAgIGlmKCFwLT5sZWZ0LT5sdmFsdWUpe2Vycm9yKDg2KTtyZXR1cm4gMDt9CiAgICBpZihwLT5sZWZ0LT5udHlwLT5mbGFncyZDT05TVCl7ZXJyb3IoODcpO3JldHVybiAwO30KICAgIGlmKCFJU0FSSVRIKHAtPmxlZnQtPm50eXAtPmZsYWdzKSl7CiAgICAgIGlmKCFJU1BPSU5URVIocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXsKCWVycm9yKDI0KTsKCXJldHVybiAwOwogICAgICB9ZWxzZXsKI2lmZGVmIEhBVkVfTUlTUkEKLyogcmVtb3ZlZCAqLwojZW5kaWYKCWlmKChwLT5sZWZ0LT5udHlwLT5uZXh0LT5mbGFncyZOUSk9PVZPSUQpCgkgIHtlcnJvcig5NSk7cmV0dXJuIDA7fQogICAgICB9CiAgICB9CiAgICBwLT5udHlwPWNsb25lX3R5cChwLT5sZWZ0LT5udHlwKTsKICAgIHAtPnNpZGVmeD0xOwogICAgcmV0dXJuIG9rOwogIH0KICBpZihmPT1DQUxMKXsKICAgIGFyZ3VtZW50X2xpc3QgKmFsO2ludCBpLGZsYWdzPTA7Y2hhciAqcz0wOwogICAgc3RydWN0X2RlY2xhcmF0aW9uICpzZDsKI2lmZGVmIEhBVkVfRUNQUAovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCiNlbmRpZgogICAgYWw9cC0+YWxpc3Q7CiAgICBpZighSVNQT0lOVEVSKHAtPmxlZnQtPm50eXAtPmZsYWdzKXx8IUlTRlVOQyhwLT5sZWZ0LT5udHlwLT5uZXh0LT5mbGFncykpCiAgICAgIHtlcnJvcigyNik7cmV0dXJuIDA7fQogICAgaWYob2smJnAtPmxlZnQtPmxlZnQmJnAtPmxlZnQtPmxlZnQtPmZsYWdzPT1JREVOVElGSUVSJiZwLT5sZWZ0LT5sZWZ0LT5vLnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CiAgICAgIHM9cC0+bGVmdC0+bGVmdC0+by52LT5pZGVudGlmaWVyOwogICAgICBmbGFncz1wLT5sZWZ0LT5sZWZ0LT5vLnYtPmZsYWdzOwogICAgfQogICAgc2Q9cC0+bGVmdC0+bnR5cC0+bmV4dC0+ZXhhY3Q7CiAgICBpZighc2QpIGllcnJvcigwKTsKICAgIGlmKHNkLT5jb3VudD09MCl7CiNpZmRlZiBIQVZFX01JU1JBCi8qIHJlbW92ZWQgKi8KI2VuZGlmCiAgICAgIGVycm9yKDE2Mik7CiAgICAgIGlmKHMpewoJaWYoIXN0cmNtcChzLCJwcmludGYiKXx8IXN0cmNtcChzLCJmcHJpbnRmIil8fCFzdHJjbXAocywic3ByaW50ZiIpfHwKCSAgICFzdHJjbXAocywic2NhbmYiKXx8ICFzdHJjbXAocywiZnNjYW5mIil8fCAhc3RyY21wKHMsInNzY2FuZiIpKQoJICBlcnJvcigyMTMpOwogICAgICB9CiAgICB9CiAgICBpZighKGVjcHAmJmFsJiZhbC0+YXJnLT5udHlwKSl7CiAgICAgIGk9MDsKICAgICAgd2hpbGUoYWwpewoJaWYoIWFsLT5hcmcpIGllcnJvcigwKTsKCWlmKCF0eXBlX2V4cHJlc3Npb24yKGFsLT5hcmcsKHNob3J0X3B1c2gmJmk8c2QtPmNvdW50KT8oKnNkLT5zbClbaV0uc3R5cDowKSkgcmV0dXJuIDA7CglhbC0+YXJnPW1ha2Vwb2ludGVyKGFsLT5hcmcpOwoJaWYodHlwZV91bmNvbXBsZXRlKGFsLT5hcmctPm50eXApKSBlcnJvcigzOSk7CglhbD1hbC0+bmV4dDsKCWkrKzsKICAgICAgfQogICAgfQogICAgcC0+c2lkZWZ4PTE7CiAgICBwLT5udHlwPWNsb25lX3R5cChwLT5sZWZ0LT5udHlwLT5uZXh0LT5uZXh0KTsKICAgIGk9MDthbD1wLT5hbGlzdDsKICAgIHdoaWxlKGFsKXsKICAgICAgaWYoaT49c2QtPmNvdW50KSByZXR1cm4gb2s7CiAgICAgIGlmKCEoKnNkLT5zbClbaV0uc3R5cCkgcmV0dXJuIG9rOyAvKiBudXIgQmV6ZWljaG5lciwgYWJlciBrZWluIFR5cCBpbSBQcm90b3R5cGUgKi8KICAgICAgaWYoIXRlc3RfYXNzaWdubWVudCgoKnNkLT5zbClbaV0uc3R5cCxhbC0+YXJnKSkgcmV0dXJuIDA7CiNpZmRlZiBIQVZFX01JU1JBCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwojZW5kaWYKICAgICAgaWYoaT09c2QtPmNvdW50LTEmJihmbGFncyYoUFJJTlRGTElLRXxTQ0FORkxJS0UpKSl7CglpZihhbC0+YXJnLT5sZWZ0JiZhbC0+YXJnLT5sZWZ0LT5mbGFncz09U1RSSU5HKXsKCSAgLyogIEFyZ3VtZW50ZSBhbmhhbmQgZGVzIEZvcm1hdHN0cmluZ3MgdWViZXJwcnVlZmVuICovCgkgIGNvbnN0X2xpc3QgKmNsPWFsLT5hcmctPmxlZnQtPmNsOwoJICBpbnQgZnVzZWQ9MDtsb25nIG1hc2s9MTsKCSAgYWw9YWwtPm5leHQ7CgkgIHdoaWxlKGNsJiZjbC0+b3RoZXIpewoJICAgIGludCBjLGZmbGFncz0nICcsYXQsbGZsYWc7CgkgICAgdHlwZSAqdDsKCSAgICBlbnVte0xMPTEsSEh9OwoJICAgIGM9KGludCl6bTJsKHpjMnptKGNsLT5vdGhlci0+dmFsLnZjaGFyKSk7CiAJICAgIGNsPWNsLT5uZXh0OwoJICAgIGlmKGM9PTApewoJICAgICAgaWYoY2wpIGVycm9yKDIxNSk7CgkgICAgICBicmVhazsKCSAgICB9CgkgICAgYz1DSEFSQkFDSyhjKTsKCSAgICBpZihjIT0nJScpIGNvbnRpbnVlOwoJICAgIGlmKCFjbCl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQoJICAgIGxmbGFnPTA7CgkgICAgYz0oaW50KXptMmwoemMyem0oY2wtPm90aGVyLT52YWwudmNoYXIpKTsKCSAgICBjPUNIQVJCQUNLKGMpOwoJICAgIGNsPWNsLT5uZXh0OwoJICAgIHdoaWxlKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpYyl8fAoJCSAgYz09Jy0nfHxjPT0nKyd8fGM9PScgJ3x8Yz09JyMnfHxjPT0nLid8fAoJCSAgYz09J2gnfHxjPT0nbCd8fGM9PSdMJ3x8Yz09J3onfHxjPT0naid8fGM9PSd0J3x8Yz09JyonKXsKCSAgICAgIGlmKGM9PSctJykgbWFza3w9VVNFTEFMR047CgkgICAgICBpZihjPT0nKycpIG1hc2t8PVVTRVNJR047CgkgICAgICBpZihjPT0nIycpIG1hc2t8PVVTRUFMVDsKCSAgICAgIGlmKGM9PScuJykgbWFza3w9VVNFUFJFQzsKCSAgICAgIGlmKGM9PScgJykgbWFza3w9VVNFQkxBTks7CgkgICAgICBpZihjPT0nMCcmJiEobWFzayZVU0VQUkVDKSYmIShtYXNrJlVTRVdJRFRIKSkgbWFza3w9VVNFWlBBRDsKCSAgICAgIGlmKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpYykmJiEobWFzayZVU0VQUkVDKSkgbWFza3w9VVNFV0lEVEg7CgkgICAgICBmdXNlZHw9MzsKCSAgICAgIGlmKGM9PScqJyYmKGZsYWdzJlBSSU5URkxJS0UpKXsKCQltYXNrfD1VU0VBU1Q7CgkJaWYoIWFsKSB7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQoJCWF0PWFsLT5hcmctPm50eXAtPmZsYWdzJk5ROwoJCWFsPWFsLT5uZXh0OwoJCWlmKGF0PklOVCkge2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KCSAgICAgIH0KCSAgICAgIGlmKChmZmxhZ3MhPScqJ3x8KGZsYWdzJlBSSU5URkxJS0UpKSYmKGM9PSdoJ3x8Yz09J2wnfHxjPT0nTCd8fGM9PScqJ3x8Yz09J3QnfHxjPT0neid8fGM9PSdqJykpewoJCWlmKGM9PSdsJyYmZmZsYWdzPT0nbCcpCgkJICBmZmxhZ3M9TEw7CgkJZWxzZSBpZihjPT0naCcmJmZmbGFncz09J2gnKQoJCSAgZmZsYWdzPUhIOwoJCWVsc2UKCQkgIGZmbGFncz1jOwoJICAgICAgfQoJICAgICAgYz0oaW50KXptMmwoemMyem0oY2wtPm90aGVyLT52YWwudmNoYXIpKTsKCSAgICAgIGM9Q0hBUkJBQ0soYyk7CgkgICAgICBjbD1jbC0+bmV4dDsKCSAgICAgIGlmKCFjbCl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQoJICAgIH0KCSAgICAvKkZJWE1FOiBhc3N1bWVzIGludG1heF90PT1sb25nIGxvbmcgKi8KCSAgICBpZihmZmxhZ3M9PSdqJykge21hc2t8PVVTRVNQRUM7ZmZsYWdzPUxMO30KI2lmIEhBVkVfSU5UX1NJWkVUCSAgICAKCSAgICBpZihmZmxhZ3M9PSd6Jykge21hc2t8PVVTRVNQRUM7ZmZsYWdzPScgJzt9CiNlbHNlCgkgICAgaWYoZmZsYWdzPT0neicpIHttYXNrfD1VU0VTUEVDO2ZmbGFncz0nbCc7fQojZW5kaWYKCSAgICBpZihmZmxhZ3M9PSd0Jyl7CgkgICAgICBtYXNrfD1VU0VTUEVDOwoJICAgICAgaWYoUFRSRElGRl9UKENIQVIpPT1MTE9ORykKCQlmZmxhZ3M9TEw7CgkgICAgICBlbHNlIGlmKFBUUkRJRkZfVChDSEFSKT09TE9ORykKCQlmZmxhZ3M9J2wnOwoJICAgICAgZWxzZQoJCWZmbGFncz0nICc7CgkgICAgfQoJICAgIGlmKGZmbGFncz09SEgpIGxmbGFnfD1VU0VTUEVDOwoJICAgIGlmKGZmbGFncz09J2gnKSBsZmxhZ3w9VVNFSEFMRjsKCSAgICBpZihmZmxhZ3M9PSdsJykgbGZsYWd8PVVTRUxPTkc7CgkgICAgaWYoZmZsYWdzPT1MTCkgbGZsYWd8PVVTRUxMT05HOwoJICAgIGlmKERFQlVHJjEpIHByaW50ZigiZm9ybWF0PSVjJWNcbiIsZmZsYWdzLGMpOwoJICAgIGlmKGZmbGFncz09JyonJiYoZmxhZ3MmU0NBTkZMSUtFKSkgY29udGludWU7CgkgICAgaWYoYyE9JyUnKXsKCSAgICAgIGlmKCFhbCl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQoJICAgICAgdD1hbC0+YXJnLT5udHlwOwoJICAgICAgaWYoREVCVUcmMSl7IHByZChzdGRvdXQsdCk7cHJpbnRmKCJcbiIpO30KCSAgICAgIGlmKChmbGFncyZTQ0FORkxJS0UpKXsKCQlpZighSVNQT0lOVEVSKHQtPmZsYWdzKSl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQoJCXQ9dC0+bmV4dDsKCSAgICAgIH0KCSAgICAgIGF0PXQtPmZsYWdzJk5VOwoJICAgIH0KCSAgICBpZihmbGFncyZQUklOVEZMSUtFKXsKCSAgICAgIHN3aXRjaChjKXsKCSAgICAgIGNhc2UgJyUnOgoJCW1hc2t8PVVTRVBFUkM7CgkJZnVzZWR8PTE7CgkJYnJlYWs7CgkgICAgICBjYXNlICdvJzoKCSAgICAgIGNhc2UgJ3gnOgoJICAgICAgY2FzZSAnWCc6CgkgICAgICBjYXNlICdjJzoKCQlhdCY9TlE7ICAgICAvKiAgZmFsbCB0aHJvdWdoICAgICovCgkgICAgICBjYXNlICdpJzoKCSAgICAgIGNhc2UgJ2QnOgoJCWZ1c2VkfD0xOwoJCWlmKGF0PT1MTE9ORyYmZmZsYWdzIT1MTCl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQoJCWlmKGF0PT1MT05HJiZmZmxhZ3MhPSdsJyl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQoJCWlmKGZmbGFncz09J2wnJiZhdCE9TE9ORyl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQoJCWlmKGF0PENIQVJ8fGF0PkxMT05HKXtlcnJvcigyMTQpO3JldHVybiBvazt9CgkJaWYoYz09J28nKSBtYXNrfD1VU0VPQ1Q7CgkJaWYoYz09J3gnKSBtYXNrfD1VU0VIRVhMOwoJCWlmKGM9PSdYJykgbWFza3w9VVNFSEVYVTsKCQlpZihjPT0naScpIG1hc2t8PVVTRUlOVDsKCQlpZihjPT0nZCcpIG1hc2t8PVVTRURFQzsKCQlpZihjPT0nYycpIG1hc2t8PVVTRUNIQVI7CgkJbWFza3w9bGZsYWc7CgkJYnJlYWs7CgkgICAgICBjYXNlICd1JzoKCQltYXNrfD1VU0VVTlM7CgkJZnVzZWR8PTE7CgkJaWYoYWwtPmFyZy0+ZmxhZ3M9PUNFWFBSKSBhdHw9VU5TSUdORUQ7CgkJaWYoYXQ9PShVTlNJR05FRHxMTE9ORykmJmZmbGFncyE9TEwpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KCQlpZihhdD09KFVOU0lHTkVEfExPTkcpJiZmZmxhZ3MhPSdsJyl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQoJCWlmKGZmbGFncz09J2wnJiZhdCE9KFVOU0lHTkVEfExPTkcpKXtlcnJvcigyMTQpO3JldHVybiBvazt9CgkJaWYoYXQ8KFVOU0lHTkVEfENIQVIpfHxhdD4oVU5TSUdORUR8TExPTkcpKXtlcnJvcigyMTQpO3JldHVybiBvazt9CgkJbWFza3w9bGZsYWc7CgkJYnJlYWs7CgkgICAgICBjYXNlICdzJzoKCQltYXNrfD1VU0VTVFI7CgkJZnVzZWR8PTE7CgkJaWYoIUlTUE9JTlRFUihhdCl8fCh0LT5uZXh0LT5mbGFncyZOUSkhPUNIQVIpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KCQlicmVhazsKCSAgICAgIGNhc2UgJ2YnOgoJICAgICAgY2FzZSAnZSc6CgkgICAgICBjYXNlICdFJzoKCSAgICAgIGNhc2UgJ2cnOgoJICAgICAgY2FzZSAnRyc6CgkJbWFza3w9VVNFRkxPQVQ7CgkJZnVzZWR8PTc7CgkJaWYoZmZsYWdzPT0nTCcpewoJCSAgaWYoYXQhPUxET1VCTEUpe2Vycm9yKDIxNCk7IHJldHVybiBvazt9CgkJfWVsc2V7CgkJICBpZihhdCE9RkxPQVQmJmF0IT1ET1VCTEUpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KCQl9CgkJYnJlYWs7CgkgICAgICBjYXNlICdwJzoKCQltYXNrfD1VU0VTUEVDOwoJCWZ1c2VkfD0zOwoJCWlmKCFJU1BPSU5URVIoYXQpfHwodC0+bmV4dC0+ZmxhZ3MpIT1WT0lEKXtlcnJvcigyMTQpO3JldHVybiBvazt9CgkJYnJlYWs7CgkgICAgICBjYXNlICduJzoKCQltYXNrfD1VU0VDTlQ7CgkJZnVzZWR8PTM7CgkJaWYoIUlTUE9JTlRFUihhdCkpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KCQlhdD10LT5uZXh0LT5mbGFncyZOVTsKCQlpZihmZmxhZ3M9PUhIJiZhdCE9Q0hBUil7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQoJCWlmKGZmbGFncz09J2gnJiZhdCE9U0hPUlQpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KCQlpZihmZmxhZ3M9PScgJyYmYXQhPUlOVCl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQoJCWlmKGZmbGFncz09J2wnJiZhdCE9TE9ORyl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQoJCWlmKGZmbGFncz09TEwmJmF0IT1MTE9ORyl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQoJCWJyZWFrOwoJICAgICAgZGVmYXVsdDoKCQllcnJvcigyMTQpO3JldHVybiBvazsKCSAgICAgIH0KCSAgICB9ZWxzZXsKCSAgICAgIGlmKGM9PSdzJykgbWFza3w9VVNFU1RSOwoJICAgICAgaWYoYz09J2MnKSBtYXNrfD1VU0VDSEFSOwoJICAgICAgaWYoYz09J24nKSBtYXNrfD1VU0VDTlQ7CgkgICAgICBpZihjPT0nZCcpIG1hc2t8PVVTRURFQzsKCSAgICAgIGlmKGM9PSdpJykgbWFza3w9VVNFSU5UOwoJICAgICAgaWYoYz09J28nKSBtYXNrfD1VU0VPQ1Q7CgkgICAgICBpZihjPT0neCcpIG1hc2t8PVVTRUhFWEw7CgkgICAgICBpZihjPT0ndScpIG1hc2t8PVVTRVVOUzsKCgkgICAgICBzd2l0Y2goYyl7CgkgICAgICBjYXNlICclJzoKCQltYXNrfD1VU0VQRVJDOwoJCWZ1c2VkfD0xOwoJCWJyZWFrOwoJICAgICAgY2FzZSAnWyc6CgkJbWFza3w9VVNFUkVYUDsKCQlmdXNlZHw9MzsKCQlkb3sKCQkgIGM9KGludCl6bTJsKHpjMnptKGNsLT5vdGhlci0+dmFsLnZjaGFyKSk7CgkJICBjPUNIQVJCQUNLKGMpOwoJCSAgY2w9Y2wtPm5leHQ7CgkJICBpZighY2wpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KCQl9d2hpbGUoYyE9J10nKTsgICAgIC8qICBmYWxsIHRocm91Z2ggICAgKi8KCSAgICAgIGNhc2UgJ3MnOgoJICAgICAgY2FzZSAnYyc6CgkJZnVzZWR8PTE7CgkJaWYoKGF0Jk5RKSE9Q0hBUil7ZXJyb3IoMjE0KTtyZXR1cm4ob2spO30KCQlicmVhazsKCSAgICAgIGNhc2UgJ24nOgoJCWZ1c2VkfD0zOyAgICAgICAvKiAgZmFsbCB0aHJvdWdoICAgICovCgkgICAgICBjYXNlICdkJzoKCSAgICAgIGNhc2UgJ2knOgoJICAgICAgY2FzZSAnbyc6CgkJZnVzZWR8PTE7CgkJaWYoZmZsYWdzPT1ISCYmYXQhPUNIQVIpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KCQlpZihmZmxhZ3M9PSdoJyYmYXQhPVNIT1JUKXtlcnJvcigyMTQpO3JldHVybiBvazt9CgkJaWYoZmZsYWdzPT0nICcmJmF0IT1JTlQpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KCQlpZihmZmxhZ3M9PSdsJyYmYXQhPUxPTkcpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KCQlpZihmZmxhZ3M9PUxMJiZhdCE9TExPTkcpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KCQlicmVhazsKCSAgICAgIGNhc2UgJ3gnOgoJICAgICAgY2FzZSAndSc6CgkJZnVzZWR8PTE7CgkJaWYoZmZsYWdzPT1ISCYmYXQhPUNIQVIpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KCQlpZihmZmxhZ3M9PSdoJyYmYXQhPShVTlNJR05FRHxTSE9SVCkpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KCQlpZihmZmxhZ3M9PScgJyYmYXQhPShVTlNJR05FRHxJTlQpKXtlcnJvcigyMTQpO3JldHVybiBvazt9CgkJaWYoZmZsYWdzPT0nbCcmJmF0IT0oVU5TSUdORUR8TE9ORykpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KCQlpZihmZmxhZ3M9PUxMJiZhdCE9KFVOU0lHTkVEfExMT05HKSl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQoJCWJyZWFrOwoJICAgICAgY2FzZSAnZSc6CgkgICAgICBjYXNlICdmJzoKCSAgICAgIGNhc2UgJ2cnOgoJCW1hc2t8PVVTRUZMT0FUOwoJCWZ1c2VkfD03OwoJCWlmKGZmbGFncz09JyAnJiZhdCE9RkxPQVQpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KCQlpZihmZmxhZ3M9PSdsJyYmYXQhPURPVUJMRSl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQoJCWlmKGZmbGFncz09J0wnJiZhdCE9TERPVUJMRSl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQoJCWJyZWFrOwoJICAgICAgY2FzZSAncCc6CgkJbWFza3w9VVNFU1BFQzsKCQlmdXNlZHw9MzsKCQlpZighSVNQT0lOVEVSKGF0KXx8KHQtPm5leHQtPmZsYWdzJk5RKSE9Vk9JRCl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQoJCWJyZWFrOwoJICAgICAgZGVmYXVsdDoKCQllcnJvcigyMTQpO3JldHVybiBvazsKCSAgICAgIH0KCSAgICB9CgkgICAgaWYoYyE9JyUnKSBhbD1hbC0+bmV4dDsKCSAgfQoJICBpZihhbCl7IGVycm9yKDIxNCk7cmV0dXJuIG9rO30gLyogenUgdmllbGUgKi8KCSAgaWYoREVCVUcmMSkgcHJpbnRmKCJmdXNlZD0lZFxuIixmdXNlZCk7CgkgIGlmKG1hc2tfb3B0KXsKCSAgICBWYXIgKnY7Y2hhciByZXBsW01BWEkrMTZdOwoJICAgIGlmKG1hc2spewoJICAgICAgc3ByaW50ZihyZXBsLCIlcy4lbHUiLHMsMUwpOwoJICAgICAgdj1maW5kX3ZhcihyZXBsLDApOwoJICAgICAgaWYoIXYpewoJCXR5cGUgKnQ7CgkJdj1maW5kX3ZhcihzLDApOwoJCWlmKCF2KSBpZXJyb3IoMCk7CgkJdj1hZGRfdmFyKHJlcGwsY2xvbmVfdHlwKHYtPnZ0eXApLEVYVEVSTiwwKTsKCSAgICAgIH0KCSAgICB9CgkgICAgaWYobWFzaykKCSAgICAgIHNwcmludGYocmVwbCwiJXMuJWx1IiwoZmxhZ3MmUFJJTlRGTElLRSk/InZmcHJpbnRmIjoidmZzY2FuZiIsbWFzayk7CgkgICAgZWxzZQoJICAgICAgc3ByaW50ZihyZXBsLCIlcyIsKGZsYWdzJlBSSU5URkxJS0UpPyJ2ZnByaW50ZiI6InZmc2NhbmYiKTsKCSAgICBuZWVkcyhyZXBsKTsKCSAgICBwLT5sZWZ0LT5sZWZ0LT5vLnY9djsKCSAgICBpZihERUJVRyYxKSBwcmludGYoInJlcGw9JXNcbiIscmVwbCk7CgkgIH1lbHNlIGlmKGZ1c2VkIT03JiZzKXsKCSAgICAvKiAgV2VubiBrZWluIEZvcm1hdCBiZW51dHp0IHdpcmQsIGthbm4gbWFuIHByaW50ZiwgKi8KCSAgICAvKiAgc2NhbmYgZXRjLiBkdXJjaCBhZWhubGljaGVzIGVyc2V0emVuLiAgICAgICAgICAgKi8KCSAgICBWYXIgKnY7Y2hhciByZXBsW01BWEkrNl09Il9fdiI7CgkgICAgaWYoZnVzZWQ9PTMpIGZ1c2VkPTI7CgkgICAgcmVwbFszXT1mdXNlZCsnMCc7cmVwbFs0XT0wOwoJICAgIHN0cmNhdChyZXBsLHMpOwoJICAgIGlmKERFQlVHJjEpIHByaW50ZigicmVwbD0lc1xuIixyZXBsKTsKCSAgICB3aGlsZShmdXNlZDw9Mil7CgkgICAgICB2PWZpbmRfdmFyKHJlcGwsMCk7CgkgICAgICBpZih2JiZ2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pewoJCXAtPmxlZnQtPmxlZnQtPm8udj12OwoJCWJyZWFrOwoJICAgICAgfQoJICAgICAgZnVzZWQrKztyZXBsWzNdKys7CgkgICAgfQoJICB9CgkgIHJldHVybiBvazsKCX0KICAgICAgfQogICAgICBpKys7YWw9YWwtPm5leHQ7CiAgICB9CiAgICBpZihpPj1zZC0+Y291bnQpIHJldHVybiBvazsKICAgIGlmKCgqc2QtPnNsKVtpXS5zdHlwJiYoKCpzZC0+c2wpW2ldLnN0eXAtPmZsYWdzJk5RKSE9Vk9JRCl7ZXJyb3IoODMpOy8qcHJpbnRmKCJzZC0+Y291bnQ9JWRcbiIsc2QtPmNvdW50KTsqL30KICAgIHJldHVybiBvazsKICB9CiAgaWYoZj09Q09ORCl7CiAgICBpZighSVNBUklUSChwLT5sZWZ0LT5udHlwLT5mbGFncykmJiFJU1BPSU5URVIocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXsKICAgICAgZXJyb3IoMjkpOwogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmKHAtPmxlZnQtPmZsYWdzPT1DRVhQUiYmIXAtPmxlZnQtPnNpZGVmeCl7CiAgICAgIGludCBudWxsO25wIG1lcms7CiAgICAgIGlmKERFQlVHJjEpIHByaW50ZigiY29uc3RhbnQgY29uZGl0aW9uYWwtZXhwcmVzc2lvbiBzaW1wbGlmaWVkXG4iKTsKICAgICAgZXZhbF9jb25zdG4ocC0+bGVmdCk7CiAgICAgIGlmKHptZXF0byh2bWF4LGwyem0oMEwpKSYmenVtZXF0byh2dW1heCx1bDJ6dW0oMFVMKSkmJnpsZGVxdG8odmxkb3VibGUsZDJ6bGQoMC4wKSkpCgludWxsPTE7IAogICAgICBlbHNlIAoJbnVsbD0wOwogICAgICBmcmVlX2V4cHJlc3Npb24ocC0+bGVmdCk7CiAgICAgIG1lcms9cC0+cmlnaHQ7CiAgICAgIGlmKG51bGwpewoJZnJlZV9leHByZXNzaW9uKHAtPnJpZ2h0LT5sZWZ0KTsKCSpwPSpwLT5yaWdodC0+cmlnaHQ7CiAgICAgIH1lbHNlewoJZnJlZV9leHByZXNzaW9uKHAtPnJpZ2h0LT5yaWdodCk7CgkqcD0qcC0+cmlnaHQtPmxlZnQ7CiAgICAgIH0KICAgICAgaWYobWVyay0+bnR5cCkgZnJlZXR5cChtZXJrLT5udHlwKTsKICAgICAgZnJlZShtZXJrKTsKICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBpZihjb25zdF9leHByKXtlcnJvcig0Nik7cmV0dXJuIDA7fQogICAgcC0+bnR5cD1jbG9uZV90eXAocC0+cmlnaHQtPm50eXApOwogICAgcmV0dXJuIDE7CiAgfQogIGlmKGY9PUNPTE9OKXsKICAgIC8qICBIaWVyIGZlaGx0IG5vY2gga29ycmVrdGUgQmVoYW5kbHVuZyBkZXIgVHlwYXR0cmlidXRlICAgICovCiAgICBpZihJU0FSSVRIKHAtPmxlZnQtPm50eXAtPmZsYWdzKSYmSVNBUklUSChwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpKXsKICAgICAgcC0+bnR5cD1hcml0aF90eXAocC0+bGVmdC0+bnR5cCxwLT5yaWdodC0+bnR5cCk7CiAgICAgIHJldHVybiAxOwogICAgfQogICAgaWYoY29tcGF0aWJsZV90eXBlcyhwLT5sZWZ0LT5udHlwLHAtPnJpZ2h0LT5udHlwLE5RKSl7CiAgICAgIHAtPm50eXA9Y2xvbmVfdHlwKHAtPmxlZnQtPm50eXApOwogICAgICByZXR1cm4gMTsKICAgIH0KICAgIGlmKElTUE9JTlRFUihwLT5sZWZ0LT5udHlwLT5mbGFncykmJklTUE9JTlRFUihwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpKXsKICAgICAgaWYoKHAtPmxlZnQtPm50eXAtPm5leHQtPmZsYWdzJk5RKT09Vk9JRCl7CglpZihudWxscG9pbnRlcihwLT5sZWZ0KSkKCSAgcC0+bnR5cD1jbG9uZV90eXAocC0+cmlnaHQtPm50eXApOwoJZWxzZQoJICBwLT5udHlwPWNsb25lX3R5cChwLT5sZWZ0LT5udHlwKTsKCXJldHVybiAxOwogICAgICB9CiAgICAgIGlmKChwLT5yaWdodC0+bnR5cC0+bmV4dC0+ZmxhZ3MmTlEpPT1WT0lEKXsKCWlmKG51bGxwb2ludGVyKHAtPnJpZ2h0KSkKCSAgcC0+bnR5cD1jbG9uZV90eXAocC0+bGVmdC0+bnR5cCk7CgllbHNlCgkgIHAtPm50eXA9Y2xvbmVfdHlwKHAtPnJpZ2h0LT5udHlwKTsKCXJldHVybiAxOwogICAgICB9CiAgICB9CiAgICBpZihJU1BPSU5URVIocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpJiZwLT5yaWdodC0+ZmxhZ3M9PUNFWFBSKXsKICAgICAgZXZhbF9jb25zdG4ocC0+cmlnaHQpOwogICAgICBpZih6bWVxdG8odm1heCxsMnptKDBMKSkmJnp1bWVxdG8odWwyenVtKDBVTCksdnVtYXgpJiZ6bGRlcXRvKGQyemxkKDAuMCksdmxkb3VibGUpKXsKCXAtPm50eXA9Y2xvbmVfdHlwKHAtPmxlZnQtPm50eXApOwoJcmV0dXJuIDE7CiAgICAgIH0KICAgIH0KICAgIGlmKElTUE9JTlRFUihwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpJiZwLT5sZWZ0LT5mbGFncz09Q0VYUFIpewogICAgICBldmFsX2NvbnN0bihwLT5sZWZ0KTsKICAgICAgaWYoem1lcXRvKGwyem0oMEwpLHZtYXgpJiZ6dW1lcXRvKHVsMnp1bSgwVUwpLHZ1bWF4KSYmemxkZXF0byhkMnpsZCgwLjApLHZsZG91YmxlKSl7CglwLT5udHlwPWNsb25lX3R5cChwLT5yaWdodC0+bnR5cCk7CglyZXR1cm4gMTsKICAgICAgfQogICAgfQogICAgZXJyb3IoMzEpOwogICAgcmV0dXJuIDA7CiAgfQogIGlmKGYpIHByaW50ZigidHlwZV90ZXN0aW5nIGZ1ZXIgZGllc2VuIE9wZXJhdG9yICglZCkgbm9jaCBuaWNodCBpbXBsZW1lbnRpZXJ0XG4iLGYpOwogIHJldHVybiAwOwp9CgpucCBtYWtlcG9pbnRlcihucCBwKQovKiAgRnVlaHJ0IGF1dG9tYXRpc2NoZSBaZWlnZXJlcnpldWd1bmcgZnVlciBCYXVtd3VyemVsIGR1cmNoICAgKi8KLyogIER1cmNoIG1laHJtYWxpZ2VuIEF1ZnJ1ZiB2b24gdHlwZV9leHByZXNzaW9uKCkgaW5lZmZpemllbnQgICovCnsKICAgIHN0cnVjdF9kZWNsYXJhdGlvbiAqc2Q7CiAgICBpZihJU0FSUkFZKHAtPm50eXAtPmZsYWdzKXx8SVNGVU5DKHAtPm50eXAtPmZsYWdzKSl7CiAgICAgIG5wIG5ldz1uZXdfbm9kZSgpOwogICAgICAgIGlmKElTQVJSQVkocC0+bnR5cC0+ZmxhZ3MpKXsKICAgICAgICAgICAgbmV3LT5mbGFncz1BRERSRVNTQTsKICAgICAgICAgICAgbmV3LT5udHlwPWNsb25lX3R5cChwLT5udHlwKTsKICAgICAgICAgICAgbmV3LT5udHlwLT5mbGFncz1QT0lOVEVSX1RZUEUobmV3LT5udHlwLT5uZXh0KTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgbmV3LT5mbGFncz1BRERSRVNTOwogICAgICAgICAgICBuZXctPm50eXA9bmV3X3R5cCgpOwogICAgICAgICAgICBuZXctPm50eXAtPmZsYWdzPVBPSU5URVJfVFlQRShwLT5udHlwKTsKICAgICAgICAgICAgbmV3LT5udHlwLT5uZXh0PWNsb25lX3R5cChwLT5udHlwKTsKICAgICAgICB9CiAgICAgICAgbmV3LT5sZWZ0PXA7CiAgICAgICAgbmV3LT5yaWdodD0wOwogICAgICAgIG5ldy0+bHZhbHVlPTA7ICAvKiBpbW1lciBrb3JyZWt0ID8gICovCiAgICAgICAgbmV3LT5zaWRlZng9cC0+c2lkZWZ4OwovKiAgICAgICAgdHlwZV9leHByZXNzaW9uKG5ldyk7Ki8KICAgICAgICByZXR1cm4gbmV3OwogICAgfWVsc2UgCiAgICAgIHJldHVybiBwOwp9Cgp2b2lkIHNpbXBsZV9hbGdfb3B0KG5wIHApCnsKICBpbnQgYz0wLGYsdD0wOwogIHpsZG91YmxlIGQxLGQyOwogIHp1bWF4IHUxLHUyO3ptYXggczEsczI7CiAgVmFyICp2OwoKICBpZighcCkgcmV0dXJuOwoKICBmPXAtPmZsYWdzOwoKICBpZihmPT1JREVOVElGSUVSJiYodj1maW5kX3ZhcihwLT5pZGVudGlmaWVyLDApKSYmKHYtPnZ0eXAtPmZsYWdzJk5RKT09RU5VTSl7CiAgICAvKiAgZW51bWVyYXRpb25zIGF1Y2ggYWxzIEtvbnN0YW50ZSAoaW50KSBiZWhhbmRlbG4gKi8KICAgIHAtPmZsYWdzPUNFWFBSOwogICAgaWYoIXYtPmNsaXN0KSBpZXJyb3IoMCk7CiAgICBwLT52YWw9di0+Y2xpc3QtPnZhbDsKICAgIGlmKCFwLT5udHlwKSBwLT5udHlwPW5ld190eXAoKTsKICAgIHAtPm50eXAtPmZsYWdzPUNPTlNUfElOVDsKICAgIHJldHVybjsKICB9CgoKICBpZihwLT5sZWZ0KQogICAgc2ltcGxlX2FsZ19vcHQocC0+bGVmdCk7CiAgZWxzZQogICAgcmV0dXJuOwogIGlmKHAtPnJpZ2h0KQogICAgc2ltcGxlX2FsZ19vcHQocC0+cmlnaHQpOwoKICBpZihwLT5sZWZ0LT5mbGFncz09Q0VYUFJ8fHAtPmxlZnQtPmZsYWdzPT1QQ0VYUFIpewogICAgZXZhbF9jb25zdG4ocC0+bGVmdCk7CiAgICBkMT12bGRvdWJsZTt1MT12dW1heDtzMT12bWF4O2N8PTE7CiAgfQogIGlmKHAtPnJpZ2h0JiYocC0+cmlnaHQtPmZsYWdzPT1DRVhQUnx8cC0+cmlnaHQtPmZsYWdzPT1QQ0VYUFIpKXsKICAgIGV2YWxfY29uc3RuKHAtPnJpZ2h0KTsKICAgIGQyPXZsZG91YmxlO3UyPXZ1bWF4O3MyPXZtYXg7Y3w9MjsKICB9CgogIGlmKHAtPm50eXApIHQ9cC0+bnR5cC0+ZmxhZ3M7CgogIGlmKGM9PTMmJigoZj49T1ImJmY8PUFORCl8fChmPj1MU0hJRlQmJmY8PU1PRCkpKXsKICAgIGlmKERFQlVHJjEpIHByaW50ZigiZGlkIHNpbXBsZV9hbGcgY29uc3RhbnQgZm9sZGluZ1xuIik7CiAgICBpZighdCkgdD1hcml0aF9mbGFnKHAtPmxlZnQtPm50eXAtPmZsYWdzLHAtPnJpZ2h0LT5udHlwLT5mbGFncyk7CiAgICBpZihERUJVRyYxKSBwcmludGYoImRpZCBzaW1wbGUgY29uc3RhbnQgZm9sZGluZ1xuIik7CgogICAgaWYoZj09QU5EJiZJU0lOVCh0KSl7CiAgICAgIHZ1bWF4PXp1bWFuZCh1MSx1Mik7CiAgICAgIHZtYXg9em1hbmQoczEsczIpOwogICAgfQogICAgaWYoZj09T1ImJklTSU5UKHQpKXsKICAgICAgdnVtYXg9enVtb3IodTEsdTIpOwogICAgICB2bWF4PXptb3IoczEsczIpOwogICAgfQogICAgaWYoZj09WE9SJiZJU0lOVCh0KSl7CiAgICAgIHZ1bWF4PXp1bXhvcih1MSx1Mik7CiAgICAgIHZtYXg9em14b3IoczEsczIpOwogICAgfQogICAgaWYoZj09QUREKXsKICAgICAgdnVtYXg9enVtYWRkKHUxLHUyKTsKICAgICAgdm1heD16bWFkZChzMSxzMik7CiAgICAgIHZsZG91YmxlPXpsZGFkZChkMSxkMik7CiAgICB9CiAgICBpZihmPT1TVUIpewogICAgICB2dW1heD16dW1zdWIodTEsdTIpOwogICAgICB2bWF4PXptc3ViKHMxLHMyKTsKICAgICAgdmxkb3VibGU9emxkc3ViKGQxLGQyKTsKICAgIH0KICAgIGlmKGY9PU1VTFR8fGY9PVBNVUxUKXsKICAgICAgdnVtYXg9enVtbXVsdCh1MSx1Mik7CiAgICAgIHZtYXg9em1tdWx0KHMxLHMyKTsKICAgICAgdmxkb3VibGU9emxkbXVsdChkMSxkMik7CiAgICAgIGlmKGY9PVBNVUxUKSBwLT5mbGFncz1QQ0VYUFI7CiAgICB9CiAgICBpZihmPT1ESVYpewogICAgICBpZih6bWVxdG8obDJ6bSgwTCksczIpJiZ6dW1lcXRvKHVsMnp1bSgwVUwpLHUyKSYmemxkZXF0byhkMnpsZCgwLjApLGQyKSl7CgllcnJvcig4NCk7Cgl2bWF4PWwyem0oMEwpO3Z1bWF4PXVsMnp1bSgwVUwpO3ZsZG91YmxlPWQyemxkKDAuMCk7CiAgICAgIH1lbHNlewoJaWYoIXp1bWVxdG8odWwyenVtKDBVTCksdTIpKSB2dW1heD16dW1kaXYodTEsdTIpOwoJaWYoIXptZXF0byhsMnptKDBMKSxzMikpIHZtYXg9em1kaXYoczEsczIpOwoJaWYoIXpsZGVxdG8oZDJ6bGQoMC4wKSxkMikpIHZsZG91YmxlPXpsZGRpdihkMSxkMik7CiAgICAgIH0KICAgIH0KICAgIGlmKGY9PU1PRCYmSVNJTlQodCkpewogICAgICBpZih6bWVxdG8obDJ6bSgwTCksczIpJiZ6dW1lcXRvKHVsMnp1bSgwVUwpLHUyKSl7CgllcnJvcig4NCk7Cgl2bWF4PWwyem0oMEwpO3Z1bWF4PXptMnp1bSh2bWF4KTsKICAgICAgfWVsc2V7CglpZighenVtZXF0byh1bDJ6dW0oMFVMKSx1MikpIHZ1bWF4PXp1bW1vZCh1MSx1Mik7CglpZighem1lcXRvKGwyem0oMEwpLHMyKSkgdm1heD16bW1vZChzMSxzMik7CiAgICAgIH0KICAgIH0KICAgIGlmKGY9PUxTSElGVCYmSVNJTlQodCkpewogICAgICB2dW1heD16dW1sc2hpZnQodTEsdTIpOwogICAgICB2bWF4PXptbHNoaWZ0KHMxLHMyKTsKICAgIH0KICAgIGlmKGY9PVJTSElGVCYmSVNJTlQodCkpewogICAgICB2dW1heD16dW1yc2hpZnQodTEsdTIpOwogICAgICB2bWF4PXptcnNoaWZ0KHMxLHMyKTsKICAgIH0KICB9ZWxzZSBpZihjPT0xJiZmPT1NSU5VUyl7CiAgICBpZighdCkgdD1hcml0aF9mbGFnKHAtPmxlZnQtPm50eXAtPmZsYWdzLHAtPmxlZnQtPm50eXAtPmZsYWdzKTsKICAgIHZtYXg9em1zdWIoWjAsczEpOwogICAgdnVtYXg9enVtc3ViKFpVMCx1MSk7CiAgICB2bGRvdWJsZT16bGRzdWIoZDJ6bGQoMC4wKSxkMSk7CiAgfWVsc2UgaWYoYz09MSYmZj09S09NUExFTUVOVCl7CiAgICBpZighdCkgdD1hcml0aF9mbGFnKHAtPmxlZnQtPm50eXAtPmZsYWdzLHAtPmxlZnQtPm50eXAtPmZsYWdzKTsKICAgIGlmKCFJU0lOVCh0KSkgcmV0dXJuOwogICAgdm1heD16bWtvbXBsKHMxKTsKICAgIHZ1bWF4PXp1bWtvbXBsKHUxKTsKICB9ZWxzZSBpZihjPT0xJiZmPT1ORUdBVElPTil7CiAgICBpZighcC0+bGVmdC0+bnR5cCkgcmV0dXJuOwogICAgdD1JTlQ7CiAgICBpZighSVNJTlQocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXsKICAgICAgaWYoemxkZXF0byhkMSxkMnpsZCgwLjApKSkgdm1heD1aMTsgZWxzZSB2bWF4PVowOwogICAgfWVsc2UgaWYocC0+bGVmdC0+bnR5cC0+ZmxhZ3MmVU5TSUdORUQpewogICAgICBpZih6dW1lcXRvKHUxLFpVMCkpIHZtYXg9WjE7IGVsc2Ugdm1heD1aMDsKICAgIH1lbHNlCiAgICAgIGlmKHptZXF0byhzMSxaMCkpIHZtYXg9WjE7IGVsc2Ugdm1heD1aMDsKICB9ZWxzZQogICAgcmV0dXJuOwoKICBwLT5mbGFncz1DRVhQUjsKICBpZihwLT5sZWZ0JiYhcC0+bGVmdC0+c2lkZWZ4KSB7ZnJlZV9leHByZXNzaW9uKHAtPmxlZnQpO3AtPmxlZnQ9MDt9CiAgaWYocC0+cmlnaHQmJnAtPnJpZ2h0LT5zaWRlZngpIHtmcmVlX2V4cHJlc3Npb24ocC0+cmlnaHQpO3AtPnJpZ2h0PTA7fQoKICBpZihJU0ZMT0FUKHQpKXsKICAgIGd2YWwudmxkb3VibGU9dmxkb3VibGU7CiAgICBldmFsX2NvbnN0KCZndmFsLExET1VCTEUpOwogIH1lbHNlewogICAgaWYodCZVTlNJR05FRCl7CiAgICAgIGd2YWwudnVtYXg9dnVtYXg7CiAgICAgIGV2YWxfY29uc3QoJmd2YWwsKFVOU0lHTkVEfE1BWElOVCkpOwogICAgfWVsc2V7CiAgICAgIGd2YWwudm1heD12bWF4OwogICAgICBldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CiAgICB9CiAgfQogIGluc2VydF9jb25zdCgmcC0+dmFsLHQpOwogIGlmKCFwLT5udHlwKXtwLT5udHlwPW5ld190eXAoKTtwLT5udHlwLT5mbGFncz10O30KfQoKCmludCBhbGdfb3B0KG5wIHAsdHlwZSAqdHR5cCkKLyogIGZ1ZWhydCBhbGdlYnJhaXNjaGUgVmVyZWluZmFjaHVuZ2VuIGR1cmNoICAgICAgICAgICAgICAgICAgICovCi8qICBoaWVyIG5vY2ggZ2VuYXUgdGVzdGVuLCB3YXMgQU5TSS1nZW1hZXNzIGVybGF1YnQgaXN0IGV0Yy4gICAqLwovKiAgdi5hLiBGbG9hdGluZy1Qb2ludCBpc3QgZXZ0bC4ga3JpdGlzY2ggICAgICAgICAgICAgICAgICAgICAgKi8KewogICAgaW50IGM9MCxmLGtvbW0sbnVsbDEsbnVsbDIsZWluczEsZWluczI7bnAgbWVyazsKICAgIHpsZG91YmxlIGQxLGQyO3p1bWF4IHUxLHUyO3ptYXggczEsczI7CiAgICBmPXAtPmZsYWdzOwogICAgCiAgICAvKiBkbyBub3Qgb3B0aW16ZSBwb2ludGVyLXBvaW50ZXIgKi8KICAgIGlmKGY9PVNVQiYmSVNQT0lOVEVSKHAtPmxlZnQtPm50eXAtPmZsYWdzKSYmSVNQT0lOVEVSKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpCiAgICAgIHJldHVybiAxOwoKICAgIC8qICBrb21tdXRhdGl2PyAqLwogICAgaWYoZj09QUREfHxmPT1NVUxUfHxmPT1QTVVMVHx8KGY+PU9SJiZmPD1BTkQpKSBrb21tPTE7IGVsc2Uga29tbT0wOwogICAgLyogIEJlcmVjaG5ldCBXZXJ0LCB3ZW5uIGJlaWRlcyBLb25zdGFudGVuIHNpbmQgICAgICovCiAgICBpZihwLT5sZWZ0LT5mbGFncz09Q0VYUFJ8fHAtPmxlZnQtPmZsYWdzPT1QQ0VYUFIpewogICAgICAgIGV2YWxfY29uc3RuKHAtPmxlZnQpOwogICAgICAgIGQxPXZsZG91YmxlO3UxPXZ1bWF4O3MxPXZtYXg7Y3w9MTsKICAgIH0KICAgIGlmKHAtPnJpZ2h0LT5mbGFncz09Q0VYUFJ8fHAtPnJpZ2h0LT5mbGFncz09UENFWFBSKXsKICAgICAgICBldmFsX2NvbnN0bihwLT5yaWdodCk7CiAgICAgICAgZDI9dmxkb3VibGU7dTI9dnVtYXg7czI9dm1heDtjfD0yOwogICAgfQogICAgaWYoYz09Myl7CiAgICAgICAgcC0+ZmxhZ3M9Q0VYUFI7CiAgICAgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJkaWQgc2ltcGxlIGNvbnN0YW50IGZvbGRpbmdcbiIpOwogICAgICAgIGlmKCFwLT5sZWZ0LT5zaWRlZngpIHtmcmVlX2V4cHJlc3Npb24ocC0+bGVmdCk7cC0+bGVmdD0wO30KICAgICAgICBpZighcC0+cmlnaHQtPnNpZGVmeCkge2ZyZWVfZXhwcmVzc2lvbihwLT5yaWdodCk7cC0+cmlnaHQ9MDt9CiAgICAgICAgaWYoZj09QU5EKXsKCSAgdnVtYXg9enVtYW5kKHUxLHUyKTsKCSAgdm1heD16bWFuZChzMSxzMik7CiAgICAgICAgfQogICAgICAgIGlmKGY9PU9SKXsKCSAgdnVtYXg9enVtb3IodTEsdTIpOwoJICB2bWF4PXptb3IoczEsczIpOwogICAgICAgIH0KICAgICAgICBpZihmPT1YT1IpewoJICB2dW1heD16dW14b3IodTEsdTIpOwoJICB2bWF4PXpteG9yKHMxLHMyKTsKICAgICAgICB9CiAgICAgICAgaWYoZj09QUREKXsKCSAgdnVtYXg9enVtYWRkKHUxLHUyKTsKCSAgdm1heD16bWFkZChzMSxzMik7CgkgIHZsZG91YmxlPXpsZGFkZChkMSxkMik7CiAgICAgICAgfQogICAgICAgIGlmKGY9PVNVQil7CgkgIHZ1bWF4PXp1bXN1Yih1MSx1Mik7CgkgIHZtYXg9em1zdWIoczEsczIpOwoJICB2bGRvdWJsZT16bGRzdWIoZDEsZDIpOwogICAgICAgIH0KICAgICAgICBpZihmPT1NVUxUfHxmPT1QTVVMVCl7CgkgIHZ1bWF4PXp1bW11bHQodTEsdTIpOwoJICB2bWF4PXptbXVsdChzMSxzMik7CgkgIHZsZG91YmxlPXpsZG11bHQoZDEsZDIpOwoJICBpZihmPT1QTVVMVCkgcC0+ZmxhZ3M9UENFWFBSOwogICAgICAgIH0KICAgICAgICBpZihmPT1ESVYpewoJICBpZih6bWVxdG8obDJ6bSgwTCksczIpJiZ6dW1lcXRvKHVsMnp1bSgwVUwpLHUyKSYmemxkZXF0byhkMnpsZCgwLjApLGQyKSl7CgkgICAgZXJyb3IoODQpOwoJICAgIHZtYXg9bDJ6bSgwTCk7dnVtYXg9dWwyenVtKDBVTCk7dmxkb3VibGU9ZDJ6bGQoMC4wKTsKCSAgfWVsc2V7CgkgICAgaWYoIXp1bWVxdG8odWwyenVtKDBVTCksdTIpKSB2dW1heD16dW1kaXYodTEsdTIpOwoJICAgIGlmKCF6bWVxdG8obDJ6bSgwTCksczIpKSB2bWF4PXptZGl2KHMxLHMyKTsKCSAgICBpZighemxkZXF0byhkMnpsZCgwLjApLGQyKSkgdmxkb3VibGU9emxkZGl2KGQxLGQyKTsKCSAgfQogICAgICAgIH0KICAgICAgICBpZihmPT1NT0QpewoJICBpZih6bWVxdG8obDJ6bSgwTCksczIpJiZ6dW1lcXRvKHVsMnp1bSgwVUwpLHUyKSl7CgkgICAgZXJyb3IoODQpOwoJICAgIHZtYXg9bDJ6bSgwTCk7dnVtYXg9em0yenVtKHZtYXgpOwoJICB9ZWxzZXsKCSAgICBpZighenVtZXF0byh1bDJ6dW0oMFVMKSx1MikpIHZ1bWF4PXp1bW1vZCh1MSx1Mik7CgkgICAgaWYoIXptZXF0byhsMnptKDBMKSxzMikpIHZtYXg9em1tb2QoczEsczIpOwoJICB9CiAgICAgICAgfQogICAgICAgIGlmKGY9PUxTSElGVCl7CgkgIHZ1bWF4PXp1bWxzaGlmdCh1MSx1Mik7CgkgIHZtYXg9em1sc2hpZnQoczEsczIpOwogICAgICAgIH0KICAgICAgICBpZihmPT1SU0hJRlQpewoJICB2dW1heD16dW1yc2hpZnQodTEsdTIpOwoJICB2bWF4PXptcnNoaWZ0KHMxLHMyKTsKICAgICAgICB9CglpZihJU0ZMT0FUKHAtPm50eXAtPmZsYWdzKSl7CgkgIGd2YWwudmxkb3VibGU9dmxkb3VibGU7CgkgIGV2YWxfY29uc3QoJmd2YWwsTERPVUJMRSk7Cgl9ZWxzZXsKCSAgaWYocC0+bnR5cC0+ZmxhZ3MmVU5TSUdORUQpewoJICAgIGd2YWwudnVtYXg9dnVtYXg7CgkgICAgZXZhbF9jb25zdCgmZ3ZhbCwoVU5TSUdORUR8TUFYSU5UKSk7CgkgIH1lbHNlewoJICAgIGd2YWwudm1heD12bWF4OwoJICAgIGV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKCSAgfQoJfQoJaW5zZXJ0X2NvbnN0bihwKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIC8qICBLb25zdGFudGVuIG5hY2ggcmVjaHRzLCB3ZW5uIG1vZWdsaWNoICAgICAgICovCiAgICBpZihjPT0xJiZrb21tKXsKICAgICAgICBpZihERUJVRyYxKSBwcmludGYoImV4Y2hhbmdlZCBjb21tdXRhdGl2ZSBjb25zdGFudCBvcGVyYW5kXG4iKTsKICAgICAgICBtZXJrPXAtPmxlZnQ7cC0+bGVmdD1wLT5yaWdodDtwLT5yaWdodD1tZXJrOwogICAgICAgIGM9MjsKICAgICAgICBkMj1kMTt1Mj11MTtzMj1zMTsKICAgIH0KICAgIC8qICBWZXJ0YXVzY2h0IGRpZSBLbm90ZW4sIHVtIEtvbnN0YW50ZW4gICAgICAgICAgICAgICAgKi8KICAgIC8qICBiZXNzZXIgenVzYW1tZW56dWZhc3NlbiAoYmVpIGFsbGVuIFR5cGUgZXJsYXVidD8pICAgKi8KICAgIC8qICBIaWVyIG11c3Mgbm9jaCBlaW5pZ2VzIGtvbnRyb2xsaWVydCB3ZXJkZW4gICAgICAgICAgKi8KICAgIGlmKGtvbW0mJmM9PTImJnAtPmZsYWdzPT1wLT5sZWZ0LT5mbGFncyYmKElTSU5UKHAtPm50eXAtPmZsYWdzKXx8Y19mbGFnc1syMV0mVVNFREZMQUcpKXsKICAgICAgICBpZihwLT5sZWZ0LT5yaWdodC0+ZmxhZ3M9PUNFWFBSfHxwLT5sZWZ0LT5yaWdodC0+ZmxhZ3M9PVBDRVhQUil7CiAgICAgICAgICAgIG5wIG1lcms7CiAgICAgICAgICAgIG1lcms9cC0+cmlnaHQ7cC0+cmlnaHQ9cC0+bGVmdC0+bGVmdDtwLT5sZWZ0LT5sZWZ0PW1lcms7CiAgICAgICAgICAgIGlmKERFQlVHJjEpIHByaW50ZigiVmVydGF1c2NoZSBBZGQtTm9kZXNcbiIpOwoJICAgIGRvbnRvcHQ9MDsKICAgICAgICAgICAgcmV0dXJuIHR5cGVfZXhwcmVzc2lvbjIocCx0dHlwKTsKICAgICAgICB9CiAgICB9CiAgICBudWxsMT1udWxsMj1laW5zMT1laW5zMj0wOwogICAgaWYoYyYxKXsKICAgICAgaWYoemxkZXF0byhkMSxkMnpsZCgwLjApKSYmenVtZXF0byh1MSx1bDJ6dW0oMFVMKSkmJnptZXF0byhzMSxsMnptKDBMKSkpIG51bGwxPTE7ICAgCiAgICAgIGlmKHpsZGVxdG8oZDEsZDJ6bGQoMS4wKSkmJnp1bWVxdG8odTEsdWwyenVtKDFVTCkpJiZ6bWVxdG8oczEsbDJ6bSgxTCkpKSBlaW5zMT0xOwogICAgICBpZighKHAtPm50eXAtPmZsYWdzJlVOU0lHTkVEKSYmemxkZXF0byhkMSxkMnpsZCgtMS4wKSkmJnptZXF0byhzMSxsMnptKC0xTCkpKSBlaW5zMT0tMTsKICAgIH0KICAgIGlmKGMmMil7CiAgICAgIGlmKHpsZGVxdG8oZDIsZDJ6bGQoMC4wKSkmJnp1bWVxdG8odTIsdWwyenVtKDBVTCkpJiZ6bWVxdG8oczIsbDJ6bSgwTCkpKSBudWxsMj0xOyAKICAgICAgaWYoemxkZXF0byhkMixkMnpsZCgxLjApKSYmenVtZXF0byh1Mix1bDJ6dW0oMVVMKSkmJnptZXF0byhzMixsMnptKDFMKSkpIGVpbnMyPTE7IAogICAgICBpZighKHAtPm50eXAtPmZsYWdzJlVOU0lHTkVEKSYmemxkZXF0byhkMixkMnpsZCgtMS4wKSkmJnptZXF0byhzMixsMnptKC0xTCkpKSBlaW5zMj0tMTsKICAgIH0KICAgIGlmKGM9PTIpewogICAgICAgIC8qICBhKzA9YS0wPWFeMD1hPj4wPWE8PDA9YSoxPWEvMT1hICAgKi8KICAgICAgICBpZigoKGVpbnMyPT0xJiYoZj09TVVMVHx8Zj09UE1VTFR8fGY9PURJVikpfHwobnVsbDImJihmPT1BRER8fGY9PVNVQnx8Zj09T1J8fGY9PVhPUnx8Zj09TFNISUZUfHxmPT1SU0hJRlQpKSkmJiFwLT5yaWdodC0+c2lkZWZ4KXsKICAgICAgICAgICAgaWYoREVCVUcmMSl7aWYoZj09TVVMVHx8Zj09UE1VTFR8fGY9PURJVikgcHJpbnRmKCJhKi8xLT5hXG4iKTsgZWxzZSBwcmludGYoImErLV4wLT5hXG4iKTt9CiAgICAgICAgICAgIGZyZWVfZXhwcmVzc2lvbihwLT5yaWdodCk7CiAgICAgICAgICAgIG1lcms9cC0+bGVmdDsKICAgICAgICAgICAgKnA9KnAtPmxlZnQ7Ci8qICAgICAgICAgICAgZnJlZXR5cChtZXJrLT5udHlwKTsgIGRhcyB3YXIgRmVobGVyICAqLwogICAgICAgICAgICBmcmVlKG1lcmspOwoJICAgIGRvbnRvcHQ9MDsKICAgICAgICAgICAgcmV0dXJuIHR5cGVfZXhwcmVzc2lvbjIocCx0dHlwKTsKICAgICAgICB9CiAgICAgICAgLyogIGEqMD0wICAgKi8KICAgICAgICBpZihudWxsMiYmKGY9PU1VTFR8fGY9PVBNVUxUfHxmPT1BTkR8fGY9PURJVnx8Zj09TU9EKSl7CiAgICAgICAgICAgIGlmKERFQlVHJjEpIHByaW50ZigiYSomLyUlMC0+MFxuIik7CiAgICAgICAgICAgIGlmKG51bGwyJiYoZj09RElWfHxmPT1NT0QpKSBlcnJvcig4NCk7CiAgICAgICAgICAgIGlmKHAtPmZsYWdzPT1QTVVMVCkgcC0+ZmxhZ3M9UENFWFBSOyBlbHNlIHAtPmZsYWdzPUNFWFBSOwoJICAgIGd2YWwudmludD16bTJ6aShsMnptKDBMKSk7CgkgICAgZXZhbF9jb25zdCgmZ3ZhbCxJTlQpOwogICAgICAgICAgICAvKiAgaGllciBudXIgaW50LGxvbmcsZmxvYXQsZG91YmxlIG1vZWdsaWNoLCBob2ZmZSBpY2ggICovCiAgICAgICAgICAgIGluc2VydF9jb25zdG4ocCk7CiAgICAgICAgICAgIGlmKCFwLT5sZWZ0LT5zaWRlZngpe2ZyZWVfZXhwcmVzc2lvbihwLT5sZWZ0KTtwLT5sZWZ0PTA7fSBlbHNlIG1ha2VfY2V4cHIocC0+bGVmdCk7CiAgICAgICAgICAgIGlmKCFwLT5yaWdodC0+c2lkZWZ4KXtmcmVlX2V4cHJlc3Npb24ocC0+cmlnaHQpO3AtPnJpZ2h0PTA7fSBlbHNlIG1ha2VfY2V4cHIocC0+cmlnaHQpOwoKLyogICAgICAgICAgICByZXR1cm4odHlwZV9leHByZXNzaW9uMihwLHR0eXApKTsgICAqLwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgaWYoZWluczI9PS0xJiYoZj09TVVMVHx8Zj09UE1VTFR8fGY9PURJVikmJiFwLT5yaWdodC0+c2lkZWZ4KXsKICAgICAgICAgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJhKi8oLTEpLT4tYVxuIik7CiAgICAgICAgICAgIGZyZWVfZXhwcmVzc2lvbihwLT5yaWdodCk7CiAgICAgICAgICAgIHAtPnJpZ2h0PTA7CiAgICAgICAgICAgIHAtPmZsYWdzPU1JTlVTOwoJICAgIGRvbnRvcHQ9MDsKICAgICAgICAgICAgcmV0dXJuIHR5cGVfZXhwcmVzc2lvbjIocCx0dHlwKTsKICAgICAgICB9CgkvKiBjaGVjayB2b2xhdGlsZSAqLwoJaWYoMCkgLyogVE9ETzogbWFrZSB0aGlzIGVmZmljaWVudCAqLwoJewoJICB0eXBlIHN0PXswfTsKCSAgaWYoIXptZXF0byhzaXpldGFiW0NIQVJdLHNpemV0YWJbU0hPUlRdKSl7CgkgICAgLy9pZihmPT1BTkQmJighdHR5cHx8KHR0eXAtPmZsYWdzJk5RKT5DSEFSKSYmc2hvcnRjdXQoQU5ELENIQVIpJiZ6dW1sZXEodTIsdF9tYXhbQ0hBUl0pKQoJICAgIC8vc3QuZmxhZ3M9Q0hBUjsKCSAgICBpZihmPT1BTkQmJighdHR5cHx8KHR0eXAtPmZsYWdzJk5RKT5DSEFSKS8qJiYocC0+bnR5cC0+ZmxhZ3MmVU5TSUdORUQpKi8mJnNob3J0Y3V0KEFORCxVTlNJR05FRHxDSEFSKSYmenVtbGVxKHUyLHR1X21heFtDSEFSXSkpCgkgICAgICBzdC5mbGFncz1VTlNJR05FRHxDSEFSOwoJICB9CgkgIGlmKCF6bWVxdG8oc2l6ZXRhYltTSE9SVF0sc2l6ZXRhYltJTlRdKSl7CgkgICAgLy9pZihmPT1BTkQmJighdHR5cHx8KHR0eXAtPmZsYWdzJk5RKT5TSE9SVCkmJnNob3J0Y3V0KEFORCxTSE9SVCkmJnp1bWxlcShzMix0X21heFtTSE9SVF0pKQoJICAgIC8vc3QuZmxhZ3M9U0hPUlQ7CgkgICAgaWYoZj09QU5EJiYoIXR0eXB8fCh0dHlwLT5mbGFncyZOUSk+U0hPUlQpLyomJihwLT5udHlwLT5mbGFncyZVTlNJR05FRCkqLyYmc2hvcnRjdXQoQU5ELFVOU0lHTkVEfFNIT1JUKSYmenVtbGVxKHUyLHR1X21heFtTSE9SVF0pKQoJICAgICAgc3QuZmxhZ3M9VU5TSUdORUR8U0hPUlQ7CgkgIH0KCSAgLy9pZighdHR5cCYmKHAtPmxlZnQtPm50eXAtPmZsYWdzJk5RKT5JTlQpIHN0LmZsYWdzPTA7CgkgIGlmKHN0LmZsYWdzKXsKCSAgICBpbnQgcmV0O3R5cGUgKm90eXA7bnAgbjsKCSAgICBpZighcC0+bnR5cCkgaWVycm9yKDApOwoJICAgIG90eXA9Y2xvbmVfdHlwKHAtPm50eXApOwoJICAgIG49bmV3X25vZGUoKTsKCSAgICBuLT5sZWZ0PXAtPmxlZnQ7CgkgICAgbi0+cmlnaHQ9MDsKCSAgICBuLT5mbGFncz1DQVNUOwoJICAgIG4tPm50eXA9Y2xvbmVfdHlwKCZzdCk7CgkgICAgZXZhbF9jb25zdCgmcC0+cmlnaHQtPnZhbCxwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpOwoJICAgIHAtPnJpZ2h0LT5udHlwLT5mbGFncz1zdC5mbGFnczsKCSAgICBpbnNlcnRfY29uc3QoJnAtPnJpZ2h0LT52YWwsc3QuZmxhZ3MpOwoJICAgIHAtPmxlZnQ9bjsKCSAgICBuPW5ld19ub2RlKCk7CgkgICAgKm49KnA7CgkgICAgcC0+bGVmdD1uOwoJICAgIHAtPnJpZ2h0PTA7CgkgICAgcC0+ZmxhZ3M9Q0FTVDsKCSAgICBwLT5udHlwPW90eXA7CgkgICAgcmV0PXR5cGVfZXhwcmVzc2lvbjIocC0+bGVmdCwmc3QpOwoKCSAgICByZXR1cm4gcmV0OwoJICB9Cgl9CgkKICAgIH0KICAgIGlmKGM9PTEpewogICAgICAgIC8qICAwLWE9LWEgICovCiAgICAgICAgaWYoZj09U1VCJiZudWxsMSYmIXAtPmxlZnQtPnNpZGVmeCl7CiAgICAgICAgICAgIGlmKERFQlVHJjEpIHByaW50ZigiMC1hLT4tYVxuIik7CiAgICAgICAgICAgIGZyZWVfZXhwcmVzc2lvbihwLT5sZWZ0KTsKICAgICAgICAgICAgcC0+ZmxhZ3M9TUlOVVM7CiAgICAgICAgICAgIHAtPmxlZnQ9cC0+cmlnaHQ7CiAgICAgICAgICAgIHAtPnJpZ2h0PTA7CgkgICAgZG9udG9wdD0wOwogICAgICAgICAgICByZXR1cm4gdHlwZV9leHByZXNzaW9uMihwLHR0eXApOwogICAgICAgIH0KICAgICAgICAvKiAgMC9hPTAgICAqLwogICAgICAgIGlmKG51bGwxJiYoZj09RElWfHxmPT1NT0R8fGY9PUxTSElGVHx8Zj09UlNISUZUKSl7CiAgICAgICAgICAgIGlmKERFQlVHJjEpIHByaW50ZigiMC8lJTw8Pj5hLT4wXG4iKTsKICAgICAgICAgICAgcC0+ZmxhZ3M9Q0VYUFI7CgkgICAgZ3ZhbC52aW50PXptMnppKGwyem0oMEwpKTsKCSAgICBldmFsX2NvbnN0KCZndmFsLElOVCk7CiAgICAgICAgICAgIGluc2VydF9jb25zdG4ocCk7CiAgICAgICAgICAgIGlmKCFwLT5sZWZ0LT5zaWRlZngpe2ZyZWVfZXhwcmVzc2lvbihwLT5sZWZ0KTtwLT5sZWZ0PTA7fWVsc2UgbWFrZV9jZXhwcihwLT5sZWZ0KTsKICAgICAgICAgICAgaWYoIXAtPnJpZ2h0LT5zaWRlZngpe2ZyZWVfZXhwcmVzc2lvbihwLT5yaWdodCk7cC0+cmlnaHQ9MDt9IGVsc2UgbWFrZV9jZXhwcihwLT5yaWdodCk7CgkgICAgZG9udG9wdD0wOwogICAgICAgICAgICByZXR1cm4gdHlwZV9leHByZXNzaW9uMihwLHR0eXApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CnZvaWQgbWFrZV9jZXhwcihucCBwKQovKiAgTWFjaHQgYXVzIGVpbmVtIEtub3RlbiwgZGVyIGR1cmNoIGNvbnN0YW50LWZvbGRpbmcgdWViZXJmbHVlc3NpZyAgICAqLwovKiAgd3VyZGUsIGVpbmUgUENFWFBSLCBzb2Zlcm4gZXIga2VpbmUgTmViZW53aXJrdW5nZW4gdm9uIHNpY2ggYXVzICAgICAqLwovKiAgZXJ6ZXVndC4gSGllciBub2NoIHVlYmVycHJ1ZWZlbiwgb2IgQ0VYUFIgYmVzc2VyIHdhZXJlLiAgICAgICAgICAgICAqLwovKiAgRnVlaHJ0IHJla3Vyc2l2ZW4gQWJzdGllZyBkdXJjaC4gSXN0IGRhcyBzbyBrb3JyZWt0PyAgICAgICAgICAgICAgICAqLwp7CiAgICBpbnQgZj1wLT5mbGFnczsKICAgIGlmKGYhPUFTU0lHTiYmZiE9QVNTSUdOT1AmJmYhPUNBTEwmJmYhPVBPU1RJTkMmJmYhPVBPU1RERUMmJmYhPVBSRUlOQyYmZiE9UFJFREVDJiZmIT1MQU5EJiZmIT1MT1IpewogICAgICAgIHAtPmZsYWdzPVBDRVhQUjsKICAgICAgICBpZihwLT5sZWZ0KSBtYWtlX2NleHByKHAtPmxlZnQpOwogICAgICAgIGlmKHAtPnJpZ2h0KSBtYWtlX2NleHByKHAtPnJpZ2h0KTsKICAgIH0KfQppbnQgdGVzdF9hc3NpZ25tZW50KHR5cGUgKnp0LG5wIHEpCi8qICB0ZXN0ZXQsIG9iIHEgYW4gVHlwIHogenVnZXdpZXNlbiB3ZXJkZW4gZGFyZiAgICAqLwp7CiAgdHlwZSAqcXQ9cS0+bnR5cDsKICBpZihJU0FSSVRIKHp0LT5mbGFncykmJklTQVJJVEgocXQtPmZsYWdzKSl7CiAgICBpZihJU0lOVCh6dC0+ZmxhZ3MpJiZJU0lOVChxdC0+ZmxhZ3MpJiYKICAgICAgIXptbGVxKHNpemV0YWJbcXQtPmZsYWdzJk5RXSxzaXpldGFiW3p0LT5mbGFncyZOUV0pJiZxLT5mbGFncyE9Q0VYUFIpewojaWZkZWYgSEFWRV9NSVNSQQovKiByZW1vdmVkICovCiNlbmRpZgogICAgICBlcnJvcigxNjYpOwogICAgfQogICAgaWYocS0+ZmxhZ3M9PUNFWFBSKXsKICAgICAgem1heCBtcyxuczt6dW1heCBtdSxudTsKICAgICAgZXZhbF9jb25zdG4ocSk7CiAgICAgIG1zPXZtYXg7bXU9dnVtYXg7CiAgICAgIGluc2VydF9jb25zdCgmZ3ZhbCx6dC0+ZmxhZ3MmflVOU0lHTkVEKTsKICAgICAgZXZhbF9jb25zdCgmZ3ZhbCx6dC0+ZmxhZ3MmflVOU0lHTkVEKTsKICAgICAgbnM9dm1heDsKICAgICAgZXZhbF9jb25zdG4ocSk7CiAgICAgIGluc2VydF9jb25zdCgmZ3ZhbCx6dC0+ZmxhZ3N8VU5TSUdORUQpOwogICAgICBldmFsX2NvbnN0KCZndmFsLHp0LT5mbGFnc3xVTlNJR05FRCk7CiAgICAgIG51PXZ1bWF4OwogICAgICBpZighenVtZXF0byhudSxtdSkmJiF6bWVxdG8obnMsbXMpKSAKCWVycm9yKDM2Myk7CiAgICAgIGVsc2V7CglpZih6dC0+ZmxhZ3MmVU5TSUdORUQpewoJICBpZighenVtZXF0byhudSxtdSkpCgkgICAgZXJyb3IoMzYyKTsKCX1lbHNlewoJICBpZighem1lcXRvKG5zLG1zKSkKCSAgICBlcnJvcigzNjIpOwoJfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKICB9CiAgaWYoKElTU1RSVUNUKHp0LT5mbGFncykmJklTU1RSVUNUKHF0LT5mbGFncykpfHwKICAgIChJU1VOSU9OKHp0LT5mbGFncykmJklTVU5JT04ocXQtPmZsYWdzKSkpewogICAgICBpZighY29tcGF0aWJsZV90eXBlcyh6dCxxdCxOVSkpewogICAgICAgIGVycm9yKDM4KTsKICAgICAgcmV0dXJuIDA7CiAgICB9ZWxzZSAKICByZXR1cm4gMTsKICB9CiAgaWYoSVNWRUNUT1IoenQtPmZsYWdzKSYmKHp0LT5mbGFncyZOVSk9PShxdC0+ZmxhZ3MmTlUpKXsKICAgICAgcmV0dXJuIDE7CiAgfQogIGlmKElTUE9JTlRFUih6dC0+ZmxhZ3MpJiZJU1BPSU5URVIocXQtPmZsYWdzKSl7CiAgICBpZigoenQtPm5leHQtPmZsYWdzJk5RKT09Vk9JRCYmIUlTRlVOQyhxdC0+bmV4dC0+ZmxhZ3MpKSByZXR1cm4gMTsKICAgIGlmKChxdC0+bmV4dC0+ZmxhZ3MmTlEpPT1WT0lEJiYhSVNGVU5DKHF0LT5uZXh0LT5mbGFncykpIHJldHVybiAxOwogICAgaWYoIWNvbXBhdGlibGVfdHlwZXMoenQtPm5leHQscXQtPm5leHQsKGNfZmxhZ3NbN10mVVNFREZMQUcpP05VOk5RKSl7CiAgICAgIGlmKCFlY3BwKXsKICAgICAgICBlcnJvcig4NSk7CiAgICAgIH0KI2lmZGVmIEhBVkVfRUNQUAovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCiNlbmRpZgogICAgfWVsc2V7CiAgICAgIGlmKChxdC0+bmV4dC0+ZmxhZ3MmQ09OU1QpJiYhKHp0LT5uZXh0LT5mbGFncyZDT05TVCkpCiAgICAgICAgZXJyb3IoOTEpOwogICAgICBpZigocXQtPm5leHQtPmZsYWdzJlZPTEFUSUxFKSYmISh6dC0+bmV4dC0+ZmxhZ3MmVk9MQVRJTEUpKQogICAgICAgIGVycm9yKDEwMCk7CiAgICAgIGlmKChxdC0+bmV4dC0+ZmxhZ3MmUkVTVFJJQ1QpJiYhKHp0LT5uZXh0LT5mbGFncyZSRVNUUklDVCkpCiAgICAgICAgZXJyb3IoMjk4KTsKICAgICAgaWYocXQtPm5leHQtPm5leHQmJnp0LT5uZXh0LT5uZXh0JiYhY29tcGF0aWJsZV90eXBlcyh6dC0+bmV4dC0+bmV4dCxxdC0+bmV4dC0+bmV4dCxOVSkpCiAgICAgICAgZXJyb3IoMTEwKTsKICAgICAgfQogICAgcmV0dXJuIDE7CiAgfQogIGlmKElTUE9JTlRFUih6dC0+ZmxhZ3MpJiZxLT5mbGFncz09Q0VYUFIpewogICAgZXZhbF9jb25zdG4ocSk7CiAgICBpZighKHpsZGVxdG8oZDJ6bGQoMC4wKSx2bGRvdWJsZSkmJnptZXF0byhsMnptKDBMKSx2bWF4KSYmenVtZXF0byh1bDJ6dW0oMFVMKSx2dW1heCkpKQogICAgICBlcnJvcigxMTMpOwogICAgcmV0dXJuIDE7CiAgfQogIGVycm9yKDM5KTsKICByZXR1cm4gMDsKfQojaWZkZWYgSEFWRV9FQ1BQCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCi8qIHJlbW92ZWQgKi8KLyogcmVtb3ZlZCAqLwovKiByZW1vdmVkICovCiNlbmRpZgo=