LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CiAqCiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKi8KCi8qKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogQGZpbGUKKiAgaWgyNjRlX2NhYmFjLmMKKgoqIEBicmllZgoqICBDb250YWlucyBhbGwgZnVuY3Rpb25zIHRvIGVuY29kZSBpbiBDQUJBQyBlbnRyb3B5IG1vZGUKKgoqCiogQGF1dGhvcgoqIERvbmV5IEFsZXgKKgoqIEBwYXIgTGlzdCBvZiBGdW5jdGlvbnM6CioKKgoqIEByZW1hcmtzCiogIE5vbmUKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIEZpbGUgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogU3lzdGVtIGluY2x1ZGUgZmlsZXMgKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgovKiBVc2VyIGluY2x1ZGUgZmlsZXMgKi8KI2luY2x1ZGUgImloMjY0ZV9jb25maWcuaCIKI2luY2x1ZGUgImloMjY0X3R5cGVkZWZzLmgiCiNpbmNsdWRlICJpdjIuaCIKI2luY2x1ZGUgIml2ZTIuaCIKI2luY2x1ZGUgImloMjY0X2RlYnVnLmgiCiNpbmNsdWRlICJpaDI2NF9kZWZzLmgiCiNpbmNsdWRlICJpaDI2NGVfZGVmcy5oIgojaW5jbHVkZSAiaWgyNjRfbWFjcm9zLmgiCiNpbmNsdWRlICJpaDI2NGVfZXJyb3IuaCIKI2luY2x1ZGUgImloMjY0ZV9iaXRzdHJlYW0uaCIKI2luY2x1ZGUgImltZV9kaXN0b3J0aW9uX21ldHJpY3MuaCIKI2luY2x1ZGUgImltZV9kZWZzLmgiCiNpbmNsdWRlICJpbWVfc3RydWN0cy5oIgojaW5jbHVkZSAiaWgyNjRfZXJyb3IuaCIKI2luY2x1ZGUgImloMjY0X3N0cnVjdHMuaCIKI2luY2x1ZGUgImloMjY0X3RyYW5zX3F1YW50X2l0cmFuc19pcXVhbnQuaCIKI2luY2x1ZGUgImloMjY0X2ludGVyX3ByZWRfZmlsdGVycy5oIgojaW5jbHVkZSAiaWgyNjRfbWVtX2Zucy5oIgojaW5jbHVkZSAiaWgyNjRfcGFkZGluZy5oIgojaW5jbHVkZSAiaWgyNjRfcGxhdGZvcm1fbWFjcm9zLmgiCiNpbmNsdWRlICJpaDI2NF9pbnRyYV9wcmVkX2ZpbHRlcnMuaCIKI2luY2x1ZGUgImloMjY0X2RlYmxrX2VkZ2VfZmlsdGVycy5oIgojaW5jbHVkZSAiaWgyNjRfY2FiYWNfdGFibGVzLmgiCiNpbmNsdWRlICJpcmNfY250cmxfcGFyYW0uaCIKI2luY2x1ZGUgImlyY19mcmFtZV9pbmZvX2NvbGxlY3Rvci5oIgojaW5jbHVkZSAiaWgyNjRlX3JhdGVfY29udHJvbC5oIgojaW5jbHVkZSAiaWgyNjRlX2NhYmFjX3N0cnVjdHMuaCIKI2luY2x1ZGUgImloMjY0ZV9zdHJ1Y3RzLmgiCiNpbmNsdWRlICJpaDI2NGVfY2FiYWMuaCIKI2luY2x1ZGUgImloMjY0ZV9lbmNvZGVfaGVhZGVyLmgiCiNpbmNsdWRlICJpaDI2NF9jYXZsY190YWJsZXMuaCIKI2luY2x1ZGUgImloMjY0ZV9jYXZsYy5oIgojaW5jbHVkZSAiaWgyNjRlX3N0YXRpc3RpY3MuaCIKI2luY2x1ZGUgImloMjY0ZV90cmFjZS5oIgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBGdW5jdGlvbiBEZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKCi8qKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBAYnJpZWYKICogIEVuY29kZXMgbWJfc2tpcF9mbGFnICB1c2luZyBDQUJBQyBlbnRyb3B5IGNvZGluZyBtb2RlLgogKgogKiBAcGFyYW1baW5dIHUxX21iX3NraXBfZmxhZwogKiAgbWJfc2tpcF9mbGFnCiAqCiAqIEBwYXJhbVtpbl0gcHNfY2FiYWNfY3R4dAogKiAgUG9pbnRlciB0byBjYWJhYyBjb250ZXh0IHN0cnVjdHVyZQogKgogKiBAcGFyYW1baW5dIHU0X2N0eGlkeF9vZmZzZXQKICogIGN0eElkeE9mZnNldCBmb3IgbWJfc2tpcF9mbGFnIGNvbnRleHQKICoKICogQHJldHVybnMKICoKICogQHJlbWFya3MKICogIE5vbmUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnN0YXRpYyB2b2lkIGloMjY0ZV9jYWJhY19lbmNfbWJfc2tpcChVV09SRDggdTFfbWJfc2tpcF9mbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiYWNfY3R4dF90ICpwc19jYWJhY19jdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdPUkQzMiB1NF9jdHhpZHhfb2Zmc2V0KQp7CgogICAgVVdPUkQ4IHU0X2N0eF9pbmM7CiAgICBXT1JEOCBhLCBiOwogICAgYSA9ICgocHNfY2FiYWNfY3R4dC0+cHNfbGVmdF9jdHh0X21iX2luZm8tPnUxX21iX3R5cGUgJiBDQUJfU0tJUF9NQVNLKSA/CiAgICAgICAgICAgICAgICAgICAgMCA6IDEpOwogICAgYiA9ICgocHNfY2FiYWNfY3R4dC0+cHNfdG9wX2N0eHRfbWJfaW5mby0+dTFfbWJfdHlwZSAmIENBQl9TS0lQX01BU0spID8KICAgICAgICAgICAgICAgICAgICAwIDogMSk7CgogICAgdTRfY3R4X2luYyA9IGEgKyBiOwogICAgLyogRW5jb2RlIHRoZSBiaW4gKi8KICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfYmluKHBzX2NhYmFjX2N0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVVdPUkQzMikgdTFfbWJfc2tpcF9mbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUgKyB1NF9jdHhpZHhfb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdTRfY3R4X2luYyk7Cgp9CgoKLyogISA8IFRhYmxlIDktMzYgliBCaW5hcml6YXRpb24gZm9yIG1hY3JvYmxvY2sgdHlwZXMgaW4gSSBzbGljZXMgIGluIElUVV9UX0gyNjQtMjAxNDAyCiAqIEJpdHMgMC03IDogYmluYXJpc2VkIHZhbHVlCiAqIEJpdHMgOC0xNTogbGVuZ3RoIG9mIGJpbmFyeSBzZXF1ZW5jZQogKi8Kc3RhdGljIGNvbnN0IFVXT1JEMzIgdTRfbWJfdHlwZV9pbnRyYVsyNl0gPQogICAgeyAweDAxMDAsIDB4MDYyMCwgMHgwNjIxLCAweDA2MjIsIDB4MDYyMywgMHgwNzQ4LCAweDA3NDksIDB4MDc0YSwgMHgwNzRiLAogICAgICAweDA3NGMsIDB4MDc0ZCwgMHgwNzRlLCAweDA3NGYsIDB4MDYyOCwgMHgwNjI5LCAweDA2MmEsIDB4MDYyYiwgMHgwNzU4LAogICAgICAweDA3NTksIDB4MDc1YSwgMHgwNzViLCAweDA3NWMsIDB4MDc1ZCwgMHgwNzVlLCAweDA3NWYsIDB4MDIwMyB9OwoKCi8qIEN0eEluYyBmb3IgbWIgdHlwZXMgKi8Kc3RhdGljIGNvbnN0IFVXT1JEMzIgdTRfbWJfY3R4aW5jWzJdWzI2XSA9CnsKICAgIC8qIEludHJhIEN0eEluYydzICovCiAgICB7ICAgMHgwMCwKICAgICAgICAweDAzNDY3LCAweDAzNDY3LCAweDAzNDY3LCAweDAzNDY3LCAweDAzNDU2NywgMHgwMzQ1NjcsIDB4MDM0NTY3LAogICAgICAgIDB4MDM0NTY3LCAweDAzNDU2NywgMHgwMzQ1NjcsIDB4MDM0NTY3LCAweDAzNDU2NywgMHgwMzQ2NywgMHgwMzQ2NywKICAgICAgICAweDAzNDY3LCAweDAzNDY3LCAweDAzNDU2NywgMHgwMzQ1NjcsIDB4MDM0NTY3LCAweDAzNDU2NywgMHgwMzQ1NjcsCiAgICAgICAgMHgwMzQ1NjcsIDB4MDM0NTY3LCAweDAzNDU2NywgMHgwMH0sCiAgICAvKiBJbnRlciBDdHhJbmMncyAqLwogICAgeyAgIDB4MDAsCiAgICAgICAgMHgwMDEyMzMsIDB4MDAxMjMzLCAweDAwMTIzMywgMHgwMDEyMzMsIDB4MDAxMjIzMywgMHgwMDEyMjMzLCAweDAwMTIyMzMsCiAgICAgICAgMHgwMDEyMjMzLCAweDAwMTIyMzMsIDB4MDAxMjIzMywgMHgwMDEyMjMzLCAweDAwMTIyMzMsIDB4MDAxMjMzLCAweDAwMTIzMywKICAgICAgICAweDAwMTIzMywgMHgwMDEyMzMsIDB4MDAxMjIzMywgMHgwMDEyMjMzLCAweDAwMTIyMzMsIDB4MDAxMjIzMywgMHgwMDEyMjMzLAogICAgICAgIDB4MDAxMjIzMywgMHgwMDEyMjMzLCAweDAwMTIyMzMsIDB4MDB9Cn07CgoKLyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEBicmllZgogKiAgRW5jb2RlcyBtYl90eXBlIGZvciBhbiBpbnRyYSBNQi4KICoKICogQHBhcmFtW2luXSB1NF9zbGljZV90eXBlCiAqICBzbGljZSB0eXBlCiAqCiAqIEBwYXJhbVtpbl0gdTRfaW50cmFfbWJfdHlwZQogKiAgTUIgdHlwZSAoVGFibGUgNy0xMSkKICoKICogQHBhcmFtW2luXSBwc19jYWJhY19jdHh0CiAqICBQb2ludGVyIHRvIGNhYmFjIGNvbnRleHQgc3RydWN0dXJlCiAqCiAqKiBAcGFyYW1baW5dIHU0X2N0eGlkeF9vZmZzZXQKICogIGN0eElkeE9mZnNldCBmb3IgbWJfdHlwZSBjb250ZXh0CiAqCiAqIEByZXR1cm5zCiAqCiAqIEByZW1hcmtzCiAqICBOb25lCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwoKc3RhdGljIHZvaWQgaWgyNjRlX2NhYmFjX2VuY19pbnRyYV9tYl90eXBlKFVXT1JEMzIgdTRfc2xpY2VfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXT1JEMzIgdTRfaW50cmFfbWJfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmFjX2N0eHRfdCAqcHNfY2FiYWNfY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXT1JEMzIgdTRfY3R4X2lkeF9vZmZzZXQpCnsKCiAgICBlbmNvZGluZ19lbnZpcm5vbWVudF90ICpwc19jYWJfZW5jX2VudiA9ICYocHNfY2FiYWNfY3R4dC0+c19jYWJfZW5jX2Vudik7CiAgICBiaW5fY3R4dF9tb2RlbCAqcHUxX21iX2Jpbl9jdHh0LCAqcHUxX2Jpbl9jdHh0OwogICAgVVdPUkQ4IHUxX2JpbjsKICAgIG1iX2luZm9fY3R4dF90ICpwc19sZWZ0X2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc19sZWZ0X2N0eHRfbWJfaW5mbzsKICAgIG1iX2luZm9fY3R4dF90ICpwc190b3BfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnBzX3RvcF9jdHh0X21iX2luZm87CiAgICBVV09SRDMyIHU0X2JpbnM7CiAgICBVV09SRDMyIHU0X2N0eF9pbmM7CiAgICBXT1JEOCBpMV9iaW5zX2xlbjsKICAgIFVXT1JEMzIgdTRfY29kZV9pbnRfcmFuZ2U7CiAgICBVV09SRDMyIHU0X2NvZGVfaW50X2xvdzsKICAgIFVXT1JEMTYgdTJfcXVhbnRfY29kZV9pbnRfcmFuZ2U7CiAgICBVV09SRDE2IHU0X2NvZGVfaW50X3JhbmdlX2xwczsKICAgIFdPUkQ4IGk7CiAgICBVV09SRDggdTFfY3R4X2luYzsKICAgIFVXT1JEMzIgdTRfdGFibGVfdmFsOwoKICAgIHB1MV9tYl9iaW5fY3R4dCA9IHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlICsgdTRfY3R4X2lkeF9vZmZzZXQ7CgogICAgdTRfYmlucyA9IHU0X21iX3R5cGVfaW50cmFbdTRfaW50cmFfbWJfdHlwZV07CiAgICBpMV9iaW5zX2xlbiA9IChXT1JEOCkgKCh1NF9iaW5zID4+IDgpICYgMHgwZik7CiAgICB1NF9jdHhfaW5jID0gdTRfbWJfY3R4aW5jWyh1NF9zbGljZV90eXBlICE9IElTTElDRSldW3U0X2ludHJhX21iX3R5cGVdOwogICAgdTFfY3R4X2luYyA9IDA7CiAgICBpZiAodTRfc2xpY2VfdHlwZSA9PSBJU0xJQ0UpCiAgICB7CiAgICAgICAgaWYgKHBzX2xlZnRfY3R4dCAhPSBwc19jYWJhY19jdHh0LT5wc19kZWZfY3R4dF9tYl9pbmZvKQogICAgICAgICAgICB1MV9jdHhfaW5jICs9ICgocHNfbGVmdF9jdHh0LT51MV9tYl90eXBlICE9IENBQl9JNHg0KSA/IDEgOiAwKTsKICAgICAgICBpZiAocHNfdG9wX2N0eHQgIT0gcHNfY2FiYWNfY3R4dC0+cHNfZGVmX2N0eHRfbWJfaW5mbykKICAgICAgICAgICAgdTFfY3R4X2luYyArPSAoKHBzX3RvcF9jdHh0LT51MV9tYl90eXBlICE9IENBQl9JNHg0KSA/IDEgOiAwKTsKCiAgICAgICAgdTRfY3R4X2luYyA9ICh1NF9jdHhfaW5jIHwgKHUxX2N0eF9pbmMgPDwgKChpMV9iaW5zX2xlbiAtIDEpIDw8IDIpKSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcHUxX21iX2Jpbl9jdHh0ICs9IDM7CiAgICAgICAgaWYgKHU0X3NsaWNlX3R5cGUgPT0gQlNMSUNFKQogICAgICAgICAgICBwdTFfbWJfYmluX2N0eHQgKz0gMjsKCiAgICB9CgogICAgdTRfY29kZV9pbnRfcmFuZ2UgPSBwc19jYWJfZW5jX2Vudi0+dTRfY29kZV9pbnRfcmFuZ2U7CiAgICB1NF9jb2RlX2ludF9sb3cgPSBwc19jYWJfZW5jX2Vudi0+dTRfY29kZV9pbnRfbG93OwoKICAgIGZvciAoaSA9IChpMV9iaW5zX2xlbiAtIDEpOyBpID49IDA7IGktLSkKICAgIHsKICAgICAgICBXT1JEMzIgc2hpZnQ7CgogICAgICAgIHUxX2N0eF9pbmMgPSAoKHU0X2N0eF9pbmMgPj4gKGkgPDwgMikpICYgMHgwZik7CiAgICAgICAgdTFfYmluID0gKCh1NF9iaW5zID4+IGkpICYgMHgwMSk7CiAgICAgICAgLyogRW5jb2RlIHRoZSBiaW4gKi8KICAgICAgICBwdTFfYmluX2N0eHQgPSBwdTFfbWJfYmluX2N0eHQgKyB1MV9jdHhfaW5jOwogICAgICAgIGlmIChpICE9IChpMV9iaW5zX2xlbiAtIDIpKQogICAgICAgIHsKICAgICAgICAgICAgV09SRDggaTFfbXBzID0gISEoKCpwdTFfYmluX2N0eHQpICYgKDB4NDApKTsKICAgICAgICAgICAgV09SRDggaTFfc3RhdGUgPSAoKnB1MV9iaW5fY3R4dCkgJiAweDNGOwoKICAgICAgICAgICAgdTJfcXVhbnRfY29kZV9pbnRfcmFuZ2UgPSAoKHU0X2NvZGVfaW50X3JhbmdlID4+IDYpICYgMHgwMyk7CiAgICAgICAgICAgIHU0X3RhYmxlX3ZhbCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXU0X2loMjY0X2NhYmFjX3RhYmxlW2kxX3N0YXRlXVt1Ml9xdWFudF9jb2RlX2ludF9yYW5nZV07CiAgICAgICAgICAgIHU0X2NvZGVfaW50X3JhbmdlX2xwcyA9IHU0X3RhYmxlX3ZhbCAmIDB4RkY7CgogICAgICAgICAgICB1NF9jb2RlX2ludF9yYW5nZSAtPSB1NF9jb2RlX2ludF9yYW5nZV9scHM7CiAgICAgICAgICAgIGlmICh1MV9iaW4gIT0gaTFfbXBzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB1NF9jb2RlX2ludF9sb3cgKz0gdTRfY29kZV9pbnRfcmFuZ2U7CiAgICAgICAgICAgICAgICB1NF9jb2RlX2ludF9yYW5nZSA9IHU0X2NvZGVfaW50X3JhbmdlX2xwczsKICAgICAgICAgICAgICAgIGlmIChpMV9zdGF0ZSA9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8qIE1QUyhDdHhJZHgpID0gMSAtIE1QUyhDdHhJZHgpICovCiAgICAgICAgICAgICAgICAgICAgaTFfbXBzID0gMSAtIGkxX21wczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpMV9zdGF0ZSA9ICh1NF90YWJsZV92YWwgPj4gMTUpICYgMHgzRjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGkxX3N0YXRlID0gKHU0X3RhYmxlX3ZhbCA+PiA4KSAmIDB4M0Y7CgogICAgICAgICAgICB9CgogICAgICAgICAgICAoKnB1MV9iaW5fY3R4dCkgPSAoaTFfbXBzIDw8IDYpIHwgaTFfc3RhdGU7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHU0X2NvZGVfaW50X3JhbmdlIC09IDI7CiAgICAgICAgfQoKICAgICAgICAvKiBSZW5vcm1hbGl6ZSAqLwogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICAvKiBSZW5vcm1hbGl6YXRpb247IGNhbGN1bGF0ZSBiaXRzIGdlbmVyYXRlZCBiYXNlZCBvbiByYW5nZShSKSAgICovCiAgICAgICAgLyogTm90ZSA6IDYgPD0gUiA8IDUxMjsgUiBpcyAyIG9ubHkgZm9yIHRlcm1pbmF0aW5nIGVuY29kZSAgICAgICAqLwogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICBHRVRSQU5HRShzaGlmdCwgdTRfY29kZV9pbnRfcmFuZ2UpOwogICAgICAgIHNoaWZ0ID0gOSAtIHNoaWZ0OwogICAgICAgIHU0X2NvZGVfaW50X2xvdyA8PD0gc2hpZnQ7CiAgICAgICAgdTRfY29kZV9pbnRfcmFuZ2UgPDw9IHNoaWZ0OwoKICAgICAgICAvKiBiaXRzIHRvIGJlIGluc2VydGVkIGluIHRoZSBiaXRzdHJlYW0gKi8KICAgICAgICBwc19jYWJfZW5jX2Vudi0+dTRfYml0c19nZW4gKz0gc2hpZnQ7CiAgICAgICAgcHNfY2FiX2VuY19lbnYtPnU0X2NvZGVfaW50X3JhbmdlID0gdTRfY29kZV9pbnRfcmFuZ2U7CiAgICAgICAgcHNfY2FiX2VuY19lbnYtPnU0X2NvZGVfaW50X2xvdyA9IHU0X2NvZGVfaW50X2xvdzsKCiAgICAgICAgLyogZ2VuZXJhdGUgc3RyZWFtIHdoZW4gYSBieXRlIGlzIHJlYWR5ICovCiAgICAgICAgaWYgKHBzX2NhYl9lbmNfZW52LT51NF9iaXRzX2dlbiA+IENBQkFDX0JJVFMpCiAgICAgICAgewogICAgICAgICAgICBpaDI2NGVfY2FiYWNfcHV0X2J5dGUocHNfY2FiYWNfY3R4dCk7CiAgICAgICAgICAgIHU0X2NvZGVfaW50X3JhbmdlID0gcHNfY2FiX2VuY19lbnYtPnU0X2NvZGVfaW50X3JhbmdlOwogICAgICAgICAgICB1NF9jb2RlX2ludF9sb3cgPSBwc19jYWJfZW5jX2Vudi0+dTRfY29kZV9pbnRfbG93OwoKICAgICAgICB9CiAgICB9Cn0KCgoKLyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEBicmllZgogKiAgRW5jb2RlcyBwcmV2X2ludHJhNHg0X3ByZWRfbW9kZV9mbGFnIGFuZAogKiAgcmVtX2ludHJhNHg0X3ByZWRfbW9kZSB1c2luZyBDQUJBQyBlbnRyb3B5IGNvZGluZyBtb2RlCiAqCiAqIEBwYXJhbVtpbl0gcHNfY2FiYWNfY3R4dAogKiAgUG9pbnRlciB0byBjYWJhYyBjb250ZXh0IHN0cnVjdHVyZQogKgogKiAgQHBhcmFtW2luXSBwdTFfaW50cmFfNHg0X21vZGVzCiAqICBQb2ludGVyIHRvIGFycmF5IGNvbnRhaW5pbmcgcHJldl9pbnRyYTR4NF9wcmVkX21vZGVfZmxhZyBhbmQKICogIHJlbV9pbnRyYTR4NF9wcmVkX21vZGUKICoKICogQHJldHVybnMKICoKICogQHJlbWFya3MKICogIE5vbmUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnN0YXRpYyB2b2lkIGloMjY0ZV9jYWJhY19lbmNfNHg0bWJfbW9kZXMoY2FiYWNfY3R4dF90ICpwc19jYWJhY19jdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXT1JEOCAqcHUxX2ludHJhXzR4NF9tb2RlcykKewogICAgV09SRDMyIGk7CiAgICBXT1JEOCBieXRlOwogICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDIpCiAgICB7CiAgICAgICAgLyogc3ViIGJsayBpZHggMSAqLwogICAgICAgIGJ5dGUgPSAqcHUxX2ludHJhXzR4NF9tb2RlcysrOwogICAgICAgIGlmIChieXRlICYgMHgxKQogICAgICAgIHsKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9iaW4ocHNfY2FiYWNfY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFBSRVZfSU5UUkE0WDRfUFJFRF9NT0RFX0ZMQUcpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvKiBCaW5hcml6YXRpb24gaXMgRkwgYW5kIENtYXg9NyAqLwogICAgICAgICAgICBpaDI2NGVfZW5jb2RlX2RlY2lzaW9uX2JpbnMoYnl0ZSAmIDB4RiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1NTU0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBSRU1fSU5UUkE0WDRfUFJFRF9NT0RFIC0gNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwogICAgICAgIH0KICAgICAgICAvKiBzdWIgYmxrIGlkeCAyICovCiAgICAgICAgYnl0ZSA+Pj0gNDsKICAgICAgICBpZiAoYnl0ZSAmIDB4MSkKICAgICAgICB7CiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfYmluKHBzX2NhYmFjX2N0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBQUkVWX0lOVFJBNFg0X1BSRURfTU9ERV9GTEFHKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaWgyNjRlX2VuY29kZV9kZWNpc2lvbl9iaW5zKGJ5dGUgJiAweEYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTU1NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUkVNX0lOVFJBNFg0X1BSRURfTU9ERSAtIDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKICAgICAgICB9CiAgICB9Cn0KCgoKLyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEBicmllZgogKiAgRW5jb2RlcyBjaHJvbWEgIGludHJhcHJlZCBtb2RlIGZvciB0aGUgTUIuCiAqCiAqIEBwYXJhbVtpbl0gdTFfY2hyb21hX3ByZWRfbW9kZQogKiAgQ2hyb21hIGludHIgcHJlZGljdGlvbiBtb2RlCiAqCiAqIEBwYXJhbVtpbl0gcHNfY2FiYWNfY3R4dAogKiAgUG9pbnRlciB0byBjYWJhYyBjb250ZXh0IHN0cnVjdHVyZQogKgogKiBAcmV0dXJucwogKgogKiBAcmVtYXJrcwogKiAgTm9uZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8Kc3RhdGljIHZvaWQgaWgyNjRlX2NhYmFjX2VuY19jaHJvbWFfcHJlZG1vZGUoVVdPUkQ4IHUxX2Nocm9tYV9wcmVkX21vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmFjX2N0eHRfdCAqcHNfY2FiYWNfY3R4dCkKewoKICAgIFdPUkQ4IGkxX3RlbXA7CiAgICBtYl9pbmZvX2N0eHRfdCAqcHNfY3Vycl9jdHh0ID0gcHNfY2FiYWNfY3R4dC0+cHNfY3Vycl9jdHh0X21iX2luZm87CiAgICBtYl9pbmZvX2N0eHRfdCAqcHNfbGVmdF9jdHh0ID0gcHNfY2FiYWNfY3R4dC0+cHNfbGVmdF9jdHh0X21iX2luZm87CiAgICBtYl9pbmZvX2N0eHRfdCAqcHNfdG9wX2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc190b3BfY3R4dF9tYl9pbmZvOwogICAgVVdPUkQzMiB1NF9iaW5zID0gMDsKICAgIFdPUkQ4IGkxX2JpbnNfbGVuID0gMTsKICAgIFVXT1JEMzIgdTRfY3R4X2luYyA9IDA7CiAgICBVV09SRDggYSwgYjsKICAgIGEgPSAoKHBzX2xlZnRfY3R4dC0+dTFfaW50cmFwcmVkX2Nocm9tYV9tb2RlICE9IDApID8gMSA6IDApOwogICAgYiA9ICgocHNfdG9wX2N0eHQtPnUxX2ludHJhcHJlZF9jaHJvbWFfbW9kZSAhPSAwKSA/IDEgOiAwKTsKCiAgICAvKiBCaW5hcml6YXRpb24gaXMgVFUgYW5kIENtYXg9MyAqLwogICAgcHNfY3Vycl9jdHh0LT51MV9pbnRyYXByZWRfY2hyb21hX21vZGUgPSB1MV9jaHJvbWFfcHJlZF9tb2RlOwoKICAgIHU0X2N0eF9pbmMgPSBhICsgYjsKICAgIHU0X2N0eF9pbmMgPSAodTRfY3R4X2luYyB8IDB4MzMwKTsKICAgIGlmICh1MV9jaHJvbWFfcHJlZF9tb2RlKQogICAgewogICAgICAgIHU0X2JpbnMgPSAxOwogICAgICAgIGkxX3RlbXAgPSB1MV9jaHJvbWFfcHJlZF9tb2RlOwogICAgICAgIGkxX3RlbXAtLTsKICAgICAgICAvKiBQdXQgYSBzdHJlYW0gb2YgMSdzIG9mIGxlbmd0aCBDaHJvbWFwc19wcmVkX21vZGVfY3R4dCB2YWx1ZSAqLwogICAgICAgIHdoaWxlIChpMV90ZW1wKQogICAgICAgIHsKICAgICAgICAgICAgdTRfYmlucyA9ICh1NF9iaW5zIHwgKDEgPDwgaTFfYmluc19sZW4pKTsKICAgICAgICAgICAgaTFfYmluc19sZW4rKzsKICAgICAgICAgICAgaTFfdGVtcC0tOwogICAgICAgIH0KICAgICAgICAvKiBJZiBDaHJvbWFwc19wcmVkX21vZGVfY3R4dCA8IENtYXggaS5lIDMuIFRlcm1pbmF0ZSBwdXQgYSB6ZXJvICovCiAgICAgICAgaWYgKHUxX2Nocm9tYV9wcmVkX21vZGUgPCAzKQogICAgICAgIHsKICAgICAgICAgICAgaTFfYmluc19sZW4rKzsKICAgICAgICB9CiAgICB9CgogICAgaWgyNjRlX2VuY29kZV9kZWNpc2lvbl9iaW5zKHU0X2JpbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSU5UUkFfQ0hST01BX1BSRURfTU9ERSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKCn0KCgovKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQGJyaWVmCiAqICBFbmNvZGVzIENCUCBmb3IgdGhlIE1CLgogKgogKiBAcGFyYW1baW5dIHUxX2NicAogKiAgQ0JQIGZvciB0aGUgTUIKICoKICogQHBhcmFtW2luXSBwc19jYWJhY19jdHh0CiAqICBQb2ludGVyIHRvIGNhYmFjIGNvbnRleHQgc3RydWN0dXJlCiAqCiAqIEByZXR1cm5zCiAqCiAqIEByZW1hcmtzCiAqICBOb25lCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwpzdGF0aWMgdm9pZCBpaDI2NGVfY2FiYWNfZW5jX2NicChVV09SRDMyIHU0X2NicCwgY2FiYWNfY3R4dF90ICpwc19jYWJhY19jdHh0KQp7CiAgICBtYl9pbmZvX2N0eHRfdCAqcHNfbGVmdF9jdHh0ID0gcHNfY2FiYWNfY3R4dC0+cHNfbGVmdF9jdHh0X21iX2luZm87CiAgICBtYl9pbmZvX2N0eHRfdCAqcHNfdG9wX2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc190b3BfY3R4dF9tYl9pbmZvOwogICAgV09SRDggaTJfY2JwX2Nocm9tYSwgaSwgajsKICAgIFVXT1JEOCB1MV9jdHh0X2luYywgdTFfYmluOwogICAgVVdPUkQ4IGEsIGI7CiAgICBVV09SRDMyIHU0X2N0eF9pbmM7CiAgICBVV09SRDMyIHU0X2JpbnM7CiAgICBXT1JEOCBpMV9iaW5zX2xlbjsKCiAgICAvKiBDQlAgTHVtYSwgRkwsIENtYXggPSAxNSwgTCA9IDQgKi8KICAgIHU0X2N0eF9pbmMgPSAwOwogICAgdTRfYmlucyA9IDA7CiAgICBpMV9iaW5zX2xlbiA9IDU7CiAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogICAgewogICAgICAgIC8qIGNhbHVsYXRlIGN0eHRJbmMsIGRlcGVuZGluZyBvbiBuZWlnaGJvdXIgYXZhaWxhYmlsaXR5ICovCiAgICAgICAgLyogdTFfY3R4dF9pbmMgPSBDb25kVGVybShBKSArIDIgKiBDb25kVGVybShCKTsKICAgICAgICAgQTogTGVmdCBibG9jayBhbmQgQjogVG9wIGJsb2NrICovCgogICAgICAgIC8qIENoZWNrIGZvciBUb3AgYXZhaWxhYmlsaXR5ICovCiAgICAgICAgaWYgKGkgPj4gMSkKICAgICAgICB7CiAgICAgICAgICAgIGogPSBpIC0gMjsKICAgICAgICAgICAgLyogVG9wIGlzIGF2YWlsYWJsZSBhbHdheXMgYW5kIGl0J3MgY3VycmVudCBNQiAqLwogICAgICAgICAgICBiID0gKCgodTRfY2JwID4+IGopICYgMHgwMSkgIT0gMCA/IDAgOiAxKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLyogZm9yIGJsb2NrcyB3aG9zZSB0b3AgcmVmZXJlbmNlIGlzIGluIGFub3RoZXIgTUIgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaiA9IGkgKyAyOwogICAgICAgICAgICAgICAgYiA9ICgocHNfdG9wX2N0eHQtPnUxX2NicCA+PiBqKSAmIDB4MDEpID8gMCA6IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIENoZWNrIGZvciBMZWZ0IGF2YWlsYWJpbGl0eSAqLwogICAgICAgIGlmIChpICYgMHgwMSkKICAgICAgICB7CiAgICAgICAgICAgIC8qIExlZnQgaXMgYXZhaWxhYmxlIGFsd2F5cyBhbmQgaXQncyBjdXJyZW50IE1CICovCiAgICAgICAgICAgIGogPSBpIC0gMTsKICAgICAgICAgICAgYSA9ICgoKHU0X2NicCA+PiBqKSAmIDB4MDEpICE9IDAgPyAwIDogMSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGogPSBpICsgMTsKICAgICAgICAgICAgICAgIGEgPSAoKHBzX2xlZnRfY3R4dC0+dTFfY2JwID4+IGopICYgMHgwMSkgPyAwIDogMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB1MV9jdHh0X2luYyA9IGEgKyAyICogYjsKICAgICAgICB1MV9iaW4gPSAoKHU0X2NicCA+PiBpKSAmIDB4MDEpOwogICAgICAgIHU0X2N0eF9pbmMgPSAodTRfY3R4X2luYyB8ICh1MV9jdHh0X2luYyA8PCAoaSA8PCAyKSkpOwogICAgICAgIHU0X2JpbnMgPSAodTRfYmlucyB8ICh1MV9iaW4gPDwgaSkpOwogICAgfQoKICAgIC8qIENCUCBDaHJvbWEsIFRVLCBDbWF4ID0gMiAqLwogICAgaTJfY2JwX2Nocm9tYSA9IHU0X2NicCA+PiA0OwogICAgLyogY2FsdWxhdGUgY3R4dEluYywgZGVwZW5kaW5nIG9uIG5laWdoYm91ciBhdmFpbGFiaWxpdHkgKi8KICAgIGEgPSAocHNfbGVmdF9jdHh0LT51MV9jYnAgPiAxNSkgPyAxIDogMDsKICAgIGIgPSAocHNfdG9wX2N0eHQtPnUxX2NicCA+IDE1KSA/IDEgOiAwOwoKICAgIHUxX2N0eHRfaW5jID0gYSArIDIgKiBiOwogICAgaWYgKGkyX2NicF9jaHJvbWEpCiAgICB7CiAgICAgICAgdTRfY3R4X2luYyA9IHU0X2N0eF9pbmMgfCAoKDQgKyB1MV9jdHh0X2luYykgPDwgMTYpOwogICAgICAgIHU0X2JpbnMgPSAodTRfYmlucyB8IDB4MTApOwogICAgICAgIC8qIGNhbHVsYXRlIGN0eHRJbmMsIGRlcGVuZGluZyBvbiBuZWlnaGJvdXIgYXZhaWxhYmlsaXR5ICovCiAgICAgICAgYSA9IChwc19sZWZ0X2N0eHQtPnUxX2NicCA+IDMxKSA/IDEgOiAwOwogICAgICAgIGIgPSAocHNfdG9wX2N0eHQtPnUxX2NicCA+IDMxKSA/IDEgOiAwOwogICAgICAgIHUxX2N0eHRfaW5jID0gYSArIDIgKiBiOwogICAgICAgIHU0X2N0eF9pbmMgPSB1NF9jdHhfaW5jIHwgKCg4ICsgdTFfY3R4dF9pbmMpIDw8IDIwKTsKICAgICAgICB1NF9iaW5zID0gKHU0X2JpbnMgfCAoKChpMl9jYnBfY2hyb21hID4+IDEpICYgMHgwMSkgPDwgaTFfYmluc19sZW4pKTsKICAgICAgICBpMV9iaW5zX2xlbisrOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHU0X2N0eF9pbmMgPSAodTRfY3R4X2luYyB8ICgoNCArIHUxX2N0eHRfaW5jKSA8PCAxNikpOwogICAgfQogICAgaWgyNjRlX2VuY29kZV9kZWNpc2lvbl9iaW5zKHU0X2JpbnMsIGkxX2JpbnNfbGVuLCB1NF9jdHhfaW5jLCA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlICsgQ0JQX0xVTUEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7Cn0KCgovKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQGJyaWVmCiAqICBFbmNvZGVzIG1iX3FwX2RlbHRhIGZvciB0aGUgTUIuCiAqCiAqIEBwYXJhbVtpbl0gaTFfbWJfcXBfZGVsdGEKICogIG1iX3FwX2RlbHRhCiAqCiAqIEBwYXJhbVtpbl0gcHNfY2FiYWNfY3R4dAogKiAgUG9pbnRlciB0byBjYWJhYyBjb250ZXh0IHN0cnVjdHVyZQogKgogKiBAcmV0dXJucwogKgogKiBAcmVtYXJrcwogKiAgTm9uZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8Kc3RhdGljIHZvaWQgaWgyNjRlX2NhYmFjX2VuY19tYl9xcF9kZWx0YShXT1JEOCBpMV9tYl9xcF9kZWx0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJhY19jdHh0X3QgKnBzX2NhYmFjX2N0eHQpCnsKICAgIFVXT1JEOCB1MV9jb2RlX251bTsKICAgIFVXT1JEOCB1MV9jdHh0X2luYzsKCiAgICBVV09SRDMyIHU0X2N0eF9pbmM7CiAgICBVV09SRDMyIHU0X2JpbnM7CiAgICBXT1JEOCBpMV9iaW5zX2xlbjsKICAgIFVXT1JEOCB1MV9jdHhfaW5jLCB1MV9iaW47CiAgICAvKiBSYW5nZSBvZiBwc19tYl9xcF9kZWx0YV9jdHh0PSAtMjYgdG8gKzI1IGluY2x1c2l2ZSAqLwogICAgICAgIEFTU0VSVCgoaTFfbWJfcXBfZGVsdGEgPCAyNikgJiYgKGkxX21iX3FwX2RlbHRhID4gLTI3KSk7CiAgICAvKiBpZiBwc19tYl9xcF9kZWx0YV9jdHh0PTAsIHRoZW4gY29kZU51bT0wICovCiAgICB1MV9jb2RlX251bSA9IDA7CiAgICBpZiAoaTFfbWJfcXBfZGVsdGEgPiAwKQogICAgICAgIHUxX2NvZGVfbnVtID0gKGkxX21iX3FwX2RlbHRhIDw8IDEpIC0gMTsKICAgIGVsc2UgaWYgKGkxX21iX3FwX2RlbHRhIDwgMCkKICAgICAgICB1MV9jb2RlX251bSA9IChBQlMoaTFfbWJfcXBfZGVsdGEpKSA8PCAxOwoKICAgIHU0X2N0eF9pbmMgPSAwOwogICAgdTRfYmlucyA9IDA7CiAgICBpMV9iaW5zX2xlbiA9IDE7CiAgICAvKiBjYWxjdWxhdGUgY3R4dEluYywgZGVwZW5kaW5nIG9uIG5laWdoYm91ciBhdmFpbGFiaWxpdHkgKi8KICAgIHUxX2N0eHRfaW5jID0gKCEoIShwc19jYWJhY19jdHh0LT5pMV9wcmV2cHNfbWJfcXBfZGVsdGFfY3R4dCkpKTsKICAgIHBzX2NhYmFjX2N0eHQtPmkxX3ByZXZwc19tYl9xcF9kZWx0YV9jdHh0ID0gaTFfbWJfcXBfZGVsdGE7CgogICAgaWYgKHUxX2NvZGVfbnVtID09IDApCiAgICB7CiAgICAgICAgLyogYjAgKi8KICAgICAgICB1MV9iaW4gPSAoVVdPUkQ4KSAodTRfYmlucyk7CiAgICAgICAgdTFfY3R4X2luYyA9IHUxX2N0eHRfaW5jICYgMHgwZjsKICAgICAgICAvKiBFbmNvZGUgdGhlIGJpbiAqLwogICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfYmluKHBzX2NhYmFjX2N0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTFfYmluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlICsgTUJfUVBfREVMVEEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdTFfY3R4X2luYyk7CgogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8qIGIwICovCiAgICAgICAgdTRfY3R4X2luYyA9IHUxX2N0eHRfaW5jOwogICAgICAgIHU0X2JpbnMgPSAxOwogICAgICAgIHUxX2NvZGVfbnVtLS07CiAgICAgICAgaWYgKHUxX2NvZGVfbnVtID09IDApCiAgICAgICAgewogICAgICAgICAgICAvKiBiMSAqLwogICAgICAgICAgICB1NF9jdHhfaW5jID0gKHU0X2N0eF9pbmMgfCAweDIwKTsKICAgICAgICAgICAgaTFfYmluc19sZW4rKzsKICAgICAgICAgICAgaWgyNjRlX2VuY29kZV9kZWNpc2lvbl9iaW5zKHU0X2JpbnMsIGkxX2JpbnNfbGVuLCB1NF9jdHhfaW5jLCAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUgKyBNQl9RUF9ERUxUQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvKiBiMSAqLwogICAgICAgICAgICB1NF9jdHhfaW5jID0gKHU0X2N0eF9pbmMgfCAweDIwKTsKICAgICAgICAgICAgdTRfYmlucyA9ICh1NF9iaW5zIHwgKDEgPDwgaTFfYmluc19sZW4pKTsKICAgICAgICAgICAgaTFfYmluc19sZW4rKzsKICAgICAgICAgICAgdTFfY29kZV9udW0tLTsKICAgICAgICAgICAgLyogQmluSWR4IGZyb20gYjIgb253YXJkcyAqLwogICAgICAgICAgICBpZiAodTFfY29kZV9udW0gPCAzMCkKICAgICAgICAgICAgeyAvKiBtYXhpbXVtIGkxX2JpbnNfbGVuID0gMzEgKi8KICAgICAgICAgICAgICAgIHdoaWxlICh1MV9jb2RlX251bSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB1NF9iaW5zID0gKHU0X2JpbnMgfCAoMSA8PCBpMV9iaW5zX2xlbikpOwogICAgICAgICAgICAgICAgICAgIGkxX2JpbnNfbGVuKys7CiAgICAgICAgICAgICAgICAgICAgdTFfY29kZV9udW0tLTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB1NF9jdHhfaW5jID0gKHU0X2N0eF9pbmMgfCAweDMwMCk7CiAgICAgICAgICAgICAgICBpMV9iaW5zX2xlbisrOwogICAgICAgICAgICAgICAgaWgyNjRlX2VuY29kZV9kZWNpc2lvbl9iaW5zKHU0X2JpbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTUJfUVBfREVMVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGkxX2JpbnNfbGVuID0gNTMgKi8KICAgICAgICAgICAgICAgIHU0X2JpbnMgPSAweGZmZmZmZmZmOwogICAgICAgICAgICAgICAgaTFfYmluc19sZW4gPSAzMjsKICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMgPSAodTRfY3R4X2luYyB8IDB4MzAwKTsKICAgICAgICAgICAgICAgIHUxX2NvZGVfbnVtIC09IDMwOwogICAgICAgICAgICAgICAgaWgyNjRlX2VuY29kZV9kZWNpc2lvbl9iaW5zKHU0X2JpbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTUJfUVBfREVMVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgICAgICAgICB1NF9iaW5zID0gMDsKICAgICAgICAgICAgICAgIGkxX2JpbnNfbGVuID0gMDsKICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMgPSAweDAzMzsKICAgICAgICAgICAgICAgIHdoaWxlICh1MV9jb2RlX251bSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB1NF9iaW5zID0gKHU0X2JpbnMgfCAoMSA8PCBpMV9iaW5zX2xlbikpOwogICAgICAgICAgICAgICAgICAgIGkxX2JpbnNfbGVuKys7CiAgICAgICAgICAgICAgICAgICAgdTFfY29kZV9udW0tLTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdTRfY3R4X2luYyA9ICh1NF9jdHhfaW5jIHwgMHgzMDApOwogICAgICAgICAgICAgICAgaTFfYmluc19sZW4rKzsKICAgICAgICAgICAgICAgIGloMjY0ZV9lbmNvZGVfZGVjaXNpb25fYmlucyh1NF9iaW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxX2JpbnNfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1CX1FQX0RFTFRBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgoKCgovKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQGJyaWVmCiAqICBFbmNvZGVzIDRyZXNpZHVhbF9ibG9ja19jYWJhYyBhcyBkZWZpbmVkIGluIDcuMy41LjMuMy4KICoKICogQHBhcmFtW2luXSBwaTJfcmVzX2Jsb2NrCiAqICBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiByZXNpZHVlcwogKgogKiBAcGFyYW1baW5dICB1MV9ubnoKICogIE51bWJlciBvZiBub24gemVybyBjb2VmZnMgaW4gdGhlIGJsb2NrCiAqCiAqIEBwYXJhbVtpbl0gdTFfbWF4X251bV9jb2VmZnMKICogIE1heCBudW1iZXIgb2YgY29lZmZzIHRoYXQgY2FuIGJlIHRoZXJlIGluIHRoZSBibG9jawogKgogKiBAcGFyYW1baW5dIHUyX3NpZ19jb2VmZl9tYXAKICogIFNpZ25pZmljYW50IGNvZWZmIG1hcAogKgogKiBAcGFyYW1baW5dIHU0X2N0eF9jYXRfb2Zmc2V0CiAqICBjdHhJZHhPZmZzZXQgZm9yICBhYnNvbHV0ZSB2YWx1ZSBjb250ZXh0cwogKgogKiBAcGFyYW1baW5dICBwdTFfY3R4dF9zaWdfY29lZmYKICogIFBvaW50ZXIgdG8gcmVzaWR1YWwgc3RhdGUgdmFyaWFibGVzCiAqCiAqIEBwYXJhbVtpbl0gcHNfY2FiYWNfY3R4dAogKiAgUG9pbnRlciB0byBjYWJhYyBjb250ZXh0IHN0cnVjdHVyZQogKgogKiBAcmV0dXJucwogKgogKiBAcmVtYXJrcwogKiAgTm9uZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8Kc3RhdGljIHZvaWQgaWgyNjRlX2NhYmFjX3dyaXRlX2NvZWZmNHg0KFdPUkQxNiAqcGkyX3Jlc19ibG9jaywgVVdPUkQ4IHUxX25ueiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXT1JEOCB1MV9tYXhfbnVtX2NvZWZmcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXT1JEMTYgdTJfc2lnX2NvZWZmX21hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXT1JEMzIgdTRfY3R4X2NhdF9vZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5fY3R4dF9tb2RlbCAqcHUxX2N0eHRfc2lnX2NvZWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiYWNfY3R4dF90ICpwc19jYWJhY19jdHh0KQp7CgogICAgV09SRDggaTsKICAgIFdPUkQxNiAqcGkxNl9jb2VmZnM7CiAgICBVV09SRDMyIHU0X3NpZ19jb2VmZiwgdTRfYmluczsKICAgIFVXT1JEMzIgdTRfY3R4X2luYzsKICAgIFVXT1JEOCB1MV9sYXN0X3NpZ19jb2VmX2luZGV4ID0gKDMxIC0gQ0xaKHUyX3NpZ19jb2VmZl9tYXApKTsKCiAgICAvKiBBbHdheXMgcHV0IENvZGVkIEJsb2NrIEZsYWcgYXMgMSAqLwoKICAgICAgICBwaTE2X2NvZWZmcyA9IHBpMl9yZXNfYmxvY2s7CiAgICAgICAgewogICAgICAgICAgICBiaW5fY3R4dF9tb2RlbCAqcHUxX2Jpbl9jdHh0OwogICAgICAgICAgICBVV09SRDggdTFfYmluLCB1Y19sYXN0OwoKICAgICAgICAgICAgaSA9IDA7CiAgICAgICAgICAgIHB1MV9iaW5fY3R4dCA9IHB1MV9jdHh0X3NpZ19jb2VmZjsKICAgICAgICAgICAgdTRfc2lnX2NvZWZmID0gMDsKICAgICAgICAgICAgdTFfYmluID0gMTsKICAgICAgICAgICAgaWYgKCh1MV9sYXN0X3NpZ19jb2VmX2luZGV4KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdTFfYmluID0gISEodTJfc2lnX2NvZWZmX21hcCAmIDAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB1Y19sYXN0ID0gMTsKCiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIEVuY29kZSBEZWNpc2lvbiAqLwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9iaW4ocHNfY2FiYWNfY3R4dCwgdTFfYmluLCBwdTFfYmluX2N0eHQpOwoKICAgICAgICAgICAgICAgIGlmICh1MV9iaW4gJiB1Y19sYXN0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHU0X3NpZ19jb2VmZiA9ICh1NF9zaWdfY29lZmYgfCAoMSA8PCBpKSk7CiAgICAgICAgICAgICAgICAgICAgcHUxX2Jpbl9jdHh0ID0gcHUxX2N0eHRfc2lnX2NvZWZmICsgaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIExBU1RfU0lHTklGSUNBTlRfQ09FRkZfRkxBR19GUkFNRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNJR05JRklDQU5UX0NPRUZGX0ZMQUdfRlJBTUU7CiAgICAgICAgICAgICAgICAgICAgdTFfYmluID0gKGkgPT0gdTFfbGFzdF9zaWdfY29lZl9pbmRleCk7CiAgICAgICAgICAgICAgICAgICAgdWNfbGFzdCA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAxOwogICAgICAgICAgICAgICAgICAgIHB1MV9iaW5fY3R4dCA9IHB1MV9jdHh0X3NpZ19jb2VmZiArIGk7CiAgICAgICAgICAgICAgICAgICAgdTFfYmluID0gKGkgPT0gdTFfbGFzdF9zaWdfY29lZl9pbmRleCk7CiAgICAgICAgICAgICAgICAgICAgdWNfbGFzdCA9IDE7CiAgICAgICAgICAgICAgICAgICAgaWYgKChpICE9IHUxX2xhc3Rfc2lnX2NvZWZfaW5kZXgpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdTFfYmluID0gISEoKHUyX3NpZ19jb2VmZl9tYXAgPj4gaSkgJiAwMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9d2hpbGUgKCEoKGkgPiB1MV9sYXN0X3NpZ19jb2VmX2luZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGkgPiAodTFfbWF4X251bV9jb2VmZnMgLSAxKSkpKTsKICAgICAgICB9CgogICAgICAgIC8qIEVuY29kZSBjb2VmZl9hYnNfbGV2ZWxfbWludXMxIGFuZCBjb2VmZl9zaWduX2ZsYWcgKi8KICAgICAgICB7CiAgICAgICAgICAgIFVXT1JEOCB1MV9zaWduOwogICAgICAgICAgICBVV09SRDE2IHUyX2Fic19sZXZlbDsKICAgICAgICAgICAgVVdPUkQ4IHUxX2Fic19sZXZlbF9lcXVhbDEgPSAxLCB1MV9hYnNfbGV2ZWxfZ3QxID0gMDsKICAgICAgICAgICAgVVdPUkQ4IHUxX2N0eF9pbmM7CiAgICAgICAgICAgIFVXT1JEOCB1MV9jb2ZmOwogICAgICAgICAgICBXT1JEMTYgaTJfc3VmczsKICAgICAgICAgICAgV09SRDggaTFfYmluc19sZW47CiAgICAgICAgICAgIGkgPSB1MV9sYXN0X3NpZ19jb2VmX2luZGV4OwogICAgICAgICAgICBwaTE2X2NvZWZmcyA9IHBpMl9yZXNfYmxvY2sgKyB1MV9ubnogLSAxOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdTRfc2lnX2NvZWZmID0gdTRfc2lnX2NvZWZmICYgKCgxIDw8IGkpIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgdTRfYmlucyA9IDA7CiAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYyA9IDA7CiAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4gPSAxOwogICAgICAgICAgICAgICAgICAgIC8qIEVuY29kZSB0aGUgQWJzTGV2ZWxNaW51czEgKi8KICAgICAgICAgICAgICAgICAgICB1Ml9hYnNfbGV2ZWwgPSBBQlMoKihwaTE2X2NvZWZmcykpIC0gMTsKICAgICAgICAgICAgICAgICAgICAvKiBDdHhJbmMgZm9yIGJpbjAgKi8KICAgICAgICAgICAgICAgICAgICB1NF9jdHhfaW5jID0gTUlOKHUxX2Fic19sZXZlbF9lcXVhbDEsIDQpOwogICAgICAgICAgICAgICAgICAgIC8qIEN0eEluYyBmb3IgcmVtYWluaW5nICovCiAgICAgICAgICAgICAgICAgICAgdTFfY3R4X2luYyA9IDUgKyBNSU4odTFfYWJzX2xldmVsX2d0MSwgNCk7CiAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYyA9IHU0X2N0eF9pbmMgKyAodTFfY3R4X2luYyA8PCA0KTsKICAgICAgICAgICAgICAgICAgICBpZiAodTJfYWJzX2xldmVsKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdTFfYWJzX2xldmVsX2d0MSsrOwogICAgICAgICAgICAgICAgICAgICAgICB1MV9hYnNfbGV2ZWxfZXF1YWwxID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCF1MV9hYnNfbGV2ZWxfZ3QxKQogICAgICAgICAgICAgICAgICAgICAgICB1MV9hYnNfbGV2ZWxfZXF1YWwxKys7CgogICAgICAgICAgICAgICAgICAgIHUxX2NvZmYgPSAxNDsKICAgICAgICAgICAgICAgICAgICBpZiAodTJfYWJzX2xldmVsID49IHUxX2NvZmYpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmVmaXggVFUgaS5lIHN0cmluZyBvZiAxNCAxJ3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgdTRfYmlucyA9IDB4M2ZmZjsKICAgICAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4gPSAxNDsKICAgICAgICAgICAgICAgICAgICAgICAgaWgyNjRlX2VuY29kZV9kZWNpc2lvbl9iaW5zKHU0X2JpbnMsIGkxX2JpbnNfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYywgMSwgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdTRfY3R4X2NhdF9vZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1ZmZpeCwgdXNlcyBFbmNvZGVCeXBhc3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaTJfc3VmcyA9IHUyX2Fic19sZXZlbCAtIHUxX2NvZmY7CgogICAgICAgICAgICAgICAgICAgICAgICB1NF9iaW5zID0gaWgyNjRlX2NhYmFjX1VFR2swX2JpbmFyaXphdGlvbihpMl9zdWZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaTFfYmluc19sZW4pOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9ieXBhc3NfYmlucyhwc19jYWJhY19jdHh0LCB1NF9iaW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxX2JpbnNfbGVuKTsKCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByZWZpeCBvbmx5ICovCiAgICAgICAgICAgICAgICAgICAgICAgIHU0X2JpbnMgPSAoMSA8PCB1Ml9hYnNfbGV2ZWwpIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4gPSB1Ml9hYnNfbGV2ZWwgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmNvZGUgVGVybWluYXRpbmcgYml0ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGloMjY0ZV9lbmNvZGVfZGVjaXNpb25fYmlucyh1NF9iaW5zLCBpMV9iaW5zX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMsIDEsIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHU0X2N0eF9jYXRfb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogZW5jb2RlIGNvZWZmX3NpZ25fZmxhZ1tpXSAqLwogICAgICAgICAgICAgICAgdTFfc2lnbiA9ICgoKnBpMTZfY29lZmZzKSA8IDApID8gMSA6IDA7CiAgICAgICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX2J5cGFzc19iaW5zKHBzX2NhYmFjX2N0eHQsIHUxX3NpZ24sIDEpOwogICAgICAgICAgICAgICAgaSA9IENMWih1NF9zaWdfY29lZmYpOwogICAgICAgICAgICAgICAgaSA9IDMxIC0gaTsKICAgICAgICAgICAgICAgIHBpMTZfY29lZmZzLS07CiAgICAgICAgICAgIH13aGlsZSAodTRfc2lnX2NvZWZmKTsKICAgICAgICB9Cgp9CgoKLyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEBicmllZgogKiBXcml0ZSBEQyBjb2VmZnMgZm9yIGludHJhIHByZWRpY3RlZCBsdW1hIGJsb2NrCiAqCiAqIEBwYXJhbVtpbl0gcHNfZW50X2N0eHQKICogIFBvaW50ZXIgdG8gZW50cm9weSBjb250ZXh0IHN0cnVjdHVyZQogKgogKiBAcmV0dXJucwogKgogKiBAcmVtYXJrcwogKiAgTm9uZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8Kc3RhdGljIHZvaWQgaWgyNjRlX2NhYmFjX2VuY29kZV9yZXNpZHVlX2x1bWFfZGMoZW50cm9weV9jdHh0X3QgKnBzX2VudF9jdHh0KQp7CgogICAgLyogQ0FCQUMgY29udGV4dCAqLwogICAgY2FiYWNfY3R4dF90ICpwc19jYWJhY19jdHh0ID0gcHNfZW50X2N0eHQtPnBzX2NhYmFjOwogICAgdHVfc2Jsa19jb2VmZl9kYXRhX3QgKnBzX21iX2NvZWZmX2RhdGE7CgogICAgLyogcGFja2VkIHJlc2lkdWUgKi8KICAgIHZvaWQgKnB2X21iX2NvZWZmX2RhdGEgPSBwc19lbnRfY3R4dC0+cHZfbWJfY29lZmZfZGF0YTsKICAgIFVXT1JEMTYgdTJfc2lnX2NvZWZmX21hcDsKICAgIFdPUkQxNiAqcGkyX3Jlc19ibG9jazsKICAgIFVXT1JEOCB1MV9ubno7CiAgICBVV09SRDggdTFfY2JmOwogICAgbWJfaW5mb19jdHh0X3QgKnBzX3RvcF9jdHh0ID0gcHNfY2FiYWNfY3R4dC0+cHNfdG9wX2N0eHRfbWJfaW5mbzsKICAgIG1iX2luZm9fY3R4dF90ICpwX0N1ckN0eHQgPSBwc19jYWJhY19jdHh0LT5wc19jdXJyX2N0eHRfbWJfaW5mbzsKCiAgICBQQVJTRV9DT0VGRl9EQVRBX0JMT0NLXzR4NChwdl9tYl9jb2VmZl9kYXRhLCBwc19tYl9jb2VmZl9kYXRhLCB1MV9ubnosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Ml9zaWdfY29lZmZfbWFwLCBwaTJfcmVzX2Jsb2NrKTsKCiAgICB1MV9jYmYgPSAhISh1MV9ubnopOwoKICAgIHsKICAgICAgICBVV09SRDMyIHU0X2N0eF9pbmM7CiAgICAgICAgVVdPUkQ4IHUxX2EsIHUxX2I7CgogICAgICAgIHUxX2EgPSBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95dXZfZGNfY3NicFswXSAmIDB4MTsKICAgICAgICB1MV9iID0gcHNfdG9wX2N0eHQtPnUxX3l1dl9kY19jc2JwICYgMHgxOwogICAgICAgIHU0X2N0eF9pbmMgPSB1MV9hICsgKHUxX2IgPDwgMSk7CgogICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfYmluKHBzX2NhYmFjX2N0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTFfY2JmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlICsgQ0JGCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChMVU1BX0RDX0NUWENBVCA8PCAyKSArIHU0X2N0eF9pbmMpOwogICAgfQoKICAgIC8qIFdyaXRlIGNvZGVkX2Jsb2NrX2ZsYWcgKi8KICAgIGlmICh1MV9jYmYpCiAgICB7CiAgICAgICAgaWgyNjRlX2NhYmFjX3dyaXRlX2NvZWZmNHg0KHBpMl9yZXNfYmxvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTFfbm56LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUyX3NpZ19jb2VmZl9tYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09FRkZfQUJTX0xFVkVMX01JTlVTMSArIENPRUZGX0FCU19MRVZFTF9DQVRfMF9PRkZTRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU0lHTklGSUNBTlRfQ09FRkZfRkxBR19GUkFNRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTSUdfQ09FRkZfQ1RYVF9DQVRfMF9PRkZTRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7CgogICAgICAgIHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3l1dl9kY19jc2JwWzBdIHw9IDB4MTsKICAgICAgICBwX0N1ckN0eHQtPnUxX3l1dl9kY19jc2JwIHw9IDB4MTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95dXZfZGNfY3NicFswXSAmPSAweDY7CiAgICAgICAgcF9DdXJDdHh0LT51MV95dXZfZGNfY3NicCAmPSAweDY7CiAgICB9CgogICAgcHNfZW50X2N0eHQtPnB2X21iX2NvZWZmX2RhdGEgPSBwdl9tYl9jb2VmZl9kYXRhOwp9CgoKCgovKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQGJyaWVmCiAqIFdyaXRlIGNocm9tYSByZXNpZHVlcyB0byB0aGUgYml0c3RyZWFtCiAqCiAqIEBwYXJhbVtpbl0gcHNfZW50X2N0eHQKICogIFBvaW50ZXIgdG8gZW50cm9weSBjb250ZXh0IHN0cnVjdHVyZQogKgogKiBAcGFyYW1baW5dIHUxX2Nocm9tYV9jYnAKICogY29kZWQgYmxvY2sgcGF0dGVybiwgY2hyb21hCiAqCiAqIEByZXR1cm5zCiAqCiAqIEByZW1hcmtzCiAqICBOb25lCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwpzdGF0aWMgdm9pZCBpaDI2NGVfY2FiYWNfd3JpdGVfY2hyb21hX3Jlc2lkdWUoZW50cm9weV9jdHh0X3QgKnBzX2VudF9jdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdPUkQ4IHUxX2Nocm9tYV9jYnApCnsKICAgIC8qIENBQkFDIGNvbnRleHQgKi8KICAgIGNhYmFjX2N0eHRfdCAqcHNfY2FiYWNfY3R4dCA9IHBzX2VudF9jdHh0LT5wc19jYWJhYzsKICAgIHR1X3NibGtfY29lZmZfZGF0YV90ICpwc19tYl9jb2VmZl9kYXRhOwogICAgLyogcGFja2VkIHJlc2lkdWUgKi8KICAgIHZvaWQgKnB2X21iX2NvZWZmX2RhdGEgPSBwc19lbnRfY3R4dC0+cHZfbWJfY29lZmZfZGF0YTsKICAgIFVXT1JEMTYgdTJfc2lnX2NvZWZmX21hcDsKICAgIFVXT1JEOCB1MV9ubno7CiAgICBtYl9pbmZvX2N0eHRfdCAqcHNfdG9wX2N0eHRfbWJfaW5mbywgKnBzX2N1cnJfY3R4dDsKCiAgICBwc190b3BfY3R4dF9tYl9pbmZvID0gcHNfY2FiYWNfY3R4dC0+cHNfdG9wX2N0eHRfbWJfaW5mbzsKICAgIHBzX2N1cnJfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnBzX2N1cnJfY3R4dF9tYl9pbmZvOwoKICAgIC8qKioqKioqKioqKioqKioqKioqKi8KICAgIC8qIFdyaXRlIENocm9tYSBEQyAqLwogICAgLyoqKioqKioqKioqKioqKioqKioqLwogICAgewogICAgICAgIFdPUkQxNiAqcGkyX3Jlc19ibG9jazsKICAgICAgICBVV09SRDggdTFfbGVmdF9kY19jc2JwLCB1MV90b3BfZGNfY3NicCwgdTFfdXYsIHUxX2NiZjsKCiAgICAgICAgdTFfbGVmdF9kY19jc2JwID0gKHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3l1dl9kY19jc2JwWzBdKSA+PiAxOwogICAgICAgIHUxX3RvcF9kY19jc2JwID0gKHBzX3RvcF9jdHh0X21iX2luZm8tPnUxX3l1dl9kY19jc2JwKSA+PiAxOwoKICAgICAgICBmb3IgKHUxX3V2ID0gMDsgdTFfdXYgPCAyOyB1MV91disrKQogICAgICAgIHsKICAgICAgICAgICAgUEFSU0VfQ09FRkZfREFUQV9CTE9DS180eDQocHZfbWJfY29lZmZfZGF0YSwgcHNfbWJfY29lZmZfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTFfbm56LCB1Ml9zaWdfY29lZmZfbWFwLCBwaTJfcmVzX2Jsb2NrKTsKICAgICAgICAgICAgdTFfY2JmID0gISEodTFfbm56KTsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVVdPUkQ4IHUxX2EsIHUxX2I7CiAgICAgICAgICAgICAgICBVV09SRDMyIHU0X2N0eF9pbmM7CiAgICAgICAgICAgICAgICB1MV9hID0gKHUxX2xlZnRfZGNfY3NicCA+PiB1MV91dikgJiAweDAxOwogICAgICAgICAgICAgICAgdTFfYiA9ICh1MV90b3BfZGNfY3NicCA+PiB1MV91dikgJiAweDAxOwogICAgICAgICAgICAgICAgdTRfY3R4X2luYyA9ICh1MV9hICsgKHUxX2IgPDwgMSkpOwoKICAgICAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfYmluKHBzX2NhYmFjX2N0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MV9jYmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZSArIENCRgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChDSFJPTUFfRENfQ1RYQ0FUIDw8IDIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdTRfY3R4X2luYyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh1MV9jYmYpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGloMjY0ZV9jYWJhY193cml0ZV9jb2VmZjR4NChwaTJfcmVzX2Jsb2NrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxX25ueiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUyX3NpZ19jb2VmZl9tYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09FRkZfQUJTX0xFVkVMX01JTlVTMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPRUZGX0FCU19MRVZFTF9DQVRfM19PRkZTRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU0lHTklGSUNBTlRfQ09FRkZfRkxBR19GUkFNRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFNJR19DT0VGRl9DVFhUX0NBVF8zX09GRlNFVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICAgICAgICAgIFNFVEJJVCh1MV90b3BfZGNfY3NicCwgdTFfdXYpOwogICAgICAgICAgICAgICAgU0VUQklUKHUxX2xlZnRfZGNfY3NicCwgdTFfdXYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ0xFQVJCSVQodTFfdG9wX2RjX2NzYnAsIHUxX3V2KTsKICAgICAgICAgICAgICAgIENMRUFSQklUKHUxX2xlZnRfZGNfY3NicCwgdTFfdXYpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgICAgIC8qICAgICAgVXBkYXRlIHRoZSBEQyBjc2JwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgICAgIHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3l1dl9kY19jc2JwWzBdICY9IDB4MTsKICAgICAgICBwc19jdXJyX2N0eHQtPnUxX3l1dl9kY19jc2JwICY9IDB4MTsKICAgICAgICBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95dXZfZGNfY3NicFswXSB8PSAodTFfbGVmdF9kY19jc2JwIDw8IDEpOwogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2RjX2NzYnAgfD0gKHUxX3RvcF9kY19jc2JwIDw8IDEpOwogICAgfQogICAgLyoqKioqKioqKioqKioqKioqKiovCiAgICAvKiBXcml0ZSBDaHJvbWEgQUMgKi8KICAgIC8qKioqKioqKioqKioqKioqKioqLwogICAgewogICAgICAgIGlmICh1MV9jaHJvbWFfY2JwID09IDIpCiAgICAgICAgewogICAgICAgICAgICBVV09SRDggdTFfdXZfYmxrbm8sIHUxX2xlZnRfYWNfY3NicCwgdTFfdG9wX2FjX2NzYnA7CiAgICAgICAgICAgIFdPUkQxNiAqcGkyX3Jlc19ibG9jazsKICAgICAgICAgICAgdTFfbGVmdF9hY19jc2JwID0gcHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfdXZfYWNfY3NicFswXTsKICAgICAgICAgICAgdTFfdG9wX2FjX2NzYnAgPSBwc190b3BfY3R4dF9tYl9pbmZvLT51MV95dXZfYWNfY3NicCA+PiA0OwoKICAgICAgICAgICAgZm9yICh1MV91dl9ibGtubyA9IDA7IHUxX3V2X2Jsa25vIDwgODsgdTFfdXZfYmxrbm8rKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVVdPUkQ4IHUxX2NiZjsKICAgICAgICAgICAgICAgIFVXT1JEOCB1MV9iMmIwLCB1MV9iMmIxOwogICAgICAgICAgICAgICAgUEFSU0VfQ09FRkZfREFUQV9CTE9DS180eDQocHZfbWJfY29lZmZfZGF0YSwgcHNfbWJfY29lZmZfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxX25ueiwgdTJfc2lnX2NvZWZmX21hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpMl9yZXNfYmxvY2spOwoKICAgICAgICAgICAgICAgIHUxX2NiZiA9ICEhKHUxX25ueik7CiAgICAgICAgICAgICAgICB1MV9iMmIwID0gKCh1MV91dl9ibGtubyAmIDB4NCkgPj4gMSkgfCAodTFfdXZfYmxrbm8gJiAweDEpOwogICAgICAgICAgICAgICAgdTFfYjJiMSA9ICgodTFfdXZfYmxrbm8gJiAweDQpID4+IDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKHUxX3V2X2Jsa25vICYgMHgyKSA+PiAxKTsKCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVVdPUkQ4IHUxX2EsIHUxX2I7CiAgICAgICAgICAgICAgICAgICAgVVdPUkQzMiB1NF9jdHhfaW5jOwogICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIGNvZGVkX2Jsb2NrX2ZsYWcgKi8KICAgICAgICAgICAgICAgICAgICB1MV9hID0gKHUxX2xlZnRfYWNfY3NicCA+PiB1MV9iMmIxKSAmIDB4MTsKICAgICAgICAgICAgICAgICAgICB1MV9iID0gKHUxX3RvcF9hY19jc2JwID4+IHUxX2IyYjApICYgMHgxOwogICAgICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMgPSB1MV9hICsgKHUxX2IgPDwgMSk7CgogICAgICAgICAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfYmluKHBzX2NhYmFjX2N0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTFfY2JmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlICsgQ0JGCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChDSFJPTUFfQUNfQ1RYQ0FUIDw8IDIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHU0X2N0eF9pbmMpOwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh1MV9jYmYpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX3dyaXRlX2NvZWZmNHg0KHBpMl9yZXNfYmxvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxX25ueiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUyX3NpZ19jb2VmZl9tYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPRUZGX0FCU19MRVZFTF9NSU5VUzEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ09FRkZfQUJTX0xFVkVMX0NBVF80X09GRlNFVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgK1NJR05JRklDQU5UX0NPRUZGX0ZMQUdfRlJBTUUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU0lHX0NPRUZGX0NUWFRfQ0FUXzRfT0ZGU0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgICAgICAgICAgICAgU0VUQklUKHUxX2xlZnRfYWNfY3NicCwgdTFfYjJiMSk7CiAgICAgICAgICAgICAgICAgICAgU0VUQklUKHUxX3RvcF9hY19jc2JwLCB1MV9iMmIwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDTEVBUkJJVCh1MV9sZWZ0X2FjX2NzYnAsIHUxX2IyYjEpOwogICAgICAgICAgICAgICAgICAgIENMRUFSQklUKHUxX3RvcF9hY19jc2JwLCB1MV9iMmIwKTsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgICAgIC8qICAgICAgVXBkYXRlIHRoZSBBQyBjc2JwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfdXZfYWNfY3NicFswXSA9IHUxX2xlZnRfYWNfY3NicDsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfYWNfY3NicCAmPSAweDBmOwogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX3l1dl9hY19jc2JwIHw9ICh1MV90b3BfYWNfY3NicCA8PCA0KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfdXZfYWNfY3NicFswXSA9IDA7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2FjX2NzYnAgJj0gMHhmOwogICAgICAgIH0KICAgIH0KICAgIHBzX2VudF9jdHh0LT5wdl9tYl9jb2VmZl9kYXRhID0gcHZfbWJfY29lZmZfZGF0YTsKfQoKCgoKLyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEBicmllZgogKiBFbmNvZGVzIFJlc2lkdWVzIGZvciB0aGUgTUIgYXMgZGVmaW5lZCBpbiA3LjMuNS4zCiAqCiAqIEBwYXJhbVtpbl0gcHNfZW50X2N0eHQKICogIFBvaW50ZXIgdG8gZW50cm9weSBjb250ZXh0IHN0cnVjdHVyZQogKgogKiBAcGFyYW1baW5dIHUxX2NicAogKiBjb2RlZCBibG9jayBwYXR0ZXJuCiAqCiAqIEBwYXJhbVtpbl0gdTFfY3R4X2NhdAogKiBDb250ZXh0IGNhdGVnb3J5LCBMVU1BX0FDX0NUWENBVCBvciBMVU1BXzR4NF9DVFhDQVQKICoKICogQHJldHVybnMKICoKICogQHJlbWFya3MKICogIE5vbmUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnN0YXRpYyB2b2lkIGloMjY0ZV9jYWJhY19lbmNvZGVfcmVzaWR1ZShlbnRyb3B5X2N0eHRfdCAqcHNfZW50X2N0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVV09SRDMyIHU0X2NicCwgVVdPUkQ4IHUxX2N0eF9jYXQpCnsKICAgIC8qIENBQkFDIGNvbnRleHQgKi8KICAgIGNhYmFjX2N0eHRfdCAqcHNfY2FiYWNfY3R4dCA9IHBzX2VudF9jdHh0LT5wc19jYWJhYzsKCiAgICB0dV9zYmxrX2NvZWZmX2RhdGFfdCAqcHNfbWJfY29lZmZfZGF0YTsKICAgIC8qIHBhY2tlZCByZXNpZHVlICovCiAgICB2b2lkICpwdl9tYl9jb2VmZl9kYXRhID0gcHNfZW50X2N0eHQtPnB2X21iX2NvZWZmX2RhdGE7CiAgICBVV09SRDE2IHUyX3NpZ19jb2VmZl9tYXA7CiAgICBVV09SRDggdTFfbm56OwogICAgbWJfaW5mb19jdHh0X3QgKnBzX2N1cnJfY3R4dDsKICAgIG1iX2luZm9fY3R4dF90ICpwc190b3BfY3R4dDsKICAgIFVXT1JEOCB1MV9sZWZ0X2FjX2NzYnA7CiAgICBVV09SRDggdTFfdG9wX2FjX2NzYnA7CiAgICBVV09SRDMyIHU0X2N0eF9pZHhfb2Zmc2V0X3NpZ19jb2VmLCB1NF9jdHhfaWR4X29mZnNldF9hYnNfbHZsOwogICAgcHNfY3Vycl9jdHh0ID0gcHNfY2FiYWNfY3R4dC0+cHNfY3Vycl9jdHh0X21iX2luZm87CiAgICBwc190b3BfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnBzX3RvcF9jdHh0X21iX2luZm87CiAgICB1MV9sZWZ0X2FjX2NzYnAgPSBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95X2FjX2NzYnBbMF07CiAgICB1MV90b3BfYWNfY3NicCA9IHBzX3RvcF9jdHh0LT51MV95dXZfYWNfY3NicDsKCiAgICBpZiAodTRfY2JwICYgMHhmKQogICAgewogICAgICAgIC8qICBXcml0ZSBsdW1hIHJlc2lkdWUgICovCiAgICAgICAgVVdPUkQ4IHUxX29mZnNldDsKICAgICAgICBXT1JEMTYgKnBpMl9yZXNfYmxvY2s7CiAgICAgICAgVVdPUkQ4IHUxX3N1YmJsa19udW07CiAgICAgICAgaWYgKHUxX2N0eF9jYXQgPT0gTFVNQV9BQ19DVFhDQVQpCiAgICAgICAgewogICAgICAgICAgICB1MV9vZmZzZXQgPSAxOwogICAgICAgICAgICB1NF9jdHhfaWR4X29mZnNldF9zaWdfY29lZiA9IFNJR19DT0VGRl9DVFhUX0NBVF8xX09GRlNFVDsKICAgICAgICAgICAgdTRfY3R4X2lkeF9vZmZzZXRfYWJzX2x2bCA9IENPRUZGX0FCU19MRVZFTF9NSU5VUzEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPRUZGX0FCU19MRVZFTF9DQVRfMV9PRkZTRVQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHUxX29mZnNldCA9IDA7CiAgICAgICAgICAgIHU0X2N0eF9pZHhfb2Zmc2V0X3NpZ19jb2VmID0gU0lHX0NPRUZGX0NUWFRfQ0FUXzJfT0ZGU0VUOwogICAgICAgICAgICB1NF9jdHhfaWR4X29mZnNldF9hYnNfbHZsID0gQ09FRkZfQUJTX0xFVkVMX01JTlVTMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0VGRl9BQlNfTEVWRUxfQ0FUXzJfT0ZGU0VUOwogICAgICAgIH0KCiAgICAgICAgZm9yICh1MV9zdWJibGtfbnVtID0gMDsgdTFfc3ViYmxrX251bSA8IDE2OyB1MV9zdWJibGtfbnVtKyspCiAgICAgICAgewogICAgICAgICAgICBVV09SRDggdTFfYjAsIHUxX2IxLCB1MV9iMiwgdTFfYjMsIHUxX2IyYjAsIHUxX2IzYjEsIHUxX2IzYjI7CiAgICAgICAgICAgIHUxX2IwID0gKHUxX3N1YmJsa19udW0gJiAweDEpOwogICAgICAgICAgICB1MV9iMSA9ICh1MV9zdWJibGtfbnVtICYgMHgyKSA+PiAxOwogICAgICAgICAgICB1MV9iMiA9ICh1MV9zdWJibGtfbnVtICYgMHg0KSA+PiAyOwogICAgICAgICAgICB1MV9iMyA9ICh1MV9zdWJibGtfbnVtICYgMHg4KSA+PiAzOwogICAgICAgICAgICB1MV9iMmIwID0gKHUxX2IyIDw8IDEpIHwgKHUxX2IwKTsKICAgICAgICAgICAgdTFfYjNiMSA9ICh1MV9iMyA8PCAxKSB8ICh1MV9iMSk7CiAgICAgICAgICAgIHUxX2IzYjIgPSAodTFfYjMgPDwgMSkgfCAodTFfYjIpOwoKICAgICAgICAgICAgaWYgKCEoKHU0X2NicCA+PiB1MV9iM2IyKSAmIDB4MSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgICAgICAgICAgIC8qIFRoZSBjdXJyZW50IGJsb2NrIGlzIG5vdCBjb2RlZCBzbyBza2lwIGFsbCB0aGUgc3ViIGJsb2NrICovCiAgICAgICAgICAgICAgICAvKiBhbmQgc2V0IHRoZSBwb2ludGVyIG9mIHNjYW4gbGV2ZWwsIGNzYnAgYWNjcm9kaW5nbHkgICAgICAqLwogICAgICAgICAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgICAgICAgICAgQ0xFQVJCSVQodTFfdG9wX2FjX2NzYnAsIHUxX2IyYjApOwogICAgICAgICAgICAgICAgQ0xFQVJCSVQodTFfdG9wX2FjX2NzYnAsICh1MV9iMmIwICsgMSkpOwogICAgICAgICAgICAgICAgQ0xFQVJCSVQodTFfbGVmdF9hY19jc2JwLCB1MV9iM2IxKTsKICAgICAgICAgICAgICAgIENMRUFSQklUKHUxX2xlZnRfYWNfY3NicCwgKHUxX2IzYjEgKyAxKSk7CgogICAgICAgICAgICAgICAgdTFfc3ViYmxrX251bSArPSAzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgUEFSU0VfQ09FRkZfREFUQV9CTE9DS180eDQocHZfbWJfY29lZmZfZGF0YSwgcHNfbWJfY29lZmZfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxX25ueiwgdTJfc2lnX2NvZWZmX21hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpMl9yZXNfYmxvY2spOwoKICAgICAgICAgICAgICAgIFVXT1JEOCB1MV9jc2JmID0gISEodTFfbm56KTsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBVV09SRDggdTFfYSwgdTFfYjsKICAgICAgICAgICAgICAgICAgICBVV09SRDMyIHU0X2N0eF9pbmM7CiAgICAgICAgICAgICAgICAgICAgdTFfYiA9ICh1MV90b3BfYWNfY3NicCA+PiB1MV9iMmIwKSAmIDB4MDE7CiAgICAgICAgICAgICAgICAgICAgdTFfYSA9ICh1MV9sZWZ0X2FjX2NzYnAgPj4gdTFfYjNiMSkgJiAweDAxOwogICAgICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMgPSB1MV9hICsgKHUxX2IgPDwgMSk7CgogICAgICAgICAgICAgICAgICAgIC8qIEVuY29kZSB0aGUgYmluICovCiAgICAgICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9iaW4ocHNfY2FiYWNfY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MV9jc2JmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlICsgQ0JGCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHUxX2N0eF9jYXQgPDwgMikgKyB1NF9jdHhfaW5jKTsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgICAgICAgICAvKiBXcml0ZSBjb2RlZF9ibG9ja19mbGFnICovCiAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgICAgICAgICBpZiAodTFfY3NiZikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpaDI2NGVfY2FiYWNfd3JpdGVfY29lZmY0eDQocGkyX3Jlc19ibG9jaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTFfbm56LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVVdPUkQ4KSAoMTUgLSB1MV9vZmZzZXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Ml9zaWdfY29lZmZfbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NF9jdHhfaWR4X29mZnNldF9hYnNfbHZsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTSUdOSUZJQ0FOVF9DT0VGRl9GTEFHX0ZSQU1FCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB1NF9jdHhfaWR4X29mZnNldF9zaWdfY29lZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7CgogICAgICAgICAgICAgICAgICAgIFNFVEJJVCh1MV90b3BfYWNfY3NicCwgdTFfYjJiMCk7CiAgICAgICAgICAgICAgICAgICAgU0VUQklUKHUxX2xlZnRfYWNfY3NicCwgdTFfYjNiMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ0xFQVJCSVQodTFfdG9wX2FjX2NzYnAsIHUxX2IyYjApOwogICAgICAgICAgICAgICAgICAgIENMRUFSQklUKHUxX2xlZnRfYWNfY3NicCwgdTFfYjNiMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgICAgIC8qICAgICAgICAgICAgICAgICAgIFVwZGF0ZSB0aGUgQUMgY3NicCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeV9hY19jc2JwWzBdID0gdTFfbGVmdF9hY19jc2JwICYgMHhmOwogICAgICAgIHUxX3RvcF9hY19jc2JwICY9IDB4MGY7CiAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfYWNfY3NicCAmPSAweGYwOwogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2FjX2NzYnAgfD0gdTFfdG9wX2FjX2NzYnA7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeV9hY19jc2JwWzBdID0gMDsKICAgICAgICBwc19jdXJyX2N0eHQtPnUxX3l1dl9hY19jc2JwICY9IDB4ZjA7CiAgICB9CgogICAgLyogICAgIFdyaXRlIGNocm9tYSByZXNpZHVlICovCgogICAgcHNfZW50X2N0eHQtPnB2X21iX2NvZWZmX2RhdGEgPSBwdl9tYl9jb2VmZl9kYXRhOwogICAgewogICAgICAgIFVXT1JEOCB1MV9jYnBfY2hyb21hOwogICAgICAgIHUxX2NicF9jaHJvbWEgPSB1NF9jYnAgPj4gNDsKICAgICAgICBpZiAodTFfY2JwX2Nocm9tYSkKICAgICAgICB7CiAgICAgICAgICAgIGloMjY0ZV9jYWJhY193cml0ZV9jaHJvbWFfcmVzaWR1ZShwc19lbnRfY3R4dCwgdTFfY2JwX2Nocm9tYSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3l1dl9kY19jc2JwWzBdICY9IDB4MTsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfZGNfY3NicCAmPSAweDE7CiAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3V2X2FjX2NzYnBbMF0gPSAwOwogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX3l1dl9hY19jc2JwICY9IDB4ZjsKICAgICAgICB9CiAgICB9Cn0KCi8qKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBAYnJpZWYKICogRW5jb2RlcyBhIE1vdGlvbiB2ZWN0b3IgKDkuMy4zLjEuMS43ICkKICoKICogQHBhcmFtW2luXSB1MV9tdmQKICogIE1vdGlvbiB2ZWN0b3IgdG8gYmUgZW5jb2RlZAogKgogKiBAcGFyYW1baW5dIHU0X2N0eF9pZHhfb2Zmc2V0CiAqICogIGN0eElkeE9mZnNldCBmb3IgTVZfWCBvciBNVl9ZY29udGV4dAogKgogKiBAcGFyYW1baW5dICB1aTJfYWJzX212ZAogKiBzdW0gb2YgYWJzb2x1dGUgdmFsdWUgb2YgY29ycmVzcG9uZGluZyBuZWlnaGJvcmluZyBtb3Rpb24gdmVjdG9ycwogKgogKiBAcGFyYW1baW5dIHBzX2NhYmFjX2N0eHQKICogIFBvaW50ZXIgdG8gY2FiYWMgY29udGV4dCBzdHJ1Y3R1cmUKICoKICogQHJldHVybnMKICoKICogQHJlbWFya3MKICogIE5vbmUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnN0YXRpYyB2b2lkIGloMjY0ZV9jYWJhY19lbmNfY3R4X212ZChXT1JEMTYgdTFfbXZkLCBVV09SRDMyIHU0X2N0eF9pZHhfb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdPUkQxNiB1aTJfYWJzX212ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmFjX2N0eHRfdCAqcHNfY2FiYWNfY3R4dCkKewoKICAgIFVXT1JEOCAgdTFfYmluLCB1MV9jdHh0X2luYzsKICAgIFdPUkQ4IGsgPSAzLCB1MV9jb2ZmID0gOTsKICAgIFdPUkQxNiBpMl9hYnNfbXZkLCBpMl9zdWZzOwogICAgVVdPUkQzMiB1NF9jdHhfaW5jOwogICAgVVdPUkQzMiB1NF9iaW5zOwogICAgV09SRDggaTFfYmluc19sZW47CgogICAgLyogaWYgbXZkIDwgdTFfY29mZgogICAgIG9ubHkgUHJlZml4CiAgICAgZWxzZQogICAgIFByZWZpeCArIFN1ZmZpeAoKICAgICBlbmNvZGUgc2lnbiBiaXQKCiAgICAgUHJlZml4IFRVIGVuY29kaW5nIENtYXggPXUxX2NvZmYgYW5kIFN1ZmZpeCAzcmQgb3JkZXIgRXhwLUdvbG9tYgogICAgICovCgogICAgaWYgKHVpMl9hYnNfbXZkIDwgMykKICAgICAgICB1NF9jdHhfaW5jID0gMDsKICAgIGVsc2UgaWYgKHVpMl9hYnNfbXZkID4gMzIpCiAgICAgICAgdTRfY3R4X2luYyA9IDI7CiAgICBlbHNlCiAgICAgICAgdTRfY3R4X2luYyA9IDE7CgogICAgdTRfYmlucyA9IDA7CiAgICBpMV9iaW5zX2xlbiA9IDE7CgogICAgaWYgKHUxX212ZCA9PSAwKQogICAgewogICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfYmluKHBzX2NhYmFjX2N0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZSArIHU0X2N0eF9pZHhfb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHU0X2N0eF9pbmMpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGkyX2Fic19tdmQgPSBBQlModTFfbXZkKTsKICAgICAgICBpZiAoaTJfYWJzX212ZCA+PSB1MV9jb2ZmKQogICAgICAgIHsKICAgICAgICAgICAgLyogUHJlZml4IFRVIGkuZSBzdHJpbmcgb2YgOSAxJ3MgKi8KICAgICAgICAgICAgdTRfYmlucyA9IDB4MWZmOwogICAgICAgICAgICBpMV9iaW5zX2xlbiA9IDk7CiAgICAgICAgICAgIHU0X2N0eF9pbmMgPSAodTRfY3R4X2luYyB8IDB4MDY1NDMwKTsKCiAgICAgICAgICAgIGloMjY0ZV9lbmNvZGVfZGVjaXNpb25fYmlucyh1NF9iaW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NF9jdHhfaW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB1NF9jdHhfaWR4X29mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICAgICAgLyogU3VmZml4LCB1c2VzIEVuY29kZUJ5cGFzcyAqLwogICAgICAgICAgICB1NF9iaW5zID0gMDsKICAgICAgICAgICAgaTFfYmluc19sZW4gPSAwOwogICAgICAgICAgICBpMl9zdWZzID0gaTJfYWJzX212ZCAtIHUxX2NvZmY7CiAgICAgICAgICAgIHdoaWxlICgxKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaTJfc3VmcyA+PSAoMSA8PCBrKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB1NF9iaW5zID0gKHU0X2JpbnMgfCAoMSA8PCBpMV9iaW5zX2xlbikpOwogICAgICAgICAgICAgICAgICAgIGkxX2JpbnNfbGVuKys7CiAgICAgICAgICAgICAgICAgICAgaTJfc3VmcyA9IGkyX3N1ZnMgLSAoMSA8PCBrKTsKICAgICAgICAgICAgICAgICAgICBrKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4rKzsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoay0tKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdTFfYmluID0gKChpMl9zdWZzID4+IGspICYgMHgwMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHU0X2JpbnMgPSAodTRfYmlucyB8ICh1MV9iaW4gPDwgaTFfYmluc19sZW4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgaTFfYmluc19sZW4rKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9ieXBhc3NfYmlucyhwc19jYWJhY19jdHh0LCB1NF9iaW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxX2JpbnNfbGVuKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLyogUHJlZml4IG9ubHkgKi8KICAgICAgICAgICAgLyogYjAgKi8KICAgICAgICAgICAgdTRfYmlucyA9IDE7CiAgICAgICAgICAgIGkyX2Fic19tdmQtLTsKICAgICAgICAgICAgdTFfY3R4dF9pbmMgPSAzOwogICAgICAgICAgICB3aGlsZSAoaTJfYWJzX212ZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaTJfYWJzX212ZC0tOwogICAgICAgICAgICAgICAgdTRfYmlucyA9ICh1NF9iaW5zIHwgKDEgPDwgaTFfYmluc19sZW4pKTsKICAgICAgICAgICAgICAgIGlmICh1MV9jdHh0X2luYyA8PSA2KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMgPSAodTRfY3R4X2luYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICh1MV9jdHh0X2luYyA8PCAoaTFfYmluc19sZW4gPDwgMikpKTsKICAgICAgICAgICAgICAgICAgICB1MV9jdHh0X2luYysrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaTFfYmluc19sZW4rKzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBFbmNvZGUgVGVybWluYXRpbmcgYml0ICovCiAgICAgICAgICAgIGlmIChpMV9iaW5zX2xlbiA8PSA0KQogICAgICAgICAgICAgICAgdTRfY3R4X2luYyA9ICh1NF9jdHhfaW5jIHwgKHUxX2N0eHRfaW5jIDw8IChpMV9iaW5zX2xlbiA8PCAyKSkpOwogICAgICAgICAgICBpMV9iaW5zX2xlbisrOwogICAgICAgICAgICBpaDI2NGVfZW5jb2RlX2RlY2lzaW9uX2JpbnModTRfYmlucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxX2JpbnNfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdTRfY3R4X2lkeF9vZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKICAgICAgICB9CiAgICAgICAgLyogc2lnbiBiaXQsIHVzZXMgRW5jb2RlQnlwYXNzICovCiAgICAgICAgaWYgKHUxX212ZCA+IDApCiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfYnlwYXNzX2JpbnMocHNfY2FiYWNfY3R4dCwgMCwgMSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX2J5cGFzc19iaW5zKHBzX2NhYmFjX2N0eHQsIDEsIDEpOwogICAgfQp9CgovKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQGJyaWVmCiAqIEVuY29kZXMgYWxsIG1vdGlvbiB2ZWN0b3JzIGZvciBhIFAxNngxNiBNQgogKgogKiBAcGFyYW1baW5dIHBzX2NhYmFjX2N0eHQKICogIFBvaW50ZXIgdG8gY2FiYWMgY29udGV4dCBzdHJ1Y3R1cmUKICoKICogQHBhcmFtW2luXSBwaTJfbXZfcHRyCiAqIFBvaW50ZXIgdG8gYXJyYXkgb2YgbW90aW9uIHZlY3RvcnMKICoKICogQHJldHVybnMKICoKICogQHJlbWFya3MKICogIE5vbmUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCnN0YXRpYyB2b2lkIGloMjY0ZV9jYWJhY19lbmNfbXZkc19wMTZ4MTYoY2FiYWNfY3R4dF90ICpwc19jYWJhY19jdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQxNiAqcGkyX212X3B0cikKewoKCiAgICAvKiBFbmNvZGUgdGhlIGRpZmZlcmVudGlhbCBjb21wb25lbnQgb2YgdGhlIG1vdGlvbiB2ZWN0b3JzICovCgogICAgewogICAgICAgIFVXT1JEOCB1MV9hYnNfbXZkX3gsIHUxX2Fic19tdmRfeTsKICAgICAgICBVV09SRDggKnB1MV90b3BfbXZfY3R4dCwgKnB1MV9sZnRfbXZfY3R4dDsKICAgICAgICBXT1JEMTYgdTJfbXY7CiAgICAgICAgdTFfYWJzX212ZF94ID0gMDsKICAgICAgICB1MV9hYnNfbXZkX3kgPSAwOwogICAgICAgIHB1MV90b3BfbXZfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnBzX2N1cnJfY3R4dF9tYl9pbmZvLT51MV9tdlswXTsKICAgICAgICBwdTFfbGZ0X212X2N0eHQgPSBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF9tdl9jdHh0X2luY1swXTsKICAgICAgICB7CiAgICAgICAgICAgIFVXT1JEMTYgdTJfYWJzX212ZF94X2EsIHUyX2Fic19tdmRfeF9iLCB1Ml9hYnNfbXZkX3lfYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUyX2Fic19tdmRfeV9iOwogICAgICAgICAgICB1Ml9hYnNfbXZkX3hfYiA9IChVV09SRDE2KSBwdTFfdG9wX212X2N0eHRbMF07CiAgICAgICAgICAgIHUyX2Fic19tdmRfeV9iID0gKFVXT1JEMTYpIHB1MV90b3BfbXZfY3R4dFsxXTsKICAgICAgICAgICAgdTJfYWJzX212ZF94X2EgPSAoVVdPUkQxNikgcHUxX2xmdF9tdl9jdHh0WzBdOwogICAgICAgICAgICB1Ml9hYnNfbXZkX3lfYSA9IChVV09SRDE2KSBwdTFfbGZ0X212X2N0eHRbMV07CiAgICAgICAgICAgIHUyX212ID0gKihwaTJfbXZfcHRyKyspOwoKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19jdHhfbXZkKHUyX212LCBNVkRfWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVXT1JEMTYpICh1Ml9hYnNfbXZkX3hfYSArIHUyX2Fic19tdmRfeF9iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCk7CgogICAgICAgICAgICB1MV9hYnNfbXZkX3ggPSBDTElQMygwLCAxMjcsIEFCUyh1Ml9tdikpOwogICAgICAgICAgICB1Ml9tdiA9ICoocGkyX212X3B0cisrKTsKCiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfY3R4X212ZCh1Ml9tdiwgTVZEX1ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVV09SRDE2KSAodTJfYWJzX212ZF95X2EgKyB1Ml9hYnNfbXZkX3lfYiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICAgICAgdTFfYWJzX212ZF95ID0gQ0xJUDMoMCwgMTI3LCBBQlModTJfbXYpKTsKICAgICAgICB9CiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICAvKiBTdG9yZSBhYnNfbXZkX3ZhbHVlcyBjYWJhYyBjb250ZXh0cyAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgcHUxX3RvcF9tdl9jdHh0WzBdID0gcHUxX2xmdF9tdl9jdHh0WzBdID0gdTFfYWJzX212ZF94OwogICAgICAgIHB1MV90b3BfbXZfY3R4dFsxXSA9IHB1MV9sZnRfbXZfY3R4dFsxXSA9IHUxX2Fic19tdmRfeTsKICAgIH0KfQoKCi8qKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBAYnJpZWYKICogRW5jb2RlcyBhbGwgbW90aW9uIHZlY3RvcnMgZm9yIGEgQiBNQiAoQXNzdWVzIHRoYXQgbWJ5cGUgaXMgQl9MMF8xNngxNiwgQl9MMV8xNngxNiBvciBCX0JpXzE2eDE2CiAqCiAqIEBwYXJhbVtpbl0gcHNfY2FiYWNfY3R4dAogKiAgUG9pbnRlciB0byBjYWJhYyBjb250ZXh0IHN0cnVjdHVyZQogKgogKiBAcGFyYW1baW5dIHBpMl9tdl9wdHIKICogUG9pbnRlciB0byBhcnJheSBvZiBtb3Rpb24gdmVjdG9ycwogKgogKiBAcmV0dXJucwogKgogKiBAcmVtYXJrcwogKiAgTm9uZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8Kc3RhdGljIHZvaWQgaWgyNjRlX2NhYmFjX2VuY19tdmRzX2IxNngxNihjYWJhY19jdHh0X3QgKnBzX2NhYmFjX2N0eHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRDE2ICpwaTJfbXZfcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQzMiBpNF9tYl9wYXJ0X3ByZWRfbW9kZSApCnsKCiAgICAvKiBFbmNvZGUgdGhlIGRpZmZlcmVudGlhbCBjb21wb25lbnQgb2YgdGhlIG1vdGlvbiB2ZWN0b3JzICovCgogICAgewogICAgICAgIFVXT1JEOCB1MV9hYnNfbXZkX3gsIHUxX2Fic19tdmRfeTsKICAgICAgICBVV09SRDggKnB1MV90b3BfbXZfY3R4dCwgKnB1MV9sZnRfbXZfY3R4dDsKICAgICAgICBXT1JEMTYgdTJfbXY7CiAgICAgICAgdTFfYWJzX212ZF94ID0gMDsKICAgICAgICB1MV9hYnNfbXZkX3kgPSAwOwogICAgICAgIHB1MV90b3BfbXZfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnBzX2N1cnJfY3R4dF9tYl9pbmZvLT51MV9tdlswXTsKICAgICAgICBwdTFfbGZ0X212X2N0eHQgPSBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF9tdl9jdHh0X2luY1swXTsKICAgICAgICBpZiAoaTRfbWJfcGFydF9wcmVkX21vZGUgIT0gUFJFRF9MMSkvKiB8fCBQUkVEX0JJICovCiAgICAgICAgewogICAgICAgICAgICBVV09SRDE2IHUyX2Fic19tdmRfeF9hLCB1Ml9hYnNfbXZkX3hfYiwgdTJfYWJzX212ZF95X2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Ml9hYnNfbXZkX3lfYjsKICAgICAgICAgICAgdTJfYWJzX212ZF94X2IgPSAoVVdPUkQxNikgcHUxX3RvcF9tdl9jdHh0WzBdOwogICAgICAgICAgICB1Ml9hYnNfbXZkX3lfYiA9IChVV09SRDE2KSBwdTFfdG9wX212X2N0eHRbMV07CiAgICAgICAgICAgIHUyX2Fic19tdmRfeF9hID0gKFVXT1JEMTYpIHB1MV9sZnRfbXZfY3R4dFswXTsKICAgICAgICAgICAgdTJfYWJzX212ZF95X2EgPSAoVVdPUkQxNikgcHUxX2xmdF9tdl9jdHh0WzFdOwogICAgICAgICAgICB1Ml9tdiA9ICoocGkyX212X3B0cisrKTsKCiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfY3R4X212ZCh1Ml9tdiwgTVZEX1gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVV09SRDE2KSAodTJfYWJzX212ZF94X2EgKyB1Ml9hYnNfbXZkX3hfYiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICAgICAgdTFfYWJzX212ZF94ID0gQ0xJUDMoMCwgMTI3LCBBQlModTJfbXYpKTsKICAgICAgICAgICAgdTJfbXYgPSAqKHBpMl9tdl9wdHIrKyk7CgogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX2N0eF9tdmQodTJfbXYsIE1WRF9ZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVVdPUkQxNikgKHUyX2Fic19tdmRfeV9hICsgdTJfYWJzX212ZF95X2IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgICAgIHUxX2Fic19tdmRfeSA9IENMSVAzKDAsIDEyNywgQUJTKHUyX212KSk7CiAgICAgICAgfQogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgLyogU3RvcmUgYWJzX212ZF92YWx1ZXMgY2FiYWMgY29udGV4dHMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgICAgIHB1MV90b3BfbXZfY3R4dFswXSA9IHB1MV9sZnRfbXZfY3R4dFswXSA9IHUxX2Fic19tdmRfeDsKICAgICAgICBwdTFfdG9wX212X2N0eHRbMV0gPSBwdTFfbGZ0X212X2N0eHRbMV0gPSB1MV9hYnNfbXZkX3k7CgogICAgICAgIHUxX2Fic19tdmRfeCA9IDA7CiAgICAgICAgdTFfYWJzX212ZF95ID0gMDsKICAgICAgICBpZiAoaTRfbWJfcGFydF9wcmVkX21vZGUgIT0gUFJFRF9MMCkvKiB8fCBQUkVEX0JJICovCiAgICAgICAgewogICAgICAgICAgICBVV09SRDE2IHUyX2Fic19tdmRfeF9hLCB1Ml9hYnNfbXZkX3hfYiwgdTJfYWJzX212ZF95X2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Ml9hYnNfbXZkX3lfYjsKICAgICAgICAgICAgdTJfYWJzX212ZF94X2IgPSAoVVdPUkQxNikgcHUxX3RvcF9tdl9jdHh0WzJdOwogICAgICAgICAgICB1Ml9hYnNfbXZkX3lfYiA9IChVV09SRDE2KSBwdTFfdG9wX212X2N0eHRbM107CiAgICAgICAgICAgIHUyX2Fic19tdmRfeF9hID0gKFVXT1JEMTYpIHB1MV9sZnRfbXZfY3R4dFsyXTsKICAgICAgICAgICAgdTJfYWJzX212ZF95X2EgPSAoVVdPUkQxNikgcHUxX2xmdF9tdl9jdHh0WzNdOwogICAgICAgICAgICB1Ml9tdiA9ICoocGkyX212X3B0cisrKTsKCiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfY3R4X212ZCh1Ml9tdiwgTVZEX1gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVV09SRDE2KSAodTJfYWJzX212ZF94X2EgKyB1Ml9hYnNfbXZkX3hfYiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICAgICAgdTFfYWJzX212ZF94ID0gQ0xJUDMoMCwgMTI3LCBBQlModTJfbXYpKTsKICAgICAgICAgICAgdTJfbXYgPSAqKHBpMl9tdl9wdHIrKyk7CgogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX2N0eF9tdmQodTJfbXYsIE1WRF9ZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVVdPUkQxNikgKHUyX2Fic19tdmRfeV9hICsgdTJfYWJzX212ZF95X2IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgICAgIHUxX2Fic19tdmRfeSA9IENMSVAzKDAsIDEyNywgQUJTKHUyX212KSk7CiAgICAgICAgfQogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgLyogU3RvcmUgYWJzX212ZF92YWx1ZXMgY2FiYWMgY29udGV4dHMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgICAgIHB1MV90b3BfbXZfY3R4dFsyXSA9IHB1MV9sZnRfbXZfY3R4dFsyXSA9IHUxX2Fic19tdmRfeDsKICAgICAgICBwdTFfdG9wX212X2N0eHRbM10gPSBwdTFfbGZ0X212X2N0eHRbM10gPSB1MV9hYnNfbXZkX3k7CiAgICB9Cn0KCgoKLyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEBicmllZgogKiAgVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgQ0FCQUMgY29kZWQgYml0IHN0cmVhbSBmb3IgYW4gSW50cmEgU2xpY2UuCiAqCiAqIEBkZXNjcmlwdGlvbgogKiAgVGhlIG1iIHN5bnRheCBsYXllciBmb3IgaW50cmEgc2xpY2VzIGNvbnN0aXR1dGVzIGx1bWEgbWIgbW9kZSwgbWIgcXAgZGVsdGEsIGNvZGVkIGJsb2NrIHBhdHRlcm4sIGNocm9tYSBtYiBtb2RlIGFuZAogKiAgbHVtYS9jaHJvbWEgcmVzaWR1ZS4gVGhlc2Ugc3ludGF4IGVsZW1lbnRzIGFyZSB3cml0dGVuIGFzIGRpcmVjdGVkIGJ5IHRhYmxlCiAqICA3LjMuNSBvZiBoMjY0IHNwZWNpZmljYXRpb24uCiAqCiAqIEBwYXJhbVtpbl0gcHNfZW50X2N0eHQKICogIHBvaW50ZXIgdG8gZW50cm9weSBjb250ZXh0CiAqCiAqIEByZXR1cm5zIGVycm9yIGNvZGUKICoKICogQHJlbWFya3Mgbm9uZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KSUgyNjRFX0VSUk9SX1QgaWgyNjRlX3dyaXRlX2lzbGljZV9tYl9jYWJhYyhlbnRyb3B5X2N0eHRfdCAqcHNfZW50X2N0eHQpCnsKICAgIC8qIGJpdCBzdHJlYW0gcHRyICovCiAgICBiaXRzdHJtX3QgKnBzX2JpdHN0cmVhbSA9IHBzX2VudF9jdHh0LT5wc19iaXRzdHJtOwogICAgLyogQ0FCQUMgY29udGV4dCAqLwogICAgY2FiYWNfY3R4dF90ICpwc19jYWJhY19jdHh0ID0gcHNfZW50X2N0eHQtPnBzX2NhYmFjOwogICAgLyogcGFja2VkIGhlYWRlciBkYXRhICovCiAgICBVV09SRDggKnB1MV9ieXRlID0gcHNfZW50X2N0eHQtPnB2X21iX2hlYWRlcl9kYXRhOwogICAgbWJfaW5mb19jdHh0X3QgKnBzX2N1cnJfY3R4dDsKICAgIFdPUkQzMiBtYl90cG0sIG1iX3R5cGUsIGNicCwgY2hyb21hX2ludHJhX21vZGUsIGx1bWFfaW50cmFfbW9kZTsKICAgIFdPUkQ4IG1iX3FwX2RlbHRhOwogICAgVVdPUkQzMiB1NF9jYnBfbCwgdTRfY2JwX2M7CiAgICBXT1JEMzIgYnl0ZV9jb3VudCA9IDA7CiAgICBXT1JEMzIgYml0c3RyZWFtX3N0YXJ0X29mZnNldCwgYml0c3RyZWFtX2VuZF9vZmZzZXQ7CgogICAgaWYgKChwc19iaXRzdHJlYW0tPnU0X3N0cm1fYnVmX29mZnNldCArIE1JTl9TVFJFQU1fU0laRV9NQikKICAgICAgICAgICAgICAgICAgICA+PSBwc19iaXRzdHJlYW0tPnU0X21heF9zdHJtX3NpemUpCiAgICB7CiAgICAgICAgLyogcmV0dXJuIHdpdGhvdXQgY29ycnVwdGluZyB0aGUgYnVmZmVyIGJleW9uZCBpdHMgc2l6ZSAqLwogICAgICAgIHJldHVybiAoSUgyNjRFX0JJVFNUUkVBTV9CVUZGRVJfT1ZFUkZMT1cpOwogICAgfQogICAgLyogbWIgaGVhZGVyIGluZm8gKi8KICAgIG1iX3RwbSA9ICpwdTFfYnl0ZSsrOwogICAgYnl0ZV9jb3VudCsrOwogICAgY2JwID0gKnB1MV9ieXRlKys7CiAgICBieXRlX2NvdW50Kys7CiAgICBtYl9xcF9kZWx0YSA9ICpwdTFfYnl0ZSsrOwogICAgYnl0ZV9jb3VudCsrOwogICAgLyogbWIgdHlwZSAqLwogICAgbWJfdHlwZSA9IG1iX3RwbSAmIDB4RjsKCiAgICBpaDI2NGVfZ2V0X2NhYmFjX2NvbnRleHQocHNfZW50X2N0eHQsIG1iX3R5cGUpOwogICAgcHNfY3Vycl9jdHh0ID0gcHNfY2FiYWNfY3R4dC0+cHNfY3Vycl9jdHh0X21iX2luZm87CgogICAgLyogU3RhcnRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgaGVhZGVyIGluIGJpdHMgKi8KICAgIGJpdHN0cmVhbV9zdGFydF9vZmZzZXQgPSBHRVRfTlVNX0JJVFMocHNfYml0c3RyZWFtKTsKICAgIHU0X2NicF9jID0gKGNicCA+PiA0KTsKICAgIHU0X2NicF9sID0gKGNicCAmIDB4Rik7CiAgICBpZiAobWJfdHlwZSA9PSBJMTZ4MTYpCiAgICB7CiAgICAgICAgbHVtYV9pbnRyYV9tb2RlID0gKChtYl90cG0gPj4gNCkgJiAzKSArIDEgKyAodTRfY2JwX2MgPDwgMikKICAgICAgICAgICAgICAgICAgICAgICAgKyAodTRfY2JwX2wgPT0gMTUpICogMTI7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgbHVtYV9pbnRyYV9tb2RlID0gMDsKICAgIH0KCiAgICBjaHJvbWFfaW50cmFfbW9kZSA9IChtYl90cG0gPj4gNik7CgogICAgLyogRW5jb2RlIEludHJhIHByZWQgbW9kZSwgTHVtYSAqLwogICAgaWgyNjRlX2NhYmFjX2VuY19pbnRyYV9tYl90eXBlKElTTElDRSwgbHVtYV9pbnRyYV9tb2RlLCBwc19jYWJhY19jdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX1RZUEVfSV9TTElDRSk7CgogICAgaWYgKG1iX3R5cGUgPT0gSTR4NCkKICAgIHsgICAvKiBFbmNvZGUgNHg0IE1CIG1vZGVzICovCiAgICAgICAgaWgyNjRlX2NhYmFjX2VuY180eDRtYl9tb2Rlcyhwc19jYWJhY19jdHh0LCBwdTFfYnl0ZSk7CiAgICAgICAgYnl0ZV9jb3VudCArPSA4OwogICAgfQogICAgLyogRW5jb2RlIGNocm9tYSBtb2RlICovCiAgICBpaDI2NGVfY2FiYWNfZW5jX2Nocm9tYV9wcmVkbW9kZShjaHJvbWFfaW50cmFfbW9kZSwgcHNfY2FiYWNfY3R4dCk7CgogICAgaWYgKG1iX3R5cGUgIT0gSTE2eDE2KQogICAgeyAvKiBFbmNvZGUgTUIgY2JwICovCiAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19jYnAoY2JwLCBwc19jYWJhY19jdHh0KTsKICAgIH0KCiAgICBpZiAoKGNicCA+IDApIHx8IChtYl90eXBlID09IEkxNngxNikpCiAgICB7CiAgICAgICAgLyogRW5jb2RlIG1iX3FwX2RlbHRhICovCiAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9xcF9kZWx0YShtYl9xcF9kZWx0YSwgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgLyogRW5kaW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIGhlYWRlciBpbiBiaXRzICovCiAgICAgICAgYml0c3RyZWFtX2VuZF9vZmZzZXQgPSBHRVRfTlVNX0JJVFMocHNfYml0c3RyZWFtKTsKICAgICAgICBwc19lbnRfY3R4dC0+dTRfaGVhZGVyX2JpdHNbMF0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgLSBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0OwogICAgICAgIC8qIFN0YXJ0aW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIHJlc2lkdWUgKi8KICAgICAgICBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0ID0gYml0c3RyZWFtX2VuZF9vZmZzZXQ7CiAgICAgICAgaWYgKG1iX3R5cGUgPT0gSTE2eDE2KQogICAgICAgIHsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9tYl90eXBlID0gQ0FCX0kxNngxNjsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9jYnAgPSBjYnA7CiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfcmVzaWR1ZV9sdW1hX2RjKHBzX2VudF9jdHh0KTsKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9yZXNpZHVlKHBzX2VudF9jdHh0LCBjYnAsIExVTUFfQUNfQ1RYQ0FUKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9jYnAgPSBjYnA7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IEk0eDQ7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9JNHg0OwogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX3Jlc2lkdWUocHNfZW50X2N0eHQsIGNicCwgTFVNQV80WDRfQ1RYQ0FUKTsKICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeXV2X2RjX2NzYnBbMF0gJj0gMHg2OwogICAgICAgICAgICBwc19jYWJhY19jdHh0LT5wc19jdXJyX2N0eHRfbWJfaW5mby0+dTFfeXV2X2RjX2NzYnAgJj0gMHg2OwogICAgICAgIH0KICAgICAgICAvKiBFbmRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgcmVzaWRlIGluIGJpdHMgKi8KICAgICAgICBiaXRzdHJlYW1fZW5kX29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgIHBzX2VudF9jdHh0LT51NF9yZXNpZHVlX2JpdHNbMF0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgLSBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0OwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2FjX2NzYnAgPSAwOwogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2RjX2NzYnAgPSAwOwogICAgICAgICoocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfdXZfYWNfY3NicCkgPSAwOwogICAgICAgICoocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeV9hY19jc2JwKSA9IDA7CiAgICAgICAgKihwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95dXZfZGNfY3NicCkgPSAwOwogICAgICAgIC8qIEVuZGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciBoZWFkZXIgaW4gYml0cyAqLwogICAgICAgIGJpdHN0cmVhbV9lbmRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CiAgICAgICAgcHNfZW50X2N0eHQtPnU0X2hlYWRlcl9iaXRzWzBdICs9IGJpdHN0cmVhbV9lbmRfb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKCiAgICAgICAgLyogQ29tcHV0aW5nIHRoZSBudW1iZXIgb2YgdXNlZCB1c2VkIGZvciBlbmNvZGluZyB0aGUgTUIgc3ludGF4ICovCiAgICB9CiAgICBtZW1zZXQocHNfY3Vycl9jdHh0LT51MV9tdiwgMCwgMTYpOwogICAgbWVtc2V0KHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X212X2N0eHRfaW5jLCAwLCAxNik7CiAgICBwc19jYWJhY19jdHh0LT5wc19jdXJyX2N0eHRfbWJfaW5mby0+dTFfY2JwID0gY2JwOwogICAgcHNfZW50X2N0eHQtPnB2X21iX2hlYWRlcl9kYXRhID0gKChXT1JEOCAqKXBzX2VudF9jdHh0LT5wdl9tYl9oZWFkZXJfZGF0YSkgKyBieXRlX2NvdW50OwogICAgaWYgKG1iX3R5cGUgPT0gSTE2eDE2KQogICAgewogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9JMTZ4MTY7CgogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9JNHg0OwoKICAgIH0KICAgIHJldHVybiBJSDI2NEVfU1VDQ0VTUzsKfQoKLyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEBicmllZgogKiAgVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgQ0FCQUMgY29kZWQgYml0IHN0cmVhbSBmb3IgSW50ZXIgc2xpY2VzCiAqCiAqIEBkZXNjcmlwdGlvbgogKiAgVGhlIG1iIHN5bnRheCBsYXllciBmb3IgaW50ZXIgc2xpY2VzIGNvbnN0aXR1dGVzIGx1bWEgbWIgbW9kZSwgbWIgcXAgZGVsdGEsIGNvZGVkIGJsb2NrIHBhdHRlcm4sIGNocm9tYSBtYiBtb2RlIGFuZAogKiAgbHVtYS9jaHJvbWEgcmVzaWR1ZS4gVGhlc2Ugc3ludGF4IGVsZW1lbnRzIGFyZSB3cml0dGVuIGFzIGRpcmVjdGVkIGJ5IHRhYmxlCiAqICA3LjMuNSBvZiBoMjY0IHNwZWNpZmljYXRpb24KICoKICogQHBhcmFtW2luXSBwc19lbnRfY3R4dAogKiAgcG9pbnRlciB0byBlbnRyb3B5IGNvbnRleHQKICoKICogQHJldHVybnMgZXJyb3IgY29kZQogKgogKiBAcmVtYXJrcyBub25lCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwpJSDI2NEVfRVJST1JfVCBpaDI2NGVfd3JpdGVfcHNsaWNlX21iX2NhYmFjKGVudHJvcHlfY3R4dF90ICpwc19lbnRfY3R4dCkKewogICAgLyogYml0IHN0cmVhbSBwdHIgKi8KICAgIGJpdHN0cm1fdCAqcHNfYml0c3RyZWFtID0gcHNfZW50X2N0eHQtPnBzX2JpdHN0cm07CiAgICAvKiBDQUJBQyBjb250ZXh0ICovCiAgICBjYWJhY19jdHh0X3QgKnBzX2NhYmFjX2N0eHQgPSBwc19lbnRfY3R4dC0+cHNfY2FiYWM7CgogICAgbWJfaW5mb19jdHh0X3QgKnBzX2N1cnJfY3R4dDsKCiAgICBXT1JEMzIgYml0c3RyZWFtX3N0YXJ0X29mZnNldCwgYml0c3RyZWFtX2VuZF9vZmZzZXQ7CiAgICBXT1JEMzIgbWJfdHBtLCBtYl90eXBlLCBjYnAsIGNocm9tYV9pbnRyYV9tb2RlLCBsdW1hX2ludHJhX21vZGU7CiAgICBXT1JEOCBtYl9xcF9kZWx0YTsKICAgIFVXT1JEMzIgdTRfY2JwX2wsIHU0X2NicF9jOwogICAgV09SRDMyIGJ5dGVfY291bnQgPSAwOwogICAgVVdPUkQ4ICpwdTFfYnl0ZSA9IHBzX2VudF9jdHh0LT5wdl9tYl9oZWFkZXJfZGF0YTsKCiAgICBpZiAoKHBzX2JpdHN0cmVhbS0+dTRfc3RybV9idWZfb2Zmc2V0ICsgTUlOX1NUUkVBTV9TSVpFX01CKQogICAgICAgICAgICAgICAgICAgID49IHBzX2JpdHN0cmVhbS0+dTRfbWF4X3N0cm1fc2l6ZSkKICAgIHsKICAgICAgICAvKiByZXR1cm4gd2l0aG91dCBjb3JydXB0aW5nIHRoZSBidWZmZXIgYmV5b25kIGl0cyBzaXplICovCiAgICAgICAgcmV0dXJuIChJSDI2NEVfQklUU1RSRUFNX0JVRkZFUl9PVkVSRkxPVyk7CiAgICB9CiAgICAvKiBtYiBoZWFkZXIgaW5mbyAqLwogICAgbWJfdHBtID0gKnB1MV9ieXRlKys7CiAgICBieXRlX2NvdW50Kys7CgogICAgLyogbWIgdHlwZSAqLwogICAgbWJfdHlwZSA9IG1iX3RwbSAmIDB4RjsKICAgIC8qIENBQkFDIGNvbnRleHRzIGZvciB0aGUgTUIgKi8KICAgIGloMjY0ZV9nZXRfY2FiYWNfY29udGV4dChwc19lbnRfY3R4dCwgbWJfdHlwZSk7CiAgICBwc19jdXJyX2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc19jdXJyX2N0eHRfbWJfaW5mbzsKCiAgICAvKiBpZiBJbnRyYSBNQiAqLwogICAgaWYgKG1iX3R5cGUgPT0gSTE2eDE2IHx8IG1iX3R5cGUgPT0gSTR4NCkKICAgIHsKICAgICAgICBjYnAgPSAqcHUxX2J5dGUrKzsKICAgICAgICBieXRlX2NvdW50Kys7CiAgICAgICAgbWJfcXBfZGVsdGEgPSAqcHUxX2J5dGUrKzsKICAgICAgICBieXRlX2NvdW50Kys7CgogICAgICAgIC8qIFN0YXJ0aW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIGhlYWRlciBpbiBiaXRzICovCiAgICAgICAgYml0c3RyZWFtX3N0YXJ0X29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwoKICAgICAgICAvKiBFbmNvZGUgbWJfc2tpcF9mbGFnICovCiAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9za2lwKDAsIHBzX2NhYmFjX2N0eHQsIE1CX1NLSVBfRkxBR19QX1NMSUNFKTsKICAgICAgICB1NF9jYnBfYyA9IChjYnAgPj4gNCk7CiAgICAgICAgdTRfY2JwX2wgPSAoY2JwICYgMHhGKTsKICAgICAgICBpZiAobWJfdHlwZSA9PSBJMTZ4MTYpCiAgICAgICAgewogICAgICAgICAgICBsdW1hX2ludHJhX21vZGUgPSAoKG1iX3RwbSA+PiA0KSAmIDMpICsgMSArICh1NF9jYnBfYyA8PCAyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAodTRfY2JwX2wgPT0gMTUpICogMTI7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGx1bWFfaW50cmFfbW9kZSA9IDA7CiAgICAgICAgfQogICAgICAgIC8qIEVuY29kZSBpbnRyYSBtYiB0eXBlICovCiAgICAgICAgewogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX2Jpbihwc19jYWJhY19jdHh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNQl9UWVBFX1BfU0xJQ0UpOwoKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19pbnRyYV9tYl90eXBlKFBTTElDRSwgKFVXT1JEOCkgbHVtYV9pbnRyYV9tb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCwgTUJfVFlQRV9QX1NMSUNFKTsKICAgICAgICB9CgogICAgICAgIGlmIChtYl90eXBlID09IEk0eDQpCiAgICAgICAgeyAgIC8qIEludHJhIDR4NCBtb2RlcyAqLwogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jXzR4NG1iX21vZGVzKHBzX2NhYmFjX2N0eHQsIHB1MV9ieXRlKTsKICAgICAgICAgICAgYnl0ZV9jb3VudCArPSA4OwogICAgICAgIH0KICAgICAgICBjaHJvbWFfaW50cmFfbW9kZSA9IChtYl90cG0gPj4gNik7CgogICAgICAgIGloMjY0ZV9jYWJhY19lbmNfY2hyb21hX3ByZWRtb2RlKGNocm9tYV9pbnRyYV9tb2RlLCBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgaWYgKG1iX3R5cGUgIT0gSTE2eDE2KQogICAgICAgIHsKICAgICAgICAgICAgLyogZW5jb2RlIENCUCAqLwogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX2NicChjYnAsIHBzX2NhYmFjX2N0eHQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKChjYnAgPiAwKSB8fCAobWJfdHlwZSA9PSBJMTZ4MTYpKQogICAgICAgIHsKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9xcF9kZWx0YShtYl9xcF9kZWx0YSwgcHNfY2FiYWNfY3R4dCk7CgogICAgICAgICAgICAvKiBFbmRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgaGVhZGVyIGluIGJpdHMgKi8KICAgICAgICAgICAgYml0c3RyZWFtX2VuZF9vZmZzZXQgPSBHRVRfTlVNX0JJVFMocHNfYml0c3RyZWFtKTsKICAgICAgICAgICAgcHNfZW50X2N0eHQtPnU0X2hlYWRlcl9iaXRzWzBdICs9IGJpdHN0cmVhbV9lbmRfb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGJpdHN0cmVhbV9zdGFydF9vZmZzZXQ7CiAgICAgICAgICAgIC8qIFN0YXJ0aW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIHJlc2lkdWUgKi8KICAgICAgICAgICAgYml0c3RyZWFtX3N0YXJ0X29mZnNldCA9IGJpdHN0cmVhbV9lbmRfb2Zmc2V0OwoKICAgICAgICAgICAgLyogRW5jb2RpbmcgUmVzaWR1ZSAqLwogICAgICAgICAgICBpZiAobWJfdHlwZSA9PSBJMTZ4MTYpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9JMTZ4MTY7CiAgICAgICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX2NicCA9IChVV09SRDgpIGNicDsKICAgICAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfcmVzaWR1ZV9sdW1hX2RjKHBzX2VudF9jdHh0KTsKICAgICAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfcmVzaWR1ZShwc19lbnRfY3R4dCwgY2JwLCBMVU1BX0FDX0NUWENBVCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX2NicCA9IChVV09SRDgpIGNicDsKICAgICAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IEk0eDQ7CiAgICAgICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX21iX3R5cGUgPSBDQUJfSTR4NDsKICAgICAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNvZGVfcmVzaWR1ZShwc19lbnRfY3R4dCwgY2JwLCBMVU1BXzRYNF9DVFhDQVQpOwogICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeXV2X2RjX2NzYnBbMF0gJj0gMHg2OwogICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHNfY3Vycl9jdHh0X21iX2luZm8tPnUxX3l1dl9kY19jc2JwICY9IDB4NjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogRW5kaW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIHJlc2lkZSBpbiBiaXRzICovCiAgICAgICAgICAgIGJpdHN0cmVhbV9lbmRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CiAgICAgICAgICAgIHBzX2VudF9jdHh0LT51NF9yZXNpZHVlX2JpdHNbMF0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfYWNfY3NicCA9IDA7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2RjX2NzYnAgPSAwOwogICAgICAgICAgICAqKHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3V2X2FjX2NzYnApID0gMDsKICAgICAgICAgICAgKihwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95X2FjX2NzYnApID0gMDsKICAgICAgICAgICAgKihwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95dXZfZGNfY3NicCkgPSAwOwogICAgICAgICAgICAvKiBFbmRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgaGVhZGVyIGluIGJpdHMgKi8KICAgICAgICAgICAgYml0c3RyZWFtX2VuZF9vZmZzZXQgPSBHRVRfTlVNX0JJVFMocHNfYml0c3RyZWFtKTsKICAgICAgICAgICAgcHNfZW50X2N0eHQtPnU0X2hlYWRlcl9iaXRzWzBdICs9IGJpdHN0cmVhbV9lbmRfb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGJpdHN0cmVhbV9zdGFydF9vZmZzZXQ7CiAgICAgICAgfQoKICAgICAgICBtZW1zZXQocHNfY3Vycl9jdHh0LT51MV9tdiwgMCwgMTYpOwogICAgICAgIG1lbXNldChwc19jYWJhY19jdHh0LT5wdTFfbGVmdF9tdl9jdHh0X2luYywgMCwgMTYpOwogICAgICAgIHBzX2NhYmFjX2N0eHQtPnBzX2N1cnJfY3R4dF9tYl9pbmZvLT51MV9jYnAgPSAoVVdPUkQ4KSBjYnA7CgogICAgICAgIGlmIChtYl90eXBlID09IEkxNngxNikKICAgICAgICB7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9JMTZ4MTY7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9JNHg0OwogICAgICAgIH0KCiAgICAgICAgcHNfZW50X2N0eHQtPnB2X21iX2hlYWRlcl9kYXRhID0gKChXT1JEOCAqKXBzX2VudF9jdHh0LT5wdl9tYl9oZWFkZXJfZGF0YSkgKyBieXRlX2NvdW50OwoKICAgICAgICByZXR1cm4gSUgyNjRFX1NVQ0NFU1M7CiAgICB9CiAgICBlbHNlIC8qIEludGVyIE1CICovCiAgICB7CiAgICAgICAgLyogU3RhcnRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgaGVhZGVyIGluIGJpdHMgKi8KICAgICAgICBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CiAgICAgICAgLyogRW5jb2RpbmcgUDE2eDE2ICovCiAgICAgICAgaWYgKG1iX3R5cGUgIT0gUFNLSVApCiAgICAgICAgewogICAgICAgICAgICBjYnAgPSAqcHUxX2J5dGUrKzsKICAgICAgICAgICAgYnl0ZV9jb3VudCsrOwogICAgICAgICAgICBtYl9xcF9kZWx0YSA9ICpwdTFfYnl0ZSsrOwogICAgICAgICAgICBieXRlX2NvdW50Kys7CgogICAgICAgICAgICAvKiBFbmNvZGluZyBtYl9za2lwICovCiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfbWJfc2tpcCgwLCBwc19jYWJhY19jdHh0LCBNQl9TS0lQX0ZMQUdfUF9TTElDRSk7CgogICAgICAgICAgICAvKiBFbmNvZGluZyBtYl90eXBlIGFzIFAxNngxNiAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBVV09SRDMyIHU0X2N0eF9pbmNfcDsKICAgICAgICAgICAgICAgIHU0X2N0eF9pbmNfcCA9ICgweDAxMCArICgoMikgPDwgOCkpOwoKICAgICAgICAgICAgICAgIGloMjY0ZV9lbmNvZGVfZGVjaXNpb25fYmlucygwLCAzLCB1NF9jdHhfaW5jX3AsIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwc19jYWJhY19jdHh0LT5hdTFfY2FiYWNfY3R4dF90YWJsZVtNQl9UWVBFX1BfU0xJQ0VdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX21iX3R5cGUgPSBDQUJfUDsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgV09SRDE2ICpwaTJfbXZfcHRyID0gKFdPUkQxNiAqKSBwdTFfYnl0ZTsKICAgICAgICAgICAgICAgIGJ5dGVfY291bnQgKz0gNDsKICAgICAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IChwc19jdXJyX2N0eHQtPnUxX21iX3R5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENBQl9OT05fQkQxNngxNik7CiAgICAgICAgICAgICAgICAgLyogRW5jb2RpbmcgbW90aW9uIHZlY3RvciBmb3IgUDE2eDE2ICovCiAgICAgICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX212ZHNfcDE2eDE2KHBzX2NhYmFjX2N0eHQsIHBpMl9tdl9wdHIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIEVuY29kZSBDQlAgKi8KICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19jYnAoY2JwLCBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgICAgIGlmIChjYnApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIGVuY29kZSBtYl9xcF9kZWx0YSAqLwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9xcF9kZWx0YShtYl9xcF9kZWx0YSwgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIEVuZGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciBoZWFkZXIgaW4gYml0cyAqLwogICAgICAgICAgICBiaXRzdHJlYW1fZW5kX29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgICAgICBwc19lbnRfY3R4dC0+dTRfaGVhZGVyX2JpdHNbMV0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKICAgICAgICAgICAgLyogU3RhcnRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgcmVzaWR1ZSAqLwogICAgICAgICAgICBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0ID0gYml0c3RyZWFtX2VuZF9vZmZzZXQ7CgogICAgICAgIH0KICAgICAgICBlbHNlLyogTUIgPSBQU0tJUCAqLwogICAgICAgIHsKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9za2lwKDEsIHBzX2NhYmFjX2N0eHQsIE1CX1NLSVBfRkxBR19QX1NMSUNFKTsKCiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9QX1NLSVA7CiAgICAgICAgICAgICgqcHNfZW50X2N0eHQtPnBpNF9tYl9za2lwX3J1bikrKzsKCiAgICAgICAgICAgIG1lbXNldChwc19jdXJyX2N0eHQtPnUxX212LCAwLCAxNik7CiAgICAgICAgICAgIG1lbXNldChwc19jYWJhY19jdHh0LT5wdTFfbGVmdF9tdl9jdHh0X2luYywgMCwgMTYpOwogICAgICAgICAgICBjYnAgPSAwOwoKICAgICAgICAgICAgLyogRW5kaW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIGhlYWRlciBpbiBiaXRzICovCiAgICAgICAgICAgIGJpdHN0cmVhbV9lbmRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CiAgICAgICAgICAgIHBzX2VudF9jdHh0LT51NF9oZWFkZXJfYml0c1sxXSArPSBiaXRzdHJlYW1fZW5kX29mZnNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0OwogICAgICAgICAgICAvKiBTdGFydGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciByZXNpZHVlICovCgogICAgICAgIH0KCiAgICAgICAgaWYgKGNicCA+IDApCiAgICAgICAgewogICAgICAgICAgICAvKiBFbmNvZGUgcmVzaWR1ZSAqLwogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jb2RlX3Jlc2lkdWUocHNfZW50X2N0eHQsIGNicCwgTFVNQV80WDRfQ1RYQ0FUKTsKICAgICAgICAgICAgLyogRW5kaW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIHJlc2lkZSBpbiBiaXRzICovCiAgICAgICAgICAgIGJpdHN0cmVhbV9lbmRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CiAgICAgICAgICAgIHBzX2VudF9jdHh0LT51NF9yZXNpZHVlX2JpdHNbMV0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKCiAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3l1dl9kY19jc2JwWzBdICY9IDB4NjsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfZGNfY3NicCAmPSAweDY7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2FjX2NzYnAgPSAwOwogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX3l1dl9kY19jc2JwID0gMDsKICAgICAgICAgICAgKihwc19jYWJhY19jdHh0LT5wdTFfbGVmdF91dl9hY19jc2JwKSA9IDA7CiAgICAgICAgICAgICoocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeV9hY19jc2JwKSA9IDA7CiAgICAgICAgICAgICoocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfeXV2X2RjX2NzYnApID0gMDsKICAgICAgICB9CiAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9pbnRyYXByZWRfY2hyb21hX21vZGUgPSAwOwogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfY2JwID0gY2JwOwogICAgICAgIHBzX2VudF9jdHh0LT5wdl9tYl9oZWFkZXJfZGF0YSA9ICgoV09SRDggKilwc19lbnRfY3R4dC0+cHZfbWJfaGVhZGVyX2RhdGEpICsgYnl0ZV9jb3VudDsKICAgICAgICByZXR1cm4gSUgyNjRFX1NVQ0NFU1M7CiAgICB9Cn0KCgovKiAhIDwgVGFibGUgOS0zNyCWIEJpbmFyaXphdGlvbiBmb3IgbWFjcm9ibG9jayB0eXBlcyBpbiBCIHNsaWNlcyAgaW4gSVRVX1RfSDI2NC0yMDE0MDIKICogQml0cyAwLTcgOiBiaW5hcmlzZWQgdmFsdWUKICogQml0cyA4LTE1OiBsZW5ndGggb2YgYmluYXJ5IHNlcXVlbmNlICovCgoKc3RhdGljIGNvbnN0IFVXT1JEMzIgdTRfYl9tYl90eXBlWzI3XSA9IHsgMHgwMTAwLCAweDAzMDEsIDB4MDMwNSwgMHgwNjAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjMsIDB4MDYxMywgMHgwNjMzLCAweDA2MGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyYiwgMHgwNjFiLCAweDA2M2IsIDB4MDYxZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzA3LCAweDA3NDcsIDB4MDcyNywgMHgwNzY3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3MTcsIDB4MDc1NywgMHgwNzM3LCAweDA3NzcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcwZiwgMHgwNzRmLCAweDA2M2YgfTsKLyogQ3R4SW5jIGZvciBtYiB0eXBlcyBpbiBCIHNsaWNlcyAqLwpzdGF0aWMgY29uc3QgVVdPUkQzMiB1aV9iX21iX3R5cGVfY3R4X2luY1syN10gPSB7IDB4MDAsIDB4MDUzMCwgMHgwNTMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTQzMCwgMHgwNTU1NDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTQzMCwgMHgwNTU1NDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTQzMCwgMHgwNTU1NDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTQzMCwgMHgwNTU1NDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTQzMCwgMHgwNTU1NTQzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1NTU1NDMwLCAweDA1NTU1NDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTU0MzAsIDB4MDU1NTU0MzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTU1NTQzMCwgMHgwNTU1NTQzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1NTU1NDMwLCAweDA1NTU1NDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU1NTU0MzAsIDB4MDU1NTQzMCB9OwoKLyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEBicmllZgogKiAgVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgQ0FCQUMgY29kZWQgYml0IHN0cmVhbSBmb3IgQiBzbGljZXMKICoKICogQGRlc2NyaXB0aW9uCiAqICBUaGUgbWIgc3ludGF4IGxheWVyIGZvciBpbnRlciBzbGljZXMgY29uc3RpdHV0ZXMgbHVtYSBtYiBtb2RlLAogKiAgbWIgcXAgZGVsdGEsIGNvZGVkIGJsb2NrIHBhdHRlcm4sIGNocm9tYSBtYiBtb2RlIGFuZAogKiAgbHVtYS9jaHJvbWEgcmVzaWR1ZS4gVGhlc2Ugc3ludGF4IGVsZW1lbnRzIGFyZSB3cml0dGVuIGFzIGRpcmVjdGVkIGJ5IHRhYmxlCiAqICA3LjMuNSBvZiBoMjY0IHNwZWNpZmljYXRpb24KICoKICogQHBhcmFtW2luXSBwc19lbnRfY3R4dAogKiAgcG9pbnRlciB0byBlbnRyb3B5IGNvbnRleHQKICoKICogQHJldHVybnMgZXJyb3IgY29kZQogKgogKiBAcmVtYXJrcyBub25lCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwpJSDI2NEVfRVJST1JfVCBpaDI2NGVfd3JpdGVfYnNsaWNlX21iX2NhYmFjKGVudHJvcHlfY3R4dF90ICpwc19lbnRfY3R4dCkKewogICAgLyogYml0IHN0cmVhbSBwdHIgKi8KICAgIGJpdHN0cm1fdCAqcHNfYml0c3RyZWFtID0gcHNfZW50X2N0eHQtPnBzX2JpdHN0cm07CiAgICAvKiBDQUJBQyBjb250ZXh0ICovCiAgICBjYWJhY19jdHh0X3QgKnBzX2NhYmFjX2N0eHQgPSBwc19lbnRfY3R4dC0+cHNfY2FiYWM7CgogICAgbWJfaW5mb19jdHh0X3QgKnBzX2N1cnJfY3R4dDsKCiAgICBXT1JEMzIgYml0c3RyZWFtX3N0YXJ0X29mZnNldCwgYml0c3RyZWFtX2VuZF9vZmZzZXQ7CiAgICBXT1JEMzIgbWJfdHBtLCBtYl90eXBlLCBjYnAsIGNocm9tYV9pbnRyYV9tb2RlLCBsdW1hX2ludHJhX21vZGU7CiAgICBXT1JEOCBtYl9xcF9kZWx0YTsKICAgIFVXT1JEMzIgdTRfY2JwX2wsIHU0X2NicF9jOwogICAgV09SRDMyIGJ5dGVfY291bnQgPSAwOwogICAgVVdPUkQ4ICpwdTFfYnl0ZSA9IHBzX2VudF9jdHh0LT5wdl9tYl9oZWFkZXJfZGF0YTsKCiAgICBpZiAoKHBzX2JpdHN0cmVhbS0+dTRfc3RybV9idWZfb2Zmc2V0ICsgTUlOX1NUUkVBTV9TSVpFX01CKQogICAgICAgICAgICAgICAgICAgID49IHBzX2JpdHN0cmVhbS0+dTRfbWF4X3N0cm1fc2l6ZSkKICAgIHsKICAgICAgICAvKiByZXR1cm4gd2l0aG91dCBjb3JydXB0aW5nIHRoZSBidWZmZXIgYmV5b25kIGl0cyBzaXplICovCiAgICAgICAgcmV0dXJuIChJSDI2NEVfQklUU1RSRUFNX0JVRkZFUl9PVkVSRkxPVyk7CiAgICB9CiAgICAvKiBtYiBoZWFkZXIgaW5mbyAqLwogICAgbWJfdHBtID0gKnB1MV9ieXRlKys7CiAgICBieXRlX2NvdW50Kys7CgogICAgLyogbWIgdHlwZSAqLwogICAgbWJfdHlwZSA9IG1iX3RwbSAmIDB4RjsKICAgIC8qIENBQkFDIGNvbnRleHRzIGZvciB0aGUgTUIgKi8KICAgIGloMjY0ZV9nZXRfY2FiYWNfY29udGV4dChwc19lbnRfY3R4dCwgbWJfdHlwZSk7CiAgICBwc19jdXJyX2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc19jdXJyX2N0eHRfbWJfaW5mbzsKCiAgICAvKiBpZiBJbnRyYSBNQiAqLwogICAgaWYgKG1iX3R5cGUgPT0gSTE2eDE2IHx8IG1iX3R5cGUgPT0gSTR4NCkKICAgIHsKICAgICAgICBjYnAgPSAqcHUxX2J5dGUrKzsKICAgICAgICBieXRlX2NvdW50Kys7CiAgICAgICAgbWJfcXBfZGVsdGEgPSAqcHUxX2J5dGUrKzsKICAgICAgICBieXRlX2NvdW50Kys7CgogICAgICAgIC8qIFN0YXJ0aW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIGhlYWRlciBpbiBiaXRzICovCiAgICAgICAgYml0c3RyZWFtX3N0YXJ0X29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwoKICAgICAgICAvKiBFbmNvZGUgbWJfc2tpcF9mbGFnICovCiAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9za2lwKDAsIHBzX2NhYmFjX2N0eHQsIE1CX1NLSVBfRkxBR19CX1NMSUNFKTsKICAgICAgICB1NF9jYnBfYyA9IChjYnAgPj4gNCk7CiAgICAgICAgdTRfY2JwX2wgPSAoY2JwICYgMHhGKTsKICAgICAgICBpZiAobWJfdHlwZSA9PSBJMTZ4MTYpCiAgICAgICAgewogICAgICAgICAgICBsdW1hX2ludHJhX21vZGUgPSAoKG1iX3RwbSA+PiA0KSAmIDMpICsgMSArICh1NF9jYnBfYyA8PCAyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAodTRfY2JwX2wgPT0gMTUpICogMTI7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGx1bWFfaW50cmFfbW9kZSA9IDA7CiAgICAgICAgfQogICAgICAgIC8qIEVuY29kZSBpbnRyYSBtYiB0eXBlICovCiAgICAgICAgewogICAgICAgICAgICBtYl9pbmZvX2N0eHRfdCAqcHNfbGVmdF9jdHh0ID0gcHNfY2FiYWNfY3R4dC0+cHNfbGVmdF9jdHh0X21iX2luZm87CiAgICAgICAgICAgIG1iX2luZm9fY3R4dF90ICpwc190b3BfY3R4dCA9IHBzX2NhYmFjX2N0eHQtPnBzX3RvcF9jdHh0X21iX2luZm87CiAgICAgICAgICAgIFVXT1JEMzIgdTRfY3R4X2luYyA9IDA7CgogICAgICAgICAgICBpZiAocHNfbGVmdF9jdHh0ICE9IHBzX2NhYmFjX2N0eHQtPnBzX2RlZl9jdHh0X21iX2luZm8pCiAgICAgICAgICAgICAgICB1NF9jdHhfaW5jICs9ICgocHNfbGVmdF9jdHh0LT51MV9tYl90eXBlICYgQ0FCX0JEMTZ4MTZfTUFTSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBDQUJfQkQxNngxNikgPyAxIDogMDsKICAgICAgICAgICAgaWYgKHBzX3RvcF9jdHh0ICE9IHBzX2NhYmFjX2N0eHQtPnBzX2RlZl9jdHh0X21iX2luZm8pCiAgICAgICAgICAgICAgICB1NF9jdHhfaW5jICs9ICgocHNfdG9wX2N0eHQtPnUxX21iX3R5cGUgJiBDQUJfQkQxNngxNl9NQVNLKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IENBQl9CRDE2eDE2KSA/IDEgOiAwOwoKICAgICAgICAgICAgLyogSW50cmEgUHJlZml4IE9ubHkgIjExMTEwMSIgKi8KICAgICAgICAgICAgdTRfY3R4X2luYyA9ICh1NF9jdHhfaW5jIHwgMHgwNTU1NTQzMCk7CiAgICAgICAgICAgIGloMjY0ZV9lbmNvZGVfZGVjaXNpb25fYmlucygweDJmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+YXUxX2NhYmFjX2N0eHRfdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1CX1RZUEVfQl9TTElDRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19pbnRyYV9tYl90eXBlKEJTTElDRSwgKFVXT1JEOCkgbHVtYV9pbnRyYV9tb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCwgTUJfVFlQRV9CX1NMSUNFKTsKCiAgICAgICAgfQoKICAgICAgICBpZiAobWJfdHlwZSA9PSBJNHg0KQogICAgICAgIHsgLyogSW50cmEgNHg0IG1vZGVzICovCiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfNHg0bWJfbW9kZXMocHNfY2FiYWNfY3R4dCwgcHUxX2J5dGUpOwogICAgICAgICAgICBieXRlX2NvdW50ICs9IDg7CiAgICAgICAgfQogICAgICAgIGNocm9tYV9pbnRyYV9tb2RlID0gKG1iX3RwbSA+PiA2KTsKCiAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19jaHJvbWFfcHJlZG1vZGUoY2hyb21hX2ludHJhX21vZGUsIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICBpZiAobWJfdHlwZSAhPSBJMTZ4MTYpCiAgICAgICAgewogICAgICAgICAgICAvKiBlbmNvZGUgQ0JQICovCiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfY2JwKGNicCwgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoKGNicCA+IDApIHx8IChtYl90eXBlID09IEkxNngxNikpCiAgICAgICAgewogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX21iX3FwX2RlbHRhKG1iX3FwX2RlbHRhLCBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgICAgIC8qIEVuZGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciBoZWFkZXIgaW4gYml0cyAqLwogICAgICAgICAgICBiaXRzdHJlYW1fZW5kX29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgICAgICBwc19lbnRfY3R4dC0+dTRfaGVhZGVyX2JpdHNbMF0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKICAgICAgICAgICAgLyogU3RhcnRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgcmVzaWR1ZSAqLwogICAgICAgICAgICBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0ID0gYml0c3RyZWFtX2VuZF9vZmZzZXQ7CgogICAgICAgICAgICAvKiBFbmNvZGluZyBSZXNpZHVlICovCiAgICAgICAgICAgIGlmIChtYl90eXBlID09IEkxNngxNikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9tYl90eXBlID0gQ0FCX0kxNngxNjsKICAgICAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfY2JwID0gKFVXT1JEOCkgY2JwOwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9yZXNpZHVlX2x1bWFfZGMocHNfZW50X2N0eHQpOwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9yZXNpZHVlKHBzX2VudF9jdHh0LCBjYnAsIExVTUFfQUNfQ1RYQ0FUKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfY2JwID0gKFVXT1JEOCkgY2JwOwogICAgICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9tYl90eXBlID0gSTR4NDsKICAgICAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9JNHg0OwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9yZXNpZHVlKHBzX2VudF9jdHh0LCBjYnAsIExVTUFfNFg0X0NUWENBVCk7CiAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95dXZfZGNfY3NicFswXSAmPSAweDY7CiAgICAgICAgICAgICAgICBwc19jYWJhY19jdHh0LT5wc19jdXJyX2N0eHRfbWJfaW5mby0+dTFfeXV2X2RjX2NzYnAgJj0gMHg2OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBFbmRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgcmVzaWRlIGluIGJpdHMgKi8KICAgICAgICAgICAgYml0c3RyZWFtX2VuZF9vZmZzZXQgPSBHRVRfTlVNX0JJVFMocHNfYml0c3RyZWFtKTsKICAgICAgICAgICAgcHNfZW50X2N0eHQtPnU0X3Jlc2lkdWVfYml0c1swXSArPSBiaXRzdHJlYW1fZW5kX29mZnNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0OwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX3l1dl9hY19jc2JwID0gMDsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfZGNfY3NicCA9IDA7CiAgICAgICAgICAgICoocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfdXZfYWNfY3NicCkgPSAwOwogICAgICAgICAgICAqKHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3lfYWNfY3NicCkgPSAwOwogICAgICAgICAgICAqKHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3l1dl9kY19jc2JwKSA9IDA7CiAgICAgICAgICAgIC8qIEVuZGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciBoZWFkZXIgaW4gYml0cyAqLwogICAgICAgICAgICBiaXRzdHJlYW1fZW5kX29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgICAgICBwc19lbnRfY3R4dC0+dTRfaGVhZGVyX2JpdHNbMF0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKICAgICAgICB9CgogICAgICAgIG1lbXNldChwc19jdXJyX2N0eHQtPnUxX212LCAwLCAxNik7CiAgICAgICAgbWVtc2V0KHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X212X2N0eHRfaW5jLCAwLCAxNik7CiAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHNfY3Vycl9jdHh0X21iX2luZm8tPnUxX2NicCA9IChVV09SRDgpIGNicDsKCiAgICAgICAgaWYgKG1iX3R5cGUgPT0gSTE2eDE2KQogICAgICAgIHsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9tYl90eXBlID0gQ0FCX0kxNngxNjsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9tYl90eXBlID0gQ0FCX0k0eDQ7CiAgICAgICAgfQoKICAgICAgICBwc19lbnRfY3R4dC0+cHZfbWJfaGVhZGVyX2RhdGEgPSAoKFdPUkQ4ICopcHNfZW50X2N0eHQtPnB2X21iX2hlYWRlcl9kYXRhKSArIGJ5dGVfY291bnQ7CgogICAgICAgIHJldHVybiBJSDI2NEVfU1VDQ0VTUzsKICAgIH0KCiAgICBlbHNlIC8qIEludGVyIE1CICovCiAgICB7CiAgICAgICAgLyogU3RhcnRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgaGVhZGVyIGluIGJpdHMgKi8KICAgICAgICBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CiAgICAgICAgLyogRW5jb2RpbmcgQl9EaXJlY3RfMTZ4MTYgKi8KICAgICAgICBpZiAobWJfdHlwZSA9PSBCRElSRUNUKQogICAgICAgIHsKICAgICAgICAgICAgY2JwID0gKnB1MV9ieXRlKys7CiAgICAgICAgICAgIGJ5dGVfY291bnQrKzsKICAgICAgICAgICAgbWJfcXBfZGVsdGEgPSAqcHUxX2J5dGUrKzsKICAgICAgICAgICAgYnl0ZV9jb3VudCsrOwoKICAgICAgICAgICAgLyogRW5jb2RpbmcgbWJfc2tpcCAqLwogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX21iX3NraXAoMCwgcHNfY2FiYWNfY3R4dCwgTUJfU0tJUF9GTEFHX0JfU0xJQ0UpOwoKICAgICAgICAgICAgLyogRW5jb2RpbmcgbWJfdHlwZSBhcyBCX0RpcmVjdF8xNngxNiAqLwogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgbWJfaW5mb19jdHh0X3QgKnBzX2xlZnRfY3R4dCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dC0+cHNfbGVmdF9jdHh0X21iX2luZm87CiAgICAgICAgICAgICAgICBtYl9pbmZvX2N0eHRfdCAqcHNfdG9wX2N0eHQgPSBwc19jYWJhY19jdHh0LT5wc190b3BfY3R4dF9tYl9pbmZvOwogICAgICAgICAgICAgICAgVVdPUkQzMiB1NF9jdHhfaW5jID0gMDsKCiAgICAgICAgICAgICAgICBpZiAocHNfbGVmdF9jdHh0ICE9IHBzX2NhYmFjX2N0eHQtPnBzX2RlZl9jdHh0X21iX2luZm8pCiAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYyArPSAoKHBzX2xlZnRfY3R4dC0+dTFfbWJfdHlwZSAmIENBQl9CRDE2eDE2X01BU0spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IENBQl9CRDE2eDE2KSA/IDEgOiAwOwogICAgICAgICAgICAgICAgaWYgKHBzX3RvcF9jdHh0ICE9IHBzX2NhYmFjX2N0eHQtPnBzX2RlZl9jdHh0X21iX2luZm8pCiAgICAgICAgICAgICAgICAgICAgdTRfY3R4X2luYyArPSAoKHBzX3RvcF9jdHh0LT51MV9tYl90eXBlICYgQ0FCX0JEMTZ4MTZfTUFTSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gQ0FCX0JEMTZ4MTYpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAvKiBFbmNvZGUgdGhlIGJpbiAqLwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9iaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfY2FiYWNfY3R4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTUJfVFlQRV9CX1NMSUNFICsgdTRfY3R4X2luYyk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZSA9IENBQl9CRDE2eDE2OwogICAgICAgICAgICBtZW1zZXQocHNfY3Vycl9jdHh0LT51MV9tdiwgMCwgMTYpOwogICAgICAgICAgICBtZW1zZXQocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfbXZfY3R4dF9pbmMsIDAsIDE2KTsKCiAgICAgICAgICAgIC8qIEVuY29kZSBDQlAgKi8KICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19jYnAoY2JwLCBwc19jYWJhY19jdHh0KTsKCiAgICAgICAgICAgIGlmIChjYnApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIGVuY29kZSBtYl9xcF9kZWx0YSAqLwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9xcF9kZWx0YShtYl9xcF9kZWx0YSwgcHNfY2FiYWNfY3R4dCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIEVuZGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciBoZWFkZXIgaW4gYml0cyAqLwogICAgICAgICAgICBiaXRzdHJlYW1fZW5kX29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgICAgICBwc19lbnRfY3R4dC0+dTRfaGVhZGVyX2JpdHNbMV0gKz0gYml0c3RyZWFtX2VuZF9vZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYml0c3RyZWFtX3N0YXJ0X29mZnNldDsKICAgICAgICAgICAgLyogU3RhcnRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgcmVzaWR1ZSAqLwogICAgICAgICAgICBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0ID0gYml0c3RyZWFtX2VuZF9vZmZzZXQ7CiAgICAgICAgICAgIC8qIFN0YXJ0aW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIHJlc2lkdWUgKi8KCiAgICAgICAgfQoKICAgICAgICBlbHNlIGlmIChtYl90eXBlID09IEJTS0lQKS8qIE1CID0gQlNLSVAgKi8KICAgICAgICB7CiAgICAgICAgICAgIGloMjY0ZV9jYWJhY19lbmNfbWJfc2tpcCgxLCBwc19jYWJhY19jdHh0LCBNQl9TS0lQX0ZMQUdfQl9TTElDRSk7CgogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX21iX3R5cGUgPSBDQUJfQl9TS0lQOwoKICAgICAgICAgICAgbWVtc2V0KHBzX2N1cnJfY3R4dC0+dTFfbXYsIDAsIDE2KTsKICAgICAgICAgICAgbWVtc2V0KHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X212X2N0eHRfaW5jLCAwLCAxNik7CiAgICAgICAgICAgIGNicCA9IDA7CgogICAgICAgICAgICAvKiBFbmRpbmcgYml0c3RyZWFtIG9mZnNldCBmb3IgaGVhZGVyIGluIGJpdHMgKi8KICAgICAgICAgICAgYml0c3RyZWFtX2VuZF9vZmZzZXQgPSBHRVRfTlVNX0JJVFMocHNfYml0c3RyZWFtKTsKICAgICAgICAgICAgcHNfZW50X2N0eHQtPnU0X2hlYWRlcl9iaXRzWzFdICs9IGJpdHN0cmVhbV9lbmRfb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGJpdHN0cmVhbV9zdGFydF9vZmZzZXQ7CiAgICAgICAgICAgIC8qIFN0YXJ0aW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIHJlc2lkdWUgKi8KCiAgICAgICAgfQoKICAgICAgICBlbHNlIC8qIG1ieXBlIGlzIEJfTDBfMTZ4MTYsIEJfTDFfMTZ4MTYgb3IgQl9CaV8xNngxNiAqLwogICAgICAgIHsKICAgICAgICAgICAgV09SRDMyIGk0X21iX3BhcnRfcHJlZF9tb2RlID0gKG1iX3RwbSA+PiA0KTsKICAgICAgICAgICAgVVdPUkQzMiB1NF9tYl90eXBlID0gbWJfdHlwZSAtIEIxNngxNiArIEJfTDBfMTZ4MTYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaTRfbWJfcGFydF9wcmVkX21vZGU7CiAgICAgICAgICAgIGNicCA9ICpwdTFfYnl0ZSsrOwogICAgICAgICAgICBieXRlX2NvdW50Kys7CiAgICAgICAgICAgIG1iX3FwX2RlbHRhID0gKnB1MV9ieXRlKys7CiAgICAgICAgICAgIGJ5dGVfY291bnQrKzsKCiAgICAgICAgICAgIC8qIEVuY29kaW5nIG1iX3NraXAgKi8KICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tYl9za2lwKDAsIHBzX2NhYmFjX2N0eHQsIE1CX1NLSVBfRkxBR19CX1NMSUNFKTsKCiAgICAgICAgICAgIC8qIEVuY29kaW5nIG1iX3R5cGUgYXMgQjE2eDE2ICovCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1iX2luZm9fY3R4dF90ICpwc19sZWZ0X2N0eHQgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQtPnBzX2xlZnRfY3R4dF9tYl9pbmZvOwogICAgICAgICAgICAgICAgbWJfaW5mb19jdHh0X3QgKnBzX3RvcF9jdHh0ID0gcHNfY2FiYWNfY3R4dC0+cHNfdG9wX2N0eHRfbWJfaW5mbzsKICAgICAgICAgICAgICAgIFVXT1JEMzIgdTRfY3R4X2luYyA9IDA7CgogICAgICAgICAgICAgICAgVVdPUkQzMiB1NF9tYl90eXBlX2JpbnMgPSB1NF9iX21iX3R5cGVbdTRfbWJfdHlwZV07CiAgICAgICAgICAgICAgICBVV09SRDMyIHU0X2Jpbl9sZW4gPSAodTRfbWJfdHlwZV9iaW5zID4+IDgpICYgMHgwRjsKICAgICAgICAgICAgICAgIHU0X21iX3R5cGVfYmlucyA9IHU0X21iX3R5cGVfYmlucyAmIDB4RkY7CgogICAgICAgICAgICAgICAgaWYgKHBzX2xlZnRfY3R4dCAhPSBwc19jYWJhY19jdHh0LT5wc19kZWZfY3R4dF9tYl9pbmZvKQogICAgICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMgKz0gKChwc19sZWZ0X2N0eHQtPnUxX21iX3R5cGUgJiBDQUJfQkQxNngxNl9NQVNLKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBDQUJfQkQxNngxNikgPyAxIDogMDsKICAgICAgICAgICAgICAgIGlmIChwc190b3BfY3R4dCAhPSBwc19jYWJhY19jdHh0LT5wc19kZWZfY3R4dF9tYl9pbmZvKQogICAgICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMgKz0gKChwc190b3BfY3R4dC0+dTFfbWJfdHlwZSAmIENBQl9CRDE2eDE2X01BU0spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IENBQl9CRDE2eDE2KSA/IDEgOiAwOwoKICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMgPSB1NF9jdHhfaW5jIHwgdWlfYl9tYl90eXBlX2N0eF9pbmNbdTRfbWJfdHlwZV07CgogICAgICAgICAgICAgICAgaWgyNjRlX2VuY29kZV9kZWNpc2lvbl9iaW5zKHU0X21iX3R5cGVfYmlucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NF9iaW5fbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU0X2N0eF9pbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTRfYmluX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBzX2NhYmFjX2N0eHQtPmF1MV9jYWJhY19jdHh0X3RhYmxlW01CX1RZUEVfQl9TTElDRV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2NhYmFjX2N0eHQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX21iX3R5cGUgPSBDQUJfTk9OX0JEMTZ4MTY7CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFdPUkQxNiAqcGkyX212X3B0ciA9IChXT1JEMTYgKikgcHUxX2J5dGU7CiAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHByZWQgbW9kZXMgKi8KCiAgICAgICAgICAgICAgICBieXRlX2NvdW50ICs9IDQgKiAoMSArIChpNF9tYl9wYXJ0X3ByZWRfbW9kZSA9PSBQUkVEX0JJKSk7CgogICAgICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV9tYl90eXBlID0gKHBzX2N1cnJfY3R4dC0+dTFfbWJfdHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ0FCX05PTl9CRDE2eDE2KTsKICAgICAgICAgICAgICAgIC8qIEVuY29kaW5nIG1vdGlvbiB2ZWN0b3IgZm9yIEIxNngxNiAqLwogICAgICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY19tdmRzX2IxNngxNihwc19jYWJhY19jdHh0LCBwaTJfbXZfcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNF9tYl9wYXJ0X3ByZWRfbW9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogRW5jb2RlIENCUCAqLwogICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX2NicChjYnAsIHBzX2NhYmFjX2N0eHQpOwoKICAgICAgICAgICAgaWYgKGNicCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogZW5jb2RlIG1iX3FwX2RlbHRhICovCiAgICAgICAgICAgICAgICBpaDI2NGVfY2FiYWNfZW5jX21iX3FwX2RlbHRhKG1iX3FwX2RlbHRhLCBwc19jYWJhY19jdHh0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogRW5kaW5nIGJpdHN0cmVhbSBvZmZzZXQgZm9yIGhlYWRlciBpbiBiaXRzICovCiAgICAgICAgICAgIGJpdHN0cmVhbV9lbmRfb2Zmc2V0ID0gR0VUX05VTV9CSVRTKHBzX2JpdHN0cmVhbSk7CiAgICAgICAgICAgIHBzX2VudF9jdHh0LT51NF9oZWFkZXJfYml0c1sxXSArPSBiaXRzdHJlYW1fZW5kX29mZnNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBiaXRzdHJlYW1fc3RhcnRfb2Zmc2V0OwogICAgICAgICAgICAvKiBTdGFydGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciByZXNpZHVlICovCiAgICAgICAgICAgIGJpdHN0cmVhbV9zdGFydF9vZmZzZXQgPSBiaXRzdHJlYW1fZW5kX29mZnNldDsKICAgICAgICB9CgogICAgICAgIGlmIChjYnAgPiAwKQogICAgICAgIHsKICAgICAgICAgICAgLyogRW5jb2RlIHJlc2lkdWUgKi8KICAgICAgICAgICAgaWgyNjRlX2NhYmFjX2VuY29kZV9yZXNpZHVlKHBzX2VudF9jdHh0LCBjYnAsIExVTUFfNFg0X0NUWENBVCk7CiAgICAgICAgICAgIC8qIEVuZGluZyBiaXRzdHJlYW0gb2Zmc2V0IGZvciByZXNpZGUgaW4gYml0cyAqLwogICAgICAgICAgICBiaXRzdHJlYW1fZW5kX29mZnNldCA9IEdFVF9OVU1fQklUUyhwc19iaXRzdHJlYW0pOwogICAgICAgICAgICBwc19lbnRfY3R4dC0+dTRfcmVzaWR1ZV9iaXRzWzFdICs9IGJpdHN0cmVhbV9lbmRfb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGJpdHN0cmVhbV9zdGFydF9vZmZzZXQ7CgogICAgICAgICAgICBwc19jYWJhY19jdHh0LT5wdTFfbGVmdF95dXZfZGNfY3NicFswXSAmPSAweDY7CiAgICAgICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfeXV2X2RjX2NzYnAgJj0gMHg2OwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBwc19jdXJyX2N0eHQtPnUxX3l1dl9hY19jc2JwID0gMDsKICAgICAgICAgICAgcHNfY3Vycl9jdHh0LT51MV95dXZfZGNfY3NicCA9IDA7CiAgICAgICAgICAgICoocHNfY2FiYWNfY3R4dC0+cHUxX2xlZnRfdXZfYWNfY3NicCkgPSAwOwogICAgICAgICAgICAqKHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3lfYWNfY3NicCkgPSAwOwogICAgICAgICAgICAqKHBzX2NhYmFjX2N0eHQtPnB1MV9sZWZ0X3l1dl9kY19jc2JwKSA9IDA7CiAgICAgICAgfQogICAgICAgIHBzX2N1cnJfY3R4dC0+dTFfaW50cmFwcmVkX2Nocm9tYV9tb2RlID0gMDsKICAgICAgICBwc19jdXJyX2N0eHQtPnUxX2NicCA9IGNicDsKICAgICAgICBwc19lbnRfY3R4dC0+cHZfbWJfaGVhZGVyX2RhdGEgPSAoKFdPUkQ4ICopcHNfZW50X2N0eHQtPnB2X21iX2hlYWRlcl9kYXRhKSArIGJ5dGVfY291bnQ7CiAgICAgICAgcmV0dXJuIElIMjY0RV9TVUNDRVNTOwogICAgfQp9Cg==