LyoKICogbG9nZ2luZy5jIC0gZ2VuZXJpYyBsb2dnaW5nIGZvciBzbm1wLWFnZW50CiAqICogQ29udHJpYnV0ZWQgYnkgUmFnbmFyIEtq+HJzdGFkLCB1Y2RAcmFnbmFyay52ZXN0ZGF0YS5ubyAxOTk5LTA2LTI2IAogKi8KLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCi8qKiBAZGVmZ3JvdXAgc25tcF9sb2dnaW5nIGdlbmVyaWMgbG9nZ2luZyBmb3IgbmV0LXNubXAgCiAqICBAaW5ncm91cCBsaWJyYXJ5CiAqIAogKiAgQHsKICovCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpZiBIQVZFX01BTExPQ19ICiNpbmNsdWRlIDxtYWxsb2MuaD4KI2VuZGlmCiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2Vsc2UKI2luY2x1ZGUgPHN0cmluZ3MuaD4KI2VuZGlmCiNpbmNsdWRlIDxjdHlwZS5oPgojaWYgSEFWRV9TVERMSUJfSAojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpZiBIQVZFX1NZU0xPR19ICiNpbmNsdWRlIDxzeXNsb2cuaD4KI2lmbmRlZiBMT0dfQ09OUyAgICAgICAgICAgICAgICAvKiBJbnRlcmVzdGluZyBVbHRyaXggZmVhdHVyZSAqLwojaW5jbHVkZSA8c3lzL3N5c2xvZy5oPgojZW5kaWYKI2VuZGlmCiNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKIyBpZmRlZiBXSU4zMgojICBpbmNsdWRlIDxzeXMvdGltZWIuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZW5kaWYKIyBpbmNsdWRlIDx0aW1lLmg+CiNlbHNlCiMgaWYgSEFWRV9TWVNfVElNRV9ICiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZWxzZQojICBpbmNsdWRlIDx0aW1lLmg+CiMgZW5kaWYKI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKCiNpZiBIQVZFX1NUREFSR19ICiNpbmNsdWRlIDxzdGRhcmcuaD4KI2Vsc2UKI2luY2x1ZGUgPHZhcmFyZ3MuaD4KI2VuZGlmCgojaWYgSEFWRV9VTklTVERfSAojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaWYgSEFWRV9ETUFMTE9DX0gKI2luY2x1ZGUgPGRtYWxsb2MuaD4KI2VuZGlmCgojaWYgSEFWRV9XSU5TT0NLX0gKI2luY2x1ZGUgPHdpbnNvY2suaD4KI2VuZGlmCgojaWYgSEFWRV9XSU5ET1dTX0gKI2luY2x1ZGUgPHdpbmRvd3MuaD4KI2VuZGlmCgojaW5jbHVkZSA8bmV0LXNubXAvdHlwZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL291dHB1dF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9sb2dnaW5nLmg+ICAgICAgLyogRm9yIHRoaXMgZmlsZSdzICJpbnRlcm5hbCIgZGVmaW5pdGlvbnMgKi8KI2luY2x1ZGUgPG5ldC1zbm1wL2NvbmZpZ19hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL3V0aWxpdGllcy5oPgoKI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvY2FsbGJhY2suaD4KI2RlZmluZSBMT0dMRU5HVEggMTAyNAoKI2lmZGVmIHZhX2NvcHkKI2RlZmluZSBORUVEX1ZBX0VORF9BRlRFUl9WQV9DT1BZCiNlbHNlCiNpZmRlZiBfX3ZhY29weQojZGVmaW5lIHZhY29weSBfX3ZhY29weQojZGVmaW5lIE5FRURfVkFfRU5EX0FGVEVSX1ZBX0NPUFkKI2Vsc2UKI2RlZmluZSB2YV9jb3B5KGRlc3QsIHNyYykgbWVtY3B5ICgmZGVzdCwgJnNyYywgc2l6ZW9mICh2YV9saXN0KSkKI2VuZGlmCiNlbmRpZgoKLyoKICogbG9naF9oZWFkOiAgQSBsaXN0IG9mIGFsbCBsb2cgaGFuZGxlcnMsIGluIGluY3JlYXNpbmcgb3JkZXIgb2YgcHJpb3JpdHkKICogbG9naF9wcmlvcml0aWVzOiAgJ0luZGV4ZXMnIGludG8gdGhpcyBsaXN0LCBieSBwcmlvcml0eQogKi8KbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naF9oZWFkID0gTlVMTDsKbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naF9wcmlvcml0aWVzW0xPR19ERUJVRysxXTsKCnN0YXRpYyBpbnQgICAgICBuZXdsaW5lID0gMTsJIC8qIE1UQ1JJVElDQUxfUkVTT1VSQ0UgKi8KCnN0YXRpYyBjaGFyIHN5c2xvZ25hbWVbNjRdID0gREVGQVVMVF9MT0dfSUQ7Cgp2b2lkCm5ldHNubXBfZW5hYmxlX2ZpbGVsb2cobmV0c25tcF9sb2dfaGFuZGxlciAqbG9naCwgaW50IGRvbnRfemVyb19sb2cpOwoKI2lmbmRlZiBIQVZFX1ZTTlBSSU5URgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIE5lZWQgdG8gdXNlIHRoZSBVQ0QtcHJvdmlkZWQgb25lIAogICAgICAgICAgICAgICAgICovCmludCAgICAgICAgICAgICB2c25wcmludGYoY2hhciAqc3RyLCBzaXplX3QgY291bnQsIGNvbnN0IGNoYXIgKmZtdCwKICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZyk7CiNlbmRpZgoKdm9pZAppbml0X3NubXBfbG9nZ2luZyh2b2lkKQp7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAibG9nVGltZXN0YW1wIiwgCgkJCSBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0xPR19USU1FU1RBTVApOwp9Cgp2b2lkCnNodXRkb3duX3NubXBfbG9nZ2luZyh2b2lkKQp7CiAgIHNubXBfZGlzYWJsZV9sb2coKTsKICAgd2hpbGUoTlVMTCAhPSBsb2doX2hlYWQpCiAgICAgIG5ldHNubXBfcmVtb3ZlX2xvZ2hhbmRsZXIoIGxvZ2hfaGVhZCApOwp9CgovKgogKiBUaGVzZSBkZWZpbml0aW9ucyBoYW5kbGUgNC4yIHN5c3RlbXMgd2l0aG91dCBhZGRpdGlvbmFsIHN5c2xvZyBmYWNpbGl0aWVzLgogKi8KI2lmbmRlZiBMT0dfQ09OUwojZGVmaW5lIExPR19DT05TCTAgICAgICAgLyogRG9uJ3QgYm90aGVyIGlmIG5vdCBkZWZpbmVkLi4uICovCiNlbmRpZgojaWZuZGVmIExPR19QSUQKI2RlZmluZSBMT0dfUElECQkwICAgICAgIC8qIERvbid0IGJvdGhlciBpZiBub3QgZGVmaW5lZC4uLiAqLwojZW5kaWYKI2lmbmRlZiBMT0dfTE9DQUwwCiNkZWZpbmUgTE9HX0xPQ0FMMAkwCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDEKI2RlZmluZSBMT0dfTE9DQUwxCTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMMgojZGVmaW5lIExPR19MT0NBTDIJMAojZW5kaWYKI2lmbmRlZiBMT0dfTE9DQUwzCiNkZWZpbmUgTE9HX0xPQ0FMMwkwCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDQKI2RlZmluZSBMT0dfTE9DQUw0CTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMNQojZGVmaW5lIExPR19MT0NBTDUJMAojZW5kaWYKI2lmbmRlZiBMT0dfTE9DQUw2CiNkZWZpbmUgTE9HX0xPQ0FMNgkwCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDcKI2RlZmluZSBMT0dfTE9DQUw3CTAKI2VuZGlmCiNpZm5kZWYgTE9HX0RBRU1PTgojZGVmaW5lIExPR19EQUVNT04JMAojZW5kaWYKI2lmbmRlZiBMT0dfVVNFUgojZGVmaW5lIExPR19VU0VSCTAKI2VuZGlmCgovKgogKiBEZWNvZGVzIGxvZyBwcmlvcml0eS4KICogQHBhcmFtIG9wdGFyZyAtIElOIC0gcHJpb3JpdHkgdG8gZGVjb2RlLCAiMCIgb3IgIjAtNyIKICogICAgICAgICAgICAgICAgIE9VVCAtIHBvaW50cyB0byBsYXN0IGNoYXJhY3RlciBhZnRlciB0aGUgZGVjb2RlZCBwcmlvcml0eQogKiBAcGFyYW0gcHJpX21heCAtIE9VVCAtIG1heGltdW0gcHJpb3JpdHkgKGkuZS4gMHg3IGZyb20gIjAtNyIpCiAqLwppbnQKZGVjb2RlX3ByaW9yaXR5KCBjaGFyICoqb3B0YXJnLCBpbnQgKnByaV9tYXggKQp7CiAgICBpbnQgcHJpX2xvdyA9IExPR19ERUJVRzsKCiAgICBpZiAoKm9wdGFyZyA9PSBOVUxMKQogICAgICAgIHJldHVybiAtMTsKCiAgICBzd2l0Y2ggKCoqb3B0YXJnKSB7CiAgICAgICAgY2FzZSAnMCc6IAogICAgICAgIGNhc2UgJyEnOiAKICAgICAgICAgICAgcHJpX2xvdyA9IExPR19FTUVSRzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnMSc6IAogICAgICAgIGNhc2UgJ2EnOiAKICAgICAgICBjYXNlICdBJzogCiAgICAgICAgICAgIHByaV9sb3cgPSBMT0dfQUxFUlQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJzInOiAKICAgICAgICBjYXNlICdjJzogCiAgICAgICAgY2FzZSAnQyc6IAogICAgICAgICAgICBwcmlfbG93ID0gTE9HX0NSSVQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJzMnOiAKICAgICAgICBjYXNlICdlJzogCiAgICAgICAgY2FzZSAnRSc6IAogICAgICAgICAgICBwcmlfbG93ID0gTE9HX0VSUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnNCc6IAogICAgICAgIGNhc2UgJ3cnOiAKICAgICAgICBjYXNlICdXJzogCiAgICAgICAgICAgIHByaV9sb3cgPSBMT0dfV0FSTklORzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnNSc6IAogICAgICAgIGNhc2UgJ24nOiAKICAgICAgICBjYXNlICdOJzogCiAgICAgICAgICAgIHByaV9sb3cgPSBMT0dfTk9USUNFOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICc2JzogCiAgICAgICAgY2FzZSAnaSc6IAogICAgICAgIGNhc2UgJ0knOiAKICAgICAgICAgICAgcHJpX2xvdyA9IExPR19JTkZPOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICc3JzogCiAgICAgICAgY2FzZSAnZCc6IAogICAgICAgIGNhc2UgJ0QnOiAKICAgICAgICAgICAgcHJpX2xvdyA9IExPR19ERUJVRzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogCiAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBwcmlvcml0eTogJWNcbiIsKipvcHRhcmcpOwogICAgICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICAqb3B0YXJnID0gKm9wdGFyZysxOwoKICAgIGlmIChwcmlfbWF4ICYmICoqb3B0YXJnPT0nLScpIHsKICAgICAgICAqb3B0YXJnID0gKm9wdGFyZyArIDE7IC8qIHNraXAgJy0nICovCiAgICAgICAgKnByaV9tYXggPSBkZWNvZGVfcHJpb3JpdHkoIG9wdGFyZywgTlVMTCApOwogICAgICAgIGlmICgqcHJpX21heCA9PSAtMSkgcmV0dXJuIC0xOwogICAgICAgIGlmIChwcmlfbG93IDwgKnByaV9tYXgpIHsgCiAgICAgICAgICAgIGludCB0bXAgPSBwcmlfbG93OyAKICAgICAgICAgICAgcHJpX2xvdyA9ICpwcmlfbWF4OyAKICAgICAgICAgICAgKnByaV9tYXggPSB0bXA7IAogICAgICAgIH0KCiAgICB9CiAgICByZXR1cm4gcHJpX2xvdzsKfQoKaW50CmRlY29kZV9mYWNpbGl0eSggY2hhciAqb3B0YXJnICkKewogICAgaWYgKG9wdGFyZyA9PSBOVUxMKQogICAgICAgIHJldHVybiAtMTsKCiAgICBzd2l0Y2ggKCpvcHRhcmcpIHsKICAgIGNhc2UgJ2QnOgogICAgY2FzZSAnRCc6CiAgICAgICAgcmV0dXJuIExPR19EQUVNT047CiAgICBjYXNlICd1JzoKICAgIGNhc2UgJ1UnOgogICAgICAgIHJldHVybiBMT0dfVVNFUjsKICAgIGNhc2UgJzAnOgogICAgICAgIHJldHVybiBMT0dfTE9DQUwwOwogICAgY2FzZSAnMSc6CiAgICAgICAgcmV0dXJuIExPR19MT0NBTDE7CiAgICBjYXNlICcyJzoKICAgICAgICByZXR1cm4gTE9HX0xPQ0FMMjsKICAgIGNhc2UgJzMnOgogICAgICAgIHJldHVybiBMT0dfTE9DQUwzOwogICAgY2FzZSAnNCc6CiAgICAgICAgcmV0dXJuIExPR19MT0NBTDQ7CiAgICBjYXNlICc1JzoKICAgICAgICByZXR1cm4gTE9HX0xPQ0FMNTsKICAgIGNhc2UgJzYnOgogICAgICAgIHJldHVybiBMT0dfTE9DQUw2OwogICAgY2FzZSAnNyc6CiAgICAgICAgcmV0dXJuIExPR19MT0NBTDc7CiAgICBkZWZhdWx0OgogICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBzeXNsb2cgZmFjaWxpdHk6ICVjXG4iLCpvcHRhcmcpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KfQoKaW50CnNubXBfbG9nX29wdGlvbnMoY2hhciAqb3B0YXJnLCBpbnQgYXJnYywgY2hhciAqY29uc3QgKmFyZ3YpCnsKICAgIGNoYXIgICAgICAgICAgICpjcCA9IG9wdGFyZzsKICAgICAgICAvKgoJICogSG1tbS4uLiB0aGlzIGRvZXNuJ3Qgc2VlbSB0byB3b3JrLgoJICogVGhlIG1haW4gYWdlbnQgJ2dldG9wdCcgaGFuZGxpbmcgYXNzdW1lcwoJICogICB0aGF0IHRoZSAtTCBvcHRpb24gdGFrZXMgYW4gYXJndW1lbnQsCgkgKiAgIGFuZCBvYmplY3RzIGlmIHRoaXMgaXMgbWlzc2luZy4KCSAqIFRyeWluZyB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4KCSAqICAgbmV3LXN0eWxlICItTHgiLCBhbmQgb2xkLXN0eWxlICItTCB4eCIKCSAqICAgaXMgbGlrZWx5IHRvIGJlIGEgbWFqb3IgaGVhZGFjaGUuCgkgKi8KICAgIGNoYXIgICAgICAgICAgICBtaXNzaW5nX29wdCA9ICdlJzsJLyogb2xkIC1MIGlzIG5ldyAtTGUgKi8KICAgIGludCAgICAgICAgICAgICBwcmlvcml0eSA9IExPR19ERUJVRzsKICAgIGludCAgICAgICAgICAgICBwcmlfbWF4ICA9IExPR19FTUVSRzsKICAgIGludCAgICAgICAgICAgICBpbmNfb3B0aW5kID0gMDsKICAgIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2g7CgogICAgb3B0YXJnKys7CiAgICBpZiAoISpjcCkKICAgICAgICBjcCA9ICZtaXNzaW5nX29wdDsKCiAgICAvKgogICAgICogU3VwcG9ydCAnLi4uIC1MeD12YWx1ZSAuLi4uJyBzeW50YXgKICAgICAqLwogICAgaWYgKCpvcHRhcmcgPT0gJz0nKSB7CiAgICAgICAgb3B0YXJnKys7CiAgICB9CiAgICAvKgogICAgICogYW5kICcuLi4uICItTHggdmFsdWUiIC4uLi4nICAoKndpdGgqIHRoZSBxdW90ZXMpCiAgICAgKi8KICAgIHdoaWxlICgqb3B0YXJnICYmIGlzc3BhY2UoKm9wdGFyZykpIHsKICAgICAgICBvcHRhcmcrKzsKICAgIH0KICAgIC8qCiAgICAgKiBGaW5hbGx5LCBoYW5kbGUgIi4uLi4gLUx4IHZhbHVlIC4uLi4iIHN5bnRheAogICAgICogICAoKndpdGhvdXQqIHN1cnJvdW5kaW5nIHF1b3RlcykKICAgICAqLwogICAgaWYgKCghKm9wdGFyZykgJiYgKE5VTEwgIT0gYXJndikpIHsKICAgICAgICAvKgogICAgICAgICAqIFdlJ3ZlIHJ1biBvZmYgdGhlIGVuZCBvZiB0aGUgYXJndW1lbnQKICAgICAgICAgKiAgc28gbW92ZSBvbiB0byB0aGUgbmV4dC4KICAgICAgICAgKiBCdXQgd2UgbWlnaHQgbm90IGFjdHVhbGx5IG5lZWQgaXQsIHNvIGRvbid0CgkgKiAgaW5jcmVtZW50IG9wdGluZCBqdXN0IHlldCEKICAgICAgICAgKi8KICAgICAgICBvcHRhcmcgPSBhcmd2W29wdGluZF07CiAgICAgICAgaW5jX29wdGluZCA9IDE7CiAgICB9CgogICAgc3dpdGNoICgqY3ApIHsKCiAgICAvKgogICAgICogTG9nIHRvIFN0YW5kYXJkIEVycm9yCiAgICAgKi8KICAgIGNhc2UgJ0UnOgogICAgICAgIHByaW9yaXR5ID0gZGVjb2RlX3ByaW9yaXR5KCAmb3B0YXJnLCAmcHJpX21heCApOwogICAgICAgIGlmIChwcmlvcml0eSA9PSAtMSkgIHJldHVybiAtMTsKICAgICAgICBpZiAoaW5jX29wdGluZCkKICAgICAgICAgICAgb3B0aW5kKys7CiAgICAgICAgLyogRmFsbHRocm91Z2ggKi8KICAgIGNhc2UgJ2UnOgogICAgICAgIGxvZ2ggPSBuZXRzbm1wX3JlZ2lzdGVyX2xvZ2hhbmRsZXIoTkVUU05NUF9MT0dIQU5ETEVSX1NUREVSUiwgcHJpb3JpdHkpOwogICAgICAgIGlmIChsb2doKSB7CiAgICAgICAgICAgIGxvZ2gtPnByaV9tYXggPSBwcmlfbWF4OwogICAgICAgICAgICBsb2doLT50b2tlbiAgID0gc3RyZHVwKCJzdGRlcnIiKTsKCX0KICAgICAgICBicmVhazsKCiAgICAvKgogICAgICogTG9nIHRvIFN0YW5kYXJkIE91dHB1dAogICAgICovCiAgICBjYXNlICdPJzoKICAgICAgICBwcmlvcml0eSA9IGRlY29kZV9wcmlvcml0eSggJm9wdGFyZywgJnByaV9tYXggKTsKICAgICAgICBpZiAocHJpb3JpdHkgPT0gLTEpICByZXR1cm4gLTE7CiAgICAgICAgaWYgKGluY19vcHRpbmQpCiAgICAgICAgICAgIG9wdGluZCsrOwogICAgICAgIC8qIEZhbGx0aHJvdWdoICovCiAgICBjYXNlICdvJzoKICAgICAgICBsb2doID0gbmV0c25tcF9yZWdpc3Rlcl9sb2doYW5kbGVyKE5FVFNOTVBfTE9HSEFORExFUl9TVERFUlIsIHByaW9yaXR5KTsKICAgICAgICBpZiAobG9naCkgewogICAgICAgICAgICBsb2doLT5wcmlfbWF4ID0gcHJpX21heDsKICAgICAgICAgICAgbG9naC0+dG9rZW4gICA9IHN0cmR1cCgic3Rkb3V0Iik7CiAgICAgICAgICAgIGxvZ2gtPmltYWdpYyAgPSAxOwkgICAgLyogc3Rkb3V0LCBub3Qgc3RkZXJyICovCgl9CiAgICAgICAgYnJlYWs7CgogICAgLyoKICAgICAqIExvZyB0byBhIG5hbWVkIGZpbGUKICAgICAqLwogICAgY2FzZSAnRic6CiAgICAgICAgcHJpb3JpdHkgPSBkZWNvZGVfcHJpb3JpdHkoICZvcHRhcmcsICZwcmlfbWF4ICk7CiAgICAgICAgaWYgKHByaW9yaXR5ID09IC0xIHx8ICFhcmd2KSAgcmV0dXJuIC0xOwogICAgICAgIG9wdGFyZyA9IGFyZ3ZbKytvcHRpbmRdOwogICAgICAgIC8qIEZhbGx0aHJvdWdoICovCiAgICBjYXNlICdmJzoKICAgICAgICBpZiAoaW5jX29wdGluZCkKICAgICAgICAgICAgb3B0aW5kKys7CiAgICAgICAgaWYgKCFvcHRhcmcpIHsKICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIGxvZyBmaWxlXG4iKTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBsb2doID0gbmV0c25tcF9yZWdpc3Rlcl9sb2doYW5kbGVyKE5FVFNOTVBfTE9HSEFORExFUl9GSUxFLCBwcmlvcml0eSk7CiAgICAgICAgaWYgKGxvZ2gpIHsKICAgICAgICAgICAgbG9naC0+cHJpX21heCA9IHByaV9tYXg7CiAgICAgICAgICAgIGxvZ2gtPnRva2VuICAgPSBzdHJkdXAob3B0YXJnKTsKICAgICAgICAgICAgbmV0c25tcF9lbmFibGVfZmlsZWxvZyhsb2doLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfQVBQRU5EX0xPR0ZJTEVTKSk7Cgl9CiAgICAgICAgYnJlYWs7CgogICAgLyoKICAgICAqIExvZyB0byBzeXNsb2cKICAgICAqLwogICAgY2FzZSAnUyc6CiAgICAgICAgcHJpb3JpdHkgPSBkZWNvZGVfcHJpb3JpdHkoICZvcHRhcmcsICZwcmlfbWF4ICk7CiAgICAgICAgaWYgKHByaW9yaXR5ID09IC0xIHx8ICFhcmd2KSAgcmV0dXJuIC0xOwogICAgICAgIGlmICghb3B0YXJnWzBdKSB7CiAgICAgICAgICAgIC8qIFRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgd2l0aCBwcmlvcml0eSBkb2VzIG5vdCBjb250YWluIGxvZwogICAgICAgICAgICAgKiBmYWNpbGl0eS4gVGhlIGZhY2lsaXR5IG11c3QgYmUgaW4gbmV4dCBhcmd1bWVudCB0aGVuLiAqLwogICAgICAgICAgICBvcHRpbmQrKzsKICAgICAgICAgICAgaWYgKG9wdGluZCA8IGFyZ2MpCiAgICAgICAgICAgICAgICBvcHRhcmcgPSBhcmd2W29wdGluZF07CiAgICAgICAgfQogICAgICAgIC8qIEZhbGx0aHJvdWdoICovCiAgICBjYXNlICdzJzoKICAgICAgICBpZiAoaW5jX29wdGluZCkKICAgICAgICAgICAgb3B0aW5kKys7CiAgICAgICAgaWYgKCFvcHRhcmcpIHsKICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIHN5c2xvZyBmYWNpbGl0eVxuIik7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgbG9naCA9IG5ldHNubXBfcmVnaXN0ZXJfbG9naGFuZGxlcihORVRTTk1QX0xPR0hBTkRMRVJfU1lTTE9HLCBwcmlvcml0eSk7CiAgICAgICAgaWYgKGxvZ2gpIHsKICAgICAgICAgICAgaW50IGZhY2lsaXR5ID0gZGVjb2RlX2ZhY2lsaXR5KG9wdGFyZyk7CiAgICAgICAgICAgIGlmIChmYWNpbGl0eSA9PSAtMSkgIHJldHVybiAtMTsKICAgICAgICAgICAgbG9naC0+cHJpX21heCA9IHByaV9tYXg7CiAgICAgICAgICAgIGxvZ2gtPnRva2VuICAgPSBzdHJkdXAoc25tcF9sb2dfc3lzbG9nbmFtZSgwKSk7CiAgICAgICAgICAgIGxvZ2gtPm1hZ2ljICAgPSAodm9pZCAqKShpbnRwdHJfdClmYWNpbGl0eTsKCSAgICBzbm1wX2VuYWJsZV9zeXNsb2dfaWRlbnQoc25tcF9sb2dfc3lzbG9nbmFtZSgwKSwgZmFjaWxpdHkpOwoJfQogICAgICAgIGJyZWFrOwoKICAgIC8qCiAgICAgKiBEb24ndCBsb2cgCiAgICAgKi8KICAgIGNhc2UgJ04nOgogICAgICAgIHByaW9yaXR5ID0gZGVjb2RlX3ByaW9yaXR5KCAmb3B0YXJnLCAmcHJpX21heCApOwogICAgICAgIGlmIChwcmlvcml0eSA9PSAtMSkgIHJldHVybiAtMTsKICAgICAgICBpZiAoaW5jX29wdGluZCkKICAgICAgICAgICAgb3B0aW5kKys7CiAgICAgICAgLyogRmFsbHRocm91Z2ggKi8KICAgIGNhc2UgJ24nOgogICAgICAgIC8qCiAgICAgICAgICogZGlzYWJsZSBhbGwgbG9ncyB0byBjbGVhbiB0aGVtIHVwIChjbG9zZSBmaWxlcywgZXRjKSwKICAgICAgICAgKiByZW1vdmUgYWxsIGxvZyBoYW5kbGVycywgdGhlbiByZWdpc3RlciBhIG51bGwgaGFuZGxlci4KICAgICAgICAgKi8KICAgICAgICBzbm1wX2Rpc2FibGVfbG9nKCk7CiAgICAgICAgd2hpbGUoTlVMTCAhPSBsb2doX2hlYWQpCiAgICAgICAgICAgIG5ldHNubXBfcmVtb3ZlX2xvZ2hhbmRsZXIoIGxvZ2hfaGVhZCApOwogICAgICAgIGxvZ2ggPSBuZXRzbm1wX3JlZ2lzdGVyX2xvZ2hhbmRsZXIoTkVUU05NUF9MT0dIQU5ETEVSX05PTkUsIHByaW9yaXR5KTsKICAgICAgICBpZiAobG9naCkgewogICAgICAgICAgICBsb2doLT5wcmlfbWF4ID0gcHJpX21heDsKCX0KICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBsb2dnaW5nIG9wdGlvbiBwYXNzZWQgdG8gLUw6ICVjLlxuIiwgKmNwKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKY2hhciAqCnNubXBfbG9nX3N5c2xvZ25hbWUoY29uc3QgY2hhciAqcHN0cikKewogIGlmIChwc3RyKQogICAgc3RybGNweSAoc3lzbG9nbmFtZSwgcHN0ciwgc2l6ZW9mKHN5c2xvZ25hbWUpKTsKCiAgcmV0dXJuIHN5c2xvZ25hbWU7Cn0KCnZvaWQKc25tcF9sb2dfb3B0aW9uc191c2FnZShjb25zdCBjaGFyICpsZWFkLCBGSUxFICogb3V0ZikKewogICAgY29uc3QgY2hhciAqcHJpMV9tc2cgPSAiIGZvciBsZXZlbCAncHJpJyBhbmQgYWJvdmUiOwogICAgY29uc3QgY2hhciAqcHJpMl9tc2cgPSAiIGZvciBsZXZlbHMgJ3AxJyB0byAncDInIjsKICAgIGZwcmludGYob3V0ZiwgIiVzZTogICAgICAgICAgIGxvZyB0byBzdGFuZGFyZCBlcnJvclxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc286ICAgICAgICAgICBsb2cgdG8gc3RhbmRhcmQgb3V0cHV0XG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzbjogICAgICAgICAgIGRvbid0IGxvZyBhdCBhbGxcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNmIGZpbGU6ICAgICAgbG9nIHRvIHRoZSBzcGVjaWZpZWQgZmlsZVxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc3MgZmFjaWxpdHk6ICBsb2cgdG8gc3lzbG9nICh2aWEgdGhlIHNwZWNpZmllZCBmYWNpbGl0eSlcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiXG4lcyh2YXJpYW50cylcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNbRU9OXSBwcmk6ICAgbG9nIHRvIHN0YW5kYXJkIGVycm9yLCBvdXRwdXQgb3IgL2Rldi9udWxsJXNcbiIsIGxlYWQsIHByaTFfbXNnKTsKICAgIGZwcmludGYob3V0ZiwgIiVzW0VPTl0gcDEtcDI6IGxvZyB0byBzdGFuZGFyZCBlcnJvciwgb3V0cHV0IG9yIC9kZXYvbnVsbCVzXG4iLCBsZWFkLCBwcmkyX21zZyk7CiAgICBmcHJpbnRmKG91dGYsICIlc1tGU10gcHJpIHRva2VuOiAgICBsb2cgdG8gZmlsZS9zeXNsb2clc1xuIiwgbGVhZCwgcHJpMV9tc2cpOwogICAgZnByaW50ZihvdXRmLCAiJXNbRlNdIHAxLXAyIHRva2VuOiAgbG9nIHRvIGZpbGUvc3lzbG9nJXNcbiIsIGxlYWQsIHByaTJfbXNnKTsKfQoKLyoqCiAqIElzIGxvZ2dpbmcgZG9uZT8KICoKICogQHJldHVybiBSZXR1cm5zIDAgaWYgbG9nZ2luZyBpcyBvZmYsIDEgd2hlbiBpdCBpcyBkb25lLgogKgogKi8KaW50CnNubXBfZ2V0X2RvX2xvZ2dpbmcodm9pZCkKewogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDsKICAgIGZvciAobG9naCA9IGxvZ2hfaGVhZDsgbG9naDsgbG9naCA9IGxvZ2gtPm5leHQpCiAgICAgICAgaWYgKGxvZ2gtPmVuYWJsZWQpCiAgICAgICAgICAgIHJldHVybiAxOwogICAgcmV0dXJuIDA7Cn0KCgpzdGF0aWMgY2hhciAgICAqCnNwcmludGZfc3RhbXAodGltZV90ICogbm93LCBjaGFyICpzYnVmKQp7CiAgICB0aW1lX3QgICAgICAgICAgTm93OwogICAgc3RydWN0IHRtICAgICAgKnRtOwoKICAgIGlmIChub3cgPT0gTlVMTCkgewogICAgICAgIG5vdyA9ICZOb3c7CiAgICAgICAgdGltZShub3cpOwogICAgfQogICAgdG0gPSBsb2NhbHRpbWUobm93KTsKICAgIHNwcmludGYoc2J1ZiwgIiUuNGQtJS4yZC0lLjJkICUuMmQ6JS4yZDolLjJkICIsCiAgICAgICAgICAgIHRtLT50bV95ZWFyICsgMTkwMCwgdG0tPnRtX21vbiArIDEsIHRtLT50bV9tZGF5LAogICAgICAgICAgICB0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7CiAgICByZXR1cm4gc2J1ZjsKfQoKdm9pZApzbm1wX2Rpc2FibGVfc3lzbG9nX2VudHJ5KG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2gpCnsKICAgIGlmICghbG9naCB8fCAhbG9naC0+ZW5hYmxlZCB8fCBsb2doLT50eXBlICE9IE5FVFNOTVBfTE9HSEFORExFUl9TWVNMT0cpCiAgICAgICAgcmV0dXJuOwoKI2lmZGVmIFdJTjMyCiAgICBpZiAobG9naC0+bWFnaWMpIHsKICAgICAgICBIQU5ETEUgZXZlbnRsb2dfaCA9IChIQU5ETEUpbG9naC0+bWFnaWM7CiAgICAgICAgQ2xvc2VFdmVudExvZyhldmVudGxvZ19oKTsKICAgICAgICBsb2doLT5tYWdpYyA9IE5VTEw7CiAgICB9CiNlbHNlCiAgICBjbG9zZWxvZygpOwogICAgbG9naC0+aW1hZ2ljICA9IDA7CiNlbmRpZgoKICAgIGxvZ2gtPmVuYWJsZWQgPSAwOwp9Cgp2b2lkCnNubXBfZGlzYWJsZV9zeXNsb2codm9pZCkKewogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDsKCiAgICBmb3IgKGxvZ2ggPSBsb2doX2hlYWQ7IGxvZ2g7IGxvZ2ggPSBsb2doLT5uZXh0KQogICAgICAgIGlmIChsb2doLT5lbmFibGVkICYmIGxvZ2gtPnR5cGUgPT0gTkVUU05NUF9MT0dIQU5ETEVSX1NZU0xPRykKICAgICAgICAgICAgc25tcF9kaXNhYmxlX3N5c2xvZ19lbnRyeShsb2doKTsKfQoKdm9pZApzbm1wX2Rpc2FibGVfZmlsZWxvZ19lbnRyeShuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doKQp7CiAgICBpZiAoIWxvZ2ggLyogfHwgIWxvZ2gtPmVuYWJsZWQgKi8gfHwgbG9naC0+dHlwZSAhPSBORVRTTk1QX0xPR0hBTkRMRVJfRklMRSkKICAgICAgICByZXR1cm47CgogICAgaWYgKGxvZ2gtPm1hZ2ljKSB7CiAgICAgICAgZnB1dHMoIlxuIiwgKEZJTEUqKWxvZ2gtPm1hZ2ljKTsJLyogWFhYIC0gd2h5PyAqLwogICAgICAgIGZjbG9zZSgoRklMRSopbG9naC0+bWFnaWMpOwogICAgICAgIGxvZ2gtPm1hZ2ljICAgPSBOVUxMOwogICAgfQogICAgbG9naC0+ZW5hYmxlZCA9IDA7Cn0KCnZvaWQKc25tcF9kaXNhYmxlX2ZpbGVsb2codm9pZCkKewogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDsKCiAgICBmb3IgKGxvZ2ggPSBsb2doX2hlYWQ7IGxvZ2g7IGxvZ2ggPSBsb2doLT5uZXh0KQogICAgICAgIGlmIChsb2doLT5lbmFibGVkICYmIGxvZ2gtPnR5cGUgPT0gTkVUU05NUF9MT0dIQU5ETEVSX0ZJTEUpCiAgICAgICAgICAgIHNubXBfZGlzYWJsZV9maWxlbG9nX2VudHJ5KGxvZ2gpOwp9CgovKgogKiByZXR1cm5zIHRoYXQgc3RhdHVzIG9mIHN0ZGVyciBsb2dnaW5nCiAqCiAqIEByZXR2YWwgMCA6IHN0ZGVyciBsb2dnaW5nIGRpc2FibGVkCiAqIEByZXR2YWwgMSA6IHN0ZGVyciBsb2dnaW5nIGVuYWJsZWQKICovCmludApzbm1wX3N0ZGVycmxvZ19zdGF0dXModm9pZCkKewogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDsKCiAgICBmb3IgKGxvZ2ggPSBsb2doX2hlYWQ7IGxvZ2g7IGxvZ2ggPSBsb2doLT5uZXh0KQogICAgICAgIGlmIChsb2doLT5lbmFibGVkICYmIChsb2doLT50eXBlID09IE5FVFNOTVBfTE9HSEFORExFUl9TVERPVVQgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naC0+dHlwZSA9PSBORVRTTk1QX0xPR0hBTkRMRVJfU1RERVJSKSkgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgIH0KCiAgICByZXR1cm4gMDsKfQoKdm9pZApzbm1wX2Rpc2FibGVfc3RkZXJybG9nKHZvaWQpCnsKICAgIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2g7CgogICAgZm9yIChsb2doID0gbG9naF9oZWFkOyBsb2doOyBsb2doID0gbG9naC0+bmV4dCkKICAgICAgICBpZiAobG9naC0+ZW5hYmxlZCAmJiAobG9naC0+dHlwZSA9PSBORVRTTk1QX0xPR0hBTkRMRVJfU1RET1VUIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2gtPnR5cGUgPT0gTkVUU05NUF9MT0dIQU5ETEVSX1NUREVSUikpIHsKICAgICAgICAgICAgbG9naC0+ZW5hYmxlZCA9IDA7Cgl9Cn0KCnZvaWQKc25tcF9kaXNhYmxlX2NhbGxsb2codm9pZCkKewogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDsKCiAgICBmb3IgKGxvZ2ggPSBsb2doX2hlYWQ7IGxvZ2g7IGxvZ2ggPSBsb2doLT5uZXh0KQogICAgICAgIGlmIChsb2doLT5lbmFibGVkICYmIGxvZ2gtPnR5cGUgPT0gTkVUU05NUF9MT0dIQU5ETEVSX0NBTExCQUNLKSB7CiAgICAgICAgICAgIGxvZ2gtPmVuYWJsZWQgPSAwOwoJfQp9Cgp2b2lkCnNubXBfZGlzYWJsZV9sb2codm9pZCkKewogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDsKCiAgICBmb3IgKGxvZ2ggPSBsb2doX2hlYWQ7IGxvZ2g7IGxvZ2ggPSBsb2doLT5uZXh0KSB7CiAgICAgICAgaWYgKGxvZ2gtPnR5cGUgPT0gTkVUU05NUF9MT0dIQU5ETEVSX1NZU0xPRykKICAgICAgICAgICAgc25tcF9kaXNhYmxlX3N5c2xvZ19lbnRyeShsb2doKTsKICAgICAgICBpZiAobG9naC0+dHlwZSA9PSBORVRTTk1QX0xPR0hBTkRMRVJfRklMRSkKICAgICAgICAgICAgc25tcF9kaXNhYmxlX2ZpbGVsb2dfZW50cnkobG9naCk7CiAgICAgICAgbG9naC0+ZW5hYmxlZCA9IDA7CiAgICB9Cn0KCi8qCiAqIGNsb3NlIGFuZCByZW9wZW4gYWxsIGZpbGUgYmFzZWQgbG9ncywgdG8gYWxsb3cgbG9nZmlsZQogKiByb3RhdGlvbi4KICovCnZvaWQKbmV0c25tcF9sb2dnaW5nX3Jlc3RhcnQodm9pZCkKewogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDsKCiAgICBmb3IgKGxvZ2ggPSBsb2doX2hlYWQ7IGxvZ2g7IGxvZ2ggPSBsb2doLT5uZXh0KSB7CiAgICAgICAgaWYgKDAgPT0gbG9naC0+ZW5hYmxlZCkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgaWYgKGxvZ2gtPnR5cGUgPT0gTkVUU05NUF9MT0dIQU5ETEVSX1NZU0xPRykgewogICAgICAgICAgICBzbm1wX2Rpc2FibGVfc3lzbG9nX2VudHJ5KGxvZ2gpOwogICAgICAgICAgICBzbm1wX2VuYWJsZV9zeXNsb2dfaWRlbnQobG9naC0+dG9rZW4sKGludCkoaW50cHRyX3QpbG9naC0+bWFnaWMpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChsb2doLT50eXBlID09IE5FVFNOTVBfTE9HSEFORExFUl9GSUxFKSB7CiAgICAgICAgICAgIHNubXBfZGlzYWJsZV9maWxlbG9nX2VudHJ5KGxvZ2gpOwogICAgICAgICAgICAvKiogaG1tLCBkb24ndCB6ZXJvIHN0YXR1cyBpc24ndCBzYXZlZC4uIGkgdGhpbmsgaXQncwogICAgICAgICAgICAgKiBzYWZlciBub3QgdG8gb3ZlcndyaXRlLCBpbiBjYXNlIGEgaHVwIGlzIGp1c3QgdG8KICAgICAgICAgICAgICogcmUtcmVhZCBjb25maWcgZmlsZXMuLi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG5ldHNubXBfZW5hYmxlX2ZpbGVsb2cobG9naCwgMSk7CiAgICAgICAgfQogICAgfQp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKdm9pZApzbm1wX2VuYWJsZV9zeXNsb2codm9pZCkKewogICAgc25tcF9lbmFibGVfc3lzbG9nX2lkZW50KHNubXBfbG9nX3N5c2xvZ25hbWUoMCksIExPR19EQUVNT04pOwp9Cgp2b2lkCnNubXBfZW5hYmxlX3N5c2xvZ19pZGVudChjb25zdCBjaGFyICppZGVudCwgY29uc3QgaW50IGZhY2lsaXR5KQp7CiAgICBuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doOwogICAgaW50ICAgICAgICAgICAgICAgICAgZm91bmQgPSAwOwogICAgaW50ICAgICAgICAgICAgICAgICAgZW5hYmxlID0gMTsKI2lmZGVmIFdJTjMyCiAgICBIQU5ETEUgICAgICAgICAgICAgICBldmVudGxvZ19oOwojZWxzZQogICAgdm9pZCAgICAgICAgICAgICAgICAqZXZlbnRsb2dfaCA9IE5VTEw7CiNlbmRpZgoKICAgIHNubXBfZGlzYWJsZV9zeXNsb2coKTsJLyogPz8/ICovCiNpZmRlZiBXSU4zMgogICAgZXZlbnRsb2dfaCA9IE9wZW5FdmVudExvZyhOVUxMLCBpZGVudCk7CiAgICBpZiAoZXZlbnRsb2dfaCA9PSBOVUxMKSB7CgkgICAgLyoKCSAgICAgKiBIbW1tLi4uLi4KCSAgICAgKiBNYXliZSBkaXNhYmxlIHRoaXMgaGFuZGxlciwgYW5kIGxvZyB0aGUgZXJyb3IgPwoJICAgICAqLwogICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IG9wZW4gZXZlbnQgbG9nIGZvciAlcy4gIgogICAgICAgICAgICAgICAgIkxhc3QgZXJyb3I6IDB4JXhcbiIsIGlkZW50LCBHZXRMYXN0RXJyb3IoKSk7CiAgICAgICAgZW5hYmxlID0gMDsKICAgIH0KI2Vsc2UKICAgIG9wZW5sb2coc25tcF9sb2dfc3lzbG9nbmFtZShpZGVudCksIExPR19DT05TIHwgTE9HX1BJRCwgZmFjaWxpdHkpOwojZW5kaWYKCiAgICBmb3IgKGxvZ2ggPSBsb2doX2hlYWQ7IGxvZ2g7IGxvZ2ggPSBsb2doLT5uZXh0KQogICAgICAgIGlmIChsb2doLT50eXBlID09IE5FVFNOTVBfTE9HSEFORExFUl9TWVNMT0cpIHsKICAgICAgICAgICAgbG9naC0+bWFnaWMgICA9ICh2b2lkKilldmVudGxvZ19oOwogICAgICAgICAgICBsb2doLT5pbWFnaWMgID0gZW5hYmxlOwkvKiBzeXNsb2cgb3BlbiAqLwogICAgICAgICAgICBsb2doLT5lbmFibGVkID0gZW5hYmxlOwogICAgICAgICAgICBmb3VuZCAgICAgICAgID0gMTsKCX0KCiAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgbG9naCA9IG5ldHNubXBfcmVnaXN0ZXJfbG9naGFuZGxlcihORVRTTk1QX0xPR0hBTkRMRVJfU1lTTE9HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HX0RFQlVHICk7CiAgICAgICAgaWYgKGxvZ2gpIHsKICAgICAgICAgICAgbG9naC0+bWFnaWMgICAgPSAodm9pZCopZXZlbnRsb2dfaDsKICAgICAgICAgICAgbG9naC0+dG9rZW4gICAgPSBzdHJkdXAoaWRlbnQpOwogICAgICAgICAgICBsb2doLT5pbWFnaWMgICA9IGVuYWJsZTsJLyogc3lzbG9nIG9wZW4gKi8KICAgICAgICAgICAgbG9naC0+ZW5hYmxlZCAgPSBlbmFibGU7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkCm5ldHNubXBfZW5hYmxlX2ZpbGVsb2cobmV0c25tcF9sb2dfaGFuZGxlciAqbG9naCwgaW50IGRvbnRfemVyb19sb2cpCnsKICAgIEZJTEUgKmxvZ2ZpbGU7CgogICAgaWYgKCFsb2doKQogICAgICAgIHJldHVybjsKCiAgICBpZiAoIWxvZ2gtPm1hZ2ljKSB7CiAgICAgICAgbG9nZmlsZSA9IGZvcGVuKGxvZ2gtPnRva2VuLCBkb250X3plcm9fbG9nID8gImEiIDogInciKTsKICAgICAgICBpZiAoIWxvZ2ZpbGUpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBsb2doLT5tYWdpYyA9ICh2b2lkKilsb2dmaWxlOwojaWZkZWYgV0lOMzIKICAgICAgICAvKgogICAgICAgICAqIEFwcGFyZW50bHksICJsaW5lIGJ1ZmZlcmluZyIgdW5kZXIgV2luZG93cyBpcwogICAgICAgICAqICBhY3R1YWxseSBpbXBsZW1lbnRlZCBhcyAiZnVsbCBidWZmZXJpbmciLgogICAgICAgICAqICBMZXQncyB0cnkgdHVybmluZyBvZmYgYnVmZmVyaW5nIGNvbXBsZXRlbHkuCiAgICAgICAgICovCiAgICAgICAgc2V0dmJ1Zihsb2dmaWxlLCBOVUxMLCBfSU9OQkYsIEJVRlNJWik7CiNlbHNlCiAgICAgICAgc2V0dmJ1Zihsb2dmaWxlLCBOVUxMLCBfSU9MQkYsIEJVRlNJWik7CiNlbmRpZgogICAgfQogICAgbG9naC0+ZW5hYmxlZCA9IDE7Cn0KCnZvaWQKc25tcF9lbmFibGVfZmlsZWxvZyhjb25zdCBjaGFyICpsb2dmaWxlbmFtZSwgaW50IGRvbnRfemVyb19sb2cpCnsKICAgIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2g7CgogICAgLyoKICAgICAqIGRvbid0IGRpc2FibGUgQUxMIGZpbGVsb2dzIHdoZW5ldmVyIGEgbmV3IG9uZSBpcyBlbmFibGVkLgogICAgICogdGhpcyBwcmV2ZW50cyAnLUxmIGZpbGUnIGZyb20gd29ya2luZyBpbiBzbm1wZCwgYXMgdGhlCiAgICAgKiBjYWxsIHRvIHNldCB1cCAvdmFyL2xvZy9zbm1wZC5sb2cgd2lsbCBkaXNhYmxlIHRoZSBwcmV2aW91cwogICAgICogbG9nIHNldHVwLgogICAgICogc25tcF9kaXNhYmxlX2ZpbGVsb2coKTsKICAgICAqLwoKICAgIGlmIChsb2dmaWxlbmFtZSkgewogICAgICAgIGxvZ2ggPSBuZXRzbm1wX2ZpbmRfbG9naGFuZGxlciggbG9nZmlsZW5hbWUgKTsKICAgICAgICBpZiAoIWxvZ2gpIHsKICAgICAgICAgICAgbG9naCA9IG5ldHNubXBfcmVnaXN0ZXJfbG9naGFuZGxlcihORVRTTk1QX0xPR0hBTkRMRVJfRklMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dfREVCVUcgKTsKICAgICAgICAgICAgaWYgKGxvZ2gpCiAgICAgICAgICAgICAgICBsb2doLT50b2tlbiA9IHN0cmR1cChsb2dmaWxlbmFtZSk7Cgl9CiAgICAgICAgaWYgKGxvZ2gpCiAgICAgICAgICAgIG5ldHNubXBfZW5hYmxlX2ZpbGVsb2cobG9naCwgZG9udF96ZXJvX2xvZyk7CiAgICB9IGVsc2UgewogICAgICAgIGZvciAobG9naCA9IGxvZ2hfaGVhZDsgbG9naDsgbG9naCA9IGxvZ2gtPm5leHQpCiAgICAgICAgICAgIGlmIChsb2doLT50eXBlID09IE5FVFNOTVBfTE9HSEFORExFUl9GSUxFKQogICAgICAgICAgICAgICAgbmV0c25tcF9lbmFibGVfZmlsZWxvZyhsb2doLCBkb250X3plcm9fbG9nKTsKICAgIH0KfQoKCnZvaWQKc25tcF9lbmFibGVfc3RkZXJybG9nKHZvaWQpCnsKICAgIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2g7CiAgICBpbnQgICAgICAgICAgICAgICAgICBmb3VuZCA9IDA7CgogICAgZm9yIChsb2doID0gbG9naF9oZWFkOyBsb2doOyBsb2doID0gbG9naC0+bmV4dCkKICAgICAgICBpZiAobG9naC0+dHlwZSA9PSBORVRTTk1QX0xPR0hBTkRMRVJfU1RET1VUIHx8CiAgICAgICAgICAgIGxvZ2gtPnR5cGUgPT0gTkVUU05NUF9MT0dIQU5ETEVSX1NUREVSUikgewogICAgICAgICAgICBsb2doLT5lbmFibGVkID0gMTsKICAgICAgICAgICAgZm91bmQgICAgICAgICA9IDE7CiAgICAgICAgfQoKICAgIGlmICghZm91bmQpIHsKICAgICAgICBsb2doID0gbmV0c25tcF9yZWdpc3Rlcl9sb2doYW5kbGVyKE5FVFNOTVBfTE9HSEFORExFUl9TVERFUlIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dfREVCVUcgKTsKICAgICAgICBpZiAobG9naCkKICAgICAgICAgICAgbG9naC0+dG9rZW4gICAgPSBzdHJkdXAoInN0ZGVyciIpOwogICAgfQp9CgoKdm9pZApzbm1wX2VuYWJsZV9jYWxsbG9nKHZvaWQpCS8qIFhYWCAtIG9yIHRha2UgYSBjYWxsYmFjayByb3V0aW5lID8/PyAqLwp7CiAgICBuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doOwogICAgaW50ICAgICAgICAgICAgICAgICAgZm91bmQgPSAwOwoKICAgIGZvciAobG9naCA9IGxvZ2hfaGVhZDsgbG9naDsgbG9naCA9IGxvZ2gtPm5leHQpCiAgICAgICAgaWYgKGxvZ2gtPnR5cGUgPT0gTkVUU05NUF9MT0dIQU5ETEVSX0NBTExCQUNLKSB7CiAgICAgICAgICAgIGxvZ2gtPmVuYWJsZWQgPSAxOwogICAgICAgICAgICBmb3VuZCAgICAgICAgID0gMTsKCX0KCiAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgbG9naCA9IG5ldHNubXBfcmVnaXN0ZXJfbG9naGFuZGxlcihORVRTTk1QX0xPR0hBTkRMRVJfQ0FMTEJBQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dfREVCVUcgKTsKICAgICAgICBpZiAobG9naCkKICAgICAgICAgICAgbG9naC0+dG9rZW4gICAgPSBzdHJkdXAoImNhbGxiYWNrIik7CiAgICB9Cn0KCgoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKCm5ldHNubXBfbG9nX2hhbmRsZXIgKgpuZXRzbm1wX2ZpbmRfbG9naGFuZGxlciggY29uc3QgY2hhciAqdG9rZW4gKQp7CiAgICBuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doOwogICAgaWYgKCF0b2tlbikKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBmb3IgKGxvZ2ggPSBsb2doX2hlYWQ7IGxvZ2g7IGxvZ2ggPSBsb2doLT5uZXh0KQogICAgICAgIGlmIChsb2doLT50b2tlbiAmJiAhc3RyY21wKCB0b2tlbiwgbG9naC0+dG9rZW4gKSkKICAgICAgICAgICAgYnJlYWs7CgogICAgcmV0dXJuIGxvZ2g7Cn0KCmludApuZXRzbm1wX2FkZF9sb2doYW5kbGVyKCBuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doICkKewogICAgaW50IGk7CiAgICBuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doMjsKCiAgICBpZiAoIWxvZ2gpCiAgICAgICAgcmV0dXJuIDA7CgogICAgLyoKICAgICAqIEZpbmQgdGhlIGFwcHJvcHJpYXRlIHBvaW50IGZvciB0aGUgbmV3IGVudHJ5Li4uCiAgICAgKiAgIChsb2doMiB3aWxsIHBvaW50IHRvIHRoZSBlbnRyeSBpbW1lZGlhdGVseSBmb2xsb3dpbmcpCiAgICAgKi8KICAgIGZvciAobG9naDIgPSBsb2doX2hlYWQ7IGxvZ2gyOyBsb2doMiA9IGxvZ2gyLT5uZXh0KQogICAgICAgIGlmICggbG9naDItPnByaW9yaXR5ID49IGxvZ2gtPnByaW9yaXR5ICkKICAgICAgICAgICAgYnJlYWs7CgogICAgLyoKICAgICAqIC4uLiBhbmQgbGluayBpdCBpbnRvIHRoZSBtYWluIGxpc3QuCiAgICAgKi8KICAgIGlmIChsb2doMikgewogICAgICAgIGlmIChsb2doMi0+cHJldikKICAgICAgICAgICAgbG9naDItPnByZXYtPm5leHQgPSBsb2doOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9naF9oZWFkID0gbG9naDsKICAgICAgICBsb2doLT5uZXh0ICA9IGxvZ2gyOwogICAgICAgIGxvZ2gyLT5wcmV2ID0gbG9naDsKICAgIH0gZWxzZSBpZiAobG9naF9oZWFkICkgewogICAgICAgIC8qCiAgICAgICAgICogSWYgbG9naDIgaXMgTlVMTCwgd2UncmUgdGFnZ2luZyBvbiB0byB0aGUgZW5kCiAgICAgICAgICovCiAgICAgICAgZm9yIChsb2doMiA9IGxvZ2hfaGVhZDsgbG9naDItPm5leHQ7IGxvZ2gyID0gbG9naDItPm5leHQpCiAgICAgICAgICAgIDsKICAgICAgICBsb2doMi0+bmV4dCA9IGxvZ2g7CiAgICB9IGVsc2UgewogICAgICAgIGxvZ2hfaGVhZCA9IGxvZ2g7CiAgICB9CgogICAgLyoKICAgICAqIEFsc28gdHdlYWsgdGhlIHJlbGV2YW50IHByaW9yaXR5LSdpbmRleCcgYXJyYXkuCiAgICAgKi8KICAgIGZvciAoaT1MT0dfRU1FUkc7IGk8PWxvZ2gtPnByaW9yaXR5OyBpKyspCiAgICAgICAgaWYgKCFsb2doX3ByaW9yaXRpZXNbaV0gfHwKICAgICAgICAgICAgIGxvZ2hfcHJpb3JpdGllc1tpXS0+cHJpb3JpdHkgPj0gbG9naC0+cHJpb3JpdHkpCiAgICAgICAgICAgICBsb2doX3ByaW9yaXRpZXNbaV0gPSBsb2doOwoKICAgIHJldHVybiAxOwp9CgpuZXRzbm1wX2xvZ19oYW5kbGVyICoKbmV0c25tcF9yZWdpc3Rlcl9sb2doYW5kbGVyKCBpbnQgdHlwZSwgaW50IHByaW9yaXR5ICkKewogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDsKCiAgICBsb2doID0gU05NUF9NQUxMT0NfVFlQRURFRihuZXRzbm1wX2xvZ19oYW5kbGVyKTsKICAgIGlmICghbG9naCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBsb2doLT50eXBlICAgICA9IHR5cGU7CiAgICBzd2l0Y2ggKCB0eXBlICkgewogICAgY2FzZSBORVRTTk1QX0xPR0hBTkRMRVJfU1RET1VUOgogICAgICAgIGxvZ2gtPmltYWdpYyAgPSAxOwogICAgICAgIC8qIGZhbGx0aHJvdWdoICovCiAgICBjYXNlIE5FVFNOTVBfTE9HSEFORExFUl9TVERFUlI6CiAgICAgICAgbG9naC0+aGFuZGxlciA9IGxvZ19oYW5kbGVyX3N0ZG91dGVycjsKICAgICAgICBicmVhazsKCiAgICBjYXNlIE5FVFNOTVBfTE9HSEFORExFUl9GSUxFOgogICAgICAgIGxvZ2gtPmhhbmRsZXIgPSBsb2dfaGFuZGxlcl9maWxlOwogICAgICAgIGxvZ2gtPmltYWdpYyAgPSAxOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBORVRTTk1QX0xPR0hBTkRMRVJfU1lTTE9HOgogICAgICAgIGxvZ2gtPmhhbmRsZXIgPSBsb2dfaGFuZGxlcl9zeXNsb2c7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIE5FVFNOTVBfTE9HSEFORExFUl9DQUxMQkFDSzoKICAgICAgICBsb2doLT5oYW5kbGVyID0gbG9nX2hhbmRsZXJfY2FsbGJhY2s7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIE5FVFNOTVBfTE9HSEFORExFUl9OT05FOgogICAgICAgIGxvZ2gtPmhhbmRsZXIgPSBsb2dfaGFuZGxlcl9udWxsOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBmcmVlKGxvZ2gpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgbG9naC0+cHJpb3JpdHkgPSBwcmlvcml0eTsKICAgIGxvZ2gtPmVuYWJsZWQgID0gMTsKICAgIG5ldHNubXBfYWRkX2xvZ2hhbmRsZXIoIGxvZ2ggKTsKICAgIHJldHVybiBsb2doOwp9CgoKaW50Cm5ldHNubXBfZW5hYmxlX2xvZ2hhbmRsZXIoIGNvbnN0IGNoYXIgKnRva2VuICkKewogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDsKCiAgICBsb2doID0gbmV0c25tcF9maW5kX2xvZ2hhbmRsZXIoIHRva2VuICk7CiAgICBpZiAoIWxvZ2gpCiAgICAgICAgcmV0dXJuIDA7CiAgICBsb2doLT5lbmFibGVkID0gMTsKICAgIHJldHVybiAxOwp9CgoKaW50Cm5ldHNubXBfZGlzYWJsZV9sb2doYW5kbGVyKCBjb25zdCBjaGFyICp0b2tlbiApCnsKICAgIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2g7CgogICAgbG9naCA9IG5ldHNubXBfZmluZF9sb2doYW5kbGVyKCB0b2tlbiApOwogICAgaWYgKCFsb2doKQogICAgICAgIHJldHVybiAwOwogICAgbG9naC0+ZW5hYmxlZCA9IDA7CiAgICByZXR1cm4gMTsKfQoKaW50Cm5ldHNubXBfcmVtb3ZlX2xvZ2hhbmRsZXIoIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2ggKQp7CiAgICBpbnQgaTsKICAgIGlmICghbG9naCkKICAgICAgICByZXR1cm4gMDsKCiAgICBpZiAobG9naC0+cHJldikKICAgICAgICBsb2doLT5wcmV2LT5uZXh0ID0gbG9naC0+bmV4dDsKICAgIGVsc2UKICAgICAgICBsb2doX2hlYWQgPSBsb2doLT5uZXh0OwoKICAgIGlmIChsb2doLT5uZXh0KQogICAgICAgIGxvZ2gtPm5leHQtPnByZXYgPSBsb2doLT5wcmV2OwoKICAgIGZvciAoaT1MT0dfRU1FUkc7IGk8PWxvZ2gtPnByaW9yaXR5OyBpKyspCiAgICAgICAgbG9naF9wcmlvcml0aWVzW2ldID0gTlVMTDsKICAgIGZyZWUoTkVUU05NUF9SRU1PVkVfQ09OU1QoY2hhciosIGxvZ2gtPnRva2VuKSk7CiAgICBTTk1QX0ZSRUUobG9naCk7CgogICAgcmV0dXJuIDE7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCmludApsb2dfaGFuZGxlcl9zdGRvdXRlcnIoICBuZXRzbm1wX2xvZ19oYW5kbGVyKiBsb2doLCBpbnQgcHJpLCBjb25zdCBjaGFyICpzdHIpCnsKICAgIGNoYXIgICAgICAgICAgICBzYnVmWzQwXTsKCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfTE9HX1RJTUVTVEFNUCkgJiYgbmV3bGluZSkgewogICAgICAgIHNwcmludGZfc3RhbXAoTlVMTCwgc2J1Zik7CiAgICB9IGVsc2UgewogICAgICAgIHN0cmNweShzYnVmLCAiIik7CiAgICB9CiAgICBuZXdsaW5lID0gc3RyW3N0cmxlbihzdHIpIC0gMV0gPT0gJ1xuJzsJLyogWFhYIC0gRWggPyAqLwoKICAgIGlmIChsb2doLT5pbWFnaWMpCiAgICAgICBwcmludGYoICAgICAgICAgIiVzJXMiLCBzYnVmLCBzdHIpOwogICAgZWxzZQogICAgICAgZnByaW50ZihzdGRlcnIsICIlcyVzIiwgc2J1Ziwgc3RyKTsKCiAgICByZXR1cm4gMTsKfQoKCiNpZmRlZiBXSU4zMgppbnQKbG9nX2hhbmRsZXJfc3lzbG9nKCAgbmV0c25tcF9sb2dfaGFuZGxlciogbG9naCwgaW50IHByaSwgY29uc3QgY2hhciAqc3RyKQp7CiAgICBXT1JEICAgICAgICAgICAgZXR5cGU7CiAgICBMUENUU1RSICAgICAgICAgZXZlbnRfbXNnWzJdOwogICAgSEFORExFICAgICAgICAgIGV2ZW50bG9nX2ggPSBsb2doLT5tYWdpYzsKCiAgICAgICAgLyoKICAgICAgICAgKiogIEVWRU5UIFRZUEVTOgogICAgICAgICAqKgogICAgICAgICAqKiAgSW5mb3JtYXRpb24gKEVWRU5UTE9HX0lORk9STUFUSU9OX1RZUEUpCiAgICAgICAgICoqICAgICAgSW5mb3JtYXRpb24gZXZlbnRzIGluZGljYXRlIGluZnJlcXVlbnQgYnV0IHNpZ25pZmljYW50CiAgICAgICAgICoqICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb25zLgogICAgICAgICAqKiAgV2FybmluZyAoRVZFTlRMT0dfV0FSTklOR19UWVBFKQogICAgICAgICAqKiAgICAgIFdhcm5pbmcgZXZlbnRzIGluZGljYXRlIHByb2JsZW1zIHRoYXQgYXJlIG5vdCBpbW1lZGlhdGVseQogICAgICAgICAqKiAgICAgIHNpZ25pZmljYW50LCBidXQgdGhhdCBtYXkgaW5kaWNhdGUgY29uZGl0aW9ucyB0aGF0IGNvdWxkCiAgICAgICAgICoqICAgICAgY2F1c2UgZnV0dXJlIHByb2JsZW1zLiBSZXNvdXJjZSBjb25zdW1wdGlvbiBpcyBhIGdvb2QKICAgICAgICAgKiogICAgICBjYW5kaWRhdGUgZm9yIGEgd2FybmluZyBldmVudC4KICAgICAgICAgKiogIEVycm9yIChFVkVOVExPR19FUlJPUl9UWVBFKQogICAgICAgICAqKiAgICAgIEVycm9yIGV2ZW50cyBpbmRpY2F0ZSBzaWduaWZpY2FudCBwcm9ibGVtcyB0aGF0IHRoZSB1c2VyCiAgICAgICAgICoqICAgICAgc2hvdWxkIGtub3cgYWJvdXQuIEVycm9yIGV2ZW50cyB1c3VhbGx5IGluZGljYXRlIGEgbG9zcyBvZgogICAgICAgICAqKiAgICAgIGZ1bmN0aW9uYWxpdHkgb3IgZGF0YS4KICAgICAgICAgKi8KICAgIHN3aXRjaCAocHJpKSB7CiAgICAgICAgY2FzZSBMT0dfRU1FUkc6CiAgICAgICAgY2FzZSBMT0dfQUxFUlQ6CiAgICAgICAgY2FzZSBMT0dfQ1JJVDoKICAgICAgICBjYXNlIExPR19FUlI6CiAgICAgICAgICAgIGV0eXBlID0gRVZFTlRMT0dfRVJST1JfVFlQRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBMT0dfV0FSTklORzoKICAgICAgICAgICAgZXR5cGUgPSBFVkVOVExPR19XQVJOSU5HX1RZUEU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTE9HX05PVElDRToKICAgICAgICBjYXNlIExPR19JTkZPOgogICAgICAgIGNhc2UgTE9HX0RFQlVHOgogICAgICAgICAgICBldHlwZSA9IEVWRU5UTE9HX0lORk9STUFUSU9OX1RZUEU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGV0eXBlID0gRVZFTlRMT0dfSU5GT1JNQVRJT05fVFlQRTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBldmVudF9tc2dbMF0gPSBzdHI7CiAgICBldmVudF9tc2dbMV0gPSBOVUxMOwogICAgLyogTk9URTogNHRoIHBhcmFtZXRlciBtdXN0IG1hdGNoIHdpbnNlcnZpY2UubWM6TWVzc2FnZUlkIHZhbHVlICovCiAgICBpZiAoIVJlcG9ydEV2ZW50KGV2ZW50bG9nX2gsIGV0eXBlLCAwLCAxMDAsIE5VTEwsIDEsIDAsIGV2ZW50X21zZywgTlVMTCkpIHsKCSAgICAvKgoJICAgICAqIEhtbW0uLi4uLgoJICAgICAqIE1heWJlIGRpc2FibGUgdGhpcyBoYW5kbGVyLCBhbmQgbG9nIHRoZSBlcnJvciA/CgkgICAgICovCiAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgcmVwb3J0IGV2ZW50LiAgTGFzdCBlcnJvcjogMHgleFxuIiwKCQkJR2V0TGFzdEVycm9yKCkpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgcmV0dXJuIDE7Cn0KI2Vsc2UKaW50CmxvZ19oYW5kbGVyX3N5c2xvZyggIG5ldHNubXBfbG9nX2hhbmRsZXIqIGxvZ2gsIGludCBwcmksIGNvbnN0IGNoYXIgKnN0cikKewoJLyoKCSAqIFhYWAoJICogV2UndmUgZ290IHRocmVlIGl0ZW1zIG9mIGluZm9ybWF0aW9uIHRvIHdvcmsgd2l0aDoKCSAqICAgICBJcyB0aGUgc3lzbG9nIGN1cnJlbnRseSBvcGVuPwoJICogICAgIFdoYXQgaWRlbnQgc3RyaW5nIHRvIHVzZT8KCSAqICAgICBXaGF0IGZhY2lsaXR5IHRvIGxvZyB0bz8KCSAqCgkgKiBXZSd2ZSBnb3QgdHdvICJtYWdpYyIgbG9jYXRpb25zIChpbWFnaWMgJiBtYWdpYykgcGx1cyB0aGUgdG9rZW4KCSAqLwogICAgaWYgKCEobG9naC0+aW1hZ2ljKSkgewogICAgICAgIGNvbnN0IGNoYXIgKmlkZW50ICAgID0gbG9naC0+dG9rZW47CiAgICAgICAgaW50ICAgZmFjaWxpdHkgPSAoaW50KShpbnRwdHJfdClsb2doLT5tYWdpYzsKICAgICAgICBpZiAoIWlkZW50KQogICAgICAgICAgICBpZGVudCA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0FQUFRZUEUpOwogICAgICAgIG9wZW5sb2coaWRlbnQsIExPR19DT05TIHwgTE9HX1BJRCwgZmFjaWxpdHkpOwogICAgICAgIGxvZ2gtPmltYWdpYyA9IDE7CiAgICB9CiAgICBzeXNsb2coIHByaSwgIiVzIiwgc3RyICk7CiAgICByZXR1cm4gMTsKfQojZW5kaWYgLyogIVdJTjMyICovCgoKaW50CmxvZ19oYW5kbGVyX2ZpbGUoICAgIG5ldHNubXBfbG9nX2hhbmRsZXIqIGxvZ2gsIGludCBwcmksIGNvbnN0IGNoYXIgKnN0cikKewogICAgRklMRSAgICAgICAgICAgKmZoYW5kbGU7CiAgICBjaGFyICAgICAgICAgICAgc2J1Zls0MF07CgogICAgLyoKICAgICAqIFdlIHVzZSBpbWFnaWMgdG8gc2F2ZSBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyIHRoZSBuZXh0IG91dHB1dAogICAgICogd2lsbCBzdGFydCBhIG5ldyBsaW5lLCBhbmQgdGh1cyBtaWdodCBuZWVkIGEgdGltZXN0YW1wCiAgICAgKi8KICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9MT0dfVElNRVNUQU1QKSAmJiBsb2doLT5pbWFnaWMpIHsKICAgICAgICBzcHJpbnRmX3N0YW1wKE5VTEwsIHNidWYpOwogICAgfSBlbHNlIHsKICAgICAgICBzdHJjcHkoc2J1ZiwgIiIpOwogICAgfQoKICAgIC8qCiAgICAgKiBJZiB3ZSBoYXZlbid0IGFscmVhZHkgb3BlbmVkIHRoZSBmaWxlLCB0aGVuIGRvIHNvLgogICAgICogU2F2ZSB0aGUgZmlsZWhhbmRsZSBwb2ludGVyIGZvciBuZXh0IHRpbWUuCiAgICAgKgogICAgICogTm90ZSB0aGF0IHRoaXMgc2hvdWxkIHN0aWxsIHdvcmssIGV2ZW4gaWYgdGhlIGZpbGUKICAgICAqIGlzIGNsb3NlZCBpbiB0aGUgbWVhbnRpbWUgKGUuZy4gYSByZWd1bGFyICJjbGVhbnVwIiBzd2VlcCkKICAgICAqLwogICAgZmhhbmRsZSA9IChGSUxFKilsb2doLT5tYWdpYzsKICAgIGlmICghbG9naC0+bWFnaWMpIHsKICAgICAgICBmaGFuZGxlID0gZm9wZW4obG9naC0+dG9rZW4sICJhKyIpOwogICAgICAgIGlmICghZmhhbmRsZSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgbG9naC0+bWFnaWMgPSAodm9pZCopZmhhbmRsZTsKICAgIH0KICAgIGZwcmludGYoZmhhbmRsZSwgIiVzJXMiLCBzYnVmLCBzdHIpOwogICAgZmZsdXNoKGZoYW5kbGUpOwogICAgbG9naC0+aW1hZ2ljID0gc3RyW3N0cmxlbihzdHIpIC0gMV0gPT0gJ1xuJzsKICAgIHJldHVybiAxOwp9CgppbnQKbG9nX2hhbmRsZXJfY2FsbGJhY2sobmV0c25tcF9sb2dfaGFuZGxlciogbG9naCwgaW50IHByaSwgY29uc3QgY2hhciAqc3RyKQp7CgkvKgoJICogWFhYIC0gcGVyaGFwcyByZXBsYWNlICdzbm1wX2NhbGxfY2FsbGJhY2tzJyBwcm9jZXNzaW5nCgkgKiAgICAgICB3aXRoIGluZGl2aWR1YWwgY2FsbGJhY2sgbG9nX2hhbmRsZXJzID8/CgkgKi8KICAgIHN0cnVjdCBzbm1wX2xvZ19tZXNzYWdlIHNsbTsKICAgIGludCAgICAgICAgICAgICBkb2RlYnVnID0gc25tcF9nZXRfZG9fZGVidWdnaW5nKCk7CgogICAgc2xtLnByaW9yaXR5ID0gcHJpOwogICAgc2xtLm1zZyA9IHN0cjsKICAgIGlmIChkb2RlYnVnKSAgICAgICAgICAgIC8qIHR1cm4gb2ZmIGRlYnVnZ2luZyBpbnNpZGUgdGhlIGNhbGxiYWNrcyBlbHNlIHdpbGwgbG9vcCAqLwogICAgICAgIHNubXBfc2V0X2RvX2RlYnVnZ2luZygwKTsKICAgIHNubXBfY2FsbF9jYWxsYmFja3MoU05NUF9DQUxMQkFDS19MSUJSQVJZLCBTTk1QX0NBTExCQUNLX0xPR0dJTkcsICZzbG0pOwogICAgaWYgKGRvZGVidWcpCiAgICAgICAgc25tcF9zZXRfZG9fZGVidWdnaW5nKGRvZGVidWcpOwogICAgcmV0dXJuIDE7Cn0KCmludApsb2dfaGFuZGxlcl9udWxsKCAgICBuZXRzbm1wX2xvZ19oYW5kbGVyKiBsb2doLCBpbnQgcHJpLCBjb25zdCBjaGFyICpzdHIpCnsKICAgIC8qCiAgICAgKiBEdW1teSBsb2cgaGFuZGxlciAtIGp1c3QgdGhyb3cgYXdheSB0aGUgZXJyb3IgY29tcGxldGVseQogICAgICogWW91IHByb2JhYmx5IGRvbid0IHJlYWxseSB3YW50IHRvIGRvIHRoaXMhCiAgICAgKi8KICAgIHJldHVybiAxOwp9Cgp2b2lkCnNubXBfbG9nX3N0cmluZyhpbnQgcHJpb3JpdHksIGNvbnN0IGNoYXIgKnN0cikKewogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDsKCiAgICAvKgogICAgICogV2UndmUgZ290IHRvIGJlIGFibGUgdG8gbG9nIG1lc3NhZ2VzICpzb21ld2hlcmUqIQogICAgICogSWYgeW91IGRvbid0IHdhbnQgc3RkZXJyIGxvZ2dpbmcsIHRoZW4gZW5hYmxlIHNvbWV0aGluZyBlbHNlLgogICAgICovCiAgICBpZiAoIWxvZ2hfaGVhZCkgewogICAgICAgIHNubXBfZW5hYmxlX3N0ZGVycmxvZygpOwogICAgICAgIHNubXBfbG9nX3N0cmluZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGxvZyBoYW5kbGluZyBlbmFibGVkIC0gdHVybmluZyBvbiBzdGRlcnIgbG9nZ2luZ1xuIik7CiAgICB9CgogICAgLyoKICAgICAqIFN0YXJ0IGF0IHRoZSBnaXZlbiBwcmlvcml0eSwgYW5kIHdvcmsgInVwd2FyZHMiLi4uLgogICAgICovCiAgICBsb2doID0gbG9naF9wcmlvcml0aWVzW3ByaW9yaXR5XTsKICAgIGZvciAoIDsgbG9naDsgbG9naCA9IGxvZ2gtPm5leHQgKSB7CiAgICAgICAgLyoKICAgICAgICAgKiAuLi4gYnV0IHNraXBwaW5nIGFueSBoYW5kbGVycyB3aXRoIGEgIm1heGltdW0gcHJpb3JpdHkiCiAgICAgICAgICogICAgIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGV4Y2VlZGVkLiBBbmQgZG9uJ3QgZm9yZ2V0IHRvCiAgICAgICAgICogICAgIGVuc3VyZSB0aGlzIGxvZ2dpbmcgaXMgdHVybmVkIG9uIChzZWUgc25tcF9kaXNhYmxlX3N0ZGVycmxvZwogICAgICAgICAqICAgICBhbmQgaXRzIGNvaG9ydHMpLgogICAgICAgICAqLwogICAgICAgIGlmIChsb2doLT5lbmFibGVkICYmIChwcmlvcml0eSA+PSBsb2doLT5wcmlfbWF4KSkKICAgICAgICAgICAgbG9naC0+aGFuZGxlciggbG9naCwgcHJpb3JpdHksIHN0ciApOwogICAgfQp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgoKLyoqCiAqIFRoaXMgc25tcCBsb2dnaW5nIGZ1bmN0aW9uIGFsbG93cyB2YXJpYWJsZSBhcmd1bWVudCBsaXN0IGdpdmVuIHRoZQogKiBzcGVjaWZpZWQgcHJpb3JpdHksIGZvcm1hdCBhbmQgYSBwb3B1bGF0ZWQgdmFfbGlzdCBzdHJ1Y3R1cmUuCiAqIFRoZSBkZWZhdWx0IGxvZ2ZpbGUgdGhpcyBmdW5jdGlvbiB3cml0ZXMgdG8gaXMgL3Zhci9sb2cvc25tcGQubG9nLgogKgogKiBAcGFyYW0gcHJpb3JpdHkgaXMgYW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIHR5cGUgb2YgbWVzc2FnZSB0byBiZSB3cml0dGVuCiAqCXRvIHRoZSBzbm1wIGxvZyBmaWxlLiAgVGhlIHR5cGVzIGFyZSBlcnJvcnMsIHdhcm5pbmcsIGFuZCBpbmZvcm1hdGlvbi4KICogICAgICAtIFRoZSBlcnJvciB0eXBlcyBhcmU6CiAqICAgICAgICAtIExPR19FTUVSRyAgICAgICBzeXN0ZW0gaXMgdW51c2FibGUgCiAqICAgICAgICAtIExPR19BTEVSVCAgICAgICBhY3Rpb24gbXVzdCBiZSB0YWtlbiBpbW1lZGlhdGVseSAKICogICAgICAgIC0gTE9HX0NSSVQgICAgICAgIGNyaXRpY2FsIGNvbmRpdGlvbnMgCiAqICAgICAgICAtIExPR19FUlIgICAgICAgICBlcnJvciBjb25kaXRpb25zCiAqICAgICAgLSBUaGUgd2FybmluZyB0eXBlIGlzOgogKiAgICAgICAgLSBMT0dfV0FSTklORyAgICAgd2FybmluZyBjb25kaXRpb25zIAogKiAgICAgIC0gVGhlIGluZm9ybWF0aW9uIHR5cGVzIGFyZToKICogICAgICAgIC0gTE9HX05PVElDRSAgICAgIG5vcm1hbCBidXQgc2lnbmlmaWNhbnQgY29uZGl0aW9uCiAqICAgICAgICAtIExPR19JTkZPICAgICAgICBpbmZvcm1hdGlvbmFsCiAqICAgICAgICAtIExPR19ERUJVRyAgICAgICBkZWJ1Zy1sZXZlbCBtZXNzYWdlcwogKgogKiBAcGFyYW0gZm9ybWF0IGlzIGEgcG9pbnRlciB0byBhIGNoYXIgcmVwcmVzZW50aW5nIHRoZSB2YXJpYWJsZSBhcmd1bWVudCBsaXN0CiAqCWZvcm1hdCB1c2VkLgogKgogKiBAcGFyYW0gYXAgaXMgYSB2YV9saXN0IHR5cGUgdXNlZCB0byB0cmF2ZXJzZSB0aGUgbGlzdCBvZiBhcmd1bWVudHMuCiAqCiAqIEByZXR1cm4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIHdoZW4gdGhlIGNvZGUgY291bGQgbm90IGZvcm1hdCB0aGUgbG9nLQogKiAgICAgICAgIHN0cmluZywgLTIgd2hlbiBkeW5hbWljIG1lbW9yeSBjb3VsZCBub3QgYmUgYWxsb2NhdGVkIGlmIHRoZSBsZW5ndGgKICogICAgICAgICBvZiB0aGUgbG9nIGJ1ZmZlciBpcyBncmVhdGVyIHRoZW4gMTAyNCBieXRlcy4gIEZvciBlYWNoIG9mIHRoZXNlCiAqICAgICAgICAgZXJyb3JzIGEgTE9HX0VSUiBtZXNzZ2FlIGlzIHdyaXR0ZW4gdG8gdGhlIGxvZ2ZpbGUuCiAqCiAqIEBzZWUgc25tcF9sb2cKICovCmludApzbm1wX3Zsb2coaW50IHByaW9yaXR5LCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApCnsKICAgIGNoYXIgICAgICAgICAgICBidWZmZXJbTE9HTEVOR1RIXTsKICAgIGludCAgICAgICAgICAgICBsZW5ndGg7CiAgICBjaGFyICAgICAgICAgICAqZHluYW1pYzsKICAgIHZhX2xpc3QgICAgICAgICBhcTsKCiAgICB2YV9jb3B5KGFxLCBhcCk7CiAgICBsZW5ndGggPSB2c25wcmludGYoYnVmZmVyLCBMT0dMRU5HVEgsIGZvcm1hdCwgYXApOwogICAgdmFfZW5kKGFwKTsKCiAgICBpZiAobGVuZ3RoID09IDApIHsKI2lmZGVmIE5FRURfVkFfRU5EX0FGVEVSX1ZBX0NPUFkKICAgICAgICB2YV9lbmQoYXEpOwojZW5kaWYKICAgICAgICByZXR1cm4gKDApOyAgICAgICAgICAgICAvKiBFbXB0eSBzdHJpbmcgKi8KICAgIH0KCiAgICBpZiAobGVuZ3RoID09IC0xKSB7CiAgICAgICAgc25tcF9sb2dfc3RyaW5nKExPR19FUlIsICJDb3VsZCBub3QgZm9ybWF0IGxvZy1zdHJpbmdcbiIpOwojaWZkZWYgTkVFRF9WQV9FTkRfQUZURVJfVkFfQ09QWQogICAgICAgIHZhX2VuZChhcSk7CiNlbmRpZgogICAgICAgIHJldHVybiAoLTEpOwogICAgfQoKICAgIGlmIChsZW5ndGggPCBMT0dMRU5HVEgpIHsKICAgICAgICBzbm1wX2xvZ19zdHJpbmcocHJpb3JpdHksIGJ1ZmZlcik7CiNpZmRlZiBORUVEX1ZBX0VORF9BRlRFUl9WQV9DT1BZCiAgICAgICAgdmFfZW5kKGFxKTsKI2VuZGlmCiAgICAgICAgcmV0dXJuICgwKTsKICAgIH0KCiAgICBkeW5hbWljID0gKGNoYXIgKikgbWFsbG9jKGxlbmd0aCArIDEpOwogICAgaWYgKGR5bmFtaWMgPT0gTlVMTCkgewogICAgICAgIHNubXBfbG9nX3N0cmluZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgbG9nLW1lc3NhZ2VcbiIpOwogICAgICAgIHNubXBfbG9nX3N0cmluZyhwcmlvcml0eSwgYnVmZmVyKTsKI2lmZGVmIE5FRURfVkFfRU5EX0FGVEVSX1ZBX0NPUFkKICAgICAgICB2YV9lbmQoYXEpOwojZW5kaWYKICAgICAgICByZXR1cm4gKC0yKTsKICAgIH0KCiAgICB2c25wcmludGYoZHluYW1pYywgbGVuZ3RoICsgMSwgZm9ybWF0LCBhcSk7CiAgICBzbm1wX2xvZ19zdHJpbmcocHJpb3JpdHksIGR5bmFtaWMpOwogICAgZnJlZShkeW5hbWljKTsKICAgIHZhX2VuZChhcSk7CiAgICByZXR1cm4gMDsKfQoKLyoqCiAqIFRoaXMgc25tcCBsb2dnaW5nIGZ1bmN0aW9uIGFsbG93cyB2YXJpYWJsZSBhcmd1bWVudCBsaXN0IGdpdmVuIHRoZQogKiBzcGVjaWZpZWQgZm9ybWF0IGFuZCBwcmlvcml0eS4gIENhbGxzIHRoZSBzbm1wX3Zsb2cgZnVuY3Rpb24uCiAqIFRoZSBkZWZhdWx0IGxvZ2ZpbGUgdGhpcyBmdW5jdGlvbiB3cml0ZXMgdG8gaXMgL3Zhci9sb2cvc25tcGQubG9nLgogKgogKiBAc2VlIHNubXBfdmxvZwogKi8KaW50CiNpZiBIQVZFX1NUREFSR19ICnNubXBfbG9nKGludCBwcmlvcml0eSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiNlbHNlCnNubXBfbG9nKHZhX2FsaXN0KQogICAgIHZhX2RjbAojZW5kaWYKewogICAgdmFfbGlzdCAgICAgICAgIGFwOwogICAgaW50ICAgICAgICAgICAgIHJldDsKI2lmIEhBVkVfU1REQVJHX0gKICAgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOwojZWxzZQogICAgaW50ICAgICAgICAgICAgIHByaW9yaXR5OwogICAgY29uc3QgY2hhciAgICAgKmZvcm1hdDsKICAgIHZhX3N0YXJ0KGFwKTsKCiAgICBwcmlvcml0eSA9IHZhX2FyZyhhcCwgaW50KTsKICAgIGZvcm1hdCA9IHZhX2FyZyhhcCwgY29uc3QgY2hhciAqKTsKI2VuZGlmCiAgICByZXQgPSBzbm1wX3Zsb2cocHJpb3JpdHksIGZvcm1hdCwgYXApOwogICAgdmFfZW5kKGFwKTsKICAgIHJldHVybiAocmV0KTsKfQoKLyoKICogbG9nIGEgY3JpdGljYWwgZXJyb3IuCiAqLwp2b2lkCnNubXBfbG9nX3BlcnJvcihjb25zdCBjaGFyICpzKQp7CiAgICBjaGFyICAgICAgICAgICAqZXJyb3IgPSBzdHJlcnJvcihlcnJubyk7CiAgICBpZiAocykgewogICAgICAgIGlmIChlcnJvcikKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIiVzOiAlc1xuIiwgcywgZXJyb3IpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIiVzOiBFcnJvciAlZCBvdXQtb2YtcmFuZ2VcbiIsIHMsIGVycm5vKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGVycm9yKQogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiJXNcbiIsIGVycm9yKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJFcnJvciAlZCBvdXQtb2YtcmFuZ2VcbiIsIGVycm5vKTsKICAgIH0KfQoKLyogZXh0ZXJuYWwgYWNjZXNzIHRvIGxvZ2hfaGVhZCB2YXJpYWJsZSAqLwpuZXRzbm1wX2xvZ19oYW5kbGVyICAqCmdldF9sb2doX2hlYWQodm9pZCkKewoJcmV0dXJuIGxvZ2hfaGVhZDsKfQoKLyoqICBAfSAqLwo=