LyoKICogdGVzdGFwaS5jOiBsaWJ4bWwyIEFQSSB0ZXN0ZXIgcHJvZ3JhbS4KICoKICogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgZ2VudGVzdC5weSBmcm9tIGxpYnhtbDItYXBpLnhtbAogKgogKiBTZWUgQ29weXJpZ2h0IGZvciB0aGUgc3RhdHVzIG9mIHRoaXMgc29mdHdhcmUuCiAqCiAqIGRhbmllbEB2ZWlsbGFyZC5jb20KICovCgojaWZkZWYgSEFWRV9DT05GSUdfSAojaW5jbHVkZSAibGlieG1sLmgiCiNlbHNlCiNpbmNsdWRlIDxzdGRpby5oPgojZW5kaWYKCiNpbmNsdWRlIDxzdGRsaWIuaD4gLyogZm9yIHB1dGVudigpICovCiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGxpYnhtbC94bWxlcnJvci5oPgojaW5jbHVkZSA8bGlieG1sL3JlbGF4bmcuaD4KCiNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYKI2VuZGlmCgpzdGF0aWMgaW50IHRlc3RsaWJ4bWwyKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfbW9kdWxlKGNvbnN0IGNoYXIgKm1vZHVsZSk7CgpzdGF0aWMgaW50IGdlbmVyaWNfZXJyb3JzID0gMDsKc3RhdGljIGludCBjYWxsX3Rlc3RzID0gMDsKc3RhdGljIGludCBmdW5jdGlvbl90ZXN0cyA9IDA7CgpzdGF0aWMgeG1sQ2hhciBjaGFydGFiWzEwMjRdOwpzdGF0aWMgaW50IGludHRhYlsxMDI0XTsKc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZ3RhYlsxMDI0XTsKCnN0YXRpYyB4bWxEb2NQdHIgYXBpX2RvYyA9IE5VTEw7CnN0YXRpYyB4bWxEdGRQdHIgYXBpX2R0ZCA9IE5VTEw7CnN0YXRpYyB4bWxOb2RlUHRyIGFwaV9yb290ID0gTlVMTDsKc3RhdGljIHhtbEF0dHJQdHIgYXBpX2F0dHIgPSBOVUxMOwpzdGF0aWMgeG1sTnNQdHIgYXBpX25zID0gTlVMTDsKCnN0YXRpYyB2b2lkCnN0cnVjdHVyZWRfZXJyb3JzKHZvaWQgKnVzZXJEYXRhIEFUVFJJQlVURV9VTlVTRUQsCiAgICAgICAgICAgICAgICAgIHhtbEVycm9yUHRyIGVycm9yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGdlbmVyaWNfZXJyb3JzKys7Cn0KCnN0YXRpYyB2b2lkCmZyZWVfYXBpX2RvYyh2b2lkKSB7CiAgICB4bWxGcmVlRG9jKGFwaV9kb2MpOwogICAgYXBpX2RvYyA9IE5VTEw7CiAgICBhcGlfZHRkID0gTlVMTDsKICAgIGFwaV9yb290ID0gTlVMTDsKICAgIGFwaV9hdHRyID0gTlVMTDsKICAgIGFwaV9ucyA9IE5VTEw7Cn0KCnN0YXRpYyB4bWxEb2NQdHIKZ2V0X2FwaV9kb2Modm9pZCkgewogICAgaWYgKGFwaV9kb2MgPT0gTlVMTCkgewogICAgICAgIGFwaV9kb2MgPSB4bWxSZWFkTWVtb3J5KCI8IURPQ1RZUEUgcm9vdCBbPCFFTEVNRU5UIHJvb3QgRU1QVFk+XT48cm9vdCB4bWxuczpoPSdodHRwOi8vZXhhbXBsZS5jb20vJyBoOmZvbz0nYmFyJy8+IiwgODgsICJyb290X3Rlc3QiLCBOVUxMLCAwKTsKCWFwaV9yb290ID0gTlVMTDsKCWFwaV9hdHRyID0gTlVMTDsKICAgIH0KICAgIHJldHVybihhcGlfZG9jKTsKfQoKc3RhdGljIHhtbER0ZFB0cgpnZXRfYXBpX2R0ZCh2b2lkKSB7CiAgICBpZiAoKGFwaV9kdGQgPT0gTlVMTCkgfHwgKGFwaV9kdGQtPnR5cGUgIT0gWE1MX0RURF9OT0RFKSkgewogICAgICAgIGdldF9hcGlfZG9jKCk7CglpZiAoKGFwaV9kb2MgIT0gTlVMTCkgJiYgKGFwaV9kb2MtPmNoaWxkcmVuICE9IE5VTEwpICYmCgkgICAgKGFwaV9kb2MtPmNoaWxkcmVuLT50eXBlID09IFhNTF9EVERfTk9ERSkpCgkgICAgYXBpX2R0ZCA9ICh4bWxEdGRQdHIpIGFwaV9kb2MtPmNoaWxkcmVuOwogICAgfQogICAgcmV0dXJuKGFwaV9kdGQpOwp9CgpzdGF0aWMgeG1sTm9kZVB0cgpnZXRfYXBpX3Jvb3Qodm9pZCkgewogICAgaWYgKChhcGlfcm9vdCA9PSBOVUxMKSB8fCAoYXBpX3Jvb3QtPnR5cGUgIT0gWE1MX0VMRU1FTlRfTk9ERSkpIHsKICAgICAgICBnZXRfYXBpX2RvYygpOwoJaWYgKChhcGlfZG9jICE9IE5VTEwpICYmIChhcGlfZG9jLT5jaGlsZHJlbiAhPSBOVUxMKSAmJgoJICAgIChhcGlfZG9jLT5jaGlsZHJlbi0+bmV4dCAhPSBOVUxMKSAmJgoJICAgIChhcGlfZG9jLT5jaGlsZHJlbi0+bmV4dC0+dHlwZSA9PSBYTUxfRUxFTUVOVF9OT0RFKSkKCSAgICBhcGlfcm9vdCA9IGFwaV9kb2MtPmNoaWxkcmVuLT5uZXh0OwogICAgfQogICAgcmV0dXJuKGFwaV9yb290KTsKfQoKc3RhdGljIHhtbE5zUHRyCmdldF9hcGlfbnModm9pZCkgewogICAgZ2V0X2FwaV9yb290KCk7CiAgICBpZiAoYXBpX3Jvb3QgIT0gTlVMTCkKICAgICAgICBhcGlfbnMgPSBhcGlfcm9vdC0+bnNEZWY7CiAgICByZXR1cm4oYXBpX25zKTsKfQoKc3RhdGljIHhtbEF0dHJQdHIKZ2V0X2FwaV9hdHRyKHZvaWQpIHsKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfWElOQ0xVREVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBzdGF0aWMgaW50IG5yID0gMDsKICAgIHhtbENoYXIgbmFtZVsyMF07CiNlbmRpZgoKICAgIGlmICgoYXBpX3Jvb3QgPT0gTlVMTCkgfHwgKGFwaV9yb290LT50eXBlICE9IFhNTF9FTEVNRU5UX05PREUpKSB7CiAgICAgICAgZ2V0X2FwaV9yb290KCk7CiAgICB9CiAgICBpZiAoYXBpX3Jvb3QgPT0gTlVMTCkgCiAgICAgICAgcmV0dXJuKE5VTEwpOwogICAgaWYgKGFwaV9yb290LT5wcm9wZXJ0aWVzICE9IE5VTEwpIHsKICAgICAgICBhcGlfYXR0ciA9IGFwaV9yb290LT5wcm9wZXJ0aWVzOwogICAgICAgIHJldHVybihhcGlfcm9vdC0+cHJvcGVydGllcyk7CiAgICB9CiAgICBhcGlfYXR0ciA9IE5VTEw7CiNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX1hJTkNMVURFX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgc25wcmludGYoKGNoYXIgKikgbmFtZSwgMjAsICJmb28lZCIsIG5yKyspOwogICAgYXBpX2F0dHIgPSB4bWxTZXRQcm9wKGFwaV9yb290LCBuYW1lLCAoY29uc3QgeG1sQ2hhciAqKSAiYmFyIik7CiNlbmRpZgogICAgcmV0dXJuKGFwaV9hdHRyKTsKfQoKc3RhdGljIGludCBxdWlldCA9IDA7CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKICAgIGludCByZXQ7CiAgICBpbnQgYmxvY2tzLCBtZW07CgogICAgLyogYWNjZXNzIHRvIHRoZSBwcm94eSBjYW4gc2xvdyB1cCByZWdyZXNzaW9uIHRlc3RzIGEgbG90ICovCiAgICBwdXRlbnYoKGNoYXIgKikgImh0dHBfcHJveHk9Iik7CgogICAgbWVtc2V0KGNoYXJ0YWIsIDAsIHNpemVvZihjaGFydGFiKSk7CiAgICBzdHJuY3B5KChjaGFyICopIGNoYXJ0YWIsICIgIGNoYXJ0YWJcbiIsIDIwKTsKICAgIG1lbXNldChpbnR0YWIsIDAsIHNpemVvZihpbnR0YWIpKTsKICAgIG1lbXNldChsb25ndGFiLCAwLCBzaXplb2YobG9uZ3RhYikpOwoKICAgIHhtbEluaXRQYXJzZXIoKTsKI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKICAgIHhtbFJlbGF4TkdJbml0VHlwZXMoKTsKI2VuZGlmCgogICAgTElCWE1MX1RFU1RfVkVSU0lPTgoKICAgIHhtbFNldFN0cnVjdHVyZWRFcnJvckZ1bmMoTlVMTCwgc3RydWN0dXJlZF9lcnJvcnMpOwoKICAgIGlmIChhcmdjID49IDIpIHsKICAgICAgICBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLXEiKSkgewoJICAgIHF1aWV0ID0gMTsKCSAgICBpZiAoYXJnYyA+PSAzKQoJICAgICAgICByZXQgPSB0ZXN0X21vZHVsZShhcmd2WzJdKTsKCSAgICBlbHNlCgkJcmV0ID0gdGVzdGxpYnhtbDIoKTsKICAgICAgICB9IGVsc2UgewoJICAgcmV0ID0gdGVzdF9tb2R1bGUoYXJndlsxXSk7Cgl9CiAgICB9IGVsc2UKCXJldCA9IHRlc3RsaWJ4bWwyKCk7CgogICAgeG1sQ2xlYW51cFBhcnNlcigpOwogICAgYmxvY2tzID0geG1sTWVtQmxvY2tzKCk7CiAgICBtZW0gPSB4bWxNZW1Vc2VkKCk7CiAgICBpZiAoKGJsb2NrcyAhPSAwKSB8fCAobWVtICE9IDApKSB7CiAgICAgICAgcHJpbnRmKCJ0ZXN0YXBpIGxlYWtlZCAlZCBieXRlcyBpbiAlZCBibG9ja3NcbiIsIG1lbSwgYmxvY2tzKTsKICAgIH0KICAgIHhtbE1lbW9yeUR1bXAoKTsKCiAgICByZXR1cm4gKHJldCAhPSAwKTsKfQoKI2luY2x1ZGUgPGxpYnhtbC9IVE1McGFyc2VyLmg+CiNpbmNsdWRlIDxsaWJ4bWwvSFRNTHRyZWUuaD4KI2luY2x1ZGUgPGxpYnhtbC9jYXRhbG9nLmg+CiNpbmNsdWRlIDxsaWJ4bWwvY2h2YWxpZC5oPgojaW5jbHVkZSA8bGlieG1sL2RpY3QuaD4KI2luY2x1ZGUgPGxpYnhtbC9lbmNvZGluZy5oPgojaW5jbHVkZSA8bGlieG1sL2VudGl0aWVzLmg+CiNpbmNsdWRlIDxsaWJ4bWwvaGFzaC5oPgojaW5jbHVkZSA8bGlieG1sL2xpc3QuaD4KI2luY2x1ZGUgPGxpYnhtbC9uYW5vZnRwLmg+CiNpbmNsdWRlIDxsaWJ4bWwvbmFub2h0dHAuaD4KI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXJJbnRlcm5hbHMuaD4KI2luY2x1ZGUgPGxpYnhtbC9wYXR0ZXJuLmg+CiNpbmNsdWRlIDxsaWJ4bWwvcmVsYXhuZy5oPgojaW5jbHVkZSA8bGlieG1sL3NjaGVtYXNJbnRlcm5hbHMuaD4KI2luY2x1ZGUgPGxpYnhtbC9zY2hlbWF0cm9uLmg+CiNpbmNsdWRlIDxsaWJ4bWwvdHJlZS5oPgojaW5jbHVkZSA8bGlieG1sL3VyaS5oPgojaW5jbHVkZSA8bGlieG1sL3ZhbGlkLmg+CiNpbmNsdWRlIDxsaWJ4bWwveGluY2x1ZGUuaD4KI2luY2x1ZGUgPGxpYnhtbC94bWxJTy5oPgojaW5jbHVkZSA8bGlieG1sL3htbGVycm9yLmg+CiNpbmNsdWRlIDxsaWJ4bWwveG1scmVhZGVyLmg+CiNpbmNsdWRlIDxsaWJ4bWwveG1sc2F2ZS5oPgojaW5jbHVkZSA8bGlieG1sL3htbHNjaGVtYXMuaD4KI2luY2x1ZGUgPGxpYnhtbC94bWxzY2hlbWFzdHlwZXMuaD4KI2luY2x1ZGUgPGxpYnhtbC94bWxzdHJpbmcuaD4KI2luY2x1ZGUgPGxpYnhtbC94bWx3cml0ZXIuaD4KI2luY2x1ZGUgPGxpYnhtbC94cGF0aC5oPgojaW5jbHVkZSA8bGlieG1sL3hwb2ludGVyLmg+CiNpbmNsdWRlIDxsaWJ4bWwvZGVidWdYTUwuaD4KCi8qIAogIFdlIG1hbnVhbGx5IGRlZmluZSB4bWxFcnJNZW1vcnkgYmVjYXVzZSBpdCdzIG5vcm1hbCBkZWNsYXJhdGlvbgogIGlzICJoaWRkZW4iIGJ5ICNpZmRlZiBJTl9MSUJYTUwKKi8Kdm9pZCB4bWxFcnJNZW1vcnkoeG1sUGFyc2VyQ3R4dFB0ciBjdHh0LCBjb25zdCBjaGFyICpleHRyYSk7CgovKgogV2UgbmVlZCBzb21lICJyZW1vdGUiIGFkZHJlc3NlcywgYnV0IHdhbnQgdG8gYXZvaWQgZ2V0dGluZyBpbnRvCiBuYW1lIHJlc29sdXRpb24gZGVsYXlzLCBzbyB3ZSB1c2UgdGhlc2UKKi8KI2RlZmluZQlSRU1PVEUxR09PRAkiaHR0cDovL2xvY2FsaG9zdC8iCiNkZWZpbmUJUkVNT1RFMUJBRAkiaHR0cDpodHRwOi8vaHR0cCIKI2RlZmluZQlSRU1PVEUyR09PRAkiZnRwOi8vbG9jYWxob3N0L2ZvbyIKCiNkZWZpbmUgZ2VuX25iX3ZvaWRfcHRyIDIKCnN0YXRpYyB2b2lkICpnZW5fdm9pZF9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3ZvaWRfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB2b2lkICp2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2lmIDAKI2RlZmluZSBnZW5fbmJfY29uc3Rfdm9pZF9wdHIgMgoKc3RhdGljIGNvbnN0IHZvaWQgKmdlbl9jb25zdF92b2lkX3B0cihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKChjb25zdCB2b2lkICopICJpbW11dGFibGUgc3RyaW5nIik7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX2NvbnN0X3ZvaWRfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB2b2lkICp2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCiNkZWZpbmUgZ2VuX25iX3VzZXJkYXRhIDMKCnN0YXRpYyB2b2lkICpnZW5fdXNlcmRhdGEoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybigodm9pZCAqKSAmY2FsbF90ZXN0cyk7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKCh2b2lkICopIC0xKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfdXNlcmRhdGEoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHZvaWQgKnZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgoKI2RlZmluZSBnZW5fbmJfaW50IDQKCnN0YXRpYyBpbnQgZ2VuX2ludChpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKDApOwogICAgaWYgKG5vID09IDEpIHJldHVybigxKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oLTEpOwogICAgaWYgKG5vID09IDMpIHJldHVybigxMjIpOwogICAgcmV0dXJuKC0xKTsKfQoKc3RhdGljIHZvaWQgZGVzX2ludChpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZGVmaW5lIGdlbl9uYl9wYXJzZXJvcHRpb25zIDUKCnN0YXRpYyBpbnQgZ2VuX3BhcnNlcm9wdGlvbnMoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybihYTUxfUEFSU0VfTk9CTEFOS1MgfCBYTUxfUEFSU0VfUkVDT1ZFUik7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKFhNTF9QQVJTRV9OT0VOVCB8IFhNTF9QQVJTRV9EVERMT0FEIHwgWE1MX1BBUlNFX0RUREFUVFIgfCBYTUxfUEFSU0VfRFREVkFMSUQgfCBYTUxfUEFSU0VfTk9DREFUQSk7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKFhNTF9QQVJTRV9YSU5DTFVERSB8IFhNTF9QQVJTRV9OT1hJTkNOT0RFIHwgWE1MX1BBUlNFX05TQ0xFQU4pOwogICAgaWYgKG5vID09IDMpIHJldHVybihYTUxfUEFSU0VfWElOQ0xVREUgfCBYTUxfUEFSU0VfTk9ESUNUKTsKICAgIHJldHVybihYTUxfUEFSU0VfU0FYMSk7Cn0KCnN0YXRpYyB2b2lkIGRlc19wYXJzZXJvcHRpb25zKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCiNpZiAwCiNkZWZpbmUgZ2VuX25iX2xvbmcgNQoKc3RhdGljIGxvbmcgZ2VuX2xvbmcoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybigwKTsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oMSk7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKC0xKTsKICAgIGlmIChubyA9PSAzKSByZXR1cm4oMTIyKTsKICAgIHJldHVybigtMSk7Cn0KCnN0YXRpYyB2b2lkIGRlc19sb25nKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBsb25nIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKI2RlZmluZSBnZW5fbmJfeG1sQ2hhciA0CgpzdGF0aWMgeG1sQ2hhciBnZW5feG1sQ2hhcihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKCdhJyk7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKCcgJyk7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKCh4bWxDaGFyKSAn+CcpOwogICAgcmV0dXJuKDApOwp9CgpzdGF0aWMgdm9pZCBkZXNfeG1sQ2hhcihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sQ2hhciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2RlZmluZSBnZW5fbmJfdW5zaWduZWRfaW50IDMKCnN0YXRpYyB1bnNpZ25lZCBpbnQgZ2VuX3Vuc2lnbmVkX2ludChpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKDApOwogICAgaWYgKG5vID09IDEpIHJldHVybigxKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oMTIyKTsKICAgIHJldHVybigodW5zaWduZWQgaW50KSAtMSk7Cn0KCnN0YXRpYyB2b2lkIGRlc191bnNpZ25lZF9pbnQoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHVuc2lnbmVkIGludCB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2RlZmluZSBnZW5fbmJfdW5zaWduZWRfbG9uZyA0CgpzdGF0aWMgdW5zaWduZWQgbG9uZyBnZW5fdW5zaWduZWRfbG9uZyhpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKDApOwogICAgaWYgKG5vID09IDEpIHJldHVybigxKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oMTIyKTsKICAgIHJldHVybigodW5zaWduZWQgbG9uZykgLTEpOwp9CgpzdGF0aWMgdm9pZCBkZXNfdW5zaWduZWRfbG9uZyhpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgdW5zaWduZWQgbG9uZyB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2RlZmluZSBnZW5fbmJfZG91YmxlIDQKCnN0YXRpYyBkb3VibGUgZ2VuX2RvdWJsZShpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKDApOwogICAgaWYgKG5vID09IDEpIHJldHVybigtMS4xKTsKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpZiAobm8gPT0gMikgcmV0dXJuKHhtbFhQYXRoTkFOKTsKI2VuZGlmCiAgICByZXR1cm4oLTEpOwp9CgpzdGF0aWMgdm9pZCBkZXNfZG91YmxlKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBkb3VibGUgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCiNkZWZpbmUgZ2VuX25iX3Vuc2lnbmVkX2xvbmdfcHRyIDIKCnN0YXRpYyB1bnNpZ25lZCBsb25nICpnZW5fdW5zaWduZWRfbG9uZ19wdHIoaW50IG5vLCBpbnQgbnIpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oJmxvbmd0YWJbbnJdKTsKICAgIHJldHVybihOVUxMKTsKfQoKc3RhdGljIHZvaWQgZGVzX3Vuc2lnbmVkX2xvbmdfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB1bnNpZ25lZCBsb25nICp2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2RlZmluZSBnZW5fbmJfaW50X3B0ciAyCgpzdGF0aWMgaW50ICpnZW5faW50X3B0cihpbnQgbm8sIGludCBucikgewogICAgaWYgKG5vID09IDApIHJldHVybigmaW50dGFiW25yXSk7CiAgICByZXR1cm4oTlVMTCk7Cn0KCnN0YXRpYyB2b2lkIGRlc19pbnRfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgKnZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZGVmaW5lIGdlbl9uYl9jb25zdF9jaGFyX3B0ciA0CgpzdGF0aWMgY2hhciAqZ2VuX2NvbnN0X2NoYXJfcHRyKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oKGNoYXIgKikgImZvbyIpOwogICAgaWYgKG5vID09IDEpIHJldHVybigoY2hhciAqKSAiPGZvby8+Iik7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKChjaGFyICopICJ0ZXN0L2VudDIiKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfY29uc3RfY2hhcl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IGNoYXIgKnZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZGVmaW5lIGdlbl9uYl94bWxDaGFyX3B0ciAyCgpzdGF0aWMgeG1sQ2hhciAqZ2VuX3htbENoYXJfcHRyKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oJmNoYXJ0YWJbMF0pOwogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxDaGFyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sQ2hhciAqdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCiNkZWZpbmUgZ2VuX25iX0ZJTEVfcHRyIDIKCnN0YXRpYyBGSUxFICpnZW5fRklMRV9wdHIoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybihmb3BlbigidGVzdC5vdXQiLCAiYSsiKSk7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX0ZJTEVfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBGSUxFICp2YWwsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAodmFsICE9IE5VTEwpIGZjbG9zZSh2YWwpOwp9CgojZGVmaW5lIGdlbl9uYl9kZWJ1Z19GSUxFX3B0ciAyCnN0YXRpYyBGSUxFICpnZW5fZGVidWdfRklMRV9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oZm9wZW4oInRlc3Qub3V0IiwgImErIikpOwp9CnN0YXRpYyB2b2lkIGRlc19kZWJ1Z19GSUxFX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgRklMRSAqdmFsLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKHZhbCAhPSBOVUxMKSBmY2xvc2UodmFsKTsKfQoKI2RlZmluZSBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHIgNQoKc3RhdGljIHhtbENoYXIgKmdlbl9jb25zdF94bWxDaGFyX3B0cihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKCh4bWxDaGFyICopICJmb28iKTsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oKHhtbENoYXIgKikgIjxmb28vPiIpOwogICAgaWYgKG5vID09IDIpIHJldHVybigoeG1sQ2hhciAqKSAibvhuZSIpOwogICAgaWYgKG5vID09IDMpIHJldHVybigoeG1sQ2hhciAqKSAiIDJhYiAiKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfY29uc3RfeG1sQ2hhcl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKnZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZGVmaW5lIGdlbl9uYl9maWxlcGF0aCA4CgpzdGF0aWMgY29uc3QgY2hhciAqZ2VuX2ZpbGVwYXRoKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oIm1pc3NpbmcueG1sIik7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKCI8Zm9vLz4iKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oInRlc3QvZW50MiIpOwogICAgaWYgKG5vID09IDMpIHJldHVybigidGVzdC92YWxpZC9SRUMteG1sLTE5OTgwMjEwLnhtbCIpOwogICAgaWYgKG5vID09IDQpIHJldHVybigidGVzdC92YWxpZC9kdGRzL3hodG1sMS1zdHJpY3QuZHRkIik7CiAgICBpZiAobm8gPT0gNSkgcmV0dXJuKFJFTU9URTFHT09EKTsKICAgIGlmIChubyA9PSA2KSByZXR1cm4oUkVNT1RFMUJBRCk7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX2ZpbGVwYXRoKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCBjaGFyICp2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2RlZmluZSBnZW5fbmJfZWF0ZW5fbmFtZSAyCgpzdGF0aWMgeG1sQ2hhciAqZ2VuX2VhdGVuX25hbWUoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybih4bWxTdHJkdXAoQkFEX0NBU1QgImVhdGVuIikpOwogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc19lYXRlbl9uYW1lKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxDaGFyICp2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2RlZmluZSBnZW5fbmJfZmlsZW91dHB1dCA2CgpzdGF0aWMgY29uc3QgY2hhciAqZ2VuX2ZpbGVvdXRwdXQoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybigiL21pc3NpbmcueG1sIik7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKCI8Zm9vLz4iKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oUkVNT1RFMkdPT0QpOwogICAgaWYgKG5vID09IDMpIHJldHVybihSRU1PVEUxR09PRCk7CiAgICBpZiAobm8gPT0gNCkgcmV0dXJuKFJFTU9URTFCQUQpOwogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc19maWxlb3V0cHV0KGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCBjaGFyICp2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2RlZmluZSBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0ciAzCnN0YXRpYyB4bWxQYXJzZXJDdHh0UHRyIGdlbl94bWxQYXJzZXJDdHh0UHRyKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oeG1sTmV3UGFyc2VyQ3R4dCgpKTsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oeG1sQ3JlYXRlTWVtb3J5UGFyc2VyQ3R4dCgiPGRvYy8+IiwgNikpOwogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxQYXJzZXJDdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxQYXJzZXJDdHh0UHRyIHZhbCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmICh2YWwgIT0gTlVMTCkKICAgICAgICB4bWxGcmVlUGFyc2VyQ3R4dCh2YWwpOwp9CgojZGVmaW5lIGdlbl9uYl94bWxTQVhIYW5kbGVyUHRyIDIKc3RhdGljIHhtbFNBWEhhbmRsZXJQdHIgZ2VuX3htbFNBWEhhbmRsZXJQdHIoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgaWYgKG5vID09IDApIHJldHVybigoeG1sU0FYSGFuZGxlclB0cikgJnhtbERlZmF1bHRTQVhIYW5kbGVyKTsKI2VuZGlmCiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFNBWEhhbmRsZXJQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFNBWEhhbmRsZXJQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCiNkZWZpbmUgZ2VuX25iX3htbFZhbGlkQ3R4dFB0ciAyCnN0YXRpYyB4bWxWYWxpZEN0eHRQdHIgZ2VuX3htbFZhbGlkQ3R4dFB0cihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiNpZmRlZiBMSUJYTUxfVkFMSURfRU5BQkxFRAogICAgaWYgKG5vID09IDApIHJldHVybih4bWxOZXdWYWxpZEN0eHQoKSk7CiNlbmRpZgogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxWYWxpZEN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFZhbGlkQ3R4dFB0ciB2YWwsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiNpZmRlZiBMSUJYTUxfVkFMSURfRU5BQkxFRAogICAgaWYgKHZhbCAhPSBOVUxMKQogICAgICAgIHhtbEZyZWVWYWxpZEN0eHQodmFsKTsKI2VuZGlmCn0KCiNkZWZpbmUgZ2VuX25iX3htbFBhcnNlcklucHV0QnVmZmVyUHRyIDgKCnN0YXRpYyB4bWxQYXJzZXJJbnB1dEJ1ZmZlclB0ciBnZW5feG1sUGFyc2VySW5wdXRCdWZmZXJQdHIoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybih4bWxQYXJzZXJJbnB1dEJ1ZmZlckNyZWF0ZUZpbGVuYW1lKCJtaXNzaW5nLnhtbCIsIFhNTF9DSEFSX0VOQ09ESU5HX05PTkUpKTsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oeG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVGaWxlbmFtZSgiPGZvby8+IiwgWE1MX0NIQVJfRU5DT0RJTkdfTk9ORSkpOwogICAgaWYgKG5vID09IDIpIHJldHVybih4bWxQYXJzZXJJbnB1dEJ1ZmZlckNyZWF0ZUZpbGVuYW1lKCJ0ZXN0L2VudDIiLCBYTUxfQ0hBUl9FTkNPRElOR19OT05FKSk7CiAgICBpZiAobm8gPT0gMykgcmV0dXJuKHhtbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlRmlsZW5hbWUoInRlc3QvdmFsaWQvUkVDLXhtbC0xOTk4MDIxMC54bWwiLCBYTUxfQ0hBUl9FTkNPRElOR19OT05FKSk7CiAgICBpZiAobm8gPT0gNCkgcmV0dXJuKHhtbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlRmlsZW5hbWUoInRlc3QvdmFsaWQvZHRkcy94aHRtbDEtc3RyaWN0LmR0ZCIsIFhNTF9DSEFSX0VOQ09ESU5HX05PTkUpKTsKICAgIGlmIChubyA9PSA1KSByZXR1cm4oeG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVGaWxlbmFtZShSRU1PVEUxR09PRCwgWE1MX0NIQVJfRU5DT0RJTkdfTk9ORSkpOwogICAgaWYgKG5vID09IDYpIHJldHVybih4bWxQYXJzZXJJbnB1dEJ1ZmZlckNyZWF0ZUZpbGVuYW1lKFJFTU9URTFCQUQsIFhNTF9DSEFSX0VOQ09ESU5HX05PTkUpKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFBhcnNlcklucHV0QnVmZmVyUHRyIHZhbCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHhtbEZyZWVQYXJzZXJJbnB1dEJ1ZmZlcih2YWwpOwp9CgojZGVmaW5lIGdlbl9uYl94bWxEb2NQdHIgNApzdGF0aWMgeG1sRG9jUHRyIGdlbl94bWxEb2NQdHIoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybih4bWxOZXdEb2MoQkFEX0NBU1QgIjEuMCIpKTsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oeG1sUmVhZE1lbW9yeSgiPGZvby8+IiwgNiwgInRlc3QiLCBOVUxMLCAwKSk7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKHhtbFJlYWRNZW1vcnkoIjwhRE9DVFlQRSBmb28gW10+IDxmb28vPiIsIDI0LCAidGVzdCIsIE5VTEwsIDApKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sRG9jUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxEb2NQdHIgdmFsLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKCh2YWwgIT0gTlVMTCkgJiYgKHZhbCAhPSBhcGlfZG9jKSAmJiAodmFsLT5kb2MgIT0gYXBpX2RvYykpCiAgICAgICAgeG1sRnJlZURvYyh2YWwpOwp9CgojZGVmaW5lIGdlbl9uYl94bWxBdHRyUHRyIDIKc3RhdGljIHhtbEF0dHJQdHIgZ2VuX3htbEF0dHJQdHIoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybihnZXRfYXBpX2F0dHIoKSk7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbEF0dHJQdHIoaW50IG5vLCB4bWxBdHRyUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIGZyZWVfYXBpX2RvYygpOwp9CgojZGVmaW5lIGdlbl9uYl94bWxEaWN0UHRyIDIKc3RhdGljIHhtbERpY3RQdHIgZ2VuX3htbERpY3RQdHIoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybih4bWxEaWN0Q3JlYXRlKCkpOwogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxEaWN0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxEaWN0UHRyIHZhbCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmICh2YWwgIT0gTlVMTCkKICAgICAgICB4bWxEaWN0RnJlZSh2YWwpOwp9CgojZGVmaW5lIGdlbl9uYl94bWxOb2RlUHRyIDMKc3RhdGljIHhtbE5vZGVQdHIgZ2VuX3htbE5vZGVQdHIoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybih4bWxOZXdQSShCQURfQ0FTVCAidGVzdCIsIE5VTEwpKTsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oZ2V0X2FwaV9yb290KCkpOwogICAgcmV0dXJuKE5VTEwpOwovKiAgICAgaWYgKG5vID09IDIpIHJldHVybigoeG1sTm9kZVB0cikgZ2V0X2FwaV9kb2MoKSk7ICovCn0Kc3RhdGljIHZvaWQgZGVzX3htbE5vZGVQdHIoaW50IG5vLCB4bWxOb2RlUHRyIHZhbCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAxKSB7CiAgICAgICAgZnJlZV9hcGlfZG9jKCk7CiAgICB9IGVsc2UgaWYgKHZhbCAhPSBOVUxMKSB7CiAgICAgICAgeG1sVW5saW5rTm9kZSh2YWwpOwogICAgICAgIHhtbEZyZWVOb2RlKHZhbCk7CiAgICB9Cn0KCiNkZWZpbmUgZ2VuX25iX3htbER0ZFB0ciAzCnN0YXRpYyB4bWxEdGRQdHIgZ2VuX3htbER0ZFB0cihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgCiAgICAgICAgcmV0dXJuKHhtbE5ld0R0ZChOVUxMLCBCQURfQ0FTVCAiZHRkIiwgQkFEX0NBU1QiZm9vIiwgQkFEX0NBU1QiYmFyIikpOwogICAgaWYgKG5vID09IDEpIHJldHVybihnZXRfYXBpX2R0ZCgpKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sRHRkUHRyKGludCBubywgeG1sRHRkUHRyIHZhbCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAxKSBmcmVlX2FwaV9kb2MoKTsKICAgIGVsc2UgaWYgKHZhbCAhPSBOVUxMKSB7CiAgICAgICAgeG1sVW5saW5rTm9kZSgoeG1sTm9kZVB0cikgdmFsKTsKICAgICAgICB4bWxGcmVlTm9kZSgoeG1sTm9kZVB0cikgdmFsKTsKICAgIH0KfQoKI2RlZmluZSBnZW5fbmJfeG1sTnNQdHIgMgpzdGF0aWMgeG1sTnNQdHIgZ2VuX3htbE5zUHRyKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oZ2V0X2FwaV9ucygpKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sTnNQdHIoaW50IG5vLCB4bWxOc1B0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSBmcmVlX2FwaV9kb2MoKTsKfQoKI2RlZmluZSBnZW5fbmJfeG1sTm9kZVB0cl9pbiAzCnN0YXRpYyB4bWxOb2RlUHRyIGdlbl94bWxOb2RlUHRyX2luKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oeG1sTmV3UEkoQkFEX0NBU1QgInRlc3QiLCBOVUxMKSk7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKHhtbE5ld1RleHQoQkFEX0NBU1QgInRleHQiKSk7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbE5vZGVQdHJfaW4oaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbE5vZGVQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCiNpZmRlZiBMSUJYTUxfV1JJVEVSX0VOQUJMRUQKI2RlZmluZSBnZW5fbmJfeG1sVGV4dFdyaXRlclB0ciAyCnN0YXRpYyB4bWxUZXh0V3JpdGVyUHRyIGdlbl94bWxUZXh0V3JpdGVyUHRyKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oeG1sTmV3VGV4dFdyaXRlckZpbGVuYW1lKCJ0ZXN0Lm91dCIsIDApKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sVGV4dFdyaXRlclB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sVGV4dFdyaXRlclB0ciB2YWwsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAodmFsICE9IE5VTEwpIHhtbEZyZWVUZXh0V3JpdGVyKHZhbCk7Cn0KI2VuZGlmCgojaWZkZWYgTElCWE1MX1JFQURFUl9FTkFCTEVECiNkZWZpbmUgZ2VuX25iX3htbFRleHRSZWFkZXJQdHIgNApzdGF0aWMgeG1sVGV4dFJlYWRlclB0ciBnZW5feG1sVGV4dFJlYWRlclB0cihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKHhtbE5ld1RleHRSZWFkZXJGaWxlbmFtZSgidGVzdC9lbnQyIikpOwogICAgaWYgKG5vID09IDEpIHJldHVybih4bWxOZXdUZXh0UmVhZGVyRmlsZW5hbWUoInRlc3QvdmFsaWQvUkVDLXhtbC0xOTk4MDIxMC54bWwiKSk7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKHhtbE5ld1RleHRSZWFkZXJGaWxlbmFtZSgidGVzdC92YWxpZC9kdGRzL3hodG1sMS1zdHJpY3QuZHRkIikpOwogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxUZXh0UmVhZGVyUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxUZXh0UmVhZGVyUHRyIHZhbCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmICh2YWwgIT0gTlVMTCkgeG1sRnJlZVRleHRSZWFkZXIodmFsKTsKfQojZW5kaWYKCiNkZWZpbmUgZ2VuX25iX3htbEJ1ZmZlclB0ciAzCnN0YXRpYyBjb25zdCB4bWxDaGFyICpzdGF0aWNfYnVmX2NvbnRlbnQgPSAoeG1sQ2hhciAqKSJhIHN0YXRpYyBidWZmZXIiOwpzdGF0aWMgeG1sQnVmZmVyUHRyIGdlbl94bWxCdWZmZXJQdHIoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybih4bWxCdWZmZXJDcmVhdGUoKSk7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKHhtbEJ1ZmZlckNyZWF0ZVN0YXRpYygodm9pZCAqKXN0YXRpY19idWZfY29udGVudCwgMTMpKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sQnVmZmVyUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxCdWZmZXJQdHIgdmFsLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKHZhbCAhPSBOVUxMKSB7CiAgICAgICAgeG1sQnVmZmVyRnJlZSh2YWwpOwogICAgfQp9CgojZGVmaW5lIGdlbl9uYl94bWxMaXN0UHRyIDIKc3RhdGljIHhtbExpc3RQdHIgZ2VuX3htbExpc3RQdHIoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybih4bWxMaXN0Q3JlYXRlKE5VTEwsIE5VTEwpKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sTGlzdFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sTGlzdFB0ciB2YWwsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAodmFsICE9IE5VTEwpIHsKICAgICAgICB4bWxMaXN0RGVsZXRlKHZhbCk7CiAgICB9Cn0KCiNkZWZpbmUgZ2VuX25iX3htbEhhc2hUYWJsZVB0ciAyCnN0YXRpYyB4bWxIYXNoVGFibGVQdHIgZ2VuX3htbEhhc2hUYWJsZVB0cihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKHhtbEhhc2hDcmVhdGUoMTApKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sSGFzaFRhYmxlUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxIYXNoVGFibGVQdHIgdmFsLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKHZhbCAhPSBOVUxMKSB7CiAgICAgICAgeG1sSGFzaEZyZWUodmFsLCBOVUxMKTsKICAgIH0KfQoKI2luY2x1ZGUgPGxpYnhtbC94cGF0aEludGVybmFscy5oPgoKI2lmZGVmIExJQlhNTF9YUEFUSF9FTkFCTEVECiNkZWZpbmUgZ2VuX25iX3htbFhQYXRoT2JqZWN0UHRyIDUKc3RhdGljIHhtbFhQYXRoT2JqZWN0UHRyIGdlbl94bWxYUGF0aE9iamVjdFB0cihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKHhtbFhQYXRoTmV3U3RyaW5nKEJBRF9DQVNUICJzdHJpbmcgb2JqZWN0IikpOwogICAgaWYgKG5vID09IDEpIHJldHVybih4bWxYUGF0aE5ld0Zsb2F0KDEuMSkpOwogICAgaWYgKG5vID09IDIpIHJldHVybih4bWxYUGF0aE5ld0Jvb2xlYW4oMSkpOwogICAgaWYgKG5vID09IDMpIHJldHVybih4bWxYUGF0aE5ld05vZGVTZXQoTlVMTCkpOwogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxYUGF0aE9iamVjdFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sWFBhdGhPYmplY3RQdHIgdmFsLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKHZhbCAhPSBOVUxMKSB7CiAgICAgICAgeG1sWFBhdGhGcmVlT2JqZWN0KHZhbCk7CiAgICB9Cn0KI2VuZGlmCgojaWZkZWYgTElCWE1MX09VVFBVVF9FTkFCTEVECiNkZWZpbmUgZ2VuX25iX3htbE91dHB1dEJ1ZmZlclB0ciAyCnN0YXRpYyB4bWxPdXRwdXRCdWZmZXJQdHIgZ2VuX3htbE91dHB1dEJ1ZmZlclB0cihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKHhtbE91dHB1dEJ1ZmZlckNyZWF0ZUZpbGVuYW1lKCJ0ZXN0Lm91dCIsIE5VTEwsIDApKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sT3V0cHV0QnVmZmVyUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxPdXRwdXRCdWZmZXJQdHIgdmFsLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKHZhbCAhPSBOVUxMKSB7CiAgICAgICAgeG1sT3V0cHV0QnVmZmVyQ2xvc2UodmFsKTsKICAgIH0KfQojZW5kaWYKCiNpZmRlZiBMSUJYTUxfRlRQX0VOQUJMRUQKI2RlZmluZSBnZW5fbmJfeG1sTmFub0ZUUEN0eHRQdHIgNApzdGF0aWMgdm9pZCAqZ2VuX3htbE5hbm9GVFBDdHh0UHRyKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oeG1sTmFub0ZUUE5ld0N0eHQoUkVNT1RFMkdPT0QpKTsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oeG1sTmFub0ZUUE5ld0N0eHQoUkVNT1RFMUdPT0QpKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oeG1sTmFub0ZUUE5ld0N0eHQoImZvbyIpKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sTmFub0ZUUEN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHZvaWQgKnZhbCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmICh2YWwgIT0gTlVMTCkgewogICAgICAgIHhtbE5hbm9GVFBGcmVlQ3R4dCh2YWwpOwogICAgfQp9CiNlbmRpZgoKI2lmZGVmIExJQlhNTF9IVFRQX0VOQUJMRUQKI2RlZmluZSBnZW5fbmJfeG1sTmFub0hUVFBDdHh0UHRyIDEKc3RhdGljIHZvaWQgKmdlbl94bWxOYW5vSFRUUEN0eHRQdHIoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybih4bWxOYW5vSFRUUE9wZW4oUkVNT1RFMUdPT0QsIE5VTEwpKTsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oeG1sTmFub0hUVFBPcGVuKFJFTU9URTJHT09ELCBOVUxMKSk7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKHhtbE5hbm9IVFRQT3BlbihSRU1PVEUxQkFELCBOVUxMKSk7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbE5hbm9IVFRQQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgdm9pZCAqdmFsLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKHZhbCAhPSBOVUxMKSB7Cgl4bWxOYW5vSFRUUENsb3NlKHZhbCk7CiAgICB9Cn0KI2VuZGlmCgojZGVmaW5lIGdlbl9uYl94bWxDaGFyRW5jb2RpbmcgNApzdGF0aWMgeG1sQ2hhckVuY29kaW5nIGdlbl94bWxDaGFyRW5jb2RpbmcoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybihYTUxfQ0hBUl9FTkNPRElOR19VVEY4KTsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oWE1MX0NIQVJfRU5DT0RJTkdfTk9ORSk7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKFhNTF9DSEFSX0VOQ09ESU5HXzg4NTlfMSk7CiAgICByZXR1cm4oWE1MX0NIQVJfRU5DT0RJTkdfRVJST1IpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxDaGFyRW5jb2RpbmcoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbENoYXJFbmNvZGluZyB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2lmIGRlZmluZWQoTElCWE1MX1JFR0VYUF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9FWFBSX0VOQUJMRUQpCgojZGVmaW5lIGdlbl9uYl94bWxFeHBDdHh0UHRyIDEKc3RhdGljIHhtbEV4cEN0eHRQdHIgZ2VuX3htbEV4cEN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbEV4cEN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbEV4cEN0eHRQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCiNkZWZpbmUgZ2VuX25iX3htbEV4cE5vZGVQdHIgMQpzdGF0aWMgeG1sRXhwTm9kZVB0ciBnZW5feG1sRXhwTm9kZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sRXhwTm9kZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sRXhwTm9kZVB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2VuZGlmCgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQojZGVmaW5lIGdlbl9uYl94bWxTY2hlbWFQdHIgMQpzdGF0aWMgeG1sU2NoZW1hUHRyIGdlbl94bWxTY2hlbWFQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFNjaGVtYVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sU2NoZW1hUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZGVmaW5lIGdlbl9uYl94bWxTY2hlbWFWYWxpZEN0eHRQdHIgMQpzdGF0aWMgeG1sU2NoZW1hVmFsaWRDdHh0UHRyIGdlbl94bWxTY2hlbWFWYWxpZEN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFNjaGVtYVZhbGlkQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sU2NoZW1hVmFsaWRDdHh0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZW5kaWYgLyogTElCWE1MX1NDSEVNQVNfRU5BQkxFRCAqLwoKI2RlZmluZSBnZW5fbmJfeG1sSGFzaERlYWxsb2NhdG9yIDIKc3RhdGljIHZvaWQgCnRlc3RfeG1sSGFzaERlYWxsb2NhdG9yKHZvaWQgKnBheWxvYWQgQVRUUklCVVRFX1VOVVNFRCwgeG1sQ2hhciAqbmFtZSBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyB4bWxIYXNoRGVhbGxvY2F0b3IgZ2VuX3htbEhhc2hEZWFsbG9jYXRvcihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMCkgcmV0dXJuKHRlc3RfeG1sSGFzaERlYWxsb2NhdG9yKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sSGFzaERlYWxsb2NhdG9yKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxIYXNoRGVhbGxvY2F0b3IgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCgpzdGF0aWMgdm9pZCBkZXNyZXRfaW50KGludCB2YWwgQVRUUklCVVRFX1VOVVNFRCkgewp9CnN0YXRpYyB2b2lkIGRlc3JldF94bWxDaGFyKHhtbENoYXIgdmFsIEFUVFJJQlVURV9VTlVTRUQpIHsKfQpzdGF0aWMgdm9pZCBkZXNyZXRfbG9uZyhsb25nIHZhbCBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0Kc3RhdGljIHZvaWQgZGVzcmV0X3Vuc2lnbmVkX2xvbmcodW5zaWduZWQgbG9uZyB2YWwgQVRUUklCVVRFX1VOVVNFRCkgewp9CnN0YXRpYyB2b2lkIGRlc3JldF9kb3VibGUoZG91YmxlIHZhbCBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0Kc3RhdGljIHZvaWQgZGVzcmV0X3htbENoYXJFbmNvZGluZyh4bWxDaGFyRW5jb2RpbmcgdmFsIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojaWYgMApzdGF0aWMgdm9pZCBkZXNyZXRfY29uc3Rfdm9pZF9wdHIodm9pZCAqdmFsIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKc3RhdGljIHZvaWQgZGVzcmV0X3ZvaWRfcHRyKHZvaWQgKnZhbCBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0Kc3RhdGljIHZvaWQgZGVzcmV0X2NvbnN0X2NoYXJfcHRyKGNvbnN0IGNoYXIgKnZhbCBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0Kc3RhdGljIHZvaWQgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKGNvbnN0IHhtbENoYXIgKnZhbCBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0Kc3RhdGljIHZvaWQgZGVzcmV0X3htbENoYXJfcHRyKHhtbENoYXIgKnZhbCkgewogICAgaWYgKHZhbCAhPSBOVUxMKQoJeG1sRnJlZSh2YWwpOwp9CnN0YXRpYyB2b2lkIGRlc3JldF94bWxEb2NQdHIoeG1sRG9jUHRyIHZhbCkgewogICAgaWYgKHZhbCAhPSBhcGlfZG9jKQoJeG1sRnJlZURvYyh2YWwpOwp9CnN0YXRpYyB2b2lkIGRlc3JldF94bWxEaWN0UHRyKHhtbERpY3RQdHIgdmFsKSB7CiAgICB4bWxEaWN0RnJlZSh2YWwpOwp9CiNpZmRlZiBMSUJYTUxfT1VUUFVUX0VOQUJMRUQKc3RhdGljIHZvaWQgZGVzcmV0X3htbE91dHB1dEJ1ZmZlclB0cih4bWxPdXRwdXRCdWZmZXJQdHIgdmFsKSB7CiAgICB4bWxPdXRwdXRCdWZmZXJDbG9zZSh2YWwpOwp9CiNlbmRpZgojaWZkZWYgTElCWE1MX1JFQURFUl9FTkFCTEVECnN0YXRpYyB2b2lkIGRlc3JldF94bWxUZXh0UmVhZGVyUHRyKHhtbFRleHRSZWFkZXJQdHIgdmFsKSB7CiAgICB4bWxGcmVlVGV4dFJlYWRlcih2YWwpOwp9CiNlbmRpZgpzdGF0aWMgdm9pZCBkZXNyZXRfeG1sTm9kZVB0cih4bWxOb2RlUHRyIHZhbCkgewogICAgaWYgKCh2YWwgIT0gTlVMTCkgJiYgKHZhbCAhPSBhcGlfcm9vdCkgJiYgKHZhbCAhPSAoeG1sTm9kZVB0cikgYXBpX2RvYykpIHsKCXhtbFVubGlua05vZGUodmFsKTsKCXhtbEZyZWVOb2RlKHZhbCk7CiAgICB9Cn0Kc3RhdGljIHZvaWQgZGVzcmV0X3htbEF0dHJQdHIoeG1sQXR0clB0ciB2YWwpIHsKICAgIGlmICh2YWwgIT0gTlVMTCkgewoJeG1sVW5saW5rTm9kZSgoeG1sTm9kZVB0cikgdmFsKTsKCXhtbEZyZWVOb2RlKCh4bWxOb2RlUHRyKSB2YWwpOwogICAgfQp9CnN0YXRpYyB2b2lkIGRlc3JldF94bWxFbnRpdHlQdHIoeG1sRW50aXR5UHRyIHZhbCkgewogICAgaWYgKHZhbCAhPSBOVUxMKSB7Cgl4bWxVbmxpbmtOb2RlKCh4bWxOb2RlUHRyKSB2YWwpOwoJeG1sRnJlZU5vZGUoKHhtbE5vZGVQdHIpIHZhbCk7CiAgICB9Cn0Kc3RhdGljIHZvaWQgZGVzcmV0X3htbEVsZW1lbnRQdHIoeG1sRWxlbWVudFB0ciB2YWwpIHsKICAgIGlmICh2YWwgIT0gTlVMTCkgewoJeG1sVW5saW5rTm9kZSgoeG1sTm9kZVB0cikgdmFsKTsKICAgIH0KfQpzdGF0aWMgdm9pZCBkZXNyZXRfeG1sQXR0cmlidXRlUHRyKHhtbEF0dHJpYnV0ZVB0ciB2YWwpIHsKICAgIGlmICh2YWwgIT0gTlVMTCkgewoJeG1sVW5saW5rTm9kZSgoeG1sTm9kZVB0cikgdmFsKTsKICAgIH0KfQpzdGF0aWMgdm9pZCBkZXNyZXRfeG1sTnNQdHIoeG1sTnNQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQpIHsKfQpzdGF0aWMgdm9pZCBkZXNyZXRfeG1sRHRkUHRyKHhtbER0ZFB0ciB2YWwpIHsKICAgIGRlc3JldF94bWxOb2RlUHRyKCh4bWxOb2RlUHRyKXZhbCk7Cn0KI2lmZGVmIExJQlhNTF9YUEFUSF9FTkFCTEVECnN0YXRpYyB2b2lkIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cih4bWxYUGF0aE9iamVjdFB0ciB2YWwpIHsKICAgIHhtbFhQYXRoRnJlZU9iamVjdCh2YWwpOwp9CnN0YXRpYyB2b2lkIGRlc3JldF94bWxOb2RlU2V0UHRyKHhtbE5vZGVTZXRQdHIgdmFsKSB7CiAgICB4bWxYUGF0aEZyZWVOb2RlU2V0KHZhbCk7Cn0KI2VuZGlmCnN0YXRpYyB2b2lkIGRlc3JldF94bWxQYXJzZXJDdHh0UHRyKHhtbFBhcnNlckN0eHRQdHIgdmFsKSB7CiAgICB4bWxGcmVlUGFyc2VyQ3R4dCh2YWwpOwp9CnN0YXRpYyB2b2lkIGRlc3JldF94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cih4bWxQYXJzZXJJbnB1dEJ1ZmZlclB0ciB2YWwpIHsKICAgIHhtbEZyZWVQYXJzZXJJbnB1dEJ1ZmZlcih2YWwpOwp9CnN0YXRpYyB2b2lkIGRlc3JldF94bWxQYXJzZXJJbnB1dFB0cih4bWxQYXJzZXJJbnB1dFB0ciB2YWwpIHsKICAgIHhtbEZyZWVJbnB1dFN0cmVhbSh2YWwpOwp9CiNpZmRlZiBMSUJYTUxfV1JJVEVSX0VOQUJMRUQKc3RhdGljIHZvaWQgZGVzcmV0X3htbFRleHRXcml0ZXJQdHIoeG1sVGV4dFdyaXRlclB0ciB2YWwpIHsKICAgIHhtbEZyZWVUZXh0V3JpdGVyKHZhbCk7Cn0KI2VuZGlmCnN0YXRpYyB2b2lkIGRlc3JldF94bWxCdWZmZXJQdHIoeG1sQnVmZmVyUHRyIHZhbCkgewogICAgeG1sQnVmZmVyRnJlZSh2YWwpOwp9CiNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECnN0YXRpYyB2b2lkIGRlc3JldF94bWxTY2hlbWFQYXJzZXJDdHh0UHRyKHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgdmFsKSB7CiAgICB4bWxTY2hlbWFGcmVlUGFyc2VyQ3R4dCh2YWwpOwp9CnN0YXRpYyB2b2lkIGRlc3JldF94bWxTY2hlbWFUeXBlUHRyKHhtbFNjaGVtYVR5cGVQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQpIHsKfQpzdGF0aWMgdm9pZCBkZXNyZXRfeG1sUmVsYXhOR1BhcnNlckN0eHRQdHIoeG1sUmVsYXhOR1BhcnNlckN0eHRQdHIgdmFsKSB7CiAgICB4bWxSZWxheE5HRnJlZVBhcnNlckN0eHQodmFsKTsKfQojZW5kaWYKI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKc3RhdGljIHZvaWQgZGVzcmV0X2NvbnN0X2h0bWxFbnRpdHlEZXNjX3B0cihjb25zdCBodG1sRW50aXR5RGVzYyAqIHZhbCBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCiNpZmRlZiBMSUJYTUxfSFRUUF9FTkFCTEVECnN0YXRpYyB2b2lkIGRlc3JldF94bWxOYW5vSFRUUEN0eHRQdHIodm9pZCAqdmFsKSB7CiAgICB4bWxOYW5vSFRUUENsb3NlKHZhbCk7Cn0KI2VuZGlmCiNpZmRlZiBMSUJYTUxfRlRQX0VOQUJMRUQKc3RhdGljIHZvaWQgZGVzcmV0X3htbE5hbm9GVFBDdHh0UHRyKHZvaWQgKnZhbCkgewogICAgeG1sTmFub0ZUUENsb3NlKHZhbCk7Cn0KI2VuZGlmCi8qIGN1dCBhbmQgcGFzdGVkIGZyb20gYXV0b2dlbmVyYXRlZCB0byBhdm9pZCB0cm91YmxlcyAqLwojZGVmaW5lIGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cl9wdHIgMQpzdGF0aWMgeG1sQ2hhciAqKiBnZW5fY29uc3RfeG1sQ2hhcl9wdHJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc19jb25zdF94bWxDaGFyX3B0cl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKiogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCiNkZWZpbmUgZ2VuX25iX3Vuc2lnbmVkX2NoYXJfcHRyIDEKc3RhdGljIHVuc2lnbmVkIGNoYXIgKiBnZW5fdW5zaWduZWRfY2hhcl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3Vuc2lnbmVkX2NoYXJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB1bnNpZ25lZCBjaGFyICogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCiNkZWZpbmUgZ2VuX25iX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyIDEKc3RhdGljIHVuc2lnbmVkIGNoYXIgKiBnZW5fY29uc3RfdW5zaWduZWRfY2hhcl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB1bnNpZ25lZCBjaGFyICogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCiNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECiNkZWZpbmUgZ2VuX25iX2NvbnN0X2h0bWxOb2RlUHRyIDEKc3RhdGljIGh0bWxOb2RlUHRyIGdlbl9jb25zdF9odG1sTm9kZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfY29uc3RfaHRtbE5vZGVQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IGh0bWxOb2RlUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKI2RlZmluZSBnZW5fbmJfaHRtbERvY1B0ciAzCnN0YXRpYyBodG1sRG9jUHRyIGdlbl9odG1sRG9jUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDApIHJldHVybihodG1sTmV3RG9jKE5VTEwsIE5VTEwpKTsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oaHRtbFJlYWRNZW1vcnkoIjxodG1sLz4iLCA3LCAidGVzdCIsIE5VTEwsIDApKTsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfaHRtbERvY1B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaHRtbERvY1B0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmICgodmFsICE9IE5VTEwpICYmICh2YWwgIT0gYXBpX2RvYykgJiYgKHZhbC0+ZG9jICE9IGFwaV9kb2MpKQogICAgICAgIHhtbEZyZWVEb2ModmFsKTsKfQpzdGF0aWMgdm9pZCBkZXNyZXRfaHRtbERvY1B0cihodG1sRG9jUHRyIHZhbCkgewogICAgaWYgKCh2YWwgIT0gTlVMTCkgJiYgKHZhbCAhPSBhcGlfZG9jKSAmJiAodmFsLT5kb2MgIT0gYXBpX2RvYykpCiAgICAgICAgeG1sRnJlZURvYyh2YWwpOwp9CiNkZWZpbmUgZ2VuX25iX2h0bWxQYXJzZXJDdHh0UHRyIDMKc3RhdGljIGh0bWxQYXJzZXJDdHh0UHRyIGdlbl9odG1sUGFyc2VyQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAwKSByZXR1cm4oeG1sTmV3UGFyc2VyQ3R4dCgpKTsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oaHRtbENyZWF0ZU1lbW9yeVBhcnNlckN0eHQoIjxodG1sLz4iLCA3KSk7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX2h0bWxQYXJzZXJDdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBodG1sUGFyc2VyQ3R4dFB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmICh2YWwgIT0gTlVMTCkKICAgICAgICBodG1sRnJlZVBhcnNlckN0eHQodmFsKTsKfQpzdGF0aWMgdm9pZCBkZXNyZXRfaHRtbFBhcnNlckN0eHRQdHIoaHRtbFBhcnNlckN0eHRQdHIgdmFsKSB7CiAgICBpZiAodmFsICE9IE5VTEwpCiAgICAgICAgaHRtbEZyZWVQYXJzZXJDdHh0KHZhbCk7Cn0KI2VuZGlmCgojaWZkZWYgTElCWE1MX1hQQVRIX0VOQUJMRUQKI2RlZmluZSBnZW5fbmJfeG1sTm9kZVNldFB0ciAxCnN0YXRpYyB4bWxOb2RlU2V0UHRyIGdlbl94bWxOb2RlU2V0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxOb2RlU2V0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxOb2RlU2V0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKI2lmZGVmIExJQlhNTF9ERUJVR19FTkFCTEVECiNpZmRlZiBMSUJYTUxfWFBBVEhfRU5BQkxFRAojZGVmaW5lIGdlbl9uYl94bWxTaGVsbEN0eHRQdHIgMQpzdGF0aWMgeG1sU2hlbGxDdHh0UHRyIGdlbl94bWxTaGVsbEN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFNoZWxsQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sU2hlbGxDdHh0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgojZW5kaWYKCiNpZmRlZiBMSUJYTUxfUEFUVEVSTl9FTkFCTEVECiNkZWZpbmUgZ2VuX25iX3htbFBhdHRlcm5QdHIgMQpzdGF0aWMgeG1sUGF0dGVyblB0ciBnZW5feG1sUGF0dGVyblB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sUGF0dGVyblB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sUGF0dGVyblB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCiNkZWZpbmUgZ2VuX25iX3htbEVsZW1lbnRDb250ZW50UHRyIDEKc3RhdGljIHhtbEVsZW1lbnRDb250ZW50UHRyIGdlbl94bWxFbGVtZW50Q29udGVudFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sRWxlbWVudENvbnRlbnRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbEVsZW1lbnRDb250ZW50UHRyIHZhbCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmICh2YWwgIT0gTlVMTCkKICAgICAgICB4bWxGcmVlRWxlbWVudENvbnRlbnQodmFsKTsKfQpzdGF0aWMgdm9pZCBkZXNyZXRfeG1sRWxlbWVudENvbnRlbnRQdHIoeG1sRWxlbWVudENvbnRlbnRQdHIgdmFsKSB7CiAgICBpZiAodmFsICE9IE5VTEwpCiAgICAgICAgeG1sRnJlZUVsZW1lbnRDb250ZW50KHZhbCk7Cn0KCiNkZWZpbmUgZ2VuX25iX3htbFBhcnNlck5vZGVJbmZvU2VxUHRyIDEKc3RhdGljIHhtbFBhcnNlck5vZGVJbmZvU2VxUHRyIGdlbl94bWxQYXJzZXJOb2RlSW5mb1NlcVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sUGFyc2VyTm9kZUluZm9TZXFQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFBhcnNlck5vZGVJbmZvU2VxUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgdm9pZCBkZXNyZXRfY29uc3RfeG1sUGFyc2VyTm9kZUluZm9fcHRyKGNvbnN0IHhtbFBhcnNlck5vZGVJbmZvICp2YWwgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZGVmaW5lIGdlbl9uYl92b2lkX3B0cl9wdHIgMQpzdGF0aWMgdm9pZCAqKiBnZW5fdm9pZF9wdHJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc192b2lkX3B0cl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHZvaWQgKiogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJCQkJCQkqCiAqICAgV0FSTklORzogZW5kIG9mIHRoZSBtYW51YWxseSBtYWludGFpbmVkIHBhcnQgb2YgdGhlIHRlc3QgY29kZQkqCiAqICAgICAgICAgICAgZG8gbm90IHJlbW92ZSBvciBhbHRlciB0aGUgQ1VUIEhFUkUgbGluZQkJCSoKICoJCQkJCQkJCQkqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBDVVQgSEVSRTogZXZlcnl0aGluZyBiZWxvdyB0aGF0IGxpbmUgaXMgZ2VuZXJhdGVkICovCiNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECnN0YXRpYyB2b2lkIGRlc3JldF9odG1sU3RhdHVzKGh0bWxTdGF0dXMgdmFsIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2VuZGlmCgojZGVmaW5lIGdlbl9uYl94bWxBdHRyaWJ1dGVEZWZhdWx0IDQKc3RhdGljIHhtbEF0dHJpYnV0ZURlZmF1bHQgZ2VuX3htbEF0dHJpYnV0ZURlZmF1bHQoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDEpIHJldHVybihYTUxfQVRUUklCVVRFX0ZJWEVEKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oWE1MX0FUVFJJQlVURV9JTVBMSUVEKTsKICAgIGlmIChubyA9PSAzKSByZXR1cm4oWE1MX0FUVFJJQlVURV9OT05FKTsKICAgIGlmIChubyA9PSA0KSByZXR1cm4oWE1MX0FUVFJJQlVURV9SRVFVSVJFRCk7CiAgICByZXR1cm4oMCk7Cn0KCnN0YXRpYyB2b2lkIGRlc194bWxBdHRyaWJ1dGVEZWZhdWx0KGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxBdHRyaWJ1dGVEZWZhdWx0IHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZGVmaW5lIGdlbl9uYl94bWxBdHRyaWJ1dGVUeXBlIDQKc3RhdGljIHhtbEF0dHJpYnV0ZVR5cGUgZ2VuX3htbEF0dHJpYnV0ZVR5cGUoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDEpIHJldHVybihYTUxfQVRUUklCVVRFX0NEQVRBKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oWE1MX0FUVFJJQlVURV9FTlRJVElFUyk7CiAgICBpZiAobm8gPT0gMykgcmV0dXJuKFhNTF9BVFRSSUJVVEVfRU5USVRZKTsKICAgIGlmIChubyA9PSA0KSByZXR1cm4oWE1MX0FUVFJJQlVURV9FTlVNRVJBVElPTik7CiAgICByZXR1cm4oMCk7Cn0KCnN0YXRpYyB2b2lkIGRlc194bWxBdHRyaWJ1dGVUeXBlKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxBdHRyaWJ1dGVUeXBlIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZGVmaW5lIGdlbl9uYl94bWxCdWZmZXJBbGxvY2F0aW9uU2NoZW1lIDQKc3RhdGljIHhtbEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUgZ2VuX3htbEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDEpIHJldHVybihYTUxfQlVGRkVSX0FMTE9DX0RPVUJMRUlUKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oWE1MX0JVRkZFUl9BTExPQ19FWEFDVCk7CiAgICBpZiAobm8gPT0gMykgcmV0dXJuKFhNTF9CVUZGRVJfQUxMT0NfSU1NVVRBQkxFKTsKICAgIGlmIChubyA9PSA0KSByZXR1cm4oWE1MX0JVRkZFUl9BTExPQ19JTyk7CiAgICByZXR1cm4oMCk7Cn0KCnN0YXRpYyB2b2lkIGRlc194bWxCdWZmZXJBbGxvY2F0aW9uU2NoZW1lKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxCdWZmZXJBbGxvY2F0aW9uU2NoZW1lIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgdm9pZCBkZXNyZXRfeG1sQnVmZmVyQWxsb2NhdGlvblNjaGVtZSh4bWxCdWZmZXJBbGxvY2F0aW9uU2NoZW1lIHZhbCBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCiNpZmRlZiBMSUJYTUxfQ0FUQUxPR19FTkFCTEVECiNkZWZpbmUgZ2VuX25iX3htbENhdGFsb2dBbGxvdyA0CnN0YXRpYyB4bWxDYXRhbG9nQWxsb3cgZ2VuX3htbENhdGFsb2dBbGxvdyhpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKFhNTF9DQVRBX0FMTE9XX0FMTCk7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKFhNTF9DQVRBX0FMTE9XX0RPQ1VNRU5UKTsKICAgIGlmIChubyA9PSAzKSByZXR1cm4oWE1MX0NBVEFfQUxMT1dfR0xPQkFMKTsKICAgIGlmIChubyA9PSA0KSByZXR1cm4oWE1MX0NBVEFfQUxMT1dfTk9ORSk7CiAgICByZXR1cm4oMCk7Cn0KCnN0YXRpYyB2b2lkIGRlc194bWxDYXRhbG9nQWxsb3coaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbENhdGFsb2dBbGxvdyB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKc3RhdGljIHZvaWQgZGVzcmV0X3htbENhdGFsb2dBbGxvdyh4bWxDYXRhbG9nQWxsb3cgdmFsIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2VuZGlmCgojaWZkZWYgTElCWE1MX0NBVEFMT0dfRU5BQkxFRAojZGVmaW5lIGdlbl9uYl94bWxDYXRhbG9nUHJlZmVyIDMKc3RhdGljIHhtbENhdGFsb2dQcmVmZXIgZ2VuX3htbENhdGFsb2dQcmVmZXIoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDEpIHJldHVybihYTUxfQ0FUQV9QUkVGRVJfTk9ORSk7CiAgICBpZiAobm8gPT0gMikgcmV0dXJuKFhNTF9DQVRBX1BSRUZFUl9QVUJMSUMpOwogICAgaWYgKG5vID09IDMpIHJldHVybihYTUxfQ0FUQV9QUkVGRVJfU1lTVEVNKTsKICAgIHJldHVybigwKTsKfQoKc3RhdGljIHZvaWQgZGVzX3htbENhdGFsb2dQcmVmZXIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbENhdGFsb2dQcmVmZXIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyB2b2lkIGRlc3JldF94bWxDYXRhbG9nUHJlZmVyKHhtbENhdGFsb2dQcmVmZXIgdmFsIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2VuZGlmCgojZGVmaW5lIGdlbl9uYl94bWxFbGVtZW50Q29udGVudFR5cGUgNApzdGF0aWMgeG1sRWxlbWVudENvbnRlbnRUeXBlIGdlbl94bWxFbGVtZW50Q29udGVudFR5cGUoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDEpIHJldHVybihYTUxfRUxFTUVOVF9DT05URU5UX0VMRU1FTlQpOwogICAgaWYgKG5vID09IDIpIHJldHVybihYTUxfRUxFTUVOVF9DT05URU5UX09SKTsKICAgIGlmIChubyA9PSAzKSByZXR1cm4oWE1MX0VMRU1FTlRfQ09OVEVOVF9QQ0RBVEEpOwogICAgaWYgKG5vID09IDQpIHJldHVybihYTUxfRUxFTUVOVF9DT05URU5UX1NFUSk7CiAgICByZXR1cm4oMCk7Cn0KCnN0YXRpYyB2b2lkIGRlc194bWxFbGVtZW50Q29udGVudFR5cGUoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbEVsZW1lbnRDb250ZW50VHlwZSB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKI2RlZmluZSBnZW5fbmJfeG1sRWxlbWVudFR5cGVWYWwgNApzdGF0aWMgeG1sRWxlbWVudFR5cGVWYWwgZ2VuX3htbEVsZW1lbnRUeXBlVmFsKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oWE1MX0VMRU1FTlRfVFlQRV9BTlkpOwogICAgaWYgKG5vID09IDIpIHJldHVybihYTUxfRUxFTUVOVF9UWVBFX0VMRU1FTlQpOwogICAgaWYgKG5vID09IDMpIHJldHVybihYTUxfRUxFTUVOVF9UWVBFX0VNUFRZKTsKICAgIGlmIChubyA9PSA0KSByZXR1cm4oWE1MX0VMRU1FTlRfVFlQRV9NSVhFRCk7CiAgICByZXR1cm4oMCk7Cn0KCnN0YXRpYyB2b2lkIGRlc194bWxFbGVtZW50VHlwZVZhbChpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sRWxlbWVudFR5cGVWYWwgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCiNkZWZpbmUgZ2VuX25iX3htbEZlYXR1cmUgNApzdGF0aWMgeG1sRmVhdHVyZSBnZW5feG1sRmVhdHVyZShpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpZiAobm8gPT0gMSkgcmV0dXJuKFhNTF9XSVRIX0FVVE9NQVRBKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oWE1MX1dJVEhfQzE0Tik7CiAgICBpZiAobm8gPT0gMykgcmV0dXJuKFhNTF9XSVRIX0NBVEFMT0cpOwogICAgaWYgKG5vID09IDQpIHJldHVybihYTUxfV0lUSF9ERUJVRyk7CiAgICByZXR1cm4oMCk7Cn0KCnN0YXRpYyB2b2lkIGRlc194bWxGZWF0dXJlKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxGZWF0dXJlIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgdm9pZCBkZXNyZXRfeG1sUGFyc2VyRXJyb3JzKHhtbFBhcnNlckVycm9ycyB2YWwgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAojZGVmaW5lIGdlbl9uYl94bWxTY2hlbWFWYWxUeXBlIDQKc3RhdGljIHhtbFNjaGVtYVZhbFR5cGUgZ2VuX3htbFNjaGVtYVZhbFR5cGUoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaWYgKG5vID09IDEpIHJldHVybihYTUxfU0NIRU1BU19BTllTSU1QTEVUWVBFKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oWE1MX1NDSEVNQVNfQU5ZVFlQRSk7CiAgICBpZiAobm8gPT0gMykgcmV0dXJuKFhNTF9TQ0hFTUFTX0FOWVVSSSk7CiAgICBpZiAobm8gPT0gNCkgcmV0dXJuKFhNTF9TQ0hFTUFTX0JBU0U2NEJJTkFSWSk7CiAgICByZXR1cm4oMCk7Cn0KCnN0YXRpYyB2b2lkIGRlc194bWxTY2hlbWFWYWxUeXBlKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxTY2hlbWFWYWxUeXBlIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgdm9pZCBkZXNyZXRfeG1sU2NoZW1hVmFsVHlwZSh4bWxTY2hlbWFWYWxUeXBlIHZhbCBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCiNlbmRpZgoKI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKI2RlZmluZSBnZW5fbmJfeG1sU2NoZW1hV2hpdGVzcGFjZVZhbHVlVHlwZSA0CnN0YXRpYyB4bWxTY2hlbWFXaGl0ZXNwYWNlVmFsdWVUeXBlIGdlbl94bWxTY2hlbWFXaGl0ZXNwYWNlVmFsdWVUeXBlKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGlmIChubyA9PSAxKSByZXR1cm4oWE1MX1NDSEVNQV9XSElURVNQQUNFX0NPTExBUFNFKTsKICAgIGlmIChubyA9PSAyKSByZXR1cm4oWE1MX1NDSEVNQV9XSElURVNQQUNFX1BSRVNFUlZFKTsKICAgIGlmIChubyA9PSAzKSByZXR1cm4oWE1MX1NDSEVNQV9XSElURVNQQUNFX1JFUExBQ0UpOwogICAgaWYgKG5vID09IDQpIHJldHVybihYTUxfU0NIRU1BX1dISVRFU1BBQ0VfVU5LTk9XTik7CiAgICByZXR1cm4oMCk7Cn0KCnN0YXRpYyB2b2lkIGRlc194bWxTY2hlbWFXaGl0ZXNwYWNlVmFsdWVUeXBlKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxTY2hlbWFXaGl0ZXNwYWNlVmFsdWVUeXBlIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZW5kaWYKCiNpbmNsdWRlIDxsaWJ4bWwvSFRNTHBhcnNlci5oPgojaW5jbHVkZSA8bGlieG1sL0hUTUx0cmVlLmg+CiNpbmNsdWRlIDxsaWJ4bWwvU0FYMi5oPgojaW5jbHVkZSA8bGlieG1sL2MxNG4uaD4KI2luY2x1ZGUgPGxpYnhtbC9jYXRhbG9nLmg+CiNpbmNsdWRlIDxsaWJ4bWwvY2h2YWxpZC5oPgojaW5jbHVkZSA8bGlieG1sL2RlYnVnWE1MLmg+CiNpbmNsdWRlIDxsaWJ4bWwvZGljdC5oPgojaW5jbHVkZSA8bGlieG1sL2VuY29kaW5nLmg+CiNpbmNsdWRlIDxsaWJ4bWwvZW50aXRpZXMuaD4KI2luY2x1ZGUgPGxpYnhtbC9oYXNoLmg+CiNpbmNsdWRlIDxsaWJ4bWwvbGlzdC5oPgojaW5jbHVkZSA8bGlieG1sL25hbm9mdHAuaD4KI2luY2x1ZGUgPGxpYnhtbC9uYW5vaHR0cC5oPgojaW5jbHVkZSA8bGlieG1sL3BhcnNlci5oPgojaW5jbHVkZSA8bGlieG1sL3BhcnNlckludGVybmFscy5oPgojaW5jbHVkZSA8bGlieG1sL3BhdHRlcm4uaD4KI2luY2x1ZGUgPGxpYnhtbC9yZWxheG5nLmg+CiNpbmNsdWRlIDxsaWJ4bWwvc2NoZW1hc0ludGVybmFscy5oPgojaW5jbHVkZSA8bGlieG1sL3NjaGVtYXRyb24uaD4KI2luY2x1ZGUgPGxpYnhtbC90cmVlLmg+CiNpbmNsdWRlIDxsaWJ4bWwvdXJpLmg+CiNpbmNsdWRlIDxsaWJ4bWwvdmFsaWQuaD4KI2luY2x1ZGUgPGxpYnhtbC94aW5jbHVkZS5oPgojaW5jbHVkZSA8bGlieG1sL3htbElPLmg+CiNpbmNsdWRlIDxsaWJ4bWwveG1sYXV0b21hdGEuaD4KI2luY2x1ZGUgPGxpYnhtbC94bWxlcnJvci5oPgojaW5jbHVkZSA8bGlieG1sL3htbG1vZHVsZS5oPgojaW5jbHVkZSA8bGlieG1sL3htbHJlYWRlci5oPgojaW5jbHVkZSA8bGlieG1sL3htbHJlZ2V4cC5oPgojaW5jbHVkZSA8bGlieG1sL3htbHNhdmUuaD4KI2luY2x1ZGUgPGxpYnhtbC94bWxzY2hlbWFzLmg+CiNpbmNsdWRlIDxsaWJ4bWwveG1sc2NoZW1hc3R5cGVzLmg+CiNpbmNsdWRlIDxsaWJ4bWwveG1sc3RyaW5nLmg+CiNpbmNsdWRlIDxsaWJ4bWwveG1sdW5pY29kZS5oPgojaW5jbHVkZSA8bGlieG1sL3htbHdyaXRlci5oPgojaW5jbHVkZSA8bGlieG1sL3hwYXRoLmg+CiNpbmNsdWRlIDxsaWJ4bWwveHBhdGhJbnRlcm5hbHMuaD4KI2luY2x1ZGUgPGxpYnhtbC94cG9pbnRlci5oPgpzdGF0aWMgaW50IHRlc3RfSFRNTHBhcnNlcih2b2lkKTsKc3RhdGljIGludCB0ZXN0X0hUTUx0cmVlKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfU0FYMih2b2lkKTsKc3RhdGljIGludCB0ZXN0X2MxNG4odm9pZCk7CnN0YXRpYyBpbnQgdGVzdF9jYXRhbG9nKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfY2h2YWxpZCh2b2lkKTsKc3RhdGljIGludCB0ZXN0X2RlYnVnWE1MKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfZGljdCh2b2lkKTsKc3RhdGljIGludCB0ZXN0X2VuY29kaW5nKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfZW50aXRpZXModm9pZCk7CnN0YXRpYyBpbnQgdGVzdF9oYXNoKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfbGlzdCh2b2lkKTsKc3RhdGljIGludCB0ZXN0X25hbm9mdHAodm9pZCk7CnN0YXRpYyBpbnQgdGVzdF9uYW5vaHR0cCh2b2lkKTsKc3RhdGljIGludCB0ZXN0X3BhcnNlcih2b2lkKTsKc3RhdGljIGludCB0ZXN0X3BhcnNlckludGVybmFscyh2b2lkKTsKc3RhdGljIGludCB0ZXN0X3BhdHRlcm4odm9pZCk7CnN0YXRpYyBpbnQgdGVzdF9yZWxheG5nKHZvaWQpOwpzdGF0aWMgaW50IHRlc3Rfc2NoZW1hc0ludGVybmFscyh2b2lkKTsKc3RhdGljIGludCB0ZXN0X3NjaGVtYXRyb24odm9pZCk7CnN0YXRpYyBpbnQgdGVzdF90cmVlKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfdXJpKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfdmFsaWQodm9pZCk7CnN0YXRpYyBpbnQgdGVzdF94aW5jbHVkZSh2b2lkKTsKc3RhdGljIGludCB0ZXN0X3htbElPKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfeG1sYXV0b21hdGEodm9pZCk7CnN0YXRpYyBpbnQgdGVzdF94bWxlcnJvcih2b2lkKTsKc3RhdGljIGludCB0ZXN0X3htbG1vZHVsZSh2b2lkKTsKc3RhdGljIGludCB0ZXN0X3htbHJlYWRlcih2b2lkKTsKc3RhdGljIGludCB0ZXN0X3htbHJlZ2V4cCh2b2lkKTsKc3RhdGljIGludCB0ZXN0X3htbHNhdmUodm9pZCk7CnN0YXRpYyBpbnQgdGVzdF94bWxzY2hlbWFzKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfeG1sc2NoZW1hc3R5cGVzKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfeG1sc3RyaW5nKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfeG1sdW5pY29kZSh2b2lkKTsKc3RhdGljIGludCB0ZXN0X3htbHdyaXRlcih2b2lkKTsKc3RhdGljIGludCB0ZXN0X3hwYXRoKHZvaWQpOwpzdGF0aWMgaW50IHRlc3RfeHBhdGhJbnRlcm5hbHModm9pZCk7CnN0YXRpYyBpbnQgdGVzdF94cG9pbnRlcih2b2lkKTsKCi8qKgogKiB0ZXN0bGlieG1sMjoKICoKICogTWFpbiBlbnRyeSBwb2ludCBvZiB0aGUgdGVzdGVyIGZvciB0aGUgZnVsbCBsaWJ4bWwyIG1vZHVsZSwKICogaXQgY2FsbHMgYWxsIHRoZSB0ZXN0ZXIgZW50cnkgcG9pbnQgZm9yIGVhY2ggbW9kdWxlLgogKgogKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZXJyb3IgZm91bmQKICovCnN0YXRpYyBpbnQKdGVzdGxpYnhtbDIodm9pZCkKewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICB0ZXN0X3JldCArPSB0ZXN0X0hUTUxwYXJzZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfSFRNTHRyZWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfU0FYMigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9jMTRuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2NhdGFsb2coKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfY2h2YWxpZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9kZWJ1Z1hNTCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9kaWN0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2VuY29kaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2VudGl0aWVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2hhc2goKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfbGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9uYW5vZnRwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X25hbm9odHRwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3BhcnNlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9wYXJzZXJJbnRlcm5hbHMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfcGF0dGVybigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9yZWxheG5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3NjaGVtYXNJbnRlcm5hbHMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3Rfc2NoZW1hdHJvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF90cmVlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3VyaSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF92YWxpZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94aW5jbHVkZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxJTygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxhdXRvbWF0YSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxlcnJvcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxtb2R1bGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1scmVhZGVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbHJlZ2V4cCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxzYXZlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbHNjaGVtYXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sc2NoZW1hc3R5cGVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbHN0cmluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWx1bmljb2RlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbHdyaXRlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94cGF0aCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94cGF0aEludGVybmFscygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94cG9pbnRlcigpOwoKICAgIHByaW50ZigiVG90YWw6ICVkIGZ1bmN0aW9ucywgJWQgdGVzdHMsICVkIGVycm9yc1xuIiwKICAgICAgICAgICBmdW5jdGlvbl90ZXN0cywgY2FsbF90ZXN0cywgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9VVEY4VG9IdG1sKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB1bnNpZ25lZCBjaGFyICogb3V0OyAvKiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYnl0ZXMgdG8gc3RvcmUgdGhlIHJlc3VsdCAqLwogICAgaW50IG5fb3V0OwogICAgaW50ICogb3V0bGVuOyAvKiB0aGUgbGVuZ3RoIG9mIEBvdXQgKi8KICAgIGludCBuX291dGxlbjsKICAgIHVuc2lnbmVkIGNoYXIgKiBpbjsgLyogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIFVURi04IGNoYXJzICovCiAgICBpbnQgbl9pbjsKICAgIGludCAqIGlubGVuOyAvKiB0aGUgbGVuZ3RoIG9mIEBpbiAqLwogICAgaW50IG5faW5sZW47CgogICAgZm9yIChuX291dCA9IDA7bl9vdXQgPCBnZW5fbmJfdW5zaWduZWRfY2hhcl9wdHI7bl9vdXQrKykgewogICAgZm9yIChuX291dGxlbiA9IDA7bl9vdXRsZW4gPCBnZW5fbmJfaW50X3B0cjtuX291dGxlbisrKSB7CiAgICBmb3IgKG5faW4gPSAwO25faW4gPCBnZW5fbmJfY29uc3RfdW5zaWduZWRfY2hhcl9wdHI7bl9pbisrKSB7CiAgICBmb3IgKG5faW5sZW4gPSAwO25faW5sZW4gPCBnZW5fbmJfaW50X3B0cjtuX2lubGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG91dCA9IGdlbl91bnNpZ25lZF9jaGFyX3B0cihuX291dCwgMCk7CiAgICAgICAgb3V0bGVuID0gZ2VuX2ludF9wdHIobl9vdXRsZW4sIDEpOwogICAgICAgIGluID0gZ2VuX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyKG5faW4sIDIpOwogICAgICAgIGlubGVuID0gZ2VuX2ludF9wdHIobl9pbmxlbiwgMyk7CgogICAgICAgIHJldF92YWwgPSBVVEY4VG9IdG1sKG91dCwgb3V0bGVuLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKWluLCBpbmxlbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3Vuc2lnbmVkX2NoYXJfcHRyKG5fb3V0LCBvdXQsIDApOwogICAgICAgIGRlc19pbnRfcHRyKG5fb3V0bGVuLCBvdXRsZW4sIDEpOwogICAgICAgIGRlc19jb25zdF91bnNpZ25lZF9jaGFyX3B0cihuX2luLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKWluLCAyKTsKICAgICAgICBkZXNfaW50X3B0cihuX2lubGVuLCBpbmxlbiwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBVVEY4VG9IdG1sIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRsZW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX2NvbnN0X2h0bWxFbGVtRGVzY19wdHIgMQpzdGF0aWMgaHRtbEVsZW1EZXNjICogZ2VuX2NvbnN0X2h0bWxFbGVtRGVzY19wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX2NvbnN0X2h0bWxFbGVtRGVzY19wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IGh0bWxFbGVtRGVzYyAqIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKCnN0YXRpYyBpbnQKdGVzdF9odG1sQXR0ckFsbG93ZWQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBodG1sU3RhdHVzIHJldF92YWw7CiAgICBodG1sRWxlbURlc2MgKiBlbHQ7IC8qIEhUTUwgZWxlbWVudCAqLwogICAgaW50IG5fZWx0OwogICAgeG1sQ2hhciAqIGF0dHI7IC8qIEhUTUwgYXR0cmlidXRlICovCiAgICBpbnQgbl9hdHRyOwogICAgaW50IGxlZ2FjeTsgLyogd2hldGhlciB0byBhbGxvdyBkZXByZWNhdGVkIGF0dHJpYnV0ZXMgKi8KICAgIGludCBuX2xlZ2FjeTsKCiAgICBmb3IgKG5fZWx0ID0gMDtuX2VsdCA8IGdlbl9uYl9jb25zdF9odG1sRWxlbURlc2NfcHRyO25fZWx0KyspIHsKICAgIGZvciAobl9hdHRyID0gMDtuX2F0dHIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9hdHRyKyspIHsKICAgIGZvciAobl9sZWdhY3kgPSAwO25fbGVnYWN5IDwgZ2VuX25iX2ludDtuX2xlZ2FjeSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBlbHQgPSBnZW5fY29uc3RfaHRtbEVsZW1EZXNjX3B0cihuX2VsdCwgMCk7CiAgICAgICAgYXR0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2F0dHIsIDEpOwogICAgICAgIGxlZ2FjeSA9IGdlbl9pbnQobl9sZWdhY3ksIDIpOwoKICAgICAgICByZXRfdmFsID0gaHRtbEF0dHJBbGxvd2VkKChjb25zdCBodG1sRWxlbURlc2MgKillbHQsIChjb25zdCB4bWxDaGFyICopYXR0ciwgbGVnYWN5KTsKICAgICAgICBkZXNyZXRfaHRtbFN0YXR1cyhyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X2h0bWxFbGVtRGVzY19wdHIobl9lbHQsIChjb25zdCBodG1sRWxlbURlc2MgKillbHQsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2F0dHIsIChjb25zdCB4bWxDaGFyICopYXR0ciwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlZ2FjeSwgbGVnYWN5LCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxBdHRyQWxsb3dlZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYXR0cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZWdhY3kpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX2h0bWxOb2RlUHRyIDEKc3RhdGljIGh0bWxOb2RlUHRyIGdlbl9odG1sTm9kZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfaHRtbE5vZGVQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGh0bWxOb2RlUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKCnN0YXRpYyBpbnQKdGVzdF9odG1sQXV0b0Nsb3NlVGFnKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBodG1sRG9jUHRyIGRvYzsgLyogdGhlIEhUTUwgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiBUaGUgdGFnIG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICBodG1sTm9kZVB0ciBlbGVtOyAvKiB0aGUgSFRNTCBlbGVtZW50ICovCiAgICBpbnQgbl9lbGVtOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX2h0bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX2VsZW0gPSAwO25fZWxlbSA8IGdlbl9uYl9odG1sTm9kZVB0cjtuX2VsZW0rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX2h0bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBlbGVtID0gZ2VuX2h0bWxOb2RlUHRyKG5fZWxlbSwgMik7CgogICAgICAgIHJldF92YWwgPSBodG1sQXV0b0Nsb3NlVGFnKGRvYywgKGNvbnN0IHhtbENoYXIgKiluYW1lLCBlbGVtKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaHRtbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19odG1sTm9kZVB0cihuX2VsZW0sIGVsZW0sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbEF1dG9DbG9zZVRhZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbGVtKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbENyZWF0ZU1lbW9yeVBhcnNlckN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBodG1sUGFyc2VyQ3R4dFB0ciByZXRfdmFsOwogICAgY2hhciAqIGJ1ZmZlcjsgLyogYSBwb2ludGVyIHRvIGEgY2hhciBhcnJheSAqLwogICAgaW50IG5fYnVmZmVyOwogICAgaW50IHNpemU7IC8qIHRoZSBzaXplIG9mIHRoZSBhcnJheSAqLwogICAgaW50IG5fc2l6ZTsKCiAgICBmb3IgKG5fYnVmZmVyID0gMDtuX2J1ZmZlciA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2J1ZmZlcisrKSB7CiAgICBmb3IgKG5fc2l6ZSA9IDA7bl9zaXplIDwgZ2VuX25iX2ludDtuX3NpemUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmZmVyID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fYnVmZmVyLCAwKTsKICAgICAgICBzaXplID0gZ2VuX2ludChuX3NpemUsIDEpOwoKICAgICAgICByZXRfdmFsID0gaHRtbENyZWF0ZU1lbW9yeVBhcnNlckN0eHQoKGNvbnN0IGNoYXIgKilidWZmZXIsIHNpemUpOwogICAgICAgIGRlc3JldF9odG1sUGFyc2VyQ3R4dFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fYnVmZmVyLCAoY29uc3QgY2hhciAqKWJ1ZmZlciwgMCk7CiAgICAgICAgZGVzX2ludChuX3NpemUsIHNpemUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbENyZWF0ZU1lbW9yeVBhcnNlckN0eHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmZmVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NpemUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX2h0bWxTQVhIYW5kbGVyUHRyIDEKc3RhdGljIGh0bWxTQVhIYW5kbGVyUHRyIGdlbl9odG1sU0FYSGFuZGxlclB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfaHRtbFNBWEhhbmRsZXJQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGh0bWxTQVhIYW5kbGVyUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKCnN0YXRpYyBpbnQKdGVzdF9odG1sQ3JlYXRlUHVzaFBhcnNlckN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX1BVU0hfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGh0bWxQYXJzZXJDdHh0UHRyIHJldF92YWw7CiAgICBodG1sU0FYSGFuZGxlclB0ciBzYXg7IC8qIGEgU0FYIGhhbmRsZXIgKi8KICAgIGludCBuX3NheDsKICAgIHZvaWQgKiB1c2VyX2RhdGE7IC8qIFRoZSB1c2VyIGRhdGEgcmV0dXJuZWQgb24gU0FYIGNhbGxiYWNrcyAqLwogICAgaW50IG5fdXNlcl9kYXRhOwogICAgY2hhciAqIGNodW5rOyAvKiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY2hhcnMgKi8KICAgIGludCBuX2NodW5rOwogICAgaW50IHNpemU7IC8qIG51bWJlciBvZiBjaGFycyBpbiB0aGUgYXJyYXkgKi8KICAgIGludCBuX3NpemU7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIGFuIG9wdGlvbmFsIGZpbGUgbmFtZSBvciBVUkkgKi8KICAgIGludCBuX2ZpbGVuYW1lOwogICAgeG1sQ2hhckVuY29kaW5nIGVuYzsgLyogYW4gb3B0aW9uYWwgZW5jb2RpbmcgKi8KICAgIGludCBuX2VuYzsKCiAgICBmb3IgKG5fc2F4ID0gMDtuX3NheCA8IGdlbl9uYl9odG1sU0FYSGFuZGxlclB0cjtuX3NheCsrKSB7CiAgICBmb3IgKG5fdXNlcl9kYXRhID0gMDtuX3VzZXJfZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX3VzZXJfZGF0YSsrKSB7CiAgICBmb3IgKG5fY2h1bmsgPSAwO25fY2h1bmsgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9jaHVuaysrKSB7CiAgICBmb3IgKG5fc2l6ZSA9IDA7bl9zaXplIDwgZ2VuX25iX2ludDtuX3NpemUrKykgewogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVvdXRwdXQ7bl9maWxlbmFtZSsrKSB7CiAgICBmb3IgKG5fZW5jID0gMDtuX2VuYyA8IGdlbl9uYl94bWxDaGFyRW5jb2Rpbmc7bl9lbmMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc2F4ID0gZ2VuX2h0bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCAwKTsKICAgICAgICB1c2VyX2RhdGEgPSBnZW5fdXNlcmRhdGEobl91c2VyX2RhdGEsIDEpOwogICAgICAgIGNodW5rID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fY2h1bmssIDIpOwogICAgICAgIHNpemUgPSBnZW5faW50KG5fc2l6ZSwgMyk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZW91dHB1dChuX2ZpbGVuYW1lLCA0KTsKICAgICAgICBlbmMgPSBnZW5feG1sQ2hhckVuY29kaW5nKG5fZW5jLCA1KTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxDcmVhdGVQdXNoUGFyc2VyQ3R4dChzYXgsIHVzZXJfZGF0YSwgKGNvbnN0IGNoYXIgKiljaHVuaywgc2l6ZSwgZmlsZW5hbWUsIGVuYyk7CiAgICAgICAgZGVzcmV0X2h0bWxQYXJzZXJDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaHRtbFNBWEhhbmRsZXJQdHIobl9zYXgsIHNheCwgMCk7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fdXNlcl9kYXRhLCB1c2VyX2RhdGEsIDEpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2NodW5rLCAoY29uc3QgY2hhciAqKWNodW5rLCAyKTsKICAgICAgICBkZXNfaW50KG5fc2l6ZSwgc2l6ZSwgMyk7CiAgICAgICAgZGVzX2ZpbGVvdXRwdXQobl9maWxlbmFtZSwgZmlsZW5hbWUsIDQpOwogICAgICAgIGRlc194bWxDaGFyRW5jb2Rpbmcobl9lbmMsIGVuYywgNSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sQ3JlYXRlUHVzaFBhcnNlckN0eHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2F4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3VzZXJfZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jaHVuayk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuYyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxDdHh0UmVhZERvYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGh0bWxEb2NQdHIgcmV0X3ZhbDsKICAgIGh0bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIEhUTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxDaGFyICogY3VyOyAvKiBhIHBvaW50ZXIgdG8gYSB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nICovCiAgICBpbnQgbl9jdXI7CiAgICBjb25zdCBjaGFyICogVVJMOyAvKiB0aGUgYmFzZSBVUkwgdG8gdXNlIGZvciB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX1VSTDsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCiAgICBpbnQgbl9lbmNvZGluZzsKICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIGh0bWxQYXJzZXJPcHRpb24ocykgKi8KICAgIGludCBuX29wdGlvbnM7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl9odG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jdXIrKykgewogICAgZm9yIChuX1VSTCA9IDA7bl9VUkwgPCBnZW5fbmJfZmlsZXBhdGg7bl9VUkwrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgZm9yIChuX29wdGlvbnMgPSAwO25fb3B0aW9ucyA8IGdlbl9uYl9pbnQ7bl9vcHRpb25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5faHRtbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBjdXIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jdXIsIDEpOwogICAgICAgIFVSTCA9IGdlbl9maWxlcGF0aChuX1VSTCwgMik7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgMyk7CiAgICAgICAgb3B0aW9ucyA9IGdlbl9pbnQobl9vcHRpb25zLCA0KTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxDdHh0UmVhZERvYyhjdHh0LCAoY29uc3QgeG1sQ2hhciAqKWN1ciwgVVJMLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfaHRtbERvY1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2h0bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY3VyLCAoY29uc3QgeG1sQ2hhciAqKWN1ciwgMSk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fVVJMLCBVUkwsIDIpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAzKTsKICAgICAgICBkZXNfaW50KG5fb3B0aW9ucywgb3B0aW9ucywgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sQ3R4dFJlYWREb2MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJMKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29wdGlvbnMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sQ3R4dFJlYWRGaWxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaHRtbERvY1B0ciByZXRfdmFsOwogICAgaHRtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gSFRNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogYSBmaWxlIG9yIFVSTCAqLwogICAgaW50IG5fZmlsZW5hbWU7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiBodG1sUGFyc2VyT3B0aW9uKHMpICovCiAgICBpbnQgbl9vcHRpb25zOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfaHRtbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlcGF0aDtuX2ZpbGVuYW1lKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9vcHRpb25zID0gMDtuX29wdGlvbnMgPCBnZW5fbmJfaW50O25fb3B0aW9ucysrKSB7CiAgICAgICAgY3R4dCA9IGdlbl9odG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDEpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDIpOwogICAgICAgIG9wdGlvbnMgPSBnZW5faW50KG5fb3B0aW9ucywgMyk7CgogICAgICAgIHJldF92YWwgPSBodG1sQ3R4dFJlYWRGaWxlKGN0eHQsIGZpbGVuYW1lLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfaHRtbERvY1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2h0bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgMik7CiAgICAgICAgZGVzX2ludChuX29wdGlvbnMsIG9wdGlvbnMsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxDdHh0UmVhZE1lbW9yeSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGh0bWxEb2NQdHIgcmV0X3ZhbDsKICAgIGh0bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIEhUTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBjaGFyICogYnVmZmVyOyAvKiBhIHBvaW50ZXIgdG8gYSBjaGFyIGFycmF5ICovCiAgICBpbnQgbl9idWZmZXI7CiAgICBpbnQgc2l6ZTsgLyogdGhlIHNpemUgb2YgdGhlIGFycmF5ICovCiAgICBpbnQgbl9zaXplOwogICAgY29uc3QgY2hhciAqIFVSTDsgLyogdGhlIGJhc2UgVVJMIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9VUkw7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiBodG1sUGFyc2VyT3B0aW9uKHMpICovCiAgICBpbnQgbl9vcHRpb25zOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfaHRtbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9idWZmZXIgPSAwO25fYnVmZmVyIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fYnVmZmVyKyspIHsKICAgIGZvciAobl9zaXplID0gMDtuX3NpemUgPCBnZW5fbmJfaW50O25fc2l6ZSsrKSB7CiAgICBmb3IgKG5fVVJMID0gMDtuX1VSTCA8IGdlbl9uYl9maWxlcGF0aDtuX1VSTCsrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICBmb3IgKG5fb3B0aW9ucyA9IDA7bl9vcHRpb25zIDwgZ2VuX25iX2ludDtuX29wdGlvbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl9odG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGJ1ZmZlciA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2J1ZmZlciwgMSk7CiAgICAgICAgc2l6ZSA9IGdlbl9pbnQobl9zaXplLCAyKTsKICAgICAgICBVUkwgPSBnZW5fZmlsZXBhdGgobl9VUkwsIDMpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDQpOwogICAgICAgIG9wdGlvbnMgPSBnZW5faW50KG5fb3B0aW9ucywgNSk7CgogICAgICAgIHJldF92YWwgPSBodG1sQ3R4dFJlYWRNZW1vcnkoY3R4dCwgKGNvbnN0IGNoYXIgKilidWZmZXIsIHNpemUsIFVSTCwgKGNvbnN0IGNoYXIgKillbmNvZGluZywgb3B0aW9ucyk7CiAgICAgICAgZGVzcmV0X2h0bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19odG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2J1ZmZlciwgKGNvbnN0IGNoYXIgKilidWZmZXIsIDEpOwogICAgICAgIGRlc19pbnQobl9zaXplLCBzaXplLCAyKTsKICAgICAgICBkZXNfZmlsZXBhdGgobl9VUkwsIFVSTCwgMyk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDQpOwogICAgICAgIGRlc19pbnQobl9vcHRpb25zLCBvcHRpb25zLCA1KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxDdHh0UmVhZE1lbW9yeSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1ZmZlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSTCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vcHRpb25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbEN0eHRSZXNldCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGh0bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIEhUTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl9odG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl9odG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICBodG1sQ3R4dFJlc2V0KGN0eHQpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaHRtbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxDdHh0UmVzZXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxDdHh0VXNlT3B0aW9ucyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaHRtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gSFRNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIGh0bWxQYXJzZXJPcHRpb24ocykgKi8KICAgIGludCBuX29wdGlvbnM7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl9odG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX29wdGlvbnMgPSAwO25fb3B0aW9ucyA8IGdlbl9uYl9pbnQ7bl9vcHRpb25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5faHRtbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBvcHRpb25zID0gZ2VuX2ludChuX29wdGlvbnMsIDEpOwoKICAgICAgICByZXRfdmFsID0gaHRtbEN0eHRVc2VPcHRpb25zKGN0eHQsIG9wdGlvbnMpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19odG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9vcHRpb25zLCBvcHRpb25zLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxDdHh0VXNlT3B0aW9ucyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29wdGlvbnMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sRWxlbWVudEFsbG93ZWRIZXJlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBodG1sRWxlbURlc2MgKiBwYXJlbnQ7IC8qIEhUTUwgcGFyZW50IGVsZW1lbnQgKi8KICAgIGludCBuX3BhcmVudDsKICAgIHhtbENoYXIgKiBlbHQ7IC8qIEhUTUwgZWxlbWVudCAqLwogICAgaW50IG5fZWx0OwoKICAgIGZvciAobl9wYXJlbnQgPSAwO25fcGFyZW50IDwgZ2VuX25iX2NvbnN0X2h0bWxFbGVtRGVzY19wdHI7bl9wYXJlbnQrKykgewogICAgZm9yIChuX2VsdCA9IDA7bl9lbHQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9lbHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcGFyZW50ID0gZ2VuX2NvbnN0X2h0bWxFbGVtRGVzY19wdHIobl9wYXJlbnQsIDApOwogICAgICAgIGVsdCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2VsdCwgMSk7CgogICAgICAgIHJldF92YWwgPSBodG1sRWxlbWVudEFsbG93ZWRIZXJlKChjb25zdCBodG1sRWxlbURlc2MgKilwYXJlbnQsIChjb25zdCB4bWxDaGFyICopZWx0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfaHRtbEVsZW1EZXNjX3B0cihuX3BhcmVudCwgKGNvbnN0IGh0bWxFbGVtRGVzYyAqKXBhcmVudCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fZWx0LCAoY29uc3QgeG1sQ2hhciAqKWVsdCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sRWxlbWVudEFsbG93ZWRIZXJlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3BhcmVudCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sRWxlbWVudFN0YXR1c0hlcmUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBodG1sU3RhdHVzIHJldF92YWw7CiAgICBodG1sRWxlbURlc2MgKiBwYXJlbnQ7IC8qIEhUTUwgcGFyZW50IGVsZW1lbnQgKi8KICAgIGludCBuX3BhcmVudDsKICAgIGh0bWxFbGVtRGVzYyAqIGVsdDsgLyogSFRNTCBlbGVtZW50ICovCiAgICBpbnQgbl9lbHQ7CgogICAgZm9yIChuX3BhcmVudCA9IDA7bl9wYXJlbnQgPCBnZW5fbmJfY29uc3RfaHRtbEVsZW1EZXNjX3B0cjtuX3BhcmVudCsrKSB7CiAgICBmb3IgKG5fZWx0ID0gMDtuX2VsdCA8IGdlbl9uYl9jb25zdF9odG1sRWxlbURlc2NfcHRyO25fZWx0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHBhcmVudCA9IGdlbl9jb25zdF9odG1sRWxlbURlc2NfcHRyKG5fcGFyZW50LCAwKTsKICAgICAgICBlbHQgPSBnZW5fY29uc3RfaHRtbEVsZW1EZXNjX3B0cihuX2VsdCwgMSk7CgogICAgICAgIHJldF92YWwgPSBodG1sRWxlbWVudFN0YXR1c0hlcmUoKGNvbnN0IGh0bWxFbGVtRGVzYyAqKXBhcmVudCwgKGNvbnN0IGh0bWxFbGVtRGVzYyAqKWVsdCk7CiAgICAgICAgZGVzcmV0X2h0bWxTdGF0dXMocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9odG1sRWxlbURlc2NfcHRyKG5fcGFyZW50LCAoY29uc3QgaHRtbEVsZW1EZXNjICopcGFyZW50LCAwKTsKICAgICAgICBkZXNfY29uc3RfaHRtbEVsZW1EZXNjX3B0cihuX2VsdCwgKGNvbnN0IGh0bWxFbGVtRGVzYyAqKWVsdCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sRWxlbWVudFN0YXR1c0hlcmUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcGFyZW50KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsdCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxFbmNvZGVFbnRpdGllcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdW5zaWduZWQgY2hhciAqIG91dDsgLyogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGJ5dGVzIHRvIHN0b3JlIHRoZSByZXN1bHQgKi8KICAgIGludCBuX291dDsKICAgIGludCAqIG91dGxlbjsgLyogdGhlIGxlbmd0aCBvZiBAb3V0ICovCiAgICBpbnQgbl9vdXRsZW47CiAgICB1bnNpZ25lZCBjaGFyICogaW47IC8qIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBVVEYtOCBjaGFycyAqLwogICAgaW50IG5faW47CiAgICBpbnQgKiBpbmxlbjsgLyogdGhlIGxlbmd0aCBvZiBAaW4gKi8KICAgIGludCBuX2lubGVuOwogICAgaW50IHF1b3RlQ2hhcjsgLyogdGhlIHF1b3RlIGNoYXJhY3RlciB0byBlc2NhcGUgKCcgb3IgIikgb3IgemVyby4gKi8KICAgIGludCBuX3F1b3RlQ2hhcjsKCiAgICBmb3IgKG5fb3V0ID0gMDtuX291dCA8IGdlbl9uYl91bnNpZ25lZF9jaGFyX3B0cjtuX291dCsrKSB7CiAgICBmb3IgKG5fb3V0bGVuID0gMDtuX291dGxlbiA8IGdlbl9uYl9pbnRfcHRyO25fb3V0bGVuKyspIHsKICAgIGZvciAobl9pbiA9IDA7bl9pbiA8IGdlbl9uYl9jb25zdF91bnNpZ25lZF9jaGFyX3B0cjtuX2luKyspIHsKICAgIGZvciAobl9pbmxlbiA9IDA7bl9pbmxlbiA8IGdlbl9uYl9pbnRfcHRyO25faW5sZW4rKykgewogICAgZm9yIChuX3F1b3RlQ2hhciA9IDA7bl9xdW90ZUNoYXIgPCBnZW5fbmJfaW50O25fcXVvdGVDaGFyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG91dCA9IGdlbl91bnNpZ25lZF9jaGFyX3B0cihuX291dCwgMCk7CiAgICAgICAgb3V0bGVuID0gZ2VuX2ludF9wdHIobl9vdXRsZW4sIDEpOwogICAgICAgIGluID0gZ2VuX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyKG5faW4sIDIpOwogICAgICAgIGlubGVuID0gZ2VuX2ludF9wdHIobl9pbmxlbiwgMyk7CiAgICAgICAgcXVvdGVDaGFyID0gZ2VuX2ludChuX3F1b3RlQ2hhciwgNCk7CgogICAgICAgIHJldF92YWwgPSBodG1sRW5jb2RlRW50aXRpZXMob3V0LCBvdXRsZW4sIChjb25zdCB1bnNpZ25lZCBjaGFyICopaW4sIGlubGVuLCBxdW90ZUNoYXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc191bnNpZ25lZF9jaGFyX3B0cihuX291dCwgb3V0LCAwKTsKICAgICAgICBkZXNfaW50X3B0cihuX291dGxlbiwgb3V0bGVuLCAxKTsKICAgICAgICBkZXNfY29uc3RfdW5zaWduZWRfY2hhcl9wdHIobl9pbiwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilpbiwgMik7CiAgICAgICAgZGVzX2ludF9wdHIobl9pbmxlbiwgaW5sZW4sIDMpOwogICAgICAgIGRlc19pbnQobl9xdW90ZUNoYXIsIHF1b3RlQ2hhciwgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sRW5jb2RlRW50aXRpZXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dGxlbik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbmxlbik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9xdW90ZUNoYXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sRW50aXR5TG9va3VwKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgaHRtbEVudGl0eURlc2MgKiByZXRfdmFsOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBlbnRpdHkgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMCk7CgogICAgICAgIHJldF92YWwgPSBodG1sRW50aXR5TG9va3VwKChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X2NvbnN0X2h0bWxFbnRpdHlEZXNjX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxFbnRpdHlMb29rdXAiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxFbnRpdHlWYWx1ZUxvb2t1cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IGh0bWxFbnRpdHlEZXNjICogcmV0X3ZhbDsKICAgIHVuc2lnbmVkIGludCB2YWx1ZTsgLyogdGhlIGVudGl0eSdzIHVuaWNvZGUgdmFsdWUgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl91bnNpZ25lZF9pbnQ7bl92YWx1ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWx1ZSA9IGdlbl91bnNpZ25lZF9pbnQobl92YWx1ZSwgMCk7CgogICAgICAgIHJldF92YWwgPSBodG1sRW50aXR5VmFsdWVMb29rdXAodmFsdWUpOwogICAgICAgIGRlc3JldF9jb25zdF9odG1sRW50aXR5RGVzY19wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc191bnNpZ25lZF9pbnQobl92YWx1ZSwgdmFsdWUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbEVudGl0eVZhbHVlTG9va3VwIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbEhhbmRsZU9taXR0ZWRFbGVtKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgdmFsOyAvKiBpbnQgMCBvciAxICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfaW50O25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl9pbnQobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0gaHRtbEhhbmRsZU9taXR0ZWRFbGVtKHZhbCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxIYW5kbGVPbWl0dGVkRWxlbSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sSXNBdXRvQ2xvc2VkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBodG1sRG9jUHRyIGRvYzsgLyogdGhlIEhUTUwgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIGh0bWxOb2RlUHRyIGVsZW07IC8qIHRoZSBIVE1MIGVsZW1lbnQgKi8KICAgIGludCBuX2VsZW07CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfaHRtbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX2h0bWxOb2RlUHRyO25fZWxlbSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5faHRtbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgZWxlbSA9IGdlbl9odG1sTm9kZVB0cihuX2VsZW0sIDEpOwoKICAgICAgICByZXRfdmFsID0gaHRtbElzQXV0b0Nsb3NlZChkb2MsIGVsZW0pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19odG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19odG1sTm9kZVB0cihuX2VsZW0sIGVsZW0sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbElzQXV0b0Nsb3NlZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZWxlbSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxJc1NjcmlwdEF0dHJpYnV0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIGFuIGF0dHJpYnV0ZSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxJc1NjcmlwdEF0dHJpYnV0ZSgoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sSXNTY3JpcHRBdHRyaWJ1dGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxOZXdQYXJzZXJDdHh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaHRtbFBhcnNlckN0eHRQdHIgcmV0X3ZhbDsKCiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxOZXdQYXJzZXJDdHh0KCk7CiAgICAgICAgZGVzcmV0X2h0bWxQYXJzZXJDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxOZXdQYXJzZXJDdHh0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbE5vZGVTdGF0dXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBodG1sU3RhdHVzIHJldF92YWw7CiAgICBodG1sTm9kZVB0ciBub2RlOyAvKiBhbiBodG1sTm9kZVB0ciBpbiBhIHRyZWUgKi8KICAgIGludCBuX25vZGU7CiAgICBpbnQgbGVnYWN5OyAvKiB3aGV0aGVyIHRvIGFsbG93IGRlcHJlY2F0ZWQgZWxlbWVudHMgKFlFUyBpcyBmYXN0ZXIgaGVyZSBmb3IgRWxlbWVudCBub2RlcykgKi8KICAgIGludCBuX2xlZ2FjeTsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX2NvbnN0X2h0bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fbGVnYWN5ID0gMDtuX2xlZ2FjeSA8IGdlbl9uYl9pbnQ7bl9sZWdhY3krKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZSA9IGdlbl9jb25zdF9odG1sTm9kZVB0cihuX25vZGUsIDApOwogICAgICAgIGxlZ2FjeSA9IGdlbl9pbnQobl9sZWdhY3ksIDEpOwoKICAgICAgICByZXRfdmFsID0gaHRtbE5vZGVTdGF0dXMoKGNvbnN0IGh0bWxOb2RlUHRyKW5vZGUsIGxlZ2FjeSk7CiAgICAgICAgZGVzcmV0X2h0bWxTdGF0dXMocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9odG1sTm9kZVB0cihuX25vZGUsIChjb25zdCBodG1sTm9kZVB0cilub2RlLCAwKTsKICAgICAgICBkZXNfaW50KG5fbGVnYWN5LCBsZWdhY3ksIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbE5vZGVTdGF0dXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZWdhY3kpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sUGFyc2VDaGFyUmVmKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBodG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBIVE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfaHRtbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5faHRtbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxQYXJzZUNoYXJSZWYoY3R4dCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2h0bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sUGFyc2VDaGFyUmVmIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sUGFyc2VDaHVuayh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfUFVTSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBodG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBIVE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgY2hhciAqIGNodW5rOyAvKiBhbiBjaGFyIGFycmF5ICovCiAgICBpbnQgbl9jaHVuazsKICAgIGludCBzaXplOyAvKiB0aGUgc2l6ZSBpbiBieXRlIG9mIHRoZSBjaHVuayAqLwogICAgaW50IG5fc2l6ZTsKICAgIGludCB0ZXJtaW5hdGU7IC8qIGxhc3QgY2h1bmsgaW5kaWNhdG9yICovCiAgICBpbnQgbl90ZXJtaW5hdGU7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl9odG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2NodW5rID0gMDtuX2NodW5rIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fY2h1bmsrKykgewogICAgZm9yIChuX3NpemUgPSAwO25fc2l6ZSA8IGdlbl9uYl9pbnQ7bl9zaXplKyspIHsKICAgIGZvciAobl90ZXJtaW5hdGUgPSAwO25fdGVybWluYXRlIDwgZ2VuX25iX2ludDtuX3Rlcm1pbmF0ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX2h0bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgY2h1bmsgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9jaHVuaywgMSk7CiAgICAgICAgc2l6ZSA9IGdlbl9pbnQobl9zaXplLCAyKTsKICAgICAgICB0ZXJtaW5hdGUgPSBnZW5faW50KG5fdGVybWluYXRlLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxQYXJzZUNodW5rKGN0eHQsIChjb25zdCBjaGFyICopY2h1bmssIHNpemUsIHRlcm1pbmF0ZSk7CiAgICAgICAgaWYgKGN0eHQgIT0gTlVMTCkge3htbEZyZWVEb2MoY3R4dC0+bXlEb2MpOyBjdHh0LT5teURvYyA9IE5VTEw7fQogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19odG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2NodW5rLCAoY29uc3QgY2hhciAqKWNodW5rLCAxKTsKICAgICAgICBkZXNfaW50KG5fc2l6ZSwgc2l6ZSwgMik7CiAgICAgICAgZGVzX2ludChuX3Rlcm1pbmF0ZSwgdGVybWluYXRlLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxQYXJzZUNodW5rIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY2h1bmspOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2l6ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90ZXJtaW5hdGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sUGFyc2VEb2Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBodG1sRG9jUHRyIHJldF92YWw7CiAgICB4bWxDaGFyICogY3VyOyAvKiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgeG1sQ2hhciAqLwogICAgaW50IG5fY3VyOwogICAgY2hhciAqIGVuY29kaW5nOyAvKiBhIGZyZWUgZm9ybSBDIHN0cmluZyBkZXNjcmliaW5nIHRoZSBIVE1MIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCiAgICBpbnQgbl9lbmNvZGluZzsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxDaGFyX3B0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sQ2hhcl9wdHIobl9jdXIsIDApOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDEpOwoKICAgICAgICByZXRfdmFsID0gaHRtbFBhcnNlRG9jKGN1ciwgKGNvbnN0IGNoYXIgKillbmNvZGluZyk7CiAgICAgICAgZGVzcmV0X2h0bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxDaGFyX3B0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sUGFyc2VEb2MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbFBhcnNlRG9jdW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGh0bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIEhUTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl9odG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl9odG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICByZXRfdmFsID0gaHRtbFBhcnNlRG9jdW1lbnQoY3R4dCk7CiAgICAgICAgaWYgKGN0eHQgIT0gTlVMTCkge3htbEZyZWVEb2MoY3R4dC0+bXlEb2MpOyBjdHh0LT5teURvYyA9IE5VTEw7fQogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19odG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbFBhcnNlRG9jdW1lbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxQYXJzZUVsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBodG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBIVE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfaHRtbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5faHRtbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgaHRtbFBhcnNlRWxlbWVudChjdHh0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2h0bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sUGFyc2VFbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sUGFyc2VFbnRpdHlSZWYodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBjb25zdCBodG1sRW50aXR5RGVzYyAqIHJldF92YWw7CiAgICBodG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBIVE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sQ2hhciAqKiBzdHI7IC8qIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBlbnRpdHkgbmFtZSAqLwogICAgaW50IG5fc3RyOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfaHRtbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9zdHIgPSAwO25fc3RyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyX3B0cjtuX3N0cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX2h0bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgc3RyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyX3B0cihuX3N0ciwgMSk7CgogICAgICAgIHJldF92YWwgPSBodG1sUGFyc2VFbnRpdHlSZWYoY3R4dCwgKGNvbnN0IHhtbENoYXIgKiopc3RyKTsKICAgICAgICBkZXNyZXRfY29uc3RfaHRtbEVudGl0eURlc2NfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaHRtbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHJfcHRyKG5fc3RyLCAoY29uc3QgeG1sQ2hhciAqKilzdHIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbFBhcnNlRW50aXR5UmVmIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbFBhcnNlRmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGh0bWxEb2NQdHIgcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIGZpbGVuYW1lICovCiAgICBpbnQgbl9maWxlbmFtZTsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogYSBmcmVlIGZvcm0gQyBzdHJpbmcgZGVzY3JpYmluZyB0aGUgSFRNTCBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CgogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVwYXRoO25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDApOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDEpOwoKICAgICAgICByZXRfdmFsID0gaHRtbFBhcnNlRmlsZShmaWxlbmFtZSwgKGNvbnN0IGNoYXIgKillbmNvZGluZyk7CiAgICAgICAgZGVzcmV0X2h0bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxSZWFkRG9jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaHRtbERvY1B0ciByZXRfdmFsOwogICAgeG1sQ2hhciAqIGN1cjsgLyogYSBwb2ludGVyIHRvIGEgemVybyB0ZXJtaW5hdGVkIHN0cmluZyAqLwogICAgaW50IG5fY3VyOwogICAgY29uc3QgY2hhciAqIFVSTDsgLyogdGhlIGJhc2UgVVJMIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9VUkw7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiBodG1sUGFyc2VyT3B0aW9uKHMpICovCiAgICBpbnQgbl9vcHRpb25zOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY3VyKyspIHsKICAgIGZvciAobl9VUkwgPSAwO25fVVJMIDwgZ2VuX25iX2ZpbGVwYXRoO25fVVJMKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9vcHRpb25zID0gMDtuX29wdGlvbnMgPCBnZW5fbmJfaW50O25fb3B0aW9ucysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jdXIsIDApOwogICAgICAgIFVSTCA9IGdlbl9maWxlcGF0aChuX1VSTCwgMSk7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgMik7CiAgICAgICAgb3B0aW9ucyA9IGdlbl9pbnQobl9vcHRpb25zLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxSZWFkRG9jKChjb25zdCB4bWxDaGFyICopY3VyLCBVUkwsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIG9wdGlvbnMpOwogICAgICAgIGRlc3JldF9odG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jdXIsIChjb25zdCB4bWxDaGFyICopY3VyLCAwKTsKICAgICAgICBkZXNfZmlsZXBhdGgobl9VUkwsIFVSTCwgMSk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDIpOwogICAgICAgIGRlc19pbnQobl9vcHRpb25zLCBvcHRpb25zLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxSZWFkRG9jIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3B0aW9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxSZWFkRmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGh0bWxEb2NQdHIgcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogYSBmaWxlIG9yIFVSTCAqLwogICAgaW50IG5fZmlsZW5hbWU7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiBodG1sUGFyc2VyT3B0aW9uKHMpICovCiAgICBpbnQgbl9vcHRpb25zOwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlcGF0aDtuX2ZpbGVuYW1lKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9vcHRpb25zID0gMDtuX29wdGlvbnMgPCBnZW5fbmJfaW50O25fb3B0aW9ucysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlcGF0aChuX2ZpbGVuYW1lLCAwKTsKICAgICAgICBlbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAxKTsKICAgICAgICBvcHRpb25zID0gZ2VuX2ludChuX29wdGlvbnMsIDIpOwoKICAgICAgICByZXRfdmFsID0gaHRtbFJlYWRGaWxlKGZpbGVuYW1lLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfaHRtbERvY1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgMSk7CiAgICAgICAgZGVzX2ludChuX29wdGlvbnMsIG9wdGlvbnMsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbFJlYWRGaWxlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29wdGlvbnMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sUmVhZE1lbW9yeSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGh0bWxEb2NQdHIgcmV0X3ZhbDsKICAgIGNoYXIgKiBidWZmZXI7IC8qIGEgcG9pbnRlciB0byBhIGNoYXIgYXJyYXkgKi8KICAgIGludCBuX2J1ZmZlcjsKICAgIGludCBzaXplOyAvKiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgKi8KICAgIGludCBuX3NpemU7CiAgICBjb25zdCBjaGFyICogVVJMOyAvKiB0aGUgYmFzZSBVUkwgdG8gdXNlIGZvciB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX1VSTDsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCiAgICBpbnQgbl9lbmNvZGluZzsKICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIGh0bWxQYXJzZXJPcHRpb24ocykgKi8KICAgIGludCBuX29wdGlvbnM7CgogICAgZm9yIChuX2J1ZmZlciA9IDA7bl9idWZmZXIgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9idWZmZXIrKykgewogICAgZm9yIChuX3NpemUgPSAwO25fc2l6ZSA8IGdlbl9uYl9pbnQ7bl9zaXplKyspIHsKICAgIGZvciAobl9VUkwgPSAwO25fVVJMIDwgZ2VuX25iX2ZpbGVwYXRoO25fVVJMKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9vcHRpb25zID0gMDtuX29wdGlvbnMgPCBnZW5fbmJfaW50O25fb3B0aW9ucysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWZmZXIgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9idWZmZXIsIDApOwogICAgICAgIHNpemUgPSBnZW5faW50KG5fc2l6ZSwgMSk7CiAgICAgICAgVVJMID0gZ2VuX2ZpbGVwYXRoKG5fVVJMLCAyKTsKICAgICAgICBlbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAzKTsKICAgICAgICBvcHRpb25zID0gZ2VuX2ludChuX29wdGlvbnMsIDQpOwoKICAgICAgICByZXRfdmFsID0gaHRtbFJlYWRNZW1vcnkoKGNvbnN0IGNoYXIgKilidWZmZXIsIHNpemUsIFVSTCwgKGNvbnN0IGNoYXIgKillbmNvZGluZywgb3B0aW9ucyk7CiAgICAgICAgZGVzcmV0X2h0bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2J1ZmZlciwgKGNvbnN0IGNoYXIgKilidWZmZXIsIDApOwogICAgICAgIGRlc19pbnQobl9zaXplLCBzaXplLCAxKTsKICAgICAgICBkZXNfZmlsZXBhdGgobl9VUkwsIFVSTCwgMik7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDMpOwogICAgICAgIGRlc19pbnQobl9vcHRpb25zLCBvcHRpb25zLCA0KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxSZWFkTWVtb3J5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1ZmZlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSTCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vcHRpb25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbFNBWFBhcnNlRG9jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaHRtbERvY1B0ciByZXRfdmFsOwogICAgeG1sQ2hhciAqIGN1cjsgLyogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHhtbENoYXIgKi8KICAgIGludCBuX2N1cjsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogYSBmcmVlIGZvcm0gQyBzdHJpbmcgZGVzY3JpYmluZyB0aGUgSFRNTCBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBodG1sU0FYSGFuZGxlclB0ciBzYXg7IC8qIHRoZSBTQVggaGFuZGxlciBibG9jayAqLwogICAgaW50IG5fc2F4OwogICAgdm9pZCAqIHVzZXJEYXRhOyAvKiBpZiB1c2luZyBTQVgsIHRoaXMgcG9pbnRlciB3aWxsIGJlIHByb3ZpZGVkIG9uIGNhbGxiYWNrcy4gKi8KICAgIGludCBuX3VzZXJEYXRhOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbENoYXJfcHRyO25fY3VyKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9zYXggPSAwO25fc2F4IDwgZ2VuX25iX2h0bWxTQVhIYW5kbGVyUHRyO25fc2F4KyspIHsKICAgIGZvciAobl91c2VyRGF0YSA9IDA7bl91c2VyRGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX3VzZXJEYXRhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxDaGFyX3B0cihuX2N1ciwgMCk7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgMSk7CiAgICAgICAgc2F4ID0gZ2VuX2h0bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCAyKTsKICAgICAgICB1c2VyRGF0YSA9IGdlbl91c2VyZGF0YShuX3VzZXJEYXRhLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxTQVhQYXJzZURvYyhjdXIsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIHNheCwgdXNlckRhdGEpOwogICAgICAgIGRlc3JldF9odG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQ2hhcl9wdHIobl9jdXIsIGN1ciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDEpOwogICAgICAgIGRlc19odG1sU0FYSGFuZGxlclB0cihuX3NheCwgc2F4LCAyKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl91c2VyRGF0YSwgdXNlckRhdGEsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbFNBWFBhcnNlRG9jIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zYXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXNlckRhdGEpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sU0FYUGFyc2VGaWxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaHRtbERvY1B0ciByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgZmlsZW5hbWUgKi8KICAgIGludCBuX2ZpbGVuYW1lOwogICAgY2hhciAqIGVuY29kaW5nOyAvKiBhIGZyZWUgZm9ybSBDIHN0cmluZyBkZXNjcmliaW5nIHRoZSBIVE1MIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCiAgICBpbnQgbl9lbmNvZGluZzsKICAgIGh0bWxTQVhIYW5kbGVyUHRyIHNheDsgLyogdGhlIFNBWCBoYW5kbGVyIGJsb2NrICovCiAgICBpbnQgbl9zYXg7CiAgICB2b2lkICogdXNlckRhdGE7IC8qIGlmIHVzaW5nIFNBWCwgdGhpcyBwb2ludGVyIHdpbGwgYmUgcHJvdmlkZWQgb24gY2FsbGJhY2tzLiAqLwogICAgaW50IG5fdXNlckRhdGE7CgogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVwYXRoO25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgZm9yIChuX3NheCA9IDA7bl9zYXggPCBnZW5fbmJfaHRtbFNBWEhhbmRsZXJQdHI7bl9zYXgrKykgewogICAgZm9yIChuX3VzZXJEYXRhID0gMDtuX3VzZXJEYXRhIDwgZ2VuX25iX3VzZXJkYXRhO25fdXNlckRhdGErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZXBhdGgobl9maWxlbmFtZSwgMCk7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgMSk7CiAgICAgICAgc2F4ID0gZ2VuX2h0bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCAyKTsKICAgICAgICB1c2VyRGF0YSA9IGdlbl91c2VyZGF0YShuX3VzZXJEYXRhLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxTQVhQYXJzZUZpbGUoZmlsZW5hbWUsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIHNheCwgdXNlckRhdGEpOwogICAgICAgIGRlc3JldF9odG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZXBhdGgobl9maWxlbmFtZSwgZmlsZW5hbWUsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAxKTsKICAgICAgICBkZXNfaHRtbFNBWEhhbmRsZXJQdHIobl9zYXgsIHNheCwgMik7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fdXNlckRhdGEsIHVzZXJEYXRhLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxTQVhQYXJzZUZpbGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2F4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3VzZXJEYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbFRhZ0xvb2t1cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X0hUTUxwYXJzZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIEhUTUxwYXJzZXIgOiAzMiBvZiAzOCBmdW5jdGlvbnMgLi4uXG4iKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfVVRGOFRvSHRtbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sQXR0ckFsbG93ZWQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbEF1dG9DbG9zZVRhZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sQ3JlYXRlTWVtb3J5UGFyc2VyQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sQ3JlYXRlUHVzaFBhcnNlckN0eHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbEN0eHRSZWFkRG9jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxDdHh0UmVhZEZpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbEN0eHRSZWFkTWVtb3J5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxDdHh0UmVzZXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbEN0eHRVc2VPcHRpb25zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxFbGVtZW50QWxsb3dlZEhlcmUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbEVsZW1lbnRTdGF0dXNIZXJlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxFbmNvZGVFbnRpdGllcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sRW50aXR5TG9va3VwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxFbnRpdHlWYWx1ZUxvb2t1cCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sSGFuZGxlT21pdHRlZEVsZW0oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbElzQXV0b0Nsb3NlZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sSXNTY3JpcHRBdHRyaWJ1dGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbE5ld1BhcnNlckN0eHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbE5vZGVTdGF0dXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbFBhcnNlQ2hhclJlZigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sUGFyc2VDaHVuaygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sUGFyc2VEb2MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbFBhcnNlRG9jdW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbFBhcnNlRWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sUGFyc2VFbnRpdHlSZWYoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbFBhcnNlRmlsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sUmVhZERvYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sUmVhZEZpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbFJlYWRNZW1vcnkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbFNBWFBhcnNlRG9jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxTQVhQYXJzZUZpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbFRhZ0xvb2t1cCgpOwoKICAgIGlmICh0ZXN0X3JldCAhPSAwKQoJcHJpbnRmKCJNb2R1bGUgSFRNTHBhcnNlcjogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfaHRtbERvY0NvbnRlbnREdW1wRm9ybWF0T3V0cHV0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE91dHB1dEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBIVE1MIGJ1ZmZlciBvdXRwdXQgKi8KICAgIGludCBuX2J1ZjsKICAgIHhtbERvY1B0ciBjdXI7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fY3VyOwogICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZW5jb2Rpbmcgc3RyaW5nICovCiAgICBpbnQgbl9lbmNvZGluZzsKICAgIGludCBmb3JtYXQ7IC8qIHNob3VsZCBmb3JtYXR0aW5nIHNwYWNlcyBiZWVuIGFkZGVkICovCiAgICBpbnQgbl9mb3JtYXQ7CgogICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sT3V0cHV0QnVmZmVyUHRyO25fYnVmKyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbERvY1B0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICBmb3IgKG5fZm9ybWF0ID0gMDtuX2Zvcm1hdCA8IGdlbl9uYl9pbnQ7bl9mb3JtYXQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbE91dHB1dEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbERvY1B0cihuX2N1ciwgMSk7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgMik7CiAgICAgICAgZm9ybWF0ID0gZ2VuX2ludChuX2Zvcm1hdCwgMyk7CgogICAgICAgIGh0bWxEb2NDb250ZW50RHVtcEZvcm1hdE91dHB1dChidWYsIGN1ciwgKGNvbnN0IGNoYXIgKillbmNvZGluZywgZm9ybWF0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE91dHB1dEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fY3VyLCBjdXIsIDEpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAyKTsKICAgICAgICBkZXNfaW50KG5fZm9ybWF0LCBmb3JtYXQsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbERvY0NvbnRlbnREdW1wRm9ybWF0T3V0cHV0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZm9ybWF0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbERvY0NvbnRlbnREdW1wT3V0cHV0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE91dHB1dEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBIVE1MIGJ1ZmZlciBvdXRwdXQgKi8KICAgIGludCBuX2J1ZjsKICAgIHhtbERvY1B0ciBjdXI7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fY3VyOwogICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZW5jb2Rpbmcgc3RyaW5nICovCiAgICBpbnQgbl9lbmNvZGluZzsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxPdXRwdXRCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sRG9jUHRyO25fY3VyKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxPdXRwdXRCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxEb2NQdHIobl9jdXIsIDEpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDIpOwoKICAgICAgICBodG1sRG9jQ29udGVudER1bXBPdXRwdXQoYnVmLCBjdXIsIChjb25zdCBjaGFyICopZW5jb2RpbmcpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sT3V0cHV0QnVmZmVyUHRyKG5fYnVmLCBidWYsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbERvY0NvbnRlbnREdW1wT3V0cHV0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sRG9jRHVtcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIEZJTEUgKiBmOyAvKiB0aGUgRklMRSogKi8KICAgIGludCBuX2Y7CiAgICB4bWxEb2NQdHIgY3VyOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fZiA9IDA7bl9mIDwgZ2VuX25iX0ZJTEVfcHRyO25fZisrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxEb2NQdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZiA9IGdlbl9GSUxFX3B0cihuX2YsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxEb2NQdHIobl9jdXIsIDEpOwoKICAgICAgICByZXRfdmFsID0gaHRtbERvY0R1bXAoZiwgY3VyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfRklMRV9wdHIobl9mLCBmLCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fY3VyLCBjdXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbERvY0R1bXAiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCiNkZWZpbmUgZ2VuX25iX3htbENoYXJfcHRyX3B0ciAxCnN0YXRpYyB4bWxDaGFyICoqIGdlbl94bWxDaGFyX3B0cl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbENoYXJfcHRyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sQ2hhciAqKiB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKc3RhdGljIGludAp0ZXN0X2h0bWxEb2NEdW1wTWVtb3J5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciBjdXI7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fY3VyOwogICAgeG1sQ2hhciAqKiBtZW07IC8qIE9VVDogdGhlIG1lbW9yeSBwb2ludGVyICovCiAgICBpbnQgbl9tZW07CiAgICBpbnQgKiBzaXplOyAvKiBPVVQ6IHRoZSBtZW1vcnkgbGVuZ3RoICovCiAgICBpbnQgbl9zaXplOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbERvY1B0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fbWVtID0gMDtuX21lbSA8IGdlbl9uYl94bWxDaGFyX3B0cl9wdHI7bl9tZW0rKykgewogICAgZm9yIChuX3NpemUgPSAwO25fc2l6ZSA8IGdlbl9uYl9pbnRfcHRyO25fc2l6ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sRG9jUHRyKG5fY3VyLCAwKTsKICAgICAgICBtZW0gPSBnZW5feG1sQ2hhcl9wdHJfcHRyKG5fbWVtLCAxKTsKICAgICAgICBzaXplID0gZ2VuX2ludF9wdHIobl9zaXplLCAyKTsKCiAgICAgICAgaHRtbERvY0R1bXBNZW1vcnkoY3VyLCBtZW0sIHNpemUpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fY3VyLCBjdXIsIDApOwogICAgICAgIGRlc194bWxDaGFyX3B0cl9wdHIobl9tZW0sIG1lbSwgMSk7CiAgICAgICAgZGVzX2ludF9wdHIobl9zaXplLCBzaXplLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxEb2NEdW1wTWVtb3J5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9tZW0pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2l6ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxEb2NEdW1wTWVtb3J5Rm9ybWF0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciBjdXI7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fY3VyOwogICAgeG1sQ2hhciAqKiBtZW07IC8qIE9VVDogdGhlIG1lbW9yeSBwb2ludGVyICovCiAgICBpbnQgbl9tZW07CiAgICBpbnQgKiBzaXplOyAvKiBPVVQ6IHRoZSBtZW1vcnkgbGVuZ3RoICovCiAgICBpbnQgbl9zaXplOwogICAgaW50IGZvcm1hdDsgLyogc2hvdWxkIGZvcm1hdHRpbmcgc3BhY2VzIGJlZW4gYWRkZWQgKi8KICAgIGludCBuX2Zvcm1hdDsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxEb2NQdHI7bl9jdXIrKykgewogICAgZm9yIChuX21lbSA9IDA7bl9tZW0gPCBnZW5fbmJfeG1sQ2hhcl9wdHJfcHRyO25fbWVtKyspIHsKICAgIGZvciAobl9zaXplID0gMDtuX3NpemUgPCBnZW5fbmJfaW50X3B0cjtuX3NpemUrKykgewogICAgZm9yIChuX2Zvcm1hdCA9IDA7bl9mb3JtYXQgPCBnZW5fbmJfaW50O25fZm9ybWF0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxEb2NQdHIobl9jdXIsIDApOwogICAgICAgIG1lbSA9IGdlbl94bWxDaGFyX3B0cl9wdHIobl9tZW0sIDEpOwogICAgICAgIHNpemUgPSBnZW5faW50X3B0cihuX3NpemUsIDIpOwogICAgICAgIGZvcm1hdCA9IGdlbl9pbnQobl9mb3JtYXQsIDMpOwoKICAgICAgICBodG1sRG9jRHVtcE1lbW9yeUZvcm1hdChjdXIsIG1lbSwgc2l6ZSwgZm9ybWF0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfeG1sQ2hhcl9wdHJfcHRyKG5fbWVtLCBtZW0sIDEpOwogICAgICAgIGRlc19pbnRfcHRyKG5fc2l6ZSwgc2l6ZSwgMik7CiAgICAgICAgZGVzX2ludChuX2Zvcm1hdCwgZm9ybWF0LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxEb2NEdW1wTWVtb3J5Rm9ybWF0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9tZW0pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2l6ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mb3JtYXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sR2V0TWV0YUVuY29kaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICBodG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfaHRtbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5faHRtbERvY1B0cihuX2RvYywgMCk7CgogICAgICAgIHJldF92YWwgPSBodG1sR2V0TWV0YUVuY29kaW5nKGRvYyk7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaHRtbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxHZXRNZXRhRW5jb2RpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbElzQm9vbGVhbkF0dHIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIGNoZWNrICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxJc0Jvb2xlYW5BdHRyKChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxJc0Jvb2xlYW5BdHRyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sTmV3RG9jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaHRtbERvY1B0ciByZXRfdmFsOwogICAgeG1sQ2hhciAqIFVSSTsgLyogVVJJIGZvciB0aGUgZHRkLCBvciBOVUxMICovCiAgICBpbnQgbl9VUkk7CiAgICB4bWxDaGFyICogRXh0ZXJuYWxJRDsgLyogdGhlIGV4dGVybmFsIElEIG9mIHRoZSBEVEQsIG9yIE5VTEwgKi8KICAgIGludCBuX0V4dGVybmFsSUQ7CgogICAgZm9yIChuX1VSSSA9IDA7bl9VUkkgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9VUkkrKykgewogICAgZm9yIChuX0V4dGVybmFsSUQgPSAwO25fRXh0ZXJuYWxJRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX0V4dGVybmFsSUQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgVVJJID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fVVJJLCAwKTsKICAgICAgICBFeHRlcm5hbElEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fRXh0ZXJuYWxJRCwgMSk7CgogICAgICAgIHJldF92YWwgPSBodG1sTmV3RG9jKChjb25zdCB4bWxDaGFyICopVVJJLCAoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQpOwogICAgICAgIGRlc3JldF9odG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9VUkksIChjb25zdCB4bWxDaGFyICopVVJJLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9FeHRlcm5hbElELCAoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbE5ld0RvYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkkpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fRXh0ZXJuYWxJRCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxOZXdEb2NOb0R0RCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGh0bWxEb2NQdHIgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBVUkk7IC8qIFVSSSBmb3IgdGhlIGR0ZCwgb3IgTlVMTCAqLwogICAgaW50IG5fVVJJOwogICAgeG1sQ2hhciAqIEV4dGVybmFsSUQ7IC8qIHRoZSBleHRlcm5hbCBJRCBvZiB0aGUgRFRELCBvciBOVUxMICovCiAgICBpbnQgbl9FeHRlcm5hbElEOwoKICAgIGZvciAobl9VUkkgPSAwO25fVVJJIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fVVJJKyspIHsKICAgIGZvciAobl9FeHRlcm5hbElEID0gMDtuX0V4dGVybmFsSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9FeHRlcm5hbElEKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIFVSSSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX1VSSSwgMCk7CiAgICAgICAgRXh0ZXJuYWxJRCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX0V4dGVybmFsSUQsIDEpOwoKICAgICAgICByZXRfdmFsID0gaHRtbE5ld0RvY05vRHREKChjb25zdCB4bWxDaGFyICopVVJJLCAoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQpOwogICAgICAgIGRlc3JldF9odG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9VUkksIChjb25zdCB4bWxDaGFyICopVVJJLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9FeHRlcm5hbElELCAoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbE5ld0RvY05vRHREIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSSSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9FeHRlcm5hbElEKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbE5vZGVEdW1wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIEhUTUwgYnVmZmVyIG91dHB1dCAqLwogICAgaW50IG5fYnVmOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIGN1cnJlbnQgbm9kZSAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWYgPSBnZW5feG1sQnVmZmVyUHRyKG5fYnVmLCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMik7CgogICAgICAgIHJldF92YWwgPSBodG1sTm9kZUR1bXAoYnVmLCBkb2MsIGN1cik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbE5vZGVEdW1wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbE5vZGVEdW1wRmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBGSUxFICogb3V0OyAvKiB0aGUgRklMRSBwb2ludGVyICovCiAgICBpbnQgbl9vdXQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY3VycmVudCBub2RlICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX291dCA9IDA7bl9vdXQgPCBnZW5fbmJfRklMRV9wdHI7bl9vdXQrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgb3V0ID0gZ2VuX0ZJTEVfcHRyKG5fb3V0LCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMik7CgogICAgICAgIGh0bWxOb2RlRHVtcEZpbGUob3V0LCBkb2MsIGN1cik7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19GSUxFX3B0cihuX291dCwgb3V0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbE5vZGVEdW1wRmlsZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxOb2RlRHVtcEZpbGVGb3JtYXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBGSUxFICogb3V0OyAvKiB0aGUgRklMRSBwb2ludGVyICovCiAgICBpbnQgbl9vdXQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY3VycmVudCBub2RlICovCiAgICBpbnQgbl9jdXI7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZyAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgZm9ybWF0OyAvKiBzaG91bGQgZm9ybWF0dGluZyBzcGFjZXMgYmVlbiBhZGRlZCAqLwogICAgaW50IG5fZm9ybWF0OwoKICAgIGZvciAobl9vdXQgPSAwO25fb3V0IDwgZ2VuX25iX0ZJTEVfcHRyO25fb3V0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9mb3JtYXQgPSAwO25fZm9ybWF0IDwgZ2VuX25iX2ludDtuX2Zvcm1hdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXQgPSBnZW5fRklMRV9wdHIobl9vdXQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAyKTsKICAgICAgICBlbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAzKTsKICAgICAgICBmb3JtYXQgPSBnZW5faW50KG5fZm9ybWF0LCA0KTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxOb2RlRHVtcEZpbGVGb3JtYXQob3V0LCBkb2MsIGN1ciwgKGNvbnN0IGNoYXIgKillbmNvZGluZywgZm9ybWF0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfRklMRV9wdHIobl9vdXQsIG91dCwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAyKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgMyk7CiAgICAgICAgZGVzX2ludChuX2Zvcm1hdCwgZm9ybWF0LCA0KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxOb2RlRHVtcEZpbGVGb3JtYXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZm9ybWF0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbE5vZGVEdW1wRm9ybWF0T3V0cHV0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE91dHB1dEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBIVE1MIGJ1ZmZlciBvdXRwdXQgKi8KICAgIGludCBuX2J1ZjsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBjdXJyZW50IG5vZGUgKi8KICAgIGludCBuX2N1cjsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIHN0cmluZyAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgZm9ybWF0OyAvKiBzaG91bGQgZm9ybWF0dGluZyBzcGFjZXMgYmVlbiBhZGRlZCAqLwogICAgaW50IG5fZm9ybWF0OwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbE91dHB1dEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICBmb3IgKG5fZm9ybWF0ID0gMDtuX2Zvcm1hdCA8IGdlbl9uYl9pbnQ7bl9mb3JtYXQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbE91dHB1dEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDIpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDMpOwogICAgICAgIGZvcm1hdCA9IGdlbl9pbnQobl9mb3JtYXQsIDQpOwoKICAgICAgICBodG1sTm9kZUR1bXBGb3JtYXRPdXRwdXQoYnVmLCBkb2MsIGN1ciwgKGNvbnN0IGNoYXIgKillbmNvZGluZywgZm9ybWF0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE91dHB1dEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDIpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAzKTsKICAgICAgICBkZXNfaW50KG5fZm9ybWF0LCBmb3JtYXQsIDQpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbE5vZGVEdW1wRm9ybWF0T3V0cHV0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Zvcm1hdCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxOb2RlRHVtcE91dHB1dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxPdXRwdXRCdWZmZXJQdHIgYnVmOyAvKiB0aGUgSFRNTCBidWZmZXIgb3V0cHV0ICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY3VycmVudCBub2RlICovCiAgICBpbnQgbl9jdXI7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBlbmNvZGluZyBzdHJpbmcgKi8KICAgIGludCBuX2VuY29kaW5nOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbE91dHB1dEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWYgPSBnZW5feG1sT3V0cHV0QnVmZmVyUHRyKG5fYnVmLCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMik7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgMyk7CgogICAgICAgIGh0bWxOb2RlRHVtcE91dHB1dChidWYsIGRvYywgY3VyLCAoY29uc3QgY2hhciAqKWVuY29kaW5nKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE91dHB1dEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDIpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxOb2RlRHVtcE91dHB1dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxTYXZlRmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIGZpbGVuYW1lIChvciBVUkwpICovCiAgICBpbnQgbl9maWxlbmFtZTsKICAgIHhtbERvY1B0ciBjdXI7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlb3V0cHV0O25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sRG9jUHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVvdXRwdXQobl9maWxlbmFtZSwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbERvY1B0cihuX2N1ciwgMSk7CgogICAgICAgIHJldF92YWwgPSBodG1sU2F2ZUZpbGUoZmlsZW5hbWUsIGN1cik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVvdXRwdXQobl9maWxlbmFtZSwgZmlsZW5hbWUsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sU2F2ZUZpbGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbFNhdmVGaWxlRW5jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgZmlsZW5hbWUgKi8KICAgIGludCBuX2ZpbGVuYW1lOwogICAgeG1sRG9jUHRyIGN1cjsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9jdXI7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZyAqLwogICAgaW50IG5fZW5jb2Rpbmc7CgogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVvdXRwdXQ7bl9maWxlbmFtZSsrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxEb2NQdHI7bl9jdXIrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZW91dHB1dChuX2ZpbGVuYW1lLCAwKTsKICAgICAgICBjdXIgPSBnZW5feG1sRG9jUHRyKG5fY3VyLCAxKTsKICAgICAgICBlbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxTYXZlRmlsZUVuYyhmaWxlbmFtZSwgY3VyLCAoY29uc3QgY2hhciAqKWVuY29kaW5nKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZW91dHB1dChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sU2F2ZUZpbGVFbmMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbFNhdmVGaWxlRm9ybWF0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgZmlsZW5hbWUgKi8KICAgIGludCBuX2ZpbGVuYW1lOwogICAgeG1sRG9jUHRyIGN1cjsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9jdXI7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZyAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgZm9ybWF0OyAvKiBzaG91bGQgZm9ybWF0dGluZyBzcGFjZXMgYmVlbiBhZGRlZCAqLwogICAgaW50IG5fZm9ybWF0OwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlb3V0cHV0O25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sRG9jUHRyO25fY3VyKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9mb3JtYXQgPSAwO25fZm9ybWF0IDwgZ2VuX25iX2ludDtuX2Zvcm1hdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlb3V0cHV0KG5fZmlsZW5hbWUsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxEb2NQdHIobl9jdXIsIDEpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDIpOwogICAgICAgIGZvcm1hdCA9IGdlbl9pbnQobl9mb3JtYXQsIDMpOwoKICAgICAgICByZXRfdmFsID0gaHRtbFNhdmVGaWxlRm9ybWF0KGZpbGVuYW1lLCBjdXIsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIGZvcm1hdCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVvdXRwdXQobl9maWxlbmFtZSwgZmlsZW5hbWUsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDIpOwogICAgICAgIGRlc19pbnQobl9mb3JtYXQsIGZvcm1hdCwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sU2F2ZUZpbGVGb3JtYXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Zvcm1hdCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X2h0bWxTZXRNZXRhRW5jb2Rpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGh0bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbENoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIHN0cmluZyAqLwogICAgaW50IG5fZW5jb2Rpbmc7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfaHRtbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5faHRtbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9lbmNvZGluZywgMSk7CgogICAgICAgIHJldF92YWwgPSBodG1sU2V0TWV0YUVuY29kaW5nKGRvYywgKGNvbnN0IHhtbENoYXIgKillbmNvZGluZyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2h0bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCB4bWxDaGFyICopZW5jb2RpbmcsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbFNldE1ldGFFbmNvZGluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X0hUTUx0cmVlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyBIVE1MdHJlZSA6IDE4IG9mIDE4IGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sRG9jQ29udGVudER1bXBGb3JtYXRPdXRwdXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbERvY0NvbnRlbnREdW1wT3V0cHV0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxEb2NEdW1wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxEb2NEdW1wTWVtb3J5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxEb2NEdW1wTWVtb3J5Rm9ybWF0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxHZXRNZXRhRW5jb2RpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbElzQm9vbGVhbkF0dHIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbE5ld0RvYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sTmV3RG9jTm9EdEQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbE5vZGVEdW1wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxOb2RlRHVtcEZpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbE5vZGVEdW1wRmlsZUZvcm1hdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sTm9kZUR1bXBGb3JtYXRPdXRwdXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbE5vZGVEdW1wT3V0cHV0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxTYXZlRmlsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9odG1sU2F2ZUZpbGVFbmMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbFNhdmVGaWxlRm9ybWF0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxTZXRNZXRhRW5jb2RpbmcoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIEhUTUx0cmVlOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF9kb2NiRGVmYXVsdFNBWEhhbmRsZXJJbml0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfRE9DQl9FTkFCTEVEKQojaWZkZWYgTElCWE1MX0RPQ0JfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwoKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwoKICAgICAgICBkb2NiRGVmYXVsdFNBWEhhbmRsZXJJbml0KCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gZG9jYkRlZmF1bHRTQVhIYW5kbGVySW5pdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9odG1sRGVmYXVsdFNBWEhhbmRsZXJJbml0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQojaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwoKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwoKICAgICAgICBodG1sRGVmYXVsdFNBWEhhbmRsZXJJbml0KCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbERlZmF1bHRTQVhIYW5kbGVySW5pdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEZWZhdWx0U0FYSGFuZGxlckluaXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CgogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CgogICAgICAgIHhtbERlZmF1bHRTQVhIYW5kbGVySW5pdCgpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERlZmF1bHRTQVhIYW5kbGVySW5pdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgojZGVmaW5lIGdlbl9uYl94bWxFbnVtZXJhdGlvblB0ciAxCnN0YXRpYyB4bWxFbnVtZXJhdGlvblB0ciBnZW5feG1sRW51bWVyYXRpb25QdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbEVudW1lcmF0aW9uUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxFbnVtZXJhdGlvblB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJBdHRyaWJ1dGVEZWNsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwogICAgeG1sQ2hhciAqIGVsZW07IC8qIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50ICovCiAgICBpbnQgbl9lbGVtOwogICAgeG1sQ2hhciAqIGZ1bGxuYW1lOyAvKiB0aGUgYXR0cmlidXRlIG5hbWUgKi8KICAgIGludCBuX2Z1bGxuYW1lOwogICAgaW50IHR5cGU7IC8qIHRoZSBhdHRyaWJ1dGUgdHlwZSAqLwogICAgaW50IG5fdHlwZTsKICAgIGludCBkZWY7IC8qIHRoZSB0eXBlIG9mIGRlZmF1bHQgdmFsdWUgKi8KICAgIGludCBuX2RlZjsKICAgIHhtbENoYXIgKiBkZWZhdWx0VmFsdWU7IC8qIHRoZSBhdHRyaWJ1dGUgZGVmYXVsdCB2YWx1ZSAqLwogICAgaW50IG5fZGVmYXVsdFZhbHVlOwogICAgeG1sRW51bWVyYXRpb25QdHIgdHJlZTsgLyogdGhlIHRyZWUgb2YgZW51bWVyYXRlZCB2YWx1ZSBzZXQgKi8KICAgIGludCBuX3RyZWU7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfdm9pZF9wdHI7bl9jdHgrKykgewogICAgZm9yIChuX2VsZW0gPSAwO25fZWxlbSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2VsZW0rKykgewogICAgZm9yIChuX2Z1bGxuYW1lID0gMDtuX2Z1bGxuYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fZnVsbG5hbWUrKykgewogICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl9pbnQ7bl90eXBlKyspIHsKICAgIGZvciAobl9kZWYgPSAwO25fZGVmIDwgZ2VuX25iX2ludDtuX2RlZisrKSB7CiAgICBmb3IgKG5fZGVmYXVsdFZhbHVlID0gMDtuX2RlZmF1bHRWYWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2RlZmF1bHRWYWx1ZSsrKSB7CiAgICBmb3IgKG5fdHJlZSA9IDA7bl90cmVlIDwgZ2VuX25iX3htbEVudW1lcmF0aW9uUHRyO25fdHJlZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHIobl9jdHgsIDApOwogICAgICAgIGVsZW0gPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9lbGVtLCAxKTsKICAgICAgICBmdWxsbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2Z1bGxuYW1lLCAyKTsKICAgICAgICB0eXBlID0gZ2VuX2ludChuX3R5cGUsIDMpOwogICAgICAgIGRlZiA9IGdlbl9pbnQobl9kZWYsIDQpOwogICAgICAgIGRlZmF1bHRWYWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2RlZmF1bHRWYWx1ZSwgNSk7CiAgICAgICAgdHJlZSA9IGdlbl94bWxFbnVtZXJhdGlvblB0cihuX3RyZWUsIDYpOwoKICAgICAgICB4bWxTQVgyQXR0cmlidXRlRGVjbChjdHgsIChjb25zdCB4bWxDaGFyICopZWxlbSwgKGNvbnN0IHhtbENoYXIgKilmdWxsbmFtZSwgdHlwZSwgZGVmLCAoY29uc3QgeG1sQ2hhciAqKWRlZmF1bHRWYWx1ZSwgdHJlZSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9lbGVtLCAoY29uc3QgeG1sQ2hhciAqKWVsZW0sIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2Z1bGxuYW1lLCAoY29uc3QgeG1sQ2hhciAqKWZ1bGxuYW1lLCAyKTsKICAgICAgICBkZXNfaW50KG5fdHlwZSwgdHlwZSwgMyk7CiAgICAgICAgZGVzX2ludChuX2RlZiwgZGVmLCA0KTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9kZWZhdWx0VmFsdWUsIChjb25zdCB4bWxDaGFyICopZGVmYXVsdFZhbHVlLCA1KTsKICAgICAgICBkZXNfeG1sRW51bWVyYXRpb25QdHIobl90cmVlLCB0cmVlLCA2KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWDJBdHRyaWJ1dGVEZWNsIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbGVtKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Z1bGxuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3R5cGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RlZmF1bHRWYWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90cmVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgyQ0RhdGFCbG9jayh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogVGhlIHBjZGF0YSBjb250ZW50ICovCiAgICBpbnQgbl92YWx1ZTsKICAgIGludCBsZW47IC8qIHRoZSBibG9jayBsZW5ndGggKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cjtuX2N0eCsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgeG1sU0FYMkNEYXRhQmxvY2soY3R4LCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCBsZW4pOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIDEpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgyQ0RhdGFCbG9jayIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgyQ2hhcmFjdGVycyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiBjaDsgLyogYSB4bWxDaGFyIHN0cmluZyAqLwogICAgaW50IG5fY2g7CiAgICBpbnQgbGVuOyAvKiB0aGUgbnVtYmVyIG9mIHhtbENoYXIgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cjtuX2N0eCsrKSB7CiAgICBmb3IgKG5fY2ggPSAwO25fY2ggPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jaCsrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKICAgICAgICBjaCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NoLCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgeG1sU0FYMkNoYXJhY3RlcnMoY3R4LCAoY29uc3QgeG1sQ2hhciAqKWNoLCBsZW4pOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY2gsIChjb25zdCB4bWxDaGFyICopY2gsIDEpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgyQ2hhcmFjdGVycyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY2gpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgyQ29tbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogdGhlIHhtbFNBWDJDb21tZW50IGNvbnRlbnQgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMSk7CgogICAgICAgIHhtbFNBWDJDb21tZW50KGN0eCwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgyQ29tbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJFbGVtZW50RGVjbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgZWxlbWVudCBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgaW50IHR5cGU7IC8qIHRoZSBlbGVtZW50IHR5cGUgKi8KICAgIGludCBuX3R5cGU7CiAgICB4bWxFbGVtZW50Q29udGVudFB0ciBjb250ZW50OyAvKiB0aGUgZWxlbWVudCB2YWx1ZSB0cmVlICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl90eXBlID0gMDtuX3R5cGUgPCBnZW5fbmJfaW50O25fdHlwZSsrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX3htbEVsZW1lbnRDb250ZW50UHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHIobl9jdHgsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICB0eXBlID0gZ2VuX2ludChuX3R5cGUsIDIpOwogICAgICAgIGNvbnRlbnQgPSBnZW5feG1sRWxlbWVudENvbnRlbnRQdHIobl9jb250ZW50LCAzKTsKCiAgICAgICAgeG1sU0FYMkVsZW1lbnREZWNsKGN0eCwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCB0eXBlLCBjb250ZW50KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2ludChuX3R5cGUsIHR5cGUsIDIpOwogICAgICAgIGRlc194bWxFbGVtZW50Q29udGVudFB0cihuX2NvbnRlbnQsIGNvbnRlbnQsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYMkVsZW1lbnREZWNsIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3R5cGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMkVuZERvY3VtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CgogICAgICAgIHhtbFNBWDJFbmREb2N1bWVudChjdHgpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgyRW5kRG9jdW1lbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgyRW5kRWxlbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NBWDFfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfRE9DQl9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIFRoZSBlbGVtZW50IG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfdm9pZF9wdHI7bl9jdHgrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CgogICAgICAgIHhtbFNBWDJFbmRFbGVtZW50KGN0eCwgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgyRW5kRWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgyRW5kRWxlbWVudE5zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwogICAgeG1sQ2hhciAqIGxvY2FsbmFtZTsgLyogdGhlIGxvY2FsIG5hbWUgb2YgdGhlIGVsZW1lbnQgKi8KICAgIGludCBuX2xvY2FsbmFtZTsKICAgIHhtbENoYXIgKiBwcmVmaXg7IC8qIHRoZSBlbGVtZW50IG5hbWVzcGFjZSBwcmVmaXggaWYgYXZhaWxhYmxlICovCiAgICBpbnQgbl9wcmVmaXg7CiAgICB4bWxDaGFyICogVVJJOyAvKiB0aGUgZWxlbWVudCBuYW1lc3BhY2UgbmFtZSBpZiBhdmFpbGFibGUgKi8KICAgIGludCBuX1VSSTsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cjtuX2N0eCsrKSB7CiAgICBmb3IgKG5fbG9jYWxuYW1lID0gMDtuX2xvY2FsbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2xvY2FsbmFtZSsrKSB7CiAgICBmb3IgKG5fcHJlZml4ID0gMDtuX3ByZWZpeCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ByZWZpeCsrKSB7CiAgICBmb3IgKG5fVVJJID0gMDtuX1VSSSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX1VSSSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHIobl9jdHgsIDApOwogICAgICAgIGxvY2FsbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2xvY2FsbmFtZSwgMSk7CiAgICAgICAgcHJlZml4ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAyKTsKICAgICAgICBVUkkgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9VUkksIDMpOwoKICAgICAgICB4bWxTQVgyRW5kRWxlbWVudE5zKGN0eCwgKGNvbnN0IHhtbENoYXIgKilsb2NhbG5hbWUsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKVVSSSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9sb2NhbG5hbWUsIChjb25zdCB4bWxDaGFyICopbG9jYWxuYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9VUkksIChjb25zdCB4bWxDaGFyICopVVJJLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWDJFbmRFbGVtZW50TnMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xvY2FsbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wcmVmaXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJJKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgyRW50aXR5RGVjbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgZW50aXR5IG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICBpbnQgdHlwZTsgLyogdGhlIGVudGl0eSB0eXBlICovCiAgICBpbnQgbl90eXBlOwogICAgeG1sQ2hhciAqIHB1YmxpY0lkOyAvKiBUaGUgcHVibGljIElEIG9mIHRoZSBlbnRpdHkgKi8KICAgIGludCBuX3B1YmxpY0lkOwogICAgeG1sQ2hhciAqIHN5c3RlbUlkOyAvKiBUaGUgc3lzdGVtIElEIG9mIHRoZSBlbnRpdHkgKi8KICAgIGludCBuX3N5c3RlbUlkOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSBlbnRpdHkgdmFsdWUgKHdpdGhvdXQgcHJvY2Vzc2luZykuICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl90eXBlID0gMDtuX3R5cGUgPCBnZW5fbmJfaW50O25fdHlwZSsrKSB7CiAgICBmb3IgKG5fcHVibGljSWQgPSAwO25fcHVibGljSWQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wdWJsaWNJZCsrKSB7CiAgICBmb3IgKG5fc3lzdGVtSWQgPSAwO25fc3lzdGVtSWQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zeXN0ZW1JZCsrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHIobl9jdHgsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICB0eXBlID0gZ2VuX2ludChuX3R5cGUsIDIpOwogICAgICAgIHB1YmxpY0lkID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHVibGljSWQsIDMpOwogICAgICAgIHN5c3RlbUlkID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzdGVtSWQsIDQpOwogICAgICAgIGNvbnRlbnQgPSBnZW5feG1sQ2hhcl9wdHIobl9jb250ZW50LCA1KTsKCiAgICAgICAgeG1sU0FYMkVudGl0eURlY2woY3R4LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIHR5cGUsIChjb25zdCB4bWxDaGFyICopcHVibGljSWQsIChjb25zdCB4bWxDaGFyICopc3lzdGVtSWQsIGNvbnRlbnQpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfaW50KG5fdHlwZSwgdHlwZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHVibGljSWQsIChjb25zdCB4bWxDaGFyICopcHVibGljSWQsIDMpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N5c3RlbUlkLCAoY29uc3QgeG1sQ2hhciAqKXN5c3RlbUlkLCA0KTsKICAgICAgICBkZXNfeG1sQ2hhcl9wdHIobl9jb250ZW50LCBjb250ZW50LCA1KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWDJFbnRpdHlEZWNsIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3R5cGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHVibGljSWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3lzdGVtSWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMkV4dGVybmFsU3Vic2V0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSByb290IGVsZW1lbnQgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBFeHRlcm5hbElEOyAvKiB0aGUgZXh0ZXJuYWwgSUQgKi8KICAgIGludCBuX0V4dGVybmFsSUQ7CiAgICB4bWxDaGFyICogU3lzdGVtSUQ7IC8qIHRoZSBTWVNURU0gSUQgKGUuZy4gZmlsZW5hbWUgb3IgVVJMKSAqLwogICAgaW50IG5fU3lzdGVtSUQ7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfdm9pZF9wdHI7bl9jdHgrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX0V4dGVybmFsSUQgPSAwO25fRXh0ZXJuYWxJRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX0V4dGVybmFsSUQrKykgewogICAgZm9yIChuX1N5c3RlbUlEID0gMDtuX1N5c3RlbUlEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fU3lzdGVtSUQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgRXh0ZXJuYWxJRCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX0V4dGVybmFsSUQsIDIpOwogICAgICAgIFN5c3RlbUlEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fU3lzdGVtSUQsIDMpOwoKICAgICAgICB4bWxTQVgyRXh0ZXJuYWxTdWJzZXQoY3R4LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopRXh0ZXJuYWxJRCwgKGNvbnN0IHhtbENoYXIgKilTeXN0ZW1JRCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX0V4dGVybmFsSUQsIChjb25zdCB4bWxDaGFyICopRXh0ZXJuYWxJRCwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fU3lzdGVtSUQsIChjb25zdCB4bWxDaGFyICopU3lzdGVtSUQsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYMkV4dGVybmFsU3Vic2V0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX0V4dGVybmFsSUQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fU3lzdGVtSUQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJHZXRDb2x1bW5OdW1iZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cjtuX2N0eCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHIobl9jdHgsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sU0FYMkdldENvbHVtbk51bWJlcihjdHgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWDJHZXRDb2x1bW5OdW1iZXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgyR2V0RW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRW50aXR5UHRyIHJldF92YWw7CiAgICB2b2lkICogY3R4OyAvKiB0aGUgdXNlciBkYXRhIChYTUwgcGFyc2VyIGNvbnRleHQpICovCiAgICBpbnQgbl9jdHg7CiAgICB4bWxDaGFyICogbmFtZTsgLyogVGhlIGVudGl0eSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sU0FYMkdldEVudGl0eShjdHgsIChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X3htbEVudGl0eVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgyR2V0RW50aXR5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgyR2V0TGluZU51bWJlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxTQVgyR2V0TGluZU51bWJlcihjdHgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWDJHZXRMaW5lTnVtYmVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMkdldFBhcmFtZXRlckVudGl0eSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEVudGl0eVB0ciByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIFRoZSBlbnRpdHkgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cjtuX2N0eCsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHIobl9jdHgsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNBWDJHZXRQYXJhbWV0ZXJFbnRpdHkoY3R4LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF94bWxFbnRpdHlQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYMkdldFBhcmFtZXRlckVudGl0eSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMkdldFB1YmxpY0lkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICB2b2lkICogY3R4OyAvKiB0aGUgdXNlciBkYXRhIChYTUwgcGFyc2VyIGNvbnRleHQpICovCiAgICBpbnQgbl9jdHg7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfdm9pZF9wdHI7bl9jdHgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNBWDJHZXRQdWJsaWNJZChjdHgpOwogICAgICAgIGRlc3JldF9jb25zdF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYMkdldFB1YmxpY0lkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMkdldFN5c3RlbUlkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICB2b2lkICogY3R4OyAvKiB0aGUgdXNlciBkYXRhIChYTUwgcGFyc2VyIGNvbnRleHQpICovCiAgICBpbnQgbl9jdHg7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfdm9pZF9wdHI7bl9jdHgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNBWDJHZXRTeXN0ZW1JZChjdHgpOwogICAgICAgIGRlc3JldF9jb25zdF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYMkdldFN5c3RlbUlkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMkhhc0V4dGVybmFsU3Vic2V0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB2b2lkICogY3R4OyAvKiB0aGUgdXNlciBkYXRhIChYTUwgcGFyc2VyIGNvbnRleHQpICovCiAgICBpbnQgbl9jdHg7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfdm9pZF9wdHI7bl9jdHgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNBWDJIYXNFeHRlcm5hbFN1YnNldChjdHgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWDJIYXNFeHRlcm5hbFN1YnNldCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJIYXNJbnRlcm5hbFN1YnNldCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxTQVgySGFzSW50ZXJuYWxTdWJzZXQoY3R4KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgySGFzSW50ZXJuYWxTdWJzZXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgySWdub3JhYmxlV2hpdGVzcGFjZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiBjaDsgLyogYSB4bWxDaGFyIHN0cmluZyAqLwogICAgaW50IG5fY2g7CiAgICBpbnQgbGVuOyAvKiB0aGUgbnVtYmVyIG9mIHhtbENoYXIgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cjtuX2N0eCsrKSB7CiAgICBmb3IgKG5fY2ggPSAwO25fY2ggPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jaCsrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKICAgICAgICBjaCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NoLCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgeG1sU0FYMklnbm9yYWJsZVdoaXRlc3BhY2UoY3R4LCAoY29uc3QgeG1sQ2hhciAqKWNoLCBsZW4pOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY2gsIChjb25zdCB4bWxDaGFyICopY2gsIDEpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgySWdub3JhYmxlV2hpdGVzcGFjZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY2gpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCiNkZWZpbmUgZ2VuX25iX3htbFNBWEhhbmRsZXJfcHRyIDEKc3RhdGljIHhtbFNBWEhhbmRsZXIgKiBnZW5feG1sU0FYSGFuZGxlcl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFNBWEhhbmRsZXJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxTQVhIYW5kbGVyICogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgySW5pdERlZmF1bHRTQVhIYW5kbGVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sU0FYSGFuZGxlciAqIGhkbHI7IC8qIHRoZSBTQVggaGFuZGxlciAqLwogICAgaW50IG5faGRscjsKICAgIGludCB3YXJuaW5nOyAvKiBmbGFnIGlmIG5vbi16ZXJvIHNldHMgdGhlIGhhbmRsZXIgd2FybmluZyBwcm9jZWR1cmUgKi8KICAgIGludCBuX3dhcm5pbmc7CgogICAgZm9yIChuX2hkbHIgPSAwO25faGRsciA8IGdlbl9uYl94bWxTQVhIYW5kbGVyX3B0cjtuX2hkbHIrKykgewogICAgZm9yIChuX3dhcm5pbmcgPSAwO25fd2FybmluZyA8IGdlbl9uYl9pbnQ7bl93YXJuaW5nKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGhkbHIgPSBnZW5feG1sU0FYSGFuZGxlcl9wdHIobl9oZGxyLCAwKTsKICAgICAgICB3YXJuaW5nID0gZ2VuX2ludChuX3dhcm5pbmcsIDEpOwoKICAgICAgICB4bWxTQVgySW5pdERlZmF1bHRTQVhIYW5kbGVyKGhkbHIsIHdhcm5pbmcpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU0FYSGFuZGxlcl9wdHIobl9oZGxyLCBoZGxyLCAwKTsKICAgICAgICBkZXNfaW50KG5fd2FybmluZywgd2FybmluZywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgySW5pdERlZmF1bHRTQVhIYW5kbGVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2hkbHIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd2FybmluZyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMkluaXREb2NiRGVmYXVsdFNBWEhhbmRsZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9ET0NCX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxTQVhIYW5kbGVyICogaGRscjsgLyogdGhlIFNBWCBoYW5kbGVyICovCiAgICBpbnQgbl9oZGxyOwoKICAgIGZvciAobl9oZGxyID0gMDtuX2hkbHIgPCBnZW5fbmJfeG1sU0FYSGFuZGxlcl9wdHI7bl9oZGxyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGhkbHIgPSBnZW5feG1sU0FYSGFuZGxlcl9wdHIobl9oZGxyLCAwKTsKCiAgICAgICAgeG1sU0FYMkluaXREb2NiRGVmYXVsdFNBWEhhbmRsZXIoaGRscik7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTQVhIYW5kbGVyX3B0cihuX2hkbHIsIGhkbHIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYMkluaXREb2NiRGVmYXVsdFNBWEhhbmRsZXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faGRscik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJJbml0SHRtbERlZmF1bHRTQVhIYW5kbGVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sU0FYSGFuZGxlciAqIGhkbHI7IC8qIHRoZSBTQVggaGFuZGxlciAqLwogICAgaW50IG5faGRscjsKCiAgICBmb3IgKG5faGRsciA9IDA7bl9oZGxyIDwgZ2VuX25iX3htbFNBWEhhbmRsZXJfcHRyO25faGRscisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBoZGxyID0gZ2VuX3htbFNBWEhhbmRsZXJfcHRyKG5faGRsciwgMCk7CgogICAgICAgIHhtbFNBWDJJbml0SHRtbERlZmF1bHRTQVhIYW5kbGVyKGhkbHIpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU0FYSGFuZGxlcl9wdHIobl9oZGxyLCBoZGxyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWDJJbml0SHRtbERlZmF1bHRTQVhIYW5kbGVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2hkbHIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVgySW50ZXJuYWxTdWJzZXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB2b2lkICogY3R4OyAvKiB0aGUgdXNlciBkYXRhIChYTUwgcGFyc2VyIGNvbnRleHQpICovCiAgICBpbnQgbl9jdHg7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIHJvb3QgZWxlbWVudCBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIEV4dGVybmFsSUQ7IC8qIHRoZSBleHRlcm5hbCBJRCAqLwogICAgaW50IG5fRXh0ZXJuYWxJRDsKICAgIHhtbENoYXIgKiBTeXN0ZW1JRDsgLyogdGhlIFNZU1RFTSBJRCAoZS5nLiBmaWxlbmFtZSBvciBVUkwpICovCiAgICBpbnQgbl9TeXN0ZW1JRDsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cjtuX2N0eCsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fRXh0ZXJuYWxJRCA9IDA7bl9FeHRlcm5hbElEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fRXh0ZXJuYWxJRCsrKSB7CiAgICBmb3IgKG5fU3lzdGVtSUQgPSAwO25fU3lzdGVtSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9TeXN0ZW1JRCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHIobl9jdHgsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBFeHRlcm5hbElEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fRXh0ZXJuYWxJRCwgMik7CiAgICAgICAgU3lzdGVtSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9TeXN0ZW1JRCwgMyk7CgogICAgICAgIHhtbFNBWDJJbnRlcm5hbFN1YnNldChjdHgsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKilFeHRlcm5hbElELCAoY29uc3QgeG1sQ2hhciAqKVN5c3RlbUlEKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fRXh0ZXJuYWxJRCwgKGNvbnN0IHhtbENoYXIgKilFeHRlcm5hbElELCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9TeXN0ZW1JRCwgKGNvbnN0IHhtbENoYXIgKilTeXN0ZW1JRCwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgySW50ZXJuYWxTdWJzZXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fRXh0ZXJuYWxJRCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9TeXN0ZW1JRCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMklzU3RhbmRhbG9uZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxTQVgySXNTdGFuZGFsb25lKGN0eCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYMklzU3RhbmRhbG9uZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJOb3RhdGlvbkRlY2wodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB2b2lkICogY3R4OyAvKiB0aGUgdXNlciBkYXRhIChYTUwgcGFyc2VyIGNvbnRleHQpICovCiAgICBpbnQgbl9jdHg7CiAgICB4bWxDaGFyICogbmFtZTsgLyogVGhlIG5hbWUgb2YgdGhlIG5vdGF0aW9uICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIHB1YmxpY0lkOyAvKiBUaGUgcHVibGljIElEIG9mIHRoZSBlbnRpdHkgKi8KICAgIGludCBuX3B1YmxpY0lkOwogICAgeG1sQ2hhciAqIHN5c3RlbUlkOyAvKiBUaGUgc3lzdGVtIElEIG9mIHRoZSBlbnRpdHkgKi8KICAgIGludCBuX3N5c3RlbUlkOwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9wdWJsaWNJZCA9IDA7bl9wdWJsaWNJZCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3B1YmxpY0lkKyspIHsKICAgIGZvciAobl9zeXN0ZW1JZCA9IDA7bl9zeXN0ZW1JZCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N5c3RlbUlkKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIHB1YmxpY0lkID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHVibGljSWQsIDIpOwogICAgICAgIHN5c3RlbUlkID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzdGVtSWQsIDMpOwoKICAgICAgICB4bWxTQVgyTm90YXRpb25EZWNsKGN0eCwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKXB1YmxpY0lkLCAoY29uc3QgeG1sQ2hhciAqKXN5c3RlbUlkKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHVibGljSWQsIChjb25zdCB4bWxDaGFyICopcHVibGljSWQsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N5c3RlbUlkLCAoY29uc3QgeG1sQ2hhciAqKXN5c3RlbUlkLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWDJOb3RhdGlvbkRlY2wiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHVibGljSWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3lzdGVtSWQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB2b2lkICogY3R4OyAvKiB0aGUgdXNlciBkYXRhIChYTUwgcGFyc2VyIGNvbnRleHQpICovCiAgICBpbnQgbl9jdHg7CiAgICB4bWxDaGFyICogdGFyZ2V0OyAvKiB0aGUgdGFyZ2V0IG5hbWUgKi8KICAgIGludCBuX3RhcmdldDsKICAgIHhtbENoYXIgKiBkYXRhOyAvKiB0aGUgUEkgZGF0YSdzICovCiAgICBpbnQgbl9kYXRhOwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgIGZvciAobl90YXJnZXQgPSAwO25fdGFyZ2V0IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdGFyZ2V0KyspIHsKICAgIGZvciAobl9kYXRhID0gMDtuX2RhdGEgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9kYXRhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CiAgICAgICAgdGFyZ2V0ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdGFyZ2V0LCAxKTsKICAgICAgICBkYXRhID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fZGF0YSwgMik7CgogICAgICAgIHhtbFNBWDJQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oY3R4LCAoY29uc3QgeG1sQ2hhciAqKXRhcmdldCwgKGNvbnN0IHhtbENoYXIgKilkYXRhKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3RhcmdldCwgKGNvbnN0IHhtbENoYXIgKil0YXJnZXQsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2RhdGEsIChjb25zdCB4bWxDaGFyICopZGF0YSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgyUHJvY2Vzc2luZ0luc3RydWN0aW9uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90YXJnZXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMlJlZmVyZW5jZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiBUaGUgZW50aXR5IG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfdm9pZF9wdHI7bl9jdHgrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CgogICAgICAgIHhtbFNBWDJSZWZlcmVuY2UoY3R4LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWDJSZWZlcmVuY2UiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJSZXNvbHZlRW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VySW5wdXRQdHIgcmV0X3ZhbDsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiBwdWJsaWNJZDsgLyogVGhlIHB1YmxpYyBJRCBvZiB0aGUgZW50aXR5ICovCiAgICBpbnQgbl9wdWJsaWNJZDsKICAgIHhtbENoYXIgKiBzeXN0ZW1JZDsgLyogVGhlIHN5c3RlbSBJRCBvZiB0aGUgZW50aXR5ICovCiAgICBpbnQgbl9zeXN0ZW1JZDsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cjtuX2N0eCsrKSB7CiAgICBmb3IgKG5fcHVibGljSWQgPSAwO25fcHVibGljSWQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wdWJsaWNJZCsrKSB7CiAgICBmb3IgKG5fc3lzdGVtSWQgPSAwO25fc3lzdGVtSWQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zeXN0ZW1JZCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHIobl9jdHgsIDApOwogICAgICAgIHB1YmxpY0lkID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHVibGljSWQsIDEpOwogICAgICAgIHN5c3RlbUlkID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzdGVtSWQsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sU0FYMlJlc29sdmVFbnRpdHkoY3R4LCAoY29uc3QgeG1sQ2hhciAqKXB1YmxpY0lkLCAoY29uc3QgeG1sQ2hhciAqKXN5c3RlbUlkKTsKICAgICAgICBkZXNyZXRfeG1sUGFyc2VySW5wdXRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJsaWNJZCwgKGNvbnN0IHhtbENoYXIgKilwdWJsaWNJZCwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzdGVtSWQsIChjb25zdCB4bWxDaGFyICopc3lzdGVtSWQsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYMlJlc29sdmVFbnRpdHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3B1YmxpY0lkKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N5c3RlbUlkKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCiNkZWZpbmUgZ2VuX25iX3htbFNBWExvY2F0b3JQdHIgMQpzdGF0aWMgeG1sU0FYTG9jYXRvclB0ciBnZW5feG1sU0FYTG9jYXRvclB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sU0FYTG9jYXRvclB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sU0FYTG9jYXRvclB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJTZXREb2N1bWVudExvY2F0b3Iodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB2b2lkICogY3R4OyAvKiB0aGUgdXNlciBkYXRhIChYTUwgcGFyc2VyIGNvbnRleHQpICovCiAgICBpbnQgbl9jdHg7CiAgICB4bWxTQVhMb2NhdG9yUHRyIGxvYzsgLyogQSBTQVggTG9jYXRvciAqLwogICAgaW50IG5fbG9jOwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgIGZvciAobl9sb2MgPSAwO25fbG9jIDwgZ2VuX25iX3htbFNBWExvY2F0b3JQdHI7bl9sb2MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKICAgICAgICBsb2MgPSBnZW5feG1sU0FYTG9jYXRvclB0cihuX2xvYywgMSk7CgogICAgICAgIHhtbFNBWDJTZXREb2N1bWVudExvY2F0b3IoY3R4LCBsb2MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX3htbFNBWExvY2F0b3JQdHIobl9sb2MsIGxvYywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgyU2V0RG9jdW1lbnRMb2NhdG9yIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sb2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJTdGFydERvY3VtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CgogICAgICAgIHhtbFNBWDJTdGFydERvY3VtZW50KGN0eCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWDJTdGFydERvY3VtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMlN0YXJ0RWxlbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NBWDFfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfRE9DQl9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHBhcnNlciBjb250ZXh0KSAqLwogICAgaW50IG5fY3R4OwogICAgeG1sQ2hhciAqIGZ1bGxuYW1lOyAvKiBUaGUgZWxlbWVudCBuYW1lLCBpbmNsdWRpbmcgbmFtZXNwYWNlIHByZWZpeCAqLwogICAgaW50IG5fZnVsbG5hbWU7CiAgICB4bWxDaGFyICoqIGF0dHM7IC8qIEFuIGFycmF5IG9mIG5hbWUvdmFsdWUgYXR0cmlidXRlcyBwYWlycywgTlVMTCB0ZXJtaW5hdGVkICovCiAgICBpbnQgbl9hdHRzOwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgIGZvciAobl9mdWxsbmFtZSA9IDA7bl9mdWxsbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2Z1bGxuYW1lKyspIHsKICAgIGZvciAobl9hdHRzID0gMDtuX2F0dHMgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHJfcHRyO25fYXR0cysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHIobl9jdHgsIDApOwogICAgICAgIGZ1bGxuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fZnVsbG5hbWUsIDEpOwogICAgICAgIGF0dHMgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHJfcHRyKG5fYXR0cywgMik7CgogICAgICAgIHhtbFNBWDJTdGFydEVsZW1lbnQoY3R4LCAoY29uc3QgeG1sQ2hhciAqKWZ1bGxuYW1lLCAoY29uc3QgeG1sQ2hhciAqKilhdHRzKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2Z1bGxuYW1lLCAoY29uc3QgeG1sQ2hhciAqKWZ1bGxuYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHJfcHRyKG5fYXR0cywgKGNvbnN0IHhtbENoYXIgKiopYXR0cywgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVgyU3RhcnRFbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mdWxsbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9hdHRzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWDJTdGFydEVsZW1lbnROcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiBsb2NhbG5hbWU7IC8qIHRoZSBsb2NhbCBuYW1lIG9mIHRoZSBlbGVtZW50ICovCiAgICBpbnQgbl9sb2NhbG5hbWU7CiAgICB4bWxDaGFyICogcHJlZml4OyAvKiB0aGUgZWxlbWVudCBuYW1lc3BhY2UgcHJlZml4IGlmIGF2YWlsYWJsZSAqLwogICAgaW50IG5fcHJlZml4OwogICAgeG1sQ2hhciAqIFVSSTsgLyogdGhlIGVsZW1lbnQgbmFtZXNwYWNlIG5hbWUgaWYgYXZhaWxhYmxlICovCiAgICBpbnQgbl9VUkk7CiAgICBpbnQgbmJfbmFtZXNwYWNlczsgLyogbnVtYmVyIG9mIG5hbWVzcGFjZSBkZWZpbml0aW9ucyBvbiB0aGF0IG5vZGUgKi8KICAgIGludCBuX25iX25hbWVzcGFjZXM7CiAgICB4bWxDaGFyICoqIG5hbWVzcGFjZXM7IC8qIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIHByZWZpeC9VUkkgcGFpcnMgbmFtZXNwYWNlIGRlZmluaXRpb25zICovCiAgICBpbnQgbl9uYW1lc3BhY2VzOwogICAgaW50IG5iX2F0dHJpYnV0ZXM7IC8qIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcyBvbiB0aGF0IG5vZGUgKi8KICAgIGludCBuX25iX2F0dHJpYnV0ZXM7CiAgICBpbnQgbmJfZGVmYXVsdGVkOyAvKiB0aGUgbnVtYmVyIG9mIGRlZmF1bHRlZCBhdHRyaWJ1dGVzLiAqLwogICAgaW50IG5fbmJfZGVmYXVsdGVkOwogICAgeG1sQ2hhciAqKiBhdHRyaWJ1dGVzOyAvKiBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiAobG9jYWxuYW1lL3ByZWZpeC9VUkkvdmFsdWUvZW5kKSBhdHRyaWJ1dGUgdmFsdWVzLiAqLwogICAgaW50IG5fYXR0cmlidXRlczsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cjtuX2N0eCsrKSB7CiAgICBmb3IgKG5fbG9jYWxuYW1lID0gMDtuX2xvY2FsbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2xvY2FsbmFtZSsrKSB7CiAgICBmb3IgKG5fcHJlZml4ID0gMDtuX3ByZWZpeCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ByZWZpeCsrKSB7CiAgICBmb3IgKG5fVVJJID0gMDtuX1VSSSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX1VSSSsrKSB7CiAgICBmb3IgKG5fbmJfbmFtZXNwYWNlcyA9IDA7bl9uYl9uYW1lc3BhY2VzIDwgZ2VuX25iX2ludDtuX25iX25hbWVzcGFjZXMrKykgewogICAgZm9yIChuX25hbWVzcGFjZXMgPSAwO25fbmFtZXNwYWNlcyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cl9wdHI7bl9uYW1lc3BhY2VzKyspIHsKICAgIGZvciAobl9uYl9hdHRyaWJ1dGVzID0gMDtuX25iX2F0dHJpYnV0ZXMgPCBnZW5fbmJfaW50O25fbmJfYXR0cmlidXRlcysrKSB7CiAgICBmb3IgKG5fbmJfZGVmYXVsdGVkID0gMDtuX25iX2RlZmF1bHRlZCA8IGdlbl9uYl9pbnQ7bl9uYl9kZWZhdWx0ZWQrKykgewogICAgZm9yIChuX2F0dHJpYnV0ZXMgPSAwO25fYXR0cmlidXRlcyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cl9wdHI7bl9hdHRyaWJ1dGVzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CiAgICAgICAgbG9jYWxuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbG9jYWxuYW1lLCAxKTsKICAgICAgICBwcmVmaXggPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIDIpOwogICAgICAgIFVSSSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX1VSSSwgMyk7CiAgICAgICAgbmJfbmFtZXNwYWNlcyA9IGdlbl9pbnQobl9uYl9uYW1lc3BhY2VzLCA0KTsKICAgICAgICBuYW1lc3BhY2VzID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyX3B0cihuX25hbWVzcGFjZXMsIDUpOwogICAgICAgIG5iX2F0dHJpYnV0ZXMgPSBnZW5faW50KG5fbmJfYXR0cmlidXRlcywgNik7CiAgICAgICAgbmJfZGVmYXVsdGVkID0gZ2VuX2ludChuX25iX2RlZmF1bHRlZCwgNyk7CiAgICAgICAgYXR0cmlidXRlcyA9IGdlbl9jb25zdF94bWxDaGFyX3B0cl9wdHIobl9hdHRyaWJ1dGVzLCA4KTsKCiAgICAgICAgeG1sU0FYMlN0YXJ0RWxlbWVudE5zKGN0eCwgKGNvbnN0IHhtbENoYXIgKilsb2NhbG5hbWUsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKVVSSSwgbmJfbmFtZXNwYWNlcywgKGNvbnN0IHhtbENoYXIgKiopbmFtZXNwYWNlcywgbmJfYXR0cmlidXRlcywgbmJfZGVmYXVsdGVkLCAoY29uc3QgeG1sQ2hhciAqKilhdHRyaWJ1dGVzKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2xvY2FsbmFtZSwgKGNvbnN0IHhtbENoYXIgKilsb2NhbG5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX1VSSSwgKGNvbnN0IHhtbENoYXIgKilVUkksIDMpOwogICAgICAgIGRlc19pbnQobl9uYl9uYW1lc3BhY2VzLCBuYl9uYW1lc3BhY2VzLCA0KTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHJfcHRyKG5fbmFtZXNwYWNlcywgKGNvbnN0IHhtbENoYXIgKiopbmFtZXNwYWNlcywgNSk7CiAgICAgICAgZGVzX2ludChuX25iX2F0dHJpYnV0ZXMsIG5iX2F0dHJpYnV0ZXMsIDYpOwogICAgICAgIGRlc19pbnQobl9uYl9kZWZhdWx0ZWQsIG5iX2RlZmF1bHRlZCwgNyk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyX3B0cihuX2F0dHJpYnV0ZXMsIChjb25zdCB4bWxDaGFyICoqKWF0dHJpYnV0ZXMsIDgpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYMlN0YXJ0RWxlbWVudE5zIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sb2NhbG5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHJlZml4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSSSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYl9uYW1lc3BhY2VzKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWVzcGFjZXMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmJfYXR0cmlidXRlcyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYl9kZWZhdWx0ZWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYXR0cmlidXRlcyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYMlVucGFyc2VkRW50aXR5RGVjbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiBUaGUgbmFtZSBvZiB0aGUgZW50aXR5ICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIHB1YmxpY0lkOyAvKiBUaGUgcHVibGljIElEIG9mIHRoZSBlbnRpdHkgKi8KICAgIGludCBuX3B1YmxpY0lkOwogICAgeG1sQ2hhciAqIHN5c3RlbUlkOyAvKiBUaGUgc3lzdGVtIElEIG9mIHRoZSBlbnRpdHkgKi8KICAgIGludCBuX3N5c3RlbUlkOwogICAgeG1sQ2hhciAqIG5vdGF0aW9uTmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIG5vdGF0aW9uICovCiAgICBpbnQgbl9ub3RhdGlvbk5hbWU7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfdm9pZF9wdHI7bl9jdHgrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX3B1YmxpY0lkID0gMDtuX3B1YmxpY0lkIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHVibGljSWQrKykgewogICAgZm9yIChuX3N5c3RlbUlkID0gMDtuX3N5c3RlbUlkIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3lzdGVtSWQrKykgewogICAgZm9yIChuX25vdGF0aW9uTmFtZSA9IDA7bl9ub3RhdGlvbk5hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9ub3RhdGlvbk5hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3ZvaWRfcHRyKG5fY3R4LCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgcHVibGljSWQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJsaWNJZCwgMik7CiAgICAgICAgc3lzdGVtSWQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zeXN0ZW1JZCwgMyk7CiAgICAgICAgbm90YXRpb25OYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbm90YXRpb25OYW1lLCA0KTsKCiAgICAgICAgeG1sU0FYMlVucGFyc2VkRW50aXR5RGVjbChjdHgsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKilwdWJsaWNJZCwgKGNvbnN0IHhtbENoYXIgKilzeXN0ZW1JZCwgKGNvbnN0IHhtbENoYXIgKilub3RhdGlvbk5hbWUpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJsaWNJZCwgKGNvbnN0IHhtbENoYXIgKilwdWJsaWNJZCwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzdGVtSWQsIChjb25zdCB4bWxDaGFyICopc3lzdGVtSWQsIDMpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25vdGF0aW9uTmFtZSwgKGNvbnN0IHhtbENoYXIgKilub3RhdGlvbk5hbWUsIDQpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYMlVucGFyc2VkRW50aXR5RGVjbCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wdWJsaWNJZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zeXN0ZW1JZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub3RhdGlvbk5hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWERlZmF1bHRWZXJzaW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0FYMV9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgdmVyc2lvbjsgLyogdGhlIHZlcnNpb24sIDEgb3IgMiAqLwogICAgaW50IG5fdmVyc2lvbjsKCiAgICBmb3IgKG5fdmVyc2lvbiA9IDA7bl92ZXJzaW9uIDwgZ2VuX25iX2ludDtuX3ZlcnNpb24rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmVyc2lvbiA9IGdlbl9pbnQobl92ZXJzaW9uLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNBWERlZmF1bHRWZXJzaW9uKHZlcnNpb24pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl92ZXJzaW9uLCB2ZXJzaW9uLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWERlZmF1bHRWZXJzaW9uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZlcnNpb24pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYVmVyc2lvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU0FYSGFuZGxlciAqIGhkbHI7IC8qIHRoZSBTQVggaGFuZGxlciAqLwogICAgaW50IG5faGRscjsKICAgIGludCB2ZXJzaW9uOyAvKiB0aGUgdmVyc2lvbiwgMSBvciAyICovCiAgICBpbnQgbl92ZXJzaW9uOwoKICAgIGZvciAobl9oZGxyID0gMDtuX2hkbHIgPCBnZW5fbmJfeG1sU0FYSGFuZGxlcl9wdHI7bl9oZGxyKyspIHsKICAgIGZvciAobl92ZXJzaW9uID0gMDtuX3ZlcnNpb24gPCBnZW5fbmJfaW50O25fdmVyc2lvbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBoZGxyID0gZ2VuX3htbFNBWEhhbmRsZXJfcHRyKG5faGRsciwgMCk7CiAgICAgICAgdmVyc2lvbiA9IGdlbl9pbnQobl92ZXJzaW9uLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNBWFZlcnNpb24oaGRsciwgdmVyc2lvbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNBWEhhbmRsZXJfcHRyKG5faGRsciwgaGRsciwgMCk7CiAgICAgICAgZGVzX2ludChuX3ZlcnNpb24sIHZlcnNpb24sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYVmVyc2lvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9oZGxyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZlcnNpb24pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfU0FYMih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgU0FYMiA6IDM4IG9mIDM4IGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9kb2NiRGVmYXVsdFNBWEhhbmRsZXJJbml0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxEZWZhdWx0U0FYSGFuZGxlckluaXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRGVmYXVsdFNBWEhhbmRsZXJJbml0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJBdHRyaWJ1dGVEZWNsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJDRGF0YUJsb2NrKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJDaGFyYWN0ZXJzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJDb21tZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJFbGVtZW50RGVjbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVgyRW5kRG9jdW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMkVuZEVsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMkVuZEVsZW1lbnROcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVgyRW50aXR5RGVjbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVgyRXh0ZXJuYWxTdWJzZXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMkdldENvbHVtbk51bWJlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVgyR2V0RW50aXR5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJHZXRMaW5lTnVtYmVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJHZXRQYXJhbWV0ZXJFbnRpdHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMkdldFB1YmxpY0lkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJHZXRTeXN0ZW1JZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVgySGFzRXh0ZXJuYWxTdWJzZXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMkhhc0ludGVybmFsU3Vic2V0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJJZ25vcmFibGVXaGl0ZXNwYWNlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJJbml0RGVmYXVsdFNBWEhhbmRsZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMkluaXREb2NiRGVmYXVsdFNBWEhhbmRsZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMkluaXRIdG1sRGVmYXVsdFNBWEhhbmRsZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMkludGVybmFsU3Vic2V0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJJc1N0YW5kYWxvbmUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMk5vdGF0aW9uRGVjbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVgyUHJvY2Vzc2luZ0luc3RydWN0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJSZWZlcmVuY2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMlJlc29sdmVFbnRpdHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYMlNldERvY3VtZW50TG9jYXRvcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVgyU3RhcnREb2N1bWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVgyU3RhcnRFbGVtZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWDJTdGFydEVsZW1lbnROcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVgyVW5wYXJzZWRFbnRpdHlEZWNsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWERlZmF1bHRWZXJzaW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWFZlcnNpb24oKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIFNBWDI6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbEMxNE5Eb2NEdW1wTWVtb3J5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfQzE0Tl9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIFhNTCBkb2N1bWVudCBmb3IgY2Fub25pemF0aW9uICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlU2V0UHRyIG5vZGVzOyAvKiB0aGUgbm9kZXMgc2V0IHRvIGJlIGluY2x1ZGVkIGluIHRoZSBjYW5vbml6ZWQgaW1hZ2Ugb3IgTlVMTCBpZiBhbGwgZG9jdW1lbnQgbm9kZXMgc2hvdWxkIGJlIGluY2x1ZGVkICovCiAgICBpbnQgbl9ub2RlczsKICAgIGludCBtb2RlOyAvKiB0aGUgYzE0biBtb2RlIChzZWUgQHhtbEMxNE5Nb2RlKSAqLwogICAgaW50IG5fbW9kZTsKICAgIHhtbENoYXIgKiogaW5jbHVzaXZlX25zX3ByZWZpeGVzOyAvKiB0aGUgbGlzdCBvZiBpbmNsdXNpdmUgbmFtZXNwYWNlIHByZWZpeGVzIGVuZGVkIHdpdGggYSBOVUxMIG9yIE5VTEwgaWYgdGhlcmUgaXMgbm8gaW5jbHVzaXZlIG5hbWVzcGFjZXMgKG9ubHkgZm9yIGV4Y2x1c2l2ZSBjYW5vbmljYWxpemF0aW9uLCBpZ25vcmVkIG90aGVyd2lzZSkgKi8KICAgIGludCBuX2luY2x1c2l2ZV9uc19wcmVmaXhlczsKICAgIGludCB3aXRoX2NvbW1lbnRzOyAvKiBpbmNsdWRlIGNvbW1lbnRzIGluIHRoZSByZXN1bHQgKCE9MCkgb3Igbm90ICg9PTApICovCiAgICBpbnQgbl93aXRoX2NvbW1lbnRzOwogICAgeG1sQ2hhciAqKiBkb2NfdHh0X3B0cjsgLyogdGhlIG1lbW9yeSBwb2ludGVyIGZvciBhbGxvY2F0ZWQgY2Fub25pY2FsIFhNTCB0ZXh0OyB0aGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb25zIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIHhtbEZyZWUoKSB0byBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KICAgIGludCBuX2RvY190eHRfcHRyOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fbm9kZXMgPSAwO25fbm9kZXMgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzKyspIHsKICAgIGZvciAobl9tb2RlID0gMDtuX21vZGUgPCBnZW5fbmJfaW50O25fbW9kZSsrKSB7CiAgICBmb3IgKG5faW5jbHVzaXZlX25zX3ByZWZpeGVzID0gMDtuX2luY2x1c2l2ZV9uc19wcmVmaXhlcyA8IGdlbl9uYl94bWxDaGFyX3B0cl9wdHI7bl9pbmNsdXNpdmVfbnNfcHJlZml4ZXMrKykgewogICAgZm9yIChuX3dpdGhfY29tbWVudHMgPSAwO25fd2l0aF9jb21tZW50cyA8IGdlbl9uYl9pbnQ7bl93aXRoX2NvbW1lbnRzKyspIHsKICAgIGZvciAobl9kb2NfdHh0X3B0ciA9IDA7bl9kb2NfdHh0X3B0ciA8IGdlbl9uYl94bWxDaGFyX3B0cl9wdHI7bl9kb2NfdHh0X3B0cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBub2RlcyA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMsIDEpOwogICAgICAgIG1vZGUgPSBnZW5faW50KG5fbW9kZSwgMik7CiAgICAgICAgaW5jbHVzaXZlX25zX3ByZWZpeGVzID0gZ2VuX3htbENoYXJfcHRyX3B0cihuX2luY2x1c2l2ZV9uc19wcmVmaXhlcywgMyk7CiAgICAgICAgd2l0aF9jb21tZW50cyA9IGdlbl9pbnQobl93aXRoX2NvbW1lbnRzLCA0KTsKICAgICAgICBkb2NfdHh0X3B0ciA9IGdlbl94bWxDaGFyX3B0cl9wdHIobl9kb2NfdHh0X3B0ciwgNSk7CgogICAgICAgIHJldF92YWwgPSB4bWxDMTRORG9jRHVtcE1lbW9yeShkb2MsIG5vZGVzLCBtb2RlLCBpbmNsdXNpdmVfbnNfcHJlZml4ZXMsIHdpdGhfY29tbWVudHMsIGRvY190eHRfcHRyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbm9kZXMsIG5vZGVzLCAxKTsKICAgICAgICBkZXNfaW50KG5fbW9kZSwgbW9kZSwgMik7CiAgICAgICAgZGVzX3htbENoYXJfcHRyX3B0cihuX2luY2x1c2l2ZV9uc19wcmVmaXhlcywgaW5jbHVzaXZlX25zX3ByZWZpeGVzLCAzKTsKICAgICAgICBkZXNfaW50KG5fd2l0aF9jb21tZW50cywgd2l0aF9jb21tZW50cywgNCk7CiAgICAgICAgZGVzX3htbENoYXJfcHRyX3B0cihuX2RvY190eHRfcHRyLCBkb2NfdHh0X3B0ciwgNSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDMTRORG9jRHVtcE1lbW9yeSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZXMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbW9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbmNsdXNpdmVfbnNfcHJlZml4ZXMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd2l0aF9jb21tZW50cyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2NfdHh0X3B0cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEMxNE5Eb2NTYXZlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfQzE0Tl9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIFhNTCBkb2N1bWVudCBmb3IgY2Fub25pemF0aW9uICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlU2V0UHRyIG5vZGVzOyAvKiB0aGUgbm9kZXMgc2V0IHRvIGJlIGluY2x1ZGVkIGluIHRoZSBjYW5vbml6ZWQgaW1hZ2Ugb3IgTlVMTCBpZiBhbGwgZG9jdW1lbnQgbm9kZXMgc2hvdWxkIGJlIGluY2x1ZGVkICovCiAgICBpbnQgbl9ub2RlczsKICAgIGludCBtb2RlOyAvKiB0aGUgYzE0biBtb2RlIChzZWUgQHhtbEMxNE5Nb2RlKSAqLwogICAgaW50IG5fbW9kZTsKICAgIHhtbENoYXIgKiogaW5jbHVzaXZlX25zX3ByZWZpeGVzOyAvKiB0aGUgbGlzdCBvZiBpbmNsdXNpdmUgbmFtZXNwYWNlIHByZWZpeGVzIGVuZGVkIHdpdGggYSBOVUxMIG9yIE5VTEwgaWYgdGhlcmUgaXMgbm8gaW5jbHVzaXZlIG5hbWVzcGFjZXMgKG9ubHkgZm9yIGV4Y2x1c2l2ZSBjYW5vbmljYWxpemF0aW9uLCBpZ25vcmVkIG90aGVyd2lzZSkgKi8KICAgIGludCBuX2luY2x1c2l2ZV9uc19wcmVmaXhlczsKICAgIGludCB3aXRoX2NvbW1lbnRzOyAvKiBpbmNsdWRlIGNvbW1lbnRzIGluIHRoZSByZXN1bHQgKCE9MCkgb3Igbm90ICg9PTApICovCiAgICBpbnQgbl93aXRoX2NvbW1lbnRzOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgZmlsZW5hbWUgdG8gc3RvcmUgY2Fub25pY2FsIFhNTCBpbWFnZSAqLwogICAgaW50IG5fZmlsZW5hbWU7CiAgICBpbnQgY29tcHJlc3Npb247IC8qIHRoZSBjb21wcmVzc2lvbiBsZXZlbCAoemxpYiByZXF1cmVkKTogLTEgLSBsaWJ4bWwgZGVmYXVsdCwgMCAtIHVuY29tcHJlc3NlZCwgPjAgLSBjb21wcmVzc2lvbiBsZXZlbCAqLwogICAgaW50IG5fY29tcHJlc3Npb247CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9ub2RlcyA9IDA7bl9ub2RlcyA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbm9kZXMrKykgewogICAgZm9yIChuX21vZGUgPSAwO25fbW9kZSA8IGdlbl9uYl9pbnQ7bl9tb2RlKyspIHsKICAgIGZvciAobl9pbmNsdXNpdmVfbnNfcHJlZml4ZXMgPSAwO25faW5jbHVzaXZlX25zX3ByZWZpeGVzIDwgZ2VuX25iX3htbENoYXJfcHRyX3B0cjtuX2luY2x1c2l2ZV9uc19wcmVmaXhlcysrKSB7CiAgICBmb3IgKG5fd2l0aF9jb21tZW50cyA9IDA7bl93aXRoX2NvbW1lbnRzIDwgZ2VuX25iX2ludDtuX3dpdGhfY29tbWVudHMrKykgewogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVvdXRwdXQ7bl9maWxlbmFtZSsrKSB7CiAgICBmb3IgKG5fY29tcHJlc3Npb24gPSAwO25fY29tcHJlc3Npb24gPCBnZW5fbmJfaW50O25fY29tcHJlc3Npb24rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgbm9kZXMgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzLCAxKTsKICAgICAgICBtb2RlID0gZ2VuX2ludChuX21vZGUsIDIpOwogICAgICAgIGluY2x1c2l2ZV9uc19wcmVmaXhlcyA9IGdlbl94bWxDaGFyX3B0cl9wdHIobl9pbmNsdXNpdmVfbnNfcHJlZml4ZXMsIDMpOwogICAgICAgIHdpdGhfY29tbWVudHMgPSBnZW5faW50KG5fd2l0aF9jb21tZW50cywgNCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZW91dHB1dChuX2ZpbGVuYW1lLCA1KTsKICAgICAgICBjb21wcmVzc2lvbiA9IGdlbl9pbnQobl9jb21wcmVzc2lvbiwgNik7CgogICAgICAgIHJldF92YWwgPSB4bWxDMTRORG9jU2F2ZShkb2MsIG5vZGVzLCBtb2RlLCBpbmNsdXNpdmVfbnNfcHJlZml4ZXMsIHdpdGhfY29tbWVudHMsIGZpbGVuYW1lLCBjb21wcmVzc2lvbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzLCBub2RlcywgMSk7CiAgICAgICAgZGVzX2ludChuX21vZGUsIG1vZGUsIDIpOwogICAgICAgIGRlc194bWxDaGFyX3B0cl9wdHIobl9pbmNsdXNpdmVfbnNfcHJlZml4ZXMsIGluY2x1c2l2ZV9uc19wcmVmaXhlcywgMyk7CiAgICAgICAgZGVzX2ludChuX3dpdGhfY29tbWVudHMsIHdpdGhfY29tbWVudHMsIDQpOwogICAgICAgIGRlc19maWxlb3V0cHV0KG5fZmlsZW5hbWUsIGZpbGVuYW1lLCA1KTsKICAgICAgICBkZXNfaW50KG5fY29tcHJlc3Npb24sIGNvbXByZXNzaW9uLCA2KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEMxNE5Eb2NTYXZlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2Rlcyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9tb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2luY2x1c2l2ZV9uc19wcmVmaXhlcyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93aXRoX2NvbW1lbnRzKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbXByZXNzaW9uKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQzE0TkRvY1NhdmVUbyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0MxNE5fRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBYTUwgZG9jdW1lbnQgZm9yIGNhbm9uaXphdGlvbiAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm9kZVNldFB0ciBub2RlczsgLyogdGhlIG5vZGVzIHNldCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgY2Fub25pemVkIGltYWdlIG9yIE5VTEwgaWYgYWxsIGRvY3VtZW50IG5vZGVzIHNob3VsZCBiZSBpbmNsdWRlZCAqLwogICAgaW50IG5fbm9kZXM7CiAgICBpbnQgbW9kZTsgLyogdGhlIGMxNG4gbW9kZSAoc2VlIEB4bWxDMTROTW9kZSkgKi8KICAgIGludCBuX21vZGU7CiAgICB4bWxDaGFyICoqIGluY2x1c2l2ZV9uc19wcmVmaXhlczsgLyogdGhlIGxpc3Qgb2YgaW5jbHVzaXZlIG5hbWVzcGFjZSBwcmVmaXhlcyBlbmRlZCB3aXRoIGEgTlVMTCBvciBOVUxMIGlmIHRoZXJlIGlzIG5vIGluY2x1c2l2ZSBuYW1lc3BhY2VzIChvbmx5IGZvciBleGNsdXNpdmUgY2Fub25pY2FsaXphdGlvbiwgaWdub3JlZCBvdGhlcndpc2UpICovCiAgICBpbnQgbl9pbmNsdXNpdmVfbnNfcHJlZml4ZXM7CiAgICBpbnQgd2l0aF9jb21tZW50czsgLyogaW5jbHVkZSBjb21tZW50cyBpbiB0aGUgcmVzdWx0ICghPTApIG9yIG5vdCAoPT0wKSAqLwogICAgaW50IG5fd2l0aF9jb21tZW50czsKICAgIHhtbE91dHB1dEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBvdXRwdXQgYnVmZmVyIHRvIHN0b3JlIGNhbm9uaWNhbCBYTUw7IHRoaXMgYnVmZmVyIE1VU1QgaGF2ZSBlbmNvZGVyPT1OVUxMIGJlY2F1c2UgQzE0TiByZXF1aXJlcyBVVEYtOCBvdXRwdXQgKi8KICAgIGludCBuX2J1ZjsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX25vZGVzID0gMDtuX25vZGVzIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlcysrKSB7CiAgICBmb3IgKG5fbW9kZSA9IDA7bl9tb2RlIDwgZ2VuX25iX2ludDtuX21vZGUrKykgewogICAgZm9yIChuX2luY2x1c2l2ZV9uc19wcmVmaXhlcyA9IDA7bl9pbmNsdXNpdmVfbnNfcHJlZml4ZXMgPCBnZW5fbmJfeG1sQ2hhcl9wdHJfcHRyO25faW5jbHVzaXZlX25zX3ByZWZpeGVzKyspIHsKICAgIGZvciAobl93aXRoX2NvbW1lbnRzID0gMDtuX3dpdGhfY29tbWVudHMgPCBnZW5fbmJfaW50O25fd2l0aF9jb21tZW50cysrKSB7CiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxPdXRwdXRCdWZmZXJQdHI7bl9idWYrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgbm9kZXMgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzLCAxKTsKICAgICAgICBtb2RlID0gZ2VuX2ludChuX21vZGUsIDIpOwogICAgICAgIGluY2x1c2l2ZV9uc19wcmVmaXhlcyA9IGdlbl94bWxDaGFyX3B0cl9wdHIobl9pbmNsdXNpdmVfbnNfcHJlZml4ZXMsIDMpOwogICAgICAgIHdpdGhfY29tbWVudHMgPSBnZW5faW50KG5fd2l0aF9jb21tZW50cywgNCk7CiAgICAgICAgYnVmID0gZ2VuX3htbE91dHB1dEJ1ZmZlclB0cihuX2J1ZiwgNSk7CgogICAgICAgIHJldF92YWwgPSB4bWxDMTRORG9jU2F2ZVRvKGRvYywgbm9kZXMsIG1vZGUsIGluY2x1c2l2ZV9uc19wcmVmaXhlcywgd2l0aF9jb21tZW50cywgYnVmKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbm9kZXMsIG5vZGVzLCAxKTsKICAgICAgICBkZXNfaW50KG5fbW9kZSwgbW9kZSwgMik7CiAgICAgICAgZGVzX3htbENoYXJfcHRyX3B0cihuX2luY2x1c2l2ZV9uc19wcmVmaXhlcywgaW5jbHVzaXZlX25zX3ByZWZpeGVzLCAzKTsKICAgICAgICBkZXNfaW50KG5fd2l0aF9jb21tZW50cywgd2l0aF9jb21tZW50cywgNCk7CiAgICAgICAgZGVzX3htbE91dHB1dEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCA1KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEMxNE5Eb2NTYXZlVG8iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX21vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5jbHVzaXZlX25zX3ByZWZpeGVzKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3dpdGhfY29tbWVudHMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQzE0TkV4ZWN1dGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF9jMTRuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyBjMTRuIDogMyBvZiA0IGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDMTRORG9jRHVtcE1lbW9yeSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDMTRORG9jU2F2ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDMTRORG9jU2F2ZVRvKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEMxNE5FeGVjdXRlKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSBjMTRuOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KI2lmZGVmIExJQlhNTF9DQVRBTE9HX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbENhdGFsb2dQdHIgMQpzdGF0aWMgeG1sQ2F0YWxvZ1B0ciBnZW5feG1sQ2F0YWxvZ1B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sQ2F0YWxvZ1B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sQ2F0YWxvZ1B0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCgpzdGF0aWMgaW50CnRlc3RfeG1sQUNhdGFsb2dBZGQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9DQVRBTE9HX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENhdGFsb2dQdHIgY2F0YWw7IC8qIGEgQ2F0YWxvZyAqLwogICAgaW50IG5fY2F0YWw7CiAgICB4bWxDaGFyICogdHlwZTsgLyogdGhlIHR5cGUgb2YgcmVjb3JkIHRvIGFkZCB0byB0aGUgY2F0YWxvZyAqLwogICAgaW50IG5fdHlwZTsKICAgIHhtbENoYXIgKiBvcmlnOyAvKiB0aGUgc3lzdGVtLCBwdWJsaWMgb3IgcHJlZml4IHRvIG1hdGNoICovCiAgICBpbnQgbl9vcmlnOwogICAgeG1sQ2hhciAqIHJlcGxhY2U7IC8qIHRoZSByZXBsYWNlbWVudCB2YWx1ZSBmb3IgdGhlIG1hdGNoICovCiAgICBpbnQgbl9yZXBsYWNlOwoKICAgIGZvciAobl9jYXRhbCA9IDA7bl9jYXRhbCA8IGdlbl9uYl94bWxDYXRhbG9nUHRyO25fY2F0YWwrKykgewogICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3R5cGUrKykgewogICAgZm9yIChuX29yaWcgPSAwO25fb3JpZyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX29yaWcrKykgewogICAgZm9yIChuX3JlcGxhY2UgPSAwO25fcmVwbGFjZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3JlcGxhY2UrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY2F0YWwgPSBnZW5feG1sQ2F0YWxvZ1B0cihuX2NhdGFsLCAwKTsKICAgICAgICB0eXBlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdHlwZSwgMSk7CiAgICAgICAgb3JpZyA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX29yaWcsIDIpOwogICAgICAgIHJlcGxhY2UgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9yZXBsYWNlLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEFDYXRhbG9nQWRkKGNhdGFsLCAoY29uc3QgeG1sQ2hhciAqKXR5cGUsIChjb25zdCB4bWxDaGFyICopb3JpZywgKGNvbnN0IHhtbENoYXIgKilyZXBsYWNlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQ2F0YWxvZ1B0cihuX2NhdGFsLCBjYXRhbCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdHlwZSwgKGNvbnN0IHhtbENoYXIgKil0eXBlLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9vcmlnLCAoY29uc3QgeG1sQ2hhciAqKW9yaWcsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3JlcGxhY2UsIChjb25zdCB4bWxDaGFyICopcmVwbGFjZSwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxBQ2F0YWxvZ0FkZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jYXRhbCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90eXBlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29yaWcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVwbGFjZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEFDYXRhbG9nRHVtcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDYXRhbG9nUHRyIGNhdGFsOyAvKiBhIENhdGFsb2cgKi8KICAgIGludCBuX2NhdGFsOwogICAgRklMRSAqIG91dDsgLyogdGhlIGZpbGUuICovCiAgICBpbnQgbl9vdXQ7CgogICAgZm9yIChuX2NhdGFsID0gMDtuX2NhdGFsIDwgZ2VuX25iX3htbENhdGFsb2dQdHI7bl9jYXRhbCsrKSB7CiAgICBmb3IgKG5fb3V0ID0gMDtuX291dCA8IGdlbl9uYl9GSUxFX3B0cjtuX291dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjYXRhbCA9IGdlbl94bWxDYXRhbG9nUHRyKG5fY2F0YWwsIDApOwogICAgICAgIG91dCA9IGdlbl9GSUxFX3B0cihuX291dCwgMSk7CgogICAgICAgIHhtbEFDYXRhbG9nRHVtcChjYXRhbCwgb3V0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbENhdGFsb2dQdHIobl9jYXRhbCwgY2F0YWwsIDApOwogICAgICAgIGRlc19GSUxFX3B0cihuX291dCwgb3V0LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEFDYXRhbG9nRHVtcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jYXRhbCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBQ2F0YWxvZ1JlbW92ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQ2F0YWxvZ1B0ciBjYXRhbDsgLyogYSBDYXRhbG9nICovCiAgICBpbnQgbl9jYXRhbDsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogdGhlIHZhbHVlIHRvIHJlbW92ZSAqLwogICAgaW50IG5fdmFsdWU7CgogICAgZm9yIChuX2NhdGFsID0gMDtuX2NhdGFsIDwgZ2VuX25iX3htbENhdGFsb2dQdHI7bl9jYXRhbCsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjYXRhbCA9IGdlbl94bWxDYXRhbG9nUHRyKG5fY2F0YWwsIDApOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQUNhdGFsb2dSZW1vdmUoY2F0YWwsIChjb25zdCB4bWxDaGFyICopdmFsdWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxDYXRhbG9nUHRyKG5fY2F0YWwsIGNhdGFsLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxBQ2F0YWxvZ1JlbW92ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jYXRhbCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEFDYXRhbG9nUmVzb2x2ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sQ2F0YWxvZ1B0ciBjYXRhbDsgLyogYSBDYXRhbG9nICovCiAgICBpbnQgbl9jYXRhbDsKICAgIHhtbENoYXIgKiBwdWJJRDsgLyogdGhlIHB1YmxpYyBJRCBzdHJpbmcgKi8KICAgIGludCBuX3B1YklEOwogICAgeG1sQ2hhciAqIHN5c0lEOyAvKiB0aGUgc3lzdGVtIElEIHN0cmluZyAqLwogICAgaW50IG5fc3lzSUQ7CgogICAgZm9yIChuX2NhdGFsID0gMDtuX2NhdGFsIDwgZ2VuX25iX3htbENhdGFsb2dQdHI7bl9jYXRhbCsrKSB7CiAgICBmb3IgKG5fcHViSUQgPSAwO25fcHViSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wdWJJRCsrKSB7CiAgICBmb3IgKG5fc3lzSUQgPSAwO25fc3lzSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zeXNJRCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjYXRhbCA9IGdlbl94bWxDYXRhbG9nUHRyKG5fY2F0YWwsIDApOwogICAgICAgIHB1YklEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHViSUQsIDEpOwogICAgICAgIHN5c0lEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzSUQsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sQUNhdGFsb2dSZXNvbHZlKGNhdGFsLCAoY29uc3QgeG1sQ2hhciAqKXB1YklELCAoY29uc3QgeG1sQ2hhciAqKXN5c0lEKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxDYXRhbG9nUHRyKG5fY2F0YWwsIGNhdGFsLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJJRCwgKGNvbnN0IHhtbENoYXIgKilwdWJJRCwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzSUQsIChjb25zdCB4bWxDaGFyICopc3lzSUQsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQUNhdGFsb2dSZXNvbHZlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NhdGFsKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3B1YklEKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N5c0lEKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQUNhdGFsb2dSZXNvbHZlUHVibGljKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfQ0FUQUxPR19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDYXRhbG9nUHRyIGNhdGFsOyAvKiBhIENhdGFsb2cgKi8KICAgIGludCBuX2NhdGFsOwogICAgeG1sQ2hhciAqIHB1YklEOyAvKiB0aGUgcHVibGljIElEIHN0cmluZyAqLwogICAgaW50IG5fcHViSUQ7CgogICAgZm9yIChuX2NhdGFsID0gMDtuX2NhdGFsIDwgZ2VuX25iX3htbENhdGFsb2dQdHI7bl9jYXRhbCsrKSB7CiAgICBmb3IgKG5fcHViSUQgPSAwO25fcHViSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wdWJJRCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjYXRhbCA9IGdlbl94bWxDYXRhbG9nUHRyKG5fY2F0YWwsIDApOwogICAgICAgIHB1YklEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHViSUQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQUNhdGFsb2dSZXNvbHZlUHVibGljKGNhdGFsLCAoY29uc3QgeG1sQ2hhciAqKXB1YklEKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxDYXRhbG9nUHRyKG5fY2F0YWwsIGNhdGFsLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJJRCwgKGNvbnN0IHhtbENoYXIgKilwdWJJRCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxBQ2F0YWxvZ1Jlc29sdmVQdWJsaWMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY2F0YWwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHViSUQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBQ2F0YWxvZ1Jlc29sdmVTeXN0ZW0odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9DQVRBTE9HX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbENhdGFsb2dQdHIgY2F0YWw7IC8qIGEgQ2F0YWxvZyAqLwogICAgaW50IG5fY2F0YWw7CiAgICB4bWxDaGFyICogc3lzSUQ7IC8qIHRoZSBzeXN0ZW0gSUQgc3RyaW5nICovCiAgICBpbnQgbl9zeXNJRDsKCiAgICBmb3IgKG5fY2F0YWwgPSAwO25fY2F0YWwgPCBnZW5fbmJfeG1sQ2F0YWxvZ1B0cjtuX2NhdGFsKyspIHsKICAgIGZvciAobl9zeXNJRCA9IDA7bl9zeXNJRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N5c0lEKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNhdGFsID0gZ2VuX3htbENhdGFsb2dQdHIobl9jYXRhbCwgMCk7CiAgICAgICAgc3lzSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNJRCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxBQ2F0YWxvZ1Jlc29sdmVTeXN0ZW0oY2F0YWwsIChjb25zdCB4bWxDaGFyICopc3lzSUQpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbENhdGFsb2dQdHIobl9jYXRhbCwgY2F0YWwsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N5c0lELCAoY29uc3QgeG1sQ2hhciAqKXN5c0lELCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEFDYXRhbG9nUmVzb2x2ZVN5c3RlbSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jYXRhbCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zeXNJRCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEFDYXRhbG9nUmVzb2x2ZVVSSSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sQ2F0YWxvZ1B0ciBjYXRhbDsgLyogYSBDYXRhbG9nICovCiAgICBpbnQgbl9jYXRhbDsKICAgIHhtbENoYXIgKiBVUkk7IC8qIHRoZSBVUkkgKi8KICAgIGludCBuX1VSSTsKCiAgICBmb3IgKG5fY2F0YWwgPSAwO25fY2F0YWwgPCBnZW5fbmJfeG1sQ2F0YWxvZ1B0cjtuX2NhdGFsKyspIHsKICAgIGZvciAobl9VUkkgPSAwO25fVVJJIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fVVJJKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNhdGFsID0gZ2VuX3htbENhdGFsb2dQdHIobl9jYXRhbCwgMCk7CiAgICAgICAgVVJJID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fVVJJLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEFDYXRhbG9nUmVzb2x2ZVVSSShjYXRhbCwgKGNvbnN0IHhtbENoYXIgKilVUkkpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbENhdGFsb2dQdHIobl9jYXRhbCwgY2F0YWwsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX1VSSSwgKGNvbnN0IHhtbENoYXIgKilVUkksIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQUNhdGFsb2dSZXNvbHZlVVJJIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NhdGFsKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSSSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENhdGFsb2dBZGQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9DQVRBTE9HX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiB0eXBlOyAvKiB0aGUgdHlwZSBvZiByZWNvcmQgdG8gYWRkIHRvIHRoZSBjYXRhbG9nICovCiAgICBpbnQgbl90eXBlOwogICAgeG1sQ2hhciAqIG9yaWc7IC8qIHRoZSBzeXN0ZW0sIHB1YmxpYyBvciBwcmVmaXggdG8gbWF0Y2ggKi8KICAgIGludCBuX29yaWc7CiAgICB4bWxDaGFyICogcmVwbGFjZTsgLyogdGhlIHJlcGxhY2VtZW50IHZhbHVlIGZvciB0aGUgbWF0Y2ggKi8KICAgIGludCBuX3JlcGxhY2U7CgogICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3R5cGUrKykgewogICAgZm9yIChuX29yaWcgPSAwO25fb3JpZyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX29yaWcrKykgewogICAgZm9yIChuX3JlcGxhY2UgPSAwO25fcmVwbGFjZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3JlcGxhY2UrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdHlwZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3R5cGUsIDApOwogICAgICAgIG9yaWcgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9vcmlnLCAxKTsKICAgICAgICByZXBsYWNlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcmVwbGFjZSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxDYXRhbG9nQWRkKChjb25zdCB4bWxDaGFyICopdHlwZSwgKGNvbnN0IHhtbENoYXIgKilvcmlnLCAoY29uc3QgeG1sQ2hhciAqKXJlcGxhY2UpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3R5cGUsIChjb25zdCB4bWxDaGFyICopdHlwZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fb3JpZywgKGNvbnN0IHhtbENoYXIgKilvcmlnLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9yZXBsYWNlLCAoY29uc3QgeG1sQ2hhciAqKXJlcGxhY2UsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ2F0YWxvZ0FkZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90eXBlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29yaWcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVwbGFjZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENhdGFsb2dDbGVhbnVwKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfQ0FUQUxPR19FTkFCTEVEKQoKCiAgICAgICAgeG1sQ2F0YWxvZ0NsZWFudXAoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ2F0YWxvZ0NvbnZlcnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9DQVRBTE9HX0VOQUJMRUQpCiAgICBpbnQgcmV0X3ZhbDsKCgogICAgICAgIHJldF92YWwgPSB4bWxDYXRhbG9nQ29udmVydCgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENhdGFsb2dEdW1wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfQ0FUQUxPR19FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIEZJTEUgKiBvdXQ7IC8qIHRoZSBmaWxlLiAqLwogICAgaW50IG5fb3V0OwoKICAgIGZvciAobl9vdXQgPSAwO25fb3V0IDwgZ2VuX25iX0ZJTEVfcHRyO25fb3V0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG91dCA9IGdlbl9GSUxFX3B0cihuX291dCwgMCk7CgogICAgICAgIHhtbENhdGFsb2dEdW1wKG91dCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19GSUxFX3B0cihuX291dCwgb3V0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENhdGFsb2dEdW1wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENhdGFsb2dHZXREZWZhdWx0cyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENhdGFsb2dBbGxvdyByZXRfdmFsOwoKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwoKICAgICAgICByZXRfdmFsID0geG1sQ2F0YWxvZ0dldERlZmF1bHRzKCk7CiAgICAgICAgZGVzcmV0X3htbENhdGFsb2dBbGxvdyhyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDYXRhbG9nR2V0RGVmYXVsdHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDYXRhbG9nSXNFbXB0eSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQ2F0YWxvZ1B0ciBjYXRhbDsgLyogc2hvdWxkIHRoaXMgY3JlYXRlIGFuIFNHTUwgY2F0YWxvZyAqLwogICAgaW50IG5fY2F0YWw7CgogICAgZm9yIChuX2NhdGFsID0gMDtuX2NhdGFsIDwgZ2VuX25iX3htbENhdGFsb2dQdHI7bl9jYXRhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjYXRhbCA9IGdlbl94bWxDYXRhbG9nUHRyKG5fY2F0YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQ2F0YWxvZ0lzRW1wdHkoY2F0YWwpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxDYXRhbG9nUHRyKG5fY2F0YWwsIGNhdGFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENhdGFsb2dJc0VtcHR5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NhdGFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ2F0YWxvZ0xvY2FsUmVzb2x2ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgdm9pZCAqIGNhdGFsb2dzOyAvKiBhIGRvY3VtZW50J3MgbGlzdCBvZiBjYXRhbG9ncyAqLwogICAgaW50IG5fY2F0YWxvZ3M7CiAgICB4bWxDaGFyICogcHViSUQ7IC8qIHRoZSBwdWJsaWMgSUQgc3RyaW5nICovCiAgICBpbnQgbl9wdWJJRDsKICAgIHhtbENoYXIgKiBzeXNJRDsgLyogdGhlIHN5c3RlbSBJRCBzdHJpbmcgKi8KICAgIGludCBuX3N5c0lEOwoKICAgIGZvciAobl9jYXRhbG9ncyA9IDA7bl9jYXRhbG9ncyA8IGdlbl9uYl92b2lkX3B0cjtuX2NhdGFsb2dzKyspIHsKICAgIGZvciAobl9wdWJJRCA9IDA7bl9wdWJJRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3B1YklEKyspIHsKICAgIGZvciAobl9zeXNJRCA9IDA7bl9zeXNJRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N5c0lEKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNhdGFsb2dzID0gZ2VuX3ZvaWRfcHRyKG5fY2F0YWxvZ3MsIDApOwogICAgICAgIHB1YklEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHViSUQsIDEpOwogICAgICAgIHN5c0lEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzSUQsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sQ2F0YWxvZ0xvY2FsUmVzb2x2ZShjYXRhbG9ncywgKGNvbnN0IHhtbENoYXIgKilwdWJJRCwgKGNvbnN0IHhtbENoYXIgKilzeXNJRCk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jYXRhbG9ncywgY2F0YWxvZ3MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3B1YklELCAoY29uc3QgeG1sQ2hhciAqKXB1YklELCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNJRCwgKGNvbnN0IHhtbENoYXIgKilzeXNJRCwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDYXRhbG9nTG9jYWxSZXNvbHZlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NhdGFsb2dzKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3B1YklEKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N5c0lEKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ2F0YWxvZ0xvY2FsUmVzb2x2ZVVSSSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgdm9pZCAqIGNhdGFsb2dzOyAvKiBhIGRvY3VtZW50J3MgbGlzdCBvZiBjYXRhbG9ncyAqLwogICAgaW50IG5fY2F0YWxvZ3M7CiAgICB4bWxDaGFyICogVVJJOyAvKiB0aGUgVVJJICovCiAgICBpbnQgbl9VUkk7CgogICAgZm9yIChuX2NhdGFsb2dzID0gMDtuX2NhdGFsb2dzIDwgZ2VuX25iX3ZvaWRfcHRyO25fY2F0YWxvZ3MrKykgewogICAgZm9yIChuX1VSSSA9IDA7bl9VUkkgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9VUkkrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY2F0YWxvZ3MgPSBnZW5fdm9pZF9wdHIobl9jYXRhbG9ncywgMCk7CiAgICAgICAgVVJJID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fVVJJLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENhdGFsb2dMb2NhbFJlc29sdmVVUkkoY2F0YWxvZ3MsIChjb25zdCB4bWxDaGFyICopVVJJKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2NhdGFsb2dzLCBjYXRhbG9ncywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fVVJJLCAoY29uc3QgeG1sQ2hhciAqKVVSSSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDYXRhbG9nTG9jYWxSZXNvbHZlVVJJIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NhdGFsb2dzKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSSSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENhdGFsb2dSZW1vdmUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9DQVRBTE9HX0VOQUJMRUQpCiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogdGhlIHZhbHVlIHRvIHJlbW92ZSAqLwogICAgaW50IG5fdmFsdWU7CgogICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgewogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQ2F0YWxvZ1JlbW92ZSgoY29uc3QgeG1sQ2hhciAqKXZhbHVlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ2F0YWxvZ1Jlc29sdmUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9DQVRBTE9HX0VOQUJMRUQpCiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBwdWJJRDsgLyogdGhlIHB1YmxpYyBJRCBzdHJpbmcgKi8KICAgIGludCBuX3B1YklEOwogICAgeG1sQ2hhciAqIHN5c0lEOyAvKiB0aGUgc3lzdGVtIElEIHN0cmluZyAqLwogICAgaW50IG5fc3lzSUQ7CgogICAgZm9yIChuX3B1YklEID0gMDtuX3B1YklEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHViSUQrKykgewogICAgZm9yIChuX3N5c0lEID0gMDtuX3N5c0lEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3lzSUQrKykgewogICAgICAgIHB1YklEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHViSUQsIDApOwogICAgICAgIHN5c0lEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzSUQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQ2F0YWxvZ1Jlc29sdmUoKGNvbnN0IHhtbENoYXIgKilwdWJJRCwgKGNvbnN0IHhtbENoYXIgKilzeXNJRCk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJJRCwgKGNvbnN0IHhtbENoYXIgKilwdWJJRCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzSUQsIChjb25zdCB4bWxDaGFyICopc3lzSUQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENhdGFsb2dSZXNvbHZlUHVibGljKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfQ0FUQUxPR19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogcHViSUQ7IC8qIHRoZSBwdWJsaWMgSUQgc3RyaW5nICovCiAgICBpbnQgbl9wdWJJRDsKCiAgICBmb3IgKG5fcHViSUQgPSAwO25fcHViSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wdWJJRCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBwdWJJRCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3B1YklELCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENhdGFsb2dSZXNvbHZlUHVibGljKChjb25zdCB4bWxDaGFyICopcHViSUQpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHViSUQsIChjb25zdCB4bWxDaGFyICopcHViSUQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ2F0YWxvZ1Jlc29sdmVQdWJsaWMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHViSUQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDYXRhbG9nUmVzb2x2ZVN5c3RlbSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sQ2hhciAqIHN5c0lEOyAvKiB0aGUgc3lzdGVtIElEIHN0cmluZyAqLwogICAgaW50IG5fc3lzSUQ7CgogICAgZm9yIChuX3N5c0lEID0gMDtuX3N5c0lEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3lzSUQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3lzSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNJRCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxDYXRhbG9nUmVzb2x2ZVN5c3RlbSgoY29uc3QgeG1sQ2hhciAqKXN5c0lEKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N5c0lELCAoY29uc3QgeG1sQ2hhciAqKXN5c0lELCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENhdGFsb2dSZXNvbHZlU3lzdGVtIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N5c0lEKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ2F0YWxvZ1Jlc29sdmVVUkkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9DQVRBTE9HX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBVUkk7IC8qIHRoZSBVUkkgKi8KICAgIGludCBuX1VSSTsKCiAgICBmb3IgKG5fVVJJID0gMDtuX1VSSSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX1VSSSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBVUkkgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9VUkksIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQ2F0YWxvZ1Jlc29sdmVVUkkoKGNvbnN0IHhtbENoYXIgKilVUkkpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fVVJJLCAoY29uc3QgeG1sQ2hhciAqKVVSSSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDYXRhbG9nUmVzb2x2ZVVSSSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkkpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDYXRhbG9nU2V0RGVmYXVsdFByZWZlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENhdGFsb2dQcmVmZXIgcmV0X3ZhbDsKICAgIHhtbENhdGFsb2dQcmVmZXIgcHJlZmVyOyAvKiB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIGZvciBkZWxlZ2F0aW9uICovCiAgICBpbnQgbl9wcmVmZXI7CgogICAgZm9yIChuX3ByZWZlciA9IDA7bl9wcmVmZXIgPCBnZW5fbmJfeG1sQ2F0YWxvZ1ByZWZlcjtuX3ByZWZlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBwcmVmZXIgPSBnZW5feG1sQ2F0YWxvZ1ByZWZlcihuX3ByZWZlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxDYXRhbG9nU2V0RGVmYXVsdFByZWZlcihwcmVmZXIpOwogICAgICAgIGRlc3JldF94bWxDYXRhbG9nUHJlZmVyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQ2F0YWxvZ1ByZWZlcihuX3ByZWZlciwgcHJlZmVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENhdGFsb2dTZXREZWZhdWx0UHJlZmVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZWZlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENhdGFsb2dTZXREZWZhdWx0cyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENhdGFsb2dBbGxvdyBhbGxvdzsgLyogd2hhdCBjYXRhbG9ncyBzaG91bGQgYmUgYWNjZXB0ZWQgKi8KICAgIGludCBuX2FsbG93OwoKICAgIGZvciAobl9hbGxvdyA9IDA7bl9hbGxvdyA8IGdlbl9uYl94bWxDYXRhbG9nQWxsb3c7bl9hbGxvdysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBhbGxvdyA9IGdlbl94bWxDYXRhbG9nQWxsb3cobl9hbGxvdywgMCk7CgogICAgICAgIHhtbENhdGFsb2dTZXREZWZhdWx0cyhhbGxvdyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxDYXRhbG9nQWxsb3cobl9hbGxvdywgYWxsb3csIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ2F0YWxvZ1NldERlZmF1bHRzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2FsbG93KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ29udmVydFNHTUxDYXRhbG9nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfQ0FUQUxPR19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDYXRhbG9nUHRyIGNhdGFsOyAvKiB0aGUgY2F0YWxvZyAqLwogICAgaW50IG5fY2F0YWw7CgogICAgZm9yIChuX2NhdGFsID0gMDtuX2NhdGFsIDwgZ2VuX25iX3htbENhdGFsb2dQdHI7bl9jYXRhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjYXRhbCA9IGdlbl94bWxDYXRhbG9nUHRyKG5fY2F0YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQ29udmVydFNHTUxDYXRhbG9nKGNhdGFsKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQ2F0YWxvZ1B0cihuX2NhdGFsLCBjYXRhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDb252ZXJ0U0dNTENhdGFsb2ciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY2F0YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJbml0aWFsaXplQ2F0YWxvZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKCiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKCiAgICAgICAgeG1sSW5pdGlhbGl6ZUNhdGFsb2coKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxJbml0aWFsaXplQ2F0YWxvZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExvYWRBQ2F0YWxvZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxMb2FkQ2F0YWxvZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiBhIGZpbGUgcGF0aCAqLwogICAgaW50IG5fZmlsZW5hbWU7CgogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVwYXRoO25fZmlsZW5hbWUrKykgewogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sTG9hZENhdGFsb2coZmlsZW5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTG9hZENhdGFsb2dzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfQ0FUQUxPR19FTkFCTEVEKQogICAgY2hhciAqIHBhdGhzczsgLyogYSBsaXN0IG9mIGRpcmVjdG9yaWVzIHNlcGFyYXRlZCBieSBhIGNvbG9uIG9yIGEgc3BhY2UuICovCiAgICBpbnQgbl9wYXRoc3M7CgogICAgZm9yIChuX3BhdGhzcyA9IDA7bl9wYXRoc3MgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9wYXRoc3MrKykgewogICAgICAgIHBhdGhzcyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX3BhdGhzcywgMCk7CgogICAgICAgIHhtbExvYWRDYXRhbG9ncygoY29uc3QgY2hhciAqKXBhdGhzcyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX3BhdGhzcywgKGNvbnN0IGNoYXIgKilwYXRoc3MsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExvYWRTR01MU3VwZXJDYXRhbG9nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5ld0NhdGFsb2codm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VDYXRhbG9nRmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgZmlsZW5hbWUgKi8KICAgIGludCBuX2ZpbGVuYW1lOwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlcGF0aDtuX2ZpbGVuYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sUGFyc2VDYXRhbG9nRmlsZShmaWxlbmFtZSk7CiAgICAgICAgZGVzcmV0X3htbERvY1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlQ2F0YWxvZ0ZpbGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X2NhdGFsb2codm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIGNhdGFsb2cgOiAyNyBvZiAzNiBmdW5jdGlvbnMgLi4uXG4iKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQUNhdGFsb2dBZGQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQUNhdGFsb2dEdW1wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEFDYXRhbG9nUmVtb3ZlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEFDYXRhbG9nUmVzb2x2ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBQ2F0YWxvZ1Jlc29sdmVQdWJsaWMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQUNhdGFsb2dSZXNvbHZlU3lzdGVtKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEFDYXRhbG9nUmVzb2x2ZVVSSSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDYXRhbG9nQWRkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENhdGFsb2dDbGVhbnVwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENhdGFsb2dDb252ZXJ0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENhdGFsb2dEdW1wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENhdGFsb2dHZXREZWZhdWx0cygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDYXRhbG9nSXNFbXB0eSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDYXRhbG9nTG9jYWxSZXNvbHZlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENhdGFsb2dMb2NhbFJlc29sdmVVUkkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ2F0YWxvZ1JlbW92ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDYXRhbG9nUmVzb2x2ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDYXRhbG9nUmVzb2x2ZVB1YmxpYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDYXRhbG9nUmVzb2x2ZVN5c3RlbSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDYXRhbG9nUmVzb2x2ZVVSSSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDYXRhbG9nU2V0RGVmYXVsdFByZWZlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDYXRhbG9nU2V0RGVmYXVsdHMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ29udmVydFNHTUxDYXRhbG9nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEluaXRpYWxpemVDYXRhbG9nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbExvYWRBQ2F0YWxvZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMb2FkQ2F0YWxvZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMb2FkQ2F0YWxvZ3MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTG9hZFNHTUxTdXBlckNhdGFsb2coKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3Q2F0YWxvZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZUNhdGFsb2dGaWxlKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSBjYXRhbG9nOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCiNkZWZpbmUgZ2VuX25iX2NvbnN0X3htbENoUmFuZ2VHcm91cF9wdHIgMQpzdGF0aWMgeG1sQ2hSYW5nZUdyb3VwICogZ2VuX2NvbnN0X3htbENoUmFuZ2VHcm91cF9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX2NvbnN0X3htbENoUmFuZ2VHcm91cF9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoUmFuZ2VHcm91cCAqIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sQ2hhckluUmFuZ2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHVuc2lnbmVkIGludCB2YWw7IC8qIGNoYXJhY3RlciB0byBiZSB2YWxpZGF0ZWQgKi8KICAgIGludCBuX3ZhbDsKICAgIHhtbENoUmFuZ2VHcm91cCAqIHJwdHI7IC8qIHBvaW50ZXIgdG8gcmFuZ2UgdG8gYmUgdXNlZCB0byB2YWxpZGF0ZSAqLwogICAgaW50IG5fcnB0cjsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl91bnNpZ25lZF9pbnQ7bl92YWwrKykgewogICAgZm9yIChuX3JwdHIgPSAwO25fcnB0ciA8IGdlbl9uYl9jb25zdF94bWxDaFJhbmdlR3JvdXBfcHRyO25fcnB0cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwgPSBnZW5fdW5zaWduZWRfaW50KG5fdmFsLCAwKTsKICAgICAgICBycHRyID0gZ2VuX2NvbnN0X3htbENoUmFuZ2VHcm91cF9wdHIobl9ycHRyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENoYXJJblJhbmdlKHZhbCwgKGNvbnN0IHhtbENoUmFuZ2VHcm91cCAqKXJwdHIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc191bnNpZ25lZF9pbnQobl92YWwsIHZhbCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoUmFuZ2VHcm91cF9wdHIobl9ycHRyLCAoY29uc3QgeG1sQ2hSYW5nZUdyb3VwICopcnB0ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDaGFySW5SYW5nZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcnB0cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSXNCYXNlQ2hhcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdW5zaWduZWQgaW50IGNoOyAvKiBjaGFyYWN0ZXIgdG8gdmFsaWRhdGUgKi8KICAgIGludCBuX2NoOwoKICAgIGZvciAobl9jaCA9IDA7bl9jaCA8IGdlbl9uYl91bnNpZ25lZF9pbnQ7bl9jaCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjaCA9IGdlbl91bnNpZ25lZF9pbnQobl9jaCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxJc0Jhc2VDaGFyKGNoKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdW5zaWduZWRfaW50KG5fY2gsIGNoLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbElzQmFzZUNoYXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY2gpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbElzQmxhbmsodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHVuc2lnbmVkIGludCBjaDsgLyogY2hhcmFjdGVyIHRvIHZhbGlkYXRlICovCiAgICBpbnQgbl9jaDsKCiAgICBmb3IgKG5fY2ggPSAwO25fY2ggPCBnZW5fbmJfdW5zaWduZWRfaW50O25fY2grKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY2ggPSBnZW5fdW5zaWduZWRfaW50KG5fY2gsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sSXNCbGFuayhjaCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3Vuc2lnbmVkX2ludChuX2NoLCBjaCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxJc0JsYW5rIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NoKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJc0NoYXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHVuc2lnbmVkIGludCBjaDsgLyogY2hhcmFjdGVyIHRvIHZhbGlkYXRlICovCiAgICBpbnQgbl9jaDsKCiAgICBmb3IgKG5fY2ggPSAwO25fY2ggPCBnZW5fbmJfdW5zaWduZWRfaW50O25fY2grKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY2ggPSBnZW5fdW5zaWduZWRfaW50KG5fY2gsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sSXNDaGFyKGNoKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdW5zaWduZWRfaW50KG5fY2gsIGNoLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbElzQ2hhciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jaCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSXNDb21iaW5pbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHVuc2lnbmVkIGludCBjaDsgLyogY2hhcmFjdGVyIHRvIHZhbGlkYXRlICovCiAgICBpbnQgbl9jaDsKCiAgICBmb3IgKG5fY2ggPSAwO25fY2ggPCBnZW5fbmJfdW5zaWduZWRfaW50O25fY2grKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY2ggPSBnZW5fdW5zaWduZWRfaW50KG5fY2gsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sSXNDb21iaW5pbmcoY2gpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc191bnNpZ25lZF9pbnQobl9jaCwgY2gsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSXNDb21iaW5pbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY2gpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbElzRGlnaXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHVuc2lnbmVkIGludCBjaDsgLyogY2hhcmFjdGVyIHRvIHZhbGlkYXRlICovCiAgICBpbnQgbl9jaDsKCiAgICBmb3IgKG5fY2ggPSAwO25fY2ggPCBnZW5fbmJfdW5zaWduZWRfaW50O25fY2grKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY2ggPSBnZW5fdW5zaWduZWRfaW50KG5fY2gsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sSXNEaWdpdChjaCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3Vuc2lnbmVkX2ludChuX2NoLCBjaCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxJc0RpZ2l0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NoKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJc0V4dGVuZGVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB1bnNpZ25lZCBpbnQgY2g7IC8qIGNoYXJhY3RlciB0byB2YWxpZGF0ZSAqLwogICAgaW50IG5fY2g7CgogICAgZm9yIChuX2NoID0gMDtuX2NoIDwgZ2VuX25iX3Vuc2lnbmVkX2ludDtuX2NoKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNoID0gZ2VuX3Vuc2lnbmVkX2ludChuX2NoLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbElzRXh0ZW5kZXIoY2gpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc191bnNpZ25lZF9pbnQobl9jaCwgY2gsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSXNFeHRlbmRlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jaCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSXNJZGVvZ3JhcGhpYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdW5zaWduZWQgaW50IGNoOyAvKiBjaGFyYWN0ZXIgdG8gdmFsaWRhdGUgKi8KICAgIGludCBuX2NoOwoKICAgIGZvciAobl9jaCA9IDA7bl9jaCA8IGdlbl9uYl91bnNpZ25lZF9pbnQ7bl9jaCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjaCA9IGdlbl91bnNpZ25lZF9pbnQobl9jaCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxJc0lkZW9ncmFwaGljKGNoKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdW5zaWduZWRfaW50KG5fY2gsIGNoLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbElzSWRlb2dyYXBoaWMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY2gpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbElzUHViaWRDaGFyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB1bnNpZ25lZCBpbnQgY2g7IC8qIGNoYXJhY3RlciB0byB2YWxpZGF0ZSAqLwogICAgaW50IG5fY2g7CgogICAgZm9yIChuX2NoID0gMDtuX2NoIDwgZ2VuX25iX3Vuc2lnbmVkX2ludDtuX2NoKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNoID0gZ2VuX3Vuc2lnbmVkX2ludChuX2NoLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbElzUHViaWRDaGFyKGNoKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdW5zaWduZWRfaW50KG5fY2gsIGNoLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbElzUHViaWRDaGFyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NoKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X2NodmFsaWQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIGNodmFsaWQgOiA5IG9mIDkgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENoYXJJblJhbmdlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbElzQmFzZUNoYXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSXNCbGFuaygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxJc0NoYXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSXNDb21iaW5pbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSXNEaWdpdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxJc0V4dGVuZGVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbElzSWRlb2dyYXBoaWMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSXNQdWJpZENoYXIoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIGNodmFsaWQ6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbEJvb2xUb1RleHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9ERUJVR19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgY2hhciAqIHJldF92YWw7CiAgICBpbnQgYm9vbHZhbDsgLyogYSBib29sIHRvIHR1cm4gaW50byB0ZXh0ICovCiAgICBpbnQgbl9ib29sdmFsOwoKICAgIGZvciAobl9ib29sdmFsID0gMDtuX2Jvb2x2YWwgPCBnZW5fbmJfaW50O25fYm9vbHZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBib29sdmFsID0gZ2VuX2ludChuX2Jvb2x2YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQm9vbFRvVGV4dChib29sdmFsKTsKICAgICAgICBkZXNyZXRfY29uc3RfY2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9ib29sdmFsLCBib29sdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEJvb2xUb1RleHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYm9vbHZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERlYnVnQ2hlY2tEb2N1bWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0RFQlVHX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIEZJTEUgKiBvdXRwdXQ7IC8qIHRoZSBGSUxFICogZm9yIHRoZSBvdXRwdXQgKi8KICAgIGludCBuX291dHB1dDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwoKICAgIGZvciAobl9vdXRwdXQgPSAwO25fb3V0cHV0IDwgZ2VuX25iX2RlYnVnX0ZJTEVfcHRyO25fb3V0cHV0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXRwdXQgPSBnZW5fZGVidWdfRklMRV9wdHIobl9vdXRwdXQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sRGVidWdDaGVja0RvY3VtZW50KG91dHB1dCwgZG9jKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZGVidWdfRklMRV9wdHIobl9vdXRwdXQsIG91dHB1dCwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERlYnVnQ2hlY2tEb2N1bWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRwdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRGVidWdEdW1wQXR0cih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0RFQlVHX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBGSUxFICogb3V0cHV0OyAvKiB0aGUgRklMRSAqIGZvciB0aGUgb3V0cHV0ICovCiAgICBpbnQgbl9vdXRwdXQ7CiAgICB4bWxBdHRyUHRyIGF0dHI7IC8qIHRoZSBhdHRyaWJ1dGUgKi8KICAgIGludCBuX2F0dHI7CiAgICBpbnQgZGVwdGg7IC8qIHRoZSBpbmRlbnRhdGlvbiBsZXZlbC4gKi8KICAgIGludCBuX2RlcHRoOwoKICAgIGZvciAobl9vdXRwdXQgPSAwO25fb3V0cHV0IDwgZ2VuX25iX2RlYnVnX0ZJTEVfcHRyO25fb3V0cHV0KyspIHsKICAgIGZvciAobl9hdHRyID0gMDtuX2F0dHIgPCBnZW5fbmJfeG1sQXR0clB0cjtuX2F0dHIrKykgewogICAgZm9yIChuX2RlcHRoID0gMDtuX2RlcHRoIDwgZ2VuX25iX2ludDtuX2RlcHRoKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG91dHB1dCA9IGdlbl9kZWJ1Z19GSUxFX3B0cihuX291dHB1dCwgMCk7CiAgICAgICAgYXR0ciA9IGdlbl94bWxBdHRyUHRyKG5fYXR0ciwgMSk7CiAgICAgICAgZGVwdGggPSBnZW5faW50KG5fZGVwdGgsIDIpOwoKICAgICAgICB4bWxEZWJ1Z0R1bXBBdHRyKG91dHB1dCwgYXR0ciwgZGVwdGgpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZGVidWdfRklMRV9wdHIobl9vdXRwdXQsIG91dHB1dCwgMCk7CiAgICAgICAgZGVzX3htbEF0dHJQdHIobl9hdHRyLCBhdHRyLCAxKTsKICAgICAgICBkZXNfaW50KG5fZGVwdGgsIGRlcHRoLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERlYnVnRHVtcEF0dHIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0cHV0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2F0dHIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGVwdGgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEZWJ1Z0R1bXBBdHRyTGlzdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0RFQlVHX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBGSUxFICogb3V0cHV0OyAvKiB0aGUgRklMRSAqIGZvciB0aGUgb3V0cHV0ICovCiAgICBpbnQgbl9vdXRwdXQ7CiAgICB4bWxBdHRyUHRyIGF0dHI7IC8qIHRoZSBhdHRyaWJ1dGUgbGlzdCAqLwogICAgaW50IG5fYXR0cjsKICAgIGludCBkZXB0aDsgLyogdGhlIGluZGVudGF0aW9uIGxldmVsLiAqLwogICAgaW50IG5fZGVwdGg7CgogICAgZm9yIChuX291dHB1dCA9IDA7bl9vdXRwdXQgPCBnZW5fbmJfZGVidWdfRklMRV9wdHI7bl9vdXRwdXQrKykgewogICAgZm9yIChuX2F0dHIgPSAwO25fYXR0ciA8IGdlbl9uYl94bWxBdHRyUHRyO25fYXR0cisrKSB7CiAgICBmb3IgKG5fZGVwdGggPSAwO25fZGVwdGggPCBnZW5fbmJfaW50O25fZGVwdGgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgb3V0cHV0ID0gZ2VuX2RlYnVnX0ZJTEVfcHRyKG5fb3V0cHV0LCAwKTsKICAgICAgICBhdHRyID0gZ2VuX3htbEF0dHJQdHIobl9hdHRyLCAxKTsKICAgICAgICBkZXB0aCA9IGdlbl9pbnQobl9kZXB0aCwgMik7CgogICAgICAgIHhtbERlYnVnRHVtcEF0dHJMaXN0KG91dHB1dCwgYXR0ciwgZGVwdGgpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZGVidWdfRklMRV9wdHIobl9vdXRwdXQsIG91dHB1dCwgMCk7CiAgICAgICAgZGVzX3htbEF0dHJQdHIobl9hdHRyLCBhdHRyLCAxKTsKICAgICAgICBkZXNfaW50KG5fZGVwdGgsIGRlcHRoLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERlYnVnRHVtcEF0dHJMaXN0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dHB1dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9hdHRyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RlcHRoKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRGVidWdEdW1wRFREKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIEZJTEUgKiBvdXRwdXQ7IC8qIHRoZSBGSUxFICogZm9yIHRoZSBvdXRwdXQgKi8KICAgIGludCBuX291dHB1dDsKICAgIHhtbER0ZFB0ciBkdGQ7IC8qIHRoZSBEVEQgKi8KICAgIGludCBuX2R0ZDsKCiAgICBmb3IgKG5fb3V0cHV0ID0gMDtuX291dHB1dCA8IGdlbl9uYl9kZWJ1Z19GSUxFX3B0cjtuX291dHB1dCsrKSB7CiAgICBmb3IgKG5fZHRkID0gMDtuX2R0ZCA8IGdlbl9uYl94bWxEdGRQdHI7bl9kdGQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgb3V0cHV0ID0gZ2VuX2RlYnVnX0ZJTEVfcHRyKG5fb3V0cHV0LCAwKTsKICAgICAgICBkdGQgPSBnZW5feG1sRHRkUHRyKG5fZHRkLCAxKTsKCiAgICAgICAgeG1sRGVidWdEdW1wRFREKG91dHB1dCwgZHRkKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2RlYnVnX0ZJTEVfcHRyKG5fb3V0cHV0LCBvdXRwdXQsIDApOwogICAgICAgIGRlc194bWxEdGRQdHIobl9kdGQsIGR0ZCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEZWJ1Z0R1bXBEVEQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0cHV0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2R0ZCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERlYnVnRHVtcERvY3VtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIEZJTEUgKiBvdXRwdXQ7IC8qIHRoZSBGSUxFICogZm9yIHRoZSBvdXRwdXQgKi8KICAgIGludCBuX291dHB1dDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwoKICAgIGZvciAobl9vdXRwdXQgPSAwO25fb3V0cHV0IDwgZ2VuX25iX2RlYnVnX0ZJTEVfcHRyO25fb3V0cHV0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXRwdXQgPSBnZW5fZGVidWdfRklMRV9wdHIobl9vdXRwdXQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwoKICAgICAgICB4bWxEZWJ1Z0R1bXBEb2N1bWVudChvdXRwdXQsIGRvYyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19kZWJ1Z19GSUxFX3B0cihuX291dHB1dCwgb3V0cHV0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRGVidWdEdW1wRG9jdW1lbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0cHV0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERlYnVnRHVtcERvY3VtZW50SGVhZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0RFQlVHX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBGSUxFICogb3V0cHV0OyAvKiB0aGUgRklMRSAqIGZvciB0aGUgb3V0cHV0ICovCiAgICBpbnQgbl9vdXRwdXQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKCiAgICBmb3IgKG5fb3V0cHV0ID0gMDtuX291dHB1dCA8IGdlbl9uYl9kZWJ1Z19GSUxFX3B0cjtuX291dHB1dCsrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgb3V0cHV0ID0gZ2VuX2RlYnVnX0ZJTEVfcHRyKG5fb3V0cHV0LCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKCiAgICAgICAgeG1sRGVidWdEdW1wRG9jdW1lbnRIZWFkKG91dHB1dCwgZG9jKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2RlYnVnX0ZJTEVfcHRyKG5fb3V0cHV0LCBvdXRwdXQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEZWJ1Z0R1bXBEb2N1bWVudEhlYWQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0cHV0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERlYnVnRHVtcEVudGl0aWVzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIEZJTEUgKiBvdXRwdXQ7IC8qIHRoZSBGSUxFICogZm9yIHRoZSBvdXRwdXQgKi8KICAgIGludCBuX291dHB1dDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwoKICAgIGZvciAobl9vdXRwdXQgPSAwO25fb3V0cHV0IDwgZ2VuX25iX2RlYnVnX0ZJTEVfcHRyO25fb3V0cHV0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXRwdXQgPSBnZW5fZGVidWdfRklMRV9wdHIobl9vdXRwdXQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwoKICAgICAgICB4bWxEZWJ1Z0R1bXBFbnRpdGllcyhvdXRwdXQsIGRvYyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19kZWJ1Z19GSUxFX3B0cihuX291dHB1dCwgb3V0cHV0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRGVidWdEdW1wRW50aXRpZXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0cHV0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERlYnVnRHVtcE5vZGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9ERUJVR19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgRklMRSAqIG91dHB1dDsgLyogdGhlIEZJTEUgKiBmb3IgdGhlIG91dHB1dCAqLwogICAgaW50IG5fb3V0cHV0OwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKICAgIGludCBkZXB0aDsgLyogdGhlIGluZGVudGF0aW9uIGxldmVsLiAqLwogICAgaW50IG5fZGVwdGg7CgogICAgZm9yIChuX291dHB1dCA9IDA7bl9vdXRwdXQgPCBnZW5fbmJfZGVidWdfRklMRV9wdHI7bl9vdXRwdXQrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fZGVwdGggPSAwO25fZGVwdGggPCBnZW5fbmJfaW50O25fZGVwdGgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgb3V0cHV0ID0gZ2VuX2RlYnVnX0ZJTEVfcHRyKG5fb3V0cHV0LCAwKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAxKTsKICAgICAgICBkZXB0aCA9IGdlbl9pbnQobl9kZXB0aCwgMik7CgogICAgICAgIHhtbERlYnVnRHVtcE5vZGUob3V0cHV0LCBub2RlLCBkZXB0aCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19kZWJ1Z19GSUxFX3B0cihuX291dHB1dCwgb3V0cHV0LCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDEpOwogICAgICAgIGRlc19pbnQobl9kZXB0aCwgZGVwdGgsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRGVidWdEdW1wTm9kZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRwdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kZXB0aCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERlYnVnRHVtcE5vZGVMaXN0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIEZJTEUgKiBvdXRwdXQ7IC8qIHRoZSBGSUxFICogZm9yIHRoZSBvdXRwdXQgKi8KICAgIGludCBuX291dHB1dDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIG5vZGUgbGlzdCAqLwogICAgaW50IG5fbm9kZTsKICAgIGludCBkZXB0aDsgLyogdGhlIGluZGVudGF0aW9uIGxldmVsLiAqLwogICAgaW50IG5fZGVwdGg7CgogICAgZm9yIChuX291dHB1dCA9IDA7bl9vdXRwdXQgPCBnZW5fbmJfZGVidWdfRklMRV9wdHI7bl9vdXRwdXQrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fZGVwdGggPSAwO25fZGVwdGggPCBnZW5fbmJfaW50O25fZGVwdGgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgb3V0cHV0ID0gZ2VuX2RlYnVnX0ZJTEVfcHRyKG5fb3V0cHV0LCAwKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAxKTsKICAgICAgICBkZXB0aCA9IGdlbl9pbnQobl9kZXB0aCwgMik7CgogICAgICAgIHhtbERlYnVnRHVtcE5vZGVMaXN0KG91dHB1dCwgbm9kZSwgZGVwdGgpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZGVidWdfRklMRV9wdHIobl9vdXRwdXQsIG91dHB1dCwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAxKTsKICAgICAgICBkZXNfaW50KG5fZGVwdGgsIGRlcHRoLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERlYnVnRHVtcE5vZGVMaXN0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dHB1dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RlcHRoKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRGVidWdEdW1wT25lTm9kZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0RFQlVHX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBGSUxFICogb3V0cHV0OyAvKiB0aGUgRklMRSAqIGZvciB0aGUgb3V0cHV0ICovCiAgICBpbnQgbl9vdXRwdXQ7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBub2RlICovCiAgICBpbnQgbl9ub2RlOwogICAgaW50IGRlcHRoOyAvKiB0aGUgaW5kZW50YXRpb24gbGV2ZWwuICovCiAgICBpbnQgbl9kZXB0aDsKCiAgICBmb3IgKG5fb3V0cHV0ID0gMDtuX291dHB1dCA8IGdlbl9uYl9kZWJ1Z19GSUxFX3B0cjtuX291dHB1dCsrKSB7CiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9kZXB0aCA9IDA7bl9kZXB0aCA8IGdlbl9uYl9pbnQ7bl9kZXB0aCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXRwdXQgPSBnZW5fZGVidWdfRklMRV9wdHIobl9vdXRwdXQsIDApOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDEpOwogICAgICAgIGRlcHRoID0gZ2VuX2ludChuX2RlcHRoLCAyKTsKCiAgICAgICAgeG1sRGVidWdEdW1wT25lTm9kZShvdXRwdXQsIG5vZGUsIGRlcHRoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2RlYnVnX0ZJTEVfcHRyKG5fb3V0cHV0LCBvdXRwdXQsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMSk7CiAgICAgICAgZGVzX2ludChuX2RlcHRoLCBkZXB0aCwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEZWJ1Z0R1bXBPbmVOb2RlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dHB1dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RlcHRoKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRGVidWdEdW1wU3RyaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIEZJTEUgKiBvdXRwdXQ7IC8qIHRoZSBGSUxFICogZm9yIHRoZSBvdXRwdXQgKi8KICAgIGludCBuX291dHB1dDsKICAgIHhtbENoYXIgKiBzdHI7IC8qIHRoZSBzdHJpbmcgKi8KICAgIGludCBuX3N0cjsKCiAgICBmb3IgKG5fb3V0cHV0ID0gMDtuX291dHB1dCA8IGdlbl9uYl9kZWJ1Z19GSUxFX3B0cjtuX291dHB1dCsrKSB7CiAgICBmb3IgKG5fc3RyID0gMDtuX3N0ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXRwdXQgPSBnZW5fZGVidWdfRklMRV9wdHIobl9vdXRwdXQsIDApOwogICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgMSk7CgogICAgICAgIHhtbERlYnVnRHVtcFN0cmluZyhvdXRwdXQsIChjb25zdCB4bWxDaGFyICopc3RyKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2RlYnVnX0ZJTEVfcHRyKG5fb3V0cHV0LCBvdXRwdXQsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgKGNvbnN0IHhtbENoYXIgKilzdHIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRGVidWdEdW1wU3RyaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dHB1dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxMc0NvdW50Tm9kZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0RFQlVHX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIG5vZGUgdG8gY291bnQgKi8KICAgIGludCBuX25vZGU7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbExzQ291bnROb2RlKG5vZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxMc0NvdW50Tm9kZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTHNPbmVOb2RlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIEZJTEUgKiBvdXRwdXQ7IC8qIHRoZSBGSUxFICogZm9yIHRoZSBvdXRwdXQgKi8KICAgIGludCBuX291dHB1dDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIG5vZGUgdG8gZHVtcCAqLwogICAgaW50IG5fbm9kZTsKCiAgICBmb3IgKG5fb3V0cHV0ID0gMDtuX291dHB1dCA8IGdlbl9uYl9kZWJ1Z19GSUxFX3B0cjtuX291dHB1dCsrKSB7CiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG91dHB1dCA9IGdlbl9kZWJ1Z19GSUxFX3B0cihuX291dHB1dCwgMCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMSk7CgogICAgICAgIHhtbExzT25lTm9kZShvdXRwdXQsIG5vZGUpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZGVidWdfRklMRV9wdHIobl9vdXRwdXQsIG91dHB1dCwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbExzT25lTm9kZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRwdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKI2RlZmluZSBnZW5fbmJfY2hhcl9wdHIgMQpzdGF0aWMgY2hhciAqIGdlbl9jaGFyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfY2hhcl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNoYXIgKiB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKc3RhdGljIGludAp0ZXN0X3htbFNoZWxsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNoZWxsQmFzZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0RFQlVHX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNoZWxsQ3R4dFB0ciBjdHh0OyAvKiB0aGUgc2hlbGwgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNoYXIgKiBhcmc7IC8qIHVudXNlZCAqLwogICAgaW50IG5fYXJnOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiBhIG5vZGUgKi8KICAgIGludCBuX25vZGU7CiAgICB4bWxOb2RlUHRyIG5vZGUyOyAvKiB1bnVzZWQgKi8KICAgIGludCBuX25vZGUyOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sU2hlbGxDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fYXJnID0gMDtuX2FyZyA8IGdlbl9uYl9jaGFyX3B0cjtuX2FyZysrKSB7CiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9ub2RlMiA9IDA7bl9ub2RlMiA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZTIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxTaGVsbEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBhcmcgPSBnZW5fY2hhcl9wdHIobl9hcmcsIDEpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDIpOwogICAgICAgIG5vZGUyID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlMiwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxTaGVsbEJhc2UoY3R4dCwgYXJnLCBub2RlLCBub2RlMik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNoZWxsQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jaGFyX3B0cihuX2FyZywgYXJnLCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDIpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZTIsIG5vZGUyLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNoZWxsQmFzZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2FyZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2hlbGxDYXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9ERUJVR19FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2hlbGxDdHh0UHRyIGN0eHQ7IC8qIHRoZSBzaGVsbCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgY2hhciAqIGFyZzsgLyogdW51c2VkICovCiAgICBpbnQgbl9hcmc7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIGEgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbE5vZGVQdHIgbm9kZTI7IC8qIHVudXNlZCAqLwogICAgaW50IG5fbm9kZTI7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTaGVsbEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9hcmcgPSAwO25fYXJnIDwgZ2VuX25iX2NoYXJfcHRyO25fYXJnKyspIHsKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgZm9yIChuX25vZGUyID0gMDtuX25vZGUyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlMisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFNoZWxsQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGFyZyA9IGdlbl9jaGFyX3B0cihuX2FyZywgMSk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMik7CiAgICAgICAgbm9kZTIgPSBnZW5feG1sTm9kZVB0cihuX25vZGUyLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNoZWxsQ2F0KGN0eHQsIGFyZywgbm9kZSwgbm9kZTIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTaGVsbEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY2hhcl9wdHIobl9hcmcsIGFyZywgMSk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAyKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUyLCBub2RlMiwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTaGVsbENhdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2FyZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2hlbGxEaXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9ERUJVR19FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTaGVsbEN0eHRQdHIgY3R4dDsgLyogdGhlIHNoZWxsIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBjaGFyICogYXJnOyAvKiB1bnVzZWQgKi8KICAgIGludCBuX2FyZzsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogYSBub2RlICovCiAgICBpbnQgbl9ub2RlOwogICAgeG1sTm9kZVB0ciBub2RlMjsgLyogdW51c2VkICovCiAgICBpbnQgbl9ub2RlMjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNoZWxsQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2FyZyA9IDA7bl9hcmcgPCBnZW5fbmJfY2hhcl9wdHI7bl9hcmcrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fbm9kZTIgPSAwO25fbm9kZTIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sU2hlbGxDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgYXJnID0gZ2VuX2NoYXJfcHRyKG5fYXJnLCAxKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAyKTsKICAgICAgICBub2RlMiA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZTIsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU2hlbGxEaXIoY3R4dCwgYXJnLCBub2RlLCBub2RlMik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNoZWxsQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jaGFyX3B0cihuX2FyZywgYXJnLCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDIpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZTIsIG5vZGUyLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNoZWxsRGlyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYXJnKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZTIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTaGVsbER1KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2hlbGxDdHh0UHRyIGN0eHQ7IC8qIHRoZSBzaGVsbCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgY2hhciAqIGFyZzsgLyogdW51c2VkICovCiAgICBpbnQgbl9hcmc7CiAgICB4bWxOb2RlUHRyIHRyZWU7IC8qIGEgbm9kZSBkZWZpbmluZyBhIHN1YnRyZWUgKi8KICAgIGludCBuX3RyZWU7CiAgICB4bWxOb2RlUHRyIG5vZGUyOyAvKiB1bnVzZWQgKi8KICAgIGludCBuX25vZGUyOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sU2hlbGxDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fYXJnID0gMDtuX2FyZyA8IGdlbl9uYl9jaGFyX3B0cjtuX2FyZysrKSB7CiAgICBmb3IgKG5fdHJlZSA9IDA7bl90cmVlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl90cmVlKyspIHsKICAgIGZvciAobl9ub2RlMiA9IDA7bl9ub2RlMiA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZTIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxTaGVsbEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBhcmcgPSBnZW5fY2hhcl9wdHIobl9hcmcsIDEpOwogICAgICAgIHRyZWUgPSBnZW5feG1sTm9kZVB0cihuX3RyZWUsIDIpOwogICAgICAgIG5vZGUyID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlMiwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxTaGVsbER1KGN0eHQsIGFyZywgdHJlZSwgbm9kZTIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTaGVsbEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY2hhcl9wdHIobl9hcmcsIGFyZywgMSk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl90cmVlLCB0cmVlLCAyKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUyLCBub2RlMiwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTaGVsbER1IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYXJnKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3RyZWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZTIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTaGVsbExpc3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9ERUJVR19FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTaGVsbEN0eHRQdHIgY3R4dDsgLyogdGhlIHNoZWxsIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBjaGFyICogYXJnOyAvKiB1bnVzZWQgKi8KICAgIGludCBuX2FyZzsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogYSBub2RlICovCiAgICBpbnQgbl9ub2RlOwogICAgeG1sTm9kZVB0ciBub2RlMjsgLyogdW51c2VkICovCiAgICBpbnQgbl9ub2RlMjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNoZWxsQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2FyZyA9IDA7bl9hcmcgPCBnZW5fbmJfY2hhcl9wdHI7bl9hcmcrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fbm9kZTIgPSAwO25fbm9kZTIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sU2hlbGxDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgYXJnID0gZ2VuX2NoYXJfcHRyKG5fYXJnLCAxKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAyKTsKICAgICAgICBub2RlMiA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZTIsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU2hlbGxMaXN0KGN0eHQsIGFyZywgbm9kZSwgbm9kZTIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTaGVsbEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY2hhcl9wdHIobl9hcmcsIGFyZywgMSk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAyKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUyLCBub2RlMiwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTaGVsbExpc3QiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9hcmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlMik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNoZWxsTG9hZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0RFQlVHX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNoZWxsQ3R4dFB0ciBjdHh0OyAvKiB0aGUgc2hlbGwgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIGZpbGUgbmFtZSAqLwogICAgaW50IG5fZmlsZW5hbWU7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHVudXNlZCAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbE5vZGVQdHIgbm9kZTI7IC8qIHVudXNlZCAqLwogICAgaW50IG5fbm9kZTI7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTaGVsbEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9jaGFyX3B0cjtuX2ZpbGVuYW1lKyspIHsKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgZm9yIChuX25vZGUyID0gMDtuX25vZGUyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlMisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFNoZWxsQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2NoYXJfcHRyKG5fZmlsZW5hbWUsIDEpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDIpOwogICAgICAgIG5vZGUyID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlMiwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxTaGVsbExvYWQoY3R4dCwgZmlsZW5hbWUsIG5vZGUsIG5vZGUyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2hlbGxDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NoYXJfcHRyKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDIpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZTIsIG5vZGUyLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNoZWxsTG9hZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZTIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTaGVsbFByaW50WFBhdGhSZXN1bHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9ERUJVR19FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhPYmplY3RQdHIgbGlzdDsgLyogYSB2YWxpZCByZXN1bHQgZ2VuZXJhdGVkIGJ5IGFuIHhwYXRoIGV2YWx1YXRpb24gKi8KICAgIGludCBuX2xpc3Q7CgogICAgZm9yIChuX2xpc3QgPSAwO25fbGlzdCA8IGdlbl9uYl94bWxYUGF0aE9iamVjdFB0cjtuX2xpc3QrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbGlzdCA9IGdlbl94bWxYUGF0aE9iamVjdFB0cihuX2xpc3QsIDApOwoKICAgICAgICB4bWxTaGVsbFByaW50WFBhdGhSZXN1bHQobGlzdCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aE9iamVjdFB0cihuX2xpc3QsIGxpc3QsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2hlbGxQcmludFhQYXRoUmVzdWx0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xpc3QpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTaGVsbFB3ZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0RFQlVHX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNoZWxsQ3R4dFB0ciBjdHh0OyAvKiB0aGUgc2hlbGwgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNoYXIgKiBidWZmZXI7IC8qIHRoZSBvdXRwdXQgYnVmZmVyICovCiAgICBpbnQgbl9idWZmZXI7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIGEgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbE5vZGVQdHIgbm9kZTI7IC8qIHVudXNlZCAqLwogICAgaW50IG5fbm9kZTI7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTaGVsbEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9idWZmZXIgPSAwO25fYnVmZmVyIDwgZ2VuX25iX2NoYXJfcHRyO25fYnVmZmVyKyspIHsKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgZm9yIChuX25vZGUyID0gMDtuX25vZGUyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlMisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFNoZWxsQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGJ1ZmZlciA9IGdlbl9jaGFyX3B0cihuX2J1ZmZlciwgMSk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMik7CiAgICAgICAgbm9kZTIgPSBnZW5feG1sTm9kZVB0cihuX25vZGUyLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNoZWxsUHdkKGN0eHQsIGJ1ZmZlciwgbm9kZSwgbm9kZTIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTaGVsbEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY2hhcl9wdHIobl9idWZmZXIsIGJ1ZmZlciwgMSk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAyKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUyLCBub2RlMiwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTaGVsbFB3ZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1ZmZlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2hlbGxTYXZlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfREVCVUdfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNoZWxsQ3R4dFB0ciBjdHh0OyAvKiB0aGUgc2hlbGwgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIGZpbGUgbmFtZSAob3B0aW9uYWwpICovCiAgICBpbnQgbl9maWxlbmFtZTsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdW51c2VkICovCiAgICBpbnQgbl9ub2RlOwogICAgeG1sTm9kZVB0ciBub2RlMjsgLyogdW51c2VkICovCiAgICBpbnQgbl9ub2RlMjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNoZWxsQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2NoYXJfcHRyO25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fbm9kZTIgPSAwO25fbm9kZTIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sU2hlbGxDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fY2hhcl9wdHIobl9maWxlbmFtZSwgMSk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMik7CiAgICAgICAgbm9kZTIgPSBnZW5feG1sTm9kZVB0cihuX25vZGUyLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNoZWxsU2F2ZShjdHh0LCBmaWxlbmFtZSwgbm9kZSwgbm9kZTIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTaGVsbEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY2hhcl9wdHIobl9maWxlbmFtZSwgZmlsZW5hbWUsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMik7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlMiwgbm9kZTIsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2hlbGxTYXZlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlMik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNoZWxsVmFsaWRhdGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9ERUJVR19FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTaGVsbEN0eHRQdHIgY3R4dDsgLyogdGhlIHNoZWxsIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBjaGFyICogZHRkOyAvKiB0aGUgRFREIFVSSSAob3B0aW9uYWwpICovCiAgICBpbnQgbl9kdGQ7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHVudXNlZCAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbE5vZGVQdHIgbm9kZTI7IC8qIHVudXNlZCAqLwogICAgaW50IG5fbm9kZTI7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTaGVsbEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9kdGQgPSAwO25fZHRkIDwgZ2VuX25iX2NoYXJfcHRyO25fZHRkKyspIHsKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgZm9yIChuX25vZGUyID0gMDtuX25vZGUyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlMisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFNoZWxsQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGR0ZCA9IGdlbl9jaGFyX3B0cihuX2R0ZCwgMSk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMik7CiAgICAgICAgbm9kZTIgPSBnZW5feG1sTm9kZVB0cihuX25vZGUyLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNoZWxsVmFsaWRhdGUoY3R4dCwgZHRkLCBub2RlLCBub2RlMik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNoZWxsQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jaGFyX3B0cihuX2R0ZCwgZHRkLCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDIpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZTIsIG5vZGUyLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNoZWxsVmFsaWRhdGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kdGQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlMik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNoZWxsV3JpdGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9ERUJVR19FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2hlbGxDdHh0UHRyIGN0eHQ7IC8qIHRoZSBzaGVsbCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgZmlsZSBuYW1lICovCiAgICBpbnQgbl9maWxlbmFtZTsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogYSBub2RlIGluIHRoZSB0cmVlICovCiAgICBpbnQgbl9ub2RlOwogICAgeG1sTm9kZVB0ciBub2RlMjsgLyogdW51c2VkICovCiAgICBpbnQgbl9ub2RlMjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNoZWxsQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2NoYXJfcHRyO25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fbm9kZTIgPSAwO25fbm9kZTIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sU2hlbGxDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fY2hhcl9wdHIobl9maWxlbmFtZSwgMSk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMik7CiAgICAgICAgbm9kZTIgPSBnZW5feG1sTm9kZVB0cihuX25vZGUyLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNoZWxsV3JpdGUoY3R4dCwgZmlsZW5hbWUsIG5vZGUsIG5vZGUyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2hlbGxDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NoYXJfcHRyKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDIpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZTIsIG5vZGUyLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNoZWxsV3JpdGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF9kZWJ1Z1hNTCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgZGVidWdYTUwgOiAyNSBvZiAyOCBmdW5jdGlvbnMgLi4uXG4iKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQm9vbFRvVGV4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEZWJ1Z0NoZWNrRG9jdW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRGVidWdEdW1wQXR0cigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEZWJ1Z0R1bXBBdHRyTGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEZWJ1Z0R1bXBEVEQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRGVidWdEdW1wRG9jdW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRGVidWdEdW1wRG9jdW1lbnRIZWFkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERlYnVnRHVtcEVudGl0aWVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERlYnVnRHVtcE5vZGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRGVidWdEdW1wTm9kZUxpc3QoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRGVidWdEdW1wT25lTm9kZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEZWJ1Z0R1bXBTdHJpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTHNDb3VudE5vZGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTHNPbmVOb2RlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNoZWxsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNoZWxsQmFzZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTaGVsbENhdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTaGVsbERpcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTaGVsbER1KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNoZWxsTGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTaGVsbExvYWQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2hlbGxQcmludFhQYXRoUmVzdWx0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNoZWxsUHdkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNoZWxsU2F2ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTaGVsbFZhbGlkYXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNoZWxsV3JpdGUoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIGRlYnVnWE1MOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxEaWN0Q2xlYW51cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKCiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKCiAgICAgICAgeG1sRGljdENsZWFudXAoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEaWN0Q2xlYW51cCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRGljdENyZWF0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERpY3RQdHIgcmV0X3ZhbDsKCiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbERpY3RDcmVhdGUoKTsKICAgICAgICBkZXNyZXRfeG1sRGljdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEaWN0Q3JlYXRlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEaWN0Q3JlYXRlU3ViKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRGljdFB0ciByZXRfdmFsOwogICAgeG1sRGljdFB0ciBzdWI7IC8qIGFuIGV4aXN0aW5nIGRpY3Rpb25uYXJ5ICovCiAgICBpbnQgbl9zdWI7CgogICAgZm9yIChuX3N1YiA9IDA7bl9zdWIgPCBnZW5fbmJfeG1sRGljdFB0cjtuX3N1YisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzdWIgPSBnZW5feG1sRGljdFB0cihuX3N1YiwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxEaWN0Q3JlYXRlU3ViKHN1Yik7CiAgICAgICAgZGVzcmV0X3htbERpY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEaWN0UHRyKG5fc3ViLCBzdWIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRGljdENyZWF0ZVN1YiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdWIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERpY3RFeGlzdHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBjb25zdCB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbERpY3RQdHIgZGljdDsgLyogdGhlIGRpY3Rpb25uYXJ5ICovCiAgICBpbnQgbl9kaWN0OwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTsKICAgIGludCBsZW47IC8qIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUsIGlmIC0xIGl0IGlzIHJlY29tcHV0ZWQgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fZGljdCA9IDA7bl9kaWN0IDwgZ2VuX25iX3htbERpY3RQdHI7bl9kaWN0KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkaWN0ID0gZ2VuX3htbERpY3RQdHIobl9kaWN0LCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxEaWN0RXhpc3RzKGRpY3QsIChjb25zdCB4bWxDaGFyICopbmFtZSwgbGVuKTsKICAgICAgICBkZXNyZXRfY29uc3RfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEaWN0UHRyKG5fZGljdCwgZGljdCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRGljdEV4aXN0cyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kaWN0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEaWN0TG9va3VwKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxEaWN0UHRyIGRpY3Q7IC8qIHRoZSBkaWN0aW9ubmFyeSAqLwogICAgaW50IG5fZGljdDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWU7CiAgICBpbnQgbGVuOyAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBuYW1lLCBpZiAtMSBpdCBpcyByZWNvbXB1dGVkICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX2RpY3QgPSAwO25fZGljdCA8IGdlbl9uYl94bWxEaWN0UHRyO25fZGljdCsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZGljdCA9IGdlbl94bWxEaWN0UHRyKG5fZGljdCwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sRGljdExvb2t1cChkaWN0LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIGxlbik7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRGljdFB0cihuX2RpY3QsIGRpY3QsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERpY3RMb29rdXAiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGljdCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRGljdE93bnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbERpY3RQdHIgZGljdDsgLyogdGhlIGRpY3Rpb25uYXJ5ICovCiAgICBpbnQgbl9kaWN0OwogICAgeG1sQ2hhciAqIHN0cjsgLyogdGhlIHN0cmluZyAqLwogICAgaW50IG5fc3RyOwoKICAgIGZvciAobl9kaWN0ID0gMDtuX2RpY3QgPCBnZW5fbmJfeG1sRGljdFB0cjtuX2RpY3QrKykgewogICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZGljdCA9IGdlbl94bWxEaWN0UHRyKG5fZGljdCwgMCk7CiAgICAgICAgc3RyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbERpY3RPd25zKGRpY3QsIChjb25zdCB4bWxDaGFyICopc3RyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRGljdFB0cihuX2RpY3QsIGRpY3QsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgKGNvbnN0IHhtbENoYXIgKilzdHIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRGljdE93bnMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGljdCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERpY3RRTG9va3VwKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxEaWN0UHRyIGRpY3Q7IC8qIHRoZSBkaWN0aW9ubmFyeSAqLwogICAgaW50IG5fZGljdDsKICAgIHhtbENoYXIgKiBwcmVmaXg7IC8qIHRoZSBwcmVmaXggKi8KICAgIGludCBuX3ByZWZpeDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fZGljdCA9IDA7bl9kaWN0IDwgZ2VuX25iX3htbERpY3RQdHI7bl9kaWN0KyspIHsKICAgIGZvciAobl9wcmVmaXggPSAwO25fcHJlZml4IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHJlZml4KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRpY3QgPSBnZW5feG1sRGljdFB0cihuX2RpY3QsIDApOwogICAgICAgIHByZWZpeCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgMSk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sRGljdFFMb29rdXAoZGljdCwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgsIChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRGljdFB0cihuX2RpY3QsIGRpY3QsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEaWN0UUxvb2t1cCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kaWN0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZWZpeCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEaWN0UmVmZXJlbmNlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxEaWN0UHRyIGRpY3Q7IC8qIHRoZSBkaWN0aW9ubmFyeSAqLwogICAgaW50IG5fZGljdDsKCiAgICBmb3IgKG5fZGljdCA9IDA7bl9kaWN0IDwgZ2VuX25iX3htbERpY3RQdHI7bl9kaWN0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRpY3QgPSBnZW5feG1sRGljdFB0cihuX2RpY3QsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sRGljdFJlZmVyZW5jZShkaWN0KTsKICAgICAgICB4bWxEaWN0RnJlZShkaWN0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRGljdFB0cihuX2RpY3QsIGRpY3QsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRGljdFJlZmVyZW5jZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kaWN0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEaWN0U2l6ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sRGljdFB0ciBkaWN0OyAvKiB0aGUgZGljdGlvbm5hcnkgKi8KICAgIGludCBuX2RpY3Q7CgogICAgZm9yIChuX2RpY3QgPSAwO25fZGljdCA8IGdlbl9uYl94bWxEaWN0UHRyO25fZGljdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkaWN0ID0gZ2VuX3htbERpY3RQdHIobl9kaWN0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbERpY3RTaXplKGRpY3QpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEaWN0UHRyKG5fZGljdCwgZGljdCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEaWN0U2l6ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kaWN0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X2RpY3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIGRpY3QgOiA5IG9mIDEwIGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEaWN0Q2xlYW51cCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEaWN0Q3JlYXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERpY3RDcmVhdGVTdWIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRGljdEV4aXN0cygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEaWN0TG9va3VwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERpY3RPd25zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERpY3RRTG9va3VwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERpY3RSZWZlcmVuY2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRGljdFNpemUoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIGRpY3Q6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X1VURjhUb2lzb2xhdDEodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9PVVRQVVRfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB1bnNpZ25lZCBjaGFyICogb3V0OyAvKiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYnl0ZXMgdG8gc3RvcmUgdGhlIHJlc3VsdCAqLwogICAgaW50IG5fb3V0OwogICAgaW50ICogb3V0bGVuOyAvKiB0aGUgbGVuZ3RoIG9mIEBvdXQgKi8KICAgIGludCBuX291dGxlbjsKICAgIHVuc2lnbmVkIGNoYXIgKiBpbjsgLyogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIFVURi04IGNoYXJzICovCiAgICBpbnQgbl9pbjsKICAgIGludCAqIGlubGVuOyAvKiB0aGUgbGVuZ3RoIG9mIEBpbiAqLwogICAgaW50IG5faW5sZW47CgogICAgZm9yIChuX291dCA9IDA7bl9vdXQgPCBnZW5fbmJfdW5zaWduZWRfY2hhcl9wdHI7bl9vdXQrKykgewogICAgZm9yIChuX291dGxlbiA9IDA7bl9vdXRsZW4gPCBnZW5fbmJfaW50X3B0cjtuX291dGxlbisrKSB7CiAgICBmb3IgKG5faW4gPSAwO25faW4gPCBnZW5fbmJfY29uc3RfdW5zaWduZWRfY2hhcl9wdHI7bl9pbisrKSB7CiAgICBmb3IgKG5faW5sZW4gPSAwO25faW5sZW4gPCBnZW5fbmJfaW50X3B0cjtuX2lubGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG91dCA9IGdlbl91bnNpZ25lZF9jaGFyX3B0cihuX291dCwgMCk7CiAgICAgICAgb3V0bGVuID0gZ2VuX2ludF9wdHIobl9vdXRsZW4sIDEpOwogICAgICAgIGluID0gZ2VuX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyKG5faW4sIDIpOwogICAgICAgIGlubGVuID0gZ2VuX2ludF9wdHIobl9pbmxlbiwgMyk7CgogICAgICAgIHJldF92YWwgPSBVVEY4VG9pc29sYXQxKG91dCwgb3V0bGVuLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKWluLCBpbmxlbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3Vuc2lnbmVkX2NoYXJfcHRyKG5fb3V0LCBvdXQsIDApOwogICAgICAgIGRlc19pbnRfcHRyKG5fb3V0bGVuLCBvdXRsZW4sIDEpOwogICAgICAgIGRlc19jb25zdF91bnNpZ25lZF9jaGFyX3B0cihuX2luLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKWluLCAyKTsKICAgICAgICBkZXNfaW50X3B0cihuX2lubGVuLCBpbmxlbiwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBVVEY4VG9pc29sYXQxIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRsZW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaXNvbGF0MVRvVVRGOCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdW5zaWduZWQgY2hhciAqIG91dDsgLyogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGJ5dGVzIHRvIHN0b3JlIHRoZSByZXN1bHQgKi8KICAgIGludCBuX291dDsKICAgIGludCAqIG91dGxlbjsgLyogdGhlIGxlbmd0aCBvZiBAb3V0ICovCiAgICBpbnQgbl9vdXRsZW47CiAgICB1bnNpZ25lZCBjaGFyICogaW47IC8qIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBJU08gTGF0aW4gMSBjaGFycyAqLwogICAgaW50IG5faW47CiAgICBpbnQgKiBpbmxlbjsgLyogdGhlIGxlbmd0aCBvZiBAaW4gKi8KICAgIGludCBuX2lubGVuOwoKICAgIGZvciAobl9vdXQgPSAwO25fb3V0IDwgZ2VuX25iX3Vuc2lnbmVkX2NoYXJfcHRyO25fb3V0KyspIHsKICAgIGZvciAobl9vdXRsZW4gPSAwO25fb3V0bGVuIDwgZ2VuX25iX2ludF9wdHI7bl9vdXRsZW4rKykgewogICAgZm9yIChuX2luID0gMDtuX2luIDwgZ2VuX25iX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyO25faW4rKykgewogICAgZm9yIChuX2lubGVuID0gMDtuX2lubGVuIDwgZ2VuX25iX2ludF9wdHI7bl9pbmxlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXQgPSBnZW5fdW5zaWduZWRfY2hhcl9wdHIobl9vdXQsIDApOwogICAgICAgIG91dGxlbiA9IGdlbl9pbnRfcHRyKG5fb3V0bGVuLCAxKTsKICAgICAgICBpbiA9IGdlbl9jb25zdF91bnNpZ25lZF9jaGFyX3B0cihuX2luLCAyKTsKICAgICAgICBpbmxlbiA9IGdlbl9pbnRfcHRyKG5faW5sZW4sIDMpOwoKICAgICAgICByZXRfdmFsID0gaXNvbGF0MVRvVVRGOChvdXQsIG91dGxlbiwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilpbiwgaW5sZW4pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc191bnNpZ25lZF9jaGFyX3B0cihuX291dCwgb3V0LCAwKTsKICAgICAgICBkZXNfaW50X3B0cihuX291dGxlbiwgb3V0bGVuLCAxKTsKICAgICAgICBkZXNfY29uc3RfdW5zaWduZWRfY2hhcl9wdHIobl9pbiwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilpbiwgMik7CiAgICAgICAgZGVzX2ludF9wdHIobl9pbmxlbiwgaW5sZW4sIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaXNvbGF0MVRvVVRGOCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0bGVuKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2luKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2lubGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBZGRFbmNvZGluZ0FsaWFzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IHJldF92YWw7CiAgICBjaGFyICogbmFtZTsgLyogdGhlIGVuY29kaW5nIG5hbWUgYXMgcGFyc2VkLCBpbiBVVEYtOCBmb3JtYXQgKEFTQ0lJIGFjdHVhbGx5KSAqLwogICAgaW50IG5fbmFtZTsKICAgIGNoYXIgKiBhbGlhczsgLyogdGhlIGFsaWFzIG5hbWUgYXMgcGFyc2VkLCBpbiBVVEYtOCBmb3JtYXQgKEFTQ0lJIGFjdHVhbGx5KSAqLwogICAgaW50IG5fYWxpYXM7CgogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX2FsaWFzID0gMDtuX2FsaWFzIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fYWxpYXMrKykgewogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9uYW1lLCAwKTsKICAgICAgICBhbGlhcyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2FsaWFzLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEFkZEVuY29kaW5nQWxpYXMoKGNvbnN0IGNoYXIgKiluYW1lLCAoY29uc3QgY2hhciAqKWFsaWFzKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9uYW1lLCAoY29uc3QgY2hhciAqKW5hbWUsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2FsaWFzLCAoY29uc3QgY2hhciAqKWFsaWFzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKI2RlZmluZSBnZW5fbmJfeG1sQ2hhckVuY29kaW5nSGFuZGxlcl9wdHIgMQpzdGF0aWMgeG1sQ2hhckVuY29kaW5nSGFuZGxlciAqIGdlbl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sQ2hhckVuY29kaW5nSGFuZGxlcl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbENoYXJFbmNvZGluZ0hhbmRsZXIgKiB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKc3RhdGljIGludAp0ZXN0X3htbENoYXJFbmNDbG9zZUZ1bmModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXJFbmNvZGluZ0hhbmRsZXIgKiBoYW5kbGVyOyAvKiBjaGFyIGVuY29uZGluZyB0cmFuc2Zvcm1hdGlvbiBkYXRhIHN0cnVjdHVyZSAqLwogICAgaW50IG5faGFuZGxlcjsKCiAgICBmb3IgKG5faGFuZGxlciA9IDA7bl9oYW5kbGVyIDwgZ2VuX25iX3htbENoYXJFbmNvZGluZ0hhbmRsZXJfcHRyO25faGFuZGxlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBoYW5kbGVyID0gZ2VuX3htbENoYXJFbmNvZGluZ0hhbmRsZXJfcHRyKG5faGFuZGxlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxDaGFyRW5jQ2xvc2VGdW5jKGhhbmRsZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxDaGFyRW5jb2RpbmdIYW5kbGVyX3B0cihuX2hhbmRsZXIsIGhhbmRsZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ2hhckVuY0Nsb3NlRnVuYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9oYW5kbGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDaGFyRW5jRmlyc3RMaW5lKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyRW5jb2RpbmdIYW5kbGVyICogaGFuZGxlcjsgLyogY2hhciBlbmNvbmRpbmcgdHJhbnNmb3JtYXRpb24gZGF0YSBzdHJ1Y3R1cmUgKi8KICAgIGludCBuX2hhbmRsZXI7CiAgICB4bWxCdWZmZXJQdHIgb3V0OyAvKiBhbiB4bWxCdWZmZXIgZm9yIHRoZSBvdXRwdXQuICovCiAgICBpbnQgbl9vdXQ7CiAgICB4bWxCdWZmZXJQdHIgaW47IC8qIGFuIHhtbEJ1ZmZlciBmb3IgdGhlIGlucHV0ICovCiAgICBpbnQgbl9pbjsKCiAgICBmb3IgKG5faGFuZGxlciA9IDA7bl9oYW5kbGVyIDwgZ2VuX25iX3htbENoYXJFbmNvZGluZ0hhbmRsZXJfcHRyO25faGFuZGxlcisrKSB7CiAgICBmb3IgKG5fb3V0ID0gMDtuX291dCA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9vdXQrKykgewogICAgZm9yIChuX2luID0gMDtuX2luIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2luKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGhhbmRsZXIgPSBnZW5feG1sQ2hhckVuY29kaW5nSGFuZGxlcl9wdHIobl9oYW5kbGVyLCAwKTsKICAgICAgICBvdXQgPSBnZW5feG1sQnVmZmVyUHRyKG5fb3V0LCAxKTsKICAgICAgICBpbiA9IGdlbl94bWxCdWZmZXJQdHIobl9pbiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxDaGFyRW5jRmlyc3RMaW5lKGhhbmRsZXIsIG91dCwgaW4pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxDaGFyRW5jb2RpbmdIYW5kbGVyX3B0cihuX2hhbmRsZXIsIGhhbmRsZXIsIDApOwogICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9vdXQsIG91dCwgMSk7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2luLCBpbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDaGFyRW5jRmlyc3RMaW5lIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2hhbmRsZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2luKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDaGFyRW5jSW5GdW5jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyRW5jb2RpbmdIYW5kbGVyICogaGFuZGxlcjsgLyogY2hhciBlbmNvZGluZyB0cmFuc2Zvcm1hdGlvbiBkYXRhIHN0cnVjdHVyZSAqLwogICAgaW50IG5faGFuZGxlcjsKICAgIHhtbEJ1ZmZlclB0ciBvdXQ7IC8qIGFuIHhtbEJ1ZmZlciBmb3IgdGhlIG91dHB1dC4gKi8KICAgIGludCBuX291dDsKICAgIHhtbEJ1ZmZlclB0ciBpbjsgLyogYW4geG1sQnVmZmVyIGZvciB0aGUgaW5wdXQgKi8KICAgIGludCBuX2luOwoKICAgIGZvciAobl9oYW5kbGVyID0gMDtuX2hhbmRsZXIgPCBnZW5fbmJfeG1sQ2hhckVuY29kaW5nSGFuZGxlcl9wdHI7bl9oYW5kbGVyKyspIHsKICAgIGZvciAobl9vdXQgPSAwO25fb3V0IDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX291dCsrKSB7CiAgICBmb3IgKG5faW4gPSAwO25faW4gPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25faW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgaGFuZGxlciA9IGdlbl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyX3B0cihuX2hhbmRsZXIsIDApOwogICAgICAgIG91dCA9IGdlbl94bWxCdWZmZXJQdHIobl9vdXQsIDEpOwogICAgICAgIGluID0gZ2VuX3htbEJ1ZmZlclB0cihuX2luLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENoYXJFbmNJbkZ1bmMoaGFuZGxlciwgb3V0LCBpbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZ0hhbmRsZXJfcHRyKG5faGFuZGxlciwgaGFuZGxlciwgMCk7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX291dCwgb3V0LCAxKTsKICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5faW4sIGluLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENoYXJFbmNJbkZ1bmMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faGFuZGxlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENoYXJFbmNPdXRGdW5jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyRW5jb2RpbmdIYW5kbGVyICogaGFuZGxlcjsgLyogY2hhciBlbmNvbmRpbmcgdHJhbnNmb3JtYXRpb24gZGF0YSBzdHJ1Y3R1cmUgKi8KICAgIGludCBuX2hhbmRsZXI7CiAgICB4bWxCdWZmZXJQdHIgb3V0OyAvKiBhbiB4bWxCdWZmZXIgZm9yIHRoZSBvdXRwdXQuICovCiAgICBpbnQgbl9vdXQ7CiAgICB4bWxCdWZmZXJQdHIgaW47IC8qIGFuIHhtbEJ1ZmZlciBmb3IgdGhlIGlucHV0ICovCiAgICBpbnQgbl9pbjsKCiAgICBmb3IgKG5faGFuZGxlciA9IDA7bl9oYW5kbGVyIDwgZ2VuX25iX3htbENoYXJFbmNvZGluZ0hhbmRsZXJfcHRyO25faGFuZGxlcisrKSB7CiAgICBmb3IgKG5fb3V0ID0gMDtuX291dCA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9vdXQrKykgewogICAgZm9yIChuX2luID0gMDtuX2luIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2luKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGhhbmRsZXIgPSBnZW5feG1sQ2hhckVuY29kaW5nSGFuZGxlcl9wdHIobl9oYW5kbGVyLCAwKTsKICAgICAgICBvdXQgPSBnZW5feG1sQnVmZmVyUHRyKG5fb3V0LCAxKTsKICAgICAgICBpbiA9IGdlbl94bWxCdWZmZXJQdHIobl9pbiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxDaGFyRW5jT3V0RnVuYyhoYW5kbGVyLCBvdXQsIGluKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQ2hhckVuY29kaW5nSGFuZGxlcl9wdHIobl9oYW5kbGVyLCBoYW5kbGVyLCAwKTsKICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5fb3V0LCBvdXQsIDEpOwogICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9pbiwgaW4sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ2hhckVuY091dEZ1bmMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faGFuZGxlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENsZWFudXBDaGFyRW5jb2RpbmdIYW5kbGVycyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCgogICAgICAgIHhtbENsZWFudXBDaGFyRW5jb2RpbmdIYW5kbGVycygpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENsZWFudXBFbmNvZGluZ0FsaWFzZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CgogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CgogICAgICAgIHhtbENsZWFudXBFbmNvZGluZ0FsaWFzZXMoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDbGVhbnVwRW5jb2RpbmdBbGlhc2VzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEZWxFbmNvZGluZ0FsaWFzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBjaGFyICogYWxpYXM7IC8qIHRoZSBhbGlhcyBuYW1lIGFzIHBhcnNlZCwgaW4gVVRGLTggZm9ybWF0IChBU0NJSSBhY3R1YWxseSkgKi8KICAgIGludCBuX2FsaWFzOwoKICAgIGZvciAobl9hbGlhcyA9IDA7bl9hbGlhcyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2FsaWFzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGFsaWFzID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fYWxpYXMsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sRGVsRW5jb2RpbmdBbGlhcygoY29uc3QgY2hhciAqKWFsaWFzKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9hbGlhcywgKGNvbnN0IGNoYXIgKilhbGlhcywgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEZWxFbmNvZGluZ0FsaWFzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2FsaWFzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEZXRlY3RDaGFyRW5jb2Rpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyRW5jb2RpbmcgcmV0X3ZhbDsKICAgIHVuc2lnbmVkIGNoYXIgKiBpbjsgLyogYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBieXRlcyBvZiB0aGUgWE1MIGVudGl0eSwgbXVzdCBiZSBhdCBsZWFzdCAyIGJ5dGVzIGxvbmcgKGF0IGxlYXN0IDQgaWYgZW5jb2RpbmcgaXMgVVRGNCB2YXJpYW50KS4gKi8KICAgIGludCBuX2luOwogICAgaW50IGxlbjsgLyogcG9pbnRlciB0byB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5faW4gPSAwO25faW4gPCBnZW5fbmJfY29uc3RfdW5zaWduZWRfY2hhcl9wdHI7bl9pbisrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgaW4gPSBnZW5fY29uc3RfdW5zaWduZWRfY2hhcl9wdHIobl9pbiwgMCk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxEZXRlY3RDaGFyRW5jb2RpbmcoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilpbiwgbGVuKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhckVuY29kaW5nKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfdW5zaWduZWRfY2hhcl9wdHIobl9pbiwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilpbiwgMCk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERldGVjdENoYXJFbmNvZGluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEZpbmRDaGFyRW5jb2RpbmdIYW5kbGVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldENoYXJFbmNvZGluZ0hhbmRsZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sR2V0Q2hhckVuY29kaW5nTmFtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IGNoYXIgKiByZXRfdmFsOwogICAgeG1sQ2hhckVuY29kaW5nIGVuYzsgLyogdGhlIGVuY29kaW5nICovCiAgICBpbnQgbl9lbmM7CgogICAgZm9yIChuX2VuYyA9IDA7bl9lbmMgPCBnZW5fbmJfeG1sQ2hhckVuY29kaW5nO25fZW5jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGVuYyA9IGdlbl94bWxDaGFyRW5jb2Rpbmcobl9lbmMsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sR2V0Q2hhckVuY29kaW5nTmFtZShlbmMpOwogICAgICAgIGRlc3JldF9jb25zdF9jaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZyhuX2VuYywgZW5jLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEdldENoYXJFbmNvZGluZ05hbWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXRFbmNvZGluZ0FsaWFzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgY2hhciAqIHJldF92YWw7CiAgICBjaGFyICogYWxpYXM7IC8qIHRoZSBhbGlhcyBuYW1lIGFzIHBhcnNlZCwgaW4gVVRGLTggZm9ybWF0IChBU0NJSSBhY3R1YWxseSkgKi8KICAgIGludCBuX2FsaWFzOwoKICAgIGZvciAobl9hbGlhcyA9IDA7bl9hbGlhcyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2FsaWFzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGFsaWFzID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fYWxpYXMsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sR2V0RW5jb2RpbmdBbGlhcygoY29uc3QgY2hhciAqKWFsaWFzKTsKICAgICAgICBkZXNyZXRfY29uc3RfY2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2FsaWFzLCAoY29uc3QgY2hhciAqKWFsaWFzLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEdldEVuY29kaW5nQWxpYXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYWxpYXMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEluaXRDaGFyRW5jb2RpbmdIYW5kbGVycyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCgogICAgICAgIHhtbEluaXRDaGFyRW5jb2RpbmdIYW5kbGVycygpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5ld0NoYXJFbmNvZGluZ0hhbmRsZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VDaGFyRW5jb2Rpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyRW5jb2RpbmcgcmV0X3ZhbDsKICAgIGNoYXIgKiBuYW1lOyAvKiB0aGUgZW5jb2RpbmcgbmFtZSBhcyBwYXJzZWQsIGluIFVURi04IGZvcm1hdCAoQVNDSUkgYWN0dWFsbHkpICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9uYW1lLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlQ2hhckVuY29kaW5nKChjb25zdCBjaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X3htbENoYXJFbmNvZGluZyhyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IGNoYXIgKiluYW1lLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlQ2hhckVuY29kaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKI2RlZmluZSBnZW5fbmJfeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0ciAxCnN0YXRpYyB4bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyIGdlbl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sUmVnaXN0ZXJDaGFyRW5jb2RpbmdIYW5kbGVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0ciBoYW5kbGVyOyAvKiB0aGUgeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0ciBoYW5kbGVyIGJsb2NrICovCiAgICBpbnQgbl9oYW5kbGVyOwoKICAgIGZvciAobl9oYW5kbGVyID0gMDtuX2hhbmRsZXIgPCBnZW5fbmJfeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0cjtuX2hhbmRsZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgaGFuZGxlciA9IGdlbl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyKG5faGFuZGxlciwgMCk7CgogICAgICAgIHhtbFJlZ2lzdGVyQ2hhckVuY29kaW5nSGFuZGxlcihoYW5kbGVyKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIobl9oYW5kbGVyLCBoYW5kbGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlZ2lzdGVyQ2hhckVuY29kaW5nSGFuZGxlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9oYW5kbGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X2VuY29kaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyBlbmNvZGluZyA6IDE2IG9mIDE5IGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9VVEY4VG9pc29sYXQxKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2lzb2xhdDFUb1VURjgoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQWRkRW5jb2RpbmdBbGlhcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDaGFyRW5jQ2xvc2VGdW5jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENoYXJFbmNGaXJzdExpbmUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ2hhckVuY0luRnVuYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDaGFyRW5jT3V0RnVuYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDbGVhbnVwQ2hhckVuY29kaW5nSGFuZGxlcnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ2xlYW51cEVuY29kaW5nQWxpYXNlcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEZWxFbmNvZGluZ0FsaWFzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERldGVjdENoYXJFbmNvZGluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxGaW5kQ2hhckVuY29kaW5nSGFuZGxlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxHZXRDaGFyRW5jb2RpbmdIYW5kbGVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEdldENoYXJFbmNvZGluZ05hbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0RW5jb2RpbmdBbGlhcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxJbml0Q2hhckVuY29kaW5nSGFuZGxlcnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3Q2hhckVuY29kaW5nSGFuZGxlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZUNoYXJFbmNvZGluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWdpc3RlckNoYXJFbmNvZGluZ0hhbmRsZXIoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIGVuY29kaW5nOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxBZGREb2NFbnRpdHkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxFbnRpdHlQdHIgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBlbnRpdHkgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIGludCB0eXBlOyAvKiB0aGUgZW50aXR5IHR5cGUgWE1MX3h4eF95eXlfRU5USVRZICovCiAgICBpbnQgbl90eXBlOwogICAgeG1sQ2hhciAqIEV4dGVybmFsSUQ7IC8qIHRoZSBlbnRpdHkgZXh0ZXJuYWwgSUQgaWYgYXZhaWxhYmxlICovCiAgICBpbnQgbl9FeHRlcm5hbElEOwogICAgeG1sQ2hhciAqIFN5c3RlbUlEOyAvKiB0aGUgZW50aXR5IHN5c3RlbSBJRCBpZiBhdmFpbGFibGUgKi8KICAgIGludCBuX1N5c3RlbUlEOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSBlbnRpdHkgY29udGVudCAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl9pbnQ7bl90eXBlKyspIHsKICAgIGZvciAobl9FeHRlcm5hbElEID0gMDtuX0V4dGVybmFsSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9FeHRlcm5hbElEKyspIHsKICAgIGZvciAobl9TeXN0ZW1JRCA9IDA7bl9TeXN0ZW1JRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX1N5c3RlbUlEKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICB0eXBlID0gZ2VuX2ludChuX3R5cGUsIDIpOwogICAgICAgIEV4dGVybmFsSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9FeHRlcm5hbElELCAzKTsKICAgICAgICBTeXN0ZW1JRCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX1N5c3RlbUlELCA0KTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgNSk7CgogICAgICAgIHJldF92YWwgPSB4bWxBZGREb2NFbnRpdHkoZG9jLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIHR5cGUsIChjb25zdCB4bWxDaGFyICopRXh0ZXJuYWxJRCwgKGNvbnN0IHhtbENoYXIgKilTeXN0ZW1JRCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfeG1sRW50aXR5UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2ludChuX3R5cGUsIHR5cGUsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX0V4dGVybmFsSUQsIChjb25zdCB4bWxDaGFyICopRXh0ZXJuYWxJRCwgMyk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fU3lzdGVtSUQsIChjb25zdCB4bWxDaGFyICopU3lzdGVtSUQsIDQpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIChjb25zdCB4bWxDaGFyICopY29udGVudCwgNSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxBZGREb2NFbnRpdHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHlwZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9FeHRlcm5hbElEKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1N5c3RlbUlEKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEFkZER0ZEVudGl0eSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEVudGl0eVB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGVudGl0eSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgaW50IHR5cGU7IC8qIHRoZSBlbnRpdHkgdHlwZSBYTUxfeHh4X3l5eV9FTlRJVFkgKi8KICAgIGludCBuX3R5cGU7CiAgICB4bWxDaGFyICogRXh0ZXJuYWxJRDsgLyogdGhlIGVudGl0eSBleHRlcm5hbCBJRCBpZiBhdmFpbGFibGUgKi8KICAgIGludCBuX0V4dGVybmFsSUQ7CiAgICB4bWxDaGFyICogU3lzdGVtSUQ7IC8qIHRoZSBlbnRpdHkgc3lzdGVtIElEIGlmIGF2YWlsYWJsZSAqLwogICAgaW50IG5fU3lzdGVtSUQ7CiAgICB4bWxDaGFyICogY29udGVudDsgLyogdGhlIGVudGl0eSBjb250ZW50ICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fdHlwZSA9IDA7bl90eXBlIDwgZ2VuX25iX2ludDtuX3R5cGUrKykgewogICAgZm9yIChuX0V4dGVybmFsSUQgPSAwO25fRXh0ZXJuYWxJRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX0V4dGVybmFsSUQrKykgewogICAgZm9yIChuX1N5c3RlbUlEID0gMDtuX1N5c3RlbUlEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fU3lzdGVtSUQrKykgewogICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2NvbnRlbnQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIHR5cGUgPSBnZW5faW50KG5fdHlwZSwgMik7CiAgICAgICAgRXh0ZXJuYWxJRCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX0V4dGVybmFsSUQsIDMpOwogICAgICAgIFN5c3RlbUlEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fU3lzdGVtSUQsIDQpOwogICAgICAgIGNvbnRlbnQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCA1KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEFkZER0ZEVudGl0eShkb2MsIChjb25zdCB4bWxDaGFyICopbmFtZSwgdHlwZSwgKGNvbnN0IHhtbENoYXIgKilFeHRlcm5hbElELCAoY29uc3QgeG1sQ2hhciAqKVN5c3RlbUlELCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQpOwogICAgICAgIGRlc3JldF94bWxFbnRpdHlQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfaW50KG5fdHlwZSwgdHlwZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fRXh0ZXJuYWxJRCwgKGNvbnN0IHhtbENoYXIgKilFeHRlcm5hbElELCAzKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9TeXN0ZW1JRCwgKGNvbnN0IHhtbENoYXIgKilTeXN0ZW1JRCwgNCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCA1KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEFkZER0ZEVudGl0eSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90eXBlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX0V4dGVybmFsSUQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fU3lzdGVtSUQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ2xlYW51cFByZWRlZmluZWRFbnRpdGllcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0xFR0FDWV9FTkFCTEVEKQojaWZkZWYgTElCWE1MX0xFR0FDWV9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CgogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CgogICAgICAgIHhtbENsZWFudXBQcmVkZWZpbmVkRW50aXRpZXMoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDbGVhbnVwUHJlZGVmaW5lZEVudGl0aWVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKI2RlZmluZSBnZW5fbmJfeG1sRW50aXRpZXNUYWJsZVB0ciAxCnN0YXRpYyB4bWxFbnRpdGllc1RhYmxlUHRyIGdlbl94bWxFbnRpdGllc1RhYmxlUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxFbnRpdGllc1RhYmxlUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxFbnRpdGllc1RhYmxlUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sQ29weUVudGl0aWVzVGFibGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ3JlYXRlRW50aXRpZXNUYWJsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEdW1wRW50aXRpZXNUYWJsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogQW4gWE1MIGJ1ZmZlci4gKi8KICAgIGludCBuX2J1ZjsKICAgIHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGU7IC8qIEFuIGVudGl0eSB0YWJsZSAqLwogICAgaW50IG5fdGFibGU7CgogICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKICAgIGZvciAobl90YWJsZSA9IDA7bl90YWJsZSA8IGdlbl9uYl94bWxFbnRpdGllc1RhYmxlUHRyO25fdGFibGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgdGFibGUgPSBnZW5feG1sRW50aXRpZXNUYWJsZVB0cihuX3RhYmxlLCAxKTsKCiAgICAgICAgeG1sRHVtcEVudGl0aWVzVGFibGUoYnVmLCB0YWJsZSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CiAgICAgICAgZGVzX3htbEVudGl0aWVzVGFibGVQdHIobl90YWJsZSwgdGFibGUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRHVtcEVudGl0aWVzVGFibGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3RhYmxlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgojZGVmaW5lIGdlbl9uYl94bWxFbnRpdHlQdHIgMQpzdGF0aWMgeG1sRW50aXR5UHRyIGdlbl94bWxFbnRpdHlQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbEVudGl0eVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sRW50aXR5UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sRHVtcEVudGl0eURlY2wodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIEFuIFhNTCBidWZmZXIuICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxFbnRpdHlQdHIgZW50OyAvKiBBbiBlbnRpdHkgdGFibGUgKi8KICAgIGludCBuX2VudDsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX2VudCA9IDA7bl9lbnQgPCBnZW5fbmJfeG1sRW50aXR5UHRyO25fZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIGVudCA9IGdlbl94bWxFbnRpdHlQdHIobl9lbnQsIDEpOwoKICAgICAgICB4bWxEdW1wRW50aXR5RGVjbChidWYsIGVudCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CiAgICAgICAgZGVzX3htbEVudGl0eVB0cihuX2VudCwgZW50LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbER1bXBFbnRpdHlEZWNsIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbnQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxFbmNvZGVFbnRpdGllc1JlZW50cmFudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhlIHN0cmluZyAqLwogICAgaW50IG5fZG9jOwogICAgeG1sQ2hhciAqIGlucHV0OyAvKiBBIHN0cmluZyB0byBjb252ZXJ0IHRvIFhNTC4gKi8KICAgIGludCBuX2lucHV0OwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5faW5wdXQgPSAwO25faW5wdXQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9pbnB1dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBpbnB1dCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2lucHV0LCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEVuY29kZUVudGl0aWVzUmVlbnRyYW50KGRvYywgKGNvbnN0IHhtbENoYXIgKilpbnB1dCk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2lucHV0LCAoY29uc3QgeG1sQ2hhciAqKWlucHV0LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEVuY29kZUVudGl0aWVzUmVlbnRyYW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbnB1dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRW5jb2RlU3BlY2lhbENoYXJzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgY29udGFpbmluZyB0aGUgc3RyaW5nICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogaW5wdXQ7IC8qIEEgc3RyaW5nIHRvIGNvbnZlcnQgdG8gWE1MLiAqLwogICAgaW50IG5faW5wdXQ7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9pbnB1dCA9IDA7bl9pbnB1dCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2lucHV0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIGlucHV0ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5faW5wdXQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sRW5jb2RlU3BlY2lhbENoYXJzKGRvYywgKGNvbnN0IHhtbENoYXIgKilpbnB1dCk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2lucHV0LCAoY29uc3QgeG1sQ2hhciAqKWlucHV0LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEVuY29kZVNwZWNpYWxDaGFycyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5wdXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldERvY0VudGl0eSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEVudGl0eVB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50IHJlZmVyZW5jaW5nIHRoZSBlbnRpdHkgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgZW50aXR5IG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEdldERvY0VudGl0eShkb2MsIChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X3htbEVudGl0eVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sR2V0RG9jRW50aXR5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXREdGRFbnRpdHkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxFbnRpdHlQdHIgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCByZWZlcmVuY2luZyB0aGUgZW50aXR5ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGVudGl0eSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxHZXREdGRFbnRpdHkoZG9jLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF94bWxFbnRpdHlQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEdldER0ZEVudGl0eSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sR2V0UGFyYW1ldGVyRW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRW50aXR5UHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNpbmcgdGhlIGVudGl0eSAqLwogICAgaW50IG5fZG9jOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBlbnRpdHkgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sR2V0UGFyYW1ldGVyRW50aXR5KGRvYywgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBkZXNyZXRfeG1sRW50aXR5UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxHZXRQYXJhbWV0ZXJFbnRpdHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldFByZWRlZmluZWRFbnRpdHkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxFbnRpdHlQdHIgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgZW50aXR5IG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sR2V0UHJlZGVmaW5lZEVudGl0eSgoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF94bWxFbnRpdHlQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxHZXRQcmVkZWZpbmVkRW50aXR5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEluaXRpYWxpemVQcmVkZWZpbmVkRW50aXRpZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9MRUdBQ1lfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9MRUdBQ1lfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwoKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwoKICAgICAgICB4bWxJbml0aWFsaXplUHJlZGVmaW5lZEVudGl0aWVzKCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSW5pdGlhbGl6ZVByZWRlZmluZWRFbnRpdGllcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdFbnRpdHkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxFbnRpdHlQdHIgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBlbnRpdHkgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIGludCB0eXBlOyAvKiB0aGUgZW50aXR5IHR5cGUgWE1MX3h4eF95eXlfRU5USVRZICovCiAgICBpbnQgbl90eXBlOwogICAgeG1sQ2hhciAqIEV4dGVybmFsSUQ7IC8qIHRoZSBlbnRpdHkgZXh0ZXJuYWwgSUQgaWYgYXZhaWxhYmxlICovCiAgICBpbnQgbl9FeHRlcm5hbElEOwogICAgeG1sQ2hhciAqIFN5c3RlbUlEOyAvKiB0aGUgZW50aXR5IHN5c3RlbSBJRCBpZiBhdmFpbGFibGUgKi8KICAgIGludCBuX1N5c3RlbUlEOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSBlbnRpdHkgY29udGVudCAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl9pbnQ7bl90eXBlKyspIHsKICAgIGZvciAobl9FeHRlcm5hbElEID0gMDtuX0V4dGVybmFsSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9FeHRlcm5hbElEKyspIHsKICAgIGZvciAobl9TeXN0ZW1JRCA9IDA7bl9TeXN0ZW1JRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX1N5c3RlbUlEKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICB0eXBlID0gZ2VuX2ludChuX3R5cGUsIDIpOwogICAgICAgIEV4dGVybmFsSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9FeHRlcm5hbElELCAzKTsKICAgICAgICBTeXN0ZW1JRCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX1N5c3RlbUlELCA0KTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgNSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdFbnRpdHkoZG9jLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIHR5cGUsIChjb25zdCB4bWxDaGFyICopRXh0ZXJuYWxJRCwgKGNvbnN0IHhtbENoYXIgKilTeXN0ZW1JRCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfeG1sRW50aXR5UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2ludChuX3R5cGUsIHR5cGUsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX0V4dGVybmFsSUQsIChjb25zdCB4bWxDaGFyICopRXh0ZXJuYWxJRCwgMyk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fU3lzdGVtSUQsIChjb25zdCB4bWxDaGFyICopU3lzdGVtSUQsIDQpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIChjb25zdCB4bWxDaGFyICopY29udGVudCwgNSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOZXdFbnRpdHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHlwZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9FeHRlcm5hbElEKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1N5c3RlbUlEKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfZW50aXRpZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIGVudGl0aWVzIDogMTMgb2YgMTcgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEFkZERvY0VudGl0eSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBZGREdGRFbnRpdHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ2xlYW51cFByZWRlZmluZWRFbnRpdGllcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDb3B5RW50aXRpZXNUYWJsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDcmVhdGVFbnRpdGllc1RhYmxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbER1bXBFbnRpdGllc1RhYmxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbER1bXBFbnRpdHlEZWNsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEVuY29kZUVudGl0aWVzUmVlbnRyYW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEVuY29kZVNwZWNpYWxDaGFycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxHZXREb2NFbnRpdHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0RHRkRW50aXR5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEdldFBhcmFtZXRlckVudGl0eSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxHZXRQcmVkZWZpbmVkRW50aXR5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEluaXRpYWxpemVQcmVkZWZpbmVkRW50aXRpZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3RW50aXR5KCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSBlbnRpdGllczogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sSGFzaEFkZEVudHJ5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxIYXNoVGFibGVQdHIgdGFibGU7IC8qIHRoZSBoYXNoIHRhYmxlICovCiAgICBpbnQgbl90YWJsZTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWU7CiAgICB2b2lkICogdXNlcmRhdGE7IC8qIGEgcG9pbnRlciB0byB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX3VzZXJkYXRhOwoKICAgIGZvciAobl90YWJsZSA9IDA7bl90YWJsZSA8IGdlbl9uYl94bWxIYXNoVGFibGVQdHI7bl90YWJsZSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fdXNlcmRhdGEgPSAwO25fdXNlcmRhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl91c2VyZGF0YSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0YWJsZSA9IGdlbl94bWxIYXNoVGFibGVQdHIobl90YWJsZSwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIHVzZXJkYXRhID0gZ2VuX3VzZXJkYXRhKG5fdXNlcmRhdGEsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sSGFzaEFkZEVudHJ5KHRhYmxlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIHVzZXJkYXRhKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sSGFzaFRhYmxlUHRyKG5fdGFibGUsIHRhYmxlLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc191c2VyZGF0YShuX3VzZXJkYXRhLCB1c2VyZGF0YSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxIYXNoQWRkRW50cnkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdGFibGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91c2VyZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSGFzaEFkZEVudHJ5Mih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sSGFzaFRhYmxlUHRyIHRhYmxlOyAvKiB0aGUgaGFzaCB0YWJsZSAqLwogICAgaW50IG5fdGFibGU7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIG5hbWUyOyAvKiBhIHNlY29uZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTI7CiAgICB2b2lkICogdXNlcmRhdGE7IC8qIGEgcG9pbnRlciB0byB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX3VzZXJkYXRhOwoKICAgIGZvciAobl90YWJsZSA9IDA7bl90YWJsZSA8IGdlbl9uYl94bWxIYXNoVGFibGVQdHI7bl90YWJsZSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fbmFtZTIgPSAwO25fbmFtZTIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lMisrKSB7CiAgICBmb3IgKG5fdXNlcmRhdGEgPSAwO25fdXNlcmRhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl91c2VyZGF0YSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0YWJsZSA9IGdlbl94bWxIYXNoVGFibGVQdHIobl90YWJsZSwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIG5hbWUyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTIsIDIpOwogICAgICAgIHVzZXJkYXRhID0gZ2VuX3VzZXJkYXRhKG5fdXNlcmRhdGEsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sSGFzaEFkZEVudHJ5Mih0YWJsZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUyLCB1c2VyZGF0YSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCB0YWJsZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lMiwgKGNvbnN0IHhtbENoYXIgKiluYW1lMiwgMik7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fdXNlcmRhdGEsIHVzZXJkYXRhLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEhhc2hBZGRFbnRyeTIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdGFibGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lMik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91c2VyZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSGFzaEFkZEVudHJ5Myh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sSGFzaFRhYmxlUHRyIHRhYmxlOyAvKiB0aGUgaGFzaCB0YWJsZSAqLwogICAgaW50IG5fdGFibGU7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIG5hbWUyOyAvKiBhIHNlY29uZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTI7CiAgICB4bWxDaGFyICogbmFtZTM7IC8qIGEgdGhpcmQgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWUzOwogICAgdm9pZCAqIHVzZXJkYXRhOyAvKiBhIHBvaW50ZXIgdG8gdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl91c2VyZGF0YTsKCiAgICBmb3IgKG5fdGFibGUgPSAwO25fdGFibGUgPCBnZW5fbmJfeG1sSGFzaFRhYmxlUHRyO25fdGFibGUrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX25hbWUyID0gMDtuX25hbWUyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZTIrKykgewogICAgZm9yIChuX25hbWUzID0gMDtuX25hbWUzIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZTMrKykgewogICAgZm9yIChuX3VzZXJkYXRhID0gMDtuX3VzZXJkYXRhIDwgZ2VuX25iX3VzZXJkYXRhO25fdXNlcmRhdGErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdGFibGUgPSBnZW5feG1sSGFzaFRhYmxlUHRyKG5fdGFibGUsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBuYW1lMiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUyLCAyKTsKICAgICAgICBuYW1lMyA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUzLCAzKTsKICAgICAgICB1c2VyZGF0YSA9IGdlbl91c2VyZGF0YShuX3VzZXJkYXRhLCA0KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEhhc2hBZGRFbnRyeTModGFibGUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lMiwgKGNvbnN0IHhtbENoYXIgKiluYW1lMywgdXNlcmRhdGEpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxIYXNoVGFibGVQdHIobl90YWJsZSwgdGFibGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTIsIChjb25zdCB4bWxDaGFyICopbmFtZTIsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUzLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUzLCAzKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl91c2VyZGF0YSwgdXNlcmRhdGEsIDQpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSGFzaEFkZEVudHJ5MyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90YWJsZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUzKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3VzZXJkYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxIYXNoQ29weSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxIYXNoQ3JlYXRlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEhhc2hDcmVhdGVEaWN0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEhhc2hMb29rdXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB2b2lkICogcmV0X3ZhbDsKICAgIHhtbEhhc2hUYWJsZVB0ciB0YWJsZTsgLyogdGhlIGhhc2ggdGFibGUgKi8KICAgIGludCBuX3RhYmxlOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fdGFibGUgPSAwO25fdGFibGUgPCBnZW5fbmJfeG1sSGFzaFRhYmxlUHRyO25fdGFibGUrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdGFibGUgPSBnZW5feG1sSGFzaFRhYmxlUHRyKG5fdGFibGUsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEhhc2hMb29rdXAodGFibGUsIChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X3ZvaWRfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sSGFzaFRhYmxlUHRyKG5fdGFibGUsIHRhYmxlLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSGFzaExvb2t1cCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90YWJsZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxIYXNoTG9va3VwMih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiByZXRfdmFsOwogICAgeG1sSGFzaFRhYmxlUHRyIHRhYmxlOyAvKiB0aGUgaGFzaCB0YWJsZSAqLwogICAgaW50IG5fdGFibGU7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIG5hbWUyOyAvKiBhIHNlY29uZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTI7CgogICAgZm9yIChuX3RhYmxlID0gMDtuX3RhYmxlIDwgZ2VuX25iX3htbEhhc2hUYWJsZVB0cjtuX3RhYmxlKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9uYW1lMiA9IDA7bl9uYW1lMiA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHRhYmxlID0gZ2VuX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgbmFtZTIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lMiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxIYXNoTG9va3VwMih0YWJsZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUyKTsKICAgICAgICBkZXNyZXRfdm9pZF9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxIYXNoVGFibGVQdHIobl90YWJsZSwgdGFibGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTIsIChjb25zdCB4bWxDaGFyICopbmFtZTIsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSGFzaExvb2t1cDIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdGFibGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lMik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSGFzaExvb2t1cDModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB2b2lkICogcmV0X3ZhbDsKICAgIHhtbEhhc2hUYWJsZVB0ciB0YWJsZTsgLyogdGhlIGhhc2ggdGFibGUgKi8KICAgIGludCBuX3RhYmxlOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBuYW1lMjsgLyogYSBzZWNvbmQgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWUyOwogICAgeG1sQ2hhciAqIG5hbWUzOyAvKiBhIHRoaXJkIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lMzsKCiAgICBmb3IgKG5fdGFibGUgPSAwO25fdGFibGUgPCBnZW5fbmJfeG1sSGFzaFRhYmxlUHRyO25fdGFibGUrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX25hbWUyID0gMDtuX25hbWUyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZTIrKykgewogICAgZm9yIChuX25hbWUzID0gMDtuX25hbWUzIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZTMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdGFibGUgPSBnZW5feG1sSGFzaFRhYmxlUHRyKG5fdGFibGUsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBuYW1lMiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUyLCAyKTsKICAgICAgICBuYW1lMyA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUzLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEhhc2hMb29rdXAzKHRhYmxlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZTIsIChjb25zdCB4bWxDaGFyICopbmFtZTMpOwogICAgICAgIGRlc3JldF92b2lkX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCB0YWJsZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lMiwgKGNvbnN0IHhtbENoYXIgKiluYW1lMiwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTMsIChjb25zdCB4bWxDaGFyICopbmFtZTMsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSGFzaExvb2t1cDMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdGFibGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lMik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lMyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSGFzaFFMb29rdXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB2b2lkICogcmV0X3ZhbDsKICAgIHhtbEhhc2hUYWJsZVB0ciB0YWJsZTsgLyogdGhlIGhhc2ggdGFibGUgKi8KICAgIGludCBuX3RhYmxlOwogICAgeG1sQ2hhciAqIHByZWZpeDsgLyogdGhlIHByZWZpeCBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX3ByZWZpeDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX3RhYmxlID0gMDtuX3RhYmxlIDwgZ2VuX25iX3htbEhhc2hUYWJsZVB0cjtuX3RhYmxlKyspIHsKICAgIGZvciAobl9wcmVmaXggPSAwO25fcHJlZml4IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHJlZml4KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHRhYmxlID0gZ2VuX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCAwKTsKICAgICAgICBwcmVmaXggPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEhhc2hRTG9va3VwKHRhYmxlLCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBkZXNyZXRfdm9pZF9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxIYXNoVGFibGVQdHIobl90YWJsZSwgdGFibGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxIYXNoUUxvb2t1cCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90YWJsZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wcmVmaXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSGFzaFFMb29rdXAyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIHJldF92YWw7CiAgICB4bWxIYXNoVGFibGVQdHIgdGFibGU7IC8qIHRoZSBoYXNoIHRhYmxlICovCiAgICBpbnQgbl90YWJsZTsKICAgIHhtbENoYXIgKiBwcmVmaXg7IC8qIHRoZSBwcmVmaXggb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9wcmVmaXg7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIHByZWZpeDI7IC8qIHRoZSBzZWNvbmQgcHJlZml4IG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fcHJlZml4MjsKICAgIHhtbENoYXIgKiBuYW1lMjsgLyogYSBzZWNvbmQgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWUyOwoKICAgIGZvciAobl90YWJsZSA9IDA7bl90YWJsZSA8IGdlbl9uYl94bWxIYXNoVGFibGVQdHI7bl90YWJsZSsrKSB7CiAgICBmb3IgKG5fcHJlZml4ID0gMDtuX3ByZWZpeCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ByZWZpeCsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fcHJlZml4MiA9IDA7bl9wcmVmaXgyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHJlZml4MisrKSB7CiAgICBmb3IgKG5fbmFtZTIgPSAwO25fbmFtZTIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lMisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0YWJsZSA9IGdlbl94bWxIYXNoVGFibGVQdHIobl90YWJsZSwgMCk7CiAgICAgICAgcHJlZml4ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAxKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMik7CiAgICAgICAgcHJlZml4MiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeDIsIDMpOwogICAgICAgIG5hbWUyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTIsIDQpOwoKICAgICAgICByZXRfdmFsID0geG1sSGFzaFFMb29rdXAyKHRhYmxlLCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeDIsIChjb25zdCB4bWxDaGFyICopbmFtZTIpOwogICAgICAgIGRlc3JldF92b2lkX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCB0YWJsZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgyLCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeDIsIDMpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUyLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUyLCA0KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEhhc2hRTG9va3VwMiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90YWJsZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wcmVmaXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wcmVmaXgyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxIYXNoUUxvb2t1cDModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB2b2lkICogcmV0X3ZhbDsKICAgIHhtbEhhc2hUYWJsZVB0ciB0YWJsZTsgLyogdGhlIGhhc2ggdGFibGUgKi8KICAgIGludCBuX3RhYmxlOwogICAgeG1sQ2hhciAqIHByZWZpeDsgLyogdGhlIHByZWZpeCBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX3ByZWZpeDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogcHJlZml4MjsgLyogdGhlIHNlY29uZCBwcmVmaXggb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9wcmVmaXgyOwogICAgeG1sQ2hhciAqIG5hbWUyOyAvKiBhIHNlY29uZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTI7CiAgICB4bWxDaGFyICogcHJlZml4MzsgLyogdGhlIHRoaXJkIHByZWZpeCBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX3ByZWZpeDM7CiAgICB4bWxDaGFyICogbmFtZTM7IC8qIGEgdGhpcmQgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWUzOwoKICAgIGZvciAobl90YWJsZSA9IDA7bl90YWJsZSA8IGdlbl9uYl94bWxIYXNoVGFibGVQdHI7bl90YWJsZSsrKSB7CiAgICBmb3IgKG5fcHJlZml4ID0gMDtuX3ByZWZpeCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ByZWZpeCsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fcHJlZml4MiA9IDA7bl9wcmVmaXgyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHJlZml4MisrKSB7CiAgICBmb3IgKG5fbmFtZTIgPSAwO25fbmFtZTIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lMisrKSB7CiAgICBmb3IgKG5fcHJlZml4MyA9IDA7bl9wcmVmaXgzIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHJlZml4MysrKSB7CiAgICBmb3IgKG5fbmFtZTMgPSAwO25fbmFtZTMgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lMysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0YWJsZSA9IGdlbl94bWxIYXNoVGFibGVQdHIobl90YWJsZSwgMCk7CiAgICAgICAgcHJlZml4ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAxKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMik7CiAgICAgICAgcHJlZml4MiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeDIsIDMpOwogICAgICAgIG5hbWUyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTIsIDQpOwogICAgICAgIHByZWZpeDMgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgzLCA1KTsKICAgICAgICBuYW1lMyA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUzLCA2KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEhhc2hRTG9va3VwMyh0YWJsZSwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgyLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUyLCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeDMsIChjb25zdCB4bWxDaGFyICopbmFtZTMpOwogICAgICAgIGRlc3JldF92b2lkX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCB0YWJsZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgyLCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeDIsIDMpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUyLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUyLCA0KTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgzLCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeDMsIDUpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUzLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUzLCA2KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEhhc2hRTG9va3VwMyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90YWJsZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wcmVmaXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wcmVmaXgyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZWZpeDMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZTMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEhhc2hSZW1vdmVFbnRyeSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sSGFzaFRhYmxlUHRyIHRhYmxlOyAvKiB0aGUgaGFzaCB0YWJsZSAqLwogICAgaW50IG5fdGFibGU7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sSGFzaERlYWxsb2NhdG9yIGY7IC8qIHRoZSBkZWFsbG9jYXRvciBmdW5jdGlvbiBmb3IgcmVtb3ZlZCBpdGVtIChpZiBhbnkpICovCiAgICBpbnQgbl9mOwoKICAgIGZvciAobl90YWJsZSA9IDA7bl90YWJsZSA8IGdlbl9uYl94bWxIYXNoVGFibGVQdHI7bl90YWJsZSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fZiA9IDA7bl9mIDwgZ2VuX25iX3htbEhhc2hEZWFsbG9jYXRvcjtuX2YrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdGFibGUgPSBnZW5feG1sSGFzaFRhYmxlUHRyKG5fdGFibGUsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBmID0gZ2VuX3htbEhhc2hEZWFsbG9jYXRvcihuX2YsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sSGFzaFJlbW92ZUVudHJ5KHRhYmxlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIGYpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxIYXNoVGFibGVQdHIobl90YWJsZSwgdGFibGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX3htbEhhc2hEZWFsbG9jYXRvcihuX2YsIGYsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSGFzaFJlbW92ZUVudHJ5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3RhYmxlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSGFzaFJlbW92ZUVudHJ5Mih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sSGFzaFRhYmxlUHRyIHRhYmxlOyAvKiB0aGUgaGFzaCB0YWJsZSAqLwogICAgaW50IG5fdGFibGU7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIG5hbWUyOyAvKiBhIHNlY29uZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTI7CiAgICB4bWxIYXNoRGVhbGxvY2F0b3IgZjsgLyogdGhlIGRlYWxsb2NhdG9yIGZ1bmN0aW9uIGZvciByZW1vdmVkIGl0ZW0gKGlmIGFueSkgKi8KICAgIGludCBuX2Y7CgogICAgZm9yIChuX3RhYmxlID0gMDtuX3RhYmxlIDwgZ2VuX25iX3htbEhhc2hUYWJsZVB0cjtuX3RhYmxlKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9uYW1lMiA9IDA7bl9uYW1lMiA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUyKyspIHsKICAgIGZvciAobl9mID0gMDtuX2YgPCBnZW5fbmJfeG1sSGFzaERlYWxsb2NhdG9yO25fZisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0YWJsZSA9IGdlbl94bWxIYXNoVGFibGVQdHIobl90YWJsZSwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIG5hbWUyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTIsIDIpOwogICAgICAgIGYgPSBnZW5feG1sSGFzaERlYWxsb2NhdG9yKG5fZiwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxIYXNoUmVtb3ZlRW50cnkyKHRhYmxlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZTIsIGYpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxIYXNoVGFibGVQdHIobl90YWJsZSwgdGFibGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTIsIChjb25zdCB4bWxDaGFyICopbmFtZTIsIDIpOwogICAgICAgIGRlc194bWxIYXNoRGVhbGxvY2F0b3Iobl9mLCBmLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEhhc2hSZW1vdmVFbnRyeTIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdGFibGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lMik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxIYXNoUmVtb3ZlRW50cnkzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxIYXNoVGFibGVQdHIgdGFibGU7IC8qIHRoZSBoYXNoIHRhYmxlICovCiAgICBpbnQgbl90YWJsZTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogbmFtZTI7IC8qIGEgc2Vjb25kIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lMjsKICAgIHhtbENoYXIgKiBuYW1lMzsgLyogYSB0aGlyZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTM7CiAgICB4bWxIYXNoRGVhbGxvY2F0b3IgZjsgLyogdGhlIGRlYWxsb2NhdG9yIGZ1bmN0aW9uIGZvciByZW1vdmVkIGl0ZW0gKGlmIGFueSkgKi8KICAgIGludCBuX2Y7CgogICAgZm9yIChuX3RhYmxlID0gMDtuX3RhYmxlIDwgZ2VuX25iX3htbEhhc2hUYWJsZVB0cjtuX3RhYmxlKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9uYW1lMiA9IDA7bl9uYW1lMiA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUyKyspIHsKICAgIGZvciAobl9uYW1lMyA9IDA7bl9uYW1lMyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUzKyspIHsKICAgIGZvciAobl9mID0gMDtuX2YgPCBnZW5fbmJfeG1sSGFzaERlYWxsb2NhdG9yO25fZisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0YWJsZSA9IGdlbl94bWxIYXNoVGFibGVQdHIobl90YWJsZSwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIG5hbWUyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTIsIDIpOwogICAgICAgIG5hbWUzID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTMsIDMpOwogICAgICAgIGYgPSBnZW5feG1sSGFzaERlYWxsb2NhdG9yKG5fZiwgNCk7CgogICAgICAgIHJldF92YWwgPSB4bWxIYXNoUmVtb3ZlRW50cnkzKHRhYmxlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZTIsIChjb25zdCB4bWxDaGFyICopbmFtZTMsIGYpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxIYXNoVGFibGVQdHIobl90YWJsZSwgdGFibGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTIsIChjb25zdCB4bWxDaGFyICopbmFtZTIsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUzLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUzLCAzKTsKICAgICAgICBkZXNfeG1sSGFzaERlYWxsb2NhdG9yKG5fZiwgZiwgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxIYXNoUmVtb3ZlRW50cnkzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3RhYmxlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZTIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZTMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSGFzaFNjYW4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSGFzaFNjYW4zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEhhc2hTY2FuRnVsbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxIYXNoU2NhbkZ1bGwzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEhhc2hTaXplKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxIYXNoVGFibGVQdHIgdGFibGU7IC8qIHRoZSBoYXNoIHRhYmxlICovCiAgICBpbnQgbl90YWJsZTsKCiAgICBmb3IgKG5fdGFibGUgPSAwO25fdGFibGUgPCBnZW5fbmJfeG1sSGFzaFRhYmxlUHRyO25fdGFibGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdGFibGUgPSBnZW5feG1sSGFzaFRhYmxlUHRyKG5fdGFibGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sSGFzaFNpemUodGFibGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxIYXNoVGFibGVQdHIobl90YWJsZSwgdGFibGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSGFzaFNpemUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdGFibGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEhhc2hVcGRhdGVFbnRyeSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sSGFzaFRhYmxlUHRyIHRhYmxlOyAvKiB0aGUgaGFzaCB0YWJsZSAqLwogICAgaW50IG5fdGFibGU7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lOwogICAgdm9pZCAqIHVzZXJkYXRhOyAvKiBhIHBvaW50ZXIgdG8gdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl91c2VyZGF0YTsKICAgIHhtbEhhc2hEZWFsbG9jYXRvciBmOyAvKiB0aGUgZGVhbGxvY2F0b3IgZnVuY3Rpb24gZm9yIHJlcGxhY2VkIGl0ZW0gKGlmIGFueSkgKi8KICAgIGludCBuX2Y7CgogICAgZm9yIChuX3RhYmxlID0gMDtuX3RhYmxlIDwgZ2VuX25iX3htbEhhc2hUYWJsZVB0cjtuX3RhYmxlKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl91c2VyZGF0YSA9IDA7bl91c2VyZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX3VzZXJkYXRhKyspIHsKICAgIGZvciAobl9mID0gMDtuX2YgPCBnZW5fbmJfeG1sSGFzaERlYWxsb2NhdG9yO25fZisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0YWJsZSA9IGdlbl94bWxIYXNoVGFibGVQdHIobl90YWJsZSwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIHVzZXJkYXRhID0gZ2VuX3VzZXJkYXRhKG5fdXNlcmRhdGEsIDIpOwogICAgICAgIGYgPSBnZW5feG1sSGFzaERlYWxsb2NhdG9yKG5fZiwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxIYXNoVXBkYXRlRW50cnkodGFibGUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgdXNlcmRhdGEsIGYpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxIYXNoVGFibGVQdHIobl90YWJsZSwgdGFibGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fdXNlcmRhdGEsIHVzZXJkYXRhLCAyKTsKICAgICAgICBkZXNfeG1sSGFzaERlYWxsb2NhdG9yKG5fZiwgZiwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxIYXNoVXBkYXRlRW50cnkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdGFibGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91c2VyZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxIYXNoVXBkYXRlRW50cnkyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxIYXNoVGFibGVQdHIgdGFibGU7IC8qIHRoZSBoYXNoIHRhYmxlICovCiAgICBpbnQgbl90YWJsZTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogbmFtZTI7IC8qIGEgc2Vjb25kIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lMjsKICAgIHZvaWQgKiB1c2VyZGF0YTsgLyogYSBwb2ludGVyIHRvIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fdXNlcmRhdGE7CiAgICB4bWxIYXNoRGVhbGxvY2F0b3IgZjsgLyogdGhlIGRlYWxsb2NhdG9yIGZ1bmN0aW9uIGZvciByZXBsYWNlZCBpdGVtIChpZiBhbnkpICovCiAgICBpbnQgbl9mOwoKICAgIGZvciAobl90YWJsZSA9IDA7bl90YWJsZSA8IGdlbl9uYl94bWxIYXNoVGFibGVQdHI7bl90YWJsZSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fbmFtZTIgPSAwO25fbmFtZTIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lMisrKSB7CiAgICBmb3IgKG5fdXNlcmRhdGEgPSAwO25fdXNlcmRhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl91c2VyZGF0YSsrKSB7CiAgICBmb3IgKG5fZiA9IDA7bl9mIDwgZ2VuX25iX3htbEhhc2hEZWFsbG9jYXRvcjtuX2YrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdGFibGUgPSBnZW5feG1sSGFzaFRhYmxlUHRyKG5fdGFibGUsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBuYW1lMiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUyLCAyKTsKICAgICAgICB1c2VyZGF0YSA9IGdlbl91c2VyZGF0YShuX3VzZXJkYXRhLCAzKTsKICAgICAgICBmID0gZ2VuX3htbEhhc2hEZWFsbG9jYXRvcihuX2YsIDQpOwoKICAgICAgICByZXRfdmFsID0geG1sSGFzaFVwZGF0ZUVudHJ5Mih0YWJsZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUyLCB1c2VyZGF0YSwgZik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEhhc2hUYWJsZVB0cihuX3RhYmxlLCB0YWJsZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lMiwgKGNvbnN0IHhtbENoYXIgKiluYW1lMiwgMik7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fdXNlcmRhdGEsIHVzZXJkYXRhLCAzKTsKICAgICAgICBkZXNfeG1sSGFzaERlYWxsb2NhdG9yKG5fZiwgZiwgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxIYXNoVXBkYXRlRW50cnkyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3RhYmxlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZTIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXNlcmRhdGEpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSGFzaFVwZGF0ZUVudHJ5Myh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sSGFzaFRhYmxlUHRyIHRhYmxlOyAvKiB0aGUgaGFzaCB0YWJsZSAqLwogICAgaW50IG5fdGFibGU7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIG5hbWUyOyAvKiBhIHNlY29uZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgaW50IG5fbmFtZTI7CiAgICB4bWxDaGFyICogbmFtZTM7IC8qIGEgdGhpcmQgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX25hbWUzOwogICAgdm9pZCAqIHVzZXJkYXRhOyAvKiBhIHBvaW50ZXIgdG8gdGhlIHVzZXJkYXRhICovCiAgICBpbnQgbl91c2VyZGF0YTsKICAgIHhtbEhhc2hEZWFsbG9jYXRvciBmOyAvKiB0aGUgZGVhbGxvY2F0b3IgZnVuY3Rpb24gZm9yIHJlcGxhY2VkIGl0ZW0gKGlmIGFueSkgKi8KICAgIGludCBuX2Y7CgogICAgZm9yIChuX3RhYmxlID0gMDtuX3RhYmxlIDwgZ2VuX25iX3htbEhhc2hUYWJsZVB0cjtuX3RhYmxlKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9uYW1lMiA9IDA7bl9uYW1lMiA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUyKyspIHsKICAgIGZvciAobl9uYW1lMyA9IDA7bl9uYW1lMyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUzKyspIHsKICAgIGZvciAobl91c2VyZGF0YSA9IDA7bl91c2VyZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX3VzZXJkYXRhKyspIHsKICAgIGZvciAobl9mID0gMDtuX2YgPCBnZW5fbmJfeG1sSGFzaERlYWxsb2NhdG9yO25fZisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0YWJsZSA9IGdlbl94bWxIYXNoVGFibGVQdHIobl90YWJsZSwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIG5hbWUyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTIsIDIpOwogICAgICAgIG5hbWUzID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZTMsIDMpOwogICAgICAgIHVzZXJkYXRhID0gZ2VuX3VzZXJkYXRhKG5fdXNlcmRhdGEsIDQpOwogICAgICAgIGYgPSBnZW5feG1sSGFzaERlYWxsb2NhdG9yKG5fZiwgNSk7CgogICAgICAgIHJldF92YWwgPSB4bWxIYXNoVXBkYXRlRW50cnkzKHRhYmxlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZTIsIChjb25zdCB4bWxDaGFyICopbmFtZTMsIHVzZXJkYXRhLCBmKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sSGFzaFRhYmxlUHRyKG5fdGFibGUsIHRhYmxlLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUyLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUyLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lMywgKGNvbnN0IHhtbENoYXIgKiluYW1lMywgMyk7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fdXNlcmRhdGEsIHVzZXJkYXRhLCA0KTsKICAgICAgICBkZXNfeG1sSGFzaERlYWxsb2NhdG9yKG5fZiwgZiwgNSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxIYXNoVXBkYXRlRW50cnkzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3RhYmxlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZTIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZTMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXNlcmRhdGEpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF9oYXNoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyBoYXNoIDogMTYgb2YgMjQgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEhhc2hBZGRFbnRyeSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxIYXNoQWRkRW50cnkyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEhhc2hBZGRFbnRyeTMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSGFzaENvcHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSGFzaENyZWF0ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxIYXNoQ3JlYXRlRGljdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxIYXNoTG9va3VwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEhhc2hMb29rdXAyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEhhc2hMb29rdXAzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEhhc2hRTG9va3VwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEhhc2hRTG9va3VwMigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxIYXNoUUxvb2t1cDMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSGFzaFJlbW92ZUVudHJ5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEhhc2hSZW1vdmVFbnRyeTIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSGFzaFJlbW92ZUVudHJ5MygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxIYXNoU2NhbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxIYXNoU2NhbjMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSGFzaFNjYW5GdWxsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEhhc2hTY2FuRnVsbDMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSGFzaFNpemUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSGFzaFVwZGF0ZUVudHJ5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEhhc2hVcGRhdGVFbnRyeTIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSGFzaFVwZGF0ZUVudHJ5MygpOwoKICAgIGlmICh0ZXN0X3JldCAhPSAwKQoJcHJpbnRmKCJNb2R1bGUgaGFzaDogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgojZGVmaW5lIGdlbl9uYl94bWxMaW5rUHRyIDEKc3RhdGljIHhtbExpbmtQdHIgZ2VuX3htbExpbmtQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbExpbmtQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbExpbmtQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxMaW5rR2V0RGF0YSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiByZXRfdmFsOwogICAgeG1sTGlua1B0ciBsazsgLyogYSBsaW5rICovCiAgICBpbnQgbl9sazsKCiAgICBmb3IgKG5fbGsgPSAwO25fbGsgPCBnZW5fbmJfeG1sTGlua1B0cjtuX2xrKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGxrID0gZ2VuX3htbExpbmtQdHIobl9saywgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxMaW5rR2V0RGF0YShsayk7CiAgICAgICAgZGVzcmV0X3ZvaWRfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTGlua1B0cihuX2xrLCBsaywgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxMaW5rR2V0RGF0YSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sayk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTGlzdEFwcGVuZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sTGlzdFB0ciBsOyAvKiBhIGxpc3QgKi8KICAgIGludCBuX2w7CiAgICB2b2lkICogZGF0YTsgLyogdGhlIGRhdGEgKi8KICAgIGludCBuX2RhdGE7CgogICAgZm9yIChuX2wgPSAwO25fbCA8IGdlbl9uYl94bWxMaXN0UHRyO25fbCsrKSB7CiAgICBmb3IgKG5fZGF0YSA9IDA7bl9kYXRhIDwgZ2VuX25iX3VzZXJkYXRhO25fZGF0YSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBsID0gZ2VuX3htbExpc3RQdHIobl9sLCAwKTsKICAgICAgICBkYXRhID0gZ2VuX3VzZXJkYXRhKG5fZGF0YSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxMaXN0QXBwZW5kKGwsIGRhdGEpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxMaXN0UHRyKG5fbCwgbCwgMCk7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fZGF0YSwgZGF0YSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxMaXN0QXBwZW5kIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2wpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTGlzdENsZWFyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTGlzdFB0ciBsOyAvKiBhIGxpc3QgKi8KICAgIGludCBuX2w7CgogICAgZm9yIChuX2wgPSAwO25fbCA8IGdlbl9uYl94bWxMaXN0UHRyO25fbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBsID0gZ2VuX3htbExpc3RQdHIobl9sLCAwKTsKCiAgICAgICAgeG1sTGlzdENsZWFyKGwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTGlzdFB0cihuX2wsIGwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTGlzdENsZWFyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2wpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKI2RlZmluZSBnZW5fbmJfY29uc3RfeG1sTGlzdFB0ciAxCnN0YXRpYyB4bWxMaXN0UHRyIGdlbl9jb25zdF94bWxMaXN0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc19jb25zdF94bWxMaXN0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxMaXN0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sTGlzdENvcHkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbExpc3RQdHIgY3VyOyAvKiB0aGUgbmV3IGxpc3QgKi8KICAgIGludCBuX2N1cjsKICAgIHhtbExpc3RQdHIgb2xkOyAvKiB0aGUgb2xkIGxpc3QgKi8KICAgIGludCBuX29sZDsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxMaXN0UHRyO25fY3VyKyspIHsKICAgIGZvciAobl9vbGQgPSAwO25fb2xkIDwgZ2VuX25iX2NvbnN0X3htbExpc3RQdHI7bl9vbGQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX3htbExpc3RQdHIobl9jdXIsIDApOwogICAgICAgIG9sZCA9IGdlbl9jb25zdF94bWxMaXN0UHRyKG5fb2xkLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbExpc3RDb3B5KGN1ciwgKGNvbnN0IHhtbExpc3RQdHIpb2xkKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTGlzdFB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sTGlzdFB0cihuX29sZCwgKGNvbnN0IHhtbExpc3RQdHIpb2xkLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbExpc3RDb3B5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vbGQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExpc3RDcmVhdGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTGlzdER1cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxMaXN0RW1wdHkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbExpc3RQdHIgbDsgLyogYSBsaXN0ICovCiAgICBpbnQgbl9sOwoKICAgIGZvciAobl9sID0gMDtuX2wgPCBnZW5fbmJfeG1sTGlzdFB0cjtuX2wrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbCA9IGdlbl94bWxMaXN0UHRyKG5fbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxMaXN0RW1wdHkobCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbExpc3RQdHIobl9sLCBsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbExpc3RFbXB0eSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxMaXN0RW5kKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExpc3RGcm9udCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxMaXN0SW5zZXJ0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxMaXN0UHRyIGw7IC8qIGEgbGlzdCAqLwogICAgaW50IG5fbDsKICAgIHZvaWQgKiBkYXRhOyAvKiB0aGUgZGF0YSAqLwogICAgaW50IG5fZGF0YTsKCiAgICBmb3IgKG5fbCA9IDA7bl9sIDwgZ2VuX25iX3htbExpc3RQdHI7bl9sKyspIHsKICAgIGZvciAobl9kYXRhID0gMDtuX2RhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl9kYXRhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGwgPSBnZW5feG1sTGlzdFB0cihuX2wsIDApOwogICAgICAgIGRhdGEgPSBnZW5fdXNlcmRhdGEobl9kYXRhLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbExpc3RJbnNlcnQobCwgZGF0YSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbExpc3RQdHIobl9sLCBsLCAwKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl9kYXRhLCBkYXRhLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbExpc3RJbnNlcnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxMaXN0TWVyZ2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxMaXN0UHRyIGwxOyAvKiB0aGUgb3JpZ2luYWwgbGlzdCAqLwogICAgaW50IG5fbDE7CiAgICB4bWxMaXN0UHRyIGwyOyAvKiB0aGUgbmV3IGxpc3QgKi8KICAgIGludCBuX2wyOwoKICAgIGZvciAobl9sMSA9IDA7bl9sMSA8IGdlbl9uYl94bWxMaXN0UHRyO25fbDErKykgewogICAgZm9yIChuX2wyID0gMDtuX2wyIDwgZ2VuX25iX3htbExpc3RQdHI7bl9sMisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBsMSA9IGdlbl94bWxMaXN0UHRyKG5fbDEsIDApOwogICAgICAgIGwyID0gZ2VuX3htbExpc3RQdHIobl9sMiwgMSk7CgogICAgICAgIHhtbExpc3RNZXJnZShsMSwgbDIpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTGlzdFB0cihuX2wxLCBsMSwgMCk7CiAgICAgICAgZGVzX3htbExpc3RQdHIobl9sMiwgbDIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTGlzdE1lcmdlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2wxKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2wyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxMaXN0UG9wQmFjayh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbExpc3RQdHIgbDsgLyogYSBsaXN0ICovCiAgICBpbnQgbl9sOwoKICAgIGZvciAobl9sID0gMDtuX2wgPCBnZW5fbmJfeG1sTGlzdFB0cjtuX2wrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbCA9IGdlbl94bWxMaXN0UHRyKG5fbCwgMCk7CgogICAgICAgIHhtbExpc3RQb3BCYWNrKGwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTGlzdFB0cihuX2wsIGwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTGlzdFBvcEJhY2siLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTGlzdFBvcEZyb250KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTGlzdFB0ciBsOyAvKiBhIGxpc3QgKi8KICAgIGludCBuX2w7CgogICAgZm9yIChuX2wgPSAwO25fbCA8IGdlbl9uYl94bWxMaXN0UHRyO25fbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBsID0gZ2VuX3htbExpc3RQdHIobl9sLCAwKTsKCiAgICAgICAgeG1sTGlzdFBvcEZyb250KGwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTGlzdFB0cihuX2wsIGwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTGlzdFBvcEZyb250IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2wpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExpc3RQdXNoQmFjayh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sTGlzdFB0ciBsOyAvKiBhIGxpc3QgKi8KICAgIGludCBuX2w7CiAgICB2b2lkICogZGF0YTsgLyogbmV3IGRhdGEgKi8KICAgIGludCBuX2RhdGE7CgogICAgZm9yIChuX2wgPSAwO25fbCA8IGdlbl9uYl94bWxMaXN0UHRyO25fbCsrKSB7CiAgICBmb3IgKG5fZGF0YSA9IDA7bl9kYXRhIDwgZ2VuX25iX3VzZXJkYXRhO25fZGF0YSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBsID0gZ2VuX3htbExpc3RQdHIobl9sLCAwKTsKICAgICAgICBkYXRhID0gZ2VuX3VzZXJkYXRhKG5fZGF0YSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxMaXN0UHVzaEJhY2sobCwgZGF0YSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbExpc3RQdHIobl9sLCBsLCAwKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl9kYXRhLCBkYXRhLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbExpc3RQdXNoQmFjayIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RhdGEpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExpc3RQdXNoRnJvbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbExpc3RQdHIgbDsgLyogYSBsaXN0ICovCiAgICBpbnQgbl9sOwogICAgdm9pZCAqIGRhdGE7IC8qIG5ldyBkYXRhICovCiAgICBpbnQgbl9kYXRhOwoKICAgIGZvciAobl9sID0gMDtuX2wgPCBnZW5fbmJfeG1sTGlzdFB0cjtuX2wrKykgewogICAgZm9yIChuX2RhdGEgPSAwO25fZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX2RhdGErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbCA9IGdlbl94bWxMaXN0UHRyKG5fbCwgMCk7CiAgICAgICAgZGF0YSA9IGdlbl91c2VyZGF0YShuX2RhdGEsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTGlzdFB1c2hGcm9udChsLCBkYXRhKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTGlzdFB0cihuX2wsIGwsIDApOwogICAgICAgIGRlc191c2VyZGF0YShuX2RhdGEsIGRhdGEsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTGlzdFB1c2hGcm9udCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RhdGEpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExpc3RSZW1vdmVBbGwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbExpc3RQdHIgbDsgLyogYSBsaXN0ICovCiAgICBpbnQgbl9sOwogICAgdm9pZCAqIGRhdGE7IC8qIGxpc3QgZGF0YSAqLwogICAgaW50IG5fZGF0YTsKCiAgICBmb3IgKG5fbCA9IDA7bl9sIDwgZ2VuX25iX3htbExpc3RQdHI7bl9sKyspIHsKICAgIGZvciAobl9kYXRhID0gMDtuX2RhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl9kYXRhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGwgPSBnZW5feG1sTGlzdFB0cihuX2wsIDApOwogICAgICAgIGRhdGEgPSBnZW5fdXNlcmRhdGEobl9kYXRhLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbExpc3RSZW1vdmVBbGwobCwgZGF0YSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbExpc3RQdHIobl9sLCBsLCAwKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl9kYXRhLCBkYXRhLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbExpc3RSZW1vdmVBbGwiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxMaXN0UmVtb3ZlRmlyc3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbExpc3RQdHIgbDsgLyogYSBsaXN0ICovCiAgICBpbnQgbl9sOwogICAgdm9pZCAqIGRhdGE7IC8qIGxpc3QgZGF0YSAqLwogICAgaW50IG5fZGF0YTsKCiAgICBmb3IgKG5fbCA9IDA7bl9sIDwgZ2VuX25iX3htbExpc3RQdHI7bl9sKyspIHsKICAgIGZvciAobl9kYXRhID0gMDtuX2RhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl9kYXRhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGwgPSBnZW5feG1sTGlzdFB0cihuX2wsIDApOwogICAgICAgIGRhdGEgPSBnZW5fdXNlcmRhdGEobl9kYXRhLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbExpc3RSZW1vdmVGaXJzdChsLCBkYXRhKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTGlzdFB0cihuX2wsIGwsIDApOwogICAgICAgIGRlc191c2VyZGF0YShuX2RhdGEsIGRhdGEsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTGlzdFJlbW92ZUZpcnN0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2wpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTGlzdFJlbW92ZUxhc3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbExpc3RQdHIgbDsgLyogYSBsaXN0ICovCiAgICBpbnQgbl9sOwogICAgdm9pZCAqIGRhdGE7IC8qIGxpc3QgZGF0YSAqLwogICAgaW50IG5fZGF0YTsKCiAgICBmb3IgKG5fbCA9IDA7bl9sIDwgZ2VuX25iX3htbExpc3RQdHI7bl9sKyspIHsKICAgIGZvciAobl9kYXRhID0gMDtuX2RhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl9kYXRhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGwgPSBnZW5feG1sTGlzdFB0cihuX2wsIDApOwogICAgICAgIGRhdGEgPSBnZW5fdXNlcmRhdGEobl9kYXRhLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbExpc3RSZW1vdmVMYXN0KGwsIGRhdGEpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxMaXN0UHRyKG5fbCwgbCwgMCk7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fZGF0YSwgZGF0YSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxMaXN0UmVtb3ZlTGFzdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RhdGEpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExpc3RSZXZlcnNlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTGlzdFB0ciBsOyAvKiBhIGxpc3QgKi8KICAgIGludCBuX2w7CgogICAgZm9yIChuX2wgPSAwO25fbCA8IGdlbl9uYl94bWxMaXN0UHRyO25fbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBsID0gZ2VuX3htbExpc3RQdHIobl9sLCAwKTsKCiAgICAgICAgeG1sTGlzdFJldmVyc2UobCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxMaXN0UHRyKG5fbCwgbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxMaXN0UmV2ZXJzZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxMaXN0UmV2ZXJzZVNlYXJjaCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiByZXRfdmFsOwogICAgeG1sTGlzdFB0ciBsOyAvKiBhIGxpc3QgKi8KICAgIGludCBuX2w7CiAgICB2b2lkICogZGF0YTsgLyogYSBzZWFyY2ggdmFsdWUgKi8KICAgIGludCBuX2RhdGE7CgogICAgZm9yIChuX2wgPSAwO25fbCA8IGdlbl9uYl94bWxMaXN0UHRyO25fbCsrKSB7CiAgICBmb3IgKG5fZGF0YSA9IDA7bl9kYXRhIDwgZ2VuX25iX3VzZXJkYXRhO25fZGF0YSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBsID0gZ2VuX3htbExpc3RQdHIobl9sLCAwKTsKICAgICAgICBkYXRhID0gZ2VuX3VzZXJkYXRhKG5fZGF0YSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxMaXN0UmV2ZXJzZVNlYXJjaChsLCBkYXRhKTsKICAgICAgICBkZXNyZXRfdm9pZF9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxMaXN0UHRyKG5fbCwgbCwgMCk7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fZGF0YSwgZGF0YSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxMaXN0UmV2ZXJzZVNlYXJjaCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RhdGEpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExpc3RSZXZlcnNlV2Fsayh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxMaXN0U2VhcmNoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIHJldF92YWw7CiAgICB4bWxMaXN0UHRyIGw7IC8qIGEgbGlzdCAqLwogICAgaW50IG5fbDsKICAgIHZvaWQgKiBkYXRhOyAvKiBhIHNlYXJjaCB2YWx1ZSAqLwogICAgaW50IG5fZGF0YTsKCiAgICBmb3IgKG5fbCA9IDA7bl9sIDwgZ2VuX25iX3htbExpc3RQdHI7bl9sKyspIHsKICAgIGZvciAobl9kYXRhID0gMDtuX2RhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl9kYXRhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGwgPSBnZW5feG1sTGlzdFB0cihuX2wsIDApOwogICAgICAgIGRhdGEgPSBnZW5fdXNlcmRhdGEobl9kYXRhLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbExpc3RTZWFyY2gobCwgZGF0YSk7CiAgICAgICAgZGVzcmV0X3ZvaWRfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTGlzdFB0cihuX2wsIGwsIDApOwogICAgICAgIGRlc191c2VyZGF0YShuX2RhdGEsIGRhdGEsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTGlzdFNlYXJjaCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RhdGEpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExpc3RTaXplKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxMaXN0UHRyIGw7IC8qIGEgbGlzdCAqLwogICAgaW50IG5fbDsKCiAgICBmb3IgKG5fbCA9IDA7bl9sIDwgZ2VuX25iX3htbExpc3RQdHI7bl9sKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGwgPSBnZW5feG1sTGlzdFB0cihuX2wsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sTGlzdFNpemUobCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbExpc3RQdHIobl9sLCBsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbExpc3RTaXplIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2wpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExpc3RTb3J0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTGlzdFB0ciBsOyAvKiBhIGxpc3QgKi8KICAgIGludCBuX2w7CgogICAgZm9yIChuX2wgPSAwO25fbCA8IGdlbl9uYl94bWxMaXN0UHRyO25fbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBsID0gZ2VuX3htbExpc3RQdHIobl9sLCAwKTsKCiAgICAgICAgeG1sTGlzdFNvcnQobCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxMaXN0UHRyKG5fbCwgbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxMaXN0U29ydCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxMaXN0V2Fsayh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X2xpc3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIGxpc3QgOiAxOSBvZiAyNiBmdW5jdGlvbnMgLi4uXG4iKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTGlua0dldERhdGEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTGlzdEFwcGVuZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaXN0Q2xlYXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTGlzdENvcHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTGlzdENyZWF0ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaXN0RHVwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbExpc3RFbXB0eSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaXN0RW5kKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbExpc3RGcm9udCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaXN0SW5zZXJ0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbExpc3RNZXJnZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaXN0UG9wQmFjaygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaXN0UG9wRnJvbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTGlzdFB1c2hCYWNrKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbExpc3RQdXNoRnJvbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTGlzdFJlbW92ZUFsbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaXN0UmVtb3ZlRmlyc3QoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTGlzdFJlbW92ZUxhc3QoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTGlzdFJldmVyc2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTGlzdFJldmVyc2VTZWFyY2goKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTGlzdFJldmVyc2VXYWxrKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbExpc3RTZWFyY2goKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTGlzdFNpemUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTGlzdFNvcnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTGlzdFdhbGsoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIGxpc3Q6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbE5hbm9GVFBDaGVja1Jlc3BvbnNlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfRlRQX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHZvaWQgKiBjdHg7IC8qIGFuIEZUUCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHg7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfeG1sTmFub0ZUUEN0eHRQdHI7bl9jdHgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3htbE5hbm9GVFBDdHh0UHRyKG5fY3R4LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9GVFBDaGVja1Jlc3BvbnNlKGN0eCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5hbm9GVFBDdHh0UHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmFub0ZUUENoZWNrUmVzcG9uc2UiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0ZUUENsZWFudXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9GVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKCiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKCiAgICAgICAgeG1sTmFub0ZUUENsZWFudXAoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOYW5vRlRQQ2xlYW51cCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5hbm9GVFBDbG9zZUNvbm5lY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9GVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogYW4gRlRQIGNvbnRleHQgKi8KICAgIGludCBuX2N0eDsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl94bWxOYW5vRlRQQ3R4dFB0cjtuX2N0eCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5feG1sTmFub0ZUUEN0eHRQdHIobl9jdHgsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sTmFub0ZUUENsb3NlQ29ubmVjdGlvbihjdHgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOYW5vRlRQQ3R4dFB0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9GVFBDbG9zZUNvbm5lY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0ZUUEN3ZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0ZUUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB2b2lkICogY3R4OyAvKiBhbiBGVFAgY29udGV4dCAqLwogICAgaW50IG5fY3R4OwogICAgY2hhciAqIGRpcmVjdG9yeTsgLyogYSBkaXJlY3Rvcnkgb24gdGhlIHNlcnZlciAqLwogICAgaW50IG5fZGlyZWN0b3J5OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3htbE5hbm9GVFBDdHh0UHRyO25fY3R4KyspIHsKICAgIGZvciAobl9kaXJlY3RvcnkgPSAwO25fZGlyZWN0b3J5IDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZGlyZWN0b3J5KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl94bWxOYW5vRlRQQ3R4dFB0cihuX2N0eCwgMCk7CiAgICAgICAgZGlyZWN0b3J5ID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZGlyZWN0b3J5LCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9GVFBDd2QoY3R4LCAoY29uc3QgY2hhciAqKWRpcmVjdG9yeSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5hbm9GVFBDdHh0UHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2RpcmVjdG9yeSwgKGNvbnN0IGNoYXIgKilkaXJlY3RvcnksIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmFub0ZUUEN3ZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGlyZWN0b3J5KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0ZUUERlbGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9GVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogYW4gRlRQIGNvbnRleHQgKi8KICAgIGludCBuX2N0eDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlOyAvKiBhIGZpbGUgb3IgZGlyZWN0b3J5IG9uIHRoZSBzZXJ2ZXIgKi8KICAgIGludCBuX2ZpbGU7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfeG1sTmFub0ZUUEN0eHRQdHI7bl9jdHgrKykgewogICAgZm9yIChuX2ZpbGUgPSAwO25fZmlsZSA8IGdlbl9uYl9maWxlcGF0aDtuX2ZpbGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3htbE5hbm9GVFBDdHh0UHRyKG5fY3R4LCAwKTsKICAgICAgICBmaWxlID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOYW5vRlRQRGVsZShjdHgsIGZpbGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOYW5vRlRQQ3R4dFB0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICBkZXNfZmlsZXBhdGgobl9maWxlLCBmaWxlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9GVFBEZWxlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0ZUUEdldCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOYW5vRlRQR2V0Q29ubmVjdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOYW5vRlRQR2V0UmVzcG9uc2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9GVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogYW4gRlRQIGNvbnRleHQgKi8KICAgIGludCBuX2N0eDsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl94bWxOYW5vRlRQQ3R4dFB0cjtuX2N0eCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5feG1sTmFub0ZUUEN0eHRQdHIobl9jdHgsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sTmFub0ZUUEdldFJlc3BvbnNlKGN0eCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5hbm9GVFBDdHh0UHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmFub0ZUUEdldFJlc3BvbnNlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5hbm9GVFBHZXRTb2NrZXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0ZUUEluaXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9GVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKCiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKCiAgICAgICAgeG1sTmFub0ZUUEluaXQoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOYW5vRlRQSW5pdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5hbm9GVFBMaXN0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5hbm9GVFBOZXdDdHh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfRlRQX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB2b2lkICogcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiBVUkw7IC8qIFRoZSBVUkwgdXNlZCB0byBpbml0aWFsaXplIHRoZSBjb250ZXh0ICovCiAgICBpbnQgbl9VUkw7CgogICAgZm9yIChuX1VSTCA9IDA7bl9VUkwgPCBnZW5fbmJfZmlsZXBhdGg7bl9VUkwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgVVJMID0gZ2VuX2ZpbGVwYXRoKG5fVVJMLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9GVFBOZXdDdHh0KFVSTCk7CiAgICAgICAgZGVzcmV0X3htbE5hbm9GVFBDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZXBhdGgobl9VUkwsIFVSTCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOYW5vRlRQTmV3Q3R4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOYW5vRlRQT3Blbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0ZUUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIHJldF92YWw7CiAgICBjb25zdCBjaGFyICogVVJMOyAvKiB0aGUgVVJMIHRvIHRoZSByZXNvdXJjZSAqLwogICAgaW50IG5fVVJMOwoKICAgIGZvciAobl9VUkwgPSAwO25fVVJMIDwgZ2VuX25iX2ZpbGVwYXRoO25fVVJMKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIFVSTCA9IGdlbl9maWxlcGF0aChuX1VSTCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxOYW5vRlRQT3BlbihVUkwpOwogICAgICAgIGRlc3JldF94bWxOYW5vRlRQQ3R4dFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fVVJMLCBVUkwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmFub0ZUUE9wZW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJMKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0ZUUFByb3h5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfRlRQX0VOQUJMRUQpCiAgICBjaGFyICogaG9zdDsgLyogdGhlIHByb3h5IGhvc3QgbmFtZSAqLwogICAgaW50IG5faG9zdDsKICAgIGludCBwb3J0OyAvKiB0aGUgcHJveHkgcG9ydCAqLwogICAgaW50IG5fcG9ydDsKICAgIGNoYXIgKiB1c2VyOyAvKiB0aGUgcHJveHkgdXNlciBuYW1lICovCiAgICBpbnQgbl91c2VyOwogICAgY2hhciAqIHBhc3N3ZDsgLyogdGhlIHByb3h5IHBhc3N3b3JkICovCiAgICBpbnQgbl9wYXNzd2Q7CiAgICBpbnQgdHlwZTsgLyogdGhlIHR5cGUgb2YgcHJveHkgMSBmb3IgdXNpbmcgU0lURSwgMiBmb3IgVVNFUiBhQGIgKi8KICAgIGludCBuX3R5cGU7CgogICAgZm9yIChuX2hvc3QgPSAwO25faG9zdCA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2hvc3QrKykgewogICAgZm9yIChuX3BvcnQgPSAwO25fcG9ydCA8IGdlbl9uYl9pbnQ7bl9wb3J0KyspIHsKICAgIGZvciAobl91c2VyID0gMDtuX3VzZXIgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl91c2VyKyspIHsKICAgIGZvciAobl9wYXNzd2QgPSAwO25fcGFzc3dkIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fcGFzc3dkKyspIHsKICAgIGZvciAobl90eXBlID0gMDtuX3R5cGUgPCBnZW5fbmJfaW50O25fdHlwZSsrKSB7CiAgICAgICAgaG9zdCA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2hvc3QsIDApOwogICAgICAgIHBvcnQgPSBnZW5faW50KG5fcG9ydCwgMSk7CiAgICAgICAgdXNlciA9IGdlbl9jb25zdF9jaGFyX3B0cihuX3VzZXIsIDIpOwogICAgICAgIHBhc3N3ZCA9IGdlbl9jb25zdF9jaGFyX3B0cihuX3Bhc3N3ZCwgMyk7CiAgICAgICAgdHlwZSA9IGdlbl9pbnQobl90eXBlLCA0KTsKCiAgICAgICAgeG1sTmFub0ZUUFByb3h5KChjb25zdCBjaGFyICopaG9zdCwgcG9ydCwgKGNvbnN0IGNoYXIgKil1c2VyLCAoY29uc3QgY2hhciAqKXBhc3N3ZCwgdHlwZSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2hvc3QsIChjb25zdCBjaGFyICopaG9zdCwgMCk7CiAgICAgICAgZGVzX2ludChuX3BvcnQsIHBvcnQsIDEpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX3VzZXIsIChjb25zdCBjaGFyICopdXNlciwgMik7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fcGFzc3dkLCAoY29uc3QgY2hhciAqKXBhc3N3ZCwgMyk7CiAgICAgICAgZGVzX2ludChuX3R5cGUsIHR5cGUsIDQpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5hbm9GVFBRdWl0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfRlRQX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHZvaWQgKiBjdHg7IC8qIGFuIEZUUCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHg7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfeG1sTmFub0ZUUEN0eHRQdHI7bl9jdHgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX3htbE5hbm9GVFBDdHh0UHRyKG5fY3R4LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9GVFBRdWl0KGN0eCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5hbm9GVFBDdHh0UHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmFub0ZUUFF1aXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0ZUUFJlYWQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9GVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIEZUUCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHg7CiAgICB2b2lkICogZGVzdDsgLyogYSBidWZmZXIgKi8KICAgIGludCBuX2Rlc3Q7CiAgICBpbnQgbGVuOyAvKiB0aGUgYnVmZmVyIGxlbmd0aCAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3htbE5hbm9GVFBDdHh0UHRyO25fY3R4KyspIHsKICAgIGZvciAobl9kZXN0ID0gMDtuX2Rlc3QgPCBnZW5fbmJfdm9pZF9wdHI7bl9kZXN0KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5feG1sTmFub0ZUUEN0eHRQdHIobl9jdHgsIDApOwogICAgICAgIGRlc3QgPSBnZW5fdm9pZF9wdHIobl9kZXN0LCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9GVFBSZWFkKGN0eCwgZGVzdCwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTmFub0ZUUEN0eHRQdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fZGVzdCwgZGVzdCwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9GVFBSZWFkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kZXN0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5hbm9GVFBTY2FuUHJveHkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9GVFBfRU5BQkxFRCkKICAgIGNvbnN0IGNoYXIgKiBVUkw7IC8qIFRoZSBwcm94eSBVUkwgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwcm94eSBjb250ZXh0ICovCiAgICBpbnQgbl9VUkw7CgogICAgZm9yIChuX1VSTCA9IDA7bl9VUkwgPCBnZW5fbmJfZmlsZXBhdGg7bl9VUkwrKykgewogICAgICAgIFVSTCA9IGdlbl9maWxlcGF0aChuX1VSTCwgMCk7CgogICAgICAgIHhtbE5hbm9GVFBTY2FuUHJveHkoVVJMKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fVVJMLCBVUkwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5hbm9GVFBVcGRhdGVVUkwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9GVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogYW4gRlRQIGNvbnRleHQgKi8KICAgIGludCBuX2N0eDsKICAgIGNvbnN0IGNoYXIgKiBVUkw7IC8qIFRoZSBVUkwgdXNlZCB0byB1cGRhdGUgdGhlIGNvbnRleHQgKi8KICAgIGludCBuX1VSTDsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl94bWxOYW5vRlRQQ3R4dFB0cjtuX2N0eCsrKSB7CiAgICBmb3IgKG5fVVJMID0gMDtuX1VSTCA8IGdlbl9uYl9maWxlcGF0aDtuX1VSTCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5feG1sTmFub0ZUUEN0eHRQdHIobl9jdHgsIDApOwogICAgICAgIFVSTCA9IGdlbl9maWxlcGF0aChuX1VSTCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOYW5vRlRQVXBkYXRlVVJMKGN0eCwgVVJMKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTmFub0ZUUEN0eHRQdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fVVJMLCBVUkwsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmFub0ZUUFVwZGF0ZVVSTCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJMKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF9uYW5vZnRwKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyBuYW5vZnRwIDogMTQgb2YgMjIgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBDaGVja1Jlc3BvbnNlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBDbGVhbnVwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBDbG9zZUNvbm5lY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmFub0ZUUEN3ZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vRlRQRGVsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vRlRQR2V0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBHZXRDb25uZWN0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBHZXRSZXNwb25zZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vRlRQR2V0U29ja2V0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBJbml0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBMaXN0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBOZXdDdHh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBPcGVuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBQcm94eSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vRlRQUXVpdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vRlRQUmVhZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vRlRQU2NhblByb3h5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9GVFBVcGRhdGVVUkwoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIG5hbm9mdHA6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbE5hbm9IVFRQQXV0aEhlYWRlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IGNoYXIgKiByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIEhUVFAgY29udGV4dCAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3htbE5hbm9IVFRQQ3R4dFB0cjtuX2N0eCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5feG1sTmFub0hUVFBDdHh0UHRyKG5fY3R4LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9IVFRQQXV0aEhlYWRlcihjdHgpOwogICAgICAgIGRlc3JldF9jb25zdF9jaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5hbm9IVFRQQ3R4dFB0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9IVFRQQXV0aEhlYWRlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOYW5vSFRUUENsZWFudXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVFRQX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CgogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CgogICAgICAgIHhtbE5hbm9IVFRQQ2xlYW51cCgpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9IVFRQQ2xlYW51cCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5hbm9IVFRQQ29udGVudExlbmd0aCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIEhUVFAgY29udGV4dCAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3htbE5hbm9IVFRQQ3R4dFB0cjtuX2N0eCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5feG1sTmFub0hUVFBDdHh0UHRyKG5fY3R4LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9IVFRQQ29udGVudExlbmd0aChjdHgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOYW5vSFRUUEN0eHRQdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOYW5vSFRUUENvbnRlbnRMZW5ndGgiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0hUVFBFbmNvZGluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IGNoYXIgKiByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIEhUVFAgY29udGV4dCAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3htbE5hbm9IVFRQQ3R4dFB0cjtuX2N0eCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5feG1sTmFub0hUVFBDdHh0UHRyKG5fY3R4LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9IVFRQRW5jb2RpbmcoY3R4KTsKICAgICAgICBkZXNyZXRfY29uc3RfY2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOYW5vSFRUUEN0eHRQdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOYW5vSFRUUEVuY29kaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKI2RlZmluZSBnZW5fbmJfY2hhcl9wdHJfcHRyIDEKc3RhdGljIGNoYXIgKiogZ2VuX2NoYXJfcHRyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfY2hhcl9wdHJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjaGFyICoqIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0hUVFBGZXRjaCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIFVSTDsgLyogVGhlIFVSTCB0byBsb2FkICovCiAgICBpbnQgbl9VUkw7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBmaWxlbmFtZSB3aGVyZSB0aGUgY29udGVudCBzaG91bGQgYmUgc2F2ZWQgKi8KICAgIGludCBuX2ZpbGVuYW1lOwogICAgY2hhciAqKiBjb250ZW50VHlwZTsgLyogaWYgYXZhaWxhYmxlIHRoZSBDb250ZW50LVR5cGUgaW5mb3JtYXRpb24gd2lsbCBiZSByZXR1cm5lZCBhdCB0aGF0IGxvY2F0aW9uICovCiAgICBpbnQgbl9jb250ZW50VHlwZTsKCiAgICBmb3IgKG5fVVJMID0gMDtuX1VSTCA8IGdlbl9uYl9maWxlb3V0cHV0O25fVVJMKyspIHsKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlb3V0cHV0O25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX2NvbnRlbnRUeXBlID0gMDtuX2NvbnRlbnRUeXBlIDwgZ2VuX25iX2NoYXJfcHRyX3B0cjtuX2NvbnRlbnRUeXBlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIFVSTCA9IGdlbl9maWxlb3V0cHV0KG5fVVJMLCAwKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlb3V0cHV0KG5fZmlsZW5hbWUsIDEpOwogICAgICAgIGNvbnRlbnRUeXBlID0gZ2VuX2NoYXJfcHRyX3B0cihuX2NvbnRlbnRUeXBlLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9IVFRQRmV0Y2goVVJMLCBmaWxlbmFtZSwgY29udGVudFR5cGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlb3V0cHV0KG5fVVJMLCBVUkwsIDApOwogICAgICAgIGRlc19maWxlb3V0cHV0KG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAxKTsKICAgICAgICBkZXNfY2hhcl9wdHJfcHRyKG5fY29udGVudFR5cGUsIGNvbnRlbnRUeXBlLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9IVFRQRmV0Y2giLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJMKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnRUeXBlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0hUVFBJbml0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRUUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwoKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwoKICAgICAgICB4bWxOYW5vSFRUUEluaXQoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOYW5vSFRUUEluaXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOYW5vSFRUUE1pbWVUeXBlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRUUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgY2hhciAqIHJldF92YWw7CiAgICB2b2lkICogY3R4OyAvKiB0aGUgSFRUUCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHg7CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfeG1sTmFub0hUVFBDdHh0UHRyO25fY3R4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl94bWxOYW5vSFRUUEN0eHRQdHIobl9jdHgsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sTmFub0hUVFBNaW1lVHlwZShjdHgpOwogICAgICAgIGRlc3JldF9jb25zdF9jaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5hbm9IVFRQQ3R4dFB0cihuX2N0eCwgY3R4LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9IVFRQTWltZVR5cGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0hUVFBPcGVuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRUUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIHJldF92YWw7CiAgICBjb25zdCBjaGFyICogVVJMOyAvKiBUaGUgVVJMIHRvIGxvYWQgKi8KICAgIGludCBuX1VSTDsKICAgIGNoYXIgKiogY29udGVudFR5cGU7IC8qIGlmIGF2YWlsYWJsZSB0aGUgQ29udGVudC1UeXBlIGluZm9ybWF0aW9uIHdpbGwgYmUgcmV0dXJuZWQgYXQgdGhhdCBsb2NhdGlvbiAqLwogICAgaW50IG5fY29udGVudFR5cGU7CgogICAgZm9yIChuX1VSTCA9IDA7bl9VUkwgPCBnZW5fbmJfZmlsZXBhdGg7bl9VUkwrKykgewogICAgZm9yIChuX2NvbnRlbnRUeXBlID0gMDtuX2NvbnRlbnRUeXBlIDwgZ2VuX25iX2NoYXJfcHRyX3B0cjtuX2NvbnRlbnRUeXBlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIFVSTCA9IGdlbl9maWxlcGF0aChuX1VSTCwgMCk7CiAgICAgICAgY29udGVudFR5cGUgPSBnZW5fY2hhcl9wdHJfcHRyKG5fY29udGVudFR5cGUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTmFub0hUVFBPcGVuKFVSTCwgY29udGVudFR5cGUpOwogICAgICAgIGRlc3JldF94bWxOYW5vSFRUUEN0eHRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlcGF0aChuX1VSTCwgVVJMLCAwKTsKICAgICAgICBkZXNfY2hhcl9wdHJfcHRyKG5fY29udGVudFR5cGUsIGNvbnRlbnRUeXBlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9IVFRQT3BlbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudFR5cGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOYW5vSFRUUE9wZW5SZWRpcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIFVSTDsgLyogVGhlIFVSTCB0byBsb2FkICovCiAgICBpbnQgbl9VUkw7CiAgICBjaGFyICoqIGNvbnRlbnRUeXBlOyAvKiBpZiBhdmFpbGFibGUgdGhlIENvbnRlbnQtVHlwZSBpbmZvcm1hdGlvbiB3aWxsIGJlIHJldHVybmVkIGF0IHRoYXQgbG9jYXRpb24gKi8KICAgIGludCBuX2NvbnRlbnRUeXBlOwogICAgY2hhciAqKiByZWRpcjsgLyogaWYgYXZhaWxhYmxlIHRoZSByZWRpcmVjdGVkIFVSTCB3aWxsIGJlIHJldHVybmVkICovCiAgICBpbnQgbl9yZWRpcjsKCiAgICBmb3IgKG5fVVJMID0gMDtuX1VSTCA8IGdlbl9uYl9maWxlcGF0aDtuX1VSTCsrKSB7CiAgICBmb3IgKG5fY29udGVudFR5cGUgPSAwO25fY29udGVudFR5cGUgPCBnZW5fbmJfY2hhcl9wdHJfcHRyO25fY29udGVudFR5cGUrKykgewogICAgZm9yIChuX3JlZGlyID0gMDtuX3JlZGlyIDwgZ2VuX25iX2NoYXJfcHRyX3B0cjtuX3JlZGlyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIFVSTCA9IGdlbl9maWxlcGF0aChuX1VSTCwgMCk7CiAgICAgICAgY29udGVudFR5cGUgPSBnZW5fY2hhcl9wdHJfcHRyKG5fY29udGVudFR5cGUsIDEpOwogICAgICAgIHJlZGlyID0gZ2VuX2NoYXJfcHRyX3B0cihuX3JlZGlyLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9IVFRQT3BlblJlZGlyKFVSTCwgY29udGVudFR5cGUsIHJlZGlyKTsKICAgICAgICBkZXNyZXRfeG1sTmFub0hUVFBDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZXBhdGgobl9VUkwsIFVSTCwgMCk7CiAgICAgICAgZGVzX2NoYXJfcHRyX3B0cihuX2NvbnRlbnRUeXBlLCBjb250ZW50VHlwZSwgMSk7CiAgICAgICAgZGVzX2NoYXJfcHRyX3B0cihuX3JlZGlyLCByZWRpciwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOYW5vSFRUUE9wZW5SZWRpciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudFR5cGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVkaXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOYW5vSFRUUFJlYWQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVFRQX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHZvaWQgKiBjdHg7IC8qIHRoZSBIVFRQIGNvbnRleHQgKi8KICAgIGludCBuX2N0eDsKICAgIHZvaWQgKiBkZXN0OyAvKiBhIGJ1ZmZlciAqLwogICAgaW50IG5fZGVzdDsKICAgIGludCBsZW47IC8qIHRoZSBidWZmZXIgbGVuZ3RoICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfeG1sTmFub0hUVFBDdHh0UHRyO25fY3R4KyspIHsKICAgIGZvciAobl9kZXN0ID0gMDtuX2Rlc3QgPCBnZW5fbmJfdm9pZF9wdHI7bl9kZXN0KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5feG1sTmFub0hUVFBDdHh0UHRyKG5fY3R4LCAwKTsKICAgICAgICBkZXN0ID0gZ2VuX3ZvaWRfcHRyKG5fZGVzdCwgMSk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxOYW5vSFRUUFJlYWQoY3R4LCBkZXN0LCBsZW4pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOYW5vSFRUUEN0eHRQdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fZGVzdCwgZGVzdCwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9IVFRQUmVhZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGVzdCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOYW5vSFRUUFJlZGlyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5hbm9IVFRQUmV0dXJuQ29kZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGN0eDsgLyogdGhlIEhUVFAgY29udGV4dCAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3htbE5hbm9IVFRQQ3R4dFB0cjtuX2N0eCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHggPSBnZW5feG1sTmFub0hUVFBDdHh0UHRyKG5fY3R4LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5hbm9IVFRQUmV0dXJuQ29kZShjdHgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOYW5vSFRUUEN0eHRQdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOYW5vSFRUUFJldHVybkNvZGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0hUVFBTYXZlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRUUF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGN0eHQ7IC8qIHRoZSBIVFRQIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBmaWxlbmFtZSB3aGVyZSB0aGUgY29udGVudCBzaG91bGQgYmUgc2F2ZWQgKi8KICAgIGludCBuX2ZpbGVuYW1lOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfdm9pZF9wdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlb3V0cHV0O25fZmlsZW5hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl92b2lkX3B0cihuX2N0eHQsIDApOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVvdXRwdXQobl9maWxlbmFtZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOYW5vSFRUUFNhdmUoY3R4dCwgZmlsZW5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19maWxlb3V0cHV0KG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5hbm9IVFRQU2F2ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmFub0hUVFBTY2FuUHJveHkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVFRQX0VOQUJMRUQpCiAgICBjb25zdCBjaGFyICogVVJMOyAvKiBUaGUgcHJveHkgVVJMIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcHJveHkgY29udGV4dCAqLwogICAgaW50IG5fVVJMOwoKICAgIGZvciAobl9VUkwgPSAwO25fVVJMIDwgZ2VuX25iX2ZpbGVwYXRoO25fVVJMKyspIHsKICAgICAgICBVUkwgPSBnZW5fZmlsZXBhdGgobl9VUkwsIDApOwoKICAgICAgICB4bWxOYW5vSFRUUFNjYW5Qcm94eShVUkwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZXBhdGgobl9VUkwsIFVSTCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF9uYW5vaHR0cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgbmFub2h0dHAgOiAxMyBvZiAxNyBmdW5jdGlvbnMgLi4uXG4iKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmFub0hUVFBBdXRoSGVhZGVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9IVFRQQ2xlYW51cCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vSFRUUENvbnRlbnRMZW5ndGgoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmFub0hUVFBFbmNvZGluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vSFRUUEZldGNoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9IVFRQSW5pdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vSFRUUE1pbWVUeXBlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9IVFRQT3BlbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vSFRUUE9wZW5SZWRpcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vSFRUUFJlYWQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmFub0hUVFBSZWRpcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOYW5vSFRUUFJldHVybkNvZGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmFub0hUVFBTYXZlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5hbm9IVFRQU2NhblByb3h5KCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSBuYW5vaHR0cDogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sQnl0ZUNvbnN1bWVkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgbG9uZyByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEJ5dGVDb25zdW1lZChjdHh0KTsKICAgICAgICBkZXNyZXRfbG9uZyhyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEJ5dGVDb25zdW1lZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDbGVhck5vZGVJbmZvU2VxKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VyTm9kZUluZm9TZXFQdHIgc2VxOyAvKiBhIG5vZGUgaW5mbyBzZXF1ZW5jZSBwb2ludGVyICovCiAgICBpbnQgbl9zZXE7CgogICAgZm9yIChuX3NlcSA9IDA7bl9zZXEgPCBnZW5fbmJfeG1sUGFyc2VyTm9kZUluZm9TZXFQdHI7bl9zZXErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc2VxID0gZ2VuX3htbFBhcnNlck5vZGVJbmZvU2VxUHRyKG5fc2VxLCAwKTsKCiAgICAgICAgeG1sQ2xlYXJOb2RlSW5mb1NlcShzZXEpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyTm9kZUluZm9TZXFQdHIobl9zZXEsIHNlcSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDbGVhck5vZGVJbmZvU2VxIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NlcSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ2xlYXJQYXJzZXJDdHh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgeG1sQ2xlYXJQYXJzZXJDdHh0KGN0eHQpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ2xlYXJQYXJzZXJDdHh0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENyZWF0ZURvY1BhcnNlckN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJDdHh0UHRyIHJldF92YWw7CiAgICB4bWxDaGFyICogY3VyOyAvKiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgeG1sQ2hhciAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2N1ciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxDcmVhdGVEb2NQYXJzZXJDdHh0KChjb25zdCB4bWxDaGFyICopY3VyKTsKICAgICAgICBkZXNyZXRfeG1sUGFyc2VyQ3R4dFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY3VyLCAoY29uc3QgeG1sQ2hhciAqKWN1ciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDcmVhdGVEb2NQYXJzZXJDdHh0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ3JlYXRlUHVzaFBhcnNlckN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9QVVNIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJDdHh0UHRyIHJldF92YWw7CiAgICB4bWxTQVhIYW5kbGVyUHRyIHNheDsgLyogYSBTQVggaGFuZGxlciAqLwogICAgaW50IG5fc2F4OwogICAgdm9pZCAqIHVzZXJfZGF0YTsgLyogVGhlIHVzZXIgZGF0YSByZXR1cm5lZCBvbiBTQVggY2FsbGJhY2tzICovCiAgICBpbnQgbl91c2VyX2RhdGE7CiAgICBjaGFyICogY2h1bms7IC8qIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBjaGFycyAqLwogICAgaW50IG5fY2h1bms7CiAgICBpbnQgc2l6ZTsgLyogbnVtYmVyIG9mIGNoYXJzIGluIHRoZSBhcnJheSAqLwogICAgaW50IG5fc2l6ZTsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogYW4gb3B0aW9uYWwgZmlsZSBuYW1lIG9yIFVSSSAqLwogICAgaW50IG5fZmlsZW5hbWU7CgogICAgZm9yIChuX3NheCA9IDA7bl9zYXggPCBnZW5fbmJfeG1sU0FYSGFuZGxlclB0cjtuX3NheCsrKSB7CiAgICBmb3IgKG5fdXNlcl9kYXRhID0gMDtuX3VzZXJfZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX3VzZXJfZGF0YSsrKSB7CiAgICBmb3IgKG5fY2h1bmsgPSAwO25fY2h1bmsgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9jaHVuaysrKSB7CiAgICBmb3IgKG5fc2l6ZSA9IDA7bl9zaXplIDwgZ2VuX25iX2ludDtuX3NpemUrKykgewogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVvdXRwdXQ7bl9maWxlbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzYXggPSBnZW5feG1sU0FYSGFuZGxlclB0cihuX3NheCwgMCk7CiAgICAgICAgdXNlcl9kYXRhID0gZ2VuX3VzZXJkYXRhKG5fdXNlcl9kYXRhLCAxKTsKICAgICAgICBjaHVuayA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2NodW5rLCAyKTsKICAgICAgICBzaXplID0gZ2VuX2ludChuX3NpemUsIDMpOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVvdXRwdXQobl9maWxlbmFtZSwgNCk7CgogICAgICAgIHJldF92YWwgPSB4bWxDcmVhdGVQdXNoUGFyc2VyQ3R4dChzYXgsIHVzZXJfZGF0YSwgKGNvbnN0IGNoYXIgKiljaHVuaywgc2l6ZSwgZmlsZW5hbWUpOwogICAgICAgIGRlc3JldF94bWxQYXJzZXJDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU0FYSGFuZGxlclB0cihuX3NheCwgc2F4LCAwKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl91c2VyX2RhdGEsIHVzZXJfZGF0YSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fY2h1bmssIChjb25zdCBjaGFyICopY2h1bmssIDIpOwogICAgICAgIGRlc19pbnQobl9zaXplLCBzaXplLCAzKTsKICAgICAgICBkZXNfZmlsZW91dHB1dChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDcmVhdGVQdXNoUGFyc2VyQ3R4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zYXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXNlcl9kYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NodW5rKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NpemUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDdHh0UmVhZERvYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxDaGFyICogY3VyOyAvKiBhIHBvaW50ZXIgdG8gYSB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nICovCiAgICBpbnQgbl9jdXI7CiAgICBjb25zdCBjaGFyICogVVJMOyAvKiB0aGUgYmFzZSBVUkwgdG8gdXNlIGZvciB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX1VSTDsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCiAgICBpbnQgbl9lbmNvZGluZzsKICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIHhtbFBhcnNlck9wdGlvbiAqLwogICAgaW50IG5fb3B0aW9uczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY3VyKyspIHsKICAgIGZvciAobl9VUkwgPSAwO25fVVJMIDwgZ2VuX25iX2ZpbGVwYXRoO25fVVJMKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9vcHRpb25zID0gMDtuX29wdGlvbnMgPCBnZW5fbmJfcGFyc2Vyb3B0aW9ucztuX29wdGlvbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgY3VyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY3VyLCAxKTsKICAgICAgICBVUkwgPSBnZW5fZmlsZXBhdGgobl9VUkwsIDIpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDMpOwogICAgICAgIG9wdGlvbnMgPSBnZW5fcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIDQpOwoKICAgICAgICByZXRfdmFsID0geG1sQ3R4dFJlYWREb2MoY3R4dCwgKGNvbnN0IHhtbENoYXIgKiljdXIsIFVSTCwgKGNvbnN0IGNoYXIgKillbmNvZGluZywgb3B0aW9ucyk7CiAgICAgICAgZGVzcmV0X3htbERvY1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jdXIsIChjb25zdCB4bWxDaGFyICopY3VyLCAxKTsKICAgICAgICBkZXNfZmlsZXBhdGgobl9VUkwsIFVSTCwgMik7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDMpOwogICAgICAgIGRlc19wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgb3B0aW9ucywgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDdHh0UmVhZERvYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3B0aW9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ3R4dFJlYWRGaWxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRG9jUHRyIHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogYSBmaWxlIG9yIFVSTCAqLwogICAgaW50IG5fZmlsZW5hbWU7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiB4bWxQYXJzZXJPcHRpb24gKi8KICAgIGludCBuX29wdGlvbnM7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICBmb3IgKG5fb3B0aW9ucyA9IDA7bl9vcHRpb25zIDwgZ2VuX25iX3BhcnNlcm9wdGlvbnM7bl9vcHRpb25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDEpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDIpOwogICAgICAgIG9wdGlvbnMgPSBnZW5fcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sQ3R4dFJlYWRGaWxlKGN0eHQsIGZpbGVuYW1lLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfeG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDIpOwogICAgICAgIGRlc19wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgb3B0aW9ucywgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDdHh0UmVhZEZpbGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vcHRpb25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDdHh0UmVhZE1lbW9yeSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBjaGFyICogYnVmZmVyOyAvKiBhIHBvaW50ZXIgdG8gYSBjaGFyIGFycmF5ICovCiAgICBpbnQgbl9idWZmZXI7CiAgICBpbnQgc2l6ZTsgLyogdGhlIHNpemUgb2YgdGhlIGFycmF5ICovCiAgICBpbnQgbl9zaXplOwogICAgY29uc3QgY2hhciAqIFVSTDsgLyogdGhlIGJhc2UgVVJMIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9VUkw7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiB4bWxQYXJzZXJPcHRpb24gKi8KICAgIGludCBuX29wdGlvbnM7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fYnVmZmVyID0gMDtuX2J1ZmZlciA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2J1ZmZlcisrKSB7CiAgICBmb3IgKG5fc2l6ZSA9IDA7bl9zaXplIDwgZ2VuX25iX2ludDtuX3NpemUrKykgewogICAgZm9yIChuX1VSTCA9IDA7bl9VUkwgPCBnZW5fbmJfZmlsZXBhdGg7bl9VUkwrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgZm9yIChuX29wdGlvbnMgPSAwO25fb3B0aW9ucyA8IGdlbl9uYl9wYXJzZXJvcHRpb25zO25fb3B0aW9ucysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBidWZmZXIgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9idWZmZXIsIDEpOwogICAgICAgIHNpemUgPSBnZW5faW50KG5fc2l6ZSwgMik7CiAgICAgICAgVVJMID0gZ2VuX2ZpbGVwYXRoKG5fVVJMLCAzKTsKICAgICAgICBlbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCA0KTsKICAgICAgICBvcHRpb25zID0gZ2VuX3BhcnNlcm9wdGlvbnMobl9vcHRpb25zLCA1KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEN0eHRSZWFkTWVtb3J5KGN0eHQsIChjb25zdCBjaGFyICopYnVmZmVyLCBzaXplLCBVUkwsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIG9wdGlvbnMpOwogICAgICAgIGRlc3JldF94bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fYnVmZmVyLCAoY29uc3QgY2hhciAqKWJ1ZmZlciwgMSk7CiAgICAgICAgZGVzX2ludChuX3NpemUsIHNpemUsIDIpOwogICAgICAgIGRlc19maWxlcGF0aChuX1VSTCwgVVJMLCAzKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgNCk7CiAgICAgICAgZGVzX3BhcnNlcm9wdGlvbnMobl9vcHRpb25zLCBvcHRpb25zLCA1KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEN0eHRSZWFkTWVtb3J5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmZmVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NpemUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJMKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29wdGlvbnMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEN0eHRSZXNldCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHhtbEN0eHRSZXNldChjdHh0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEN0eHRSZXNldCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDdHh0UmVzZXRQdXNoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNoYXIgKiBjaHVuazsgLyogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNoYXJzICovCiAgICBpbnQgbl9jaHVuazsKICAgIGludCBzaXplOyAvKiBudW1iZXIgb2YgY2hhcnMgaW4gdGhlIGFycmF5ICovCiAgICBpbnQgbl9zaXplOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiBhbiBvcHRpb25hbCBmaWxlIG5hbWUgb3IgVVJJICovCiAgICBpbnQgbl9maWxlbmFtZTsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCiAgICBpbnQgbl9lbmNvZGluZzsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9jaHVuayA9IDA7bl9jaHVuayA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2NodW5rKyspIHsKICAgIGZvciAobl9zaXplID0gMDtuX3NpemUgPCBnZW5fbmJfaW50O25fc2l6ZSsrKSB7CiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBjaHVuayA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2NodW5rLCAxKTsKICAgICAgICBzaXplID0gZ2VuX2ludChuX3NpemUsIDIpOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDMpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDQpOwoKICAgICAgICByZXRfdmFsID0geG1sQ3R4dFJlc2V0UHVzaChjdHh0LCAoY29uc3QgY2hhciAqKWNodW5rLCBzaXplLCBmaWxlbmFtZSwgKGNvbnN0IGNoYXIgKillbmNvZGluZyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9jaHVuaywgKGNvbnN0IGNoYXIgKiljaHVuaywgMSk7CiAgICAgICAgZGVzX2ludChuX3NpemUsIHNpemUsIDIpOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMyk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDQpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ3R4dFJlc2V0UHVzaCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NodW5rKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NpemUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEN0eHRVc2VPcHRpb25zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIHhtbFBhcnNlck9wdGlvbiAqLwogICAgaW50IG5fb3B0aW9uczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9vcHRpb25zID0gMDtuX29wdGlvbnMgPCBnZW5fbmJfcGFyc2Vyb3B0aW9ucztuX29wdGlvbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgb3B0aW9ucyA9IGdlbl9wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxDdHh0VXNlT3B0aW9ucyhjdHh0LCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgb3B0aW9ucywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDdHh0VXNlT3B0aW9ucyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29wdGlvbnMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldEV4dGVybmFsRW50aXR5TG9hZGVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldEZlYXR1cmUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9MRUdBQ1lfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9MRUdBQ1lfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTC9IVE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgY2hhciAqIG5hbWU7IC8qIHRoZSBmZWF0dXJlIG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB2b2lkICogcmVzdWx0OyAvKiBsb2NhdGlvbiB0byBzdG9yZSB0aGUgcmVzdWx0ICovCiAgICBpbnQgbl9yZXN1bHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fcmVzdWx0ID0gMDtuX3Jlc3VsdCA8IGdlbl9uYl92b2lkX3B0cjtuX3Jlc3VsdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgcmVzdWx0ID0gZ2VuX3ZvaWRfcHRyKG5fcmVzdWx0LCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEdldEZlYXR1cmUoY3R4dCwgKGNvbnN0IGNoYXIgKiluYW1lLCByZXN1bHQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IGNoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfdm9pZF9wdHIobl9yZXN1bHQsIHJlc3VsdCwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxHZXRGZWF0dXJlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZXN1bHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgojZGVmaW5lIGdlbl9uYl9jb25zdF9jaGFyX3B0cl9wdHIgMQpzdGF0aWMgY2hhciAqKiBnZW5fY29uc3RfY2hhcl9wdHJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc19jb25zdF9jaGFyX3B0cl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IGNoYXIgKiogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxHZXRGZWF0dXJlc0xpc3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9MRUdBQ1lfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9MRUdBQ1lfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgKiBsZW47IC8qIHRoZSBsZW5ndGggb2YgdGhlIGZlYXR1cmVzIG5hbWUgYXJyYXkgKGlucHV0L291dHB1dCkgKi8KICAgIGludCBuX2xlbjsKICAgIGNoYXIgKiogcmVzdWx0OyAvKiBhbiBhcnJheSBvZiBzdHJpbmcgdG8gYmUgZmlsbGVkIHdpdGggdGhlIGZlYXR1cmVzIG5hbWUuICovCiAgICBpbnQgbl9yZXN1bHQ7CgogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50X3B0cjtuX2xlbisrKSB7CiAgICBmb3IgKG5fcmVzdWx0ID0gMDtuX3Jlc3VsdCA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cl9wdHI7bl9yZXN1bHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbGVuID0gZ2VuX2ludF9wdHIobl9sZW4sIDApOwogICAgICAgIHJlc3VsdCA9IGdlbl9jb25zdF9jaGFyX3B0cl9wdHIobl9yZXN1bHQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sR2V0RmVhdHVyZXNMaXN0KGxlbiwgKGNvbnN0IGNoYXIgKiopcmVzdWx0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50X3B0cihuX2xlbiwgbGVuLCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHJfcHRyKG5fcmVzdWx0LCAoY29uc3QgY2hhciAqKilyZXN1bHQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sR2V0RmVhdHVyZXNMaXN0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZXN1bHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSGFzRmVhdHVyZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sRmVhdHVyZSBmZWF0dXJlOyAvKiB0aGUgZmVhdHVyZSB0byBiZSBleGFtaW5lZCAqLwogICAgaW50IG5fZmVhdHVyZTsKCiAgICBmb3IgKG5fZmVhdHVyZSA9IDA7bl9mZWF0dXJlIDwgZ2VuX25iX3htbEZlYXR1cmU7bl9mZWF0dXJlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZlYXR1cmUgPSBnZW5feG1sRmVhdHVyZShuX2ZlYXR1cmUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sSGFzRmVhdHVyZShmZWF0dXJlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRmVhdHVyZShuX2ZlYXR1cmUsIGZlYXR1cmUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSGFzRmVhdHVyZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mZWF0dXJlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJT1BhcnNlRFREKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVkFMSURfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9WQUxJRF9FTkFCTEVECiAgICB4bWxEdGRQdHIgcmV0X3ZhbDsKICAgIHhtbFNBWEhhbmRsZXJQdHIgc2F4OyAvKiB0aGUgU0FYIGhhbmRsZXIgYmxvY2sgb3IgTlVMTCAqLwogICAgaW50IG5fc2F4OwogICAgeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIgaW5wdXQ7IC8qIGFuIElucHV0IEJ1ZmZlciAqLwogICAgaW50IG5faW5wdXQ7CiAgICB4bWxDaGFyRW5jb2RpbmcgZW5jOyAvKiB0aGUgY2hhcnNldCBlbmNvZGluZyBpZiBrbm93biAqLwogICAgaW50IG5fZW5jOwoKICAgIGZvciAobl9zYXggPSAwO25fc2F4IDwgZ2VuX25iX3htbFNBWEhhbmRsZXJQdHI7bl9zYXgrKykgewogICAgZm9yIChuX2lucHV0ID0gMDtuX2lucHV0IDwgZ2VuX25iX3htbFBhcnNlcklucHV0QnVmZmVyUHRyO25faW5wdXQrKykgewogICAgZm9yIChuX2VuYyA9IDA7bl9lbmMgPCBnZW5fbmJfeG1sQ2hhckVuY29kaW5nO25fZW5jKyspIHsKICAgICAgICBzYXggPSBnZW5feG1sU0FYSGFuZGxlclB0cihuX3NheCwgMCk7CiAgICAgICAgaW5wdXQgPSBnZW5feG1sUGFyc2VySW5wdXRCdWZmZXJQdHIobl9pbnB1dCwgMSk7CiAgICAgICAgZW5jID0gZ2VuX3htbENoYXJFbmNvZGluZyhuX2VuYywgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxJT1BhcnNlRFREKHNheCwgaW5wdXQsIGVuYyk7CiAgICAgICAgaW5wdXQgPSBOVUxMOwogICAgICAgIGRlc3JldF94bWxEdGRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCBzYXgsIDApOwogICAgICAgIGRlc194bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cihuX2lucHV0LCBpbnB1dCwgMSk7CiAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZyhuX2VuYywgZW5jLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSW5pdE5vZGVJbmZvU2VxKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VyTm9kZUluZm9TZXFQdHIgc2VxOyAvKiBhIG5vZGUgaW5mbyBzZXF1ZW5jZSBwb2ludGVyICovCiAgICBpbnQgbl9zZXE7CgogICAgZm9yIChuX3NlcSA9IDA7bl9zZXEgPCBnZW5fbmJfeG1sUGFyc2VyTm9kZUluZm9TZXFQdHI7bl9zZXErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc2VxID0gZ2VuX3htbFBhcnNlck5vZGVJbmZvU2VxUHRyKG5fc2VxLCAwKTsKCiAgICAgICAgeG1sSW5pdE5vZGVJbmZvU2VxKHNlcSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJOb2RlSW5mb1NlcVB0cihuX3NlcSwgc2VxLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEluaXROb2RlSW5mb1NlcSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zZXEpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEluaXRQYXJzZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CgogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CgogICAgICAgIHhtbEluaXRQYXJzZXIoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxJbml0UGFyc2VyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJbml0UGFyc2VyQ3R4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEluaXRQYXJzZXJDdHh0KGN0eHQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxJbml0UGFyc2VyQ3R4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxLZWVwQmxhbmtzRGVmYXVsdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IHZhbDsgLyogaW50IDAgb3IgMSAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX2ludDtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwgPSBnZW5faW50KG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEtlZXBCbGFua3NEZWZhdWx0KHZhbCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEtlZXBCbGFua3NEZWZhdWx0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTGluZU51bWJlcnNEZWZhdWx0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgdmFsOyAvKiBpbnQgMCBvciAxICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfaW50O25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl9pbnQobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sTGluZU51bWJlcnNEZWZhdWx0KHZhbCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbExpbmVOdW1iZXJzRGVmYXVsdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExvYWRFeHRlcm5hbEVudGl0eSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlcklucHV0UHRyIHJldF92YWw7CiAgICBjb25zdCBjaGFyICogVVJMOyAvKiB0aGUgVVJMIGZvciB0aGUgZW50aXR5IHRvIGxvYWQgKi8KICAgIGludCBuX1VSTDsKICAgIGNoYXIgKiBJRDsgLyogdGhlIFB1YmxpYyBJRCBmb3IgdGhlIGVudGl0eSB0byBsb2FkICovCiAgICBpbnQgbl9JRDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIGVudGl0eSBpcyBjYWxsZWQgb3IgTlVMTCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fVVJMID0gMDtuX1VSTCA8IGdlbl9uYl9maWxlcGF0aDtuX1VSTCsrKSB7CiAgICBmb3IgKG5fSUQgPSAwO25fSUQgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9JRCsrKSB7CiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIFVSTCA9IGdlbl9maWxlcGF0aChuX1VSTCwgMCk7CiAgICAgICAgSUQgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9JRCwgMSk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxMb2FkRXh0ZXJuYWxFbnRpdHkoVVJMLCAoY29uc3QgY2hhciAqKUlELCBjdHh0KTsKICAgICAgICBkZXNyZXRfeG1sUGFyc2VySW5wdXRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlcGF0aChuX1VSTCwgVVJMLCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9JRCwgKGNvbnN0IGNoYXIgKilJRCwgMSk7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbExvYWRFeHRlcm5hbEVudGl0eSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fSUQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3SU9JbnB1dFN0cmVhbSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlcklucHV0UHRyIHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbFBhcnNlcklucHV0QnVmZmVyUHRyIGlucHV0OyAvKiBhbiBJL08gSW5wdXQgKi8KICAgIGludCBuX2lucHV0OwogICAgeG1sQ2hhckVuY29kaW5nIGVuYzsgLyogdGhlIGNoYXJzZXQgZW5jb2RpbmcgaWYga25vd24gKi8KICAgIGludCBuX2VuYzsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9pbnB1dCA9IDA7bl9pbnB1dCA8IGdlbl9uYl94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cjtuX2lucHV0KyspIHsKICAgIGZvciAobl9lbmMgPSAwO25fZW5jIDwgZ2VuX25iX3htbENoYXJFbmNvZGluZztuX2VuYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBpbnB1dCA9IGdlbl94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cihuX2lucHV0LCAxKTsKICAgICAgICBlbmMgPSBnZW5feG1sQ2hhckVuY29kaW5nKG5fZW5jLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld0lPSW5wdXRTdHJlYW0oY3R4dCwgaW5wdXQsIGVuYyk7CiAgICAgICAgaWYgKHJldF92YWwgIT0gTlVMTCkgaW5wdXQgPSBOVUxMOwogICAgICAgIGRlc3JldF94bWxQYXJzZXJJbnB1dFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIobl9pbnB1dCwgaW5wdXQsIDEpOwogICAgICAgIGRlc194bWxDaGFyRW5jb2Rpbmcobl9lbmMsIGVuYywgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOZXdJT0lucHV0U3RyZWFtIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5wdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdQYXJzZXJDdHh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VyQ3R4dFB0ciByZXRfdmFsOwoKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3UGFyc2VyQ3R4dCgpOwogICAgICAgIGRlc3JldF94bWxQYXJzZXJDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld1BhcnNlckN0eHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKI2RlZmluZSBnZW5fbmJfeG1sTm9kZVB0cl9wdHIgMQpzdGF0aWMgeG1sTm9kZVB0ciAqIGdlbl94bWxOb2RlUHRyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sTm9kZVB0cl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbE5vZGVQdHIgKiB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKc3RhdGljIGludAp0ZXN0X3htbFBhcnNlQmFsYW5jZWRDaHVua01lbW9yeSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NBWDFfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50IHRoZSBjaHVuayBwZXJ0YWlucyB0byAqLwogICAgaW50IG5fZG9jOwogICAgeG1sU0FYSGFuZGxlclB0ciBzYXg7IC8qIHRoZSBTQVggaGFuZGxlciBibG9jIChwb3NzaWJseSBOVUxMKSAqLwogICAgaW50IG5fc2F4OwogICAgdm9pZCAqIHVzZXJfZGF0YTsgLyogVGhlIHVzZXIgZGF0YSByZXR1cm5lZCBvbiBTQVggY2FsbGJhY2tzIChwb3NzaWJseSBOVUxMKSAqLwogICAgaW50IG5fdXNlcl9kYXRhOwogICAgaW50IGRlcHRoOyAvKiBVc2VkIGZvciBsb29wIGRldGVjdGlvbiwgdXNlIDAgKi8KICAgIGludCBuX2RlcHRoOwogICAgeG1sQ2hhciAqIHN0cmluZzsgLyogdGhlIGlucHV0IHN0cmluZyBpbiBVVEY4IG9yIElTTy1MYXRpbiAoemVybyB0ZXJtaW5hdGVkKSAqLwogICAgaW50IG5fc3RyaW5nOwogICAgeG1sTm9kZVB0ciAqIGxzdDsgLyogdGhlIHJldHVybiB2YWx1ZSBmb3IgdGhlIHNldCBvZiBwYXJzZWQgbm9kZXMgKi8KICAgIGludCBuX2xzdDsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX3NheCA9IDA7bl9zYXggPCBnZW5fbmJfeG1sU0FYSGFuZGxlclB0cjtuX3NheCsrKSB7CiAgICBmb3IgKG5fdXNlcl9kYXRhID0gMDtuX3VzZXJfZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX3VzZXJfZGF0YSsrKSB7CiAgICBmb3IgKG5fZGVwdGggPSAwO25fZGVwdGggPCBnZW5fbmJfaW50O25fZGVwdGgrKykgewogICAgZm9yIChuX3N0cmluZyA9IDA7bl9zdHJpbmcgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHJpbmcrKykgewogICAgZm9yIChuX2xzdCA9IDA7bl9sc3QgPCBnZW5fbmJfeG1sTm9kZVB0cl9wdHI7bl9sc3QrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgc2F4ID0gZ2VuX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIDEpOwogICAgICAgIHVzZXJfZGF0YSA9IGdlbl91c2VyZGF0YShuX3VzZXJfZGF0YSwgMik7CiAgICAgICAgZGVwdGggPSBnZW5faW50KG5fZGVwdGgsIDMpOwogICAgICAgIHN0cmluZyA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0cmluZywgNCk7CiAgICAgICAgbHN0ID0gZ2VuX3htbE5vZGVQdHJfcHRyKG5fbHN0LCA1KTsKICAgICAgICAKI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgICAgICBpZiAoc2F4ID09ICh4bWxTQVhIYW5kbGVyUHRyKSZ4bWxEZWZhdWx0U0FYSGFuZGxlcikgdXNlcl9kYXRhID0gTlVMTDsKI2VuZGlmCgoKICAgICAgICByZXRfdmFsID0geG1sUGFyc2VCYWxhbmNlZENodW5rTWVtb3J5KGRvYywgc2F4LCB1c2VyX2RhdGEsIGRlcHRoLCAoY29uc3QgeG1sQ2hhciAqKXN0cmluZywgbHN0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc194bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCBzYXgsIDEpOwogICAgICAgIGRlc191c2VyZGF0YShuX3VzZXJfZGF0YSwgdXNlcl9kYXRhLCAyKTsKICAgICAgICBkZXNfaW50KG5fZGVwdGgsIGRlcHRoLCAzKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHJpbmcsIChjb25zdCB4bWxDaGFyICopc3RyaW5nLCA0KTsKICAgICAgICBkZXNfeG1sTm9kZVB0cl9wdHIobl9sc3QsIGxzdCwgNSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZUJhbGFuY2VkQ2h1bmtNZW1vcnkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NheCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91c2VyX2RhdGEpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGVwdGgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xzdCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZUJhbGFuY2VkQ2h1bmtNZW1vcnlSZWNvdmVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0FYMV9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgdGhlIGNodW5rIHBlcnRhaW5zIHRvICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxTQVhIYW5kbGVyUHRyIHNheDsgLyogdGhlIFNBWCBoYW5kbGVyIGJsb2MgKHBvc3NpYmx5IE5VTEwpICovCiAgICBpbnQgbl9zYXg7CiAgICB2b2lkICogdXNlcl9kYXRhOyAvKiBUaGUgdXNlciBkYXRhIHJldHVybmVkIG9uIFNBWCBjYWxsYmFja3MgKHBvc3NpYmx5IE5VTEwpICovCiAgICBpbnQgbl91c2VyX2RhdGE7CiAgICBpbnQgZGVwdGg7IC8qIFVzZWQgZm9yIGxvb3AgZGV0ZWN0aW9uLCB1c2UgMCAqLwogICAgaW50IG5fZGVwdGg7CiAgICB4bWxDaGFyICogc3RyaW5nOyAvKiB0aGUgaW5wdXQgc3RyaW5nIGluIFVURjggb3IgSVNPLUxhdGluICh6ZXJvIHRlcm1pbmF0ZWQpICovCiAgICBpbnQgbl9zdHJpbmc7CiAgICB4bWxOb2RlUHRyICogbHN0OyAvKiB0aGUgcmV0dXJuIHZhbHVlIGZvciB0aGUgc2V0IG9mIHBhcnNlZCBub2RlcyAqLwogICAgaW50IG5fbHN0OwogICAgaW50IHJlY292ZXI7IC8qIHJldHVybiBub2RlcyBldmVuIGlmIHRoZSBkYXRhIGlzIGJyb2tlbiAodXNlIDApICovCiAgICBpbnQgbl9yZWNvdmVyOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fc2F4ID0gMDtuX3NheCA8IGdlbl9uYl94bWxTQVhIYW5kbGVyUHRyO25fc2F4KyspIHsKICAgIGZvciAobl91c2VyX2RhdGEgPSAwO25fdXNlcl9kYXRhIDwgZ2VuX25iX3VzZXJkYXRhO25fdXNlcl9kYXRhKyspIHsKICAgIGZvciAobl9kZXB0aCA9IDA7bl9kZXB0aCA8IGdlbl9uYl9pbnQ7bl9kZXB0aCsrKSB7CiAgICBmb3IgKG5fc3RyaW5nID0gMDtuX3N0cmluZyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cmluZysrKSB7CiAgICBmb3IgKG5fbHN0ID0gMDtuX2xzdCA8IGdlbl9uYl94bWxOb2RlUHRyX3B0cjtuX2xzdCsrKSB7CiAgICBmb3IgKG5fcmVjb3ZlciA9IDA7bl9yZWNvdmVyIDwgZ2VuX25iX2ludDtuX3JlY292ZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgc2F4ID0gZ2VuX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIDEpOwogICAgICAgIHVzZXJfZGF0YSA9IGdlbl91c2VyZGF0YShuX3VzZXJfZGF0YSwgMik7CiAgICAgICAgZGVwdGggPSBnZW5faW50KG5fZGVwdGgsIDMpOwogICAgICAgIHN0cmluZyA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0cmluZywgNCk7CiAgICAgICAgbHN0ID0gZ2VuX3htbE5vZGVQdHJfcHRyKG5fbHN0LCA1KTsKICAgICAgICByZWNvdmVyID0gZ2VuX2ludChuX3JlY292ZXIsIDYpOwogICAgICAgIAojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgICAgIGlmIChzYXggPT0gKHhtbFNBWEhhbmRsZXJQdHIpJnhtbERlZmF1bHRTQVhIYW5kbGVyKSB1c2VyX2RhdGEgPSBOVUxMOwojZW5kaWYKCgogICAgICAgIHJldF92YWwgPSB4bWxQYXJzZUJhbGFuY2VkQ2h1bmtNZW1vcnlSZWNvdmVyKGRvYywgc2F4LCB1c2VyX2RhdGEsIGRlcHRoLCAoY29uc3QgeG1sQ2hhciAqKXN0cmluZywgbHN0LCByZWNvdmVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc194bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCBzYXgsIDEpOwogICAgICAgIGRlc191c2VyZGF0YShuX3VzZXJfZGF0YSwgdXNlcl9kYXRhLCAyKTsKICAgICAgICBkZXNfaW50KG5fZGVwdGgsIGRlcHRoLCAzKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHJpbmcsIChjb25zdCB4bWxDaGFyICopc3RyaW5nLCA0KTsKICAgICAgICBkZXNfeG1sTm9kZVB0cl9wdHIobl9sc3QsIGxzdCwgNSk7CiAgICAgICAgZGVzX2ludChuX3JlY292ZXIsIHJlY292ZXIsIDYpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VCYWxhbmNlZENodW5rTWVtb3J5UmVjb3ZlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2F4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3VzZXJfZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kZXB0aCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHJpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbHN0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlY292ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VDaHVuayh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1BVU0hfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBjaGFyICogY2h1bms7IC8qIGFuIGNoYXIgYXJyYXkgKi8KICAgIGludCBuX2NodW5rOwogICAgaW50IHNpemU7IC8qIHRoZSBzaXplIGluIGJ5dGUgb2YgdGhlIGNodW5rICovCiAgICBpbnQgbl9zaXplOwogICAgaW50IHRlcm1pbmF0ZTsgLyogbGFzdCBjaHVuayBpbmRpY2F0b3IgKi8KICAgIGludCBuX3Rlcm1pbmF0ZTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9jaHVuayA9IDA7bl9jaHVuayA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2NodW5rKyspIHsKICAgIGZvciAobl9zaXplID0gMDtuX3NpemUgPCBnZW5fbmJfaW50O25fc2l6ZSsrKSB7CiAgICBmb3IgKG5fdGVybWluYXRlID0gMDtuX3Rlcm1pbmF0ZSA8IGdlbl9uYl9pbnQ7bl90ZXJtaW5hdGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgY2h1bmsgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9jaHVuaywgMSk7CiAgICAgICAgc2l6ZSA9IGdlbl9pbnQobl9zaXplLCAyKTsKICAgICAgICB0ZXJtaW5hdGUgPSBnZW5faW50KG5fdGVybWluYXRlLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlQ2h1bmsoY3R4dCwgKGNvbnN0IGNoYXIgKiljaHVuaywgc2l6ZSwgdGVybWluYXRlKTsKICAgICAgICBpZiAoY3R4dCAhPSBOVUxMKSB7eG1sRnJlZURvYyhjdHh0LT5teURvYyk7IGN0eHQtPm15RG9jID0gTlVMTDt9CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9jaHVuaywgKGNvbnN0IGNoYXIgKiljaHVuaywgMSk7CiAgICAgICAgZGVzX2ludChuX3NpemUsIHNpemUsIDIpOwogICAgICAgIGRlc19pbnQobl90ZXJtaW5hdGUsIHRlcm1pbmF0ZSwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZUNodW5rIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY2h1bmspOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2l6ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90ZXJtaW5hdGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZUN0eHRFeHRlcm5hbEVudGl0eSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHg7IC8qIHRoZSBleGlzdGluZyBwYXJzaW5nIGNvbnRleHQgKi8KICAgIGludCBuX2N0eDsKICAgIHhtbENoYXIgKiBVUkw7IC8qIHRoZSBVUkwgZm9yIHRoZSBlbnRpdHkgdG8gbG9hZCAqLwogICAgaW50IG5fVVJMOwogICAgeG1sQ2hhciAqIElEOyAvKiB0aGUgU3lzdGVtIElEIGZvciB0aGUgZW50aXR5IHRvIGxvYWQgKi8KICAgIGludCBuX0lEOwogICAgeG1sTm9kZVB0ciAqIGxzdDsgLyogdGhlIHJldHVybiB2YWx1ZSBmb3IgdGhlIHNldCBvZiBwYXJzZWQgbm9kZXMgKi8KICAgIGludCBuX2xzdDsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4KyspIHsKICAgIGZvciAobl9VUkwgPSAwO25fVVJMIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fVVJMKyspIHsKICAgIGZvciAobl9JRCA9IDA7bl9JRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX0lEKyspIHsKICAgIGZvciAobl9sc3QgPSAwO25fbHN0IDwgZ2VuX25iX3htbE5vZGVQdHJfcHRyO25fbHN0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4LCAwKTsKICAgICAgICBVUkwgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9VUkwsIDEpOwogICAgICAgIElEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fSUQsIDIpOwogICAgICAgIGxzdCA9IGdlbl94bWxOb2RlUHRyX3B0cihuX2xzdCwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxQYXJzZUN0eHRFeHRlcm5hbEVudGl0eShjdHgsIChjb25zdCB4bWxDaGFyICopVVJMLCAoY29uc3QgeG1sQ2hhciAqKUlELCBsc3QpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4LCBjdHgsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX1VSTCwgKGNvbnN0IHhtbENoYXIgKilVUkwsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX0lELCAoY29uc3QgeG1sQ2hhciAqKUlELCAyKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cl9wdHIobl9sc3QsIGxzdCwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZUN0eHRFeHRlcm5hbEVudGl0eSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJMKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX0lEKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xzdCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VEVEQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1ZBTElEX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbER0ZFB0ciByZXRfdmFsOwogICAgeG1sQ2hhciAqIEV4dGVybmFsSUQ7IC8qIGEgTkFNRSogY29udGFpbmluZyB0aGUgRXh0ZXJuYWwgSUQgb2YgdGhlIERURCAqLwogICAgaW50IG5fRXh0ZXJuYWxJRDsKICAgIHhtbENoYXIgKiBTeXN0ZW1JRDsgLyogYSBOQU1FKiBjb250YWluaW5nIHRoZSBVUkwgdG8gdGhlIERURCAqLwogICAgaW50IG5fU3lzdGVtSUQ7CgogICAgZm9yIChuX0V4dGVybmFsSUQgPSAwO25fRXh0ZXJuYWxJRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX0V4dGVybmFsSUQrKykgewogICAgZm9yIChuX1N5c3RlbUlEID0gMDtuX1N5c3RlbUlEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fU3lzdGVtSUQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgRXh0ZXJuYWxJRCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX0V4dGVybmFsSUQsIDApOwogICAgICAgIFN5c3RlbUlEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fU3lzdGVtSUQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sUGFyc2VEVEQoKGNvbnN0IHhtbENoYXIgKilFeHRlcm5hbElELCAoY29uc3QgeG1sQ2hhciAqKVN5c3RlbUlEKTsKICAgICAgICBkZXNyZXRfeG1sRHRkUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9FeHRlcm5hbElELCAoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX1N5c3RlbUlELCAoY29uc3QgeG1sQ2hhciAqKVN5c3RlbUlELCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlRFREIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX0V4dGVybmFsSUQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fU3lzdGVtSUQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VEb2Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQVgxX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxEb2NQdHIgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBjdXI7IC8qIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiB4bWxDaGFyICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY3VyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlRG9jKChjb25zdCB4bWxDaGFyICopY3VyKTsKICAgICAgICBkZXNyZXRfeG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jdXIsIChjb25zdCB4bWxDaGFyICopY3VyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlRG9jIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZURvY3VtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sUGFyc2VEb2N1bWVudChjdHh0KTsKICAgICAgICBpZiAoY3R4dCAhPSBOVUxMKSB7eG1sRnJlZURvYyhjdHh0LT5teURvYyk7IGN0eHQtPm15RG9jID0gTlVMTDt9CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlRG9jdW1lbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VFbnRpdHkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQVgxX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxEb2NQdHIgcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIGZpbGVuYW1lICovCiAgICBpbnQgbl9maWxlbmFtZTsKCiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlcGF0aChuX2ZpbGVuYW1lLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlRW50aXR5KGZpbGVuYW1lKTsKICAgICAgICBkZXNyZXRfeG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZXBhdGgobl9maWxlbmFtZSwgZmlsZW5hbWUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VFbnRpdHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VFeHRQYXJzZWRFbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxQYXJzZUV4dFBhcnNlZEVudChjdHh0KTsKICAgICAgICBpZiAoY3R4dCAhPSBOVUxMKSB7eG1sRnJlZURvYyhjdHh0LT5teURvYyk7IGN0eHQtPm15RG9jID0gTlVMTDt9CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlRXh0UGFyc2VkRW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhcnNlRXh0ZXJuYWxFbnRpdHkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQVgxX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCB0aGUgY2h1bmsgcGVydGFpbnMgdG8gKi8KICAgIGludCBuX2RvYzsKICAgIHhtbFNBWEhhbmRsZXJQdHIgc2F4OyAvKiB0aGUgU0FYIGhhbmRsZXIgYmxvYyAocG9zc2libHkgTlVMTCkgKi8KICAgIGludCBuX3NheDsKICAgIHZvaWQgKiB1c2VyX2RhdGE7IC8qIFRoZSB1c2VyIGRhdGEgcmV0dXJuZWQgb24gU0FYIGNhbGxiYWNrcyAocG9zc2libHkgTlVMTCkgKi8KICAgIGludCBuX3VzZXJfZGF0YTsKICAgIGludCBkZXB0aDsgLyogVXNlZCBmb3IgbG9vcCBkZXRlY3Rpb24sIHVzZSAwICovCiAgICBpbnQgbl9kZXB0aDsKICAgIHhtbENoYXIgKiBVUkw7IC8qIHRoZSBVUkwgZm9yIHRoZSBlbnRpdHkgdG8gbG9hZCAqLwogICAgaW50IG5fVVJMOwogICAgeG1sQ2hhciAqIElEOyAvKiB0aGUgU3lzdGVtIElEIGZvciB0aGUgZW50aXR5IHRvIGxvYWQgKi8KICAgIGludCBuX0lEOwogICAgeG1sTm9kZVB0ciAqIGxzdDsgLyogdGhlIHJldHVybiB2YWx1ZSBmb3IgdGhlIHNldCBvZiBwYXJzZWQgbm9kZXMgKi8KICAgIGludCBuX2xzdDsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX3NheCA9IDA7bl9zYXggPCBnZW5fbmJfeG1sU0FYSGFuZGxlclB0cjtuX3NheCsrKSB7CiAgICBmb3IgKG5fdXNlcl9kYXRhID0gMDtuX3VzZXJfZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX3VzZXJfZGF0YSsrKSB7CiAgICBmb3IgKG5fZGVwdGggPSAwO25fZGVwdGggPCBnZW5fbmJfaW50O25fZGVwdGgrKykgewogICAgZm9yIChuX1VSTCA9IDA7bl9VUkwgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9VUkwrKykgewogICAgZm9yIChuX0lEID0gMDtuX0lEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fSUQrKykgewogICAgZm9yIChuX2xzdCA9IDA7bl9sc3QgPCBnZW5fbmJfeG1sTm9kZVB0cl9wdHI7bl9sc3QrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgc2F4ID0gZ2VuX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIDEpOwogICAgICAgIHVzZXJfZGF0YSA9IGdlbl91c2VyZGF0YShuX3VzZXJfZGF0YSwgMik7CiAgICAgICAgZGVwdGggPSBnZW5faW50KG5fZGVwdGgsIDMpOwogICAgICAgIFVSTCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX1VSTCwgNCk7CiAgICAgICAgSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9JRCwgNSk7CiAgICAgICAgbHN0ID0gZ2VuX3htbE5vZGVQdHJfcHRyKG5fbHN0LCA2KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlRXh0ZXJuYWxFbnRpdHkoZG9jLCBzYXgsIHVzZXJfZGF0YSwgZGVwdGgsIChjb25zdCB4bWxDaGFyICopVVJMLCAoY29uc3QgeG1sQ2hhciAqKUlELCBsc3QpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIHNheCwgMSk7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fdXNlcl9kYXRhLCB1c2VyX2RhdGEsIDIpOwogICAgICAgIGRlc19pbnQobl9kZXB0aCwgZGVwdGgsIDMpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX1VSTCwgKGNvbnN0IHhtbENoYXIgKilVUkwsIDQpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX0lELCAoY29uc3QgeG1sQ2hhciAqKUlELCA1KTsKICAgICAgICBkZXNfeG1sTm9kZVB0cl9wdHIobl9sc3QsIGxzdCwgNik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZUV4dGVybmFsRW50aXR5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zYXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXNlcl9kYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RlcHRoKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSTCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9JRCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sc3QpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VGaWxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0FYMV9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRG9jUHRyIHJldF92YWw7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBmaWxlbmFtZSAqLwogICAgaW50IG5fZmlsZW5hbWU7CgogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVwYXRoO25fZmlsZW5hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZXBhdGgobl9maWxlbmFtZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxQYXJzZUZpbGUoZmlsZW5hbWUpOwogICAgICAgIGRlc3JldF94bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZUZpbGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VJbk5vZGVDb250ZXh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VyRXJyb3JzIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBjb250ZXh0IG5vZGUgKi8KICAgIGludCBuX25vZGU7CiAgICBjaGFyICogZGF0YTsgLyogdGhlIGlucHV0IHN0cmluZyAqLwogICAgaW50IG5fZGF0YTsKICAgIGludCBkYXRhbGVuOyAvKiB0aGUgaW5wdXQgc3RyaW5nIGxlbmd0aCBpbiBieXRlcyAqLwogICAgaW50IG5fZGF0YWxlbjsKICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIHhtbFBhcnNlck9wdGlvbiAqLwogICAgaW50IG5fb3B0aW9uczsKICAgIHhtbE5vZGVQdHIgKiBsc3Q7IC8qIHRoZSByZXR1cm4gdmFsdWUgZm9yIHRoZSBzZXQgb2YgcGFyc2VkIG5vZGVzICovCiAgICBpbnQgbl9sc3Q7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fZGF0YSA9IDA7bl9kYXRhIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZGF0YSsrKSB7CiAgICBmb3IgKG5fZGF0YWxlbiA9IDA7bl9kYXRhbGVuIDwgZ2VuX25iX2ludDtuX2RhdGFsZW4rKykgewogICAgZm9yIChuX29wdGlvbnMgPSAwO25fb3B0aW9ucyA8IGdlbl9uYl9wYXJzZXJvcHRpb25zO25fb3B0aW9ucysrKSB7CiAgICBmb3IgKG5fbHN0ID0gMDtuX2xzdCA8IGdlbl9uYl94bWxOb2RlUHRyX3B0cjtuX2xzdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAwKTsKICAgICAgICBkYXRhID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZGF0YSwgMSk7CiAgICAgICAgZGF0YWxlbiA9IGdlbl9pbnQobl9kYXRhbGVuLCAyKTsKICAgICAgICBvcHRpb25zID0gZ2VuX3BhcnNlcm9wdGlvbnMobl9vcHRpb25zLCAzKTsKICAgICAgICBsc3QgPSBnZW5feG1sTm9kZVB0cl9wdHIobl9sc3QsIDQpOwoKICAgICAgICByZXRfdmFsID0geG1sUGFyc2VJbk5vZGVDb250ZXh0KG5vZGUsIChjb25zdCBjaGFyICopZGF0YSwgZGF0YWxlbiwgb3B0aW9ucywgbHN0KTsKICAgICAgICBkZXNyZXRfeG1sUGFyc2VyRXJyb3JzKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2RhdGEsIChjb25zdCBjaGFyICopZGF0YSwgMSk7CiAgICAgICAgZGVzX2ludChuX2RhdGFsZW4sIGRhdGFsZW4sIDIpOwogICAgICAgIGRlc19wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgb3B0aW9ucywgMyk7CiAgICAgICAgZGVzX3htbE5vZGVQdHJfcHRyKG5fbHN0LCBsc3QsIDQpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VJbk5vZGVDb250ZXh0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kYXRhbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29wdGlvbnMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbHN0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZU1lbW9yeSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NBWDFfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgY2hhciAqIGJ1ZmZlcjsgLyogYW4gcG9pbnRlciB0byBhIGNoYXIgYXJyYXkgKi8KICAgIGludCBuX2J1ZmZlcjsKICAgIGludCBzaXplOyAvKiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgKi8KICAgIGludCBuX3NpemU7CgogICAgZm9yIChuX2J1ZmZlciA9IDA7bl9idWZmZXIgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9idWZmZXIrKykgewogICAgZm9yIChuX3NpemUgPSAwO25fc2l6ZSA8IGdlbl9uYl9pbnQ7bl9zaXplKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZmZlciA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2J1ZmZlciwgMCk7CiAgICAgICAgc2l6ZSA9IGdlbl9pbnQobl9zaXplLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlTWVtb3J5KChjb25zdCBjaGFyICopYnVmZmVyLCBzaXplKTsKICAgICAgICBkZXNyZXRfeG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9idWZmZXIsIChjb25zdCBjaGFyICopYnVmZmVyLCAwKTsKICAgICAgICBkZXNfaW50KG5fc2l6ZSwgc2l6ZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZU1lbW9yeSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWZmZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2l6ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCiNkZWZpbmUgZ2VuX25iX2NvbnN0X3htbFBhcnNlck5vZGVJbmZvUHRyIDEKc3RhdGljIHhtbFBhcnNlck5vZGVJbmZvUHRyIGdlbl9jb25zdF94bWxQYXJzZXJOb2RlSW5mb1B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfY29uc3RfeG1sUGFyc2VyTm9kZUluZm9QdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbFBhcnNlck5vZGVJbmZvUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VyQWRkTm9kZUluZm8odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbFBhcnNlck5vZGVJbmZvUHRyIGluZm87IC8qIGEgbm9kZSBpbmZvIHNlcXVlbmNlIHBvaW50ZXIgKi8KICAgIGludCBuX2luZm87CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5faW5mbyA9IDA7bl9pbmZvIDwgZ2VuX25iX2NvbnN0X3htbFBhcnNlck5vZGVJbmZvUHRyO25faW5mbysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBpbmZvID0gZ2VuX2NvbnN0X3htbFBhcnNlck5vZGVJbmZvUHRyKG5faW5mbywgMSk7CgogICAgICAgIHhtbFBhcnNlckFkZE5vZGVJbmZvKGN0eHQsIChjb25zdCB4bWxQYXJzZXJOb2RlSW5mb1B0cilpbmZvKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sUGFyc2VyTm9kZUluZm9QdHIobl9pbmZvLCAoY29uc3QgeG1sUGFyc2VyTm9kZUluZm9QdHIpaW5mbywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZXJBZGROb2RlSW5mbyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2luZm8pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKI2RlZmluZSBnZW5fbmJfY29uc3RfeG1sUGFyc2VyQ3R4dFB0ciAxCnN0YXRpYyB4bWxQYXJzZXJDdHh0UHRyIGdlbl9jb25zdF94bWxQYXJzZXJDdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc19jb25zdF94bWxQYXJzZXJDdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxQYXJzZXJDdHh0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgojZGVmaW5lIGdlbl9uYl9jb25zdF94bWxOb2RlUHRyIDEKc3RhdGljIHhtbE5vZGVQdHIgZ2VuX2NvbnN0X3htbE5vZGVQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX2NvbnN0X3htbE5vZGVQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbE5vZGVQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZXJGaW5kTm9kZUluZm8odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBjb25zdCB4bWxQYXJzZXJOb2RlSW5mbyAqIHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eDsgLyogYW4gWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHg7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIGFuIFhNTCBub2RlIHdpdGhpbiB0aGUgdHJlZSAqLwogICAgaW50IG5fbm9kZTsKCiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl9jb25zdF94bWxQYXJzZXJDdHh0UHRyO25fY3R4KyspIHsKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfY29uc3RfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4ID0gZ2VuX2NvbnN0X3htbFBhcnNlckN0eHRQdHIobl9jdHgsIDApOwogICAgICAgIG5vZGUgPSBnZW5fY29uc3RfeG1sTm9kZVB0cihuX25vZGUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sUGFyc2VyRmluZE5vZGVJbmZvKChjb25zdCB4bWxQYXJzZXJDdHh0UHRyKWN0eCwgKGNvbnN0IHhtbE5vZGVQdHIpbm9kZSk7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbFBhcnNlck5vZGVJbmZvX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbFBhcnNlckN0eHRQdHIobl9jdHgsIChjb25zdCB4bWxQYXJzZXJDdHh0UHRyKWN0eCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbE5vZGVQdHIobl9ub2RlLCAoY29uc3QgeG1sTm9kZVB0cilub2RlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlckZpbmROb2RlSW5mbyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgojZGVmaW5lIGdlbl9uYl9jb25zdF94bWxQYXJzZXJOb2RlSW5mb1NlcVB0ciAxCnN0YXRpYyB4bWxQYXJzZXJOb2RlSW5mb1NlcVB0ciBnZW5fY29uc3RfeG1sUGFyc2VyTm9kZUluZm9TZXFQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX2NvbnN0X3htbFBhcnNlck5vZGVJbmZvU2VxUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxQYXJzZXJOb2RlSW5mb1NlcVB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKc3RhdGljIGludAp0ZXN0X3htbFBhcnNlckZpbmROb2RlSW5mb0luZGV4KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgdW5zaWduZWQgbG9uZyByZXRfdmFsOwogICAgeG1sUGFyc2VyTm9kZUluZm9TZXFQdHIgc2VxOyAvKiBhIG5vZGUgaW5mbyBzZXF1ZW5jZSBwb2ludGVyICovCiAgICBpbnQgbl9zZXE7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIGFuIFhNTCBub2RlIHBvaW50ZXIgKi8KICAgIGludCBuX25vZGU7CgogICAgZm9yIChuX3NlcSA9IDA7bl9zZXEgPCBnZW5fbmJfY29uc3RfeG1sUGFyc2VyTm9kZUluZm9TZXFQdHI7bl9zZXErKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl9jb25zdF94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzZXEgPSBnZW5fY29uc3RfeG1sUGFyc2VyTm9kZUluZm9TZXFQdHIobl9zZXEsIDApOwogICAgICAgIG5vZGUgPSBnZW5fY29uc3RfeG1sTm9kZVB0cihuX25vZGUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sUGFyc2VyRmluZE5vZGVJbmZvSW5kZXgoKGNvbnN0IHhtbFBhcnNlck5vZGVJbmZvU2VxUHRyKXNlcSwgKGNvbnN0IHhtbE5vZGVQdHIpbm9kZSk7CiAgICAgICAgZGVzcmV0X3Vuc2lnbmVkX2xvbmcocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxQYXJzZXJOb2RlSW5mb1NlcVB0cihuX3NlcSwgKGNvbnN0IHhtbFBhcnNlck5vZGVJbmZvU2VxUHRyKXNlcSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbE5vZGVQdHIobl9ub2RlLCAoY29uc3QgeG1sTm9kZVB0cilub2RlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlckZpbmROb2RlSW5mb0luZGV4IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NlcSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCiNkZWZpbmUgZ2VuX25iX3htbFBhcnNlcklucHV0UHRyIDEKc3RhdGljIHhtbFBhcnNlcklucHV0UHRyIGdlbl94bWxQYXJzZXJJbnB1dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sUGFyc2VySW5wdXRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFBhcnNlcklucHV0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VySW5wdXRHcm93KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXJzZXJJbnB1dFB0ciBpbjsgLyogYW4gWE1MIHBhcnNlciBpbnB1dCAqLwogICAgaW50IG5faW47CiAgICBpbnQgbGVuOyAvKiBhbiBpbmRpY2F0aXZlIHNpemUgZm9yIHRoZSBsb29rYWhlYWQgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5faW4gPSAwO25faW4gPCBnZW5fbmJfeG1sUGFyc2VySW5wdXRQdHI7bl9pbisrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgaW4gPSBnZW5feG1sUGFyc2VySW5wdXRQdHIobl9pbiwgMCk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxQYXJzZXJJbnB1dEdyb3coaW4sIGxlbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlcklucHV0UHRyKG5faW4sIGluLCAwKTsKICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VySW5wdXRHcm93IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2luKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VySW5wdXRSZWFkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXJzZXJJbnB1dFB0ciBpbjsgLyogYW4gWE1MIHBhcnNlciBpbnB1dCAqLwogICAgaW50IG5faW47CiAgICBpbnQgbGVuOyAvKiBhbiBpbmRpY2F0aXZlIHNpemUgZm9yIHRoZSBsb29rYWhlYWQgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5faW4gPSAwO25faW4gPCBnZW5fbmJfeG1sUGFyc2VySW5wdXRQdHI7bl9pbisrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgaW4gPSBnZW5feG1sUGFyc2VySW5wdXRQdHIobl9pbiwgMCk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxQYXJzZXJJbnB1dFJlYWQoaW4sIGxlbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlcklucHV0UHRyKG5faW4sIGluLCAwKTsKICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VySW5wdXRSZWFkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2luKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGVkYW50aWNQYXJzZXJEZWZhdWx0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgdmFsOyAvKiBpbnQgMCBvciAxICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfaW50O25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl9pbnQobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sUGVkYW50aWNQYXJzZXJEZWZhdWx0KHZhbCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBlZGFudGljUGFyc2VyRGVmYXVsdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlYWREb2Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxEb2NQdHIgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBjdXI7IC8qIGEgcG9pbnRlciB0byBhIHplcm8gdGVybWluYXRlZCBzdHJpbmcgKi8KICAgIGludCBuX2N1cjsKICAgIGNvbnN0IGNoYXIgKiBVUkw7IC8qIHRoZSBiYXNlIFVSTCB0byB1c2UgZm9yIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fVVJMOwogICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgIGludCBuX2VuY29kaW5nOwogICAgaW50IG9wdGlvbnM7IC8qIGEgY29tYmluYXRpb24gb2YgeG1sUGFyc2VyT3B0aW9uICovCiAgICBpbnQgbl9vcHRpb25zOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY3VyKyspIHsKICAgIGZvciAobl9VUkwgPSAwO25fVVJMIDwgZ2VuX25iX2ZpbGVwYXRoO25fVVJMKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9vcHRpb25zID0gMDtuX29wdGlvbnMgPCBnZW5fbmJfcGFyc2Vyb3B0aW9ucztuX29wdGlvbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY3VyLCAwKTsKICAgICAgICBVUkwgPSBnZW5fZmlsZXBhdGgobl9VUkwsIDEpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDIpOwogICAgICAgIG9wdGlvbnMgPSBnZW5fcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sUmVhZERvYygoY29uc3QgeG1sQ2hhciAqKWN1ciwgVVJMLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfeG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jdXIsIChjb25zdCB4bWxDaGFyICopY3VyLCAwKTsKICAgICAgICBkZXNfZmlsZXBhdGgobl9VUkwsIFVSTCwgMSk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDIpOwogICAgICAgIGRlc19wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgb3B0aW9ucywgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWFkRG9jIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3B0aW9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVhZEZpbGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxEb2NQdHIgcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogYSBmaWxlIG9yIFVSTCAqLwogICAgaW50IG5fZmlsZW5hbWU7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiB4bWxQYXJzZXJPcHRpb24gKi8KICAgIGludCBuX29wdGlvbnM7CgogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVwYXRoO25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgZm9yIChuX29wdGlvbnMgPSAwO25fb3B0aW9ucyA8IGdlbl9uYl9wYXJzZXJvcHRpb25zO25fb3B0aW9ucysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlcGF0aChuX2ZpbGVuYW1lLCAwKTsKICAgICAgICBlbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAxKTsKICAgICAgICBvcHRpb25zID0gZ2VuX3BhcnNlcm9wdGlvbnMobl9vcHRpb25zLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlYWRGaWxlKGZpbGVuYW1lLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfeG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZXBhdGgobl9maWxlbmFtZSwgZmlsZW5hbWUsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAxKTsKICAgICAgICBkZXNfcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIG9wdGlvbnMsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVhZEZpbGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3B0aW9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVhZE1lbW9yeSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgY2hhciAqIGJ1ZmZlcjsgLyogYSBwb2ludGVyIHRvIGEgY2hhciBhcnJheSAqLwogICAgaW50IG5fYnVmZmVyOwogICAgaW50IHNpemU7IC8qIHRoZSBzaXplIG9mIHRoZSBhcnJheSAqLwogICAgaW50IG5fc2l6ZTsKICAgIGNvbnN0IGNoYXIgKiBVUkw7IC8qIHRoZSBiYXNlIFVSTCB0byB1c2UgZm9yIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fVVJMOwogICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgIGludCBuX2VuY29kaW5nOwogICAgaW50IG9wdGlvbnM7IC8qIGEgY29tYmluYXRpb24gb2YgeG1sUGFyc2VyT3B0aW9uICovCiAgICBpbnQgbl9vcHRpb25zOwoKICAgIGZvciAobl9idWZmZXIgPSAwO25fYnVmZmVyIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fYnVmZmVyKyspIHsKICAgIGZvciAobl9zaXplID0gMDtuX3NpemUgPCBnZW5fbmJfaW50O25fc2l6ZSsrKSB7CiAgICBmb3IgKG5fVVJMID0gMDtuX1VSTCA8IGdlbl9uYl9maWxlcGF0aDtuX1VSTCsrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICBmb3IgKG5fb3B0aW9ucyA9IDA7bl9vcHRpb25zIDwgZ2VuX25iX3BhcnNlcm9wdGlvbnM7bl9vcHRpb25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZmZlciA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2J1ZmZlciwgMCk7CiAgICAgICAgc2l6ZSA9IGdlbl9pbnQobl9zaXplLCAxKTsKICAgICAgICBVUkwgPSBnZW5fZmlsZXBhdGgobl9VUkwsIDIpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDMpOwogICAgICAgIG9wdGlvbnMgPSBnZW5fcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIDQpOwoKICAgICAgICByZXRfdmFsID0geG1sUmVhZE1lbW9yeSgoY29uc3QgY2hhciAqKWJ1ZmZlciwgc2l6ZSwgVVJMLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfeG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9idWZmZXIsIChjb25zdCBjaGFyICopYnVmZmVyLCAwKTsKICAgICAgICBkZXNfaW50KG5fc2l6ZSwgc2l6ZSwgMSk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fVVJMLCBVUkwsIDIpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAzKTsKICAgICAgICBkZXNfcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIG9wdGlvbnMsIDQpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVhZE1lbW9yeSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWZmZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2l6ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3B0aW9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVjb3ZlckRvYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NBWDFfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgeG1sQ2hhciAqIGN1cjsgLyogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHhtbENoYXIgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jdXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sUmVjb3ZlckRvYygoY29uc3QgeG1sQ2hhciAqKWN1cik7CiAgICAgICAgZGVzcmV0X3htbERvY1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY3VyLCAoY29uc3QgeG1sQ2hhciAqKWN1ciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWNvdmVyRG9jIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWNvdmVyRmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NBWDFfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgZmlsZW5hbWUgKi8KICAgIGludCBuX2ZpbGVuYW1lOwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlcGF0aDtuX2ZpbGVuYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sUmVjb3ZlckZpbGUoZmlsZW5hbWUpOwogICAgICAgIGRlc3JldF94bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWNvdmVyRmlsZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWNvdmVyTWVtb3J5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0FYMV9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRG9jUHRyIHJldF92YWw7CiAgICBjaGFyICogYnVmZmVyOyAvKiBhbiBwb2ludGVyIHRvIGEgY2hhciBhcnJheSAqLwogICAgaW50IG5fYnVmZmVyOwogICAgaW50IHNpemU7IC8qIHRoZSBzaXplIG9mIHRoZSBhcnJheSAqLwogICAgaW50IG5fc2l6ZTsKCiAgICBmb3IgKG5fYnVmZmVyID0gMDtuX2J1ZmZlciA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2J1ZmZlcisrKSB7CiAgICBmb3IgKG5fc2l6ZSA9IDA7bl9zaXplIDwgZ2VuX25iX2ludDtuX3NpemUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmZmVyID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fYnVmZmVyLCAwKTsKICAgICAgICBzaXplID0gZ2VuX2ludChuX3NpemUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sUmVjb3Zlck1lbW9yeSgoY29uc3QgY2hhciAqKWJ1ZmZlciwgc2l6ZSk7CiAgICAgICAgZGVzcmV0X3htbERvY1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fYnVmZmVyLCAoY29uc3QgY2hhciAqKWJ1ZmZlciwgMCk7CiAgICAgICAgZGVzX2ludChuX3NpemUsIHNpemUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVjb3Zlck1lbW9yeSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWZmZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2l6ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVhQYXJzZURURCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxEdGRQdHIgcmV0X3ZhbDsKICAgIHhtbFNBWEhhbmRsZXJQdHIgc2F4OyAvKiB0aGUgU0FYIGhhbmRsZXIgYmxvY2sgKi8KICAgIGludCBuX3NheDsKICAgIHhtbENoYXIgKiBFeHRlcm5hbElEOyAvKiBhIE5BTUUqIGNvbnRhaW5pbmcgdGhlIEV4dGVybmFsIElEIG9mIHRoZSBEVEQgKi8KICAgIGludCBuX0V4dGVybmFsSUQ7CiAgICB4bWxDaGFyICogU3lzdGVtSUQ7IC8qIGEgTkFNRSogY29udGFpbmluZyB0aGUgVVJMIHRvIHRoZSBEVEQgKi8KICAgIGludCBuX1N5c3RlbUlEOwoKICAgIGZvciAobl9zYXggPSAwO25fc2F4IDwgZ2VuX25iX3htbFNBWEhhbmRsZXJQdHI7bl9zYXgrKykgewogICAgZm9yIChuX0V4dGVybmFsSUQgPSAwO25fRXh0ZXJuYWxJRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX0V4dGVybmFsSUQrKykgewogICAgZm9yIChuX1N5c3RlbUlEID0gMDtuX1N5c3RlbUlEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fU3lzdGVtSUQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc2F4ID0gZ2VuX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIDApOwogICAgICAgIEV4dGVybmFsSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9FeHRlcm5hbElELCAxKTsKICAgICAgICBTeXN0ZW1JRCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX1N5c3RlbUlELCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNBWFBhcnNlRFREKHNheCwgKGNvbnN0IHhtbENoYXIgKilFeHRlcm5hbElELCAoY29uc3QgeG1sQ2hhciAqKVN5c3RlbUlEKTsKICAgICAgICBkZXNyZXRfeG1sRHRkUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU0FYSGFuZGxlclB0cihuX3NheCwgc2F4LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9FeHRlcm5hbElELCAoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX1N5c3RlbUlELCAoY29uc3QgeG1sQ2hhciAqKVN5c3RlbUlELCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWFBhcnNlRFREIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NheCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9FeHRlcm5hbElEKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1N5c3RlbUlEKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWFBhcnNlRG9jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0FYMV9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRG9jUHRyIHJldF92YWw7CiAgICB4bWxTQVhIYW5kbGVyUHRyIHNheDsgLyogdGhlIFNBWCBoYW5kbGVyIGJsb2NrICovCiAgICBpbnQgbl9zYXg7CiAgICB4bWxDaGFyICogY3VyOyAvKiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgeG1sQ2hhciAqLwogICAgaW50IG5fY3VyOwogICAgaW50IHJlY292ZXJ5OyAvKiB3b3JrIGluIHJlY292ZXJ5IG1vZGUsIGkuZS4gdHJpZXMgdG8gcmVhZCBubyBXZWxsIEZvcm1lZCBkb2N1bWVudHMgKi8KICAgIGludCBuX3JlY292ZXJ5OwoKICAgIGZvciAobl9zYXggPSAwO25fc2F4IDwgZ2VuX25iX3htbFNBWEhhbmRsZXJQdHI7bl9zYXgrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jdXIrKykgewogICAgZm9yIChuX3JlY292ZXJ5ID0gMDtuX3JlY292ZXJ5IDwgZ2VuX25iX2ludDtuX3JlY292ZXJ5KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHNheCA9IGdlbl94bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCAwKTsKICAgICAgICBjdXIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jdXIsIDEpOwogICAgICAgIHJlY292ZXJ5ID0gZ2VuX2ludChuX3JlY292ZXJ5LCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNBWFBhcnNlRG9jKHNheCwgKGNvbnN0IHhtbENoYXIgKiljdXIsIHJlY292ZXJ5KTsKICAgICAgICBkZXNyZXRfeG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU0FYSGFuZGxlclB0cihuX3NheCwgc2F4LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jdXIsIChjb25zdCB4bWxDaGFyICopY3VyLCAxKTsKICAgICAgICBkZXNfaW50KG5fcmVjb3ZlcnksIHJlY292ZXJ5LCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWFBhcnNlRG9jIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NheCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVjb3ZlcnkpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYUGFyc2VFbnRpdHkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQVgxX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxEb2NQdHIgcmV0X3ZhbDsKICAgIHhtbFNBWEhhbmRsZXJQdHIgc2F4OyAvKiB0aGUgU0FYIGhhbmRsZXIgYmxvY2sgKi8KICAgIGludCBuX3NheDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIGZpbGVuYW1lICovCiAgICBpbnQgbl9maWxlbmFtZTsKCiAgICBmb3IgKG5fc2F4ID0gMDtuX3NheCA8IGdlbl9uYl94bWxTQVhIYW5kbGVyUHRyO25fc2F4KyspIHsKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlcGF0aDtuX2ZpbGVuYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHNheCA9IGdlbl94bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCAwKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlcGF0aChuX2ZpbGVuYW1lLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNBWFBhcnNlRW50aXR5KHNheCwgZmlsZW5hbWUpOwogICAgICAgIGRlc3JldF94bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCBzYXgsIDApOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVhQYXJzZUVudGl0eSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zYXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYUGFyc2VGaWxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0FYMV9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRG9jUHRyIHJldF92YWw7CiAgICB4bWxTQVhIYW5kbGVyUHRyIHNheDsgLyogdGhlIFNBWCBoYW5kbGVyIGJsb2NrICovCiAgICBpbnQgbl9zYXg7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBmaWxlbmFtZSAqLwogICAgaW50IG5fZmlsZW5hbWU7CiAgICBpbnQgcmVjb3Zlcnk7IC8qIHdvcmsgaW4gcmVjb3ZlcnkgbW9kZSwgaS5lLiB0cmllcyB0byByZWFkIG5vIFdlbGwgRm9ybWVkIGRvY3VtZW50cyAqLwogICAgaW50IG5fcmVjb3Zlcnk7CgogICAgZm9yIChuX3NheCA9IDA7bl9zYXggPCBnZW5fbmJfeG1sU0FYSGFuZGxlclB0cjtuX3NheCsrKSB7CiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CiAgICBmb3IgKG5fcmVjb3ZlcnkgPSAwO25fcmVjb3ZlcnkgPCBnZW5fbmJfaW50O25fcmVjb3ZlcnkrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc2F4ID0gZ2VuX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIDApOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDEpOwogICAgICAgIHJlY292ZXJ5ID0gZ2VuX2ludChuX3JlY292ZXJ5LCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNBWFBhcnNlRmlsZShzYXgsIGZpbGVuYW1lLCByZWNvdmVyeSk7CiAgICAgICAgZGVzcmV0X3htbERvY1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIHNheCwgMCk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAxKTsKICAgICAgICBkZXNfaW50KG5fcmVjb3ZlcnksIHJlY292ZXJ5LCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWFBhcnNlRmlsZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zYXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVjb3ZlcnkpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYUGFyc2VGaWxlV2l0aERhdGEodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQVgxX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxEb2NQdHIgcmV0X3ZhbDsKICAgIHhtbFNBWEhhbmRsZXJQdHIgc2F4OyAvKiB0aGUgU0FYIGhhbmRsZXIgYmxvY2sgKi8KICAgIGludCBuX3NheDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIGZpbGVuYW1lICovCiAgICBpbnQgbl9maWxlbmFtZTsKICAgIGludCByZWNvdmVyeTsgLyogd29yayBpbiByZWNvdmVyeSBtb2RlLCBpLmUuIHRyaWVzIHRvIHJlYWQgbm8gV2VsbCBGb3JtZWQgZG9jdW1lbnRzICovCiAgICBpbnQgbl9yZWNvdmVyeTsKICAgIHZvaWQgKiBkYXRhOyAvKiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX2RhdGE7CgogICAgZm9yIChuX3NheCA9IDA7bl9zYXggPCBnZW5fbmJfeG1sU0FYSGFuZGxlclB0cjtuX3NheCsrKSB7CiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CiAgICBmb3IgKG5fcmVjb3ZlcnkgPSAwO25fcmVjb3ZlcnkgPCBnZW5fbmJfaW50O25fcmVjb3ZlcnkrKykgewogICAgZm9yIChuX2RhdGEgPSAwO25fZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX2RhdGErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc2F4ID0gZ2VuX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIDApOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDEpOwogICAgICAgIHJlY292ZXJ5ID0gZ2VuX2ludChuX3JlY292ZXJ5LCAyKTsKICAgICAgICBkYXRhID0gZ2VuX3VzZXJkYXRhKG5fZGF0YSwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxTQVhQYXJzZUZpbGVXaXRoRGF0YShzYXgsIGZpbGVuYW1lLCByZWNvdmVyeSwgZGF0YSk7CiAgICAgICAgZGVzcmV0X3htbERvY1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIHNheCwgMCk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAxKTsKICAgICAgICBkZXNfaW50KG5fcmVjb3ZlcnksIHJlY292ZXJ5LCAyKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl9kYXRhLCBkYXRhLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWFBhcnNlRmlsZVdpdGhEYXRhIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NheCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWNvdmVyeSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWFBhcnNlTWVtb3J5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0FYMV9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRG9jUHRyIHJldF92YWw7CiAgICB4bWxTQVhIYW5kbGVyUHRyIHNheDsgLyogdGhlIFNBWCBoYW5kbGVyIGJsb2NrICovCiAgICBpbnQgbl9zYXg7CiAgICBjaGFyICogYnVmZmVyOyAvKiBhbiBwb2ludGVyIHRvIGEgY2hhciBhcnJheSAqLwogICAgaW50IG5fYnVmZmVyOwogICAgaW50IHNpemU7IC8qIHRoZSBzaXplIG9mIHRoZSBhcnJheSAqLwogICAgaW50IG5fc2l6ZTsKICAgIGludCByZWNvdmVyeTsgLyogd29yayBpbiByZWNvdmVyeSBtb2RlLCBpLmUuIHRyaWVzIHRvIHJlYWQgbm90IFdlbGwgRm9ybWVkIGRvY3VtZW50cyAqLwogICAgaW50IG5fcmVjb3Zlcnk7CgogICAgZm9yIChuX3NheCA9IDA7bl9zYXggPCBnZW5fbmJfeG1sU0FYSGFuZGxlclB0cjtuX3NheCsrKSB7CiAgICBmb3IgKG5fYnVmZmVyID0gMDtuX2J1ZmZlciA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2J1ZmZlcisrKSB7CiAgICBmb3IgKG5fc2l6ZSA9IDA7bl9zaXplIDwgZ2VuX25iX2ludDtuX3NpemUrKykgewogICAgZm9yIChuX3JlY292ZXJ5ID0gMDtuX3JlY292ZXJ5IDwgZ2VuX25iX2ludDtuX3JlY292ZXJ5KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHNheCA9IGdlbl94bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCAwKTsKICAgICAgICBidWZmZXIgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9idWZmZXIsIDEpOwogICAgICAgIHNpemUgPSBnZW5faW50KG5fc2l6ZSwgMik7CiAgICAgICAgcmVjb3ZlcnkgPSBnZW5faW50KG5fcmVjb3ZlcnksIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU0FYUGFyc2VNZW1vcnkoc2F4LCAoY29uc3QgY2hhciAqKWJ1ZmZlciwgc2l6ZSwgcmVjb3ZlcnkpOwogICAgICAgIGRlc3JldF94bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCBzYXgsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2J1ZmZlciwgKGNvbnN0IGNoYXIgKilidWZmZXIsIDEpOwogICAgICAgIGRlc19pbnQobl9zaXplLCBzaXplLCAyKTsKICAgICAgICBkZXNfaW50KG5fcmVjb3ZlcnksIHJlY292ZXJ5LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWFBhcnNlTWVtb3J5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NheCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWZmZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2l6ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWNvdmVyeSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTQVhQYXJzZU1lbW9yeVdpdGhEYXRhKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0FYMV9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRG9jUHRyIHJldF92YWw7CiAgICB4bWxTQVhIYW5kbGVyUHRyIHNheDsgLyogdGhlIFNBWCBoYW5kbGVyIGJsb2NrICovCiAgICBpbnQgbl9zYXg7CiAgICBjaGFyICogYnVmZmVyOyAvKiBhbiBwb2ludGVyIHRvIGEgY2hhciBhcnJheSAqLwogICAgaW50IG5fYnVmZmVyOwogICAgaW50IHNpemU7IC8qIHRoZSBzaXplIG9mIHRoZSBhcnJheSAqLwogICAgaW50IG5fc2l6ZTsKICAgIGludCByZWNvdmVyeTsgLyogd29yayBpbiByZWNvdmVyeSBtb2RlLCBpLmUuIHRyaWVzIHRvIHJlYWQgbm8gV2VsbCBGb3JtZWQgZG9jdW1lbnRzICovCiAgICBpbnQgbl9yZWNvdmVyeTsKICAgIHZvaWQgKiBkYXRhOyAvKiB0aGUgdXNlcmRhdGEgKi8KICAgIGludCBuX2RhdGE7CgogICAgZm9yIChuX3NheCA9IDA7bl9zYXggPCBnZW5fbmJfeG1sU0FYSGFuZGxlclB0cjtuX3NheCsrKSB7CiAgICBmb3IgKG5fYnVmZmVyID0gMDtuX2J1ZmZlciA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2J1ZmZlcisrKSB7CiAgICBmb3IgKG5fc2l6ZSA9IDA7bl9zaXplIDwgZ2VuX25iX2ludDtuX3NpemUrKykgewogICAgZm9yIChuX3JlY292ZXJ5ID0gMDtuX3JlY292ZXJ5IDwgZ2VuX25iX2ludDtuX3JlY292ZXJ5KyspIHsKICAgIGZvciAobl9kYXRhID0gMDtuX2RhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl9kYXRhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHNheCA9IGdlbl94bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCAwKTsKICAgICAgICBidWZmZXIgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9idWZmZXIsIDEpOwogICAgICAgIHNpemUgPSBnZW5faW50KG5fc2l6ZSwgMik7CiAgICAgICAgcmVjb3ZlcnkgPSBnZW5faW50KG5fcmVjb3ZlcnksIDMpOwogICAgICAgIGRhdGEgPSBnZW5fdXNlcmRhdGEobl9kYXRhLCA0KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNBWFBhcnNlTWVtb3J5V2l0aERhdGEoc2F4LCAoY29uc3QgY2hhciAqKWJ1ZmZlciwgc2l6ZSwgcmVjb3ZlcnksIGRhdGEpOwogICAgICAgIGRlc3JldF94bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCBzYXgsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2J1ZmZlciwgKGNvbnN0IGNoYXIgKilidWZmZXIsIDEpOwogICAgICAgIGRlc19pbnQobl9zaXplLCBzaXplLCAyKTsKICAgICAgICBkZXNfaW50KG5fcmVjb3ZlcnksIHJlY292ZXJ5LCAzKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl9kYXRhLCBkYXRhLCA0KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNBWFBhcnNlTWVtb3J5V2l0aERhdGEiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2F4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1ZmZlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlY292ZXJ5KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RhdGEpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU0FYVXNlclBhcnNlRmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NBWDFfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU0FYSGFuZGxlclB0ciBzYXg7IC8qIGEgU0FYIGhhbmRsZXIgKi8KICAgIGludCBuX3NheDsKICAgIHZvaWQgKiB1c2VyX2RhdGE7IC8qIFRoZSB1c2VyIGRhdGEgcmV0dXJuZWQgb24gU0FYIGNhbGxiYWNrcyAqLwogICAgaW50IG5fdXNlcl9kYXRhOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiBhIGZpbGUgbmFtZSAqLwogICAgaW50IG5fZmlsZW5hbWU7CgogICAgZm9yIChuX3NheCA9IDA7bl9zYXggPCBnZW5fbmJfeG1sU0FYSGFuZGxlclB0cjtuX3NheCsrKSB7CiAgICBmb3IgKG5fdXNlcl9kYXRhID0gMDtuX3VzZXJfZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX3VzZXJfZGF0YSsrKSB7CiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzYXggPSBnZW5feG1sU0FYSGFuZGxlclB0cihuX3NheCwgMCk7CiAgICAgICAgdXNlcl9kYXRhID0gZ2VuX3VzZXJkYXRhKG5fdXNlcl9kYXRhLCAxKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlcGF0aChuX2ZpbGVuYW1lLCAyKTsKICAgICAgICAKI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgICAgICBpZiAoc2F4ID09ICh4bWxTQVhIYW5kbGVyUHRyKSZ4bWxEZWZhdWx0U0FYSGFuZGxlcikgdXNlcl9kYXRhID0gTlVMTDsKI2VuZGlmCgoKICAgICAgICByZXRfdmFsID0geG1sU0FYVXNlclBhcnNlRmlsZShzYXgsIHVzZXJfZGF0YSwgZmlsZW5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCBzYXgsIDApOwogICAgICAgIGRlc191c2VyZGF0YShuX3VzZXJfZGF0YSwgdXNlcl9kYXRhLCAxKTsKICAgICAgICBkZXNfZmlsZXBhdGgobl9maWxlbmFtZSwgZmlsZW5hbWUsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU0FYVXNlclBhcnNlRmlsZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zYXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXNlcl9kYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNBWFVzZXJQYXJzZU1lbW9yeSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NBWDFfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU0FYSGFuZGxlclB0ciBzYXg7IC8qIGEgU0FYIGhhbmRsZXIgKi8KICAgIGludCBuX3NheDsKICAgIHZvaWQgKiB1c2VyX2RhdGE7IC8qIFRoZSB1c2VyIGRhdGEgcmV0dXJuZWQgb24gU0FYIGNhbGxiYWNrcyAqLwogICAgaW50IG5fdXNlcl9kYXRhOwogICAgY2hhciAqIGJ1ZmZlcjsgLyogYW4gaW4tbWVtb3J5IFhNTCBkb2N1bWVudCBpbnB1dCAqLwogICAgaW50IG5fYnVmZmVyOwogICAgaW50IHNpemU7IC8qIHRoZSBsZW5ndGggb2YgdGhlIFhNTCBkb2N1bWVudCBpbiBieXRlcyAqLwogICAgaW50IG5fc2l6ZTsKCiAgICBmb3IgKG5fc2F4ID0gMDtuX3NheCA8IGdlbl9uYl94bWxTQVhIYW5kbGVyUHRyO25fc2F4KyspIHsKICAgIGZvciAobl91c2VyX2RhdGEgPSAwO25fdXNlcl9kYXRhIDwgZ2VuX25iX3VzZXJkYXRhO25fdXNlcl9kYXRhKyspIHsKICAgIGZvciAobl9idWZmZXIgPSAwO25fYnVmZmVyIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fYnVmZmVyKyspIHsKICAgIGZvciAobl9zaXplID0gMDtuX3NpemUgPCBnZW5fbmJfaW50O25fc2l6ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzYXggPSBnZW5feG1sU0FYSGFuZGxlclB0cihuX3NheCwgMCk7CiAgICAgICAgdXNlcl9kYXRhID0gZ2VuX3VzZXJkYXRhKG5fdXNlcl9kYXRhLCAxKTsKICAgICAgICBidWZmZXIgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9idWZmZXIsIDIpOwogICAgICAgIHNpemUgPSBnZW5faW50KG5fc2l6ZSwgMyk7CiAgICAgICAgCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECiAgICAgICAgaWYgKHNheCA9PSAoeG1sU0FYSGFuZGxlclB0cikmeG1sRGVmYXVsdFNBWEhhbmRsZXIpIHVzZXJfZGF0YSA9IE5VTEw7CiNlbmRpZgoKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNBWFVzZXJQYXJzZU1lbW9yeShzYXgsIHVzZXJfZGF0YSwgKGNvbnN0IGNoYXIgKilidWZmZXIsIHNpemUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCBzYXgsIDApOwogICAgICAgIGRlc191c2VyZGF0YShuX3VzZXJfZGF0YSwgdXNlcl9kYXRhLCAxKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9idWZmZXIsIChjb25zdCBjaGFyICopYnVmZmVyLCAyKTsKICAgICAgICBkZXNfaW50KG5fc2l6ZSwgc2l6ZSwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTQVhVc2VyUGFyc2VNZW1vcnkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2F4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3VzZXJfZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWZmZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2l6ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTZXRFeHRlcm5hbEVudGl0eUxvYWRlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTZXRGZWF0dXJlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfTEVHQUNZX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfTEVHQUNZX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwvSFRNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNoYXIgKiBuYW1lOyAvKiB0aGUgZmVhdHVyZSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgdm9pZCAqIHZhbHVlOyAvKiBwb2ludGVyIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgbmV3IHZhbHVlICovCiAgICBpbnQgbl92YWx1ZTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl92b2lkX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICB2YWx1ZSA9IGdlbl92b2lkX3B0cihuX3ZhbHVlLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNldEZlYXR1cmUoY3R4dCwgKGNvbnN0IGNoYXIgKiluYW1lLCB2YWx1ZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9uYW1lLCAoY29uc3QgY2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc192b2lkX3B0cihuX3ZhbHVlLCB2YWx1ZSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTZXRGZWF0dXJlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTZXR1cFBhcnNlckZvckJ1ZmZlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NBWDFfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sQ2hhciAqIGJ1ZmZlcjsgLyogYSB4bWxDaGFyICogYnVmZmVyICovCiAgICBpbnQgbl9idWZmZXI7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIGEgZmlsZSBuYW1lICovCiAgICBpbnQgbl9maWxlbmFtZTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9idWZmZXIgPSAwO25fYnVmZmVyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fYnVmZmVyKyspIHsKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlcGF0aDtuX2ZpbGVuYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGJ1ZmZlciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2J1ZmZlciwgMSk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZXBhdGgobl9maWxlbmFtZSwgMik7CgogICAgICAgIHhtbFNldHVwUGFyc2VyRm9yQnVmZmVyKGN0eHQsIChjb25zdCB4bWxDaGFyICopYnVmZmVyLCBmaWxlbmFtZSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fYnVmZmVyLCAoY29uc3QgeG1sQ2hhciAqKWJ1ZmZlciwgMSk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNldHVwUGFyc2VyRm9yQnVmZmVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmZmVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFN0b3BQYXJzZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZmRlZiBMSUJYTUxfUFVTSF9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICB4bWxTdG9wUGFyc2VyKGN0eHQpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU3RvcFBhcnNlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3Vic3RpdHV0ZUVudGl0aWVzRGVmYXVsdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IHZhbDsgLyogaW50IDAgb3IgMSAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX2ludDtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwgPSBnZW5faW50KG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFN1YnN0aXR1dGVFbnRpdGllc0RlZmF1bHQodmFsKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fdmFsLCB2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU3Vic3RpdHV0ZUVudGl0aWVzRGVmYXVsdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfcGFyc2VyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyBwYXJzZXIgOiA2MSBvZiA3MCBmdW5jdGlvbnMgLi4uXG4iKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQnl0ZUNvbnN1bWVkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENsZWFyTm9kZUluZm9TZXEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ2xlYXJQYXJzZXJDdHh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENyZWF0ZURvY1BhcnNlckN0eHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ3JlYXRlUHVzaFBhcnNlckN0eHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ3R4dFJlYWREb2MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ3R4dFJlYWRGaWxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEN0eHRSZWFkTWVtb3J5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEN0eHRSZXNldCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDdHh0UmVzZXRQdXNoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEN0eHRVc2VPcHRpb25zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEdldEV4dGVybmFsRW50aXR5TG9hZGVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEdldEZlYXR1cmUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0RmVhdHVyZXNMaXN0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEhhc0ZlYXR1cmUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSU9QYXJzZURURCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxJbml0Tm9kZUluZm9TZXEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSW5pdFBhcnNlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxJbml0UGFyc2VyQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxLZWVwQmxhbmtzRGVmYXVsdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxMaW5lTnVtYmVyc0RlZmF1bHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTG9hZEV4dGVybmFsRW50aXR5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld0lPSW5wdXRTdHJlYW0oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3UGFyc2VyQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZUJhbGFuY2VkQ2h1bmtNZW1vcnkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VCYWxhbmNlZENodW5rTWVtb3J5UmVjb3ZlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZUNodW5rKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlQ3R4dEV4dGVybmFsRW50aXR5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlRFREKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlRG9jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlRG9jdW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VFbnRpdHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VFeHRQYXJzZWRFbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VFeHRlcm5hbEVudGl0eSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZUZpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VJbk5vZGVDb250ZXh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlTWVtb3J5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlckFkZE5vZGVJbmZvKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlckZpbmROb2RlSW5mbygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZXJGaW5kTm9kZUluZm9JbmRleCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZXJJbnB1dEdyb3coKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VySW5wdXRSZWFkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBlZGFudGljUGFyc2VyRGVmYXVsdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWFkRG9jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlYWRGaWxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlYWRNZW1vcnkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVjb3ZlckRvYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWNvdmVyRmlsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWNvdmVyTWVtb3J5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWFBhcnNlRFREKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWFBhcnNlRG9jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWFBhcnNlRW50aXR5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWFBhcnNlRmlsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVhQYXJzZUZpbGVXaXRoRGF0YSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVhQYXJzZU1lbW9yeSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTQVhQYXJzZU1lbW9yeVdpdGhEYXRhKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNBWFVzZXJQYXJzZUZpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU0FYVXNlclBhcnNlTWVtb3J5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNldEV4dGVybmFsRW50aXR5TG9hZGVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNldEZlYXR1cmUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2V0dXBQYXJzZXJGb3JCdWZmZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3RvcFBhcnNlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdWJzdGl0dXRlRW50aXRpZXNEZWZhdWx0KCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSBwYXJzZXI6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X2h0bWxDcmVhdGVGaWxlUGFyc2VyQ3R4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGh0bWxQYXJzZXJDdHh0UHRyIHJldF92YWw7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBmaWxlbmFtZSAqLwogICAgaW50IG5fZmlsZW5hbWU7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIGEgZnJlZSBmb3JtIEMgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIEhUTUwgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgIGludCBuX2VuY29kaW5nOwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlb3V0cHV0O25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZW91dHB1dChuX2ZpbGVuYW1lLCAwKTsKICAgICAgICBlbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IGh0bWxDcmVhdGVGaWxlUGFyc2VyQ3R4dChmaWxlbmFtZSwgKGNvbnN0IGNoYXIgKillbmNvZGluZyk7CiAgICAgICAgZGVzcmV0X2h0bWxQYXJzZXJDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZW91dHB1dChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbENyZWF0ZUZpbGVQYXJzZXJDdHh0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaHRtbEluaXRBdXRvQ2xvc2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CgogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CgogICAgICAgIGh0bWxJbml0QXV0b0Nsb3NlKCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbEluaXRBdXRvQ2xvc2UiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9pbnB1dFBvcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlcklucHV0UHRyIHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICByZXRfdmFsID0gaW5wdXRQb3AoY3R4dCk7CiAgICAgICAgZGVzcmV0X3htbFBhcnNlcklucHV0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaW5wdXRQb3AiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfaW5wdXRQdXNoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbFBhcnNlcklucHV0UHRyIHZhbHVlOyAvKiB0aGUgcGFyc2VyIGlucHV0ICovCiAgICBpbnQgbl92YWx1ZTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl94bWxQYXJzZXJJbnB1dFB0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIHZhbHVlID0gZ2VuX3htbFBhcnNlcklucHV0UHRyKG5fdmFsdWUsIDEpOwoKICAgICAgICByZXRfdmFsID0gaW5wdXRQdXNoKGN0eHQsIHZhbHVlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxQYXJzZXJJbnB1dFB0cihuX3ZhbHVlLCB2YWx1ZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBpbnB1dFB1c2giLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfbmFtZVBvcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IG5hbWVQb3AoY3R4dCk7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gbmFtZVBvcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF9uYW1lUHVzaCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSBlbGVtZW50IG5hbWUgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMSk7CgogICAgICAgIHJldF92YWwgPSBuYW1lUHVzaChjdHh0LCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIG5hbWVQdXNoIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X25vZGVQb3Aodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICByZXRfdmFsID0gbm9kZVBvcChjdHh0KTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIG5vZGVQb3AiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3Rfbm9kZVB1c2godm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sTm9kZVB0ciB2YWx1ZTsgLyogdGhlIGVsZW1lbnQgbm9kZSAqLwogICAgaW50IG5fdmFsdWU7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIHZhbHVlID0gZ2VuX3htbE5vZGVQdHIobl92YWx1ZSwgMSk7CgogICAgICAgIHJldF92YWwgPSBub2RlUHVzaChjdHh0LCB2YWx1ZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX3ZhbHVlLCB2YWx1ZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBub2RlUHVzaCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDaGVja0xhbmd1YWdlSUQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBsYW5nOyAvKiBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdmFsdWUgKi8KICAgIGludCBuX2xhbmc7CgogICAgZm9yIChuX2xhbmcgPSAwO25fbGFuZyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2xhbmcrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbGFuZyA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2xhbmcsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQ2hlY2tMYW5ndWFnZUlEKChjb25zdCB4bWxDaGFyICopbGFuZyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbGFuZywgKGNvbnN0IHhtbENoYXIgKilsYW5nLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENoZWNrTGFuZ3VhZ2VJRCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sYW5nKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDb3B5Q2hhcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGxlbjsgLyogSWdub3JlZCwgY29tcGF0aWJpbGl0eSAqLwogICAgaW50IG5fbGVuOwogICAgeG1sQ2hhciAqIG91dDsgLyogcG9pbnRlciB0byBhbiBhcnJheSBvZiB4bWxDaGFyICovCiAgICBpbnQgbl9vdXQ7CiAgICBpbnQgdmFsOyAvKiB0aGUgY2hhciB2YWx1ZSAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICBmb3IgKG5fb3V0ID0gMDtuX291dCA8IGdlbl9uYl94bWxDaGFyX3B0cjtuX291dCsrKSB7CiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl9pbnQ7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMCk7CiAgICAgICAgb3V0ID0gZ2VuX3htbENoYXJfcHRyKG5fb3V0LCAxKTsKICAgICAgICB2YWwgPSBnZW5faW50KG5fdmFsLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENvcHlDaGFyKGxlbiwgb3V0LCB2YWwpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMCk7CiAgICAgICAgZGVzX3htbENoYXJfcHRyKG5fb3V0LCBvdXQsIDEpOwogICAgICAgIGRlc19pbnQobl92YWwsIHZhbCwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDb3B5Q2hhciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ29weUNoYXJNdWx0aUJ5dGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBvdXQ7IC8qIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgeG1sQ2hhciAqLwogICAgaW50IG5fb3V0OwogICAgaW50IHZhbDsgLyogdGhlIGNoYXIgdmFsdWUgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fb3V0ID0gMDtuX291dCA8IGdlbl9uYl94bWxDaGFyX3B0cjtuX291dCsrKSB7CiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl9pbnQ7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgb3V0ID0gZ2VuX3htbENoYXJfcHRyKG5fb3V0LCAwKTsKICAgICAgICB2YWwgPSBnZW5faW50KG5fdmFsLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENvcHlDaGFyTXVsdGlCeXRlKG91dCwgdmFsKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQ2hhcl9wdHIobl9vdXQsIG91dCwgMCk7CiAgICAgICAgZGVzX2ludChuX3ZhbCwgdmFsLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENvcHlDaGFyTXVsdGlCeXRlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENyZWF0ZUVudGl0eVBhcnNlckN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJDdHh0UHRyIHJldF92YWw7CiAgICB4bWxDaGFyICogVVJMOyAvKiB0aGUgZW50aXR5IFVSTCAqLwogICAgaW50IG5fVVJMOwogICAgeG1sQ2hhciAqIElEOyAvKiB0aGUgZW50aXR5IFBVQkxJQyBJRCAqLwogICAgaW50IG5fSUQ7CiAgICB4bWxDaGFyICogYmFzZTsgLyogYSBwb3NzaWJsZSBiYXNlIGZvciB0aGUgdGFyZ2V0IFVSSSAqLwogICAgaW50IG5fYmFzZTsKCiAgICBmb3IgKG5fVVJMID0gMDtuX1VSTCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX1VSTCsrKSB7CiAgICBmb3IgKG5fSUQgPSAwO25fSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9JRCsrKSB7CiAgICBmb3IgKG5fYmFzZSA9IDA7bl9iYXNlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fYmFzZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBVUkwgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9VUkwsIDApOwogICAgICAgIElEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fSUQsIDEpOwogICAgICAgIGJhc2UgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9iYXNlLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENyZWF0ZUVudGl0eVBhcnNlckN0eHQoKGNvbnN0IHhtbENoYXIgKilVUkwsIChjb25zdCB4bWxDaGFyICopSUQsIChjb25zdCB4bWxDaGFyICopYmFzZSk7CiAgICAgICAgZGVzcmV0X3htbFBhcnNlckN0eHRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX1VSTCwgKGNvbnN0IHhtbENoYXIgKilVUkwsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX0lELCAoY29uc3QgeG1sQ2hhciAqKUlELCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9iYXNlLCAoY29uc3QgeG1sQ2hhciAqKWJhc2UsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ3JlYXRlRW50aXR5UGFyc2VyQ3R4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fSUQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYmFzZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ3JlYXRlRmlsZVBhcnNlckN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJDdHh0UHRyIHJldF92YWw7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBmaWxlbmFtZSAqLwogICAgaW50IG5fZmlsZW5hbWU7CgogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVvdXRwdXQ7bl9maWxlbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlb3V0cHV0KG5fZmlsZW5hbWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQ3JlYXRlRmlsZVBhcnNlckN0eHQoZmlsZW5hbWUpOwogICAgICAgIGRlc3JldF94bWxQYXJzZXJDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZW91dHB1dChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDcmVhdGVGaWxlUGFyc2VyQ3R4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ3JlYXRlTWVtb3J5UGFyc2VyQ3R4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlckN0eHRQdHIgcmV0X3ZhbDsKICAgIGNoYXIgKiBidWZmZXI7IC8qIGEgcG9pbnRlciB0byBhIGNoYXIgYXJyYXkgKi8KICAgIGludCBuX2J1ZmZlcjsKICAgIGludCBzaXplOyAvKiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgKi8KICAgIGludCBuX3NpemU7CgogICAgZm9yIChuX2J1ZmZlciA9IDA7bl9idWZmZXIgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9idWZmZXIrKykgewogICAgZm9yIChuX3NpemUgPSAwO25fc2l6ZSA8IGdlbl9uYl9pbnQ7bl9zaXplKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZmZlciA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2J1ZmZlciwgMCk7CiAgICAgICAgc2l6ZSA9IGdlbl9pbnQobl9zaXplLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENyZWF0ZU1lbW9yeVBhcnNlckN0eHQoKGNvbnN0IGNoYXIgKilidWZmZXIsIHNpemUpOwogICAgICAgIGRlc3JldF94bWxQYXJzZXJDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9idWZmZXIsIChjb25zdCBjaGFyICopYnVmZmVyLCAwKTsKICAgICAgICBkZXNfaW50KG5fc2l6ZSwgc2l6ZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDcmVhdGVNZW1vcnlQYXJzZXJDdHh0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1ZmZlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDcmVhdGVVUkxQYXJzZXJDdHh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VyQ3R4dFB0ciByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgZmlsZW5hbWUgb3IgVVJMICovCiAgICBpbnQgbl9maWxlbmFtZTsKICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIHhtbFBhcnNlck9wdGlvbiAqLwogICAgaW50IG5fb3B0aW9uczsKCiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZW91dHB1dDtuX2ZpbGVuYW1lKyspIHsKICAgIGZvciAobl9vcHRpb25zID0gMDtuX29wdGlvbnMgPCBnZW5fbmJfaW50O25fb3B0aW9ucysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlb3V0cHV0KG5fZmlsZW5hbWUsIDApOwogICAgICAgIG9wdGlvbnMgPSBnZW5faW50KG5fb3B0aW9ucywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxDcmVhdGVVUkxQYXJzZXJDdHh0KGZpbGVuYW1lLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfeG1sUGFyc2VyQ3R4dFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVvdXRwdXQobl9maWxlbmFtZSwgZmlsZW5hbWUsIDApOwogICAgICAgIGRlc19pbnQobl9vcHRpb25zLCBvcHRpb25zLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENyZWF0ZVVSTFBhcnNlckN0eHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3B0aW9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ3VycmVudENoYXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogdGhlIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCAqIGxlbjsgLyogcG9pbnRlciB0byB0aGUgbGVuZ3RoIG9mIHRoZSBjaGFyIHJlYWQgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludF9wdHI7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgbGVuID0gZ2VuX2ludF9wdHIobl9sZW4sIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQ3VycmVudENoYXIoY3R4dCwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnRfcHRyKG5fbGVuLCBsZW4sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ3VycmVudENoYXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEVyck1lbW9yeSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgY2hhciAqIGV4dHJhOyAvKiBleHRyYSBpbmZvcm1hdGlvbnMgKi8KICAgIGludCBuX2V4dHJhOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2V4dHJhID0gMDtuX2V4dHJhIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZXh0cmErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZXh0cmEgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9leHRyYSwgMSk7CgogICAgICAgIHhtbEVyck1lbW9yeShjdHh0LCAoY29uc3QgY2hhciAqKWV4dHJhKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9leHRyYSwgKGNvbnN0IGNoYXIgKilleHRyYSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxFcnJNZW1vcnkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9leHRyYSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSXNMZXR0ZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjOyAvKiBhbiB1bmljb2RlIGNoYXJhY3RlciAoaW50KSAqLwogICAgaW50IG5fYzsKCiAgICBmb3IgKG5fYyA9IDA7bl9jIDwgZ2VuX25iX2ludDtuX2MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYyA9IGdlbl9pbnQobl9jLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbElzTGV0dGVyKGMpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jLCBjLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbElzTGV0dGVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5ld0VudGl0eUlucHV0U3RyZWFtKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VySW5wdXRQdHIgcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRW50aXR5UHRyIGVudGl0eTsgLyogYW4gRW50aXR5IHBvaW50ZXIgKi8KICAgIGludCBuX2VudGl0eTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9lbnRpdHkgPSAwO25fZW50aXR5IDwgZ2VuX25iX3htbEVudGl0eVB0cjtuX2VudGl0eSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBlbnRpdHkgPSBnZW5feG1sRW50aXR5UHRyKG5fZW50aXR5LCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld0VudGl0eUlucHV0U3RyZWFtKGN0eHQsIGVudGl0eSk7CiAgICAgICAgZGVzcmV0X3htbFBhcnNlcklucHV0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxFbnRpdHlQdHIobl9lbnRpdHksIGVudGl0eSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOZXdFbnRpdHlJbnB1dFN0cmVhbSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VudGl0eSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3SW5wdXRGcm9tRmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlcklucHV0UHRyIHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIGZpbGVuYW1lIHRvIHVzZSBhcyBlbnRpdHkgKi8KICAgIGludCBuX2ZpbGVuYW1lOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVwYXRoO25fZmlsZW5hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZXBhdGgobl9maWxlbmFtZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdJbnB1dEZyb21GaWxlKGN0eHQsIGZpbGVuYW1lKTsKICAgICAgICBkZXNyZXRfeG1sUGFyc2VySW5wdXRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0lucHV0RnJvbUZpbGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3SW5wdXRTdHJlYW0odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJJbnB1dFB0ciByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld0lucHV0U3RyZWFtKGN0eHQpOwogICAgICAgIGRlc3JldF94bWxQYXJzZXJJbnB1dFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0lucHV0U3RyZWFtIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5ld1N0cmluZ0lucHV0U3RyZWFtKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VySW5wdXRQdHIgcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sQ2hhciAqIGJ1ZmZlcjsgLyogYW4gbWVtb3J5IGJ1ZmZlciAqLwogICAgaW50IG5fYnVmZmVyOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2J1ZmZlciA9IDA7bl9idWZmZXIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9idWZmZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgYnVmZmVyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fYnVmZmVyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld1N0cmluZ0lucHV0U3RyZWFtKGN0eHQsIChjb25zdCB4bWxDaGFyICopYnVmZmVyKTsKICAgICAgICBkZXNyZXRfeG1sUGFyc2VySW5wdXRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fYnVmZmVyLCAoY29uc3QgeG1sQ2hhciAqKWJ1ZmZlciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOZXdTdHJpbmdJbnB1dFN0cmVhbSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1ZmZlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV4dENoYXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIHRoZSBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgeG1sTmV4dENoYXIoY3R4dCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOZXh0Q2hhciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZXJJbnB1dFNocmluayh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlcklucHV0UHRyIGluOyAvKiBhbiBYTUwgcGFyc2VyIGlucHV0ICovCiAgICBpbnQgbl9pbjsKCiAgICBmb3IgKG5faW4gPSAwO25faW4gPCBnZW5fbmJfeG1sUGFyc2VySW5wdXRQdHI7bl9pbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBpbiA9IGdlbl94bWxQYXJzZXJJbnB1dFB0cihuX2luLCAwKTsKCiAgICAgICAgeG1sUGFyc2VySW5wdXRTaHJpbmsoaW4pOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VySW5wdXRQdHIobl9pbiwgaW4sIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VySW5wdXRTaHJpbmsiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBvcElucHV0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBvcElucHV0KGN0eHQpOwogICAgICAgIGRlc3JldF94bWxDaGFyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUG9wSW5wdXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUHVzaElucHV0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbFBhcnNlcklucHV0UHRyIGlucHV0OyAvKiBhbiBYTUwgcGFyc2VyIGlucHV0IGZyYWdtZW50IChlbnRpdHksIFhNTCBmcmFnbWVudCAuLi4pLiAqLwogICAgaW50IG5faW5wdXQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5faW5wdXQgPSAwO25faW5wdXQgPCBnZW5fbmJfeG1sUGFyc2VySW5wdXRQdHI7bl9pbnB1dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBpbnB1dCA9IGdlbl94bWxQYXJzZXJJbnB1dFB0cihuX2lucHV0LCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFB1c2hJbnB1dChjdHh0LCBpbnB1dCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sUGFyc2VySW5wdXRQdHIobl9pbnB1dCwgaW5wdXQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUHVzaElucHV0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5wdXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNldEVudGl0eVJlZmVyZW5jZUZ1bmModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3BsaXRRTmFtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxDaGFyICogbmFtZTsgLyogYW4gWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqKiBwcmVmaXg7IC8qIGEgeG1sQ2hhciAqKiAqLwogICAgaW50IG5fcHJlZml4OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX3ByZWZpeCA9IDA7bl9wcmVmaXggPCBnZW5fbmJfeG1sQ2hhcl9wdHJfcHRyO25fcHJlZml4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBwcmVmaXggPSBnZW5feG1sQ2hhcl9wdHJfcHRyKG5fcHJlZml4LCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNwbGl0UU5hbWUoY3R4dCwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCBwcmVmaXgpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc194bWxDaGFyX3B0cl9wdHIobl9wcmVmaXgsIHByZWZpeCwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTcGxpdFFOYW1lIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wcmVmaXgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFN0cmluZ0N1cnJlbnRDaGFyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIHRoZSBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxDaGFyICogY3VyOyAvKiBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNoYXIgKi8KICAgIGludCBuX2N1cjsKICAgIGludCAqIGxlbjsgLyogcG9pbnRlciB0byB0aGUgbGVuZ3RoIG9mIHRoZSBjaGFyIHJlYWQgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY3VyKyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludF9wdHI7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgY3VyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY3VyLCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50X3B0cihuX2xlbiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxTdHJpbmdDdXJyZW50Q2hhcihjdHh0LCAoY29uc3QgeG1sQ2hhciAqKWN1ciwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2N1ciwgKGNvbnN0IHhtbENoYXIgKiljdXIsIDEpOwogICAgICAgIGRlc19pbnRfcHRyKG5fbGVuLCBsZW4sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU3RyaW5nQ3VycmVudENoYXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTdHJpbmdEZWNvZGVFbnRpdGllcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiB0aGUgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgaW5wdXQgc3RyaW5nICovCiAgICBpbnQgbl9zdHI7CiAgICBpbnQgd2hhdDsgLyogY29tYmluYXRpb24gb2YgWE1MX1NVQlNUSVRVVEVfUkVGIGFuZCBYTUxfU1VCU1RJVFVURV9QRVJFRiAqLwogICAgaW50IG5fd2hhdDsKICAgIHhtbENoYXIgZW5kOyAvKiBhbiBlbmQgbWFya2VyIHhtbENoYXIsIDAgaWYgbm9uZSAqLwogICAgaW50IG5fZW5kOwogICAgeG1sQ2hhciBlbmQyOyAvKiBhbiBlbmQgbWFya2VyIHhtbENoYXIsIDAgaWYgbm9uZSAqLwogICAgaW50IG5fZW5kMjsKICAgIHhtbENoYXIgZW5kMzsgLyogYW4gZW5kIG1hcmtlciB4bWxDaGFyLCAwIGlmIG5vbmUgKi8KICAgIGludCBuX2VuZDM7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fc3RyID0gMDtuX3N0ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cisrKSB7CiAgICBmb3IgKG5fd2hhdCA9IDA7bl93aGF0IDwgZ2VuX25iX2ludDtuX3doYXQrKykgewogICAgZm9yIChuX2VuZCA9IDA7bl9lbmQgPCBnZW5fbmJfeG1sQ2hhcjtuX2VuZCsrKSB7CiAgICBmb3IgKG5fZW5kMiA9IDA7bl9lbmQyIDwgZ2VuX25iX3htbENoYXI7bl9lbmQyKyspIHsKICAgIGZvciAobl9lbmQzID0gMDtuX2VuZDMgPCBnZW5fbmJfeG1sQ2hhcjtuX2VuZDMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgc3RyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAxKTsKICAgICAgICB3aGF0ID0gZ2VuX2ludChuX3doYXQsIDIpOwogICAgICAgIGVuZCA9IGdlbl94bWxDaGFyKG5fZW5kLCAzKTsKICAgICAgICBlbmQyID0gZ2VuX3htbENoYXIobl9lbmQyLCA0KTsKICAgICAgICBlbmQzID0gZ2VuX3htbENoYXIobl9lbmQzLCA1KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFN0cmluZ0RlY29kZUVudGl0aWVzKGN0eHQsIChjb25zdCB4bWxDaGFyICopc3RyLCB3aGF0LCBlbmQsIGVuZDIsIGVuZDMpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIChjb25zdCB4bWxDaGFyICopc3RyLCAxKTsKICAgICAgICBkZXNfaW50KG5fd2hhdCwgd2hhdCwgMik7CiAgICAgICAgZGVzX3htbENoYXIobl9lbmQsIGVuZCwgMyk7CiAgICAgICAgZGVzX3htbENoYXIobl9lbmQyLCBlbmQyLCA0KTsKICAgICAgICBkZXNfeG1sQ2hhcihuX2VuZDMsIGVuZDMsIDUpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU3RyaW5nRGVjb2RlRW50aXRpZXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd2hhdCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5kMik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmQzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTdHJpbmdMZW5EZWNvZGVFbnRpdGllcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiB0aGUgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgaW5wdXQgc3RyaW5nICovCiAgICBpbnQgbl9zdHI7CiAgICBpbnQgbGVuOyAvKiB0aGUgc3RyaW5nIGxlbmd0aCAqLwogICAgaW50IG5fbGVuOwogICAgaW50IHdoYXQ7IC8qIGNvbWJpbmF0aW9uIG9mIFhNTF9TVUJTVElUVVRFX1JFRiBhbmQgWE1MX1NVQlNUSVRVVEVfUEVSRUYgKi8KICAgIGludCBuX3doYXQ7CiAgICB4bWxDaGFyIGVuZDsgLyogYW4gZW5kIG1hcmtlciB4bWxDaGFyLCAwIGlmIG5vbmUgKi8KICAgIGludCBuX2VuZDsKICAgIHhtbENoYXIgZW5kMjsgLyogYW4gZW5kIG1hcmtlciB4bWxDaGFyLCAwIGlmIG5vbmUgKi8KICAgIGludCBuX2VuZDI7CiAgICB4bWxDaGFyIGVuZDM7IC8qIGFuIGVuZCBtYXJrZXIgeG1sQ2hhciwgMCBpZiBub25lICovCiAgICBpbnQgbl9lbmQzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgIGZvciAobl93aGF0ID0gMDtuX3doYXQgPCBnZW5fbmJfaW50O25fd2hhdCsrKSB7CiAgICBmb3IgKG5fZW5kID0gMDtuX2VuZCA8IGdlbl9uYl94bWxDaGFyO25fZW5kKyspIHsKICAgIGZvciAobl9lbmQyID0gMDtuX2VuZDIgPCBnZW5fbmJfeG1sQ2hhcjtuX2VuZDIrKykgewogICAgZm9yIChuX2VuZDMgPSAwO25fZW5kMyA8IGdlbl9uYl94bWxDaGFyO25fZW5kMysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBzdHIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIDEpOwogICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDIpOwogICAgICAgIHdoYXQgPSBnZW5faW50KG5fd2hhdCwgMyk7CiAgICAgICAgZW5kID0gZ2VuX3htbENoYXIobl9lbmQsIDQpOwogICAgICAgIGVuZDIgPSBnZW5feG1sQ2hhcihuX2VuZDIsIDUpOwogICAgICAgIGVuZDMgPSBnZW5feG1sQ2hhcihuX2VuZDMsIDYpOwoKICAgICAgICByZXRfdmFsID0geG1sU3RyaW5nTGVuRGVjb2RlRW50aXRpZXMoY3R4dCwgKGNvbnN0IHhtbENoYXIgKilzdHIsIGxlbiwgd2hhdCwgZW5kLCBlbmQyLCBlbmQzKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAoY29uc3QgeG1sQ2hhciAqKXN0ciwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICBkZXNfaW50KG5fd2hhdCwgd2hhdCwgMyk7CiAgICAgICAgZGVzX3htbENoYXIobl9lbmQsIGVuZCwgNCk7CiAgICAgICAgZGVzX3htbENoYXIobl9lbmQyLCBlbmQyLCA1KTsKICAgICAgICBkZXNfeG1sQ2hhcihuX2VuZDMsIGVuZDMsIDYpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU3RyaW5nTGVuRGVjb2RlRW50aXRpZXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3doYXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5kKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuZDIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5kMyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3dpdGNoRW5jb2Rpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogdGhlIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sQ2hhckVuY29kaW5nIGVuYzsgLyogdGhlIGVuY29kaW5nIHZhbHVlIChudW1iZXIpICovCiAgICBpbnQgbl9lbmM7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZW5jID0gMDtuX2VuYyA8IGdlbl9uYl94bWxDaGFyRW5jb2Rpbmc7bl9lbmMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZW5jID0gZ2VuX3htbENoYXJFbmNvZGluZyhuX2VuYywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTd2l0Y2hFbmNvZGluZyhjdHh0LCBlbmMpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZyhuX2VuYywgZW5jLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFN3aXRjaEVuY29kaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTd2l0Y2hJbnB1dEVuY29kaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIHRoZSBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbFBhcnNlcklucHV0UHRyIGlucHV0OyAvKiB0aGUgaW5wdXQgc3RyZWFtICovCiAgICBpbnQgbl9pbnB1dDsKICAgIHhtbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIgaGFuZGxlcjsgLyogdGhlIGVuY29kaW5nIGhhbmRsZXIgKi8KICAgIGludCBuX2hhbmRsZXI7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5faW5wdXQgPSAwO25faW5wdXQgPCBnZW5fbmJfeG1sUGFyc2VySW5wdXRQdHI7bl9pbnB1dCsrKSB7CiAgICBmb3IgKG5faGFuZGxlciA9IDA7bl9oYW5kbGVyIDwgZ2VuX25iX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHI7bl9oYW5kbGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGlucHV0ID0gZ2VuX3htbFBhcnNlcklucHV0UHRyKG5faW5wdXQsIDEpOwogICAgICAgIGhhbmRsZXIgPSBnZW5feG1sQ2hhckVuY29kaW5nSGFuZGxlclB0cihuX2hhbmRsZXIsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sU3dpdGNoSW5wdXRFbmNvZGluZyhjdHh0LCBpbnB1dCwgaGFuZGxlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sUGFyc2VySW5wdXRQdHIobl9pbnB1dCwgaW5wdXQsIDEpOwogICAgICAgIGRlc194bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyKG5faGFuZGxlciwgaGFuZGxlciwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTd2l0Y2hJbnB1dEVuY29kaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5wdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faGFuZGxlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3dpdGNoVG9FbmNvZGluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiB0aGUgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyIGhhbmRsZXI7IC8qIHRoZSBlbmNvZGluZyBoYW5kbGVyICovCiAgICBpbnQgbl9oYW5kbGVyOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2hhbmRsZXIgPSAwO25faGFuZGxlciA8IGdlbl9uYl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyO25faGFuZGxlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBoYW5kbGVyID0gZ2VuX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIobl9oYW5kbGVyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFN3aXRjaFRvRW5jb2RpbmcoY3R4dCwgaGFuZGxlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0cihuX2hhbmRsZXIsIGhhbmRsZXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU3dpdGNoVG9FbmNvZGluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2hhbmRsZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfcGFyc2VySW50ZXJuYWxzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyBwYXJzZXJJbnRlcm5hbHMgOiAzMyBvZiA5MCBmdW5jdGlvbnMgLi4uXG4iKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaHRtbENyZWF0ZUZpbGVQYXJzZXJDdHh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2h0bWxJbml0QXV0b0Nsb3NlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2lucHV0UG9wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X2lucHV0UHVzaCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF9uYW1lUG9wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X25hbWVQdXNoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X25vZGVQb3AoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3Rfbm9kZVB1c2goKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ2hlY2tMYW5ndWFnZUlEKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENvcHlDaGFyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENvcHlDaGFyTXVsdGlCeXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENyZWF0ZUVudGl0eVBhcnNlckN0eHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ3JlYXRlRmlsZVBhcnNlckN0eHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ3JlYXRlTWVtb3J5UGFyc2VyQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDcmVhdGVVUkxQYXJzZXJDdHh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEN1cnJlbnRDaGFyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEVyck1lbW9yeSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxJc0xldHRlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdFbnRpdHlJbnB1dFN0cmVhbSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdJbnB1dEZyb21GaWxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld0lucHV0U3RyZWFtKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld1N0cmluZ0lucHV0U3RyZWFtKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5leHRDaGFyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlcklucHV0U2hyaW5rKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBvcElucHV0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFB1c2hJbnB1dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTZXRFbnRpdHlSZWZlcmVuY2VGdW5jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNwbGl0UU5hbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3RyaW5nQ3VycmVudENoYXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3RyaW5nRGVjb2RlRW50aXRpZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3RyaW5nTGVuRGVjb2RlRW50aXRpZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3dpdGNoRW5jb2RpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3dpdGNoSW5wdXRFbmNvZGluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTd2l0Y2hUb0VuY29kaW5nKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSBwYXJzZXJJbnRlcm5hbHM6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbFBhdHRlcm5Gcm9tUm9vdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1BBVFRFUk5fRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUGF0dGVyblB0ciBjb21wOyAvKiB0aGUgcHJlY29tcGlsZWQgcGF0dGVybiAqLwogICAgaW50IG5fY29tcDsKCiAgICBmb3IgKG5fY29tcCA9IDA7bl9jb21wIDwgZ2VuX25iX3htbFBhdHRlcm5QdHI7bl9jb21wKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvbXAgPSBnZW5feG1sUGF0dGVyblB0cihuX2NvbXAsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sUGF0dGVybkZyb21Sb290KGNvbXApOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXR0ZXJuUHRyKG5fY29tcCwgY29tcCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXR0ZXJuRnJvbVJvb3QiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29tcCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhdHRlcm5HZXRTdHJlYW1DdHh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhdHRlcm5NYXRjaCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1BBVFRFUk5fRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUGF0dGVyblB0ciBjb21wOyAvKiB0aGUgcHJlY29tcGlsZWQgcGF0dGVybiAqLwogICAgaW50IG5fY29tcDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogYSBub2RlICovCiAgICBpbnQgbl9ub2RlOwoKICAgIGZvciAobl9jb21wID0gMDtuX2NvbXAgPCBnZW5fbmJfeG1sUGF0dGVyblB0cjtuX2NvbXArKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb21wID0gZ2VuX3htbFBhdHRlcm5QdHIobl9jb21wLCAwKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhdHRlcm5NYXRjaChjb21wLCBub2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGF0dGVyblB0cihuX2NvbXAsIGNvbXAsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXR0ZXJuTWF0Y2giLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29tcCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGF0dGVybk1heERlcHRoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUEFUVEVSTl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXR0ZXJuUHRyIGNvbXA7IC8qIHRoZSBwcmVjb21waWxlZCBwYXR0ZXJuICovCiAgICBpbnQgbl9jb21wOwoKICAgIGZvciAobl9jb21wID0gMDtuX2NvbXAgPCBnZW5fbmJfeG1sUGF0dGVyblB0cjtuX2NvbXArKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29tcCA9IGdlbl94bWxQYXR0ZXJuUHRyKG5fY29tcCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxQYXR0ZXJuTWF4RGVwdGgoY29tcCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhdHRlcm5QdHIobl9jb21wLCBjb21wLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhdHRlcm5NYXhEZXB0aCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb21wKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGF0dGVybk1pbkRlcHRoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUEFUVEVSTl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxQYXR0ZXJuUHRyIGNvbXA7IC8qIHRoZSBwcmVjb21waWxlZCBwYXR0ZXJuICovCiAgICBpbnQgbl9jb21wOwoKICAgIGZvciAobl9jb21wID0gMDtuX2NvbXAgPCBnZW5fbmJfeG1sUGF0dGVyblB0cjtuX2NvbXArKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29tcCA9IGdlbl94bWxQYXR0ZXJuUHRyKG5fY29tcCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxQYXR0ZXJuTWluRGVwdGgoY29tcCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhdHRlcm5QdHIobl9jb21wLCBjb21wLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhdHRlcm5NaW5EZXB0aCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb21wKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGF0dGVyblN0cmVhbWFibGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9QQVRURVJOX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFBhdHRlcm5QdHIgY29tcDsgLyogdGhlIHByZWNvbXBpbGVkIHBhdHRlcm4gKi8KICAgIGludCBuX2NvbXA7CgogICAgZm9yIChuX2NvbXAgPSAwO25fY29tcCA8IGdlbl9uYl94bWxQYXR0ZXJuUHRyO25fY29tcCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb21wID0gZ2VuX3htbFBhdHRlcm5QdHIobl9jb21wLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhdHRlcm5TdHJlYW1hYmxlKGNvbXApOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXR0ZXJuUHRyKG5fY29tcCwgY29tcCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXR0ZXJuU3RyZWFtYWJsZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb21wKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGF0dGVybmNvbXBpbGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCiNpZmRlZiBMSUJYTUxfUEFUVEVSTl9FTkFCTEVECgojZGVmaW5lIGdlbl9uYl94bWxTdHJlYW1DdHh0UHRyIDEKc3RhdGljIHhtbFN0cmVhbUN0eHRQdHIgZ2VuX3htbFN0cmVhbUN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFN0cmVhbUN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFN0cmVhbUN0eHRQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgoKc3RhdGljIGludAp0ZXN0X3htbFN0cmVhbVBvcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1BBVFRFUk5fRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU3RyZWFtQ3R4dFB0ciBzdHJlYW07IC8qIHRoZSBzdHJlYW0gY29udGV4dCAqLwogICAgaW50IG5fc3RyZWFtOwoKICAgIGZvciAobl9zdHJlYW0gPSAwO25fc3RyZWFtIDwgZ2VuX25iX3htbFN0cmVhbUN0eHRQdHI7bl9zdHJlYW0rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3RyZWFtID0gZ2VuX3htbFN0cmVhbUN0eHRQdHIobl9zdHJlYW0sIDApOwoKICAgICAgICByZXRfdmFsID0geG1sU3RyZWFtUG9wKHN0cmVhbSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFN0cmVhbUN0eHRQdHIobl9zdHJlYW0sIHN0cmVhbSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTdHJlYW1Qb3AiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyZWFtKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3RyZWFtUHVzaCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1BBVFRFUk5fRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU3RyZWFtQ3R4dFB0ciBzdHJlYW07IC8qIHRoZSBzdHJlYW0gY29udGV4dCAqLwogICAgaW50IG5fc3RyZWFtOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBjdXJyZW50IG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogbnM7IC8qIHRoZSBuYW1lc3BhY2UgbmFtZSAqLwogICAgaW50IG5fbnM7CgogICAgZm9yIChuX3N0cmVhbSA9IDA7bl9zdHJlYW0gPCBnZW5fbmJfeG1sU3RyZWFtQ3R4dFB0cjtuX3N0cmVhbSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fbnMgPSAwO25fbnMgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9ucysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzdHJlYW0gPSBnZW5feG1sU3RyZWFtQ3R4dFB0cihuX3N0cmVhbSwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIG5zID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbnMsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sU3RyZWFtUHVzaChzdHJlYW0sIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKilucyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFN0cmVhbUN0eHRQdHIobl9zdHJlYW0sIHN0cmVhbSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9ucywgKGNvbnN0IHhtbENoYXIgKilucywgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTdHJlYW1QdXNoIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cmVhbSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3RyZWFtUHVzaEF0dHIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9QQVRURVJOX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFN0cmVhbUN0eHRQdHIgc3RyZWFtOyAvKiB0aGUgc3RyZWFtIGNvbnRleHQgKi8KICAgIGludCBuX3N0cmVhbTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgY3VycmVudCBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIG5zOyAvKiB0aGUgbmFtZXNwYWNlIG5hbWUgKi8KICAgIGludCBuX25zOwoKICAgIGZvciAobl9zdHJlYW0gPSAwO25fc3RyZWFtIDwgZ2VuX25iX3htbFN0cmVhbUN0eHRQdHI7bl9zdHJlYW0rKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX25zID0gMDtuX25zIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3RyZWFtID0gZ2VuX3htbFN0cmVhbUN0eHRQdHIobl9zdHJlYW0sIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBucyA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25zLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFN0cmVhbVB1c2hBdHRyKHN0cmVhbSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5zKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU3RyZWFtQ3R4dFB0cihuX3N0cmVhbSwgc3RyZWFtLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25zLCAoY29uc3QgeG1sQ2hhciAqKW5zLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFN0cmVhbVB1c2hBdHRyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cmVhbSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3RyZWFtUHVzaE5vZGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9QQVRURVJOX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFN0cmVhbUN0eHRQdHIgc3RyZWFtOyAvKiB0aGUgc3RyZWFtIGNvbnRleHQgKi8KICAgIGludCBuX3N0cmVhbTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgY3VycmVudCBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIG5zOyAvKiB0aGUgbmFtZXNwYWNlIG5hbWUgKi8KICAgIGludCBuX25zOwogICAgaW50IG5vZGVUeXBlOyAvKiB0aGUgdHlwZSBvZiB0aGUgbm9kZSBiZWluZyBwdXNoZWQgKi8KICAgIGludCBuX25vZGVUeXBlOwoKICAgIGZvciAobl9zdHJlYW0gPSAwO25fc3RyZWFtIDwgZ2VuX25iX3htbFN0cmVhbUN0eHRQdHI7bl9zdHJlYW0rKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX25zID0gMDtuX25zIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbnMrKykgewogICAgZm9yIChuX25vZGVUeXBlID0gMDtuX25vZGVUeXBlIDwgZ2VuX25iX2ludDtuX25vZGVUeXBlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0cmVhbSA9IGdlbl94bWxTdHJlYW1DdHh0UHRyKG5fc3RyZWFtLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgbnMgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9ucywgMik7CiAgICAgICAgbm9kZVR5cGUgPSBnZW5faW50KG5fbm9kZVR5cGUsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU3RyZWFtUHVzaE5vZGUoc3RyZWFtLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopbnMsIG5vZGVUeXBlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU3RyZWFtQ3R4dFB0cihuX3N0cmVhbSwgc3RyZWFtLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25zLCAoY29uc3QgeG1sQ2hhciAqKW5zLCAyKTsKICAgICAgICBkZXNfaW50KG5fbm9kZVR5cGUsIG5vZGVUeXBlLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFN0cmVhbVB1c2hOb2RlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cmVhbSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25zKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVUeXBlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3RyZWFtV2FudHNBbnlOb2RlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUEFUVEVSTl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTdHJlYW1DdHh0UHRyIHN0cmVhbUN0eHQ7IC8qIHRoZSBzdHJlYW0gY29udGV4dCAqLwogICAgaW50IG5fc3RyZWFtQ3R4dDsKCiAgICBmb3IgKG5fc3RyZWFtQ3R4dCA9IDA7bl9zdHJlYW1DdHh0IDwgZ2VuX25iX3htbFN0cmVhbUN0eHRQdHI7bl9zdHJlYW1DdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0cmVhbUN0eHQgPSBnZW5feG1sU3RyZWFtQ3R4dFB0cihuX3N0cmVhbUN0eHQsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sU3RyZWFtV2FudHNBbnlOb2RlKHN0cmVhbUN0eHQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTdHJlYW1DdHh0UHRyKG5fc3RyZWFtQ3R4dCwgc3RyZWFtQ3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTdHJlYW1XYW50c0FueU5vZGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyZWFtQ3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfcGF0dGVybih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgcGF0dGVybiA6IDEwIG9mIDE1IGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXR0ZXJuRnJvbVJvb3QoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGF0dGVybkdldFN0cmVhbUN0eHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGF0dGVybk1hdGNoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhdHRlcm5NYXhEZXB0aCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXR0ZXJuTWluRGVwdGgoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGF0dGVyblN0cmVhbWFibGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGF0dGVybmNvbXBpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3RyZWFtUG9wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFN0cmVhbVB1c2goKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3RyZWFtUHVzaEF0dHIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3RyZWFtUHVzaE5vZGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3RyZWFtV2FudHNBbnlOb2RlKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSBwYXR0ZXJuOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbFJlbGF4TkdQdHIgMQpzdGF0aWMgeG1sUmVsYXhOR1B0ciBnZW5feG1sUmVsYXhOR1B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sUmVsYXhOR1B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sUmVsYXhOR1B0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVsYXhOR0R1bXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgRklMRSAqIG91dHB1dDsgLyogdGhlIGZpbGUgb3V0cHV0ICovCiAgICBpbnQgbl9vdXRwdXQ7CiAgICB4bWxSZWxheE5HUHRyIHNjaGVtYTsgLyogYSBzY2hlbWEgc3RydWN0dXJlICovCiAgICBpbnQgbl9zY2hlbWE7CgogICAgZm9yIChuX291dHB1dCA9IDA7bl9vdXRwdXQgPCBnZW5fbmJfRklMRV9wdHI7bl9vdXRwdXQrKykgewogICAgZm9yIChuX3NjaGVtYSA9IDA7bl9zY2hlbWEgPCBnZW5fbmJfeG1sUmVsYXhOR1B0cjtuX3NjaGVtYSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXRwdXQgPSBnZW5fRklMRV9wdHIobl9vdXRwdXQsIDApOwogICAgICAgIHNjaGVtYSA9IGdlbl94bWxSZWxheE5HUHRyKG5fc2NoZW1hLCAxKTsKCiAgICAgICAgeG1sUmVsYXhOR0R1bXAob3V0cHV0LCBzY2hlbWEpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfRklMRV9wdHIobl9vdXRwdXQsIG91dHB1dCwgMCk7CiAgICAgICAgZGVzX3htbFJlbGF4TkdQdHIobl9zY2hlbWEsIHNjaGVtYSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWxheE5HRHVtcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRwdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2NoZW1hKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVsYXhOR0R1bXBUcmVlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIEZJTEUgKiBvdXRwdXQ7IC8qIHRoZSBmaWxlIG91dHB1dCAqLwogICAgaW50IG5fb3V0cHV0OwogICAgeG1sUmVsYXhOR1B0ciBzY2hlbWE7IC8qIGEgc2NoZW1hIHN0cnVjdHVyZSAqLwogICAgaW50IG5fc2NoZW1hOwoKICAgIGZvciAobl9vdXRwdXQgPSAwO25fb3V0cHV0IDwgZ2VuX25iX0ZJTEVfcHRyO25fb3V0cHV0KyspIHsKICAgIGZvciAobl9zY2hlbWEgPSAwO25fc2NoZW1hIDwgZ2VuX25iX3htbFJlbGF4TkdQdHI7bl9zY2hlbWErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgb3V0cHV0ID0gZ2VuX0ZJTEVfcHRyKG5fb3V0cHV0LCAwKTsKICAgICAgICBzY2hlbWEgPSBnZW5feG1sUmVsYXhOR1B0cihuX3NjaGVtYSwgMSk7CgogICAgICAgIHhtbFJlbGF4TkdEdW1wVHJlZShvdXRwdXQsIHNjaGVtYSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19GSUxFX3B0cihuX291dHB1dCwgb3V0cHV0LCAwKTsKICAgICAgICBkZXNfeG1sUmVsYXhOR1B0cihuX3NjaGVtYSwgc2NoZW1hLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlbGF4TkdEdW1wVHJlZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRwdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2NoZW1hKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCiNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECgojZGVmaW5lIGdlbl9uYl94bWxSZWxheE5HUGFyc2VyQ3R4dFB0ciAxCnN0YXRpYyB4bWxSZWxheE5HUGFyc2VyQ3R4dFB0ciBnZW5feG1sUmVsYXhOR1BhcnNlckN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFJlbGF4TkdQYXJzZXJDdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxSZWxheE5HUGFyc2VyQ3R4dFB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCiNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECgojZGVmaW5lIGdlbl9uYl94bWxSZWxheE5HVmFsaWRpdHlFcnJvckZ1bmNfcHRyIDEKc3RhdGljIHhtbFJlbGF4TkdWYWxpZGl0eUVycm9yRnVuYyAqIGdlbl94bWxSZWxheE5HVmFsaWRpdHlFcnJvckZ1bmNfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxSZWxheE5HVmFsaWRpdHlFcnJvckZ1bmNfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxSZWxheE5HVmFsaWRpdHlFcnJvckZ1bmMgKiB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCiNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECgojZGVmaW5lIGdlbl9uYl94bWxSZWxheE5HVmFsaWRpdHlXYXJuaW5nRnVuY19wdHIgMQpzdGF0aWMgeG1sUmVsYXhOR1ZhbGlkaXR5V2FybmluZ0Z1bmMgKiBnZW5feG1sUmVsYXhOR1ZhbGlkaXR5V2FybmluZ0Z1bmNfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxSZWxheE5HVmFsaWRpdHlXYXJuaW5nRnVuY19wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFJlbGF4TkdWYWxpZGl0eVdhcm5pbmdGdW5jICogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgoKc3RhdGljIGludAp0ZXN0X3htbFJlbGF4TkdHZXRQYXJzZXJFcnJvcnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFJlbGF4TkdQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGEgUmVsYXgtTkcgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sUmVsYXhOR1ZhbGlkaXR5RXJyb3JGdW5jICogZXJyOyAvKiB0aGUgZXJyb3IgY2FsbGJhY2sgcmVzdWx0ICovCiAgICBpbnQgbl9lcnI7CiAgICB4bWxSZWxheE5HVmFsaWRpdHlXYXJuaW5nRnVuYyAqIHdhcm47IC8qIHRoZSB3YXJuaW5nIGNhbGxiYWNrIHJlc3VsdCAqLwogICAgaW50IG5fd2FybjsKICAgIHZvaWQgKiogY3R4OyAvKiBjb250ZXh0dWFsIGRhdGEgZm9yIHRoZSBjYWxsYmFja3MgcmVzdWx0ICovCiAgICBpbnQgbl9jdHg7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxSZWxheE5HUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2VyciA9IDA7bl9lcnIgPCBnZW5fbmJfeG1sUmVsYXhOR1ZhbGlkaXR5RXJyb3JGdW5jX3B0cjtuX2VycisrKSB7CiAgICBmb3IgKG5fd2FybiA9IDA7bl93YXJuIDwgZ2VuX25iX3htbFJlbGF4TkdWYWxpZGl0eVdhcm5pbmdGdW5jX3B0cjtuX3dhcm4rKykgewogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfdm9pZF9wdHJfcHRyO25fY3R4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUmVsYXhOR1BhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBlcnIgPSBnZW5feG1sUmVsYXhOR1ZhbGlkaXR5RXJyb3JGdW5jX3B0cihuX2VyciwgMSk7CiAgICAgICAgd2FybiA9IGdlbl94bWxSZWxheE5HVmFsaWRpdHlXYXJuaW5nRnVuY19wdHIobl93YXJuLCAyKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHJfcHRyKG5fY3R4LCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlbGF4TkdHZXRQYXJzZXJFcnJvcnMoY3R4dCwgZXJyLCB3YXJuLCBjdHgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxSZWxheE5HUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxSZWxheE5HVmFsaWRpdHlFcnJvckZ1bmNfcHRyKG5fZXJyLCBlcnIsIDEpOwogICAgICAgIGRlc194bWxSZWxheE5HVmFsaWRpdHlXYXJuaW5nRnVuY19wdHIobl93YXJuLCB3YXJuLCAyKTsKICAgICAgICBkZXNfdm9pZF9wdHJfcHRyKG5fY3R4LCBjdHgsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVsYXhOR0dldFBhcnNlckVycm9ycyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Vycik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93YXJuKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgojaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAoKI2RlZmluZSBnZW5fbmJfeG1sUmVsYXhOR1ZhbGlkQ3R4dFB0ciAxCnN0YXRpYyB4bWxSZWxheE5HVmFsaWRDdHh0UHRyIGdlbl94bWxSZWxheE5HVmFsaWRDdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxSZWxheE5HVmFsaWRDdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxSZWxheE5HVmFsaWRDdHh0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWxheE5HR2V0VmFsaWRFcnJvcnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFJlbGF4TkdWYWxpZEN0eHRQdHIgY3R4dDsgLyogYSBSZWxheC1ORyB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxSZWxheE5HVmFsaWRpdHlFcnJvckZ1bmMgKiBlcnI7IC8qIHRoZSBlcnJvciBmdW5jdGlvbiByZXN1bHQgKi8KICAgIGludCBuX2VycjsKICAgIHhtbFJlbGF4TkdWYWxpZGl0eVdhcm5pbmdGdW5jICogd2FybjsgLyogdGhlIHdhcm5pbmcgZnVuY3Rpb24gcmVzdWx0ICovCiAgICBpbnQgbl93YXJuOwogICAgdm9pZCAqKiBjdHg7IC8qIHRoZSBmdW5jdGlvbnMgY29udGV4dCByZXN1bHQgKi8KICAgIGludCBuX2N0eDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFJlbGF4TkdWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9lcnIgPSAwO25fZXJyIDwgZ2VuX25iX3htbFJlbGF4TkdWYWxpZGl0eUVycm9yRnVuY19wdHI7bl9lcnIrKykgewogICAgZm9yIChuX3dhcm4gPSAwO25fd2FybiA8IGdlbl9uYl94bWxSZWxheE5HVmFsaWRpdHlXYXJuaW5nRnVuY19wdHI7bl93YXJuKyspIHsKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyX3B0cjtuX2N0eCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFJlbGF4TkdWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBlcnIgPSBnZW5feG1sUmVsYXhOR1ZhbGlkaXR5RXJyb3JGdW5jX3B0cihuX2VyciwgMSk7CiAgICAgICAgd2FybiA9IGdlbl94bWxSZWxheE5HVmFsaWRpdHlXYXJuaW5nRnVuY19wdHIobl93YXJuLCAyKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHJfcHRyKG5fY3R4LCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlbGF4TkdHZXRWYWxpZEVycm9ycyhjdHh0LCBlcnIsIHdhcm4sIGN0eCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFJlbGF4TkdWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sUmVsYXhOR1ZhbGlkaXR5RXJyb3JGdW5jX3B0cihuX2VyciwgZXJyLCAxKTsKICAgICAgICBkZXNfeG1sUmVsYXhOR1ZhbGlkaXR5V2FybmluZ0Z1bmNfcHRyKG5fd2Fybiwgd2FybiwgMik7CiAgICAgICAgZGVzX3ZvaWRfcHRyX3B0cihuX2N0eCwgY3R4LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlbGF4TkdHZXRWYWxpZEVycm9ycyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Vycik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93YXJuKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlbGF4TkdJbml0VHlwZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKCiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlbGF4TkdJbml0VHlwZXMoKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlbGF4TkdJbml0VHlwZXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWxheE5HTmV3RG9jUGFyc2VyQ3R4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFJlbGF4TkdQYXJzZXJDdHh0UHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiBhIHByZXBhcnNlZCBkb2N1bWVudCB0cmVlICovCiAgICBpbnQgbl9kb2M7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sUmVsYXhOR05ld0RvY1BhcnNlckN0eHQoZG9jKTsKICAgICAgICBkZXNyZXRfeG1sUmVsYXhOR1BhcnNlckN0eHRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWxheE5HTmV3RG9jUGFyc2VyQ3R4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWxheE5HTmV3TWVtUGFyc2VyQ3R4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFJlbGF4TkdQYXJzZXJDdHh0UHRyIHJldF92YWw7CiAgICBjaGFyICogYnVmZmVyOyAvKiBhIHBvaW50ZXIgdG8gYSBjaGFyIGFycmF5IGNvbnRhaW5pbmcgdGhlIHNjaGVtYXMgKi8KICAgIGludCBuX2J1ZmZlcjsKICAgIGludCBzaXplOyAvKiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgKi8KICAgIGludCBuX3NpemU7CgogICAgZm9yIChuX2J1ZmZlciA9IDA7bl9idWZmZXIgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9idWZmZXIrKykgewogICAgZm9yIChuX3NpemUgPSAwO25fc2l6ZSA8IGdlbl9uYl9pbnQ7bl9zaXplKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZmZlciA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2J1ZmZlciwgMCk7CiAgICAgICAgc2l6ZSA9IGdlbl9pbnQobl9zaXplLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlbGF4TkdOZXdNZW1QYXJzZXJDdHh0KChjb25zdCBjaGFyICopYnVmZmVyLCBzaXplKTsKICAgICAgICBkZXNyZXRfeG1sUmVsYXhOR1BhcnNlckN0eHRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2J1ZmZlciwgKGNvbnN0IGNoYXIgKilidWZmZXIsIDApOwogICAgICAgIGRlc19pbnQobl9zaXplLCBzaXplLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlbGF4TkdOZXdNZW1QYXJzZXJDdHh0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1ZmZlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVsYXhOR05ld1BhcnNlckN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxSZWxheE5HUGFyc2VyQ3R4dFB0ciByZXRfdmFsOwogICAgY2hhciAqIFVSTDsgLyogdGhlIGxvY2F0aW9uIG9mIHRoZSBzY2hlbWEgKi8KICAgIGludCBuX1VSTDsKCiAgICBmb3IgKG5fVVJMID0gMDtuX1VSTCA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX1VSTCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBVUkwgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9VUkwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sUmVsYXhOR05ld1BhcnNlckN0eHQoKGNvbnN0IGNoYXIgKilVUkwpOwogICAgICAgIGRlc3JldF94bWxSZWxheE5HUGFyc2VyQ3R4dFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fVVJMLCAoY29uc3QgY2hhciAqKVVSTCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWxheE5HTmV3UGFyc2VyQ3R4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWxheE5HTmV3VmFsaWRDdHh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlbGF4TkdQYXJzZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWxheE5HU2V0UGFyc2VyRXJyb3JzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlbGF4TkdTZXRQYXJzZXJTdHJ1Y3R1cmVkRXJyb3JzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlbGF4TkdTZXRWYWxpZEVycm9ycyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWxheE5HU2V0VmFsaWRTdHJ1Y3R1cmVkRXJyb3JzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlbGF4TkdWYWxpZGF0ZURvYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUmVsYXhOR1ZhbGlkQ3R4dFB0ciBjdHh0OyAvKiBhIFJlbGF4LU5HIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIGEgcGFyc2VkIGRvY3VtZW50IHRyZWUgKi8KICAgIGludCBuX2RvYzsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFJlbGF4TkdWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFJlbGF4TkdWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlbGF4TkdWYWxpZGF0ZURvYyhjdHh0LCBkb2MpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxSZWxheE5HVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlbGF4TkdWYWxpZGF0ZURvYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlbGF4TkdWYWxpZGF0ZUZ1bGxFbGVtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxSZWxheE5HVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiBhIGRvY3VtZW50IGluc3RhbmNlICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIGVsZW07IC8qIGFuIGVsZW1lbnQgaW5zdGFuY2UgKi8KICAgIGludCBuX2VsZW07CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxSZWxheE5HVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2VsZW0gPSAwO25fZWxlbSA8IGdlbl9uYl94bWxOb2RlUHRyO25fZWxlbSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFJlbGF4TkdWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKICAgICAgICBlbGVtID0gZ2VuX3htbE5vZGVQdHIobl9lbGVtLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlbGF4TkdWYWxpZGF0ZUZ1bGxFbGVtZW50KGN0eHQsIGRvYywgZWxlbSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFJlbGF4TkdWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fZWxlbSwgZWxlbSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWxheE5HVmFsaWRhdGVGdWxsRWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbGVtKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVsYXhOR1ZhbGlkYXRlUG9wRWxlbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUmVsYXhOR1ZhbGlkQ3R4dFB0ciBjdHh0OyAvKiB0aGUgUmVsYXhORyB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiBhIGRvY3VtZW50IGluc3RhbmNlICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIGVsZW07IC8qIGFuIGVsZW1lbnQgaW5zdGFuY2UgKi8KICAgIGludCBuX2VsZW07CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxSZWxheE5HVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2VsZW0gPSAwO25fZWxlbSA8IGdlbl9uYl94bWxOb2RlUHRyO25fZWxlbSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFJlbGF4TkdWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKICAgICAgICBlbGVtID0gZ2VuX3htbE5vZGVQdHIobl9lbGVtLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlbGF4TkdWYWxpZGF0ZVBvcEVsZW1lbnQoY3R4dCwgZG9jLCBlbGVtKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUmVsYXhOR1ZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9lbGVtLCBlbGVtLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlbGF4TkdWYWxpZGF0ZVBvcEVsZW1lbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZWxlbSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlbGF4TkdWYWxpZGF0ZVB1c2hDRGF0YSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUmVsYXhOR1ZhbGlkQ3R4dFB0ciBjdHh0OyAvKiB0aGUgUmVsYXhORyB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxDaGFyICogZGF0YTsgLyogc29tZSBjaGFyYWN0ZXIgZGF0YSByZWFkICovCiAgICBpbnQgbl9kYXRhOwogICAgaW50IGxlbjsgLyogdGhlIGxlbmdodCBvZiB0aGUgZGF0YSAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUmVsYXhOR1ZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2RhdGEgPSAwO25fZGF0YSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2RhdGErKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUmVsYXhOR1ZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGRhdGEgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9kYXRhLCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlbGF4TkdWYWxpZGF0ZVB1c2hDRGF0YShjdHh0LCAoY29uc3QgeG1sQ2hhciAqKWRhdGEsIGxlbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFJlbGF4TkdWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9kYXRhLCAoY29uc3QgeG1sQ2hhciAqKWRhdGEsIDEpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWxheE5HVmFsaWRhdGVQdXNoQ0RhdGEiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlbGF4TkdWYWxpZGF0ZVB1c2hFbGVtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxSZWxheE5HVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiBhIGRvY3VtZW50IGluc3RhbmNlICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIGVsZW07IC8qIGFuIGVsZW1lbnQgaW5zdGFuY2UgKi8KICAgIGludCBuX2VsZW07CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxSZWxheE5HVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2VsZW0gPSAwO25fZWxlbSA8IGdlbl9uYl94bWxOb2RlUHRyO25fZWxlbSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFJlbGF4TkdWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKICAgICAgICBlbGVtID0gZ2VuX3htbE5vZGVQdHIobl9lbGVtLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlbGF4TkdWYWxpZGF0ZVB1c2hFbGVtZW50KGN0eHQsIGRvYywgZWxlbSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFJlbGF4TkdWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fZWxlbSwgZWxlbSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWxheE5HVmFsaWRhdGVQdXNoRWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbGVtKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVsYXhQYXJzZXJTZXRGbGFnKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxSZWxheE5HUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhIFJlbGF4TkcgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgZmxhZ3M7IC8qIGEgc2V0IG9mIGZsYWdzIHZhbHVlcyAqLwogICAgaW50IG5fZmxhZ3M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxSZWxheE5HUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2ZsYWdzID0gMDtuX2ZsYWdzIDwgZ2VuX25iX2ludDtuX2ZsYWdzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUmVsYXhOR1BhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBmbGFncyA9IGdlbl9pbnQobl9mbGFncywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWxheFBhcnNlclNldEZsYWcoY3R4dCwgZmxhZ3MpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxSZWxheE5HUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9mbGFncywgZmxhZ3MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVsYXhQYXJzZXJTZXRGbGFnIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmxhZ3MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3JlbGF4bmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIHJlbGF4bmcgOiAxNCBvZiAyNCBmdW5jdGlvbnMgLi4uXG4iKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVsYXhOR0R1bXAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVsYXhOR0R1bXBUcmVlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlbGF4TkdHZXRQYXJzZXJFcnJvcnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVsYXhOR0dldFZhbGlkRXJyb3JzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlbGF4TkdJbml0VHlwZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVsYXhOR05ld0RvY1BhcnNlckN0eHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVsYXhOR05ld01lbVBhcnNlckN0eHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVsYXhOR05ld1BhcnNlckN0eHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVsYXhOR05ld1ZhbGlkQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWxheE5HUGFyc2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVsYXhOR1NldFBhcnNlckVycm9ycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWxheE5HU2V0UGFyc2VyU3RydWN0dXJlZEVycm9ycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWxheE5HU2V0VmFsaWRFcnJvcnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVsYXhOR1NldFZhbGlkU3RydWN0dXJlZEVycm9ycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWxheE5HVmFsaWRhdGVEb2MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVsYXhOR1ZhbGlkYXRlRnVsbEVsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVsYXhOR1ZhbGlkYXRlUG9wRWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWxheE5HVmFsaWRhdGVQdXNoQ0RhdGEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVsYXhOR1ZhbGlkYXRlUHVzaEVsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVsYXhQYXJzZXJTZXRGbGFnKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSByZWxheG5nOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0Kc3RhdGljIGludAp0ZXN0X3NjaGVtYXNJbnRlcm5hbHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIHNjaGVtYXNJbnRlcm5hbHMgOiAwIG9mIDIgZnVuY3Rpb25zIC4uLlxuIik7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSBzY2hlbWFzSW50ZXJuYWxzOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWF0cm9uTmV3RG9jUGFyc2VyQ3R4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWF0cm9uTmV3TWVtUGFyc2VyQ3R4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWF0cm9uTmV3UGFyc2VyQ3R4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKI2lmZGVmIExJQlhNTF9TQ0hFTUFUUk9OX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbFNjaGVtYXRyb25QdHIgMQpzdGF0aWMgeG1sU2NoZW1hdHJvblB0ciBnZW5feG1sU2NoZW1hdHJvblB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sU2NoZW1hdHJvblB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sU2NoZW1hdHJvblB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hdHJvbk5ld1ZhbGlkQ3R4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKI2lmZGVmIExJQlhNTF9TQ0hFTUFUUk9OX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbFNjaGVtYXRyb25QYXJzZXJDdHh0UHRyIDEKc3RhdGljIHhtbFNjaGVtYXRyb25QYXJzZXJDdHh0UHRyIGdlbl94bWxTY2hlbWF0cm9uUGFyc2VyQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sU2NoZW1hdHJvblBhcnNlckN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFNjaGVtYXRyb25QYXJzZXJDdHh0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWF0cm9uUGFyc2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCiNpZmRlZiBMSUJYTUxfU0NIRU1BVFJPTl9FTkFCTEVECgojZGVmaW5lIGdlbl9uYl94bWxTY2hlbWF0cm9uVmFsaWRDdHh0UHRyIDEKc3RhdGljIHhtbFNjaGVtYXRyb25WYWxpZEN0eHRQdHIgZ2VuX3htbFNjaGVtYXRyb25WYWxpZEN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFNjaGVtYXRyb25WYWxpZEN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFNjaGVtYXRyb25WYWxpZEN0eHRQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYXRyb25TZXRWYWxpZFN0cnVjdHVyZWRFcnJvcnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hdHJvblZhbGlkYXRlRG9jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BVFJPTl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWF0cm9uVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSBzY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRG9jUHRyIGluc3RhbmNlOyAvKiB0aGUgZG9jdW1lbnQgaW5zdGFjZSB0cmVlICovCiAgICBpbnQgbl9pbnN0YW5jZTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNjaGVtYXRyb25WYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9pbnN0YW5jZSA9IDA7bl9pbnN0YW5jZSA8IGdlbl9uYl94bWxEb2NQdHI7bl9pbnN0YW5jZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFNjaGVtYXRyb25WYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBpbnN0YW5jZSA9IGdlbl94bWxEb2NQdHIobl9pbnN0YW5jZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWF0cm9uVmFsaWRhdGVEb2MoY3R4dCwgaW5zdGFuY2UpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWF0cm9uVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2luc3RhbmNlLCBpbnN0YW5jZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWF0cm9uVmFsaWRhdGVEb2MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbnN0YW5jZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3Rfc2NoZW1hdHJvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3Rpbmcgc2NoZW1hdHJvbiA6IDEgb2YgMTAgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYXRyb25OZXdEb2NQYXJzZXJDdHh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYXRyb25OZXdNZW1QYXJzZXJDdHh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYXRyb25OZXdQYXJzZXJDdHh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYXRyb25OZXdWYWxpZEN0eHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hdHJvblBhcnNlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYXRyb25TZXRWYWxpZFN0cnVjdHVyZWRFcnJvcnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hdHJvblZhbGlkYXRlRG9jKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSBzY2hlbWF0cm9uOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxBZGRDaGlsZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgcGFyZW50OyAvKiB0aGUgcGFyZW50IG5vZGUgKi8KICAgIGludCBuX3BhcmVudDsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY2hpbGQgbm9kZSAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9wYXJlbnQgPSAwO25fcGFyZW50IDwgZ2VuX25iX3htbE5vZGVQdHI7bl9wYXJlbnQrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cl9pbjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBwYXJlbnQgPSBnZW5feG1sTm9kZVB0cihuX3BhcmVudCwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHJfaW4obl9jdXIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQWRkQ2hpbGQocGFyZW50LCBjdXIpOwogICAgICAgIGlmIChyZXRfdmFsID09IE5VTEwpIHsgeG1sRnJlZU5vZGUoY3VyKSA7IGN1ciA9IE5VTEwgOyB9CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fcGFyZW50LCBwYXJlbnQsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyX2luKG5fY3VyLCBjdXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQWRkQ2hpbGQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcGFyZW50KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQWRkQ2hpbGRMaXN0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBwYXJlbnQ7IC8qIHRoZSBwYXJlbnQgbm9kZSAqLwogICAgaW50IG5fcGFyZW50OwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBmaXJzdCBub2RlIGluIHRoZSBsaXN0ICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX3BhcmVudCA9IDA7bl9wYXJlbnQgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX3BhcmVudCsrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyX2luO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHBhcmVudCA9IGdlbl94bWxOb2RlUHRyKG5fcGFyZW50LCAwKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cl9pbihuX2N1ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxBZGRDaGlsZExpc3QocGFyZW50LCBjdXIpOwogICAgICAgIGlmIChyZXRfdmFsID09IE5VTEwpIHsgeG1sRnJlZU5vZGVMaXN0KGN1cikgOyBjdXIgPSBOVUxMIDsgfQogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX3BhcmVudCwgcGFyZW50LCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cl9pbihuX2N1ciwgY3VyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEFkZENoaWxkTGlzdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wYXJlbnQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBZGROZXh0U2libGluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY2hpbGQgbm9kZSAqLwogICAgaW50IG5fY3VyOwogICAgeG1sTm9kZVB0ciBlbGVtOyAvKiB0aGUgbmV3IG5vZGUgKi8KICAgIGludCBuX2VsZW07CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX3htbE5vZGVQdHJfaW47bl9lbGVtKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAwKTsKICAgICAgICBlbGVtID0gZ2VuX3htbE5vZGVQdHJfaW4obl9lbGVtLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEFkZE5leHRTaWJsaW5nKGN1ciwgZWxlbSk7CiAgICAgICAgaWYgKHJldF92YWwgPT0gTlVMTCkgeyB4bWxGcmVlTm9kZShlbGVtKSA7IGVsZW0gPSBOVUxMIDsgfQogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cl9pbihuX2VsZW0sIGVsZW0sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQWRkTmV4dFNpYmxpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEFkZFByZXZTaWJsaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVFJFRV9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY2hpbGQgbm9kZSAqLwogICAgaW50IG5fY3VyOwogICAgeG1sTm9kZVB0ciBlbGVtOyAvKiB0aGUgbmV3IG5vZGUgKi8KICAgIGludCBuX2VsZW07CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX3htbE5vZGVQdHJfaW47bl9lbGVtKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAwKTsKICAgICAgICBlbGVtID0gZ2VuX3htbE5vZGVQdHJfaW4obl9lbGVtLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEFkZFByZXZTaWJsaW5nKGN1ciwgZWxlbSk7CiAgICAgICAgaWYgKHJldF92YWwgPT0gTlVMTCkgeyB4bWxGcmVlTm9kZShlbGVtKSA7IGVsZW0gPSBOVUxMIDsgfQogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cl9pbihuX2VsZW0sIGVsZW0sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQWRkUHJldlNpYmxpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBZGRTaWJsaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBjaGlsZCBub2RlICovCiAgICBpbnQgbl9jdXI7CiAgICB4bWxOb2RlUHRyIGVsZW07IC8qIHRoZSBuZXcgbm9kZSAqLwogICAgaW50IG5fZWxlbTsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgIGZvciAobl9lbGVtID0gMDtuX2VsZW0gPCBnZW5fbmJfeG1sTm9kZVB0cl9pbjtuX2VsZW0rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDApOwogICAgICAgIGVsZW0gPSBnZW5feG1sTm9kZVB0cl9pbihuX2VsZW0sIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQWRkU2libGluZyhjdXIsIGVsZW0pOwogICAgICAgIGlmIChyZXRfdmFsID09IE5VTEwpIHsgeG1sRnJlZU5vZGUoZWxlbSkgOyBlbGVtID0gTlVMTCA7IH0KICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHJfaW4obl9lbGVtLCBlbGVtLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEFkZFNpYmxpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEF0dHJTZXJpYWxpemVUeHRDb250ZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfT1VUUFVUX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBYTUwgYnVmZmVyIG91dHB1dCAqLwogICAgaW50IG5fYnVmOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxBdHRyUHRyIGF0dHI7IC8qIHRoZSBhdHRyaWJ1dGUgbm9kZSAqLwogICAgaW50IG5fYXR0cjsKICAgIHhtbENoYXIgKiBzdHJpbmc7IC8qIHRoZSB0ZXh0IGNvbnRlbnQgKi8KICAgIGludCBuX3N0cmluZzsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9hdHRyID0gMDtuX2F0dHIgPCBnZW5fbmJfeG1sQXR0clB0cjtuX2F0dHIrKykgewogICAgZm9yIChuX3N0cmluZyA9IDA7bl9zdHJpbmcgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHJpbmcrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CiAgICAgICAgYXR0ciA9IGdlbl94bWxBdHRyUHRyKG5fYXR0ciwgMik7CiAgICAgICAgc3RyaW5nID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyaW5nLCAzKTsKCiAgICAgICAgeG1sQXR0clNlcmlhbGl6ZVR4dENvbnRlbnQoYnVmLCBkb2MsIGF0dHIsIChjb25zdCB4bWxDaGFyICopc3RyaW5nKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxBdHRyUHRyKG5fYXR0ciwgYXR0ciwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyaW5nLCAoY29uc3QgeG1sQ2hhciAqKXN0cmluZywgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxBdHRyU2VyaWFsaXplVHh0Q29udGVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2F0dHIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEJ1ZmZlckFkZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIGJ1ZmZlciB0byBkdW1wICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgI3htbENoYXIgc3RyaW5nICovCiAgICBpbnQgbl9zdHI7CiAgICBpbnQgbGVuOyAvKiB0aGUgbnVtYmVyIG9mICN4bWxDaGFyIHRvIGFkZCAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fc3RyID0gMDtuX3N0ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cisrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgc3RyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEJ1ZmZlckFkZChidWYsIChjb25zdCB4bWxDaGFyICopc3RyLCBsZW4pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAoY29uc3QgeG1sQ2hhciAqKXN0ciwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEJ1ZmZlckFkZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQnVmZmVyQWRkSGVhZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIGJ1ZmZlciAqLwogICAgaW50IG5fYnVmOwogICAgeG1sQ2hhciAqIHN0cjsgLyogdGhlICN4bWxDaGFyIHN0cmluZyAqLwogICAgaW50IG5fc3RyOwogICAgaW50IGxlbjsgLyogdGhlIG51bWJlciBvZiAjeG1sQ2hhciB0byBhZGQgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgMSk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxCdWZmZXJBZGRIZWFkKGJ1ZiwgKGNvbnN0IHhtbENoYXIgKilzdHIsIGxlbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIChjb25zdCB4bWxDaGFyICopc3RyLCAxKTsKICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQnVmZmVyQWRkSGVhZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQnVmZmVyQ0NhdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIGJ1ZmZlciB0byBkdW1wICovCiAgICBpbnQgbl9idWY7CiAgICBjaGFyICogc3RyOyAvKiB0aGUgQyBjaGFyIHN0cmluZyAqLwogICAgaW50IG5fc3RyOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fc3RyID0gMDtuX3N0ciA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX3N0cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWYgPSBnZW5feG1sQnVmZmVyUHRyKG5fYnVmLCAwKTsKICAgICAgICBzdHIgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9zdHIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQnVmZmVyQ0NhdChidWYsIChjb25zdCBjaGFyICopc3RyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5fYnVmLCBidWYsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX3N0ciwgKGNvbnN0IGNoYXIgKilzdHIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQnVmZmVyQ0NhdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxCdWZmZXJDYXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBidWZmZXIgdG8gYWRkIHRvICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgI3htbENoYXIgc3RyaW5nICovCiAgICBpbnQgbl9zdHI7CgogICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKICAgIGZvciAobl9zdHIgPSAwO25fc3RyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxCdWZmZXJDYXQoYnVmLCAoY29uc3QgeG1sQ2hhciAqKXN0cik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIChjb25zdCB4bWxDaGFyICopc3RyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEJ1ZmZlckNhdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCiNkZWZpbmUgZ2VuX25iX2NvbnN0X3htbEJ1ZmZlclB0ciAxCnN0YXRpYyB4bWxCdWZmZXJQdHIgZ2VuX2NvbnN0X3htbEJ1ZmZlclB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfY29uc3RfeG1sQnVmZmVyUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxCdWZmZXJQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxCdWZmZXJDb250ZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxCdWZmZXJQdHIgYnVmOyAvKiB0aGUgYnVmZmVyICovCiAgICBpbnQgbl9idWY7CgogICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfY29uc3RfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl9jb25zdF94bWxCdWZmZXJQdHIobl9idWYsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQnVmZmVyQ29udGVudCgoY29uc3QgeG1sQnVmZmVyUHRyKWJ1Zik7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQnVmZmVyUHRyKG5fYnVmLCAoY29uc3QgeG1sQnVmZmVyUHRyKWJ1ZiwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxCdWZmZXJDb250ZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQnVmZmVyQ3JlYXRlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQnVmZmVyUHRyIHJldF92YWw7CgogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CgogICAgICAgIHJldF92YWwgPSB4bWxCdWZmZXJDcmVhdGUoKTsKICAgICAgICBkZXNyZXRfeG1sQnVmZmVyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEJ1ZmZlckNyZWF0ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQnVmZmVyQ3JlYXRlU2l6ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxCdWZmZXJDcmVhdGVTdGF0aWModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQnVmZmVyRW1wdHkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxCdWZmZXJQdHIgYnVmOyAvKiB0aGUgYnVmZmVyICovCiAgICBpbnQgbl9idWY7CgogICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOwoKICAgICAgICB4bWxCdWZmZXJFbXB0eShidWYpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5fYnVmLCBidWYsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQnVmZmVyRW1wdHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxCdWZmZXJHcm93KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxCdWZmZXJQdHIgYnVmOyAvKiB0aGUgYnVmZmVyICovCiAgICBpbnQgbl9idWY7CiAgICB1bnNpZ25lZCBpbnQgbGVuOyAvKiB0aGUgbWluaW11bSBmcmVlIHNpemUgdG8gYWxsb2NhdGUgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfdW5zaWduZWRfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIGxlbiA9IGdlbl91bnNpZ25lZF9pbnQobl9sZW4sIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQnVmZmVyR3JvdyhidWYsIGxlbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfdW5zaWduZWRfaW50KG5fbGVuLCBsZW4sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQnVmZmVyR3JvdyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxCdWZmZXJMZW5ndGgodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBidWZmZXIgKi8KICAgIGludCBuX2J1ZjsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl9jb25zdF94bWxCdWZmZXJQdHI7bl9idWYrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX2NvbnN0X3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxCdWZmZXJMZW5ndGgoKGNvbnN0IHhtbEJ1ZmZlclB0cilidWYpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxCdWZmZXJQdHIobl9idWYsIChjb25zdCB4bWxCdWZmZXJQdHIpYnVmLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEJ1ZmZlckxlbmd0aCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEJ1ZmZlclJlc2l6ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIGJ1ZmZlciB0byByZXNpemUgKi8KICAgIGludCBuX2J1ZjsKICAgIHVuc2lnbmVkIGludCBzaXplOyAvKiB0aGUgZGVzaXJlZCBzaXplICovCiAgICBpbnQgbl9zaXplOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fc2l6ZSA9IDA7bl9zaXplIDwgZ2VuX25iX3Vuc2lnbmVkX2ludDtuX3NpemUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgc2l6ZSA9IGdlbl91bnNpZ25lZF9pbnQobl9zaXplLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEJ1ZmZlclJlc2l6ZShidWYsIHNpemUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CiAgICAgICAgZGVzX3Vuc2lnbmVkX2ludChuX3NpemUsIHNpemUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQnVmZmVyUmVzaXplIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxCdWZmZXJTZXRBbGxvY2F0aW9uU2NoZW1lKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIGJ1ZmZlciB0byB0dW5lICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxCdWZmZXJBbGxvY2F0aW9uU2NoZW1lIHNjaGVtZTsgLyogYWxsb2NhdGlvbiBzY2hlbWUgdG8gdXNlICovCiAgICBpbnQgbl9zY2hlbWU7CgogICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKICAgIGZvciAobl9zY2hlbWUgPSAwO25fc2NoZW1lIDwgZ2VuX25iX3htbEJ1ZmZlckFsbG9jYXRpb25TY2hlbWU7bl9zY2hlbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgc2NoZW1lID0gZ2VuX3htbEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUobl9zY2hlbWUsIDEpOwoKICAgICAgICB4bWxCdWZmZXJTZXRBbGxvY2F0aW9uU2NoZW1lKGJ1Ziwgc2NoZW1lKTsKICAgICAgICBpZiAoKGJ1ZiAhPSBOVUxMKSAmJiAoc2NoZW1lID09IFhNTF9CVUZGRVJfQUxMT0NfSU1NVVRBQkxFKSAmJiAoYnVmLT5jb250ZW50ICE9IE5VTEwpICYmIChidWYtPmNvbnRlbnQgIT0gc3RhdGljX2J1Zl9jb250ZW50KSkgewogICAgICAgICAgICB4bWxGcmVlKGJ1Zi0+Y29udGVudCk7IGJ1Zi0+Y29udGVudCA9IE5VTEw7CiAgICAgICAgfQogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5fYnVmLCBidWYsIDApOwogICAgICAgIGRlc194bWxCdWZmZXJBbGxvY2F0aW9uU2NoZW1lKG5fc2NoZW1lLCBzY2hlbWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQnVmZmVyU2V0QWxsb2NhdGlvblNjaGVtZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2NoZW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxCdWZmZXJTaHJpbmsodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBidWZmZXIgdG8gZHVtcCAqLwogICAgaW50IG5fYnVmOwogICAgdW5zaWduZWQgaW50IGxlbjsgLyogdGhlIG51bWJlciBvZiB4bWxDaGFyIHRvIHJlbW92ZSAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl91bnNpZ25lZF9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgbGVuID0gZ2VuX3Vuc2lnbmVkX2ludChuX2xlbiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxCdWZmZXJTaHJpbmsoYnVmLCBsZW4pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CiAgICAgICAgZGVzX3Vuc2lnbmVkX2ludChuX2xlbiwgbGVuLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEJ1ZmZlclNocmluayIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxCdWZmZXJXcml0ZUNIQVIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxCdWZmZXJQdHIgYnVmOyAvKiB0aGUgWE1MIGJ1ZmZlciAqLwogICAgaW50IG5fYnVmOwogICAgeG1sQ2hhciAqIHN0cmluZzsgLyogdGhlIHN0cmluZyB0byBhZGQgKi8KICAgIGludCBuX3N0cmluZzsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX3N0cmluZyA9IDA7bl9zdHJpbmcgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHJpbmcrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgc3RyaW5nID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyaW5nLCAxKTsKCiAgICAgICAgeG1sQnVmZmVyV3JpdGVDSEFSKGJ1ZiwgKGNvbnN0IHhtbENoYXIgKilzdHJpbmcpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5fYnVmLCBidWYsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0cmluZywgKGNvbnN0IHhtbENoYXIgKilzdHJpbmcsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQnVmZmVyV3JpdGVDSEFSIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHJpbmcpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEJ1ZmZlcldyaXRlQ2hhcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBYTUwgYnVmZmVyIG91dHB1dCAqLwogICAgaW50IG5fYnVmOwogICAgY2hhciAqIHN0cmluZzsgLyogdGhlIHN0cmluZyB0byBhZGQgKi8KICAgIGludCBuX3N0cmluZzsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX3N0cmluZyA9IDA7bl9zdHJpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9zdHJpbmcrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgc3RyaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fc3RyaW5nLCAxKTsKCiAgICAgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgKGNvbnN0IGNoYXIgKilzdHJpbmcpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5fYnVmLCBidWYsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX3N0cmluZywgKGNvbnN0IGNoYXIgKilzdHJpbmcsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQnVmZmVyV3JpdGVDaGFyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHJpbmcpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIFhNTCBidWZmZXIgb3V0cHV0ICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxDaGFyICogc3RyaW5nOyAvKiB0aGUgc3RyaW5nIHRvIGFkZCAqLwogICAgaW50IG5fc3RyaW5nOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fc3RyaW5nID0gMDtuX3N0cmluZyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cmluZysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWYgPSBnZW5feG1sQnVmZmVyUHRyKG5fYnVmLCAwKTsKICAgICAgICBzdHJpbmcgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHJpbmcsIDEpOwoKICAgICAgICB4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIChjb25zdCB4bWxDaGFyICopc3RyaW5nKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHJpbmcsIChjb25zdCB4bWxDaGFyICopc3RyaW5nLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHJpbmcpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEJ1aWxkUU5hbWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBuY25hbWU7IC8qIHRoZSBOYW1lICovCiAgICBpbnQgbl9uY25hbWU7CiAgICB4bWxDaGFyICogcHJlZml4OyAvKiB0aGUgcHJlZml4ICovCiAgICBpbnQgbl9wcmVmaXg7CiAgICB4bWxDaGFyICogbWVtb3J5OyAvKiBwcmVhbGxvY2F0ZWQgbWVtb3J5ICovCiAgICBpbnQgbl9tZW1vcnk7CiAgICBpbnQgbGVuOyAvKiBwcmVhbGxvY2F0ZWQgbWVtb3J5IGxlbmd0aCAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9uY25hbWUgPSAwO25fbmNuYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmNuYW1lKyspIHsKICAgIGZvciAobl9wcmVmaXggPSAwO25fcHJlZml4IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHJlZml4KyspIHsKICAgIGZvciAobl9tZW1vcnkgPSAwO25fbWVtb3J5IDwgZ2VuX25iX3htbENoYXJfcHRyO25fbWVtb3J5KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBuY25hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uY25hbWUsIDApOwogICAgICAgIHByZWZpeCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgMSk7CiAgICAgICAgbWVtb3J5ID0gZ2VuX3htbENoYXJfcHRyKG5fbWVtb3J5LCAyKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEJ1aWxkUU5hbWUoKGNvbnN0IHhtbENoYXIgKiluY25hbWUsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCBtZW1vcnksIGxlbik7CiAgICAgICAgaWYgKChyZXRfdmFsICE9IE5VTEwpICYmIChyZXRfdmFsICE9IG5jbmFtZSkgJiYKICAgICAgICAgICAgICAocmV0X3ZhbCAhPSBwcmVmaXgpICYmIChyZXRfdmFsICE9IG1lbW9yeSkpCiAgICAgICAgICAgICAgeG1sRnJlZShyZXRfdmFsKTsKCSAgcmV0X3ZhbCA9IE5VTEw7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uY25hbWUsIChjb25zdCB4bWxDaGFyICopbmNuYW1lLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCAxKTsKICAgICAgICBkZXNfeG1sQ2hhcl9wdHIobl9tZW1vcnksIG1lbW9yeSwgMik7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEJ1aWxkUU5hbWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmNuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZWZpeCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9tZW1vcnkpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDaGlsZEVsZW1lbnRDb3VudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHVuc2lnbmVkIGxvbmcgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgcGFyZW50OyAvKiB0aGUgcGFyZW50IG5vZGUgKi8KICAgIGludCBuX3BhcmVudDsKCiAgICBmb3IgKG5fcGFyZW50ID0gMDtuX3BhcmVudCA8IGdlbl9uYl94bWxOb2RlUHRyO25fcGFyZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHBhcmVudCA9IGdlbl94bWxOb2RlUHRyKG5fcGFyZW50LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENoaWxkRWxlbWVudENvdW50KHBhcmVudCk7CiAgICAgICAgZGVzcmV0X3Vuc2lnbmVkX2xvbmcocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fcGFyZW50LCBwYXJlbnQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ2hpbGRFbGVtZW50Q291bnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcGFyZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ29weURvYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRG9jUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIGludCByZWN1cnNpdmU7IC8qIGlmIG5vdCB6ZXJvIGRvIGEgcmVjdXJzaXZlIGNvcHkuICovCiAgICBpbnQgbl9yZWN1cnNpdmU7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9yZWN1cnNpdmUgPSAwO25fcmVjdXJzaXZlIDwgZ2VuX25iX2ludDtuX3JlY3Vyc2l2ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICByZWN1cnNpdmUgPSBnZW5faW50KG5fcmVjdXJzaXZlLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENvcHlEb2MoZG9jLCByZWN1cnNpdmUpOwogICAgICAgIGRlc3JldF94bWxEb2NQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2ludChuX3JlY3Vyc2l2ZSwgcmVjdXJzaXZlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENvcHlEb2MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlY3Vyc2l2ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENvcHlEdGQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxEdGRQdHIgcmV0X3ZhbDsKICAgIHhtbER0ZFB0ciBkdGQ7IC8qIHRoZSBkdGQgKi8KICAgIGludCBuX2R0ZDsKCiAgICBmb3IgKG5fZHRkID0gMDtuX2R0ZCA8IGdlbl9uYl94bWxEdGRQdHI7bl9kdGQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZHRkID0gZ2VuX3htbER0ZFB0cihuX2R0ZCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxDb3B5RHRkKGR0ZCk7CiAgICAgICAgZGVzcmV0X3htbER0ZFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbER0ZFB0cihuX2R0ZCwgZHRkLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENvcHlEdGQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZHRkKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ29weU5hbWVzcGFjZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5zUHRyIHJldF92YWw7CiAgICB4bWxOc1B0ciBjdXI7IC8qIHRoZSBuYW1lc3BhY2UgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOc1B0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sTnNQdHIobl9jdXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQ29weU5hbWVzcGFjZShjdXIpOwogICAgICAgIGlmIChyZXRfdmFsICE9IE5VTEwpIHhtbEZyZWVOcyhyZXRfdmFsKTsKICAgICAgICBkZXNyZXRfeG1sTnNQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOc1B0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENvcHlOYW1lc3BhY2UiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDb3B5TmFtZXNwYWNlTGlzdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5zUHRyIHJldF92YWw7CiAgICB4bWxOc1B0ciBjdXI7IC8qIHRoZSBmaXJzdCBuYW1lc3BhY2UgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOc1B0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sTnNQdHIobl9jdXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQ29weU5hbWVzcGFjZUxpc3QoY3VyKTsKICAgICAgICBpZiAocmV0X3ZhbCAhPSBOVUxMKSB4bWxGcmVlTnNMaXN0KHJldF92YWwpOwogICAgICAgIGRlc3JldF94bWxOc1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5zUHRyKG5fY3VyLCBjdXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ29weU5hbWVzcGFjZUxpc3QiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDb3B5Tm9kZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIG5vZGUgKi8KICAgIGludCBuX25vZGU7CiAgICBpbnQgZXh0ZW5kZWQ7IC8qIGlmIDEgZG8gYSByZWN1cnNpdmUgY29weSAocHJvcGVydGllcywgbmFtZXNwYWNlcyBhbmQgY2hpbGRyZW4gd2hlbiBhcHBsaWNhYmxlKSBpZiAyIGNvcHkgcHJvcGVydGllcyBhbmQgbmFtZXNwYWNlcyAod2hlbiBhcHBsaWNhYmxlKSAqLwogICAgaW50IG5fZXh0ZW5kZWQ7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl9jb25zdF94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fZXh0ZW5kZWQgPSAwO25fZXh0ZW5kZWQgPCBnZW5fbmJfaW50O25fZXh0ZW5kZWQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZSA9IGdlbl9jb25zdF94bWxOb2RlUHRyKG5fbm9kZSwgMCk7CiAgICAgICAgZXh0ZW5kZWQgPSBnZW5faW50KG5fZXh0ZW5kZWQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQ29weU5vZGUoKGNvbnN0IHhtbE5vZGVQdHIpbm9kZSwgZXh0ZW5kZWQpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sTm9kZVB0cihuX25vZGUsIChjb25zdCB4bWxOb2RlUHRyKW5vZGUsIDApOwogICAgICAgIGRlc19pbnQobl9leHRlbmRlZCwgZXh0ZW5kZWQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ29weU5vZGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9leHRlbmRlZCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ29weU5vZGVMaXN0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgbGlzdC4gKi8KICAgIGludCBuX25vZGU7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl9jb25zdF94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlID0gZ2VuX2NvbnN0X3htbE5vZGVQdHIobl9ub2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENvcHlOb2RlTGlzdCgoY29uc3QgeG1sTm9kZVB0cilub2RlKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbE5vZGVQdHIobl9ub2RlLCAoY29uc3QgeG1sTm9kZVB0cilub2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENvcHlOb2RlTGlzdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDb3B5UHJvcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEF0dHJQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgdGFyZ2V0OyAvKiB0aGUgZWxlbWVudCB3aGVyZSB0aGUgYXR0cmlidXRlIHdpbGwgYmUgZ3JhZnRlZCAqLwogICAgaW50IG5fdGFyZ2V0OwogICAgeG1sQXR0clB0ciBjdXI7IC8qIHRoZSBhdHRyaWJ1dGUgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fdGFyZ2V0ID0gMDtuX3RhcmdldCA8IGdlbl9uYl94bWxOb2RlUHRyO25fdGFyZ2V0KyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbEF0dHJQdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdGFyZ2V0ID0gZ2VuX3htbE5vZGVQdHIobl90YXJnZXQsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxBdHRyUHRyKG5fY3VyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENvcHlQcm9wKHRhcmdldCwgY3VyKTsKICAgICAgICBkZXNyZXRfeG1sQXR0clB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl90YXJnZXQsIHRhcmdldCwgMCk7CiAgICAgICAgZGVzX3htbEF0dHJQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDb3B5UHJvcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90YXJnZXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDb3B5UHJvcExpc3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxBdHRyUHRyIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIHRhcmdldDsgLyogdGhlIGVsZW1lbnQgd2hlcmUgdGhlIGF0dHJpYnV0ZXMgd2lsbCBiZSBncmFmdGVkICovCiAgICBpbnQgbl90YXJnZXQ7CiAgICB4bWxBdHRyUHRyIGN1cjsgLyogdGhlIGZpcnN0IGF0dHJpYnV0ZSAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl90YXJnZXQgPSAwO25fdGFyZ2V0IDwgZ2VuX25iX3htbE5vZGVQdHI7bl90YXJnZXQrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sQXR0clB0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0YXJnZXQgPSBnZW5feG1sTm9kZVB0cihuX3RhcmdldCwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbEF0dHJQdHIobl9jdXIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQ29weVByb3BMaXN0KHRhcmdldCwgY3VyKTsKICAgICAgICBkZXNyZXRfeG1sQXR0clB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl90YXJnZXQsIHRhcmdldCwgMCk7CiAgICAgICAgZGVzX3htbEF0dHJQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDb3B5UHJvcExpc3QiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdGFyZ2V0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ3JlYXRlSW50U3Vic2V0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRHRkUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgcG9pbnRlciAqLwogICAgaW50IG5fZG9jOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBEVEQgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBFeHRlcm5hbElEOyAvKiB0aGUgZXh0ZXJuYWwgKFBVQkxJQykgSUQgKi8KICAgIGludCBuX0V4dGVybmFsSUQ7CiAgICB4bWxDaGFyICogU3lzdGVtSUQ7IC8qIHRoZSBzeXN0ZW0gSUQgKi8KICAgIGludCBuX1N5c3RlbUlEOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fRXh0ZXJuYWxJRCA9IDA7bl9FeHRlcm5hbElEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fRXh0ZXJuYWxJRCsrKSB7CiAgICBmb3IgKG5fU3lzdGVtSUQgPSAwO25fU3lzdGVtSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9TeXN0ZW1JRCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgRXh0ZXJuYWxJRCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX0V4dGVybmFsSUQsIDIpOwogICAgICAgIFN5c3RlbUlEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fU3lzdGVtSUQsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sQ3JlYXRlSW50U3Vic2V0KGRvYywgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQsIChjb25zdCB4bWxDaGFyICopU3lzdGVtSUQpOwogICAgICAgIGRlc3JldF94bWxEdGRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9FeHRlcm5hbElELCAoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX1N5c3RlbUlELCAoY29uc3QgeG1sQ2hhciAqKVN5c3RlbUlELCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENyZWF0ZUludFN1YnNldCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9FeHRlcm5hbElEKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1N5c3RlbUlEKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCiNkZWZpbmUgZ2VuX25iX3htbERPTVdyYXBDdHh0UHRyIDEKc3RhdGljIHhtbERPTVdyYXBDdHh0UHRyIGdlbl94bWxET01XcmFwQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sRE9NV3JhcEN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbERPTVdyYXBDdHh0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sRE9NV3JhcEFkb3B0Tm9kZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sRE9NV3JhcEN0eHRQdHIgY3R4dDsgLyogdGhlIG9wdGlvbmFsIGNvbnRleHQgZm9yIGN1c3RvbSBwcm9jZXNzaW5nICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRG9jUHRyIHNvdXJjZURvYzsgLyogdGhlIG9wdGlvbmFsIHNvdXJjZURvYyAqLwogICAgaW50IG5fc291cmNlRG9jOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgbm9kZSB0byBzdGFydCB3aXRoICovCiAgICBpbnQgbl9ub2RlOwogICAgeG1sRG9jUHRyIGRlc3REb2M7IC8qIHRoZSBkZXN0aW5hdGlvbiBkb2MgKi8KICAgIGludCBuX2Rlc3REb2M7CiAgICB4bWxOb2RlUHRyIGRlc3RQYXJlbnQ7IC8qIHRoZSBvcHRpb25hbCBuZXcgcGFyZW50IG9mIEBub2RlIGluIEBkZXN0RG9jICovCiAgICBpbnQgbl9kZXN0UGFyZW50OwogICAgaW50IG9wdGlvbnM7IC8qIG9wdGlvbiBmbGFncyAqLwogICAgaW50IG5fb3B0aW9uczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbERPTVdyYXBDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fc291cmNlRG9jID0gMDtuX3NvdXJjZURvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9zb3VyY2VEb2MrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fZGVzdERvYyA9IDA7bl9kZXN0RG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2Rlc3REb2MrKykgewogICAgZm9yIChuX2Rlc3RQYXJlbnQgPSAwO25fZGVzdFBhcmVudCA8IGdlbl9uYl94bWxOb2RlUHRyO25fZGVzdFBhcmVudCsrKSB7CiAgICBmb3IgKG5fb3B0aW9ucyA9IDA7bl9vcHRpb25zIDwgZ2VuX25iX2ludDtuX29wdGlvbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxET01XcmFwQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIHNvdXJjZURvYyA9IGdlbl94bWxEb2NQdHIobl9zb3VyY2VEb2MsIDEpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDIpOwogICAgICAgIGRlc3REb2MgPSBnZW5feG1sRG9jUHRyKG5fZGVzdERvYywgMyk7CiAgICAgICAgZGVzdFBhcmVudCA9IGdlbl94bWxOb2RlUHRyKG5fZGVzdFBhcmVudCwgNCk7CiAgICAgICAgb3B0aW9ucyA9IGdlbl9pbnQobl9vcHRpb25zLCA1KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbERPTVdyYXBBZG9wdE5vZGUoY3R4dCwgc291cmNlRG9jLCBub2RlLCBkZXN0RG9jLCBkZXN0UGFyZW50LCBvcHRpb25zKTsKICAgICAgICBpZiAoKG5vZGUgIT0gTlVMTCkgJiYgKG5vZGUtPnBhcmVudCA9PSBOVUxMKSkge3htbFVubGlua05vZGUobm9kZSk7eG1sRnJlZU5vZGUobm9kZSk7bm9kZSA9IE5VTEw7fQogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxET01XcmFwQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9zb3VyY2VEb2MsIHNvdXJjZURvYywgMSk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAyKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZGVzdERvYywgZGVzdERvYywgMyk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9kZXN0UGFyZW50LCBkZXN0UGFyZW50LCA0KTsKICAgICAgICBkZXNfaW50KG5fb3B0aW9ucywgb3B0aW9ucywgNSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxET01XcmFwQWRvcHROb2RlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc291cmNlRG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGVzdERvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kZXN0UGFyZW50KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29wdGlvbnMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERPTVdyYXBDbG9uZU5vZGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbERPTVdyYXBDdHh0UHRyIGN0eHQ7IC8qIHRoZSBvcHRpb25hbCBjb250ZXh0IGZvciBjdXN0b20gcHJvY2Vzc2luZyAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbERvY1B0ciBzb3VyY2VEb2M7IC8qIHRoZSBvcHRpb25hbCBzb3VyY2VEb2MgKi8KICAgIGludCBuX3NvdXJjZURvYzsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIG5vZGUgdG8gc3RhcnQgd2l0aCAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbE5vZGVQdHIgKiByZXNOb2RlOyAvKiB0aGUgY2xvbmUgb2YgdGhlIGdpdmVuIEBub2RlICovCiAgICBpbnQgbl9yZXNOb2RlOwogICAgeG1sRG9jUHRyIGRlc3REb2M7IC8qIHRoZSBkZXN0aW5hdGlvbiBkb2MgKi8KICAgIGludCBuX2Rlc3REb2M7CiAgICB4bWxOb2RlUHRyIGRlc3RQYXJlbnQ7IC8qIHRoZSBvcHRpb25hbCBuZXcgcGFyZW50IG9mIEBub2RlIGluIEBkZXN0RG9jICovCiAgICBpbnQgbl9kZXN0UGFyZW50OwogICAgaW50IGRlZXA7IC8qIGRlc2NlbmQgaW50byBjaGlsZCBpZiBzZXQgKi8KICAgIGludCBuX2RlZXA7CiAgICBpbnQgb3B0aW9uczsgLyogb3B0aW9uIGZsYWdzICovCiAgICBpbnQgbl9vcHRpb25zOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sRE9NV3JhcEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9zb3VyY2VEb2MgPSAwO25fc291cmNlRG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX3NvdXJjZURvYysrKSB7CiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9yZXNOb2RlID0gMDtuX3Jlc05vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cl9wdHI7bl9yZXNOb2RlKyspIHsKICAgIGZvciAobl9kZXN0RG9jID0gMDtuX2Rlc3REb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZGVzdERvYysrKSB7CiAgICBmb3IgKG5fZGVzdFBhcmVudCA9IDA7bl9kZXN0UGFyZW50IDwgZ2VuX25iX3htbE5vZGVQdHI7bl9kZXN0UGFyZW50KyspIHsKICAgIGZvciAobl9kZWVwID0gMDtuX2RlZXAgPCBnZW5fbmJfaW50O25fZGVlcCsrKSB7CiAgICBmb3IgKG5fb3B0aW9ucyA9IDA7bl9vcHRpb25zIDwgZ2VuX25iX2ludDtuX29wdGlvbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxET01XcmFwQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIHNvdXJjZURvYyA9IGdlbl94bWxEb2NQdHIobl9zb3VyY2VEb2MsIDEpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDIpOwogICAgICAgIHJlc05vZGUgPSBnZW5feG1sTm9kZVB0cl9wdHIobl9yZXNOb2RlLCAzKTsKICAgICAgICBkZXN0RG9jID0gZ2VuX3htbERvY1B0cihuX2Rlc3REb2MsIDQpOwogICAgICAgIGRlc3RQYXJlbnQgPSBnZW5feG1sTm9kZVB0cihuX2Rlc3RQYXJlbnQsIDUpOwogICAgICAgIGRlZXAgPSBnZW5faW50KG5fZGVlcCwgNik7CiAgICAgICAgb3B0aW9ucyA9IGdlbl9pbnQobl9vcHRpb25zLCA3KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbERPTVdyYXBDbG9uZU5vZGUoY3R4dCwgc291cmNlRG9jLCBub2RlLCByZXNOb2RlLCBkZXN0RG9jLCBkZXN0UGFyZW50LCBkZWVwLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRE9NV3JhcEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fc291cmNlRG9jLCBzb3VyY2VEb2MsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMik7CiAgICAgICAgZGVzX3htbE5vZGVQdHJfcHRyKG5fcmVzTm9kZSwgcmVzTm9kZSwgMyk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2Rlc3REb2MsIGRlc3REb2MsIDQpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fZGVzdFBhcmVudCwgZGVzdFBhcmVudCwgNSk7CiAgICAgICAgZGVzX2ludChuX2RlZXAsIGRlZXAsIDYpOwogICAgICAgIGRlc19pbnQobl9vcHRpb25zLCBvcHRpb25zLCA3KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERPTVdyYXBDbG9uZU5vZGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zb3VyY2VEb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZXNOb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Rlc3REb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGVzdFBhcmVudCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kZWVwKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29wdGlvbnMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERPTVdyYXBOZXdDdHh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERPTVdyYXBSZWNvbmNpbGVOYW1lc3BhY2VzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxET01XcmFwQ3R4dFB0ciBjdHh0OyAvKiBET00gd3JhcHBlciBjb250ZXh0LCB1bnVzZWQgYXQgdGhlIG1vbWVudCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbE5vZGVQdHIgZWxlbTsgLyogdGhlIGVsZW1lbnQtbm9kZSAqLwogICAgaW50IG5fZWxlbTsKICAgIGludCBvcHRpb25zOyAvKiBvcHRpb24gZmxhZ3MgKi8KICAgIGludCBuX29wdGlvbnM7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxET01XcmFwQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2VsZW0gPSAwO25fZWxlbSA8IGdlbl9uYl94bWxOb2RlUHRyO25fZWxlbSsrKSB7CiAgICBmb3IgKG5fb3B0aW9ucyA9IDA7bl9vcHRpb25zIDwgZ2VuX25iX2ludDtuX29wdGlvbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxET01XcmFwQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGVsZW0gPSBnZW5feG1sTm9kZVB0cihuX2VsZW0sIDEpOwogICAgICAgIG9wdGlvbnMgPSBnZW5faW50KG5fb3B0aW9ucywgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxET01XcmFwUmVjb25jaWxlTmFtZXNwYWNlcyhjdHh0LCBlbGVtLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRE9NV3JhcEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2VsZW0sIGVsZW0sIDEpOwogICAgICAgIGRlc19pbnQobl9vcHRpb25zLCBvcHRpb25zLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERPTVdyYXBSZWNvbmNpbGVOYW1lc3BhY2VzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZWxlbSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vcHRpb25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxET01XcmFwUmVtb3ZlTm9kZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sRE9NV3JhcEN0eHRQdHIgY3R4dDsgLyogYSBET00gd3JhcHBlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvYyAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgbm9kZSB0byBiZSByZW1vdmVkLiAqLwogICAgaW50IG5fbm9kZTsKICAgIGludCBvcHRpb25zOyAvKiBzZXQgb2Ygb3B0aW9ucywgdW51c2VkIGF0IHRoZSBtb21lbnQgKi8KICAgIGludCBuX29wdGlvbnM7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxET01XcmFwQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgZm9yIChuX29wdGlvbnMgPSAwO25fb3B0aW9ucyA8IGdlbl9uYl9pbnQ7bl9vcHRpb25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sRE9NV3JhcEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAyKTsKICAgICAgICBvcHRpb25zID0gZ2VuX2ludChuX29wdGlvbnMsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sRE9NV3JhcFJlbW92ZU5vZGUoY3R4dCwgZG9jLCBub2RlLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRE9NV3JhcEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMik7CiAgICAgICAgZGVzX2ludChuX29wdGlvbnMsIG9wdGlvbnMsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRE9NV3JhcFJlbW92ZU5vZGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vcHRpb25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEb2NDb3B5Tm9kZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIG5vZGUgKi8KICAgIGludCBuX25vZGU7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIGludCBleHRlbmRlZDsgLyogaWYgMSBkbyBhIHJlY3Vyc2l2ZSBjb3B5IChwcm9wZXJ0aWVzLCBuYW1lc3BhY2VzIGFuZCBjaGlsZHJlbiB3aGVuIGFwcGxpY2FibGUpIGlmIDIgY29weSBwcm9wZXJ0aWVzIGFuZCBuYW1lc3BhY2VzICh3aGVuIGFwcGxpY2FibGUpICovCiAgICBpbnQgbl9leHRlbmRlZDsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX2NvbnN0X3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fZXh0ZW5kZWQgPSAwO25fZXh0ZW5kZWQgPCBnZW5fbmJfaW50O25fZXh0ZW5kZWQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZSA9IGdlbl9jb25zdF94bWxOb2RlUHRyKG5fbm9kZSwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CiAgICAgICAgZXh0ZW5kZWQgPSBnZW5faW50KG5fZXh0ZW5kZWQsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sRG9jQ29weU5vZGUoKGNvbnN0IHhtbE5vZGVQdHIpbm9kZSwgZG9jLCBleHRlbmRlZCk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxOb2RlUHRyKG5fbm9kZSwgKGNvbnN0IHhtbE5vZGVQdHIpbm9kZSwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICBkZXNfaW50KG5fZXh0ZW5kZWQsIGV4dGVuZGVkLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERvY0NvcHlOb2RlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2V4dGVuZGVkKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEb2NDb3B5Tm9kZUxpc3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgdGFyZ2V0IGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBmaXJzdCBub2RlIGluIHRoZSBsaXN0LiAqLwogICAgaW50IG5fbm9kZTsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl9jb25zdF94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBub2RlID0gZ2VuX2NvbnN0X3htbE5vZGVQdHIobl9ub2RlLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbERvY0NvcHlOb2RlTGlzdChkb2MsIChjb25zdCB4bWxOb2RlUHRyKW5vZGUpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxOb2RlUHRyKG5fbm9kZSwgKGNvbnN0IHhtbE5vZGVQdHIpbm9kZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEb2NDb3B5Tm9kZUxpc3QiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERvY0R1bXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgRklMRSAqIGY7IC8qIHRoZSBGSUxFKiAqLwogICAgaW50IG5fZjsKICAgIHhtbERvY1B0ciBjdXI7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9mID0gMDtuX2YgPCBnZW5fbmJfRklMRV9wdHI7bl9mKyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbERvY1B0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmID0gZ2VuX0ZJTEVfcHRyKG5fZiwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbERvY1B0cihuX2N1ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxEb2NEdW1wKGYsIGN1cik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX0ZJTEVfcHRyKG5fZiwgZiwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERvY0R1bXAiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEb2NEdW1wRm9ybWF0TWVtb3J5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxEb2NQdHIgY3VyOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2N1cjsKICAgIHhtbENoYXIgKiogbWVtOyAvKiBPVVQ6IHRoZSBtZW1vcnkgcG9pbnRlciAqLwogICAgaW50IG5fbWVtOwogICAgaW50ICogc2l6ZTsgLyogT1VUOiB0aGUgbWVtb3J5IGxlbmd0aCAqLwogICAgaW50IG5fc2l6ZTsKICAgIGludCBmb3JtYXQ7IC8qIHNob3VsZCBmb3JtYXR0aW5nIHNwYWNlcyBiZWVuIGFkZGVkICovCiAgICBpbnQgbl9mb3JtYXQ7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sRG9jUHRyO25fY3VyKyspIHsKICAgIGZvciAobl9tZW0gPSAwO25fbWVtIDwgZ2VuX25iX3htbENoYXJfcHRyX3B0cjtuX21lbSsrKSB7CiAgICBmb3IgKG5fc2l6ZSA9IDA7bl9zaXplIDwgZ2VuX25iX2ludF9wdHI7bl9zaXplKyspIHsKICAgIGZvciAobl9mb3JtYXQgPSAwO25fZm9ybWF0IDwgZ2VuX25iX2ludDtuX2Zvcm1hdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sRG9jUHRyKG5fY3VyLCAwKTsKICAgICAgICBtZW0gPSBnZW5feG1sQ2hhcl9wdHJfcHRyKG5fbWVtLCAxKTsKICAgICAgICBzaXplID0gZ2VuX2ludF9wdHIobl9zaXplLCAyKTsKICAgICAgICBmb3JtYXQgPSBnZW5faW50KG5fZm9ybWF0LCAzKTsKCiAgICAgICAgeG1sRG9jRHVtcEZvcm1hdE1lbW9yeShjdXIsIG1lbSwgc2l6ZSwgZm9ybWF0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfeG1sQ2hhcl9wdHJfcHRyKG5fbWVtLCBtZW0sIDEpOwogICAgICAgIGRlc19pbnRfcHRyKG5fc2l6ZSwgc2l6ZSwgMik7CiAgICAgICAgZGVzX2ludChuX2Zvcm1hdCwgZm9ybWF0LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERvY0R1bXBGb3JtYXRNZW1vcnkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX21lbSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Zvcm1hdCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERvY0R1bXBGb3JtYXRNZW1vcnlFbmModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciBvdXRfZG9jOyAvKiBEb2N1bWVudCB0byBnZW5lcmF0ZSBYTUwgdGV4dCBmcm9tICovCiAgICBpbnQgbl9vdXRfZG9jOwogICAgeG1sQ2hhciAqKiBkb2NfdHh0X3B0cjsgLyogTWVtb3J5IHBvaW50ZXIgZm9yIGFsbG9jYXRlZCBYTUwgdGV4dCAqLwogICAgaW50IG5fZG9jX3R4dF9wdHI7CiAgICBpbnQgKiBkb2NfdHh0X2xlbjsgLyogTGVuZ3RoIG9mIHRoZSBnZW5lcmF0ZWQgWE1MIHRleHQgKi8KICAgIGludCBuX2RvY190eHRfbGVuOwogICAgY2hhciAqIHR4dF9lbmNvZGluZzsgLyogQ2hhcmFjdGVyIGVuY29kaW5nIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgWE1MIHRleHQgKi8KICAgIGludCBuX3R4dF9lbmNvZGluZzsKICAgIGludCBmb3JtYXQ7IC8qIHNob3VsZCBmb3JtYXR0aW5nIHNwYWNlcyBiZWVuIGFkZGVkICovCiAgICBpbnQgbl9mb3JtYXQ7CgogICAgZm9yIChuX291dF9kb2MgPSAwO25fb3V0X2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9vdXRfZG9jKyspIHsKICAgIGZvciAobl9kb2NfdHh0X3B0ciA9IDA7bl9kb2NfdHh0X3B0ciA8IGdlbl9uYl94bWxDaGFyX3B0cl9wdHI7bl9kb2NfdHh0X3B0cisrKSB7CiAgICBmb3IgKG5fZG9jX3R4dF9sZW4gPSAwO25fZG9jX3R4dF9sZW4gPCBnZW5fbmJfaW50X3B0cjtuX2RvY190eHRfbGVuKyspIHsKICAgIGZvciAobl90eHRfZW5jb2RpbmcgPSAwO25fdHh0X2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fdHh0X2VuY29kaW5nKyspIHsKICAgIGZvciAobl9mb3JtYXQgPSAwO25fZm9ybWF0IDwgZ2VuX25iX2ludDtuX2Zvcm1hdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXRfZG9jID0gZ2VuX3htbERvY1B0cihuX291dF9kb2MsIDApOwogICAgICAgIGRvY190eHRfcHRyID0gZ2VuX3htbENoYXJfcHRyX3B0cihuX2RvY190eHRfcHRyLCAxKTsKICAgICAgICBkb2NfdHh0X2xlbiA9IGdlbl9pbnRfcHRyKG5fZG9jX3R4dF9sZW4sIDIpOwogICAgICAgIHR4dF9lbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX3R4dF9lbmNvZGluZywgMyk7CiAgICAgICAgZm9ybWF0ID0gZ2VuX2ludChuX2Zvcm1hdCwgNCk7CgogICAgICAgIHhtbERvY0R1bXBGb3JtYXRNZW1vcnlFbmMob3V0X2RvYywgZG9jX3R4dF9wdHIsIGRvY190eHRfbGVuLCAoY29uc3QgY2hhciAqKXR4dF9lbmNvZGluZywgZm9ybWF0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX291dF9kb2MsIG91dF9kb2MsIDApOwogICAgICAgIGRlc194bWxDaGFyX3B0cl9wdHIobl9kb2NfdHh0X3B0ciwgZG9jX3R4dF9wdHIsIDEpOwogICAgICAgIGRlc19pbnRfcHRyKG5fZG9jX3R4dF9sZW4sIGRvY190eHRfbGVuLCAyKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl90eHRfZW5jb2RpbmcsIChjb25zdCBjaGFyICopdHh0X2VuY29kaW5nLCAzKTsKICAgICAgICBkZXNfaW50KG5fZm9ybWF0LCBmb3JtYXQsIDQpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRG9jRHVtcEZvcm1hdE1lbW9yeUVuYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRfZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvY190eHRfcHRyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvY190eHRfbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3R4dF9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mb3JtYXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEb2NEdW1wTWVtb3J5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxEb2NQdHIgY3VyOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2N1cjsKICAgIHhtbENoYXIgKiogbWVtOyAvKiBPVVQ6IHRoZSBtZW1vcnkgcG9pbnRlciAqLwogICAgaW50IG5fbWVtOwogICAgaW50ICogc2l6ZTsgLyogT1VUOiB0aGUgbWVtb3J5IGxlbmd0aCAqLwogICAgaW50IG5fc2l6ZTsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxEb2NQdHI7bl9jdXIrKykgewogICAgZm9yIChuX21lbSA9IDA7bl9tZW0gPCBnZW5fbmJfeG1sQ2hhcl9wdHJfcHRyO25fbWVtKyspIHsKICAgIGZvciAobl9zaXplID0gMDtuX3NpemUgPCBnZW5fbmJfaW50X3B0cjtuX3NpemUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX3htbERvY1B0cihuX2N1ciwgMCk7CiAgICAgICAgbWVtID0gZ2VuX3htbENoYXJfcHRyX3B0cihuX21lbSwgMSk7CiAgICAgICAgc2l6ZSA9IGdlbl9pbnRfcHRyKG5fc2l6ZSwgMik7CgogICAgICAgIHhtbERvY0R1bXBNZW1vcnkoY3VyLCBtZW0sIHNpemUpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fY3VyLCBjdXIsIDApOwogICAgICAgIGRlc194bWxDaGFyX3B0cl9wdHIobl9tZW0sIG1lbSwgMSk7CiAgICAgICAgZGVzX2ludF9wdHIobl9zaXplLCBzaXplLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERvY0R1bXBNZW1vcnkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX21lbSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRG9jRHVtcE1lbW9yeUVuYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRG9jUHRyIG91dF9kb2M7IC8qIERvY3VtZW50IHRvIGdlbmVyYXRlIFhNTCB0ZXh0IGZyb20gKi8KICAgIGludCBuX291dF9kb2M7CiAgICB4bWxDaGFyICoqIGRvY190eHRfcHRyOyAvKiBNZW1vcnkgcG9pbnRlciBmb3IgYWxsb2NhdGVkIFhNTCB0ZXh0ICovCiAgICBpbnQgbl9kb2NfdHh0X3B0cjsKICAgIGludCAqIGRvY190eHRfbGVuOyAvKiBMZW5ndGggb2YgdGhlIGdlbmVyYXRlZCBYTUwgdGV4dCAqLwogICAgaW50IG5fZG9jX3R4dF9sZW47CiAgICBjaGFyICogdHh0X2VuY29kaW5nOyAvKiBDaGFyYWN0ZXIgZW5jb2RpbmcgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBYTUwgdGV4dCAqLwogICAgaW50IG5fdHh0X2VuY29kaW5nOwoKICAgIGZvciAobl9vdXRfZG9jID0gMDtuX291dF9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fb3V0X2RvYysrKSB7CiAgICBmb3IgKG5fZG9jX3R4dF9wdHIgPSAwO25fZG9jX3R4dF9wdHIgPCBnZW5fbmJfeG1sQ2hhcl9wdHJfcHRyO25fZG9jX3R4dF9wdHIrKykgewogICAgZm9yIChuX2RvY190eHRfbGVuID0gMDtuX2RvY190eHRfbGVuIDwgZ2VuX25iX2ludF9wdHI7bl9kb2NfdHh0X2xlbisrKSB7CiAgICBmb3IgKG5fdHh0X2VuY29kaW5nID0gMDtuX3R4dF9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX3R4dF9lbmNvZGluZysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXRfZG9jID0gZ2VuX3htbERvY1B0cihuX291dF9kb2MsIDApOwogICAgICAgIGRvY190eHRfcHRyID0gZ2VuX3htbENoYXJfcHRyX3B0cihuX2RvY190eHRfcHRyLCAxKTsKICAgICAgICBkb2NfdHh0X2xlbiA9IGdlbl9pbnRfcHRyKG5fZG9jX3R4dF9sZW4sIDIpOwogICAgICAgIHR4dF9lbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX3R4dF9lbmNvZGluZywgMyk7CgogICAgICAgIHhtbERvY0R1bXBNZW1vcnlFbmMob3V0X2RvYywgZG9jX3R4dF9wdHIsIGRvY190eHRfbGVuLCAoY29uc3QgY2hhciAqKXR4dF9lbmNvZGluZyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9vdXRfZG9jLCBvdXRfZG9jLCAwKTsKICAgICAgICBkZXNfeG1sQ2hhcl9wdHJfcHRyKG5fZG9jX3R4dF9wdHIsIGRvY190eHRfcHRyLCAxKTsKICAgICAgICBkZXNfaW50X3B0cihuX2RvY190eHRfbGVuLCBkb2NfdHh0X2xlbiwgMik7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fdHh0X2VuY29kaW5nLCAoY29uc3QgY2hhciAqKXR4dF9lbmNvZGluZywgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEb2NEdW1wTWVtb3J5RW5jIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dF9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jX3R4dF9wdHIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jX3R4dF9sZW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHh0X2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRG9jRm9ybWF0RHVtcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBGSUxFICogZjsgLyogdGhlIEZJTEUqICovCiAgICBpbnQgbl9mOwogICAgeG1sRG9jUHRyIGN1cjsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9jdXI7CiAgICBpbnQgZm9ybWF0OyAvKiBzaG91bGQgZm9ybWF0dGluZyBzcGFjZXMgYmVlbiBhZGRlZCAqLwogICAgaW50IG5fZm9ybWF0OwoKICAgIGZvciAobl9mID0gMDtuX2YgPCBnZW5fbmJfRklMRV9wdHI7bl9mKyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbERvY1B0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fZm9ybWF0ID0gMDtuX2Zvcm1hdCA8IGdlbl9uYl9pbnQ7bl9mb3JtYXQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZiA9IGdlbl9GSUxFX3B0cihuX2YsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxEb2NQdHIobl9jdXIsIDEpOwogICAgICAgIGZvcm1hdCA9IGdlbl9pbnQobl9mb3JtYXQsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sRG9jRm9ybWF0RHVtcChmLCBjdXIsIGZvcm1hdCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX0ZJTEVfcHRyKG5fZiwgZiwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICBkZXNfaW50KG5fZm9ybWF0LCBmb3JtYXQsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRG9jRm9ybWF0RHVtcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mb3JtYXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEb2NHZXRSb290RWxlbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEb2NHZXRSb290RWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbERvY1NldFJvb3RFbGVtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVFJFRV9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm9kZVB0ciByb290OyAvKiB0aGUgbmV3IGRvY3VtZW50IHJvb3QgZWxlbWVudCwgaWYgcm9vdCBpcyBOVUxMIG5vIGFjdGlvbiBpcyB0YWtlbiwgdG8gcmVtb3ZlIGEgbm9kZSBmcm9tIGEgZG9jdW1lbnQgdXNlIHhtbFVubGlua05vZGUocm9vdCkgaW5zdGVhZC4gKi8KICAgIGludCBuX3Jvb3Q7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9yb290ID0gMDtuX3Jvb3QgPCBnZW5fbmJfeG1sTm9kZVB0cl9pbjtuX3Jvb3QrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgcm9vdCA9IGdlbl94bWxOb2RlUHRyX2luKG5fcm9vdCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxEb2NTZXRSb290RWxlbWVudChkb2MsIHJvb3QpOwogICAgICAgIGlmIChkb2MgPT0gTlVMTCkgeyB4bWxGcmVlTm9kZShyb290KSA7IHJvb3QgPSBOVUxMIDsgfQogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyX2luKG5fcm9vdCwgcm9vdCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEb2NTZXRSb290RWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcm9vdCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEVsZW1EdW1wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBGSUxFICogZjsgLyogdGhlIEZJTEUgKiBmb3IgdGhlIG91dHB1dCAqLwogICAgaW50IG5fZjsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBjdXJyZW50IG5vZGUgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fZiA9IDA7bl9mIDwgZ2VuX25iX0ZJTEVfcHRyO25fZisrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmID0gZ2VuX0ZJTEVfcHRyKG5fZiwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDIpOwoKICAgICAgICB4bWxFbGVtRHVtcChmLCBkb2MsIGN1cik7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19GSUxFX3B0cihuX2YsIGYsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxFbGVtRHVtcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxGaXJzdEVsZW1lbnRDaGlsZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgcGFyZW50OyAvKiB0aGUgcGFyZW50IG5vZGUgKi8KICAgIGludCBuX3BhcmVudDsKCiAgICBmb3IgKG5fcGFyZW50ID0gMDtuX3BhcmVudCA8IGdlbl9uYl94bWxOb2RlUHRyO25fcGFyZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHBhcmVudCA9IGdlbl94bWxOb2RlUHRyKG5fcGFyZW50LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEZpcnN0RWxlbWVudENoaWxkKHBhcmVudCk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fcGFyZW50LCBwYXJlbnQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRmlyc3RFbGVtZW50Q2hpbGQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcGFyZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sR2V0QnVmZmVyQWxsb2NhdGlvblNjaGVtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUgcmV0X3ZhbDsKCiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEdldEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUoKTsKICAgICAgICBkZXNyZXRfeG1sQnVmZmVyQWxsb2NhdGlvblNjaGVtZShyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxHZXRCdWZmZXJBbGxvY2F0aW9uU2NoZW1lIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXRDb21wcmVzc01vZGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKCiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEdldENvbXByZXNzTW9kZSgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sR2V0Q29tcHJlc3NNb2RlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXREb2NDb21wcmVzc01vZGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEdldERvY0NvbXByZXNzTW9kZShkb2MpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxHZXREb2NDb21wcmVzc01vZGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXRJbnRTdWJzZXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxEdGRQdHIgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCBwb2ludGVyICovCiAgICBpbnQgbl9kb2M7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sR2V0SW50U3Vic2V0KGRvYyk7CiAgICAgICAgZGVzcmV0X3htbER0ZFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEdldEludFN1YnNldCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldExhc3RDaGlsZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgcGFyZW50OyAvKiB0aGUgcGFyZW50IG5vZGUgKi8KICAgIGludCBuX3BhcmVudDsKCiAgICBmb3IgKG5fcGFyZW50ID0gMDtuX3BhcmVudCA8IGdlbl9uYl94bWxOb2RlUHRyO25fcGFyZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHBhcmVudCA9IGdlbl94bWxOb2RlUHRyKG5fcGFyZW50LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEdldExhc3RDaGlsZChwYXJlbnQpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX3BhcmVudCwgcGFyZW50LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEdldExhc3RDaGlsZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wYXJlbnQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldExpbmVObyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGxvbmcgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdmFsaWQgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sR2V0TGluZU5vKG5vZGUpOwogICAgICAgIGRlc3JldF9sb25nKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sR2V0TGluZU5vIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldE5vTnNQcm9wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBub2RlICovCiAgICBpbnQgbl9ub2RlOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBhdHRyaWJ1dGUgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEdldE5vTnNQcm9wKG5vZGUsIChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxHZXROb05zUHJvcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldE5vZGVQYXRoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVFJFRV9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9ERUJVR19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIGEgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sR2V0Tm9kZVBhdGgobm9kZSk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sR2V0Tm9kZVBhdGgiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldE5zTGlzdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXROc1Byb3Aodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIG5vZGUgKi8KICAgIGludCBuX25vZGU7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGF0dHJpYnV0ZSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIG5hbWVTcGFjZTsgLyogdGhlIFVSSSBvZiB0aGUgbmFtZXNwYWNlICovCiAgICBpbnQgbl9uYW1lU3BhY2U7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fbmFtZVNwYWNlID0gMDtuX25hbWVTcGFjZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWVTcGFjZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgbmFtZVNwYWNlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZVNwYWNlLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEdldE5zUHJvcChub2RlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZVNwYWNlKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lU3BhY2UsIChjb25zdCB4bWxDaGFyICopbmFtZVNwYWNlLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEdldE5zUHJvcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZVNwYWNlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXRQcm9wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBub2RlICovCiAgICBpbnQgbl9ub2RlOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBhdHRyaWJ1dGUgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEdldFByb3Aobm9kZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEdldFByb3AiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxIYXNOc1Byb3Aodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxBdHRyUHRyIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBub2RlICovCiAgICBpbnQgbl9ub2RlOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBhdHRyaWJ1dGUgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBuYW1lU3BhY2U7IC8qIHRoZSBVUkkgb2YgdGhlIG5hbWVzcGFjZSAqLwogICAgaW50IG5fbmFtZVNwYWNlOwoKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX25hbWVTcGFjZSA9IDA7bl9uYW1lU3BhY2UgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lU3BhY2UrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIG5hbWVTcGFjZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWVTcGFjZSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxIYXNOc1Byb3Aobm9kZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWVTcGFjZSk7CiAgICAgICAgZGVzcmV0X3htbEF0dHJQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lU3BhY2UsIChjb25zdCB4bWxDaGFyICopbmFtZVNwYWNlLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEhhc05zUHJvcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZVNwYWNlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxIYXNQcm9wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQXR0clB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgYXR0cmlidXRlIG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxIYXNQcm9wKG5vZGUsIChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X3htbEF0dHJQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEhhc1Byb3AiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJc0JsYW5rTm9kZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sSXNCbGFua05vZGUobm9kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbElzQmxhbmtOb2RlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbElzWEhUTUwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBzeXN0ZW1JRDsgLyogdGhlIHN5c3RlbSBpZGVudGlmaWVyICovCiAgICBpbnQgbl9zeXN0ZW1JRDsKICAgIHhtbENoYXIgKiBwdWJsaWNJRDsgLyogdGhlIHB1YmxpYyBpZGVudGlmaWVyICovCiAgICBpbnQgbl9wdWJsaWNJRDsKCiAgICBmb3IgKG5fc3lzdGVtSUQgPSAwO25fc3lzdGVtSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zeXN0ZW1JRCsrKSB7CiAgICBmb3IgKG5fcHVibGljSUQgPSAwO25fcHVibGljSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wdWJsaWNJRCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzeXN0ZW1JRCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N5c3RlbUlELCAwKTsKICAgICAgICBwdWJsaWNJRCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3B1YmxpY0lELCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbElzWEhUTUwoKGNvbnN0IHhtbENoYXIgKilzeXN0ZW1JRCwgKGNvbnN0IHhtbENoYXIgKilwdWJsaWNJRCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzdGVtSUQsIChjb25zdCB4bWxDaGFyICopc3lzdGVtSUQsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3B1YmxpY0lELCAoY29uc3QgeG1sQ2hhciAqKXB1YmxpY0lELCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbElzWEhUTUwiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3lzdGVtSUQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHVibGljSUQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbExhc3RFbGVtZW50Q2hpbGQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIHBhcmVudDsgLyogdGhlIHBhcmVudCBub2RlICovCiAgICBpbnQgbl9wYXJlbnQ7CgogICAgZm9yIChuX3BhcmVudCA9IDA7bl9wYXJlbnQgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX3BhcmVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBwYXJlbnQgPSBnZW5feG1sTm9kZVB0cihuX3BhcmVudCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxMYXN0RWxlbWVudENoaWxkKHBhcmVudCk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fcGFyZW50LCBwYXJlbnQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTGFzdEVsZW1lbnRDaGlsZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wYXJlbnQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdDRGF0YUJsb2NrKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogY29udGVudDsgLyogdGhlIENEQVRBIGJsb2NrIGNvbnRlbnQgY29udGVudCAqLwogICAgaW50IG5fY29udGVudDsKICAgIGludCBsZW47IC8qIHRoZSBsZW5ndGggb2YgdGhlIGJsb2NrICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMSk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdDRGF0YUJsb2NrKGRvYywgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCBsZW4pOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIChjb25zdCB4bWxDaGFyICopY29udGVudCwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0NEYXRhQmxvY2siLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdDaGFyUmVmKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGNoYXIgcmVmIHN0cmluZywgc3RhcnRpbmcgd2l0aCAjIG9yICImIyAuLi4gOyIgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld0NoYXJSZWYoZG9jLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOZXdDaGFyUmVmIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdDaGlsZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQojaWZkZWYgTElCWE1MX1RSRUVfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBwYXJlbnQ7IC8qIHRoZSBwYXJlbnQgbm9kZSAqLwogICAgaW50IG5fcGFyZW50OwogICAgeG1sTnNQdHIgbnM7IC8qIGEgbmFtZXNwYWNlIGlmIGFueSAqLwogICAgaW50IG5fbnM7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIGNoaWxkICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSBYTUwgY29udGVudCBvZiB0aGUgY2hpbGQgaWYgYW55LiAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fcGFyZW50ID0gMDtuX3BhcmVudCA8IGdlbl9uYl94bWxOb2RlUHRyO25fcGFyZW50KyspIHsKICAgIGZvciAobl9ucyA9IDA7bl9ucyA8IGdlbl9uYl94bWxOc1B0cjtuX25zKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHBhcmVudCA9IGdlbl94bWxOb2RlUHRyKG5fcGFyZW50LCAwKTsKICAgICAgICBucyA9IGdlbl94bWxOc1B0cihuX25zLCAxKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMik7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3Q2hpbGQocGFyZW50LCBucywgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX3BhcmVudCwgcGFyZW50LCAwKTsKICAgICAgICBkZXNfeG1sTnNQdHIobl9ucywgbnMsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0NoaWxkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3BhcmVudCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ucyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3Q29tbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgY29tbWVudCBjb250ZW50ICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvbnRlbnQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld0NvbW1lbnQoKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0NvbW1lbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3RG9jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRG9jUHRyIHJldF92YWw7CiAgICB4bWxDaGFyICogdmVyc2lvbjsgLyogeG1sQ2hhciBzdHJpbmcgZ2l2aW5nIHRoZSB2ZXJzaW9uIG9mIFhNTCAiMS4wIiAqLwogICAgaW50IG5fdmVyc2lvbjsKCiAgICBmb3IgKG5fdmVyc2lvbiA9IDA7bl92ZXJzaW9uIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmVyc2lvbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2ZXJzaW9uID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmVyc2lvbiwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdEb2MoKGNvbnN0IHhtbENoYXIgKil2ZXJzaW9uKTsKICAgICAgICBkZXNyZXRfeG1sRG9jUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92ZXJzaW9uLCAoY29uc3QgeG1sQ2hhciAqKXZlcnNpb24sIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3RG9jIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZlcnNpb24pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5ld0RvY0NvbW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgY29tbWVudCBjb250ZW50ICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdEb2NDb21tZW50KGRvYywgKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3RG9jQ29tbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3RG9jRnJhZ21lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgb3duaW5nIHRoZSBmcmFnbWVudCAqLwogICAgaW50IG5fZG9jOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld0RvY0ZyYWdtZW50KGRvYyk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOZXdEb2NGcmFnbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdEb2NOb2RlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOc1B0ciBuczsgLyogbmFtZXNwYWNlIGlmIGFueSAqLwogICAgaW50IG5fbnM7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5vZGUgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgWE1MIHRleHQgY29udGVudCBpZiBhbnkgKi8KICAgIGludCBuX2NvbnRlbnQ7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9ucyA9IDA7bl9ucyA8IGdlbl9uYl94bWxOc1B0cjtuX25zKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIG5zID0gZ2VuX3htbE5zUHRyKG5fbnMsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdEb2NOb2RlKGRvYywgbnMsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfeG1sTnNQdHIobl9ucywgbnMsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0RvY05vZGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25zKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3RG9jTm9kZUVhdE5hbWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5zUHRyIG5zOyAvKiBuYW1lc3BhY2UgaWYgYW55ICovCiAgICBpbnQgbl9uczsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbm9kZSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSBYTUwgdGV4dCBjb250ZW50IGlmIGFueSAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX25zID0gMDtuX25zIDwgZ2VuX25iX3htbE5zUHRyO25fbnMrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9lYXRlbl9uYW1lO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBucyA9IGdlbl94bWxOc1B0cihuX25zLCAxKTsKICAgICAgICBuYW1lID0gZ2VuX2VhdGVuX25hbWUobl9uYW1lLCAyKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdEb2NOb2RlRWF0TmFtZShkb2MsIG5zLCBuYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc194bWxOc1B0cihuX25zLCBucywgMSk7CiAgICAgICAgZGVzX2VhdGVuX25hbWUobl9uYW1lLCBuYW1lLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3RG9jTm9kZUVhdE5hbWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25zKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3RG9jUEkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgdGFyZ2V0IGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgUEkgY29udGVudCAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2NvbnRlbnQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIGNvbnRlbnQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld0RvY1BJKGRvYywgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0RvY1BJIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5ld0RvY1Byb3Aodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxBdHRyUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAqLwogICAgaW50IG5fdmFsdWU7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld0RvY1Byb3AoZG9jLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUpOwogICAgICAgIGRlc3JldF94bWxBdHRyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3RG9jUHJvcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3RG9jUmF3Tm9kZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9UUkVFX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTnNQdHIgbnM7IC8qIG5hbWVzcGFjZSBpZiBhbnkgKi8KICAgIGludCBuX25zOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBub2RlIG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogY29udGVudDsgLyogdGhlIHRleHQgY29udGVudCBpZiBhbnkgKi8KICAgIGludCBuX2NvbnRlbnQ7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9ucyA9IDA7bl9ucyA8IGdlbl9uYl94bWxOc1B0cjtuX25zKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIG5zID0gZ2VuX3htbE5zUHRyKG5fbnMsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdEb2NSYXdOb2RlKGRvYywgbnMsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfeG1sTnNQdHIobl9ucywgbnMsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0RvY1Jhd05vZGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25zKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdEb2NUZXh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogY29udGVudDsgLyogdGhlIHRleHQgY29udGVudCAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2NvbnRlbnQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3RG9jVGV4dChkb2MsIChjb25zdCB4bWxDaGFyICopY29udGVudCk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0RvY1RleHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5ld0RvY1RleHRMZW4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgdGV4dCBjb250ZW50ICovCiAgICBpbnQgbl9jb250ZW50OwogICAgaW50IGxlbjsgLyogdGhlIHRleHQgbGVuLiAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDEpOwogICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3RG9jVGV4dExlbihkb2MsIChjb25zdCB4bWxDaGFyICopY29udGVudCwgbGVuKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDEpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOZXdEb2NUZXh0TGVuIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3RHRkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRHRkUHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgcG9pbnRlciAqLwogICAgaW50IG5fZG9jOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBEVEQgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBFeHRlcm5hbElEOyAvKiB0aGUgZXh0ZXJuYWwgSUQgKi8KICAgIGludCBuX0V4dGVybmFsSUQ7CiAgICB4bWxDaGFyICogU3lzdGVtSUQ7IC8qIHRoZSBzeXN0ZW0gSUQgKi8KICAgIGludCBuX1N5c3RlbUlEOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fRXh0ZXJuYWxJRCA9IDA7bl9FeHRlcm5hbElEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fRXh0ZXJuYWxJRCsrKSB7CiAgICBmb3IgKG5fU3lzdGVtSUQgPSAwO25fU3lzdGVtSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9TeXN0ZW1JRCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgRXh0ZXJuYWxJRCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX0V4dGVybmFsSUQsIDIpOwogICAgICAgIFN5c3RlbUlEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fU3lzdGVtSUQsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3RHRkKGRvYywgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQsIChjb25zdCB4bWxDaGFyICopU3lzdGVtSUQpOwogICAgICAgIGRlc3JldF94bWxEdGRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9FeHRlcm5hbElELCAoY29uc3QgeG1sQ2hhciAqKUV4dGVybmFsSUQsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX1N5c3RlbUlELCAoY29uc3QgeG1sQ2hhciAqKVN5c3RlbUlELCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0R0ZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9FeHRlcm5hbElEKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1N5c3RlbUlEKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdOb2RlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sTnNQdHIgbnM7IC8qIG5hbWVzcGFjZSBpZiBhbnkgKi8KICAgIGludCBuX25zOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBub2RlIG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX25zID0gMDtuX25zIDwgZ2VuX25iX3htbE5zUHRyO25fbnMrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbnMgPSBnZW5feG1sTnNQdHIobl9ucywgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3Tm9kZShucywgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5zUHRyKG5fbnMsIG5zLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3Tm9kZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ucyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdOb2RlRWF0TmFtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbE5zUHRyIG5zOyAvKiBuYW1lc3BhY2UgaWYgYW55ICovCiAgICBpbnQgbl9uczsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbm9kZSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl9ucyA9IDA7bl9ucyA8IGdlbl9uYl94bWxOc1B0cjtuX25zKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfZWF0ZW5fbmFtZTtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbnMgPSBnZW5feG1sTnNQdHIobl9ucywgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9lYXRlbl9uYW1lKG5fbmFtZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdOb2RlRWF0TmFtZShucywgbmFtZSk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOc1B0cihuX25zLCBucywgMCk7CiAgICAgICAgZGVzX2VhdGVuX25hbWUobl9uYW1lLCBuYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld05vZGVFYXROYW1lIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25zKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5ld05zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTnNQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIGVsZW1lbnQgY2FycnlpbmcgdGhlIG5hbWVzcGFjZSAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbENoYXIgKiBocmVmOyAvKiB0aGUgVVJJIGFzc29jaWF0ZWQgKi8KICAgIGludCBuX2hyZWY7CiAgICB4bWxDaGFyICogcHJlZml4OyAvKiB0aGUgcHJlZml4IGZvciB0aGUgbmFtZXNwYWNlICovCiAgICBpbnQgbl9wcmVmaXg7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5faHJlZiA9IDA7bl9ocmVmIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25faHJlZisrKSB7CiAgICBmb3IgKG5fcHJlZml4ID0gMDtuX3ByZWZpeCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ByZWZpeCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAwKTsKICAgICAgICBocmVmID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5faHJlZiwgMSk7CiAgICAgICAgcHJlZml4ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld05zKG5vZGUsIChjb25zdCB4bWxDaGFyICopaHJlZiwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgpOwogICAgICAgIGlmICgobm9kZSA9PSBOVUxMKSAmJiAocmV0X3ZhbCAhPSBOVUxMKSkgeG1sRnJlZU5zKHJldF92YWwpOwogICAgICAgIGRlc3JldF94bWxOc1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9ocmVmLCAoY29uc3QgeG1sQ2hhciAqKWhyZWYsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3TnMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ocmVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZWZpeCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3TnNQcm9wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQXR0clB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgaG9sZGluZyBub2RlICovCiAgICBpbnQgbl9ub2RlOwogICAgeG1sTnNQdHIgbnM7IC8qIHRoZSBuYW1lc3BhY2UgKi8KICAgIGludCBuX25zOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlICovCiAgICBpbnQgbl92YWx1ZTsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9ucyA9IDA7bl9ucyA8IGdlbl9uYl94bWxOc1B0cjtuX25zKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDApOwogICAgICAgIG5zID0gZ2VuX3htbE5zUHRyKG5fbnMsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld05zUHJvcChub2RlLCBucywgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlKTsKICAgICAgICBkZXNyZXRfeG1sQXR0clB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAwKTsKICAgICAgICBkZXNfeG1sTnNQdHIobl9ucywgbnMsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3TnNQcm9wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbnMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3TnNQcm9wRWF0TmFtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEF0dHJQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIGhvbGRpbmcgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbE5zUHRyIG5zOyAvKiB0aGUgbmFtZXNwYWNlICovCiAgICBpbnQgbl9uczsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAqLwogICAgaW50IG5fdmFsdWU7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fbnMgPSAwO25fbnMgPCBnZW5fbmJfeG1sTnNQdHI7bl9ucysrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2VhdGVuX25hbWU7bl9uYW1lKyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDApOwogICAgICAgIG5zID0gZ2VuX3htbE5zUHRyKG5fbnMsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fZWF0ZW5fbmFtZShuX25hbWUsIDIpOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3TnNQcm9wRWF0TmFtZShub2RlLCBucywgbmFtZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSk7CiAgICAgICAgZGVzcmV0X3htbEF0dHJQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMCk7CiAgICAgICAgZGVzX3htbE5zUHRyKG5fbnMsIG5zLCAxKTsKICAgICAgICBkZXNfZWF0ZW5fbmFtZShuX25hbWUsIG5hbWUsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld05zUHJvcEVhdE5hbWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ucyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdQSSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSBQSSBjb250ZW50ICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAwKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdQSSgoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopY29udGVudCk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld1BJIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3UHJvcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfVFJFRV9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxBdHRyUHRyIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBob2xkaW5nIG5vZGUgKi8KICAgIGludCBuX25vZGU7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3UHJvcChub2RlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUpOwogICAgICAgIGRlc3JldF94bWxBdHRyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3UHJvcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3UmVmZXJlbmNlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIHJlZmVyZW5jZSBuYW1lLCBvciB0aGUgcmVmZXJlbmNlIHN0cmluZyB3aXRoICYgYW5kIDsgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld1JlZmVyZW5jZShkb2MsIChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld1JlZmVyZW5jZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3VGV4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgdGV4dCBjb250ZW50ICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvbnRlbnQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld1RleHQoKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld1RleHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3VGV4dENoaWxkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVFJFRV9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1RSRUVfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBwYXJlbnQ7IC8qIHRoZSBwYXJlbnQgbm9kZSAqLwogICAgaW50IG5fcGFyZW50OwogICAgeG1sTnNQdHIgbnM7IC8qIGEgbmFtZXNwYWNlIGlmIGFueSAqLwogICAgaW50IG5fbnM7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIGNoaWxkICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGNoaWxkIGlmIGFueS4gKi8KICAgIGludCBuX2NvbnRlbnQ7CgogICAgZm9yIChuX3BhcmVudCA9IDA7bl9wYXJlbnQgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX3BhcmVudCsrKSB7CiAgICBmb3IgKG5fbnMgPSAwO25fbnMgPCBnZW5fbmJfeG1sTnNQdHI7bl9ucysrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBwYXJlbnQgPSBnZW5feG1sTm9kZVB0cihuX3BhcmVudCwgMCk7CiAgICAgICAgbnMgPSBnZW5feG1sTnNQdHIobl9ucywgMSk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDIpOwogICAgICAgIGNvbnRlbnQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld1RleHRDaGlsZChwYXJlbnQsIG5zLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopY29udGVudCk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fcGFyZW50LCBwYXJlbnQsIDApOwogICAgICAgIGRlc194bWxOc1B0cihuX25zLCBucywgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3VGV4dENoaWxkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3BhcmVudCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ucyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3VGV4dExlbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgdGV4dCBjb250ZW50ICovCiAgICBpbnQgbl9jb250ZW50OwogICAgaW50IGxlbjsgLyogdGhlIHRleHQgbGVuLiAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMCk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdUZXh0TGVuKChjb25zdCB4bWxDaGFyICopY29udGVudCwgbGVuKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAwKTsKICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3VGV4dExlbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV4dEVsZW1lbnRTaWJsaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVFJFRV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgY3VycmVudCBub2RlICovCiAgICBpbnQgbl9ub2RlOwoKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXh0RWxlbWVudFNpYmxpbmcobm9kZSk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOZXh0RWxlbWVudFNpYmxpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5vZGVBZGRDb250ZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBub2RlIGJlaW5nIG1vZGlmaWVkICovCiAgICBpbnQgbl9jdXI7CiAgICB4bWxDaGFyICogY29udGVudDsgLyogZXh0cmEgY29udGVudCAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAwKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMSk7CgogICAgICAgIHhtbE5vZGVBZGRDb250ZW50KGN1ciwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5vZGVBZGRDb250ZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOb2RlQWRkQ29udGVudExlbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgbm9kZSBiZWluZyBtb2RpZmllZCAqLwogICAgaW50IG5fY3VyOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIGV4dHJhIGNvbnRlbnQgKi8KICAgIGludCBuX2NvbnRlbnQ7CiAgICBpbnQgbGVuOyAvKiB0aGUgc2l6ZSBvZiBAY29udGVudCAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2NvbnRlbnQrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAwKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMSk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMik7CgogICAgICAgIHhtbE5vZGVBZGRDb250ZW50TGVuKGN1ciwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCBsZW4pOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDEpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOb2RlQWRkQ29udGVudExlbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5vZGVCdWZHZXRDb250ZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxCdWZmZXJQdHIgYnVmZmVyOyAvKiBhIGJ1ZmZlciAqLwogICAgaW50IG5fYnVmZmVyOwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBub2RlIGJlaW5nIHJlYWQgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fYnVmZmVyID0gMDtuX2J1ZmZlciA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWZmZXIrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWZmZXIgPSBnZW5feG1sQnVmZmVyUHRyKG5fYnVmZmVyLCAwKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOb2RlQnVmR2V0Q29udGVudChidWZmZXIsIGN1cik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZmZlciwgYnVmZmVyLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5vZGVCdWZHZXRDb250ZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1ZmZlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5vZGVEdW1wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBYTUwgYnVmZmVyIG91dHB1dCAqLwogICAgaW50IG5fYnVmOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIGN1cnJlbnQgbm9kZSAqLwogICAgaW50IG5fY3VyOwogICAgaW50IGxldmVsOyAvKiB0aGUgaW1icmljYXRpb24gbGV2ZWwgZm9yIGluZGVudGluZyAqLwogICAgaW50IG5fbGV2ZWw7CiAgICBpbnQgZm9ybWF0OyAvKiBpcyBmb3JtYXR0aW5nIGFsbG93ZWQgKi8KICAgIGludCBuX2Zvcm1hdDsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgZm9yIChuX2xldmVsID0gMDtuX2xldmVsIDwgZ2VuX25iX2ludDtuX2xldmVsKyspIHsKICAgIGZvciAobl9mb3JtYXQgPSAwO25fZm9ybWF0IDwgZ2VuX25iX2ludDtuX2Zvcm1hdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWYgPSBnZW5feG1sQnVmZmVyUHRyKG5fYnVmLCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMik7CiAgICAgICAgbGV2ZWwgPSBnZW5faW50KG5fbGV2ZWwsIDMpOwogICAgICAgIGZvcm1hdCA9IGdlbl9pbnQobl9mb3JtYXQsIDQpOwoKICAgICAgICByZXRfdmFsID0geG1sTm9kZUR1bXAoYnVmLCBkb2MsIGN1ciwgbGV2ZWwsIGZvcm1hdCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDIpOwogICAgICAgIGRlc19pbnQobl9sZXZlbCwgbGV2ZWwsIDMpOwogICAgICAgIGRlc19pbnQobl9mb3JtYXQsIGZvcm1hdCwgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOb2RlRHVtcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZXZlbCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mb3JtYXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOb2RlRHVtcE91dHB1dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sT3V0cHV0QnVmZmVyUHRyIGJ1ZjsgLyogdGhlIFhNTCBidWZmZXIgb3V0cHV0ICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY3VycmVudCBub2RlICovCiAgICBpbnQgbl9jdXI7CiAgICBpbnQgbGV2ZWw7IC8qIHRoZSBpbWJyaWNhdGlvbiBsZXZlbCBmb3IgaW5kZW50aW5nICovCiAgICBpbnQgbl9sZXZlbDsKICAgIGludCBmb3JtYXQ7IC8qIGlzIGZvcm1hdHRpbmcgYWxsb3dlZCAqLwogICAgaW50IG5fZm9ybWF0OwogICAgY2hhciAqIGVuY29kaW5nOyAvKiBhbiBvcHRpb25hbCBlbmNvZGluZyBzdHJpbmcgKi8KICAgIGludCBuX2VuY29kaW5nOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbE91dHB1dEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fbGV2ZWwgPSAwO25fbGV2ZWwgPCBnZW5fbmJfaW50O25fbGV2ZWwrKykgewogICAgZm9yIChuX2Zvcm1hdCA9IDA7bl9mb3JtYXQgPCBnZW5fbmJfaW50O25fZm9ybWF0KyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxPdXRwdXRCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAyKTsKICAgICAgICBsZXZlbCA9IGdlbl9pbnQobl9sZXZlbCwgMyk7CiAgICAgICAgZm9ybWF0ID0gZ2VuX2ludChuX2Zvcm1hdCwgNCk7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgNSk7CgogICAgICAgIHhtbE5vZGVEdW1wT3V0cHV0KGJ1ZiwgZG9jLCBjdXIsIGxldmVsLCBmb3JtYXQsIChjb25zdCBjaGFyICopZW5jb2RpbmcpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sT3V0cHV0QnVmZmVyUHRyKG5fYnVmLCBidWYsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMik7CiAgICAgICAgZGVzX2ludChuX2xldmVsLCBsZXZlbCwgMyk7CiAgICAgICAgZGVzX2ludChuX2Zvcm1hdCwgZm9ybWF0LCA0KTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgNSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOb2RlRHVtcE91dHB1dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZXZlbCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mb3JtYXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOb2RlR2V0QmFzZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50IHRoZSBub2RlIHBlcnRhaW5zIHRvICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIG5vZGUgYmVpbmcgY2hlY2tlZCAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5vZGVHZXRCYXNlKGRvYywgY3VyKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOb2RlR2V0QmFzZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOb2RlR2V0Q29udGVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBub2RlIGJlaW5nIHJlYWQgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5vZGVHZXRDb250ZW50KGN1cik7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5vZGVHZXRDb250ZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTm9kZUdldExhbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgbm9kZSBiZWluZyBjaGVja2VkICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxOb2RlR2V0TGFuZyhjdXIpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOb2RlR2V0TGFuZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5vZGVHZXRTcGFjZVByZXNlcnZlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIG5vZGUgYmVpbmcgY2hlY2tlZCAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sTm9kZUdldFNwYWNlUHJlc2VydmUoY3VyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5vZGVHZXRTcGFjZVByZXNlcnZlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTm9kZUlzVGV4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sTm9kZUlzVGV4dChub2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTm9kZUlzVGV4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOb2RlTGlzdEdldFJhd1N0cmluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIGxpc3Q7IC8qIGEgTm9kZSBsaXN0ICovCiAgICBpbnQgbl9saXN0OwogICAgaW50IGluTGluZTsgLyogc2hvdWxkIHdlIHJlcGxhY2UgZW50aXR5IGNvbnRlbnRzIG9yIHNob3cgdGhlaXIgZXh0ZXJuYWwgZm9ybSAqLwogICAgaW50IG5faW5MaW5lOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fbGlzdCA9IDA7bl9saXN0IDwgZ2VuX25iX3htbE5vZGVQdHI7bl9saXN0KyspIHsKICAgIGZvciAobl9pbkxpbmUgPSAwO25faW5MaW5lIDwgZ2VuX25iX2ludDtuX2luTGluZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBsaXN0ID0gZ2VuX3htbE5vZGVQdHIobl9saXN0LCAxKTsKICAgICAgICBpbkxpbmUgPSBnZW5faW50KG5faW5MaW5lLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5vZGVMaXN0R2V0UmF3U3RyaW5nKGRvYywgbGlzdCwgaW5MaW5lKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9saXN0LCBsaXN0LCAxKTsKICAgICAgICBkZXNfaW50KG5faW5MaW5lLCBpbkxpbmUsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTm9kZUxpc3RHZXRSYXdTdHJpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xpc3QpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5MaW5lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTm9kZUxpc3RHZXRTdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm9kZVB0ciBsaXN0OyAvKiBhIE5vZGUgbGlzdCAqLwogICAgaW50IG5fbGlzdDsKICAgIGludCBpbkxpbmU7IC8qIHNob3VsZCB3ZSByZXBsYWNlIGVudGl0eSBjb250ZW50cyBvciBzaG93IHRoZWlyIGV4dGVybmFsIGZvcm0gKi8KICAgIGludCBuX2luTGluZTsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2xpc3QgPSAwO25fbGlzdCA8IGdlbl9uYl94bWxOb2RlUHRyO25fbGlzdCsrKSB7CiAgICBmb3IgKG5faW5MaW5lID0gMDtuX2luTGluZSA8IGdlbl9uYl9pbnQ7bl9pbkxpbmUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgbGlzdCA9IGdlbl94bWxOb2RlUHRyKG5fbGlzdCwgMSk7CiAgICAgICAgaW5MaW5lID0gZ2VuX2ludChuX2luTGluZSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGxpc3QsIGluTGluZSk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbGlzdCwgbGlzdCwgMSk7CiAgICAgICAgZGVzX2ludChuX2luTGluZSwgaW5MaW5lLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5vZGVMaXN0R2V0U3RyaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9saXN0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2luTGluZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTm9kZVNldEJhc2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX1hJTkNMVURFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIG5vZGUgYmVpbmcgY2hhbmdlZCAqLwogICAgaW50IG5fY3VyOwogICAgeG1sQ2hhciAqIHVyaTsgLyogdGhlIG5ldyBiYXNlIFVSSSAqLwogICAgaW50IG5fdXJpOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgZm9yIChuX3VyaSA9IDA7bl91cmkgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl91cmkrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDApOwogICAgICAgIHVyaSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3VyaSwgMSk7CgogICAgICAgIHhtbE5vZGVTZXRCYXNlKGN1ciwgKGNvbnN0IHhtbENoYXIgKil1cmkpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl91cmksIChjb25zdCB4bWxDaGFyICopdXJpLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5vZGVTZXRCYXNlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91cmkpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOb2RlU2V0Q29udGVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgbm9kZSBiZWluZyBtb2RpZmllZCAqLwogICAgaW50IG5fY3VyOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSBuZXcgdmFsdWUgb2YgdGhlIGNvbnRlbnQgKi8KICAgIGludCBuX2NvbnRlbnQ7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMCk7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDEpOwoKICAgICAgICB4bWxOb2RlU2V0Q29udGVudChjdXIsIChjb25zdCB4bWxDaGFyICopY29udGVudCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIChjb25zdCB4bWxDaGFyICopY29udGVudCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOb2RlU2V0Q29udGVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTm9kZVNldENvbnRlbnRMZW4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIG5vZGUgYmVpbmcgbW9kaWZpZWQgKi8KICAgIGludCBuX2N1cjsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgbmV3IHZhbHVlIG9mIHRoZSBjb250ZW50ICovCiAgICBpbnQgbl9jb250ZW50OwogICAgaW50IGxlbjsgLyogdGhlIHNpemUgb2YgQGNvbnRlbnQgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMCk7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDEpOwogICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDIpOwoKICAgICAgICB4bWxOb2RlU2V0Q29udGVudExlbihjdXIsIChjb25zdCB4bWxDaGFyICopY29udGVudCwgbGVuKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAxKTsKICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTm9kZVNldENvbnRlbnRMZW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTm9kZVNldExhbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIG5vZGUgYmVpbmcgY2hhbmdlZCAqLwogICAgaW50IG5fY3VyOwogICAgeG1sQ2hhciAqIGxhbmc7IC8qIHRoZSBsYW5ndWFnZSBkZXNjcmlwdGlvbiAqLwogICAgaW50IG5fbGFuZzsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgIGZvciAobl9sYW5nID0gMDtuX2xhbmcgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9sYW5nKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAwKTsKICAgICAgICBsYW5nID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbGFuZywgMSk7CgogICAgICAgIHhtbE5vZGVTZXRMYW5nKGN1ciwgKGNvbnN0IHhtbENoYXIgKilsYW5nKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbGFuZywgKGNvbnN0IHhtbENoYXIgKilsYW5nLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5vZGVTZXRMYW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sYW5nKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTm9kZVNldE5hbWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIG5vZGUgYmVpbmcgY2hhbmdlZCAqLwogICAgaW50IG5fY3VyOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuZXcgdGFnIG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwoKICAgICAgICB4bWxOb2RlU2V0TmFtZShjdXIsIChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOb2RlU2V0TmFtZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5vZGVTZXRTcGFjZVByZXNlcnZlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVFJFRV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBub2RlIGJlaW5nIGNoYW5nZWQgKi8KICAgIGludCBuX2N1cjsKICAgIGludCB2YWw7IC8qIHRoZSB4bWw6c3BhY2UgdmFsdWUgKCIwIjogZGVmYXVsdCwgMTogInByZXNlcnZlIikgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX2ludDtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMCk7CiAgICAgICAgdmFsID0gZ2VuX2ludChuX3ZhbCwgMSk7CgogICAgICAgIHhtbE5vZGVTZXRTcGFjZVByZXNlcnZlKGN1ciwgdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMCk7CiAgICAgICAgZGVzX2ludChuX3ZhbCwgdmFsLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5vZGVTZXRTcGFjZVByZXNlcnZlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQcmV2aW91c0VsZW1lbnRTaWJsaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVFJFRV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgY3VycmVudCBub2RlICovCiAgICBpbnQgbl9ub2RlOwoKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxQcmV2aW91c0VsZW1lbnRTaWJsaW5nKG5vZGUpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUHJldmlvdXNFbGVtZW50U2libGluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVjb25jaWxpYXRlTnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfVFJFRV9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm9kZVB0ciB0cmVlOyAvKiBhIG5vZGUgZGVmaW5pbmcgdGhlIHN1YnRyZWUgdG8gcmVjb25jaWxpYXRlICovCiAgICBpbnQgbl90cmVlOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fdHJlZSA9IDA7bl90cmVlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl90cmVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIHRyZWUgPSBnZW5feG1sTm9kZVB0cihuX3RyZWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sUmVjb25jaWxpYXRlTnMoZG9jLCB0cmVlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fdHJlZSwgdHJlZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWNvbmNpbGlhdGVOcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHJlZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZW1vdmVQcm9wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxBdHRyUHRyIGN1cjsgLyogYW4gYXR0cmlidXRlICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sQXR0clB0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sQXR0clB0cihuX2N1ciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZW1vdmVQcm9wKGN1cik7CiAgICAgICAgY3VyID0gTlVMTDsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQXR0clB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlbW92ZVByb3AiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZXBsYWNlTm9kZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIG9sZDsgLyogdGhlIG9sZCBub2RlICovCiAgICBpbnQgbl9vbGQ7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIG5vZGUgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fb2xkID0gMDtuX29sZCA8IGdlbl9uYl94bWxOb2RlUHRyO25fb2xkKyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHJfaW47bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgb2xkID0gZ2VuX3htbE5vZGVQdHIobl9vbGQsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyX2luKG5fY3VyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlcGxhY2VOb2RlKG9sZCwgY3VyKTsKICAgICAgICBpZiAoY3VyICE9IE5VTEwpIHsKICAgICAgICAgICAgICB4bWxVbmxpbmtOb2RlKGN1cik7CiAgICAgICAgICAgICAgeG1sRnJlZU5vZGUoY3VyKSA7IGN1ciA9IE5VTEwgOyB9CiAgICAgICAgICBpZiAob2xkICE9IE5VTEwpIHsKICAgICAgICAgICAgICB4bWxVbmxpbmtOb2RlKG9sZCk7CiAgICAgICAgICAgICAgeG1sRnJlZU5vZGUob2xkKSA7IG9sZCA9IE5VTEwgOyB9CgkgIHJldF92YWwgPSBOVUxMOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX29sZCwgb2xkLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cl9pbihuX2N1ciwgY3VyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlcGxhY2VOb2RlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29sZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTYXZlRmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBmaWxlbmFtZSAob3IgVVJMKSAqLwogICAgaW50IG5fZmlsZW5hbWU7CiAgICB4bWxEb2NQdHIgY3VyOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZW91dHB1dDtuX2ZpbGVuYW1lKyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbERvY1B0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlb3V0cHV0KG5fZmlsZW5hbWUsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxEb2NQdHIobl9jdXIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sU2F2ZUZpbGUoZmlsZW5hbWUsIGN1cik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVvdXRwdXQobl9maWxlbmFtZSwgZmlsZW5hbWUsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTYXZlRmlsZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTYXZlRmlsZUVuYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBmaWxlbmFtZSAob3IgVVJMKSAqLwogICAgaW50IG5fZmlsZW5hbWU7CiAgICB4bWxEb2NQdHIgY3VyOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2N1cjsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIG5hbWUgb2YgYW4gZW5jb2RpbmcgKG9yIE5VTEwpICovCiAgICBpbnQgbl9lbmNvZGluZzsKCiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZW91dHB1dDtuX2ZpbGVuYW1lKyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbERvY1B0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlb3V0cHV0KG5fZmlsZW5hbWUsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxEb2NQdHIobl9jdXIsIDEpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sU2F2ZUZpbGVFbmMoZmlsZW5hbWUsIGN1ciwgKGNvbnN0IGNoYXIgKillbmNvZGluZyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVvdXRwdXQobl9maWxlbmFtZSwgZmlsZW5hbWUsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2F2ZUZpbGVFbmMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2F2ZUZpbGVUbyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxPdXRwdXRCdWZmZXJQdHIgYnVmOyAvKiBhbiBvdXRwdXQgSS9PIGJ1ZmZlciAqLwogICAgaW50IG5fYnVmOwogICAgeG1sRG9jUHRyIGN1cjsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9jdXI7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBlbmNvZGluZyBpZiBhbnkgYXNzdW1pbmcgdGhlIEkvTyBsYXllciBoYW5kbGVzIHRoZSB0cmFuY29kaW5nICovCiAgICBpbnQgbl9lbmNvZGluZzsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxPdXRwdXRCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sRG9jUHRyO25fY3VyKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxPdXRwdXRCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxEb2NQdHIobl9jdXIsIDEpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sU2F2ZUZpbGVUbyhidWYsIGN1ciwgKGNvbnN0IGNoYXIgKillbmNvZGluZyk7CiAgICAgICAgYnVmID0gTlVMTDsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sT3V0cHV0QnVmZmVyUHRyKG5fYnVmLCBidWYsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2F2ZUZpbGVUbyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2F2ZUZvcm1hdEZpbGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgZmlsZW5hbWUgKG9yIFVSTCkgKi8KICAgIGludCBuX2ZpbGVuYW1lOwogICAgeG1sRG9jUHRyIGN1cjsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9jdXI7CiAgICBpbnQgZm9ybWF0OyAvKiBzaG91bGQgZm9ybWF0dGluZyBzcGFjZXMgYmVlbiBhZGRlZCAqLwogICAgaW50IG5fZm9ybWF0OwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlb3V0cHV0O25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sRG9jUHRyO25fY3VyKyspIHsKICAgIGZvciAobl9mb3JtYXQgPSAwO25fZm9ybWF0IDwgZ2VuX25iX2ludDtuX2Zvcm1hdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlb3V0cHV0KG5fZmlsZW5hbWUsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxEb2NQdHIobl9jdXIsIDEpOwogICAgICAgIGZvcm1hdCA9IGdlbl9pbnQobl9mb3JtYXQsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sU2F2ZUZvcm1hdEZpbGUoZmlsZW5hbWUsIGN1ciwgZm9ybWF0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZW91dHB1dChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICBkZXNfaW50KG5fZm9ybWF0LCBmb3JtYXQsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2F2ZUZvcm1hdEZpbGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Zvcm1hdCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNhdmVGb3JtYXRGaWxlRW5jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIGZpbGVuYW1lIG9yIFVSTCB0byBvdXRwdXQgKi8KICAgIGludCBuX2ZpbGVuYW1lOwogICAgeG1sRG9jUHRyIGN1cjsgLyogdGhlIGRvY3VtZW50IGJlaW5nIHNhdmVkICovCiAgICBpbnQgbl9jdXI7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBuYW1lIG9mIHRoZSBlbmNvZGluZyB0byB1c2Ugb3IgTlVMTC4gKi8KICAgIGludCBuX2VuY29kaW5nOwogICAgaW50IGZvcm1hdDsgLyogc2hvdWxkIGZvcm1hdHRpbmcgc3BhY2VzIGJlIGFkZGVkLiAqLwogICAgaW50IG5fZm9ybWF0OwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlb3V0cHV0O25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sRG9jUHRyO25fY3VyKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9mb3JtYXQgPSAwO25fZm9ybWF0IDwgZ2VuX25iX2ludDtuX2Zvcm1hdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlb3V0cHV0KG5fZmlsZW5hbWUsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxEb2NQdHIobl9jdXIsIDEpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDIpOwogICAgICAgIGZvcm1hdCA9IGdlbl9pbnQobl9mb3JtYXQsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU2F2ZUZvcm1hdEZpbGVFbmMoZmlsZW5hbWUsIGN1ciwgKGNvbnN0IGNoYXIgKillbmNvZGluZywgZm9ybWF0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZW91dHB1dChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgKGNvbnN0IGNoYXIgKillbmNvZGluZywgMik7CiAgICAgICAgZGVzX2ludChuX2Zvcm1hdCwgZm9ybWF0LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNhdmVGb3JtYXRGaWxlRW5jIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mb3JtYXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTYXZlRm9ybWF0RmlsZVRvKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbE91dHB1dEJ1ZmZlclB0ciBidWY7IC8qIGFuIG91dHB1dCBJL08gYnVmZmVyICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxEb2NQdHIgY3VyOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2N1cjsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIGlmIGFueSBhc3N1bWluZyB0aGUgSS9PIGxheWVyIGhhbmRsZXMgdGhlIHRyYW5jb2RpbmcgKi8KICAgIGludCBuX2VuY29kaW5nOwogICAgaW50IGZvcm1hdDsgLyogc2hvdWxkIGZvcm1hdHRpbmcgc3BhY2VzIGJlZW4gYWRkZWQgKi8KICAgIGludCBuX2Zvcm1hdDsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxPdXRwdXRCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sRG9jUHRyO25fY3VyKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9mb3JtYXQgPSAwO25fZm9ybWF0IDwgZ2VuX25iX2ludDtuX2Zvcm1hdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWYgPSBnZW5feG1sT3V0cHV0QnVmZmVyUHRyKG5fYnVmLCAwKTsKICAgICAgICBjdXIgPSBnZW5feG1sRG9jUHRyKG5fY3VyLCAxKTsKICAgICAgICBlbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAyKTsKICAgICAgICBmb3JtYXQgPSBnZW5faW50KG5fZm9ybWF0LCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNhdmVGb3JtYXRGaWxlVG8oYnVmLCBjdXIsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIGZvcm1hdCk7CiAgICAgICAgYnVmID0gTlVMTDsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sT3V0cHV0QnVmZmVyUHRyKG5fYnVmLCBidWYsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDIpOwogICAgICAgIGRlc19pbnQobl9mb3JtYXQsIGZvcm1hdCwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTYXZlRm9ybWF0RmlsZVRvIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZm9ybWF0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2VhcmNoTnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOc1B0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBjdXJyZW50IG5vZGUgKi8KICAgIGludCBuX25vZGU7CiAgICB4bWxDaGFyICogbmFtZVNwYWNlOyAvKiB0aGUgbmFtZXNwYWNlIHByZWZpeCAqLwogICAgaW50IG5fbmFtZVNwYWNlOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9uYW1lU3BhY2UgPSAwO25fbmFtZVNwYWNlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZVNwYWNlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDEpOwogICAgICAgIG5hbWVTcGFjZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWVTcGFjZSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxTZWFyY2hOcyhkb2MsIG5vZGUsIChjb25zdCB4bWxDaGFyICopbmFtZVNwYWNlKTsKICAgICAgICBkZXNyZXRfeG1sTnNQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lU3BhY2UsIChjb25zdCB4bWxDaGFyICopbmFtZVNwYWNlLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNlYXJjaE5zIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWVTcGFjZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2VhcmNoTnNCeUhyZWYodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOc1B0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBjdXJyZW50IG5vZGUgKi8KICAgIGludCBuX25vZGU7CiAgICB4bWxDaGFyICogaHJlZjsgLyogdGhlIG5hbWVzcGFjZSB2YWx1ZSAqLwogICAgaW50IG5faHJlZjsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5faHJlZiA9IDA7bl9ocmVmIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25faHJlZisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAxKTsKICAgICAgICBocmVmID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5faHJlZiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxTZWFyY2hOc0J5SHJlZihkb2MsIG5vZGUsIChjb25zdCB4bWxDaGFyICopaHJlZik7CiAgICAgICAgZGVzcmV0X3htbE5zUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5faHJlZiwgKGNvbnN0IHhtbENoYXIgKilocmVmLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNlYXJjaE5zQnlIcmVmIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2hyZWYpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNldEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxCdWZmZXJBbGxvY2F0aW9uU2NoZW1lIHNjaGVtZTsgLyogYWxsb2NhdGlvbiBtZXRob2QgdG8gdXNlICovCiAgICBpbnQgbl9zY2hlbWU7CgogICAgZm9yIChuX3NjaGVtZSA9IDA7bl9zY2hlbWUgPCBnZW5fbmJfeG1sQnVmZmVyQWxsb2NhdGlvblNjaGVtZTtuX3NjaGVtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzY2hlbWUgPSBnZW5feG1sQnVmZmVyQWxsb2NhdGlvblNjaGVtZShuX3NjaGVtZSwgMCk7CgogICAgICAgIHhtbFNldEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUoc2NoZW1lKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUobl9zY2hlbWUsIHNjaGVtZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTZXRCdWZmZXJBbGxvY2F0aW9uU2NoZW1lIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NjaGVtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2V0Q29tcHJlc3NNb2RlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IG1vZGU7IC8qIHRoZSBjb21wcmVzc2lvbiByYXRpbyAqLwogICAgaW50IG5fbW9kZTsKCiAgICBmb3IgKG5fbW9kZSA9IDA7bl9tb2RlIDwgZ2VuX25iX2ludDtuX21vZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbW9kZSA9IGdlbl9pbnQobl9tb2RlLCAwKTsKCiAgICAgICAgeG1sU2V0Q29tcHJlc3NNb2RlKG1vZGUpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fbW9kZSwgbW9kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTZXRDb21wcmVzc01vZGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbW9kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2V0RG9jQ29tcHJlc3NNb2RlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICBpbnQgbW9kZTsgLyogdGhlIGNvbXByZXNzaW9uIHJhdGlvICovCiAgICBpbnQgbl9tb2RlOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fbW9kZSA9IDA7bl9tb2RlIDwgZ2VuX25iX2ludDtuX21vZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgbW9kZSA9IGdlbl9pbnQobl9tb2RlLCAxKTsKCiAgICAgICAgeG1sU2V0RG9jQ29tcHJlc3NNb2RlKGRvYywgbW9kZSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX2ludChuX21vZGUsIG1vZGUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2V0RG9jQ29tcHJlc3NNb2RlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9tb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTZXROcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogYSBub2RlIGluIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbE5zUHRyIG5zOyAvKiBhIG5hbWVzcGFjZSBwb2ludGVyICovCiAgICBpbnQgbl9uczsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9ucyA9IDA7bl9ucyA8IGdlbl9uYl94bWxOc1B0cjtuX25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDApOwogICAgICAgIG5zID0gZ2VuX3htbE5zUHRyKG5fbnMsIDEpOwoKICAgICAgICB4bWxTZXROcyhub2RlLCBucyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMCk7CiAgICAgICAgZGVzX3htbE5zUHRyKG5fbnMsIG5zLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNldE5zIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbnMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNldE5zUHJvcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfWElOQ0xVREVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9IVE1MX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxBdHRyUHRyIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBub2RlICovCiAgICBpbnQgbl9ub2RlOwogICAgeG1sTnNQdHIgbnM7IC8qIHRoZSBuYW1lc3BhY2UgZGVmaW5pdGlvbiAqLwogICAgaW50IG5fbnM7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGF0dHJpYnV0ZSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgYXR0cmlidXRlIHZhbHVlICovCiAgICBpbnQgbl92YWx1ZTsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9ucyA9IDA7bl9ucyA8IGdlbl9uYl94bWxOc1B0cjtuX25zKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDApOwogICAgICAgIG5zID0gZ2VuX3htbE5zUHRyKG5fbnMsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNldE5zUHJvcChub2RlLCBucywgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlKTsKICAgICAgICBkZXNyZXRfeG1sQXR0clB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAwKTsKICAgICAgICBkZXNfeG1sTnNQdHIobl9ucywgbnMsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2V0TnNQcm9wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbnMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNldFByb3Aodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX1hJTkNMVURFX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfSFRNTF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQXR0clB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgYXR0cmlidXRlIG5hbWUgKGEgUU5hbWUpICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgYXR0cmlidXRlIHZhbHVlICovCiAgICBpbnQgbl92YWx1ZTsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNldFByb3Aobm9kZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlKTsKICAgICAgICBkZXNyZXRfeG1sQXR0clB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNldFByb3AiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3BsaXRRTmFtZTIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgZnVsbCBRTmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiogcHJlZml4OyAvKiBhIHhtbENoYXIgKiogKi8KICAgIGludCBuX3ByZWZpeDsKCiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fcHJlZml4ID0gMDtuX3ByZWZpeCA8IGdlbl9uYl94bWxDaGFyX3B0cl9wdHI7bl9wcmVmaXgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDApOwogICAgICAgIHByZWZpeCA9IGdlbl94bWxDaGFyX3B0cl9wdHIobl9wcmVmaXgsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sU3BsaXRRTmFtZTIoKGNvbnN0IHhtbENoYXIgKiluYW1lLCBwcmVmaXgpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAwKTsKICAgICAgICBkZXNfeG1sQ2hhcl9wdHJfcHRyKG5fcHJlZml4LCBwcmVmaXgsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU3BsaXRRTmFtZTIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wcmVmaXgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNwbGl0UU5hbWUzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGZ1bGwgUU5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICBpbnQgKiBsZW47IC8qIGFuIGludCAqICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50X3B0cjtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMCk7CiAgICAgICAgbGVuID0gZ2VuX2ludF9wdHIobl9sZW4sIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sU3BsaXRRTmFtZTMoKGNvbnN0IHhtbENoYXIgKiluYW1lLCBsZW4pOwogICAgICAgIGRlc3JldF9jb25zdF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAwKTsKICAgICAgICBkZXNfaW50X3B0cihuX2xlbiwgbGVuLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNwbGl0UU5hbWUzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTdHJpbmdHZXROb2RlTGlzdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAqLwogICAgaW50IG5fdmFsdWU7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sU3RyaW5nR2V0Tm9kZUxpc3QoZG9jLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTdHJpbmdHZXROb2RlTGlzdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFN0cmluZ0xlbkdldE5vZGVMaXN0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dCAqLwogICAgaW50IG5fdmFsdWU7CiAgICBpbnQgbGVuOyAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdmFsdWUgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDEpOwogICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sU3RyaW5nTGVuR2V0Tm9kZUxpc3QoZG9jLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCBsZW4pOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAxKTsKICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU3RyaW5nTGVuR2V0Tm9kZUxpc3QiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dENvbmNhdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgY29udGVudCAqLwogICAgaW50IG5fY29udGVudDsKICAgIGludCBsZW47IC8qIEBjb250ZW50IGxlbmd0aCAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2NvbnRlbnQrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDApOwogICAgICAgIGNvbnRlbnQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRDb25jYXQobm9kZSwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCBsZW4pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAxKTsKICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dENvbmNhdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0TWVyZ2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIGZpcnN0OyAvKiB0aGUgZmlyc3QgdGV4dCBub2RlICovCiAgICBpbnQgbl9maXJzdDsKICAgIHhtbE5vZGVQdHIgc2Vjb25kOyAvKiB0aGUgc2Vjb25kIHRleHQgbm9kZSBiZWluZyBtZXJnZWQgKi8KICAgIGludCBuX3NlY29uZDsKCiAgICBmb3IgKG5fZmlyc3QgPSAwO25fZmlyc3QgPCBnZW5fbmJfeG1sTm9kZVB0cl9pbjtuX2ZpcnN0KyspIHsKICAgIGZvciAobl9zZWNvbmQgPSAwO25fc2Vjb25kIDwgZ2VuX25iX3htbE5vZGVQdHJfaW47bl9zZWNvbmQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZmlyc3QgPSBnZW5feG1sTm9kZVB0cl9pbihuX2ZpcnN0LCAwKTsKICAgICAgICBzZWNvbmQgPSBnZW5feG1sTm9kZVB0cl9pbihuX3NlY29uZCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0TWVyZ2UoZmlyc3QsIHNlY29uZCk7CiAgICAgICAgaWYgKChmaXJzdCAhPSBOVUxMKSAmJiAoZmlyc3QtPnR5cGUgIT0gWE1MX1RFWFRfTk9ERSkpIHsKICAgICAgICAgICAgICB4bWxVbmxpbmtOb2RlKHNlY29uZCk7CiAgICAgICAgICAgICAgeG1sRnJlZU5vZGUoc2Vjb25kKSA7IHNlY29uZCA9IE5VTEwgOyB9CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyX2luKG5fZmlyc3QsIGZpcnN0LCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cl9pbihuX3NlY29uZCwgc2Vjb25kLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRNZXJnZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maXJzdCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zZWNvbmQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVuc2V0TnNQcm9wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVFJFRV9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIG5vZGUgKi8KICAgIGludCBuX25vZGU7CiAgICB4bWxOc1B0ciBuczsgLyogdGhlIG5hbWVzcGFjZSBkZWZpbml0aW9uICovCiAgICBpbnQgbl9uczsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgYXR0cmlidXRlIG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICBmb3IgKG5fbnMgPSAwO25fbnMgPCBnZW5fbmJfeG1sTnNQdHI7bl9ucysrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAwKTsKICAgICAgICBucyA9IGdlbl94bWxOc1B0cihuX25zLCAxKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxVbnNldE5zUHJvcChub2RlLCBucywgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDApOwogICAgICAgIGRlc194bWxOc1B0cihuX25zLCBucywgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVuc2V0TnNQcm9wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbnMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVuc2V0UHJvcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBub2RlICovCiAgICBpbnQgbl9ub2RlOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBhdHRyaWJ1dGUgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVuc2V0UHJvcChub2RlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVuc2V0UHJvcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxWYWxpZGF0ZU5DTmFtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9ERUJVR19FTkFCTEVEKSB8fCBkZWZpbmVkIChMSUJYTUxfSFRNTF9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9TQVgxX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX0hUTUxfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX0RPQ0JfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9UUkVFX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgdmFsdWUgdG8gY2hlY2sgKi8KICAgIGludCBuX3ZhbHVlOwogICAgaW50IHNwYWNlOyAvKiBhbGxvdyBzcGFjZXMgaW4gZnJvbnQgYW5kIGVuZCBvZiB0aGUgc3RyaW5nICovCiAgICBpbnQgbl9zcGFjZTsKCiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICBmb3IgKG5fc3BhY2UgPSAwO25fc3BhY2UgPCBnZW5fbmJfaW50O25fc3BhY2UrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMCk7CiAgICAgICAgc3BhY2UgPSBnZW5faW50KG5fc3BhY2UsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRhdGVOQ05hbWUoKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgc3BhY2UpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAwKTsKICAgICAgICBkZXNfaW50KG5fc3BhY2UsIHNwYWNlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkYXRlTkNOYW1lIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NwYWNlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkYXRlTk1Ub2tlbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQojaWZkZWYgTElCWE1MX1RSRUVfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSB2YWx1ZSB0byBjaGVjayAqLwogICAgaW50IG5fdmFsdWU7CiAgICBpbnQgc3BhY2U7IC8qIGFsbG93IHNwYWNlcyBpbiBmcm9udCBhbmQgZW5kIG9mIHRoZSBzdHJpbmcgKi8KICAgIGludCBuX3NwYWNlOwoKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgIGZvciAobl9zcGFjZSA9IDA7bl9zcGFjZSA8IGdlbl9uYl9pbnQ7bl9zcGFjZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAwKTsKICAgICAgICBzcGFjZSA9IGdlbl9pbnQobl9zcGFjZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZU5NVG9rZW4oKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgc3BhY2UpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAwKTsKICAgICAgICBkZXNfaW50KG5fc3BhY2UsIHNwYWNlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkYXRlTk1Ub2tlbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zcGFjZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxWYWxpZGF0ZU5hbWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9UUkVFX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9UUkVFX0VOQUJMRUQKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgdmFsdWUgdG8gY2hlY2sgKi8KICAgIGludCBuX3ZhbHVlOwogICAgaW50IHNwYWNlOyAvKiBhbGxvdyBzcGFjZXMgaW4gZnJvbnQgYW5kIGVuZCBvZiB0aGUgc3RyaW5nICovCiAgICBpbnQgbl9zcGFjZTsKCiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICBmb3IgKG5fc3BhY2UgPSAwO25fc3BhY2UgPCBnZW5fbmJfaW50O25fc3BhY2UrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMCk7CiAgICAgICAgc3BhY2UgPSBnZW5faW50KG5fc3BhY2UsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRhdGVOYW1lKChjb25zdCB4bWxDaGFyICopdmFsdWUsIHNwYWNlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMCk7CiAgICAgICAgZGVzX2ludChuX3NwYWNlLCBzcGFjZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZGF0ZU5hbWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3BhY2UpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWRhdGVRTmFtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1RSRUVfRU5BQkxFRCkgfHwgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQojaWZkZWYgTElCWE1MX1RSRUVfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSB2YWx1ZSB0byBjaGVjayAqLwogICAgaW50IG5fdmFsdWU7CiAgICBpbnQgc3BhY2U7IC8qIGFsbG93IHNwYWNlcyBpbiBmcm9udCBhbmQgZW5kIG9mIHRoZSBzdHJpbmcgKi8KICAgIGludCBuX3NwYWNlOwoKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgIGZvciAobl9zcGFjZSA9IDA7bl9zcGFjZSA8IGdlbl9uYl9pbnQ7bl9zcGFjZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAwKTsKICAgICAgICBzcGFjZSA9IGdlbl9pbnQobl9zcGFjZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZVFOYW1lKChjb25zdCB4bWxDaGFyICopdmFsdWUsIHNwYWNlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMCk7CiAgICAgICAgZGVzX2ludChuX3NwYWNlLCBzcGFjZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZGF0ZVFOYW1lIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NwYWNlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfdHJlZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgdHJlZSA6IDEzOCBvZiAxNTcgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEFkZENoaWxkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEFkZENoaWxkTGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBZGROZXh0U2libGluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBZGRQcmV2U2libGluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBZGRTaWJsaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEF0dHJTZXJpYWxpemVUeHRDb250ZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1ZmZlckFkZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxCdWZmZXJBZGRIZWFkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1ZmZlckNDYXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQnVmZmVyQ2F0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1ZmZlckNvbnRlbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQnVmZmVyQ3JlYXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1ZmZlckNyZWF0ZVNpemUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQnVmZmVyQ3JlYXRlU3RhdGljKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1ZmZlckVtcHR5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1ZmZlckdyb3coKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQnVmZmVyTGVuZ3RoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1ZmZlclJlc2l6ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxCdWZmZXJTZXRBbGxvY2F0aW9uU2NoZW1lKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1ZmZlclNocmluaygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxCdWZmZXJXcml0ZUNIQVIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQnVmZmVyV3JpdGVDaGFyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1aWxkUU5hbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ2hpbGRFbGVtZW50Q291bnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ29weURvYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDb3B5RHRkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENvcHlOYW1lc3BhY2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ29weU5hbWVzcGFjZUxpc3QoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ29weU5vZGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ29weU5vZGVMaXN0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENvcHlQcm9wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENvcHlQcm9wTGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDcmVhdGVJbnRTdWJzZXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRE9NV3JhcEFkb3B0Tm9kZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxET01XcmFwQ2xvbmVOb2RlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERPTVdyYXBOZXdDdHh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERPTVdyYXBSZWNvbmNpbGVOYW1lc3BhY2VzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERPTVdyYXBSZW1vdmVOb2RlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERvY0NvcHlOb2RlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERvY0NvcHlOb2RlTGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEb2NEdW1wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERvY0R1bXBGb3JtYXRNZW1vcnkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRG9jRHVtcEZvcm1hdE1lbW9yeUVuYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEb2NEdW1wTWVtb3J5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbERvY0R1bXBNZW1vcnlFbmMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRG9jRm9ybWF0RHVtcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEb2NHZXRSb290RWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEb2NTZXRSb290RWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxFbGVtRHVtcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxGaXJzdEVsZW1lbnRDaGlsZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxHZXRCdWZmZXJBbGxvY2F0aW9uU2NoZW1lKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEdldENvbXByZXNzTW9kZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxHZXREb2NDb21wcmVzc01vZGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0SW50U3Vic2V0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEdldExhc3RDaGlsZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxHZXRMaW5lTm8oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0Tm9Oc1Byb3AoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0Tm9kZVBhdGgoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0TnNMaXN0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEdldE5zUHJvcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxHZXRQcm9wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEhhc05zUHJvcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxIYXNQcm9wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbElzQmxhbmtOb2RlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbElzWEhUTUwoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTGFzdEVsZW1lbnRDaGlsZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdDRGF0YUJsb2NrKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld0NoYXJSZWYoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3Q2hpbGQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3Q29tbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdEb2MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3RG9jQ29tbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdEb2NGcmFnbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdEb2NOb2RlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld0RvY05vZGVFYXROYW1lKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld0RvY1BJKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld0RvY1Byb3AoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3RG9jUmF3Tm9kZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdEb2NUZXh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld0RvY1RleHRMZW4oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3RHRkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld05vZGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3Tm9kZUVhdE5hbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3TnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3TnNQcm9wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld05zUHJvcEVhdE5hbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3UEkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3UHJvcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdSZWZlcmVuY2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3VGV4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdUZXh0Q2hpbGQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3VGV4dExlbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXh0RWxlbWVudFNpYmxpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTm9kZUFkZENvbnRlbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTm9kZUFkZENvbnRlbnRMZW4oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTm9kZUJ1ZkdldENvbnRlbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTm9kZUR1bXAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTm9kZUR1bXBPdXRwdXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTm9kZUdldEJhc2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTm9kZUdldENvbnRlbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTm9kZUdldExhbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTm9kZUdldFNwYWNlUHJlc2VydmUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTm9kZUlzVGV4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOb2RlTGlzdEdldFJhd1N0cmluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOb2RlTGlzdEdldFN0cmluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOb2RlU2V0QmFzZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOb2RlU2V0Q29udGVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOb2RlU2V0Q29udGVudExlbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOb2RlU2V0TGFuZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOb2RlU2V0TmFtZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOb2RlU2V0U3BhY2VQcmVzZXJ2ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQcmV2aW91c0VsZW1lbnRTaWJsaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlY29uY2lsaWF0ZU5zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlbW92ZVByb3AoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVwbGFjZU5vZGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2F2ZUZpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2F2ZUZpbGVFbmMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2F2ZUZpbGVUbygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTYXZlRm9ybWF0RmlsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTYXZlRm9ybWF0RmlsZUVuYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTYXZlRm9ybWF0RmlsZVRvKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNlYXJjaE5zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNlYXJjaE5zQnlIcmVmKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNldEJ1ZmZlckFsbG9jYXRpb25TY2hlbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2V0Q29tcHJlc3NNb2RlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNldERvY0NvbXByZXNzTW9kZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTZXROcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTZXROc1Byb3AoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2V0UHJvcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTcGxpdFFOYW1lMigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTcGxpdFFOYW1lMygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdHJpbmdHZXROb2RlTGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdHJpbmdMZW5HZXROb2RlTGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0Q29uY2F0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRNZXJnZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVbnNldE5zUHJvcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVbnNldFByb3AoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVmFsaWRhdGVOQ05hbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVmFsaWRhdGVOTVRva2VuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFZhbGlkYXRlTmFtZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZGF0ZVFOYW1lKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSB0cmVlOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxCdWlsZFJlbGF0aXZlVVJJKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogVVJJOyAvKiB0aGUgVVJJIHJlZmVyZW5jZSB1bmRlciBjb25zaWRlcmF0aW9uICovCiAgICBpbnQgbl9VUkk7CiAgICB4bWxDaGFyICogYmFzZTsgLyogdGhlIGJhc2UgdmFsdWUgKi8KICAgIGludCBuX2Jhc2U7CgogICAgZm9yIChuX1VSSSA9IDA7bl9VUkkgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9VUkkrKykgewogICAgZm9yIChuX2Jhc2UgPSAwO25fYmFzZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2Jhc2UrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgVVJJID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fVVJJLCAwKTsKICAgICAgICBiYXNlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fYmFzZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxCdWlsZFJlbGF0aXZlVVJJKChjb25zdCB4bWxDaGFyICopVVJJLCAoY29uc3QgeG1sQ2hhciAqKWJhc2UpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fVVJJLCAoY29uc3QgeG1sQ2hhciAqKVVSSSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fYmFzZSwgKGNvbnN0IHhtbENoYXIgKiliYXNlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEJ1aWxkUmVsYXRpdmVVUkkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJJKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Jhc2UpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEJ1aWxkVVJJKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogVVJJOyAvKiB0aGUgVVJJIGluc3RhbmNlIGZvdW5kIGluIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fVVJJOwogICAgeG1sQ2hhciAqIGJhc2U7IC8qIHRoZSBiYXNlIHZhbHVlICovCiAgICBpbnQgbl9iYXNlOwoKICAgIGZvciAobl9VUkkgPSAwO25fVVJJIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fVVJJKyspIHsKICAgIGZvciAobl9iYXNlID0gMDtuX2Jhc2UgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9iYXNlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIFVSSSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX1VSSSwgMCk7CiAgICAgICAgYmFzZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2Jhc2UsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQnVpbGRVUkkoKGNvbnN0IHhtbENoYXIgKilVUkksIChjb25zdCB4bWxDaGFyICopYmFzZSk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9VUkksIChjb25zdCB4bWxDaGFyICopVVJJLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9iYXNlLCAoY29uc3QgeG1sQ2hhciAqKWJhc2UsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQnVpbGRVUkkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJJKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Jhc2UpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENhbm9uaWNQYXRoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogcGF0aDsgLyogdGhlIHJlc291cmNlIGxvY2F0b3IgaW4gYSBmaWxlc3lzdGVtIG5vdGF0aW9uICovCiAgICBpbnQgbl9wYXRoOwoKICAgIGZvciAobl9wYXRoID0gMDtuX3BhdGggPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wYXRoKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHBhdGggPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wYXRoLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENhbm9uaWNQYXRoKChjb25zdCB4bWxDaGFyICopcGF0aCk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wYXRoLCAoY29uc3QgeG1sQ2hhciAqKXBhdGgsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ2Fub25pY1BhdGgiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcGF0aCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ3JlYXRlVVJJKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5vcm1hbGl6ZVVSSVBhdGgodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGNoYXIgKiBwYXRoOyAvKiBwb2ludGVyIHRvIHRoZSBwYXRoIHN0cmluZyAqLwogICAgaW50IG5fcGF0aDsKCiAgICBmb3IgKG5fcGF0aCA9IDA7bl9wYXRoIDwgZ2VuX25iX2NoYXJfcHRyO25fcGF0aCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBwYXRoID0gZ2VuX2NoYXJfcHRyKG5fcGF0aCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxOb3JtYWxpemVVUklQYXRoKHBhdGgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jaGFyX3B0cihuX3BhdGgsIHBhdGgsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTm9ybWFsaXplVVJJUGF0aCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wYXRoKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZVVSSSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZVVSSVJhdyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCiNkZWZpbmUgZ2VuX25iX3htbFVSSVB0ciAxCnN0YXRpYyB4bWxVUklQdHIgZ2VuX3htbFVSSVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sVVJJUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxVUklQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZVVSSVJlZmVyZW5jZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVVJJUHRyIHVyaTsgLyogcG9pbnRlciB0byBhbiBVUkkgc3RydWN0dXJlICovCiAgICBpbnQgbl91cmk7CiAgICBjaGFyICogc3RyOyAvKiB0aGUgc3RyaW5nIHRvIGFuYWx5emUgKi8KICAgIGludCBuX3N0cjsKCiAgICBmb3IgKG5fdXJpID0gMDtuX3VyaSA8IGdlbl9uYl94bWxVUklQdHI7bl91cmkrKykgewogICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9zdHIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdXJpID0gZ2VuX3htbFVSSVB0cihuX3VyaSwgMCk7CiAgICAgICAgc3RyID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fc3RyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlVVJJUmVmZXJlbmNlKHVyaSwgKGNvbnN0IGNoYXIgKilzdHIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxVUklQdHIobl91cmksIHVyaSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fc3RyLCAoY29uc3QgY2hhciAqKXN0ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZVVSSVJlZmVyZW5jZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91cmkpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXRoVG9VUkkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBwYXRoOyAvKiB0aGUgcmVzb3VyY2UgbG9jYXRvciBpbiBhIGZpbGVzeXN0ZW0gbm90YXRpb24gKi8KICAgIGludCBuX3BhdGg7CgogICAgZm9yIChuX3BhdGggPSAwO25fcGF0aCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3BhdGgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcGF0aCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3BhdGgsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sUGF0aFRvVVJJKChjb25zdCB4bWxDaGFyICopcGF0aCk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wYXRoLCAoY29uc3QgeG1sQ2hhciAqKXBhdGgsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGF0aFRvVVJJIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3BhdGgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFByaW50VVJJKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgRklMRSAqIHN0cmVhbTsgLyogYSBGSUxFKiBmb3IgdGhlIG91dHB1dCAqLwogICAgaW50IG5fc3RyZWFtOwogICAgeG1sVVJJUHRyIHVyaTsgLyogcG9pbnRlciB0byBhbiB4bWxVUkkgKi8KICAgIGludCBuX3VyaTsKCiAgICBmb3IgKG5fc3RyZWFtID0gMDtuX3N0cmVhbSA8IGdlbl9uYl9GSUxFX3B0cjtuX3N0cmVhbSsrKSB7CiAgICBmb3IgKG5fdXJpID0gMDtuX3VyaSA8IGdlbl9uYl94bWxVUklQdHI7bl91cmkrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3RyZWFtID0gZ2VuX0ZJTEVfcHRyKG5fc3RyZWFtLCAwKTsKICAgICAgICB1cmkgPSBnZW5feG1sVVJJUHRyKG5fdXJpLCAxKTsKCiAgICAgICAgeG1sUHJpbnRVUkkoc3RyZWFtLCB1cmkpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfRklMRV9wdHIobl9zdHJlYW0sIHN0cmVhbSwgMCk7CiAgICAgICAgZGVzX3htbFVSSVB0cihuX3VyaSwgdXJpLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFByaW50VVJJIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cmVhbSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91cmkpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNhdmVVcmkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFVSSVB0ciB1cmk7IC8qIHBvaW50ZXIgdG8gYW4geG1sVVJJICovCiAgICBpbnQgbl91cmk7CgogICAgZm9yIChuX3VyaSA9IDA7bl91cmkgPCBnZW5fbmJfeG1sVVJJUHRyO25fdXJpKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHVyaSA9IGdlbl94bWxVUklQdHIobl91cmksIDApOwoKICAgICAgICByZXRfdmFsID0geG1sU2F2ZVVyaSh1cmkpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFVSSVB0cihuX3VyaSwgdXJpLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNhdmVVcmkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXJpKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVUklFc2NhcGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBzdHI7IC8qIHRoZSBzdHJpbmcgb2YgdGhlIFVSSSB0byBlc2NhcGUgKi8KICAgIGludCBuX3N0cjsKCiAgICBmb3IgKG5fc3RyID0gMDtuX3N0ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzdHIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVVJJRXNjYXBlKChjb25zdCB4bWxDaGFyICopc3RyKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgKGNvbnN0IHhtbENoYXIgKilzdHIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVVJJRXNjYXBlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVVJJRXNjYXBlU3RyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogc3RyOyAvKiBzdHJpbmcgdG8gZXNjYXBlICovCiAgICBpbnQgbl9zdHI7CiAgICB4bWxDaGFyICogbGlzdDsgLyogZXhjZXB0aW9uIGxpc3Qgc3RyaW5nIG9mIGNoYXJzIG5vdCB0byBlc2NhcGUgKi8KICAgIGludCBuX2xpc3Q7CgogICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIrKykgewogICAgZm9yIChuX2xpc3QgPSAwO25fbGlzdCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2xpc3QrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3RyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAwKTsKICAgICAgICBsaXN0ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbGlzdCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxVUklFc2NhcGVTdHIoKGNvbnN0IHhtbENoYXIgKilzdHIsIChjb25zdCB4bWxDaGFyICopbGlzdCk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIChjb25zdCB4bWxDaGFyICopc3RyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9saXN0LCAoY29uc3QgeG1sQ2hhciAqKWxpc3QsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVVJJRXNjYXBlU3RyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9saXN0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVUklVbmVzY2FwZVN0cmluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3VyaSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgdXJpIDogMTAgb2YgMTUgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEJ1aWxkUmVsYXRpdmVVUkkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQnVpbGRVUkkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ2Fub25pY1BhdGgoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ3JlYXRlVVJJKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5vcm1hbGl6ZVVSSVBhdGgoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VVUkkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VVUklSYXcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VVUklSZWZlcmVuY2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGF0aFRvVVJJKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFByaW50VVJJKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNhdmVVcmkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVVJJRXNjYXBlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVSSUVzY2FwZVN0cigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVUklVbmVzY2FwZVN0cmluZygpOwoKICAgIGlmICh0ZXN0X3JldCAhPSAwKQoJcHJpbnRmKCJNb2R1bGUgdXJpOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxBZGRBdHRyaWJ1dGVEZWNsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQXR0cmlidXRlUHRyIHJldF92YWw7CiAgICB4bWxWYWxpZEN0eHRQdHIgY3R4dDsgLyogdGhlIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbER0ZFB0ciBkdGQ7IC8qIHBvaW50ZXIgdG8gdGhlIERURCAqLwogICAgaW50IG5fZHRkOwogICAgeG1sQ2hhciAqIGVsZW07IC8qIHRoZSBlbGVtZW50IG5hbWUgKi8KICAgIGludCBuX2VsZW07CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGF0dHJpYnV0ZSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIG5zOyAvKiB0aGUgYXR0cmlidXRlIG5hbWVzcGFjZSBwcmVmaXggKi8KICAgIGludCBuX25zOwogICAgeG1sQXR0cmlidXRlVHlwZSB0eXBlOyAvKiB0aGUgYXR0cmlidXRlIHR5cGUgKi8KICAgIGludCBuX3R5cGU7CiAgICB4bWxBdHRyaWJ1dGVEZWZhdWx0IGRlZjsgLyogdGhlIGF0dHJpYnV0ZSBkZWZhdWx0IHR5cGUgKi8KICAgIGludCBuX2RlZjsKICAgIHhtbENoYXIgKiBkZWZhdWx0VmFsdWU7IC8qIHRoZSBhdHRyaWJ1dGUgZGVmYXVsdCB2YWx1ZSAqLwogICAgaW50IG5fZGVmYXVsdFZhbHVlOwogICAgeG1sRW51bWVyYXRpb25QdHIgdHJlZTsgLyogaWYgaXQncyBhbiBlbnVtZXJhdGlvbiwgdGhlIGFzc29jaWF0ZWQgbGlzdCAqLwogICAgaW50IG5fdHJlZTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2R0ZCA9IDA7bl9kdGQgPCBnZW5fbmJfeG1sRHRkUHRyO25fZHRkKyspIHsKICAgIGZvciAobl9lbGVtID0gMDtuX2VsZW0gPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9lbGVtKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9ucyA9IDA7bl9ucyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25zKyspIHsKICAgIGZvciAobl90eXBlID0gMDtuX3R5cGUgPCBnZW5fbmJfeG1sQXR0cmlidXRlVHlwZTtuX3R5cGUrKykgewogICAgZm9yIChuX2RlZiA9IDA7bl9kZWYgPCBnZW5fbmJfeG1sQXR0cmlidXRlRGVmYXVsdDtuX2RlZisrKSB7CiAgICBmb3IgKG5fZGVmYXVsdFZhbHVlID0gMDtuX2RlZmF1bHRWYWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2RlZmF1bHRWYWx1ZSsrKSB7CiAgICBmb3IgKG5fdHJlZSA9IDA7bl90cmVlIDwgZ2VuX25iX3htbEVudW1lcmF0aW9uUHRyO25fdHJlZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGR0ZCA9IGdlbl94bWxEdGRQdHIobl9kdGQsIDEpOwogICAgICAgIGVsZW0gPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9lbGVtLCAyKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMyk7CiAgICAgICAgbnMgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9ucywgNCk7CiAgICAgICAgdHlwZSA9IGdlbl94bWxBdHRyaWJ1dGVUeXBlKG5fdHlwZSwgNSk7CiAgICAgICAgZGVmID0gZ2VuX3htbEF0dHJpYnV0ZURlZmF1bHQobl9kZWYsIDYpOwogICAgICAgIGRlZmF1bHRWYWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2RlZmF1bHRWYWx1ZSwgNyk7CiAgICAgICAgdHJlZSA9IGdlbl94bWxFbnVtZXJhdGlvblB0cihuX3RyZWUsIDgpOwoKICAgICAgICByZXRfdmFsID0geG1sQWRkQXR0cmlidXRlRGVjbChjdHh0LCBkdGQsIChjb25zdCB4bWxDaGFyICopZWxlbSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5zLCB0eXBlLCBkZWYsIChjb25zdCB4bWxDaGFyICopZGVmYXVsdFZhbHVlLCB0cmVlKTsKICAgICAgICBkZXNyZXRfeG1sQXR0cmlidXRlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbER0ZFB0cihuX2R0ZCwgZHRkLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9lbGVtLCAoY29uc3QgeG1sQ2hhciAqKWVsZW0sIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMyk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbnMsIChjb25zdCB4bWxDaGFyICopbnMsIDQpOwogICAgICAgIGRlc194bWxBdHRyaWJ1dGVUeXBlKG5fdHlwZSwgdHlwZSwgNSk7CiAgICAgICAgZGVzX3htbEF0dHJpYnV0ZURlZmF1bHQobl9kZWYsIGRlZiwgNik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fZGVmYXVsdFZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKWRlZmF1bHRWYWx1ZSwgNyk7CiAgICAgICAgZGVzX3htbEVudW1lcmF0aW9uUHRyKG5fdHJlZSwgdHJlZSwgOCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxBZGRBdHRyaWJ1dGVEZWNsIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZHRkKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ucyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90eXBlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RlZik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kZWZhdWx0VmFsdWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHJlZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQWRkRWxlbWVudERlY2wodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxFbGVtZW50UHRyIHJldF92YWw7CiAgICB4bWxWYWxpZEN0eHRQdHIgY3R4dDsgLyogdGhlIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbER0ZFB0ciBkdGQ7IC8qIHBvaW50ZXIgdG8gdGhlIERURCAqLwogICAgaW50IG5fZHRkOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBlbnRpdHkgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbEVsZW1lbnRUeXBlVmFsIHR5cGU7IC8qIHRoZSBlbGVtZW50IHR5cGUgKi8KICAgIGludCBuX3R5cGU7CiAgICB4bWxFbGVtZW50Q29udGVudFB0ciBjb250ZW50OyAvKiB0aGUgZWxlbWVudCBjb250ZW50IHRyZWUgb3IgTlVMTCAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2R0ZCA9IDA7bl9kdGQgPCBnZW5fbmJfeG1sRHRkUHRyO25fZHRkKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl90eXBlID0gMDtuX3R5cGUgPCBnZW5fbmJfeG1sRWxlbWVudFR5cGVWYWw7bl90eXBlKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfeG1sRWxlbWVudENvbnRlbnRQdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZHRkID0gZ2VuX3htbER0ZFB0cihuX2R0ZCwgMSk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDIpOwogICAgICAgIHR5cGUgPSBnZW5feG1sRWxlbWVudFR5cGVWYWwobl90eXBlLCAzKTsKICAgICAgICBjb250ZW50ID0gZ2VuX3htbEVsZW1lbnRDb250ZW50UHRyKG5fY29udGVudCwgNCk7CgogICAgICAgIHJldF92YWwgPSB4bWxBZGRFbGVtZW50RGVjbChjdHh0LCBkdGQsIChjb25zdCB4bWxDaGFyICopbmFtZSwgdHlwZSwgY29udGVudCk7CiAgICAgICAgZGVzcmV0X3htbEVsZW1lbnRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sRHRkUHRyKG5fZHRkLCBkdGQsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX3htbEVsZW1lbnRUeXBlVmFsKG5fdHlwZSwgdHlwZSwgMyk7CiAgICAgICAgZGVzX3htbEVsZW1lbnRDb250ZW50UHRyKG5fY29udGVudCwgY29udGVudCwgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxBZGRFbGVtZW50RGVjbCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2R0ZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3R5cGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQWRkSUQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQWRkTm90YXRpb25EZWNsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEFkZFJlZih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCiNkZWZpbmUgZ2VuX25iX3htbEF0dHJpYnV0ZVRhYmxlUHRyIDEKc3RhdGljIHhtbEF0dHJpYnV0ZVRhYmxlUHRyIGdlbl94bWxBdHRyaWJ1dGVUYWJsZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sQXR0cmlidXRlVGFibGVQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbEF0dHJpYnV0ZVRhYmxlUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sQ29weUF0dHJpYnV0ZVRhYmxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENvcHlEb2NFbGVtZW50Q29udGVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEVsZW1lbnRDb250ZW50UHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgb3duaW5nIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxFbGVtZW50Q29udGVudFB0ciBjdXI7IC8qIEFuIGVsZW1lbnQgY29udGVudCBwb2ludGVyLiAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxFbGVtZW50Q29udGVudFB0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBjdXIgPSBnZW5feG1sRWxlbWVudENvbnRlbnRQdHIobl9jdXIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sQ29weURvY0VsZW1lbnRDb250ZW50KGRvYywgY3VyKTsKICAgICAgICBkZXNyZXRfeG1sRWxlbWVudENvbnRlbnRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX3htbEVsZW1lbnRDb250ZW50UHRyKG5fY3VyLCBjdXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ29weURvY0VsZW1lbnRDb250ZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENvcHlFbGVtZW50Q29udGVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEVsZW1lbnRDb250ZW50UHRyIHJldF92YWw7CiAgICB4bWxFbGVtZW50Q29udGVudFB0ciBjdXI7IC8qIEFuIGVsZW1lbnQgY29udGVudCBwb2ludGVyLiAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbEVsZW1lbnRDb250ZW50UHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxFbGVtZW50Q29udGVudFB0cihuX2N1ciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxDb3B5RWxlbWVudENvbnRlbnQoY3VyKTsKICAgICAgICBkZXNyZXRfeG1sRWxlbWVudENvbnRlbnRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxFbGVtZW50Q29udGVudFB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENvcHlFbGVtZW50Q29udGVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKI2RlZmluZSBnZW5fbmJfeG1sRWxlbWVudFRhYmxlUHRyIDEKc3RhdGljIHhtbEVsZW1lbnRUYWJsZVB0ciBnZW5feG1sRWxlbWVudFRhYmxlUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxFbGVtZW50VGFibGVQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbEVsZW1lbnRUYWJsZVB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKc3RhdGljIGludAp0ZXN0X3htbENvcHlFbGVtZW50VGFibGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ29weUVudW1lcmF0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKI2RlZmluZSBnZW5fbmJfeG1sTm90YXRpb25UYWJsZVB0ciAxCnN0YXRpYyB4bWxOb3RhdGlvblRhYmxlUHRyIGdlbl94bWxOb3RhdGlvblRhYmxlUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxOb3RhdGlvblRhYmxlUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxOb3RhdGlvblRhYmxlUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sQ29weU5vdGF0aW9uVGFibGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ3JlYXRlRW51bWVyYXRpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgojZGVmaW5lIGdlbl9uYl94bWxBdHRyaWJ1dGVQdHIgMQpzdGF0aWMgeG1sQXR0cmlidXRlUHRyIGdlbl94bWxBdHRyaWJ1dGVQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbEF0dHJpYnV0ZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sQXR0cmlidXRlUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sRHVtcEF0dHJpYnV0ZURlY2wodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBYTUwgYnVmZmVyIG91dHB1dCAqLwogICAgaW50IG5fYnVmOwogICAgeG1sQXR0cmlidXRlUHRyIGF0dHI7IC8qIEFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiAqLwogICAgaW50IG5fYXR0cjsKCiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgewogICAgZm9yIChuX2F0dHIgPSAwO25fYXR0ciA8IGdlbl9uYl94bWxBdHRyaWJ1dGVQdHI7bl9hdHRyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIGF0dHIgPSBnZW5feG1sQXR0cmlidXRlUHRyKG5fYXR0ciwgMSk7CgogICAgICAgIHhtbER1bXBBdHRyaWJ1dGVEZWNsKGJ1ZiwgYXR0cik7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CiAgICAgICAgZGVzX3htbEF0dHJpYnV0ZVB0cihuX2F0dHIsIGF0dHIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRHVtcEF0dHJpYnV0ZURlY2wiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2F0dHIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEdW1wQXR0cmlidXRlVGFibGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBYTUwgYnVmZmVyIG91dHB1dCAqLwogICAgaW50IG5fYnVmOwogICAgeG1sQXR0cmlidXRlVGFibGVQdHIgdGFibGU7IC8qIEFuIGF0dHJpYnV0ZSB0YWJsZSAqLwogICAgaW50IG5fdGFibGU7CgogICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKICAgIGZvciAobl90YWJsZSA9IDA7bl90YWJsZSA8IGdlbl9uYl94bWxBdHRyaWJ1dGVUYWJsZVB0cjtuX3RhYmxlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIHRhYmxlID0gZ2VuX3htbEF0dHJpYnV0ZVRhYmxlUHRyKG5fdGFibGUsIDEpOwoKICAgICAgICB4bWxEdW1wQXR0cmlidXRlVGFibGUoYnVmLCB0YWJsZSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CiAgICAgICAgZGVzX3htbEF0dHJpYnV0ZVRhYmxlUHRyKG5fdGFibGUsIHRhYmxlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbER1bXBBdHRyaWJ1dGVUYWJsZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdGFibGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCiNkZWZpbmUgZ2VuX25iX3htbEVsZW1lbnRQdHIgMQpzdGF0aWMgeG1sRWxlbWVudFB0ciBnZW5feG1sRWxlbWVudFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sRWxlbWVudFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sRWxlbWVudFB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKc3RhdGljIGludAp0ZXN0X3htbER1bXBFbGVtZW50RGVjbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIFhNTCBidWZmZXIgb3V0cHV0ICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxFbGVtZW50UHRyIGVsZW07IC8qIEFuIGVsZW1lbnQgdGFibGUgKi8KICAgIGludCBuX2VsZW07CgogICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKICAgIGZvciAobl9lbGVtID0gMDtuX2VsZW0gPCBnZW5fbmJfeG1sRWxlbWVudFB0cjtuX2VsZW0rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgZWxlbSA9IGdlbl94bWxFbGVtZW50UHRyKG5fZWxlbSwgMSk7CgogICAgICAgIHhtbER1bXBFbGVtZW50RGVjbChidWYsIGVsZW0pOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5fYnVmLCBidWYsIDApOwogICAgICAgIGRlc194bWxFbGVtZW50UHRyKG5fZWxlbSwgZWxlbSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEdW1wRWxlbWVudERlY2wiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxEdW1wRWxlbWVudFRhYmxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxCdWZmZXJQdHIgYnVmOyAvKiB0aGUgWE1MIGJ1ZmZlciBvdXRwdXQgKi8KICAgIGludCBuX2J1ZjsKICAgIHhtbEVsZW1lbnRUYWJsZVB0ciB0YWJsZTsgLyogQW4gZWxlbWVudCB0YWJsZSAqLwogICAgaW50IG5fdGFibGU7CgogICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKICAgIGZvciAobl90YWJsZSA9IDA7bl90YWJsZSA8IGdlbl9uYl94bWxFbGVtZW50VGFibGVQdHI7bl90YWJsZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWYgPSBnZW5feG1sQnVmZmVyUHRyKG5fYnVmLCAwKTsKICAgICAgICB0YWJsZSA9IGdlbl94bWxFbGVtZW50VGFibGVQdHIobl90YWJsZSwgMSk7CgogICAgICAgIHhtbER1bXBFbGVtZW50VGFibGUoYnVmLCB0YWJsZSk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CiAgICAgICAgZGVzX3htbEVsZW1lbnRUYWJsZVB0cihuX3RhYmxlLCB0YWJsZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEdW1wRWxlbWVudFRhYmxlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90YWJsZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKI2RlZmluZSBnZW5fbmJfeG1sTm90YXRpb25QdHIgMQpzdGF0aWMgeG1sTm90YXRpb25QdHIgZ2VuX3htbE5vdGF0aW9uUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxOb3RhdGlvblB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sTm90YXRpb25QdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxEdW1wTm90YXRpb25EZWNsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxCdWZmZXJQdHIgYnVmOyAvKiB0aGUgWE1MIGJ1ZmZlciBvdXRwdXQgKi8KICAgIGludCBuX2J1ZjsKICAgIHhtbE5vdGF0aW9uUHRyIG5vdGE7IC8qIEEgbm90YXRpb24gZGVjbGFyYXRpb24gKi8KICAgIGludCBuX25vdGE7CgogICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKICAgIGZvciAobl9ub3RhID0gMDtuX25vdGEgPCBnZW5fbmJfeG1sTm90YXRpb25QdHI7bl9ub3RhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIG5vdGEgPSBnZW5feG1sTm90YXRpb25QdHIobl9ub3RhLCAxKTsKCiAgICAgICAgeG1sRHVtcE5vdGF0aW9uRGVjbChidWYsIG5vdGEpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5fYnVmLCBidWYsIDApOwogICAgICAgIGRlc194bWxOb3RhdGlvblB0cihuX25vdGEsIG5vdGEsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRHVtcE5vdGF0aW9uRGVjbCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm90YSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbER1bXBOb3RhdGlvblRhYmxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxCdWZmZXJQdHIgYnVmOyAvKiB0aGUgWE1MIGJ1ZmZlciBvdXRwdXQgKi8KICAgIGludCBuX2J1ZjsKICAgIHhtbE5vdGF0aW9uVGFibGVQdHIgdGFibGU7IC8qIEEgbm90YXRpb24gdGFibGUgKi8KICAgIGludCBuX3RhYmxlOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fdGFibGUgPSAwO25fdGFibGUgPCBnZW5fbmJfeG1sTm90YXRpb25UYWJsZVB0cjtuX3RhYmxlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIHRhYmxlID0gZ2VuX3htbE5vdGF0aW9uVGFibGVQdHIobl90YWJsZSwgMSk7CgogICAgICAgIHhtbER1bXBOb3RhdGlvblRhYmxlKGJ1ZiwgdGFibGUpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5fYnVmLCBidWYsIDApOwogICAgICAgIGRlc194bWxOb3RhdGlvblRhYmxlUHRyKG5fdGFibGUsIHRhYmxlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbER1bXBOb3RhdGlvblRhYmxlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90YWJsZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldER0ZEF0dHJEZXNjKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQXR0cmlidXRlUHRyIHJldF92YWw7CiAgICB4bWxEdGRQdHIgZHRkOyAvKiBhIHBvaW50ZXIgdG8gdGhlIER0RCB0byBzZWFyY2ggKi8KICAgIGludCBuX2R0ZDsKICAgIHhtbENoYXIgKiBlbGVtOyAvKiB0aGUgZWxlbWVudCBuYW1lICovCiAgICBpbnQgbl9lbGVtOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBhdHRyaWJ1dGUgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fZHRkID0gMDtuX2R0ZCA8IGdlbl9uYl94bWxEdGRQdHI7bl9kdGQrKykgewogICAgZm9yIChuX2VsZW0gPSAwO25fZWxlbSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2VsZW0rKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZHRkID0gZ2VuX3htbER0ZFB0cihuX2R0ZCwgMCk7CiAgICAgICAgZWxlbSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2VsZW0sIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEdldER0ZEF0dHJEZXNjKGR0ZCwgKGNvbnN0IHhtbENoYXIgKillbGVtLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF94bWxBdHRyaWJ1dGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEdGRQdHIobl9kdGQsIGR0ZCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fZWxlbSwgKGNvbnN0IHhtbENoYXIgKillbGVtLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sR2V0RHRkQXR0ckRlc2MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZHRkKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sR2V0RHRkRWxlbWVudERlc2Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxFbGVtZW50UHRyIHJldF92YWw7CiAgICB4bWxEdGRQdHIgZHRkOyAvKiBhIHBvaW50ZXIgdG8gdGhlIER0RCB0byBzZWFyY2ggKi8KICAgIGludCBuX2R0ZDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgZWxlbWVudCBuYW1lICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl9kdGQgPSAwO25fZHRkIDwgZ2VuX25iX3htbER0ZFB0cjtuX2R0ZCsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkdGQgPSBnZW5feG1sRHRkUHRyKG5fZHRkLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxHZXREdGRFbGVtZW50RGVzYyhkdGQsIChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X3htbEVsZW1lbnRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEdGRQdHIobl9kdGQsIGR0ZCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEdldER0ZEVsZW1lbnREZXNjIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2R0ZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXREdGROb3RhdGlvbkRlc2Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sR2V0RHRkUUF0dHJEZXNjKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQXR0cmlidXRlUHRyIHJldF92YWw7CiAgICB4bWxEdGRQdHIgZHRkOyAvKiBhIHBvaW50ZXIgdG8gdGhlIER0RCB0byBzZWFyY2ggKi8KICAgIGludCBuX2R0ZDsKICAgIHhtbENoYXIgKiBlbGVtOyAvKiB0aGUgZWxlbWVudCBuYW1lICovCiAgICBpbnQgbl9lbGVtOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBhdHRyaWJ1dGUgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBwcmVmaXg7IC8qIHRoZSBhdHRyaWJ1dGUgbmFtZXNwYWNlIHByZWZpeCAqLwogICAgaW50IG5fcHJlZml4OwoKICAgIGZvciAobl9kdGQgPSAwO25fZHRkIDwgZ2VuX25iX3htbER0ZFB0cjtuX2R0ZCsrKSB7CiAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fZWxlbSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fcHJlZml4ID0gMDtuX3ByZWZpeCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ByZWZpeCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkdGQgPSBnZW5feG1sRHRkUHRyKG5fZHRkLCAwKTsKICAgICAgICBlbGVtID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fZWxlbSwgMSk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDIpOwogICAgICAgIHByZWZpeCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxHZXREdGRRQXR0ckRlc2MoZHRkLCAoY29uc3QgeG1sQ2hhciAqKWVsZW0sIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgpOwogICAgICAgIGRlc3JldF94bWxBdHRyaWJ1dGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEdGRQdHIobl9kdGQsIGR0ZCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fZWxlbSwgKGNvbnN0IHhtbENoYXIgKillbGVtLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sR2V0RHRkUUF0dHJEZXNjIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2R0ZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbGVtKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHJlZml4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXREdGRRRWxlbWVudERlc2Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxFbGVtZW50UHRyIHJldF92YWw7CiAgICB4bWxEdGRQdHIgZHRkOyAvKiBhIHBvaW50ZXIgdG8gdGhlIER0RCB0byBzZWFyY2ggKi8KICAgIGludCBuX2R0ZDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgZWxlbWVudCBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIHByZWZpeDsgLyogdGhlIGVsZW1lbnQgbmFtZXNwYWNlIHByZWZpeCAqLwogICAgaW50IG5fcHJlZml4OwoKICAgIGZvciAobl9kdGQgPSAwO25fZHRkIDwgZ2VuX25iX3htbER0ZFB0cjtuX2R0ZCsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fcHJlZml4ID0gMDtuX3ByZWZpeCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ByZWZpeCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkdGQgPSBnZW5feG1sRHRkUHRyKG5fZHRkLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgcHJlZml4ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEdldER0ZFFFbGVtZW50RGVzYyhkdGQsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgpOwogICAgICAgIGRlc3JldF94bWxFbGVtZW50UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRHRkUHRyKG5fZHRkLCBkdGQsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxHZXREdGRRRWxlbWVudERlc2MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZHRkKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHJlZml4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXRJRCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEF0dHJQdHIgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHBvaW50ZXIgdG8gdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogSUQ7IC8qIHRoZSBJRCB2YWx1ZSAqLwogICAgaW50IG5fSUQ7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9JRCA9IDA7bl9JRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX0lEKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIElEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fSUQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sR2V0SUQoZG9jLCAoY29uc3QgeG1sQ2hhciAqKUlEKTsKICAgICAgICBkZXNyZXRfeG1sQXR0clB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9JRCwgKGNvbnN0IHhtbENoYXIgKilJRCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxHZXRJRCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fSUQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEdldFJlZnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSXNJRCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIGVsZW07IC8qIHRoZSBlbGVtZW50IGNhcnJ5aW5nIHRoZSBhdHRyaWJ1dGUgKi8KICAgIGludCBuX2VsZW07CiAgICB4bWxBdHRyUHRyIGF0dHI7IC8qIHRoZSBhdHRyaWJ1dGUgKi8KICAgIGludCBuX2F0dHI7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9lbGVtID0gMDtuX2VsZW0gPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2VsZW0rKykgewogICAgZm9yIChuX2F0dHIgPSAwO25fYXR0ciA8IGdlbl9uYl94bWxBdHRyUHRyO25fYXR0cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBlbGVtID0gZ2VuX3htbE5vZGVQdHIobl9lbGVtLCAxKTsKICAgICAgICBhdHRyID0gZ2VuX3htbEF0dHJQdHIobl9hdHRyLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbElzSUQoZG9jLCBlbGVtLCBhdHRyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fZWxlbSwgZWxlbSwgMSk7CiAgICAgICAgZGVzX3htbEF0dHJQdHIobl9hdHRyLCBhdHRyLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbElzSUQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYXR0cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSXNNaXhlZEVsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBlbGVtZW50IG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbElzTWl4ZWRFbGVtZW50KGRvYywgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxJc01peGVkRWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSXNSZWYodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm9kZVB0ciBlbGVtOyAvKiB0aGUgZWxlbWVudCBjYXJyeWluZyB0aGUgYXR0cmlidXRlICovCiAgICBpbnQgbl9lbGVtOwogICAgeG1sQXR0clB0ciBhdHRyOyAvKiB0aGUgYXR0cmlidXRlICovCiAgICBpbnQgbl9hdHRyOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9lbGVtKyspIHsKICAgIGZvciAobl9hdHRyID0gMDtuX2F0dHIgPCBnZW5fbmJfeG1sQXR0clB0cjtuX2F0dHIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgZWxlbSA9IGdlbl94bWxOb2RlUHRyKG5fZWxlbSwgMSk7CiAgICAgICAgYXR0ciA9IGdlbl94bWxBdHRyUHRyKG5fYXR0ciwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxJc1JlZihkb2MsIGVsZW0sIGF0dHIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9lbGVtLCBlbGVtLCAxKTsKICAgICAgICBkZXNfeG1sQXR0clB0cihuX2F0dHIsIGF0dHIsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSXNSZWYiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYXR0cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3RG9jRWxlbWVudENvbnRlbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxFbGVtZW50Q29udGVudFB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIHN1YmVsZW1lbnQgbmFtZSBvciBOVUxMICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sRWxlbWVudENvbnRlbnRUeXBlIHR5cGU7IC8qIHRoZSB0eXBlIG9mIGVsZW1lbnQgY29udGVudCBkZWNsICovCiAgICBpbnQgbl90eXBlOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fdHlwZSA9IDA7bl90eXBlIDwgZ2VuX25iX3htbEVsZW1lbnRDb250ZW50VHlwZTtuX3R5cGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIHR5cGUgPSBnZW5feG1sRWxlbWVudENvbnRlbnRUeXBlKG5fdHlwZSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdEb2NFbGVtZW50Q29udGVudChkb2MsIChjb25zdCB4bWxDaGFyICopbmFtZSwgdHlwZSk7CiAgICAgICAgeG1sRnJlZURvY0VsZW1lbnRDb250ZW50KGRvYywgcmV0X3ZhbCk7IHJldF92YWwgPSBOVUxMOwogICAgICAgIGRlc3JldF94bWxFbGVtZW50Q29udGVudFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc194bWxFbGVtZW50Q29udGVudFR5cGUobl90eXBlLCB0eXBlLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld0RvY0VsZW1lbnRDb250ZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3R5cGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5ld0VsZW1lbnRDb250ZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRWxlbWVudENvbnRlbnRQdHIgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgc3ViZWxlbWVudCBuYW1lIG9yIE5VTEwgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxFbGVtZW50Q29udGVudFR5cGUgdHlwZTsgLyogdGhlIHR5cGUgb2YgZWxlbWVudCBjb250ZW50IGRlY2wgKi8KICAgIGludCBuX3R5cGU7CgogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl94bWxFbGVtZW50Q29udGVudFR5cGU7bl90eXBlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAwKTsKICAgICAgICB0eXBlID0gZ2VuX3htbEVsZW1lbnRDb250ZW50VHlwZShuX3R5cGUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3RWxlbWVudENvbnRlbnQoKGNvbnN0IHhtbENoYXIgKiluYW1lLCB0eXBlKTsKICAgICAgICBkZXNyZXRfeG1sRWxlbWVudENvbnRlbnRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMCk7CiAgICAgICAgZGVzX3htbEVsZW1lbnRDb250ZW50VHlwZShuX3R5cGUsIHR5cGUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3RWxlbWVudENvbnRlbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90eXBlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdWYWxpZEN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVtb3ZlSUQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sQXR0clB0ciBhdHRyOyAvKiB0aGUgYXR0cmlidXRlICovCiAgICBpbnQgbl9hdHRyOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fYXR0ciA9IDA7bl9hdHRyIDwgZ2VuX25iX3htbEF0dHJQdHI7bl9hdHRyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIGF0dHIgPSBnZW5feG1sQXR0clB0cihuX2F0dHIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sUmVtb3ZlSUQoZG9jLCBhdHRyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc194bWxBdHRyUHRyKG5fYXR0ciwgYXR0ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZW1vdmVJRCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYXR0cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVtb3ZlUmVmKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbEF0dHJQdHIgYXR0cjsgLyogdGhlIGF0dHJpYnV0ZSAqLwogICAgaW50IG5fYXR0cjsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2F0dHIgPSAwO25fYXR0ciA8IGdlbl9uYl94bWxBdHRyUHRyO25fYXR0cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBhdHRyID0gZ2VuX3htbEF0dHJQdHIobl9hdHRyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlbW92ZVJlZihkb2MsIGF0dHIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMCk7CiAgICAgICAgZGVzX3htbEF0dHJQdHIobl9hdHRyLCBhdHRyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlbW92ZVJlZiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYXR0cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU25wcmludGZFbGVtZW50Q29udGVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGNoYXIgKiBidWY7IC8qIGFuIG91dHB1dCBidWZmZXIgKi8KICAgIGludCBuX2J1ZjsKICAgIGludCBzaXplOyAvKiB0aGUgYnVmZmVyIHNpemUgKi8KICAgIGludCBuX3NpemU7CiAgICB4bWxFbGVtZW50Q29udGVudFB0ciBjb250ZW50OyAvKiBBbiBlbGVtZW50IHRhYmxlICovCiAgICBpbnQgbl9jb250ZW50OwogICAgaW50IGVuZ2xvYjsgLyogMSBpZiBvbmUgbXVzdCBwcmludCB0aGUgZW5nbG9iaW5nIHBhcmVudGhlc2lzLCAwIG90aGVyd2lzZSAqLwogICAgaW50IG5fZW5nbG9iOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX2NoYXJfcHRyO25fYnVmKyspIHsKICAgIGZvciAobl9zaXplID0gMDtuX3NpemUgPCBnZW5fbmJfaW50O25fc2l6ZSsrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX3htbEVsZW1lbnRDb250ZW50UHRyO25fY29udGVudCsrKSB7CiAgICBmb3IgKG5fZW5nbG9iID0gMDtuX2VuZ2xvYiA8IGdlbl9uYl9pbnQ7bl9lbmdsb2IrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX2NoYXJfcHRyKG5fYnVmLCAwKTsKICAgICAgICBzaXplID0gZ2VuX2ludChuX3NpemUsIDEpOwogICAgICAgIGNvbnRlbnQgPSBnZW5feG1sRWxlbWVudENvbnRlbnRQdHIobl9jb250ZW50LCAyKTsKICAgICAgICBlbmdsb2IgPSBnZW5faW50KG5fZW5nbG9iLCAzKTsKCiAgICAgICAgeG1sU25wcmludGZFbGVtZW50Q29udGVudChidWYsIHNpemUsIGNvbnRlbnQsIGVuZ2xvYik7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jaGFyX3B0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfaW50KG5fc2l6ZSwgc2l6ZSwgMSk7CiAgICAgICAgZGVzX3htbEVsZW1lbnRDb250ZW50UHRyKG5fY29udGVudCwgY29udGVudCwgMik7CiAgICAgICAgZGVzX2ludChuX2VuZ2xvYiwgZW5nbG9iLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNucHJpbnRmRWxlbWVudENvbnRlbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NpemUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmdsb2IpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNwcmludGZFbGVtZW50Q29udGVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQojaWZkZWYgTElCWE1MX09VVFBVVF9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CiAgICBjaGFyICogYnVmOyAvKiBhbiBvdXRwdXQgYnVmZmVyICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxFbGVtZW50Q29udGVudFB0ciBjb250ZW50OyAvKiBBbiBlbGVtZW50IHRhYmxlICovCiAgICBpbnQgbl9jb250ZW50OwogICAgaW50IGVuZ2xvYjsgLyogMSBpZiBvbmUgbXVzdCBwcmludCB0aGUgZW5nbG9iaW5nIHBhcmVudGhlc2lzLCAwIG90aGVyd2lzZSAqLwogICAgaW50IG5fZW5nbG9iOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX2NoYXJfcHRyO25fYnVmKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfeG1sRWxlbWVudENvbnRlbnRQdHI7bl9jb250ZW50KyspIHsKICAgIGZvciAobl9lbmdsb2IgPSAwO25fZW5nbG9iIDwgZ2VuX25iX2ludDtuX2VuZ2xvYisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWYgPSBnZW5fY2hhcl9wdHIobl9idWYsIDApOwogICAgICAgIGNvbnRlbnQgPSBnZW5feG1sRWxlbWVudENvbnRlbnRQdHIobl9jb250ZW50LCAxKTsKICAgICAgICBlbmdsb2IgPSBnZW5faW50KG5fZW5nbG9iLCAyKTsKCiAgICAgICAgeG1sU3ByaW50ZkVsZW1lbnRDb250ZW50KGJ1ZiwgY29udGVudCwgZW5nbG9iKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NoYXJfcHRyKG5fYnVmLCBidWYsIDApOwogICAgICAgIGRlc194bWxFbGVtZW50Q29udGVudFB0cihuX2NvbnRlbnQsIGNvbnRlbnQsIDEpOwogICAgICAgIGRlc19pbnQobl9lbmdsb2IsIGVuZ2xvYiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTcHJpbnRmRWxlbWVudENvbnRlbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5nbG9iKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkQnVpbGRDb250ZW50TW9kZWwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9SRUdFWFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIGEgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRWxlbWVudFB0ciBlbGVtOyAvKiBhbiBlbGVtZW50IGRlY2xhcmF0aW9uIG5vZGUgKi8KICAgIGludCBuX2VsZW07CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9lbGVtID0gMDtuX2VsZW0gPCBnZW5fbmJfeG1sRWxlbWVudFB0cjtuX2VsZW0rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBlbGVtID0gZ2VuX3htbEVsZW1lbnRQdHIobl9lbGVtLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFZhbGlkQnVpbGRDb250ZW50TW9kZWwoY3R4dCwgZWxlbSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxFbGVtZW50UHRyKG5fZWxlbSwgZWxlbSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZEJ1aWxkQ29udGVudE1vZGVsIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZWxlbSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkQ3R4dE5vcm1hbGl6ZUF0dHJpYnV0ZVZhbHVlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVkFMSURfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgb3IgTlVMTCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm9kZVB0ciBlbGVtOyAvKiB0aGUgcGFyZW50ICovCiAgICBpbnQgbl9lbGVtOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBhdHRyaWJ1dGUgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogdGhlIGF0dHJpYnV0ZSB2YWx1ZSAqLwogICAgaW50IG5fdmFsdWU7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9lbGVtKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CiAgICAgICAgZWxlbSA9IGdlbl94bWxOb2RlUHRyKG5fZWxlbSwgMik7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDMpOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDQpOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRDdHh0Tm9ybWFsaXplQXR0cmlidXRlVmFsdWUoY3R4dCwgZG9jLCBlbGVtLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9lbGVtLCBlbGVtLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDMpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCA0KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkQ3R4dE5vcm1hbGl6ZUF0dHJpYnV0ZVZhbHVlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKI2RlZmluZSBnZW5fbmJfeG1sRWxlbWVudENvbnRlbnRfcHRyIDEKc3RhdGljIHhtbEVsZW1lbnRDb250ZW50ICogZ2VuX3htbEVsZW1lbnRDb250ZW50X3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sRWxlbWVudENvbnRlbnRfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxFbGVtZW50Q29udGVudCAqIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWRHZXRQb3RlbnRpYWxDaGlsZHJlbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpCiNpZmRlZiBMSUJYTUxfVkFMSURfRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxFbGVtZW50Q29udGVudCAqIGN0cmVlOyAvKiBhbiBlbGVtZW50IGNvbnRlbnQgdHJlZSAqLwogICAgaW50IG5fY3RyZWU7CiAgICB4bWxDaGFyICoqIG5hbWVzOyAvKiBhbiBhcnJheSB0byBzdG9yZSB0aGUgbGlzdCBvZiBjaGlsZCBuYW1lcyAqLwogICAgaW50IG5fbmFtZXM7CiAgICBpbnQgKiBsZW47IC8qIGEgcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGVsZW1lbnQgaW4gdGhlIGxpc3QgKi8KICAgIGludCBuX2xlbjsKICAgIGludCBtYXg7IC8qIHRoZSBzaXplIG9mIHRoZSBhcnJheSAqLwogICAgaW50IG5fbWF4OwoKICAgIGZvciAobl9jdHJlZSA9IDA7bl9jdHJlZSA8IGdlbl9uYl94bWxFbGVtZW50Q29udGVudF9wdHI7bl9jdHJlZSsrKSB7CiAgICBmb3IgKG5fbmFtZXMgPSAwO25fbmFtZXMgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHJfcHRyO25fbmFtZXMrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50X3B0cjtuX2xlbisrKSB7CiAgICBmb3IgKG5fbWF4ID0gMDtuX21heCA8IGdlbl9uYl9pbnQ7bl9tYXgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3RyZWUgPSBnZW5feG1sRWxlbWVudENvbnRlbnRfcHRyKG5fY3RyZWUsIDApOwogICAgICAgIG5hbWVzID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyX3B0cihuX25hbWVzLCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50X3B0cihuX2xlbiwgMik7CiAgICAgICAgbWF4ID0gZ2VuX2ludChuX21heCwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZEdldFBvdGVudGlhbENoaWxkcmVuKGN0cmVlLCAoY29uc3QgeG1sQ2hhciAqKiluYW1lcywgbGVuLCBtYXgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxFbGVtZW50Q29udGVudF9wdHIobl9jdHJlZSwgY3RyZWUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cl9wdHIobl9uYW1lcywgKGNvbnN0IHhtbENoYXIgKiopbmFtZXMsIDEpOwogICAgICAgIGRlc19pbnRfcHRyKG5fbGVuLCBsZW4sIDIpOwogICAgICAgIGRlc19pbnQobl9tYXgsIG1heCwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZEdldFBvdGVudGlhbENoaWxkcmVuIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0cmVlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWVzKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9tYXgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWRHZXRWYWxpZEVsZW1lbnRzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVkFMSURfRU5BQkxFRCkKI2lmZGVmIExJQlhNTF9WQUxJRF9FTkFCTEVECiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbE5vZGUgKiBwcmV2OyAvKiBhbiBlbGVtZW50IHRvIGluc2VydCBhZnRlciAqLwogICAgaW50IG5fcHJldjsKICAgIHhtbE5vZGUgKiBuZXh0OyAvKiBhbiBlbGVtZW50IHRvIGluc2VydCBuZXh0ICovCiAgICBpbnQgbl9uZXh0OwogICAgeG1sQ2hhciAqKiBuYW1lczsgLyogYW4gYXJyYXkgdG8gc3RvcmUgdGhlIGxpc3Qgb2YgY2hpbGQgbmFtZXMgKi8KICAgIGludCBuX25hbWVzOwogICAgaW50IG1heDsgLyogdGhlIHNpemUgb2YgdGhlIGFycmF5ICovCiAgICBpbnQgbl9tYXg7CgogICAgZm9yIChuX3ByZXYgPSAwO25fcHJldiA8IGdlbl9uYl94bWxOb2RlUHRyO25fcHJldisrKSB7CiAgICBmb3IgKG5fbmV4dCA9IDA7bl9uZXh0IDwgZ2VuX25iX3htbE5vZGVQdHI7bl9uZXh0KyspIHsKICAgIGZvciAobl9uYW1lcyA9IDA7bl9uYW1lcyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cl9wdHI7bl9uYW1lcysrKSB7CiAgICBmb3IgKG5fbWF4ID0gMDtuX21heCA8IGdlbl9uYl9pbnQ7bl9tYXgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcHJldiA9IGdlbl94bWxOb2RlUHRyKG5fcHJldiwgMCk7CiAgICAgICAgbmV4dCA9IGdlbl94bWxOb2RlUHRyKG5fbmV4dCwgMSk7CiAgICAgICAgbmFtZXMgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHJfcHRyKG5fbmFtZXMsIDIpOwogICAgICAgIG1heCA9IGdlbl9pbnQobl9tYXgsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRHZXRWYWxpZEVsZW1lbnRzKHByZXYsIG5leHQsIChjb25zdCB4bWxDaGFyICoqKW5hbWVzLCBtYXgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fcHJldiwgcHJldiwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9uZXh0LCBuZXh0LCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHJfcHRyKG5fbmFtZXMsIChjb25zdCB4bWxDaGFyICoqKW5hbWVzLCAyKTsKICAgICAgICBkZXNfaW50KG5fbWF4LCBtYXgsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVmFsaWRHZXRWYWxpZEVsZW1lbnRzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZXYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmV4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lcyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9tYXgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWROb3JtYWxpemVBdHRyaWJ1dGVWYWx1ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm9kZVB0ciBlbGVtOyAvKiB0aGUgcGFyZW50ICovCiAgICBpbnQgbl9lbGVtOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBhdHRyaWJ1dGUgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogdGhlIGF0dHJpYnV0ZSB2YWx1ZSAqLwogICAgaW50IG5fdmFsdWU7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9lbGVtID0gMDtuX2VsZW0gPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2VsZW0rKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgZWxlbSA9IGdlbl94bWxOb2RlUHRyKG5fZWxlbSwgMSk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDIpOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWROb3JtYWxpemVBdHRyaWJ1dGVWYWx1ZShkb2MsIGVsZW0sIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fZWxlbSwgZWxlbSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZE5vcm1hbGl6ZUF0dHJpYnV0ZVZhbHVlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbGVtKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxWYWxpZGF0ZUF0dHJpYnV0ZURlY2wodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxWYWxpZEN0eHRQdHIgY3R4dDsgLyogdGhlIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIGEgZG9jdW1lbnQgaW5zdGFuY2UgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbEF0dHJpYnV0ZVB0ciBhdHRyOyAvKiBhbiBhdHRyaWJ1dGUgZGVmaW5pdGlvbiAqLwogICAgaW50IG5fYXR0cjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9hdHRyID0gMDtuX2F0dHIgPCBnZW5fbmJfeG1sQXR0cmlidXRlUHRyO25fYXR0cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwogICAgICAgIGF0dHIgPSBnZW5feG1sQXR0cmlidXRlUHRyKG5fYXR0ciwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZUF0dHJpYnV0ZURlY2woY3R4dCwgZG9jLCBhdHRyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICBkZXNfeG1sQXR0cmlidXRlUHRyKG5fYXR0ciwgYXR0ciwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZGF0ZUF0dHJpYnV0ZURlY2wiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYXR0cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkYXRlQXR0cmlidXRlVmFsdWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxBdHRyaWJ1dGVUeXBlIHR5cGU7IC8qIGFuIGF0dHJpYnV0ZSB0eXBlICovCiAgICBpbnQgbl90eXBlOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiBhbiBhdHRyaWJ1dGUgdmFsdWUgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl90eXBlID0gMDtuX3R5cGUgPCBnZW5fbmJfeG1sQXR0cmlidXRlVHlwZTtuX3R5cGUrKykgewogICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdHlwZSA9IGdlbl94bWxBdHRyaWJ1dGVUeXBlKG5fdHlwZSwgMCk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZUF0dHJpYnV0ZVZhbHVlKHR5cGUsIChjb25zdCB4bWxDaGFyICopdmFsdWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxBdHRyaWJ1dGVUeXBlKG5fdHlwZSwgdHlwZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVmFsaWRhdGVBdHRyaWJ1dGVWYWx1ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90eXBlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWRhdGVEb2N1bWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFZhbGlkQ3R4dFB0ciBjdHh0OyAvKiB0aGUgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRG9jUHRyIGRvYzsgLyogYSBkb2N1bWVudCBpbnN0YW5jZSAqLwogICAgaW50IG5fZG9jOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFZhbGlkYXRlRG9jdW1lbnQoY3R4dCwgZG9jKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkYXRlRG9jdW1lbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxWYWxpZGF0ZURvY3VtZW50RmluYWwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxWYWxpZEN0eHRQdHIgY3R4dDsgLyogdGhlIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIGEgZG9jdW1lbnQgaW5zdGFuY2UgKi8KICAgIGludCBuX2RvYzsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZURvY3VtZW50RmluYWwoY3R4dCwgZG9jKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkYXRlRG9jdW1lbnRGaW5hbCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkYXRlRHRkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVkFMSURfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiBhIGRvY3VtZW50IGluc3RhbmNlICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxEdGRQdHIgZHRkOyAvKiBhIGR0ZCBpbnN0YW5jZSAqLwogICAgaW50IG5fZHRkOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2R0ZCA9IDA7bl9kdGQgPCBnZW5fbmJfeG1sRHRkUHRyO25fZHRkKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CiAgICAgICAgZHRkID0gZ2VuX3htbER0ZFB0cihuX2R0ZCwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZUR0ZChjdHh0LCBkb2MsIGR0ZCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgZGVzX3htbER0ZFB0cihuX2R0ZCwgZHRkLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkYXRlRHRkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2R0ZCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkYXRlRHRkRmluYWwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxWYWxpZEN0eHRQdHIgY3R4dDsgLyogdGhlIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIGEgZG9jdW1lbnQgaW5zdGFuY2UgKi8KICAgIGludCBuX2RvYzsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZUR0ZEZpbmFsKGN0eHQsIGRvYyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZGF0ZUR0ZEZpbmFsIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWRhdGVFbGVtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVkFMSURfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiBhIGRvY3VtZW50IGluc3RhbmNlICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIGVsZW07IC8qIGFuIGVsZW1lbnQgaW5zdGFuY2UgKi8KICAgIGludCBuX2VsZW07CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9lbGVtKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CiAgICAgICAgZWxlbSA9IGdlbl94bWxOb2RlUHRyKG5fZWxlbSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZUVsZW1lbnQoY3R4dCwgZG9jLCBlbGVtKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2VsZW0sIGVsZW0sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVmFsaWRhdGVFbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxWYWxpZGF0ZUVsZW1lbnREZWNsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVkFMSURfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiBhIGRvY3VtZW50IGluc3RhbmNlICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxFbGVtZW50UHRyIGVsZW07IC8qIGFuIGVsZW1lbnQgZGVmaW5pdGlvbiAqLwogICAgaW50IG5fZWxlbTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9lbGVtID0gMDtuX2VsZW0gPCBnZW5fbmJfeG1sRWxlbWVudFB0cjtuX2VsZW0rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKICAgICAgICBlbGVtID0gZ2VuX3htbEVsZW1lbnRQdHIobl9lbGVtLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFZhbGlkYXRlRWxlbWVudERlY2woY3R4dCwgZG9jLCBlbGVtKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKICAgICAgICBkZXNfeG1sRWxlbWVudFB0cihuX2VsZW0sIGVsZW0sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVmFsaWRhdGVFbGVtZW50RGVjbCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbGVtKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWRhdGVOYW1lVmFsdWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIGFuIE5hbWUgdmFsdWUgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRhdGVOYW1lVmFsdWUoKGNvbnN0IHhtbENoYXIgKil2YWx1ZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVmFsaWRhdGVOYW1lVmFsdWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxWYWxpZGF0ZU5hbWVzVmFsdWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIGFuIE5hbWVzIHZhbHVlICovCiAgICBpbnQgbl92YWx1ZTsKCiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFZhbGlkYXRlTmFtZXNWYWx1ZSgoY29uc3QgeG1sQ2hhciAqKXZhbHVlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZGF0ZU5hbWVzVmFsdWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxWYWxpZGF0ZU5tdG9rZW5WYWx1ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogYW4gTm10b2tlbiB2YWx1ZSAqLwogICAgaW50IG5fdmFsdWU7CgogICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZU5tdG9rZW5WYWx1ZSgoY29uc3QgeG1sQ2hhciAqKXZhbHVlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZGF0ZU5tdG9rZW5WYWx1ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkYXRlTm10b2tlbnNWYWx1ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogYW4gTm10b2tlbnMgdmFsdWUgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRhdGVObXRva2Vuc1ZhbHVlKChjb25zdCB4bWxDaGFyICopdmFsdWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkYXRlTm10b2tlbnNWYWx1ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkYXRlTm90YXRpb25EZWNsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVkFMSURfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiBhIGRvY3VtZW50IGluc3RhbmNlICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb3RhdGlvblB0ciBub3RhOyAvKiBhIG5vdGF0aW9uIGRlZmluaXRpb24gKi8KICAgIGludCBuX25vdGE7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fbm90YSA9IDA7bl9ub3RhIDwgZ2VuX25iX3htbE5vdGF0aW9uUHRyO25fbm90YSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwogICAgICAgIG5vdGEgPSBnZW5feG1sTm90YXRpb25QdHIobl9ub3RhLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFZhbGlkYXRlTm90YXRpb25EZWNsKGN0eHQsIGRvYywgbm90YSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgZGVzX3htbE5vdGF0aW9uUHRyKG5fbm90YSwgbm90YSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZGF0ZU5vdGF0aW9uRGVjbCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub3RhKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWRhdGVOb3RhdGlvblVzZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpIHx8IGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbENoYXIgKiBub3RhdGlvbk5hbWU7IC8qIHRoZSBub3RhdGlvbiBuYW1lIHRvIGNoZWNrICovCiAgICBpbnQgbl9ub3RhdGlvbk5hbWU7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fbm90YXRpb25OYW1lID0gMDtuX25vdGF0aW9uTmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25vdGF0aW9uTmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwogICAgICAgIG5vdGF0aW9uTmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25vdGF0aW9uTmFtZSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZU5vdGF0aW9uVXNlKGN0eHQsIGRvYywgKGNvbnN0IHhtbENoYXIgKilub3RhdGlvbk5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25vdGF0aW9uTmFtZSwgKGNvbnN0IHhtbENoYXIgKilub3RhdGlvbk5hbWUsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVmFsaWRhdGVOb3RhdGlvblVzZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub3RhdGlvbk5hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxWYWxpZGF0ZU9uZUF0dHJpYnV0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFZhbGlkQ3R4dFB0ciBjdHh0OyAvKiB0aGUgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRG9jUHRyIGRvYzsgLyogYSBkb2N1bWVudCBpbnN0YW5jZSAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm9kZVB0ciBlbGVtOyAvKiBhbiBlbGVtZW50IGluc3RhbmNlICovCiAgICBpbnQgbl9lbGVtOwogICAgeG1sQXR0clB0ciBhdHRyOyAvKiBhbiBhdHRyaWJ1dGUgaW5zdGFuY2UgKi8KICAgIGludCBuX2F0dHI7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSBhdHRyaWJ1dGUgdmFsdWUgKHdpdGhvdXQgZW50aXRpZXMgcHJvY2Vzc2luZykgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2VsZW0gPSAwO25fZWxlbSA8IGdlbl9uYl94bWxOb2RlUHRyO25fZWxlbSsrKSB7CiAgICBmb3IgKG5fYXR0ciA9IDA7bl9hdHRyIDwgZ2VuX25iX3htbEF0dHJQdHI7bl9hdHRyKyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CiAgICAgICAgZWxlbSA9IGdlbl94bWxOb2RlUHRyKG5fZWxlbSwgMik7CiAgICAgICAgYXR0ciA9IGdlbl94bWxBdHRyUHRyKG5fYXR0ciwgMyk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgNCk7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZU9uZUF0dHJpYnV0ZShjdHh0LCBkb2MsIGVsZW0sIGF0dHIsIChjb25zdCB4bWxDaGFyICopdmFsdWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fZWxlbSwgZWxlbSwgMik7CiAgICAgICAgZGVzX3htbEF0dHJQdHIobl9hdHRyLCBhdHRyLCAzKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZGF0ZU9uZUF0dHJpYnV0ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbGVtKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2F0dHIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxWYWxpZGF0ZU9uZUVsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxWYWxpZEN0eHRQdHIgY3R4dDsgLyogdGhlIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIGEgZG9jdW1lbnQgaW5zdGFuY2UgKi8KICAgIGludCBuX2RvYzsKICAgIHhtbE5vZGVQdHIgZWxlbTsgLyogYW4gZWxlbWVudCBpbnN0YW5jZSAqLwogICAgaW50IG5fZWxlbTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9lbGVtID0gMDtuX2VsZW0gPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2VsZW0rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKICAgICAgICBlbGVtID0gZ2VuX3htbE5vZGVQdHIobl9lbGVtLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFZhbGlkYXRlT25lRWxlbWVudChjdHh0LCBkb2MsIGVsZW0pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fZWxlbSwgZWxlbSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZGF0ZU9uZUVsZW1lbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZWxlbSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkYXRlT25lTmFtZXNwYWNlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVkFMSURfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiBhIGRvY3VtZW50IGluc3RhbmNlICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIGVsZW07IC8qIGFuIGVsZW1lbnQgaW5zdGFuY2UgKi8KICAgIGludCBuX2VsZW07CiAgICB4bWxDaGFyICogcHJlZml4OyAvKiB0aGUgbmFtZXNwYWNlIHByZWZpeCAqLwogICAgaW50IG5fcHJlZml4OwogICAgeG1sTnNQdHIgbnM7IC8qIGFuIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBpbnN0YW5jZSAqLwogICAgaW50IG5fbnM7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSBhdHRyaWJ1dGUgdmFsdWUgKHdpdGhvdXQgZW50aXRpZXMgcHJvY2Vzc2luZykgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2VsZW0gPSAwO25fZWxlbSA8IGdlbl9uYl94bWxOb2RlUHRyO25fZWxlbSsrKSB7CiAgICBmb3IgKG5fcHJlZml4ID0gMDtuX3ByZWZpeCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ByZWZpeCsrKSB7CiAgICBmb3IgKG5fbnMgPSAwO25fbnMgPCBnZW5fbmJfeG1sTnNQdHI7bl9ucysrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwogICAgICAgIGVsZW0gPSBnZW5feG1sTm9kZVB0cihuX2VsZW0sIDIpOwogICAgICAgIHByZWZpeCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgMyk7CiAgICAgICAgbnMgPSBnZW5feG1sTnNQdHIobl9ucywgNCk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgNSk7CgogICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZU9uZU5hbWVzcGFjZShjdHh0LCBkb2MsIGVsZW0sIChjb25zdCB4bWxDaGFyICopcHJlZml4LCBucywgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9lbGVtLCBlbGVtLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCAzKTsKICAgICAgICBkZXNfeG1sTnNQdHIobl9ucywgbnMsIDQpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCA1KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkYXRlT25lTmFtZXNwYWNlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHJlZml4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25zKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWRhdGVQb3BFbGVtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVkFMSURfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfUkVHRVhQX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFZhbGlkQ3R4dFB0ciBjdHh0OyAvKiB0aGUgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRG9jUHRyIGRvYzsgLyogYSBkb2N1bWVudCBpbnN0YW5jZSAqLwogICAgaW50IG5fZG9jOwogICAgeG1sTm9kZVB0ciBlbGVtOyAvKiBhbiBlbGVtZW50IGluc3RhbmNlICovCiAgICBpbnQgbl9lbGVtOwogICAgeG1sQ2hhciAqIHFuYW1lOyAvKiB0aGUgcXVhbGlmaWVkIG5hbWUgYXMgYXBwZWFyaW5nIGluIHRoZSBzZXJpYWxpemF0aW9uICovCiAgICBpbnQgbl9xbmFtZTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgIGZvciAobl9lbGVtID0gMDtuX2VsZW0gPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2VsZW0rKykgewogICAgZm9yIChuX3FuYW1lID0gMDtuX3FuYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcW5hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKICAgICAgICBlbGVtID0gZ2VuX3htbE5vZGVQdHIobl9lbGVtLCAyKTsKICAgICAgICBxbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3FuYW1lLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFZhbGlkYXRlUG9wRWxlbWVudChjdHh0LCBkb2MsIGVsZW0sIChjb25zdCB4bWxDaGFyICopcW5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fZWxlbSwgZWxlbSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcW5hbWUsIChjb25zdCB4bWxDaGFyICopcW5hbWUsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVmFsaWRhdGVQb3BFbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcW5hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxWYWxpZGF0ZVB1c2hDRGF0YSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1ZBTElEX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX1JFR0VYUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxWYWxpZEN0eHRQdHIgY3R4dDsgLyogdGhlIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbENoYXIgKiBkYXRhOyAvKiBzb21lIGNoYXJhY3RlciBkYXRhIHJlYWQgKi8KICAgIGludCBuX2RhdGE7CiAgICBpbnQgbGVuOyAvKiB0aGUgbGVuZ2h0IG9mIHRoZSBkYXRhICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9kYXRhID0gMDtuX2RhdGEgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9kYXRhKyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGRhdGEgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9kYXRhLCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFZhbGlkYXRlUHVzaENEYXRhKGN0eHQsIChjb25zdCB4bWxDaGFyICopZGF0YSwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fZGF0YSwgKGNvbnN0IHhtbENoYXIgKilkYXRhLCAxKTsKICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVmFsaWRhdGVQdXNoQ0RhdGEiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFZhbGlkYXRlUHVzaEVsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9WQUxJRF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9SRUdFWFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiBhIGRvY3VtZW50IGluc3RhbmNlICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIGVsZW07IC8qIGFuIGVsZW1lbnQgaW5zdGFuY2UgKi8KICAgIGludCBuX2VsZW07CiAgICB4bWxDaGFyICogcW5hbWU7IC8qIHRoZSBxdWFsaWZpZWQgbmFtZSBhcyBhcHBlYXJpbmcgaW4gdGhlIHNlcmlhbGl6YXRpb24gKi8KICAgIGludCBuX3FuYW1lOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2VsZW0gPSAwO25fZWxlbSA8IGdlbl9uYl94bWxOb2RlUHRyO25fZWxlbSsrKSB7CiAgICBmb3IgKG5fcW5hbWUgPSAwO25fcW5hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9xbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwogICAgICAgIGVsZW0gPSBnZW5feG1sTm9kZVB0cihuX2VsZW0sIDIpOwogICAgICAgIHFuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcW5hbWUsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRhdGVQdXNoRWxlbWVudChjdHh0LCBkb2MsIGVsZW0sIChjb25zdCB4bWxDaGFyICopcW5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fZWxlbSwgZWxlbSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcW5hbWUsIChjb25zdCB4bWxDaGFyICopcW5hbWUsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVmFsaWRhdGVQdXNoRWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbGVtKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3FuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVmFsaWRhdGVSb290KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVkFMSURfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiBhIGRvY3VtZW50IGluc3RhbmNlICovCiAgICBpbnQgbl9kb2M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVmFsaWRhdGVSb290KGN0eHQsIGRvYyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZGF0ZVJvb3QiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3ZhbGlkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyB2YWxpZCA6IDUwIG9mIDcwIGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBZGRBdHRyaWJ1dGVEZWNsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEFkZEVsZW1lbnREZWNsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEFkZElEKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEFkZE5vdGF0aW9uRGVjbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBZGRSZWYoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ29weUF0dHJpYnV0ZVRhYmxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENvcHlEb2NFbGVtZW50Q29udGVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDb3B5RWxlbWVudENvbnRlbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ29weUVsZW1lbnRUYWJsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDb3B5RW51bWVyYXRpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ29weU5vdGF0aW9uVGFibGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ3JlYXRlRW51bWVyYXRpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRHVtcEF0dHJpYnV0ZURlY2woKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRHVtcEF0dHJpYnV0ZVRhYmxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbER1bXBFbGVtZW50RGVjbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxEdW1wRWxlbWVudFRhYmxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbER1bXBOb3RhdGlvbkRlY2woKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRHVtcE5vdGF0aW9uVGFibGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0RHRkQXR0ckRlc2MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0RHRkRWxlbWVudERlc2MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0RHRkTm90YXRpb25EZXNjKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEdldER0ZFFBdHRyRGVzYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxHZXREdGRRRWxlbWVudERlc2MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0SUQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sR2V0UmVmcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxJc0lEKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbElzTWl4ZWRFbGVtZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbElzUmVmKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld0RvY0VsZW1lbnRDb250ZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld0VsZW1lbnRDb250ZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld1ZhbGlkQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZW1vdmVJRCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZW1vdmVSZWYoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU25wcmludGZFbGVtZW50Q29udGVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTcHJpbnRmRWxlbWVudENvbnRlbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVmFsaWRCdWlsZENvbnRlbnRNb2RlbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZEN0eHROb3JtYWxpemVBdHRyaWJ1dGVWYWx1ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZEdldFBvdGVudGlhbENoaWxkcmVuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFZhbGlkR2V0VmFsaWRFbGVtZW50cygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZE5vcm1hbGl6ZUF0dHJpYnV0ZVZhbHVlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFZhbGlkYXRlQXR0cmlidXRlRGVjbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZGF0ZUF0dHJpYnV0ZVZhbHVlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFZhbGlkYXRlRG9jdW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVmFsaWRhdGVEb2N1bWVudEZpbmFsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFZhbGlkYXRlRHRkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFZhbGlkYXRlRHRkRmluYWwoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVmFsaWRhdGVFbGVtZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFZhbGlkYXRlRWxlbWVudERlY2woKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVmFsaWRhdGVOYW1lVmFsdWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVmFsaWRhdGVOYW1lc1ZhbHVlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFZhbGlkYXRlTm10b2tlblZhbHVlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFZhbGlkYXRlTm10b2tlbnNWYWx1ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZGF0ZU5vdGF0aW9uRGVjbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZGF0ZU5vdGF0aW9uVXNlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFZhbGlkYXRlT25lQXR0cmlidXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFZhbGlkYXRlT25lRWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZGF0ZU9uZU5hbWVzcGFjZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZGF0ZVBvcEVsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVmFsaWRhdGVQdXNoQ0RhdGEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVmFsaWRhdGVQdXNoRWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxWYWxpZGF0ZVJvb3QoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIHZhbGlkOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxYSW5jbHVkZU5ld0NvbnRleHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWEluY2x1ZGVQcm9jZXNzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWElOQ0xVREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogYW4gWE1MIGRvY3VtZW50ICovCiAgICBpbnQgbl9kb2M7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWEluY2x1ZGVQcm9jZXNzKGRvYyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhJbmNsdWRlUHJvY2VzcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYSW5jbHVkZVByb2Nlc3NGbGFncyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hJTkNMVURFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIGFuIFhNTCBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgaW50IGZsYWdzOyAvKiBhIHNldCBvZiB4bWxQYXJzZXJPcHRpb24gdXNlZCBmb3IgcGFyc2luZyBYTUwgaW5jbHVkZXMgKi8KICAgIGludCBuX2ZsYWdzOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fZmxhZ3MgPSAwO25fZmxhZ3MgPCBnZW5fbmJfaW50O25fZmxhZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CiAgICAgICAgZmxhZ3MgPSBnZW5faW50KG5fZmxhZ3MsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWEluY2x1ZGVQcm9jZXNzRmxhZ3MoZG9jLCBmbGFncyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfaW50KG5fZmxhZ3MsIGZsYWdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhJbmNsdWRlUHJvY2Vzc0ZsYWdzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mbGFncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhJbmNsdWRlUHJvY2Vzc0ZsYWdzRGF0YSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hJTkNMVURFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbERvY1B0ciBkb2M7IC8qIGFuIFhNTCBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwogICAgaW50IGZsYWdzOyAvKiBhIHNldCBvZiB4bWxQYXJzZXJPcHRpb24gdXNlZCBmb3IgcGFyc2luZyBYTUwgaW5jbHVkZXMgKi8KICAgIGludCBuX2ZsYWdzOwogICAgdm9pZCAqIGRhdGE7IC8qIGFwcGxpY2F0aW9uIGRhdGEgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgcGFyc2VyIGNvbnRleHQgaW4gdGhlIF9wcml2YXRlIGZpZWxkIG9mIHRoZSBwYXJzZXIgY29udGV4dChzKSAqLwogICAgaW50IG5fZGF0YTsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgZm9yIChuX2ZsYWdzID0gMDtuX2ZsYWdzIDwgZ2VuX25iX2ludDtuX2ZsYWdzKyspIHsKICAgIGZvciAobl9kYXRhID0gMDtuX2RhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl9kYXRhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwogICAgICAgIGZsYWdzID0gZ2VuX2ludChuX2ZsYWdzLCAxKTsKICAgICAgICBkYXRhID0gZ2VuX3VzZXJkYXRhKG5fZGF0YSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxYSW5jbHVkZVByb2Nlc3NGbGFnc0RhdGEoZG9jLCBmbGFncywgZGF0YSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfaW50KG5fZmxhZ3MsIGZsYWdzLCAxKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl9kYXRhLCBkYXRhLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhJbmNsdWRlUHJvY2Vzc0ZsYWdzRGF0YSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmxhZ3MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgojaWZkZWYgTElCWE1MX1hJTkNMVURFX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbFhJbmNsdWRlQ3R4dFB0ciAxCnN0YXRpYyB4bWxYSW5jbHVkZUN0eHRQdHIgZ2VuX3htbFhJbmNsdWRlQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sWEluY2x1ZGVDdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxYSW5jbHVkZUN0eHRQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgoKc3RhdGljIGludAp0ZXN0X3htbFhJbmNsdWRlUHJvY2Vzc05vZGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YSU5DTFVERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxYSW5jbHVkZUN0eHRQdHIgY3R4dDsgLyogYW4gZXhpc3RpbmcgWEluY2x1ZGUgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogYSBub2RlIGluIGFuIFhNTCBkb2N1bWVudCAqLwogICAgaW50IG5fbm9kZTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhJbmNsdWRlQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhJbmNsdWRlQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWEluY2x1ZGVQcm9jZXNzTm9kZShjdHh0LCBub2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWEluY2x1ZGVDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhJbmNsdWRlUHJvY2Vzc05vZGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWEluY2x1ZGVQcm9jZXNzVHJlZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hJTkNMVURFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgdHJlZTsgLyogYSBub2RlIGluIGFuIFhNTCBkb2N1bWVudCAqLwogICAgaW50IG5fdHJlZTsKCiAgICBmb3IgKG5fdHJlZSA9IDA7bl90cmVlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl90cmVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHRyZWUgPSBnZW5feG1sTm9kZVB0cihuX3RyZWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWEluY2x1ZGVQcm9jZXNzVHJlZSh0cmVlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX3RyZWUsIHRyZWUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWEluY2x1ZGVQcm9jZXNzVHJlZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90cmVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWEluY2x1ZGVQcm9jZXNzVHJlZUZsYWdzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWElOQ0xVREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sTm9kZVB0ciB0cmVlOyAvKiBhIG5vZGUgaW4gYW4gWE1MIGRvY3VtZW50ICovCiAgICBpbnQgbl90cmVlOwogICAgaW50IGZsYWdzOyAvKiBhIHNldCBvZiB4bWxQYXJzZXJPcHRpb24gdXNlZCBmb3IgcGFyc2luZyBYTUwgaW5jbHVkZXMgKi8KICAgIGludCBuX2ZsYWdzOwoKICAgIGZvciAobl90cmVlID0gMDtuX3RyZWUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX3RyZWUrKykgewogICAgZm9yIChuX2ZsYWdzID0gMDtuX2ZsYWdzIDwgZ2VuX25iX2ludDtuX2ZsYWdzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHRyZWUgPSBnZW5feG1sTm9kZVB0cihuX3RyZWUsIDApOwogICAgICAgIGZsYWdzID0gZ2VuX2ludChuX2ZsYWdzLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhJbmNsdWRlUHJvY2Vzc1RyZWVGbGFncyh0cmVlLCBmbGFncyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl90cmVlLCB0cmVlLCAwKTsKICAgICAgICBkZXNfaW50KG5fZmxhZ3MsIGZsYWdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhJbmNsdWRlUHJvY2Vzc1RyZWVGbGFncyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90cmVlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZsYWdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWEluY2x1ZGVQcm9jZXNzVHJlZUZsYWdzRGF0YSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hJTkNMVURFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgdHJlZTsgLyogYW4gWE1MIG5vZGUgKi8KICAgIGludCBuX3RyZWU7CiAgICBpbnQgZmxhZ3M7IC8qIGEgc2V0IG9mIHhtbFBhcnNlck9wdGlvbiB1c2VkIGZvciBwYXJzaW5nIFhNTCBpbmNsdWRlcyAqLwogICAgaW50IG5fZmxhZ3M7CiAgICB2b2lkICogZGF0YTsgLyogYXBwbGljYXRpb24gZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBwYXJzZXIgY29udGV4dCBpbiB0aGUgX3ByaXZhdGUgZmllbGQgb2YgdGhlIHBhcnNlciBjb250ZXh0KHMpICovCiAgICBpbnQgbl9kYXRhOwoKICAgIGZvciAobl90cmVlID0gMDtuX3RyZWUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX3RyZWUrKykgewogICAgZm9yIChuX2ZsYWdzID0gMDtuX2ZsYWdzIDwgZ2VuX25iX2ludDtuX2ZsYWdzKyspIHsKICAgIGZvciAobl9kYXRhID0gMDtuX2RhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl9kYXRhKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHRyZWUgPSBnZW5feG1sTm9kZVB0cihuX3RyZWUsIDApOwogICAgICAgIGZsYWdzID0gZ2VuX2ludChuX2ZsYWdzLCAxKTsKICAgICAgICBkYXRhID0gZ2VuX3VzZXJkYXRhKG5fZGF0YSwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxYSW5jbHVkZVByb2Nlc3NUcmVlRmxhZ3NEYXRhKHRyZWUsIGZsYWdzLCBkYXRhKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX3RyZWUsIHRyZWUsIDApOwogICAgICAgIGRlc19pbnQobl9mbGFncywgZmxhZ3MsIDEpOwogICAgICAgIGRlc191c2VyZGF0YShuX2RhdGEsIGRhdGEsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWEluY2x1ZGVQcm9jZXNzVHJlZUZsYWdzRGF0YSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90cmVlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZsYWdzKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RhdGEpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYSW5jbHVkZVNldEZsYWdzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWElOQ0xVREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sWEluY2x1ZGVDdHh0UHRyIGN0eHQ7IC8qIGFuIFhJbmNsdWRlIHByb2Nlc3NpbmcgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBmbGFnczsgLyogYSBzZXQgb2YgeG1sUGFyc2VyT3B0aW9uIHVzZWQgZm9yIHBhcnNpbmcgWE1MIGluY2x1ZGVzICovCiAgICBpbnQgbl9mbGFnczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhJbmNsdWRlQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2ZsYWdzID0gMDtuX2ZsYWdzIDwgZ2VuX25iX2ludDtuX2ZsYWdzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWEluY2x1ZGVDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZmxhZ3MgPSBnZW5faW50KG5fZmxhZ3MsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWEluY2x1ZGVTZXRGbGFncyhjdHh0LCBmbGFncyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhJbmNsdWRlQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9mbGFncywgZmxhZ3MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWEluY2x1ZGVTZXRGbGFncyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZsYWdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94aW5jbHVkZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgeGluY2x1ZGUgOiA4IG9mIDEwIGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYSW5jbHVkZU5ld0NvbnRleHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWEluY2x1ZGVQcm9jZXNzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhJbmNsdWRlUHJvY2Vzc0ZsYWdzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhJbmNsdWRlUHJvY2Vzc0ZsYWdzRGF0YSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYSW5jbHVkZVByb2Nlc3NOb2RlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhJbmNsdWRlUHJvY2Vzc1RyZWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWEluY2x1ZGVQcm9jZXNzVHJlZUZsYWdzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhJbmNsdWRlUHJvY2Vzc1RyZWVGbGFnc0RhdGEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWEluY2x1ZGVTZXRGbGFncygpOwoKICAgIGlmICh0ZXN0X3JldCAhPSAwKQoJcHJpbnRmKCJNb2R1bGUgeGluY2x1ZGU6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbEFsbG9jT3V0cHV0QnVmZmVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxPdXRwdXRCdWZmZXJQdHIgcmV0X3ZhbDsKICAgIHhtbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIgZW5jb2RlcjsgLyogdGhlIGVuY29kaW5nIGNvbnZlcnRlciBvciBOVUxMICovCiAgICBpbnQgbl9lbmNvZGVyOwoKICAgIGZvciAobl9lbmNvZGVyID0gMDtuX2VuY29kZXIgPCBnZW5fbmJfeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0cjtuX2VuY29kZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZW5jb2RlciA9IGdlbl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyKG5fZW5jb2RlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxBbGxvY091dHB1dEJ1ZmZlcihlbmNvZGVyKTsKICAgICAgICBkZXNyZXRfeG1sT3V0cHV0QnVmZmVyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0cihuX2VuY29kZXIsIGVuY29kZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQWxsb2NPdXRwdXRCdWZmZXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2Rlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEFsbG9jUGFyc2VySW5wdXRCdWZmZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJJbnB1dEJ1ZmZlclB0ciByZXRfdmFsOwogICAgeG1sQ2hhckVuY29kaW5nIGVuYzsgLyogdGhlIGNoYXJzZXQgZW5jb2RpbmcgaWYga25vd24gKi8KICAgIGludCBuX2VuYzsKCiAgICBmb3IgKG5fZW5jID0gMDtuX2VuYyA8IGdlbl9uYl94bWxDaGFyRW5jb2Rpbmc7bl9lbmMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZW5jID0gZ2VuX3htbENoYXJFbmNvZGluZyhuX2VuYywgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxBbGxvY1BhcnNlcklucHV0QnVmZmVyKGVuYyk7CiAgICAgICAgZGVzcmV0X3htbFBhcnNlcklucHV0QnVmZmVyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQ2hhckVuY29kaW5nKG5fZW5jLCBlbmMsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQWxsb2NQYXJzZXJJbnB1dEJ1ZmZlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENoZWNrRmlsZW5hbWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGNoYXIgKiBwYXRoOyAvKiB0aGUgcGF0aCB0byBjaGVjayAqLwogICAgaW50IG5fcGF0aDsKCiAgICBmb3IgKG5fcGF0aCA9IDA7bl9wYXRoIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fcGF0aCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBwYXRoID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fcGF0aCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxDaGVja0ZpbGVuYW1lKChjb25zdCBjaGFyICopcGF0aCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fcGF0aCwgKGNvbnN0IGNoYXIgKilwYXRoLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENoZWNrRmlsZW5hbWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcGF0aCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ2hlY2tIVFRQSW5wdXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJJbnB1dFB0ciByZXRfdmFsOwogICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxQYXJzZXJJbnB1dFB0ciByZXQ7IC8qIGFuIFhNTCBwYXJzZXIgaW5wdXQgKi8KICAgIGludCBuX3JldDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9yZXQgPSAwO25fcmV0IDwgZ2VuX25iX3htbFBhcnNlcklucHV0UHRyO25fcmV0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIHJldCA9IGdlbl94bWxQYXJzZXJJbnB1dFB0cihuX3JldCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxDaGVja0hUVFBJbnB1dChjdHh0LCByZXQpOwogICAgICAgIGRlc3JldF94bWxQYXJzZXJJbnB1dFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sUGFyc2VySW5wdXRQdHIobl9yZXQsIHJldCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDaGVja0hUVFBJbnB1dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JldCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQ2xlYW51cElucHV0Q2FsbGJhY2tzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwoKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwoKICAgICAgICB4bWxDbGVhbnVwSW5wdXRDYWxsYmFja3MoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDbGVhbnVwSW5wdXRDYWxsYmFja3MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbENsZWFudXBPdXRwdXRDYWxsYmFja3Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKCiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKCiAgICAgICAgeG1sQ2xlYW51cE91dHB1dENhbGxiYWNrcygpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENsZWFudXBPdXRwdXRDYWxsYmFja3MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxGaWxlQ2xvc2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHZvaWQgKiBjb250ZXh0OyAvKiB0aGUgSS9PIGNvbnRleHQgKi8KICAgIGludCBuX2NvbnRleHQ7CgogICAgZm9yIChuX2NvbnRleHQgPSAwO25fY29udGV4dCA8IGdlbl9uYl92b2lkX3B0cjtuX2NvbnRleHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29udGV4dCA9IGdlbl92b2lkX3B0cihuX2NvbnRleHQsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sRmlsZUNsb3NlKGNvbnRleHQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2NvbnRleHQsIGNvbnRleHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRmlsZUNsb3NlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRleHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEZpbGVNYXRjaCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgVVJJIGZvciBtYXRjaGluZyAqLwogICAgaW50IG5fZmlsZW5hbWU7CgogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVwYXRoO25fZmlsZW5hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZXBhdGgobl9maWxlbmFtZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxGaWxlTWF0Y2goZmlsZW5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxGaWxlTWF0Y2giLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEZpbGVPcGVuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIHJldF92YWw7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBVUkkgZm9yIG1hdGNoaW5nICovCiAgICBpbnQgbl9maWxlbmFtZTsKCiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlcGF0aChuX2ZpbGVuYW1lLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEZpbGVPcGVuKGZpbGVuYW1lKTsKICAgICAgICBkZXNyZXRfdm9pZF9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxGaWxlT3BlbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRmlsZVJlYWQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHZvaWQgKiBjb250ZXh0OyAvKiB0aGUgSS9PIGNvbnRleHQgKi8KICAgIGludCBuX2NvbnRleHQ7CiAgICBjaGFyICogYnVmZmVyOyAvKiB3aGVyZSB0byBkcm9wIGRhdGEgKi8KICAgIGludCBuX2J1ZmZlcjsKICAgIGludCBsZW47IC8qIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9jb250ZXh0ID0gMDtuX2NvbnRleHQgPCBnZW5fbmJfdm9pZF9wdHI7bl9jb250ZXh0KyspIHsKICAgIGZvciAobl9idWZmZXIgPSAwO25fYnVmZmVyIDwgZ2VuX25iX2NoYXJfcHRyO25fYnVmZmVyKyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb250ZXh0ID0gZ2VuX3ZvaWRfcHRyKG5fY29udGV4dCwgMCk7CiAgICAgICAgYnVmZmVyID0gZ2VuX2NoYXJfcHRyKG5fYnVmZmVyLCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEZpbGVSZWFkKGNvbnRleHQsIGJ1ZmZlciwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jb250ZXh0LCBjb250ZXh0LCAwKTsKICAgICAgICBkZXNfY2hhcl9wdHIobl9idWZmZXIsIGJ1ZmZlciwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEZpbGVSZWFkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRleHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmZmVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSU9GVFBDbG9zZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0ZUUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB2b2lkICogY29udGV4dDsgLyogdGhlIEkvTyBjb250ZXh0ICovCiAgICBpbnQgbl9jb250ZXh0OwoKICAgIGZvciAobl9jb250ZXh0ID0gMDtuX2NvbnRleHQgPCBnZW5fbmJfdm9pZF9wdHI7bl9jb250ZXh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvbnRleHQgPSBnZW5fdm9pZF9wdHIobl9jb250ZXh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbElPRlRQQ2xvc2UoY29udGV4dCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY29udGV4dCwgY29udGV4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxJT0ZUUENsb3NlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRleHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJT0ZUUE1hdGNoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfRlRQX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIFVSSSBmb3IgbWF0Y2hpbmcgKi8KICAgIGludCBuX2ZpbGVuYW1lOwoKICAgIGZvciAobl9maWxlbmFtZSA9IDA7bl9maWxlbmFtZSA8IGdlbl9uYl9maWxlcGF0aDtuX2ZpbGVuYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sSU9GVFBNYXRjaChmaWxlbmFtZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbElPRlRQTWF0Y2giLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJT0ZUUE9wZW4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9GVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgVVJJIGZvciBtYXRjaGluZyAqLwogICAgaW50IG5fZmlsZW5hbWU7CgogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVwYXRoO25fZmlsZW5hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZXBhdGgobl9maWxlbmFtZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxJT0ZUUE9wZW4oZmlsZW5hbWUpOwogICAgICAgIGRlc3JldF92b2lkX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbElPRlRQT3BlbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbElPRlRQUmVhZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0ZUUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB2b2lkICogY29udGV4dDsgLyogdGhlIEkvTyBjb250ZXh0ICovCiAgICBpbnQgbl9jb250ZXh0OwogICAgY2hhciAqIGJ1ZmZlcjsgLyogd2hlcmUgdG8gZHJvcCBkYXRhICovCiAgICBpbnQgbl9idWZmZXI7CiAgICBpbnQgbGVuOyAvKiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fY29udGV4dCA9IDA7bl9jb250ZXh0IDwgZ2VuX25iX3ZvaWRfcHRyO25fY29udGV4dCsrKSB7CiAgICBmb3IgKG5fYnVmZmVyID0gMDtuX2J1ZmZlciA8IGdlbl9uYl9jaGFyX3B0cjtuX2J1ZmZlcisrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29udGV4dCA9IGdlbl92b2lkX3B0cihuX2NvbnRleHQsIDApOwogICAgICAgIGJ1ZmZlciA9IGdlbl9jaGFyX3B0cihuX2J1ZmZlciwgMSk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxJT0ZUUFJlYWQoY29udGV4dCwgYnVmZmVyLCBsZW4pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2NvbnRleHQsIGNvbnRleHQsIDApOwogICAgICAgIGRlc19jaGFyX3B0cihuX2J1ZmZlciwgYnVmZmVyLCAxKTsKICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSU9GVFBSZWFkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRleHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmZmVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbElPSFRUUENsb3NlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRUUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB2b2lkICogY29udGV4dDsgLyogdGhlIEkvTyBjb250ZXh0ICovCiAgICBpbnQgbl9jb250ZXh0OwoKICAgIGZvciAobl9jb250ZXh0ID0gMDtuX2NvbnRleHQgPCBnZW5fbmJfdm9pZF9wdHI7bl9jb250ZXh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvbnRleHQgPSBnZW5fdm9pZF9wdHIobl9jb250ZXh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbElPSFRUUENsb3NlKGNvbnRleHQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX2NvbnRleHQsIGNvbnRleHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSU9IVFRQQ2xvc2UiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGV4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbElPSFRUUE1hdGNoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRUUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBVUkkgZm9yIG1hdGNoaW5nICovCiAgICBpbnQgbl9maWxlbmFtZTsKCiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlcGF0aChuX2ZpbGVuYW1lLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbElPSFRUUE1hdGNoKGZpbGVuYW1lKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZXBhdGgobl9maWxlbmFtZSwgZmlsZW5hbWUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sSU9IVFRQTWF0Y2giLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxJT0hUVFBPcGVuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfSFRUUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIHJldF92YWw7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIHRoZSBVUkkgZm9yIG1hdGNoaW5nICovCiAgICBpbnQgbl9maWxlbmFtZTsKCiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlcGF0aChuX2ZpbGVuYW1lLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbElPSFRUUE9wZW4oZmlsZW5hbWUpOwogICAgICAgIGRlc3JldF94bWxOYW5vSFRUUEN0eHRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxJT0hUVFBPcGVuIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGVuYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sSU9IVFRQUmVhZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX0hUVFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdm9pZCAqIGNvbnRleHQ7IC8qIHRoZSBJL08gY29udGV4dCAqLwogICAgaW50IG5fY29udGV4dDsKICAgIGNoYXIgKiBidWZmZXI7IC8qIHdoZXJlIHRvIGRyb3AgZGF0YSAqLwogICAgaW50IG5fYnVmZmVyOwogICAgaW50IGxlbjsgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX2NvbnRleHQgPSAwO25fY29udGV4dCA8IGdlbl9uYl92b2lkX3B0cjtuX2NvbnRleHQrKykgewogICAgZm9yIChuX2J1ZmZlciA9IDA7bl9idWZmZXIgPCBnZW5fbmJfY2hhcl9wdHI7bl9idWZmZXIrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvbnRleHQgPSBnZW5fdm9pZF9wdHIobl9jb250ZXh0LCAwKTsKICAgICAgICBidWZmZXIgPSBnZW5fY2hhcl9wdHIobl9idWZmZXIsIDEpOwogICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sSU9IVFRQUmVhZChjb250ZXh0LCBidWZmZXIsIGxlbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY29udGV4dCwgY29udGV4dCwgMCk7CiAgICAgICAgZGVzX2NoYXJfcHRyKG5fYnVmZmVyLCBidWZmZXIsIDEpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxJT0hUVFBSZWFkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRleHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmZmVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE5vTmV0RXh0ZXJuYWxFbnRpdHlMb2FkZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJJbnB1dFB0ciByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIFVSTDsgLyogdGhlIFVSTCBmb3IgdGhlIGVudGl0eSB0byBsb2FkICovCiAgICBpbnQgbl9VUkw7CiAgICBjaGFyICogSUQ7IC8qIHRoZSBTeXN0ZW0gSUQgZm9yIHRoZSBlbnRpdHkgdG8gbG9hZCAqLwogICAgaW50IG5fSUQ7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBlbnRpdHkgaXMgY2FsbGVkIG9yIE5VTEwgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX1VSTCA9IDA7bl9VUkwgPCBnZW5fbmJfZmlsZXBhdGg7bl9VUkwrKykgewogICAgZm9yIChuX0lEID0gMDtuX0lEIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fSUQrKykgewogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBVUkwgPSBnZW5fZmlsZXBhdGgobl9VUkwsIDApOwogICAgICAgIElEID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fSUQsIDEpOwogICAgICAgIGN0eHQgPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sTm9OZXRFeHRlcm5hbEVudGl0eUxvYWRlcihVUkwsIChjb25zdCBjaGFyICopSUQsIGN0eHQpOwogICAgICAgIGRlc3JldF94bWxQYXJzZXJJbnB1dFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fVVJMLCBVUkwsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX0lELCAoY29uc3QgY2hhciAqKUlELCAxKTsKICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTm9OZXRFeHRlcm5hbEVudGl0eUxvYWRlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fSUQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTm9ybWFsaXplV2luZG93c1BhdGgodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBwYXRoOyAvKiB0aGUgaW5wdXQgZmlsZSBwYXRoICovCiAgICBpbnQgbl9wYXRoOwoKICAgIGZvciAobl9wYXRoID0gMDtuX3BhdGggPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wYXRoKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHBhdGggPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wYXRoLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5vcm1hbGl6ZVdpbmRvd3NQYXRoKChjb25zdCB4bWxDaGFyICopcGF0aCk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wYXRoLCAoY29uc3QgeG1sQ2hhciAqKXBhdGgsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTm9ybWFsaXplV2luZG93c1BhdGgiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcGF0aCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sT3V0cHV0QnVmZmVyQ3JlYXRlQnVmZmVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxPdXRwdXRCdWZmZXJQdHIgcmV0X3ZhbDsKICAgIHhtbEJ1ZmZlclB0ciBidWZmZXI7IC8qIGEgeG1sQnVmZmVyUHRyICovCiAgICBpbnQgbl9idWZmZXI7CiAgICB4bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyIGVuY29kZXI7IC8qIHRoZSBlbmNvZGluZyBjb252ZXJ0ZXIgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2RlcjsKCiAgICBmb3IgKG5fYnVmZmVyID0gMDtuX2J1ZmZlciA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWZmZXIrKykgewogICAgZm9yIChuX2VuY29kZXIgPSAwO25fZW5jb2RlciA8IGdlbl9uYl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyO25fZW5jb2RlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWZmZXIgPSBnZW5feG1sQnVmZmVyUHRyKG5fYnVmZmVyLCAwKTsKICAgICAgICBlbmNvZGVyID0gZ2VuX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIobl9lbmNvZGVyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE91dHB1dEJ1ZmZlckNyZWF0ZUJ1ZmZlcihidWZmZXIsIGVuY29kZXIpOwogICAgICAgIGRlc3JldF94bWxPdXRwdXRCdWZmZXJQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9idWZmZXIsIGJ1ZmZlciwgMCk7CiAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIobl9lbmNvZGVyLCBlbmNvZGVyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE91dHB1dEJ1ZmZlckNyZWF0ZUJ1ZmZlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWZmZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2Rlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE91dHB1dEJ1ZmZlckNyZWF0ZUZkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxPdXRwdXRCdWZmZXJQdHIgcmV0X3ZhbDsKICAgIGludCBmZDsgLyogYSBmaWxlIGRlc2NyaXB0b3IgbnVtYmVyICovCiAgICBpbnQgbl9mZDsKICAgIHhtbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIgZW5jb2RlcjsgLyogdGhlIGVuY29kaW5nIGNvbnZlcnRlciBvciBOVUxMICovCiAgICBpbnQgbl9lbmNvZGVyOwoKICAgIGZvciAobl9mZCA9IDA7bl9mZCA8IGdlbl9uYl9pbnQ7bl9mZCsrKSB7CiAgICBmb3IgKG5fZW5jb2RlciA9IDA7bl9lbmNvZGVyIDwgZ2VuX25iX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHI7bl9lbmNvZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZkID0gZ2VuX2ludChuX2ZkLCAwKTsKICAgICAgICBlbmNvZGVyID0gZ2VuX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIobl9lbmNvZGVyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE91dHB1dEJ1ZmZlckNyZWF0ZUZkKGZkLCBlbmNvZGVyKTsKICAgICAgICBkZXNyZXRfeG1sT3V0cHV0QnVmZmVyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fZmQsIGZkLCAwKTsKICAgICAgICBkZXNfeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0cihuX2VuY29kZXIsIGVuY29kZXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sT3V0cHV0QnVmZmVyQ3JlYXRlRmQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2Rlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE91dHB1dEJ1ZmZlckNyZWF0ZUZpbGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE91dHB1dEJ1ZmZlclB0ciByZXRfdmFsOwogICAgRklMRSAqIGZpbGU7IC8qIGEgRklMRSogKi8KICAgIGludCBuX2ZpbGU7CiAgICB4bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyIGVuY29kZXI7IC8qIHRoZSBlbmNvZGluZyBjb252ZXJ0ZXIgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2RlcjsKCiAgICBmb3IgKG5fZmlsZSA9IDA7bl9maWxlIDwgZ2VuX25iX0ZJTEVfcHRyO25fZmlsZSsrKSB7CiAgICBmb3IgKG5fZW5jb2RlciA9IDA7bl9lbmNvZGVyIDwgZ2VuX25iX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHI7bl9lbmNvZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZpbGUgPSBnZW5fRklMRV9wdHIobl9maWxlLCAwKTsKICAgICAgICBlbmNvZGVyID0gZ2VuX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIobl9lbmNvZGVyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE91dHB1dEJ1ZmZlckNyZWF0ZUZpbGUoZmlsZSwgZW5jb2Rlcik7CiAgICAgICAgZGVzcmV0X3htbE91dHB1dEJ1ZmZlclB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX0ZJTEVfcHRyKG5fZmlsZSwgZmlsZSwgMCk7CiAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIobl9lbmNvZGVyLCBlbmNvZGVyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE91dHB1dEJ1ZmZlckNyZWF0ZUZpbGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sT3V0cHV0QnVmZmVyQ3JlYXRlRmlsZW5hbWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE91dHB1dEJ1ZmZlclB0ciByZXRfdmFsOwogICAgY29uc3QgY2hhciAqIFVSSTsgLyogYSBDIHN0cmluZyBjb250YWluaW5nIHRoZSBVUkkgb3IgZmlsZW5hbWUgKi8KICAgIGludCBuX1VSSTsKICAgIHhtbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIgZW5jb2RlcjsgLyogdGhlIGVuY29kaW5nIGNvbnZlcnRlciBvciBOVUxMICovCiAgICBpbnQgbl9lbmNvZGVyOwogICAgaW50IGNvbXByZXNzaW9uOyAvKiB0aGUgY29tcHJlc3Npb24gcmF0aW9uICgwIG5vbmUsIDkgbWF4KS4gKi8KICAgIGludCBuX2NvbXByZXNzaW9uOwoKICAgIGZvciAobl9VUkkgPSAwO25fVVJJIDwgZ2VuX25iX2ZpbGVvdXRwdXQ7bl9VUkkrKykgewogICAgZm9yIChuX2VuY29kZXIgPSAwO25fZW5jb2RlciA8IGdlbl9uYl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyO25fZW5jb2RlcisrKSB7CiAgICBmb3IgKG5fY29tcHJlc3Npb24gPSAwO25fY29tcHJlc3Npb24gPCBnZW5fbmJfaW50O25fY29tcHJlc3Npb24rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgVVJJID0gZ2VuX2ZpbGVvdXRwdXQobl9VUkksIDApOwogICAgICAgIGVuY29kZXIgPSBnZW5feG1sQ2hhckVuY29kaW5nSGFuZGxlclB0cihuX2VuY29kZXIsIDEpOwogICAgICAgIGNvbXByZXNzaW9uID0gZ2VuX2ludChuX2NvbXByZXNzaW9uLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE91dHB1dEJ1ZmZlckNyZWF0ZUZpbGVuYW1lKFVSSSwgZW5jb2RlciwgY29tcHJlc3Npb24pOwogICAgICAgIGRlc3JldF94bWxPdXRwdXRCdWZmZXJQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlb3V0cHV0KG5fVVJJLCBVUkksIDApOwogICAgICAgIGRlc194bWxDaGFyRW5jb2RpbmdIYW5kbGVyUHRyKG5fZW5jb2RlciwgZW5jb2RlciwgMSk7CiAgICAgICAgZGVzX2ludChuX2NvbXByZXNzaW9uLCBjb21wcmVzc2lvbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxPdXRwdXRCdWZmZXJDcmVhdGVGaWxlbmFtZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkkpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2Rlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb21wcmVzc2lvbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE91dHB1dEJ1ZmZlckZsdXNoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbE91dHB1dEJ1ZmZlclB0ciBvdXQ7IC8qIGEgYnVmZmVyZWQgb3V0cHV0ICovCiAgICBpbnQgbl9vdXQ7CgogICAgZm9yIChuX291dCA9IDA7bl9vdXQgPCBnZW5fbmJfeG1sT3V0cHV0QnVmZmVyUHRyO25fb3V0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG91dCA9IGdlbl94bWxPdXRwdXRCdWZmZXJQdHIobl9vdXQsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sT3V0cHV0QnVmZmVyRmx1c2gob3V0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sT3V0cHV0QnVmZmVyUHRyKG5fb3V0LCBvdXQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sT3V0cHV0QnVmZmVyRmx1c2giLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sT3V0cHV0QnVmZmVyV3JpdGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sT3V0cHV0QnVmZmVyUHRyIG91dDsgLyogYSBidWZmZXJlZCBwYXJzZXIgb3V0cHV0ICovCiAgICBpbnQgbl9vdXQ7CiAgICBpbnQgbGVuOyAvKiB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYXJyYXkuICovCiAgICBpbnQgbl9sZW47CiAgICBjaGFyICogYnVmOyAvKiBhbiBjaGFyIGFycmF5ICovCiAgICBpbnQgbl9idWY7CgogICAgZm9yIChuX291dCA9IDA7bl9vdXQgPCBnZW5fbmJfeG1sT3V0cHV0QnVmZmVyUHRyO25fb3V0KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2J1ZisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXQgPSBnZW5feG1sT3V0cHV0QnVmZmVyUHRyKG5fb3V0LCAwKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAxKTsKICAgICAgICBidWYgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9idWYsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sT3V0cHV0QnVmZmVyV3JpdGUob3V0LCBsZW4sIChjb25zdCBjaGFyICopYnVmKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sT3V0cHV0QnVmZmVyUHRyKG5fb3V0LCBvdXQsIDApOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMSk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fYnVmLCAoY29uc3QgY2hhciAqKWJ1ZiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxPdXRwdXRCdWZmZXJXcml0ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE91dHB1dEJ1ZmZlcldyaXRlRXNjYXBlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbE91dHB1dEJ1ZmZlclB0ciBvdXQ7IC8qIGEgYnVmZmVyZWQgcGFyc2VyIG91dHB1dCAqLwogICAgaW50IG5fb3V0OwogICAgY2hhciAqIHN0cjsgLyogYSB6ZXJvIHRlcm1pbmF0ZWQgQyBzdHJpbmcgKi8KICAgIGludCBuX3N0cjsKCiAgICBmb3IgKG5fb3V0ID0gMDtuX291dCA8IGdlbl9uYl94bWxPdXRwdXRCdWZmZXJQdHI7bl9vdXQrKykgewogICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9zdHIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgb3V0ID0gZ2VuX3htbE91dHB1dEJ1ZmZlclB0cihuX291dCwgMCk7CiAgICAgICAgc3RyID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fc3RyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKG91dCwgKGNvbnN0IGNoYXIgKilzdHIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxPdXRwdXRCdWZmZXJQdHIobl9vdXQsIG91dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fc3RyLCAoY29uc3QgY2hhciAqKXN0ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxPdXRwdXRCdWZmZXJXcml0ZVN0cmluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VyR2V0RGlyZWN0b3J5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlRmQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJJbnB1dEJ1ZmZlclB0ciByZXRfdmFsOwogICAgaW50IGZkOyAvKiBhIGZpbGUgZGVzY3JpcHRvciBudW1iZXIgKi8KICAgIGludCBuX2ZkOwogICAgeG1sQ2hhckVuY29kaW5nIGVuYzsgLyogdGhlIGNoYXJzZXQgZW5jb2RpbmcgaWYga25vd24gKi8KICAgIGludCBuX2VuYzsKCiAgICBmb3IgKG5fZmQgPSAwO25fZmQgPCBnZW5fbmJfaW50O25fZmQrKykgewogICAgZm9yIChuX2VuYyA9IDA7bl9lbmMgPCBnZW5fbmJfeG1sQ2hhckVuY29kaW5nO25fZW5jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZkID0gZ2VuX2ludChuX2ZkLCAwKTsKICAgICAgICBlbmMgPSBnZW5feG1sQ2hhckVuY29kaW5nKG5fZW5jLCAxKTsKICAgICAgICBpZiAoZmQgPj0gMCkgZmQgPSAtMTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlRmQoZmQsIGVuYyk7CiAgICAgICAgZGVzcmV0X3htbFBhcnNlcklucHV0QnVmZmVyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fZmQsIGZkLCAwKTsKICAgICAgICBkZXNfeG1sQ2hhckVuY29kaW5nKG5fZW5jLCBlbmMsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVGZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlRmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlcklucHV0QnVmZmVyUHRyIHJldF92YWw7CiAgICBGSUxFICogZmlsZTsgLyogYSBGSUxFKiAqLwogICAgaW50IG5fZmlsZTsKICAgIHhtbENoYXJFbmNvZGluZyBlbmM7IC8qIHRoZSBjaGFyc2V0IGVuY29kaW5nIGlmIGtub3duICovCiAgICBpbnQgbl9lbmM7CgogICAgZm9yIChuX2ZpbGUgPSAwO25fZmlsZSA8IGdlbl9uYl9GSUxFX3B0cjtuX2ZpbGUrKykgewogICAgZm9yIChuX2VuYyA9IDA7bl9lbmMgPCBnZW5fbmJfeG1sQ2hhckVuY29kaW5nO25fZW5jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZpbGUgPSBnZW5fRklMRV9wdHIobl9maWxlLCAwKTsKICAgICAgICBlbmMgPSBnZW5feG1sQ2hhckVuY29kaW5nKG5fZW5jLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlRmlsZShmaWxlLCBlbmMpOwogICAgICAgIGRlc3JldF94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX0ZJTEVfcHRyKG5fZmlsZSwgZmlsZSwgMCk7CiAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZyhuX2VuYywgZW5jLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlRmlsZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuYyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVGaWxlbmFtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlcklucHV0QnVmZmVyUHRyIHJldF92YWw7CiAgICBjb25zdCBjaGFyICogVVJJOyAvKiBhIEMgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFVSSSBvciBmaWxlbmFtZSAqLwogICAgaW50IG5fVVJJOwogICAgeG1sQ2hhckVuY29kaW5nIGVuYzsgLyogdGhlIGNoYXJzZXQgZW5jb2RpbmcgaWYga25vd24gKi8KICAgIGludCBuX2VuYzsKCiAgICBmb3IgKG5fVVJJID0gMDtuX1VSSSA8IGdlbl9uYl9maWxlb3V0cHV0O25fVVJJKyspIHsKICAgIGZvciAobl9lbmMgPSAwO25fZW5jIDwgZ2VuX25iX3htbENoYXJFbmNvZGluZztuX2VuYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBVUkkgPSBnZW5fZmlsZW91dHB1dChuX1VSSSwgMCk7CiAgICAgICAgZW5jID0gZ2VuX3htbENoYXJFbmNvZGluZyhuX2VuYywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxQYXJzZXJJbnB1dEJ1ZmZlckNyZWF0ZUZpbGVuYW1lKFVSSSwgZW5jKTsKICAgICAgICBkZXNyZXRfeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19maWxlb3V0cHV0KG5fVVJJLCBVUkksIDApOwogICAgICAgIGRlc194bWxDaGFyRW5jb2Rpbmcobl9lbmMsIGVuYywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZXJJbnB1dEJ1ZmZlckNyZWF0ZUZpbGVuYW1lIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSSSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlTWVtKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIgcmV0X3ZhbDsKICAgIGNoYXIgKiBtZW07IC8qIHRoZSBtZW1vcnkgaW5wdXQgKi8KICAgIGludCBuX21lbTsKICAgIGludCBzaXplOyAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBtZW1vcnkgYmxvY2sgKi8KICAgIGludCBuX3NpemU7CiAgICB4bWxDaGFyRW5jb2RpbmcgZW5jOyAvKiB0aGUgY2hhcnNldCBlbmNvZGluZyBpZiBrbm93biAqLwogICAgaW50IG5fZW5jOwoKICAgIGZvciAobl9tZW0gPSAwO25fbWVtIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fbWVtKyspIHsKICAgIGZvciAobl9zaXplID0gMDtuX3NpemUgPCBnZW5fbmJfaW50O25fc2l6ZSsrKSB7CiAgICBmb3IgKG5fZW5jID0gMDtuX2VuYyA8IGdlbl9uYl94bWxDaGFyRW5jb2Rpbmc7bl9lbmMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbWVtID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fbWVtLCAwKTsKICAgICAgICBzaXplID0gZ2VuX2ludChuX3NpemUsIDEpOwogICAgICAgIGVuYyA9IGdlbl94bWxDaGFyRW5jb2Rpbmcobl9lbmMsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVNZW0oKGNvbnN0IGNoYXIgKiltZW0sIHNpemUsIGVuYyk7CiAgICAgICAgZGVzcmV0X3htbFBhcnNlcklucHV0QnVmZmVyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9tZW0sIChjb25zdCBjaGFyICopbWVtLCAwKTsKICAgICAgICBkZXNfaW50KG5fc2l6ZSwgc2l6ZSwgMSk7CiAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZyhuX2VuYywgZW5jLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlTWVtIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX21lbSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zaXplKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuYyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVTdGF0aWModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxQYXJzZXJJbnB1dEJ1ZmZlclB0ciByZXRfdmFsOwogICAgY2hhciAqIG1lbTsgLyogdGhlIG1lbW9yeSBpbnB1dCAqLwogICAgaW50IG5fbWVtOwogICAgaW50IHNpemU7IC8qIHRoZSBsZW5ndGggb2YgdGhlIG1lbW9yeSBibG9jayAqLwogICAgaW50IG5fc2l6ZTsKICAgIHhtbENoYXJFbmNvZGluZyBlbmM7IC8qIHRoZSBjaGFyc2V0IGVuY29kaW5nIGlmIGtub3duICovCiAgICBpbnQgbl9lbmM7CgogICAgZm9yIChuX21lbSA9IDA7bl9tZW0gPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9tZW0rKykgewogICAgZm9yIChuX3NpemUgPSAwO25fc2l6ZSA8IGdlbl9uYl9pbnQ7bl9zaXplKyspIHsKICAgIGZvciAobl9lbmMgPSAwO25fZW5jIDwgZ2VuX25iX3htbENoYXJFbmNvZGluZztuX2VuYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBtZW0gPSBnZW5fY29uc3RfY2hhcl9wdHIobl9tZW0sIDApOwogICAgICAgIHNpemUgPSBnZW5faW50KG5fc2l6ZSwgMSk7CiAgICAgICAgZW5jID0gZ2VuX3htbENoYXJFbmNvZGluZyhuX2VuYywgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxQYXJzZXJJbnB1dEJ1ZmZlckNyZWF0ZVN0YXRpYygoY29uc3QgY2hhciAqKW1lbSwgc2l6ZSwgZW5jKTsKICAgICAgICBkZXNyZXRfeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX21lbSwgKGNvbnN0IGNoYXIgKiltZW0sIDApOwogICAgICAgIGRlc19pbnQobl9zaXplLCBzaXplLCAxKTsKICAgICAgICBkZXNfeG1sQ2hhckVuY29kaW5nKG5fZW5jLCBlbmMsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VySW5wdXRCdWZmZXJDcmVhdGVTdGF0aWMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbWVtKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NpemUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZXJJbnB1dEJ1ZmZlckdyb3codm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFBhcnNlcklucHV0QnVmZmVyUHRyIGluOyAvKiBhIGJ1ZmZlcmVkIHBhcnNlciBpbnB1dCAqLwogICAgaW50IG5faW47CiAgICBpbnQgbGVuOyAvKiBpbmRpY2F0aXZlIHZhbHVlIG9mIHRoZSBhbW91bnQgb2YgY2hhcnMgdG8gcmVhZCAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9pbiA9IDA7bl9pbiA8IGdlbl9uYl94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cjtuX2luKyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBpbiA9IGdlbl94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cihuX2luLCAwKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlcklucHV0QnVmZmVyR3JvdyhpbiwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIobl9pbiwgaW4sIDApOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZXJJbnB1dEJ1ZmZlckdyb3ciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZXJJbnB1dEJ1ZmZlclB1c2godm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFBhcnNlcklucHV0QnVmZmVyUHRyIGluOyAvKiBhIGJ1ZmZlcmVkIHBhcnNlciBpbnB1dCAqLwogICAgaW50IG5faW47CiAgICBpbnQgbGVuOyAvKiB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYXJyYXkuICovCiAgICBpbnQgbl9sZW47CiAgICBjaGFyICogYnVmOyAvKiBhbiBjaGFyIGFycmF5ICovCiAgICBpbnQgbl9idWY7CgogICAgZm9yIChuX2luID0gMDtuX2luIDwgZ2VuX25iX3htbFBhcnNlcklucHV0QnVmZmVyUHRyO25faW4rKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fYnVmKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGluID0gZ2VuX3htbFBhcnNlcklucHV0QnVmZmVyUHRyKG5faW4sIDApOwogICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDEpOwogICAgICAgIGJ1ZiA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2J1ZiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxQYXJzZXJJbnB1dEJ1ZmZlclB1c2goaW4sIGxlbiwgKGNvbnN0IGNoYXIgKilidWYpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cihuX2luLCBpbiwgMCk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAxKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9idWYsIChjb25zdCBjaGFyICopYnVmLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlcklucHV0QnVmZmVyUHVzaCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZXJJbnB1dEJ1ZmZlclJlYWQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFBhcnNlcklucHV0QnVmZmVyUHRyIGluOyAvKiBhIGJ1ZmZlcmVkIHBhcnNlciBpbnB1dCAqLwogICAgaW50IG5faW47CiAgICBpbnQgbGVuOyAvKiBpbmRpY2F0aXZlIHZhbHVlIG9mIHRoZSBhbW91bnQgb2YgY2hhcnMgdG8gcmVhZCAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9pbiA9IDA7bl9pbiA8IGdlbl9uYl94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cjtuX2luKyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBpbiA9IGdlbl94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cihuX2luLCAwKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlcklucHV0QnVmZmVyUmVhZChpbiwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIobl9pbiwgaW4sIDApOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZXJJbnB1dEJ1ZmZlclJlYWQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQb3BJbnB1dENhbGxiYWNrcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwoKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwoKICAgICAgICByZXRfdmFsID0geG1sUG9wSW5wdXRDYWxsYmFja3MoKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBvcElucHV0Q2FsbGJhY2tzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWdpc3RlckRlZmF1bHRJbnB1dENhbGxiYWNrcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKCiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKCiAgICAgICAgeG1sUmVnaXN0ZXJEZWZhdWx0SW5wdXRDYWxsYmFja3MoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWdpc3RlckRlZmF1bHRJbnB1dENhbGxiYWNrcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVnaXN0ZXJEZWZhdWx0T3V0cHV0Q2FsbGJhY2tzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CgogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CgogICAgICAgIHhtbFJlZ2lzdGVyRGVmYXVsdE91dHB1dENhbGxiYWNrcygpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlZ2lzdGVyRGVmYXVsdE91dHB1dENhbGxiYWNrcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlZ2lzdGVySFRUUFBvc3RDYWxsYmFja3Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9PVVRQVVRfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfSFRUUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwoKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwoKICAgICAgICB4bWxSZWdpc3RlckhUVFBQb3N0Q2FsbGJhY2tzKCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVnaXN0ZXJIVFRQUG9zdENhbGxiYWNrcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sSU8odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIHhtbElPIDogMzkgb2YgNDggZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEFsbG9jT3V0cHV0QnVmZmVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEFsbG9jUGFyc2VySW5wdXRCdWZmZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ2hlY2tGaWxlbmFtZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDaGVja0hUVFBJbnB1dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDbGVhbnVwSW5wdXRDYWxsYmFja3MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQ2xlYW51cE91dHB1dENhbGxiYWNrcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxGaWxlQ2xvc2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRmlsZU1hdGNoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEZpbGVPcGVuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEZpbGVSZWFkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbElPRlRQQ2xvc2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSU9GVFBNYXRjaCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxJT0ZUUE9wZW4oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSU9GVFBSZWFkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbElPSFRUUENsb3NlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbElPSFRUUE1hdGNoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbElPSFRUUE9wZW4oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sSU9IVFRQUmVhZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOb05ldEV4dGVybmFsRW50aXR5TG9hZGVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5vcm1hbGl6ZVdpbmRvd3NQYXRoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE91dHB1dEJ1ZmZlckNyZWF0ZUJ1ZmZlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxPdXRwdXRCdWZmZXJDcmVhdGVGZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxPdXRwdXRCdWZmZXJDcmVhdGVGaWxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE91dHB1dEJ1ZmZlckNyZWF0ZUZpbGVuYW1lKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE91dHB1dEJ1ZmZlckZsdXNoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE91dHB1dEJ1ZmZlcldyaXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE91dHB1dEJ1ZmZlcldyaXRlRXNjYXBlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE91dHB1dEJ1ZmZlcldyaXRlU3RyaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlckdldERpcmVjdG9yeSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZXJJbnB1dEJ1ZmZlckNyZWF0ZUZkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlRmlsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZXJJbnB1dEJ1ZmZlckNyZWF0ZUZpbGVuYW1lKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlTWVtKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlcklucHV0QnVmZmVyQ3JlYXRlU3RhdGljKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlcklucHV0QnVmZmVyR3JvdygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZXJJbnB1dEJ1ZmZlclB1c2goKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VySW5wdXRCdWZmZXJSZWFkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBvcElucHV0Q2FsbGJhY2tzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlZ2lzdGVyRGVmYXVsdElucHV0Q2FsbGJhY2tzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlZ2lzdGVyRGVmYXVsdE91dHB1dENhbGxiYWNrcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWdpc3RlckhUVFBQb3N0Q2FsbGJhY2tzKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSB4bWxJTzogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CiNpZmRlZiBMSUJYTUxfQVVUT01BVEFfRU5BQkxFRAoKI2RlZmluZSBnZW5fbmJfeG1sQXV0b21hdGFQdHIgMQpzdGF0aWMgeG1sQXV0b21hdGFQdHIgZ2VuX3htbEF1dG9tYXRhUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxBdXRvbWF0YVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sQXV0b21hdGFQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgoKc3RhdGljIGludAp0ZXN0X3htbEF1dG9tYXRhQ29tcGlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBdXRvbWF0YUdldEluaXRTdGF0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBdXRvbWF0YUlzRGV0ZXJtaW5pc3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUdFWFBfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfQVVUT01BVEFfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQXV0b21hdGFQdHIgYW07IC8qIGFuIGF1dG9tYXRhICovCiAgICBpbnQgbl9hbTsKCiAgICBmb3IgKG5fYW0gPSAwO25fYW0gPCBnZW5fbmJfeG1sQXV0b21hdGFQdHI7bl9hbSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBhbSA9IGdlbl94bWxBdXRvbWF0YVB0cihuX2FtLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEF1dG9tYXRhSXNEZXRlcm1pbmlzdChhbSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEF1dG9tYXRhUHRyKG5fYW0sIGFtLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEF1dG9tYXRhSXNEZXRlcm1pbmlzdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9hbSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgojaWZkZWYgTElCWE1MX0FVVE9NQVRBX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbEF1dG9tYXRhU3RhdGVQdHIgMQpzdGF0aWMgeG1sQXV0b21hdGFTdGF0ZVB0ciBnZW5feG1sQXV0b21hdGFTdGF0ZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sQXV0b21hdGFTdGF0ZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sQXV0b21hdGFTdGF0ZVB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCgpzdGF0aWMgaW50CnRlc3RfeG1sQXV0b21hdGFOZXdBbGxUcmFucyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBdXRvbWF0YU5ld0NvdW50VHJhbnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQXV0b21hdGFOZXdDb3VudFRyYW5zMih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBdXRvbWF0YU5ld0NvdW50ZWRUcmFucyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxBdXRvbWF0YU5ld0NvdW50ZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUdFWFBfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfQVVUT01BVEFfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQXV0b21hdGFQdHIgYW07IC8qIGFuIGF1dG9tYXRhICovCiAgICBpbnQgbl9hbTsKICAgIGludCBtaW47IC8qIHRoZSBtaW5pbWFsIHZhbHVlIG9uIHRoZSBjb3VudGVyICovCiAgICBpbnQgbl9taW47CiAgICBpbnQgbWF4OyAvKiB0aGUgbWF4aW1hbCB2YWx1ZSBvbiB0aGUgY291bnRlciAqLwogICAgaW50IG5fbWF4OwoKICAgIGZvciAobl9hbSA9IDA7bl9hbSA8IGdlbl9uYl94bWxBdXRvbWF0YVB0cjtuX2FtKyspIHsKICAgIGZvciAobl9taW4gPSAwO25fbWluIDwgZ2VuX25iX2ludDtuX21pbisrKSB7CiAgICBmb3IgKG5fbWF4ID0gMDtuX21heCA8IGdlbl9uYl9pbnQ7bl9tYXgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYW0gPSBnZW5feG1sQXV0b21hdGFQdHIobl9hbSwgMCk7CiAgICAgICAgbWluID0gZ2VuX2ludChuX21pbiwgMSk7CiAgICAgICAgbWF4ID0gZ2VuX2ludChuX21heCwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxBdXRvbWF0YU5ld0NvdW50ZXIoYW0sIG1pbiwgbWF4KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sQXV0b21hdGFQdHIobl9hbSwgYW0sIDApOwogICAgICAgIGRlc19pbnQobl9taW4sIG1pbiwgMSk7CiAgICAgICAgZGVzX2ludChuX21heCwgbWF4LCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEF1dG9tYXRhTmV3Q291bnRlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9hbSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9taW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbWF4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQXV0b21hdGFOZXdDb3VudGVyVHJhbnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQXV0b21hdGFOZXdFcHNpbG9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEF1dG9tYXRhTmV3TmVnVHJhbnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQXV0b21hdGFOZXdPbmNlVHJhbnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQXV0b21hdGFOZXdPbmNlVHJhbnMyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEF1dG9tYXRhTmV3U3RhdGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQXV0b21hdGFOZXdUcmFuc2l0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEF1dG9tYXRhTmV3VHJhbnNpdGlvbjIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sQXV0b21hdGFTZXRGaW5hbFN0YXRlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVHRVhQX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX0FVVE9NQVRBX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbEF1dG9tYXRhUHRyIGFtOyAvKiBhbiBhdXRvbWF0YSAqLwogICAgaW50IG5fYW07CiAgICB4bWxBdXRvbWF0YVN0YXRlUHRyIHN0YXRlOyAvKiBhIHN0YXRlIGluIHRoaXMgYXV0b21hdGEgKi8KICAgIGludCBuX3N0YXRlOwoKICAgIGZvciAobl9hbSA9IDA7bl9hbSA8IGdlbl9uYl94bWxBdXRvbWF0YVB0cjtuX2FtKyspIHsKICAgIGZvciAobl9zdGF0ZSA9IDA7bl9zdGF0ZSA8IGdlbl9uYl94bWxBdXRvbWF0YVN0YXRlUHRyO25fc3RhdGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYW0gPSBnZW5feG1sQXV0b21hdGFQdHIobl9hbSwgMCk7CiAgICAgICAgc3RhdGUgPSBnZW5feG1sQXV0b21hdGFTdGF0ZVB0cihuX3N0YXRlLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEF1dG9tYXRhU2V0RmluYWxTdGF0ZShhbSwgc3RhdGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxBdXRvbWF0YVB0cihuX2FtLCBhbSwgMCk7CiAgICAgICAgZGVzX3htbEF1dG9tYXRhU3RhdGVQdHIobl9zdGF0ZSwgc3RhdGUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQXV0b21hdGFTZXRGaW5hbFN0YXRlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2FtKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0YXRlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3QXV0b21hdGEodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxhdXRvbWF0YSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgeG1sYXV0b21hdGEgOiAzIG9mIDE5IGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBdXRvbWF0YUNvbXBpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQXV0b21hdGFHZXRJbml0U3RhdGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQXV0b21hdGFJc0RldGVybWluaXN0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEF1dG9tYXRhTmV3QWxsVHJhbnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQXV0b21hdGFOZXdDb3VudFRyYW5zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEF1dG9tYXRhTmV3Q291bnRUcmFuczIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQXV0b21hdGFOZXdDb3VudGVkVHJhbnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sQXV0b21hdGFOZXdDb3VudGVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEF1dG9tYXRhTmV3Q291bnRlclRyYW5zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEF1dG9tYXRhTmV3RXBzaWxvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBdXRvbWF0YU5ld05lZ1RyYW5zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEF1dG9tYXRhTmV3T25jZVRyYW5zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEF1dG9tYXRhTmV3T25jZVRyYW5zMigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBdXRvbWF0YU5ld1N0YXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEF1dG9tYXRhTmV3VHJhbnNpdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxBdXRvbWF0YU5ld1RyYW5zaXRpb24yKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEF1dG9tYXRhU2V0RmluYWxTdGF0ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxOZXdBdXRvbWF0YSgpOwoKICAgIGlmICh0ZXN0X3JldCAhPSAwKQoJcHJpbnRmKCJNb2R1bGUgeG1sYXV0b21hdGE6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKI2RlZmluZSBnZW5fbmJfeG1sR2VuZXJpY0Vycm9yRnVuY19wdHIgMQpzdGF0aWMgeG1sR2VuZXJpY0Vycm9yRnVuYyAqIGdlbl94bWxHZW5lcmljRXJyb3JGdW5jX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sR2VuZXJpY0Vycm9yRnVuY19wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbEdlbmVyaWNFcnJvckZ1bmMgKiB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKc3RhdGljIGludAp0ZXN0X2luaXRHZW5lcmljRXJyb3JEZWZhdWx0RnVuYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbEdlbmVyaWNFcnJvckZ1bmMgKiBoYW5kbGVyOyAvKiB0aGUgaGFuZGxlciAqLwogICAgaW50IG5faGFuZGxlcjsKCiAgICBmb3IgKG5faGFuZGxlciA9IDA7bl9oYW5kbGVyIDwgZ2VuX25iX3htbEdlbmVyaWNFcnJvckZ1bmNfcHRyO25faGFuZGxlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBoYW5kbGVyID0gZ2VuX3htbEdlbmVyaWNFcnJvckZ1bmNfcHRyKG5faGFuZGxlciwgMCk7CgogICAgICAgIGluaXRHZW5lcmljRXJyb3JEZWZhdWx0RnVuYyhoYW5kbGVyKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEdlbmVyaWNFcnJvckZ1bmNfcHRyKG5faGFuZGxlciwgaGFuZGxlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBpbml0R2VuZXJpY0Vycm9yRGVmYXVsdEZ1bmMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faGFuZGxlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgojZGVmaW5lIGdlbl9uYl94bWxFcnJvclB0ciAxCnN0YXRpYyB4bWxFcnJvclB0ciBnZW5feG1sRXJyb3JQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbEVycm9yUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxFcnJvclB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQoKc3RhdGljIGludAp0ZXN0X3htbENvcHlFcnJvcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sRXJyb3JQdHIgZnJvbTsgLyogYSBzb3VyY2UgZXJyb3IgKi8KICAgIGludCBuX2Zyb207CiAgICB4bWxFcnJvclB0ciB0bzsgLyogYSB0YXJnZXQgZXJyb3IgKi8KICAgIGludCBuX3RvOwoKICAgIGZvciAobl9mcm9tID0gMDtuX2Zyb20gPCBnZW5fbmJfeG1sRXJyb3JQdHI7bl9mcm9tKyspIHsKICAgIGZvciAobl90byA9IDA7bl90byA8IGdlbl9uYl94bWxFcnJvclB0cjtuX3RvKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZyb20gPSBnZW5feG1sRXJyb3JQdHIobl9mcm9tLCAwKTsKICAgICAgICB0byA9IGdlbl94bWxFcnJvclB0cihuX3RvLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENvcHlFcnJvcihmcm9tLCB0byk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEVycm9yUHRyKG5fZnJvbSwgZnJvbSwgMCk7CiAgICAgICAgZGVzX3htbEVycm9yUHRyKG5fdG8sIHRvLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENvcHlFcnJvciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mcm9tKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3RvKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDdHh0R2V0TGFzdEVycm9yKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEN0eHRSZXNldExhc3RFcnJvcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHZvaWQgKiBjdHg7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4OwoKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyO25fY3R4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cihuX2N0eCwgMCk7CgogICAgICAgIHhtbEN0eHRSZXNldExhc3RFcnJvcihjdHgpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfdm9pZF9wdHIobl9jdHgsIGN0eCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDdHh0UmVzZXRMYXN0RXJyb3IiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXRMYXN0RXJyb3Iodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VyRXJyb3Iodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VyUHJpbnRGaWxlQ29udGV4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlcklucHV0UHRyIGlucHV0OyAvKiBhbiB4bWxQYXJzZXJJbnB1dFB0ciBpbnB1dCAqLwogICAgaW50IG5faW5wdXQ7CgogICAgZm9yIChuX2lucHV0ID0gMDtuX2lucHV0IDwgZ2VuX25iX3htbFBhcnNlcklucHV0UHRyO25faW5wdXQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgaW5wdXQgPSBnZW5feG1sUGFyc2VySW5wdXRQdHIobl9pbnB1dCwgMCk7CgogICAgICAgIHhtbFBhcnNlclByaW50RmlsZUNvbnRleHQoaW5wdXQpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VySW5wdXRQdHIobl9pbnB1dCwgaW5wdXQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VyUHJpbnRGaWxlQ29udGV4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbnB1dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VyUHJpbnRGaWxlSW5mbyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlcklucHV0UHRyIGlucHV0OyAvKiBhbiB4bWxQYXJzZXJJbnB1dFB0ciBpbnB1dCAqLwogICAgaW50IG5faW5wdXQ7CgogICAgZm9yIChuX2lucHV0ID0gMDtuX2lucHV0IDwgZ2VuX25iX3htbFBhcnNlcklucHV0UHRyO25faW5wdXQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgaW5wdXQgPSBnZW5feG1sUGFyc2VySW5wdXRQdHIobl9pbnB1dCwgMCk7CgogICAgICAgIHhtbFBhcnNlclByaW50RmlsZUluZm8oaW5wdXQpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VySW5wdXRQdHIobl9pbnB1dCwgaW5wdXQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VyUHJpbnRGaWxlSW5mbyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbnB1dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VyVmFsaWRpdHlFcnJvcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxQYXJzZXJWYWxpZGl0eVdhcm5pbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUGFyc2VyV2FybmluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZXNldEVycm9yKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRXJyb3JQdHIgZXJyOyAvKiBwb2ludGVyIHRvIHRoZSBlcnJvci4gKi8KICAgIGludCBuX2VycjsKCiAgICBmb3IgKG5fZXJyID0gMDtuX2VyciA8IGdlbl9uYl94bWxFcnJvclB0cjtuX2VycisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBlcnIgPSBnZW5feG1sRXJyb3JQdHIobl9lcnIsIDApOwoKICAgICAgICB4bWxSZXNldEVycm9yKGVycik7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxFcnJvclB0cihuX2VyciwgZXJyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlc2V0RXJyb3IiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZXJyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZXNldExhc3RFcnJvcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCgogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2V0R2VuZXJpY0Vycm9yRnVuYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTZXRTdHJ1Y3R1cmVkRXJyb3JGdW5jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sZXJyb3Iodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIHhtbGVycm9yIDogNyBvZiAxNSBmdW5jdGlvbnMgLi4uXG4iKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfaW5pdEdlbmVyaWNFcnJvckRlZmF1bHRGdW5jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENvcHlFcnJvcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDdHh0R2V0TGFzdEVycm9yKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEN0eHRSZXNldExhc3RFcnJvcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxHZXRMYXN0RXJyb3IoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VyRXJyb3IoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VyUHJpbnRGaWxlQ29udGV4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxQYXJzZXJQcmludEZpbGVJbmZvKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlclZhbGlkaXR5RXJyb3IoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUGFyc2VyVmFsaWRpdHlXYXJuaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFBhcnNlcldhcm5pbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVzZXRFcnJvcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZXNldExhc3RFcnJvcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTZXRHZW5lcmljRXJyb3JGdW5jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNldFN0cnVjdHVyZWRFcnJvckZ1bmMoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIHhtbGVycm9yOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KI2lmZGVmIExJQlhNTF9NT0RVTEVTX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbE1vZHVsZVB0ciAxCnN0YXRpYyB4bWxNb2R1bGVQdHIgZ2VuX3htbE1vZHVsZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sTW9kdWxlUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxNb2R1bGVQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgoKc3RhdGljIGludAp0ZXN0X3htbE1vZHVsZUNsb3NlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfTU9EVUxFU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxNb2R1bGVQdHIgbW9kdWxlOyAvKiB0aGUgbW9kdWxlIGhhbmRsZSAqLwogICAgaW50IG5fbW9kdWxlOwoKICAgIGZvciAobl9tb2R1bGUgPSAwO25fbW9kdWxlIDwgZ2VuX25iX3htbE1vZHVsZVB0cjtuX21vZHVsZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBtb2R1bGUgPSBnZW5feG1sTW9kdWxlUHRyKG5fbW9kdWxlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE1vZHVsZUNsb3NlKG1vZHVsZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE1vZHVsZVB0cihuX21vZHVsZSwgbW9kdWxlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE1vZHVsZUNsb3NlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX21vZHVsZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbE1vZHVsZU9wZW4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTW9kdWxlU3ltYm9sKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfTU9EVUxFU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxNb2R1bGVQdHIgbW9kdWxlOyAvKiB0aGUgbW9kdWxlICovCiAgICBpbnQgbl9tb2R1bGU7CiAgICBjaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCAqLwogICAgaW50IG5fbmFtZTsKICAgIHZvaWQgKiogc3ltYm9sOyAvKiB0aGUgcmVzdWx0aW5nIHN5bWJvbCBhZGRyZXNzICovCiAgICBpbnQgbl9zeW1ib2w7CgogICAgZm9yIChuX21vZHVsZSA9IDA7bl9tb2R1bGUgPCBnZW5fbmJfeG1sTW9kdWxlUHRyO25fbW9kdWxlKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9zeW1ib2wgPSAwO25fc3ltYm9sIDwgZ2VuX25iX3ZvaWRfcHRyX3B0cjtuX3N5bWJvbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBtb2R1bGUgPSBnZW5feG1sTW9kdWxlUHRyKG5fbW9kdWxlLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgc3ltYm9sID0gZ2VuX3ZvaWRfcHRyX3B0cihuX3N5bWJvbCwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxNb2R1bGVTeW1ib2wobW9kdWxlLCAoY29uc3QgY2hhciAqKW5hbWUsIHN5bWJvbCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE1vZHVsZVB0cihuX21vZHVsZSwgbW9kdWxlLCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9uYW1lLCAoY29uc3QgY2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc192b2lkX3B0cl9wdHIobl9zeW1ib2wsIHN5bWJvbCwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxNb2R1bGVTeW1ib2wiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbW9kdWxlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3ltYm9sKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxtb2R1bGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIHhtbG1vZHVsZSA6IDIgb2YgNCBmdW5jdGlvbnMgLi4uXG4iKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTW9kdWxlQ2xvc2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTW9kdWxlT3BlbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxNb2R1bGVTeW1ib2woKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIHhtbG1vZHVsZTogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3VGV4dFJlYWRlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sVGV4dFJlYWRlclB0ciByZXRfdmFsOwogICAgeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIgaW5wdXQ7IC8qIHRoZSB4bWxQYXJzZXJJbnB1dEJ1ZmZlclB0ciB1c2VkIHRvIHJlYWQgZGF0YSAqLwogICAgaW50IG5faW5wdXQ7CiAgICBjb25zdCBjaGFyICogVVJJOyAvKiB0aGUgVVJJIGluZm9ybWF0aW9uIGZvciB0aGUgc291cmNlIGlmIGF2YWlsYWJsZSAqLwogICAgaW50IG5fVVJJOwoKICAgIGZvciAobl9pbnB1dCA9IDA7bl9pbnB1dCA8IGdlbl9uYl94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cjtuX2lucHV0KyspIHsKICAgIGZvciAobl9VUkkgPSAwO25fVVJJIDwgZ2VuX25iX2ZpbGVwYXRoO25fVVJJKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGlucHV0ID0gZ2VuX3htbFBhcnNlcklucHV0QnVmZmVyUHRyKG5faW5wdXQsIDApOwogICAgICAgIFVSSSA9IGdlbl9maWxlcGF0aChuX1VSSSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdUZXh0UmVhZGVyKGlucHV0LCBVUkkpOwogICAgICAgIGRlc3JldF94bWxUZXh0UmVhZGVyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIobl9pbnB1dCwgaW5wdXQsIDApOwogICAgICAgIGRlc19maWxlcGF0aChuX1VSSSwgVVJJLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld1RleHRSZWFkZXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5wdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJJKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3VGV4dFJlYWRlckZpbGVuYW1lKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJldF92YWw7CiAgICBjb25zdCBjaGFyICogVVJJOyAvKiB0aGUgVVJJIG9mIHRoZSByZXNvdXJjZSB0byBwcm9jZXNzICovCiAgICBpbnQgbl9VUkk7CgogICAgZm9yIChuX1VSSSA9IDA7bl9VUkkgPCBnZW5fbmJfZmlsZXBhdGg7bl9VUkkrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgVVJJID0gZ2VuX2ZpbGVwYXRoKG5fVVJJLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld1RleHRSZWFkZXJGaWxlbmFtZShVUkkpOwogICAgICAgIGRlc3JldF94bWxUZXh0UmVhZGVyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZXBhdGgobl9VUkksIFVSSSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOZXdUZXh0UmVhZGVyRmlsZW5hbWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJJKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVhZGVyRm9yRG9jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJldF92YWw7CiAgICB4bWxDaGFyICogY3VyOyAvKiBhIHBvaW50ZXIgdG8gYSB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nICovCiAgICBpbnQgbl9jdXI7CiAgICBjb25zdCBjaGFyICogVVJMOyAvKiB0aGUgYmFzZSBVUkwgdG8gdXNlIGZvciB0aGUgZG9jdW1lbnQgKi8KICAgIGludCBuX1VSTDsKICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCiAgICBpbnQgbl9lbmNvZGluZzsKICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIHhtbFBhcnNlck9wdGlvbiAqLwogICAgaW50IG5fb3B0aW9uczsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fVVJMID0gMDtuX1VSTCA8IGdlbl9uYl9maWxlcGF0aDtuX1VSTCsrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICBmb3IgKG5fb3B0aW9ucyA9IDA7bl9vcHRpb25zIDwgZ2VuX25iX3BhcnNlcm9wdGlvbnM7bl9vcHRpb25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2N1ciwgMCk7CiAgICAgICAgVVJMID0gZ2VuX2ZpbGVwYXRoKG5fVVJMLCAxKTsKICAgICAgICBlbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAyKTsKICAgICAgICBvcHRpb25zID0gZ2VuX3BhcnNlcm9wdGlvbnMobl9vcHRpb25zLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlYWRlckZvckRvYygoY29uc3QgeG1sQ2hhciAqKWN1ciwgVVJMLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfeG1sVGV4dFJlYWRlclB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY3VyLCAoY29uc3QgeG1sQ2hhciAqKWN1ciwgMCk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fVVJMLCBVUkwsIDEpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAyKTsKICAgICAgICBkZXNfcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIG9wdGlvbnMsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVhZGVyRm9yRG9jIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3B0aW9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlYWRlckZvckZpbGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogYSBmaWxlIG9yIFVSTCAqLwogICAgaW50IG5fZmlsZW5hbWU7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiB4bWxQYXJzZXJPcHRpb24gKi8KICAgIGludCBuX29wdGlvbnM7CgogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVwYXRoO25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgZm9yIChuX29wdGlvbnMgPSAwO25fb3B0aW9ucyA8IGdlbl9uYl9wYXJzZXJvcHRpb25zO25fb3B0aW9ucysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlcGF0aChuX2ZpbGVuYW1lLCAwKTsKICAgICAgICBlbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAxKTsKICAgICAgICBvcHRpb25zID0gZ2VuX3BhcnNlcm9wdGlvbnMobl9vcHRpb25zLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlYWRlckZvckZpbGUoZmlsZW5hbWUsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIG9wdGlvbnMpOwogICAgICAgIGRlc3JldF94bWxUZXh0UmVhZGVyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZXBhdGgobl9maWxlbmFtZSwgZmlsZW5hbWUsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAxKTsKICAgICAgICBkZXNfcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIG9wdGlvbnMsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVhZGVyRm9yRmlsZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vcHRpb25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVhZGVyRm9yTWVtb3J5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJldF92YWw7CiAgICBjaGFyICogYnVmZmVyOyAvKiBhIHBvaW50ZXIgdG8gYSBjaGFyIGFycmF5ICovCiAgICBpbnQgbl9idWZmZXI7CiAgICBpbnQgc2l6ZTsgLyogdGhlIHNpemUgb2YgdGhlIGFycmF5ICovCiAgICBpbnQgbl9zaXplOwogICAgY29uc3QgY2hhciAqIFVSTDsgLyogdGhlIGJhc2UgVVJMIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9VUkw7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiB4bWxQYXJzZXJPcHRpb24gKi8KICAgIGludCBuX29wdGlvbnM7CgogICAgZm9yIChuX2J1ZmZlciA9IDA7bl9idWZmZXIgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9idWZmZXIrKykgewogICAgZm9yIChuX3NpemUgPSAwO25fc2l6ZSA8IGdlbl9uYl9pbnQ7bl9zaXplKyspIHsKICAgIGZvciAobl9VUkwgPSAwO25fVVJMIDwgZ2VuX25iX2ZpbGVwYXRoO25fVVJMKyspIHsKICAgIGZvciAobl9lbmNvZGluZyA9IDA7bl9lbmNvZGluZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2VuY29kaW5nKyspIHsKICAgIGZvciAobl9vcHRpb25zID0gMDtuX29wdGlvbnMgPCBnZW5fbmJfcGFyc2Vyb3B0aW9ucztuX29wdGlvbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmZmVyID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fYnVmZmVyLCAwKTsKICAgICAgICBzaXplID0gZ2VuX2ludChuX3NpemUsIDEpOwogICAgICAgIFVSTCA9IGdlbl9maWxlcGF0aChuX1VSTCwgMik7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgMyk7CiAgICAgICAgb3B0aW9ucyA9IGdlbl9wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgNCk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWFkZXJGb3JNZW1vcnkoKGNvbnN0IGNoYXIgKilidWZmZXIsIHNpemUsIFVSTCwgKGNvbnN0IGNoYXIgKillbmNvZGluZywgb3B0aW9ucyk7CiAgICAgICAgZGVzcmV0X3htbFRleHRSZWFkZXJQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2J1ZmZlciwgKGNvbnN0IGNoYXIgKilidWZmZXIsIDApOwogICAgICAgIGRlc19pbnQobl9zaXplLCBzaXplLCAxKTsKICAgICAgICBkZXNfZmlsZXBhdGgobl9VUkwsIFVSTCwgMik7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDMpOwogICAgICAgIGRlc19wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgb3B0aW9ucywgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWFkZXJGb3JNZW1vcnkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmZmVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NpemUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJMKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29wdGlvbnMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWFkZXJOZXdEb2Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIGFuIFhNTCByZWFkZXIgKi8KICAgIGludCBuX3JlYWRlcjsKICAgIHhtbENoYXIgKiBjdXI7IC8qIGEgcG9pbnRlciB0byBhIHplcm8gdGVybWluYXRlZCBzdHJpbmcgKi8KICAgIGludCBuX2N1cjsKICAgIGNvbnN0IGNoYXIgKiBVUkw7IC8qIHRoZSBiYXNlIFVSTCB0byB1c2UgZm9yIHRoZSBkb2N1bWVudCAqLwogICAgaW50IG5fVVJMOwogICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgIGludCBuX2VuY29kaW5nOwogICAgaW50IG9wdGlvbnM7IC8qIGEgY29tYmluYXRpb24gb2YgeG1sUGFyc2VyT3B0aW9uICovCiAgICBpbnQgbl9vcHRpb25zOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jdXIrKykgewogICAgZm9yIChuX1VSTCA9IDA7bl9VUkwgPCBnZW5fbmJfZmlsZXBhdGg7bl9VUkwrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgZm9yIChuX29wdGlvbnMgPSAwO25fb3B0aW9ucyA8IGdlbl9uYl9wYXJzZXJvcHRpb25zO25fb3B0aW9ucysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CiAgICAgICAgY3VyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY3VyLCAxKTsKICAgICAgICBVUkwgPSBnZW5fZmlsZXBhdGgobl9VUkwsIDIpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDMpOwogICAgICAgIG9wdGlvbnMgPSBnZW5fcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIDQpOwoKICAgICAgICByZXRfdmFsID0geG1sUmVhZGVyTmV3RG9jKHJlYWRlciwgKGNvbnN0IHhtbENoYXIgKiljdXIsIFVSTCwgKGNvbnN0IGNoYXIgKillbmNvZGluZywgb3B0aW9ucyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY3VyLCAoY29uc3QgeG1sQ2hhciAqKWN1ciwgMSk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fVVJMLCBVUkwsIDIpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAzKTsKICAgICAgICBkZXNfcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIG9wdGlvbnMsIDQpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVhZGVyTmV3RG9jIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJMKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29wdGlvbnMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWFkZXJOZXdGaWxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiBhbiBYTUwgcmVhZGVyICovCiAgICBpbnQgbl9yZWFkZXI7CiAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIGEgZmlsZSBvciBVUkwgKi8KICAgIGludCBuX2ZpbGVuYW1lOwogICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgIGludCBuX2VuY29kaW5nOwogICAgaW50IG9wdGlvbnM7IC8qIGEgY29tYmluYXRpb24gb2YgeG1sUGFyc2VyT3B0aW9uICovCiAgICBpbnQgbl9vcHRpb25zOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgZm9yIChuX2ZpbGVuYW1lID0gMDtuX2ZpbGVuYW1lIDwgZ2VuX25iX2ZpbGVwYXRoO25fZmlsZW5hbWUrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgZm9yIChuX29wdGlvbnMgPSAwO25fb3B0aW9ucyA8IGdlbl9uYl9wYXJzZXJvcHRpb25zO25fb3B0aW9ucysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CiAgICAgICAgZmlsZW5hbWUgPSBnZW5fZmlsZXBhdGgobl9maWxlbmFtZSwgMSk7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgMik7CiAgICAgICAgb3B0aW9ucyA9IGdlbl9wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWFkZXJOZXdGaWxlKHJlYWRlciwgZmlsZW5hbWUsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIG9wdGlvbnMpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDIpOwogICAgICAgIGRlc19wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgb3B0aW9ucywgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWFkZXJOZXdGaWxlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vcHRpb25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVhZGVyTmV3TWVtb3J5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiBhbiBYTUwgcmVhZGVyICovCiAgICBpbnQgbl9yZWFkZXI7CiAgICBjaGFyICogYnVmZmVyOyAvKiBhIHBvaW50ZXIgdG8gYSBjaGFyIGFycmF5ICovCiAgICBpbnQgbl9idWZmZXI7CiAgICBpbnQgc2l6ZTsgLyogdGhlIHNpemUgb2YgdGhlIGFycmF5ICovCiAgICBpbnQgbl9zaXplOwogICAgY29uc3QgY2hhciAqIFVSTDsgLyogdGhlIGJhc2UgVVJMIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9VUkw7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiB4bWxQYXJzZXJPcHRpb24gKi8KICAgIGludCBuX29wdGlvbnM7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICBmb3IgKG5fYnVmZmVyID0gMDtuX2J1ZmZlciA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2J1ZmZlcisrKSB7CiAgICBmb3IgKG5fc2l6ZSA9IDA7bl9zaXplIDwgZ2VuX25iX2ludDtuX3NpemUrKykgewogICAgZm9yIChuX1VSTCA9IDA7bl9VUkwgPCBnZW5fbmJfZmlsZXBhdGg7bl9VUkwrKykgewogICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgewogICAgZm9yIChuX29wdGlvbnMgPSAwO25fb3B0aW9ucyA8IGdlbl9uYl9wYXJzZXJvcHRpb25zO25fb3B0aW9ucysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CiAgICAgICAgYnVmZmVyID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fYnVmZmVyLCAxKTsKICAgICAgICBzaXplID0gZ2VuX2ludChuX3NpemUsIDIpOwogICAgICAgIFVSTCA9IGdlbl9maWxlcGF0aChuX1VSTCwgMyk7CiAgICAgICAgZW5jb2RpbmcgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgNCk7CiAgICAgICAgb3B0aW9ucyA9IGdlbl9wYXJzZXJvcHRpb25zKG5fb3B0aW9ucywgNSk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWFkZXJOZXdNZW1vcnkocmVhZGVyLCAoY29uc3QgY2hhciAqKWJ1ZmZlciwgc2l6ZSwgVVJMLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9idWZmZXIsIChjb25zdCBjaGFyICopYnVmZmVyLCAxKTsKICAgICAgICBkZXNfaW50KG5fc2l6ZSwgc2l6ZSwgMik7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fVVJMLCBVUkwsIDMpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCA0KTsKICAgICAgICBkZXNfcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIG9wdGlvbnMsIDUpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVhZGVyTmV3TWVtb3J5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWZmZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2l6ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3B0aW9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlYWRlck5ld1dhbGtlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogYW4gWE1MIHJlYWRlciAqLwogICAgaW50IG5fcmVhZGVyOwogICAgeG1sRG9jUHRyIGRvYzsgLyogYSBwcmVwYXJzZWQgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWFkZXJOZXdXYWxrZXIocmVhZGVyLCBkb2MpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWFkZXJOZXdXYWxrZXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlYWRlcldhbGtlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sVGV4dFJlYWRlclB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogYSBwcmVwYXJzZWQgZG9jdW1lbnQgKi8KICAgIGludCBuX2RvYzsKCiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWFkZXJXYWxrZXIoZG9jKTsKICAgICAgICBkZXNyZXRfeG1sVGV4dFJlYWRlclB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlYWRlcldhbGtlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyQXR0cmlidXRlQ291bnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJBdHRyaWJ1dGVDb3VudChyZWFkZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlckF0dHJpYnV0ZUNvdW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJCYXNlVXJpKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyQmFzZVVyaShyZWFkZXIpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyQmFzZVVyaSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyQnl0ZUNvbnN1bWVkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBsb25nIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogYW4gWE1MIHJlYWRlciAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckJ5dGVDb25zdW1lZChyZWFkZXIpOwogICAgICAgIGRlc3JldF9sb25nKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJCeXRlQ29uc3VtZWQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckNsb3NlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyQ2xvc2UocmVhZGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJDbG9zZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyQ29uc3RCYXNlVXJpKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBjb25zdCB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyQ29uc3RCYXNlVXJpKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJDb25zdEJhc2VVcmkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckNvbnN0RW5jb2Rpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJDb25zdEVuY29kaW5nKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJDb25zdEVuY29kaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJDb25zdExvY2FsTmFtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckNvbnN0TG9jYWxOYW1lKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJDb25zdExvY2FsTmFtZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyQ29uc3ROYW1lKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBjb25zdCB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyQ29uc3ROYW1lKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJDb25zdE5hbWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckNvbnN0TmFtZXNwYWNlVXJpKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBjb25zdCB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyQ29uc3ROYW1lc3BhY2VVcmkocmVhZGVyKTsKICAgICAgICBkZXNyZXRfY29uc3RfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlckNvbnN0TmFtZXNwYWNlVXJpIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJDb25zdFByZWZpeCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckNvbnN0UHJlZml4KHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJDb25zdFByZWZpeCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyQ29uc3RTdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKICAgIHhtbENoYXIgKiBzdHI7IC8qIHRoZSBzdHJpbmcgdG8gaW50ZXJuLiAqLwogICAgaW50IG5fc3RyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwogICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyQ29uc3RTdHJpbmcocmVhZGVyLCAoY29uc3QgeG1sQ2hhciAqKXN0cik7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIChjb25zdCB4bWxDaGFyICopc3RyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJDb25zdFN0cmluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckNvbnN0VmFsdWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJDb25zdFZhbHVlKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJDb25zdFZhbHVlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJDb25zdFhtbExhbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJDb25zdFhtbExhbmcocmVhZGVyKTsKICAgICAgICBkZXNyZXRfY29uc3RfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlckNvbnN0WG1sTGFuZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyQ29uc3RYbWxWZXJzaW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBjb25zdCB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyQ29uc3RYbWxWZXJzaW9uKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJDb25zdFhtbFZlcnNpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckN1cnJlbnREb2Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJDdXJyZW50RG9jKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X3htbERvY1B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyQ3VycmVudERvYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyQ3VycmVudE5vZGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyQ3VycmVudE5vZGUocmVhZGVyKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyQ3VycmVudE5vZGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckRlcHRoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyRGVwdGgocmVhZGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJEZXB0aCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyRXhwYW5kKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckV4cGFuZChyZWFkZXIpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJFeHBhbmQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckdldEF0dHJpYnV0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyR2V0QXR0cmlidXRlKHJlYWRlciwgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyR2V0QXR0cmlidXRlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckdldEF0dHJpYnV0ZU5vKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CiAgICBpbnQgbm87IC8qIHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBhdHRyaWJ1dGUgcmVsYXRpdmUgdG8gdGhlIGNvbnRhaW5pbmcgZWxlbWVudCAqLwogICAgaW50IG5fbm87CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICBmb3IgKG5fbm8gPSAwO25fbm8gPCBnZW5fbmJfaW50O25fbm8rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwogICAgICAgIG5vID0gZ2VuX2ludChuX25vLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJHZXRBdHRyaWJ1dGVObyhyZWFkZXIsIG5vKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIGRlc19pbnQobl9ubywgbm8sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlckdldEF0dHJpYnV0ZU5vIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ubyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJHZXRBdHRyaWJ1dGVOcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwogICAgeG1sQ2hhciAqIGxvY2FsTmFtZTsgLyogdGhlIGxvY2FsIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gKi8KICAgIGludCBuX2xvY2FsTmFtZTsKICAgIHhtbENoYXIgKiBuYW1lc3BhY2VVUkk7IC8qIHRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBhdHRyaWJ1dGUuICovCiAgICBpbnQgbl9uYW1lc3BhY2VVUkk7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICBmb3IgKG5fbG9jYWxOYW1lID0gMDtuX2xvY2FsTmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2xvY2FsTmFtZSsrKSB7CiAgICBmb3IgKG5fbmFtZXNwYWNlVVJJID0gMDtuX25hbWVzcGFjZVVSSSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWVzcGFjZVVSSSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CiAgICAgICAgbG9jYWxOYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbG9jYWxOYW1lLCAxKTsKICAgICAgICBuYW1lc3BhY2VVUkkgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lc3BhY2VVUkksIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckdldEF0dHJpYnV0ZU5zKHJlYWRlciwgKGNvbnN0IHhtbENoYXIgKilsb2NhbE5hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZXNwYWNlVVJJKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2xvY2FsTmFtZSwgKGNvbnN0IHhtbENoYXIgKilsb2NhbE5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWVzcGFjZVVSSSwgKGNvbnN0IHhtbENoYXIgKiluYW1lc3BhY2VVUkksIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlckdldEF0dHJpYnV0ZU5zIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sb2NhbE5hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZXNwYWNlVVJJKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCiNpZmRlZiBMSUJYTUxfUkVBREVSX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbFRleHRSZWFkZXJFcnJvckZ1bmNfcHRyIDEKc3RhdGljIHhtbFRleHRSZWFkZXJFcnJvckZ1bmMgKiBnZW5feG1sVGV4dFJlYWRlckVycm9yRnVuY19wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFRleHRSZWFkZXJFcnJvckZ1bmNfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxUZXh0UmVhZGVyRXJyb3JGdW5jICogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJHZXRFcnJvckhhbmRsZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CiAgICB4bWxUZXh0UmVhZGVyRXJyb3JGdW5jICogZjsgLyogdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIE5VTEwgaXMgbm8gY2FsbGJhY2sgaGFzIGJlZW4gcmVnaXN0ZXJlZCAqLwogICAgaW50IG5fZjsKICAgIHZvaWQgKiogYXJnOyAvKiBhIHVzZXIgYXJndW1lbnQgKi8KICAgIGludCBuX2FyZzsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgIGZvciAobl9mID0gMDtuX2YgPCBnZW5fbmJfeG1sVGV4dFJlYWRlckVycm9yRnVuY19wdHI7bl9mKyspIHsKICAgIGZvciAobl9hcmcgPSAwO25fYXJnIDwgZ2VuX25iX3ZvaWRfcHRyX3B0cjtuX2FyZysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CiAgICAgICAgZiA9IGdlbl94bWxUZXh0UmVhZGVyRXJyb3JGdW5jX3B0cihuX2YsIDEpOwogICAgICAgIGFyZyA9IGdlbl92b2lkX3B0cl9wdHIobl9hcmcsIDIpOwoKICAgICAgICB4bWxUZXh0UmVhZGVyR2V0RXJyb3JIYW5kbGVyKHJlYWRlciwgZiwgYXJnKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJFcnJvckZ1bmNfcHRyKG5fZiwgZiwgMSk7CiAgICAgICAgZGVzX3ZvaWRfcHRyX3B0cihuX2FyZywgYXJnLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJHZXRFcnJvckhhbmRsZXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2YpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYXJnKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckdldFBhcnNlckNvbHVtbk51bWJlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHJlYWRlciBjb250ZXh0KSAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckdldFBhcnNlckNvbHVtbk51bWJlcihyZWFkZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlckdldFBhcnNlckNvbHVtbk51bWJlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyR2V0UGFyc2VyTGluZU51bWJlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHVzZXIgZGF0YSAoWE1MIHJlYWRlciBjb250ZXh0KSAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckdldFBhcnNlckxpbmVOdW1iZXIocmVhZGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJHZXRQYXJzZXJMaW5lTnVtYmVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJHZXRQYXJzZXJQcm9wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CiAgICBpbnQgcHJvcDsgLyogdGhlIHhtbFBhcnNlclByb3BlcnRpZXMgdG8gZ2V0ICovCiAgICBpbnQgbl9wcm9wOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgZm9yIChuX3Byb3AgPSAwO25fcHJvcCA8IGdlbl9uYl9pbnQ7bl9wcm9wKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKICAgICAgICBwcm9wID0gZ2VuX2ludChuX3Byb3AsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckdldFBhcnNlclByb3AocmVhZGVyLCBwcm9wKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICBkZXNfaW50KG5fcHJvcCwgcHJvcCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyR2V0UGFyc2VyUHJvcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHJvcCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJHZXRSZW1haW5kZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFBhcnNlcklucHV0QnVmZmVyUHRyIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckdldFJlbWFpbmRlcihyZWFkZXIpOwogICAgICAgIGRlc3JldF94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyR2V0UmVtYWluZGVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJIYXNBdHRyaWJ1dGVzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVySGFzQXR0cmlidXRlcyhyZWFkZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlckhhc0F0dHJpYnV0ZXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckhhc1ZhbHVlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVySGFzVmFsdWUocmVhZGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJIYXNWYWx1ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVySXNEZWZhdWx0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVySXNEZWZhdWx0KHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVySXNEZWZhdWx0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJJc0VtcHR5RWxlbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlcklzRW1wdHlFbGVtZW50KHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVySXNFbXB0eUVsZW1lbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlcklzTmFtZXNwYWNlRGVjbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlcklzTmFtZXNwYWNlRGVjbChyZWFkZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlcklzTmFtZXNwYWNlRGVjbCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVySXNWYWxpZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlcklzVmFsaWQocmVhZGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJJc1ZhbGlkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJMb2NhbE5hbWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJMb2NhbE5hbWUocmVhZGVyKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlckxvY2FsTmFtZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKI2lmZGVmIExJQlhNTF9SRUFERVJfRU5BQkxFRAoKI2RlZmluZSBnZW5fbmJfeG1sVGV4dFJlYWRlckxvY2F0b3JQdHIgMQpzdGF0aWMgeG1sVGV4dFJlYWRlckxvY2F0b3JQdHIgZ2VuX3htbFRleHRSZWFkZXJMb2NhdG9yUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxUZXh0UmVhZGVyTG9jYXRvclB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sVGV4dFJlYWRlckxvY2F0b3JQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJMb2NhdG9yQmFzZVVSSSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyTG9jYXRvclB0ciBsb2NhdG9yOyAvKiB0aGUgeG1sVGV4dFJlYWRlckxvY2F0b3JQdHIgdXNlZCAqLwogICAgaW50IG5fbG9jYXRvcjsKCiAgICBmb3IgKG5fbG9jYXRvciA9IDA7bl9sb2NhdG9yIDwgZ2VuX25iX3htbFRleHRSZWFkZXJMb2NhdG9yUHRyO25fbG9jYXRvcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBsb2NhdG9yID0gZ2VuX3htbFRleHRSZWFkZXJMb2NhdG9yUHRyKG5fbG9jYXRvciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyTG9jYXRvckJhc2VVUkkobG9jYXRvcik7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlckxvY2F0b3JQdHIobl9sb2NhdG9yLCBsb2NhdG9yLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJMb2NhdG9yQmFzZVVSSSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sb2NhdG9yKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckxvY2F0b3JMaW5lTnVtYmVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJMb2NhdG9yUHRyIGxvY2F0b3I7IC8qIHRoZSB4bWxUZXh0UmVhZGVyTG9jYXRvclB0ciB1c2VkICovCiAgICBpbnQgbl9sb2NhdG9yOwoKICAgIGZvciAobl9sb2NhdG9yID0gMDtuX2xvY2F0b3IgPCBnZW5fbmJfeG1sVGV4dFJlYWRlckxvY2F0b3JQdHI7bl9sb2NhdG9yKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGxvY2F0b3IgPSBnZW5feG1sVGV4dFJlYWRlckxvY2F0b3JQdHIobl9sb2NhdG9yLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJMb2NhdG9yTGluZU51bWJlcihsb2NhdG9yKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlckxvY2F0b3JQdHIobl9sb2NhdG9yLCBsb2NhdG9yLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJMb2NhdG9yTGluZU51bWJlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sb2NhdG9yKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlckxvb2t1cE5hbWVzcGFjZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwogICAgeG1sQ2hhciAqIHByZWZpeDsgLyogdGhlIHByZWZpeCB3aG9zZSBuYW1lc3BhY2UgVVJJIGlzIHRvIGJlIHJlc29sdmVkLiBUbyByZXR1cm4gdGhlIGRlZmF1bHQgbmFtZXNwYWNlLCBzcGVjaWZ5IE5VTEwgKi8KICAgIGludCBuX3ByZWZpeDsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgIGZvciAobl9wcmVmaXggPSAwO25fcHJlZml4IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHJlZml4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKICAgICAgICBwcmVmaXggPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlckxvb2t1cE5hbWVzcGFjZShyZWFkZXIsIChjb25zdCB4bWxDaGFyICopcHJlZml4KTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlckxvb2t1cE5hbWVzcGFjZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHJlZml4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlck1vdmVUb0F0dHJpYnV0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyTW92ZVRvQXR0cmlidXRlKHJlYWRlciwgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlck1vdmVUb0F0dHJpYnV0ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJNb3ZlVG9BdHRyaWJ1dGVObyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwogICAgaW50IG5vOyAvKiB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgYXR0cmlidXRlIHJlbGF0aXZlIHRvIHRoZSBjb250YWluaW5nIGVsZW1lbnQuICovCiAgICBpbnQgbl9ubzsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgIGZvciAobl9ubyA9IDA7bl9ubyA8IGdlbl9uYl9pbnQ7bl9ubysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CiAgICAgICAgbm8gPSBnZW5faW50KG5fbm8sIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlck1vdmVUb0F0dHJpYnV0ZU5vKHJlYWRlciwgbm8pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIGRlc19pbnQobl9ubywgbm8sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlck1vdmVUb0F0dHJpYnV0ZU5vIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ubyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJNb3ZlVG9BdHRyaWJ1dGVOcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwogICAgeG1sQ2hhciAqIGxvY2FsTmFtZTsgLyogdGhlIGxvY2FsIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gKi8KICAgIGludCBuX2xvY2FsTmFtZTsKICAgIHhtbENoYXIgKiBuYW1lc3BhY2VVUkk7IC8qIHRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBhdHRyaWJ1dGUuICovCiAgICBpbnQgbl9uYW1lc3BhY2VVUkk7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICBmb3IgKG5fbG9jYWxOYW1lID0gMDtuX2xvY2FsTmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2xvY2FsTmFtZSsrKSB7CiAgICBmb3IgKG5fbmFtZXNwYWNlVVJJID0gMDtuX25hbWVzcGFjZVVSSSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWVzcGFjZVVSSSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CiAgICAgICAgbG9jYWxOYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbG9jYWxOYW1lLCAxKTsKICAgICAgICBuYW1lc3BhY2VVUkkgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lc3BhY2VVUkksIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlck1vdmVUb0F0dHJpYnV0ZU5zKHJlYWRlciwgKGNvbnN0IHhtbENoYXIgKilsb2NhbE5hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZXNwYWNlVVJJKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9sb2NhbE5hbWUsIChjb25zdCB4bWxDaGFyICopbG9jYWxOYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lc3BhY2VVUkksIChjb25zdCB4bWxDaGFyICopbmFtZXNwYWNlVVJJLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJNb3ZlVG9BdHRyaWJ1dGVOcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbG9jYWxOYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWVzcGFjZVVSSSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJNb3ZlVG9FbGVtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyTW92ZVRvRWxlbWVudChyZWFkZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlck1vdmVUb0VsZW1lbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlck1vdmVUb0ZpcnN0QXR0cmlidXRlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyTW92ZVRvRmlyc3RBdHRyaWJ1dGUocmVhZGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJNb3ZlVG9GaXJzdEF0dHJpYnV0ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyTW92ZVRvTmV4dEF0dHJpYnV0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlck1vdmVUb05leHRBdHRyaWJ1dGUocmVhZGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJNb3ZlVG9OZXh0QXR0cmlidXRlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJOYW1lKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyTmFtZShyZWFkZXIpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyTmFtZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyTmFtZXNwYWNlVXJpKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyTmFtZXNwYWNlVXJpKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJOYW1lc3BhY2VVcmkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlck5leHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJOZXh0KHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyTmV4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyTmV4dFNpYmxpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJOZXh0U2libGluZyhyZWFkZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlck5leHRTaWJsaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJOb2RlVHlwZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlck5vZGVUeXBlKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyTm9kZVR5cGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlck5vcm1hbGl6YXRpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJOb3JtYWxpemF0aW9uKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyTm9ybWFsaXphdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyUHJlZml4KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyUHJlZml4KHJlYWRlcik7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJQcmVmaXgiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlclByZXNlcnZlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlclByZXNlcnZlKHJlYWRlcik7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlclByZXNlcnZlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJQcmVzZXJ2ZVBhdHRlcm4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfUEFUVEVSTl9FTkFCTEVEKQojaWZkZWYgTElCWE1MX1BBVFRFUk5fRU5BQkxFRAogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwogICAgeG1sQ2hhciAqIHBhdHRlcm47IC8qIGFuIFhQYXRoIHN1YnNldCBwYXR0ZXJuICovCiAgICBpbnQgbl9wYXR0ZXJuOwogICAgeG1sQ2hhciAqKiBuYW1lc3BhY2VzOyAvKiB0aGUgcHJlZml4IGRlZmluaXRpb25zLCBhcnJheSBvZiBbVVJJLCBwcmVmaXhdIG9yIE5VTEwgKi8KICAgIGludCBuX25hbWVzcGFjZXM7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICBmb3IgKG5fcGF0dGVybiA9IDA7bl9wYXR0ZXJuIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcGF0dGVybisrKSB7CiAgICBmb3IgKG5fbmFtZXNwYWNlcyA9IDA7bl9uYW1lc3BhY2VzIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyX3B0cjtuX25hbWVzcGFjZXMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwogICAgICAgIHBhdHRlcm4gPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wYXR0ZXJuLCAxKTsKICAgICAgICBuYW1lc3BhY2VzID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyX3B0cihuX25hbWVzcGFjZXMsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlclByZXNlcnZlUGF0dGVybihyZWFkZXIsIChjb25zdCB4bWxDaGFyICopcGF0dGVybiwgKGNvbnN0IHhtbENoYXIgKiopbmFtZXNwYWNlcyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcGF0dGVybiwgKGNvbnN0IHhtbENoYXIgKilwYXR0ZXJuLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHJfcHRyKG5fbmFtZXNwYWNlcywgKGNvbnN0IHhtbENoYXIgKiopbmFtZXNwYWNlcywgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyUHJlc2VydmVQYXR0ZXJuIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wYXR0ZXJuKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWVzcGFjZXMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlclF1b3RlQ2hhcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlclF1b3RlQ2hhcihyZWFkZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlclF1b3RlQ2hhciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyUmVhZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlclJlYWQocmVhZGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJSZWFkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJSZWFkQXR0cmlidXRlVmFsdWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJSZWFkQXR0cmlidXRlVmFsdWUocmVhZGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgcmVhZGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRSZWFkZXJSZWFkQXR0cmlidXRlVmFsdWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlclJlYWRTdGF0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlclJlYWRTdGF0ZShyZWFkZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlclJlYWRTdGF0ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyUmVsYXhOR1NldFNjaGVtYSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CiAgICB4bWxSZWxheE5HUHRyIHNjaGVtYTsgLyogYSBwcmVjb21waWxlZCBSZWxheE5HIHNjaGVtYSAqLwogICAgaW50IG5fc2NoZW1hOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgZm9yIChuX3NjaGVtYSA9IDA7bl9zY2hlbWEgPCBnZW5fbmJfeG1sUmVsYXhOR1B0cjtuX3NjaGVtYSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CiAgICAgICAgc2NoZW1hID0gZ2VuX3htbFJlbGF4TkdQdHIobl9zY2hlbWEsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlclJlbGF4TkdTZXRTY2hlbWEocmVhZGVyLCBzY2hlbWEpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIGRlc194bWxSZWxheE5HUHRyKG5fc2NoZW1hLCBzY2hlbWEsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlclJlbGF4TkdTZXRTY2hlbWEiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NjaGVtYSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJSZWxheE5HVmFsaWRhdGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwogICAgY2hhciAqIHJuZzsgLyogdGhlIHBhdGggdG8gYSBSZWxheE5HIHNjaGVtYSBvciBOVUxMICovCiAgICBpbnQgbl9ybmc7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICBmb3IgKG5fcm5nID0gMDtuX3JuZyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX3JuZysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CiAgICAgICAgcm5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fcm5nLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJSZWxheE5HVmFsaWRhdGUocmVhZGVyLCAoY29uc3QgY2hhciAqKXJuZyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fcm5nLCAoY29uc3QgY2hhciAqKXJuZywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyUmVsYXhOR1ZhbGlkYXRlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ybmcpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyU2NoZW1hVmFsaWRhdGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwogICAgY2hhciAqIHhzZDsgLyogdGhlIHBhdGggdG8gYSBXM0MgWFNEIHNjaGVtYSBvciBOVUxMICovCiAgICBpbnQgbl94c2Q7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICBmb3IgKG5feHNkID0gMDtuX3hzZCA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX3hzZCsrKSB7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwogICAgICAgIHhzZCA9IGdlbl9jb25zdF9jaGFyX3B0cihuX3hzZCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyU2NoZW1hVmFsaWRhdGUocmVhZGVyLCAoY29uc3QgY2hhciAqKXhzZCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5feHNkLCAoY29uc3QgY2hhciAqKXhzZCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlclNjaGVtYVZhbGlkYXRlQ3R4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CiAgICB4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dDsgLyogdGhlIFhNTCBTY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0IG9yIE5VTEwgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgb3B0aW9uczsgLyogb3B0aW9ucyAobm90IHVzZWQgeWV0KSAqLwogICAgaW50IG5fb3B0aW9uczsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sU2NoZW1hVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fb3B0aW9ucyA9IDA7bl9vcHRpb25zIDwgZ2VuX25iX3BhcnNlcm9wdGlvbnM7bl9vcHRpb25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFNjaGVtYVZhbGlkQ3R4dFB0cihuX2N0eHQsIDEpOwogICAgICAgIG9wdGlvbnMgPSBnZW5fcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlclNjaGVtYVZhbGlkYXRlQ3R4dChyZWFkZXIsIGN0eHQsIG9wdGlvbnMpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIGRlc194bWxTY2hlbWFWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAxKTsKICAgICAgICBkZXNfcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIG9wdGlvbnMsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlclNjaGVtYVZhbGlkYXRlQ3R4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vcHRpb25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlclNldEVycm9ySGFuZGxlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyU2V0UGFyc2VyUHJvcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFQURFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLwogICAgaW50IG5fcmVhZGVyOwogICAgaW50IHByb3A7IC8qIHRoZSB4bWxQYXJzZXJQcm9wZXJ0aWVzIHRvIHNldCAqLwogICAgaW50IG5fcHJvcDsKICAgIGludCB2YWx1ZTsgLyogdXN1YWxseSAwIG9yIDEgdG8gKGRlKWFjdGl2YXRlIGl0ICovCiAgICBpbnQgbl92YWx1ZTsKCiAgICBmb3IgKG5fcmVhZGVyID0gMDtuX3JlYWRlciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyUHRyO25fcmVhZGVyKyspIHsKICAgIGZvciAobl9wcm9wID0gMDtuX3Byb3AgPCBnZW5fbmJfaW50O25fcHJvcCsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfaW50O25fdmFsdWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgcmVhZGVyID0gZ2VuX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIDApOwogICAgICAgIHByb3AgPSBnZW5faW50KG5fcHJvcCwgMSk7CiAgICAgICAgdmFsdWUgPSBnZW5faW50KG5fdmFsdWUsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlclNldFBhcnNlclByb3AocmVhZGVyLCBwcm9wLCB2YWx1ZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgZGVzX2ludChuX3Byb3AsIHByb3AsIDEpOwogICAgICAgIGRlc19pbnQobl92YWx1ZSwgdmFsdWUsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlclNldFBhcnNlclByb3AiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3Byb3ApOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyU2V0U2NoZW1hKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgIGludCBuX3JlYWRlcjsKICAgIHhtbFNjaGVtYVB0ciBzY2hlbWE7IC8qIGEgcHJlY29tcGlsZWQgU2NoZW1hIHNjaGVtYSAqLwogICAgaW50IG5fc2NoZW1hOwoKICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewogICAgZm9yIChuX3NjaGVtYSA9IDA7bl9zY2hlbWEgPCBnZW5fbmJfeG1sU2NoZW1hUHRyO25fc2NoZW1hKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKICAgICAgICBzY2hlbWEgPSBnZW5feG1sU2NoZW1hUHRyKG5fc2NoZW1hLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJTZXRTY2hlbWEocmVhZGVyLCBzY2hlbWEpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIGRlc194bWxTY2hlbWFQdHIobl9zY2hlbWEsIHNjaGVtYSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyU2V0U2NoZW1hIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zY2hlbWEpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyU2V0U3RydWN0dXJlZEVycm9ySGFuZGxlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0UmVhZGVyU2V0dXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUFERVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIGFuIFhNTCByZWFkZXIgKi8KICAgIGludCBuX3JlYWRlcjsKICAgIHhtbFBhcnNlcklucHV0QnVmZmVyUHRyIGlucHV0OyAvKiB4bWxQYXJzZXJJbnB1dEJ1ZmZlclB0ciB1c2VkIHRvIGZlZWQgdGhlIHJlYWRlciwgd2lsbCBiZSBkZXN0cm95ZWQgd2l0aCBpdC4gKi8KICAgIGludCBuX2lucHV0OwogICAgY29uc3QgY2hhciAqIFVSTDsgLyogdGhlIGJhc2UgVVJMIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50ICovCiAgICBpbnQgbl9VUkw7CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgaW50IG5fZW5jb2Rpbmc7CiAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiB4bWxQYXJzZXJPcHRpb24gKi8KICAgIGludCBuX29wdGlvbnM7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICBmb3IgKG5faW5wdXQgPSAwO25faW5wdXQgPCBnZW5fbmJfeG1sUGFyc2VySW5wdXRCdWZmZXJQdHI7bl9pbnB1dCsrKSB7CiAgICBmb3IgKG5fVVJMID0gMDtuX1VSTCA8IGdlbl9uYl9maWxlcGF0aDtuX1VSTCsrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICBmb3IgKG5fb3B0aW9ucyA9IDA7bl9vcHRpb25zIDwgZ2VuX25iX3BhcnNlcm9wdGlvbnM7bl9vcHRpb25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKICAgICAgICBpbnB1dCA9IGdlbl94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cihuX2lucHV0LCAxKTsKICAgICAgICBVUkwgPSBnZW5fZmlsZXBhdGgobl9VUkwsIDIpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDMpOwogICAgICAgIG9wdGlvbnMgPSBnZW5fcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIDQpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFJlYWRlclNldHVwKHJlYWRlciwgaW5wdXQsIFVSTCwgKGNvbnN0IGNoYXIgKillbmNvZGluZywgb3B0aW9ucyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fVVJMLCBVUkwsIDIpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAzKTsKICAgICAgICBkZXNfcGFyc2Vyb3B0aW9ucyhuX29wdGlvbnMsIG9wdGlvbnMsIDQpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlclNldHVwIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbnB1dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3B0aW9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJTdGFuZGFsb25lKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyU3RhbmRhbG9uZShyZWFkZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlclN0YW5kYWxvbmUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVhZGVyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFJlYWRlclZhbHVlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyVmFsdWUocmVhZGVyKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCByZWFkZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlclZhbHVlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRSZWFkZXJYbWxMYW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVBREVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICBpbnQgbl9yZWFkZXI7CgogICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICByZWFkZXIgPSBnZW5feG1sVGV4dFJlYWRlclB0cihuX3JlYWRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyWG1sTGFuZyhyZWFkZXIpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyWG1sTGFuZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZWFkZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbHJlYWRlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgeG1scmVhZGVyIDogNzUgb2YgODUgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld1RleHRSZWFkZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3VGV4dFJlYWRlckZpbGVuYW1lKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlYWRlckZvckRvYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWFkZXJGb3JGaWxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlYWRlckZvck1lbW9yeSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWFkZXJOZXdEb2MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVhZGVyTmV3RmlsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWFkZXJOZXdNZW1vcnkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVhZGVyTmV3V2Fsa2VyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlYWRlcldhbGtlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyQXR0cmlidXRlQ291bnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckJhc2VVcmkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckJ5dGVDb25zdW1lZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyQ2xvc2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckNvbnN0QmFzZVVyaSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyQ29uc3RFbmNvZGluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyQ29uc3RMb2NhbE5hbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckNvbnN0TmFtZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyQ29uc3ROYW1lc3BhY2VVcmkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckNvbnN0UHJlZml4KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJDb25zdFN0cmluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyQ29uc3RWYWx1ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyQ29uc3RYbWxMYW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJDb25zdFhtbFZlcnNpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckN1cnJlbnREb2MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckN1cnJlbnROb2RlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJEZXB0aCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyRXhwYW5kKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJHZXRBdHRyaWJ1dGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckdldEF0dHJpYnV0ZU5vKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJHZXRBdHRyaWJ1dGVOcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyR2V0RXJyb3JIYW5kbGVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJHZXRQYXJzZXJDb2x1bW5OdW1iZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckdldFBhcnNlckxpbmVOdW1iZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckdldFBhcnNlclByb3AoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckdldFJlbWFpbmRlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVySGFzQXR0cmlidXRlcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVySGFzVmFsdWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlcklzRGVmYXVsdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVySXNFbXB0eUVsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlcklzTmFtZXNwYWNlRGVjbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVySXNWYWxpZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyTG9jYWxOYW1lKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJMb2NhdG9yQmFzZVVSSSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyTG9jYXRvckxpbmVOdW1iZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlckxvb2t1cE5hbWVzcGFjZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyTW92ZVRvQXR0cmlidXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJNb3ZlVG9BdHRyaWJ1dGVObygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyTW92ZVRvQXR0cmlidXRlTnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlck1vdmVUb0VsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlck1vdmVUb0ZpcnN0QXR0cmlidXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJNb3ZlVG9OZXh0QXR0cmlidXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJOYW1lKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJOYW1lc3BhY2VVcmkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlck5leHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlck5leHRTaWJsaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJOb2RlVHlwZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyTm9ybWFsaXphdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyUHJlZml4KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJQcmVzZXJ2ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyUHJlc2VydmVQYXR0ZXJuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJRdW90ZUNoYXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlclJlYWQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlclJlYWRBdHRyaWJ1dGVWYWx1ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyUmVhZFN0YXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJSZWxheE5HU2V0U2NoZW1hKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJSZWxheE5HVmFsaWRhdGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlclNjaGVtYVZhbGlkYXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJTY2hlbWFWYWxpZGF0ZUN0eHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlclNldEVycm9ySGFuZGxlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyU2V0UGFyc2VyUHJvcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyU2V0U2NoZW1hKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJTZXRTdHJ1Y3R1cmVkRXJyb3JIYW5kbGVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRSZWFkZXJTZXR1cCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyU3RhbmRhbG9uZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0UmVhZGVyVmFsdWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFJlYWRlclhtbExhbmcoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIHhtbHJlYWRlcjogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sRXhwQ3R4dE5iQ29ucyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFR0VYUF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9FWFBSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbEV4cEN0eHRQdHIgY3R4dDsgLyogYW4gZXhwcmVzc2lvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sRXhwQ3R4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxFeHBDdHh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxFeHBDdHh0TmJDb25zKGN0eHQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxFeHBDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxFeHBDdHh0TmJDb25zIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxFeHBDdHh0TmJOb2Rlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFR0VYUF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9FWFBSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbEV4cEN0eHRQdHIgY3R4dDsgLyogYW4gZXhwcmVzc2lvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sRXhwQ3R4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxFeHBDdHh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxFeHBDdHh0TmJOb2RlcyhjdHh0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRXhwQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRXhwQ3R4dE5iTm9kZXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEV4cER1bXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUdFWFBfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfRVhQUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogYSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgb3V0cHV0ICovCiAgICBpbnQgbl9idWY7CiAgICB4bWxFeHBOb2RlUHRyIGV4cHI7IC8qIHRoZSBjb21waWxlZCBleHByZXNzaW9uICovCiAgICBpbnQgbl9leHByOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fZXhwciA9IDA7bl9leHByIDwgZ2VuX25iX3htbEV4cE5vZGVQdHI7bl9leHByKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOwogICAgICAgIGV4cHIgPSBnZW5feG1sRXhwTm9kZVB0cihuX2V4cHIsIDEpOwoKICAgICAgICB4bWxFeHBEdW1wKGJ1ZiwgZXhwcik7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CiAgICAgICAgZGVzX3htbEV4cE5vZGVQdHIobl9leHByLCBleHByLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEV4cER1bXAiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2V4cHIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxFeHBFeHBEZXJpdmUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRXhwR2V0TGFuZ3VhZ2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUdFWFBfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfRVhQUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxFeHBDdHh0UHRyIGN0eHQ7IC8qIHRoZSBleHByZXNzaW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxFeHBOb2RlUHRyIGV4cDsgLyogdGhlIGV4cHJlc3Npb24gKi8KICAgIGludCBuX2V4cDsKICAgIHhtbENoYXIgKiogbGFuZ0xpc3Q7IC8qIHdoZXJlIHRvIHN0b3JlIHRoZSB0b2tlbnMgKi8KICAgIGludCBuX2xhbmdMaXN0OwogICAgaW50IGxlbjsgLyogdGhlIGFsbG9jYXRlZCBsZW5naHQgb2YgQGxpc3QgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbEV4cEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9leHAgPSAwO25fZXhwIDwgZ2VuX25iX3htbEV4cE5vZGVQdHI7bl9leHArKykgewogICAgZm9yIChuX2xhbmdMaXN0ID0gMDtuX2xhbmdMaXN0IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyX3B0cjtuX2xhbmdMaXN0KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbEV4cEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBleHAgPSBnZW5feG1sRXhwTm9kZVB0cihuX2V4cCwgMSk7CiAgICAgICAgbGFuZ0xpc3QgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHJfcHRyKG5fbGFuZ0xpc3QsIDIpOwogICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sRXhwR2V0TGFuZ3VhZ2UoY3R4dCwgZXhwLCAoY29uc3QgeG1sQ2hhciAqKilsYW5nTGlzdCwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRXhwQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxFeHBOb2RlUHRyKG5fZXhwLCBleHAsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cl9wdHIobl9sYW5nTGlzdCwgKGNvbnN0IHhtbENoYXIgKiopbGFuZ0xpc3QsIDIpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxFeHBHZXRMYW5ndWFnZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2V4cCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sYW5nTGlzdCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxFeHBHZXRTdGFydCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFR0VYUF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9FWFBSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbEV4cEN0eHRQdHIgY3R4dDsgLyogdGhlIGV4cHJlc3Npb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbEV4cE5vZGVQdHIgZXhwOyAvKiB0aGUgZXhwcmVzc2lvbiAqLwogICAgaW50IG5fZXhwOwogICAgeG1sQ2hhciAqKiB0b2tMaXN0OyAvKiB3aGVyZSB0byBzdG9yZSB0aGUgdG9rZW5zICovCiAgICBpbnQgbl90b2tMaXN0OwogICAgaW50IGxlbjsgLyogdGhlIGFsbG9jYXRlZCBsZW5naHQgb2YgQGxpc3QgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbEV4cEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9leHAgPSAwO25fZXhwIDwgZ2VuX25iX3htbEV4cE5vZGVQdHI7bl9leHArKykgewogICAgZm9yIChuX3Rva0xpc3QgPSAwO25fdG9rTGlzdCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cl9wdHI7bl90b2tMaXN0KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbEV4cEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBleHAgPSBnZW5feG1sRXhwTm9kZVB0cihuX2V4cCwgMSk7CiAgICAgICAgdG9rTGlzdCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cl9wdHIobl90b2tMaXN0LCAyKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEV4cEdldFN0YXJ0KGN0eHQsIGV4cCwgKGNvbnN0IHhtbENoYXIgKiopdG9rTGlzdCwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRXhwQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxFeHBOb2RlUHRyKG5fZXhwLCBleHAsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cl9wdHIobl90b2tMaXN0LCAoY29uc3QgeG1sQ2hhciAqKil0b2tMaXN0LCAyKTsKICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRXhwR2V0U3RhcnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9leHApOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdG9rTGlzdCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxFeHBJc05pbGxhYmxlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVHRVhQX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX0VYUFJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sRXhwTm9kZVB0ciBleHA7IC8qIHRoZSBleHByZXNzaW9uICovCiAgICBpbnQgbl9leHA7CgogICAgZm9yIChuX2V4cCA9IDA7bl9leHAgPCBnZW5fbmJfeG1sRXhwTm9kZVB0cjtuX2V4cCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBleHAgPSBnZW5feG1sRXhwTm9kZVB0cihuX2V4cCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxFeHBJc05pbGxhYmxlKGV4cCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEV4cE5vZGVQdHIobl9leHAsIGV4cCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxFeHBJc05pbGxhYmxlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2V4cCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEV4cE1heFRva2VuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfUkVHRVhQX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX0VYUFJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sRXhwTm9kZVB0ciBleHByOyAvKiBhIGNvbXBpbGVkIGV4cHJlc3Npb24gKi8KICAgIGludCBuX2V4cHI7CgogICAgZm9yIChuX2V4cHIgPSAwO25fZXhwciA8IGdlbl9uYl94bWxFeHBOb2RlUHRyO25fZXhwcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBleHByID0gZ2VuX3htbEV4cE5vZGVQdHIobl9leHByLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbEV4cE1heFRva2VuKGV4cHIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxFeHBOb2RlUHRyKG5fZXhwciwgZXhwciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxFeHBNYXhUb2tlbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9leHByKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRXhwTmV3QXRvbSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxFeHBOZXdDdHh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEV4cE5ld09yKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEV4cE5ld1JhbmdlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbEV4cE5ld1NlcSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxFeHBQYXJzZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxFeHBSZWYodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUdFWFBfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfRVhQUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sRXhwTm9kZVB0ciBleHA7IC8qIHRoZSBleHByZXNzaW9uICovCiAgICBpbnQgbl9leHA7CgogICAgZm9yIChuX2V4cCA9IDA7bl9leHAgPCBnZW5fbmJfeG1sRXhwTm9kZVB0cjtuX2V4cCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBleHAgPSBnZW5feG1sRXhwTm9kZVB0cihuX2V4cCwgMCk7CgogICAgICAgIHhtbEV4cFJlZihleHApOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRXhwTm9kZVB0cihuX2V4cCwgZXhwLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEV4cFJlZiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9leHApOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxFeHBTdHJpbmdEZXJpdmUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sRXhwU3Vic3VtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFR0VYUF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9FWFBSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbEV4cEN0eHRQdHIgY3R4dDsgLyogdGhlIGV4cHJlc3Npb25zIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxFeHBOb2RlUHRyIGV4cDsgLyogdGhlIGVuZ2xvYmluZyBleHByZXNzaW9uICovCiAgICBpbnQgbl9leHA7CiAgICB4bWxFeHBOb2RlUHRyIHN1YjsgLyogdGhlIHN1YmV4cHJlc3Npb24gKi8KICAgIGludCBuX3N1YjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbEV4cEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9leHAgPSAwO25fZXhwIDwgZ2VuX25iX3htbEV4cE5vZGVQdHI7bl9leHArKykgewogICAgZm9yIChuX3N1YiA9IDA7bl9zdWIgPCBnZW5fbmJfeG1sRXhwTm9kZVB0cjtuX3N1YisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbEV4cEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBleHAgPSBnZW5feG1sRXhwTm9kZVB0cihuX2V4cCwgMSk7CiAgICAgICAgc3ViID0gZ2VuX3htbEV4cE5vZGVQdHIobl9zdWIsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sRXhwU3Vic3VtZShjdHh0LCBleHAsIHN1Yik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEV4cEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sRXhwTm9kZVB0cihuX2V4cCwgZXhwLCAxKTsKICAgICAgICBkZXNfeG1sRXhwTm9kZVB0cihuX3N1Yiwgc3ViLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEV4cFN1YnN1bWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9leHApOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3ViKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCiNpZmRlZiBMSUJYTUxfUkVHRVhQX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbFJlZ0V4ZWNDdHh0UHRyIDEKc3RhdGljIHhtbFJlZ0V4ZWNDdHh0UHRyIGdlbl94bWxSZWdFeGVjQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sUmVnRXhlY0N0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFJlZ0V4ZWNDdHh0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWdFeGVjRXJySW5mbyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFR0VYUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxSZWdFeGVjQ3R4dFB0ciBleGVjOyAvKiBhIHJlZ2V4cCBleGVjdXRpb24gY29udGV4dCBnZW5lcmF0aW5nIGFuIGVycm9yICovCiAgICBpbnQgbl9leGVjOwogICAgeG1sQ2hhciAqKiBzdHJpbmc7IC8qIHJldHVybiB2YWx1ZSBmb3IgdGhlIGVycm9yIHN0cmluZyAqLwogICAgaW50IG5fc3RyaW5nOwogICAgaW50ICogbmJ2YWw7IC8qIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBhY2NlcHRlZCB2YWx1ZXMgSU4vT1VUICovCiAgICBpbnQgbl9uYnZhbDsKICAgIGludCAqIG5ibmVnOyAvKiByZXR1cm4gbnVtYmVyIG9mIG5lZ2F0aXZlIHRyYW5zaXRpb25zICovCiAgICBpbnQgbl9uYm5lZzsKICAgIHhtbENoYXIgKiogdmFsdWVzOyAvKiBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBhY2NlcHRhYmxlIHZhbHVlcyAqLwogICAgaW50IG5fdmFsdWVzOwogICAgaW50ICogdGVybWluYWw7IC8qIHJldHVybiB2YWx1ZSBpZiB0aGlzIHdhcyBhIHRlcm1pbmFsIHN0YXRlICovCiAgICBpbnQgbl90ZXJtaW5hbDsKCiAgICBmb3IgKG5fZXhlYyA9IDA7bl9leGVjIDwgZ2VuX25iX3htbFJlZ0V4ZWNDdHh0UHRyO25fZXhlYysrKSB7CiAgICBmb3IgKG5fc3RyaW5nID0gMDtuX3N0cmluZyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cl9wdHI7bl9zdHJpbmcrKykgewogICAgZm9yIChuX25idmFsID0gMDtuX25idmFsIDwgZ2VuX25iX2ludF9wdHI7bl9uYnZhbCsrKSB7CiAgICBmb3IgKG5fbmJuZWcgPSAwO25fbmJuZWcgPCBnZW5fbmJfaW50X3B0cjtuX25ibmVnKyspIHsKICAgIGZvciAobl92YWx1ZXMgPSAwO25fdmFsdWVzIDwgZ2VuX25iX3htbENoYXJfcHRyX3B0cjtuX3ZhbHVlcysrKSB7CiAgICBmb3IgKG5fdGVybWluYWwgPSAwO25fdGVybWluYWwgPCBnZW5fbmJfaW50X3B0cjtuX3Rlcm1pbmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGV4ZWMgPSBnZW5feG1sUmVnRXhlY0N0eHRQdHIobl9leGVjLCAwKTsKICAgICAgICBzdHJpbmcgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHJfcHRyKG5fc3RyaW5nLCAxKTsKICAgICAgICBuYnZhbCA9IGdlbl9pbnRfcHRyKG5fbmJ2YWwsIDIpOwogICAgICAgIG5ibmVnID0gZ2VuX2ludF9wdHIobl9uYm5lZywgMyk7CiAgICAgICAgdmFsdWVzID0gZ2VuX3htbENoYXJfcHRyX3B0cihuX3ZhbHVlcywgNCk7CiAgICAgICAgdGVybWluYWwgPSBnZW5faW50X3B0cihuX3Rlcm1pbmFsLCA1KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlZ0V4ZWNFcnJJbmZvKGV4ZWMsIChjb25zdCB4bWxDaGFyICoqKXN0cmluZywgbmJ2YWwsIG5ibmVnLCB2YWx1ZXMsIHRlcm1pbmFsKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUmVnRXhlY0N0eHRQdHIobl9leGVjLCBleGVjLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHJfcHRyKG5fc3RyaW5nLCAoY29uc3QgeG1sQ2hhciAqKilzdHJpbmcsIDEpOwogICAgICAgIGRlc19pbnRfcHRyKG5fbmJ2YWwsIG5idmFsLCAyKTsKICAgICAgICBkZXNfaW50X3B0cihuX25ibmVnLCBuYm5lZywgMyk7CiAgICAgICAgZGVzX3htbENoYXJfcHRyX3B0cihuX3ZhbHVlcywgdmFsdWVzLCA0KTsKICAgICAgICBkZXNfaW50X3B0cihuX3Rlcm1pbmFsLCB0ZXJtaW5hbCwgNSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWdFeGVjRXJySW5mbyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9leGVjKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cmluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYnZhbCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYm5lZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZXMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdGVybWluYWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxSZWdFeGVjTmV4dFZhbHVlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFR0VYUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxSZWdFeGVjQ3R4dFB0ciBleGVjOyAvKiBhIHJlZ2V4cCBleGVjdXRpb24gY29udGV4dCAqLwogICAgaW50IG5fZXhlYzsKICAgIGludCAqIG5idmFsOyAvKiBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYWNjZXB0ZWQgdmFsdWVzIElOL09VVCAqLwogICAgaW50IG5fbmJ2YWw7CiAgICBpbnQgKiBuYm5lZzsgLyogcmV0dXJuIG51bWJlciBvZiBuZWdhdGl2ZSB0cmFuc2l0aW9ucyAqLwogICAgaW50IG5fbmJuZWc7CiAgICB4bWxDaGFyICoqIHZhbHVlczsgLyogcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgYWNjZXB0YWJsZSB2YWx1ZXMgKi8KICAgIGludCBuX3ZhbHVlczsKICAgIGludCAqIHRlcm1pbmFsOyAvKiByZXR1cm4gdmFsdWUgaWYgdGhpcyB3YXMgYSB0ZXJtaW5hbCBzdGF0ZSAqLwogICAgaW50IG5fdGVybWluYWw7CgogICAgZm9yIChuX2V4ZWMgPSAwO25fZXhlYyA8IGdlbl9uYl94bWxSZWdFeGVjQ3R4dFB0cjtuX2V4ZWMrKykgewogICAgZm9yIChuX25idmFsID0gMDtuX25idmFsIDwgZ2VuX25iX2ludF9wdHI7bl9uYnZhbCsrKSB7CiAgICBmb3IgKG5fbmJuZWcgPSAwO25fbmJuZWcgPCBnZW5fbmJfaW50X3B0cjtuX25ibmVnKyspIHsKICAgIGZvciAobl92YWx1ZXMgPSAwO25fdmFsdWVzIDwgZ2VuX25iX3htbENoYXJfcHRyX3B0cjtuX3ZhbHVlcysrKSB7CiAgICBmb3IgKG5fdGVybWluYWwgPSAwO25fdGVybWluYWwgPCBnZW5fbmJfaW50X3B0cjtuX3Rlcm1pbmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGV4ZWMgPSBnZW5feG1sUmVnRXhlY0N0eHRQdHIobl9leGVjLCAwKTsKICAgICAgICBuYnZhbCA9IGdlbl9pbnRfcHRyKG5fbmJ2YWwsIDEpOwogICAgICAgIG5ibmVnID0gZ2VuX2ludF9wdHIobl9uYm5lZywgMik7CiAgICAgICAgdmFsdWVzID0gZ2VuX3htbENoYXJfcHRyX3B0cihuX3ZhbHVlcywgMyk7CiAgICAgICAgdGVybWluYWwgPSBnZW5faW50X3B0cihuX3Rlcm1pbmFsLCA0KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlZ0V4ZWNOZXh0VmFsdWVzKGV4ZWMsIG5idmFsLCBuYm5lZywgdmFsdWVzLCB0ZXJtaW5hbCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFJlZ0V4ZWNDdHh0UHRyKG5fZXhlYywgZXhlYywgMCk7CiAgICAgICAgZGVzX2ludF9wdHIobl9uYnZhbCwgbmJ2YWwsIDEpOwogICAgICAgIGRlc19pbnRfcHRyKG5fbmJuZWcsIG5ibmVnLCAyKTsKICAgICAgICBkZXNfeG1sQ2hhcl9wdHJfcHRyKG5fdmFsdWVzLCB2YWx1ZXMsIDMpOwogICAgICAgIGRlc19pbnRfcHRyKG5fdGVybWluYWwsIHRlcm1pbmFsLCA0KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlZ0V4ZWNOZXh0VmFsdWVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2V4ZWMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmJ2YWwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmJuZWcpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWVzKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3Rlcm1pbmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVnRXhlY1B1c2hTdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUdFWFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sUmVnRXhlY0N0eHRQdHIgZXhlYzsgLyogYSByZWdleHAgZXhlY3V0aW9uIGNvbnRleHQgb3IgTlVMTCB0byBpbmRpY2F0ZSB0aGUgZW5kICovCiAgICBpbnQgbl9leGVjOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiBhIHN0cmluZyB0b2tlbiBpbnB1dCAqLwogICAgaW50IG5fdmFsdWU7CiAgICB2b2lkICogZGF0YTsgLyogZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSB0b2tlbiB0byByZXVzZSBpbiBjYWxsYmFja3MgKi8KICAgIGludCBuX2RhdGE7CgogICAgZm9yIChuX2V4ZWMgPSAwO25fZXhlYyA8IGdlbl9uYl94bWxSZWdFeGVjQ3R4dFB0cjtuX2V4ZWMrKykgewogICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgewogICAgZm9yIChuX2RhdGEgPSAwO25fZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX2RhdGErKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZXhlYyA9IGdlbl94bWxSZWdFeGVjQ3R4dFB0cihuX2V4ZWMsIDApOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDEpOwogICAgICAgIGRhdGEgPSBnZW5fdXNlcmRhdGEobl9kYXRhLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlZ0V4ZWNQdXNoU3RyaW5nKGV4ZWMsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIGRhdGEpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxSZWdFeGVjQ3R4dFB0cihuX2V4ZWMsIGV4ZWMsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAxKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl9kYXRhLCBkYXRhLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlZ0V4ZWNQdXNoU3RyaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2V4ZWMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlZ0V4ZWNQdXNoU3RyaW5nMih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFR0VYUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxSZWdFeGVjQ3R4dFB0ciBleGVjOyAvKiBhIHJlZ2V4cCBleGVjdXRpb24gY29udGV4dCBvciBOVUxMIHRvIGluZGljYXRlIHRoZSBlbmQgKi8KICAgIGludCBuX2V4ZWM7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSBmaXJzdCBzdHJpbmcgdG9rZW4gaW5wdXQgKi8KICAgIGludCBuX3ZhbHVlOwogICAgeG1sQ2hhciAqIHZhbHVlMjsgLyogdGhlIHNlY29uZCBzdHJpbmcgdG9rZW4gaW5wdXQgKi8KICAgIGludCBuX3ZhbHVlMjsKICAgIHZvaWQgKiBkYXRhOyAvKiBkYXRhIGFzc29jaWF0ZWQgdG8gdGhlIHRva2VuIHRvIHJldXNlIGluIGNhbGxiYWNrcyAqLwogICAgaW50IG5fZGF0YTsKCiAgICBmb3IgKG5fZXhlYyA9IDA7bl9leGVjIDwgZ2VuX25iX3htbFJlZ0V4ZWNDdHh0UHRyO25fZXhlYysrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICBmb3IgKG5fdmFsdWUyID0gMDtuX3ZhbHVlMiA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlMisrKSB7CiAgICBmb3IgKG5fZGF0YSA9IDA7bl9kYXRhIDwgZ2VuX25iX3VzZXJkYXRhO25fZGF0YSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBleGVjID0gZ2VuX3htbFJlZ0V4ZWNDdHh0UHRyKG5fZXhlYywgMCk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMSk7CiAgICAgICAgdmFsdWUyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUyLCAyKTsKICAgICAgICBkYXRhID0gZ2VuX3VzZXJkYXRhKG5fZGF0YSwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxSZWdFeGVjUHVzaFN0cmluZzIoZXhlYywgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZTIsIGRhdGEpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxSZWdFeGVjQ3R4dFB0cihuX2V4ZWMsIGV4ZWMsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZTIsIChjb25zdCB4bWxDaGFyICopdmFsdWUyLCAyKTsKICAgICAgICBkZXNfdXNlcmRhdGEobl9kYXRhLCBkYXRhLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlZ0V4ZWNQdXNoU3RyaW5nMiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9leGVjKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlMik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kYXRhKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCiNpZmRlZiBMSUJYTUxfUkVHRVhQX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbFJlZ2V4cFB0ciAxCnN0YXRpYyB4bWxSZWdleHBQdHIgZ2VuX3htbFJlZ2V4cFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sUmVnZXhwUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxSZWdleHBQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgoKc3RhdGljIGludAp0ZXN0X3htbFJlZ05ld0V4ZWNDdHh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFJlZ2V4cENvbXBpbGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVnZXhwRXhlYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFR0VYUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxSZWdleHBQdHIgY29tcDsgLyogdGhlIGNvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiAqLwogICAgaW50IG5fY29tcDsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgdmFsdWUgdG8gY2hlY2sgYWdhaW5zdCB0aGUgcmVndWxhciBleHByZXNzaW9uICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl9jb21wID0gMDtuX2NvbXAgPCBnZW5fbmJfeG1sUmVnZXhwUHRyO25fY29tcCsrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb21wID0gZ2VuX3htbFJlZ2V4cFB0cihuX2NvbXAsIDApOwogICAgICAgIGNvbnRlbnQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlZ2V4cEV4ZWMoY29tcCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sUmVnZXhwUHRyKG5fY29tcCwgY29tcCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlZ2V4cEV4ZWMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29tcCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVnZXhwSXNEZXRlcm1pbmlzdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1JFR0VYUF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxSZWdleHBQdHIgY29tcDsgLyogdGhlIGNvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiAqLwogICAgaW50IG5fY29tcDsKCiAgICBmb3IgKG5fY29tcCA9IDA7bl9jb21wIDwgZ2VuX25iX3htbFJlZ2V4cFB0cjtuX2NvbXArKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29tcCA9IGdlbl94bWxSZWdleHBQdHIobl9jb21wLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFJlZ2V4cElzRGV0ZXJtaW5pc3QoY29tcCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFJlZ2V4cFB0cihuX2NvbXAsIGNvbXAsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVnZXhwSXNEZXRlcm1pbmlzdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb21wKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sUmVnZXhwUHJpbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9SRUdFWFBfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIEZJTEUgKiBvdXRwdXQ7IC8qIHRoZSBmaWxlIGZvciB0aGUgb3V0cHV0IGRlYnVnICovCiAgICBpbnQgbl9vdXRwdXQ7CiAgICB4bWxSZWdleHBQdHIgcmVnZXhwOyAvKiB0aGUgY29tcGlsZWQgcmVnZXhwICovCiAgICBpbnQgbl9yZWdleHA7CgogICAgZm9yIChuX291dHB1dCA9IDA7bl9vdXRwdXQgPCBnZW5fbmJfRklMRV9wdHI7bl9vdXRwdXQrKykgewogICAgZm9yIChuX3JlZ2V4cCA9IDA7bl9yZWdleHAgPCBnZW5fbmJfeG1sUmVnZXhwUHRyO25fcmVnZXhwKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG91dHB1dCA9IGdlbl9GSUxFX3B0cihuX291dHB1dCwgMCk7CiAgICAgICAgcmVnZXhwID0gZ2VuX3htbFJlZ2V4cFB0cihuX3JlZ2V4cCwgMSk7CgogICAgICAgIHhtbFJlZ2V4cFByaW50KG91dHB1dCwgcmVnZXhwKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX0ZJTEVfcHRyKG5fb3V0cHV0LCBvdXRwdXQsIDApOwogICAgICAgIGRlc194bWxSZWdleHBQdHIobl9yZWdleHAsIHJlZ2V4cCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWdleHBQcmludCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRwdXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmVnZXhwKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxyZWdleHAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIHhtbHJlZ2V4cCA6IDE2IG9mIDMwIGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxFeHBDdHh0TmJDb25zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEV4cEN0eHROYk5vZGVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEV4cER1bXAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRXhwRXhwRGVyaXZlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEV4cEdldExhbmd1YWdlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEV4cEdldFN0YXJ0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEV4cElzTmlsbGFibGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRXhwTWF4VG9rZW4oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRXhwTmV3QXRvbSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxFeHBOZXdDdHh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEV4cE5ld09yKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEV4cE5ld1JhbmdlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEV4cE5ld1NlcSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxFeHBQYXJzZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxFeHBSZWYoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sRXhwU3RyaW5nRGVyaXZlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbEV4cFN1YnN1bWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVnRXhlY0VyckluZm8oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVnRXhlY05leHRWYWx1ZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVnRXhlY1B1c2hTdHJpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVnRXhlY1B1c2hTdHJpbmcyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlZ05ld0V4ZWNDdHh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlZ2V4cENvbXBpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sUmVnZXhwRXhlYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxSZWdleHBJc0RldGVybWluaXN0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFJlZ2V4cFByaW50KCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSB4bWxyZWdleHA6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQojaWZkZWYgTElCWE1MX09VVFBVVF9FTkFCTEVECgojZGVmaW5lIGdlbl9uYl94bWxTYXZlQ3R4dFB0ciAxCnN0YXRpYyB4bWxTYXZlQ3R4dFB0ciBnZW5feG1sU2F2ZUN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFNhdmVDdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxTYXZlQ3R4dFB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCgpzdGF0aWMgaW50CnRlc3RfeG1sU2F2ZUNsb3NlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNhdmVDdHh0UHRyIGN0eHQ7IC8qIGEgZG9jdW1lbnQgc2F2aW5nIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTYXZlQ3R4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxTYXZlQ3R4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sU2F2ZUNsb3NlKGN0eHQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTYXZlQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2F2ZUNsb3NlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTYXZlRG9jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBsb25nIHJldF92YWw7CiAgICB4bWxTYXZlQ3R4dFB0ciBjdHh0OyAvKiBhIGRvY3VtZW50IHNhdmluZyBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRG9jUHRyIGRvYzsgLyogYSBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sU2F2ZUN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFNhdmVDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTYXZlRG9jKGN0eHQsIGRvYyk7CiAgICAgICAgZGVzcmV0X2xvbmcocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTYXZlQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTYXZlRG9jIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2F2ZUZsdXNoKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNhdmVDdHh0UHRyIGN0eHQ7IC8qIGEgZG9jdW1lbnQgc2F2aW5nIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTYXZlQ3R4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxTYXZlQ3R4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sU2F2ZUZsdXNoKGN0eHQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTYXZlQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2F2ZUZsdXNoIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTYXZlU2V0QXR0ckVzY2FwZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTYXZlU2V0RXNjYXBlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNhdmVUb0J1ZmZlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTYXZlVG9GZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTYXZlVG9GaWxlbmFtZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTYXZlVHJlZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX09VVFBVVF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgbG9uZyByZXRfdmFsOwogICAgeG1sU2F2ZUN0eHRQdHIgY3R4dDsgLyogYSBkb2N1bWVudCBzYXZpbmcgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIHRvcCBub2RlIG9mIHRoZSBzdWJ0cmVlIHRvIHNhdmUgKi8KICAgIGludCBuX25vZGU7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTYXZlQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFNhdmVDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTYXZlVHJlZShjdHh0LCBub2RlKTsKICAgICAgICBkZXNyZXRfbG9uZyhyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNhdmVDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNhdmVUcmVlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sc2F2ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgeG1sc2F2ZSA6IDQgb2YgMTAgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNhdmVDbG9zZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTYXZlRG9jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNhdmVGbHVzaCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTYXZlU2V0QXR0ckVzY2FwZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTYXZlU2V0RXNjYXBlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNhdmVUb0J1ZmZlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTYXZlVG9GZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTYXZlVG9GaWxlbmFtZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTYXZlVHJlZSgpOwoKICAgIGlmICh0ZXN0X3JldCAhPSAwKQoJcHJpbnRmKCJNb2R1bGUgeG1sc2F2ZTogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hRHVtcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfT1VUUFVUX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBGSUxFICogb3V0cHV0OyAvKiB0aGUgZmlsZSBvdXRwdXQgKi8KICAgIGludCBuX291dHB1dDsKICAgIHhtbFNjaGVtYVB0ciBzY2hlbWE7IC8qIGEgc2NoZW1hIHN0cnVjdHVyZSAqLwogICAgaW50IG5fc2NoZW1hOwoKICAgIGZvciAobl9vdXRwdXQgPSAwO25fb3V0cHV0IDwgZ2VuX25iX0ZJTEVfcHRyO25fb3V0cHV0KyspIHsKICAgIGZvciAobl9zY2hlbWEgPSAwO25fc2NoZW1hIDwgZ2VuX25iX3htbFNjaGVtYVB0cjtuX3NjaGVtYSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXRwdXQgPSBnZW5fRklMRV9wdHIobl9vdXRwdXQsIDApOwogICAgICAgIHNjaGVtYSA9IGdlbl94bWxTY2hlbWFQdHIobl9zY2hlbWEsIDEpOwoKICAgICAgICB4bWxTY2hlbWFEdW1wKG91dHB1dCwgc2NoZW1hKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX0ZJTEVfcHRyKG5fb3V0cHV0LCBvdXRwdXQsIDApOwogICAgICAgIGRlc194bWxTY2hlbWFQdHIobl9zY2hlbWEsIHNjaGVtYSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFEdW1wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dHB1dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zY2hlbWEpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbFNjaGVtYVBhcnNlckN0eHRQdHIgMQpzdGF0aWMgeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciBnZW5feG1sU2NoZW1hUGFyc2VyQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sU2NoZW1hUGFyc2VyQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCiNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECgojZGVmaW5lIGdlbl9uYl94bWxTY2hlbWFWYWxpZGl0eUVycm9yRnVuY19wdHIgMQpzdGF0aWMgeG1sU2NoZW1hVmFsaWRpdHlFcnJvckZ1bmMgKiBnZW5feG1sU2NoZW1hVmFsaWRpdHlFcnJvckZ1bmNfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxTY2hlbWFWYWxpZGl0eUVycm9yRnVuY19wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFNjaGVtYVZhbGlkaXR5RXJyb3JGdW5jICogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgojaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAoKI2RlZmluZSBnZW5fbmJfeG1sU2NoZW1hVmFsaWRpdHlXYXJuaW5nRnVuY19wdHIgMQpzdGF0aWMgeG1sU2NoZW1hVmFsaWRpdHlXYXJuaW5nRnVuYyAqIGdlbl94bWxTY2hlbWFWYWxpZGl0eVdhcm5pbmdGdW5jX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sU2NoZW1hVmFsaWRpdHlXYXJuaW5nRnVuY19wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFNjaGVtYVZhbGlkaXR5V2FybmluZ0Z1bmMgKiB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hR2V0UGFyc2VyRXJyb3JzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGEgWE1sLVNjaGVtYSBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbFNjaGVtYVZhbGlkaXR5RXJyb3JGdW5jICogZXJyOyAvKiB0aGUgZXJyb3IgY2FsbGJhY2sgcmVzdWx0ICovCiAgICBpbnQgbl9lcnI7CiAgICB4bWxTY2hlbWFWYWxpZGl0eVdhcm5pbmdGdW5jICogd2FybjsgLyogdGhlIHdhcm5pbmcgY2FsbGJhY2sgcmVzdWx0ICovCiAgICBpbnQgbl93YXJuOwogICAgdm9pZCAqKiBjdHg7IC8qIGNvbnRleHR1YWwgZGF0YSBmb3IgdGhlIGNhbGxiYWNrcyByZXN1bHQgKi8KICAgIGludCBuX2N0eDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNjaGVtYVBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9lcnIgPSAwO25fZXJyIDwgZ2VuX25iX3htbFNjaGVtYVZhbGlkaXR5RXJyb3JGdW5jX3B0cjtuX2VycisrKSB7CiAgICBmb3IgKG5fd2FybiA9IDA7bl93YXJuIDwgZ2VuX25iX3htbFNjaGVtYVZhbGlkaXR5V2FybmluZ0Z1bmNfcHRyO25fd2FybisrKSB7CiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl92b2lkX3B0cl9wdHI7bl9jdHgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxTY2hlbWFQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgZXJyID0gZ2VuX3htbFNjaGVtYVZhbGlkaXR5RXJyb3JGdW5jX3B0cihuX2VyciwgMSk7CiAgICAgICAgd2FybiA9IGdlbl94bWxTY2hlbWFWYWxpZGl0eVdhcm5pbmdGdW5jX3B0cihuX3dhcm4sIDIpOwogICAgICAgIGN0eCA9IGdlbl92b2lkX3B0cl9wdHIobl9jdHgsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hR2V0UGFyc2VyRXJyb3JzKGN0eHQsIGVyciwgd2FybiwgY3R4KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2NoZW1hUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxTY2hlbWFWYWxpZGl0eUVycm9yRnVuY19wdHIobl9lcnIsIGVyciwgMSk7CiAgICAgICAgZGVzX3htbFNjaGVtYVZhbGlkaXR5V2FybmluZ0Z1bmNfcHRyKG5fd2Fybiwgd2FybiwgMik7CiAgICAgICAgZGVzX3ZvaWRfcHRyX3B0cihuX2N0eCwgY3R4LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNjaGVtYUdldFBhcnNlckVycm9ycyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Vycik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93YXJuKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYUdldFZhbGlkRXJyb3JzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dDsgLyogYSBYTUwtU2NoZW1hIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbFNjaGVtYVZhbGlkaXR5RXJyb3JGdW5jICogZXJyOyAvKiB0aGUgZXJyb3IgZnVuY3Rpb24gcmVzdWx0ICovCiAgICBpbnQgbl9lcnI7CiAgICB4bWxTY2hlbWFWYWxpZGl0eVdhcm5pbmdGdW5jICogd2FybjsgLyogdGhlIHdhcm5pbmcgZnVuY3Rpb24gcmVzdWx0ICovCiAgICBpbnQgbl93YXJuOwogICAgdm9pZCAqKiBjdHg7IC8qIHRoZSBmdW5jdGlvbnMgY29udGV4dCByZXN1bHQgKi8KICAgIGludCBuX2N0eDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNjaGVtYVZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2VyciA9IDA7bl9lcnIgPCBnZW5fbmJfeG1sU2NoZW1hVmFsaWRpdHlFcnJvckZ1bmNfcHRyO25fZXJyKyspIHsKICAgIGZvciAobl93YXJuID0gMDtuX3dhcm4gPCBnZW5fbmJfeG1sU2NoZW1hVmFsaWRpdHlXYXJuaW5nRnVuY19wdHI7bl93YXJuKyspIHsKICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3ZvaWRfcHRyX3B0cjtuX2N0eCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFNjaGVtYVZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGVyciA9IGdlbl94bWxTY2hlbWFWYWxpZGl0eUVycm9yRnVuY19wdHIobl9lcnIsIDEpOwogICAgICAgIHdhcm4gPSBnZW5feG1sU2NoZW1hVmFsaWRpdHlXYXJuaW5nRnVuY19wdHIobl93YXJuLCAyKTsKICAgICAgICBjdHggPSBnZW5fdm9pZF9wdHJfcHRyKG5fY3R4LCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYUdldFZhbGlkRXJyb3JzKGN0eHQsIGVyciwgd2FybiwgY3R4KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbFNjaGVtYVZhbGlkaXR5RXJyb3JGdW5jX3B0cihuX2VyciwgZXJyLCAxKTsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsaWRpdHlXYXJuaW5nRnVuY19wdHIobl93YXJuLCB3YXJuLCAyKTsKICAgICAgICBkZXNfdm9pZF9wdHJfcHRyKG5fY3R4LCBjdHgsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hR2V0VmFsaWRFcnJvcnMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lcnIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd2Fybik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFJc1ZhbGlkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dDsgLyogdGhlIHNjaGVtYSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTY2hlbWFWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sU2NoZW1hVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFJc1ZhbGlkKGN0eHQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWFWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNjaGVtYUlzVmFsaWQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYU5ld0RvY1BhcnNlckN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiBhIHByZXBhcnNlZCBkb2N1bWVudCB0cmVlICovCiAgICBpbnQgbl9kb2M7CgogICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hTmV3RG9jUGFyc2VyQ3R4dChkb2MpOwogICAgICAgIGRlc3JldF94bWxTY2hlbWFQYXJzZXJDdHh0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hTmV3RG9jUGFyc2VyQ3R4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFOZXdNZW1QYXJzZXJDdHh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sU2NoZW1hUGFyc2VyQ3R4dFB0ciByZXRfdmFsOwogICAgY2hhciAqIGJ1ZmZlcjsgLyogYSBwb2ludGVyIHRvIGEgY2hhciBhcnJheSBjb250YWluaW5nIHRoZSBzY2hlbWFzICovCiAgICBpbnQgbl9idWZmZXI7CiAgICBpbnQgc2l6ZTsgLyogdGhlIHNpemUgb2YgdGhlIGFycmF5ICovCiAgICBpbnQgbl9zaXplOwoKICAgIGZvciAobl9idWZmZXIgPSAwO25fYnVmZmVyIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fYnVmZmVyKyspIHsKICAgIGZvciAobl9zaXplID0gMDtuX3NpemUgPCBnZW5fbmJfaW50O25fc2l6ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBidWZmZXIgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9idWZmZXIsIDApOwogICAgICAgIHNpemUgPSBnZW5faW50KG5fc2l6ZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFOZXdNZW1QYXJzZXJDdHh0KChjb25zdCBjaGFyICopYnVmZmVyLCBzaXplKTsKICAgICAgICBkZXNyZXRfeG1sU2NoZW1hUGFyc2VyQ3R4dFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fYnVmZmVyLCAoY29uc3QgY2hhciAqKWJ1ZmZlciwgMCk7CiAgICAgICAgZGVzX2ludChuX3NpemUsIHNpemUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hTmV3TWVtUGFyc2VyQ3R4dCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWZmZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2l6ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYU5ld1BhcnNlckN0eHQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIHJldF92YWw7CiAgICBjaGFyICogVVJMOyAvKiB0aGUgbG9jYXRpb24gb2YgdGhlIHNjaGVtYSAqLwogICAgaW50IG5fVVJMOwoKICAgIGZvciAobl9VUkwgPSAwO25fVVJMIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fVVJMKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIFVSTCA9IGdlbl9jb25zdF9jaGFyX3B0cihuX1VSTCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFOZXdQYXJzZXJDdHh0KChjb25zdCBjaGFyICopVVJMKTsKICAgICAgICBkZXNyZXRfeG1sU2NoZW1hUGFyc2VyQ3R4dFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fVVJMLCAoY29uc3QgY2hhciAqKVVSTCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFOZXdQYXJzZXJDdHh0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSTCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYU5ld1ZhbGlkQ3R4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFQYXJzZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbFNBWEhhbmRsZXJQdHJfcHRyIDEKc3RhdGljIHhtbFNBWEhhbmRsZXJQdHIgKiBnZW5feG1sU0FYSGFuZGxlclB0cl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFNBWEhhbmRsZXJQdHJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxTQVhIYW5kbGVyUHRyICogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYVNBWFBsdWcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCiNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECgojZGVmaW5lIGdlbl9uYl94bWxTY2hlbWFTQVhQbHVnUHRyIDEKc3RhdGljIHhtbFNjaGVtYVNBWFBsdWdQdHIgZ2VuX3htbFNjaGVtYVNBWFBsdWdQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFNjaGVtYVNBWFBsdWdQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFNjaGVtYVNBWFBsdWdQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYVNBWFVucGx1Zyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2NoZW1hU0FYUGx1Z1B0ciBwbHVnOyAvKiBhIGRhdGEgc3RydWN0dXJlIHJldHVybmVkIGJ5IHhtbFNjaGVtYVNBWFBsdWcgKi8KICAgIGludCBuX3BsdWc7CgogICAgZm9yIChuX3BsdWcgPSAwO25fcGx1ZyA8IGdlbl9uYl94bWxTY2hlbWFTQVhQbHVnUHRyO25fcGx1ZysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBwbHVnID0gZ2VuX3htbFNjaGVtYVNBWFBsdWdQdHIobl9wbHVnLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYVNBWFVucGx1ZyhwbHVnKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2NoZW1hU0FYUGx1Z1B0cihuX3BsdWcsIHBsdWcsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hU0FYVW5wbHVnIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3BsdWcpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFTZXRQYXJzZXJFcnJvcnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hU2V0UGFyc2VyU3RydWN0dXJlZEVycm9ycyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFTZXRWYWxpZEVycm9ycyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFTZXRWYWxpZE9wdGlvbnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciBjdHh0OyAvKiBhIHNjaGVtYSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiB4bWxTY2hlbWFWYWxpZE9wdGlvbiAqLwogICAgaW50IG5fb3B0aW9uczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNjaGVtYVZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX29wdGlvbnMgPSAwO25fb3B0aW9ucyA8IGdlbl9uYl9pbnQ7bl9vcHRpb25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sU2NoZW1hVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgb3B0aW9ucyA9IGdlbl9pbnQobl9vcHRpb25zLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYVNldFZhbGlkT3B0aW9ucyhjdHh0LCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX29wdGlvbnMsIG9wdGlvbnMsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hU2V0VmFsaWRPcHRpb25zIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3B0aW9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYVNldFZhbGlkU3RydWN0dXJlZEVycm9ycyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFWYWxpZEN0eHRHZXRPcHRpb25zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dDsgLyogYSBzY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sU2NoZW1hVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFNjaGVtYVZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hVmFsaWRDdHh0R2V0T3B0aW9ucyhjdHh0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFWYWxpZEN0eHRHZXRPcHRpb25zIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFWYWxpZEN0eHRHZXRQYXJzZXJDdHh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sUGFyc2VyQ3R4dFB0ciByZXRfdmFsOwogICAgeG1sU2NoZW1hVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIGEgc2NoZW1hIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNjaGVtYVZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxTY2hlbWFWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYVZhbGlkQ3R4dEdldFBhcnNlckN0eHQoY3R4dCk7CiAgICAgICAgZGVzcmV0X3htbFBhcnNlckN0eHRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWFWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNjaGVtYVZhbGlkQ3R4dEdldFBhcnNlckN0eHQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYVZhbGlkYXRlRG9jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dDsgLyogYSBzY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sRG9jUHRyIGRvYzsgLyogYSBwYXJzZWQgZG9jdW1lbnQgdHJlZSAqLwogICAgaW50IG5fZG9jOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sU2NoZW1hVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxTY2hlbWFWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYVZhbGlkYXRlRG9jKGN0eHQsIGRvYyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNjaGVtYVZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFWYWxpZGF0ZURvYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYVZhbGlkYXRlRmlsZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2NoZW1hVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIGEgc2NoZW1hIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIFVSSSBvZiB0aGUgaW5zdGFuY2UgKi8KICAgIGludCBuX2ZpbGVuYW1lOwogICAgaW50IG9wdGlvbnM7IC8qIGEgZnV0dXJlIHNldCBvZiBvcHRpb25zLCBjdXJyZW50bHkgdW51c2VkICovCiAgICBpbnQgbl9vcHRpb25zOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sU2NoZW1hVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CiAgICBmb3IgKG5fb3B0aW9ucyA9IDA7bl9vcHRpb25zIDwgZ2VuX25iX2ludDtuX29wdGlvbnMrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxTY2hlbWFWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBmaWxlbmFtZSA9IGdlbl9maWxlcGF0aChuX2ZpbGVuYW1lLCAxKTsKICAgICAgICBvcHRpb25zID0gZ2VuX2ludChuX29wdGlvbnMsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hVmFsaWRhdGVGaWxlKGN0eHQsIGZpbGVuYW1lLCBvcHRpb25zKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIGZpbGVuYW1lLCAxKTsKICAgICAgICBkZXNfaW50KG5fb3B0aW9ucywgb3B0aW9ucywgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFWYWxpZGF0ZUZpbGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vcHRpb25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hVmFsaWRhdGVPbmVFbGVtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dDsgLyogYSBzY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sTm9kZVB0ciBlbGVtOyAvKiBhbiBlbGVtZW50IG5vZGUgKi8KICAgIGludCBuX2VsZW07CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTY2hlbWFWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9lbGVtID0gMDtuX2VsZW0gPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2VsZW0rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxTY2hlbWFWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBlbGVtID0gZ2VuX3htbE5vZGVQdHIobl9lbGVtLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYVZhbGlkYXRlT25lRWxlbWVudChjdHh0LCBlbGVtKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9lbGVtLCBlbGVtLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNjaGVtYVZhbGlkYXRlT25lRWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFWYWxpZGF0ZVN0cmVhbSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2NoZW1hVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIGEgc2NoZW1hIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbFBhcnNlcklucHV0QnVmZmVyUHRyIGlucHV0OyAvKiB0aGUgaW5wdXQgdG8gdXNlIGZvciByZWFkaW5nIHRoZSBkYXRhICovCiAgICBpbnQgbl9pbnB1dDsKICAgIHhtbENoYXJFbmNvZGluZyBlbmM7IC8qIGFuIG9wdGlvbmFsIGVuY29kaW5nIGluZm9ybWF0aW9uICovCiAgICBpbnQgbl9lbmM7CiAgICB4bWxTQVhIYW5kbGVyUHRyIHNheDsgLyogYSBTQVggaGFuZGxlciBmb3IgdGhlIHJlc3VsdGluZyBldmVudHMgKi8KICAgIGludCBuX3NheDsKICAgIHZvaWQgKiB1c2VyX2RhdGE7IC8qIHRoZSBjb250ZXh0IHRvIHByb3ZpZGUgdG8gdGhlIFNBWCBoYW5kbGVyLiAqLwogICAgaW50IG5fdXNlcl9kYXRhOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sU2NoZW1hVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5faW5wdXQgPSAwO25faW5wdXQgPCBnZW5fbmJfeG1sUGFyc2VySW5wdXRCdWZmZXJQdHI7bl9pbnB1dCsrKSB7CiAgICBmb3IgKG5fZW5jID0gMDtuX2VuYyA8IGdlbl9uYl94bWxDaGFyRW5jb2Rpbmc7bl9lbmMrKykgewogICAgZm9yIChuX3NheCA9IDA7bl9zYXggPCBnZW5fbmJfeG1sU0FYSGFuZGxlclB0cjtuX3NheCsrKSB7CiAgICBmb3IgKG5fdXNlcl9kYXRhID0gMDtuX3VzZXJfZGF0YSA8IGdlbl9uYl91c2VyZGF0YTtuX3VzZXJfZGF0YSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFNjaGVtYVZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGlucHV0ID0gZ2VuX3htbFBhcnNlcklucHV0QnVmZmVyUHRyKG5faW5wdXQsIDEpOwogICAgICAgIGVuYyA9IGdlbl94bWxDaGFyRW5jb2Rpbmcobl9lbmMsIDIpOwogICAgICAgIHNheCA9IGdlbl94bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCAzKTsKICAgICAgICB1c2VyX2RhdGEgPSBnZW5fdXNlcmRhdGEobl91c2VyX2RhdGEsIDQpOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hVmFsaWRhdGVTdHJlYW0oY3R4dCwgaW5wdXQsIGVuYywgc2F4LCB1c2VyX2RhdGEpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWFWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIobl9pbnB1dCwgaW5wdXQsIDEpOwogICAgICAgIGRlc194bWxDaGFyRW5jb2Rpbmcobl9lbmMsIGVuYywgMik7CiAgICAgICAgZGVzX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIHNheCwgMyk7CiAgICAgICAgZGVzX3VzZXJkYXRhKG5fdXNlcl9kYXRhLCB1c2VyX2RhdGEsIDQpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hVmFsaWRhdGVTdHJlYW0iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbnB1dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2F4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3VzZXJfZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sc2NoZW1hcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgeG1sc2NoZW1hcyA6IDE1IG9mIDI1IGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFEdW1wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYUdldFBhcnNlckVycm9ycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFHZXRWYWxpZEVycm9ycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFJc1ZhbGlkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYU5ld0RvY1BhcnNlckN0eHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hTmV3TWVtUGFyc2VyQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFOZXdQYXJzZXJDdHh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYU5ld1ZhbGlkQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFQYXJzZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFTQVhQbHVnKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYVNBWFVucGx1ZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFTZXRQYXJzZXJFcnJvcnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hU2V0UGFyc2VyU3RydWN0dXJlZEVycm9ycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFTZXRWYWxpZEVycm9ycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFTZXRWYWxpZE9wdGlvbnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hU2V0VmFsaWRTdHJ1Y3R1cmVkRXJyb3JzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYVZhbGlkQ3R4dEdldE9wdGlvbnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hVmFsaWRDdHh0R2V0UGFyc2VyQ3R4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFWYWxpZGF0ZURvYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFWYWxpZGF0ZUZpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hVmFsaWRhdGVPbmVFbGVtZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYVZhbGlkYXRlU3RyZWFtKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSB4bWxzY2hlbWFzOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbFNjaGVtYUZhY2V0UHRyIDEKc3RhdGljIHhtbFNjaGVtYUZhY2V0UHRyIGdlbl94bWxTY2hlbWFGYWNldFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sU2NoZW1hRmFjZXRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFNjaGVtYUZhY2V0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKCiNkZWZpbmUgZ2VuX25iX3htbFNjaGVtYVR5cGVQdHIgMQpzdGF0aWMgeG1sU2NoZW1hVHlwZVB0ciBnZW5feG1sU2NoZW1hVHlwZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sU2NoZW1hVHlwZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sU2NoZW1hVHlwZVB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hQ2hlY2tGYWNldCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2NoZW1hRmFjZXRQdHIgZmFjZXQ7IC8qIHRoZSBmYWNldCAqLwogICAgaW50IG5fZmFjZXQ7CiAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGVEZWNsOyAvKiB0aGUgc2NoZW1hIHR5cGUgZGVmaW5pdGlvbiAqLwogICAgaW50IG5fdHlwZURlY2w7CiAgICB4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIHBjdHh0OyAvKiB0aGUgc2NoZW1hIHBhcnNlciBjb250ZXh0IG9yIE5VTEwgKi8KICAgIGludCBuX3BjdHh0OwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBvcHRpb25hbCBuYW1lIG9mIHRoZSB0eXBlICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl9mYWNldCA9IDA7bl9mYWNldCA8IGdlbl9uYl94bWxTY2hlbWFGYWNldFB0cjtuX2ZhY2V0KyspIHsKICAgIGZvciAobl90eXBlRGVjbCA9IDA7bl90eXBlRGVjbCA8IGdlbl9uYl94bWxTY2hlbWFUeXBlUHRyO25fdHlwZURlY2wrKykgewogICAgZm9yIChuX3BjdHh0ID0gMDtuX3BjdHh0IDwgZ2VuX25iX3htbFNjaGVtYVBhcnNlckN0eHRQdHI7bl9wY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmYWNldCA9IGdlbl94bWxTY2hlbWFGYWNldFB0cihuX2ZhY2V0LCAwKTsKICAgICAgICB0eXBlRGVjbCA9IGdlbl94bWxTY2hlbWFUeXBlUHRyKG5fdHlwZURlY2wsIDEpOwogICAgICAgIHBjdHh0ID0gZ2VuX3htbFNjaGVtYVBhcnNlckN0eHRQdHIobl9wY3R4dCwgMik7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hQ2hlY2tGYWNldChmYWNldCwgdHlwZURlY2wsIHBjdHh0LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWFGYWNldFB0cihuX2ZhY2V0LCBmYWNldCwgMCk7CiAgICAgICAgZGVzX3htbFNjaGVtYVR5cGVQdHIobl90eXBlRGVjbCwgdHlwZURlY2wsIDEpOwogICAgICAgIGRlc194bWxTY2hlbWFQYXJzZXJDdHh0UHRyKG5fcGN0eHQsIHBjdHh0LCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hQ2hlY2tGYWNldCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mYWNldCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90eXBlRGVjbCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hQ2xlYW51cFR5cGVzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQoKCiAgICAgICAgeG1sU2NoZW1hQ2xlYW51cFR5cGVzKCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYUNvbGxhcHNlU3RyaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIGEgdmFsdWUgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hQ29sbGFwc2VTdHJpbmcoKGNvbnN0IHhtbENoYXIgKil2YWx1ZSk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFDb2xsYXBzZVN0cmluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgojaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAoKI2RlZmluZSBnZW5fbmJfeG1sU2NoZW1hVmFsUHRyIDEKc3RhdGljIHhtbFNjaGVtYVZhbFB0ciBnZW5feG1sU2NoZW1hVmFsUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxTY2hlbWFWYWxQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFNjaGVtYVZhbFB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hQ29tcGFyZVZhbHVlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2NoZW1hVmFsUHRyIHg7IC8qIGEgZmlyc3QgdmFsdWUgKi8KICAgIGludCBuX3g7CiAgICB4bWxTY2hlbWFWYWxQdHIgeTsgLyogYSBzZWNvbmQgdmFsdWUgKi8KICAgIGludCBuX3k7CgogICAgZm9yIChuX3ggPSAwO25feCA8IGdlbl9uYl94bWxTY2hlbWFWYWxQdHI7bl94KyspIHsKICAgIGZvciAobl95ID0gMDtuX3kgPCBnZW5fbmJfeG1sU2NoZW1hVmFsUHRyO25feSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB4ID0gZ2VuX3htbFNjaGVtYVZhbFB0cihuX3gsIDApOwogICAgICAgIHkgPSBnZW5feG1sU2NoZW1hVmFsUHRyKG5feSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFDb21wYXJlVmFsdWVzKHgsIHkpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWFWYWxQdHIobl94LCB4LCAwKTsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsUHRyKG5feSwgeSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFDb21wYXJlVmFsdWVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3gpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5feSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYUNvbXBhcmVWYWx1ZXNXaHRzcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2NoZW1hVmFsUHRyIHg7IC8qIGEgZmlyc3QgdmFsdWUgKi8KICAgIGludCBuX3g7CiAgICB4bWxTY2hlbWFXaGl0ZXNwYWNlVmFsdWVUeXBlIHh3czsgLyogdGhlIHdoaXRlc3BhY2UgdmFsdWUgb2YgeCAqLwogICAgaW50IG5feHdzOwogICAgeG1sU2NoZW1hVmFsUHRyIHk7IC8qIGEgc2Vjb25kIHZhbHVlICovCiAgICBpbnQgbl95OwogICAgeG1sU2NoZW1hV2hpdGVzcGFjZVZhbHVlVHlwZSB5d3M7IC8qIHRoZSB3aGl0ZXNwYWNlIHZhbHVlIG9mIHkgKi8KICAgIGludCBuX3l3czsKCiAgICBmb3IgKG5feCA9IDA7bl94IDwgZ2VuX25iX3htbFNjaGVtYVZhbFB0cjtuX3grKykgewogICAgZm9yIChuX3h3cyA9IDA7bl94d3MgPCBnZW5fbmJfeG1sU2NoZW1hV2hpdGVzcGFjZVZhbHVlVHlwZTtuX3h3cysrKSB7CiAgICBmb3IgKG5feSA9IDA7bl95IDwgZ2VuX25iX3htbFNjaGVtYVZhbFB0cjtuX3krKykgewogICAgZm9yIChuX3l3cyA9IDA7bl95d3MgPCBnZW5fbmJfeG1sU2NoZW1hV2hpdGVzcGFjZVZhbHVlVHlwZTtuX3l3cysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB4ID0gZ2VuX3htbFNjaGVtYVZhbFB0cihuX3gsIDApOwogICAgICAgIHh3cyA9IGdlbl94bWxTY2hlbWFXaGl0ZXNwYWNlVmFsdWVUeXBlKG5feHdzLCAxKTsKICAgICAgICB5ID0gZ2VuX3htbFNjaGVtYVZhbFB0cihuX3ksIDIpOwogICAgICAgIHl3cyA9IGdlbl94bWxTY2hlbWFXaGl0ZXNwYWNlVmFsdWVUeXBlKG5feXdzLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYUNvbXBhcmVWYWx1ZXNXaHRzcCh4LCB4d3MsIHksIHl3cyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNjaGVtYVZhbFB0cihuX3gsIHgsIDApOwogICAgICAgIGRlc194bWxTY2hlbWFXaGl0ZXNwYWNlVmFsdWVUeXBlKG5feHdzLCB4d3MsIDEpOwogICAgICAgIGRlc194bWxTY2hlbWFWYWxQdHIobl95LCB5LCAyKTsKICAgICAgICBkZXNfeG1sU2NoZW1hV2hpdGVzcGFjZVZhbHVlVHlwZShuX3l3cywgeXdzLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNjaGVtYUNvbXBhcmVWYWx1ZXNXaHRzcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl94KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3h3cyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl95KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3l3cyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYUNvcHlWYWx1ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFHZXRCdWlsdEluTGlzdFNpbXBsZVR5cGVJdGVtVHlwZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFNjaGVtYVR5cGVQdHIgcmV0X3ZhbDsKICAgIHhtbFNjaGVtYVR5cGVQdHIgdHlwZTsgLyogdGhlIGJ1aWx0LWluIHNpbXBsZSB0eXBlLiAqLwogICAgaW50IG5fdHlwZTsKCiAgICBmb3IgKG5fdHlwZSA9IDA7bl90eXBlIDwgZ2VuX25iX3htbFNjaGVtYVR5cGVQdHI7bl90eXBlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHR5cGUgPSBnZW5feG1sU2NoZW1hVHlwZVB0cihuX3R5cGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hR2V0QnVpbHRJbkxpc3RTaW1wbGVUeXBlSXRlbVR5cGUodHlwZSk7CiAgICAgICAgZGVzcmV0X3htbFNjaGVtYVR5cGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWFUeXBlUHRyKG5fdHlwZSwgdHlwZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFHZXRCdWlsdEluTGlzdFNpbXBsZVR5cGVJdGVtVHlwZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90eXBlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hR2V0QnVpbHRJblR5cGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICB4bWxTY2hlbWFUeXBlUHRyIHJldF92YWw7CiAgICB4bWxTY2hlbWFWYWxUeXBlIHR5cGU7IC8qIHRoZSB0eXBlIG9mIHRoZSBidWlsdCBpbiB0eXBlICovCiAgICBpbnQgbl90eXBlOwoKICAgIGZvciAobl90eXBlID0gMDtuX3R5cGUgPCBnZW5fbmJfeG1sU2NoZW1hVmFsVHlwZTtuX3R5cGUrKykgewogICAgICAgIHR5cGUgPSBnZW5feG1sU2NoZW1hVmFsVHlwZShuX3R5cGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hR2V0QnVpbHRJblR5cGUodHlwZSk7CiAgICAgICAgZGVzcmV0X3htbFNjaGVtYVR5cGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWFWYWxUeXBlKG5fdHlwZSwgdHlwZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hR2V0Q2Fub25WYWx1ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2NoZW1hVmFsUHRyIHZhbDsgLyogdGhlIHByZWNvbXB1dGVkIHZhbHVlICovCiAgICBpbnQgbl92YWw7CiAgICB4bWxDaGFyICoqIHJldFZhbHVlOyAvKiB0aGUgcmV0dXJuZWQgdmFsdWUgKi8KICAgIGludCBuX3JldFZhbHVlOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFNjaGVtYVZhbFB0cjtuX3ZhbCsrKSB7CiAgICBmb3IgKG5fcmV0VmFsdWUgPSAwO25fcmV0VmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHJfcHRyO25fcmV0VmFsdWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX3htbFNjaGVtYVZhbFB0cihuX3ZhbCwgMCk7CiAgICAgICAgcmV0VmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHJfcHRyKG5fcmV0VmFsdWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hR2V0Q2Fub25WYWx1ZSh2YWwsIChjb25zdCB4bWxDaGFyICoqKXJldFZhbHVlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsUHRyKG5fdmFsLCB2YWwsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cl9wdHIobl9yZXRWYWx1ZSwgKGNvbnN0IHhtbENoYXIgKiopcmV0VmFsdWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hR2V0Q2Fub25WYWx1ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcmV0VmFsdWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFHZXRDYW5vblZhbHVlV2h0c3Aodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNjaGVtYVZhbFB0ciB2YWw7IC8qIHRoZSBwcmVjb21wdXRlZCB2YWx1ZSAqLwogICAgaW50IG5fdmFsOwogICAgeG1sQ2hhciAqKiByZXRWYWx1ZTsgLyogdGhlIHJldHVybmVkIHZhbHVlICovCiAgICBpbnQgbl9yZXRWYWx1ZTsKICAgIHhtbFNjaGVtYVdoaXRlc3BhY2VWYWx1ZVR5cGUgd3M7IC8qIHRoZSB3aGl0ZXNwYWNlIHR5cGUgb2YgdGhlIHZhbHVlICovCiAgICBpbnQgbl93czsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxTY2hlbWFWYWxQdHI7bl92YWwrKykgewogICAgZm9yIChuX3JldFZhbHVlID0gMDtuX3JldFZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyX3B0cjtuX3JldFZhbHVlKyspIHsKICAgIGZvciAobl93cyA9IDA7bl93cyA8IGdlbl9uYl94bWxTY2hlbWFXaGl0ZXNwYWNlVmFsdWVUeXBlO25fd3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX3htbFNjaGVtYVZhbFB0cihuX3ZhbCwgMCk7CiAgICAgICAgcmV0VmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHJfcHRyKG5fcmV0VmFsdWUsIDEpOwogICAgICAgIHdzID0gZ2VuX3htbFNjaGVtYVdoaXRlc3BhY2VWYWx1ZVR5cGUobl93cywgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFHZXRDYW5vblZhbHVlV2h0c3AodmFsLCAoY29uc3QgeG1sQ2hhciAqKilyZXRWYWx1ZSwgd3MpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWFWYWxQdHIobl92YWwsIHZhbCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyX3B0cihuX3JldFZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKilyZXRWYWx1ZSwgMSk7CiAgICAgICAgZGVzX3htbFNjaGVtYVdoaXRlc3BhY2VWYWx1ZVR5cGUobl93cywgd3MsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hR2V0Q2Fub25WYWx1ZVdodHNwIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZXRWYWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYUdldEZhY2V0VmFsdWVBc1VMb25nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgdW5zaWduZWQgbG9uZyByZXRfdmFsOwogICAgeG1sU2NoZW1hRmFjZXRQdHIgZmFjZXQ7IC8qIGFuIHNjaGVtYXMgdHlwZSBmYWNldCAqLwogICAgaW50IG5fZmFjZXQ7CgogICAgZm9yIChuX2ZhY2V0ID0gMDtuX2ZhY2V0IDwgZ2VuX25iX3htbFNjaGVtYUZhY2V0UHRyO25fZmFjZXQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZmFjZXQgPSBnZW5feG1sU2NoZW1hRmFjZXRQdHIobl9mYWNldCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFHZXRGYWNldFZhbHVlQXNVTG9uZyhmYWNldCk7CiAgICAgICAgZGVzcmV0X3Vuc2lnbmVkX2xvbmcocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWFGYWNldFB0cihuX2ZhY2V0LCBmYWNldCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFHZXRGYWNldFZhbHVlQXNVTG9uZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mYWNldCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYUdldFByZWRlZmluZWRUeXBlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sU2NoZW1hVHlwZVB0ciByZXRfdmFsOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSB0eXBlIG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogbnM7IC8qIHRoZSBVUkkgb2YgdGhlIG5hbWVzcGFjZSB1c3VhbGx5ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgKi8KICAgIGludCBuX25zOwoKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9ucyA9IDA7bl9ucyA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAwKTsKICAgICAgICBucyA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25zLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYUdldFByZWRlZmluZWRUeXBlKChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKilucyk7CiAgICAgICAgZGVzcmV0X3htbFNjaGVtYVR5cGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbnMsIChjb25zdCB4bWxDaGFyICopbnMsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hR2V0UHJlZGVmaW5lZFR5cGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYUdldFZhbFR5cGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxTY2hlbWFWYWxUeXBlIHJldF92YWw7CiAgICB4bWxTY2hlbWFWYWxQdHIgdmFsOyAvKiBhIHNjaGVtYXMgdmFsdWUgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxTY2hlbWFWYWxQdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX3htbFNjaGVtYVZhbFB0cihuX3ZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFHZXRWYWxUeXBlKHZhbCk7CiAgICAgICAgZGVzcmV0X3htbFNjaGVtYVZhbFR5cGUocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWFWYWxQdHIobl92YWwsIHZhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFHZXRWYWxUeXBlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYUluaXRUeXBlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKCgogICAgICAgIHhtbFNjaGVtYUluaXRUeXBlcygpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFJc0J1aWx0SW5UeXBlRmFjZXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNjaGVtYVR5cGVQdHIgdHlwZTsgLyogdGhlIGJ1aWx0LWluIHR5cGUgKi8KICAgIGludCBuX3R5cGU7CiAgICBpbnQgZmFjZXRUeXBlOyAvKiB0aGUgZmFjZXQgdHlwZSAqLwogICAgaW50IG5fZmFjZXRUeXBlOwoKICAgIGZvciAobl90eXBlID0gMDtuX3R5cGUgPCBnZW5fbmJfeG1sU2NoZW1hVHlwZVB0cjtuX3R5cGUrKykgewogICAgZm9yIChuX2ZhY2V0VHlwZSA9IDA7bl9mYWNldFR5cGUgPCBnZW5fbmJfaW50O25fZmFjZXRUeXBlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHR5cGUgPSBnZW5feG1sU2NoZW1hVHlwZVB0cihuX3R5cGUsIDApOwogICAgICAgIGZhY2V0VHlwZSA9IGdlbl9pbnQobl9mYWNldFR5cGUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hSXNCdWlsdEluVHlwZUZhY2V0KHR5cGUsIGZhY2V0VHlwZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNjaGVtYVR5cGVQdHIobl90eXBlLCB0eXBlLCAwKTsKICAgICAgICBkZXNfaW50KG5fZmFjZXRUeXBlLCBmYWNldFR5cGUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hSXNCdWlsdEluVHlwZUZhY2V0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3R5cGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmFjZXRUeXBlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hTmV3RmFjZXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hTmV3Tk9UQVRJT05WYWx1ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFOZXdRTmFtZVZhbHVlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYU5ld1N0cmluZ1ZhbHVlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgojaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAoKI2RlZmluZSBnZW5fbmJfeG1sU2NoZW1hVmFsUHRyX3B0ciAxCnN0YXRpYyB4bWxTY2hlbWFWYWxQdHIgKiBnZW5feG1sU2NoZW1hVmFsUHRyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihOVUxMKTsKfQpzdGF0aWMgdm9pZCBkZXNfeG1sU2NoZW1hVmFsUHRyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sU2NoZW1hVmFsUHRyICogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYVZhbFByZWRlZlR5cGVOb2RlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGU7IC8qIHRoZSBwcmVkZWZpbmVkIHR5cGUgKi8KICAgIGludCBuX3R5cGU7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSB2YWx1ZSB0byBjaGVjayAqLwogICAgaW50IG5fdmFsdWU7CiAgICB4bWxTY2hlbWFWYWxQdHIgKiB2YWw7IC8qIHRoZSByZXR1cm4gY29tcHV0ZWQgdmFsdWUgKi8KICAgIGludCBuX3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIG5vZGUgY29udGFpbmluZyB0aGUgdmFsdWUgKi8KICAgIGludCBuX25vZGU7CgogICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl94bWxTY2hlbWFUeXBlUHRyO25fdHlwZSsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxTY2hlbWFWYWxQdHJfcHRyO25fdmFsKyspIHsKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdHlwZSA9IGdlbl94bWxTY2hlbWFUeXBlUHRyKG5fdHlwZSwgMCk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMSk7CiAgICAgICAgdmFsID0gZ2VuX3htbFNjaGVtYVZhbFB0cl9wdHIobl92YWwsIDIpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hVmFsUHJlZGVmVHlwZU5vZGUodHlwZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgdmFsLCBub2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2NoZW1hVHlwZVB0cihuX3R5cGUsIHR5cGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAxKTsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsUHRyX3B0cihuX3ZhbCwgdmFsLCAyKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hVmFsUHJlZGVmVHlwZU5vZGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHlwZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYVZhbFByZWRlZlR5cGVOb2RlTm9Ob3JtKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGU7IC8qIHRoZSBwcmVkZWZpbmVkIHR5cGUgKi8KICAgIGludCBuX3R5cGU7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSB2YWx1ZSB0byBjaGVjayAqLwogICAgaW50IG5fdmFsdWU7CiAgICB4bWxTY2hlbWFWYWxQdHIgKiB2YWw7IC8qIHRoZSByZXR1cm4gY29tcHV0ZWQgdmFsdWUgKi8KICAgIGludCBuX3ZhbDsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIG5vZGUgY29udGFpbmluZyB0aGUgdmFsdWUgKi8KICAgIGludCBuX25vZGU7CgogICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl94bWxTY2hlbWFUeXBlUHRyO25fdHlwZSsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxTY2hlbWFWYWxQdHJfcHRyO25fdmFsKyspIHsKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdHlwZSA9IGdlbl94bWxTY2hlbWFUeXBlUHRyKG5fdHlwZSwgMCk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMSk7CiAgICAgICAgdmFsID0gZ2VuX3htbFNjaGVtYVZhbFB0cl9wdHIobl92YWwsIDIpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hVmFsUHJlZGVmVHlwZU5vZGVOb05vcm0odHlwZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgdmFsLCBub2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2NoZW1hVHlwZVB0cihuX3R5cGUsIHR5cGUsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAxKTsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsUHRyX3B0cihuX3ZhbCwgdmFsLCAyKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hVmFsUHJlZGVmVHlwZU5vZGVOb05vcm0iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHlwZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYVZhbGlkYXRlRmFjZXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNjaGVtYVR5cGVQdHIgYmFzZTsgLyogdGhlIGJhc2UgdHlwZSAqLwogICAgaW50IG5fYmFzZTsKICAgIHhtbFNjaGVtYUZhY2V0UHRyIGZhY2V0OyAvKiB0aGUgZmFjZXQgdG8gY2hlY2sgKi8KICAgIGludCBuX2ZhY2V0OwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgbGV4aWNhbCByZXByIG9mIHRoZSB2YWx1ZSB0byB2YWxpZGF0ZSAqLwogICAgaW50IG5fdmFsdWU7CiAgICB4bWxTY2hlbWFWYWxQdHIgdmFsOyAvKiB0aGUgcHJlY29tcHV0ZWQgdmFsdWUgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fYmFzZSA9IDA7bl9iYXNlIDwgZ2VuX25iX3htbFNjaGVtYVR5cGVQdHI7bl9iYXNlKyspIHsKICAgIGZvciAobl9mYWNldCA9IDA7bl9mYWNldCA8IGdlbl9uYl94bWxTY2hlbWFGYWNldFB0cjtuX2ZhY2V0KyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFNjaGVtYVZhbFB0cjtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBiYXNlID0gZ2VuX3htbFNjaGVtYVR5cGVQdHIobl9iYXNlLCAwKTsKICAgICAgICBmYWNldCA9IGdlbl94bWxTY2hlbWFGYWNldFB0cihuX2ZhY2V0LCAxKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAyKTsKICAgICAgICB2YWwgPSBnZW5feG1sU2NoZW1hVmFsUHRyKG5fdmFsLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYVZhbGlkYXRlRmFjZXQoYmFzZSwgZmFjZXQsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIHZhbCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNjaGVtYVR5cGVQdHIobl9iYXNlLCBiYXNlLCAwKTsKICAgICAgICBkZXNfeG1sU2NoZW1hRmFjZXRQdHIobl9mYWNldCwgZmFjZXQsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAyKTsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsUHRyKG5fdmFsLCB2YWwsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hVmFsaWRhdGVGYWNldCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9iYXNlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZhY2V0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYVZhbGlkYXRlRmFjZXRXaHRzcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2NoZW1hRmFjZXRQdHIgZmFjZXQ7IC8qIHRoZSBmYWNldCB0byBjaGVjayAqLwogICAgaW50IG5fZmFjZXQ7CiAgICB4bWxTY2hlbWFXaGl0ZXNwYWNlVmFsdWVUeXBlIGZ3czsgLyogdGhlIHdoaXRlc3BhY2UgdHlwZSBvZiB0aGUgZmFjZXQncyB2YWx1ZSAqLwogICAgaW50IG5fZndzOwogICAgeG1sU2NoZW1hVmFsVHlwZSB2YWxUeXBlOyAvKiB0aGUgYnVpbHQtaW4gdHlwZSBvZiB0aGUgdmFsdWUgKi8KICAgIGludCBuX3ZhbFR5cGU7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSBsZXhpY2FsIChvciBub3JtYWxpemVkIGZvciBwYXR0ZXJuKSByZXByIG9mIHRoZSB2YWx1ZSB0byB2YWxpZGF0ZSAqLwogICAgaW50IG5fdmFsdWU7CiAgICB4bWxTY2hlbWFWYWxQdHIgdmFsOyAvKiB0aGUgcHJlY29tcHV0ZWQgdmFsdWUgKi8KICAgIGludCBuX3ZhbDsKICAgIHhtbFNjaGVtYVdoaXRlc3BhY2VWYWx1ZVR5cGUgd3M7IC8qIHRoZSB3aGl0ZXNwYWNlIHR5cGUgb2YgdGhlIHZhbHVlICovCiAgICBpbnQgbl93czsKCiAgICBmb3IgKG5fZmFjZXQgPSAwO25fZmFjZXQgPCBnZW5fbmJfeG1sU2NoZW1hRmFjZXRQdHI7bl9mYWNldCsrKSB7CiAgICBmb3IgKG5fZndzID0gMDtuX2Z3cyA8IGdlbl9uYl94bWxTY2hlbWFXaGl0ZXNwYWNlVmFsdWVUeXBlO25fZndzKyspIHsKICAgIGZvciAobl92YWxUeXBlID0gMDtuX3ZhbFR5cGUgPCBnZW5fbmJfeG1sU2NoZW1hVmFsVHlwZTtuX3ZhbFR5cGUrKykgewogICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgewogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfeG1sU2NoZW1hVmFsUHRyO25fdmFsKyspIHsKICAgIGZvciAobl93cyA9IDA7bl93cyA8IGdlbl9uYl94bWxTY2hlbWFXaGl0ZXNwYWNlVmFsdWVUeXBlO25fd3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgZmFjZXQgPSBnZW5feG1sU2NoZW1hRmFjZXRQdHIobl9mYWNldCwgMCk7CiAgICAgICAgZndzID0gZ2VuX3htbFNjaGVtYVdoaXRlc3BhY2VWYWx1ZVR5cGUobl9md3MsIDEpOwogICAgICAgIHZhbFR5cGUgPSBnZW5feG1sU2NoZW1hVmFsVHlwZShuX3ZhbFR5cGUsIDIpOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDMpOwogICAgICAgIHZhbCA9IGdlbl94bWxTY2hlbWFWYWxQdHIobl92YWwsIDQpOwogICAgICAgIHdzID0gZ2VuX3htbFNjaGVtYVdoaXRlc3BhY2VWYWx1ZVR5cGUobl93cywgNSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFWYWxpZGF0ZUZhY2V0V2h0c3AoZmFjZXQsIGZ3cywgdmFsVHlwZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgdmFsLCB3cyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNjaGVtYUZhY2V0UHRyKG5fZmFjZXQsIGZhY2V0LCAwKTsKICAgICAgICBkZXNfeG1sU2NoZW1hV2hpdGVzcGFjZVZhbHVlVHlwZShuX2Z3cywgZndzLCAxKTsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsVHlwZShuX3ZhbFR5cGUsIHZhbFR5cGUsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAzKTsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsUHRyKG5fdmFsLCB2YWwsIDQpOwogICAgICAgIGRlc194bWxTY2hlbWFXaGl0ZXNwYWNlVmFsdWVUeXBlKG5fd3MsIHdzLCA1KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNjaGVtYVZhbGlkYXRlRmFjZXRXaHRzcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mYWNldCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9md3MpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsVHlwZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFWYWxpZGF0ZUxlbmd0aEZhY2V0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGU7IC8qIHRoZSBidWlsdC1pbiB0eXBlICovCiAgICBpbnQgbl90eXBlOwogICAgeG1sU2NoZW1hRmFjZXRQdHIgZmFjZXQ7IC8qIHRoZSBmYWNldCB0byBjaGVjayAqLwogICAgaW50IG5fZmFjZXQ7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSBsZXhpY2FsIHJlcHIuIG9mIHRoZSB2YWx1ZSB0byBiZSB2YWxpZGF0ZWQgKi8KICAgIGludCBuX3ZhbHVlOwogICAgeG1sU2NoZW1hVmFsUHRyIHZhbDsgLyogdGhlIHByZWNvbXB1dGVkIHZhbHVlICovCiAgICBpbnQgbl92YWw7CiAgICB1bnNpZ25lZCBsb25nICogbGVuZ3RoOyAvKiB0aGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUgdmFsdWUgKi8KICAgIGludCBuX2xlbmd0aDsKCiAgICBmb3IgKG5fdHlwZSA9IDA7bl90eXBlIDwgZ2VuX25iX3htbFNjaGVtYVR5cGVQdHI7bl90eXBlKyspIHsKICAgIGZvciAobl9mYWNldCA9IDA7bl9mYWNldCA8IGdlbl9uYl94bWxTY2hlbWFGYWNldFB0cjtuX2ZhY2V0KyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFNjaGVtYVZhbFB0cjtuX3ZhbCsrKSB7CiAgICBmb3IgKG5fbGVuZ3RoID0gMDtuX2xlbmd0aCA8IGdlbl9uYl91bnNpZ25lZF9sb25nX3B0cjtuX2xlbmd0aCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB0eXBlID0gZ2VuX3htbFNjaGVtYVR5cGVQdHIobl90eXBlLCAwKTsKICAgICAgICBmYWNldCA9IGdlbl94bWxTY2hlbWFGYWNldFB0cihuX2ZhY2V0LCAxKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAyKTsKICAgICAgICB2YWwgPSBnZW5feG1sU2NoZW1hVmFsUHRyKG5fdmFsLCAzKTsKICAgICAgICBsZW5ndGggPSBnZW5fdW5zaWduZWRfbG9uZ19wdHIobl9sZW5ndGgsIDQpOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hVmFsaWRhdGVMZW5ndGhGYWNldCh0eXBlLCBmYWNldCwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgdmFsLCBsZW5ndGgpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWFUeXBlUHRyKG5fdHlwZSwgdHlwZSwgMCk7CiAgICAgICAgZGVzX3htbFNjaGVtYUZhY2V0UHRyKG5fZmFjZXQsIGZhY2V0LCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMik7CiAgICAgICAgZGVzX3htbFNjaGVtYVZhbFB0cihuX3ZhbCwgdmFsLCAzKTsKICAgICAgICBkZXNfdW5zaWduZWRfbG9uZ19wdHIobl9sZW5ndGgsIGxlbmd0aCwgNCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFWYWxpZGF0ZUxlbmd0aEZhY2V0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3R5cGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmFjZXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbmd0aCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYVZhbGlkYXRlTGVuZ3RoRmFjZXRXaHRzcCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sU2NoZW1hRmFjZXRQdHIgZmFjZXQ7IC8qIHRoZSBmYWNldCB0byBjaGVjayAqLwogICAgaW50IG5fZmFjZXQ7CiAgICB4bWxTY2hlbWFWYWxUeXBlIHZhbFR5cGU7IC8qIHRoZSBidWlsdC1pbiB0eXBlICovCiAgICBpbnQgbl92YWxUeXBlOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgbGV4aWNhbCByZXByLiBvZiB0aGUgdmFsdWUgdG8gYmUgdmFsaWRhdGVkICovCiAgICBpbnQgbl92YWx1ZTsKICAgIHhtbFNjaGVtYVZhbFB0ciB2YWw7IC8qIHRoZSBwcmVjb21wdXRlZCB2YWx1ZSAqLwogICAgaW50IG5fdmFsOwogICAgdW5zaWduZWQgbG9uZyAqIGxlbmd0aDsgLyogdGhlIGFjdHVhbCBsZW5ndGggb2YgdGhlIHZhbHVlICovCiAgICBpbnQgbl9sZW5ndGg7CiAgICB4bWxTY2hlbWFXaGl0ZXNwYWNlVmFsdWVUeXBlIHdzOyAvKiB0aGUgd2hpdGVzcGFjZSB0eXBlIG9mIHRoZSB2YWx1ZSAqLwogICAgaW50IG5fd3M7CgogICAgZm9yIChuX2ZhY2V0ID0gMDtuX2ZhY2V0IDwgZ2VuX25iX3htbFNjaGVtYUZhY2V0UHRyO25fZmFjZXQrKykgewogICAgZm9yIChuX3ZhbFR5cGUgPSAwO25fdmFsVHlwZSA8IGdlbl9uYl94bWxTY2hlbWFWYWxUeXBlO25fdmFsVHlwZSsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxTY2hlbWFWYWxQdHI7bl92YWwrKykgewogICAgZm9yIChuX2xlbmd0aCA9IDA7bl9sZW5ndGggPCBnZW5fbmJfdW5zaWduZWRfbG9uZ19wdHI7bl9sZW5ndGgrKykgewogICAgZm9yIChuX3dzID0gMDtuX3dzIDwgZ2VuX25iX3htbFNjaGVtYVdoaXRlc3BhY2VWYWx1ZVR5cGU7bl93cysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBmYWNldCA9IGdlbl94bWxTY2hlbWFGYWNldFB0cihuX2ZhY2V0LCAwKTsKICAgICAgICB2YWxUeXBlID0gZ2VuX3htbFNjaGVtYVZhbFR5cGUobl92YWxUeXBlLCAxKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAyKTsKICAgICAgICB2YWwgPSBnZW5feG1sU2NoZW1hVmFsUHRyKG5fdmFsLCAzKTsKICAgICAgICBsZW5ndGggPSBnZW5fdW5zaWduZWRfbG9uZ19wdHIobl9sZW5ndGgsIDQpOwogICAgICAgIHdzID0gZ2VuX3htbFNjaGVtYVdoaXRlc3BhY2VWYWx1ZVR5cGUobl93cywgNSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFWYWxpZGF0ZUxlbmd0aEZhY2V0V2h0c3AoZmFjZXQsIHZhbFR5cGUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIHZhbCwgbGVuZ3RoLCB3cyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNjaGVtYUZhY2V0UHRyKG5fZmFjZXQsIGZhY2V0LCAwKTsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsVHlwZShuX3ZhbFR5cGUsIHZhbFR5cGUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCAyKTsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsUHRyKG5fdmFsLCB2YWwsIDMpOwogICAgICAgIGRlc191bnNpZ25lZF9sb25nX3B0cihuX2xlbmd0aCwgbGVuZ3RoLCA0KTsKICAgICAgICBkZXNfeG1sU2NoZW1hV2hpdGVzcGFjZVZhbHVlVHlwZShuX3dzLCB3cywgNSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFWYWxpZGF0ZUxlbmd0aEZhY2V0V2h0c3AiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmFjZXQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsVHlwZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuZ3RoKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3dzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hVmFsaWRhdGVMaXN0U2ltcGxlVHlwZUZhY2V0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFGYWNldFB0ciBmYWNldDsgLyogdGhlIGZhY2V0IHRvIGNoZWNrICovCiAgICBpbnQgbl9mYWNldDsKICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogdGhlIGxleGljYWwgcmVwciBvZiB0aGUgdmFsdWUgdG8gdmFsaWRhdGUgKi8KICAgIGludCBuX3ZhbHVlOwogICAgdW5zaWduZWQgbG9uZyBhY3R1YWxMZW47IC8qIHRoZSBudW1iZXIgb2YgbGlzdCBpdGVtcyAqLwogICAgaW50IG5fYWN0dWFsTGVuOwogICAgdW5zaWduZWQgbG9uZyAqIGV4cGVjdGVkTGVuOyAvKiB0aGUgcmVzdWx0aW5nIGV4cGVjdGVkIG51bWJlciBvZiBsaXN0IGl0ZW1zICovCiAgICBpbnQgbl9leHBlY3RlZExlbjsKCiAgICBmb3IgKG5fZmFjZXQgPSAwO25fZmFjZXQgPCBnZW5fbmJfeG1sU2NoZW1hRmFjZXRQdHI7bl9mYWNldCsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICBmb3IgKG5fYWN0dWFsTGVuID0gMDtuX2FjdHVhbExlbiA8IGdlbl9uYl91bnNpZ25lZF9sb25nO25fYWN0dWFsTGVuKyspIHsKICAgIGZvciAobl9leHBlY3RlZExlbiA9IDA7bl9leHBlY3RlZExlbiA8IGdlbl9uYl91bnNpZ25lZF9sb25nX3B0cjtuX2V4cGVjdGVkTGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGZhY2V0ID0gZ2VuX3htbFNjaGVtYUZhY2V0UHRyKG5fZmFjZXQsIDApOwogICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDEpOwogICAgICAgIGFjdHVhbExlbiA9IGdlbl91bnNpZ25lZF9sb25nKG5fYWN0dWFsTGVuLCAyKTsKICAgICAgICBleHBlY3RlZExlbiA9IGdlbl91bnNpZ25lZF9sb25nX3B0cihuX2V4cGVjdGVkTGVuLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYVZhbGlkYXRlTGlzdFNpbXBsZVR5cGVGYWNldChmYWNldCwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgYWN0dWFsTGVuLCBleHBlY3RlZExlbik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNjaGVtYUZhY2V0UHRyKG5fZmFjZXQsIGZhY2V0LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgKGNvbnN0IHhtbENoYXIgKil2YWx1ZSwgMSk7CiAgICAgICAgZGVzX3Vuc2lnbmVkX2xvbmcobl9hY3R1YWxMZW4sIGFjdHVhbExlbiwgMik7CiAgICAgICAgZGVzX3Vuc2lnbmVkX2xvbmdfcHRyKG5fZXhwZWN0ZWRMZW4sIGV4cGVjdGVkTGVuLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNjaGVtYVZhbGlkYXRlTGlzdFNpbXBsZVR5cGVGYWNldCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mYWNldCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9hY3R1YWxMZW4pOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZXhwZWN0ZWRMZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFWYWxpZGF0ZVByZWRlZmluZWRUeXBlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGU7IC8qIHRoZSBwcmVkZWZpbmVkIHR5cGUgKi8KICAgIGludCBuX3R5cGU7CiAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSB2YWx1ZSB0byBjaGVjayAqLwogICAgaW50IG5fdmFsdWU7CiAgICB4bWxTY2hlbWFWYWxQdHIgKiB2YWw7IC8qIHRoZSByZXR1cm4gY29tcHV0ZWQgdmFsdWUgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdHlwZSA9IDA7bl90eXBlIDwgZ2VuX25iX3htbFNjaGVtYVR5cGVQdHI7bl90eXBlKyspIHsKICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFNjaGVtYVZhbFB0cl9wdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdHlwZSA9IGdlbl94bWxTY2hlbWFUeXBlUHRyKG5fdHlwZSwgMCk7CiAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMSk7CiAgICAgICAgdmFsID0gZ2VuX3htbFNjaGVtYVZhbFB0cl9wdHIobl92YWwsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hVmFsaWRhdGVQcmVkZWZpbmVkVHlwZSh0eXBlLCAoY29uc3QgeG1sQ2hhciAqKXZhbHVlLCB2YWwpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWFUeXBlUHRyKG5fdHlwZSwgdHlwZSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIDEpOwogICAgICAgIGRlc194bWxTY2hlbWFWYWxQdHJfcHRyKG5fdmFsLCB2YWwsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hVmFsaWRhdGVQcmVkZWZpbmVkVHlwZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90eXBlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYVZhbHVlQXBwZW5kKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfU0NIRU1BU19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxTY2hlbWFWYWxQdHIgcHJldjsgLyogdGhlIHZhbHVlICovCiAgICBpbnQgbl9wcmV2OwogICAgeG1sU2NoZW1hVmFsUHRyIGN1cjsgLyogdGhlIHZhbHVlIHRvIGJlIGFwcGVuZGVkICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX3ByZXYgPSAwO25fcHJldiA8IGdlbl9uYl94bWxTY2hlbWFWYWxQdHI7bl9wcmV2KyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbFNjaGVtYVZhbFB0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBwcmV2ID0gZ2VuX3htbFNjaGVtYVZhbFB0cihuX3ByZXYsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxTY2hlbWFWYWxQdHIobl9jdXIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hVmFsdWVBcHBlbmQocHJldiwgY3VyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sU2NoZW1hVmFsUHRyKG5fcHJldiwgcHJldiwgMCk7CiAgICAgICAgZGVzX3htbFNjaGVtYVZhbFB0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNjaGVtYVZhbHVlQXBwZW5kIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZXYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU2NoZW1hVmFsdWVHZXRBc0Jvb2xlYW4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFNjaGVtYVZhbFB0ciB2YWw7IC8qIHRoZSB2YWx1ZSAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFNjaGVtYVZhbFB0cjtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwgPSBnZW5feG1sU2NoZW1hVmFsUHRyKG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYVZhbHVlR2V0QXNCb29sZWFuKHZhbCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFNjaGVtYVZhbFB0cihuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNjaGVtYVZhbHVlR2V0QXNCb29sZWFuIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYVZhbHVlR2V0QXNTdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBjb25zdCB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFNjaGVtYVZhbFB0ciB2YWw7IC8qIHRoZSB2YWx1ZSAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFNjaGVtYVZhbFB0cjtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwgPSBnZW5feG1sU2NoZW1hVmFsUHRyKG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYVZhbHVlR2V0QXNTdHJpbmcodmFsKTsKICAgICAgICBkZXNyZXRfY29uc3RfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxTY2hlbWFWYWxQdHIobl92YWwsIHZhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFWYWx1ZUdldEFzU3RyaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFNjaGVtYVZhbHVlR2V0TmV4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTY2hlbWFXaGl0ZVNwYWNlUmVwbGFjZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1NDSEVNQVNfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sQ2hhciAqIHZhbHVlOyAvKiBhIHZhbHVlICovCiAgICBpbnQgbl92YWx1ZTsKCiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYVdoaXRlU3BhY2VSZXBsYWNlKChjb25zdCB4bWxDaGFyICopdmFsdWUpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIChjb25zdCB4bWxDaGFyICopdmFsdWUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hV2hpdGVTcGFjZVJlcGxhY2UiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbHNjaGVtYXN0eXBlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgeG1sc2NoZW1hc3R5cGVzIDogMjYgb2YgMzQgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYUNoZWNrRmFjZXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hQ2xlYW51cFR5cGVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYUNvbGxhcHNlU3RyaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYUNvbXBhcmVWYWx1ZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hQ29tcGFyZVZhbHVlc1dodHNwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYUNvcHlWYWx1ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFHZXRCdWlsdEluTGlzdFNpbXBsZVR5cGVJdGVtVHlwZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFHZXRCdWlsdEluVHlwZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFHZXRDYW5vblZhbHVlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYUdldENhbm9uVmFsdWVXaHRzcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFHZXRGYWNldFZhbHVlQXNVTG9uZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFHZXRQcmVkZWZpbmVkVHlwZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFHZXRWYWxUeXBlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYUluaXRUeXBlcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFJc0J1aWx0SW5UeXBlRmFjZXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hTmV3RmFjZXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hTmV3Tk9UQVRJT05WYWx1ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFOZXdRTmFtZVZhbHVlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYU5ld1N0cmluZ1ZhbHVlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYVZhbFByZWRlZlR5cGVOb2RlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYVZhbFByZWRlZlR5cGVOb2RlTm9Ob3JtKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYVZhbGlkYXRlRmFjZXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hVmFsaWRhdGVGYWNldFdodHNwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYVZhbGlkYXRlTGVuZ3RoRmFjZXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hVmFsaWRhdGVMZW5ndGhGYWNldFdodHNwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYVZhbGlkYXRlTGlzdFNpbXBsZVR5cGVGYWNldCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTY2hlbWFWYWxpZGF0ZVByZWRlZmluZWRUeXBlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYVZhbHVlQXBwZW5kKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYVZhbHVlR2V0QXNCb29sZWFuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYVZhbHVlR2V0QXNTdHJpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU2NoZW1hVmFsdWVHZXROZXh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFNjaGVtYVdoaXRlU3BhY2VSZXBsYWNlKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSB4bWxzY2hlbWFzdHlwZXM6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbENoYXJTdHJkdXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIGNoYXIgKiBjdXI7IC8qIHRoZSBpbnB1dCBjaGFyICogKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9jdXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sQ2hhclN0cmR1cCgoY29uc3QgY2hhciAqKWN1cik7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9jdXIsIChjb25zdCBjaGFyICopY3VyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENoYXJTdHJkdXAiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDaGFyU3RybmR1cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgY2hhciAqIGN1cjsgLyogdGhlIGlucHV0IGNoYXIgKiAqLwogICAgaW50IG5fY3VyOwogICAgaW50IGxlbjsgLyogdGhlIGxlbiBvZiBAY3VyICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9jdXIrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2N1ciwgMCk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxDaGFyU3RybmR1cCgoY29uc3QgY2hhciAqKWN1ciwgbGVuKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2N1ciwgKGNvbnN0IGNoYXIgKiljdXIsIDApOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDaGFyU3RybmR1cCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxDaGVja1VURjgodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHVuc2lnbmVkIGNoYXIgKiB1dGY7IC8qIFBvaW50ZXIgdG8gcHV0YXRpdmUgVVRGLTggZW5jb2RlZCBzdHJpbmcuICovCiAgICBpbnQgbl91dGY7CgogICAgZm9yIChuX3V0ZiA9IDA7bl91dGYgPCBnZW5fbmJfY29uc3RfdW5zaWduZWRfY2hhcl9wdHI7bl91dGYrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdXRmID0gZ2VuX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyKG5fdXRmLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbENoZWNrVVRGOCgoY29uc3QgdW5zaWduZWQgY2hhciAqKXV0Zik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyKG5fdXRmLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKXV0ZiwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDaGVja1VURjgiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXRmKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxHZXRVVEY4Q2hhcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgdW5zaWduZWQgY2hhciAqIHV0ZjsgLyogYSBzZXF1ZW5jZSBvZiBVVEYtOCBlbmNvZGVkIGJ5dGVzICovCiAgICBpbnQgbl91dGY7CiAgICBpbnQgKiBsZW47IC8qIGEgcG9pbnRlciB0byB0aGUgbWluaW11bSBudW1iZXIgb2YgYnl0ZXMgcHJlc2VudCBpbiB0aGUgc2VxdWVuY2UuICBUaGlzIGlzIHVzZWQgdG8gYXNzdXJlIHRoZSBuZXh0IGNoYXJhY3RlciBpcyBjb21wbGV0ZWx5IGNvbnRhaW5lZCB3aXRoaW4gdGhlIHNlcXVlbmNlLiAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl91dGYgPSAwO25fdXRmIDwgZ2VuX25iX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyO25fdXRmKyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludF9wdHI7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdXRmID0gZ2VuX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyKG5fdXRmLCAwKTsKICAgICAgICBsZW4gPSBnZW5faW50X3B0cihuX2xlbiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxHZXRVVEY4Q2hhcigoY29uc3QgdW5zaWduZWQgY2hhciAqKXV0ZiwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfdW5zaWduZWRfY2hhcl9wdHIobl91dGYsIChjb25zdCB1bnNpZ25lZCBjaGFyICopdXRmLCAwKTsKICAgICAgICBkZXNfaW50X3B0cihuX2xlbiwgbGVuLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEdldFVURjhDaGFyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3V0Zik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFN0ckVxdWFsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyICogc3RyMTsgLyogdGhlIGZpcnN0IHhtbENoYXIgKiAqLwogICAgaW50IG5fc3RyMTsKICAgIHhtbENoYXIgKiBzdHIyOyAvKiB0aGUgc2Vjb25kIHhtbENoYXIgKiAqLwogICAgaW50IG5fc3RyMjsKCiAgICBmb3IgKG5fc3RyMSA9IDA7bl9zdHIxIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyMSsrKSB7CiAgICBmb3IgKG5fc3RyMiA9IDA7bl9zdHIyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyMisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzdHIxID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyMSwgMCk7CiAgICAgICAgc3RyMiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0cjIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sU3RyRXF1YWwoKGNvbnN0IHhtbENoYXIgKilzdHIxLCAoY29uc3QgeG1sQ2hhciAqKXN0cjIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0cjEsIChjb25zdCB4bWxDaGFyICopc3RyMSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyMiwgKGNvbnN0IHhtbENoYXIgKilzdHIyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFN0ckVxdWFsIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cjEpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyMik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3RyUHJpbnRmKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFN0clFFcXVhbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQ2hhciAqIHByZWY7IC8qIHRoZSBwcmVmaXggb2YgdGhlIFFOYW1lICovCiAgICBpbnQgbl9wcmVmOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBsb2NhbG5hbWUgb2YgdGhlIFFOYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIHN0cjsgLyogdGhlIHNlY29uZCB4bWxDaGFyICogKi8KICAgIGludCBuX3N0cjsKCiAgICBmb3IgKG5fcHJlZiA9IDA7bl9wcmVmIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHJlZisrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fc3RyID0gMDtuX3N0ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBwcmVmID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZiwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxTdHJRRXF1YWwoKGNvbnN0IHhtbENoYXIgKilwcmVmLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopc3RyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmLCAoY29uc3QgeG1sQ2hhciAqKXByZWYsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAoY29uc3QgeG1sQ2hhciAqKXN0ciwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTdHJRRXF1YWwiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHJlZik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3RyVlByaW50Zih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTdHJjYXNlY21wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyICogc3RyMTsgLyogdGhlIGZpcnN0IHhtbENoYXIgKiAqLwogICAgaW50IG5fc3RyMTsKICAgIHhtbENoYXIgKiBzdHIyOyAvKiB0aGUgc2Vjb25kIHhtbENoYXIgKiAqLwogICAgaW50IG5fc3RyMjsKCiAgICBmb3IgKG5fc3RyMSA9IDA7bl9zdHIxIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyMSsrKSB7CiAgICBmb3IgKG5fc3RyMiA9IDA7bl9zdHIyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyMisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzdHIxID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyMSwgMCk7CiAgICAgICAgc3RyMiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0cjIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sU3RyY2FzZWNtcCgoY29uc3QgeG1sQ2hhciAqKXN0cjEsIChjb25zdCB4bWxDaGFyICopc3RyMik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyMSwgKGNvbnN0IHhtbENoYXIgKilzdHIxLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIyLCAoY29uc3QgeG1sQ2hhciAqKXN0cjIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU3RyY2FzZWNtcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIxKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cjIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFN0cmNhc2VzdHIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBjb25zdCB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBzdHI7IC8qIHRoZSB4bWxDaGFyICogYXJyYXkgKGhheXN0YWNrKSAqLwogICAgaW50IG5fc3RyOwogICAgeG1sQ2hhciAqIHZhbDsgLyogdGhlIHhtbENoYXIgdG8gc2VhcmNoIChuZWVkbGUpICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIrKykgewogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3RyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAwKTsKICAgICAgICB2YWwgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWwsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sU3RyY2FzZXN0cigoY29uc3QgeG1sQ2hhciAqKXN0ciwgKGNvbnN0IHhtbENoYXIgKil2YWwpOwogICAgICAgIGRlc3JldF9jb25zdF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAoY29uc3QgeG1sQ2hhciAqKXN0ciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsLCAoY29uc3QgeG1sQ2hhciAqKXZhbCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTdHJjYXNlc3RyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFN0cmNocih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sQ2hhciAqIHN0cjsgLyogdGhlIHhtbENoYXIgKiBhcnJheSAqLwogICAgaW50IG5fc3RyOwogICAgeG1sQ2hhciB2YWw7IC8qIHRoZSB4bWxDaGFyIHRvIHNlYXJjaCAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl9zdHIgPSAwO25fc3RyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyKyspIHsKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbENoYXI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3RyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAwKTsKICAgICAgICB2YWwgPSBnZW5feG1sQ2hhcihuX3ZhbCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTdHJjaHIoKGNvbnN0IHhtbENoYXIgKilzdHIsIHZhbCk7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIChjb25zdCB4bWxDaGFyICopc3RyLCAwKTsKICAgICAgICBkZXNfeG1sQ2hhcihuX3ZhbCwgdmFsLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFN0cmNociIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTdHJjbXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBzdHIxOyAvKiB0aGUgZmlyc3QgeG1sQ2hhciAqICovCiAgICBpbnQgbl9zdHIxOwogICAgeG1sQ2hhciAqIHN0cjI7IC8qIHRoZSBzZWNvbmQgeG1sQ2hhciAqICovCiAgICBpbnQgbl9zdHIyOwoKICAgIGZvciAobl9zdHIxID0gMDtuX3N0cjEgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIxKyspIHsKICAgIGZvciAobl9zdHIyID0gMDtuX3N0cjIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0cjEgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIxLCAwKTsKICAgICAgICBzdHIyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyMiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTdHJjbXAoKGNvbnN0IHhtbENoYXIgKilzdHIxLCAoY29uc3QgeG1sQ2hhciAqKXN0cjIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0cjEsIChjb25zdCB4bWxDaGFyICopc3RyMSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyMiwgKGNvbnN0IHhtbENoYXIgKilzdHIyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFN0cmNtcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIxKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cjIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFN0cmR1cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sQ2hhciAqIGN1cjsgLyogdGhlIGlucHV0IHhtbENoYXIgKiAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2N1ciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxTdHJkdXAoKGNvbnN0IHhtbENoYXIgKiljdXIpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY3VyLCAoY29uc3QgeG1sQ2hhciAqKWN1ciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTdHJkdXAiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxTdHJsZW4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBzdHI7IC8qIHRoZSB4bWxDaGFyICogYXJyYXkgKi8KICAgIGludCBuX3N0cjsKCiAgICBmb3IgKG5fc3RyID0gMDtuX3N0ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzdHIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sU3RybGVuKChjb25zdCB4bWxDaGFyICopc3RyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIChjb25zdCB4bWxDaGFyICopc3RyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFN0cmxlbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFN0cm5jYXNlY21wKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyICogc3RyMTsgLyogdGhlIGZpcnN0IHhtbENoYXIgKiAqLwogICAgaW50IG5fc3RyMTsKICAgIHhtbENoYXIgKiBzdHIyOyAvKiB0aGUgc2Vjb25kIHhtbENoYXIgKiAqLwogICAgaW50IG5fc3RyMjsKICAgIGludCBsZW47IC8qIHRoZSBtYXggY29tcGFyaXNvbiBsZW5ndGggKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fc3RyMSA9IDA7bl9zdHIxIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyMSsrKSB7CiAgICBmb3IgKG5fc3RyMiA9IDA7bl9zdHIyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyMisrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3RyMSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0cjEsIDApOwogICAgICAgIHN0cjIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIyLCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFN0cm5jYXNlY21wKChjb25zdCB4bWxDaGFyICopc3RyMSwgKGNvbnN0IHhtbENoYXIgKilzdHIyLCBsZW4pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0cjEsIChjb25zdCB4bWxDaGFyICopc3RyMSwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyMiwgKGNvbnN0IHhtbENoYXIgKilzdHIyLCAxKTsKICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU3RybmNhc2VjbXAiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyMSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3RybmNhdE5ldyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sQ2hhciAqIHN0cjE7IC8qIGZpcnN0IHhtbENoYXIgc3RyaW5nICovCiAgICBpbnQgbl9zdHIxOwogICAgeG1sQ2hhciAqIHN0cjI7IC8qIHNlY29uZCB4bWxDaGFyIHN0cmluZyAqLwogICAgaW50IG5fc3RyMjsKICAgIGludCBsZW47IC8qIHRoZSBsZW4gb2YgQHN0cjIgb3IgPCAwICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX3N0cjEgPSAwO25fc3RyMSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cjErKykgewogICAgZm9yIChuX3N0cjIgPSAwO25fc3RyMiA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cjIrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0cjEgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIxLCAwKTsKICAgICAgICBzdHIyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyMiwgMSk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxTdHJuY2F0TmV3KChjb25zdCB4bWxDaGFyICopc3RyMSwgKGNvbnN0IHhtbENoYXIgKilzdHIyLCBsZW4pOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyMSwgKGNvbnN0IHhtbENoYXIgKilzdHIxLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIyLCAoY29uc3QgeG1sQ2hhciAqKXN0cjIsIDEpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTdHJuY2F0TmV3IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cjEpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyMik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFN0cm5jbXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBzdHIxOyAvKiB0aGUgZmlyc3QgeG1sQ2hhciAqICovCiAgICBpbnQgbl9zdHIxOwogICAgeG1sQ2hhciAqIHN0cjI7IC8qIHRoZSBzZWNvbmQgeG1sQ2hhciAqICovCiAgICBpbnQgbl9zdHIyOwogICAgaW50IGxlbjsgLyogdGhlIG1heCBjb21wYXJpc29uIGxlbmd0aCAqLwogICAgaW50IG5fbGVuOwoKICAgIGZvciAobl9zdHIxID0gMDtuX3N0cjEgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIxKyspIHsKICAgIGZvciAobl9zdHIyID0gMDtuX3N0cjIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIyKyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzdHIxID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyMSwgMCk7CiAgICAgICAgc3RyMiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0cjIsIDEpOwogICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sU3RybmNtcCgoY29uc3QgeG1sQ2hhciAqKXN0cjEsIChjb25zdCB4bWxDaGFyICopc3RyMiwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIxLCAoY29uc3QgeG1sQ2hhciAqKXN0cjEsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0cjIsIChjb25zdCB4bWxDaGFyICopc3RyMiwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFN0cm5jbXAiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyMSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3RybmR1cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sQ2hhciAqIGN1cjsgLyogdGhlIGlucHV0IHhtbENoYXIgKiAqLwogICAgaW50IG5fY3VyOwogICAgaW50IGxlbjsgLyogdGhlIGxlbiBvZiBAY3VyICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jdXIrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2N1ciwgMCk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxTdHJuZHVwKChjb25zdCB4bWxDaGFyICopY3VyLCBsZW4pOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY3VyLCAoY29uc3QgeG1sQ2hhciAqKWN1ciwgMCk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFN0cm5kdXAiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3Ryc3RyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgeG1sQ2hhciAqIGFycmF5IChoYXlzdGFjaykgKi8KICAgIGludCBuX3N0cjsKICAgIHhtbENoYXIgKiB2YWw7IC8qIHRoZSB4bWxDaGFyIHRvIHNlYXJjaCAobmVlZGxlKSAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl9zdHIgPSAwO25fc3RyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyKyspIHsKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgMCk7CiAgICAgICAgdmFsID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFN0cnN0cigoY29uc3QgeG1sQ2hhciAqKXN0ciwgKGNvbnN0IHhtbENoYXIgKil2YWwpOwogICAgICAgIGRlc3JldF9jb25zdF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAoY29uc3QgeG1sQ2hhciAqKXN0ciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsLCAoY29uc3QgeG1sQ2hhciAqKXZhbCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTdHJzdHIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sU3Ryc3ViKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgeG1sQ2hhciAqIGFycmF5IChoYXlzdGFjaykgKi8KICAgIGludCBuX3N0cjsKICAgIGludCBzdGFydDsgLyogdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyICh6ZXJvIGJhc2VkKSAqLwogICAgaW50IG5fc3RhcnQ7CiAgICBpbnQgbGVuOyAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBzdWJzdHJpbmcgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fc3RyID0gMDtuX3N0ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cisrKSB7CiAgICBmb3IgKG5fc3RhcnQgPSAwO25fc3RhcnQgPCBnZW5fbmJfaW50O25fc3RhcnQrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgMCk7CiAgICAgICAgc3RhcnQgPSBnZW5faW50KG5fc3RhcnQsIDEpOwogICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sU3Ryc3ViKChjb25zdCB4bWxDaGFyICopc3RyLCBzdGFydCwgbGVuKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgKGNvbnN0IHhtbENoYXIgKilzdHIsIDApOwogICAgICAgIGRlc19pbnQobl9zdGFydCwgc3RhcnQsIDEpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTdHJzdWIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0YXJ0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVVRGOENoYXJjbXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiB1dGYxOyAvKiBwb2ludGVyIHRvIGZpcnN0IFVURjggY2hhciAqLwogICAgaW50IG5fdXRmMTsKICAgIHhtbENoYXIgKiB1dGYyOyAvKiBwb2ludGVyIHRvIHNlY29uZCBVVEY4IGNoYXIgKi8KICAgIGludCBuX3V0ZjI7CgogICAgZm9yIChuX3V0ZjEgPSAwO25fdXRmMSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3V0ZjErKykgewogICAgZm9yIChuX3V0ZjIgPSAwO25fdXRmMiA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3V0ZjIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdXRmMSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3V0ZjEsIDApOwogICAgICAgIHV0ZjIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl91dGYyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVURjhDaGFyY21wKChjb25zdCB4bWxDaGFyICopdXRmMSwgKGNvbnN0IHhtbENoYXIgKil1dGYyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl91dGYxLCAoY29uc3QgeG1sQ2hhciAqKXV0ZjEsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3V0ZjIsIChjb25zdCB4bWxDaGFyICopdXRmMiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVVEY4Q2hhcmNtcCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91dGYxKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3V0ZjIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVURjhTaXplKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyICogdXRmOyAvKiBwb2ludGVyIHRvIHRoZSBVVEY4IGNoYXJhY3RlciAqLwogICAgaW50IG5fdXRmOwoKICAgIGZvciAobl91dGYgPSAwO25fdXRmIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdXRmKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHV0ZiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3V0ZiwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVVEY4U2l6ZSgoY29uc3QgeG1sQ2hhciAqKXV0Zik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdXRmLCAoY29uc3QgeG1sQ2hhciAqKXV0ZiwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVVEY4U2l6ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91dGYpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVURjhTdHJsZW4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiB1dGY7IC8qIGEgc2VxdWVuY2Ugb2YgVVRGLTggZW5jb2RlZCBieXRlcyAqLwogICAgaW50IG5fdXRmOwoKICAgIGZvciAobl91dGYgPSAwO25fdXRmIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdXRmKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHV0ZiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3V0ZiwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVVEY4U3RybGVuKChjb25zdCB4bWxDaGFyICopdXRmKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl91dGYsIChjb25zdCB4bWxDaGFyICopdXRmLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVURjhTdHJsZW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXRmKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVVEY4U3RybG9jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxDaGFyICogdXRmOyAvKiB0aGUgaW5wdXQgVVRGOCAqICovCiAgICBpbnQgbl91dGY7CiAgICB4bWxDaGFyICogdXRmY2hhcjsgLyogdGhlIFVURjggY2hhcmFjdGVyIHRvIGJlIGZvdW5kICovCiAgICBpbnQgbl91dGZjaGFyOwoKICAgIGZvciAobl91dGYgPSAwO25fdXRmIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdXRmKyspIHsKICAgIGZvciAobl91dGZjaGFyID0gMDtuX3V0ZmNoYXIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl91dGZjaGFyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHV0ZiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3V0ZiwgMCk7CiAgICAgICAgdXRmY2hhciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3V0ZmNoYXIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVVRGOFN0cmxvYygoY29uc3QgeG1sQ2hhciAqKXV0ZiwgKGNvbnN0IHhtbENoYXIgKil1dGZjaGFyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl91dGYsIChjb25zdCB4bWxDaGFyICopdXRmLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl91dGZjaGFyLCAoY29uc3QgeG1sQ2hhciAqKXV0ZmNoYXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVVRGOFN0cmxvYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91dGYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXRmY2hhcik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVVRGOFN0cm5kdXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbENoYXIgKiB1dGY7IC8qIHRoZSBpbnB1dCBVVEY4ICogKi8KICAgIGludCBuX3V0ZjsKICAgIGludCBsZW47IC8qIHRoZSBsZW4gb2YgQHV0ZiAoaW4gY2hhcnMpICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX3V0ZiA9IDA7bl91dGYgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl91dGYrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHV0ZiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3V0ZiwgMCk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxVVEY4U3RybmR1cCgoY29uc3QgeG1sQ2hhciAqKXV0ZiwgbGVuKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3V0ZiwgKGNvbnN0IHhtbENoYXIgKil1dGYsIDApOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVVEY4U3RybmR1cCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91dGYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVVEY4U3RycG9zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaW50IG1lbV9iYXNlOwogICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxDaGFyICogdXRmOyAvKiB0aGUgaW5wdXQgVVRGOCAqICovCiAgICBpbnQgbl91dGY7CiAgICBpbnQgcG9zOyAvKiB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgVVRGOCBjaGFyIChpbiBjaGFycykgKi8KICAgIGludCBuX3BvczsKCiAgICBmb3IgKG5fdXRmID0gMDtuX3V0ZiA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3V0ZisrKSB7CiAgICBmb3IgKG5fcG9zID0gMDtuX3BvcyA8IGdlbl9uYl9pbnQ7bl9wb3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdXRmID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdXRmLCAwKTsKICAgICAgICBwb3MgPSBnZW5faW50KG5fcG9zLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVURjhTdHJwb3MoKGNvbnN0IHhtbENoYXIgKil1dGYsIHBvcyk7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl91dGYsIChjb25zdCB4bWxDaGFyICopdXRmLCAwKTsKICAgICAgICBkZXNfaW50KG5fcG9zLCBwb3MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVVRGOFN0cnBvcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91dGYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcG9zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVVEY4U3Ryc2l6ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sQ2hhciAqIHV0ZjsgLyogYSBzZXF1ZW5jZSBvZiBVVEYtOCBlbmNvZGVkIGJ5dGVzICovCiAgICBpbnQgbl91dGY7CiAgICBpbnQgbGVuOyAvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGFycmF5ICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX3V0ZiA9IDA7bl91dGYgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl91dGYrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHV0ZiA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3V0ZiwgMCk7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxVVEY4U3Ryc2l6ZSgoY29uc3QgeG1sQ2hhciAqKXV0ZiwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl91dGYsIChjb25zdCB4bWxDaGFyICopdXRmLCAwKTsKICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVVRGOFN0cnNpemUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXRmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVVRGOFN0cnN1Yih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sQ2hhciAqIHV0ZjsgLyogYSBzZXF1ZW5jZSBvZiBVVEYtOCBlbmNvZGVkIGJ5dGVzICovCiAgICBpbnQgbl91dGY7CiAgICBpbnQgc3RhcnQ7IC8qIHJlbGF0aXZlIHBvcyBvZiBmaXJzdCBjaGFyICovCiAgICBpbnQgbl9zdGFydDsKICAgIGludCBsZW47IC8qIHRvdGFsIG51bWJlciB0byBjb3B5ICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX3V0ZiA9IDA7bl91dGYgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl91dGYrKykgewogICAgZm9yIChuX3N0YXJ0ID0gMDtuX3N0YXJ0IDwgZ2VuX25iX2ludDtuX3N0YXJ0KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB1dGYgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl91dGYsIDApOwogICAgICAgIHN0YXJ0ID0gZ2VuX2ludChuX3N0YXJ0LCAxKTsKICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVURjhTdHJzdWIoKGNvbnN0IHhtbENoYXIgKil1dGYsIHN0YXJ0LCBsZW4pOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdXRmLCAoY29uc3QgeG1sQ2hhciAqKXV0ZiwgMCk7CiAgICAgICAgZGVzX2ludChuX3N0YXJ0LCBzdGFydCwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVURjhTdHJzdWIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXRmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0YXJ0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCnN0YXRpYyBpbnQKdGVzdF94bWxzdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIHhtbHN0cmluZyA6IDI2IG9mIDMwIGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxDaGFyU3RyZHVwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENoYXJTdHJuZHVwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbENoZWNrVVRGOCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxHZXRVVEY4Q2hhcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdHJFcXVhbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdHJQcmludGYoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3RyUUVxdWFsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFN0clZQcmludGYoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3RyY2FzZWNtcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdHJjYXNlc3RyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFN0cmNocigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdHJjbXAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3RyZHVwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFN0cmxlbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdHJuY2FzZWNtcCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdHJuY2F0TmV3KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFN0cm5jbXAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3RybmR1cCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxTdHJzdHIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sU3Ryc3ViKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVURjhDaGFyY21wKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVURjhTaXplKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVURjhTdHJsZW4oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVVRGOFN0cmxvYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVVEY4U3RybmR1cCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVVEY4U3RycG9zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVURjhTdHJzaXplKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVURjhTdHJzdWIoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIHhtbHN0cmluZzogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNBZWdlYW5OdW1iZXJzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0FlZ2Vhbk51bWJlcnMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNBZWdlYW5OdW1iZXJzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0FscGhhYmV0aWNQcmVzZW50YXRpb25Gb3Jtcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNBbHBoYWJldGljUHJlc2VudGF0aW9uRm9ybXMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNBbHBoYWJldGljUHJlc2VudGF0aW9uRm9ybXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQXJhYmljKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0FyYWJpYyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0FyYWJpYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNBcmFiaWNQcmVzZW50YXRpb25Gb3Jtc0Eodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQXJhYmljUHJlc2VudGF0aW9uRm9ybXNBKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQXJhYmljUHJlc2VudGF0aW9uRm9ybXNBIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0FyYWJpY1ByZXNlbnRhdGlvbkZvcm1zQih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNBcmFiaWNQcmVzZW50YXRpb25Gb3Jtc0IoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNBcmFiaWNQcmVzZW50YXRpb25Gb3Jtc0IiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQXJtZW5pYW4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQXJtZW5pYW4oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNBcm1lbmlhbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNBcnJvd3Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQXJyb3dzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQXJyb3dzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0Jhc2ljTGF0aW4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQmFzaWNMYXRpbihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0Jhc2ljTGF0aW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQmVuZ2FsaSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNCZW5nYWxpKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQmVuZ2FsaSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNCbG9jayh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwogICAgY2hhciAqIGJsb2NrOyAvKiBVQ1MgYmxvY2sgbmFtZSAqLwogICAgaW50IG5fYmxvY2s7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgIGZvciAobl9ibG9jayA9IDA7bl9ibG9jayA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2Jsb2NrKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CiAgICAgICAgYmxvY2sgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9ibG9jaywgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0Jsb2NrKGNvZGUsIChjb25zdCBjaGFyICopYmxvY2spOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9ibG9jaywgKGNvbnN0IGNoYXIgKilibG9jaywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0Jsb2NrIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYmxvY2spOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0Jsb2NrRWxlbWVudHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQmxvY2tFbGVtZW50cyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0Jsb2NrRWxlbWVudHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQm9wb21vZm8odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQm9wb21vZm8oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNCb3BvbW9mbyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNCb3BvbW9mb0V4dGVuZGVkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0JvcG9tb2ZvRXh0ZW5kZWQoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNCb3BvbW9mb0V4dGVuZGVkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0JveERyYXdpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQm94RHJhd2luZyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0JveERyYXdpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQnJhaWxsZVBhdHRlcm5zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0JyYWlsbGVQYXR0ZXJucyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0JyYWlsbGVQYXR0ZXJucyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNCdWhpZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNCdWhpZChjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0J1aGlkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0J5emFudGluZU11c2ljYWxTeW1ib2xzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0J5emFudGluZU11c2ljYWxTeW1ib2xzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQnl6YW50aW5lTXVzaWNhbFN5bWJvbHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ0pLQ29tcGF0aWJpbGl0eSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDSktDb21wYXRpYmlsaXR5KGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ0pLQ29tcGF0aWJpbGl0eSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDSktDb21wYXRpYmlsaXR5Rm9ybXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ0pLQ29tcGF0aWJpbGl0eUZvcm1zKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ0pLQ29tcGF0aWJpbGl0eUZvcm1zIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NKS0NvbXBhdGliaWxpdHlJZGVvZ3JhcGhzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NKS0NvbXBhdGliaWxpdHlJZGVvZ3JhcGhzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ0pLQ29tcGF0aWJpbGl0eUlkZW9ncmFwaHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ0pLQ29tcGF0aWJpbGl0eUlkZW9ncmFwaHNTdXBwbGVtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NKS0NvbXBhdGliaWxpdHlJZGVvZ3JhcGhzU3VwcGxlbWVudChjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NKS0NvbXBhdGliaWxpdHlJZGVvZ3JhcGhzU3VwcGxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDSktSYWRpY2Fsc1N1cHBsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ0pLUmFkaWNhbHNTdXBwbGVtZW50KGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ0pLUmFkaWNhbHNTdXBwbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NKS1N5bWJvbHNhbmRQdW5jdHVhdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDSktTeW1ib2xzYW5kUHVuY3R1YXRpb24oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDSktTeW1ib2xzYW5kUHVuY3R1YXRpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ0pLVW5pZmllZElkZW9ncmFwaHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ0pLVW5pZmllZElkZW9ncmFwaHMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDSktVbmlmaWVkSWRlb2dyYXBocyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDSktVbmlmaWVkSWRlb2dyYXBoc0V4dGVuc2lvbkEodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ0pLVW5pZmllZElkZW9ncmFwaHNFeHRlbnNpb25BKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ0pLVW5pZmllZElkZW9ncmFwaHNFeHRlbnNpb25BIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NKS1VuaWZpZWRJZGVvZ3JhcGhzRXh0ZW5zaW9uQih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDSktVbmlmaWVkSWRlb2dyYXBoc0V4dGVuc2lvbkIoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDSktVbmlmaWVkSWRlb2dyYXBoc0V4dGVuc2lvbkIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CiAgICBjaGFyICogY2F0OyAvKiBVQ1MgQ2F0ZWdvcnkgbmFtZSAqLwogICAgaW50IG5fY2F0OwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICBmb3IgKG5fY2F0ID0gMDtuX2NhdCA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2NhdCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwogICAgICAgIGNhdCA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2NhdCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdChjb2RlLCAoY29uc3QgY2hhciAqKWNhdCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2NhdCwgKGNvbnN0IGNoYXIgKiljYXQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jYXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdEModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0Qyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdEMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0Q2Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0Q2MoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRDYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRDZih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDYXRDZihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdENmIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdENvKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdENvKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2F0Q28iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0Q3Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0Q3MoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRDcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRMKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdEwoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRMIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdExsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdExsKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2F0TGwiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0TG0odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0TG0oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRMbSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRMbyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDYXRMbyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdExvIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdEx0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdEx0KGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2F0THQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0THUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0THUoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRMdSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRNKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdE0oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRNIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdE1jKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdE1jKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2F0TWMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0TWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0TWUoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRNZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRNbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDYXRNbihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdE1uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdE4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0Tihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdE4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0TmQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0TmQoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXROZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRObCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDYXRObChjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdE5sIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdE5vKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdE5vKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2F0Tm8iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0UCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDYXRQKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2F0UCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRQYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDYXRQYyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdFBjIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdFBkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdFBkKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2F0UGQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0UGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0UGUoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRQZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRQZih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDYXRQZihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdFBmIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdFBpKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdFBpKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2F0UGkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0UG8odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0UG8oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRQbyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRQcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDYXRQcyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdFBzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdFModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0Uyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdFMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0U2Modm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0U2MoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRTYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRTayh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDYXRTayhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdFNrIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdFNtKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdFNtKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2F0U20iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0U28odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0U28oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRTbyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRaKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdFooY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRaIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NhdFpsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NhdFpsKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2F0WmwiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ2F0WnAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ2F0WnAoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDYXRacCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDYXRacyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDYXRacyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NhdFpzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NoZXJva2VlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NoZXJva2VlKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ2hlcm9rZWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ29tYmluaW5nRGlhY3JpdGljYWxNYXJrcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDb21iaW5pbmdEaWFjcml0aWNhbE1hcmtzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ29tYmluaW5nRGlhY3JpdGljYWxNYXJrcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDb21iaW5pbmdEaWFjcml0aWNhbE1hcmtzZm9yU3ltYm9scyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDb21iaW5pbmdEaWFjcml0aWNhbE1hcmtzZm9yU3ltYm9scyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NvbWJpbmluZ0RpYWNyaXRpY2FsTWFya3Nmb3JTeW1ib2xzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0NvbWJpbmluZ0hhbGZNYXJrcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDb21iaW5pbmdIYWxmTWFya3MoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDb21iaW5pbmdIYWxmTWFya3MiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ29tYmluaW5nTWFya3Nmb3JTeW1ib2xzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0NvbWJpbmluZ01hcmtzZm9yU3ltYm9scyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0NvbWJpbmluZ01hcmtzZm9yU3ltYm9scyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDb250cm9sUGljdHVyZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzQ29udHJvbFBpY3R1cmVzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ29udHJvbFBpY3R1cmVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0N1cnJlbmN5U3ltYm9scyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDdXJyZW5jeVN5bWJvbHMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDdXJyZW5jeVN5bWJvbHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzQ3lwcmlvdFN5bGxhYmFyeSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDeXByaW90U3lsbGFiYXJ5KGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzQ3lwcmlvdFN5bGxhYmFyeSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNDeXJpbGxpYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDeXJpbGxpYyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0N5cmlsbGljIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0N5cmlsbGljU3VwcGxlbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNDeXJpbGxpY1N1cHBsZW1lbnQoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNDeXJpbGxpY1N1cHBsZW1lbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzRGVzZXJldCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNEZXNlcmV0KGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzRGVzZXJldCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNEZXZhbmFnYXJpKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0RldmFuYWdhcmkoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNEZXZhbmFnYXJpIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0RpbmdiYXRzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0RpbmdiYXRzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzRGluZ2JhdHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzRW5jbG9zZWRBbHBoYW51bWVyaWNzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0VuY2xvc2VkQWxwaGFudW1lcmljcyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0VuY2xvc2VkQWxwaGFudW1lcmljcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNFbmNsb3NlZENKS0xldHRlcnNhbmRNb250aHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzRW5jbG9zZWRDSktMZXR0ZXJzYW5kTW9udGhzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzRW5jbG9zZWRDSktMZXR0ZXJzYW5kTW9udGhzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0V0aGlvcGljKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0V0aGlvcGljKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzRXRoaW9waWMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzR2VuZXJhbFB1bmN0dWF0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0dlbmVyYWxQdW5jdHVhdGlvbihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0dlbmVyYWxQdW5jdHVhdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNHZW9tZXRyaWNTaGFwZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzR2VvbWV0cmljU2hhcGVzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzR2VvbWV0cmljU2hhcGVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0dlb3JnaWFuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0dlb3JnaWFuKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzR2VvcmdpYW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzR290aGljKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0dvdGhpYyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0dvdGhpYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNHcmVlayh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNHcmVlayhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0dyZWVrIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0dyZWVrRXh0ZW5kZWQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzR3JlZWtFeHRlbmRlZChjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0dyZWVrRXh0ZW5kZWQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzR3JlZWthbmRDb3B0aWModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzR3JlZWthbmRDb3B0aWMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNHcmVla2FuZENvcHRpYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNHdWphcmF0aSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNHdWphcmF0aShjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0d1amFyYXRpIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0d1cm11a2hpKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0d1cm11a2hpKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzR3VybXVraGkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzSGFsZndpZHRoYW5kRnVsbHdpZHRoRm9ybXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzSGFsZndpZHRoYW5kRnVsbHdpZHRoRm9ybXMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNIYWxmd2lkdGhhbmRGdWxsd2lkdGhGb3JtcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNIYW5ndWxDb21wYXRpYmlsaXR5SmFtbyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNIYW5ndWxDb21wYXRpYmlsaXR5SmFtbyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0hhbmd1bENvbXBhdGliaWxpdHlKYW1vIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0hhbmd1bEphbW8odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzSGFuZ3VsSmFtbyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0hhbmd1bEphbW8iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzSGFuZ3VsU3lsbGFibGVzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0hhbmd1bFN5bGxhYmxlcyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0hhbmd1bFN5bGxhYmxlcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNIYW51bm9vKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0hhbnVub28oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNIYW51bm9vIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0hlYnJldyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNIZWJyZXcoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNIZWJyZXciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzSGlnaFByaXZhdGVVc2VTdXJyb2dhdGVzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0hpZ2hQcml2YXRlVXNlU3Vycm9nYXRlcyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0hpZ2hQcml2YXRlVXNlU3Vycm9nYXRlcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNIaWdoU3Vycm9nYXRlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNIaWdoU3Vycm9nYXRlcyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0hpZ2hTdXJyb2dhdGVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0hpcmFnYW5hKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0hpcmFnYW5hKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzSGlyYWdhbmEiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzSVBBRXh0ZW5zaW9ucyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNJUEFFeHRlbnNpb25zKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzSVBBRXh0ZW5zaW9ucyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNJZGVvZ3JhcGhpY0Rlc2NyaXB0aW9uQ2hhcmFjdGVycyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNJZGVvZ3JhcGhpY0Rlc2NyaXB0aW9uQ2hhcmFjdGVycyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0lkZW9ncmFwaGljRGVzY3JpcHRpb25DaGFyYWN0ZXJzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0thbmJ1bih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNLYW5idW4oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNLYW5idW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzS2FuZ3hpUmFkaWNhbHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzS2FuZ3hpUmFkaWNhbHMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNLYW5neGlSYWRpY2FscyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNLYW5uYWRhKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0thbm5hZGEoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNLYW5uYWRhIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0thdGFrYW5hKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0thdGFrYW5hKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzS2F0YWthbmEiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzS2F0YWthbmFQaG9uZXRpY0V4dGVuc2lvbnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzS2F0YWthbmFQaG9uZXRpY0V4dGVuc2lvbnMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNLYXRha2FuYVBob25ldGljRXh0ZW5zaW9ucyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNLaG1lcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNLaG1lcihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0tobWVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0tobWVyU3ltYm9scyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNLaG1lclN5bWJvbHMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNLaG1lclN5bWJvbHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzTGFvKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0xhbyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0xhbyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNMYXRpbjFTdXBwbGVtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0xhdGluMVN1cHBsZW1lbnQoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNMYXRpbjFTdXBwbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0xhdGluRXh0ZW5kZWRBKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0xhdGluRXh0ZW5kZWRBKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzTGF0aW5FeHRlbmRlZEEiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzTGF0aW5FeHRlbmRlZEFkZGl0aW9uYWwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzTGF0aW5FeHRlbmRlZEFkZGl0aW9uYWwoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNMYXRpbkV4dGVuZGVkQWRkaXRpb25hbCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNMYXRpbkV4dGVuZGVkQih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNMYXRpbkV4dGVuZGVkQihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0xhdGluRXh0ZW5kZWRCIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0xldHRlcmxpa2VTeW1ib2xzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0xldHRlcmxpa2VTeW1ib2xzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzTGV0dGVybGlrZVN5bWJvbHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzTGltYnUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzTGltYnUoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNMaW1idSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNMaW5lYXJCSWRlb2dyYW1zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc0xpbmVhckJJZGVvZ3JhbXMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNMaW5lYXJCSWRlb2dyYW1zIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc0xpbmVhckJTeWxsYWJhcnkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzTGluZWFyQlN5bGxhYmFyeShjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc0xpbmVhckJTeWxsYWJhcnkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzTG93U3Vycm9nYXRlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNMb3dTdXJyb2dhdGVzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzTG93U3Vycm9nYXRlcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNNYWxheWFsYW0odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzTWFsYXlhbGFtKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzTWFsYXlhbGFtIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc01hdGhlbWF0aWNhbEFscGhhbnVtZXJpY1N5bWJvbHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzTWF0aGVtYXRpY2FsQWxwaGFudW1lcmljU3ltYm9scyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc01hdGhlbWF0aWNhbEFscGhhbnVtZXJpY1N5bWJvbHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzTWF0aGVtYXRpY2FsT3BlcmF0b3JzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc01hdGhlbWF0aWNhbE9wZXJhdG9ycyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc01hdGhlbWF0aWNhbE9wZXJhdG9ycyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNNaXNjZWxsYW5lb3VzTWF0aGVtYXRpY2FsU3ltYm9sc0Eodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzTWlzY2VsbGFuZW91c01hdGhlbWF0aWNhbFN5bWJvbHNBKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzTWlzY2VsbGFuZW91c01hdGhlbWF0aWNhbFN5bWJvbHNBIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc01pc2NlbGxhbmVvdXNNYXRoZW1hdGljYWxTeW1ib2xzQih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNNaXNjZWxsYW5lb3VzTWF0aGVtYXRpY2FsU3ltYm9sc0IoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNNaXNjZWxsYW5lb3VzTWF0aGVtYXRpY2FsU3ltYm9sc0IiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzTWlzY2VsbGFuZW91c1N5bWJvbHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzTWlzY2VsbGFuZW91c1N5bWJvbHMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNNaXNjZWxsYW5lb3VzU3ltYm9scyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNNaXNjZWxsYW5lb3VzU3ltYm9sc2FuZEFycm93cyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNNaXNjZWxsYW5lb3VzU3ltYm9sc2FuZEFycm93cyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc01pc2NlbGxhbmVvdXNTeW1ib2xzYW5kQXJyb3dzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc01pc2NlbGxhbmVvdXNUZWNobmljYWwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzTWlzY2VsbGFuZW91c1RlY2huaWNhbChjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc01pc2NlbGxhbmVvdXNUZWNobmljYWwiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzTW9uZ29saWFuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc01vbmdvbGlhbihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc01vbmdvbGlhbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNNdXNpY2FsU3ltYm9scyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNNdXNpY2FsU3ltYm9scyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc011c2ljYWxTeW1ib2xzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc015YW5tYXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzTXlhbm1hcihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc015YW5tYXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzTnVtYmVyRm9ybXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzTnVtYmVyRm9ybXMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNOdW1iZXJGb3JtcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNPZ2hhbSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNPZ2hhbShjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc09naGFtIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc09sZEl0YWxpYyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNPbGRJdGFsaWMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNPbGRJdGFsaWMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzT3B0aWNhbENoYXJhY3RlclJlY29nbml0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc09wdGljYWxDaGFyYWN0ZXJSZWNvZ25pdGlvbihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc09wdGljYWxDaGFyYWN0ZXJSZWNvZ25pdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNPcml5YSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNPcml5YShjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc09yaXlhIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc09zbWFueWEodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzT3NtYW55YShjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc09zbWFueWEiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzUGhvbmV0aWNFeHRlbnNpb25zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1Bob25ldGljRXh0ZW5zaW9ucyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc1Bob25ldGljRXh0ZW5zaW9ucyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNQcml2YXRlVXNlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1ByaXZhdGVVc2UoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNQcml2YXRlVXNlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1ByaXZhdGVVc2VBcmVhKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1ByaXZhdGVVc2VBcmVhKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzUHJpdmF0ZVVzZUFyZWEiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzUnVuaWModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzUnVuaWMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNSdW5pYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNTaGF2aWFuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1NoYXZpYW4oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNTaGF2aWFuIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1NpbmhhbGEodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzU2luaGFsYShjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc1NpbmhhbGEiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzU21hbGxGb3JtVmFyaWFudHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzU21hbGxGb3JtVmFyaWFudHMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNTbWFsbEZvcm1WYXJpYW50cyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNTcGFjaW5nTW9kaWZpZXJMZXR0ZXJzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1NwYWNpbmdNb2RpZmllckxldHRlcnMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNTcGFjaW5nTW9kaWZpZXJMZXR0ZXJzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1NwZWNpYWxzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1NwZWNpYWxzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzU3BlY2lhbHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzU3VwZXJzY3JpcHRzYW5kU3Vic2NyaXB0cyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNTdXBlcnNjcmlwdHNhbmRTdWJzY3JpcHRzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzU3VwZXJzY3JpcHRzYW5kU3Vic2NyaXB0cyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNTdXBwbGVtZW50YWxBcnJvd3NBKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1N1cHBsZW1lbnRhbEFycm93c0EoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNTdXBwbGVtZW50YWxBcnJvd3NBIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1N1cHBsZW1lbnRhbEFycm93c0Iodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzU3VwcGxlbWVudGFsQXJyb3dzQihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc1N1cHBsZW1lbnRhbEFycm93c0IiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzU3VwcGxlbWVudGFsTWF0aGVtYXRpY2FsT3BlcmF0b3JzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1N1cHBsZW1lbnRhbE1hdGhlbWF0aWNhbE9wZXJhdG9ycyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc1N1cHBsZW1lbnRhbE1hdGhlbWF0aWNhbE9wZXJhdG9ycyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNTdXBwbGVtZW50YXJ5UHJpdmF0ZVVzZUFyZWFBKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1N1cHBsZW1lbnRhcnlQcml2YXRlVXNlQXJlYUEoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNTdXBwbGVtZW50YXJ5UHJpdmF0ZVVzZUFyZWFBIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1N1cHBsZW1lbnRhcnlQcml2YXRlVXNlQXJlYUIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzU3VwcGxlbWVudGFyeVByaXZhdGVVc2VBcmVhQihjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc1N1cHBsZW1lbnRhcnlQcml2YXRlVXNlQXJlYUIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzU3lyaWFjKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1N5cmlhYyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc1N5cmlhYyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNUYWdhbG9nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1RhZ2Fsb2coY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNUYWdhbG9nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1RhZ2JhbndhKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1RhZ2JhbndhKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzVGFnYmFud2EiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzVGFncyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNUYWdzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzVGFncyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNUYWlMZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNUYWlMZShjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc1RhaUxlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1RhaVh1YW5KaW5nU3ltYm9scyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNUYWlYdWFuSmluZ1N5bWJvbHMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNUYWlYdWFuSmluZ1N5bWJvbHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzVGFtaWwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzVGFtaWwoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNUYW1pbCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNUZWx1Z3Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzVGVsdWd1KGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzVGVsdWd1IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1RoYWFuYSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNUaGFhbmEoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNUaGFhbmEiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzVGhhaSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNUaGFpKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzVGhhaSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNUaWJldGFuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1RpYmV0YW4oY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNUaWJldGFuIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1VnYXJpdGljKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfVU5JQ09ERV9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgIGludCBuX2NvZGU7CgogICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGNvZGUgPSBnZW5faW50KG5fY29kZSwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxVQ1NJc1VnYXJpdGljKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzVWdhcml0aWMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzVW5pZmllZENhbmFkaWFuQWJvcmlnaW5hbFN5bGxhYmljcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNVbmlmaWVkQ2FuYWRpYW5BYm9yaWdpbmFsU3lsbGFiaWNzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzVW5pZmllZENhbmFkaWFuQWJvcmlnaW5hbFN5bGxhYmljcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNWYXJpYXRpb25TZWxlY3RvcnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzVmFyaWF0aW9uU2VsZWN0b3JzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzVmFyaWF0aW9uU2VsZWN0b3JzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1ZhcmlhdGlvblNlbGVjdG9yc1N1cHBsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9VTklDT0RFX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGludCBjb2RlOyAvKiBVQ1MgY29kZSBwb2ludCAqLwogICAgaW50IG5fY29kZTsKCiAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29kZSA9IGdlbl9pbnQobl9jb2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFVDU0lzVmFyaWF0aW9uU2VsZWN0b3JzU3VwcGxlbWVudChjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc1ZhcmlhdGlvblNlbGVjdG9yc1N1cHBsZW1lbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFVDU0lzWWlSYWRpY2Fscyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNZaVJhZGljYWxzKGNvZGUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl9jb2RlLCBjb2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFVDU0lzWWlSYWRpY2FscyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVUNTSXNZaVN5bGxhYmxlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNZaVN5bGxhYmxlcyhjb2RlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fY29kZSwgY29kZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxVQ1NJc1lpU3lsbGFibGVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxVQ1NJc1lpamluZ0hleGFncmFtU3ltYm9scyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1VOSUNPREVfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICBpbnQgbl9jb2RlOwoKICAgIGZvciAobl9jb2RlID0gMDtuX2NvZGUgPCBnZW5fbmJfaW50O25fY29kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjb2RlID0gZ2VuX2ludChuX2NvZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVUNTSXNZaWppbmdIZXhhZ3JhbVN5bWJvbHMoY29kZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX2NvZGUsIGNvZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVUNTSXNZaWppbmdIZXhhZ3JhbVN5bWJvbHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sdW5pY29kZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgeG1sdW5pY29kZSA6IDE2NiBvZiAxNjYgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQWVnZWFuTnVtYmVycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0FscGhhYmV0aWNQcmVzZW50YXRpb25Gb3JtcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0FyYWJpYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0FyYWJpY1ByZXNlbnRhdGlvbkZvcm1zQSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0FyYWJpY1ByZXNlbnRhdGlvbkZvcm1zQigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0FybWVuaWFuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQXJyb3dzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQmFzaWNMYXRpbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0JlbmdhbGkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNCbG9jaygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0Jsb2NrRWxlbWVudHMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNCb3BvbW9mbygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0JvcG9tb2ZvRXh0ZW5kZWQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNCb3hEcmF3aW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQnJhaWxsZVBhdHRlcm5zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQnVoaWQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNCeXphbnRpbmVNdXNpY2FsU3ltYm9scygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NKS0NvbXBhdGliaWxpdHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDSktDb21wYXRpYmlsaXR5Rm9ybXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDSktDb21wYXRpYmlsaXR5SWRlb2dyYXBocygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NKS0NvbXBhdGliaWxpdHlJZGVvZ3JhcGhzU3VwcGxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NKS1JhZGljYWxzU3VwcGxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NKS1N5bWJvbHNhbmRQdW5jdHVhdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NKS1VuaWZpZWRJZGVvZ3JhcGhzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ0pLVW5pZmllZElkZW9ncmFwaHNFeHRlbnNpb25BKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ0pLVW5pZmllZElkZW9ncmFwaHNFeHRlbnNpb25CKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0QygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdENjKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0Q2YoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRDbygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdENzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0TCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdExsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0TG0oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRMbygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdEx0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0THUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRNKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0TWMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRNZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdE1uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0TigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdE5kKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0TmwoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRObygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdFAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRQYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdFBkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0UGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRQZigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdFBpKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0UG8oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRQcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdFMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRTYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdFNrKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0U20oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRTbygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdFooKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDYXRabCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NhdFpwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzQ2F0WnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDaGVyb2tlZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NvbWJpbmluZ0RpYWNyaXRpY2FsTWFya3MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDb21iaW5pbmdEaWFjcml0aWNhbE1hcmtzZm9yU3ltYm9scygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NvbWJpbmluZ0hhbGZNYXJrcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NvbWJpbmluZ01hcmtzZm9yU3ltYm9scygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0NvbnRyb2xQaWN0dXJlcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0N1cnJlbmN5U3ltYm9scygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0N5cHJpb3RTeWxsYWJhcnkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNDeXJpbGxpYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0N5cmlsbGljU3VwcGxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0Rlc2VyZXQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNEZXZhbmFnYXJpKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzRGluZ2JhdHMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNFbmNsb3NlZEFscGhhbnVtZXJpY3MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNFbmNsb3NlZENKS0xldHRlcnNhbmRNb250aHMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNFdGhpb3BpYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0dlbmVyYWxQdW5jdHVhdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0dlb21ldHJpY1NoYXBlcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0dlb3JnaWFuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzR290aGljKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzR3JlZWsoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNHcmVla0V4dGVuZGVkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzR3JlZWthbmRDb3B0aWMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNHdWphcmF0aSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0d1cm11a2hpKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzSGFsZndpZHRoYW5kRnVsbHdpZHRoRm9ybXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNIYW5ndWxDb21wYXRpYmlsaXR5SmFtbygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0hhbmd1bEphbW8oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNIYW5ndWxTeWxsYWJsZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNIYW51bm9vKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzSGVicmV3KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzSGlnaFByaXZhdGVVc2VTdXJyb2dhdGVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzSGlnaFN1cnJvZ2F0ZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNIaXJhZ2FuYSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0lQQUV4dGVuc2lvbnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNJZGVvZ3JhcGhpY0Rlc2NyaXB0aW9uQ2hhcmFjdGVycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0thbmJ1bigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0thbmd4aVJhZGljYWxzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzS2FubmFkYSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0thdGFrYW5hKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzS2F0YWthbmFQaG9uZXRpY0V4dGVuc2lvbnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNLaG1lcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0tobWVyU3ltYm9scygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0xhbygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0xhdGluMVN1cHBsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNMYXRpbkV4dGVuZGVkQSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0xhdGluRXh0ZW5kZWRBZGRpdGlvbmFsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzTGF0aW5FeHRlbmRlZEIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNMZXR0ZXJsaWtlU3ltYm9scygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0xpbWJ1KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzTGluZWFyQklkZW9ncmFtcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc0xpbmVhckJTeWxsYWJhcnkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNMb3dTdXJyb2dhdGVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzTWFsYXlhbGFtKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzTWF0aGVtYXRpY2FsQWxwaGFudW1lcmljU3ltYm9scygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc01hdGhlbWF0aWNhbE9wZXJhdG9ycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc01pc2NlbGxhbmVvdXNNYXRoZW1hdGljYWxTeW1ib2xzQSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc01pc2NlbGxhbmVvdXNNYXRoZW1hdGljYWxTeW1ib2xzQigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc01pc2NlbGxhbmVvdXNTeW1ib2xzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzTWlzY2VsbGFuZW91c1N5bWJvbHNhbmRBcnJvd3MoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNNaXNjZWxsYW5lb3VzVGVjaG5pY2FsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzTW9uZ29saWFuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzTXVzaWNhbFN5bWJvbHMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNNeWFubWFyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzTnVtYmVyRm9ybXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNPZ2hhbSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc09sZEl0YWxpYygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc09wdGljYWxDaGFyYWN0ZXJSZWNvZ25pdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc09yaXlhKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzT3NtYW55YSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1Bob25ldGljRXh0ZW5zaW9ucygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1ByaXZhdGVVc2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNQcml2YXRlVXNlQXJlYSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1J1bmljKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzU2hhdmlhbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1NpbmhhbGEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNTbWFsbEZvcm1WYXJpYW50cygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1NwYWNpbmdNb2RpZmllckxldHRlcnMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNTcGVjaWFscygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1N1cGVyc2NyaXB0c2FuZFN1YnNjcmlwdHMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNTdXBwbGVtZW50YWxBcnJvd3NBKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzU3VwcGxlbWVudGFsQXJyb3dzQigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1N1cHBsZW1lbnRhbE1hdGhlbWF0aWNhbE9wZXJhdG9ycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1N1cHBsZW1lbnRhcnlQcml2YXRlVXNlQXJlYUEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNTdXBwbGVtZW50YXJ5UHJpdmF0ZVVzZUFyZWFCKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzU3lyaWFjKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzVGFnYWxvZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1RhZ2JhbndhKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzVGFncygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1RhaUxlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzVGFpWHVhbkppbmdTeW1ib2xzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzVGFtaWwoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNUZWx1Z3UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNUaGFhbmEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNUaGFpKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzVGliZXRhbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1VnYXJpdGljKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzVW5pZmllZENhbmFkaWFuQWJvcmlnaW5hbFN5bGxhYmljcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1ZhcmlhdGlvblNlbGVjdG9ycygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxVQ1NJc1ZhcmlhdGlvblNlbGVjdG9yc1N1cHBsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNZaVJhZGljYWxzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFVDU0lzWWlTeWxsYWJsZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVUNTSXNZaWppbmdIZXhhZ3JhbVN5bWJvbHMoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIHhtbHVuaWNvZGU6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbE5ld1RleHRXcml0ZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFRleHRXcml0ZXJQdHIgcmV0X3ZhbDsKICAgIHhtbE91dHB1dEJ1ZmZlclB0ciBvdXQ7IC8qIGFuIHhtbE91dHB1dEJ1ZmZlclB0ciAqLwogICAgaW50IG5fb3V0OwoKICAgIGZvciAobl9vdXQgPSAwO25fb3V0IDwgZ2VuX25iX3htbE91dHB1dEJ1ZmZlclB0cjtuX291dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXQgPSBnZW5feG1sT3V0cHV0QnVmZmVyUHRyKG5fb3V0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbE5ld1RleHRXcml0ZXIob3V0KTsKICAgICAgICBpZiAocmV0X3ZhbCAhPSBOVUxMKSBvdXQgPSBOVUxMOwogICAgICAgIGRlc3JldF94bWxUZXh0V3JpdGVyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sT3V0cHV0QnVmZmVyUHRyKG5fb3V0LCBvdXQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3VGV4dFdyaXRlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdUZXh0V3JpdGVyRmlsZW5hbWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFRleHRXcml0ZXJQdHIgcmV0X3ZhbDsKICAgIGNvbnN0IGNoYXIgKiB1cmk7IC8qIHRoZSBVUkkgb2YgdGhlIHJlc291cmNlIGZvciB0aGUgb3V0cHV0ICovCiAgICBpbnQgbl91cmk7CiAgICBpbnQgY29tcHJlc3Npb247IC8qIGNvbXByZXNzIHRoZSBvdXRwdXQ/ICovCiAgICBpbnQgbl9jb21wcmVzc2lvbjsKCiAgICBmb3IgKG5fdXJpID0gMDtuX3VyaSA8IGdlbl9uYl9maWxlb3V0cHV0O25fdXJpKyspIHsKICAgIGZvciAobl9jb21wcmVzc2lvbiA9IDA7bl9jb21wcmVzc2lvbiA8IGdlbl9uYl9pbnQ7bl9jb21wcmVzc2lvbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB1cmkgPSBnZW5fZmlsZW91dHB1dChuX3VyaSwgMCk7CiAgICAgICAgY29tcHJlc3Npb24gPSBnZW5faW50KG5fY29tcHJlc3Npb24sIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3VGV4dFdyaXRlckZpbGVuYW1lKHVyaSwgY29tcHJlc3Npb24pOwogICAgICAgIGRlc3JldF94bWxUZXh0V3JpdGVyUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZmlsZW91dHB1dChuX3VyaSwgdXJpLCAwKTsKICAgICAgICBkZXNfaW50KG5fY29tcHJlc3Npb24sIGNvbXByZXNzaW9uLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld1RleHRXcml0ZXJGaWxlbmFtZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91cmkpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29tcHJlc3Npb24pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdUZXh0V3JpdGVyTWVtb3J5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHJldF92YWw7CiAgICB4bWxCdWZmZXJQdHIgYnVmOyAvKiB4bWxCdWZmZXJQdHIgKi8KICAgIGludCBuX2J1ZjsKICAgIGludCBjb21wcmVzc2lvbjsgLyogY29tcHJlc3MgdGhlIG91dHB1dD8gKi8KICAgIGludCBuX2NvbXByZXNzaW9uOwoKICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CiAgICBmb3IgKG5fY29tcHJlc3Npb24gPSAwO25fY29tcHJlc3Npb24gPCBnZW5fbmJfaW50O25fY29tcHJlc3Npb24rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CiAgICAgICAgY29tcHJlc3Npb24gPSBnZW5faW50KG5fY29tcHJlc3Npb24sIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sTmV3VGV4dFdyaXRlck1lbW9yeShidWYsIGNvbXByZXNzaW9uKTsKICAgICAgICBkZXNyZXRfeG1sVGV4dFdyaXRlclB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKICAgICAgICBkZXNfaW50KG5fY29tcHJlc3Npb24sIGNvbXByZXNzaW9uLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld1RleHRXcml0ZXJNZW1vcnkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbXByZXNzaW9uKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sTmV3VGV4dFdyaXRlclB1c2hQYXJzZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFRleHRXcml0ZXJQdHIgcmV0X3ZhbDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogeG1sUGFyc2VyQ3R4dFB0ciB0byBob2xkIHRoZSBuZXcgWE1MIGRvY3VtZW50IHRyZWUgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgY29tcHJlc3Npb247IC8qIGNvbXByZXNzIHRoZSBvdXRwdXQ/ICovCiAgICBpbnQgbl9jb21wcmVzc2lvbjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9jb21wcmVzc2lvbiA9IDA7bl9jb21wcmVzc2lvbiA8IGdlbl9uYl9pbnQ7bl9jb21wcmVzc2lvbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBjb21wcmVzc2lvbiA9IGdlbl9pbnQobl9jb21wcmVzc2lvbiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdUZXh0V3JpdGVyUHVzaFBhcnNlcihjdHh0LCBjb21wcmVzc2lvbik7CiAgICAgICAgaWYgKGN0eHQgIT0gTlVMTCkge3htbEZyZWVEb2MoY3R4dC0+bXlEb2MpOyBjdHh0LT5teURvYyA9IE5VTEw7fSBpZiAocmV0X3ZhbCAhPSBOVUxMKSBjdHh0ID0gTlVMTDsKICAgICAgICBkZXNyZXRfeG1sVGV4dFdyaXRlclB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fY29tcHJlc3Npb24sIGNvbXByZXNzaW9uLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbE5ld1RleHRXcml0ZXJQdXNoUGFyc2VyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29tcHJlc3Npb24pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxOZXdUZXh0V3JpdGVyVHJlZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sVGV4dFdyaXRlclB0ciByZXRfdmFsOwogICAgeG1sRG9jUHRyIGRvYzsgLyogeG1sRG9jUHRyICovCiAgICBpbnQgbl9kb2M7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHhtbE5vZGVQdHIgb3IgTlVMTCBmb3IgZG9jLT5jaGlsZHJlbiAqLwogICAgaW50IG5fbm9kZTsKICAgIGludCBjb21wcmVzc2lvbjsgLyogY29tcHJlc3MgdGhlIG91dHB1dD8gKi8KICAgIGludCBuX2NvbXByZXNzaW9uOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9jb21wcmVzc2lvbiA9IDA7bl9jb21wcmVzc2lvbiA8IGdlbl9uYl9pbnQ7bl9jb21wcmVzc2lvbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAxKTsKICAgICAgICBjb21wcmVzc2lvbiA9IGdlbl9pbnQobl9jb21wcmVzc2lvbiwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxOZXdUZXh0V3JpdGVyVHJlZShkb2MsIG5vZGUsIGNvbXByZXNzaW9uKTsKICAgICAgICBkZXNyZXRfeG1sVGV4dFdyaXRlclB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDEpOwogICAgICAgIGRlc19pbnQobl9jb21wcmVzc2lvbiwgY29tcHJlc3Npb24sIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTmV3VGV4dFdyaXRlclRyZWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29tcHJlc3Npb24pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRW5kQXR0cmlidXRlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwoKICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlckVuZEF0dHJpYnV0ZSh3cml0ZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlckVuZEF0dHJpYnV0ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRW5kQ0RBVEEodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyRW5kQ0RBVEEod3JpdGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJFbmRDREFUQSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRW5kQ29tbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJFbmRDb21tZW50KHdyaXRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyRW5kQ29tbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRW5kRFREKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwoKICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlckVuZERURCh3cml0ZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlckVuZERURCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRW5kRFREQXR0bGlzdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJFbmREVERBdHRsaXN0KHdyaXRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyRW5kRFREQXR0bGlzdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRW5kRFRERWxlbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJFbmREVERFbGVtZW50KHdyaXRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyRW5kRFRERWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRW5kRFRERW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwoKICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlckVuZERUREVudGl0eSh3cml0ZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlckVuZERUREVudGl0eSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRW5kRG9jdW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyRW5kRG9jdW1lbnQod3JpdGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJFbmREb2N1bWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRW5kRWxlbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJFbmRFbGVtZW50KHdyaXRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyRW5kRWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRW5kUEkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyRW5kUEkod3JpdGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJFbmRQSSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRmx1c2godm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyRmx1c2god3JpdGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJGbHVzaCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyRnVsbEVuZEVsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyRnVsbEVuZEVsZW1lbnQod3JpdGVyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJGdWxsRW5kRWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyU2V0SW5kZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwogICAgaW50IGluZGVudDsgLyogZG8gaW5kZW50YXRpb24/ICovCiAgICBpbnQgbl9pbmRlbnQ7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5faW5kZW50ID0gMDtuX2luZGVudCA8IGdlbl9uYl9pbnQ7bl9pbmRlbnQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwogICAgICAgIGluZGVudCA9IGdlbl9pbnQobl9pbmRlbnQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlclNldEluZGVudCh3cml0ZXIsIGluZGVudCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgZGVzX2ludChuX2luZGVudCwgaW5kZW50LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJTZXRJbmRlbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2luZGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJTZXRJbmRlbnRTdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgeG1sQ2hhciBzdHJpbmcgKi8KICAgIGludCBuX3N0cjsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9zdHIgPSAwO25fc3RyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBzdHIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlclNldEluZGVudFN0cmluZyh3cml0ZXIsIChjb25zdCB4bWxDaGFyICopc3RyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIChjb25zdCB4bWxDaGFyICopc3RyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJTZXRJbmRlbnRTdHJpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJTdGFydEF0dHJpYnV0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiBlbGVtZW50IG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlclN0YXJ0QXR0cmlidXRlKHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlclN0YXJ0QXR0cmlidXRlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3dyaXRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlclN0YXJ0QXR0cmlidXRlTlModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogcHJlZml4OyAvKiBuYW1lc3BhY2UgcHJlZml4IG9yIE5VTEwgKi8KICAgIGludCBuX3ByZWZpeDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiBlbGVtZW50IGxvY2FsIG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogbmFtZXNwYWNlVVJJOyAvKiBuYW1lc3BhY2UgVVJJIG9yIE5VTEwgKi8KICAgIGludCBuX25hbWVzcGFjZVVSSTsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9wcmVmaXggPSAwO25fcHJlZml4IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHJlZml4KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9uYW1lc3BhY2VVUkkgPSAwO25fbmFtZXNwYWNlVVJJIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZXNwYWNlVVJJKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBwcmVmaXggPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKICAgICAgICBuYW1lc3BhY2VVUkkgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lc3BhY2VVUkksIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlclN0YXJ0QXR0cmlidXRlTlMod3JpdGVyLCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWVzcGFjZVVSSSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lc3BhY2VVUkksIChjb25zdCB4bWxDaGFyICopbmFtZXNwYWNlVVJJLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJTdGFydEF0dHJpYnV0ZU5TIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3dyaXRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wcmVmaXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lc3BhY2VVUkkpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyU3RhcnRDREFUQSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJTdGFydENEQVRBKHdyaXRlcik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyU3RhcnRDREFUQSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyU3RhcnRDb21tZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwoKICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlclN0YXJ0Q29tbWVudCh3cml0ZXIpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlclN0YXJ0Q29tbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyU3RhcnREVEQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIERURCAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBwdWJpZDsgLyogdGhlIHB1YmxpYyBpZGVudGlmaWVyLCB3aGljaCBpcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgc3lzdGVtIGlkZW50aWZpZXIgKi8KICAgIGludCBuX3B1YmlkOwogICAgeG1sQ2hhciAqIHN5c2lkOyAvKiB0aGUgc3lzdGVtIGlkZW50aWZpZXIsIHdoaWNoIGlzIHRoZSBVUkkgb2YgdGhlIERURCAqLwogICAgaW50IG5fc3lzaWQ7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fcHViaWQgPSAwO25fcHViaWQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wdWJpZCsrKSB7CiAgICBmb3IgKG5fc3lzaWQgPSAwO25fc3lzaWQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zeXNpZCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIHB1YmlkID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHViaWQsIDIpOwogICAgICAgIHN5c2lkID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3lzaWQsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlclN0YXJ0RFREKHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKXB1YmlkLCAoY29uc3QgeG1sQ2hhciAqKXN5c2lkKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3B1YmlkLCAoY29uc3QgeG1sQ2hhciAqKXB1YmlkLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNpZCwgKGNvbnN0IHhtbENoYXIgKilzeXNpZCwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyU3RhcnREVEQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHViaWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3lzaWQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyU3RhcnREVERBdHRsaXN0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBEVEQgQVRUTElTVCAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyU3RhcnREVERBdHRsaXN0KHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKiluYW1lKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlclN0YXJ0RFREQXR0bGlzdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJTdGFydERUREVsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIERURCBlbGVtZW50ICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJTdGFydERUREVsZW1lbnQod3JpdGVyLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyU3RhcnREVERFbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3dyaXRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlclN0YXJ0RFRERW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwogICAgaW50IHBlOyAvKiBUUlVFIGlmIHRoaXMgaXMgYSBwYXJhbWV0ZXIgZW50aXR5LCBGQUxTRSBpZiBub3QgKi8KICAgIGludCBuX3BlOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBEVEQgQVRUTElTVCAqLwogICAgaW50IG5fbmFtZTsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9wZSA9IDA7bl9wZSA8IGdlbl9uYl9pbnQ7bl9wZSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgcGUgPSBnZW5faW50KG5fcGUsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJTdGFydERUREVudGl0eSh3cml0ZXIsIHBlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19pbnQobl9wZSwgcGUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyU3RhcnREVERFbnRpdHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3BlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyU3RhcnREb2N1bWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKICAgIGNoYXIgKiB2ZXJzaW9uOyAvKiB0aGUgeG1sIHZlcnNpb24gKCIxLjAiKSBvciBOVUxMIGZvciBkZWZhdWx0ICgiMS4wIikgKi8KICAgIGludCBuX3ZlcnNpb247CiAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBlbmNvZGluZyBvciBOVUxMIGZvciBkZWZhdWx0ICovCiAgICBpbnQgbl9lbmNvZGluZzsKICAgIGNoYXIgKiBzdGFuZGFsb25lOyAvKiAieWVzIiBvciAibm8iIG9yIE5VTEwgZm9yIGRlZmF1bHQgKi8KICAgIGludCBuX3N0YW5kYWxvbmU7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fdmVyc2lvbiA9IDA7bl92ZXJzaW9uIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fdmVyc2lvbisrKSB7CiAgICBmb3IgKG5fZW5jb2RpbmcgPSAwO25fZW5jb2RpbmcgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9lbmNvZGluZysrKSB7CiAgICBmb3IgKG5fc3RhbmRhbG9uZSA9IDA7bl9zdGFuZGFsb25lIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fc3RhbmRhbG9uZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgdmVyc2lvbiA9IGdlbl9jb25zdF9jaGFyX3B0cihuX3ZlcnNpb24sIDEpOwogICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDIpOwogICAgICAgIHN0YW5kYWxvbmUgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9zdGFuZGFsb25lLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJTdGFydERvY3VtZW50KHdyaXRlciwgKGNvbnN0IGNoYXIgKil2ZXJzaW9uLCAoY29uc3QgY2hhciAqKWVuY29kaW5nLCAoY29uc3QgY2hhciAqKXN0YW5kYWxvbmUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX3ZlcnNpb24sIChjb25zdCBjaGFyICopdmVyc2lvbiwgMSk7CiAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIChjb25zdCBjaGFyICopZW5jb2RpbmcsIDIpOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX3N0YW5kYWxvbmUsIChjb25zdCBjaGFyICopc3RhbmRhbG9uZSwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyU3RhcnREb2N1bWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmVyc2lvbik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmNvZGluZyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdGFuZGFsb25lKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiBlbGVtZW50IG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudCh3cml0ZXIsIChjb25zdCB4bWxDaGFyICopbmFtZSk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJTdGFydEVsZW1lbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50TlModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogcHJlZml4OyAvKiBuYW1lc3BhY2UgcHJlZml4IG9yIE5VTEwgKi8KICAgIGludCBuX3ByZWZpeDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiBlbGVtZW50IGxvY2FsIG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogbmFtZXNwYWNlVVJJOyAvKiBuYW1lc3BhY2UgVVJJIG9yIE5VTEwgKi8KICAgIGludCBuX25hbWVzcGFjZVVSSTsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9wcmVmaXggPSAwO25fcHJlZml4IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHJlZml4KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9uYW1lc3BhY2VVUkkgPSAwO25fbmFtZXNwYWNlVVJJIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZXNwYWNlVVJJKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBwcmVmaXggPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKICAgICAgICBuYW1lc3BhY2VVUkkgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lc3BhY2VVUkksIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudE5TKHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lc3BhY2VVUkkpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZXNwYWNlVVJJLCAoY29uc3QgeG1sQ2hhciAqKW5hbWVzcGFjZVVSSSwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50TlMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZWZpeCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWVzcGFjZVVSSSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJTdGFydFBJKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwogICAgeG1sQ2hhciAqIHRhcmdldDsgLyogUEkgdGFyZ2V0ICovCiAgICBpbnQgbl90YXJnZXQ7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fdGFyZ2V0ID0gMDtuX3RhcmdldCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3RhcmdldCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgdGFyZ2V0ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdGFyZ2V0LCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJTdGFydFBJKHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKil0YXJnZXQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3RhcmdldCwgKGNvbnN0IHhtbENoYXIgKil0YXJnZXQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlclN0YXJ0UEkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3RhcmdldCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUF0dHJpYnV0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiBhdHRyaWJ1dGUgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiBhdHRyaWJ1dGUgY29udGVudCAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlcldyaXRlQXR0cmlidXRlKHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJXcml0ZUF0dHJpYnV0ZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlQXR0cmlidXRlTlModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogcHJlZml4OyAvKiBuYW1lc3BhY2UgcHJlZml4ICovCiAgICBpbnQgbl9wcmVmaXg7CiAgICB4bWxDaGFyICogbmFtZTsgLyogYXR0cmlidXRlIGxvY2FsIG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogbmFtZXNwYWNlVVJJOyAvKiBuYW1lc3BhY2UgVVJJICovCiAgICBpbnQgbl9uYW1lc3BhY2VVUkk7CiAgICB4bWxDaGFyICogY29udGVudDsgLyogYXR0cmlidXRlIGNvbnRlbnQgKi8KICAgIGludCBuX2NvbnRlbnQ7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fcHJlZml4ID0gMDtuX3ByZWZpeCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ByZWZpeCsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fbmFtZXNwYWNlVVJJID0gMDtuX25hbWVzcGFjZVVSSSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWVzcGFjZVVSSSsrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgcHJlZml4ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAxKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMik7CiAgICAgICAgbmFtZXNwYWNlVVJJID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZXNwYWNlVVJJLCAzKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgNCk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyV3JpdGVBdHRyaWJ1dGVOUyh3cml0ZXIsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZXNwYWNlVVJJLCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZXNwYWNlVVJJLCAoY29uc3QgeG1sQ2hhciAqKW5hbWVzcGFjZVVSSSwgMyk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCA0KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJXcml0ZUF0dHJpYnV0ZU5TIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3dyaXRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wcmVmaXgpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lc3BhY2VVUkkpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUJhc2U2NCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKICAgIGNoYXIgKiBkYXRhOyAvKiBiaW5hcnkgZGF0YSAqLwogICAgaW50IG5fZGF0YTsKICAgIGludCBzdGFydDsgLyogdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgZGF0YSBvZiB0aGUgZmlyc3QgYnl0ZSB0byBlbmNvZGUgKi8KICAgIGludCBuX3N0YXJ0OwogICAgaW50IGxlbjsgLyogdGhlIG51bWJlciBvZiBieXRlcyB0byBlbmNvZGUgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9kYXRhID0gMDtuX2RhdGEgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9kYXRhKyspIHsKICAgIGZvciAobl9zdGFydCA9IDA7bl9zdGFydCA8IGdlbl9uYl9pbnQ7bl9zdGFydCsrKSB7CiAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwogICAgICAgIGRhdGEgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9kYXRhLCAxKTsKICAgICAgICBzdGFydCA9IGdlbl9pbnQobl9zdGFydCwgMik7CiAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyV3JpdGVCYXNlNjQod3JpdGVyLCAoY29uc3QgY2hhciAqKWRhdGEsIHN0YXJ0LCBsZW4pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX2RhdGEsIChjb25zdCBjaGFyICopZGF0YSwgMSk7CiAgICAgICAgZGVzX2ludChuX3N0YXJ0LCBzdGFydCwgMik7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJXcml0ZUJhc2U2NCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGF0YSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdGFydCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVCaW5IZXgodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICBjaGFyICogZGF0YTsgLyogYmluYXJ5IGRhdGEgKi8KICAgIGludCBuX2RhdGE7CiAgICBpbnQgc3RhcnQ7IC8qIHRoZSBwb3NpdGlvbiB3aXRoaW4gdGhlIGRhdGEgb2YgdGhlIGZpcnN0IGJ5dGUgdG8gZW5jb2RlICovCiAgICBpbnQgbl9zdGFydDsKICAgIGludCBsZW47IC8qIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gZW5jb2RlICovCiAgICBpbnQgbl9sZW47CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fZGF0YSA9IDA7bl9kYXRhIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZGF0YSsrKSB7CiAgICBmb3IgKG5fc3RhcnQgPSAwO25fc3RhcnQgPCBnZW5fbmJfaW50O25fc3RhcnQrKykgewogICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBkYXRhID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZGF0YSwgMSk7CiAgICAgICAgc3RhcnQgPSBnZW5faW50KG5fc3RhcnQsIDIpOwogICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlcldyaXRlQmluSGV4KHdyaXRlciwgKGNvbnN0IGNoYXIgKilkYXRhLCBzdGFydCwgbGVuKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9kYXRhLCAoY29uc3QgY2hhciAqKWRhdGEsIDEpOwogICAgICAgIGRlc19pbnQobl9zdGFydCwgc3RhcnQsIDIpOwogICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyV3JpdGVCaW5IZXgiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RhdGEpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RhcnQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlQ0RBVEEodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogY29udGVudDsgLyogQ0RBVEEgY29udGVudCAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyV3JpdGVDREFUQSh3cml0ZXIsIChjb25zdCB4bWxDaGFyICopY29udGVudCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJXcml0ZUNEQVRBIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3dyaXRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlQ29tbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiBjb21tZW50IHN0cmluZyAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyV3JpdGVDb21tZW50KHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlcldyaXRlQ29tbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZURURCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgRFREICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIHB1YmlkOyAvKiB0aGUgcHVibGljIGlkZW50aWZpZXIsIHdoaWNoIGlzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBzeXN0ZW0gaWRlbnRpZmllciAqLwogICAgaW50IG5fcHViaWQ7CiAgICB4bWxDaGFyICogc3lzaWQ7IC8qIHRoZSBzeXN0ZW0gaWRlbnRpZmllciwgd2hpY2ggaXMgdGhlIFVSSSBvZiB0aGUgRFREICovCiAgICBpbnQgbl9zeXNpZDsKICAgIHhtbENoYXIgKiBzdWJzZXQ7IC8qIHN0cmluZyBjb250ZW50IG9mIHRoZSBEVEQgKi8KICAgIGludCBuX3N1YnNldDsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9wdWJpZCA9IDA7bl9wdWJpZCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3B1YmlkKyspIHsKICAgIGZvciAobl9zeXNpZCA9IDA7bl9zeXNpZCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N5c2lkKyspIHsKICAgIGZvciAobl9zdWJzZXQgPSAwO25fc3Vic2V0IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3Vic2V0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgcHViaWQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJpZCwgMik7CiAgICAgICAgc3lzaWQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNpZCwgMyk7CiAgICAgICAgc3Vic2V0ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3Vic2V0LCA0KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJXcml0ZURURCh3cml0ZXIsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKilwdWJpZCwgKGNvbnN0IHhtbENoYXIgKilzeXNpZCwgKGNvbnN0IHhtbENoYXIgKilzdWJzZXQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHViaWQsIChjb25zdCB4bWxDaGFyICopcHViaWQsIDIpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N5c2lkLCAoY29uc3QgeG1sQ2hhciAqKXN5c2lkLCAzKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdWJzZXQsIChjb25zdCB4bWxDaGFyICopc3Vic2V0LCA0KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJXcml0ZURURCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wdWJpZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zeXNpZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdWJzZXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVEVERBdHRsaXN0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBEVEQgQVRUTElTVCAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiBjb250ZW50IG9mIHRoZSBBVFRMSVNUICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2NvbnRlbnQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyV3JpdGVEVERBdHRsaXN0KHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJXcml0ZURUREF0dGxpc3QiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZURUREVsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIERURCBlbGVtZW50ICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgKi8KICAgIGludCBuX2NvbnRlbnQ7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwogICAgICAgIGNvbnRlbnQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJXcml0ZURUREVsZW1lbnQod3JpdGVyLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopY29udGVudCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlcldyaXRlRFRERWxlbWVudCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRFRERW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwogICAgaW50IHBlOyAvKiBUUlVFIGlmIHRoaXMgaXMgYSBwYXJhbWV0ZXIgZW50aXR5LCBGQUxTRSBpZiBub3QgKi8KICAgIGludCBuX3BlOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBEVEQgZW50aXR5ICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIHB1YmlkOyAvKiB0aGUgcHVibGljIGlkZW50aWZpZXIsIHdoaWNoIGlzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBzeXN0ZW0gaWRlbnRpZmllciAqLwogICAgaW50IG5fcHViaWQ7CiAgICB4bWxDaGFyICogc3lzaWQ7IC8qIHRoZSBzeXN0ZW0gaWRlbnRpZmllciwgd2hpY2ggaXMgdGhlIFVSSSBvZiB0aGUgRFREICovCiAgICBpbnQgbl9zeXNpZDsKICAgIHhtbENoYXIgKiBuZGF0YWlkOyAvKiB0aGUgeG1sIG5vdGF0aW9uIG5hbWUuICovCiAgICBpbnQgbl9uZGF0YWlkOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIGNvbnRlbnQgb2YgdGhlIGVudGl0eSAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9wZSA9IDA7bl9wZSA8IGdlbl9uYl9pbnQ7bl9wZSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fcHViaWQgPSAwO25fcHViaWQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wdWJpZCsrKSB7CiAgICBmb3IgKG5fc3lzaWQgPSAwO25fc3lzaWQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zeXNpZCsrKSB7CiAgICBmb3IgKG5fbmRhdGFpZCA9IDA7bl9uZGF0YWlkIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmRhdGFpZCsrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgcGUgPSBnZW5faW50KG5fcGUsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKICAgICAgICBwdWJpZCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3B1YmlkLCAzKTsKICAgICAgICBzeXNpZCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N5c2lkLCA0KTsKICAgICAgICBuZGF0YWlkID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmRhdGFpZCwgNSk7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDYpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlcldyaXRlRFRERW50aXR5KHdyaXRlciwgcGUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKilwdWJpZCwgKGNvbnN0IHhtbENoYXIgKilzeXNpZCwgKGNvbnN0IHhtbENoYXIgKiluZGF0YWlkLCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19pbnQobl9wZSwgcGUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHViaWQsIChjb25zdCB4bWxDaGFyICopcHViaWQsIDMpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N5c2lkLCAoY29uc3QgeG1sQ2hhciAqKXN5c2lkLCA0KTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uZGF0YWlkLCAoY29uc3QgeG1sQ2hhciAqKW5kYXRhaWQsIDUpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIChjb25zdCB4bWxDaGFyICopY29udGVudCwgNik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyV3JpdGVEVERFbnRpdHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3BlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHViaWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3lzaWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmRhdGFpZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRFRERXh0ZXJuYWxFbnRpdHkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICBpbnQgcGU7IC8qIFRSVUUgaWYgdGhpcyBpcyBhIHBhcmFtZXRlciBlbnRpdHksIEZBTFNFIGlmIG5vdCAqLwogICAgaW50IG5fcGU7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIERURCBlbnRpdHkgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogcHViaWQ7IC8qIHRoZSBwdWJsaWMgaWRlbnRpZmllciwgd2hpY2ggaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIHN5c3RlbSBpZGVudGlmaWVyICovCiAgICBpbnQgbl9wdWJpZDsKICAgIHhtbENoYXIgKiBzeXNpZDsgLyogdGhlIHN5c3RlbSBpZGVudGlmaWVyLCB3aGljaCBpcyB0aGUgVVJJIG9mIHRoZSBEVEQgKi8KICAgIGludCBuX3N5c2lkOwogICAgeG1sQ2hhciAqIG5kYXRhaWQ7IC8qIHRoZSB4bWwgbm90YXRpb24gbmFtZS4gKi8KICAgIGludCBuX25kYXRhaWQ7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fcGUgPSAwO25fcGUgPCBnZW5fbmJfaW50O25fcGUrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX3B1YmlkID0gMDtuX3B1YmlkIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHViaWQrKykgewogICAgZm9yIChuX3N5c2lkID0gMDtuX3N5c2lkIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3lzaWQrKykgewogICAgZm9yIChuX25kYXRhaWQgPSAwO25fbmRhdGFpZCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25kYXRhaWQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwogICAgICAgIHBlID0gZ2VuX2ludChuX3BlLCAxKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMik7CiAgICAgICAgcHViaWQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJpZCwgMyk7CiAgICAgICAgc3lzaWQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNpZCwgNCk7CiAgICAgICAgbmRhdGFpZCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25kYXRhaWQsIDUpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlcldyaXRlRFRERXh0ZXJuYWxFbnRpdHkod3JpdGVyLCBwZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKXB1YmlkLCAoY29uc3QgeG1sQ2hhciAqKXN5c2lkLCAoY29uc3QgeG1sQ2hhciAqKW5kYXRhaWQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19pbnQobl9wZSwgcGUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHViaWQsIChjb25zdCB4bWxDaGFyICopcHViaWQsIDMpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N5c2lkLCAoY29uc3QgeG1sQ2hhciAqKXN5c2lkLCA0KTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uZGF0YWlkLCAoY29uc3QgeG1sQ2hhciAqKW5kYXRhaWQsIDUpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlcldyaXRlRFRERXh0ZXJuYWxFbnRpdHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3BlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHViaWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3lzaWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmRhdGFpZCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZURUREV4dGVybmFsRW50aXR5Q29udGVudHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogcHViaWQ7IC8qIHRoZSBwdWJsaWMgaWRlbnRpZmllciwgd2hpY2ggaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIHN5c3RlbSBpZGVudGlmaWVyICovCiAgICBpbnQgbl9wdWJpZDsKICAgIHhtbENoYXIgKiBzeXNpZDsgLyogdGhlIHN5c3RlbSBpZGVudGlmaWVyLCB3aGljaCBpcyB0aGUgVVJJIG9mIHRoZSBEVEQgKi8KICAgIGludCBuX3N5c2lkOwogICAgeG1sQ2hhciAqIG5kYXRhaWQ7IC8qIHRoZSB4bWwgbm90YXRpb24gbmFtZS4gKi8KICAgIGludCBuX25kYXRhaWQ7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fcHViaWQgPSAwO25fcHViaWQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wdWJpZCsrKSB7CiAgICBmb3IgKG5fc3lzaWQgPSAwO25fc3lzaWQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zeXNpZCsrKSB7CiAgICBmb3IgKG5fbmRhdGFpZCA9IDA7bl9uZGF0YWlkIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmRhdGFpZCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgcHViaWQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJpZCwgMSk7CiAgICAgICAgc3lzaWQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNpZCwgMik7CiAgICAgICAgbmRhdGFpZCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25kYXRhaWQsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlcldyaXRlRFRERXh0ZXJuYWxFbnRpdHlDb250ZW50cyh3cml0ZXIsIChjb25zdCB4bWxDaGFyICopcHViaWQsIChjb25zdCB4bWxDaGFyICopc3lzaWQsIChjb25zdCB4bWxDaGFyICopbmRhdGFpZCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHViaWQsIChjb25zdCB4bWxDaGFyICopcHViaWQsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N5c2lkLCAoY29uc3QgeG1sQ2hhciAqKXN5c2lkLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uZGF0YWlkLCAoY29uc3QgeG1sQ2hhciAqKW5kYXRhaWQsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlcldyaXRlRFRERXh0ZXJuYWxFbnRpdHlDb250ZW50cyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHViaWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3lzaWQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmRhdGFpZCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZURUREludGVybmFsRW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwogICAgaW50IHBlOyAvKiBUUlVFIGlmIHRoaXMgaXMgYSBwYXJhbWV0ZXIgZW50aXR5LCBGQUxTRSBpZiBub3QgKi8KICAgIGludCBuX3BlOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBEVEQgZW50aXR5ICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIGNvbnRlbnQgb2YgdGhlIGVudGl0eSAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9wZSA9IDA7bl9wZSA8IGdlbl9uYl9pbnQ7bl9wZSsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgcGUgPSBnZW5faW50KG5fcGUsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKICAgICAgICBjb250ZW50ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxUZXh0V3JpdGVyV3JpdGVEVERJbnRlcm5hbEVudGl0eSh3cml0ZXIsIHBlLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopY29udGVudCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgZGVzX2ludChuX3BlLCBwZSwgMSk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlcldyaXRlRFRESW50ZXJuYWxFbnRpdHkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3BlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZURURE5vdGF0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSB4bWwgbm90YXRpb24gKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxDaGFyICogcHViaWQ7IC8qIHRoZSBwdWJsaWMgaWRlbnRpZmllciwgd2hpY2ggaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIHN5c3RlbSBpZGVudGlmaWVyICovCiAgICBpbnQgbl9wdWJpZDsKICAgIHhtbENoYXIgKiBzeXNpZDsgLyogdGhlIHN5c3RlbSBpZGVudGlmaWVyLCB3aGljaCBpcyB0aGUgVVJJIG9mIHRoZSBEVEQgKi8KICAgIGludCBuX3N5c2lkOwoKICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX3B1YmlkID0gMDtuX3B1YmlkIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHViaWQrKykgewogICAgZm9yIChuX3N5c2lkID0gMDtuX3N5c2lkIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3lzaWQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBwdWJpZCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3B1YmlkLCAyKTsKICAgICAgICBzeXNpZCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N5c2lkLCAzKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJXcml0ZURURE5vdGF0aW9uKHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKXB1YmlkLCAoY29uc3QgeG1sQ2hhciAqKXN5c2lkKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3B1YmlkLCAoY29uc3QgeG1sQ2hhciAqKXB1YmlkLCAyKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNpZCwgKGNvbnN0IHhtbENoYXIgKilzeXNpZCwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyV3JpdGVEVEROb3RhdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wdWJpZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zeXNpZCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUVsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogbmFtZTsgLyogZWxlbWVudCBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIGVsZW1lbnQgY29udGVudCAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlcldyaXRlRWxlbWVudCh3cml0ZXIsIChjb25zdCB4bWxDaGFyICopbmFtZSwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIChjb25zdCB4bWxDaGFyICopY29udGVudCwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3dyaXRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYW1lKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVFbGVtZW50TlModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogcHJlZml4OyAvKiBuYW1lc3BhY2UgcHJlZml4ICovCiAgICBpbnQgbl9wcmVmaXg7CiAgICB4bWxDaGFyICogbmFtZTsgLyogZWxlbWVudCBsb2NhbCBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIG5hbWVzcGFjZVVSSTsgLyogbmFtZXNwYWNlIFVSSSAqLwogICAgaW50IG5fbmFtZXNwYWNlVVJJOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIGVsZW1lbnQgY29udGVudCAqLwogICAgaW50IG5fY29udGVudDsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9wcmVmaXggPSAwO25fcHJlZml4IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHJlZml4KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgIGZvciAobl9uYW1lc3BhY2VVUkkgPSAwO25fbmFtZXNwYWNlVVJJIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZXNwYWNlVVJJKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHdyaXRlciA9IGdlbl94bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCAwKTsKICAgICAgICBwcmVmaXggPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIDEpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAyKTsKICAgICAgICBuYW1lc3BhY2VVUkkgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lc3BhY2VVUkksIDMpOwogICAgICAgIGNvbnRlbnQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCA0KTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnROUyh3cml0ZXIsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZXNwYWNlVVJJLCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgKGNvbnN0IHhtbENoYXIgKilwcmVmaXgsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMik7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZXNwYWNlVVJJLCAoY29uc3QgeG1sQ2hhciAqKW5hbWVzcGFjZVVSSSwgMyk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCA0KTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJXcml0ZUVsZW1lbnROUyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHJlZml4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZXNwYWNlVVJJKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRlbnQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRBdHRyaWJ1dGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0QXR0cmlidXRlTlModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0Q0RBVEEodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0Q29tbWVudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXREVEQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RFREQXR0bGlzdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXREVERFbGVtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUZvcm1hdERUREludGVybmFsRW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUZvcm1hdEVsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RWxlbWVudE5TKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUZvcm1hdFBJKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUZvcm1hdFJhdyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRTdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlUEkodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogdGFyZ2V0OyAvKiBQSSB0YXJnZXQgKi8KICAgIGludCBuX3RhcmdldDsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiBQSSBjb250ZW50ICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewogICAgZm9yIChuX3RhcmdldCA9IDA7bl90YXJnZXQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl90YXJnZXQrKykgewogICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2NvbnRlbnQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwogICAgICAgIHRhcmdldCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3RhcmdldCwgMSk7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlcldyaXRlUEkod3JpdGVyLCAoY29uc3QgeG1sQ2hhciAqKXRhcmdldCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl90YXJnZXQsIChjb25zdCB4bWxDaGFyICopdGFyZ2V0LCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlcldyaXRlUEkiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fd3JpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3RhcmdldCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlUmF3KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfV1JJVEVSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgaW50IG5fd3JpdGVyOwogICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRleHQgc3RyaW5nICovCiAgICBpbnQgbl9jb250ZW50OwoKICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewogICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2NvbnRlbnQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgd3JpdGVyID0gZ2VuX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIDApOwogICAgICAgIGNvbnRlbnQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRXcml0ZXJXcml0ZVJhdyh3cml0ZXIsIChjb25zdCB4bWxDaGFyICopY29udGVudCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFRleHRXcml0ZXJQdHIobl93cml0ZXIsIHdyaXRlciwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fY29udGVudCwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJXcml0ZVJhdyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZVJhd0xlbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1dSSVRFUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgIGludCBuX3dyaXRlcjsKICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0ZXh0IHN0cmluZyAqLwogICAgaW50IG5fY29udGVudDsKICAgIGludCBsZW47IC8qIGxlbmd0aCBvZiB0aGUgdGV4dCBzdHJpbmcgKi8KICAgIGludCBuX2xlbjsKCiAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDEpOwogICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDIpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlcldyaXRlUmF3TGVuKHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50LCBsZW4pOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxUZXh0V3JpdGVyUHRyKG5fd3JpdGVyLCB3cml0ZXIsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIChjb25zdCB4bWxDaGFyICopY29udGVudCwgMSk7CiAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFRleHRXcml0ZXJXcml0ZVJhd0xlbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl93cml0ZXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVTdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9XUklURVJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICBpbnQgbl93cml0ZXI7CiAgICB4bWxDaGFyICogY29udGVudDsgLyogdGV4dCBzdHJpbmcgKi8KICAgIGludCBuX2NvbnRlbnQ7CgogICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CiAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY29udGVudCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB3cml0ZXIgPSBnZW5feG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgMCk7CiAgICAgICAgY29udGVudCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2NvbnRlbnQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sVGV4dFdyaXRlcldyaXRlU3RyaW5nKHdyaXRlciwgKGNvbnN0IHhtbENoYXIgKiljb250ZW50KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sVGV4dFdyaXRlclB0cihuX3dyaXRlciwgd3JpdGVyLCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9jb250ZW50LCAoY29uc3QgeG1sQ2hhciAqKWNvbnRlbnQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFdyaXRlcldyaXRlU3RyaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3dyaXRlcik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdEF0dHJpYnV0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVWRm9ybWF0QXR0cmlidXRlTlModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdENEQVRBKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZVZGb3JtYXRDb21tZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZVZGb3JtYXREVEQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdERUREF0dGxpc3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdERUREVsZW1lbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdERUREludGVybmFsRW50aXR5KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZVZGb3JtYXRFbGVtZW50KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZVZGb3JtYXRFbGVtZW50TlModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdFBJKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFRleHRXcml0ZXJXcml0ZVZGb3JtYXRSYXcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdFN0cmluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbHdyaXRlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKICAgIGlmIChxdWlldCA9PSAwKSBwcmludGYoIlRlc3RpbmcgeG1sd3JpdGVyIDogNTEgb2YgNzkgZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld1RleHRXcml0ZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3VGV4dFdyaXRlckZpbGVuYW1lKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbE5ld1RleHRXcml0ZXJNZW1vcnkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3VGV4dFdyaXRlclB1c2hQYXJzZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sTmV3VGV4dFdyaXRlclRyZWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlckVuZEF0dHJpYnV0ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyRW5kQ0RBVEEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlckVuZENvbW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlckVuZERURCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyRW5kRFREQXR0bGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyRW5kRFRERWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyRW5kRFRERW50aXR5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJFbmREb2N1bWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyRW5kRWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyRW5kUEkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlckZsdXNoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJGdWxsRW5kRWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyU2V0SW5kZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJTZXRJbmRlbnRTdHJpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlclN0YXJ0QXR0cmlidXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJTdGFydEF0dHJpYnV0ZU5TKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJTdGFydENEQVRBKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJTdGFydENvbW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlclN0YXJ0RFREKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJTdGFydERUREF0dGxpc3QoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlclN0YXJ0RFRERWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyU3RhcnREVERFbnRpdHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlclN0YXJ0RG9jdW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlclN0YXJ0RWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyU3RhcnRFbGVtZW50TlMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlclN0YXJ0UEkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlQXR0cmlidXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUF0dHJpYnV0ZU5TKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUJhc2U2NCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVCaW5IZXgoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlQ0RBVEEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlQ29tbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVEVEQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRFREQXR0bGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVEVERFbGVtZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZURUREVudGl0eSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVEVERFeHRlcm5hbEVudGl0eSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVEVERFeHRlcm5hbEVudGl0eUNvbnRlbnRzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZURUREludGVybmFsRW50aXR5KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZURURE5vdGF0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUVsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRWxlbWVudE5TKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUZvcm1hdEF0dHJpYnV0ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRBdHRyaWJ1dGVOUygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRDREFUQSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRDb21tZW50KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUZvcm1hdERURCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXREVERBdHRsaXN0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUZvcm1hdERUREVsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RFRESW50ZXJuYWxFbnRpdHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0RWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVGb3JtYXRFbGVtZW50TlMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0UEkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlRm9ybWF0UmF3KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZUZvcm1hdFN0cmluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVQSSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVSYXcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlUmF3TGVuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZVN0cmluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVWRm9ybWF0QXR0cmlidXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFRleHRXcml0ZXJXcml0ZVZGb3JtYXRBdHRyaWJ1dGVOUygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVWRm9ybWF0Q0RBVEEoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdENvbW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdERURCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVWRm9ybWF0RFREQXR0bGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVWRm9ybWF0RFRERWxlbWVudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVWRm9ybWF0RFRESW50ZXJuYWxFbnRpdHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdEVsZW1lbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdEVsZW1lbnROUygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVWRm9ybWF0UEkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sVGV4dFdyaXRlcldyaXRlVkZvcm1hdFJhdygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxUZXh0V3JpdGVyV3JpdGVWRm9ybWF0U3RyaW5nKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSB4bWx3cml0ZXI6ICVkIGVycm9yc1xuIiwgdGVzdF9yZXQpOwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoQ2FzdEJvb2xlYW5Ub051bWJlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBkb3VibGUgcmV0X3ZhbDsKICAgIGludCB2YWw7IC8qIGEgYm9vbGVhbiAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX2ludDtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwgPSBnZW5faW50KG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoQ2FzdEJvb2xlYW5Ub051bWJlcih2YWwpOwogICAgICAgIGRlc3JldF9kb3VibGUocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19pbnQobl92YWwsIHZhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aENhc3RCb29sZWFuVG9OdW1iZXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhDYXN0Qm9vbGVhblRvU3RyaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgaW50IHZhbDsgLyogYSBib29sZWFuICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfaW50O25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl9pbnQobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhDYXN0Qm9vbGVhblRvU3RyaW5nKHZhbCk7CiAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfaW50KG5fdmFsLCB2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhDYXN0Qm9vbGVhblRvU3RyaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoQ2FzdE5vZGVTZXRUb0Jvb2xlYW4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxOb2RlU2V0UHRyIG5zOyAvKiBhIG5vZGUtc2V0ICovCiAgICBpbnQgbl9uczsKCiAgICBmb3IgKG5fbnMgPSAwO25fbnMgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5zID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ucywgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENhc3ROb2RlU2V0VG9Cb29sZWFuKG5zKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25zLCBucywgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aENhc3ROb2RlU2V0VG9Cb29sZWFuIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhDYXN0Tm9kZVNldFRvTnVtYmVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGRvdWJsZSByZXRfdmFsOwogICAgeG1sTm9kZVNldFB0ciBuczsgLyogYSBub2RlLXNldCAqLwogICAgaW50IG5fbnM7CgogICAgZm9yIChuX25zID0gMDtuX25zIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ucysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBucyA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbnMsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhDYXN0Tm9kZVNldFRvTnVtYmVyKG5zKTsKICAgICAgICBkZXNyZXRfZG91YmxlKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25zLCBucywgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aENhc3ROb2RlU2V0VG9OdW1iZXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbnMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aENhc3ROb2RlU2V0VG9TdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxOb2RlU2V0UHRyIG5zOyAvKiBhIG5vZGUtc2V0ICovCiAgICBpbnQgbl9uczsKCiAgICBmb3IgKG5fbnMgPSAwO25fbnMgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5zID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ucywgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENhc3ROb2RlU2V0VG9TdHJpbmcobnMpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ucywgbnMsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhDYXN0Tm9kZVNldFRvU3RyaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhDYXN0Tm9kZVRvTnVtYmVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGRvdWJsZSByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiBhIG5vZGUgKi8KICAgIGludCBuX25vZGU7CgogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoQ2FzdE5vZGVUb051bWJlcihub2RlKTsKICAgICAgICBkZXNyZXRfZG91YmxlKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhDYXN0Tm9kZVRvTnVtYmVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aENhc3ROb2RlVG9TdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIGEgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKCiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhDYXN0Tm9kZVRvU3RyaW5nKG5vZGUpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoQ2FzdE5vZGVUb1N0cmluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhDYXN0TnVtYmVyVG9Cb29sZWFuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgZG91YmxlIHZhbDsgLyogYSBudW1iZXIgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl9kb3VibGU7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX2RvdWJsZShuX3ZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENhc3ROdW1iZXJUb0Jvb2xlYW4odmFsKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZG91YmxlKG5fdmFsLCB2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhDYXN0TnVtYmVyVG9Cb29sZWFuIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoQ2FzdE51bWJlclRvU3RyaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgZG91YmxlIHZhbDsgLyogYSBudW1iZXIgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl9kb3VibGU7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX2RvdWJsZShuX3ZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENhc3ROdW1iZXJUb1N0cmluZyh2YWwpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2RvdWJsZShuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoQ2FzdE51bWJlclRvU3RyaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoQ2FzdFN0cmluZ1RvQm9vbGVhbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiB2YWw7IC8qIGEgc3RyaW5nICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoQ2FzdFN0cmluZ1RvQm9vbGVhbigoY29uc3QgeG1sQ2hhciAqKXZhbCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsLCAoY29uc3QgeG1sQ2hhciAqKXZhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aENhc3RTdHJpbmdUb0Jvb2xlYW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhDYXN0U3RyaW5nVG9OdW1iZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgZG91YmxlIHJldF92YWw7CiAgICB4bWxDaGFyICogdmFsOyAvKiBhIHN0cmluZyAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENhc3RTdHJpbmdUb051bWJlcigoY29uc3QgeG1sQ2hhciAqKXZhbCk7CiAgICAgICAgZGVzcmV0X2RvdWJsZShyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsLCAoY29uc3QgeG1sQ2hhciAqKXZhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aENhc3RTdHJpbmdUb051bWJlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aENhc3RUb0Jvb2xlYW4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxYUGF0aE9iamVjdFB0ciB2YWw7IC8qIGFuIFhQYXRoIG9iamVjdCAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFhQYXRoT2JqZWN0UHRyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl94bWxYUGF0aE9iamVjdFB0cihuX3ZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENhc3RUb0Jvb2xlYW4odmFsKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhPYmplY3RQdHIobl92YWwsIHZhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aENhc3RUb0Jvb2xlYW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhDYXN0VG9OdW1iZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgZG91YmxlIHJldF92YWw7CiAgICB4bWxYUGF0aE9iamVjdFB0ciB2YWw7IC8qIGFuIFhQYXRoIG9iamVjdCAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFhQYXRoT2JqZWN0UHRyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl94bWxYUGF0aE9iamVjdFB0cihuX3ZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENhc3RUb051bWJlcih2YWwpOwogICAgICAgIGRlc3JldF9kb3VibGUocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aE9iamVjdFB0cihuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoQ2FzdFRvTnVtYmVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoQ2FzdFRvU3RyaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sWFBhdGhPYmplY3RQdHIgdmFsOyAvKiBhbiBYUGF0aCBvYmplY3QgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxYUGF0aE9iamVjdFB0cjtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwgPSBnZW5feG1sWFBhdGhPYmplY3RQdHIobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhDYXN0VG9TdHJpbmcodmFsKTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aE9iamVjdFB0cihuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoQ2FzdFRvU3RyaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoQ21wTm9kZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxOb2RlUHRyIG5vZGUxOyAvKiB0aGUgZmlyc3Qgbm9kZSAqLwogICAgaW50IG5fbm9kZTE7CiAgICB4bWxOb2RlUHRyIG5vZGUyOyAvKiB0aGUgc2Vjb25kIG5vZGUgKi8KICAgIGludCBuX25vZGUyOwoKICAgIGZvciAobl9ub2RlMSA9IDA7bl9ub2RlMSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZTErKykgewogICAgZm9yIChuX25vZGUyID0gMDtuX25vZGUyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlMisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlMSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZTEsIDApOwogICAgICAgIG5vZGUyID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlMiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENtcE5vZGVzKG5vZGUxLCBub2RlMik7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlMSwgbm9kZTEsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZTIsIG5vZGUyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoQ21wTm9kZXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZTEpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZTIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aENvbXBpbGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCiNpZmRlZiBMSUJYTUxfWFBBVEhfRU5BQkxFRAoKI2RlZmluZSBnZW5fbmJfeG1sWFBhdGhDb21wRXhwclB0ciAxCnN0YXRpYyB4bWxYUGF0aENvbXBFeHByUHRyIGdlbl94bWxYUGF0aENvbXBFeHByUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxYUGF0aENvbXBFeHByUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxYUGF0aENvbXBFeHByUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKI2lmZGVmIExJQlhNTF9YUEFUSF9FTkFCTEVECgojZGVmaW5lIGdlbl9uYl94bWxYUGF0aENvbnRleHRQdHIgMQpzdGF0aWMgeG1sWFBhdGhDb250ZXh0UHRyIGdlbl94bWxYUGF0aENvbnRleHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oTlVMTCk7Cn0Kc3RhdGljIHZvaWQgZGVzX3htbFhQYXRoQ29udGV4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sWFBhdGhDb250ZXh0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewp9CiNlbmRpZgoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aENvbXBpbGVkRXZhbCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sWFBhdGhDb21wRXhwclB0ciBjb21wOyAvKiB0aGUgY29tcGlsZWQgWFBhdGggZXhwcmVzc2lvbiAqLwogICAgaW50IG5fY29tcDsKICAgIHhtbFhQYXRoQ29udGV4dFB0ciBjdHg7IC8qIHRoZSBYUGF0aCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHg7CgogICAgZm9yIChuX2NvbXAgPSAwO25fY29tcCA8IGdlbl9uYl94bWxYUGF0aENvbXBFeHByUHRyO25fY29tcCsrKSB7CiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl94bWxYUGF0aENvbnRleHRQdHI7bl9jdHgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29tcCA9IGdlbl94bWxYUGF0aENvbXBFeHByUHRyKG5fY29tcCwgMCk7CiAgICAgICAgY3R4ID0gZ2VuX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENvbXBpbGVkRXZhbChjb21wLCBjdHgpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoQ29tcEV4cHJQdHIobl9jb21wLCBjb21wLCAwKTsKICAgICAgICBkZXNfeG1sWFBhdGhDb250ZXh0UHRyKG5fY3R4LCBjdHgsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhDb21waWxlZEV2YWwiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29tcCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aENvbXBpbGVkRXZhbFRvQm9vbGVhbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFhQYXRoQ29tcEV4cHJQdHIgY29tcDsgLyogdGhlIGNvbXBpbGVkIFhQYXRoIGV4cHJlc3Npb24gKi8KICAgIGludCBuX2NvbXA7CiAgICB4bWxYUGF0aENvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2NvbXAgPSAwO25fY29tcCA8IGdlbl9uYl94bWxYUGF0aENvbXBFeHByUHRyO25fY29tcCsrKSB7CiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY29tcCA9IGdlbl94bWxYUGF0aENvbXBFeHByUHRyKG5fY29tcCwgMCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoQ29tcGlsZWRFdmFsVG9Cb29sZWFuKGNvbXAsIGN0eHQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aENvbXBFeHByUHRyKG5fY29tcCwgY29tcCwgMCk7CiAgICAgICAgZGVzX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhDb21waWxlZEV2YWxUb0Jvb2xlYW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29tcCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhDb250ZXh0U2V0Q2FjaGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxYUGF0aENvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgYWN0aXZlOyAvKiBlbmFibGVzL2Rpc2FibGVzIChjcmVhdGVzL2ZyZWVzKSB0aGUgY2FjaGUgKi8KICAgIGludCBuX2FjdGl2ZTsKICAgIGludCB2YWx1ZTsgLyogYSB2YWx1ZSB3aXRoIHNlbWFudGljcyBkZXBlbmRhbnQgb24gQG9wdGlvbnMgKi8KICAgIGludCBuX3ZhbHVlOwogICAgaW50IG9wdGlvbnM7IC8qIG9wdGlvbnMgKGN1cnJlbnRseSBvbmx5IHRoZSB2YWx1ZSAwIGlzIHVzZWQpICovCiAgICBpbnQgbl9vcHRpb25zOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fYWN0aXZlID0gMDtuX2FjdGl2ZSA8IGdlbl9uYl9pbnQ7bl9hY3RpdmUrKykgewogICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2ludDtuX3ZhbHVlKyspIHsKICAgIGZvciAobl9vcHRpb25zID0gMDtuX29wdGlvbnMgPCBnZW5fbmJfaW50O25fb3B0aW9ucysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGFjdGl2ZSA9IGdlbl9pbnQobl9hY3RpdmUsIDEpOwogICAgICAgIHZhbHVlID0gZ2VuX2ludChuX3ZhbHVlLCAyKTsKICAgICAgICBvcHRpb25zID0gZ2VuX2ludChuX29wdGlvbnMsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhDb250ZXh0U2V0Q2FjaGUoY3R4dCwgYWN0aXZlLCB2YWx1ZSwgb3B0aW9ucyk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9hY3RpdmUsIGFjdGl2ZSwgMSk7CiAgICAgICAgZGVzX2ludChuX3ZhbHVlLCB2YWx1ZSwgMik7CiAgICAgICAgZGVzX2ludChuX29wdGlvbnMsIG9wdGlvbnMsIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhDb250ZXh0U2V0Q2FjaGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9hY3RpdmUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3B0aW9ucyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoQ29udmVydEJvb2xlYW4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhPYmplY3RQdHIgcmV0X3ZhbDsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHZhbDsgLyogYW4gWFBhdGggb2JqZWN0ICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfeG1sWFBhdGhPYmplY3RQdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX3htbFhQYXRoT2JqZWN0UHRyKG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoQ29udmVydEJvb2xlYW4odmFsKTsKICAgICAgICB2YWwgPSBOVUxMOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoT2JqZWN0UHRyKG5fdmFsLCB2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhDb252ZXJ0Qm9vbGVhbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aENvbnZlcnROdW1iZXIodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhPYmplY3RQdHIgcmV0X3ZhbDsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHZhbDsgLyogYW4gWFBhdGggb2JqZWN0ICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfeG1sWFBhdGhPYmplY3RQdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX3htbFhQYXRoT2JqZWN0UHRyKG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoQ29udmVydE51bWJlcih2YWwpOwogICAgICAgIHZhbCA9IE5VTEw7CiAgICAgICAgZGVzcmV0X3htbFhQYXRoT2JqZWN0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhPYmplY3RQdHIobl92YWwsIHZhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aENvbnZlcnROdW1iZXIiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhDb252ZXJ0U3RyaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICB4bWxYUGF0aE9iamVjdFB0ciB2YWw7IC8qIGFuIFhQYXRoIG9iamVjdCAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFhQYXRoT2JqZWN0UHRyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl94bWxYUGF0aE9iamVjdFB0cihuX3ZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENvbnZlcnRTdHJpbmcodmFsKTsKICAgICAgICB2YWwgPSBOVUxMOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoT2JqZWN0UHRyKG5fdmFsLCB2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhDb252ZXJ0U3RyaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoQ3R4dENvbXBpbGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhFdmFsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgWFBhdGggZXhwcmVzc2lvbiAqLwogICAgaW50IG5fc3RyOwogICAgeG1sWFBhdGhDb250ZXh0UHRyIGN0eDsgLyogdGhlIFhQYXRoIGNvbnRleHQgKi8KICAgIGludCBuX2N0eDsKCiAgICBmb3IgKG5fc3RyID0gMDtuX3N0ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cisrKSB7CiAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl94bWxYUGF0aENvbnRleHRQdHI7bl9jdHgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3RyID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAwKTsKICAgICAgICBjdHggPSBnZW5feG1sWFBhdGhDb250ZXh0UHRyKG5fY3R4LCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoRXZhbCgoY29uc3QgeG1sQ2hhciAqKXN0ciwgY3R4KTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgKGNvbnN0IHhtbENoYXIgKilzdHIsIDApOwogICAgICAgIGRlc194bWxYUGF0aENvbnRleHRQdHIobl9jdHgsIGN0eCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aEV2YWwiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoRXZhbEV4cHJlc3Npb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhPYmplY3RQdHIgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBzdHI7IC8qIHRoZSBYUGF0aCBleHByZXNzaW9uICovCiAgICBpbnQgbl9zdHI7CiAgICB4bWxYUGF0aENvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIrKykgewogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aENvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgMCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoRXZhbEV4cHJlc3Npb24oKGNvbnN0IHhtbENoYXIgKilzdHIsIGN0eHQpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fc3RyLCAoY29uc3QgeG1sQ2hhciAqKXN0ciwgMCk7CiAgICAgICAgZGVzX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhFdmFsRXhwcmVzc2lvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoRXZhbFByZWRpY2F0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFhQYXRoQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJlczsgLyogdGhlIFByZWRpY2F0ZSBFeHByZXNzaW9uIGV2YWx1YXRpb24gcmVzdWx0ICovCiAgICBpbnQgbl9yZXM7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aENvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9yZXMgPSAwO25fcmVzIDwgZ2VuX25iX3htbFhQYXRoT2JqZWN0UHRyO25fcmVzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgcmVzID0gZ2VuX3htbFhQYXRoT2JqZWN0UHRyKG5fcmVzLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoRXZhbFByZWRpY2F0ZShjdHh0LCByZXMpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sWFBhdGhPYmplY3RQdHIobl9yZXMsIHJlcywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aEV2YWxQcmVkaWNhdGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZXMpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aEluaXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CgogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CgogICAgICAgIHhtbFhQYXRoSW5pdCgpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoSW5pdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoSXNJbmYodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGRvdWJsZSB2YWw7IC8qIGEgZG91YmxlIHZhbHVlICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfZG91YmxlO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl9kb3VibGUobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhJc0luZih2YWwpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19kb3VibGUobl92YWwsIHZhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aElzSW5mIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoSXNOYU4odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKSB8fCBkZWZpbmVkKExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIGRvdWJsZSB2YWw7IC8qIGEgZG91YmxlIHZhbHVlICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfZG91YmxlO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl9kb3VibGUobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhJc05hTih2YWwpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19kb3VibGUobl92YWwsIHZhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aElzTmFOIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTmV3Q29udGV4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5vZGVTZXRDcmVhdGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVNldFB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciB2YWw7IC8qIGFuIGluaXRpYWwgeG1sTm9kZVB0ciwgb3IgTlVMTCAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbE5vZGVQdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX3htbE5vZGVQdHIobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOb2RlU2V0Q3JlYXRlKHZhbCk7CiAgICAgICAgZGVzcmV0X3htbE5vZGVTZXRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fdmFsLCB2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOb2RlU2V0Q3JlYXRlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoT2JqZWN0Q29weSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sWFBhdGhPYmplY3RQdHIgdmFsOyAvKiB0aGUgb3JpZ2luYWwgb2JqZWN0ICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfeG1sWFBhdGhPYmplY3RQdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX3htbFhQYXRoT2JqZWN0UHRyKG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoT2JqZWN0Q29weSh2YWwpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoT2JqZWN0UHRyKG5fdmFsLCB2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhPYmplY3RDb3B5IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoT3JkZXJEb2NFbGVtcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBsb25nIHJldF92YWw7CiAgICB4bWxEb2NQdHIgZG9jOyAvKiBhbiBpbnB1dCBkb2N1bWVudCAqLwogICAgaW50IG5fZG9jOwoKICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoT3JkZXJEb2NFbGVtcyhkb2MpOwogICAgICAgIGRlc3JldF9sb25nKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhPcmRlckRvY0VsZW1zIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeHBhdGgodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIHhwYXRoIDogMzAgb2YgMzggZnVuY3Rpb25zIC4uLlxuIik7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ2FzdEJvb2xlYW5Ub051bWJlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aENhc3RCb29sZWFuVG9TdHJpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhDYXN0Tm9kZVNldFRvQm9vbGVhbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aENhc3ROb2RlU2V0VG9OdW1iZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhDYXN0Tm9kZVNldFRvU3RyaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ2FzdE5vZGVUb051bWJlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aENhc3ROb2RlVG9TdHJpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhDYXN0TnVtYmVyVG9Cb29sZWFuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ2FzdE51bWJlclRvU3RyaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ2FzdFN0cmluZ1RvQm9vbGVhbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aENhc3RTdHJpbmdUb051bWJlcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aENhc3RUb0Jvb2xlYW4oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhDYXN0VG9OdW1iZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhDYXN0VG9TdHJpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhDbXBOb2RlcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aENvbXBpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhDb21waWxlZEV2YWwoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhDb21waWxlZEV2YWxUb0Jvb2xlYW4oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhDb250ZXh0U2V0Q2FjaGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhDb252ZXJ0Qm9vbGVhbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aENvbnZlcnROdW1iZXIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhDb252ZXJ0U3RyaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ3R4dENvbXBpbGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhFdmFsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoRXZhbEV4cHJlc3Npb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhFdmFsUHJlZGljYXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoSW5pdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aElzSW5mKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoSXNOYU4oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOZXdDb250ZXh0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTm9kZVNldENyZWF0ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE9iamVjdENvcHkoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhPcmRlckRvY0VsZW1zKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSB4cGF0aDogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CiNpZmRlZiBMSUJYTUxfWFBBVEhfRU5BQkxFRAoKI2RlZmluZSBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIDEKc3RhdGljIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKfQojZW5kaWYKCgpzdGF0aWMgaW50CnRlc3RfdmFsdWVQb3Aodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhPYmplY3RQdHIgcmV0X3ZhbDsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiBhbiBYUGF0aCBldmFsdWF0aW9uIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHJldF92YWwgPSB2YWx1ZVBvcChjdHh0KTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHZhbHVlUG9wIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF92YWx1ZVB1c2godm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogYW4gWFBhdGggZXZhbHVhdGlvbiBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sWFBhdGhPYmplY3RQdHIgdmFsdWU7IC8qIHRoZSBYUGF0aCBvYmplY3QgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfeG1sWFBhdGhPYmplY3RQdHI7bl92YWx1ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIHZhbHVlID0gZ2VuX3htbFhQYXRoT2JqZWN0UHRyKG5fdmFsdWUsIDEpOwoKICAgICAgICByZXRfdmFsID0gdmFsdWVQdXNoKGN0eHQsIHZhbHVlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbFhQYXRoT2JqZWN0UHRyKG5fdmFsdWUsIHZhbHVlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHZhbHVlUHVzaCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhBZGRWYWx1ZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgeG1sWFBhdGhBZGRWYWx1ZXMoY3R4dCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoQWRkVmFsdWVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aEJvb2xlYW5GdW5jdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IG5hcmdzOyAvKiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwogICAgaW50IG5fbmFyZ3M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYXJncyA9IDA7bl9uYXJncyA8IGdlbl9uYl9pbnQ7bl9uYXJncysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hcmdzID0gZ2VuX2ludChuX25hcmdzLCAxKTsKCiAgICAgICAgeG1sWFBhdGhCb29sZWFuRnVuY3Rpb24oY3R4dCwgbmFyZ3MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX25hcmdzLCBuYXJncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aEJvb2xlYW5GdW5jdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhDZWlsaW5nRnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoQ2VpbGluZ0Z1bmN0aW9uKGN0eHQsIG5hcmdzKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9uYXJncywgbmFyZ3MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhDZWlsaW5nRnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoQ29tcGFyZVZhbHVlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgaW5mOyAvKiBsZXNzIHRoYW4gKDEpIG9yIGdyZWF0ZXIgdGhhbiAoMCkgKi8KICAgIGludCBuX2luZjsKICAgIGludCBzdHJpY3Q7IC8qIGlzIHRoZSBjb21wYXJpc29uIHN0cmljdCAqLwogICAgaW50IG5fc3RyaWN0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5faW5mID0gMDtuX2luZiA8IGdlbl9uYl9pbnQ7bl9pbmYrKykgewogICAgZm9yIChuX3N0cmljdCA9IDA7bl9zdHJpY3QgPCBnZW5fbmJfaW50O25fc3RyaWN0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgaW5mID0gZ2VuX2ludChuX2luZiwgMSk7CiAgICAgICAgc3RyaWN0ID0gZ2VuX2ludChuX3N0cmljdCwgMik7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENvbXBhcmVWYWx1ZXMoY3R4dCwgaW5mLCBzdHJpY3QpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5faW5mLCBpbmYsIDEpOwogICAgICAgIGRlc19pbnQobl9zdHJpY3QsIHN0cmljdCwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aENvbXBhcmVWYWx1ZXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbmYpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyaWN0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhDb25jYXRGdW5jdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IG5hcmdzOyAvKiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwogICAgaW50IG5fbmFyZ3M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYXJncyA9IDA7bl9uYXJncyA8IGdlbl9uYl9pbnQ7bl9uYXJncysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hcmdzID0gZ2VuX2ludChuX25hcmdzLCAxKTsKCiAgICAgICAgeG1sWFBhdGhDb25jYXRGdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoQ29uY2F0RnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoQ29udGFpbnNGdW5jdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IG5hcmdzOyAvKiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwogICAgaW50IG5fbmFyZ3M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYXJncyA9IDA7bl9uYXJncyA8IGdlbl9uYl9pbnQ7bl9uYXJncysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hcmdzID0gZ2VuX2ludChuX25hcmdzLCAxKTsKCiAgICAgICAgeG1sWFBhdGhDb250YWluc0Z1bmN0aW9uKGN0eHQsIG5hcmdzKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9uYXJncywgbmFyZ3MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhDb250YWluc0Z1bmN0aW9uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFyZ3MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aENvdW50RnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoQ291bnRGdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoQ291bnRGdW5jdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhEZWJ1Z0R1bXBDb21wRXhwcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX0RFQlVHX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBGSUxFICogb3V0cHV0OyAvKiB0aGUgRklMRSAqIGZvciB0aGUgb3V0cHV0ICovCiAgICBpbnQgbl9vdXRwdXQ7CiAgICB4bWxYUGF0aENvbXBFeHByUHRyIGNvbXA7IC8qIHRoZSBwcmVjb21waWxlZCBYUGF0aCBleHByZXNzaW9uICovCiAgICBpbnQgbl9jb21wOwogICAgaW50IGRlcHRoOyAvKiB0aGUgaW5kZW50YXRpb24gbGV2ZWwuICovCiAgICBpbnQgbl9kZXB0aDsKCiAgICBmb3IgKG5fb3V0cHV0ID0gMDtuX291dHB1dCA8IGdlbl9uYl9GSUxFX3B0cjtuX291dHB1dCsrKSB7CiAgICBmb3IgKG5fY29tcCA9IDA7bl9jb21wIDwgZ2VuX25iX3htbFhQYXRoQ29tcEV4cHJQdHI7bl9jb21wKyspIHsKICAgIGZvciAobl9kZXB0aCA9IDA7bl9kZXB0aCA8IGdlbl9uYl9pbnQ7bl9kZXB0aCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvdXRwdXQgPSBnZW5fRklMRV9wdHIobl9vdXRwdXQsIDApOwogICAgICAgIGNvbXAgPSBnZW5feG1sWFBhdGhDb21wRXhwclB0cihuX2NvbXAsIDEpOwogICAgICAgIGRlcHRoID0gZ2VuX2ludChuX2RlcHRoLCAyKTsKCiAgICAgICAgeG1sWFBhdGhEZWJ1Z0R1bXBDb21wRXhwcihvdXRwdXQsIGNvbXAsIGRlcHRoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX0ZJTEVfcHRyKG5fb3V0cHV0LCBvdXRwdXQsIDApOwogICAgICAgIGRlc194bWxYUGF0aENvbXBFeHByUHRyKG5fY29tcCwgY29tcCwgMSk7CiAgICAgICAgZGVzX2ludChuX2RlcHRoLCBkZXB0aCwgMik7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aERlYnVnRHVtcENvbXBFeHByIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dHB1dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb21wKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RlcHRoKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhEZWJ1Z0R1bXBPYmplY3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9ERUJVR19FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgRklMRSAqIG91dHB1dDsgLyogdGhlIEZJTEUgKiB0byBkdW1wIHRoZSBvdXRwdXQgKi8KICAgIGludCBuX291dHB1dDsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIGN1cjsgLyogdGhlIG9iamVjdCB0byBpbnNwZWN0ICovCiAgICBpbnQgbl9jdXI7CiAgICBpbnQgZGVwdGg7IC8qIGluZGVudGF0aW9uIGxldmVsICovCiAgICBpbnQgbl9kZXB0aDsKCiAgICBmb3IgKG5fb3V0cHV0ID0gMDtuX291dHB1dCA8IGdlbl9uYl9GSUxFX3B0cjtuX291dHB1dCsrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxYUGF0aE9iamVjdFB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fZGVwdGggPSAwO25fZGVwdGggPCBnZW5fbmJfaW50O25fZGVwdGgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgb3V0cHV0ID0gZ2VuX0ZJTEVfcHRyKG5fb3V0cHV0LCAwKTsKICAgICAgICBjdXIgPSBnZW5feG1sWFBhdGhPYmplY3RQdHIobl9jdXIsIDEpOwogICAgICAgIGRlcHRoID0gZ2VuX2ludChuX2RlcHRoLCAyKTsKCiAgICAgICAgeG1sWFBhdGhEZWJ1Z0R1bXBPYmplY3Qob3V0cHV0LCBjdXIsIGRlcHRoKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX0ZJTEVfcHRyKG5fb3V0cHV0LCBvdXRwdXQsIDApOwogICAgICAgIGRlc194bWxYUGF0aE9iamVjdFB0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICBkZXNfaW50KG5fZGVwdGgsIGRlcHRoLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoRGVidWdEdW1wT2JqZWN0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dHB1dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGVwdGgpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aERpZmZlcmVuY2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVNldFB0ciByZXRfdmFsOwogICAgeG1sTm9kZVNldFB0ciBub2RlczE7IC8qIGEgbm9kZS1zZXQgKi8KICAgIGludCBuX25vZGVzMTsKICAgIHhtbE5vZGVTZXRQdHIgbm9kZXMyOyAvKiBhIG5vZGUtc2V0ICovCiAgICBpbnQgbl9ub2RlczI7CgogICAgZm9yIChuX25vZGVzMSA9IDA7bl9ub2RlczEgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzMSsrKSB7CiAgICBmb3IgKG5fbm9kZXMyID0gMDtuX25vZGVzMiA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbm9kZXMyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGVzMSA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMxLCAwKTsKICAgICAgICBub2RlczIgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzMiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aERpZmZlcmVuY2Uobm9kZXMxLCBub2RlczIpOwogICAgICAgIGRlc3JldF94bWxOb2RlU2V0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzMSwgbm9kZXMxLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzMiwgbm9kZXMyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoRGlmZmVyZW5jZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlczEpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZXMyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhEaXN0aW5jdCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlU2V0UHRyIHJldF92YWw7CiAgICB4bWxOb2RlU2V0UHRyIG5vZGVzOyAvKiBhIG5vZGUtc2V0ICovCiAgICBpbnQgbl9ub2RlczsKCiAgICBmb3IgKG5fbm9kZXMgPSAwO25fbm9kZXMgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGVzID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ub2RlcywgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aERpc3RpbmN0KG5vZGVzKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVNldFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2Rlcywgbm9kZXMsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhEaXN0aW5jdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2Rlcyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoRGlzdGluY3RTb3J0ZWQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVNldFB0ciByZXRfdmFsOwogICAgeG1sTm9kZVNldFB0ciBub2RlczsgLyogYSBub2RlLXNldCwgc29ydGVkIGJ5IGRvY3VtZW50IG9yZGVyICovCiAgICBpbnQgbl9ub2RlczsKCiAgICBmb3IgKG5fbm9kZXMgPSAwO25fbm9kZXMgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGVzID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ub2RlcywgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aERpc3RpbmN0U29ydGVkKG5vZGVzKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVNldFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2Rlcywgbm9kZXMsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhEaXN0aW5jdFNvcnRlZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2Rlcyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoRGl2VmFsdWVzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHhtbFhQYXRoRGl2VmFsdWVzKGN0eHQpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aERpdlZhbHVlcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhFcXVhbFZhbHVlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aEVxdWFsVmFsdWVzKGN0eHQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoRXF1YWxWYWx1ZXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoRXJyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiBhIFhQYXRoIHBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IGVycm9yOyAvKiB0aGUgZXJyb3IgY29kZSAqLwogICAgaW50IG5fZXJyb3I7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9lcnJvciA9IDA7bl9lcnJvciA8IGdlbl9uYl9pbnQ7bl9lcnJvcisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGVycm9yID0gZ2VuX2ludChuX2Vycm9yLCAxKTsKCiAgICAgICAgeG1sWFBhdGhFcnIoY3R4dCwgZXJyb3IpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX2Vycm9yLCBlcnJvciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aEVyciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2Vycm9yKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhFdmFsRXhwcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICB4bWxYUGF0aEV2YWxFeHByKGN0eHQpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aEV2YWxFeHByIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aEV2YWx1YXRlUHJlZGljYXRlUmVzdWx0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJlczsgLyogdGhlIFByZWRpY2F0ZSBFeHByZXNzaW9uIGV2YWx1YXRpb24gcmVzdWx0ICovCiAgICBpbnQgbl9yZXM7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9yZXMgPSAwO25fcmVzIDwgZ2VuX25iX3htbFhQYXRoT2JqZWN0UHRyO25fcmVzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgcmVzID0gZ2VuX3htbFhQYXRoT2JqZWN0UHRyKG5fcmVzLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoRXZhbHVhdGVQcmVkaWNhdGVSZXN1bHQoY3R4dCwgcmVzKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbFhQYXRoT2JqZWN0UHRyKG5fcmVzLCByZXMsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhFdmFsdWF0ZVByZWRpY2F0ZVJlc3VsdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3Jlcyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoRmFsc2VGdW5jdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IG5hcmdzOyAvKiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwogICAgaW50IG5fbmFyZ3M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYXJncyA9IDA7bl9uYXJncyA8IGdlbl9uYl9pbnQ7bl9uYXJncysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hcmdzID0gZ2VuX2ludChuX25hcmdzLCAxKTsKCiAgICAgICAgeG1sWFBhdGhGYWxzZUZ1bmN0aW9uKGN0eHQsIG5hcmdzKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9uYXJncywgbmFyZ3MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhGYWxzZUZ1bmN0aW9uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFyZ3MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aEZsb29yRnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoRmxvb3JGdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoRmxvb3JGdW5jdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhGdW5jdGlvbkxvb2t1cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aEZ1bmN0aW9uTG9va3VwTlModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhIYXNTYW1lTm9kZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxOb2RlU2V0UHRyIG5vZGVzMTsgLyogYSBub2RlLXNldCAqLwogICAgaW50IG5fbm9kZXMxOwogICAgeG1sTm9kZVNldFB0ciBub2RlczI7IC8qIGEgbm9kZS1zZXQgKi8KICAgIGludCBuX25vZGVzMjsKCiAgICBmb3IgKG5fbm9kZXMxID0gMDtuX25vZGVzMSA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbm9kZXMxKyspIHsKICAgIGZvciAobl9ub2RlczIgPSAwO25fbm9kZXMyIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlczIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZXMxID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ub2RlczEsIDApOwogICAgICAgIG5vZGVzMiA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoSGFzU2FtZU5vZGVzKG5vZGVzMSwgbm9kZXMyKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzMSwgbm9kZXMxLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzMiwgbm9kZXMyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoSGFzU2FtZU5vZGVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzMSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlczIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aElkRnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoSWRGdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoSWRGdW5jdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhJbnRlcnNlY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVNldFB0ciByZXRfdmFsOwogICAgeG1sTm9kZVNldFB0ciBub2RlczE7IC8qIGEgbm9kZS1zZXQgKi8KICAgIGludCBuX25vZGVzMTsKICAgIHhtbE5vZGVTZXRQdHIgbm9kZXMyOyAvKiBhIG5vZGUtc2V0ICovCiAgICBpbnQgbl9ub2RlczI7CgogICAgZm9yIChuX25vZGVzMSA9IDA7bl9ub2RlczEgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzMSsrKSB7CiAgICBmb3IgKG5fbm9kZXMyID0gMDtuX25vZGVzMiA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbm9kZXMyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGVzMSA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMxLCAwKTsKICAgICAgICBub2RlczIgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzMiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aEludGVyc2VjdGlvbihub2RlczEsIG5vZGVzMik7CiAgICAgICAgZGVzcmV0X3htbE5vZGVTZXRQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbm9kZXMxLCBub2RlczEsIDApOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbm9kZXMyLCBub2RlczIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhJbnRlcnNlY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZXMxKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzMik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoSXNOb2RlVHlwZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiBhIG5hbWUgc3RyaW5nICovCiAgICBpbnQgbl9uYW1lOwoKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoSXNOb2RlVHlwZSgoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aElzTm9kZVR5cGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTGFuZ0Z1bmN0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgbmFyZ3M7IC8qIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzICovCiAgICBpbnQgbl9uYXJnczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX25hcmdzID0gMDtuX25hcmdzIDwgZ2VuX25iX2ludDtuX25hcmdzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgbmFyZ3MgPSBnZW5faW50KG5fbmFyZ3MsIDEpOwoKICAgICAgICB4bWxYUGF0aExhbmdGdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTGFuZ0Z1bmN0aW9uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFyZ3MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aExhc3RGdW5jdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IG5hcmdzOyAvKiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwogICAgaW50IG5fbmFyZ3M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYXJncyA9IDA7bl9uYXJncyA8IGdlbl9uYl9pbnQ7bl9uYXJncysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hcmdzID0gZ2VuX2ludChuX25hcmdzLCAxKTsKCiAgICAgICAgeG1sWFBhdGhMYXN0RnVuY3Rpb24oY3R4dCwgbmFyZ3MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX25hcmdzLCBuYXJncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aExhc3RGdW5jdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhMZWFkaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVTZXRQdHIgbm9kZXMxOyAvKiBhIG5vZGUtc2V0ICovCiAgICBpbnQgbl9ub2RlczE7CiAgICB4bWxOb2RlU2V0UHRyIG5vZGVzMjsgLyogYSBub2RlLXNldCAqLwogICAgaW50IG5fbm9kZXMyOwoKICAgIGZvciAobl9ub2RlczEgPSAwO25fbm9kZXMxIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlczErKykgewogICAgZm9yIChuX25vZGVzMiA9IDA7bl9ub2RlczIgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzMisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlczEgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzMSwgMCk7CiAgICAgICAgbm9kZXMyID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ub2RlczIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhMZWFkaW5nKG5vZGVzMSwgbm9kZXMyKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVNldFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2RlczEsIG5vZGVzMSwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2RlczIsIG5vZGVzMiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aExlYWRpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZXMxKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzMik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTGVhZGluZ1NvcnRlZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlU2V0UHRyIHJldF92YWw7CiAgICB4bWxOb2RlU2V0UHRyIG5vZGVzMTsgLyogYSBub2RlLXNldCwgc29ydGVkIGJ5IGRvY3VtZW50IG9yZGVyICovCiAgICBpbnQgbl9ub2RlczE7CiAgICB4bWxOb2RlU2V0UHRyIG5vZGVzMjsgLyogYSBub2RlLXNldCwgc29ydGVkIGJ5IGRvY3VtZW50IG9yZGVyICovCiAgICBpbnQgbl9ub2RlczI7CgogICAgZm9yIChuX25vZGVzMSA9IDA7bl9ub2RlczEgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzMSsrKSB7CiAgICBmb3IgKG5fbm9kZXMyID0gMDtuX25vZGVzMiA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbm9kZXMyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGVzMSA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMxLCAwKTsKICAgICAgICBub2RlczIgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzMiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aExlYWRpbmdTb3J0ZWQobm9kZXMxLCBub2RlczIpOwogICAgICAgIGRlc3JldF94bWxOb2RlU2V0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzMSwgbm9kZXMxLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzMiwgbm9kZXMyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTGVhZGluZ1NvcnRlZCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlczEpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZXMyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhMb2NhbE5hbWVGdW5jdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IG5hcmdzOyAvKiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwogICAgaW50IG5fbmFyZ3M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYXJncyA9IDA7bl9uYXJncyA8IGdlbl9uYl9pbnQ7bl9uYXJncysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hcmdzID0gZ2VuX2ludChuX25hcmdzLCAxKTsKCiAgICAgICAgeG1sWFBhdGhMb2NhbE5hbWVGdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTG9jYWxOYW1lRnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTW9kVmFsdWVzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHhtbFhQYXRoTW9kVmFsdWVzKGN0eHQpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE1vZFZhbHVlcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhNdWx0VmFsdWVzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHhtbFhQYXRoTXVsdFZhbHVlcyhjdHh0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhNdWx0VmFsdWVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5hbWVzcGFjZVVSSUZ1bmN0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgbmFyZ3M7IC8qIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzICovCiAgICBpbnQgbl9uYXJnczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX25hcmdzID0gMDtuX25hcmdzIDwgZ2VuX25iX2ludDtuX25hcmdzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgbmFyZ3MgPSBnZW5faW50KG5fbmFyZ3MsIDEpOwoKICAgICAgICB4bWxYUGF0aE5hbWVzcGFjZVVSSUZ1bmN0aW9uKGN0eHQsIG5hcmdzKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9uYXJncywgbmFyZ3MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOYW1lc3BhY2VVUklGdW5jdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOZXdCb29sZWFuKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICBpbnQgdmFsOyAvKiB0aGUgYm9vbGVhbiB2YWx1ZSAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX2ludDtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwgPSBnZW5faW50KG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTmV3Qm9vbGVhbih2YWwpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX2ludChuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTmV3Qm9vbGVhbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5ld0NTdHJpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhPYmplY3RQdHIgcmV0X3ZhbDsKICAgIGNoYXIgKiB2YWw7IC8qIHRoZSBjaGFyICogdmFsdWUgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwgPSBnZW5fY29uc3RfY2hhcl9wdHIobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOZXdDU3RyaW5nKChjb25zdCBjaGFyICopdmFsKTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF9jaGFyX3B0cihuX3ZhbCwgKGNvbnN0IGNoYXIgKil2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOZXdDU3RyaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTmV3RmxvYXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhPYmplY3RQdHIgcmV0X3ZhbDsKICAgIGRvdWJsZSB2YWw7IC8qIHRoZSBkb3VibGUgdmFsdWUgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl9kb3VibGU7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX2RvdWJsZShuX3ZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE5ld0Zsb2F0KHZhbCk7CiAgICAgICAgZGVzcmV0X3htbFhQYXRoT2JqZWN0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfZG91YmxlKG5fdmFsLCB2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOZXdGbG9hdCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5ld05vZGVTZXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhPYmplY3RQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVQdHIgdmFsOyAvKiB0aGUgTm9kZVB0ciB2YWx1ZSAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbE5vZGVQdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX3htbE5vZGVQdHIobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOZXdOb2RlU2V0KHZhbCk7CiAgICAgICAgZGVzcmV0X3htbFhQYXRoT2JqZWN0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTmV3Tm9kZVNldCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5ld05vZGVTZXRMaXN0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICB4bWxOb2RlU2V0UHRyIHZhbDsgLyogYW4gZXhpc3RpbmcgTm9kZVNldCAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX3htbE5vZGVTZXRQdHIobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOZXdOb2RlU2V0TGlzdCh2YWwpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl92YWwsIHZhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5ld05vZGVTZXRMaXN0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTmV3UGFyc2VyQ29udGV4dCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5ld1N0cmluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sQ2hhciAqIHZhbDsgLyogdGhlIHhtbENoYXIgKiB2YWx1ZSAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHZhbCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE5ld1N0cmluZygoY29uc3QgeG1sQ2hhciAqKXZhbCk7CiAgICAgICAgZGVzcmV0X3htbFhQYXRoT2JqZWN0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWwsIChjb25zdCB4bWxDaGFyICopdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTmV3U3RyaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTmV4dEFuY2VzdG9yKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIGN1cnJlbnQgbm9kZSBpbiB0aGUgdHJhdmVyc2FsICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE5leHRBbmNlc3RvcihjdHh0LCBjdXIpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5leHRBbmNlc3RvciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTmV4dEFuY2VzdG9yT3JTZWxmKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIGN1cnJlbnQgbm9kZSBpbiB0aGUgdHJhdmVyc2FsICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE5leHRBbmNlc3Rvck9yU2VsZihjdHh0LCBjdXIpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5leHRBbmNlc3Rvck9yU2VsZiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTmV4dEF0dHJpYnV0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBjdXJyZW50IGF0dHJpYnV0ZSBpbiB0aGUgdHJhdmVyc2FsICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE5leHRBdHRyaWJ1dGUoY3R4dCwgY3VyKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOZXh0QXR0cmlidXRlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOZXh0Q2hpbGQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY3VycmVudCBub2RlIGluIHRoZSB0cmF2ZXJzYWwgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTmV4dENoaWxkKGN0eHQsIGN1cik7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTmV4dENoaWxkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOZXh0RGVzY2VuZGFudCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBjdXJyZW50IG5vZGUgaW4gdGhlIHRyYXZlcnNhbCAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOZXh0RGVzY2VuZGFudChjdHh0LCBjdXIpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5leHREZXNjZW5kYW50IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOZXh0RGVzY2VuZGFudE9yU2VsZih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBjdXJyZW50IG5vZGUgaW4gdGhlIHRyYXZlcnNhbCAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOZXh0RGVzY2VuZGFudE9yU2VsZihjdHh0LCBjdXIpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5leHREZXNjZW5kYW50T3JTZWxmIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOZXh0Rm9sbG93aW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIGN1cnJlbnQgbm9kZSBpbiB0aGUgdHJhdmVyc2FsICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE5leHRGb2xsb3dpbmcoY3R4dCwgY3VyKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fY3VyLCBjdXIsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOZXh0Rm9sbG93aW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOZXh0Rm9sbG93aW5nU2libGluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBjdXJyZW50IG5vZGUgaW4gdGhlIHRyYXZlcnNhbCAqLwogICAgaW50IG5fY3VyOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlUHRyO25fY3VyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVQdHIobl9jdXIsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOZXh0Rm9sbG93aW5nU2libGluZyhjdHh0LCBjdXIpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5leHRGb2xsb3dpbmdTaWJsaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOZXh0TmFtZXNwYWNlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIGN1cnJlbnQgYXR0cmlidXRlIGluIHRoZSB0cmF2ZXJzYWwgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTmV4dE5hbWVzcGFjZShjdHh0LCBjdXIpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5leHROYW1lc3BhY2UiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5leHRQYXJlbnQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY3VycmVudCBub2RlIGluIHRoZSB0cmF2ZXJzYWwgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTmV4dFBhcmVudChjdHh0LCBjdXIpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5leHRQYXJlbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5leHRQcmVjZWRpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgY3VycmVudCBub2RlIGluIHRoZSB0cmF2ZXJzYWwgKi8KICAgIGludCBuX2N1cjsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlUHRyKG5fY3VyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTmV4dFByZWNlZGluZyhjdHh0LCBjdXIpOwogICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9jdXIsIGN1ciwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5leHRQcmVjZWRpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5leHRQcmVjZWRpbmdTaWJsaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIGN1cnJlbnQgbm9kZSBpbiB0aGUgdHJhdmVyc2FsICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE5leHRQcmVjZWRpbmdTaWJsaW5nKGN0eHQsIGN1cik7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTmV4dFByZWNlZGluZ1NpYmxpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5leHRTZWxmKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIGN1cnJlbnQgbm9kZSBpbiB0aGUgdHJhdmVyc2FsICovCiAgICBpbnQgbl9jdXI7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBjdXIgPSBnZW5feG1sTm9kZVB0cihuX2N1ciwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE5leHRTZWxmKGN0eHQsIGN1cik7CiAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2N1ciwgY3VyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTmV4dFNlbGYiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5vZGVMZWFkaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVTZXRQdHIgbm9kZXM7IC8qIGEgbm9kZS1zZXQgKi8KICAgIGludCBuX25vZGVzOwogICAgeG1sTm9kZVB0ciBub2RlOyAvKiBhIG5vZGUgKi8KICAgIGludCBuX25vZGU7CgogICAgZm9yIChuX25vZGVzID0gMDtuX25vZGVzIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlcysrKSB7CiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGVzID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ub2RlcywgMCk7CiAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE5vZGVMZWFkaW5nKG5vZGVzLCBub2RlKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVNldFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2Rlcywgbm9kZXMsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5vZGVMZWFkaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5vZGVMZWFkaW5nU29ydGVkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVTZXRQdHIgbm9kZXM7IC8qIGEgbm9kZS1zZXQsIHNvcnRlZCBieSBkb2N1bWVudCBvcmRlciAqLwogICAgaW50IG5fbm9kZXM7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIGEgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKCiAgICBmb3IgKG5fbm9kZXMgPSAwO25fbm9kZXMgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzKyspIHsKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZXMgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzLCAwKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTm9kZUxlYWRpbmdTb3J0ZWQobm9kZXMsIG5vZGUpOwogICAgICAgIGRlc3JldF94bWxOb2RlU2V0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzLCBub2RlcywgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTm9kZUxlYWRpbmdTb3J0ZWQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZXMpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTm9kZVNldEFkZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlU2V0UHRyIGN1cjsgLyogdGhlIGluaXRpYWwgbm9kZSBzZXQgKi8KICAgIGludCBuX2N1cjsKICAgIHhtbE5vZGVQdHIgdmFsOyAvKiBhIG5ldyB4bWxOb2RlUHRyICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxOb2RlUHRyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlU2V0UHRyKG5fY3VyLCAwKTsKICAgICAgICB2YWwgPSBnZW5feG1sTm9kZVB0cihuX3ZhbCwgMSk7CgogICAgICAgIHhtbFhQYXRoTm9kZVNldEFkZChjdXIsIHZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fY3VyLCBjdXIsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fdmFsLCB2YWwsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOb2RlU2V0QWRkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5vZGVTZXRBZGROcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlU2V0UHRyIGN1cjsgLyogdGhlIGluaXRpYWwgbm9kZSBzZXQgKi8KICAgIGludCBuX2N1cjsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIGhvc3Rpbmcgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKICAgIHhtbE5zUHRyIG5zOyAvKiBhIHRoZSBuYW1lc3BhY2Ugbm9kZSAqLwogICAgaW50IG5fbnM7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKICAgIGZvciAobl9ucyA9IDA7bl9ucyA8IGdlbl9uYl94bWxOc1B0cjtuX25zKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlU2V0UHRyKG5fY3VyLCAwKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAxKTsKICAgICAgICBucyA9IGdlbl94bWxOc1B0cihuX25zLCAyKTsKCiAgICAgICAgeG1sWFBhdGhOb2RlU2V0QWRkTnMoY3VyLCBub2RlLCBucyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fY3VyLCBjdXIsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMSk7CiAgICAgICAgZGVzX3htbE5zUHRyKG5fbnMsIG5zLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTm9kZVNldEFkZE5zIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25zKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOb2RlU2V0QWRkVW5pcXVlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVTZXRQdHIgY3VyOyAvKiB0aGUgaW5pdGlhbCBub2RlIHNldCAqLwogICAgaW50IG5fY3VyOwogICAgeG1sTm9kZVB0ciB2YWw7IC8qIGEgbmV3IHhtbE5vZGVQdHIgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fY3VyKyspIHsKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbE5vZGVQdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVTZXRQdHIobl9jdXIsIDApOwogICAgICAgIHZhbCA9IGdlbl94bWxOb2RlUHRyKG5fdmFsLCAxKTsKCiAgICAgICAgeG1sWFBhdGhOb2RlU2V0QWRkVW5pcXVlKGN1ciwgdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9jdXIsIGN1ciwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl92YWwsIHZhbCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5vZGVTZXRBZGRVbmlxdWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTm9kZVNldENvbnRhaW5zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGludCByZXRfdmFsOwogICAgeG1sTm9kZVNldFB0ciBjdXI7IC8qIHRoZSBub2RlLXNldCAqLwogICAgaW50IG5fY3VyOwogICAgeG1sTm9kZVB0ciB2YWw7IC8qIHRoZSBub2RlICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxOb2RlUHRyO25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxOb2RlU2V0UHRyKG5fY3VyLCAwKTsKICAgICAgICB2YWwgPSBnZW5feG1sTm9kZVB0cihuX3ZhbCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE5vZGVTZXRDb250YWlucyhjdXIsIHZhbCk7CiAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9jdXIsIGN1ciwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl92YWwsIHZhbCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5vZGVTZXRDb250YWlucyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOb2RlU2V0RGVsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVTZXRQdHIgY3VyOyAvKiB0aGUgaW5pdGlhbCBub2RlIHNldCAqLwogICAgaW50IG5fY3VyOwogICAgeG1sTm9kZVB0ciB2YWw7IC8qIGFuIHhtbE5vZGVQdHIgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fY3VyKyspIHsKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbE5vZGVQdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVTZXRQdHIobl9jdXIsIDApOwogICAgICAgIHZhbCA9IGdlbl94bWxOb2RlUHRyKG5fdmFsLCAxKTsKCiAgICAgICAgeG1sWFBhdGhOb2RlU2V0RGVsKGN1ciwgdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9jdXIsIGN1ciwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl92YWwsIHZhbCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5vZGVTZXREZWwiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTm9kZVNldE1lcmdlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVTZXRQdHIgdmFsMTsgLyogdGhlIGZpcnN0IE5vZGVTZXQgb3IgTlVMTCAqLwogICAgaW50IG5fdmFsMTsKICAgIHhtbE5vZGVTZXRQdHIgdmFsMjsgLyogdGhlIHNlY29uZCBOb2RlU2V0ICovCiAgICBpbnQgbl92YWwyOwoKICAgIGZvciAobl92YWwxID0gMDtuX3ZhbDEgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX3ZhbDErKykgewogICAgZm9yIChuX3ZhbDIgPSAwO25fdmFsMiA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fdmFsMisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwxID0gZ2VuX3htbE5vZGVTZXRQdHIobl92YWwxLCAwKTsKICAgICAgICB2YWwyID0gZ2VuX3htbE5vZGVTZXRQdHIobl92YWwyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTm9kZVNldE1lcmdlKHZhbDEsIHZhbDIpOwogICAgICAgIGRlc3JldF94bWxOb2RlU2V0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX3ZhbDEsIHZhbDEsIDApOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fdmFsMiwgdmFsMiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5vZGVTZXRNZXJnZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwxKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbDIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5vZGVTZXRSZW1vdmUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVNldFB0ciBjdXI7IC8qIHRoZSBpbml0aWFsIG5vZGUgc2V0ICovCiAgICBpbnQgbl9jdXI7CiAgICBpbnQgdmFsOyAvKiB0aGUgaW5kZXggdG8gcmVtb3ZlICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl9pbnQ7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX3htbE5vZGVTZXRQdHIobl9jdXIsIDApOwogICAgICAgIHZhbCA9IGdlbl9pbnQobl92YWwsIDEpOwoKICAgICAgICB4bWxYUGF0aE5vZGVTZXRSZW1vdmUoY3VyLCB2YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfaW50KG5fdmFsLCB2YWwsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOb2RlU2V0UmVtb3ZlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5vZGVTZXRTb3J0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVTZXRQdHIgc2V0OyAvKiB0aGUgbm9kZSBzZXQgKi8KICAgIGludCBuX3NldDsKCiAgICBmb3IgKG5fc2V0ID0gMDtuX3NldCA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fc2V0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHNldCA9IGdlbl94bWxOb2RlU2V0UHRyKG5fc2V0LCAwKTsKCiAgICAgICAgeG1sWFBhdGhOb2RlU2V0U29ydChzZXQpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX3NldCwgc2V0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTm9kZVNldFNvcnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2V0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOb2RlVHJhaWxpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVNldFB0ciByZXRfdmFsOwogICAgeG1sTm9kZVNldFB0ciBub2RlczsgLyogYSBub2RlLXNldCAqLwogICAgaW50IG5fbm9kZXM7CiAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIGEgbm9kZSAqLwogICAgaW50IG5fbm9kZTsKCiAgICBmb3IgKG5fbm9kZXMgPSAwO25fbm9kZXMgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzKyspIHsKICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZXMgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzLCAwKTsKICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoTm9kZVRyYWlsaW5nKG5vZGVzLCBub2RlKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVNldFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2Rlcywgbm9kZXMsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5vZGVUcmFpbGluZyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2Rlcyk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOb2RlVHJhaWxpbmdTb3J0ZWQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVNldFB0ciByZXRfdmFsOwogICAgeG1sTm9kZVNldFB0ciBub2RlczsgLyogYSBub2RlLXNldCwgc29ydGVkIGJ5IGRvY3VtZW50IG9yZGVyICovCiAgICBpbnQgbl9ub2RlczsKICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogYSBub2RlICovCiAgICBpbnQgbl9ub2RlOwoKICAgIGZvciAobl9ub2RlcyA9IDA7bl9ub2RlcyA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbm9kZXMrKykgewogICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBub2RlcyA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMsIDApOwogICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOb2RlVHJhaWxpbmdTb3J0ZWQobm9kZXMsIG5vZGUpOwogICAgICAgIGRlc3JldF94bWxOb2RlU2V0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzLCBub2RlcywgMCk7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTm9kZVRyYWlsaW5nU29ydGVkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5vcm1hbGl6ZUZ1bmN0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgbmFyZ3M7IC8qIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzICovCiAgICBpbnQgbl9uYXJnczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX25hcmdzID0gMDtuX25hcmdzIDwgZ2VuX25iX2ludDtuX25hcmdzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgbmFyZ3MgPSBnZW5faW50KG5fbmFyZ3MsIDEpOwoKICAgICAgICB4bWxYUGF0aE5vcm1hbGl6ZUZ1bmN0aW9uKGN0eHQsIG5hcmdzKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9uYXJncywgbmFyZ3MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhOb3JtYWxpemVGdW5jdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOb3RFcXVhbFZhbHVlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aE5vdEVxdWFsVmFsdWVzKGN0eHQpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTm90RXF1YWxWYWx1ZXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoTm90RnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoTm90RnVuY3Rpb24oY3R4dCwgbmFyZ3MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX25hcmdzLCBuYXJncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5vdEZ1bmN0aW9uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFyZ3MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aE5zTG9va3VwKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIGNvbnN0IHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sWFBhdGhDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sQ2hhciAqIHByZWZpeDsgLyogdGhlIG5hbWVzcGFjZSBwcmVmaXggdmFsdWUgKi8KICAgIGludCBuX3ByZWZpeDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX3ByZWZpeCA9IDA7bl9wcmVmaXggPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wcmVmaXgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBwcmVmaXggPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhOc0xvb2t1cChjdHh0LCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCk7CiAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHJlZml4LCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aE5zTG9va3VwIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHJlZml4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhOdW1iZXJGdW5jdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IG5hcmdzOyAvKiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwogICAgaW50IG5fbmFyZ3M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYXJncyA9IDA7bl9uYXJncyA8IGdlbl9uYl9pbnQ7bl9uYXJncysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hcmdzID0gZ2VuX2ludChuX25hcmdzLCAxKTsKCiAgICAgICAgeG1sWFBhdGhOdW1iZXJGdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoTnVtYmVyRnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoUGFyc2VOQ05hbWUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhQYXJzZU5DTmFtZShjdHh0KTsKICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoUGFyc2VOQ05hbWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoUGFyc2VOYW1lKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoUGFyc2VOYW1lKGN0eHQpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhQYXJzZU5hbWUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoUG9wQm9vbGVhbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiBhbiBYUGF0aCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoUG9wQm9vbGVhbihjdHh0KTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFBvcEJvb2xlYW4iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoUG9wRXh0ZXJuYWwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgdm9pZCAqIHJldF92YWw7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogYW4gWFBhdGggcGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aFBvcEV4dGVybmFsKGN0eHQpOwogICAgICAgIGRlc3JldF92b2lkX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhQb3BFeHRlcm5hbCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhQb3BOb2RlU2V0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiBhbiBYUGF0aCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoUG9wTm9kZVNldChjdHh0KTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVNldFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhQb3BOb2RlU2V0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFBvcE51bWJlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBkb3VibGUgcmV0X3ZhbDsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiBhbiBYUGF0aCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoUG9wTnVtYmVyKGN0eHQpOwogICAgICAgIGRlc3JldF9kb3VibGUocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoUG9wTnVtYmVyIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFBvcFN0cmluZyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxDaGFyICogcmV0X3ZhbDsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiBhbiBYUGF0aCBwYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoUG9wU3RyaW5nKGN0eHQpOwogICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhQb3BTdHJpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoUG9zaXRpb25GdW5jdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IG5hcmdzOyAvKiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwogICAgaW50IG5fbmFyZ3M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYXJncyA9IDA7bl9uYXJncyA8IGdlbl9uYl9pbnQ7bl9uYXJncysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hcmdzID0gZ2VuX2ludChuX25hcmdzLCAxKTsKCiAgICAgICAgeG1sWFBhdGhQb3NpdGlvbkZ1bmN0aW9uKGN0eHQsIG5hcmdzKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9uYXJncywgbmFyZ3MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhQb3NpdGlvbkZ1bmN0aW9uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFyZ3MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFJlZ2lzdGVyQWxsRnVuY3Rpb25zKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgeG1sWFBhdGhSZWdpc3RlckFsbEZ1bmN0aW9ucyhjdHh0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhSZWdpc3RlckFsbEZ1bmN0aW9ucyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhSZWdpc3RlckZ1bmModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhSZWdpc3RlckZ1bmNMb29rdXAodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhSZWdpc3RlckZ1bmNOUyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFJlZ2lzdGVyTnModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxYUGF0aENvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxDaGFyICogcHJlZml4OyAvKiB0aGUgbmFtZXNwYWNlIHByZWZpeCBjYW5ub3QgYmUgTlVMTCBvciBlbXB0eSBzdHJpbmcgKi8KICAgIGludCBuX3ByZWZpeDsKICAgIHhtbENoYXIgKiBuc191cmk7IC8qIHRoZSBuYW1lc3BhY2UgbmFtZSAqLwogICAgaW50IG5fbnNfdXJpOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fcHJlZml4ID0gMDtuX3ByZWZpeCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ByZWZpeCsrKSB7CiAgICBmb3IgKG5fbnNfdXJpID0gMDtuX25zX3VyaSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25zX3VyaSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIHByZWZpeCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ByZWZpeCwgMSk7CiAgICAgICAgbnNfdXJpID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbnNfdXJpLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoUmVnaXN0ZXJOcyhjdHh0LCAoY29uc3QgeG1sQ2hhciAqKXByZWZpeCwgKGNvbnN0IHhtbENoYXIgKiluc191cmkpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wcmVmaXgsIChjb25zdCB4bWxDaGFyICopcHJlZml4LCAxKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uc191cmksIChjb25zdCB4bWxDaGFyICopbnNfdXJpLCAyKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoUmVnaXN0ZXJOcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ByZWZpeCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uc191cmkpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFJlZ2lzdGVyVmFyaWFibGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgaW50IHJldF92YWw7CiAgICB4bWxYUGF0aENvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIHZhcmlhYmxlIG5hbWUgKi8KICAgIGludCBuX25hbWU7CiAgICB4bWxYUGF0aE9iamVjdFB0ciB2YWx1ZTsgLyogdGhlIHZhcmlhYmxlIHZhbHVlIG9yIE5VTEwgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfeG1sWFBhdGhPYmplY3RQdHI7bl92YWx1ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICB2YWx1ZSA9IGdlbl94bWxYUGF0aE9iamVjdFB0cihuX3ZhbHVlLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoUmVnaXN0ZXJWYXJpYWJsZShjdHh0LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIHZhbHVlKTsKICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAxKTsKICAgICAgICBkZXNfeG1sWFBhdGhPYmplY3RQdHIobl92YWx1ZSwgdmFsdWUsIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhSZWdpc3RlclZhcmlhYmxlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoUmVnaXN0ZXJWYXJpYWJsZUxvb2t1cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKCiAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLwogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFJlZ2lzdGVyVmFyaWFibGVOUyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBpbnQgcmV0X3ZhbDsKICAgIHhtbFhQYXRoQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgdmFyaWFibGUgbmFtZSAqLwogICAgaW50IG5fbmFtZTsKICAgIHhtbENoYXIgKiBuc191cmk7IC8qIHRoZSB2YXJpYWJsZSBuYW1lc3BhY2UgVVJJICovCiAgICBpbnQgbl9uc191cmk7CiAgICB4bWxYUGF0aE9iamVjdFB0ciB2YWx1ZTsgLyogdGhlIHZhcmlhYmxlIHZhbHVlIG9yIE5VTEwgKi8KICAgIGludCBuX3ZhbHVlOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fbmFtZSsrKSB7CiAgICBmb3IgKG5fbnNfdXJpID0gMDtuX25zX3VyaSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25zX3VyaSsrKSB7CiAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfeG1sWFBhdGhPYmplY3RQdHI7bl92YWx1ZSsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAxKTsKICAgICAgICBuc191cmkgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uc191cmksIDIpOwogICAgICAgIHZhbHVlID0gZ2VuX3htbFhQYXRoT2JqZWN0UHRyKG5fdmFsdWUsIDMpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhSZWdpc3RlclZhcmlhYmxlTlMoY3R4dCwgKGNvbnN0IHhtbENoYXIgKiluYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5zX3VyaSwgdmFsdWUpOwogICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25zX3VyaSwgKGNvbnN0IHhtbENoYXIgKiluc191cmksIDIpOwogICAgICAgIGRlc194bWxYUGF0aE9iamVjdFB0cihuX3ZhbHVlLCB2YWx1ZSwgMyk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFJlZ2lzdGVyVmFyaWFibGVOUyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbnNfdXJpKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhSZWdpc3RlcmVkRnVuY3NDbGVhbnVwKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgeG1sWFBhdGhSZWdpc3RlcmVkRnVuY3NDbGVhbnVwKGN0eHQpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFJlZ2lzdGVyZWRGdW5jc0NsZWFudXAiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoUmVnaXN0ZXJlZE5zQ2xlYW51cCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aENvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aENvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHhtbFhQYXRoUmVnaXN0ZXJlZE5zQ2xlYW51cChjdHh0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhSZWdpc3RlcmVkTnNDbGVhbnVwIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFJlZ2lzdGVyZWRWYXJpYWJsZXNDbGVhbnVwKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCAwKTsKCiAgICAgICAgeG1sWFBhdGhSZWdpc3RlcmVkVmFyaWFibGVzQ2xlYW51cChjdHh0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhSZWdpc3RlcmVkVmFyaWFibGVzQ2xlYW51cCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhSb290KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHhtbFhQYXRoUm9vdChjdHh0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhSb290IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFJvdW5kRnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoUm91bmRGdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoUm91bmRGdW5jdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhTdGFydHNXaXRoRnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoU3RhcnRzV2l0aEZ1bmN0aW9uKGN0eHQsIG5hcmdzKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9uYXJncywgbmFyZ3MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhTdGFydHNXaXRoRnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoU3RyaW5nRXZhbE51bWJlcih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICBkb3VibGUgcmV0X3ZhbDsKICAgIHhtbENoYXIgKiBzdHI7IC8qIEEgc3RyaW5nIHRvIHNjYW4gKi8KICAgIGludCBuX3N0cjsKCiAgICBmb3IgKG5fc3RyID0gMDtuX3N0ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzdHIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhTdHJpbmdFdmFsTnVtYmVyKChjb25zdCB4bWxDaGFyICopc3RyKTsKICAgICAgICBkZXNyZXRfZG91YmxlKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIChjb25zdCB4bWxDaGFyICopc3RyLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoU3RyaW5nRXZhbE51bWJlciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFN0cmluZ0Z1bmN0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgbmFyZ3M7IC8qIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzICovCiAgICBpbnQgbl9uYXJnczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX25hcmdzID0gMDtuX25hcmdzIDwgZ2VuX25iX2ludDtuX25hcmdzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgbmFyZ3MgPSBnZW5faW50KG5fbmFyZ3MsIDEpOwoKICAgICAgICB4bWxYUGF0aFN0cmluZ0Z1bmN0aW9uKGN0eHQsIG5hcmdzKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9uYXJncywgbmFyZ3MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhTdHJpbmdGdW5jdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhTdHJpbmdMZW5ndGhGdW5jdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IG5hcmdzOyAvKiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwogICAgaW50IG5fbmFyZ3M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYXJncyA9IDA7bl9uYXJncyA8IGdlbl9uYl9pbnQ7bl9uYXJncysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hcmdzID0gZ2VuX2ludChuX25hcmdzLCAxKTsKCiAgICAgICAgeG1sWFBhdGhTdHJpbmdMZW5ndGhGdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoU3RyaW5nTGVuZ3RoRnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoU3ViVmFsdWVzKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHhtbFhQYXRoU3ViVmFsdWVzKGN0eHQpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFN1YlZhbHVlcyIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhTdWJzdHJpbmdBZnRlckZ1bmN0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgbmFyZ3M7IC8qIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzICovCiAgICBpbnQgbl9uYXJnczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX25hcmdzID0gMDtuX25hcmdzIDwgZ2VuX25iX2ludDtuX25hcmdzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgbmFyZ3MgPSBnZW5faW50KG5fbmFyZ3MsIDEpOwoKICAgICAgICB4bWxYUGF0aFN1YnN0cmluZ0FmdGVyRnVuY3Rpb24oY3R4dCwgbmFyZ3MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX25hcmdzLCBuYXJncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFN1YnN0cmluZ0FmdGVyRnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoU3Vic3RyaW5nQmVmb3JlRnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoU3Vic3RyaW5nQmVmb3JlRnVuY3Rpb24oY3R4dCwgbmFyZ3MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX25hcmdzLCBuYXJncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFN1YnN0cmluZ0JlZm9yZUZ1bmN0aW9uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFyZ3MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFN1YnN0cmluZ0Z1bmN0aW9uKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgbmFyZ3M7IC8qIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzICovCiAgICBpbnQgbl9uYXJnczsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX25hcmdzID0gMDtuX25hcmdzIDwgZ2VuX25iX2ludDtuX25hcmdzKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgbmFyZ3MgPSBnZW5faW50KG5fbmFyZ3MsIDEpOwoKICAgICAgICB4bWxYUGF0aFN1YnN0cmluZ0Z1bmN0aW9uKGN0eHQsIG5hcmdzKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19pbnQobl9uYXJncywgbmFyZ3MsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhTdWJzdHJpbmdGdW5jdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhTdW1GdW5jdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IG5hcmdzOyAvKiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwogICAgaW50IG5fbmFyZ3M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYXJncyA9IDA7bl9uYXJncyA8IGdlbl9uYl9pbnQ7bl9uYXJncysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hcmdzID0gZ2VuX2ludChuX25hcmdzLCAxKTsKCiAgICAgICAgeG1sWFBhdGhTdW1GdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoU3VtRnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoVHJhaWxpbmcodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTm9kZVNldFB0ciByZXRfdmFsOwogICAgeG1sTm9kZVNldFB0ciBub2RlczE7IC8qIGEgbm9kZS1zZXQgKi8KICAgIGludCBuX25vZGVzMTsKICAgIHhtbE5vZGVTZXRQdHIgbm9kZXMyOyAvKiBhIG5vZGUtc2V0ICovCiAgICBpbnQgbl9ub2RlczI7CgogICAgZm9yIChuX25vZGVzMSA9IDA7bl9ub2RlczEgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25vZGVzMSsrKSB7CiAgICBmb3IgKG5fbm9kZXMyID0gMDtuX25vZGVzMiA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbm9kZXMyKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIG5vZGVzMSA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMxLCAwKTsKICAgICAgICBub2RlczIgPSBnZW5feG1sTm9kZVNldFB0cihuX25vZGVzMiwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUGF0aFRyYWlsaW5nKG5vZGVzMSwgbm9kZXMyKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVNldFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2RlczEsIG5vZGVzMSwgMCk7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl9ub2RlczIsIG5vZGVzMiwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFRyYWlsaW5nIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzMSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlczIpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFRyYWlsaW5nU29ydGVkKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbE5vZGVTZXRQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVTZXRQdHIgbm9kZXMxOyAvKiBhIG5vZGUtc2V0LCBzb3J0ZWQgYnkgZG9jdW1lbnQgb3JkZXIgKi8KICAgIGludCBuX25vZGVzMTsKICAgIHhtbE5vZGVTZXRQdHIgbm9kZXMyOyAvKiBhIG5vZGUtc2V0LCBzb3J0ZWQgYnkgZG9jdW1lbnQgb3JkZXIgKi8KICAgIGludCBuX25vZGVzMjsKCiAgICBmb3IgKG5fbm9kZXMxID0gMDtuX25vZGVzMSA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbm9kZXMxKyspIHsKICAgIGZvciAobl9ub2RlczIgPSAwO25fbm9kZXMyIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9ub2RlczIrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgbm9kZXMxID0gZ2VuX3htbE5vZGVTZXRQdHIobl9ub2RlczEsIDApOwogICAgICAgIG5vZGVzMiA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbm9kZXMyLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoVHJhaWxpbmdTb3J0ZWQobm9kZXMxLCBub2RlczIpOwogICAgICAgIGRlc3JldF94bWxOb2RlU2V0UHRyKHJldF92YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzMSwgbm9kZXMxLCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25vZGVzMiwgbm9kZXMyLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoVHJhaWxpbmdTb3J0ZWQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZXMxKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGVzMik7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoVHJhbnNsYXRlRnVuY3Rpb24odm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KICAgIGludCBuX25hcmdzOwoKICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CiAgICBmb3IgKG5fbmFyZ3MgPSAwO25fbmFyZ3MgPCBnZW5fbmJfaW50O25fbmFyZ3MrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYXJncyA9IGdlbl9pbnQobl9uYXJncywgMSk7CgogICAgICAgIHhtbFhQYXRoVHJhbnNsYXRlRnVuY3Rpb24oY3R4dCwgbmFyZ3MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX25hcmdzLCBuYXJncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFRyYW5zbGF0ZUZ1bmN0aW9uIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFyZ3MpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFRydWVGdW5jdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIFBhcnNlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgaW50IG5hcmdzOyAvKiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwogICAgaW50IG5fbmFyZ3M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYXJncyA9IDA7bl9uYXJncyA8IGdlbl9uYl9pbnQ7bl9uYXJncysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hcmdzID0gZ2VuX2ludChuX25hcmdzLCAxKTsKCiAgICAgICAgeG1sWFBhdGhUcnVlRnVuY3Rpb24oY3R4dCwgbmFyZ3MpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ludChuX25hcmdzLCBuYXJncywgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFRydWVGdW5jdGlvbiIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hcmdzKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhWYWx1ZUZsaXBTaWduKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHhtbFhQYXRoVmFsdWVGbGlwU2lnbihjdHh0KTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhWYWx1ZUZsaXBTaWduIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFZhcmlhYmxlTG9va3VwKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICB4bWxYUGF0aENvbnRleHRQdHIgY3R4dDsgLyogdGhlIFhQYXRoIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIHZhcmlhYmxlIG5hbWUgKi8KICAgIGludCBuX25hbWU7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aENvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhDb250ZXh0UHRyKG5fY3R4dCwgMCk7CiAgICAgICAgbmFtZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhWYXJpYWJsZUxvb2t1cChjdHh0LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eHQsIGN0eHQsIDApOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25hbWUsIChjb25zdCB4bWxDaGFyICopbmFtZSwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFZhcmlhYmxlTG9va3VwIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoVmFyaWFibGVMb29rdXBOUyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQQVRIX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sWFBhdGhDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBjb250ZXh0ICovCiAgICBpbnQgbl9jdHh0OwogICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSB2YXJpYWJsZSBuYW1lICovCiAgICBpbnQgbl9uYW1lOwogICAgeG1sQ2hhciAqIG5zX3VyaTsgLyogdGhlIHZhcmlhYmxlIG5hbWVzcGFjZSBVUkkgKi8KICAgIGludCBuX25zX3VyaTsKCiAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoQ29udGV4dFB0cjtuX2N0eHQrKykgewogICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewogICAgZm9yIChuX25zX3VyaSA9IDA7bl9uc191cmkgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uc191cmkrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBuYW1lID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgMSk7CiAgICAgICAgbnNfdXJpID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fbnNfdXJpLCAyKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoVmFyaWFibGVMb29rdXBOUyhjdHh0LCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIChjb25zdCB4bWxDaGFyICopbnNfdXJpKTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAoY29uc3QgeG1sQ2hhciAqKW5hbWUsIDEpOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX25zX3VyaSwgKGNvbnN0IHhtbENoYXIgKiluc191cmksIDIpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhWYXJpYWJsZUxvb2t1cE5TIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbmFtZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uc191cmkpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUGF0aFdyYXBDU3RyaW5nKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBBVEhfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICBjaGFyICogdmFsOyAvKiB0aGUgY2hhciAqIHZhbHVlICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfY2hhcl9wdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX2NoYXJfcHRyKG5fdmFsLCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoV3JhcENTdHJpbmcodmFsKTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jaGFyX3B0cihuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoV3JhcENTdHJpbmciLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFBhdGhXcmFwRXh0ZXJuYWwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhPYmplY3RQdHIgcmV0X3ZhbDsKICAgIHZvaWQgKiB2YWw7IC8qIHRoZSB1c2VyIGRhdGEgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl92b2lkX3B0cjtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwgPSBnZW5fdm9pZF9wdHIobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhXcmFwRXh0ZXJuYWwodmFsKTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc192b2lkX3B0cihuX3ZhbCwgdmFsLCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoV3JhcEV4dGVybmFsIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoV3JhcE5vZGVTZXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhPYmplY3RQdHIgcmV0X3ZhbDsKICAgIHhtbE5vZGVTZXRQdHIgdmFsOyAvKiB0aGUgTm9kZVB0ciB2YWx1ZSAqLwogICAgaW50IG5fdmFsOwoKICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgdmFsID0gZ2VuX3htbE5vZGVTZXRQdHIobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFBhdGhXcmFwTm9kZVNldCh2YWwpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVTZXRQdHIobl92YWwsIHZhbCwgMCk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aFdyYXBOb2RlU2V0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQYXRoZXJyb3Iodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUEFUSF9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBQYXJzZXIgY29udGV4dCAqLwogICAgaW50IG5fY3R4dDsKICAgIGNvbnN0IGNoYXIgKiBmaWxlOyAvKiB0aGUgZmlsZSBuYW1lICovCiAgICBpbnQgbl9maWxlOwogICAgaW50IGxpbmU7IC8qIHRoZSBsaW5lIG51bWJlciAqLwogICAgaW50IG5fbGluZTsKICAgIGludCBubzsgLyogdGhlIGVycm9yIG51bWJlciAqLwogICAgaW50IG5fbm87CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9maWxlID0gMDtuX2ZpbGUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlKyspIHsKICAgIGZvciAobl9saW5lID0gMDtuX2xpbmUgPCBnZW5fbmJfaW50O25fbGluZSsrKSB7CiAgICBmb3IgKG5fbm8gPSAwO25fbm8gPCBnZW5fbmJfaW50O25fbm8rKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKICAgICAgICBmaWxlID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZSwgMSk7CiAgICAgICAgbGluZSA9IGdlbl9pbnQobl9saW5lLCAyKTsKICAgICAgICBubyA9IGdlbl9pbnQobl9ubywgMyk7CgogICAgICAgIHhtbFhQYXRoZXJyb3IoY3R4dCwgZmlsZSwgbGluZSwgbm8pOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CiAgICAgICAgZGVzX2ZpbGVwYXRoKG5fZmlsZSwgZmlsZSwgMSk7CiAgICAgICAgZGVzX2ludChuX2xpbmUsIGxpbmUsIDIpOwogICAgICAgIGRlc19pbnQobl9ubywgbm8sIDMpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhlcnJvciIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2ZpbGUpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGluZSk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ubyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeHBhdGhJbnRlcm5hbHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiAgICBpZiAocXVpZXQgPT0gMCkgcHJpbnRmKCJUZXN0aW5nIHhwYXRoSW50ZXJuYWxzIDogMTA2IG9mIDExNyBmdW5jdGlvbnMgLi4uXG4iKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfdmFsdWVQb3AoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfdmFsdWVQdXNoKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQWRkVmFsdWVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQm9vbGVhbkZ1bmN0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ2VpbGluZ0Z1bmN0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ29tcGFyZVZhbHVlcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aENvbmNhdEZ1bmN0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoQ29udGFpbnNGdW5jdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aENvdW50RnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhEZWJ1Z0R1bXBDb21wRXhwcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aERlYnVnRHVtcE9iamVjdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aERpZmZlcmVuY2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhEaXN0aW5jdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aERpc3RpbmN0U29ydGVkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoRGl2VmFsdWVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoRXF1YWxWYWx1ZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhFcnIoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhFdmFsRXhwcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aEV2YWx1YXRlUHJlZGljYXRlUmVzdWx0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoRmFsc2VGdW5jdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aEZsb29yRnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhGdW5jdGlvbkxvb2t1cCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aEZ1bmN0aW9uTG9va3VwTlMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhIYXNTYW1lTm9kZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhJZEZ1bmN0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoSW50ZXJzZWN0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoSXNOb2RlVHlwZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aExhbmdGdW5jdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aExhc3RGdW5jdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aExlYWRpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhMZWFkaW5nU29ydGVkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTG9jYWxOYW1lRnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhNb2RWYWx1ZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhNdWx0VmFsdWVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTmFtZXNwYWNlVVJJRnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOZXdCb29sZWFuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTmV3Q1N0cmluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5ld0Zsb2F0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTmV3Tm9kZVNldCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5ld05vZGVTZXRMaXN0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTmV3UGFyc2VyQ29udGV4dCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5ld1N0cmluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5leHRBbmNlc3RvcigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5leHRBbmNlc3Rvck9yU2VsZigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5leHRBdHRyaWJ1dGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOZXh0Q2hpbGQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOZXh0RGVzY2VuZGFudCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5leHREZXNjZW5kYW50T3JTZWxmKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTmV4dEZvbGxvd2luZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5leHRGb2xsb3dpbmdTaWJsaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTmV4dE5hbWVzcGFjZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5leHRQYXJlbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOZXh0UHJlY2VkaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTmV4dFByZWNlZGluZ1NpYmxpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOZXh0U2VsZigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5vZGVMZWFkaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTm9kZUxlYWRpbmdTb3J0ZWQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOb2RlU2V0QWRkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTm9kZVNldEFkZE5zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTm9kZVNldEFkZFVuaXF1ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5vZGVTZXRDb250YWlucygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5vZGVTZXREZWwoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOb2RlU2V0TWVyZ2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOb2RlU2V0UmVtb3ZlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTm9kZVNldFNvcnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOb2RlVHJhaWxpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOb2RlVHJhaWxpbmdTb3J0ZWQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOb3JtYWxpemVGdW5jdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE5vdEVxdWFsVmFsdWVzKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoTm90RnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhOc0xvb2t1cCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aE51bWJlckZ1bmN0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUGFyc2VOQ05hbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhQYXJzZU5hbWUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhQb3BCb29sZWFuKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUG9wRXh0ZXJuYWwoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhQb3BOb2RlU2V0KCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUG9wTnVtYmVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUG9wU3RyaW5nKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUG9zaXRpb25GdW5jdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aFJlZ2lzdGVyQWxsRnVuY3Rpb25zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUmVnaXN0ZXJGdW5jKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUmVnaXN0ZXJGdW5jTG9va3VwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUmVnaXN0ZXJGdW5jTlMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhSZWdpc3Rlck5zKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUmVnaXN0ZXJWYXJpYWJsZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aFJlZ2lzdGVyVmFyaWFibGVMb29rdXAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhSZWdpc3RlclZhcmlhYmxlTlMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhSZWdpc3RlcmVkRnVuY3NDbGVhbnVwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUmVnaXN0ZXJlZE5zQ2xlYW51cCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aFJlZ2lzdGVyZWRWYXJpYWJsZXNDbGVhbnVwKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoUm9vdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aFJvdW5kRnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhTdGFydHNXaXRoRnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhTdHJpbmdFdmFsTnVtYmVyKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoU3RyaW5nRnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhTdHJpbmdMZW5ndGhGdW5jdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aFN1YlZhbHVlcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aFN1YnN0cmluZ0FmdGVyRnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhTdWJzdHJpbmdCZWZvcmVGdW5jdGlvbigpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aFN1YnN0cmluZ0Z1bmN0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoU3VtRnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhUcmFpbGluZygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aFRyYWlsaW5nU29ydGVkKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoVHJhbnNsYXRlRnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhUcnVlRnVuY3Rpb24oKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhWYWx1ZUZsaXBTaWduKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoVmFyaWFibGVMb29rdXAoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhWYXJpYWJsZUxvb2t1cE5TKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQYXRoV3JhcENTdHJpbmcoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhXcmFwRXh0ZXJuYWwoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFBhdGhXcmFwTm9kZVNldCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUGF0aGVycm9yKCk7CgogICAgaWYgKHRlc3RfcmV0ICE9IDApCglwcmludGYoIk1vZHVsZSB4cGF0aEludGVybmFsczogJWQgZXJyb3JzXG4iLCB0ZXN0X3JldCk7CiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgpzdGF0aWMgaW50CnRlc3RfeG1sWFB0ckJ1aWxkTm9kZUxpc3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUFRSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICB4bWxYUGF0aE9iamVjdFB0ciBvYmo7IC8qIHRoZSBYUG9pbnRlciByZXN1bHQgZnJvbSB0aGUgZXZhbHVhdGlvbi4gKi8KICAgIGludCBuX29iajsKCiAgICBmb3IgKG5fb2JqID0gMDtuX29iaiA8IGdlbl9uYl94bWxYUGF0aE9iamVjdFB0cjtuX29iaisrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBvYmogPSBnZW5feG1sWFBhdGhPYmplY3RQdHIobl9vYmosIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFB0ckJ1aWxkTm9kZUxpc3Qob2JqKTsKICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoT2JqZWN0UHRyKG5fb2JqLCBvYmosIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFB0ckJ1aWxkTm9kZUxpc3QiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb2JqKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFB0ckV2YWwodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUFRSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sQ2hhciAqIHN0cjsgLyogdGhlIFhQb2ludGVyIGV4cHJlc3Npb24gKi8KICAgIGludCBuX3N0cjsKICAgIHhtbFhQYXRoQ29udGV4dFB0ciBjdHg7IC8qIHRoZSBYUG9pbnRlciBjb250ZXh0ICovCiAgICBpbnQgbl9jdHg7CgogICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIrKykgewogICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfeG1sWFBhdGhDb250ZXh0UHRyO25fY3R4KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgMCk7CiAgICAgICAgY3R4ID0gZ2VuX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUHRyRXZhbCgoY29uc3QgeG1sQ2hhciAqKXN0ciwgY3R4KTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgKGNvbnN0IHhtbENoYXIgKilzdHIsIDApOwogICAgICAgIGRlc194bWxYUGF0aENvbnRleHRQdHIobl9jdHgsIGN0eCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUHRyRXZhbCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFB0ckV2YWxSYW5nZVByZWRpY2F0ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQVFJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBvaW50ZXIgUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CgogICAgICAgIHhtbFhQdHJFdmFsUmFuZ2VQcmVkaWNhdGUoY3R4dCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQdHJFdmFsUmFuZ2VQcmVkaWNhdGUiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgojaWZkZWYgTElCWE1MX1hQVFJfRU5BQkxFRAoKI2RlZmluZSBnZW5fbmJfeG1sTG9jYXRpb25TZXRQdHIgMQpzdGF0aWMgeG1sTG9jYXRpb25TZXRQdHIgZ2VuX3htbExvY2F0aW9uU2V0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKE5VTEwpOwp9CnN0YXRpYyB2b2lkIGRlc194bWxMb2NhdGlvblNldFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sTG9jYXRpb25TZXRQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cn0KI2VuZGlmCgoKc3RhdGljIGludAp0ZXN0X3htbFhQdHJMb2NhdGlvblNldEFkZCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQVFJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbExvY2F0aW9uU2V0UHRyIGN1cjsgLyogdGhlIGluaXRpYWwgcmFuZ2Ugc2V0ICovCiAgICBpbnQgbl9jdXI7CiAgICB4bWxYUGF0aE9iamVjdFB0ciB2YWw7IC8qIGEgbmV3IHhtbFhQYXRoT2JqZWN0UHRyICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTG9jYXRpb25TZXRQdHI7bl9jdXIrKykgewogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfeG1sWFBhdGhPYmplY3RQdHI7bl92YWwrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgY3VyID0gZ2VuX3htbExvY2F0aW9uU2V0UHRyKG5fY3VyLCAwKTsKICAgICAgICB2YWwgPSBnZW5feG1sWFBhdGhPYmplY3RQdHIobl92YWwsIDEpOwoKICAgICAgICB4bWxYUHRyTG9jYXRpb25TZXRBZGQoY3VyLCB2YWwpOwogICAgICAgIGNhbGxfdGVzdHMrKzsKICAgICAgICBkZXNfeG1sTG9jYXRpb25TZXRQdHIobl9jdXIsIGN1ciwgMCk7CiAgICAgICAgZGVzX3htbFhQYXRoT2JqZWN0UHRyKG5fdmFsLCB2YWwsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFB0ckxvY2F0aW9uU2V0QWRkIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUHRyTG9jYXRpb25TZXRDcmVhdGUodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCgogICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFB0ckxvY2F0aW9uU2V0RGVsKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBUUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sTG9jYXRpb25TZXRQdHIgY3VyOyAvKiB0aGUgaW5pdGlhbCByYW5nZSBzZXQgKi8KICAgIGludCBuX2N1cjsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHZhbDsgLyogYW4geG1sWFBhdGhPYmplY3RQdHIgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxMb2NhdGlvblNldFB0cjtuX2N1cisrKSB7CiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxYUGF0aE9iamVjdFB0cjtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdXIgPSBnZW5feG1sTG9jYXRpb25TZXRQdHIobl9jdXIsIDApOwogICAgICAgIHZhbCA9IGdlbl94bWxYUGF0aE9iamVjdFB0cihuX3ZhbCwgMSk7CgogICAgICAgIHhtbFhQdHJMb2NhdGlvblNldERlbChjdXIsIHZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxMb2NhdGlvblNldFB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfeG1sWFBhdGhPYmplY3RQdHIobl92YWwsIHZhbCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUHRyTG9jYXRpb25TZXREZWwiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQdHJMb2NhdGlvblNldE1lcmdlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQdHJMb2NhdGlvblNldFJlbW92ZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQVFJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbExvY2F0aW9uU2V0UHRyIGN1cjsgLyogdGhlIGluaXRpYWwgcmFuZ2Ugc2V0ICovCiAgICBpbnQgbl9jdXI7CiAgICBpbnQgdmFsOyAvKiB0aGUgaW5kZXggdG8gcmVtb3ZlICovCiAgICBpbnQgbl92YWw7CgogICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTG9jYXRpb25TZXRQdHI7bl9jdXIrKykgewogICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfaW50O25fdmFsKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIGN1ciA9IGdlbl94bWxMb2NhdGlvblNldFB0cihuX2N1ciwgMCk7CiAgICAgICAgdmFsID0gZ2VuX2ludChuX3ZhbCwgMSk7CgogICAgICAgIHhtbFhQdHJMb2NhdGlvblNldFJlbW92ZShjdXIsIHZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxMb2NhdGlvblNldFB0cihuX2N1ciwgY3VyLCAwKTsKICAgICAgICBkZXNfaW50KG5fdmFsLCB2YWwsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFB0ckxvY2F0aW9uU2V0UmVtb3ZlIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUHRyTmV3Q29sbGFwc2VkUmFuZ2Uodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUFRSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBzdGFydDsgLyogdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgbm9kZSAqLwogICAgaW50IG5fc3RhcnQ7CgogICAgZm9yIChuX3N0YXJ0ID0gMDtuX3N0YXJ0IDwgZ2VuX25iX3htbE5vZGVQdHI7bl9zdGFydCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzdGFydCA9IGdlbl94bWxOb2RlUHRyKG5fc3RhcnQsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFB0ck5ld0NvbGxhcHNlZFJhbmdlKHN0YXJ0KTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fc3RhcnQsIHN0YXJ0LCAwKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQdHJOZXdDb2xsYXBzZWRSYW5nZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdGFydCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQdHJOZXdDb250ZXh0KHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgoKICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQdHJOZXdMb2NhdGlvblNldE5vZGVTZXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUFRSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sTm9kZVNldFB0ciBzZXQ7IC8qIGEgbm9kZSBzZXQgKi8KICAgIGludCBuX3NldDsKCiAgICBmb3IgKG5fc2V0ID0gMDtuX3NldCA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fc2V0KyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHNldCA9IGdlbl94bWxOb2RlU2V0UHRyKG5fc2V0LCAwKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQdHJOZXdMb2NhdGlvblNldE5vZGVTZXQoc2V0KTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fc2V0LCBzZXQsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFB0ck5ld0xvY2F0aW9uU2V0Tm9kZVNldCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zZXQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUHRyTmV3TG9jYXRpb25TZXROb2Rlcyh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQVFJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIHN0YXJ0OyAvKiB0aGUgc3RhcnQgTm9kZVB0ciB2YWx1ZSAqLwogICAgaW50IG5fc3RhcnQ7CiAgICB4bWxOb2RlUHRyIGVuZDsgLyogdGhlIGVuZCBOb2RlUHRyIHZhbHVlIG9yIE5VTEwgKi8KICAgIGludCBuX2VuZDsKCiAgICBmb3IgKG5fc3RhcnQgPSAwO25fc3RhcnQgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX3N0YXJ0KyspIHsKICAgIGZvciAobl9lbmQgPSAwO25fZW5kIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9lbmQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3RhcnQgPSBnZW5feG1sTm9kZVB0cihuX3N0YXJ0LCAwKTsKICAgICAgICBlbmQgPSBnZW5feG1sTm9kZVB0cihuX2VuZCwgMSk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUHRyTmV3TG9jYXRpb25TZXROb2RlcyhzdGFydCwgZW5kKTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fc3RhcnQsIHN0YXJ0LCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2VuZCwgZW5kLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQdHJOZXdMb2NhdGlvblNldE5vZGVzIiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0YXJ0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuZCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQdHJOZXdSYW5nZSh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQVFJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIHN0YXJ0OyAvKiB0aGUgc3RhcnRpbmcgbm9kZSAqLwogICAgaW50IG5fc3RhcnQ7CiAgICBpbnQgc3RhcnRpbmRleDsgLyogdGhlIHN0YXJ0IGluZGV4ICovCiAgICBpbnQgbl9zdGFydGluZGV4OwogICAgeG1sTm9kZVB0ciBlbmQ7IC8qIHRoZSBlbmRpbmcgcG9pbnQgKi8KICAgIGludCBuX2VuZDsKICAgIGludCBlbmRpbmRleDsgLyogdGhlIGVuZGluZyBpbmRleCAqLwogICAgaW50IG5fZW5kaW5kZXg7CgogICAgZm9yIChuX3N0YXJ0ID0gMDtuX3N0YXJ0IDwgZ2VuX25iX3htbE5vZGVQdHI7bl9zdGFydCsrKSB7CiAgICBmb3IgKG5fc3RhcnRpbmRleCA9IDA7bl9zdGFydGluZGV4IDwgZ2VuX25iX2ludDtuX3N0YXJ0aW5kZXgrKykgewogICAgZm9yIChuX2VuZCA9IDA7bl9lbmQgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2VuZCsrKSB7CiAgICBmb3IgKG5fZW5kaW5kZXggPSAwO25fZW5kaW5kZXggPCBnZW5fbmJfaW50O25fZW5kaW5kZXgrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3RhcnQgPSBnZW5feG1sTm9kZVB0cihuX3N0YXJ0LCAwKTsKICAgICAgICBzdGFydGluZGV4ID0gZ2VuX2ludChuX3N0YXJ0aW5kZXgsIDEpOwogICAgICAgIGVuZCA9IGdlbl94bWxOb2RlUHRyKG5fZW5kLCAyKTsKICAgICAgICBlbmRpbmRleCA9IGdlbl9pbnQobl9lbmRpbmRleCwgMyk7CgogICAgICAgIHJldF92YWwgPSB4bWxYUHRyTmV3UmFuZ2Uoc3RhcnQsIHN0YXJ0aW5kZXgsIGVuZCwgZW5kaW5kZXgpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9zdGFydCwgc3RhcnQsIDApOwogICAgICAgIGRlc19pbnQobl9zdGFydGluZGV4LCBzdGFydGluZGV4LCAxKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2VuZCwgZW5kLCAyKTsKICAgICAgICBkZXNfaW50KG5fZW5kaW5kZXgsIGVuZGluZGV4LCAzKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQdHJOZXdSYW5nZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdGFydCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdGFydGluZGV4KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuZCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmRpbmRleCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQdHJOZXdSYW5nZU5vZGVPYmplY3Qodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUFRSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBzdGFydDsgLyogdGhlIHN0YXJ0aW5nIG5vZGUgKi8KICAgIGludCBuX3N0YXJ0OwogICAgeG1sWFBhdGhPYmplY3RQdHIgZW5kOyAvKiB0aGUgZW5kaW5nIG9iamVjdCAqLwogICAgaW50IG5fZW5kOwoKICAgIGZvciAobl9zdGFydCA9IDA7bl9zdGFydCA8IGdlbl9uYl94bWxOb2RlUHRyO25fc3RhcnQrKykgewogICAgZm9yIChuX2VuZCA9IDA7bl9lbmQgPCBnZW5fbmJfeG1sWFBhdGhPYmplY3RQdHI7bl9lbmQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3RhcnQgPSBnZW5feG1sTm9kZVB0cihuX3N0YXJ0LCAwKTsKICAgICAgICBlbmQgPSBnZW5feG1sWFBhdGhPYmplY3RQdHIobl9lbmQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFB0ck5ld1JhbmdlTm9kZU9iamVjdChzdGFydCwgZW5kKTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fc3RhcnQsIHN0YXJ0LCAwKTsKICAgICAgICBkZXNfeG1sWFBhdGhPYmplY3RQdHIobl9lbmQsIGVuZCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUHRyTmV3UmFuZ2VOb2RlT2JqZWN0IiwKCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CgkgICAgdGVzdF9yZXQrKzsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0YXJ0KTsKICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuZCk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQdHJOZXdSYW5nZU5vZGVQb2ludCh2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQVFJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CiAgICB4bWxOb2RlUHRyIHN0YXJ0OyAvKiB0aGUgc3RhcnRpbmcgbm9kZSAqLwogICAgaW50IG5fc3RhcnQ7CiAgICB4bWxYUGF0aE9iamVjdFB0ciBlbmQ7IC8qIHRoZSBlbmRpbmcgcG9pbnQgKi8KICAgIGludCBuX2VuZDsKCiAgICBmb3IgKG5fc3RhcnQgPSAwO25fc3RhcnQgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX3N0YXJ0KyspIHsKICAgIGZvciAobl9lbmQgPSAwO25fZW5kIDwgZ2VuX25iX3htbFhQYXRoT2JqZWN0UHRyO25fZW5kKyspIHsKICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOwogICAgICAgIHN0YXJ0ID0gZ2VuX3htbE5vZGVQdHIobl9zdGFydCwgMCk7CiAgICAgICAgZW5kID0gZ2VuX3htbFhQYXRoT2JqZWN0UHRyKG5fZW5kLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQdHJOZXdSYW5nZU5vZGVQb2ludChzdGFydCwgZW5kKTsKICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fc3RhcnQsIHN0YXJ0LCAwKTsKICAgICAgICBkZXNfeG1sWFBhdGhPYmplY3RQdHIobl9lbmQsIGVuZCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUHRyTmV3UmFuZ2VOb2RlUG9pbnQiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RhcnQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5kKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFB0ck5ld1JhbmdlTm9kZXModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUFRSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sTm9kZVB0ciBzdGFydDsgLyogdGhlIHN0YXJ0aW5nIG5vZGUgKi8KICAgIGludCBuX3N0YXJ0OwogICAgeG1sTm9kZVB0ciBlbmQ7IC8qIHRoZSBlbmRpbmcgbm9kZSAqLwogICAgaW50IG5fZW5kOwoKICAgIGZvciAobl9zdGFydCA9IDA7bl9zdGFydCA8IGdlbl9uYl94bWxOb2RlUHRyO25fc3RhcnQrKykgewogICAgZm9yIChuX2VuZCA9IDA7bl9lbmQgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2VuZCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzdGFydCA9IGdlbl94bWxOb2RlUHRyKG5fc3RhcnQsIDApOwogICAgICAgIGVuZCA9IGdlbl94bWxOb2RlUHRyKG5fZW5kLCAxKTsKCiAgICAgICAgcmV0X3ZhbCA9IHhtbFhQdHJOZXdSYW5nZU5vZGVzKHN0YXJ0LCBlbmQpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbE5vZGVQdHIobl9zdGFydCwgc3RhcnQsIDApOwogICAgICAgIGRlc194bWxOb2RlUHRyKG5fZW5kLCBlbmQsIDEpOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFB0ck5ld1JhbmdlTm9kZXMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RhcnQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5kKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFB0ck5ld1JhbmdlUG9pbnROb2RlKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgojaWYgZGVmaW5lZChMSUJYTUxfWFBUUl9FTkFCTEVEKQogICAgaW50IG1lbV9iYXNlOwogICAgeG1sWFBhdGhPYmplY3RQdHIgcmV0X3ZhbDsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHN0YXJ0OyAvKiB0aGUgc3RhcnRpbmcgcG9pbnQgKi8KICAgIGludCBuX3N0YXJ0OwogICAgeG1sTm9kZVB0ciBlbmQ7IC8qIHRoZSBlbmRpbmcgbm9kZSAqLwogICAgaW50IG5fZW5kOwoKICAgIGZvciAobl9zdGFydCA9IDA7bl9zdGFydCA8IGdlbl9uYl94bWxYUGF0aE9iamVjdFB0cjtuX3N0YXJ0KyspIHsKICAgIGZvciAobl9lbmQgPSAwO25fZW5kIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9lbmQrKykgewogICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CiAgICAgICAgc3RhcnQgPSBnZW5feG1sWFBhdGhPYmplY3RQdHIobl9zdGFydCwgMCk7CiAgICAgICAgZW5kID0gZ2VuX3htbE5vZGVQdHIobl9lbmQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFB0ck5ld1JhbmdlUG9pbnROb2RlKHN0YXJ0LCBlbmQpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoT2JqZWN0UHRyKG5fc3RhcnQsIHN0YXJ0LCAwKTsKICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2VuZCwgZW5kLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQdHJOZXdSYW5nZVBvaW50Tm9kZSIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdGFydCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbmQpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKCnN0YXRpYyBpbnQKdGVzdF94bWxYUHRyTmV3UmFuZ2VQb2ludHModm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUFRSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sWFBhdGhPYmplY3RQdHIgc3RhcnQ7IC8qIHRoZSBzdGFydGluZyBwb2ludCAqLwogICAgaW50IG5fc3RhcnQ7CiAgICB4bWxYUGF0aE9iamVjdFB0ciBlbmQ7IC8qIHRoZSBlbmRpbmcgcG9pbnQgKi8KICAgIGludCBuX2VuZDsKCiAgICBmb3IgKG5fc3RhcnQgPSAwO25fc3RhcnQgPCBnZW5fbmJfeG1sWFBhdGhPYmplY3RQdHI7bl9zdGFydCsrKSB7CiAgICBmb3IgKG5fZW5kID0gMDtuX2VuZCA8IGdlbl9uYl94bWxYUGF0aE9iamVjdFB0cjtuX2VuZCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBzdGFydCA9IGdlbl94bWxYUGF0aE9iamVjdFB0cihuX3N0YXJ0LCAwKTsKICAgICAgICBlbmQgPSBnZW5feG1sWFBhdGhPYmplY3RQdHIobl9lbmQsIDEpOwoKICAgICAgICByZXRfdmFsID0geG1sWFB0ck5ld1JhbmdlUG9pbnRzKHN0YXJ0LCBlbmQpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbFhQYXRoT2JqZWN0UHRyKG5fc3RhcnQsIHN0YXJ0LCAwKTsKICAgICAgICBkZXNfeG1sWFBhdGhPYmplY3RQdHIobl9lbmQsIGVuZCwgMSk7CiAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUHRyTmV3UmFuZ2VQb2ludHMiLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RhcnQpOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5kKTsKICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiNlbmRpZgoKICAgIHJldHVybih0ZXN0X3JldCk7Cn0KCgpzdGF0aWMgaW50CnRlc3RfeG1sWFB0clJhbmdlVG9GdW5jdGlvbih2b2lkKSB7CiAgICBpbnQgdGVzdF9yZXQgPSAwOwoKI2lmIGRlZmluZWQoTElCWE1MX1hQVFJfRU5BQkxFRCkKICAgIGludCBtZW1fYmFzZTsKICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBvaW50ZXIgUGFyc2VyIGNvbnRleHQgKi8KICAgIGludCBuX2N0eHQ7CiAgICBpbnQgbmFyZ3M7IC8qIHRoZSBudW1iZXIgb2YgYXJncyAqLwogICAgaW50IG5fbmFyZ3M7CgogICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHI7bl9jdHh0KyspIHsKICAgIGZvciAobl9uYXJncyA9IDA7bl9uYXJncyA8IGdlbl9uYl9pbnQ7bl9uYXJncysrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoUGFyc2VyQ29udGV4dFB0cihuX2N0eHQsIDApOwogICAgICAgIG5hcmdzID0gZ2VuX2ludChuX25hcmdzLCAxKTsKCiAgICAgICAgeG1sWFB0clJhbmdlVG9GdW5jdGlvbihjdHh0LCBuYXJncyk7CiAgICAgICAgY2FsbF90ZXN0cysrOwogICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKICAgICAgICBkZXNfaW50KG5fbmFyZ3MsIG5hcmdzLCAxKTsKICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOwogICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgewogICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQdHJSYW5nZVRvRnVuY3Rpb24iLAoJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKCSAgICB0ZXN0X3JldCsrOwogICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICB9CiAgICB9CiAgICBmdW5jdGlvbl90ZXN0cysrOwojZW5kaWYKCiAgICByZXR1cm4odGVzdF9yZXQpOwp9CgoKc3RhdGljIGludAp0ZXN0X3htbFhQdHJXcmFwTG9jYXRpb25TZXQodm9pZCkgewogICAgaW50IHRlc3RfcmV0ID0gMDsKCiNpZiBkZWZpbmVkKExJQlhNTF9YUFRSX0VOQUJMRUQpCiAgICBpbnQgbWVtX2Jhc2U7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOwogICAgeG1sTG9jYXRpb25TZXRQdHIgdmFsOyAvKiB0aGUgTG9jYXRpb25TZXQgdmFsdWUgKi8KICAgIGludCBuX3ZhbDsKCiAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxMb2NhdGlvblNldFB0cjtuX3ZhbCsrKSB7CiAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKICAgICAgICB2YWwgPSBnZW5feG1sTG9jYXRpb25TZXRQdHIobl92YWwsIDApOwoKICAgICAgICByZXRfdmFsID0geG1sWFB0cldyYXBMb2NhdGlvblNldCh2YWwpOwogICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKICAgICAgICBjYWxsX3Rlc3RzKys7CiAgICAgICAgZGVzX3htbExvY2F0aW9uU2V0UHRyKG5fdmFsLCB2YWwsIDApOwogICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CiAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CiAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFB0cldyYXBMb2NhdGlvblNldCIsCgkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOwoJICAgIHRlc3RfcmV0Kys7CiAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOwogICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb25fdGVzdHMrKzsKI2VuZGlmCgogICAgcmV0dXJuKHRlc3RfcmV0KTsKfQoKc3RhdGljIGludAp0ZXN0X3hwb2ludGVyKHZvaWQpIHsKICAgIGludCB0ZXN0X3JldCA9IDA7CgogICAgaWYgKHF1aWV0ID09IDApIHByaW50ZigiVGVzdGluZyB4cG9pbnRlciA6IDE3IG9mIDIxIGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUHRyQnVpbGROb2RlTGlzdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUHRyRXZhbCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUHRyRXZhbFJhbmdlUHJlZGljYXRlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQdHJMb2NhdGlvblNldEFkZCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUHRyTG9jYXRpb25TZXRDcmVhdGUoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFB0ckxvY2F0aW9uU2V0RGVsKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQdHJMb2NhdGlvblNldE1lcmdlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQdHJMb2NhdGlvblNldFJlbW92ZSgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUHRyTmV3Q29sbGFwc2VkUmFuZ2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFB0ck5ld0NvbnRleHQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFB0ck5ld0xvY2F0aW9uU2V0Tm9kZVNldCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUHRyTmV3TG9jYXRpb25TZXROb2RlcygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUHRyTmV3UmFuZ2UoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFB0ck5ld1JhbmdlTm9kZU9iamVjdCgpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUHRyTmV3UmFuZ2VOb2RlUG9pbnQoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFB0ck5ld1JhbmdlTm9kZXMoKTsKICAgIHRlc3RfcmV0ICs9IHRlc3RfeG1sWFB0ck5ld1JhbmdlUG9pbnROb2RlKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQdHJOZXdSYW5nZVBvaW50cygpOwogICAgdGVzdF9yZXQgKz0gdGVzdF94bWxYUHRyUmFuZ2VUb0Z1bmN0aW9uKCk7CiAgICB0ZXN0X3JldCArPSB0ZXN0X3htbFhQdHJXcmFwTG9jYXRpb25TZXQoKTsKCiAgICBpZiAodGVzdF9yZXQgIT0gMCkKCXByaW50ZigiTW9kdWxlIHhwb2ludGVyOiAlZCBlcnJvcnNcbiIsIHRlc3RfcmV0KTsKICAgIHJldHVybih0ZXN0X3JldCk7Cn0Kc3RhdGljIGludAp0ZXN0X21vZHVsZShjb25zdCBjaGFyICptb2R1bGUpIHsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgIkhUTUxwYXJzZXIiKSkgcmV0dXJuKHRlc3RfSFRNTHBhcnNlcigpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgIkhUTUx0cmVlIikpIHJldHVybih0ZXN0X0hUTUx0cmVlKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAiU0FYMiIpKSByZXR1cm4odGVzdF9TQVgyKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAiYzE0biIpKSByZXR1cm4odGVzdF9jMTRuKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAiY2F0YWxvZyIpKSByZXR1cm4odGVzdF9jYXRhbG9nKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAiY2h2YWxpZCIpKSByZXR1cm4odGVzdF9jaHZhbGlkKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAiZGVidWdYTUwiKSkgcmV0dXJuKHRlc3RfZGVidWdYTUwoKSk7CiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJkaWN0IikpIHJldHVybih0ZXN0X2RpY3QoKSk7CiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJlbmNvZGluZyIpKSByZXR1cm4odGVzdF9lbmNvZGluZygpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgImVudGl0aWVzIikpIHJldHVybih0ZXN0X2VudGl0aWVzKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAiaGFzaCIpKSByZXR1cm4odGVzdF9oYXNoKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAibGlzdCIpKSByZXR1cm4odGVzdF9saXN0KCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAibmFub2Z0cCIpKSByZXR1cm4odGVzdF9uYW5vZnRwKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAibmFub2h0dHAiKSkgcmV0dXJuKHRlc3RfbmFub2h0dHAoKSk7CiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJwYXJzZXIiKSkgcmV0dXJuKHRlc3RfcGFyc2VyKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAicGFyc2VySW50ZXJuYWxzIikpIHJldHVybih0ZXN0X3BhcnNlckludGVybmFscygpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInBhdHRlcm4iKSkgcmV0dXJuKHRlc3RfcGF0dGVybigpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInJlbGF4bmciKSkgcmV0dXJuKHRlc3RfcmVsYXhuZygpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInNjaGVtYXNJbnRlcm5hbHMiKSkgcmV0dXJuKHRlc3Rfc2NoZW1hc0ludGVybmFscygpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInNjaGVtYXRyb24iKSkgcmV0dXJuKHRlc3Rfc2NoZW1hdHJvbigpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInRyZWUiKSkgcmV0dXJuKHRlc3RfdHJlZSgpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInVyaSIpKSByZXR1cm4odGVzdF91cmkoKSk7CiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJ2YWxpZCIpKSByZXR1cm4odGVzdF92YWxpZCgpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInhpbmNsdWRlIikpIHJldHVybih0ZXN0X3hpbmNsdWRlKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAieG1sSU8iKSkgcmV0dXJuKHRlc3RfeG1sSU8oKSk7CiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJ4bWxhdXRvbWF0YSIpKSByZXR1cm4odGVzdF94bWxhdXRvbWF0YSgpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInhtbGVycm9yIikpIHJldHVybih0ZXN0X3htbGVycm9yKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAieG1sbW9kdWxlIikpIHJldHVybih0ZXN0X3htbG1vZHVsZSgpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInhtbHJlYWRlciIpKSByZXR1cm4odGVzdF94bWxyZWFkZXIoKSk7CiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJ4bWxyZWdleHAiKSkgcmV0dXJuKHRlc3RfeG1scmVnZXhwKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAieG1sc2F2ZSIpKSByZXR1cm4odGVzdF94bWxzYXZlKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAieG1sc2NoZW1hcyIpKSByZXR1cm4odGVzdF94bWxzY2hlbWFzKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAieG1sc2NoZW1hc3R5cGVzIikpIHJldHVybih0ZXN0X3htbHNjaGVtYXN0eXBlcygpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInhtbHN0cmluZyIpKSByZXR1cm4odGVzdF94bWxzdHJpbmcoKSk7CiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJ4bWx1bmljb2RlIikpIHJldHVybih0ZXN0X3htbHVuaWNvZGUoKSk7CiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJ4bWx3cml0ZXIiKSkgcmV0dXJuKHRlc3RfeG1sd3JpdGVyKCkpOwogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAieHBhdGgiKSkgcmV0dXJuKHRlc3RfeHBhdGgoKSk7CiAgICBpZiAoIXN0cmNtcChtb2R1bGUsICJ4cGF0aEludGVybmFscyIpKSByZXR1cm4odGVzdF94cGF0aEludGVybmFscygpKTsKICAgIGlmICghc3RyY21wKG1vZHVsZSwgInhwb2ludGVyIikpIHJldHVybih0ZXN0X3hwb2ludGVyKCkpOwogICAgcmV0dXJuKDApOwp9Cg==