LyoKICogVG9zaGliYSBUQzYzOTNYQiBJL08gQ29udHJvbGxlci4KICogRm91bmQgaW4gU2hhcnAgWmF1cnVzIFNMLTYwMDAgKHRvc2EpIG9yIHNvbWUKICogVG9zaGliYSBlLVNlcmllcyBQREFzLgogKgogKiBGQiBzdXBwb3J0IGNvZGUuIEJhc2VkIG9uIEczNjQgZmIgZW11bGF0b3IKICoKICogQ29weXJpZ2h0IChjKSAyMDA3IEhlcnbpIFBvdXNzaW5lYXUKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KICovCgojaWYgQklUUyA9PSA4CiMgZGVmaW5lIFNFVF9QSVhFTChhZGRyLCBjb2xvcikJKih1aW50OF90KilhZGRyID0gY29sb3I7CiNlbGlmIEJJVFMgPT0gMTUgfHwgQklUUyA9PSAxNgojIGRlZmluZSBTRVRfUElYRUwoYWRkciwgY29sb3IpCSoodWludDE2X3QqKWFkZHIgPSBjb2xvcjsKI2VsaWYgQklUUyA9PSAyNAojIGRlZmluZSBTRVRfUElYRUwoYWRkciwgY29sb3IpCVwKICAgIGFkZHJbMF0gPSBjb2xvcjsgYWRkclsxXSA9IChjb2xvcikgPj4gODsgYWRkclsyXSA9IChjb2xvcikgPj4gMTY7CiNlbGlmIEJJVFMgPT0gMzIKIyBkZWZpbmUgU0VUX1BJWEVMKGFkZHIsIGNvbG9yKQkqKHVpbnQzMl90KilhZGRyID0gY29sb3I7CiNlbHNlCiMgZXJyb3IgdW5rbm93biBiaXQgZGVwdGgKI2VuZGlmCgoKc3RhdGljIHZvaWQgZ2x1ZSh0YzYzOTN4Yl9kcmF3X2dyYXBoaWMsIEJJVFMpKHN0cnVjdCB0YzYzOTN4Yl9zICpzKQp7CiAgICBpbnQgaTsKICAgIGludCB3X2Rpc3BsYXk7CiAgICB1aW50MTZfdCAqZGF0YV9idWZmZXI7CiAgICB1aW50OF90ICpkYXRhX2Rpc3BsYXk7CgogICAgZGF0YV9idWZmZXIgPSAodWludDE2X3QqKShwaHlzX3JhbV9iYXNlICsgcy0+dnJhbV9hZGRyKTsKICAgIHdfZGlzcGxheSA9IHMtPnNjcl93aWR0aCAqIEJJVFMgLyA4OwogICAgZGF0YV9kaXNwbGF5ID0gZHNfZ2V0X2RhdGEocy0+ZHMpOwogICAgZm9yKGkgPSAwOyBpIDwgcy0+c2NyX2hlaWdodDsgaSsrKSB7CiNpZiAoQklUUyA9PSAxNikKICAgICAgICBtZW1jcHkoZGF0YV9kaXNwbGF5LCBkYXRhX2J1ZmZlciwgcy0+c2NyX3dpZHRoICogMik7CiAgICAgICAgZGF0YV9idWZmZXIgKz0gcy0+c2NyX3dpZHRoOwogICAgICAgIGRhdGFfZGlzcGxheSArPSBkc19nZXRfbGluZXNpemUocy0+ZHMpOwojZWxzZQogICAgICAgIGludCBqOwogICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5zY3Jfd2lkdGg7IGorKywgZGF0YV9kaXNwbGF5ICs9IEJJVFMgLyA4LCBkYXRhX2J1ZmZlcisrKSB7CiAgICAgICAgICAgIHVpbnQxNl90IGNvbG9yID0gKmRhdGFfYnVmZmVyOwogICAgICAgICAgICB1aW50MzJfdCBkZXN0X2NvbG9yID0gZ2x1ZShyZ2JfdG9fcGl4ZWwsIEJJVFMpKAogICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNvbG9yICYgMHhmODAwKSAqIDB4MTA4KSA+PiAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjb2xvciAmIDB4N2UwKSAqIDB4NDEpID4+IDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29sb3IgJiAweDFmKSAqIDB4MjEpID4+IDIKICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgU0VUX1BJWEVMKGRhdGFfZGlzcGxheSwgZGVzdF9jb2xvcik7CiAgICAgICAgfQojZW5kaWYKICAgIH0KfQoKI3VuZGVmIEJJVFMKI3VuZGVmIFNFVF9QSVhFTAo=