LyoKICogcnVudGVzdC5jOiBDIHByb2dyYW0gdG8gcnVuIGxpYnhtbDIgcmVncmVzc2lvbiB0ZXN0cyB3aXRob3V0CiAqICAgICAgICAgICAgcmVxdWlyaW5nIG1ha2Ugb3IgUHl0aG9uLCBhbmQgcmVkdWNpbmcgcGxhdGZvcm0gZGVwZW5kYW5jaWVzCiAqICAgICAgICAgICAgdG8gYSBzdHJpY3QgbWluaW11bS4KICoKICogVG8gY29tcGlsZSBvbiBVbml4ZXM6CiAqIGNjIC1vIHJ1bnRlc3QgYHhtbDItY29uZmlnIC0tY2ZsYWdzYCBydW50ZXN0LmMgYHhtbDItY29uZmlnIC0tbGlic2AgLWxwdGhyZWFkCiAqCiAqIFNlZSBDb3B5cmlnaHQgZm9yIHRoZSBzdGF0dXMgb2YgdGhpcyBzb2Z0d2FyZS4KICoKICogZGFuaWVsQHZlaWxsYXJkLmNvbQogKi8KCiNpZmRlZiBIQVZFX0NPTkZJR19ICiNpbmNsdWRlICJsaWJ4bWwuaCIKI2Vsc2UKI2luY2x1ZGUgPHN0ZGlvLmg+CiNlbmRpZgoKI2lmICFkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxmY250bC5oPgoKI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KI2luY2x1ZGUgPGxpYnhtbC90cmVlLmg+CiNpbmNsdWRlIDxsaWJ4bWwvdXJpLmg+CgojaWZkZWYgTElCWE1MX09VVFBVVF9FTkFCTEVECiNpZmRlZiBMSUJYTUxfUkVBREVSX0VOQUJMRUQKI2luY2x1ZGUgPGxpYnhtbC94bWxyZWFkZXIuaD4KI2VuZGlmCgojaWZkZWYgTElCWE1MX1hJTkNMVURFX0VOQUJMRUQKI2luY2x1ZGUgPGxpYnhtbC94aW5jbHVkZS5oPgojZW5kaWYKCiNpZmRlZiBMSUJYTUxfWFBBVEhfRU5BQkxFRAojaW5jbHVkZSA8bGlieG1sL3hwYXRoLmg+CiNpbmNsdWRlIDxsaWJ4bWwveHBhdGhJbnRlcm5hbHMuaD4KI2lmZGVmIExJQlhNTF9YUFRSX0VOQUJMRUQKI2luY2x1ZGUgPGxpYnhtbC94cG9pbnRlci5oPgojZW5kaWYKI2VuZGlmCgojaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAojaW5jbHVkZSA8bGlieG1sL3JlbGF4bmcuaD4KI2luY2x1ZGUgPGxpYnhtbC94bWxzY2hlbWFzLmg+CiNpbmNsdWRlIDxsaWJ4bWwveG1sc2NoZW1hc3R5cGVzLmg+CiNlbmRpZgoKI2lmZGVmIExJQlhNTF9QQVRURVJOX0VOQUJMRUQKI2luY2x1ZGUgPGxpYnhtbC9wYXR0ZXJuLmg+CiNlbmRpZgoKI2lmZGVmIExJQlhNTF9DMTROX0VOQUJMRUQKI2luY2x1ZGUgPGxpYnhtbC9jMTRuLmg+CiNlbmRpZgoKI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKI2luY2x1ZGUgPGxpYnhtbC9IVE1McGFyc2VyLmg+CiNpbmNsdWRlIDxsaWJ4bWwvSFRNTHRyZWUuaD4KCi8qCiAqIHBzZXVkbyBmbGFnIGZvciB0aGUgdW5pZmljYXRpb24gb2YgSFRNTCBhbmQgWE1MIHRlc3RzCiAqLwojZGVmaW5lIFhNTF9QQVJTRV9IVE1MIDEgPDwgMjQKI2VuZGlmCgojaWYgZGVmaW5lZChMSUJYTUxfVEhSRUFEX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKI2luY2x1ZGUgPGxpYnhtbC9nbG9iYWxzLmg+CiNpbmNsdWRlIDxsaWJ4bWwvdGhyZWFkcy5oPgojaW5jbHVkZSA8bGlieG1sL3BhcnNlci5oPgojaW5jbHVkZSA8bGlieG1sL2NhdGFsb2cuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojZW5kaWYKCi8qCiAqIE9fQklOQVJZIGlzIGp1c3QgZm9yIFdpbmRvd3MgY29tcGF0aWJpbGl0eSAtIGlmIGl0IGlzbid0IGRlZmluZWQKICogb24gdGhpcyBzeXN0ZW0sIGF2b2lkIGFueSBjb21waWxhdGlvbiBlcnJvcgogKi8KI2lmZGVmCU9fQklOQVJZCiNkZWZpbmUgUkRfRkxBR1MJT19SRE9OTFkgfCBPX0JJTkFSWQojZWxzZQojZGVmaW5lCVJEX0ZMQUdTCU9fUkRPTkxZCiNlbmRpZgoKdHlwZWRlZiBpbnQgKCpmdW5jdGVzdCkgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpyZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvciwgaW50IG9wdGlvbnMpOwoKdHlwZWRlZiBzdHJ1Y3QgdGVzdERlc2MgdGVzdERlc2M7CnR5cGVkZWYgdGVzdERlc2MgKnRlc3REZXNjUHRyOwpzdHJ1Y3QgdGVzdERlc2MgewogICAgY29uc3QgY2hhciAqZGVzYzsgLyogZGVzY3JpcHRvbiBvZiB0aGUgdGVzdCAqLwogICAgZnVuY3Rlc3QgICAgZnVuYzsgLyogZnVuY3Rpb24gaW1wbGVtZW50aW5nIHRoZSB0ZXN0ICovCiAgICBjb25zdCBjaGFyICppbjsgICAvKiBnbG9iIHRvIHBhdGggZm9yIGlucHV0IGZpbGVzICovCiAgICBjb25zdCBjaGFyICpvdXQ7ICAvKiBvdXRwdXQgZGlyZWN0b3J5ICovCiAgICBjb25zdCBjaGFyICpzdWZmaXg7Lyogc3VmZml4IGZvciBvdXRwdXQgZmlsZXMgKi8KICAgIGNvbnN0IGNoYXIgKmVycjsgIC8qIHN1ZmZpeCBmb3IgZXJyb3Igb3V0cHV0IGZpbGVzICovCiAgICBpbnQgICAgIG9wdGlvbnM7ICAvKiBwYXJzZXIgb3B0aW9ucyBmb3IgdGhlIHRlc3QgKi8KfTsKCnN0YXRpYyBpbnQgY2hlY2tUZXN0RmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CgojaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCgojaW5jbHVkZSA8d2luZG93cy5oPgojaW5jbHVkZSA8aW8uaD4KCnR5cGVkZWYgc3RydWN0CnsKICAgICAgc2l6ZV90IGdsX3BhdGhjOyAgICAvKiBDb3VudCBvZiBwYXRocyBtYXRjaGVkIHNvIGZhciAgKi8KICAgICAgY2hhciAqKmdsX3BhdGh2OyAgICAvKiBMaXN0IG9mIG1hdGNoZWQgcGF0aG5hbWVzLiAgKi8KICAgICAgc2l6ZV90IGdsX29mZnM7ICAgICAvKiBTbG90cyB0byByZXNlcnZlIGluICdnbF9wYXRodicuICAqLwp9IGdsb2JfdDsKCiNkZWZpbmUgR0xPQl9ET09GRlMgMApzdGF0aWMgaW50IGdsb2IoY29uc3QgY2hhciAqcGF0dGVybiwgaW50IGZsYWdzLAogICAgICAgICAgICAgICAgaW50IGVycmZ1bmMoY29uc3QgY2hhciAqZXBhdGgsIGludCBlZXJybm8pLAogICAgICAgICAgICAgICAgZ2xvYl90ICpwZ2xvYikgewogICAgZ2xvYl90ICpyZXQ7CiAgICBXSU4zMl9GSU5EX0RBVEEgRmluZEZpbGVEYXRhOwogICAgSEFORExFIGhGaW5kOwogICAgdW5zaWduZWQgaW50IG5iX3BhdGhzID0gMDsKICAgIGNoYXIgZGlyZWN0b3J5WzUwMF07CiAgICBpbnQgbGVuOwoKICAgIGlmICgocGF0dGVybiA9PSBOVUxMKSB8fCAocGdsb2IgPT0gTlVMTCkpIHJldHVybigtMSk7CiAgICAKICAgIHN0cm5jcHkoZGlyZWN0b3J5LCBwYXR0ZXJuLCA0OTkpOwogICAgZm9yIChsZW4gPSBzdHJsZW4oZGlyZWN0b3J5KTtsZW4gPj0gMDtsZW4tLSkgewogICAgICAgIGlmIChkaXJlY3RvcnlbbGVuXSA9PSAnLycpIHsKCSAgICBsZW4rKzsKCSAgICBkaXJlY3RvcnlbbGVuXSA9IDA7CgkgICAgYnJlYWs7Cgl9CiAgICB9CiAgICBpZiAobGVuIDw9IDApCiAgICAgICAgbGVuID0gMDsKCiAgICAKICAgIHJldCA9IHBnbG9iOwogICAgbWVtc2V0KHJldCwgMCwgc2l6ZW9mKGdsb2JfdCkpOwogICAgCiAgICBoRmluZCA9IEZpbmRGaXJzdEZpbGVBKHBhdHRlcm4sICZGaW5kRmlsZURhdGEpOwogICAgaWYgKGhGaW5kID09IElOVkFMSURfSEFORExFX1ZBTFVFKSAKICAgICAgICByZXR1cm4oMCk7CiAgICBuYl9wYXRocyA9IDIwOwogICAgcmV0LT5nbF9wYXRodiA9IChjaGFyICoqKSBtYWxsb2MobmJfcGF0aHMgKiBzaXplb2YoY2hhciAqKSk7CiAgICBpZiAocmV0LT5nbF9wYXRodiA9PSBOVUxMKSB7CglGaW5kQ2xvc2UoaEZpbmQpOwogICAgICAgIHJldHVybigtMSk7CiAgICB9CiAgICBzdHJuY3B5KGRpcmVjdG9yeSArIGxlbiwgRmluZEZpbGVEYXRhLmNGaWxlTmFtZSwgNDk5IC0gbGVuKTsKICAgIHJldC0+Z2xfcGF0aHZbcmV0LT5nbF9wYXRoY10gPSBzdHJkdXAoZGlyZWN0b3J5KTsKICAgIGlmIChyZXQtPmdsX3BhdGh2W3JldC0+Z2xfcGF0aGNdID09IE5VTEwpCiAgICAgICAgZ290byBkb25lOwogICAgcmV0LT5nbF9wYXRoYysrOwogICAgd2hpbGUoRmluZE5leHRGaWxlQShoRmluZCwgJkZpbmRGaWxlRGF0YSkpIHsKICAgICAgICBpZiAoRmluZEZpbGVEYXRhLmNGaWxlTmFtZVswXSA9PSAnLicpCgkgICAgY29udGludWU7CiAgICAgICAgaWYgKHJldC0+Z2xfcGF0aGMgKyAyID4gbmJfcGF0aHMpIHsKICAgICAgICAgICAgY2hhciAqKnRtcCA9IHJlYWxsb2MocmV0LT5nbF9wYXRodiwgbmJfcGF0aHMgKiAyICogc2l6ZW9mKGNoYXIgKikpOwogICAgICAgICAgICBpZiAodG1wID09IE5VTEwpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgcmV0LT5nbF9wYXRodiA9IHRtcDsKICAgICAgICAgICAgbmJfcGF0aHMgKj0gMjsKCX0KCXN0cm5jcHkoZGlyZWN0b3J5ICsgbGVuLCBGaW5kRmlsZURhdGEuY0ZpbGVOYW1lLCA0OTkgLSBsZW4pOwoJcmV0LT5nbF9wYXRodltyZXQtPmdsX3BhdGhjXSA9IHN0cmR1cChkaXJlY3RvcnkpOwogICAgICAgIGlmIChyZXQtPmdsX3BhdGh2W3JldC0+Z2xfcGF0aGNdID09IE5VTEwpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIHJldC0+Z2xfcGF0aGMrKzsKICAgIH0KICAgIHJldC0+Z2xfcGF0aHZbcmV0LT5nbF9wYXRoY10gPSBOVUxMOwoKZG9uZToKICAgIEZpbmRDbG9zZShoRmluZCk7CiAgICByZXR1cm4oMCk7Cn0KIAoKCnN0YXRpYyB2b2lkIGdsb2JmcmVlKGdsb2JfdCAqcGdsb2IpIHsKICAgIHVuc2lnbmVkIGludCBpOwogICAgaWYgKHBnbG9iID09IE5VTEwpCiAgICAgICAgcmV0dXJuOwogICAgCiAgICBmb3IgKGkgPSAwO2kgPCBwZ2xvYi0+Z2xfcGF0aGM7aSsrKSB7CiAgICAgICAgIGlmIChwZ2xvYi0+Z2xfcGF0aHZbaV0gIT0gTlVMTCkKICAgICAgICAgICAgIGZyZWUocGdsb2ItPmdsX3BhdGh2W2ldKTsKICAgIH0KfQojZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCiNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCiNlbHNlCiNpbmNsdWRlIDxnbG9iLmg+CiNlbmRpZgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQkJCQkJCSoKICoJCUxpYnhtbDIgc3BlY2lmaWMgcm91dGluZXMJCQkJKgogKgkJCQkJCQkJCSoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBpbnQgbmJfdGVzdHMgPSAwOwpzdGF0aWMgaW50IG5iX2Vycm9ycyA9IDA7CnN0YXRpYyBpbnQgbmJfbGVha3MgPSAwOwpzdGF0aWMgaW50IGV4dHJhTWVtb3J5RnJvbVJlc29sdmVyID0gMDsKCnN0YXRpYyBpbnQKZmF0YWxFcnJvcih2b2lkKSB7CiAgICBmcHJpbnRmKHN0ZGVyciwgIkV4aXR0aW5nIHRlc3RzIG9uIGZhdGFsIGVycm9yXG4iKTsKICAgIGV4aXQoMSk7Cn0KCi8qCiAqIFdlIG5lZWQgdG8gdHJhcCBjYWxscyB0byB0aGUgcmVzb2x2ZXIgdG8gbm90IGFjY291bnQgbWVtb3J5IGZvciB0aGUgY2F0YWxvZwogKiB3aGljaCBpcyBzaGFyZWQgdG8gdGhlIGN1cnJlbnQgcnVubmluZyB0ZXN0LiBXZSBhbHNvIGRvbid0IHdhbnQgdG8gaGF2ZQogKiBuZXR3b3JrIGRvd25sb2FkcyBtb2RpZnlpbmcgdGVzdHMuCiAqLwpzdGF0aWMgeG1sUGFyc2VySW5wdXRQdHIgCnRlc3RFeHRlcm5hbEVudGl0eUxvYWRlcihjb25zdCBjaGFyICpVUkwsIGNvbnN0IGNoYXIgKklELAoJCQkgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0KSB7CiAgICB4bWxQYXJzZXJJbnB1dFB0ciByZXQ7CgogICAgaWYgKGNoZWNrVGVzdEZpbGUoVVJMKSkgewoJcmV0ID0geG1sTm9OZXRFeHRlcm5hbEVudGl0eUxvYWRlcihVUkwsIElELCBjdHh0KTsKICAgIH0gZWxzZSB7CglpbnQgbWVtdXNlZCA9IHhtbE1lbVVzZWQoKTsKCXJldCA9IHhtbE5vTmV0RXh0ZXJuYWxFbnRpdHlMb2FkZXIoVVJMLCBJRCwgY3R4dCk7CglleHRyYU1lbW9yeUZyb21SZXNvbHZlciArPSB4bWxNZW1Vc2VkKCkgLSBtZW11c2VkOwogICAgfQogICAgICAKICAgIHJldHVybihyZXQpOwp9CgovKgogKiBUcmFwcGluZyB0aGUgZXJyb3IgbWVzc2FnZXMgYXQgdGhlIGdlbmVyaWMgbGV2ZWwgdG8gZ3JhYiB0aGUgZXF1aXZhbGVudCBvZgogKiBzdGRlcnIgbWVzc2FnZXMgb24gQ0xJIHRvb2xzLgogKi8Kc3RhdGljIGNoYXIgdGVzdEVycm9yc1szMjc2OV07CnN0YXRpYyBpbnQgdGVzdEVycm9yc1NpemUgPSAwOwoKc3RhdGljIHZvaWQgWE1MQ0RFQ0wKdGVzdEVycm9ySGFuZGxlcih2b2lkICpjdHggIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IGNoYXIgKm1zZywgLi4uKSB7CiAgICB2YV9saXN0IGFyZ3M7CiAgICBpbnQgcmVzOwoKICAgIGlmICh0ZXN0RXJyb3JzU2l6ZSA+PSAzMjc2OCkKICAgICAgICByZXR1cm47CiAgICB2YV9zdGFydChhcmdzLCBtc2cpOwogICAgcmVzID0gdnNucHJpbnRmKCZ0ZXN0RXJyb3JzW3Rlc3RFcnJvcnNTaXplXSwKICAgICAgICAgICAgICAgICAgICAzMjc2OCAtIHRlc3RFcnJvcnNTaXplLAoJCSAgICBtc2csIGFyZ3MpOwogICAgdmFfZW5kKGFyZ3MpOwogICAgaWYgKHRlc3RFcnJvcnNTaXplICsgcmVzID49IDMyNzY4KSB7CiAgICAgICAgLyogYnVmZmVyIGlzIGZ1bGwgKi8KCXRlc3RFcnJvcnNTaXplID0gMzI3Njg7Cgl0ZXN0RXJyb3JzW3Rlc3RFcnJvcnNTaXplXSA9IDA7CiAgICB9IGVsc2UgewogICAgICAgIHRlc3RFcnJvcnNTaXplICs9IHJlczsKICAgIH0KICAgIHRlc3RFcnJvcnNbdGVzdEVycm9yc1NpemVdID0gMDsKfQoKc3RhdGljIHZvaWQgWE1MQ0RFQ0wKY2hhbm5lbCh2b2lkICpjdHggIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IGNoYXIgKm1zZywgLi4uKSB7CiAgICB2YV9saXN0IGFyZ3M7CiAgICBpbnQgcmVzOwoKICAgIGlmICh0ZXN0RXJyb3JzU2l6ZSA+PSAzMjc2OCkKICAgICAgICByZXR1cm47CiAgICB2YV9zdGFydChhcmdzLCBtc2cpOwogICAgcmVzID0gdnNucHJpbnRmKCZ0ZXN0RXJyb3JzW3Rlc3RFcnJvcnNTaXplXSwKICAgICAgICAgICAgICAgICAgICAzMjc2OCAtIHRlc3RFcnJvcnNTaXplLAoJCSAgICBtc2csIGFyZ3MpOwogICAgdmFfZW5kKGFyZ3MpOwogICAgaWYgKHRlc3RFcnJvcnNTaXplICsgcmVzID49IDMyNzY4KSB7CiAgICAgICAgLyogYnVmZmVyIGlzIGZ1bGwgKi8KCXRlc3RFcnJvcnNTaXplID0gMzI3Njg7Cgl0ZXN0RXJyb3JzW3Rlc3RFcnJvcnNTaXplXSA9IDA7CiAgICB9IGVsc2UgewogICAgICAgIHRlc3RFcnJvcnNTaXplICs9IHJlczsKICAgIH0KICAgIHRlc3RFcnJvcnNbdGVzdEVycm9yc1NpemVdID0gMDsKfQoKLyoqCiAqIHhtbFBhcnNlclByaW50RmlsZUNvbnRleHQ6CiAqIEBpbnB1dDogIGFuIHhtbFBhcnNlcklucHV0UHRyIGlucHV0CiAqIAogKiBEaXNwbGF5cyBjdXJyZW50IGNvbnRleHQgd2l0aGluIHRoZSBpbnB1dCBjb250ZW50IGZvciBlcnJvciB0cmFja2luZwogKi8KCnN0YXRpYyB2b2lkCnhtbFBhcnNlclByaW50RmlsZUNvbnRleHRJbnRlcm5hbCh4bWxQYXJzZXJJbnB1dFB0ciBpbnB1dCAsIAoJCXhtbEdlbmVyaWNFcnJvckZ1bmMgY2hhbmwsIHZvaWQgKmRhdGEgKSB7CiAgICBjb25zdCB4bWxDaGFyICpjdXIsICpiYXNlOwogICAgdW5zaWduZWQgaW50IG4sIGNvbDsJLyogR0NDIHdhcm5zIGlmIHNpZ25lZCwgYmVjYXVzZSBjb21wYXJlZCB3aXRoIHNpemVvZigpICovCiAgICB4bWxDaGFyICBjb250ZW50WzgxXTsgLyogc3BhY2UgZm9yIDgwIGNoYXJzICsgbGluZSB0ZXJtaW5hdG9yICovCiAgICB4bWxDaGFyICpjdG50OwoKICAgIGlmIChpbnB1dCA9PSBOVUxMKSByZXR1cm47CiAgICBjdXIgPSBpbnB1dC0+Y3VyOwogICAgYmFzZSA9IGlucHV0LT5iYXNlOwogICAgLyogc2tpcCBiYWNrd2FyZHMgb3ZlciBhbnkgZW5kLW9mLWxpbmVzICovCiAgICB3aGlsZSAoKGN1ciA+IGJhc2UpICYmICgoKihjdXIpID09ICdcbicpIHx8ICgqKGN1cikgPT0gJ1xyJykpKSB7CgljdXItLTsKICAgIH0KICAgIG4gPSAwOwogICAgLyogc2VhcmNoIGJhY2t3YXJkcyBmb3IgYmVnaW5uaW5nLW9mLWxpbmUgKHRvIG1heCBidWZmIHNpemUpICovCiAgICB3aGlsZSAoKG4rKyA8IChzaXplb2YoY29udGVudCktMSkpICYmIChjdXIgPiBiYXNlKSAmJiAKICAgIAkgICAoKihjdXIpICE9ICdcbicpICYmICgqKGN1cikgIT0gJ1xyJykpCiAgICAgICAgY3VyLS07CiAgICBpZiAoKCooY3VyKSA9PSAnXG4nKSB8fCAoKihjdXIpID09ICdccicpKSBjdXIrKzsKICAgIC8qIGNhbGN1bGF0ZSB0aGUgZXJyb3IgcG9zaXRpb24gaW4gdGVybXMgb2YgdGhlIGN1cnJlbnQgcG9zaXRpb24gKi8KICAgIGNvbCA9IGlucHV0LT5jdXIgLSBjdXI7CiAgICAvKiBzZWFyY2ggZm9yd2FyZCBmb3IgZW5kLW9mLWxpbmUgKHRvIG1heCBidWZmIHNpemUpICovCiAgICBuID0gMDsKICAgIGN0bnQgPSBjb250ZW50OwogICAgLyogY29weSBzZWxlY3RlZCB0ZXh0IHRvIG91ciBidWZmZXIgKi8KICAgIHdoaWxlICgoKmN1ciAhPSAwKSAmJiAoKihjdXIpICE9ICdcbicpICYmIAogICAgCSAgICgqKGN1cikgIT0gJ1xyJykgJiYgKG4gPCBzaXplb2YoY29udGVudCktMSkpIHsKCQkqY3RudCsrID0gKmN1cisrOwoJbisrOwogICAgfQogICAgKmN0bnQgPSAwOwogICAgLyogcHJpbnQgb3V0IHRoZSBzZWxlY3RlZCB0ZXh0ICovCiAgICBjaGFubChkYXRhICwiJXNcbiIsIGNvbnRlbnQpOwogICAgLyogY3JlYXRlIGJsYW5rIGxpbmUgd2l0aCBwcm9ibGVtIHBvaW50ZXIgKi8KICAgIG4gPSAwOwogICAgY3RudCA9IGNvbnRlbnQ7CiAgICAvKiAobGVhdmUgYnVmZmVyIHNwYWNlIGZvciBwb2ludGVyICsgbGluZSB0ZXJtaW5hdG9yKSAqLwogICAgd2hpbGUgKChuPGNvbCkgJiYgKG4rKyA8IHNpemVvZihjb250ZW50KS0yKSAmJiAoKmN0bnQgIT0gMCkpIHsKCWlmICgqKGN0bnQpICE9ICdcdCcpCgkgICAgKihjdG50KSA9ICcgJzsKCWN0bnQrKzsKICAgIH0KICAgICpjdG50KysgPSAnXic7CiAgICAqY3RudCA9IDA7CiAgICBjaGFubChkYXRhICwiJXNcbiIsIGNvbnRlbnQpOwp9CgpzdGF0aWMgdm9pZAp0ZXN0U3RydWN0dXJlZEVycm9ySGFuZGxlcih2b2lkICpjdHggIEFUVFJJQlVURV9VTlVTRUQsIHhtbEVycm9yUHRyIGVycikgewogICAgY2hhciAqZmlsZSA9IE5VTEw7CiAgICBpbnQgbGluZSA9IDA7CiAgICBpbnQgY29kZSA9IC0xOwogICAgaW50IGRvbWFpbjsKICAgIHZvaWQgKmRhdGEgPSBOVUxMOwogICAgY29uc3QgY2hhciAqc3RyOwogICAgY29uc3QgeG1sQ2hhciAqbmFtZSA9IE5VTEw7CiAgICB4bWxOb2RlUHRyIG5vZGU7CiAgICB4bWxFcnJvckxldmVsIGxldmVsOwogICAgeG1sUGFyc2VySW5wdXRQdHIgaW5wdXQgPSBOVUxMOwogICAgeG1sUGFyc2VySW5wdXRQdHIgY3VyID0gTlVMTDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dCA9IE5VTEw7CgogICAgaWYgKGVyciA9PSBOVUxMKQogICAgICAgIHJldHVybjsKCiAgICBmaWxlID0gZXJyLT5maWxlOwogICAgbGluZSA9IGVyci0+bGluZTsKICAgIGNvZGUgPSBlcnItPmNvZGU7CiAgICBkb21haW4gPSBlcnItPmRvbWFpbjsKICAgIGxldmVsID0gZXJyLT5sZXZlbDsKICAgIG5vZGUgPSBlcnItPm5vZGU7CiAgICBpZiAoKGRvbWFpbiA9PSBYTUxfRlJPTV9QQVJTRVIpIHx8IChkb21haW4gPT0gWE1MX0ZST01fSFRNTCkgfHwKICAgICAgICAoZG9tYWluID09IFhNTF9GUk9NX0RURCkgfHwgKGRvbWFpbiA9PSBYTUxfRlJPTV9OQU1FU1BBQ0UpIHx8CgkoZG9tYWluID09IFhNTF9GUk9NX0lPKSB8fCAoZG9tYWluID09IFhNTF9GUk9NX1ZBTElEKSkgewoJY3R4dCA9IGVyci0+Y3R4dDsKICAgIH0KICAgIHN0ciA9IGVyci0+bWVzc2FnZTsKCiAgICBpZiAoY29kZSA9PSBYTUxfRVJSX09LKQogICAgICAgIHJldHVybjsKCiAgICBpZiAoKG5vZGUgIT0gTlVMTCkgJiYgKG5vZGUtPnR5cGUgPT0gWE1MX0VMRU1FTlRfTk9ERSkpCiAgICAgICAgbmFtZSA9IG5vZGUtPm5hbWU7CgogICAgLyoKICAgICAqIE1haW50YWluIHRoZSBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGxlZ2FjeSBlcnJvciBoYW5kbGluZwogICAgICovCiAgICBpZiAoY3R4dCAhPSBOVUxMKSB7CiAgICAgICAgaW5wdXQgPSBjdHh0LT5pbnB1dDsKICAgICAgICBpZiAoKGlucHV0ICE9IE5VTEwpICYmIChpbnB1dC0+ZmlsZW5hbWUgPT0gTlVMTCkgJiYKICAgICAgICAgICAgKGN0eHQtPmlucHV0TnIgPiAxKSkgewogICAgICAgICAgICBjdXIgPSBpbnB1dDsKICAgICAgICAgICAgaW5wdXQgPSBjdHh0LT5pbnB1dFRhYltjdHh0LT5pbnB1dE5yIC0gMl07CiAgICAgICAgfQogICAgICAgIGlmIChpbnB1dCAhPSBOVUxMKSB7CiAgICAgICAgICAgIGlmIChpbnB1dC0+ZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBjaGFubmVsKGRhdGEsICIlczolZDogIiwgaW5wdXQtPmZpbGVuYW1lLCBpbnB1dC0+bGluZSk7CiAgICAgICAgICAgIGVsc2UgaWYgKChsaW5lICE9IDApICYmIChkb21haW4gPT0gWE1MX0ZST01fUEFSU0VSKSkKICAgICAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIkVudGl0eTogbGluZSAlZDogIiwgaW5wdXQtPmxpbmUpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGZpbGUgIT0gTlVMTCkKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiJXM6JWQ6ICIsIGZpbGUsIGxpbmUpOwogICAgICAgIGVsc2UgaWYgKChsaW5lICE9IDApICYmIChkb21haW4gPT0gWE1MX0ZST01fUEFSU0VSKSkKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiRW50aXR5OiBsaW5lICVkOiAiLCBsaW5lKTsKICAgIH0KICAgIGlmIChuYW1lICE9IE5VTEwpIHsKICAgICAgICBjaGFubmVsKGRhdGEsICJlbGVtZW50ICVzOiAiLCBuYW1lKTsKICAgIH0KICAgIGlmIChjb2RlID09IFhNTF9FUlJfT0spCiAgICAgICAgcmV0dXJuOwogICAgc3dpdGNoIChkb21haW4pIHsKICAgICAgICBjYXNlIFhNTF9GUk9NX1BBUlNFUjoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAicGFyc2VyICIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFhNTF9GUk9NX05BTUVTUEFDRToKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAibmFtZXNwYWNlICIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFhNTF9GUk9NX0RURDoKICAgICAgICBjYXNlIFhNTF9GUk9NX1ZBTElEOgogICAgICAgICAgICBjaGFubmVsKGRhdGEsICJ2YWxpZGl0eSAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9IVE1MOgogICAgICAgICAgICBjaGFubmVsKGRhdGEsICJIVE1MIHBhcnNlciAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9NRU1PUlk6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIm1lbW9yeSAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9PVVRQVVQ6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIm91dHB1dCAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9JTzoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiSS9PICIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFhNTF9GUk9NX1hJTkNMVURFOgogICAgICAgICAgICBjaGFubmVsKGRhdGEsICJYSW5jbHVkZSAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9YUEFUSDoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiWFBhdGggIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0ZST01fWFBPSU5URVI6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgInBhcnNlciAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9SRUdFWFA6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgInJlZ2V4cCAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9NT0RVTEU6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIm1vZHVsZSAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9TQ0hFTUFTVjoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiU2NoZW1hcyB2YWxpZGl0eSAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9TQ0hFTUFTUDoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiU2NoZW1hcyBwYXJzZXIgIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0ZST01fUkVMQVhOR1A6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIlJlbGF4LU5HIHBhcnNlciAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9SRUxBWE5HVjoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiUmVsYXgtTkcgdmFsaWRpdHkgIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0ZST01fQ0FUQUxPRzoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiQ2F0YWxvZyAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9DMTROOgogICAgICAgICAgICBjaGFubmVsKGRhdGEsICJDMTROICIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFhNTF9GUk9NX1hTTFQ6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIlhTTFQgIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGNvZGUgPT0gWE1MX0VSUl9PSykKICAgICAgICByZXR1cm47CiAgICBzd2l0Y2ggKGxldmVsKSB7CiAgICAgICAgY2FzZSBYTUxfRVJSX05PTkU6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIjogIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0VSUl9XQVJOSU5HOgogICAgICAgICAgICBjaGFubmVsKGRhdGEsICJ3YXJuaW5nIDogIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0VSUl9FUlJPUjoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiZXJyb3IgOiAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRVJSX0ZBVEFMOgogICAgICAgICAgICBjaGFubmVsKGRhdGEsICJlcnJvciA6ICIpOwogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChjb2RlID09IFhNTF9FUlJfT0spCiAgICAgICAgcmV0dXJuOwogICAgaWYgKHN0ciAhPSBOVUxMKSB7CiAgICAgICAgaW50IGxlbjsKCWxlbiA9IHhtbFN0cmxlbigoY29uc3QgeG1sQ2hhciAqKXN0cik7CglpZiAoKGxlbiA+IDApICYmIChzdHJbbGVuIC0gMV0gIT0gJ1xuJykpCgkgICAgY2hhbm5lbChkYXRhLCAiJXNcbiIsIHN0cik7CgllbHNlCgkgICAgY2hhbm5lbChkYXRhLCAiJXMiLCBzdHIpOwogICAgfSBlbHNlIHsKICAgICAgICBjaGFubmVsKGRhdGEsICIlc1xuIiwgIm91dCBvZiBtZW1vcnkgZXJyb3IiKTsKICAgIH0KICAgIGlmIChjb2RlID09IFhNTF9FUlJfT0spCiAgICAgICAgcmV0dXJuOwoKICAgIGlmIChjdHh0ICE9IE5VTEwpIHsKICAgICAgICB4bWxQYXJzZXJQcmludEZpbGVDb250ZXh0SW50ZXJuYWwoaW5wdXQsIGNoYW5uZWwsIGRhdGEpOwogICAgICAgIGlmIChjdXIgIT0gTlVMTCkgewogICAgICAgICAgICBpZiAoY3VyLT5maWxlbmFtZSkKICAgICAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIiVzOiVkOiBcbiIsIGN1ci0+ZmlsZW5hbWUsIGN1ci0+bGluZSk7CiAgICAgICAgICAgIGVsc2UgaWYgKChsaW5lICE9IDApICYmIChkb21haW4gPT0gWE1MX0ZST01fUEFSU0VSKSkKICAgICAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIkVudGl0eTogbGluZSAlZDogXG4iLCBjdXItPmxpbmUpOwogICAgICAgICAgICB4bWxQYXJzZXJQcmludEZpbGVDb250ZXh0SW50ZXJuYWwoY3VyLCBjaGFubmVsLCBkYXRhKTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoKGRvbWFpbiA9PSBYTUxfRlJPTV9YUEFUSCkgJiYgKGVyci0+c3RyMSAhPSBOVUxMKSAmJgogICAgICAgIChlcnItPmludDEgPCAxMDApICYmCgkoZXJyLT5pbnQxIDwgeG1sU3RybGVuKChjb25zdCB4bWxDaGFyICopZXJyLT5zdHIxKSkpIHsKCXhtbENoYXIgYnVmWzE1MF07CglpbnQgaTsKCgljaGFubmVsKGRhdGEsICIlc1xuIiwgZXJyLT5zdHIxKTsKCWZvciAoaT0wO2kgPCBlcnItPmludDE7aSsrKQoJICAgICBidWZbaV0gPSAnICc7CglidWZbaSsrXSA9ICdeJzsKCWJ1ZltpXSA9IDA7CgljaGFubmVsKGRhdGEsICIlc1xuIiwgYnVmKTsKICAgIH0KfQoKc3RhdGljIHZvaWQKaW5pdGlhbGl6ZUxpYnhtbDIodm9pZCkgewogICAgeG1sR2V0V2FybmluZ3NEZWZhdWx0VmFsdWUgPSAwOwogICAgeG1sUGVkYW50aWNQYXJzZXJEZWZhdWx0KDApOwoKICAgIHhtbE1lbVNldHVwKHhtbE1lbUZyZWUsIHhtbE1lbU1hbGxvYywgeG1sTWVtUmVhbGxvYywgeG1sTWVtb3J5U3RyZHVwKTsKICAgIHhtbEluaXRQYXJzZXIoKTsKICAgIHhtbFNldEV4dGVybmFsRW50aXR5TG9hZGVyKHRlc3RFeHRlcm5hbEVudGl0eUxvYWRlcik7CiAgICB4bWxTZXRTdHJ1Y3R1cmVkRXJyb3JGdW5jKE5VTEwsIHRlc3RTdHJ1Y3R1cmVkRXJyb3JIYW5kbGVyKTsKI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKICAgIHhtbFNjaGVtYUluaXRUeXBlcygpOwogICAgeG1sUmVsYXhOR0luaXRUeXBlcygpOwojZW5kaWYKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJCQkJCQkqCiAqCQlGaWxlIG5hbWUgYW5kIHBhdGggdXRpbGl0aWVzCQkJCSoKICoJCQkJCQkJCQkqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgY29uc3QgY2hhciAqYmFzZUZpbGVuYW1lKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSB7CiAgICBjb25zdCBjaGFyICpjdXI7CiAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKICAgICAgICByZXR1cm4oTlVMTCk7CiAgICBjdXIgPSAmZmlsZW5hbWVbc3RybGVuKGZpbGVuYW1lKV07CiAgICB3aGlsZSAoKGN1ciA+IGZpbGVuYW1lKSAmJiAoKmN1ciAhPSAnLycpKQogICAgICAgIGN1ci0tOwogICAgaWYgKCpjdXIgPT0gJy8nKQogICAgICAgIHJldHVybihjdXIgKyAxKTsKICAgIHJldHVybihjdXIpOwp9CgpzdGF0aWMgY2hhciAqcmVzdWx0RmlsZW5hbWUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN1ZmZpeCkgewogICAgY29uc3QgY2hhciAqYmFzZTsKICAgIGNoYXIgcmVzWzUwMF07CgovKioqKioqKioqKioqKgogICAgaWYgKChmaWxlbmFtZVswXSA9PSAndCcpICYmIChmaWxlbmFtZVsxXSA9PSAnZScpICYmCiAgICAgICAgKGZpbGVuYW1lWzJdID09ICdzJykgJiYgKGZpbGVuYW1lWzNdID09ICd0JykgJiYKCShmaWxlbmFtZVs0XSA9PSAnLycpKQoJZmlsZW5hbWUgPSAmZmlsZW5hbWVbNV07CiAqKioqKioqKioqKioqLwogICAgCiAgICBiYXNlID0gYmFzZUZpbGVuYW1lKGZpbGVuYW1lKTsKICAgIGlmIChzdWZmaXggPT0gTlVMTCkKICAgICAgICBzdWZmaXggPSAiLnRtcCI7CiAgICBpZiAob3V0ID09IE5VTEwpCiAgICAgICAgb3V0ID0gIiI7CiAgICBzbnByaW50ZihyZXMsIDQ5OSwgIiVzJXMlcyIsIG91dCwgYmFzZSwgc3VmZml4KTsKICAgIHJlc1s0OTldID0gMDsKICAgIHJldHVybihzdHJkdXAocmVzKSk7Cn0KCnN0YXRpYyBpbnQgY2hlY2tUZXN0RmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkgewogICAgc3RydWN0IHN0YXQgYnVmOwoKICAgIGlmIChzdGF0KGZpbGVuYW1lLCAmYnVmKSA9PSAtMSkKICAgICAgICByZXR1cm4oMCk7CgojaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCiAgICBpZiAoIShidWYuc3RfbW9kZSAmIF9TX0lGUkVHKSkKICAgICAgICByZXR1cm4oMCk7CiNlbHNlCiAgICBpZiAoIVNfSVNSRUcoYnVmLnN0X21vZGUpKQogICAgICAgIHJldHVybigwKTsKI2VuZGlmCgogICAgcmV0dXJuKDEpOwp9CgpzdGF0aWMgaW50IGNvbXBhcmVGaWxlcyhjb25zdCBjaGFyICpyMSwgY29uc3QgY2hhciAqcjIpIHsKICAgIGludCByZXMxLCByZXMyOwogICAgaW50IGZkMSwgZmQyOwogICAgY2hhciBieXRlczFbNDA5Nl07CiAgICBjaGFyIGJ5dGVzMls0MDk2XTsKCiAgICBmZDEgPSBvcGVuKHIxLCBSRF9GTEFHUyk7CiAgICBpZiAoZmQxIDwgMCkKICAgICAgICByZXR1cm4oLTEpOwogICAgZmQyID0gb3BlbihyMiwgUkRfRkxBR1MpOwogICAgaWYgKGZkMiA8IDApIHsKICAgICAgICBjbG9zZShmZDEpOwogICAgICAgIHJldHVybigtMSk7CiAgICB9CiAgICB3aGlsZSAoMSkgewogICAgICAgIHJlczEgPSByZWFkKGZkMSwgYnl0ZXMxLCA0MDk2KTsKICAgICAgICByZXMyID0gcmVhZChmZDIsIGJ5dGVzMiwgNDA5Nik7CglpZiAocmVzMSAhPSByZXMyKSB7CgkgICAgY2xvc2UoZmQxKTsKCSAgICBjbG9zZShmZDIpOwoJICAgIHJldHVybigxKTsKCX0KCWlmIChyZXMxID09IDApCgkgICAgYnJlYWs7CglpZiAobWVtY21wKGJ5dGVzMSwgYnl0ZXMyLCByZXMxKSAhPSAwKSB7CgkgICAgY2xvc2UoZmQxKTsKCSAgICBjbG9zZShmZDIpOwoJICAgIHJldHVybigxKTsKCX0KICAgIH0KICAgIGNsb3NlKGZkMSk7CiAgICBjbG9zZShmZDIpOwogICAgcmV0dXJuKDApOwp9CgpzdGF0aWMgaW50IGNvbXBhcmVGaWxlTWVtKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICptZW0sIGludCBzaXplKSB7CiAgICBpbnQgcmVzOwogICAgaW50IGZkOwogICAgY2hhciBieXRlc1s0MDk2XTsKICAgIGludCBpZHggPSAwOwogICAgc3RydWN0IHN0YXQgaW5mbzsKCiAgICBpZiAoc3RhdChmaWxlbmFtZSwgJmluZm8pIDwgMCkgCglyZXR1cm4oLTEpOwogICAgaWYgKGluZm8uc3Rfc2l6ZSAhPSBzaXplKQogICAgICAgIHJldHVybigtMSk7CiAgICBmZCA9IG9wZW4oZmlsZW5hbWUsIFJEX0ZMQUdTKTsKICAgIGlmIChmZCA8IDApCiAgICAgICAgcmV0dXJuKC0xKTsKICAgIHdoaWxlIChpZHggPCBzaXplKSB7CiAgICAgICAgcmVzID0gcmVhZChmZCwgYnl0ZXMsIDQwOTYpOwoJaWYgKHJlcyA8PSAwKQoJICAgIGJyZWFrOwoJaWYgKHJlcyArIGlkeCA+IHNpemUpIAoJICAgIGJyZWFrOwoJaWYgKG1lbWNtcChieXRlcywgJm1lbVtpZHhdLCByZXMpICE9IDApIHsKCSAgICBpbnQgaXg7CgkgICAgZm9yIChpeD0wOyBpeDxyZXM7IGl4KyspCgkJaWYgKGJ5dGVzW2l4XSAhPSBtZW1baWR4K2l4XSkKCQkJYnJlYWs7CgkgICAgZnByaW50ZihzdGRlcnIsIkNvbXBhcmUgZXJyb3IgYXQgcG9zaXRpb24gJWRcbiIsIGlkeCtpeCk7CgkgICAgY2xvc2UoZmQpOwoJICAgIHJldHVybigxKTsKCX0KCWlkeCArPSByZXM7CiAgICB9CiAgICBjbG9zZShmZCk7CiAgICByZXR1cm4oaWR4ICE9IHNpemUpOwp9CgpzdGF0aWMgaW50IGxvYWRNZW0oY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKiptZW0sIGludCAqc2l6ZSkgewogICAgaW50IGZkLCByZXM7CiAgICBzdHJ1Y3Qgc3RhdCBpbmZvOwogICAgY2hhciAqYmFzZTsKICAgIGludCBzaXogPSAwOwogICAgaWYgKHN0YXQoZmlsZW5hbWUsICZpbmZvKSA8IDApIAoJcmV0dXJuKC0xKTsKICAgIGJhc2UgPSBtYWxsb2MoaW5mby5zdF9zaXplICsgMSk7CiAgICBpZiAoYmFzZSA9PSBOVUxMKQoJcmV0dXJuKC0xKTsKICAgIGlmICgoZmQgPSBvcGVuKGZpbGVuYW1lLCBSRF9GTEFHUykpIDwgMCkgewogICAgICAgIGZyZWUoYmFzZSk7CglyZXR1cm4oLTEpOwogICAgfQogICAgd2hpbGUgKChyZXMgPSByZWFkKGZkLCAmYmFzZVtzaXpdLCBpbmZvLnN0X3NpemUgLSBzaXopKSA+IDApIHsKICAgICAgICBzaXogKz0gcmVzOwogICAgfQogICAgY2xvc2UoZmQpOwojaWYgIWRlZmluZWQoX1dJTjMyKQogICAgaWYgKHNpeiAhPSBpbmZvLnN0X3NpemUpIHsKICAgICAgICBmcmVlKGJhc2UpOwoJcmV0dXJuKC0xKTsKICAgIH0KI2VuZGlmCiAgICBiYXNlW3Npel0gPSAwOwogICAgKm1lbSA9IGJhc2U7CiAgICAqc2l6ZSA9IHNpejsKICAgIHJldHVybigwKTsKfQoKc3RhdGljIGludCB1bmxvYWRNZW0oY29uc3QgY2hhciAqbWVtKSB7CiAgICBmcmVlKChjaGFyICopbWVtKTsKICAgIHJldHVybigwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQkJCQkJCSoKICoJCVRlc3RzIGltcGxlbWVudGF0aW9ucwkJCQkJKgogKgkJCQkJCQkJCSoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJCQkJCQkqCiAqCQlQYXJzZSB0byBTQVggYmFzZWQgdGVzdHMJCQkJKgogKgkJCQkJCQkJCSoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBGSUxFICpTQVhkZWJ1ZyA9IE5VTEw7CgovKgogKiBlbXB0eSBTQVggYmxvY2sKICovCnN0YXRpYyB4bWxTQVhIYW5kbGVyIGVtcHR5U0FYSGFuZGxlclN0cnVjdCA9IHsKICAgIE5VTEwsIC8qIGludGVybmFsU3Vic2V0ICovCiAgICBOVUxMLCAvKiBpc1N0YW5kYWxvbmUgKi8KICAgIE5VTEwsIC8qIGhhc0ludGVybmFsU3Vic2V0ICovCiAgICBOVUxMLCAvKiBoYXNFeHRlcm5hbFN1YnNldCAqLwogICAgTlVMTCwgLyogcmVzb2x2ZUVudGl0eSAqLwogICAgTlVMTCwgLyogZ2V0RW50aXR5ICovCiAgICBOVUxMLCAvKiBlbnRpdHlEZWNsICovCiAgICBOVUxMLCAvKiBub3RhdGlvbkRlY2wgKi8KICAgIE5VTEwsIC8qIGF0dHJpYnV0ZURlY2wgKi8KICAgIE5VTEwsIC8qIGVsZW1lbnREZWNsICovCiAgICBOVUxMLCAvKiB1bnBhcnNlZEVudGl0eURlY2wgKi8KICAgIE5VTEwsIC8qIHNldERvY3VtZW50TG9jYXRvciAqLwogICAgTlVMTCwgLyogc3RhcnREb2N1bWVudCAqLwogICAgTlVMTCwgLyogZW5kRG9jdW1lbnQgKi8KICAgIE5VTEwsIC8qIHN0YXJ0RWxlbWVudCAqLwogICAgTlVMTCwgLyogZW5kRWxlbWVudCAqLwogICAgTlVMTCwgLyogcmVmZXJlbmNlICovCiAgICBOVUxMLCAvKiBjaGFyYWN0ZXJzICovCiAgICBOVUxMLCAvKiBpZ25vcmFibGVXaGl0ZXNwYWNlICovCiAgICBOVUxMLCAvKiBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gKi8KICAgIE5VTEwsIC8qIGNvbW1lbnQgKi8KICAgIE5VTEwsIC8qIHhtbFBhcnNlcldhcm5pbmcgKi8KICAgIE5VTEwsIC8qIHhtbFBhcnNlckVycm9yICovCiAgICBOVUxMLCAvKiB4bWxQYXJzZXJFcnJvciAqLwogICAgTlVMTCwgLyogZ2V0UGFyYW1ldGVyRW50aXR5ICovCiAgICBOVUxMLCAvKiBjZGF0YUJsb2NrOyAqLwogICAgTlVMTCwgLyogZXh0ZXJuYWxTdWJzZXQ7ICovCiAgICAxLAogICAgTlVMTCwKICAgIE5VTEwsIC8qIHN0YXJ0RWxlbWVudE5zICovCiAgICBOVUxMLCAvKiBlbmRFbGVtZW50TnMgKi8KICAgIE5VTEwgIC8qIHhtbFN0cnVjdHVyZWRFcnJvckZ1bmMgKi8KfTsKCnN0YXRpYyB4bWxTQVhIYW5kbGVyUHRyIGVtcHR5U0FYSGFuZGxlciA9ICZlbXB0eVNBWEhhbmRsZXJTdHJ1Y3Q7CnN0YXRpYyBpbnQgY2FsbGJhY2tzID0gMDsKc3RhdGljIGludCBxdWlldCA9IDA7CgovKioKICogaXNTdGFuZGFsb25lRGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqCiAqIElzIHRoaXMgZG9jdW1lbnQgdGFnZ2VkIHN0YW5kYWxvbmUgPwogKgogKiBSZXR1cm5zIDEgaWYgdHJ1ZQogKi8Kc3RhdGljIGludAppc1N0YW5kYWxvbmVEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCkKewogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm4oMCk7CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmlzU3RhbmRhbG9uZSgpXG4iKTsKICAgIHJldHVybigwKTsKfQoKLyoqCiAqIGhhc0ludGVybmFsU3Vic2V0RGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqCiAqIERvZXMgdGhpcyBkb2N1bWVudCBoYXMgYW4gaW50ZXJuYWwgc3Vic2V0CiAqCiAqIFJldHVybnMgMSBpZiB0cnVlCiAqLwpzdGF0aWMgaW50Cmhhc0ludGVybmFsU3Vic2V0RGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuKDApOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5oYXNJbnRlcm5hbFN1YnNldCgpXG4iKTsKICAgIHJldHVybigwKTsKfQoKLyoqCiAqIGhhc0V4dGVybmFsU3Vic2V0RGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqCiAqIERvZXMgdGhpcyBkb2N1bWVudCBoYXMgYW4gZXh0ZXJuYWwgc3Vic2V0CiAqCiAqIFJldHVybnMgMSBpZiB0cnVlCiAqLwpzdGF0aWMgaW50Cmhhc0V4dGVybmFsU3Vic2V0RGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuKDApOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5oYXNFeHRlcm5hbFN1YnNldCgpXG4iKTsKICAgIHJldHVybigwKTsKfQoKLyoqCiAqIGludGVybmFsU3Vic2V0RGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqCiAqIERvZXMgdGhpcyBkb2N1bWVudCBoYXMgYW4gaW50ZXJuYWwgc3Vic2V0CiAqLwpzdGF0aWMgdm9pZAppbnRlcm5hbFN1YnNldERlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICpuYW1lLAoJICAgICAgIGNvbnN0IHhtbENoYXIgKkV4dGVybmFsSUQsIGNvbnN0IHhtbENoYXIgKlN5c3RlbUlEKQp7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguaW50ZXJuYWxTdWJzZXQoJXMsIiwgbmFtZSk7CiAgICBpZiAoRXh0ZXJuYWxJRCA9PSBOVUxMKQoJZnByaW50ZihTQVhkZWJ1ZywgIiAsIik7CiAgICBlbHNlCglmcHJpbnRmKFNBWGRlYnVnLCAiICVzLCIsIEV4dGVybmFsSUQpOwogICAgaWYgKFN5c3RlbUlEID09IE5VTEwpCglmcHJpbnRmKFNBWGRlYnVnLCAiIClcbiIpOwogICAgZWxzZQoJZnByaW50ZihTQVhkZWJ1ZywgIiAlcylcbiIsIFN5c3RlbUlEKTsKfQoKLyoqCiAqIGV4dGVybmFsU3Vic2V0RGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqCiAqIERvZXMgdGhpcyBkb2N1bWVudCBoYXMgYW4gZXh0ZXJuYWwgc3Vic2V0CiAqLwpzdGF0aWMgdm9pZApleHRlcm5hbFN1YnNldERlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICpuYW1lLAoJICAgICAgIGNvbnN0IHhtbENoYXIgKkV4dGVybmFsSUQsIGNvbnN0IHhtbENoYXIgKlN5c3RlbUlEKQp7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguZXh0ZXJuYWxTdWJzZXQoJXMsIiwgbmFtZSk7CiAgICBpZiAoRXh0ZXJuYWxJRCA9PSBOVUxMKQoJZnByaW50ZihTQVhkZWJ1ZywgIiAsIik7CiAgICBlbHNlCglmcHJpbnRmKFNBWGRlYnVnLCAiICVzLCIsIEV4dGVybmFsSUQpOwogICAgaWYgKFN5c3RlbUlEID09IE5VTEwpCglmcHJpbnRmKFNBWGRlYnVnLCAiIClcbiIpOwogICAgZWxzZQoJZnByaW50ZihTQVhkZWJ1ZywgIiAlcylcbiIsIFN5c3RlbUlEKTsKfQoKLyoqCiAqIHJlc29sdmVFbnRpdHlEZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQHB1YmxpY0lkOiBUaGUgcHVibGljIElEIG9mIHRoZSBlbnRpdHkKICogQHN5c3RlbUlkOiBUaGUgc3lzdGVtIElEIG9mIHRoZSBlbnRpdHkKICoKICogU3BlY2lhbCBlbnRpdHkgcmVzb2x2ZXIsIGJldHRlciBsZWZ0IHRvIHRoZSBwYXJzZXIsIGl0IGhhcwogKiBtb3JlIGNvbnRleHQgdGhhbiB0aGUgYXBwbGljYXRpb24gbGF5ZXIuCiAqIFRoZSBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBOT1QgcmVzb2x2ZSB0aGUgZW50aXRpZXMsIGluIHRoYXQgY2FzZQogKiB0aGUgRU5USVRZX1JFRiBub2RlcyBhcmUgYnVpbHQgaW4gdGhlIHN0cnVjdHVyZSAoYW5kIHRoZSBwYXJhbWV0ZXIKICogdmFsdWVzKS4KICoKICogUmV0dXJucyB0aGUgeG1sUGFyc2VySW5wdXRQdHIgaWYgaW5saW5lZCBvciBOVUxMIGZvciBET00gYmVoYXZpb3VyLgogKi8Kc3RhdGljIHhtbFBhcnNlcklucHV0UHRyCnJlc29sdmVFbnRpdHlEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sQ2hhciAqcHVibGljSWQsIGNvbnN0IHhtbENoYXIgKnN5c3RlbUlkKQp7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybihOVUxMKTsKICAgIC8qIHhtbFBhcnNlckN0eHRQdHIgY3R4dCA9ICh4bWxQYXJzZXJDdHh0UHRyKSBjdHg7ICovCgogICAgCiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLnJlc29sdmVFbnRpdHkoIik7CiAgICBpZiAocHVibGljSWQgIT0gTlVMTCkKCWZwcmludGYoU0FYZGVidWcsICIlcyIsIChjaGFyICopcHVibGljSWQpOwogICAgZWxzZQoJZnByaW50ZihTQVhkZWJ1ZywgIiAiKTsKICAgIGlmIChzeXN0ZW1JZCAhPSBOVUxMKQoJZnByaW50ZihTQVhkZWJ1ZywgIiwgJXMpXG4iLCAoY2hhciAqKXN5c3RlbUlkKTsKICAgIGVsc2UKCWZwcmludGYoU0FYZGVidWcsICIsIClcbiIpOwovKioqKioqKioqCiAgICBpZiAoc3lzdGVtSWQgIT0gTlVMTCkgewogICAgICAgIHJldHVybih4bWxOZXdJbnB1dEZyb21GaWxlKGN0eHQsIChjaGFyICopIHN5c3RlbUlkKSk7CiAgICB9CiAqKioqKioqKiovCiAgICByZXR1cm4oTlVMTCk7Cn0KCi8qKgogKiBnZXRFbnRpdHlEZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQG5hbWU6IFRoZSBlbnRpdHkgbmFtZQogKgogKiBHZXQgYW4gZW50aXR5IGJ5IG5hbWUKICoKICogUmV0dXJucyB0aGUgeG1sUGFyc2VySW5wdXRQdHIgaWYgaW5saW5lZCBvciBOVUxMIGZvciBET00gYmVoYXZpb3VyLgogKi8Kc3RhdGljIHhtbEVudGl0eVB0cgpnZXRFbnRpdHlEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sQ2hhciAqbmFtZSkKewogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm4oTlVMTCk7CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmdldEVudGl0eSglcylcbiIsIG5hbWUpOwogICAgcmV0dXJuKE5VTEwpOwp9CgovKioKICogZ2V0UGFyYW1ldGVyRW50aXR5RGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEBuYW1lOiBUaGUgZW50aXR5IG5hbWUKICoKICogR2V0IGEgcGFyYW1ldGVyIGVudGl0eSBieSBuYW1lCiAqCiAqIFJldHVybnMgdGhlIHhtbFBhcnNlcklucHV0UHRyCiAqLwpzdGF0aWMgeG1sRW50aXR5UHRyCmdldFBhcmFtZXRlckVudGl0eURlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICpuYW1lKQp7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybihOVUxMKTsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguZ2V0UGFyYW1ldGVyRW50aXR5KCVzKVxuIiwgbmFtZSk7CiAgICByZXR1cm4oTlVMTCk7Cn0KCgovKioKICogZW50aXR5RGVjbERlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAbmFtZTogIHRoZSBlbnRpdHkgbmFtZSAKICogQHR5cGU6ICB0aGUgZW50aXR5IHR5cGUgCiAqIEBwdWJsaWNJZDogVGhlIHB1YmxpYyBJRCBvZiB0aGUgZW50aXR5CiAqIEBzeXN0ZW1JZDogVGhlIHN5c3RlbSBJRCBvZiB0aGUgZW50aXR5CiAqIEBjb250ZW50OiB0aGUgZW50aXR5IHZhbHVlICh3aXRob3V0IHByb2Nlc3NpbmcpLgogKgogKiBBbiBlbnRpdHkgZGVmaW5pdGlvbiBoYXMgYmVlbiBwYXJzZWQKICovCnN0YXRpYyB2b2lkCmVudGl0eURlY2xEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sQ2hhciAqbmFtZSwgaW50IHR5cGUsCiAgICAgICAgICBjb25zdCB4bWxDaGFyICpwdWJsaWNJZCwgY29uc3QgeG1sQ2hhciAqc3lzdGVtSWQsIHhtbENoYXIgKmNvbnRlbnQpCnsKY29uc3QgeG1sQ2hhciAqbnVsbHN0ciA9IEJBRF9DQVNUICIobnVsbCkiOwogICAgLyogbm90IGFsbCBsaWJyYXJpZXMgaGFuZGxlIHByaW50aW5nIG51bGwgcG9pbnRlcnMgbmljZWx5ICovCiAgICBpZiAocHVibGljSWQgPT0gTlVMTCkKICAgICAgICBwdWJsaWNJZCA9IG51bGxzdHI7CiAgICBpZiAoc3lzdGVtSWQgPT0gTlVMTCkKICAgICAgICBzeXN0ZW1JZCA9IG51bGxzdHI7CiAgICBpZiAoY29udGVudCA9PSBOVUxMKQogICAgICAgIGNvbnRlbnQgPSAoeG1sQ2hhciAqKW51bGxzdHI7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguZW50aXR5RGVjbCglcywgJWQsICVzLCAlcywgJXMpXG4iLAogICAgICAgICAgICBuYW1lLCB0eXBlLCBwdWJsaWNJZCwgc3lzdGVtSWQsIGNvbnRlbnQpOwp9CgovKioKICogYXR0cmlidXRlRGVjbERlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAbmFtZTogIHRoZSBhdHRyaWJ1dGUgbmFtZSAKICogQHR5cGU6ICB0aGUgYXR0cmlidXRlIHR5cGUgCiAqCiAqIEFuIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGhhcyBiZWVuIHBhcnNlZAogKi8Kc3RhdGljIHZvaWQKYXR0cmlidXRlRGVjbERlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICogZWxlbSwKICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lLCBpbnQgdHlwZSwgaW50IGRlZiwKICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKiBkZWZhdWx0VmFsdWUsIHhtbEVudW1lcmF0aW9uUHRyIHRyZWUpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQogICAgICAgIHJldHVybjsKICAgIGlmIChkZWZhdWx0VmFsdWUgPT0gTlVMTCkKICAgICAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmF0dHJpYnV0ZURlY2woJXMsICVzLCAlZCwgJWQsIE5VTEwsIC4uLilcbiIsCiAgICAgICAgICAgICAgICBlbGVtLCBuYW1lLCB0eXBlLCBkZWYpOwogICAgZWxzZQogICAgICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguYXR0cmlidXRlRGVjbCglcywgJXMsICVkLCAlZCwgJXMsIC4uLilcbiIsCiAgICAgICAgICAgICAgICBlbGVtLCBuYW1lLCB0eXBlLCBkZWYsIGRlZmF1bHRWYWx1ZSk7CiAgICB4bWxGcmVlRW51bWVyYXRpb24odHJlZSk7Cn0KCi8qKgogKiBlbGVtZW50RGVjbERlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAbmFtZTogIHRoZSBlbGVtZW50IG5hbWUgCiAqIEB0eXBlOiAgdGhlIGVsZW1lbnQgdHlwZSAKICogQGNvbnRlbnQ6IHRoZSBlbGVtZW50IHZhbHVlICh3aXRob3V0IHByb2Nlc3NpbmcpLgogKgogKiBBbiBlbGVtZW50IGRlZmluaXRpb24gaGFzIGJlZW4gcGFyc2VkCiAqLwpzdGF0aWMgdm9pZAplbGVtZW50RGVjbERlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICpuYW1lLCBpbnQgdHlwZSwKCSAgICB4bWxFbGVtZW50Q29udGVudFB0ciBjb250ZW50IEFUVFJJQlVURV9VTlVTRUQpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5lbGVtZW50RGVjbCglcywgJWQsIC4uLilcbiIsCiAgICAgICAgICAgIG5hbWUsIHR5cGUpOwp9CgovKioKICogbm90YXRpb25EZWNsRGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgbm90YXRpb24KICogQHB1YmxpY0lkOiBUaGUgcHVibGljIElEIG9mIHRoZSBlbnRpdHkKICogQHN5c3RlbUlkOiBUaGUgc3lzdGVtIElEIG9mIHRoZSBlbnRpdHkKICoKICogV2hhdCB0byBkbyB3aGVuIGEgbm90YXRpb24gZGVjbGFyYXRpb24gaGFzIGJlZW4gcGFyc2VkLgogKi8Kc3RhdGljIHZvaWQKbm90YXRpb25EZWNsRGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKm5hbWUsCgkgICAgIGNvbnN0IHhtbENoYXIgKnB1YmxpY0lkLCBjb25zdCB4bWxDaGFyICpzeXN0ZW1JZCkKewogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm47CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLm5vdGF0aW9uRGVjbCglcywgJXMsICVzKVxuIiwKICAgICAgICAgICAgKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgcHVibGljSWQsIChjaGFyICopIHN5c3RlbUlkKTsKfQoKLyoqCiAqIHVucGFyc2VkRW50aXR5RGVjbERlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAbmFtZTogVGhlIG5hbWUgb2YgdGhlIGVudGl0eQogKiBAcHVibGljSWQ6IFRoZSBwdWJsaWMgSUQgb2YgdGhlIGVudGl0eQogKiBAc3lzdGVtSWQ6IFRoZSBzeXN0ZW0gSUQgb2YgdGhlIGVudGl0eQogKiBAbm90YXRpb25OYW1lOiB0aGUgbmFtZSBvZiB0aGUgbm90YXRpb24KICoKICogV2hhdCB0byBkbyB3aGVuIGFuIHVucGFyc2VkIGVudGl0eSBkZWNsYXJhdGlvbiBpcyBwYXJzZWQKICovCnN0YXRpYyB2b2lkCnVucGFyc2VkRW50aXR5RGVjbERlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICpuYW1lLAoJCSAgIGNvbnN0IHhtbENoYXIgKnB1YmxpY0lkLCBjb25zdCB4bWxDaGFyICpzeXN0ZW1JZCwKCQkgICBjb25zdCB4bWxDaGFyICpub3RhdGlvbk5hbWUpCnsKY29uc3QgeG1sQ2hhciAqbnVsbHN0ciA9IEJBRF9DQVNUICIobnVsbCkiOwoKICAgIGlmIChwdWJsaWNJZCA9PSBOVUxMKQogICAgICAgIHB1YmxpY0lkID0gbnVsbHN0cjsKICAgIGlmIChzeXN0ZW1JZCA9PSBOVUxMKQogICAgICAgIHN5c3RlbUlkID0gbnVsbHN0cjsKICAgIGlmIChub3RhdGlvbk5hbWUgPT0gTlVMTCkKICAgICAgICBub3RhdGlvbk5hbWUgPSBudWxsc3RyOwogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm47CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLnVucGFyc2VkRW50aXR5RGVjbCglcywgJXMsICVzLCAlcylcbiIsCiAgICAgICAgICAgIChjaGFyICopIG5hbWUsIChjaGFyICopIHB1YmxpY0lkLCAoY2hhciAqKSBzeXN0ZW1JZCwKCSAgICAoY2hhciAqKSBub3RhdGlvbk5hbWUpOwp9CgovKioKICogc2V0RG9jdW1lbnRMb2NhdG9yRGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEBsb2M6IEEgU0FYIExvY2F0b3IKICoKICogUmVjZWl2ZSB0aGUgZG9jdW1lbnQgbG9jYXRvciBhdCBzdGFydHVwLCBhY3R1YWxseSB4bWxEZWZhdWx0U0FYTG9jYXRvcgogKiBFdmVyeXRoaW5nIGlzIGF2YWlsYWJsZSBvbiB0aGUgY29udGV4dCwgc28gdGhpcyBpcyB1c2VsZXNzIGluIG91ciBjYXNlLgogKi8Kc3RhdGljIHZvaWQKc2V0RG9jdW1lbnRMb2NhdG9yRGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIHhtbFNBWExvY2F0b3JQdHIgbG9jIEFUVFJJQlVURV9VTlVTRUQpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5zZXREb2N1bWVudExvY2F0b3IoKVxuIik7Cn0KCi8qKgogKiBzdGFydERvY3VtZW50RGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqCiAqIGNhbGxlZCB3aGVuIHRoZSBkb2N1bWVudCBzdGFydCBiZWluZyBwcm9jZXNzZWQuCiAqLwpzdGF0aWMgdm9pZApzdGFydERvY3VtZW50RGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5zdGFydERvY3VtZW50KClcbiIpOwp9CgovKioKICogZW5kRG9jdW1lbnREZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICoKICogY2FsbGVkIHdoZW4gdGhlIGRvY3VtZW50IGVuZCBoYXMgYmVlbiBkZXRlY3RlZC4KICovCnN0YXRpYyB2b2lkCmVuZERvY3VtZW50RGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5lbmREb2N1bWVudCgpXG4iKTsKfQoKLyoqCiAqIHN0YXJ0RWxlbWVudERlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAbmFtZTogIFRoZSBlbGVtZW50IG5hbWUKICoKICogY2FsbGVkIHdoZW4gYW4gb3BlbmluZyB0YWcgaGFzIGJlZW4gcHJvY2Vzc2VkLgogKi8Kc3RhdGljIHZvaWQKc3RhcnRFbGVtZW50RGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKm5hbWUsIGNvbnN0IHhtbENoYXIgKiphdHRzKQp7CiAgICBpbnQgaTsKCiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguc3RhcnRFbGVtZW50KCVzIiwgKGNoYXIgKikgbmFtZSk7CiAgICBpZiAoYXR0cyAhPSBOVUxMKSB7CiAgICAgICAgZm9yIChpID0gMDsoYXR0c1tpXSAhPSBOVUxMKTtpKyspIHsKCSAgICBmcHJpbnRmKFNBWGRlYnVnLCAiLCAlcz0nIiwgYXR0c1tpKytdKTsKCSAgICBpZiAoYXR0c1tpXSAhPSBOVUxMKQoJICAgICAgICBmcHJpbnRmKFNBWGRlYnVnLCAiJXMnIiwgYXR0c1tpXSk7Cgl9CiAgICB9CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiKVxuIik7Cn0KCi8qKgogKiBlbmRFbGVtZW50RGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEBuYW1lOiAgVGhlIGVsZW1lbnQgbmFtZQogKgogKiBjYWxsZWQgd2hlbiB0aGUgZW5kIG9mIGFuIGVsZW1lbnQgaGFzIGJlZW4gZGV0ZWN0ZWQuCiAqLwpzdGF0aWMgdm9pZAplbmRFbGVtZW50RGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKm5hbWUpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5lbmRFbGVtZW50KCVzKVxuIiwgKGNoYXIgKikgbmFtZSk7Cn0KCi8qKgogKiBjaGFyYWN0ZXJzRGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEBjaDogIGEgeG1sQ2hhciBzdHJpbmcKICogQGxlbjogdGhlIG51bWJlciBvZiB4bWxDaGFyCiAqCiAqIHJlY2VpdmluZyBzb21lIGNoYXJzIGZyb20gdGhlIHBhcnNlci4KICogUXVlc3Rpb246IGhvdyBtdWNoIGF0IGEgdGltZSA/Pz8KICovCnN0YXRpYyB2b2lkCmNoYXJhY3RlcnNEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sQ2hhciAqY2gsIGludCBsZW4pCnsKICAgIGNoYXIgb3V0cHV0WzQwXTsKICAgIGludCBpOwoKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgZm9yIChpID0gMDsoaTxsZW4pICYmIChpIDwgMzApO2krKykKCW91dHB1dFtpXSA9IGNoW2ldOwogICAgb3V0cHV0W2ldID0gMDsKCiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmNoYXJhY3RlcnMoJXMsICVkKVxuIiwgb3V0cHV0LCBsZW4pOwp9CgovKioKICogcmVmZXJlbmNlRGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEBuYW1lOiAgVGhlIGVudGl0eSBuYW1lCiAqCiAqIGNhbGxlZCB3aGVuIGFuIGVudGl0eSByZWZlcmVuY2UgaXMgZGV0ZWN0ZWQuIAogKi8Kc3RhdGljIHZvaWQKcmVmZXJlbmNlRGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKm5hbWUpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5yZWZlcmVuY2UoJXMpXG4iLCBuYW1lKTsKfQoKLyoqCiAqIGlnbm9yYWJsZVdoaXRlc3BhY2VEZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQGNoOiAgYSB4bWxDaGFyIHN0cmluZwogKiBAc3RhcnQ6IHRoZSBmaXJzdCBjaGFyIGluIHRoZSBzdHJpbmcKICogQGxlbjogdGhlIG51bWJlciBvZiB4bWxDaGFyCiAqCiAqIHJlY2VpdmluZyBzb21lIGlnbm9yYWJsZSB3aGl0ZXNwYWNlcyBmcm9tIHRoZSBwYXJzZXIuCiAqIFF1ZXN0aW9uOiBob3cgbXVjaCBhdCBhIHRpbWUgPz8/CiAqLwpzdGF0aWMgdm9pZAppZ25vcmFibGVXaGl0ZXNwYWNlRGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKmNoLCBpbnQgbGVuKQp7CiAgICBjaGFyIG91dHB1dFs0MF07CiAgICBpbnQgaTsKCiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZvciAoaSA9IDA7KGk8bGVuKSAmJiAoaSA8IDMwKTtpKyspCglvdXRwdXRbaV0gPSBjaFtpXTsKICAgIG91dHB1dFtpXSA9IDA7CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmlnbm9yYWJsZVdoaXRlc3BhY2UoJXMsICVkKVxuIiwgb3V0cHV0LCBsZW4pOwp9CgovKioKICogcHJvY2Vzc2luZ0luc3RydWN0aW9uRGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEB0YXJnZXQ6ICB0aGUgdGFyZ2V0IG5hbWUKICogQGRhdGE6IHRoZSBQSSBkYXRhJ3MKICogQGxlbjogdGhlIG51bWJlciBvZiB4bWxDaGFyCiAqCiAqIEEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBoYXMgYmVlbiBwYXJzZWQuCiAqLwpzdGF0aWMgdm9pZApwcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sQ2hhciAqdGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqZGF0YSkKewogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm47CiAgICBpZiAoZGF0YSAhPSBOVUxMKQoJZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oJXMsICVzKVxuIiwKCQkoY2hhciAqKSB0YXJnZXQsIChjaGFyICopIGRhdGEpOwogICAgZWxzZQoJZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oJXMsIE5VTEwpXG4iLAoJCShjaGFyICopIHRhcmdldCk7Cn0KCi8qKgogKiBjZGF0YUJsb2NrRGVidWc6CiAqIEBjdHg6IHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkKICogQHZhbHVlOiAgVGhlIHBjZGF0YSBjb250ZW50CiAqIEBsZW46ICB0aGUgYmxvY2sgbGVuZ3RoCiAqCiAqIGNhbGxlZCB3aGVuIGEgcGNkYXRhIGJsb2NrIGhhcyBiZWVuIHBhcnNlZAogKi8Kc3RhdGljIHZvaWQKY2RhdGFCbG9ja0RlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICp2YWx1ZSwgaW50IGxlbikKewogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm47CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLnBjZGF0YSglLjIwcywgJWQpXG4iLAoJICAgIChjaGFyICopIHZhbHVlLCBsZW4pOwp9CgovKioKICogY29tbWVudERlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAdmFsdWU6ICB0aGUgY29tbWVudCBjb250ZW50CiAqCiAqIEEgY29tbWVudCBoYXMgYmVlbiBwYXJzZWQuCiAqLwpzdGF0aWMgdm9pZApjb21tZW50RGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKnZhbHVlKQp7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguY29tbWVudCglcylcbiIsIHZhbHVlKTsKfQoKLyoqCiAqIHdhcm5pbmdEZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQG1zZzogIHRoZSBtZXNzYWdlIHRvIGRpc3BsYXkvdHJhbnNtaXQKICogQC4uLjogIGV4dHJhIHBhcmFtZXRlcnMgZm9yIHRoZSBtZXNzYWdlIGRpc3BsYXkKICoKICogRGlzcGxheSBhbmQgZm9ybWF0IGEgd2FybmluZyBtZXNzYWdlcywgZ2l2ZXMgZmlsZSwgbGluZSwgcG9zaXRpb24gYW5kCiAqIGV4dHJhIHBhcmFtZXRlcnMuCiAqLwpzdGF0aWMgdm9pZCBYTUxDREVDTAp3YXJuaW5nRGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IGNoYXIgKm1zZywgLi4uKQp7CiAgICB2YV9saXN0IGFyZ3M7CgogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm47CiAgICB2YV9zdGFydChhcmdzLCBtc2cpOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC53YXJuaW5nOiAiKTsKICAgIHZmcHJpbnRmKFNBWGRlYnVnLCBtc2csIGFyZ3MpOwogICAgdmFfZW5kKGFyZ3MpOwp9CgovKioKICogZXJyb3JEZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQG1zZzogIHRoZSBtZXNzYWdlIHRvIGRpc3BsYXkvdHJhbnNtaXQKICogQC4uLjogIGV4dHJhIHBhcmFtZXRlcnMgZm9yIHRoZSBtZXNzYWdlIGRpc3BsYXkKICoKICogRGlzcGxheSBhbmQgZm9ybWF0IGEgZXJyb3IgbWVzc2FnZXMsIGdpdmVzIGZpbGUsIGxpbmUsIHBvc2l0aW9uIGFuZAogKiBleHRyYSBwYXJhbWV0ZXJzLgogKi8Kc3RhdGljIHZvaWQgWE1MQ0RFQ0wKZXJyb3JEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgY2hhciAqbXNnLCAuLi4pCnsKICAgIHZhX2xpc3QgYXJnczsKCiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIHZhX3N0YXJ0KGFyZ3MsIG1zZyk7CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmVycm9yOiAiKTsKICAgIHZmcHJpbnRmKFNBWGRlYnVnLCBtc2csIGFyZ3MpOwogICAgdmFfZW5kKGFyZ3MpOwp9CgovKioKICogZmF0YWxFcnJvckRlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAbXNnOiAgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheS90cmFuc21pdAogKiBALi4uOiAgZXh0cmEgcGFyYW1ldGVycyBmb3IgdGhlIG1lc3NhZ2UgZGlzcGxheQogKgogKiBEaXNwbGF5IGFuZCBmb3JtYXQgYSBmYXRhbEVycm9yIG1lc3NhZ2VzLCBnaXZlcyBmaWxlLCBsaW5lLCBwb3NpdGlvbiBhbmQKICogZXh0cmEgcGFyYW1ldGVycy4KICovCnN0YXRpYyB2b2lkIFhNTENERUNMCmZhdGFsRXJyb3JEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgY2hhciAqbXNnLCAuLi4pCnsKICAgIHZhX2xpc3QgYXJnczsKCiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIHZhX3N0YXJ0KGFyZ3MsIG1zZyk7CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmZhdGFsRXJyb3I6ICIpOwogICAgdmZwcmludGYoU0FYZGVidWcsIG1zZywgYXJncyk7CiAgICB2YV9lbmQoYXJncyk7Cn0KCnN0YXRpYyB4bWxTQVhIYW5kbGVyIGRlYnVnU0FYSGFuZGxlclN0cnVjdCA9IHsKICAgIGludGVybmFsU3Vic2V0RGVidWcsCiAgICBpc1N0YW5kYWxvbmVEZWJ1ZywKICAgIGhhc0ludGVybmFsU3Vic2V0RGVidWcsCiAgICBoYXNFeHRlcm5hbFN1YnNldERlYnVnLAogICAgcmVzb2x2ZUVudGl0eURlYnVnLAogICAgZ2V0RW50aXR5RGVidWcsCiAgICBlbnRpdHlEZWNsRGVidWcsCiAgICBub3RhdGlvbkRlY2xEZWJ1ZywKICAgIGF0dHJpYnV0ZURlY2xEZWJ1ZywKICAgIGVsZW1lbnREZWNsRGVidWcsCiAgICB1bnBhcnNlZEVudGl0eURlY2xEZWJ1ZywKICAgIHNldERvY3VtZW50TG9jYXRvckRlYnVnLAogICAgc3RhcnREb2N1bWVudERlYnVnLAogICAgZW5kRG9jdW1lbnREZWJ1ZywKICAgIHN0YXJ0RWxlbWVudERlYnVnLAogICAgZW5kRWxlbWVudERlYnVnLAogICAgcmVmZXJlbmNlRGVidWcsCiAgICBjaGFyYWN0ZXJzRGVidWcsCiAgICBpZ25vcmFibGVXaGl0ZXNwYWNlRGVidWcsCiAgICBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EZWJ1ZywKICAgIGNvbW1lbnREZWJ1ZywKICAgIHdhcm5pbmdEZWJ1ZywKICAgIGVycm9yRGVidWcsCiAgICBmYXRhbEVycm9yRGVidWcsCiAgICBnZXRQYXJhbWV0ZXJFbnRpdHlEZWJ1ZywKICAgIGNkYXRhQmxvY2tEZWJ1ZywKICAgIGV4dGVybmFsU3Vic2V0RGVidWcsCiAgICAxLAogICAgTlVMTCwKICAgIE5VTEwsCiAgICBOVUxMLAogICAgTlVMTAp9OwoKc3RhdGljIHhtbFNBWEhhbmRsZXJQdHIgZGVidWdTQVhIYW5kbGVyID0gJmRlYnVnU0FYSGFuZGxlclN0cnVjdDsKCi8qCiAqIFNBWDIgc3BlY2lmaWMgY2FsbGJhY2tzCiAqLwovKioKICogc3RhcnRFbGVtZW50TnNEZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQG5hbWU6ICBUaGUgZWxlbWVudCBuYW1lCiAqCiAqIGNhbGxlZCB3aGVuIGFuIG9wZW5pbmcgdGFnIGhhcyBiZWVuIHByb2Nlc3NlZC4KICovCnN0YXRpYyB2b2lkCnN0YXJ0RWxlbWVudE5zRGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqbG9jYWxuYW1lLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKnByZWZpeCwKICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICpVUkksCgkJICAgIGludCBuYl9uYW1lc3BhY2VzLAoJCSAgICBjb25zdCB4bWxDaGFyICoqbmFtZXNwYWNlcywKCQkgICAgaW50IG5iX2F0dHJpYnV0ZXMsCgkJICAgIGludCBuYl9kZWZhdWx0ZWQsCgkJICAgIGNvbnN0IHhtbENoYXIgKiphdHRyaWJ1dGVzKQp7CiAgICBpbnQgaTsKCiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguc3RhcnRFbGVtZW50TnMoJXMiLCAoY2hhciAqKSBsb2NhbG5hbWUpOwogICAgaWYgKHByZWZpeCA9PSBOVUxMKQoJZnByaW50ZihTQVhkZWJ1ZywgIiwgTlVMTCIpOwogICAgZWxzZQoJZnByaW50ZihTQVhkZWJ1ZywgIiwgJXMiLCAoY2hhciAqKSBwcmVmaXgpOwogICAgaWYgKFVSSSA9PSBOVUxMKQoJZnByaW50ZihTQVhkZWJ1ZywgIiwgTlVMTCIpOwogICAgZWxzZQoJZnByaW50ZihTQVhkZWJ1ZywgIiwgJyVzJyIsIChjaGFyICopIFVSSSk7CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiLCAlZCIsIG5iX25hbWVzcGFjZXMpOwogICAgCiAgICBpZiAobmFtZXNwYWNlcyAhPSBOVUxMKSB7CiAgICAgICAgZm9yIChpID0gMDtpIDwgbmJfbmFtZXNwYWNlcyAqIDI7aSsrKSB7CgkgICAgZnByaW50ZihTQVhkZWJ1ZywgIiwgeG1sbnMiKTsKCSAgICBpZiAobmFtZXNwYWNlc1tpXSAhPSBOVUxMKQoJICAgICAgICBmcHJpbnRmKFNBWGRlYnVnLCAiOiVzIiwgbmFtZXNwYWNlc1tpXSk7CgkgICAgaSsrOwoJICAgIGZwcmludGYoU0FYZGVidWcsICI9JyVzJyIsIG5hbWVzcGFjZXNbaV0pOwoJfQogICAgfQogICAgZnByaW50ZihTQVhkZWJ1ZywgIiwgJWQsICVkIiwgbmJfYXR0cmlidXRlcywgbmJfZGVmYXVsdGVkKTsKICAgIGlmIChhdHRyaWJ1dGVzICE9IE5VTEwpIHsKICAgICAgICBmb3IgKGkgPSAwO2kgPCBuYl9hdHRyaWJ1dGVzICogNTtpICs9IDUpIHsKCSAgICBpZiAoYXR0cmlidXRlc1tpICsgMV0gIT0gTlVMTCkKCQlmcHJpbnRmKFNBWGRlYnVnLCAiLCAlczolcz0nIiwgYXR0cmlidXRlc1tpICsgMV0sIGF0dHJpYnV0ZXNbaV0pOwoJICAgIGVsc2UKCQlmcHJpbnRmKFNBWGRlYnVnLCAiLCAlcz0nIiwgYXR0cmlidXRlc1tpXSk7CgkgICAgZnByaW50ZihTQVhkZWJ1ZywgIiUuNHMuLi4nLCAlZCIsIGF0dHJpYnV0ZXNbaSArIDNdLAoJCSAgICAoaW50KShhdHRyaWJ1dGVzW2kgKyA0XSAtIGF0dHJpYnV0ZXNbaSArIDNdKSk7Cgl9CiAgICB9CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiKVxuIik7Cn0KCi8qKgogKiBlbmRFbGVtZW50RGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEBuYW1lOiAgVGhlIGVsZW1lbnQgbmFtZQogKgogKiBjYWxsZWQgd2hlbiB0aGUgZW5kIG9mIGFuIGVsZW1lbnQgaGFzIGJlZW4gZGV0ZWN0ZWQuCiAqLwpzdGF0aWMgdm9pZAplbmRFbGVtZW50TnNEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwKICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqbG9jYWxuYW1lLAogICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICpwcmVmaXgsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKlVSSSkKewogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm47CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmVuZEVsZW1lbnROcyglcyIsIChjaGFyICopIGxvY2FsbmFtZSk7CiAgICBpZiAocHJlZml4ID09IE5VTEwpCglmcHJpbnRmKFNBWGRlYnVnLCAiLCBOVUxMIik7CiAgICBlbHNlCglmcHJpbnRmKFNBWGRlYnVnLCAiLCAlcyIsIChjaGFyICopIHByZWZpeCk7CiAgICBpZiAoVVJJID09IE5VTEwpCglmcHJpbnRmKFNBWGRlYnVnLCAiLCBOVUxMKVxuIik7CiAgICBlbHNlCglmcHJpbnRmKFNBWGRlYnVnLCAiLCAnJXMnKVxuIiwgKGNoYXIgKikgVVJJKTsKfQoKc3RhdGljIHhtbFNBWEhhbmRsZXIgZGVidWdTQVgySGFuZGxlclN0cnVjdCA9IHsKICAgIGludGVybmFsU3Vic2V0RGVidWcsCiAgICBpc1N0YW5kYWxvbmVEZWJ1ZywKICAgIGhhc0ludGVybmFsU3Vic2V0RGVidWcsCiAgICBoYXNFeHRlcm5hbFN1YnNldERlYnVnLAogICAgcmVzb2x2ZUVudGl0eURlYnVnLAogICAgZ2V0RW50aXR5RGVidWcsCiAgICBlbnRpdHlEZWNsRGVidWcsCiAgICBub3RhdGlvbkRlY2xEZWJ1ZywKICAgIGF0dHJpYnV0ZURlY2xEZWJ1ZywKICAgIGVsZW1lbnREZWNsRGVidWcsCiAgICB1bnBhcnNlZEVudGl0eURlY2xEZWJ1ZywKICAgIHNldERvY3VtZW50TG9jYXRvckRlYnVnLAogICAgc3RhcnREb2N1bWVudERlYnVnLAogICAgZW5kRG9jdW1lbnREZWJ1ZywKICAgIE5VTEwsCiAgICBOVUxMLAogICAgcmVmZXJlbmNlRGVidWcsCiAgICBjaGFyYWN0ZXJzRGVidWcsCiAgICBpZ25vcmFibGVXaGl0ZXNwYWNlRGVidWcsCiAgICBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EZWJ1ZywKICAgIGNvbW1lbnREZWJ1ZywKICAgIHdhcm5pbmdEZWJ1ZywKICAgIGVycm9yRGVidWcsCiAgICBmYXRhbEVycm9yRGVidWcsCiAgICBnZXRQYXJhbWV0ZXJFbnRpdHlEZWJ1ZywKICAgIGNkYXRhQmxvY2tEZWJ1ZywKICAgIGV4dGVybmFsU3Vic2V0RGVidWcsCiAgICBYTUxfU0FYMl9NQUdJQywKICAgIE5VTEwsCiAgICBzdGFydEVsZW1lbnROc0RlYnVnLAogICAgZW5kRWxlbWVudE5zRGVidWcsCiAgICBOVUxMCn07CgpzdGF0aWMgeG1sU0FYSGFuZGxlclB0ciBkZWJ1Z1NBWDJIYW5kbGVyID0gJmRlYnVnU0FYMkhhbmRsZXJTdHJ1Y3Q7CgojaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAovKioKICogaHRtbHN0YXJ0RWxlbWVudERlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAbmFtZTogIFRoZSBlbGVtZW50IG5hbWUKICoKICogY2FsbGVkIHdoZW4gYW4gb3BlbmluZyB0YWcgaGFzIGJlZW4gcHJvY2Vzc2VkLgogKi8Kc3RhdGljIHZvaWQKaHRtbHN0YXJ0RWxlbWVudERlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICpuYW1lLCBjb25zdCB4bWxDaGFyICoqYXR0cykKewogICAgaW50IGk7CgogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5zdGFydEVsZW1lbnQoJXMiLCAoY2hhciAqKSBuYW1lKTsKICAgIGlmIChhdHRzICE9IE5VTEwpIHsKICAgICAgICBmb3IgKGkgPSAwOyhhdHRzW2ldICE9IE5VTEwpO2krKykgewoJICAgIGZwcmludGYoU0FYZGVidWcsICIsICVzIiwgYXR0c1tpKytdKTsKCSAgICBpZiAoYXR0c1tpXSAhPSBOVUxMKSB7CgkJdW5zaWduZWQgY2hhciBvdXRwdXRbNDBdOwoJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmF0dCA9IGF0dHNbaV07CgkJaW50IG91dGxlbiwgYXR0bGVuOwoJICAgICAgICBmcHJpbnRmKFNBWGRlYnVnLCAiPSciKTsKCQl3aGlsZSAoKGF0dGxlbiA9IHN0cmxlbigoY2hhciopYXR0KSkgPiAwKSB7CgkJICAgIG91dGxlbiA9IHNpemVvZiBvdXRwdXQgLSAxOwoJCSAgICBodG1sRW5jb2RlRW50aXRpZXMob3V0cHV0LCAmb3V0bGVuLCBhdHQsICZhdHRsZW4sICdcJycpOwoJCSAgICBvdXRwdXRbb3V0bGVuXSA9IDA7CgkJICAgIGZwcmludGYoU0FYZGVidWcsICIlcyIsIChjaGFyICopIG91dHB1dCk7CgkJICAgIGF0dCArPSBhdHRsZW47CgkJfQoJCWZwcmludGYoU0FYZGVidWcsICInIik7CgkgICAgfQoJfQogICAgfQogICAgZnByaW50ZihTQVhkZWJ1ZywgIilcbiIpOwp9CgovKioKICogaHRtbGNoYXJhY3RlcnNEZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQGNoOiAgYSB4bWxDaGFyIHN0cmluZwogKiBAbGVuOiB0aGUgbnVtYmVyIG9mIHhtbENoYXIKICoKICogcmVjZWl2aW5nIHNvbWUgY2hhcnMgZnJvbSB0aGUgcGFyc2VyLgogKiBRdWVzdGlvbjogaG93IG11Y2ggYXQgYSB0aW1lID8/PwogKi8Kc3RhdGljIHZvaWQKaHRtbGNoYXJhY3RlcnNEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sQ2hhciAqY2gsIGludCBsZW4pCnsKICAgIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzQwXTsKICAgIGludCBpbmxlbiA9IGxlbiwgb3V0bGVuID0gMzA7CgogICAgaHRtbEVuY29kZUVudGl0aWVzKG91dHB1dCwgJm91dGxlbiwgY2gsICZpbmxlbiwgMCk7CiAgICBvdXRwdXRbb3V0bGVuXSA9IDA7CgogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5jaGFyYWN0ZXJzKCVzLCAlZClcbiIsIG91dHB1dCwgbGVuKTsKfQoKLyoqCiAqIGh0bWxjZGF0YURlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAY2g6ICBhIHhtbENoYXIgc3RyaW5nCiAqIEBsZW46IHRoZSBudW1iZXIgb2YgeG1sQ2hhcgogKgogKiByZWNlaXZpbmcgc29tZSBjZGF0YSBjaGFycyBmcm9tIHRoZSBwYXJzZXIuCiAqIFF1ZXN0aW9uOiBob3cgbXVjaCBhdCBhIHRpbWUgPz8/CiAqLwpzdGF0aWMgdm9pZApodG1sY2RhdGFEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sQ2hhciAqY2gsIGludCBsZW4pCnsKICAgIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzQwXTsKICAgIGludCBpbmxlbiA9IGxlbiwgb3V0bGVuID0gMzA7CgogICAgaHRtbEVuY29kZUVudGl0aWVzKG91dHB1dCwgJm91dGxlbiwgY2gsICZpbmxlbiwgMCk7CiAgICBvdXRwdXRbb3V0bGVuXSA9IDA7CgogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5jZGF0YSglcywgJWQpXG4iLCBvdXRwdXQsIGxlbik7Cn0KCnN0YXRpYyB4bWxTQVhIYW5kbGVyIGRlYnVnSFRNTFNBWEhhbmRsZXJTdHJ1Y3QgPSB7CiAgICBpbnRlcm5hbFN1YnNldERlYnVnLAogICAgaXNTdGFuZGFsb25lRGVidWcsCiAgICBoYXNJbnRlcm5hbFN1YnNldERlYnVnLAogICAgaGFzRXh0ZXJuYWxTdWJzZXREZWJ1ZywKICAgIHJlc29sdmVFbnRpdHlEZWJ1ZywKICAgIGdldEVudGl0eURlYnVnLAogICAgZW50aXR5RGVjbERlYnVnLAogICAgbm90YXRpb25EZWNsRGVidWcsCiAgICBhdHRyaWJ1dGVEZWNsRGVidWcsCiAgICBlbGVtZW50RGVjbERlYnVnLAogICAgdW5wYXJzZWRFbnRpdHlEZWNsRGVidWcsCiAgICBzZXREb2N1bWVudExvY2F0b3JEZWJ1ZywKICAgIHN0YXJ0RG9jdW1lbnREZWJ1ZywKICAgIGVuZERvY3VtZW50RGVidWcsCiAgICBodG1sc3RhcnRFbGVtZW50RGVidWcsCiAgICBlbmRFbGVtZW50RGVidWcsCiAgICByZWZlcmVuY2VEZWJ1ZywKICAgIGh0bWxjaGFyYWN0ZXJzRGVidWcsCiAgICBpZ25vcmFibGVXaGl0ZXNwYWNlRGVidWcsCiAgICBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EZWJ1ZywKICAgIGNvbW1lbnREZWJ1ZywKICAgIHdhcm5pbmdEZWJ1ZywKICAgIGVycm9yRGVidWcsCiAgICBmYXRhbEVycm9yRGVidWcsCiAgICBnZXRQYXJhbWV0ZXJFbnRpdHlEZWJ1ZywKICAgIGh0bWxjZGF0YURlYnVnLAogICAgZXh0ZXJuYWxTdWJzZXREZWJ1ZywKICAgIDEsCiAgICBOVUxMLAogICAgTlVMTCwKICAgIE5VTEwsCiAgICBOVUxMCn07CgpzdGF0aWMgeG1sU0FYSGFuZGxlclB0ciBkZWJ1Z0hUTUxTQVhIYW5kbGVyID0gJmRlYnVnSFRNTFNBWEhhbmRsZXJTdHJ1Y3Q7CiNlbmRpZiAvKiBMSUJYTUxfSFRNTF9FTkFCTEVEICovCgojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAovKioKICogc2F4UGFyc2VUZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBmaWxlIHRvIHBhcnNlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXMKICoKICogUGFyc2UgYSBmaWxlIHVzaW5nIHRoZSBTQVggQVBJIGFuZCBjaGVjayBmb3IgZXJyb3JzLgogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludApzYXhQYXJzZVRlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnJlc3VsdCwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICAgaW50IG9wdGlvbnMpIHsKICAgIGludCByZXQ7CiAgICBjaGFyICp0ZW1wOwoKICAgIG5iX3Rlc3RzKys7CiAgICB0ZW1wID0gcmVzdWx0RmlsZW5hbWUoZmlsZW5hbWUsICIiLCAiLnJlcyIpOwogICAgaWYgKHRlbXAgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAib3V0IG9mIG1lbW9yeVxuIik7CiAgICAgICAgZmF0YWxFcnJvcigpOwogICAgfQogICAgU0FYZGVidWcgPSBmb3Blbih0ZW1wLCAid2IiKTsKICAgIGlmIChTQVhkZWJ1ZyA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gd3JpdGUgdG8gJXNcbiIsIHRlbXApOwoJZnJlZSh0ZW1wKTsKCXJldHVybigtMSk7CiAgICB9CgogICAgLyogZm9yIFNBWCB3ZSByZWFsbHkgd2FudCB0aGUgY2FsbGJhY2tzIHRob3VnaCB0aGUgY29udGV4dCBoYW5kbGVycyAqLwogICAgeG1sU2V0U3RydWN0dXJlZEVycm9yRnVuYyhOVUxMLCBOVUxMKTsKICAgIHhtbFNldEdlbmVyaWNFcnJvckZ1bmMoTlVMTCwgdGVzdEVycm9ySGFuZGxlcik7CgojaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAogICAgaWYgKG9wdGlvbnMgJiBYTUxfUEFSU0VfSFRNTCkgewoJaHRtbFNBWFBhcnNlRmlsZShmaWxlbmFtZSwgTlVMTCwgZW1wdHlTQVhIYW5kbGVyLCBOVUxMKTsKCXJldCA9IDA7CiAgICB9IGVsc2UKI2VuZGlmCiAgICByZXQgPSB4bWxTQVhVc2VyUGFyc2VGaWxlKGVtcHR5U0FYSGFuZGxlciwgTlVMTCwgZmlsZW5hbWUpOwogICAgaWYgKHJldCA9PSBYTUxfV0FSX1VOREVDTEFSRURfRU5USVRZKSB7CiAgICAgICAgZnByaW50ZihTQVhkZWJ1ZywgInhtbFNBWFVzZXJQYXJzZUZpbGUgcmV0dXJuZWQgZXJyb3IgJWRcbiIsIHJldCk7CiAgICAgICAgcmV0ID0gMDsKICAgIH0KICAgIGlmIChyZXQgIT0gMCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHBhcnNlICVzXG4iLCBmaWxlbmFtZSk7CglyZXR1cm4oMSk7CiAgICB9CiNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECiAgICBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9IVE1MKSB7CglodG1sU0FYUGFyc2VGaWxlKGZpbGVuYW1lLCBOVUxMLCBkZWJ1Z0hUTUxTQVhIYW5kbGVyLCBOVUxMKTsKCXJldCA9IDA7CiAgICB9IGVsc2UKI2VuZGlmCiAgICBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9TQVgxKSB7CglyZXQgPSB4bWxTQVhVc2VyUGFyc2VGaWxlKGRlYnVnU0FYSGFuZGxlciwgTlVMTCwgZmlsZW5hbWUpOwogICAgfSBlbHNlIHsKCXJldCA9IHhtbFNBWFVzZXJQYXJzZUZpbGUoZGVidWdTQVgySGFuZGxlciwgTlVMTCwgZmlsZW5hbWUpOwogICAgfQogICAgaWYgKHJldCA9PSBYTUxfV0FSX1VOREVDTEFSRURfRU5USVRZKSB7CiAgICAgICAgZnByaW50ZihTQVhkZWJ1ZywgInhtbFNBWFVzZXJQYXJzZUZpbGUgcmV0dXJuZWQgZXJyb3IgJWRcbiIsIHJldCk7CiAgICAgICAgcmV0ID0gMDsKICAgIH0KICAgIGZjbG9zZShTQVhkZWJ1Zyk7CiAgICBpZiAoY29tcGFyZUZpbGVzKHRlbXAsIHJlc3VsdCkpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkdvdCBhIGRpZmZlcmVuY2UgZm9yICVzXG4iLCBmaWxlbmFtZSk7CiAgICAgICAgcmV0ID0gMTsKICAgIH0gZWxzZQogICAgdW5saW5rKHRlbXApOwogICAgZnJlZSh0ZW1wKTsKICAgIAogICAgLyogc3dpdGNoIGJhY2sgdG8gc3RydWN0dXJlZCBlcnJvciBoYW5kbGluZyAqLwogICAgeG1sU2V0R2VuZXJpY0Vycm9yRnVuYyhOVUxMLCBOVUxMKTsKICAgIHhtbFNldFN0cnVjdHVyZWRFcnJvckZ1bmMoTlVMTCwgdGVzdFN0cnVjdHVyZWRFcnJvckhhbmRsZXIpOwoKICAgIHJldHVybihyZXQpOwp9CiNlbmRpZgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQkJCQkJCSoKICoJCVBhcnNlIHRvIHRyZWUgYmFzZWQgdGVzdHMJCQkJKgogKgkJCQkJCQkJCSoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqCiAqIG9sZFBhcnNlVGVzdDoKICogQGZpbGVuYW1lOiB0aGUgZmlsZSB0byBwYXJzZQogKiBAcmVzdWx0OiB0aGUgZmlsZSB3aXRoIGV4cGVjdGVkIHJlc3VsdAogKiBAZXJyOiB0aGUgZmlsZSB3aXRoIGVycm9yIG1lc3NhZ2VzOiB1bnVzZWQKICoKICogUGFyc2UgYSBmaWxlIHVzaW5nIHRoZSBvbGQgeG1sUGFyc2VGaWxlIEFQSSwgdGhlbiBzZXJpYWxpemUgYmFjawogKiByZXBhcnNlIHRoZSByZXN1bHQgYW5kIHNlcmlhbGl6ZSBhZ2FpbiwgdGhlbiBjaGVjayBmb3IgZGV2aWF0aW9uCiAqIGluIHNlcmlhbGl6YXRpb24uCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50Cm9sZFBhcnNlVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqcmVzdWx0LAogICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyIEFUVFJJQlVURV9VTlVTRUQsCgkgICAgIGludCBvcHRpb25zIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHhtbERvY1B0ciBkb2M7CiAgICBjaGFyICp0ZW1wOwogICAgaW50IHJlcyA9IDA7CgogICAgbmJfdGVzdHMrKzsKICAgIC8qCiAgICAgKiBiYXNlIG9mIHRoZSB0ZXN0LCBwYXJzZSB3aXRoIHRoZSBvbGQgQVBJCiAgICAgKi8KI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgIGRvYyA9IHhtbFBhcnNlRmlsZShmaWxlbmFtZSk7CiNlbHNlCiAgICBkb2MgPSB4bWxSZWFkRmlsZShmaWxlbmFtZSwgTlVMTCwgMCk7CiNlbmRpZgogICAgaWYgKGRvYyA9PSBOVUxMKQogICAgICAgIHJldHVybigxKTsKICAgIHRlbXAgPSByZXN1bHRGaWxlbmFtZShmaWxlbmFtZSwgIiIsICIucmVzIik7CiAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJvdXQgb2YgbWVtb3J5XG4iKTsKICAgICAgICBmYXRhbEVycm9yKCk7CiAgICB9CiAgICB4bWxTYXZlRmlsZSh0ZW1wLCBkb2MpOwogICAgaWYgKGNvbXBhcmVGaWxlcyh0ZW1wLCByZXN1bHQpKSB7CiAgICAgICAgcmVzID0gMTsKICAgIH0KICAgIHhtbEZyZWVEb2MoZG9jKTsKCiAgICAvKgogICAgICogUGFyc2UgdGhlIHNhdmVkIHJlc3VsdCB0byBtYWtlIHN1cmUgdGhlIHJvdW5kIHRyaXAgaXMgb2theQogICAgICovCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECiAgICBkb2MgPSB4bWxQYXJzZUZpbGUodGVtcCk7CiNlbHNlCiAgICBkb2MgPSB4bWxSZWFkRmlsZSh0ZW1wLCBOVUxMLCAwKTsKI2VuZGlmCiAgICBpZiAoZG9jID09IE5VTEwpCiAgICAgICAgcmV0dXJuKDEpOwogICAgeG1sU2F2ZUZpbGUodGVtcCwgZG9jKTsKICAgIGlmIChjb21wYXJlRmlsZXModGVtcCwgcmVzdWx0KSkgewogICAgICAgIHJlcyA9IDE7CiAgICB9CiAgICB4bWxGcmVlRG9jKGRvYyk7CgogICAgdW5saW5rKHRlbXApOwogICAgZnJlZSh0ZW1wKTsKICAgIHJldHVybihyZXMpOwp9CgojaWZkZWYgTElCWE1MX1BVU0hfRU5BQkxFRAovKioKICogcHVzaFBhcnNlVGVzdDoKICogQGZpbGVuYW1lOiB0aGUgZmlsZSB0byBwYXJzZQogKiBAcmVzdWx0OiB0aGUgZmlsZSB3aXRoIGV4cGVjdGVkIHJlc3VsdAogKiBAZXJyOiB0aGUgZmlsZSB3aXRoIGVycm9yIG1lc3NhZ2VzOiB1bnVzZWQKICoKICogUGFyc2UgYSBmaWxlIHVzaW5nIHRoZSBQdXNoIEFQSSwgdGhlbiBzZXJpYWxpemUgYmFjawogKiB0byBjaGVjayBmb3IgY29udGVudC4KICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKcHVzaFBhcnNlVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqcmVzdWx0LAogICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyIEFUVFJJQlVURV9VTlVTRUQsCgkgICAgIGludCBvcHRpb25zKSB7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7CiAgICB4bWxEb2NQdHIgZG9jOwogICAgY29uc3QgY2hhciAqYmFzZTsKICAgIGludCBzaXplLCByZXM7CiAgICBpbnQgY3VyID0gMDsKCiAgICBuYl90ZXN0cysrOwogICAgLyoKICAgICAqIGxvYWQgdGhlIGRvY3VtZW50IGluIG1lbW9yeSBhbmQgd29yayBmcm9tIHRoZXJlLgogICAgICovCiAgICBpZiAobG9hZE1lbShmaWxlbmFtZSwgJmJhc2UsICZzaXplKSAhPSAwKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gbG9hZCAlc1xuIiwgZmlsZW5hbWUpOwoJcmV0dXJuKC0xKTsKICAgIH0KICAgIAojaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAogICAgaWYgKG9wdGlvbnMgJiBYTUxfUEFSU0VfSFRNTCkKCWN0eHQgPSBodG1sQ3JlYXRlUHVzaFBhcnNlckN0eHQoTlVMTCwgTlVMTCwgYmFzZSArIGN1ciwgNCwgZmlsZW5hbWUsCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9DSEFSX0VOQ09ESU5HX05PTkUpOwogICAgZWxzZQojZW5kaWYKICAgIGN0eHQgPSB4bWxDcmVhdGVQdXNoUGFyc2VyQ3R4dChOVUxMLCBOVUxMLCBiYXNlICsgY3VyLCA0LCBmaWxlbmFtZSk7CiAgICB4bWxDdHh0VXNlT3B0aW9ucyhjdHh0LCBvcHRpb25zKTsKICAgIGN1ciArPSA0OwogICAgd2hpbGUgKGN1ciA8IHNpemUpIHsKICAgICAgICBpZiAoY3VyICsgMTAyNCA+PSBzaXplKSB7CiNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECgkgICAgaWYgKG9wdGlvbnMgJiBYTUxfUEFSU0VfSFRNTCkKCQlodG1sUGFyc2VDaHVuayhjdHh0LCBiYXNlICsgY3VyLCBzaXplIC0gY3VyLCAxKTsKCSAgICBlbHNlCiNlbmRpZgoJICAgIHhtbFBhcnNlQ2h1bmsoY3R4dCwgYmFzZSArIGN1ciwgc2l6ZSAtIGN1ciwgMSk7CgkgICAgYnJlYWs7Cgl9IGVsc2UgewojaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAoJICAgIGlmIChvcHRpb25zICYgWE1MX1BBUlNFX0hUTUwpCgkJaHRtbFBhcnNlQ2h1bmsoY3R4dCwgYmFzZSArIGN1ciwgMTAyNCwgMCk7CgkgICAgZWxzZQojZW5kaWYKCSAgICB4bWxQYXJzZUNodW5rKGN0eHQsIGJhc2UgKyBjdXIsIDEwMjQsIDApOwoJICAgIGN1ciArPSAxMDI0OwoJfQogICAgfQogICAgZG9jID0gY3R4dC0+bXlEb2M7CiNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECiAgICBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9IVE1MKQogICAgICAgIHJlcyA9IDE7CiAgICBlbHNlCiNlbmRpZgogICAgcmVzID0gY3R4dC0+d2VsbEZvcm1lZDsKICAgIHhtbEZyZWVQYXJzZXJDdHh0KGN0eHQpOwogICAgZnJlZSgoY2hhciAqKWJhc2UpOwogICAgaWYgKCFyZXMpIHsKCXhtbEZyZWVEb2MoZG9jKTsKCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHBhcnNlICVzXG4iLCBmaWxlbmFtZSk7CglyZXR1cm4oLTEpOwogICAgfQojaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAogICAgaWYgKG9wdGlvbnMgJiBYTUxfUEFSU0VfSFRNTCkKCWh0bWxEb2NEdW1wTWVtb3J5KGRvYywgKHhtbENoYXIgKiopICZiYXNlLCAmc2l6ZSk7CiAgICBlbHNlCiNlbmRpZgogICAgeG1sRG9jRHVtcE1lbW9yeShkb2MsICh4bWxDaGFyICoqKSAmYmFzZSwgJnNpemUpOwogICAgeG1sRnJlZURvYyhkb2MpOwogICAgcmVzID0gY29tcGFyZUZpbGVNZW0ocmVzdWx0LCBiYXNlLCBzaXplKTsKICAgIGlmICgoYmFzZSA9PSBOVUxMKSB8fCAocmVzICE9IDApKSB7CglpZiAoYmFzZSAhPSBOVUxMKQoJICAgIHhtbEZyZWUoKGNoYXIgKiliYXNlKTsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJlc3VsdCBmb3IgJXMgZmFpbGVkXG4iLCBmaWxlbmFtZSk7CglyZXR1cm4oLTEpOwogICAgfQogICAgeG1sRnJlZSgoY2hhciAqKWJhc2UpOwogICAgaWYgKGVyciAhPSBOVUxMKSB7CglyZXMgPSBjb21wYXJlRmlsZU1lbShlcnIsIHRlc3RFcnJvcnMsIHRlc3RFcnJvcnNTaXplKTsKCWlmIChyZXMgIT0gMCkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZm9yICVzIGZhaWxlZFxuIiwgZmlsZW5hbWUpOwoJICAgIHJldHVybigtMSk7Cgl9CiAgICB9CiAgICByZXR1cm4oMCk7Cn0KI2VuZGlmCgovKioKICogbWVtUGFyc2VUZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBmaWxlIHRvIHBhcnNlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXM6IHVudXNlZAogKgogKiBQYXJzZSBhIGZpbGUgdXNpbmcgdGhlIG9sZCB4bWxSZWFkTWVtb3J5IEFQSSwgdGhlbiBzZXJpYWxpemUgYmFjawogKiByZXBhcnNlIHRoZSByZXN1bHQgYW5kIHNlcmlhbGl6ZSBhZ2FpbiwgdGhlbiBjaGVjayBmb3IgZGV2aWF0aW9uCiAqIGluIHNlcmlhbGl6YXRpb24uCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50Cm1lbVBhcnNlVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqcmVzdWx0LAogICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyIEFUVFJJQlVURV9VTlVTRUQsCgkgICAgIGludCBvcHRpb25zIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHhtbERvY1B0ciBkb2M7CiAgICBjb25zdCBjaGFyICpiYXNlOwogICAgaW50IHNpemUsIHJlczsKCiAgICBuYl90ZXN0cysrOwogICAgLyoKICAgICAqIGxvYWQgYW5kIHBhcnNlIHRoZSBtZW1vcnkKICAgICAqLwogICAgaWYgKGxvYWRNZW0oZmlsZW5hbWUsICZiYXNlLCAmc2l6ZSkgIT0gMCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGxvYWQgJXNcbiIsIGZpbGVuYW1lKTsKCXJldHVybigtMSk7CiAgICB9CiAgICAKICAgIGRvYyA9IHhtbFJlYWRNZW1vcnkoYmFzZSwgc2l6ZSwgZmlsZW5hbWUsIE5VTEwsIDApOwogICAgdW5sb2FkTWVtKGJhc2UpOwogICAgaWYgKGRvYyA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuKDEpOwogICAgfQogICAgeG1sRG9jRHVtcE1lbW9yeShkb2MsICh4bWxDaGFyICoqKSAmYmFzZSwgJnNpemUpOwogICAgeG1sRnJlZURvYyhkb2MpOwogICAgcmVzID0gY29tcGFyZUZpbGVNZW0ocmVzdWx0LCBiYXNlLCBzaXplKTsKICAgIGlmICgoYmFzZSA9PSBOVUxMKSB8fCAocmVzICE9IDApKSB7CglpZiAoYmFzZSAhPSBOVUxMKQoJICAgIHhtbEZyZWUoKGNoYXIgKiliYXNlKTsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJlc3VsdCBmb3IgJXMgZmFpbGVkXG4iLCBmaWxlbmFtZSk7CglyZXR1cm4oLTEpOwogICAgfQogICAgeG1sRnJlZSgoY2hhciAqKWJhc2UpOwogICAgcmV0dXJuKDApOwp9CgovKioKICogbm9lbnRQYXJzZVRlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gcGFyc2UKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlczogdW51c2VkCiAqCiAqIFBhcnNlIGEgZmlsZSB3aXRoIGVudGl0eSByZXNvbHV0aW9uLCB0aGVuIHNlcmlhbGl6ZSBiYWNrCiAqIHJlcGFyc2UgdGhlIHJlc3VsdCBhbmQgc2VyaWFsaXplIGFnYWluLCB0aGVuIGNoZWNrIGZvciBkZXZpYXRpb24KICogaW4gc2VyaWFsaXphdGlvbi4KICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKbm9lbnRQYXJzZVRlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnJlc3VsdCwKICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyICBBVFRSSUJVVEVfVU5VU0VELAoJICAgICAgIGludCBvcHRpb25zKSB7CiAgICB4bWxEb2NQdHIgZG9jOwogICAgY2hhciAqdGVtcDsKICAgIGludCByZXMgPSAwOwoKICAgIG5iX3Rlc3RzKys7CiAgICAvKgogICAgICogYmFzZSBvZiB0aGUgdGVzdCwgcGFyc2Ugd2l0aCB0aGUgb2xkIEFQSQogICAgICovCiAgICBkb2MgPSB4bWxSZWFkRmlsZShmaWxlbmFtZSwgTlVMTCwgb3B0aW9ucyk7CiAgICBpZiAoZG9jID09IE5VTEwpCiAgICAgICAgcmV0dXJuKDEpOwogICAgdGVtcCA9IHJlc3VsdEZpbGVuYW1lKGZpbGVuYW1lLCAiIiwgIi5yZXMiKTsKICAgIGlmICh0ZW1wID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk91dCBvZiBtZW1vcnlcbiIpOwogICAgICAgIGZhdGFsRXJyb3IoKTsKICAgIH0KICAgIHhtbFNhdmVGaWxlKHRlbXAsIGRvYyk7CiAgICBpZiAoY29tcGFyZUZpbGVzKHRlbXAsIHJlc3VsdCkpIHsKICAgICAgICByZXMgPSAxOwogICAgfQogICAgeG1sRnJlZURvYyhkb2MpOwoKICAgIC8qCiAgICAgKiBQYXJzZSB0aGUgc2F2ZWQgcmVzdWx0IHRvIG1ha2Ugc3VyZSB0aGUgcm91bmQgdHJpcCBpcyBva2F5CiAgICAgKi8KICAgIGRvYyA9IHhtbFJlYWRGaWxlKGZpbGVuYW1lLCBOVUxMLCBvcHRpb25zKTsKICAgIGlmIChkb2MgPT0gTlVMTCkKICAgICAgICByZXR1cm4oMSk7CiAgICB4bWxTYXZlRmlsZSh0ZW1wLCBkb2MpOwogICAgaWYgKGNvbXBhcmVGaWxlcyh0ZW1wLCByZXN1bHQpKSB7CiAgICAgICAgcmVzID0gMTsKICAgIH0KICAgIHhtbEZyZWVEb2MoZG9jKTsKCiAgICB1bmxpbmsodGVtcCk7CiAgICBmcmVlKHRlbXApOwogICAgcmV0dXJuKHJlcyk7Cn0KCi8qKgogKiBlcnJQYXJzZVRlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gcGFyc2UKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlcwogKgogKiBQYXJzZSBhIGZpbGUgdXNpbmcgdGhlIHhtbFJlYWRGaWxlIEFQSSBhbmQgY2hlY2sgZm9yIGVycm9ycy4KICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKZXJyUGFyc2VUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKmVyciwKICAgICAgICAgICAgIGludCBvcHRpb25zKSB7CiAgICB4bWxEb2NQdHIgZG9jOwogICAgY29uc3QgY2hhciAqYmFzZSA9IE5VTEw7CiAgICBpbnQgc2l6ZSwgcmVzID0gMDsKCiAgICBuYl90ZXN0cysrOwojaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAogICAgaWYgKG9wdGlvbnMgJiBYTUxfUEFSU0VfSFRNTCkgewogICAgICAgIGRvYyA9IGh0bWxSZWFkRmlsZShmaWxlbmFtZSwgTlVMTCwgb3B0aW9ucyk7CiAgICB9IGVsc2UKI2VuZGlmCiNpZmRlZiBMSUJYTUxfWElOQ0xVREVfRU5BQkxFRAogICAgaWYgKG9wdGlvbnMgJiBYTUxfUEFSU0VfWElOQ0xVREUpIHsKCWRvYyA9IHhtbFJlYWRGaWxlKGZpbGVuYW1lLCBOVUxMLCBvcHRpb25zKTsKCXhtbFhJbmNsdWRlUHJvY2Vzc0ZsYWdzKGRvYywgb3B0aW9ucyk7CiAgICB9IGVsc2UKI2VuZGlmCiAgICB7Cgl4bWxHZXRXYXJuaW5nc0RlZmF1bHRWYWx1ZSA9IDE7Cglkb2MgPSB4bWxSZWFkRmlsZShmaWxlbmFtZSwgTlVMTCwgb3B0aW9ucyk7CiAgICB9CiAgICB4bWxHZXRXYXJuaW5nc0RlZmF1bHRWYWx1ZSA9IDA7CiAgICBpZiAocmVzdWx0KSB7CglpZiAoZG9jID09IE5VTEwpIHsKCSAgICBiYXNlID0gIiI7CgkgICAgc2l6ZSA9IDA7Cgl9IGVsc2UgewojaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAoJICAgIGlmIChvcHRpb25zICYgWE1MX1BBUlNFX0hUTUwpIHsKCQlodG1sRG9jRHVtcE1lbW9yeShkb2MsICh4bWxDaGFyICoqKSAmYmFzZSwgJnNpemUpOwoJICAgIH0gZWxzZQojZW5kaWYKCSAgICB4bWxEb2NEdW1wTWVtb3J5KGRvYywgKHhtbENoYXIgKiopICZiYXNlLCAmc2l6ZSk7Cgl9CglyZXMgPSBjb21wYXJlRmlsZU1lbShyZXN1bHQsIGJhc2UsIHNpemUpOwogICAgfQogICAgaWYgKGRvYyAhPSBOVUxMKSB7CglpZiAoYmFzZSAhPSBOVUxMKQoJICAgIHhtbEZyZWUoKGNoYXIgKiliYXNlKTsKCXhtbEZyZWVEb2MoZG9jKTsKICAgIH0KICAgIGlmIChyZXMgIT0gMCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiUmVzdWx0IGZvciAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lKTsKCXJldHVybigtMSk7CiAgICB9CiAgICBpZiAoZXJyICE9IE5VTEwpIHsKCXJlcyA9IGNvbXBhcmVGaWxlTWVtKGVyciwgdGVzdEVycm9ycywgdGVzdEVycm9yc1NpemUpOwoJaWYgKHJlcyAhPSAwKSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBmb3IgJXMgZmFpbGVkXG4iLCBmaWxlbmFtZSk7CgkgICAgcmV0dXJuKC0xKTsKCX0KICAgIH0gZWxzZSBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9EVERWQUxJRCkgewogICAgICAgIGlmICh0ZXN0RXJyb3JzU2l6ZSAhPSAwKQoJICAgIGZwcmludGYoc3RkZXJyLCAiVmFsaWRhdGlvbiBmb3IgJXMgZmFpbGVkXG4iLCBmaWxlbmFtZSk7CiAgICB9CgogICAgcmV0dXJuKDApOwp9CgojaWZkZWYgTElCWE1MX1JFQURFUl9FTkFCTEVECi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJCQkJCQkqCiAqCQlSZWFkZXIgYmFzZWQgdGVzdHMJCQkJCSoKICoJCQkJCQkJCQkqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCBwcm9jZXNzTm9kZShGSUxFICpvdXQsIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKSB7CiAgICBjb25zdCB4bWxDaGFyICpuYW1lLCAqdmFsdWU7CiAgICBpbnQgdHlwZSwgZW1wdHk7CgogICAgdHlwZSA9IHhtbFRleHRSZWFkZXJOb2RlVHlwZShyZWFkZXIpOwogICAgZW1wdHkgPSB4bWxUZXh0UmVhZGVySXNFbXB0eUVsZW1lbnQocmVhZGVyKTsKCiAgICBuYW1lID0geG1sVGV4dFJlYWRlckNvbnN0TmFtZShyZWFkZXIpOwogICAgaWYgKG5hbWUgPT0gTlVMTCkKCW5hbWUgPSBCQURfQ0FTVCAiLS0iOwoKICAgIHZhbHVlID0geG1sVGV4dFJlYWRlckNvbnN0VmFsdWUocmVhZGVyKTsKCiAgICAKICAgIGZwcmludGYob3V0LCAiJWQgJWQgJXMgJWQgJWQiLCAKCSAgICB4bWxUZXh0UmVhZGVyRGVwdGgocmVhZGVyKSwKCSAgICB0eXBlLAoJICAgIG5hbWUsCgkgICAgZW1wdHksCgkgICAgeG1sVGV4dFJlYWRlckhhc1ZhbHVlKHJlYWRlcikpOwogICAgaWYgKHZhbHVlID09IE5VTEwpCglmcHJpbnRmKG91dCwgIlxuIik7CiAgICBlbHNlIHsKCWZwcmludGYob3V0LCAiICVzXG4iLCB2YWx1ZSk7CiAgICB9Cn0Kc3RhdGljIGludApzdHJlYW1Qcm9jZXNzVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICplcnIsCiAgICAgICAgICAgICAgICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyLCBjb25zdCBjaGFyICpybmcpIHsKICAgIGludCByZXQ7CiAgICBjaGFyICp0ZW1wID0gTlVMTDsKICAgIEZJTEUgKnQgPSBOVUxMOwoKICAgIGlmIChyZWFkZXIgPT0gTlVMTCkKICAgICAgICByZXR1cm4oLTEpOwoKICAgIG5iX3Rlc3RzKys7CiAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKCXRlbXAgPSByZXN1bHRGaWxlbmFtZShmaWxlbmFtZSwgIiIsICIucmVzIik7CglpZiAodGVtcCA9PSBOVUxMKSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5XG4iKTsKCSAgICBmYXRhbEVycm9yKCk7Cgl9Cgl0ID0gZm9wZW4odGVtcCwgIndiIik7CglpZiAodCA9PSBOVUxMKSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBvcGVuIHRlbXAgZmlsZSAlc1xuIiwgdGVtcCk7CgkgICAgZnJlZSh0ZW1wKTsKCSAgICByZXR1cm4oLTEpOwoJfQogICAgfQojaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAogICAgaWYgKHJuZyAhPSBOVUxMKSB7CglyZXQgPSB4bWxUZXh0UmVhZGVyUmVsYXhOR1ZhbGlkYXRlKHJlYWRlciwgcm5nKTsKCWlmIChyZXQgPCAwKSB7CgkgICAgdGVzdEVycm9ySGFuZGxlcihOVUxMLCAiUmVsYXgtTkcgc2NoZW1hICVzIGZhaWxlZCB0byBjb21waWxlXG4iLAoJICAgICAgICAgICAgICAgICAgICAgcm5nKTsKCSAgICBmY2xvc2UodCk7CgkgICAgdW5saW5rKHRlbXApOwoJICAgIGZyZWUodGVtcCk7CgkgICAgcmV0dXJuKDApOwoJfQogICAgfQojZW5kaWYKICAgIHhtbEdldFdhcm5pbmdzRGVmYXVsdFZhbHVlID0gMTsKICAgIHJldCA9IHhtbFRleHRSZWFkZXJSZWFkKHJlYWRlcik7CiAgICB3aGlsZSAocmV0ID09IDEpIHsKCWlmICgodCAhPSBOVUxMKSAmJiAocm5nID09IE5VTEwpKQoJICAgIHByb2Nlc3NOb2RlKHQsIHJlYWRlcik7CiAgICAgICAgcmV0ID0geG1sVGV4dFJlYWRlclJlYWQocmVhZGVyKTsKICAgIH0KICAgIGlmIChyZXQgIT0gMCkgewogICAgICAgIHRlc3RFcnJvckhhbmRsZXIoTlVMTCwgIiVzIDogZmFpbGVkIHRvIHBhcnNlXG4iLCBmaWxlbmFtZSk7CiAgICB9CiAgICBpZiAocm5nICE9IE5VTEwpIHsKICAgICAgICBpZiAoeG1sVGV4dFJlYWRlcklzVmFsaWQocmVhZGVyKSAhPSAxKSB7CgkgICAgdGVzdEVycm9ySGFuZGxlcihOVUxMLCAiJXMgZmFpbHMgdG8gdmFsaWRhdGVcbiIsIGZpbGVuYW1lKTsKCX0gZWxzZSB7CgkgICAgdGVzdEVycm9ySGFuZGxlcihOVUxMLCAiJXMgdmFsaWRhdGVzXG4iLCBmaWxlbmFtZSk7Cgl9CiAgICB9CiAgICB4bWxHZXRXYXJuaW5nc0RlZmF1bHRWYWx1ZSA9IDA7CiAgICBpZiAodCAhPSBOVUxMKSB7CiAgICAgICAgZmNsb3NlKHQpOwoJcmV0ID0gY29tcGFyZUZpbGVzKHRlbXAsIHJlc3VsdCk7Cgl1bmxpbmsodGVtcCk7CglmcmVlKHRlbXApOwoJaWYgKHJldCkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiUmVzdWx0IGZvciAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lKTsKCSAgICByZXR1cm4oLTEpOwoJfQogICAgfQogICAgaWYgKGVyciAhPSBOVUxMKSB7CglyZXQgPSBjb21wYXJlRmlsZU1lbShlcnIsIHRlc3RFcnJvcnMsIHRlc3RFcnJvcnNTaXplKTsKCWlmIChyZXQgIT0gMCkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZm9yICVzIGZhaWxlZFxuIiwgZmlsZW5hbWUpOwoJICAgIHByaW50ZigiJXMiLCB0ZXN0RXJyb3JzKTsKCSAgICByZXR1cm4oLTEpOwoJfQogICAgfQoKICAgIHJldHVybigwKTsKfQoKLyoqCiAqIHN0cmVhbVBhcnNlVGVzdDoKICogQGZpbGVuYW1lOiB0aGUgZmlsZSB0byBwYXJzZQogKiBAcmVzdWx0OiB0aGUgZmlsZSB3aXRoIGV4cGVjdGVkIHJlc3VsdAogKiBAZXJyOiB0aGUgZmlsZSB3aXRoIGVycm9yIG1lc3NhZ2VzCiAqCiAqIFBhcnNlIGEgZmlsZSB1c2luZyB0aGUgcmVhZGVyIEFQSSBhbmQgY2hlY2sgZm9yIGVycm9ycy4KICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKc3RyZWFtUGFyc2VUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKmVyciwKICAgICAgICAgICAgICAgIGludCBvcHRpb25zKSB7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsKICAgIGludCByZXQ7CgogICAgcmVhZGVyID0geG1sUmVhZGVyRm9yRmlsZShmaWxlbmFtZSwgTlVMTCwgb3B0aW9ucyk7CiAgICByZXQgPSBzdHJlYW1Qcm9jZXNzVGVzdChmaWxlbmFtZSwgcmVzdWx0LCBlcnIsIHJlYWRlciwgTlVMTCk7CiAgICB4bWxGcmVlVGV4dFJlYWRlcihyZWFkZXIpOwogICAgcmV0dXJuKHJldCk7Cn0KCi8qKgogKiB3YWxrZXJQYXJzZVRlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gcGFyc2UKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlcwogKgogKiBQYXJzZSBhIGZpbGUgdXNpbmcgdGhlIHdhbGtlciwgaS5lLiBhIHJlYWRlciBidWlsdCBmcm9tIGEgYXRyZWUuCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50CndhbGtlclBhcnNlVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICplcnIsCiAgICAgICAgICAgICAgICBpbnQgb3B0aW9ucykgewogICAgeG1sRG9jUHRyIGRvYzsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOwogICAgaW50IHJldDsKCiAgICBkb2MgPSB4bWxSZWFkRmlsZShmaWxlbmFtZSwgTlVMTCwgb3B0aW9ucyk7CiAgICBpZiAoZG9jID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBwYXJzZSAlc1xuIiwgZmlsZW5hbWUpOwoJcmV0dXJuKC0xKTsKICAgIH0KICAgIHJlYWRlciA9IHhtbFJlYWRlcldhbGtlcihkb2MpOwogICAgcmV0ID0gc3RyZWFtUHJvY2Vzc1Rlc3QoZmlsZW5hbWUsIHJlc3VsdCwgZXJyLCByZWFkZXIsIE5VTEwpOwogICAgeG1sRnJlZVRleHRSZWFkZXIocmVhZGVyKTsKICAgIHhtbEZyZWVEb2MoZG9jKTsKICAgIHJldHVybihyZXQpOwp9CgovKioKICogc3RyZWFtTWVtUGFyc2VUZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBmaWxlIHRvIHBhcnNlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXMKICoKICogUGFyc2UgYSBmaWxlIHVzaW5nIHRoZSByZWFkZXIgQVBJIGZyb20gbWVtb3J5IGFuZCBjaGVjayBmb3IgZXJyb3JzLgogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludApzdHJlYW1NZW1QYXJzZVRlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqZXJyLAogICAgICAgICAgICAgICAgICAgaW50IG9wdGlvbnMpIHsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOwogICAgaW50IHJldDsKICAgIGNvbnN0IGNoYXIgKmJhc2U7CiAgICBpbnQgc2l6ZTsKCiAgICAvKgogICAgICogbG9hZCBhbmQgcGFyc2UgdGhlIG1lbW9yeQogICAgICovCiAgICBpZiAobG9hZE1lbShmaWxlbmFtZSwgJmJhc2UsICZzaXplKSAhPSAwKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gbG9hZCAlc1xuIiwgZmlsZW5hbWUpOwoJcmV0dXJuKC0xKTsKICAgIH0KICAgIHJlYWRlciA9IHhtbFJlYWRlckZvck1lbW9yeShiYXNlLCBzaXplLCBmaWxlbmFtZSwgTlVMTCwgb3B0aW9ucyk7CiAgICByZXQgPSBzdHJlYW1Qcm9jZXNzVGVzdChmaWxlbmFtZSwgcmVzdWx0LCBlcnIsIHJlYWRlciwgTlVMTCk7CiAgICBmcmVlKChjaGFyICopYmFzZSk7CiAgICB4bWxGcmVlVGV4dFJlYWRlcihyZWFkZXIpOwogICAgcmV0dXJuKHJldCk7Cn0KI2VuZGlmCgojaWZkZWYgTElCWE1MX1hQQVRIX0VOQUJMRUQKI2lmZGVmIExJQlhNTF9ERUJVR19FTkFCTEVECi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJCQkJCQkqCiAqCQlYUGF0aCBhbmQgWFBvaW50ZXIgYmFzZWQgdGVzdHMJCQkJKgogKgkJCQkJCQkJCSoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBGSUxFICp4cGF0aE91dHB1dDsKc3RhdGljIHhtbERvY1B0ciB4cGF0aERvY3VtZW50OwoKc3RhdGljIHZvaWQKdGVzdFhQYXRoKGNvbnN0IGNoYXIgKnN0ciwgaW50IHhwdHIsIGludCBleHByKSB7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXM7CiAgICB4bWxYUGF0aENvbnRleHRQdHIgY3R4dDsKICAgIAogICAgbmJfdGVzdHMrKzsKI2lmIGRlZmluZWQoTElCWE1MX1hQVFJfRU5BQkxFRCkKICAgIGlmICh4cHRyKSB7CgljdHh0ID0geG1sWFB0ck5ld0NvbnRleHQoeHBhdGhEb2N1bWVudCwgTlVMTCwgTlVMTCk7CglyZXMgPSB4bWxYUHRyRXZhbChCQURfQ0FTVCBzdHIsIGN0eHQpOwogICAgfSBlbHNlIHsKI2VuZGlmCgljdHh0ID0geG1sWFBhdGhOZXdDb250ZXh0KHhwYXRoRG9jdW1lbnQpOwoJY3R4dC0+bm9kZSA9IHhtbERvY0dldFJvb3RFbGVtZW50KHhwYXRoRG9jdW1lbnQpOwoJaWYgKGV4cHIpCgkgICAgcmVzID0geG1sWFBhdGhFdmFsRXhwcmVzc2lvbihCQURfQ0FTVCBzdHIsIGN0eHQpOwoJZWxzZSB7CgkgICAgLyogcmVzID0geG1sWFBhdGhFdmFsKEJBRF9DQVNUIHN0ciwgY3R4dCk7ICovCgkgICAgeG1sWFBhdGhDb21wRXhwclB0ciBjb21wOwoKCSAgICBjb21wID0geG1sWFBhdGhDb21waWxlKEJBRF9DQVNUIHN0cik7CgkgICAgaWYgKGNvbXAgIT0gTlVMTCkgewoJCXJlcyA9IHhtbFhQYXRoQ29tcGlsZWRFdmFsKGNvbXAsIGN0eHQpOwoJCXhtbFhQYXRoRnJlZUNvbXBFeHByKGNvbXApOwoJICAgIH0gZWxzZQoJCXJlcyA9IE5VTEw7Cgl9CiNpZiBkZWZpbmVkKExJQlhNTF9YUFRSX0VOQUJMRUQpCiAgICB9CiNlbmRpZgogICAgeG1sWFBhdGhEZWJ1Z0R1bXBPYmplY3QoeHBhdGhPdXRwdXQsIHJlcywgMCk7CiAgICB4bWxYUGF0aEZyZWVPYmplY3QocmVzKTsKICAgIHhtbFhQYXRoRnJlZUNvbnRleHQoY3R4dCk7Cn0KCi8qKgogKiB4cGF0aEV4cHJUZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBmaWxlIHRvIHBhcnNlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXMKICoKICogUGFyc2UgYSBmaWxlIGNvbnRhaW5pbmcgWFBhdGggc3RhbmRhbG9uZSBleHByZXNzaW9ucyBhbmQgZXZhbHVhdGUgdGhlbQogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludAp4cGF0aENvbW1vblRlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnJlc3VsdCwKICAgICAgICAgICAgICAgIGludCB4cHRyLCBpbnQgZXhwcikgewogICAgRklMRSAqaW5wdXQ7CiAgICBjaGFyIGV4cHJlc3Npb25bNTAwMF07CiAgICBpbnQgbGVuLCByZXQgPSAwOwogICAgY2hhciAqdGVtcDsKCiAgICB0ZW1wID0gcmVzdWx0RmlsZW5hbWUoZmlsZW5hbWUsICIiLCAiLnJlcyIpOwogICAgaWYgKHRlbXAgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiT3V0IG9mIG1lbW9yeVxuIik7CiAgICAgICAgZmF0YWxFcnJvcigpOwogICAgfQogICAgeHBhdGhPdXRwdXQgPSBmb3Blbih0ZW1wLCAid2IiKTsKICAgIGlmICh4cGF0aE91dHB1dCA9PSBOVUxMKSB7CglmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlICVzXG4iLCB0ZW1wKTsKICAgICAgICBmcmVlKHRlbXApOwoJcmV0dXJuKC0xKTsKICAgIH0KCiAgICBpbnB1dCA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKTsKICAgIGlmIChpbnB1dCA9PSBOVUxMKSB7CiAgICAgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCgkJIkNhbm5vdCBvcGVuICVzIGZvciByZWFkaW5nXG4iLCBmaWxlbmFtZSk7CiAgICAgICAgZnJlZSh0ZW1wKTsKCXJldHVybigtMSk7CiAgICB9CiAgICB3aGlsZSAoZmdldHMoZXhwcmVzc2lvbiwgNDUwMCwgaW5wdXQpICE9IE5VTEwpIHsKCWxlbiA9IHN0cmxlbihleHByZXNzaW9uKTsKCWxlbi0tOwoJd2hpbGUgKChsZW4gPj0gMCkgJiYgCgkgICAgICAgKChleHByZXNzaW9uW2xlbl0gPT0gJ1xuJykgfHwgKGV4cHJlc3Npb25bbGVuXSA9PSAnXHQnKSB8fAoJCShleHByZXNzaW9uW2xlbl0gPT0gJ1xyJykgfHwgKGV4cHJlc3Npb25bbGVuXSA9PSAnICcpKSkgbGVuLS07CglleHByZXNzaW9uW2xlbiArIDFdID0gMDsgICAgICAKCWlmIChsZW4gPj0gMCkgewoJICAgIGZwcmludGYoeHBhdGhPdXRwdXQsCgkgICAgICAgICAgICAiXG49PT09PT09PT09PT09PT09PT09PT09PT1cbkV4cHJlc3Npb246ICVzXG4iLAoJCSAgICBleHByZXNzaW9uKSA7CgkgICAgdGVzdFhQYXRoKGV4cHJlc3Npb24sIHhwdHIsIGV4cHIpOwoJfQogICAgfQoKICAgIGZjbG9zZShpbnB1dCk7CiAgICBmY2xvc2UoeHBhdGhPdXRwdXQpOwogICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7CglyZXQgPSBjb21wYXJlRmlsZXModGVtcCwgcmVzdWx0KTsKCWlmIChyZXQpIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgIlJlc3VsdCBmb3IgJXMgZmFpbGVkXG4iLCBmaWxlbmFtZSk7Cgl9CiAgICB9CgogICAgdW5saW5rKHRlbXApOwogICAgZnJlZSh0ZW1wKTsKICAgIHJldHVybihyZXQpOwp9CgovKioKICogeHBhdGhFeHByVGVzdDoKICogQGZpbGVuYW1lOiB0aGUgZmlsZSB0byBwYXJzZQogKiBAcmVzdWx0OiB0aGUgZmlsZSB3aXRoIGV4cGVjdGVkIHJlc3VsdAogKiBAZXJyOiB0aGUgZmlsZSB3aXRoIGVycm9yIG1lc3NhZ2VzCiAqCiAqIFBhcnNlIGEgZmlsZSBjb250YWluaW5nIFhQYXRoIHN0YW5kYWxvbmUgZXhwcmVzc2lvbnMgYW5kIGV2YWx1YXRlIHRoZW0KICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKeHBhdGhFeHByVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqcmVzdWx0LAogICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICAgIGludCBvcHRpb25zIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybih4cGF0aENvbW1vblRlc3QoZmlsZW5hbWUsIHJlc3VsdCwgMCwgMSkpOwp9CgovKioKICogeHBhdGhEb2NUZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBmaWxlIHRvIHBhcnNlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXMKICoKICogUGFyc2UgYSBmaWxlIGNvbnRhaW5pbmcgWFBhdGggZXhwcmVzc2lvbnMgYW5kIGV2YWx1YXRlIHRoZW0gYWdhaW5zdAogKiBhIHNldCBvZiBjb3JyZXNwb25kaW5nIGRvY3VtZW50cy4KICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKeHBhdGhEb2NUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogICAgICAgICAgICAgY29uc3QgY2hhciAqcmVzdWwgQVRUUklCVVRFX1VOVVNFRCwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICAgaW50IG9wdGlvbnMpIHsKCiAgICBjaGFyIHBhdHRlcm5bNTAwXTsKICAgIGNoYXIgcmVzdWx0WzUwMF07CiAgICBnbG9iX3QgZ2xvYmJ1ZjsKICAgIHNpemVfdCBpOwogICAgaW50IHJldCA9IDAsIHJlczsKCiAgICB4cGF0aERvY3VtZW50ID0geG1sUmVhZEZpbGUoZmlsZW5hbWUsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyB8IFhNTF9QQVJTRV9EVERBVFRSIHwgWE1MX1BBUlNFX05PRU5UKTsKICAgIGlmICh4cGF0aERvY3VtZW50ID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBsb2FkICVzXG4iLCBmaWxlbmFtZSk7CglyZXR1cm4oLTEpOwogICAgfQoKICAgIHNucHJpbnRmKHBhdHRlcm4sIDQ5OSwgIi4vdGVzdC9YUGF0aC90ZXN0cy8lcyoiLCBiYXNlRmlsZW5hbWUoZmlsZW5hbWUpKTsKICAgIHBhdHRlcm5bNDk5XSA9IDA7CiAgICBnbG9iYnVmLmdsX29mZnMgPSAwOwogICAgZ2xvYihwYXR0ZXJuLCBHTE9CX0RPT0ZGUywgTlVMTCwgJmdsb2JidWYpOwogICAgZm9yIChpID0gMDtpIDwgZ2xvYmJ1Zi5nbF9wYXRoYztpKyspIHsKICAgICAgICBzbnByaW50ZihyZXN1bHQsIDQ5OSwgInJlc3VsdC9YUGF0aC90ZXN0cy8lcyIsCgkgICAgICAgICBiYXNlRmlsZW5hbWUoZ2xvYmJ1Zi5nbF9wYXRodltpXSkpOwoJcmVzID0geHBhdGhDb21tb25UZXN0KGdsb2JidWYuZ2xfcGF0aHZbaV0sICZyZXN1bHRbMF0sIDAsIDApOwoJaWYgKHJlcyAhPSAwKQoJICAgIHJldCA9IHJlczsKICAgIH0KICAgIGdsb2JmcmVlKCZnbG9iYnVmKTsKCiAgICB4bWxGcmVlRG9jKHhwYXRoRG9jdW1lbnQpOwogICAgcmV0dXJuKHJldCk7Cn0KCiNpZmRlZiBMSUJYTUxfWFBUUl9FTkFCTEVECi8qKgogKiB4cHRyRG9jVGVzdDoKICogQGZpbGVuYW1lOiB0aGUgZmlsZSB0byBwYXJzZQogKiBAcmVzdWx0OiB0aGUgZmlsZSB3aXRoIGV4cGVjdGVkIHJlc3VsdAogKiBAZXJyOiB0aGUgZmlsZSB3aXRoIGVycm9yIG1lc3NhZ2VzCiAqCiAqIFBhcnNlIGEgZmlsZSBjb250YWluaW5nIFhQYXRoIGV4cHJlc3Npb25zIGFuZCBldmFsdWF0ZSB0aGVtIGFnYWluc3QKICogYSBzZXQgb2YgY29ycmVzcG9uZGluZyBkb2N1bWVudHMuCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50CnhwdHJEb2NUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bCBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICBjb25zdCBjaGFyICplcnIgQVRUUklCVVRFX1VOVVNFRCwKICAgICAgICAgICAgaW50IG9wdGlvbnMpIHsKCiAgICBjaGFyIHBhdHRlcm5bNTAwXTsKICAgIGNoYXIgcmVzdWx0WzUwMF07CiAgICBnbG9iX3QgZ2xvYmJ1ZjsKICAgIHNpemVfdCBpOwogICAgaW50IHJldCA9IDAsIHJlczsKCiAgICB4cGF0aERvY3VtZW50ID0geG1sUmVhZEZpbGUoZmlsZW5hbWUsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyB8IFhNTF9QQVJTRV9EVERBVFRSIHwgWE1MX1BBUlNFX05PRU5UKTsKICAgIGlmICh4cGF0aERvY3VtZW50ID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBsb2FkICVzXG4iLCBmaWxlbmFtZSk7CglyZXR1cm4oLTEpOwogICAgfQoKICAgIHNucHJpbnRmKHBhdHRlcm4sIDQ5OSwgIi4vdGVzdC9YUGF0aC94cHRyLyVzKiIsIGJhc2VGaWxlbmFtZShmaWxlbmFtZSkpOwogICAgcGF0dGVybls0OTldID0gMDsKICAgIGdsb2JidWYuZ2xfb2ZmcyA9IDA7CiAgICBnbG9iKHBhdHRlcm4sIEdMT0JfRE9PRkZTLCBOVUxMLCAmZ2xvYmJ1Zik7CiAgICBmb3IgKGkgPSAwO2kgPCBnbG9iYnVmLmdsX3BhdGhjO2krKykgewogICAgICAgIHNucHJpbnRmKHJlc3VsdCwgNDk5LCAicmVzdWx0L1hQYXRoL3hwdHIvJXMiLAoJICAgICAgICAgYmFzZUZpbGVuYW1lKGdsb2JidWYuZ2xfcGF0aHZbaV0pKTsKCXJlcyA9IHhwYXRoQ29tbW9uVGVzdChnbG9iYnVmLmdsX3BhdGh2W2ldLCAmcmVzdWx0WzBdLCAxLCAwKTsKCWlmIChyZXMgIT0gMCkKCSAgICByZXQgPSByZXM7CiAgICB9CiAgICBnbG9iZnJlZSgmZ2xvYmJ1Zik7CgogICAgeG1sRnJlZURvYyh4cGF0aERvY3VtZW50KTsKICAgIHJldHVybihyZXQpOwp9CiNlbmRpZiAvKiBMSUJYTUxfWFBUUl9FTkFCTEVEICovCgovKioKICogeG1saWREb2NUZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBmaWxlIHRvIHBhcnNlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXMKICoKICogUGFyc2UgYSBmaWxlIGNvbnRhaW5pbmcgeG1sOmlkIGFuZCBjaGVjayBmb3IgZXJyb3JzIGFuZCB2ZXJpZnkKICogdGhhdCBYUGF0aCBxdWVyaWVzIHdpbGwgd29yayBvbiB0aGVtIGFzIGV4cGVjdGVkLgogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludAp4bWxpZERvY1Rlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bHQsCiAgICAgICAgICAgICBjb25zdCBjaGFyICplcnIsCiAgICAgICAgICAgICBpbnQgb3B0aW9ucykgewoKICAgIGludCByZXMgPSAwOwogICAgaW50IHJldCA9IDA7CiAgICBjaGFyICp0ZW1wOwoKICAgIHhwYXRoRG9jdW1lbnQgPSB4bWxSZWFkRmlsZShmaWxlbmFtZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zIHwgWE1MX1BBUlNFX0RUREFUVFIgfCBYTUxfUEFSU0VfTk9FTlQpOwogICAgaWYgKHhwYXRoRG9jdW1lbnQgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGxvYWQgJXNcbiIsIGZpbGVuYW1lKTsKCXJldHVybigtMSk7CiAgICB9CgogICAgdGVtcCA9IHJlc3VsdEZpbGVuYW1lKGZpbGVuYW1lLCAiIiwgIi5yZXMiKTsKICAgIGlmICh0ZW1wID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk91dCBvZiBtZW1vcnlcbiIpOwogICAgICAgIGZhdGFsRXJyb3IoKTsKICAgIH0KICAgIHhwYXRoT3V0cHV0ID0gZm9wZW4odGVtcCwgIndiIik7CiAgICBpZiAoeHBhdGhPdXRwdXQgPT0gTlVMTCkgewoJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSAlc1xuIiwgdGVtcCk7CiAgICAgICAgeG1sRnJlZURvYyh4cGF0aERvY3VtZW50KTsKICAgICAgICBmcmVlKHRlbXApOwoJcmV0dXJuKC0xKTsKICAgIH0KCiAgICB0ZXN0WFBhdGgoImlkKCdiYXInKSIsIDAsIDApOwoKICAgIGZjbG9zZSh4cGF0aE91dHB1dCk7CiAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKCXJldCA9IGNvbXBhcmVGaWxlcyh0ZW1wLCByZXN1bHQpOwoJaWYgKHJldCkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiUmVzdWx0IGZvciAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lKTsKCSAgICByZXMgPSAxOwoJfQogICAgfQoKICAgIHVubGluayh0ZW1wKTsKICAgIGZyZWUodGVtcCk7CiAgICB4bWxGcmVlRG9jKHhwYXRoRG9jdW1lbnQpOwoKICAgIGlmIChlcnIgIT0gTlVMTCkgewoJcmV0ID0gY29tcGFyZUZpbGVNZW0oZXJyLCB0ZXN0RXJyb3JzLCB0ZXN0RXJyb3JzU2l6ZSk7CglpZiAocmV0ICE9IDApIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGZvciAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lKTsKCSAgICByZXMgPSAxOwoJfQogICAgfQogICAgcmV0dXJuKHJlcyk7Cn0KCiNlbmRpZiAvKiBMSUJYTUxfREVCVUdfRU5BQkxFRCAqLwojZW5kaWYgLyogWFBBVEggKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQkJCQkJCSoKICoJCQlVUkkgYmFzZWQgdGVzdHMJCQkJCSoKICoJCQkJCQkJCQkqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZApoYW5kbGVVUkkoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpiYXNlLCBGSUxFICpvKSB7CiAgICBpbnQgcmV0OwogICAgeG1sVVJJUHRyIHVyaTsKICAgIHhtbENoYXIgKnJlcyA9IE5VTEwsICpwYXJzZWQgPSBOVUxMOwoKICAgIHVyaSA9IHhtbENyZWF0ZVVSSSgpOwoKICAgIGlmIChiYXNlID09IE5VTEwpIHsKCXJldCA9IHhtbFBhcnNlVVJJUmVmZXJlbmNlKHVyaSwgc3RyKTsKCWlmIChyZXQgIT0gMCkKCSAgICBmcHJpbnRmKG8sICIlcyA6IGVycm9yICVkXG4iLCBzdHIsIHJldCk7CgllbHNlIHsKCSAgICB4bWxOb3JtYWxpemVVUklQYXRoKHVyaS0+cGF0aCk7CgkgICAgeG1sUHJpbnRVUkkobywgdXJpKTsKCSAgICBmcHJpbnRmKG8sICJcbiIpOwoJfQogICAgfSBlbHNlIHsKCXJlcyA9IHhtbEJ1aWxkVVJJKCh4bWxDaGFyICopc3RyLCAoeG1sQ2hhciAqKSBiYXNlKTsKCWlmIChyZXMgIT0gTlVMTCkgewoJICAgIGZwcmludGYobywgIiVzXG4iLCAoY2hhciAqKSByZXMpOwoJfQoJZWxzZQoJICAgIGZwcmludGYobywgIjo6RVJST1I6OlxuIik7CiAgICB9CiAgICBpZiAocmVzICE9IE5VTEwpCgl4bWxGcmVlKHJlcyk7CiAgICBpZiAocGFyc2VkICE9IE5VTEwpCgl4bWxGcmVlKHBhcnNlZCk7CiAgICB4bWxGcmVlVVJJKHVyaSk7Cn0KCi8qKgogKiB1cmlDb21tb25UZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBmaWxlIHRvIHBhcnNlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXMKICoKICogUGFyc2UgYSBmaWxlIGNvbnRhaW5pbmcgVVJJIGFuZCBjaGVjayBmb3IgZXJyb3JzCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50CnVyaUNvbW1vblRlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bHQsCiAgICAgICAgICAgICBjb25zdCBjaGFyICplcnIsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpiYXNlKSB7CiAgICBjaGFyICp0ZW1wOwogICAgRklMRSAqbywgKmY7CiAgICBjaGFyIHN0clsxMDI0XTsKICAgIGludCByZXMgPSAwLCBpLCByZXQ7CgogICAgdGVtcCA9IHJlc3VsdEZpbGVuYW1lKGZpbGVuYW1lLCAiIiwgIi5yZXMiKTsKICAgIGlmICh0ZW1wID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk91dCBvZiBtZW1vcnlcbiIpOwogICAgICAgIGZhdGFsRXJyb3IoKTsKICAgIH0KICAgIG8gPSBmb3Blbih0ZW1wLCAid2IiKTsKICAgIGlmIChvID09IE5VTEwpIHsKCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsIHRlbXApOwogICAgICAgIGZyZWUodGVtcCk7CglyZXR1cm4oLTEpOwogICAgfQogICAgZiA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKTsKICAgIGlmIChmID09IE5VTEwpIHsKCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIG9wZW4gaW5wdXQgZmlsZSAlc1xuIiwgZmlsZW5hbWUpOwoJZmNsb3NlKG8pOwoJdW5saW5rKHRlbXApOwogICAgICAgIGZyZWUodGVtcCk7CglyZXR1cm4oLTEpOwogICAgfQoKICAgIHdoaWxlICgxKSB7CgkvKgoJICogcmVhZCBvbmUgbGluZSBpbiBzdHJpbmcgYnVmZmVyLgoJICovCglpZiAoZmdldHMgKCZzdHJbMF0sIHNpemVvZiAoc3RyKSAtIDEsIGYpID09IE5VTEwpCgkgICBicmVhazsKCgkvKgoJICogcmVtb3ZlIHRoZSBlbmRpbmcgc3BhY2VzCgkgKi8KCWkgPSBzdHJsZW4oc3RyKTsKCXdoaWxlICgoaSA+IDApICYmCgkgICAgICAgKChzdHJbaSAtIDFdID09ICdcbicpIHx8IChzdHJbaSAtIDFdID09ICdccicpIHx8CgkJKHN0cltpIC0gMV0gPT0gJyAnKSB8fCAoc3RyW2kgLSAxXSA9PSAnXHQnKSkpIHsKCSAgICBpLS07CgkgICAgc3RyW2ldID0gMDsKCX0KCW5iX3Rlc3RzKys7CgloYW5kbGVVUkkoc3RyLCBiYXNlLCBvKTsKICAgIH0KCiAgICBmY2xvc2UoZik7CiAgICBmY2xvc2Uobyk7CgogICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7CglyZXQgPSBjb21wYXJlRmlsZXModGVtcCwgcmVzdWx0KTsKCWlmIChyZXQpIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgIlJlc3VsdCBmb3IgJXMgZmFpbGVkXG4iLCBmaWxlbmFtZSk7CgkgICAgcmVzID0gMTsKCX0KICAgIH0KICAgIGlmIChlcnIgIT0gTlVMTCkgewoJcmV0ID0gY29tcGFyZUZpbGVNZW0oZXJyLCB0ZXN0RXJyb3JzLCB0ZXN0RXJyb3JzU2l6ZSk7CglpZiAocmV0ICE9IDApIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGZvciAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lKTsKCSAgICByZXMgPSAxOwoJfQogICAgfQoKICAgIHVubGluayh0ZW1wKTsKICAgIGZyZWUodGVtcCk7CiAgICByZXR1cm4ocmVzKTsKfQoKLyoqCiAqIHVyaVBhcnNlVGVzdDoKICogQGZpbGVuYW1lOiB0aGUgZmlsZSB0byBwYXJzZQogKiBAcmVzdWx0OiB0aGUgZmlsZSB3aXRoIGV4cGVjdGVkIHJlc3VsdAogKiBAZXJyOiB0aGUgZmlsZSB3aXRoIGVycm9yIG1lc3NhZ2VzCiAqCiAqIFBhcnNlIGEgZmlsZSBjb250YWluaW5nIFVSSSBhbmQgY2hlY2sgZm9yIGVycm9ycwogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludAp1cmlQYXJzZVRlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bHQsCiAgICAgICAgICAgICBjb25zdCBjaGFyICplcnIsCiAgICAgICAgICAgICBpbnQgb3B0aW9ucyBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4odXJpQ29tbW9uVGVzdChmaWxlbmFtZSwgcmVzdWx0LCBlcnIsIE5VTEwpKTsKfQoKLyoqCiAqIHVyaUJhc2VUZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBmaWxlIHRvIHBhcnNlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXMKICoKICogUGFyc2UgYSBmaWxlIGNvbnRhaW5pbmcgVVJJLCBjb21wb3NlIHRoZW0gYWdhaW5zdCBhIGZpeGVkIGJhc2UgYW5kCiAqIGNoZWNrIGZvciBlcnJvcnMKICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKdXJpQmFzZVRlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bHQsCiAgICAgICAgICAgICBjb25zdCBjaGFyICplcnIsCiAgICAgICAgICAgICBpbnQgb3B0aW9ucyBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4odXJpQ29tbW9uVGVzdChmaWxlbmFtZSwgcmVzdWx0LCBlcnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2Zvby5jb20vcGF0aC90by9pbmRleC5odG1sP29yaWcjaGVscCIpKTsKfQoKc3RhdGljIGludCB1cmlwX3N1Y2Nlc3MgPSAxOwpzdGF0aWMgaW50IHVyaXBfY3VycmVudCA9IDA7CnN0YXRpYyBjb25zdCBjaGFyICp1cmlwX3Rlc3RVUkxzW10gPSB7CiAgICAidXJpcDovL2V4YW1wbGUuY29tL2EgYi5odG1sIiwKICAgICJ1cmlwOi8vZXhhbXBsZS5jb20vYSUyMGIuaHRtbCIsCiAgICAiZmlsZTovLy9wYXRoL3RvL2EgYi5odG1sIiwKICAgICJmaWxlOi8vL3BhdGgvdG8vYSUyMGIuaHRtbCIsCiAgICAiL3BhdGgvdG8vYSBiLmh0bWwiLAogICAgIi9wYXRoL3RvL2ElMjBiLmh0bWwiLAogICAgInVyaXA6Ly9leGFtcGxlLmNvbS9y6XN1bekuaHRtbCIsCiAgICAidXJpcDovL2V4YW1wbGUuY29tL3Rlc3Q/YT0xJmI9MiUyNjMmYz00I2ZvbyIsCiAgICBOVUxMCn07CnN0YXRpYyBjb25zdCBjaGFyICp1cmlwX3JjdnNVUkxzW10gPSB7CiAgICAvKiBpdCBpcyBhbiBVUkkgdGhlIHN0cmluZ3MgbXVzdCBiZSBlc2NhcGVkICovCiAgICAidXJpcDovL2V4YW1wbGUuY29tL2ElMjBiLmh0bWwiLAogICAgLyogY2hlY2sgdGhhdCAlIGVzY2FwaW5nIGlzIG5vdCBicm9rZW4gKi8KICAgICJ1cmlwOi8vZXhhbXBsZS5jb20vYSUyMGIuaHRtbCIsCiAgICAvKiBpdCdzIGFuIFVSSSBwYXRoIHRoZSBzdHJpbmdzIG11c3QgYmUgZXNjYXBlZCAqLwogICAgImZpbGU6Ly8vcGF0aC90by9hJTIwYi5odG1sIiwKICAgIC8qIGNoZWNrIHRoYXQgJSBlc2NhcGluZyBpcyBub3QgYnJva2VuICovCiAgICAiZmlsZTovLy9wYXRoL3RvL2ElMjBiLmh0bWwiLAogICAgLyogdGhpcyBpcyBub3QgYW4gVVJJLCB0aGlzIGlzIGEgcGF0aCwgc28gdGhpcyBzaG91bGQgbm90IGJlIGVzY2FwZWQgKi8KICAgICIvcGF0aC90by9hIGIuaHRtbCIsCiAgICAvKiBjaGVjayB0aGF0IHBhdGhzIHdpdGggJSBhcmUgbm90IGJyb2tlbiAqLwogICAgIi9wYXRoL3RvL2ElMjBiLmh0bWwiLAogICAgLyogb3V0IG9mIGNvbnRleHQgdGhlIGVuY29kaW5nIGNhbid0IGJlIGd1ZXNzZWQgYnl0ZSBieSBieXRlIGNvbnZlcnNpb24gKi8KICAgICJ1cmlwOi8vZXhhbXBsZS5jb20vciVFOXN1bSVFOS5odG1sIiwKICAgIC8qIHZlcmlmeSB3ZSBkb24ndCBkZXN0cm95IFVSSXMgZXNwZWNpYWxseSB0aGUgcXVlcnkgcGFydCAqLwogICAgInVyaXA6Ly9leGFtcGxlLmNvbS90ZXN0P2E9MSZiPTIlMjYzJmM9NCNmb28iLAogICAgTlVMTAp9OwpzdGF0aWMgY29uc3QgY2hhciAqdXJpcF9yZXMgPSAiPGxpc3QvPiI7CnN0YXRpYyBjb25zdCBjaGFyICp1cmlwX2N1ciA9IE5VTEw7CnN0YXRpYyBpbnQgdXJpcF9ybGVuOwoKLyoqCiAqIHVyaXBNYXRjaDoKICogQFVSSTogYW4gVVJJIHRvIHRlc3QKICoKICogQ2hlY2sgZm9yIGFuIHVyaXA6IHF1ZXJ5CiAqCiAqIFJldHVybnMgMSBpZiB5ZXMgYW5kIDAgaWYgYW5vdGhlciBJbnB1dCBtb2R1bGUgc2hvdWxkIGJlIHVzZWQKICovCnN0YXRpYyBpbnQKdXJpcE1hdGNoKGNvbnN0IGNoYXIgKiBVUkkpIHsKICAgIGlmICgoVVJJID09IE5VTEwpIHx8ICghc3RyY21wKFVSSSwgImZpbGU6Ly8vZXRjL3htbC9jYXRhbG9nIikpKQogICAgICAgIHJldHVybigwKTsKICAgIC8qIFZlcmlmeSB3ZSByZWNlaXZlZCB0aGUgZXNjYXBlZCBVUkwgKi8KICAgIGlmIChzdHJjbXAodXJpcF9yY3ZzVVJMc1t1cmlwX2N1cnJlbnRdLCBVUkkpKQoJdXJpcF9zdWNjZXNzID0gMDsKICAgIHJldHVybigxKTsKfQoKLyoqCiAqIHVyaXBPcGVuOgogKiBAVVJJOiBhbiBVUkkgdG8gdGVzdAogKgogKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB1cmlwOiBxdWVyeSBoYW5kbGVyLCBpbiB0aGlzIGV4YW1wbGUgc2ltcGx5CiAqIHRoZSB1cmlwX2N1cnJlbnQgcG9pbnRlci4uLgogKgogKiBSZXR1cm5zIGFuIElucHV0IGNvbnRleHQgb3IgTlVMTCBpbiBjYXNlIG9yIGVycm9yCiAqLwpzdGF0aWMgdm9pZCAqCnVyaXBPcGVuKGNvbnN0IGNoYXIgKiBVUkkpIHsKICAgIGlmICgoVVJJID09IE5VTEwpIHx8ICghc3RyY21wKFVSSSwgImZpbGU6Ly8vZXRjL3htbC9jYXRhbG9nIikpKQogICAgICAgIHJldHVybihOVUxMKTsKICAgIC8qIFZlcmlmeSB3ZSByZWNlaXZlZCB0aGUgZXNjYXBlZCBVUkwgKi8KICAgIGlmIChzdHJjbXAodXJpcF9yY3ZzVVJMc1t1cmlwX2N1cnJlbnRdLCBVUkkpKQoJdXJpcF9zdWNjZXNzID0gMDsKICAgIHVyaXBfY3VyID0gdXJpcF9yZXM7CiAgICB1cmlwX3JsZW4gPSBzdHJsZW4odXJpcF9yZXMpOwogICAgcmV0dXJuKCh2b2lkICopIHVyaXBfY3VyKTsKfQoKLyoqCiAqIHVyaXBDbG9zZToKICogQGNvbnRleHQ6IHRoZSByZWFkIGNvbnRleHQKICoKICogQ2xvc2UgdGhlIHVyaXA6IHF1ZXJ5IGhhbmRsZXIKICoKICogUmV0dXJucyAwIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IKICovCnN0YXRpYyBpbnQKdXJpcENsb3NlKHZvaWQgKiBjb250ZXh0KSB7CiAgICBpZiAoY29udGV4dCA9PSBOVUxMKSByZXR1cm4oLTEpOwogICAgdXJpcF9jdXIgPSBOVUxMOwogICAgdXJpcF9ybGVuID0gMDsKICAgIHJldHVybigwKTsKfQoKLyoqCiAqIHVyaXBSZWFkOgogKiBAY29udGV4dDogdGhlIHJlYWQgY29udGV4dAogKiBAYnVmZmVyOiB3aGVyZSB0byBzdG9yZSBkYXRhCiAqIEBsZW46IG51bWJlciBvZiBieXRlcyB0byByZWFkCiAqCiAqIEltcGxlbWVudCBhbiB1cmlwOiBxdWVyeSByZWFkLgogKgogKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAtMSBpbiBjYXNlIG9mIGVycm9yCiAqLwpzdGF0aWMgaW50CnVyaXBSZWFkKHZvaWQgKiBjb250ZXh0LCBjaGFyICogYnVmZmVyLCBpbnQgbGVuKSB7CiAgIGNvbnN0IGNoYXIgKnB0ciA9IChjb25zdCBjaGFyICopIGNvbnRleHQ7CgogICBpZiAoKGNvbnRleHQgPT0gTlVMTCkgfHwgKGJ1ZmZlciA9PSBOVUxMKSB8fCAobGVuIDwgMCkpCiAgICAgICByZXR1cm4oLTEpOwoKICAgaWYgKGxlbiA+IHVyaXBfcmxlbikgbGVuID0gdXJpcF9ybGVuOwogICBtZW1jcHkoYnVmZmVyLCBwdHIsIGxlbik7CiAgIHVyaXBfcmxlbiAtPSBsZW47CiAgIHJldHVybihsZW4pOwp9CgpzdGF0aWMgaW50CnVyaXBfY2hlY2tVUkwoY29uc3QgY2hhciAqVVJMKSB7CiAgICB4bWxEb2NQdHIgZG9jOwoKICAgIGRvYyA9IHhtbFJlYWRGaWxlKFVSTCwgTlVMTCwgMCk7CiAgICBpZiAoZG9jID09IE5VTEwpCiAgICAgICAgcmV0dXJuKC0xKTsKICAgIHhtbEZyZWVEb2MoZG9jKTsKICAgIHJldHVybigxKTsKfQoKLyoqCiAqIHVyaVBhdGhUZXN0OgogKiBAZmlsZW5hbWU6IGlnbm9yZWQKICogQHJlc3VsdDogaWdub3JlZAogKiBAZXJyOiBpZ25vcmVkCiAqCiAqIFJ1biBhIHNldCBvZiB0ZXN0cyB0byBjaGVjayBob3cgUGF0aCBhbmQgVVJJIGFyZSBoYW5kbGVkIGJlZm9yZQogKiBiZWluZyBwYXNzZWQgdG8gdGhlIEkvTyBsYXllcgogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludAp1cmlQYXRoVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICAgY29uc3QgY2hhciAqcmVzdWx0IEFUVFJJQlVURV9VTlVTRUQsCiAgICAgICAgICAgICBjb25zdCBjaGFyICplcnIgQVRUUklCVVRFX1VOVVNFRCwKICAgICAgICAgICAgIGludCBvcHRpb25zIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGludCBwYXJzZWQ7CiAgICBpbnQgZmFpbHVyZXMgPSAwOwoKICAgIC8qCiAgICAgKiByZWdpc3RlciB0aGUgbmV3IEkvTyBoYW5kbGVycwogICAgICovCiAgICBpZiAoeG1sUmVnaXN0ZXJJbnB1dENhbGxiYWNrcyh1cmlwTWF0Y2gsIHVyaXBPcGVuLCB1cmlwUmVhZCwgdXJpcENsb3NlKSA8IDApCiAgICB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gcmVnaXN0ZXIgSFRUUCBoYW5kbGVyXG4iKTsKCXJldHVybigtMSk7CiAgICB9CgogICAgZm9yICh1cmlwX2N1cnJlbnQgPSAwO3VyaXBfdGVzdFVSTHNbdXJpcF9jdXJyZW50XSAhPSBOVUxMO3VyaXBfY3VycmVudCsrKSB7CiAgICAgICAgdXJpcF9zdWNjZXNzID0gMTsKICAgICAgICBwYXJzZWQgPSB1cmlwX2NoZWNrVVJMKHVyaXBfdGVzdFVSTHNbdXJpcF9jdXJyZW50XSk7CglpZiAodXJpcF9zdWNjZXNzICE9IDEpIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0aGUgVVJMIHBhc3NpbmcgdGVzdCBmb3IgJXMiLAoJICAgICAgICAgICAgdXJpcF90ZXN0VVJMc1t1cmlwX2N1cnJlbnRdKTsKCSAgICBmYWlsdXJlcysrOwoJfSBlbHNlIGlmIChwYXJzZWQgIT0gMSkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRoZSBwYXJzaW5nIHRlc3QgZm9yICVzIiwKCSAgICAgICAgICAgIHVyaXBfdGVzdFVSTHNbdXJpcF9jdXJyZW50XSk7CgkgICAgZmFpbHVyZXMrKzsKCX0KCW5iX3Rlc3RzKys7CiAgICB9CgogICAgeG1sUG9wSW5wdXRDYWxsYmFja3MoKTsKICAgIHJldHVybihmYWlsdXJlcyk7Cn0KCiNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJCQkJCQkqCiAqCQkJU2NoZW1hcyB0ZXN0cwkJCQkJKgogKgkJCQkJCQkJCSoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIGludApzY2hlbWFzT25lVGVzdChjb25zdCBjaGFyICpzY2gsCiAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bHQsCgkgICAgICAgY29uc3QgY2hhciAqZXJyLAoJICAgICAgIGludCBvcHRpb25zLAoJICAgICAgIHhtbFNjaGVtYVB0ciBzY2hlbWFzKSB7CiAgICB4bWxEb2NQdHIgZG9jOwogICAgeG1sU2NoZW1hVmFsaWRDdHh0UHRyIGN0eHQ7CiAgICBpbnQgcmV0ID0gMDsKICAgIGNoYXIgKnRlbXA7CiAgICBGSUxFICpzY2hlbWFzT3V0cHV0OwoKICAgIGRvYyA9IHhtbFJlYWRGaWxlKGZpbGVuYW1lLCBOVUxMLCBvcHRpb25zKTsKICAgIGlmIChkb2MgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIHBhcnNlIGluc3RhbmNlICVzIGZvciAlc1xuIiwgZmlsZW5hbWUsIHNjaCk7CglyZXR1cm4oLTEpOwogICAgfQoKICAgIHRlbXAgPSByZXN1bHRGaWxlbmFtZShyZXN1bHQsICIiLCAiLnJlcyIpOwogICAgaWYgKHRlbXAgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiT3V0IG9mIG1lbW9yeVxuIik7CiAgICAgICAgZmF0YWxFcnJvcigpOwogICAgfQogICAgc2NoZW1hc091dHB1dCA9IGZvcGVuKHRlbXAsICJ3YiIpOwogICAgaWYgKHNjaGVtYXNPdXRwdXQgPT0gTlVMTCkgewoJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSAlc1xuIiwgdGVtcCk7Cgl4bWxGcmVlRG9jKGRvYyk7CiAgICAgICAgZnJlZSh0ZW1wKTsKCXJldHVybigtMSk7CiAgICB9CgogICAgY3R4dCA9IHhtbFNjaGVtYU5ld1ZhbGlkQ3R4dChzY2hlbWFzKTsKICAgIHhtbFNjaGVtYVNldFZhbGlkRXJyb3JzKGN0eHQsCiAgICAgICAgICh4bWxTY2hlbWFWYWxpZGl0eUVycm9yRnVuYykgdGVzdEVycm9ySGFuZGxlciwKICAgICAgICAgKHhtbFNjaGVtYVZhbGlkaXR5V2FybmluZ0Z1bmMpIHRlc3RFcnJvckhhbmRsZXIsCgkgY3R4dCk7CiAgICByZXQgPSB4bWxTY2hlbWFWYWxpZGF0ZURvYyhjdHh0LCBkb2MpOwogICAgaWYgKHJldCA9PSAwKSB7CglmcHJpbnRmKHNjaGVtYXNPdXRwdXQsICIlcyB2YWxpZGF0ZXNcbiIsIGZpbGVuYW1lKTsKICAgIH0gZWxzZSBpZiAocmV0ID4gMCkgewoJZnByaW50ZihzY2hlbWFzT3V0cHV0LCAiJXMgZmFpbHMgdG8gdmFsaWRhdGVcbiIsIGZpbGVuYW1lKTsKICAgIH0gZWxzZSB7CglmcHJpbnRmKHNjaGVtYXNPdXRwdXQsICIlcyB2YWxpZGF0aW9uIGdlbmVyYXRlZCBhbiBpbnRlcm5hbCBlcnJvclxuIiwKCSAgICAgICBmaWxlbmFtZSk7CiAgICB9CiAgICBmY2xvc2Uoc2NoZW1hc091dHB1dCk7CiAgICBpZiAocmVzdWx0KSB7CglpZiAoY29tcGFyZUZpbGVzKHRlbXAsIHJlc3VsdCkpIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgIlJlc3VsdCBmb3IgJXMgb24gJXMgZmFpbGVkXG4iLCBmaWxlbmFtZSwgc2NoKTsKCSAgICByZXQgPSAxOwoJfQogICAgfQogICAgdW5saW5rKHRlbXApOwogICAgZnJlZSh0ZW1wKTsKCiAgICBpZiAoKHJldCAhPSAwKSAmJiAoZXJyICE9IE5VTEwpKSB7CglpZiAoY29tcGFyZUZpbGVNZW0oZXJyLCB0ZXN0RXJyb3JzLCB0ZXN0RXJyb3JzU2l6ZSkpIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGZvciAlcyBvbiAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lLCBzY2gpOwoJICAgIHJldCA9IDE7Cgl9IGVsc2UgewoJICAgIHJldCA9IDA7Cgl9CiAgICB9CgogICAgeG1sU2NoZW1hRnJlZVZhbGlkQ3R4dChjdHh0KTsKICAgIHhtbEZyZWVEb2MoZG9jKTsKICAgIHJldHVybihyZXQpOwp9Ci8qKgogKiBzY2hlbWFzVGVzdDoKICogQGZpbGVuYW1lOiB0aGUgc2NoZW1hcyBmaWxlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXMKICoKICogUGFyc2UgYSBmaWxlIGNvbnRhaW5pbmcgVVJJLCBjb21wb3NlIHRoZW0gYWdhaW5zdCBhIGZpeGVkIGJhc2UgYW5kCiAqIGNoZWNrIGZvciBlcnJvcnMKICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKc2NoZW1hc1Rlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsCiAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlc3VsIEFUVFJJQlVURV9VTlVTRUQsCiAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycnIgQVRUUklCVVRFX1VOVVNFRCwKICAgICAgICAgICAgaW50IG9wdGlvbnMpIHsKICAgIGNvbnN0IGNoYXIgKmJhc2UgPSBiYXNlRmlsZW5hbWUoZmlsZW5hbWUpOwogICAgY29uc3QgY2hhciAqYmFzZTI7CiAgICBjb25zdCBjaGFyICppbnN0YW5jZTsKICAgIHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgY3R4dDsKICAgIHhtbFNjaGVtYVB0ciBzY2hlbWFzOwogICAgaW50IHJlcyA9IDAsIGxlbiwgcmV0OwogICAgY2hhciBwYXR0ZXJuWzUwMF07CiAgICBjaGFyIHByZWZpeFs1MDBdOwogICAgY2hhciByZXN1bHRbNTAwXTsKICAgIGNoYXIgZXJyWzUwMF07CiAgICBnbG9iX3QgZ2xvYmJ1ZjsKICAgIHNpemVfdCBpOwogICAgY2hhciBjb3VudCA9IDA7CgogICAgLyogZmlyc3QgY29tcGlsZSB0aGUgc2NoZW1hcyBpZiBwb3NzaWJsZSAqLwogICAgY3R4dCA9IHhtbFNjaGVtYU5ld1BhcnNlckN0eHQoZmlsZW5hbWUpOwogICAgeG1sU2NoZW1hU2V0UGFyc2VyRXJyb3JzKGN0eHQsCiAgICAgICAgICh4bWxTY2hlbWFWYWxpZGl0eUVycm9yRnVuYykgdGVzdEVycm9ySGFuZGxlciwKICAgICAgICAgKHhtbFNjaGVtYVZhbGlkaXR5V2FybmluZ0Z1bmMpIHRlc3RFcnJvckhhbmRsZXIsCgkgY3R4dCk7CiAgICBzY2hlbWFzID0geG1sU2NoZW1hUGFyc2UoY3R4dCk7CiAgICB4bWxTY2hlbWFGcmVlUGFyc2VyQ3R4dChjdHh0KTsKCiAgICAvKgogICAgICogbW9zdCBvZiB0aGUgbWVzcyBpcyBhYm91dCB0aGUgb3V0cHV0IGZpbGVuYW1lcyBnZW5lcmF0ZWQgYnkgdGhlIE1ha2VmaWxlCiAgICAgKi8KICAgIGxlbiA9IHN0cmxlbihiYXNlKTsKICAgIGlmICgobGVuID4gNDk5KSB8fCAobGVuIDwgNSkpIHsKICAgICAgICB4bWxTY2hlbWFGcmVlKHNjaGVtYXMpOwoJcmV0dXJuKC0xKTsKICAgIH0KICAgIGxlbiAtPSA0OyAvKiByZW1vdmUgdHJhaWxpbmcgLnhzZCAqLwogICAgaWYgKGJhc2VbbGVuIC0gMl0gPT0gJ18nKSB7CiAgICAgICAgbGVuIC09IDI7IC8qIHJlbW92ZSBzdWJ0ZXN0IG51bWJlciAqLwogICAgfQogICAgaWYgKGJhc2VbbGVuIC0gMl0gPT0gJ18nKSB7CiAgICAgICAgbGVuIC09IDI7IC8qIHJlbW92ZSBzdWJ0ZXN0IG51bWJlciAqLwogICAgfQogICAgbWVtY3B5KHByZWZpeCwgYmFzZSwgbGVuKTsKICAgIHByZWZpeFtsZW5dID0gMDsKCiAgICBzbnByaW50ZihwYXR0ZXJuLCA0OTksICIuL3Rlc3Qvc2NoZW1hcy8lc18/LnhtbCIsIHByZWZpeCk7CiAgICBwYXR0ZXJuWzQ5OV0gPSAwOwoKICAgIGlmIChiYXNlW2xlbl0gPT0gJ18nKSB7CiAgICAgICAgbGVuICs9IDI7CgltZW1jcHkocHJlZml4LCBiYXNlLCBsZW4pOwoJcHJlZml4W2xlbl0gPSAwOwogICAgfQoKICAgIGdsb2JidWYuZ2xfb2ZmcyA9IDA7CiAgICBnbG9iKHBhdHRlcm4sIEdMT0JfRE9PRkZTLCBOVUxMLCAmZ2xvYmJ1Zik7CiAgICBmb3IgKGkgPSAwO2kgPCBnbG9iYnVmLmdsX3BhdGhjO2krKykgewogICAgICAgIHRlc3RFcnJvcnNTaXplID0gMDsKCXRlc3RFcnJvcnNbMF0gPSAwOwogICAgICAgIGluc3RhbmNlID0gZ2xvYmJ1Zi5nbF9wYXRodltpXTsKCWJhc2UyID0gYmFzZUZpbGVuYW1lKGluc3RhbmNlKTsKCWxlbiA9IHN0cmxlbihiYXNlMik7CglpZiAoKGxlbiA+IDYpICYmIChiYXNlMltsZW4gLSA2XSA9PSAnXycpKSB7CgkgICAgY291bnQgPSBiYXNlMltsZW4gLSA1XTsKCSAgICBzbnByaW50ZihyZXN1bHQsIDQ5OSwgInJlc3VsdC9zY2hlbWFzLyVzXyVjIiwKCQkgICAgIHByZWZpeCwgY291bnQpOwoJICAgIHJlc3VsdFs0OTldID0gMDsKCSAgICBzbnByaW50ZihlcnIsIDQ5OSwgInJlc3VsdC9zY2hlbWFzLyVzXyVjLmVyciIsCgkJICAgICBwcmVmaXgsIGNvdW50KTsKCSAgICBlcnJbNDk5XSA9IDA7Cgl9IGVsc2UgewoJICAgIGZwcmludGYoc3RkZXJyLCAiZG9uJ3Qga25vdyBob3cgdG8gcHJvY2VzcyAlc1xuIiwgaW5zdGFuY2UpOwoJICAgIGNvbnRpbnVlOwoJfQoJaWYgKHNjaGVtYXMgPT0gTlVMTCkgewoJfSBlbHNlIHsKCSAgICBuYl90ZXN0cysrOwoJICAgIHJldCA9IHNjaGVtYXNPbmVUZXN0KGZpbGVuYW1lLCBpbnN0YW5jZSwgcmVzdWx0LCBlcnIsCgkgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywgc2NoZW1hcyk7CgkgICAgaWYgKHJldCAhPSAwKQoJCXJlcyA9IHJldDsKCX0KICAgIH0KICAgIGdsb2JmcmVlKCZnbG9iYnVmKTsKICAgIHhtbFNjaGVtYUZyZWUoc2NoZW1hcyk7CgogICAgcmV0dXJuKHJlcyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJCQkJCQkqCiAqCQkJU2NoZW1hcyB0ZXN0cwkJCQkJKgogKgkJCQkJCQkJCSoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIGludApybmdPbmVUZXN0KGNvbnN0IGNoYXIgKnNjaCwKICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCiAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlc3VsdCwKCSAgICAgICBjb25zdCBjaGFyICplcnIsCgkgICAgICAgaW50IG9wdGlvbnMsCgkgICAgICAgeG1sUmVsYXhOR1B0ciBzY2hlbWFzKSB7CiAgICB4bWxEb2NQdHIgZG9jOwogICAgeG1sUmVsYXhOR1ZhbGlkQ3R4dFB0ciBjdHh0OwogICAgaW50IHJldCA9IDA7CiAgICBjaGFyICp0ZW1wOwogICAgRklMRSAqc2NoZW1hc091dHB1dDsKCiAgICBkb2MgPSB4bWxSZWFkRmlsZShmaWxlbmFtZSwgTlVMTCwgb3B0aW9ucyk7CiAgICBpZiAoZG9jID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBwYXJzZSBpbnN0YW5jZSAlcyBmb3IgJXNcbiIsIGZpbGVuYW1lLCBzY2gpOwoJcmV0dXJuKC0xKTsKICAgIH0KCiAgICB0ZW1wID0gcmVzdWx0RmlsZW5hbWUocmVzdWx0LCAiIiwgIi5yZXMiKTsKICAgIGlmICh0ZW1wID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk91dCBvZiBtZW1vcnlcbiIpOwogICAgICAgIGZhdGFsRXJyb3IoKTsKICAgIH0KICAgIHNjaGVtYXNPdXRwdXQgPSBmb3Blbih0ZW1wLCAid2IiKTsKICAgIGlmIChzY2hlbWFzT3V0cHV0ID09IE5VTEwpIHsKCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsIHRlbXApOwoJeG1sRnJlZURvYyhkb2MpOwogICAgICAgIGZyZWUodGVtcCk7CglyZXR1cm4oLTEpOwogICAgfQoKICAgIGN0eHQgPSB4bWxSZWxheE5HTmV3VmFsaWRDdHh0KHNjaGVtYXMpOwogICAgeG1sUmVsYXhOR1NldFZhbGlkRXJyb3JzKGN0eHQsCiAgICAgICAgICh4bWxSZWxheE5HVmFsaWRpdHlFcnJvckZ1bmMpIHRlc3RFcnJvckhhbmRsZXIsCiAgICAgICAgICh4bWxSZWxheE5HVmFsaWRpdHlXYXJuaW5nRnVuYykgdGVzdEVycm9ySGFuZGxlciwKCSBjdHh0KTsKICAgIHJldCA9IHhtbFJlbGF4TkdWYWxpZGF0ZURvYyhjdHh0LCBkb2MpOwogICAgaWYgKHJldCA9PSAwKSB7Cgl0ZXN0RXJyb3JIYW5kbGVyKE5VTEwsICIlcyB2YWxpZGF0ZXNcbiIsIGZpbGVuYW1lKTsKICAgIH0gZWxzZSBpZiAocmV0ID4gMCkgewoJdGVzdEVycm9ySGFuZGxlcihOVUxMLCAiJXMgZmFpbHMgdG8gdmFsaWRhdGVcbiIsIGZpbGVuYW1lKTsKICAgIH0gZWxzZSB7Cgl0ZXN0RXJyb3JIYW5kbGVyKE5VTEwsICIlcyB2YWxpZGF0aW9uIGdlbmVyYXRlZCBhbiBpbnRlcm5hbCBlcnJvclxuIiwKCSAgICAgICBmaWxlbmFtZSk7CiAgICB9CiAgICBmY2xvc2Uoc2NoZW1hc091dHB1dCk7CiAgICBpZiAocmVzdWx0KSB7CglpZiAoY29tcGFyZUZpbGVzKHRlbXAsIHJlc3VsdCkpIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgIlJlc3VsdCBmb3IgJXMgb24gJXMgZmFpbGVkXG4iLCBmaWxlbmFtZSwgc2NoKTsKCSAgICByZXQgPSAxOwoJfQogICAgfQogICAgdW5saW5rKHRlbXApOwogICAgZnJlZSh0ZW1wKTsKCiAgICBpZiAoZXJyICE9IE5VTEwpIHsKCWlmIChjb21wYXJlRmlsZU1lbShlcnIsIHRlc3RFcnJvcnMsIHRlc3RFcnJvcnNTaXplKSkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZm9yICVzIG9uICVzIGZhaWxlZFxuIiwgZmlsZW5hbWUsIHNjaCk7CgkgICAgcmV0ID0gMTsKCSAgICBwcmludGYoIiVzIiwgdGVzdEVycm9ycyk7Cgl9CiAgICB9CgoKICAgIHhtbFJlbGF4TkdGcmVlVmFsaWRDdHh0KGN0eHQpOwogICAgeG1sRnJlZURvYyhkb2MpOwogICAgcmV0dXJuKHJldCk7Cn0KLyoqCiAqIHJuZ1Rlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIHNjaGVtYXMgZmlsZQogKiBAcmVzdWx0OiB0aGUgZmlsZSB3aXRoIGV4cGVjdGVkIHJlc3VsdAogKiBAZXJyOiB0aGUgZmlsZSB3aXRoIGVycm9yIG1lc3NhZ2VzCiAqCiAqIFBhcnNlIGFuIFJORyBzY2hlbWFzIGFuZCB0aGVuIGFwcGx5IGl0IHRvIHRoZSByZWxhdGVkIC54bWwKICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKcm5nVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwKICAgICAgICAgICAgY29uc3QgY2hhciAqcmVzdWwgQVRUUklCVVRFX1VOVVNFRCwKICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyciBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICBpbnQgb3B0aW9ucykgewogICAgY29uc3QgY2hhciAqYmFzZSA9IGJhc2VGaWxlbmFtZShmaWxlbmFtZSk7CiAgICBjb25zdCBjaGFyICpiYXNlMjsKICAgIGNvbnN0IGNoYXIgKmluc3RhbmNlOwogICAgeG1sUmVsYXhOR1BhcnNlckN0eHRQdHIgY3R4dDsKICAgIHhtbFJlbGF4TkdQdHIgc2NoZW1hczsKICAgIGludCByZXMgPSAwLCBsZW4sIHJldDsKICAgIGNoYXIgcGF0dGVybls1MDBdOwogICAgY2hhciBwcmVmaXhbNTAwXTsKICAgIGNoYXIgcmVzdWx0WzUwMF07CiAgICBjaGFyIGVycls1MDBdOwogICAgZ2xvYl90IGdsb2JidWY7CiAgICBzaXplX3QgaTsKICAgIGNoYXIgY291bnQgPSAwOwoKICAgIC8qIGZpcnN0IGNvbXBpbGUgdGhlIHNjaGVtYXMgaWYgcG9zc2libGUgKi8KICAgIGN0eHQgPSB4bWxSZWxheE5HTmV3UGFyc2VyQ3R4dChmaWxlbmFtZSk7CiAgICB4bWxSZWxheE5HU2V0UGFyc2VyRXJyb3JzKGN0eHQsCiAgICAgICAgICh4bWxSZWxheE5HVmFsaWRpdHlFcnJvckZ1bmMpIHRlc3RFcnJvckhhbmRsZXIsCiAgICAgICAgICh4bWxSZWxheE5HVmFsaWRpdHlXYXJuaW5nRnVuYykgdGVzdEVycm9ySGFuZGxlciwKCSBjdHh0KTsKICAgIHNjaGVtYXMgPSB4bWxSZWxheE5HUGFyc2UoY3R4dCk7CiAgICB4bWxSZWxheE5HRnJlZVBhcnNlckN0eHQoY3R4dCk7CgogICAgLyoKICAgICAqIG1vc3Qgb2YgdGhlIG1lc3MgaXMgYWJvdXQgdGhlIG91dHB1dCBmaWxlbmFtZXMgZ2VuZXJhdGVkIGJ5IHRoZSBNYWtlZmlsZQogICAgICovCiAgICBsZW4gPSBzdHJsZW4oYmFzZSk7CiAgICBpZiAoKGxlbiA+IDQ5OSkgfHwgKGxlbiA8IDUpKSB7CiAgICAgICAgeG1sUmVsYXhOR0ZyZWUoc2NoZW1hcyk7CglyZXR1cm4oLTEpOwogICAgfQogICAgbGVuIC09IDQ7IC8qIHJlbW92ZSB0cmFpbGluZyAucm5nICovCiAgICBtZW1jcHkocHJlZml4LCBiYXNlLCBsZW4pOwogICAgcHJlZml4W2xlbl0gPSAwOwoKICAgIHNucHJpbnRmKHBhdHRlcm4sIDQ5OSwgIi4vdGVzdC9yZWxheG5nLyVzXz8ueG1sIiwgcHJlZml4KTsKICAgIHBhdHRlcm5bNDk5XSA9IDA7CgogICAgZ2xvYmJ1Zi5nbF9vZmZzID0gMDsKICAgIGdsb2IocGF0dGVybiwgR0xPQl9ET09GRlMsIE5VTEwsICZnbG9iYnVmKTsKICAgIGZvciAoaSA9IDA7aSA8IGdsb2JidWYuZ2xfcGF0aGM7aSsrKSB7CiAgICAgICAgdGVzdEVycm9yc1NpemUgPSAwOwoJdGVzdEVycm9yc1swXSA9IDA7CiAgICAgICAgaW5zdGFuY2UgPSBnbG9iYnVmLmdsX3BhdGh2W2ldOwoJYmFzZTIgPSBiYXNlRmlsZW5hbWUoaW5zdGFuY2UpOwoJbGVuID0gc3RybGVuKGJhc2UyKTsKCWlmICgobGVuID4gNikgJiYgKGJhc2UyW2xlbiAtIDZdID09ICdfJykpIHsKCSAgICBjb3VudCA9IGJhc2UyW2xlbiAtIDVdOwoJICAgIHNucHJpbnRmKHJlc3VsdCwgNDk5LCAicmVzdWx0L3JlbGF4bmcvJXNfJWMiLAoJCSAgICAgcHJlZml4LCBjb3VudCk7CgkgICAgcmVzdWx0WzQ5OV0gPSAwOwoJICAgIHNucHJpbnRmKGVyciwgNDk5LCAicmVzdWx0L3JlbGF4bmcvJXNfJWMuZXJyIiwKCQkgICAgIHByZWZpeCwgY291bnQpOwoJICAgIGVycls0OTldID0gMDsKCX0gZWxzZSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJkb24ndCBrbm93IGhvdyB0byBwcm9jZXNzICVzXG4iLCBpbnN0YW5jZSk7CgkgICAgY29udGludWU7Cgl9CglpZiAoc2NoZW1hcyA9PSBOVUxMKSB7Cgl9IGVsc2UgewoJICAgIG5iX3Rlc3RzKys7CgkgICAgcmV0ID0gcm5nT25lVGVzdChmaWxlbmFtZSwgaW5zdGFuY2UsIHJlc3VsdCwgZXJyLAoJICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMsIHNjaGVtYXMpOwoJICAgIGlmIChyZXMgIT0gMCkKCQlyZXQgPSByZXM7Cgl9CiAgICB9CiAgICBnbG9iZnJlZSgmZ2xvYmJ1Zik7CiAgICB4bWxSZWxheE5HRnJlZShzY2hlbWFzKTsKCiAgICByZXR1cm4ocmVzKTsKfQoKI2lmZGVmIExJQlhNTF9SRUFERVJfRU5BQkxFRAovKioKICogcm5nU3RyZWFtVGVzdDoKICogQGZpbGVuYW1lOiB0aGUgc2NoZW1hcyBmaWxlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXMKICoKICogUGFyc2UgYSBzZXQgb2YgZmlsZXMgd2l0aCBzdHJlYW1pbmcsIGFwcGx5aW5nIGFuIFJORyBzY2hlbWFzIAogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludApybmdTdHJlYW1UZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bCBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICBjb25zdCBjaGFyICplcnJyIEFUVFJJQlVURV9VTlVTRUQsCiAgICAgICAgICAgIGludCBvcHRpb25zKSB7CiAgICBjb25zdCBjaGFyICpiYXNlID0gYmFzZUZpbGVuYW1lKGZpbGVuYW1lKTsKICAgIGNvbnN0IGNoYXIgKmJhc2UyOwogICAgY29uc3QgY2hhciAqaW5zdGFuY2U7CiAgICBpbnQgcmVzID0gMCwgbGVuLCByZXQ7CiAgICBjaGFyIHBhdHRlcm5bNTAwXTsKICAgIGNoYXIgcHJlZml4WzUwMF07CiAgICBjaGFyIHJlc3VsdFs1MDBdOwogICAgY2hhciBlcnJbNTAwXTsKICAgIGdsb2JfdCBnbG9iYnVmOwogICAgc2l6ZV90IGk7CiAgICBjaGFyIGNvdW50ID0gMDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOwogICAgaW50IGRpc2FibGVfZXJyID0gMDsKCiAgICAvKgogICAgICogbW9zdCBvZiB0aGUgbWVzcyBpcyBhYm91dCB0aGUgb3V0cHV0IGZpbGVuYW1lcyBnZW5lcmF0ZWQgYnkgdGhlIE1ha2VmaWxlCiAgICAgKi8KICAgIGxlbiA9IHN0cmxlbihiYXNlKTsKICAgIGlmICgobGVuID4gNDk5KSB8fCAobGVuIDwgNSkpIHsKCWZwcmludGYoc3RkZXJyLCAibGVuKGJhc2UpID09ICVkICFcbiIsIGxlbik7CglyZXR1cm4oLTEpOwogICAgfQogICAgbGVuIC09IDQ7IC8qIHJlbW92ZSB0cmFpbGluZyAucm5nICovCiAgICBtZW1jcHkocHJlZml4LCBiYXNlLCBsZW4pOwogICAgcHJlZml4W2xlbl0gPSAwOwoKICAgIC8qCiAgICAgKiBzdHJpY3RseSB1bmlmeWluZyB0aGUgZXJyb3IgbWVzc2FnZXMgaXMgbmVhcmx5IGltcG9zc2libGUgdGhpcwogICAgICogaGFjayBpcyBhbHNvIGRvbmUgaW4gdGhlIE1ha2VmaWxlCiAgICAgKi8KICAgIGlmICgoIXN0cmNtcChwcmVmaXgsICJ0dXRvcjEwXzEiKSkgfHwgKCFzdHJjbXAocHJlZml4LCAidHV0b3IxMF8yIikpIHx8CiAgICAgICAgKCFzdHJjbXAocHJlZml4LCAidHV0b3IzXzIiKSkgfHwgKCFzdHJjbXAocHJlZml4LCAiMzA3Mzc3IikpKSAKCWRpc2FibGVfZXJyID0gMTsKCiAgICBzbnByaW50ZihwYXR0ZXJuLCA0OTksICIuL3Rlc3QvcmVsYXhuZy8lc18/LnhtbCIsIHByZWZpeCk7CiAgICBwYXR0ZXJuWzQ5OV0gPSAwOwoKICAgIGdsb2JidWYuZ2xfb2ZmcyA9IDA7CiAgICBnbG9iKHBhdHRlcm4sIEdMT0JfRE9PRkZTLCBOVUxMLCAmZ2xvYmJ1Zik7CiAgICBmb3IgKGkgPSAwO2kgPCBnbG9iYnVmLmdsX3BhdGhjO2krKykgewogICAgICAgIHRlc3RFcnJvcnNTaXplID0gMDsKCXRlc3RFcnJvcnNbMF0gPSAwOwogICAgICAgIGluc3RhbmNlID0gZ2xvYmJ1Zi5nbF9wYXRodltpXTsKCWJhc2UyID0gYmFzZUZpbGVuYW1lKGluc3RhbmNlKTsKCWxlbiA9IHN0cmxlbihiYXNlMik7CglpZiAoKGxlbiA+IDYpICYmIChiYXNlMltsZW4gLSA2XSA9PSAnXycpKSB7CgkgICAgY291bnQgPSBiYXNlMltsZW4gLSA1XTsKCSAgICBzbnByaW50ZihyZXN1bHQsIDQ5OSwgInJlc3VsdC9yZWxheG5nLyVzXyVjIiwKCQkgICAgIHByZWZpeCwgY291bnQpOwoJICAgIHJlc3VsdFs0OTldID0gMDsKCSAgICBzbnByaW50ZihlcnIsIDQ5OSwgInJlc3VsdC9yZWxheG5nLyVzXyVjLmVyciIsCgkJICAgICBwcmVmaXgsIGNvdW50KTsKCSAgICBlcnJbNDk5XSA9IDA7Cgl9IGVsc2UgewoJICAgIGZwcmludGYoc3RkZXJyLCAiZG9uJ3Qga25vdyBob3cgdG8gcHJvY2VzcyAlc1xuIiwgaW5zdGFuY2UpOwoJICAgIGNvbnRpbnVlOwoJfQoJcmVhZGVyID0geG1sUmVhZGVyRm9yRmlsZShpbnN0YW5jZSwgTlVMTCwgb3B0aW9ucyk7CglpZiAocmVhZGVyID09IE5VTEwpIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBidWlsZCByZWRlciBmb3IgJXNcbiIsIGluc3RhbmNlKTsKCX0KCWlmIChkaXNhYmxlX2VyciA9PSAxKQoJICAgIHJldCA9IHN0cmVhbVByb2Nlc3NUZXN0KGluc3RhbmNlLCByZXN1bHQsIE5VTEwsIHJlYWRlciwgZmlsZW5hbWUpOwoJZWxzZQoJICAgIHJldCA9IHN0cmVhbVByb2Nlc3NUZXN0KGluc3RhbmNlLCByZXN1bHQsIGVyciwgcmVhZGVyLCBmaWxlbmFtZSk7Cgl4bWxGcmVlVGV4dFJlYWRlcihyZWFkZXIpOwoJaWYgKHJldCAhPSAwKSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJpbnN0YW5jZSAlcyBmYWlsZWRcbiIsIGluc3RhbmNlKTsKCSAgICByZXMgPSByZXQ7Cgl9CiAgICB9CiAgICBnbG9iZnJlZSgmZ2xvYmJ1Zik7CgogICAgcmV0dXJuKHJlcyk7Cn0KI2VuZGlmIC8qIFJFQURFUiAqLwoKI2VuZGlmCgojaWZkZWYgTElCWE1MX1BBVFRFUk5fRU5BQkxFRAojaWZkZWYgTElCWE1MX1JFQURFUl9FTkFCTEVECi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJCQkJCQkqCiAqCQkJUGF0dGVybnMgdGVzdHMJCQkJCSoKICoJCQkJCQkJCQkqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkIHBhdHRlcm5Ob2RlKEZJTEUgKm91dCwgeG1sVGV4dFJlYWRlclB0ciByZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdHRlcm4sIHhtbFBhdHRlcm5QdHIgcGF0dGVybmMsCgkJCXhtbFN0cmVhbUN0eHRQdHIgcGF0c3RyZWFtKSB7CiAgICB4bWxDaGFyICpwYXRoID0gTlVMTDsKICAgIGludCBtYXRjaCA9IC0xOwogICAgaW50IHR5cGUsIGVtcHR5OwoKICAgIHR5cGUgPSB4bWxUZXh0UmVhZGVyTm9kZVR5cGUocmVhZGVyKTsKICAgIGVtcHR5ID0geG1sVGV4dFJlYWRlcklzRW1wdHlFbGVtZW50KHJlYWRlcik7CgkKICAgIGlmICh0eXBlID09IFhNTF9SRUFERVJfVFlQRV9FTEVNRU5UKSB7CgkvKiBkbyB0aGUgY2hlY2sgb25seSBvbiBlbGVtZW50IHN0YXJ0ICovCgltYXRjaCA9IHhtbFBhdHRlcm5NYXRjaChwYXR0ZXJuYywgeG1sVGV4dFJlYWRlckN1cnJlbnROb2RlKHJlYWRlcikpOwoKCWlmIChtYXRjaCkgewoJICAgIHBhdGggPSB4bWxHZXROb2RlUGF0aCh4bWxUZXh0UmVhZGVyQ3VycmVudE5vZGUocmVhZGVyKSk7CgkgICAgZnByaW50ZihvdXQsICJOb2RlICVzIG1hdGNoZXMgcGF0dGVybiAlc1xuIiwgcGF0aCwgcGF0dGVybik7Cgl9CiAgICB9CiAgICBpZiAocGF0c3RyZWFtICE9IE5VTEwpIHsKCWludCByZXQ7CgoJaWYgKHR5cGUgPT0gWE1MX1JFQURFUl9UWVBFX0VMRU1FTlQpIHsKCSAgICByZXQgPSB4bWxTdHJlYW1QdXNoKHBhdHN0cmVhbSwKCQkJCXhtbFRleHRSZWFkZXJDb25zdExvY2FsTmFtZShyZWFkZXIpLAoJCQkJeG1sVGV4dFJlYWRlckNvbnN0TmFtZXNwYWNlVXJpKHJlYWRlcikpOwoJICAgIGlmIChyZXQgPCAwKSB7CgkJZnByaW50ZihvdXQsICJ4bWxTdHJlYW1QdXNoKCkgZmFpbHVyZVxuIik7CgkJeG1sRnJlZVN0cmVhbUN0eHQocGF0c3RyZWFtKTsKCQlwYXRzdHJlYW0gPSBOVUxMOwoJICAgIH0gZWxzZSBpZiAocmV0ICE9IG1hdGNoKSB7CgkJaWYgKHBhdGggPT0gTlVMTCkgewoJCSAgICBwYXRoID0geG1sR2V0Tm9kZVBhdGgoCgkJCQkgICB4bWxUZXh0UmVhZGVyQ3VycmVudE5vZGUocmVhZGVyKSk7CgkJfQoJCWZwcmludGYob3V0LAoJCQkieG1sUGF0dGVybk1hdGNoIGFuZCB4bWxTdHJlYW1QdXNoIGRpc2FncmVlXG4iKTsKCQlmcHJpbnRmKG91dCwKCQkJIiAgcGF0dGVybiAlcyBub2RlICVzXG4iLAoJCQlwYXR0ZXJuLCBwYXRoKTsKCSAgICB9CgkgICAgCgoJfSAKCWlmICgodHlwZSA9PSBYTUxfUkVBREVSX1RZUEVfRU5EX0VMRU1FTlQpIHx8CgkgICAgKCh0eXBlID09IFhNTF9SRUFERVJfVFlQRV9FTEVNRU5UKSAmJiAoZW1wdHkpKSkgewoJICAgIHJldCA9IHhtbFN0cmVhbVBvcChwYXRzdHJlYW0pOwoJICAgIGlmIChyZXQgPCAwKSB7CgkJZnByaW50ZihvdXQsICJ4bWxTdHJlYW1Qb3AoKSBmYWlsdXJlXG4iKTsKCQl4bWxGcmVlU3RyZWFtQ3R4dChwYXRzdHJlYW0pOwoJCXBhdHN0cmVhbSA9IE5VTEw7CgkgICAgfQoJfQogICAgfQogICAgaWYgKHBhdGggIT0gTlVMTCkKCXhtbEZyZWUocGF0aCk7Cn0KCi8qKgogKiBwYXR0ZXJuVGVzdDoKICogQGZpbGVuYW1lOiB0aGUgc2NoZW1hcyBmaWxlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXMKICoKICogUGFyc2UgYSBzZXQgb2YgZmlsZXMgd2l0aCBzdHJlYW1pbmcsIGFwcGx5aW5nIGFuIFJORyBzY2hlbWFzIAogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludApwYXR0ZXJuVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwKICAgICAgICAgICAgY29uc3QgY2hhciAqcmVzdWwgQVRUUklCVVRFX1VOVVNFRCwKICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyIEFUVFJJQlVURV9VTlVTRUQsCiAgICAgICAgICAgIGludCBvcHRpb25zKSB7CiAgICB4bWxQYXR0ZXJuUHRyIHBhdHRlcm5jID0gTlVMTDsKICAgIHhtbFN0cmVhbUN0eHRQdHIgcGF0c3RyZWFtID0gTlVMTDsKICAgIEZJTEUgKm8sICpmOwogICAgY2hhciBzdHJbMTAyNF07CiAgICBjaGFyIHhtbFs1MDBdOwogICAgY2hhciByZXN1bHRbNTAwXTsKICAgIGludCBsZW4sIGk7CiAgICBpbnQgcmV0ID0gMCwgcmVzOwogICAgY2hhciAqdGVtcDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOwogICAgeG1sRG9jUHRyIGRvYzsKCiAgICBsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOwogICAgbGVuIC09IDQ7CiAgICBtZW1jcHkoeG1sLCBmaWxlbmFtZSwgbGVuKTsKICAgIHhtbFtsZW5dID0gMDsKICAgIHNucHJpbnRmKHJlc3VsdCwgNDk5LCAicmVzdWx0L3BhdHRlcm4vJXMiLCBiYXNlRmlsZW5hbWUoeG1sKSk7CiAgICByZXN1bHRbNDk5XSA9IDA7CiAgICBtZW1jcHkoeG1sICsgbGVuLCAiLnhtbCIsIDUpOwoKICAgIGlmICghY2hlY2tUZXN0RmlsZSh4bWwpKSB7CglmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgeG1sIGZpbGUgJXNcbiIsIHhtbCk7CglyZXR1cm4oLTEpOwogICAgfQogICAgaWYgKCFjaGVja1Rlc3RGaWxlKHJlc3VsdCkpIHsKCWZwcmludGYoc3RkZXJyLCAiTWlzc2luZyByZXN1bHQgZmlsZSAlc1xuIiwgcmVzdWx0KTsKCXJldHVybigtMSk7CiAgICB9CiAgICBmID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpOwogICAgaWYgKGYgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gJXNcbiIsIGZpbGVuYW1lKTsKCXJldHVybigtMSk7CiAgICB9CiAgICB0ZW1wID0gcmVzdWx0RmlsZW5hbWUoZmlsZW5hbWUsICIiLCAiLnJlcyIpOwogICAgaWYgKHRlbXAgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiT3V0IG9mIG1lbW9yeVxuIik7CiAgICAgICAgZmF0YWxFcnJvcigpOwogICAgfQogICAgbyA9IGZvcGVuKHRlbXAsICJ3YiIpOwogICAgaWYgKG8gPT0gTlVMTCkgewoJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSAlc1xuIiwgdGVtcCk7CglmY2xvc2UoZik7CiAgICAgICAgZnJlZSh0ZW1wKTsKCXJldHVybigtMSk7CiAgICB9CiAgICB3aGlsZSAoMSkgewoJLyoKCSAqIHJlYWQgb25lIGxpbmUgaW4gc3RyaW5nIGJ1ZmZlci4KCSAqLwoJaWYgKGZnZXRzICgmc3RyWzBdLCBzaXplb2YgKHN0cikgLSAxLCBmKSA9PSBOVUxMKQoJICAgYnJlYWs7CgoJLyoKCSAqIHJlbW92ZSB0aGUgZW5kaW5nIHNwYWNlcwoJICovCglpID0gc3RybGVuKHN0cik7Cgl3aGlsZSAoKGkgPiAwKSAmJgoJICAgICAgICgoc3RyW2kgLSAxXSA9PSAnXG4nKSB8fCAoc3RyW2kgLSAxXSA9PSAnXHInKSB8fAoJCShzdHJbaSAtIDFdID09ICcgJykgfHwgKHN0cltpIC0gMV0gPT0gJ1x0JykpKSB7CgkgICAgaS0tOwoJICAgIHN0cltpXSA9IDA7Cgl9Cglkb2MgPSB4bWxSZWFkRmlsZSh4bWwsIE5VTEwsIG9wdGlvbnMpOwoJaWYgKGRvYyA9PSBOVUxMKSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcGFyc2UgJXNcbiIsIHhtbCk7CgkgICAgcmV0ID0gMTsKCX0gZWxzZSB7CgkgICAgeG1sTm9kZVB0ciByb290OwoJICAgIGNvbnN0IHhtbENoYXIgKm5hbWVzcGFjZXNbMjJdOwoJICAgIGludCBqOwoJICAgIHhtbE5zUHRyIG5zOwoKCSAgICByb290ID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKTsKCSAgICBmb3IgKG5zID0gcm9vdC0+bnNEZWYsIGogPSAwO25zICE9IE5VTEwgJiYgaiA8IDIwO25zPW5zLT5uZXh0KSB7CgkJbmFtZXNwYWNlc1tqKytdID0gbnMtPmhyZWY7CgkJbmFtZXNwYWNlc1tqKytdID0gbnMtPnByZWZpeDsKCSAgICB9CgkgICAgbmFtZXNwYWNlc1tqKytdID0gTlVMTDsKCSAgICBuYW1lc3BhY2VzW2orK10gPSBOVUxMOwoKCSAgICBwYXR0ZXJuYyA9IHhtbFBhdHRlcm5jb21waWxlKChjb25zdCB4bWxDaGFyICopIHN0ciwgZG9jLT5kaWN0LAoJCQkJCSAwLCAmbmFtZXNwYWNlc1swXSk7CgkgICAgaWYgKHBhdHRlcm5jID09IE5VTEwpIHsKCQl0ZXN0RXJyb3JIYW5kbGVyKE5VTEwsCgkJCSJQYXR0ZXJuICVzIGZhaWxlZCB0byBjb21waWxlXG4iLCBzdHIpOwoJCXhtbEZyZWVEb2MoZG9jKTsKCQlyZXQgPSAxOwoJCWNvbnRpbnVlOwoJICAgIH0KCSAgICBwYXRzdHJlYW0gPSB4bWxQYXR0ZXJuR2V0U3RyZWFtQ3R4dChwYXR0ZXJuYyk7CgkgICAgaWYgKHBhdHN0cmVhbSAhPSBOVUxMKSB7CgkJcmV0ID0geG1sU3RyZWFtUHVzaChwYXRzdHJlYW0sIE5VTEwsIE5VTEwpOwoJCWlmIChyZXQgPCAwKSB7CgkJICAgIGZwcmludGYoc3RkZXJyLCAieG1sU3RyZWFtUHVzaCgpIGZhaWx1cmVcbiIpOwoJCSAgICB4bWxGcmVlU3RyZWFtQ3R4dChwYXRzdHJlYW0pOwoJCSAgICBwYXRzdHJlYW0gPSBOVUxMOwoJCX0KCSAgICB9CgkgICAgbmJfdGVzdHMrKzsKCgkgICAgcmVhZGVyID0geG1sUmVhZGVyV2Fsa2VyKGRvYyk7CgkgICAgcmVzID0geG1sVGV4dFJlYWRlclJlYWQocmVhZGVyKTsKCSAgICB3aGlsZSAocmVzID09IDEpIHsKCQlwYXR0ZXJuTm9kZShvLCByZWFkZXIsIHN0ciwgcGF0dGVybmMsIHBhdHN0cmVhbSk7CgkJcmVzID0geG1sVGV4dFJlYWRlclJlYWQocmVhZGVyKTsKCSAgICB9CgkgICAgaWYgKHJlcyAhPSAwKSB7CgkJZnByaW50ZihvLCAiJXMgOiBmYWlsZWQgdG8gcGFyc2VcbiIsIGZpbGVuYW1lKTsKCSAgICB9CgkgICAgeG1sRnJlZVRleHRSZWFkZXIocmVhZGVyKTsKCSAgICB4bWxGcmVlRG9jKGRvYyk7CgkgICAgeG1sRnJlZVN0cmVhbUN0eHQocGF0c3RyZWFtKTsKCSAgICBwYXRzdHJlYW0gPSBOVUxMOwoJICAgIHhtbEZyZWVQYXR0ZXJuKHBhdHRlcm5jKTsKCgl9CiAgICB9CgogICAgZmNsb3NlKGYpOwogICAgZmNsb3NlKG8pOwoKICAgIHJldCA9IGNvbXBhcmVGaWxlcyh0ZW1wLCByZXN1bHQpOwogICAgaWYgKHJldCkgewoJZnByaW50ZihzdGRlcnIsICJSZXN1bHQgZm9yICVzIGZhaWxlZFxuIiwgZmlsZW5hbWUpOwoJcmV0ID0gMTsKICAgIH0KICAgIHVubGluayh0ZW1wKTsKICAgIGZyZWUodGVtcCk7CiAgICByZXR1cm4ocmV0KTsKfQojZW5kaWYgLyogUkVBREVSICovCiNlbmRpZiAvKiBQQVRURVJOICovCiNpZmRlZiBMSUJYTUxfQzE0Tl9FTkFCTEVECi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJCQkJCQkqCiAqCQkJQ2Fub25pY2FsaXphdGlvbiB0ZXN0cwkJCQkqCiAqCQkJCQkJCQkJKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgeG1sWFBhdGhPYmplY3RQdHIKbG9hZF94cGF0aF9leHByICh4bWxEb2NQdHIgcGFyZW50X2RvYywgY29uc3QgY2hhciogZmlsZW5hbWUpIHsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHhwYXRoOyAKICAgIHhtbERvY1B0ciBkb2M7CiAgICB4bWxDaGFyICpleHByOwogICAgeG1sWFBhdGhDb250ZXh0UHRyIGN0eDsgCiAgICB4bWxOb2RlUHRyIG5vZGU7CiAgICB4bWxOc1B0ciBuczsKICAgIAogICAgLyoKICAgICAqIGxvYWQgWFBhdGggZXhwciBhcyBhIGZpbGUKICAgICAqLwogICAgeG1sTG9hZEV4dER0ZERlZmF1bHRWYWx1ZSA9IFhNTF9ERVRFQ1RfSURTIHwgWE1MX0NPTVBMRVRFX0FUVFJTOwogICAgeG1sU3Vic3RpdHV0ZUVudGl0aWVzRGVmYXVsdCgxKTsKCiAgICBkb2MgPSB4bWxSZWFkRmlsZShmaWxlbmFtZSwgTlVMTCwgWE1MX1BBUlNFX0RUREFUVFIgfCBYTUxfUEFSU0VfTk9FTlQpOwogICAgaWYgKGRvYyA9PSBOVUxMKSB7CglmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiB1bmFibGUgdG8gcGFyc2UgZmlsZSBcIiVzXCJcbiIsIGZpbGVuYW1lKTsKCXJldHVybihOVUxMKTsKICAgIH0KICAgIAogICAgLyoKICAgICAqIENoZWNrIHRoZSBkb2N1bWVudCBpcyBvZiB0aGUgcmlnaHQga2luZAogICAgICovICAgIAogICAgaWYoeG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKSA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsIkVycm9yOiBlbXB0eSBkb2N1bWVudCBmb3IgZmlsZSBcIiVzXCJcbiIsIGZpbGVuYW1lKTsKCXhtbEZyZWVEb2MoZG9jKTsKCXJldHVybihOVUxMKTsKICAgIH0KCiAgICBub2RlID0gZG9jLT5jaGlsZHJlbjsKICAgIHdoaWxlKG5vZGUgIT0gTlVMTCAmJiAheG1sU3RyRXF1YWwobm9kZS0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikiWFBhdGgiKSkgewoJbm9kZSA9IG5vZGUtPm5leHQ7CiAgICB9CiAgICAKICAgIGlmKG5vZGUgPT0gTlVMTCkgeyAgIAogICAgICAgIGZwcmludGYoc3RkZXJyLCJFcnJvcjogWFBhdGggZWxlbWVudCBleHBlY3RlZCBpbiB0aGUgZmlsZSAgXCIlc1wiXG4iLCBmaWxlbmFtZSk7Cgl4bWxGcmVlRG9jKGRvYyk7CglyZXR1cm4oTlVMTCk7CiAgICB9CgogICAgZXhwciA9IHhtbE5vZGVHZXRDb250ZW50KG5vZGUpOwogICAgaWYoZXhwciA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsIkVycm9yOiBYUGF0aCBjb250ZW50IGVsZW1lbnQgaXMgTlVMTCBcIiVzXCJcbiIsIGZpbGVuYW1lKTsKCXhtbEZyZWVEb2MoZG9jKTsKCXJldHVybihOVUxMKTsKICAgIH0KCiAgICBjdHggPSB4bWxYUGF0aE5ld0NvbnRleHQocGFyZW50X2RvYyk7CiAgICBpZihjdHggPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCJFcnJvcjogdW5hYmxlIHRvIGNyZWF0ZSBuZXcgY29udGV4dFxuIik7CiAgICAgICAgeG1sRnJlZShleHByKTsgCiAgICAgICAgeG1sRnJlZURvYyhkb2MpOyAKICAgICAgICByZXR1cm4oTlVMTCk7CiAgICB9CgogICAgLyoKICAgICAqIFJlZ2lzdGVyIG5hbWVzcGFjZXMKICAgICAqLwogICAgbnMgPSBub2RlLT5uc0RlZjsKICAgIHdoaWxlKG5zICE9IE5VTEwpIHsKCWlmKHhtbFhQYXRoUmVnaXN0ZXJOcyhjdHgsIG5zLT5wcmVmaXgsIG5zLT5ocmVmKSAhPSAwKSB7CgkgICAgZnByaW50ZihzdGRlcnIsIkVycm9yOiB1bmFibGUgdG8gcmVnaXN0ZXIgTlMgd2l0aCBwcmVmaXg9XCIlc1wiIGFuZCBocmVmPVwiJXNcIlxuIiwgbnMtPnByZWZpeCwgbnMtPmhyZWYpOwogICAgCSAgICB4bWxGcmVlKGV4cHIpOyAKCSAgICB4bWxYUGF0aEZyZWVDb250ZXh0KGN0eCk7IAoJICAgIHhtbEZyZWVEb2MoZG9jKTsgCgkgICAgcmV0dXJuKE5VTEwpOwoJfQoJbnMgPSBucy0+bmV4dDsKICAgIH0KCiAgICAvKiAgCiAgICAgKiBFdmFsdWF0ZSB4cGF0aAogICAgICovCiAgICB4cGF0aCA9IHhtbFhQYXRoRXZhbEV4cHJlc3Npb24oZXhwciwgY3R4KTsKICAgIGlmKHhwYXRoID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3I6IHVuYWJsZSB0byBldmFsdWF0ZSB4cGF0aCBleHByZXNzaW9uXG4iKTsKICAgIAl4bWxGcmVlKGV4cHIpOyAKICAgICAgICB4bWxYUGF0aEZyZWVDb250ZXh0KGN0eCk7IAogICAgICAgIHhtbEZyZWVEb2MoZG9jKTsgCiAgICAgICAgcmV0dXJuKE5VTEwpOwogICAgfQoKICAgIC8qIHByaW50X3hwYXRoX25vZGVzKHhwYXRoLT5ub2Rlc2V0dmFsKTsgKi8KCiAgICB4bWxGcmVlKGV4cHIpOyAKICAgIHhtbFhQYXRoRnJlZUNvbnRleHQoY3R4KTsgCiAgICB4bWxGcmVlRG9jKGRvYyk7IAogICAgcmV0dXJuKHhwYXRoKTsKfQoKLyoKICogTWFjcm8gdXNlZCB0byBncm93IHRoZSBjdXJyZW50IGJ1ZmZlci4KICovCiNkZWZpbmUgeHh4X2dyb3dCdWZmZXJSZWVudHJhbnQoKSB7CQkJCQkJXAogICAgYnVmZmVyX3NpemUgKj0gMjsJCQkJCQkJXAogICAgYnVmZmVyID0gKHhtbENoYXIgKiopCQkJCQkJXAogICAgCQl4bWxSZWFsbG9jKGJ1ZmZlciwgYnVmZmVyX3NpemUgKiBzaXplb2YoeG1sQ2hhciopKTsJXAogICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CQkJCQkJXAoJcGVycm9yKCJyZWFsbG9jIGZhaWxlZCIpOwkJCQkJXAoJcmV0dXJuKE5VTEwpOwkJCQkJCQlcCiAgICB9CQkJCQkJCQkJXAp9CgpzdGF0aWMgeG1sQ2hhciAqKgpwYXJzZV9saXN0KHhtbENoYXIgKnN0cikgewogICAgeG1sQ2hhciAqKmJ1ZmZlcjsKICAgIHhtbENoYXIgKipvdXQgPSBOVUxMOwogICAgaW50IGJ1ZmZlcl9zaXplID0gMDsKICAgIGludCBsZW47CgogICAgaWYoc3RyID09IE5VTEwpIHsKCXJldHVybihOVUxMKTsKICAgIH0KCiAgICBsZW4gPSB4bWxTdHJsZW4oc3RyKTsKICAgIGlmKChzdHJbMF0gPT0gJ1wnJykgJiYgKHN0cltsZW4gLSAxXSA9PSAnXCcnKSkgewoJc3RyW2xlbiAtIDFdID0gJ1wwJzsKCXN0cisrOwoJbGVuIC09IDI7CiAgICB9CiAgICAvKgogICAgICogYWxsb2NhdGUgYW4gdHJhbnNsYXRpb24gYnVmZmVyLgogICAgICovCiAgICBidWZmZXJfc2l6ZSA9IDEwMDA7CiAgICBidWZmZXIgPSAoeG1sQ2hhciAqKikgeG1sTWFsbG9jKGJ1ZmZlcl9zaXplICogc2l6ZW9mKHhtbENoYXIqKSk7CiAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKCXBlcnJvcigibWFsbG9jIGZhaWxlZCIpOwoJcmV0dXJuKE5VTEwpOwogICAgfQogICAgb3V0ID0gYnVmZmVyOwogICAgCiAgICB3aGlsZSgqc3RyICE9ICdcMCcpIHsKCWlmIChvdXQgLSBidWZmZXIgPiBidWZmZXJfc2l6ZSAtIDEwKSB7CgkgICAgaW50IGluZHggPSBvdXQgLSBidWZmZXI7CgoJICAgIHh4eF9ncm93QnVmZmVyUmVlbnRyYW50KCk7CgkgICAgb3V0ID0gJmJ1ZmZlcltpbmR4XTsKCX0KCSgqb3V0KyspID0gc3RyOwoJd2hpbGUoKnN0ciAhPSAnLCcgJiYgKnN0ciAhPSAnXDAnKSArK3N0cjsKCWlmKCpzdHIgPT0gJywnKSAqKHN0cisrKSA9ICdcMCc7CiAgICB9CiAgICAoKm91dCkgPSBOVUxMOwogICAgcmV0dXJuIGJ1ZmZlcjsKfQoKc3RhdGljIGludCAKYzE0blJ1blRlc3QoY29uc3QgY2hhciogeG1sX2ZpbGVuYW1lLCBpbnQgd2l0aF9jb21tZW50cywgaW50IGV4Y2x1c2l2ZSwKCSAgICBjb25zdCBjaGFyKiB4cGF0aF9maWxlbmFtZSwgY29uc3QgY2hhciAqbnNfZmlsZW5hbWUsCgkgICAgY29uc3QgY2hhciogcmVzdWx0X2ZpbGUpIHsKICAgIHhtbERvY1B0ciBkb2M7CiAgICB4bWxYUGF0aE9iamVjdFB0ciB4cGF0aCA9IE5VTEw7IAogICAgeG1sQ2hhciAqcmVzdWx0ID0gTlVMTDsKICAgIGludCByZXQ7CiAgICB4bWxDaGFyICoqaW5jbHVzaXZlX25hbWVzcGFjZXMgPSBOVUxMOwogICAgY29uc3QgY2hhciAqbnNsaXN0ID0gTlVMTDsKICAgIGludCBuc3NpemU7CgoKICAgIC8qCiAgICAgKiBidWlsZCBhbiBYTUwgdHJlZSBmcm9tIGEgdGhlIGZpbGU7IHdlIG5lZWQgdG8gYWRkIGRlZmF1bHQKICAgICAqIGF0dHJpYnV0ZXMgYW5kIHJlc29sdmUgYWxsIGNoYXJhY3RlciBhbmQgZW50aXRpZXMgcmVmZXJlbmNlcwogICAgICovCiAgICB4bWxMb2FkRXh0RHRkRGVmYXVsdFZhbHVlID0gWE1MX0RFVEVDVF9JRFMgfCBYTUxfQ09NUExFVEVfQVRUUlM7CiAgICB4bWxTdWJzdGl0dXRlRW50aXRpZXNEZWZhdWx0KDEpOwoKICAgIGRvYyA9IHhtbFJlYWRGaWxlKHhtbF9maWxlbmFtZSwgTlVMTCwgWE1MX1BBUlNFX0RUREFUVFIgfCBYTUxfUEFSU0VfTk9FTlQpOwogICAgaWYgKGRvYyA9PSBOVUxMKSB7CglmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiB1bmFibGUgdG8gcGFyc2UgZmlsZSBcIiVzXCJcbiIsIHhtbF9maWxlbmFtZSk7CglyZXR1cm4oLTEpOwogICAgfQogICAgCiAgICAvKgogICAgICogQ2hlY2sgdGhlIGRvY3VtZW50IGlzIG9mIHRoZSByaWdodCBraW5kCiAgICAgKi8gICAgCiAgICBpZih4bWxEb2NHZXRSb290RWxlbWVudChkb2MpID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3I6IGVtcHR5IGRvY3VtZW50IGZvciBmaWxlIFwiJXNcIlxuIiwgeG1sX2ZpbGVuYW1lKTsKCXhtbEZyZWVEb2MoZG9jKTsKCXJldHVybigtMSk7CiAgICB9CgogICAgLyogCiAgICAgKiBsb2FkIHhwYXRoIGZpbGUgaWYgc3BlY2lmaWVkIAogICAgICovCiAgICBpZih4cGF0aF9maWxlbmFtZSkgewoJeHBhdGggPSBsb2FkX3hwYXRoX2V4cHIoZG9jLCB4cGF0aF9maWxlbmFtZSk7CglpZih4cGF0aCA9PSBOVUxMKSB7CgkgICAgZnByaW50ZihzdGRlcnIsIkVycm9yOiB1bmFibGUgdG8gZXZhbHVhdGUgeHBhdGggZXhwcmVzc2lvblxuIik7CgkgICAgeG1sRnJlZURvYyhkb2MpOyAKCSAgICByZXR1cm4oLTEpOwoJfQogICAgfQoKICAgIGlmIChuc19maWxlbmFtZSAhPSBOVUxMKSB7CiAgICAgICAgaWYgKGxvYWRNZW0obnNfZmlsZW5hbWUsICZuc2xpc3QsICZuc3NpemUpKSB7CgkgICAgZnByaW50ZihzdGRlcnIsIkVycm9yOiB1bmFibGUgdG8gZXZhbHVhdGUgeHBhdGggZXhwcmVzc2lvblxuIik7CgkgICAgaWYoeHBhdGggIT0gTlVMTCkgeG1sWFBhdGhGcmVlT2JqZWN0KHhwYXRoKTsKCSAgICB4bWxGcmVlRG9jKGRvYyk7IAoJICAgIHJldHVybigtMSk7Cgl9CiAgICAgICAgaW5jbHVzaXZlX25hbWVzcGFjZXMgPSBwYXJzZV9saXN0KCh4bWxDaGFyICopIG5zbGlzdCk7CiAgICB9CgogICAgLyoKICAgICAqIENhbm9uaWNhbCBmb3JtCiAgICAgKi8gICAgICAKICAgIC8qIGZwcmludGYoc3RkZXJyLCJGaWxlIFwiJXNcIiBsb2FkZWQ6IHN0YXJ0IGNhbm9uaXphdGlvblxuIiwgeG1sX2ZpbGVuYW1lKTsgKi8KICAgIHJldCA9IHhtbEMxNE5Eb2NEdW1wTWVtb3J5KGRvYywgCgkgICAgKHhwYXRoKSA/IHhwYXRoLT5ub2Rlc2V0dmFsIDogTlVMTCwgCgkgICAgZXhjbHVzaXZlLCBpbmNsdXNpdmVfbmFtZXNwYWNlcywKCSAgICB3aXRoX2NvbW1lbnRzLCAmcmVzdWx0KTsKICAgIGlmIChyZXQgPj0gMCkgewoJaWYocmVzdWx0ICE9IE5VTEwpIHsKCSAgICBpZiAoY29tcGFyZUZpbGVNZW0ocmVzdWx0X2ZpbGUsIChjb25zdCBjaGFyICopIHJlc3VsdCwgcmV0KSkgewoJCWZwcmludGYoc3RkZXJyLCAiUmVzdWx0IG1pc21hdGNoIGZvciAlc1xuIiwgeG1sX2ZpbGVuYW1lKTsKCSAgICAgICAgcmV0ID0gLTE7CgkgICAgfQoJfQogICAgfSBlbHNlIHsKCWZwcmludGYoc3RkZXJyLCJFcnJvcjogZmFpbGVkIHRvIGNhbm9uaWNhbGl6ZSBYTUwgZmlsZSBcIiVzXCIgKHJldD0lZClcbiIsIHhtbF9maWxlbmFtZSwgcmV0KTsKCXJldCA9IC0xOwogICAgfQogICAgICAgIAogICAgLyoKICAgICAqIENsZWFudXAKICAgICAqLyAKICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgeG1sRnJlZShyZXN1bHQpOwogICAgaWYoeHBhdGggIT0gTlVMTCkgeG1sWFBhdGhGcmVlT2JqZWN0KHhwYXRoKTsKICAgIGlmIChpbmNsdXNpdmVfbmFtZXNwYWNlcyAhPSBOVUxMKSB4bWxGcmVlKGluY2x1c2l2ZV9uYW1lc3BhY2VzKTsKICAgIGlmIChuc2xpc3QgIT0gTlVMTCkgZnJlZSgoY2hhciAqKSBuc2xpc3QpOwogICAgeG1sRnJlZURvYyhkb2MpOyAgICAKCiAgICByZXR1cm4ocmV0KTsKfQoKc3RhdGljIGludApjMTRuQ29tbW9uVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IHdpdGhfY29tbWVudHMsIGludCBleGNsdXNpdmUsCiAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN1YmRpcikgewogICAgY2hhciBidWZbNTAwXTsKICAgIGNoYXIgcHJlZml4WzUwMF07CiAgICBjb25zdCBjaGFyICpiYXNlOwogICAgaW50IGxlbjsKICAgIGNoYXIgKnJlc3VsdCA9IE5VTEw7CiAgICBjaGFyICp4cGF0aCA9IE5VTEw7CiAgICBjaGFyICpucyA9IE5VTEw7CiAgICBpbnQgcmV0ID0gMDsKCiAgICBiYXNlID0gYmFzZUZpbGVuYW1lKGZpbGVuYW1lKTsKICAgIGxlbiA9IHN0cmxlbihiYXNlKTsKICAgIGxlbiAtPSA0OwogICAgbWVtY3B5KHByZWZpeCwgYmFzZSwgbGVuKTsKICAgIHByZWZpeFtsZW5dID0gMDsKCiAgICBzbnByaW50ZihidWYsIDQ5OSwgInJlc3VsdC9jMTRuLyVzLyVzIiwgc3ViZGlyLHByZWZpeCk7CiAgICBpZiAoIWNoZWNrVGVzdEZpbGUoYnVmKSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyByZXN1bHQgZmlsZSAlcyIsIGJ1Zik7CglyZXR1cm4oLTEpOwogICAgfQogICAgcmVzdWx0ID0gc3RyZHVwKGJ1Zik7CiAgICBzbnByaW50ZihidWYsIDQ5OSwgInRlc3QvYzE0bi8lcy8lcy54cGF0aCIsIHN1YmRpcixwcmVmaXgpOwogICAgaWYgKGNoZWNrVGVzdEZpbGUoYnVmKSkgewoJeHBhdGggPSBzdHJkdXAoYnVmKTsKICAgIH0KICAgIHNucHJpbnRmKGJ1ZiwgNDk5LCAidGVzdC9jMTRuLyVzLyVzLm5zIiwgc3ViZGlyLHByZWZpeCk7CiAgICBpZiAoY2hlY2tUZXN0RmlsZShidWYpKSB7CglucyA9IHN0cmR1cChidWYpOwogICAgfQoKICAgIG5iX3Rlc3RzKys7CiAgICBpZiAoYzE0blJ1blRlc3QoZmlsZW5hbWUsIHdpdGhfY29tbWVudHMsIGV4Y2x1c2l2ZSwKICAgICAgICAgICAgICAgICAgICB4cGF0aCwgbnMsIHJlc3VsdCkgPCAwKQogICAgICAgIHJldCA9IDE7CgogICAgaWYgKHJlc3VsdCAhPSBOVUxMKSBmcmVlKHJlc3VsdCk7CiAgICBpZiAoeHBhdGggIT0gTlVMTCkgZnJlZSh4cGF0aCk7CiAgICBpZiAobnMgIT0gTlVMTCkgZnJlZShucyk7CiAgICByZXR1cm4ocmV0KTsKfQoKc3RhdGljIGludApjMTRuV2l0aENvbW1lbnRUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlc3VsIEFUVFJJQlVURV9VTlVTRUQsCgkJICAgIGNvbnN0IGNoYXIgKmVyciBBVFRSSUJVVEVfVU5VU0VELAoJCSAgICBpbnQgb3B0aW9ucyBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4oYzE0bkNvbW1vblRlc3QoZmlsZW5hbWUsIDEsIDAsICJ3aXRoLWNvbW1lbnRzIikpOwp9CnN0YXRpYyBpbnQKYzE0bldpdGhvdXRDb21tZW50VGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bCBBVFRSSUJVVEVfVU5VU0VELAoJCSAgICBjb25zdCBjaGFyICplcnIgQVRUUklCVVRFX1VOVVNFRCwKCQkgICAgaW50IG9wdGlvbnMgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKGMxNG5Db21tb25UZXN0KGZpbGVuYW1lLCAwLCAwLCAid2l0aG91dC1jb21tZW50cyIpKTsKfQpzdGF0aWMgaW50CmMxNG5FeGNXaXRob3V0Q29tbWVudFRlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVzdWwgQVRUUklCVVRFX1VOVVNFRCwKCQkgICAgY29uc3QgY2hhciAqZXJyIEFUVFJJQlVURV9VTlVTRUQsCgkJICAgIGludCBvcHRpb25zIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihjMTRuQ29tbW9uVGVzdChmaWxlbmFtZSwgMCwgMSwgImV4Yy13aXRob3V0LWNvbW1lbnRzIikpOwp9CiNlbmRpZgojaWYgZGVmaW5lZChMSUJYTUxfVEhSRUFEX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkgJiYgZGVmaW5lZCAoTElCWE1MX1NBWDFfRU5BQkxFRCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQkJCQkJCSoKICoJCQlDYXRhbG9nIGFuZCB0aHJlYWRzIHRlc3QJCQkqCiAqCQkJCQkJCQkJKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogbW9zdGx5IGEgY3V0IGFuZCBwYXN0ZSBmcm9tIHRlc3RUaHJlYWRzLmMKICovCiNkZWZpbmUJTUFYX0FSR0MJMjAKCnN0YXRpYyBjb25zdCBjaGFyICpjYXRhbG9nID0gInRlc3QvdGhyZWFkcy9jb21wbGV4LnhtbCI7CnN0YXRpYyBjb25zdCBjaGFyICp0ZXN0ZmlsZXNbXSA9IHsKICAgICJ0ZXN0L3RocmVhZHMvYWJjLnhtbCIsCiAgICAidGVzdC90aHJlYWRzL2FjYi54bWwiLAogICAgInRlc3QvdGhyZWFkcy9iYWMueG1sIiwKICAgICJ0ZXN0L3RocmVhZHMvYmNhLnhtbCIsCiAgICAidGVzdC90aHJlYWRzL2NhYi54bWwiLAogICAgInRlc3QvdGhyZWFkcy9jYmEueG1sIiwKICAgICJ0ZXN0L3RocmVhZHMvaW52YWxpZC54bWwiLAp9OwoKc3RhdGljIGNvbnN0IGNoYXIgKk9rYXkgPSAiT0siOwpzdGF0aWMgY29uc3QgY2hhciAqRmFpbGVkID0gIkZhaWxlZCI7CgojaWZuZGVmIHhtbERvVmFsaWRpdHlDaGVja2luZ0RlZmF1bHRWYWx1ZQojZXJyb3IgeG1sRG9WYWxpZGl0eUNoZWNraW5nRGVmYXVsdFZhbHVlIGlzIG5vdCBhIG1hY3JvCiNlbmRpZgojaWZuZGVmIHhtbEdlbmVyaWNFcnJvckNvbnRleHQKI2Vycm9yIHhtbEdlbmVyaWNFcnJvckNvbnRleHQgaXMgbm90IGEgbWFjcm8KI2VuZGlmCgpzdGF0aWMgdm9pZCAqCnRocmVhZF9zcGVjaWZpY19kYXRhKHZvaWQgKnByaXZhdGVfZGF0YSkKewogICAgeG1sRG9jUHRyIG15RG9jOwogICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSAoY29uc3QgY2hhciAqKSBwcml2YXRlX2RhdGE7CiAgICBpbnQgb2theSA9IDE7CgogICAgaWYgKCFzdHJjbXAoZmlsZW5hbWUsICJ0ZXN0L3RocmVhZHMvaW52YWxpZC54bWwiKSkgewogICAgICAgIHhtbERvVmFsaWRpdHlDaGVja2luZ0RlZmF1bHRWYWx1ZSA9IDA7CiAgICAgICAgeG1sR2VuZXJpY0Vycm9yQ29udGV4dCA9IHN0ZG91dDsKICAgIH0gZWxzZSB7CiAgICAgICAgeG1sRG9WYWxpZGl0eUNoZWNraW5nRGVmYXVsdFZhbHVlID0gMTsKICAgICAgICB4bWxHZW5lcmljRXJyb3JDb250ZXh0ID0gc3RkZXJyOwogICAgfQogICAgbXlEb2MgPSB4bWxQYXJzZUZpbGUoZmlsZW5hbWUpOwogICAgaWYgKG15RG9jKSB7CiAgICAgICAgeG1sRnJlZURvYyhteURvYyk7CiAgICB9IGVsc2UgewogICAgICAgIHByaW50ZigicGFyc2UgZmFpbGVkXG4iKTsKICAgICAgICBva2F5ID0gMDsKICAgIH0KICAgIGlmICghc3RyY21wKGZpbGVuYW1lLCAidGVzdC90aHJlYWRzL2ludmFsaWQueG1sIikpIHsKICAgICAgICBpZiAoeG1sRG9WYWxpZGl0eUNoZWNraW5nRGVmYXVsdFZhbHVlICE9IDApIHsKICAgICAgICAgICAgcHJpbnRmKCJWYWxpZGl0eUNoZWNraW5nRGVmYXVsdFZhbHVlIG92ZXJyaWRlIGZhaWxlZFxuIik7CiAgICAgICAgICAgIG9rYXkgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCAhPSBzdGRvdXQpIHsKICAgICAgICAgICAgcHJpbnRmKCJ4bWxHZW5lcmljRXJyb3JDb250ZXh0IG92ZXJyaWRlIGZhaWxlZFxuIik7CiAgICAgICAgICAgIG9rYXkgPSAwOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHhtbERvVmFsaWRpdHlDaGVja2luZ0RlZmF1bHRWYWx1ZSAhPSAxKSB7CiAgICAgICAgICAgIHByaW50ZigiVmFsaWRpdHlDaGVja2luZ0RlZmF1bHRWYWx1ZSBvdmVycmlkZSBmYWlsZWRcbiIpOwogICAgICAgICAgICBva2F5ID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKHhtbEdlbmVyaWNFcnJvckNvbnRleHQgIT0gc3RkZXJyKSB7CiAgICAgICAgICAgIHByaW50ZigieG1sR2VuZXJpY0Vycm9yQ29udGV4dCBvdmVycmlkZSBmYWlsZWRcbiIpOwogICAgICAgICAgICBva2F5ID0gMDsKICAgICAgICB9CiAgICB9CiAgICBpZiAob2theSA9PSAwKQogICAgICAgIHJldHVybiAoKHZvaWQgKikgRmFpbGVkKTsKICAgIHJldHVybiAoKHZvaWQgKikgT2theSk7Cn0KCiNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKHNvbGFyaXMpCgojaW5jbHVkZSA8cHRocmVhZC5oPgoKc3RhdGljIHB0aHJlYWRfdCB0aWRbTUFYX0FSR0NdOwoKc3RhdGljIGludAp0ZXN0VGhyZWFkKHZvaWQpCnsKICAgIHVuc2lnbmVkIGludCBpLCByZXBlYXQ7CiAgICB1bnNpZ25lZCBpbnQgbnVtX3RocmVhZHMgPSBzaXplb2YodGVzdGZpbGVzKSAvIHNpemVvZih0ZXN0ZmlsZXNbMF0pOwogICAgdm9pZCAqcmVzdWx0c1tNQVhfQVJHQ107CiAgICBpbnQgcmV0OwogICAgaW50IHJlcyA9IDA7CiAgICAKICAgIHhtbEluaXRQYXJzZXIoKTsKCiAgICBmb3IgKHJlcGVhdCA9IDA7IHJlcGVhdCA8IDUwMDsgcmVwZWF0KyspIHsKICAgICAgICB4bWxMb2FkQ2F0YWxvZyhjYXRhbG9nKTsKICAgICAgICBuYl90ZXN0cysrOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3RocmVhZHM7IGkrKykgewogICAgICAgICAgICByZXN1bHRzW2ldID0gTlVMTDsKICAgICAgICAgICAgdGlkW2ldID0gKHB0aHJlYWRfdCkgLSAxOwogICAgICAgIH0KCiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspIHsKICAgICAgICAgICAgcmV0ID0gcHRocmVhZF9jcmVhdGUoJnRpZFtpXSwgMCwgdGhyZWFkX3NwZWNpZmljX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIHRlc3RmaWxlc1tpXSk7CiAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgewogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwdGhyZWFkX2NyZWF0ZSBmYWlsZWRcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuICgxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3RocmVhZHM7IGkrKykgewogICAgICAgICAgICByZXQgPSBwdGhyZWFkX2pvaW4odGlkW2ldLCAmcmVzdWx0c1tpXSk7CiAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgewogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwdGhyZWFkX2pvaW4gZmFpbGVkXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAoMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHhtbENhdGFsb2dDbGVhbnVwKCk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspCiAgICAgICAgICAgIGlmIChyZXN1bHRzW2ldICE9ICh2b2lkICopIE9rYXkpIHsKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkICVkIGhhbmRsaW5nICVzIGZhaWxlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgaSwgdGVzdGZpbGVzW2ldKTsKICAgICAgICAgICAgICAgIHJlcyA9IDE7CiAgICAgICAgICAgIH0KICAgIH0KICAgIHJldHVybiAocmVzKTsKfQoKI2VsaWYgZGVmaW5lZCBXSU4zMgojaW5jbHVkZSA8d2luZG93cy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojZGVmaW5lIFRFU1RfUkVQRUFUX0NPVU5UIDUwMAoKc3RhdGljIEhBTkRMRSB0aWRbTUFYX0FSR0NdOwoKc3RhdGljIERXT1JEIFdJTkFQSQp3aW4zMl90aHJlYWRfc3BlY2lmaWNfZGF0YSh2b2lkICpwcml2YXRlX2RhdGEpCnsKICAgIHJldHVybigoRFdPUkQpIHRocmVhZF9zcGVjaWZpY19kYXRhKHByaXZhdGVfZGF0YSkpOwp9CgpzdGF0aWMgaW50CnRlc3RUaHJlYWQodm9pZCkKewogICAgdW5zaWduZWQgaW50IGksIHJlcGVhdDsKICAgIHVuc2lnbmVkIGludCBudW1fdGhyZWFkcyA9IHNpemVvZih0ZXN0ZmlsZXMpIC8gc2l6ZW9mKHRlc3RmaWxlc1swXSk7CiAgICBEV09SRCByZXN1bHRzW01BWF9BUkdDXTsKICAgIEJPT0wgcmV0OwogICAgaW50IHJlcyA9IDA7CgogICAgeG1sSW5pdFBhcnNlcigpOwogICAgZm9yIChyZXBlYXQgPSAwOyByZXBlYXQgPCBURVNUX1JFUEVBVF9DT1VOVDsgcmVwZWF0KyspIHsKICAgICAgICB4bWxMb2FkQ2F0YWxvZyhjYXRhbG9nKTsKICAgICAgICBuYl90ZXN0cysrOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3RocmVhZHM7IGkrKykgewogICAgICAgICAgICByZXN1bHRzW2ldID0gMDsKICAgICAgICAgICAgdGlkW2ldID0gKEhBTkRMRSkgLSAxOwogICAgICAgIH0KCiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspIHsKICAgICAgICAgICAgRFdPUkQgdXNlbGVzczsKCiAgICAgICAgICAgIHRpZFtpXSA9IENyZWF0ZVRocmVhZChOVUxMLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luMzJfdGhyZWFkX3NwZWNpZmljX2RhdGEsIAoJCQkJICAodm9pZCAqKSB0ZXN0ZmlsZXNbaV0sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlbGVzcyk7CiAgICAgICAgICAgIGlmICh0aWRbaV0gPT0gTlVMTCkgewogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDcmVhdGVUaHJlYWQgZmFpbGVkXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybigxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKFdhaXRGb3JNdWx0aXBsZU9iamVjdHMobnVtX3RocmVhZHMsIHRpZCwgVFJVRSwgSU5GSU5JVEUpID09CiAgICAgICAgICAgIFdBSVRfRkFJTEVEKSB7CiAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FpdEZvck11bHRpcGxlT2JqZWN0cyBmYWlsZWRcbiIpOwoJICAgIHJldHVybigxKTsKCX0KCiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspIHsKICAgICAgICAgICAgcmV0ID0gR2V0RXhpdENvZGVUaHJlYWQodGlkW2ldLCAmcmVzdWx0c1tpXSk7CiAgICAgICAgICAgIGlmIChyZXQgPT0gMCkgewogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJHZXRFeGl0Q29kZVRocmVhZCBmYWlsZWRcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuKDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIENsb3NlSGFuZGxlKHRpZFtpXSk7CiAgICAgICAgfQoKICAgICAgICB4bWxDYXRhbG9nQ2xlYW51cCgpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdGhyZWFkczsgaSsrKSB7CiAgICAgICAgICAgIGlmIChyZXN1bHRzW2ldICE9IChEV09SRCkgT2theSkgewogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJUaHJlYWQgJWQgaGFuZGxpbmcgJXMgZmFpbGVkXG4iLAoJCSAgICAgICAgaSwgdGVzdGZpbGVzW2ldKTsKCSAgICAgICAgcmVzID0gMTsKCSAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAocmVzKTsKfQoKI2VsaWYgZGVmaW5lZCBfX0JFT1NfXwojaW5jbHVkZSA8T1MuaD4KCnN0YXRpYyB0aHJlYWRfaWQgdGlkW01BWF9BUkdDXTsKCnN0YXRpYyBpbnQKdGVzdFRocmVhZCh2b2lkKQp7CiAgICB1bnNpZ25lZCBpbnQgaSwgcmVwZWF0OwogICAgdW5zaWduZWQgaW50IG51bV90aHJlYWRzID0gc2l6ZW9mKHRlc3RmaWxlcykgLyBzaXplb2YodGVzdGZpbGVzWzBdKTsKICAgIHZvaWQgKnJlc3VsdHNbTUFYX0FSR0NdOwogICAgc3RhdHVzX3QgcmV0OwogICAgaW50IHJlcyA9IDA7CgogICAgeG1sSW5pdFBhcnNlcigpOwogICAgZm9yIChyZXBlYXQgPSAwOyByZXBlYXQgPCA1MDA7IHJlcGVhdCsrKSB7CiAgICAgICAgeG1sTG9hZENhdGFsb2coY2F0YWxvZyk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspIHsKICAgICAgICAgICAgcmVzdWx0c1tpXSA9IE5VTEw7CiAgICAgICAgICAgIHRpZFtpXSA9ICh0aHJlYWRfaWQpIC0gMTsKICAgICAgICB9CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspIHsKICAgICAgICAgICAgdGlkW2ldID0KICAgICAgICAgICAgICAgIHNwYXduX3RocmVhZCh0aHJlYWRfc3BlY2lmaWNfZGF0YSwgInhtbFRlc3RUaHJlYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJfTk9STUFMX1BSSU9SSVRZLCAodm9pZCAqKSB0ZXN0ZmlsZXNbaV0pOwogICAgICAgICAgICBpZiAodGlkW2ldIDwgQl9PSykgewogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJiZW9zX3RocmVhZF9jcmVhdGUgZmFpbGVkXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJpbnRmKCJiZW9zX3RocmVhZF9jcmVhdGUgJWQgLT4gJWRcbiIsIGksIHRpZFtpXSk7CiAgICAgICAgfQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdGhyZWFkczsgaSsrKSB7CiAgICAgICAgICAgIHJldCA9IHdhaXRfZm9yX3RocmVhZCh0aWRbaV0sICZyZXN1bHRzW2ldKTsKICAgICAgICAgICAgcHJpbnRmKCJiZW9zX3RocmVhZF93YWl0ICVkIC0+ICVkXG4iLCBpLCByZXQpOwogICAgICAgICAgICBpZiAocmV0ICE9IEJfT0spIHsKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmVvc190aHJlYWRfd2FpdCBmYWlsZWRcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuICgxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgeG1sQ2F0YWxvZ0NsZWFudXAoKTsKICAgICAgICByZXQgPSBCX09LOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdGhyZWFkczsgaSsrKQogICAgICAgICAgICBpZiAocmVzdWx0c1tpXSAhPSAodm9pZCAqKSBPa2F5KSB7CiAgICAgICAgICAgICAgICBwcmludGYoIlRocmVhZCAlZCBoYW5kbGluZyAlcyBmYWlsZWRcbiIsIGksIHRlc3RmaWxlc1tpXSk7CiAgICAgICAgICAgICAgICByZXQgPSBCX0VSUk9SOwogICAgICAgICAgICB9CiAgICB9CiAgICBpZiAocmV0ICE9IEJfT0spCiAgICAgICAgcmV0dXJuKDEpOwogICAgcmV0dXJuICgwKTsKfQojZWxzZQpzdGF0aWMgaW50CnRlc3RUaHJlYWQodm9pZCkKewogICAgZnByaW50ZihzdGRlcnIsCiAgICAgICAgICAgICJTcGVjaWZpYyBwbGF0Zm9ybSB0aHJlYWQgc3VwcG9ydCBub3QgZGV0ZWN0ZWRcbiIpOwogICAgcmV0dXJuICgtMSk7Cn0KI2VuZGlmCnN0YXRpYyBpbnQgCnRocmVhZHNUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lIEFUVFJJQlVURV9VTlVTRUQsCgkgICAgY29uc3QgY2hhciAqcmVzdWwgQVRUUklCVVRFX1VOVVNFRCwKCSAgICBjb25zdCBjaGFyICplcnIgQVRUUklCVVRFX1VOVVNFRCwKCSAgICBpbnQgb3B0aW9ucyBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICByZXR1cm4odGVzdFRocmVhZCgpKTsKfQojZW5kaWYKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQkJCQkJCSoKICoJCQlUZXN0cyBEZXNjcmlwdGlvbnMJCQkJKgogKgkJCQkJCQkJCSoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYwp0ZXN0RGVzYyB0ZXN0RGVzY3JpcHRpb25zW10gPSB7CiAgICB7ICJYTUwgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICBvbGRQYXJzZVRlc3QsICIuL3Rlc3QvKiIsICJyZXN1bHQvIiwgIiIsIE5VTEwsCiAgICAgIDAgfSwKICAgIHsgIlhNTCByZWdyZXNzaW9uIHRlc3RzIG9uIG1lbW9yeSIgLAogICAgICBtZW1QYXJzZVRlc3QsICIuL3Rlc3QvKiIsICJyZXN1bHQvIiwgIiIsIE5VTEwsCiAgICAgIDAgfSwKICAgIHsgIlhNTCBlbnRpdHkgc3Vic3QgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICBub2VudFBhcnNlVGVzdCwgIi4vdGVzdC8qIiwgInJlc3VsdC9ub2VudC8iLCAiIiwgTlVMTCwKICAgICAgWE1MX1BBUlNFX05PRU5UIH0sCiAgICB7ICJYTUwgTmFtZXNwYWNlcyByZWdyZXNzaW9uIHRlc3RzIiwKICAgICAgZXJyUGFyc2VUZXN0LCAiLi90ZXN0L25hbWVzcGFjZXMvKiIsICJyZXN1bHQvbmFtZXNwYWNlcy8iLCAiIiwgIi5lcnIiLAogICAgICAwIH0sCiAgICB7ICJFcnJvciBjYXNlcyByZWdyZXNzaW9uIHRlc3RzIiwKICAgICAgZXJyUGFyc2VUZXN0LCAiLi90ZXN0L2Vycm9ycy8qLnhtbCIsICJyZXN1bHQvZXJyb3JzLyIsICIiLCAiLmVyciIsCiAgICAgIDAgfSwKI2lmZGVmIExJQlhNTF9SRUFERVJfRU5BQkxFRAogICAgeyAiRXJyb3IgY2FzZXMgc3RyZWFtIHJlZ3Jlc3Npb24gdGVzdHMiLAogICAgICBzdHJlYW1QYXJzZVRlc3QsICIuL3Rlc3QvZXJyb3JzLyoueG1sIiwgInJlc3VsdC9lcnJvcnMvIiwgTlVMTCwgIi5zdHIiLAogICAgICAwIH0sCiAgICB7ICJSZWFkZXIgcmVncmVzc2lvbiB0ZXN0cyIsCiAgICAgIHN0cmVhbVBhcnNlVGVzdCwgIi4vdGVzdC8qIiwgInJlc3VsdC8iLCAiLnJkciIsIE5VTEwsCiAgICAgIDAgfSwKICAgIHsgIlJlYWRlciBlbnRpdGllcyBzdWJzdGl0dXRpb24gcmVncmVzc2lvbiB0ZXN0cyIsCiAgICAgIHN0cmVhbVBhcnNlVGVzdCwgIi4vdGVzdC8qIiwgInJlc3VsdC8iLCAiLnJkZSIsIE5VTEwsCiAgICAgIFhNTF9QQVJTRV9OT0VOVCB9LAogICAgeyAiUmVhZGVyIG9uIG1lbW9yeSByZWdyZXNzaW9uIHRlc3RzIiwKICAgICAgc3RyZWFtTWVtUGFyc2VUZXN0LCAiLi90ZXN0LyoiLCAicmVzdWx0LyIsICIucmRyIiwgTlVMTCwKICAgICAgMCB9LAogICAgeyAiV2Fsa2VyIHJlZ3Jlc3Npb24gdGVzdHMiLAogICAgICB3YWxrZXJQYXJzZVRlc3QsICIuL3Rlc3QvKiIsICJyZXN1bHQvIiwgIi5yZHIiLCBOVUxMLAogICAgICAwIH0sCiNlbmRpZgojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgeyAiU0FYMSBjYWxsYmFja3MgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICBzYXhQYXJzZVRlc3QsICIuL3Rlc3QvKiIsICJyZXN1bHQvIiwgIi5zYXgiLCBOVUxMLAogICAgICBYTUxfUEFSU0VfU0FYMSB9LAogICAgeyAiU0FYMiBjYWxsYmFja3MgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICBzYXhQYXJzZVRlc3QsICIuL3Rlc3QvKiIsICJyZXN1bHQvIiwgIi5zYXgyIiwgTlVMTCwKICAgICAgMCB9LAojZW5kaWYKI2lmZGVmIExJQlhNTF9QVVNIX0VOQUJMRUQKICAgIHsgIlhNTCBwdXNoIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgcHVzaFBhcnNlVGVzdCwgIi4vdGVzdC8qIiwgInJlc3VsdC8iLCAiIiwgTlVMTCwKICAgICAgMCB9LAojZW5kaWYKI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKICAgIHsgIkhUTUwgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICBlcnJQYXJzZVRlc3QsICIuL3Rlc3QvSFRNTC8qIiwgInJlc3VsdC9IVE1MLyIsICIiLCAiLmVyciIsCiAgICAgIFhNTF9QQVJTRV9IVE1MIH0sCiNpZmRlZiBMSUJYTUxfUFVTSF9FTkFCTEVECiAgICB7ICJQdXNoIEhUTUwgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICBwdXNoUGFyc2VUZXN0LCAiLi90ZXN0L0hUTUwvKiIsICJyZXN1bHQvSFRNTC8iLCAiIiwgIi5lcnIiLAogICAgICBYTUxfUEFSU0VfSFRNTCB9LAojZW5kaWYKI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgIHsgIkhUTUwgU0FYIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgc2F4UGFyc2VUZXN0LCAiLi90ZXN0L0hUTUwvKiIsICJyZXN1bHQvSFRNTC8iLCAiLnNheCIsIE5VTEwsCiAgICAgIFhNTF9QQVJTRV9IVE1MIH0sCiNlbmRpZgojZW5kaWYKI2lmZGVmIExJQlhNTF9WQUxJRF9FTkFCTEVECiAgICB7ICJWYWxpZCBkb2N1bWVudHMgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICBlcnJQYXJzZVRlc3QsICIuL3Rlc3QvVkNNLyoiLCBOVUxMLCBOVUxMLCBOVUxMLAogICAgICBYTUxfUEFSU0VfRFREVkFMSUQgfSwKICAgIHsgIlZhbGlkaXR5IGNoZWNraW5nIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgZXJyUGFyc2VUZXN0LCAiLi90ZXN0L1ZDLyoiLCAicmVzdWx0L1ZDLyIsIE5VTEwsICIiLAogICAgICBYTUxfUEFSU0VfRFREVkFMSUQgfSwKICAgIHsgIkdlbmVyYWwgZG9jdW1lbnRzIHZhbGlkIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgZXJyUGFyc2VUZXN0LCAiLi90ZXN0L3ZhbGlkLyoiLCAicmVzdWx0L3ZhbGlkLyIsICIiLCAiLmVyciIsCiAgICAgIFhNTF9QQVJTRV9EVERWQUxJRCB9LAojZW5kaWYKI2lmZGVmIExJQlhNTF9YSU5DTFVERV9FTkFCTEVECiAgICB7ICJYSW5jbHVkZSByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIGVyclBhcnNlVGVzdCwgIi4vdGVzdC9YSW5jbHVkZS9kb2NzLyoiLCAicmVzdWx0L1hJbmNsdWRlLyIsICIiLCBOVUxMLAogICAgICAvKiBJZ25vcmUgZXJyb3JzIGF0IHRoaXMgcG9pbnQgIi5lcnIiLCAqLwogICAgICBYTUxfUEFSU0VfWElOQ0xVREUgfSwKICAgIHsgIlhJbmNsdWRlIHhtbFJlYWRlciByZWdyZXNzaW9uIHRlc3RzIiwKICAgICAgc3RyZWFtUGFyc2VUZXN0LCAiLi90ZXN0L1hJbmNsdWRlL2RvY3MvKiIsICJyZXN1bHQvWEluY2x1ZGUvIiwgIi5yZHIiLAogICAgICAvKiBJZ25vcmUgZXJyb3JzIGF0IHRoaXMgcG9pbnQgIi5lcnIiLCAqLwogICAgICBOVUxMLCBYTUxfUEFSU0VfWElOQ0xVREUgfSwKICAgIHsgIlhJbmNsdWRlIHJlZ3Jlc3Npb24gdGVzdHMgc3RyaXBwaW5nIGluY2x1ZGUgbm9kZXMiICwKICAgICAgZXJyUGFyc2VUZXN0LCAiLi90ZXN0L1hJbmNsdWRlL2RvY3MvKiIsICJyZXN1bHQvWEluY2x1ZGUvIiwgIiIsIE5VTEwsCiAgICAgIC8qIElnbm9yZSBlcnJvcnMgYXQgdGhpcyBwb2ludCAiLmVyciIsICovCiAgICAgIFhNTF9QQVJTRV9YSU5DTFVERSB8IFhNTF9QQVJTRV9OT1hJTkNOT0RFIH0sCiAgICB7ICJYSW5jbHVkZSB4bWxSZWFkZXIgcmVncmVzc2lvbiB0ZXN0cyBzdHJpcHBpbmcgaW5jbHVkZSBub2RlcyIsCiAgICAgIHN0cmVhbVBhcnNlVGVzdCwgIi4vdGVzdC9YSW5jbHVkZS9kb2NzLyoiLCAicmVzdWx0L1hJbmNsdWRlLyIsICIucmRyIiwKICAgICAgLyogSWdub3JlIGVycm9ycyBhdCB0aGlzIHBvaW50ICIuZXJyIiwgKi8KICAgICAgTlVMTCwgWE1MX1BBUlNFX1hJTkNMVURFIHwgWE1MX1BBUlNFX05PWElOQ05PREUgfSwKI2VuZGlmCiNpZmRlZiBMSUJYTUxfWFBBVEhfRU5BQkxFRAojaWZkZWYgTElCWE1MX0RFQlVHX0VOQUJMRUQKICAgIHsgIlhQYXRoIGV4cHJlc3Npb25zIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgeHBhdGhFeHByVGVzdCwgIi4vdGVzdC9YUGF0aC9leHByLyoiLCAicmVzdWx0L1hQYXRoL2V4cHIvIiwgIiIsIE5VTEwsCiAgICAgIDAgfSwKICAgIHsgIlhQYXRoIGRvY3VtZW50IHF1ZXJpZXMgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICB4cGF0aERvY1Rlc3QsICIuL3Rlc3QvWFBhdGgvZG9jcy8qIiwgTlVMTCwgTlVMTCwgTlVMTCwKICAgICAgMCB9LAojaWZkZWYgTElCWE1MX1hQVFJfRU5BQkxFRAogICAgeyAiWFBvaW50ZXIgZG9jdW1lbnQgcXVlcmllcyByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIHhwdHJEb2NUZXN0LCAiLi90ZXN0L1hQYXRoL2RvY3MvKiIsIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgIDAgfSwKI2VuZGlmCiAgICB7ICJ4bWw6aWQgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICB4bWxpZERvY1Rlc3QsICIuL3Rlc3QveG1saWQvKiIsICJyZXN1bHQveG1saWQvIiwgIiIsICIuZXJyIiwKICAgICAgMCB9LAojZW5kaWYKI2VuZGlmCiAgICB7ICJVUkkgcGFyc2luZyB0ZXN0cyIgLAogICAgICB1cmlQYXJzZVRlc3QsICIuL3Rlc3QvVVJJLyoudXJpIiwgInJlc3VsdC9VUkkvIiwgIiIsIE5VTEwsCiAgICAgIDAgfSwKICAgIHsgIlVSSSBiYXNlIGNvbXBvc2l0aW9uIHRlc3RzIiAsCiAgICAgIHVyaUJhc2VUZXN0LCAiLi90ZXN0L1VSSS8qLmRhdGEiLCAicmVzdWx0L1VSSS8iLCAiIiwgTlVMTCwKICAgICAgMCB9LAogICAgeyAiUGF0aCBVUkkgY29udmVyc2lvbiB0ZXN0cyIgLAogICAgICB1cmlQYXRoVGVzdCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKICAgICAgMCB9LAojaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAogICAgeyAiU2NoZW1hcyByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIHNjaGVtYXNUZXN0LCAiLi90ZXN0L3NjaGVtYXMvKl8qLnhzZCIsIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgIDAgfSwKICAgIHsgIlJlbGF4LU5HIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgcm5nVGVzdCwgIi4vdGVzdC9yZWxheG5nLyoucm5nIiwgTlVMTCwgTlVMTCwgTlVMTCwKICAgICAgWE1MX1BBUlNFX0RUREFUVFIgfCBYTUxfUEFSU0VfTk9FTlQgfSwKI2lmZGVmIExJQlhNTF9SRUFERVJfRU5BQkxFRAogICAgeyAiUmVsYXgtTkcgc3RyZWFtaW5nIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgcm5nU3RyZWFtVGVzdCwgIi4vdGVzdC9yZWxheG5nLyoucm5nIiwgTlVMTCwgTlVMTCwgTlVMTCwKICAgICAgWE1MX1BBUlNFX0RUREFUVFIgfCBYTUxfUEFSU0VfTk9FTlQgfSwKI2VuZGlmCiNlbmRpZgojaWZkZWYgTElCWE1MX1BBVFRFUk5fRU5BQkxFRAojaWZkZWYgTElCWE1MX1JFQURFUl9FTkFCTEVECiAgICB7ICJQYXR0ZXJuIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgcGF0dGVyblRlc3QsICIuL3Rlc3QvcGF0dGVybi8qLnBhdCIsICJyZXN1bHQvcGF0dGVybi8iLCBOVUxMLCBOVUxMLAogICAgICAwIH0sCiNlbmRpZgojZW5kaWYKI2lmZGVmIExJQlhNTF9DMTROX0VOQUJMRUQKICAgIHsgIkMxNE4gd2l0aCBjb21tZW50cyByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIGMxNG5XaXRoQ29tbWVudFRlc3QsICIuL3Rlc3QvYzE0bi93aXRoLWNvbW1lbnRzLyoueG1sIiwgTlVMTCwgTlVMTCwgTlVMTCwKICAgICAgMCB9LAogICAgeyAiQzE0TiB3aXRob3V0IGNvbW1lbnRzIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgYzE0bldpdGhvdXRDb21tZW50VGVzdCwgIi4vdGVzdC9jMTRuL3dpdGhvdXQtY29tbWVudHMvKi54bWwiLCBOVUxMLCBOVUxMLCBOVUxMLAogICAgICAwIH0sCiAgICB7ICJDMTROIGV4Y2x1c2l2ZSB3aXRob3V0IGNvbW1lbnRzIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgYzE0bkV4Y1dpdGhvdXRDb21tZW50VGVzdCwgIi4vdGVzdC9jMTRuL2V4Yy13aXRob3V0LWNvbW1lbnRzLyoueG1sIiwgTlVMTCwgTlVMTCwgTlVMTCwKICAgICAgMCB9LAojZW5kaWYKI2lmIGRlZmluZWQoTElCWE1MX1RIUkVBRF9FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9DQVRBTE9HX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX1NBWDFfRU5BQkxFRCkKICAgIHsgIkNhdGFsb2cgYW5kIFRocmVhZHMgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICB0aHJlYWRzVGVzdCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKICAgICAgMCB9LAojZW5kaWYKICAgIHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwfQp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQkJCQkJCSoKICoJCVRoZSBtYWluIGNvZGUgZHJpdmluZyB0aGUgdGVzdHMJCQkJKgogKgkJCQkJCQkJCSoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBpbnQKbGF1bmNoVGVzdHModGVzdERlc2NQdHIgdHN0KSB7CiAgICBpbnQgcmVzID0gMCwgZXJyID0gMDsKICAgIHNpemVfdCBpOwogICAgY2hhciAqcmVzdWx0OwogICAgY2hhciAqZXJyb3I7CiAgICBpbnQgbWVtOwoKICAgIGlmICh0c3QgPT0gTlVMTCkgcmV0dXJuKC0xKTsKICAgIGlmICh0c3QtPmluICE9IE5VTEwpIHsKCWdsb2JfdCBnbG9iYnVmOwoKCWdsb2JidWYuZ2xfb2ZmcyA9IDA7CglnbG9iKHRzdC0+aW4sIEdMT0JfRE9PRkZTLCBOVUxMLCAmZ2xvYmJ1Zik7Cglmb3IgKGkgPSAwO2kgPCBnbG9iYnVmLmdsX3BhdGhjO2krKykgewoJICAgIGlmICghY2hlY2tUZXN0RmlsZShnbG9iYnVmLmdsX3BhdGh2W2ldKSkKCSAgICAgICAgY29udGludWU7CgkgICAgaWYgKHRzdC0+c3VmZml4ICE9IE5VTEwpIHsKCQlyZXN1bHQgPSByZXN1bHRGaWxlbmFtZShnbG9iYnVmLmdsX3BhdGh2W2ldLCB0c3QtPm91dCwKCQkJCQl0c3QtPnN1ZmZpeCk7CgkJaWYgKHJlc3VsdCA9PSBOVUxMKSB7CgkJICAgIGZwcmludGYoc3RkZXJyLCAiT3V0IG9mIG1lbW9yeSAhXG4iKTsKCQkgICAgZmF0YWxFcnJvcigpOwoJCX0KCSAgICB9IGVsc2UgewoJICAgICAgICByZXN1bHQgPSBOVUxMOwoJICAgIH0KCSAgICBpZiAodHN0LT5lcnIgIT0gTlVMTCkgewoJCWVycm9yID0gcmVzdWx0RmlsZW5hbWUoZ2xvYmJ1Zi5nbF9wYXRodltpXSwgdHN0LT5vdXQsCgkJICAgICAgICAgICAgICAgICAgICAgICAgdHN0LT5lcnIpOwoJCWlmIChlcnJvciA9PSBOVUxMKSB7CgkJICAgIGZwcmludGYoc3RkZXJyLCAiT3V0IG9mIG1lbW9yeSAhXG4iKTsKCQkgICAgZmF0YWxFcnJvcigpOwoJCX0KCSAgICB9IGVsc2UgewoJICAgICAgICBlcnJvciA9IE5VTEw7CgkgICAgfQoJICAgIGlmICgocmVzdWx0KSAmJighY2hlY2tUZXN0RmlsZShyZXN1bHQpKSkgewoJICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgcmVzdWx0IGZpbGUgJXNcbiIsIHJlc3VsdCk7CgkgICAgfSBlbHNlIGlmICgoZXJyb3IpICYmKCFjaGVja1Rlc3RGaWxlKGVycm9yKSkpIHsKCSAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIGVycm9yIGZpbGUgJXNcbiIsIGVycm9yKTsKCSAgICB9IGVsc2UgewoJCW1lbSA9IHhtbE1lbVVzZWQoKTsKCQlleHRyYU1lbW9yeUZyb21SZXNvbHZlciA9IDA7CgkJdGVzdEVycm9yc1NpemUgPSAwOwoJCXRlc3RFcnJvcnNbMF0gPSAwOwoJCXJlcyA9IHRzdC0+ZnVuYyhnbG9iYnVmLmdsX3BhdGh2W2ldLCByZXN1bHQsIGVycm9yLAoJCSAgICAgICAgICAgICAgICB0c3QtPm9wdGlvbnMgfCBYTUxfUEFSU0VfQ09NUEFDVCk7CgkJeG1sUmVzZXRMYXN0RXJyb3IoKTsKCQlpZiAocmVzICE9IDApIHsKCQkgICAgZnByaW50ZihzdGRlcnIsICJGaWxlICVzIGdlbmVyYXRlZCBhbiBlcnJvclxuIiwKCQkgICAgICAgICAgICBnbG9iYnVmLmdsX3BhdGh2W2ldKTsKCQkgICAgbmJfZXJyb3JzKys7CgkJICAgIGVycisrOwoJCX0KCQllbHNlIGlmICh4bWxNZW1Vc2VkKCkgIT0gbWVtKSB7CgkJICAgIGlmICgoeG1sTWVtVXNlZCgpICE9IG1lbSkgJiYKCQkgICAgICAgIChleHRyYU1lbW9yeUZyb21SZXNvbHZlciA9PSAwKSkgewoJCQlmcHJpbnRmKHN0ZGVyciwgIkZpbGUgJXMgbGVha2VkICVkIGJ5dGVzXG4iLAoJCQkJZ2xvYmJ1Zi5nbF9wYXRodltpXSwgeG1sTWVtVXNlZCgpIC0gbWVtKTsKCQkJbmJfbGVha3MrKzsKCQkJZXJyKys7CgkJICAgIH0KCQl9CgkJdGVzdEVycm9yc1NpemUgPSAwOwoJICAgIH0KCSAgICBpZiAocmVzdWx0KQoJCWZyZWUocmVzdWx0KTsKCSAgICBpZiAoZXJyb3IpCgkJZnJlZShlcnJvcik7Cgl9CglnbG9iZnJlZSgmZ2xvYmJ1Zik7CiAgICB9IGVsc2UgewogICAgICAgIHRlc3RFcnJvcnNTaXplID0gMDsKCXRlc3RFcnJvcnNbMF0gPSAwOwoJZXh0cmFNZW1vcnlGcm9tUmVzb2x2ZXIgPSAwOwogICAgICAgIHJlcyA9IHRzdC0+ZnVuYyhOVUxMLCBOVUxMLCBOVUxMLCB0c3QtPm9wdGlvbnMpOwoJaWYgKHJlcyAhPSAwKSB7CgkgICAgbmJfZXJyb3JzKys7CgkgICAgZXJyKys7Cgl9CiAgICB9CiAgICByZXR1cm4oZXJyKTsKfQoKc3RhdGljIGludCB2ZXJib3NlID0gMDsKc3RhdGljIGludCB0ZXN0c19xdWlldCA9IDA7CgpzdGF0aWMgaW50CnJ1bnRlc3QoaW50IGkpIHsKICAgIGludCByZXQgPSAwLCByZXM7CiAgICBpbnQgb2xkX2Vycm9ycywgb2xkX3Rlc3RzLCBvbGRfbGVha3M7CgogICAgb2xkX2Vycm9ycyA9IG5iX2Vycm9yczsKICAgIG9sZF90ZXN0cyA9IG5iX3Rlc3RzOwogICAgb2xkX2xlYWtzID0gbmJfbGVha3M7CiAgICBpZiAoKHRlc3RzX3F1aWV0ID09IDApICYmICh0ZXN0RGVzY3JpcHRpb25zW2ldLmRlc2MgIT0gTlVMTCkpCglwcmludGYoIiMjICVzXG4iLCB0ZXN0RGVzY3JpcHRpb25zW2ldLmRlc2MpOwogICAgcmVzID0gbGF1bmNoVGVzdHMoJnRlc3REZXNjcmlwdGlvbnNbaV0pOwogICAgaWYgKHJlcyAhPSAwKQoJcmV0Kys7CiAgICBpZiAodmVyYm9zZSkgewoJaWYgKChuYl9lcnJvcnMgPT0gb2xkX2Vycm9ycykgJiYgKG5iX2xlYWtzID09IG9sZF9sZWFrcykpCgkgICAgcHJpbnRmKCJSYW4gJWQgdGVzdHMsIG5vIGVycm9yc1xuIiwgbmJfdGVzdHMgLSBvbGRfdGVzdHMpOwoJZWxzZQoJICAgIHByaW50ZigiUmFuICVkIHRlc3RzLCAlZCBlcnJvcnMsICVkIGxlYWtzXG4iLAoJCSAgIG5iX3Rlc3RzIC0gb2xkX3Rlc3RzLAoJCSAgIG5iX2Vycm9ycyAtIG9sZF9lcnJvcnMsCgkJICAgbmJfbGVha3MgLSBvbGRfbGVha3MpOwogICAgfQogICAgcmV0dXJuKHJldCk7Cn0KCmludAptYWluKGludCBhcmdjIEFUVFJJQlVURV9VTlVTRUQsIGNoYXIgKiphcmd2IEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGludCBpLCBhLCByZXQgPSAwOwogICAgaW50IHN1YnNldCA9IDA7CgogICAgaW5pdGlhbGl6ZUxpYnhtbDIoKTsKCiAgICAKICAgIGZvciAoYSA9IDE7IGEgPCBhcmdjO2ErKykgewogICAgICAgIGlmICghc3RyY21wKGFyZ3ZbYV0sICItdiIpKQoJICAgIHZlcmJvc2UgPSAxOwogICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlthXSwgIi1xdWlldCIpKQoJICAgIHRlc3RzX3F1aWV0ID0gMTsKCWVsc2UgewoJICAgIGZvciAoaSA9IDA7IHRlc3REZXNjcmlwdGlvbnNbaV0uZnVuYyAhPSBOVUxMOyBpKyspIHsKCSAgICAgICAgaWYgKHN0cnN0cih0ZXN0RGVzY3JpcHRpb25zW2ldLmRlc2MsIGFyZ3ZbYV0pKSB7CgkJICAgIHJldCArPSBydW50ZXN0KGkpOwoJCSAgICBzdWJzZXQrKzsKCQl9CgkgICAgfQoJfQogICAgfQogICAgaWYgKHN1YnNldCA9PSAwKSB7Cglmb3IgKGkgPSAwOyB0ZXN0RGVzY3JpcHRpb25zW2ldLmZ1bmMgIT0gTlVMTDsgaSsrKSB7CgkgICAgcmV0ICs9IHJ1bnRlc3QoaSk7Cgl9CiAgICB9CiAgICBpZiAoKG5iX2Vycm9ycyA9PSAwKSAmJiAobmJfbGVha3MgPT0gMCkpIHsKICAgICAgICByZXQgPSAwOwoJcHJpbnRmKCJUb3RhbCAlZCB0ZXN0cywgbm8gZXJyb3JzXG4iLAoJICAgICAgIG5iX3Rlc3RzKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0ID0gMTsKCXByaW50ZigiVG90YWwgJWQgdGVzdHMsICVkIGVycm9ycywgJWQgbGVha3NcbiIsCgkgICAgICAgbmJfdGVzdHMsIG5iX2Vycm9ycywgbmJfbGVha3MpOwogICAgfQogICAgeG1sQ2xlYW51cFBhcnNlcigpOwogICAgeG1sTWVtb3J5RHVtcCgpOwoKICAgIHJldHVybihyZXQpOwp9CgojZWxzZSAvKiAhIExJQlhNTF9PVVRQVVRfRU5BQkxFRCAqLwppbnQKbWFpbihpbnQgYXJnYyBBVFRSSUJVVEVfVU5VU0VELCBjaGFyICoqYXJndiBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBmcHJpbnRmKHN0ZGVyciwgInJ1bnRlc3QgcmVxdWlyZXMgb3V0cHV0IHRvIGJlIGVuYWJsZWQgaW4gbGlieG1sMlxuIik7CiAgICByZXR1cm4oMSk7Cn0KI2VuZGlmCg==