LyoKICogQ29weXJpZ2h0IChjKSAxOTgwIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCiAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgogKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAogKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCiAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCiAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQogKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCiAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKICogU1VDSCBEQU1BR0UuCiAqLwoKLyoKICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CiAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICoKICogMjAwMC0wNy0zMCBQZXIgQW5kcmVhcyBCdWVyIDxwZXJAbGlucHJvLm5vPiAtIGFkZGVkICJxIi1vcHRpb24KICovCgovKgogKiBzY3JpcHQKICovCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxwYXRocy5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8dGVybWlvcy5oPgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNpbmNsdWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSA8c3lzL2ZpbGUuaD4KI2luY2x1ZGUgPHN5cy9zaWduYWwuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlICJubHMuaCIKCiNpZmRlZiBfX2xpbnV4X18KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNlbmRpZgoKI2lmZGVmIEhBVkVfTElCVVRJTAojaW5jbHVkZSA8cHR5Lmg+CiNlbmRpZgoKdm9pZCBmaW5pc2goaW50KTsKdm9pZCBkb25lKHZvaWQpOwp2b2lkIGZhaWwodm9pZCk7CnZvaWQgcmVzaXplKGludCk7CnZvaWQgZml4dHR5KHZvaWQpOwp2b2lkIGdldG1hc3Rlcih2b2lkKTsKdm9pZCBnZXRzbGF2ZSh2b2lkKTsKdm9pZCBkb2lucHV0KHZvaWQpOwp2b2lkIGRvb3V0cHV0KHZvaWQpOwp2b2lkIGRvc2hlbGwodm9pZCk7CgpjaGFyCSpzaGVsbDsKRklMRQkqZnNjcmlwdDsKaW50CW1hc3RlcjsKaW50CXNsYXZlOwppbnQJY2hpbGQ7CmludAlzdWJjaGlsZDsKY2hhcgkqZm5hbWU7CgpzdHJ1Y3QJdGVybWlvcyB0dDsKc3RydWN0CXdpbnNpemUgd2luOwppbnQJbGI7CmludAlsOwojaWZuZGVmIEhBVkVfTElCVVRJTApjaGFyCWxpbmVbXSA9ICIvZGV2L3B0eVhYIjsKI2VuZGlmCmludAlhZmxnID0gMDsKY2hhcgkqY2ZsZyA9IE5VTEw7CmludAlmZmxnID0gMDsKaW50CXFmbGcgPSAwOwppbnQJdGZsZyA9IDA7CgpzdGF0aWMgY2hhciAqcHJvZ25hbWU7CgppbnQgZGllOwoKc3RhdGljIHZvaWQKZGllX2lmX2xpbmsoY2hhciAqZm4pIHsKCXN0cnVjdCBzdGF0IHM7CgoJaWYgKGxzdGF0KGZuLCAmcykgPT0gMCAmJiAoU19JU0xOSyhzLnN0X21vZGUpIHx8IHMuc3RfbmxpbmsgPiAxKSkgewoJCWZwcmludGYoc3RkZXJyLAoJCQlfKCJXYXJuaW5nOiBgJXMnIGlzIGEgbGluay5cbiIKCQkJICAiVXNlIGAlcyBbb3B0aW9uc10gJXMnIGlmIHlvdSByZWFsbHkgIgoJCQkgICJ3YW50IHRvIHVzZSBpdC5cbiIKCQkJICAiU2NyaXB0IG5vdCBzdGFydGVkLlxuIiksCgkJCWZuLCBwcm9nbmFtZSwgZm4pOwoJCWV4aXQoMSk7Cgl9Cn0KCi8qCiAqIHNjcmlwdCAtdCBwcmludHMgdGltZSBkZWxheXMgYXMgZmxvYXRpbmcgcG9pbnQgbnVtYmVycwogKiBUaGUgZXhhbXBsZSBwcm9ncmFtIChzY3JpcHRyZXBsYXkpIHRoYXQgd2UgcHJvdmlkZSB0byBoYW5kbGUgdGhpcwogKiB0aW1pbmcgb3V0cHV0IGlzIGEgcGVybCBzY3JpcHQsIGFuZCBkb2VzIG5vdCBoYW5kbGUgbnVtYmVycyBpbgogKiBsb2NhbGUgZm9ybWF0IChub3QgZXZlbiB3aGVuICJ1c2UgbG9jYWxlOyIgaXMgYWRkZWQpLgogKiBTbywgc2luY2UgdGhlc2UgbnVtYmVycyBhcmUgbm90IGZvciBodW1hbiBjb25zdW1wdGlvbiwgaXQgc2VlbXMKICogZWFzaWVzdCB0byBzZXQgTENfTlVNRVJJQyBoZXJlLgogKi8KCmludAptYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewoJc3RydWN0IHNpZ2FjdGlvbiBzYTsKCWV4dGVybiBpbnQgb3B0aW5kOwoJY2hhciAqcDsKCWludCBjaDsKCglwcm9nbmFtZSA9IGFyZ3ZbMF07CglpZiAoKHAgPSBzdHJyY2hyKHByb2duYW1lLCAnLycpKSAhPSBOVUxMKQoJCXByb2duYW1lID0gcCsxOwoKCglzZXRsb2NhbGUoTENfQUxMLCAiIik7CglzZXRsb2NhbGUoTENfTlVNRVJJQywgIkMiKTsJLyogc2VlIGNvbW1lbnQgYWJvdmUgKi8KCWJpbmR0ZXh0ZG9tYWluKFBBQ0tBR0UsIExPQ0FMRURJUik7Cgl0ZXh0ZG9tYWluKFBBQ0tBR0UpOwoJCglpZiAoYXJnYyA9PSAyKSB7CgkJaWYgKCFzdHJjbXAoYXJndlsxXSwgIi1WIikgfHwgIXN0cmNtcChhcmd2WzFdLCAiLS12ZXJzaW9uIikpIHsKCQkJcHJpbnRmKF8oIiVzICglcylcbiIpLAoJCQkgICAgICAgcHJvZ25hbWUsIFBBQ0tBR0VfU1RSSU5HKTsKCQkJcmV0dXJuIDA7CgkJfQoJfQoKCXdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgImFjOmZxdCIpKSAhPSAtMSkKCQlzd2l0Y2goKGNoYXIpY2gpIHsKCQljYXNlICdhJzoKCQkJYWZsZysrOwoJCQlicmVhazsKCQljYXNlICdjJzoKCQkJY2ZsZyA9IG9wdGFyZzsKCQkJYnJlYWs7CgkJY2FzZSAnZic6CgkJCWZmbGcrKzsKCQkJYnJlYWs7CgkJY2FzZSAncSc6CgkJCXFmbGcrKzsKCQkJYnJlYWs7CgkJY2FzZSAndCc6CgkJCXRmbGcrKzsKCQkJYnJlYWs7CgkJY2FzZSAnPyc6CgkJZGVmYXVsdDoKCQkJZnByaW50ZihzdGRlcnIsCgkJCQlfKCJ1c2FnZTogc2NyaXB0IFstYV0gWy1mXSBbLXFdIFstdF0gW2ZpbGVdXG4iKSk7CgkJCWV4aXQoMSk7CgkJfQoJYXJnYyAtPSBvcHRpbmQ7Cglhcmd2ICs9IG9wdGluZDsKCglpZiAoYXJnYyA+IDApCgkJZm5hbWUgPSBhcmd2WzBdOwoJZWxzZSB7CgkJZm5hbWUgPSAidHlwZXNjcmlwdCI7CgkJZGllX2lmX2xpbmsoZm5hbWUpOwoJfQoJaWYgKChmc2NyaXB0ID0gZm9wZW4oZm5hbWUsIGFmbGcgPyAiYSIgOiAidyIpKSA9PSBOVUxMKSB7CgkJcGVycm9yKGZuYW1lKTsKCQlmYWlsKCk7Cgl9CgoJc2hlbGwgPSBnZXRlbnYoIlNIRUxMIik7CglpZiAoc2hlbGwgPT0gTlVMTCkKCQlzaGVsbCA9IF9QQVRIX0JTSEVMTDsKCglnZXRtYXN0ZXIoKTsKCWlmICghcWZsZykKCQlwcmludGYoXygiU2NyaXB0IHN0YXJ0ZWQsIGZpbGUgaXMgJXNcbiIpLCBmbmFtZSk7CglmaXh0dHkoKTsKCglzaWdlbXB0eXNldCgmc2Euc2FfbWFzayk7CglzYS5zYV9mbGFncyA9IDA7CgoJc2Euc2FfaGFuZGxlciA9IGZpbmlzaDsKCXNpZ2FjdGlvbihTSUdDSExELCAmc2EsIE5VTEwpOwoKCWNoaWxkID0gZm9yaygpOwoJaWYgKGNoaWxkIDwgMCkgewoJCXBlcnJvcigiZm9yayIpOwoJCWZhaWwoKTsKCX0KCWlmIChjaGlsZCA9PSAwKSB7CgkJc3ViY2hpbGQgPSBjaGlsZCA9IGZvcmsoKTsKCQlpZiAoY2hpbGQgPCAwKSB7CgkJCXBlcnJvcigiZm9yayIpOwoJCQlmYWlsKCk7CgkJfQoJCWlmIChjaGlsZCkKCQkJZG9vdXRwdXQoKTsKCQllbHNlCgkJCWRvc2hlbGwoKTsKCX0gZWxzZSB7CgkJc2Euc2FfaGFuZGxlciA9IHJlc2l6ZTsKCQlzaWdhY3Rpb24oU0lHV0lOQ0gsICZzYSwgTlVMTCk7Cgl9Cglkb2lucHV0KCk7CgoJcmV0dXJuIDA7Cn0KCnZvaWQKZG9pbnB1dCgpIHsKCXJlZ2lzdGVyIGludCBjYzsKCWNoYXIgaWJ1ZltCVUZTSVpdOwoKCSh2b2lkKSBmY2xvc2UoZnNjcmlwdCk7CgoJaWYgKGRpZSA9PSAwICYmIGNoaWxkICYmIGtpbGwoY2hpbGQsIDApID09IC0xICYmIGVycm5vID09IEVTUkNIKQoJCWRpZSA9IDE7CgoJd2hpbGUgKGRpZSA9PSAwICYmIChjYyA9IHJlYWQoMCwgaWJ1ZiwgQlVGU0laKSkgPiAwKQoJCSh2b2lkKSB3cml0ZShtYXN0ZXIsIGlidWYsIGNjKTsKCglkb25lKCk7Cn0KCiNpbmNsdWRlIDxzeXMvd2FpdC5oPgoKdm9pZApmaW5pc2goaW50IGR1bW15KSB7CglpbnQgc3RhdHVzOwoJcmVnaXN0ZXIgaW50IHBpZDsKCgl3aGlsZSAoKHBpZCA9IHdhaXQzKCZzdGF0dXMsIFdOT0hBTkcsIDApKSA+IDApCgkJaWYgKHBpZCA9PSBjaGlsZCkKCQkJZGllID0gMTsKfQoKdm9pZApyZXNpemUoaW50IGR1bW15KSB7CgkvKiB0cmFuc21pdCB3aW5kb3cgY2hhbmdlIGluZm9ybWF0aW9uIHRvIHRoZSBjaGlsZCAqLwoJKHZvaWQpIGlvY3RsKDAsIFRJT0NHV0lOU1osIChjaGFyICopJndpbik7Cgkodm9pZCkgaW9jdGwoc2xhdmUsIFRJT0NTV0lOU1osIChjaGFyICopJndpbik7CgoJa2lsbChjaGlsZCwgU0lHV0lOQ0gpOwp9CgovKgogKiBTdG9wIGV4dHJlbWVseSBzaWxseSBnY2MgY29tcGxhaW50IG9uICVjOgogKiAgd2FybmluZzogYCVjJyB5aWVsZHMgb25seSBsYXN0IDIgZGlnaXRzIG9mIHllYXIgaW4gc29tZSBsb2NhbGVzCiAqLwpzdGF0aWMgdm9pZApteV9zdHJmdGltZShjaGFyICpidWYsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKmZtdCwgY29uc3Qgc3RydWN0IHRtICp0bSkgewoJc3RyZnRpbWUoYnVmLCBsZW4sIGZtdCwgdG0pOwp9Cgp2b2lkCmRvb3V0cHV0KCkgewoJcmVnaXN0ZXIgaW50IGNjOwoJdGltZV90IHR2ZWM7CgljaGFyIG9idWZbQlVGU0laXTsKCXN0cnVjdCB0aW1ldmFsIHR2OwoJZG91YmxlIG9sZHRpbWU9dGltZShOVUxMKSwgbmV3dGltZTsKCWludCBmbGdzID0gMDsKCgkodm9pZCkgY2xvc2UoMCk7CiNpZmRlZiBIQVZFX0xJQlVUSUwKCSh2b2lkKSBjbG9zZShzbGF2ZSk7CiNlbmRpZgoJdHZlYyA9IHRpbWUoKHRpbWVfdCAqKU5VTEwpOwoJbXlfc3RyZnRpbWUob2J1Ziwgc2l6ZW9mIG9idWYsICIlY1xuIiwgbG9jYWx0aW1lKCZ0dmVjKSk7CglpZiAoIXFmbGcpCgkJZnByaW50Zihmc2NyaXB0LCBfKCJTY3JpcHQgc3RhcnRlZCBvbiAlcyIpLCBvYnVmKTsKCglpZiAoZGllID09IDAgJiYgY2hpbGQgJiYga2lsbChjaGlsZCwgMCkgPT0gLTEgJiYgZXJybm8gPT0gRVNSQ0gpCgkJLyoKCQkgKiB0aGUgU0lHQ0hMRCBoYW5kbGVyIGNvdWxkIGJlIGV4ZWN1dGVkIHdoZW4gdGhlICJjaGlsZCIKCQkgKiB2YXJpYWJsZSBpcyBub3Qgc2V0IHlldC4gSXQgbWVhbnMgdGhhdCB0aGUgImRpZSIgaXMgemVybwoJCSAqIGFsdGhvdWdodCB0aGUgY2hpbGQgcHJvY2VzcyBpcyBhbHJlYWR5IGRvbmUuIFdlIGhhdmUgdG8KCQkgKiBjaGVjayB0aGlzIHRoaW5nIG5vdy4gTm93IHdlIGhhdmUgdGhlICJjaGlsZCIgdmFyaWFibGUKCQkgKiBhbHJlYWR5IGluaXRpYWxpemVkLiBGb3IgbW9yZSBkZXRhaWxzIHNlZSBtYWluKCkgYW5kCgkJICogZmluaXNoKCkuICAtLWt6YWsgMDctQXVnLTIwMDcKCQkgKi8KCQlkaWUgPSAxOwoKCWRvIHsKCQlpZiAoZGllICYmIGZsZ3MgPT0gMCkgewoJCQkvKiAuLmNoaWxkIGlzIGRlYWQsIGJ1dCBpdCBkb2Vzbid0IG1lYW4gdGhhdCB0aGVyZSBpcwoJCQkgKiBub3RoaW5nIGluIGJ1ZmZlcnMuCgkJCSAqLwoJCQlmbGdzID0gZmNudGwobWFzdGVyLCBGX0dFVEZMLCAwKTsKCQkJaWYgKGZjbnRsKG1hc3RlciwgRl9TRVRGTCwgKGZsZ3MgfCBPX05PTkJMT0NLKSkgPT0gLTEpCgkJCQlicmVhazsKCQl9CgkJaWYgKHRmbGcpCgkJCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOwoKCQllcnJubyA9IDA7CgkJY2MgPSByZWFkKG1hc3Rlciwgb2J1Ziwgc2l6ZW9mIChvYnVmKSk7CgoJCWlmIChkaWUgJiYgZXJybm8gPT0gRUlOVFIgJiYgY2MgPD0gMCkKCQkJLyogcmVhZCgpIGhhcyBiZWVuIGludGVycnVwdGVkIGJ5IFNJR0NITEQsIHRyeSBpdCBhZ2FpbgoJCQkgKiB3aXRoIE9fTk9OQkxPQ0sKCQkJICovCgkJCWNvbnRpbnVlOwoJCWlmIChjYyA8PSAwKQoJCQlicmVhazsKCQlpZiAodGZsZykgewoJCQluZXd0aW1lID0gdHYudHZfc2VjICsgKGRvdWJsZSkgdHYudHZfdXNlYyAvIDEwMDAwMDA7CgkJCWZwcmludGYoc3RkZXJyLCAiJWYgJWlcbiIsIG5ld3RpbWUgLSBvbGR0aW1lLCBjYyk7CgkJCW9sZHRpbWUgPSBuZXd0aW1lOwoJCX0KCQkodm9pZCkgd3JpdGUoMSwgb2J1ZiwgY2MpOwoJCSh2b2lkKSBmd3JpdGUob2J1ZiwgMSwgY2MsIGZzY3JpcHQpOwoJCWlmIChmZmxnKQoJCQkodm9pZCkgZmZsdXNoKGZzY3JpcHQpOwoJfSB3aGlsZSgxKTsKCglpZiAoZmxncykKCQlmY250bChtYXN0ZXIsIEZfU0VURkwsIGZsZ3MpOwoJZG9uZSgpOwp9Cgp2b2lkCmRvc2hlbGwoKSB7CgljaGFyICpzaG5hbWU7CgojaWYgMAoJaW50IHQ7CgoJdCA9IG9wZW4oX1BBVEhfVFRZLCBPX1JEV1IpOwoJaWYgKHQgPj0gMCkgewoJCSh2b2lkKSBpb2N0bCh0LCBUSU9DTk9UVFksIChjaGFyICopMCk7CgkJKHZvaWQpIGNsb3NlKHQpOwoJfQojZW5kaWYKCglnZXRzbGF2ZSgpOwoJKHZvaWQpIGNsb3NlKG1hc3Rlcik7Cgkodm9pZCkgZmNsb3NlKGZzY3JpcHQpOwoJKHZvaWQpIGR1cDIoc2xhdmUsIDApOwoJKHZvaWQpIGR1cDIoc2xhdmUsIDEpOwoJKHZvaWQpIGR1cDIoc2xhdmUsIDIpOwoJKHZvaWQpIGNsb3NlKHNsYXZlKTsKCglzaG5hbWUgPSBzdHJyY2hyKHNoZWxsLCAnLycpOwoJaWYgKHNobmFtZSkKCQlzaG5hbWUrKzsKCWVsc2UKCQlzaG5hbWUgPSBzaGVsbDsKCglpZiAoY2ZsZykKCQlleGVjbChzaGVsbCwgc2huYW1lLCAiLWMiLCBjZmxnLCBOVUxMKTsKCWVsc2UKCQlleGVjbChzaGVsbCwgc2huYW1lLCAiLWkiLCBOVUxMKTsKCglwZXJyb3Ioc2hlbGwpOwoJZmFpbCgpOwp9Cgp2b2lkCmZpeHR0eSgpIHsKCXN0cnVjdCB0ZXJtaW9zIHJ0dDsKCglydHQgPSB0dDsKCWNmbWFrZXJhdygmcnR0KTsKCXJ0dC5jX2xmbGFnICY9IH5FQ0hPOwoJKHZvaWQpIHRjc2V0YXR0cigwLCBUQ1NBRkxVU0gsICZydHQpOwp9Cgp2b2lkCmZhaWwoKSB7CgoJKHZvaWQpIGtpbGwoMCwgU0lHVEVSTSk7Cglkb25lKCk7Cn0KCnZvaWQKZG9uZSgpIHsKCXRpbWVfdCB0dmVjOwoKCWlmIChzdWJjaGlsZCkgewoJCWlmICghcWZsZykgewoJCQljaGFyIGJ1ZltCVUZTSVpdOwoJCQl0dmVjID0gdGltZSgodGltZV90ICopTlVMTCk7CgkJCW15X3N0cmZ0aW1lKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIiVjXG4iLCBsb2NhbHRpbWUoJnR2ZWMpKTsKCQkJZnByaW50Zihmc2NyaXB0LCBfKCJcblNjcmlwdCBkb25lIG9uICVzIiksIGJ1Zik7CgkJfQoJCSh2b2lkKSBmY2xvc2UoZnNjcmlwdCk7CgkJKHZvaWQpIGNsb3NlKG1hc3Rlcik7Cgl9IGVsc2UgewoJCSh2b2lkKSB0Y3NldGF0dHIoMCwgVENTQUZMVVNILCAmdHQpOwoJCWlmICghcWZsZykKCQkJcHJpbnRmKF8oIlNjcmlwdCBkb25lLCBmaWxlIGlzICVzXG4iKSwgZm5hbWUpOwoJfQoJZXhpdCgwKTsKfQoKdm9pZApnZXRtYXN0ZXIoKSB7CiNpZmRlZiBIQVZFX0xJQlVUSUwKCSh2b2lkKSB0Y2dldGF0dHIoMCwgJnR0KTsKCSh2b2lkKSBpb2N0bCgwLCBUSU9DR1dJTlNaLCAoY2hhciAqKSZ3aW4pOwoJaWYgKG9wZW5wdHkoJm1hc3RlciwgJnNsYXZlLCBOVUxMLCAmdHQsICZ3aW4pIDwgMCkgewoJCWZwcmludGYoc3RkZXJyLCBfKCJvcGVucHR5IGZhaWxlZFxuIikpOwoJCWZhaWwoKTsKCX0KI2Vsc2UKCWNoYXIgKnB0eSwgKmJhbmssICpjcDsKCXN0cnVjdCBzdGF0IHN0YjsKCglwdHkgPSAmbGluZVtzdHJsZW4oIi9kZXYvcHR5cCIpXTsKCWZvciAoYmFuayA9ICJwcXJzIjsgKmJhbms7IGJhbmsrKykgewoJCWxpbmVbc3RybGVuKCIvZGV2L3B0eSIpXSA9ICpiYW5rOwoJCSpwdHkgPSAnMCc7CgkJaWYgKHN0YXQobGluZSwgJnN0YikgPCAwKQoJCQlicmVhazsKCQlmb3IgKGNwID0gIjAxMjM0NTY3ODlhYmNkZWYiOyAqY3A7IGNwKyspIHsKCQkJKnB0eSA9ICpjcDsKCQkJbWFzdGVyID0gb3BlbihsaW5lLCBPX1JEV1IpOwoJCQlpZiAobWFzdGVyID49IDApIHsKCQkJCWNoYXIgKnRwID0gJmxpbmVbc3RybGVuKCIvZGV2LyIpXTsKCQkJCWludCBvazsKCgkJCQkvKiB2ZXJpZnkgc2xhdmUgc2lkZSBpcyB1c2FibGUgKi8KCQkJCSp0cCA9ICd0JzsKCQkJCW9rID0gYWNjZXNzKGxpbmUsIFJfT0t8V19PSykgPT0gMDsKCQkJCSp0cCA9ICdwJzsKCQkJCWlmIChvaykgewoJCQkJCSh2b2lkKSB0Y2dldGF0dHIoMCwgJnR0KTsKCQkJCSAgICAJKHZvaWQpIGlvY3RsKDAsIFRJT0NHV0lOU1osIAoJCQkJCQkoY2hhciAqKSZ3aW4pOwoJCQkJCXJldHVybjsKCQkJCX0KCQkJCSh2b2lkKSBjbG9zZShtYXN0ZXIpOwoJCQl9CgkJfQoJfQoJZnByaW50ZihzdGRlcnIsIF8oIk91dCBvZiBwdHknc1xuIikpOwoJZmFpbCgpOwojZW5kaWYgLyogbm90IEhBVkVfTElCVVRJTCAqLwp9Cgp2b2lkCmdldHNsYXZlKCkgewojaWZuZGVmIEhBVkVfTElCVVRJTAoJbGluZVtzdHJsZW4oIi9kZXYvIildID0gJ3QnOwoJc2xhdmUgPSBvcGVuKGxpbmUsIE9fUkRXUik7CglpZiAoc2xhdmUgPCAwKSB7CgkJcGVycm9yKGxpbmUpOwoJCWZhaWwoKTsKCX0KCSh2b2lkKSB0Y3NldGF0dHIoc2xhdmUsIFRDU0FGTFVTSCwgJnR0KTsKCSh2b2lkKSBpb2N0bChzbGF2ZSwgVElPQ1NXSU5TWiwgKGNoYXIgKikmd2luKTsKI2VuZGlmCgkodm9pZCkgc2V0c2lkKCk7Cgkodm9pZCkgaW9jdGwoc2xhdmUsIFRJT0NTQ1RUWSwgMCk7Cn0K