LyoKICogcnVudGVzdC5jOiBDIHByb2dyYW0gdG8gcnVuIGxpYnhtbDIgcmVncmVzc2lvbiB0ZXN0cyB3aXRob3V0CiAqICAgICAgICAgICAgcmVxdWlyaW5nIG1ha2Ugb3IgUHl0aG9uLCBhbmQgcmVkdWNpbmcgcGxhdGZvcm0gZGVwZW5kYW5jaWVzCiAqICAgICAgICAgICAgdG8gYSBzdHJpY3QgbWluaW11bS4KICoKICogVG8gY29tcGlsZSBvbiBVbml4ZXM6CiAqIGNjIC1vIHJ1bnRlc3QgYHhtbDItY29uZmlnIC0tY2ZsYWdzYCBydW50ZXN0LmMgYHhtbDItY29uZmlnIC0tbGlic2AgLWxwdGhyZWFkCiAqCiAqIFNlZSBDb3B5cmlnaHQgZm9yIHRoZSBzdGF0dXMgb2YgdGhpcyBzb2Z0d2FyZS4KICoKICogZGFuaWVsQHZlaWxsYXJkLmNvbQogKi8KCiNpZmRlZiBIQVZFX0NPTkZJR19ICiNpbmNsdWRlICJsaWJ4bWwuaCIKI2Vsc2UKI2luY2x1ZGUgPHN0ZGlvLmg+CiNlbmRpZgoKI2lmICFkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxmY250bC5oPgoKI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KI2luY2x1ZGUgPGxpYnhtbC90cmVlLmg+CiNpbmNsdWRlIDxsaWJ4bWwvdXJpLmg+CgojaWZkZWYgTElCWE1MX09VVFBVVF9FTkFCTEVECiNpZmRlZiBMSUJYTUxfUkVBREVSX0VOQUJMRUQKI2luY2x1ZGUgPGxpYnhtbC94bWxyZWFkZXIuaD4KI2VuZGlmCgojaWZkZWYgTElCWE1MX1hJTkNMVURFX0VOQUJMRUQKI2luY2x1ZGUgPGxpYnhtbC94aW5jbHVkZS5oPgojZW5kaWYKCiNpZmRlZiBMSUJYTUxfWFBBVEhfRU5BQkxFRAojaW5jbHVkZSA8bGlieG1sL3hwYXRoLmg+CiNpbmNsdWRlIDxsaWJ4bWwveHBhdGhJbnRlcm5hbHMuaD4KI2lmZGVmIExJQlhNTF9YUFRSX0VOQUJMRUQKI2luY2x1ZGUgPGxpYnhtbC94cG9pbnRlci5oPgojZW5kaWYKI2VuZGlmCgojaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAojaW5jbHVkZSA8bGlieG1sL3JlbGF4bmcuaD4KI2luY2x1ZGUgPGxpYnhtbC94bWxzY2hlbWFzLmg+CiNpbmNsdWRlIDxsaWJ4bWwveG1sc2NoZW1hc3R5cGVzLmg+CiNlbmRpZgoKI2lmZGVmIExJQlhNTF9QQVRURVJOX0VOQUJMRUQKI2luY2x1ZGUgPGxpYnhtbC9wYXR0ZXJuLmg+CiNlbmRpZgoKI2lmZGVmIExJQlhNTF9DMTROX0VOQUJMRUQKI2luY2x1ZGUgPGxpYnhtbC9jMTRuLmg+CiNlbmRpZgoKI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKI2luY2x1ZGUgPGxpYnhtbC9IVE1McGFyc2VyLmg+CiNpbmNsdWRlIDxsaWJ4bWwvSFRNTHRyZWUuaD4KCi8qCiAqIHBzZXVkbyBmbGFnIGZvciB0aGUgdW5pZmljYXRpb24gb2YgSFRNTCBhbmQgWE1MIHRlc3RzCiAqLwojZGVmaW5lIFhNTF9QQVJTRV9IVE1MIDEgPDwgMjQKI2VuZGlmCgojaWYgZGVmaW5lZChMSUJYTUxfVEhSRUFEX0VOQUJMRUQpICYmIGRlZmluZWQoTElCWE1MX0NBVEFMT0dfRU5BQkxFRCkKI2luY2x1ZGUgPGxpYnhtbC9nbG9iYWxzLmg+CiNpbmNsdWRlIDxsaWJ4bWwvdGhyZWFkcy5oPgojaW5jbHVkZSA8bGlieG1sL3BhcnNlci5oPgojaW5jbHVkZSA8bGlieG1sL2NhdGFsb2cuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojZW5kaWYKCi8qCiAqIE9fQklOQVJZIGlzIGp1c3QgZm9yIFdpbmRvd3MgY29tcGF0aWJpbGl0eSAtIGlmIGl0IGlzbid0IGRlZmluZWQKICogb24gdGhpcyBzeXN0ZW0sIGF2b2lkIGFueSBjb21waWxhdGlvbiBlcnJvcgogKi8KI2lmZGVmCU9fQklOQVJZCiNkZWZpbmUgUkRfRkxBR1MJT19SRE9OTFkgfCBPX0JJTkFSWQojZWxzZQojZGVmaW5lCVJEX0ZMQUdTCU9fUkRPTkxZCiNlbmRpZgoKdHlwZWRlZiBpbnQgKCpmdW5jdGVzdCkgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpyZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvciwgaW50IG9wdGlvbnMpOwoKdHlwZWRlZiBzdHJ1Y3QgdGVzdERlc2MgdGVzdERlc2M7CnR5cGVkZWYgdGVzdERlc2MgKnRlc3REZXNjUHRyOwpzdHJ1Y3QgdGVzdERlc2MgewogICAgY29uc3QgY2hhciAqZGVzYzsgLyogZGVzY3JpcHRvbiBvZiB0aGUgdGVzdCAqLwogICAgZnVuY3Rlc3QgICAgZnVuYzsgLyogZnVuY3Rpb24gaW1wbGVtZW50aW5nIHRoZSB0ZXN0ICovCiAgICBjb25zdCBjaGFyICppbjsgICAvKiBnbG9iIHRvIHBhdGggZm9yIGlucHV0IGZpbGVzICovCiAgICBjb25zdCBjaGFyICpvdXQ7ICAvKiBvdXRwdXQgZGlyZWN0b3J5ICovCiAgICBjb25zdCBjaGFyICpzdWZmaXg7Lyogc3VmZml4IGZvciBvdXRwdXQgZmlsZXMgKi8KICAgIGNvbnN0IGNoYXIgKmVycjsgIC8qIHN1ZmZpeCBmb3IgZXJyb3Igb3V0cHV0IGZpbGVzICovCiAgICBpbnQgICAgIG9wdGlvbnM7ICAvKiBwYXJzZXIgb3B0aW9ucyBmb3IgdGhlIHRlc3QgKi8KfTsKCnN0YXRpYyBpbnQgY2hlY2tUZXN0RmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CgojaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCgojaW5jbHVkZSA8d2luZG93cy5oPgojaW5jbHVkZSA8aW8uaD4KCnR5cGVkZWYgc3RydWN0CnsKICAgICAgc2l6ZV90IGdsX3BhdGhjOyAgICAvKiBDb3VudCBvZiBwYXRocyBtYXRjaGVkIHNvIGZhciAgKi8KICAgICAgY2hhciAqKmdsX3BhdGh2OyAgICAvKiBMaXN0IG9mIG1hdGNoZWQgcGF0aG5hbWVzLiAgKi8KICAgICAgc2l6ZV90IGdsX29mZnM7ICAgICAvKiBTbG90cyB0byByZXNlcnZlIGluICdnbF9wYXRodicuICAqLwp9IGdsb2JfdDsKCiNkZWZpbmUgR0xPQl9ET09GRlMgMApzdGF0aWMgaW50IGdsb2IoY29uc3QgY2hhciAqcGF0dGVybiwgaW50IGZsYWdzLAogICAgICAgICAgICAgICAgaW50IGVycmZ1bmMoY29uc3QgY2hhciAqZXBhdGgsIGludCBlZXJybm8pLAogICAgICAgICAgICAgICAgZ2xvYl90ICpwZ2xvYikgewogICAgZ2xvYl90ICpyZXQ7CiAgICBXSU4zMl9GSU5EX0RBVEEgRmluZEZpbGVEYXRhOwogICAgSEFORExFIGhGaW5kOwogICAgdW5zaWduZWQgaW50IG5iX3BhdGhzID0gMDsKICAgIGNoYXIgZGlyZWN0b3J5WzUwMF07CiAgICBpbnQgbGVuOwoKICAgIGlmICgocGF0dGVybiA9PSBOVUxMKSB8fCAocGdsb2IgPT0gTlVMTCkpIHJldHVybigtMSk7CgogICAgc3RybmNweShkaXJlY3RvcnksIHBhdHRlcm4sIDQ5OSk7CiAgICBmb3IgKGxlbiA9IHN0cmxlbihkaXJlY3RvcnkpO2xlbiA+PSAwO2xlbi0tKSB7CiAgICAgICAgaWYgKGRpcmVjdG9yeVtsZW5dID09ICcvJykgewoJICAgIGxlbisrOwoJICAgIGRpcmVjdG9yeVtsZW5dID0gMDsKCSAgICBicmVhazsKCX0KICAgIH0KICAgIGlmIChsZW4gPD0gMCkKICAgICAgICBsZW4gPSAwOwoKCiAgICByZXQgPSBwZ2xvYjsKICAgIG1lbXNldChyZXQsIDAsIHNpemVvZihnbG9iX3QpKTsKCiAgICBoRmluZCA9IEZpbmRGaXJzdEZpbGVBKHBhdHRlcm4sICZGaW5kRmlsZURhdGEpOwogICAgaWYgKGhGaW5kID09IElOVkFMSURfSEFORExFX1ZBTFVFKQogICAgICAgIHJldHVybigwKTsKICAgIG5iX3BhdGhzID0gMjA7CiAgICByZXQtPmdsX3BhdGh2ID0gKGNoYXIgKiopIG1hbGxvYyhuYl9wYXRocyAqIHNpemVvZihjaGFyICopKTsKICAgIGlmIChyZXQtPmdsX3BhdGh2ID09IE5VTEwpIHsKCUZpbmRDbG9zZShoRmluZCk7CiAgICAgICAgcmV0dXJuKC0xKTsKICAgIH0KICAgIHN0cm5jcHkoZGlyZWN0b3J5ICsgbGVuLCBGaW5kRmlsZURhdGEuY0ZpbGVOYW1lLCA0OTkgLSBsZW4pOwogICAgcmV0LT5nbF9wYXRodltyZXQtPmdsX3BhdGhjXSA9IHN0cmR1cChkaXJlY3RvcnkpOwogICAgaWYgKHJldC0+Z2xfcGF0aHZbcmV0LT5nbF9wYXRoY10gPT0gTlVMTCkKICAgICAgICBnb3RvIGRvbmU7CiAgICByZXQtPmdsX3BhdGhjKys7CiAgICB3aGlsZShGaW5kTmV4dEZpbGVBKGhGaW5kLCAmRmluZEZpbGVEYXRhKSkgewogICAgICAgIGlmIChGaW5kRmlsZURhdGEuY0ZpbGVOYW1lWzBdID09ICcuJykKCSAgICBjb250aW51ZTsKICAgICAgICBpZiAocmV0LT5nbF9wYXRoYyArIDIgPiBuYl9wYXRocykgewogICAgICAgICAgICBjaGFyICoqdG1wID0gcmVhbGxvYyhyZXQtPmdsX3BhdGh2LCBuYl9wYXRocyAqIDIgKiBzaXplb2YoY2hhciAqKSk7CiAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICByZXQtPmdsX3BhdGh2ID0gdG1wOwogICAgICAgICAgICBuYl9wYXRocyAqPSAyOwoJfQoJc3RybmNweShkaXJlY3RvcnkgKyBsZW4sIEZpbmRGaWxlRGF0YS5jRmlsZU5hbWUsIDQ5OSAtIGxlbik7CglyZXQtPmdsX3BhdGh2W3JldC0+Z2xfcGF0aGNdID0gc3RyZHVwKGRpcmVjdG9yeSk7CiAgICAgICAgaWYgKHJldC0+Z2xfcGF0aHZbcmV0LT5nbF9wYXRoY10gPT0gTlVMTCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgcmV0LT5nbF9wYXRoYysrOwogICAgfQogICAgcmV0LT5nbF9wYXRodltyZXQtPmdsX3BhdGhjXSA9IE5VTEw7Cgpkb25lOgogICAgRmluZENsb3NlKGhGaW5kKTsKICAgIHJldHVybigwKTsKfQoKCgpzdGF0aWMgdm9pZCBnbG9iZnJlZShnbG9iX3QgKnBnbG9iKSB7CiAgICB1bnNpZ25lZCBpbnQgaTsKICAgIGlmIChwZ2xvYiA9PSBOVUxMKQogICAgICAgIHJldHVybjsKCiAgICBmb3IgKGkgPSAwO2kgPCBwZ2xvYi0+Z2xfcGF0aGM7aSsrKSB7CiAgICAgICAgIGlmIChwZ2xvYi0+Z2xfcGF0aHZbaV0gIT0gTlVMTCkKICAgICAgICAgICAgIGZyZWUocGdsb2ItPmdsX3BhdGh2W2ldKTsKICAgIH0KfQojZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCiNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCiNlbHNlCiNpbmNsdWRlIDxnbG9iLmg+CiNlbmRpZgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQkJCQkJCSoKICoJCUxpYnhtbDIgc3BlY2lmaWMgcm91dGluZXMJCQkJKgogKgkJCQkJCQkJCSoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBpbnQgbmJfdGVzdHMgPSAwOwpzdGF0aWMgaW50IG5iX2Vycm9ycyA9IDA7CnN0YXRpYyBpbnQgbmJfbGVha3MgPSAwOwpzdGF0aWMgaW50IGV4dHJhTWVtb3J5RnJvbVJlc29sdmVyID0gMDsKCnN0YXRpYyBpbnQKZmF0YWxFcnJvcih2b2lkKSB7CiAgICBmcHJpbnRmKHN0ZGVyciwgIkV4aXR0aW5nIHRlc3RzIG9uIGZhdGFsIGVycm9yXG4iKTsKICAgIGV4aXQoMSk7Cn0KCi8qCiAqIFdlIG5lZWQgdG8gdHJhcCBjYWxscyB0byB0aGUgcmVzb2x2ZXIgdG8gbm90IGFjY291bnQgbWVtb3J5IGZvciB0aGUgY2F0YWxvZwogKiB3aGljaCBpcyBzaGFyZWQgdG8gdGhlIGN1cnJlbnQgcnVubmluZyB0ZXN0LiBXZSBhbHNvIGRvbid0IHdhbnQgdG8gaGF2ZQogKiBuZXR3b3JrIGRvd25sb2FkcyBtb2RpZnlpbmcgdGVzdHMuCiAqLwpzdGF0aWMgeG1sUGFyc2VySW5wdXRQdHIKdGVzdEV4dGVybmFsRW50aXR5TG9hZGVyKGNvbnN0IGNoYXIgKlVSTCwgY29uc3QgY2hhciAqSUQsCgkJCSB4bWxQYXJzZXJDdHh0UHRyIGN0eHQpIHsKICAgIHhtbFBhcnNlcklucHV0UHRyIHJldDsKCiAgICBpZiAoY2hlY2tUZXN0RmlsZShVUkwpKSB7CglyZXQgPSB4bWxOb05ldEV4dGVybmFsRW50aXR5TG9hZGVyKFVSTCwgSUQsIGN0eHQpOwogICAgfSBlbHNlIHsKCWludCBtZW11c2VkID0geG1sTWVtVXNlZCgpOwoJcmV0ID0geG1sTm9OZXRFeHRlcm5hbEVudGl0eUxvYWRlcihVUkwsIElELCBjdHh0KTsKCWV4dHJhTWVtb3J5RnJvbVJlc29sdmVyICs9IHhtbE1lbVVzZWQoKSAtIG1lbXVzZWQ7CiAgICB9CgogICAgcmV0dXJuKHJldCk7Cn0KCi8qCiAqIFRyYXBwaW5nIHRoZSBlcnJvciBtZXNzYWdlcyBhdCB0aGUgZ2VuZXJpYyBsZXZlbCB0byBncmFiIHRoZSBlcXVpdmFsZW50IG9mCiAqIHN0ZGVyciBtZXNzYWdlcyBvbiBDTEkgdG9vbHMuCiAqLwpzdGF0aWMgY2hhciB0ZXN0RXJyb3JzWzMyNzY5XTsKc3RhdGljIGludCB0ZXN0RXJyb3JzU2l6ZSA9IDA7CgpzdGF0aWMgdm9pZCBYTUxDREVDTAp0ZXN0RXJyb3JIYW5kbGVyKHZvaWQgKmN0eCAgQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgY2hhciAqbXNnLCAuLi4pIHsKICAgIHZhX2xpc3QgYXJnczsKICAgIGludCByZXM7CgogICAgaWYgKHRlc3RFcnJvcnNTaXplID49IDMyNzY4KQogICAgICAgIHJldHVybjsKICAgIHZhX3N0YXJ0KGFyZ3MsIG1zZyk7CiAgICByZXMgPSB2c25wcmludGYoJnRlc3RFcnJvcnNbdGVzdEVycm9yc1NpemVdLAogICAgICAgICAgICAgICAgICAgIDMyNzY4IC0gdGVzdEVycm9yc1NpemUsCgkJICAgIG1zZywgYXJncyk7CiAgICB2YV9lbmQoYXJncyk7CiAgICBpZiAodGVzdEVycm9yc1NpemUgKyByZXMgPj0gMzI3NjgpIHsKICAgICAgICAvKiBidWZmZXIgaXMgZnVsbCAqLwoJdGVzdEVycm9yc1NpemUgPSAzMjc2ODsKCXRlc3RFcnJvcnNbdGVzdEVycm9yc1NpemVdID0gMDsKICAgIH0gZWxzZSB7CiAgICAgICAgdGVzdEVycm9yc1NpemUgKz0gcmVzOwogICAgfQogICAgdGVzdEVycm9yc1t0ZXN0RXJyb3JzU2l6ZV0gPSAwOwp9CgpzdGF0aWMgdm9pZCBYTUxDREVDTApjaGFubmVsKHZvaWQgKmN0eCAgQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgY2hhciAqbXNnLCAuLi4pIHsKICAgIHZhX2xpc3QgYXJnczsKICAgIGludCByZXM7CgogICAgaWYgKHRlc3RFcnJvcnNTaXplID49IDMyNzY4KQogICAgICAgIHJldHVybjsKICAgIHZhX3N0YXJ0KGFyZ3MsIG1zZyk7CiAgICByZXMgPSB2c25wcmludGYoJnRlc3RFcnJvcnNbdGVzdEVycm9yc1NpemVdLAogICAgICAgICAgICAgICAgICAgIDMyNzY4IC0gdGVzdEVycm9yc1NpemUsCgkJICAgIG1zZywgYXJncyk7CiAgICB2YV9lbmQoYXJncyk7CiAgICBpZiAodGVzdEVycm9yc1NpemUgKyByZXMgPj0gMzI3NjgpIHsKICAgICAgICAvKiBidWZmZXIgaXMgZnVsbCAqLwoJdGVzdEVycm9yc1NpemUgPSAzMjc2ODsKCXRlc3RFcnJvcnNbdGVzdEVycm9yc1NpemVdID0gMDsKICAgIH0gZWxzZSB7CiAgICAgICAgdGVzdEVycm9yc1NpemUgKz0gcmVzOwogICAgfQogICAgdGVzdEVycm9yc1t0ZXN0RXJyb3JzU2l6ZV0gPSAwOwp9CgovKioKICogeG1sUGFyc2VyUHJpbnRGaWxlQ29udGV4dDoKICogQGlucHV0OiAgYW4geG1sUGFyc2VySW5wdXRQdHIgaW5wdXQKICoKICogRGlzcGxheXMgY3VycmVudCBjb250ZXh0IHdpdGhpbiB0aGUgaW5wdXQgY29udGVudCBmb3IgZXJyb3IgdHJhY2tpbmcKICovCgpzdGF0aWMgdm9pZAp4bWxQYXJzZXJQcmludEZpbGVDb250ZXh0SW50ZXJuYWwoeG1sUGFyc2VySW5wdXRQdHIgaW5wdXQgLAoJCXhtbEdlbmVyaWNFcnJvckZ1bmMgY2hhbmwsIHZvaWQgKmRhdGEgKSB7CiAgICBjb25zdCB4bWxDaGFyICpjdXIsICpiYXNlOwogICAgdW5zaWduZWQgaW50IG4sIGNvbDsJLyogR0NDIHdhcm5zIGlmIHNpZ25lZCwgYmVjYXVzZSBjb21wYXJlZCB3aXRoIHNpemVvZigpICovCiAgICB4bWxDaGFyICBjb250ZW50WzgxXTsgLyogc3BhY2UgZm9yIDgwIGNoYXJzICsgbGluZSB0ZXJtaW5hdG9yICovCiAgICB4bWxDaGFyICpjdG50OwoKICAgIGlmIChpbnB1dCA9PSBOVUxMKSByZXR1cm47CiAgICBjdXIgPSBpbnB1dC0+Y3VyOwogICAgYmFzZSA9IGlucHV0LT5iYXNlOwogICAgLyogc2tpcCBiYWNrd2FyZHMgb3ZlciBhbnkgZW5kLW9mLWxpbmVzICovCiAgICB3aGlsZSAoKGN1ciA+IGJhc2UpICYmICgoKihjdXIpID09ICdcbicpIHx8ICgqKGN1cikgPT0gJ1xyJykpKSB7CgljdXItLTsKICAgIH0KICAgIG4gPSAwOwogICAgLyogc2VhcmNoIGJhY2t3YXJkcyBmb3IgYmVnaW5uaW5nLW9mLWxpbmUgKHRvIG1heCBidWZmIHNpemUpICovCiAgICB3aGlsZSAoKG4rKyA8IChzaXplb2YoY29udGVudCktMSkpICYmIChjdXIgPiBiYXNlKSAmJgogICAoKihjdXIpICE9ICdcbicpICYmICgqKGN1cikgIT0gJ1xyJykpCiAgICAgICAgY3VyLS07CiAgICBpZiAoKCooY3VyKSA9PSAnXG4nKSB8fCAoKihjdXIpID09ICdccicpKSBjdXIrKzsKICAgIC8qIGNhbGN1bGF0ZSB0aGUgZXJyb3IgcG9zaXRpb24gaW4gdGVybXMgb2YgdGhlIGN1cnJlbnQgcG9zaXRpb24gKi8KICAgIGNvbCA9IGlucHV0LT5jdXIgLSBjdXI7CiAgICAvKiBzZWFyY2ggZm9yd2FyZCBmb3IgZW5kLW9mLWxpbmUgKHRvIG1heCBidWZmIHNpemUpICovCiAgICBuID0gMDsKICAgIGN0bnQgPSBjb250ZW50OwogICAgLyogY29weSBzZWxlY3RlZCB0ZXh0IHRvIG91ciBidWZmZXIgKi8KICAgIHdoaWxlICgoKmN1ciAhPSAwKSAmJiAoKihjdXIpICE9ICdcbicpICYmCiAgICgqKGN1cikgIT0gJ1xyJykgJiYgKG4gPCBzaXplb2YoY29udGVudCktMSkpIHsKCQkqY3RudCsrID0gKmN1cisrOwoJbisrOwogICAgfQogICAgKmN0bnQgPSAwOwogICAgLyogcHJpbnQgb3V0IHRoZSBzZWxlY3RlZCB0ZXh0ICovCiAgICBjaGFubChkYXRhICwiJXNcbiIsIGNvbnRlbnQpOwogICAgLyogY3JlYXRlIGJsYW5rIGxpbmUgd2l0aCBwcm9ibGVtIHBvaW50ZXIgKi8KICAgIG4gPSAwOwogICAgY3RudCA9IGNvbnRlbnQ7CiAgICAvKiAobGVhdmUgYnVmZmVyIHNwYWNlIGZvciBwb2ludGVyICsgbGluZSB0ZXJtaW5hdG9yKSAqLwogICAgd2hpbGUgKChuPGNvbCkgJiYgKG4rKyA8IHNpemVvZihjb250ZW50KS0yKSAmJiAoKmN0bnQgIT0gMCkpIHsKCWlmICgqKGN0bnQpICE9ICdcdCcpCgkgICAgKihjdG50KSA9ICcgJzsKCWN0bnQrKzsKICAgIH0KICAgICpjdG50KysgPSAnXic7CiAgICAqY3RudCA9IDA7CiAgICBjaGFubChkYXRhICwiJXNcbiIsIGNvbnRlbnQpOwp9CgpzdGF0aWMgdm9pZAp0ZXN0U3RydWN0dXJlZEVycm9ySGFuZGxlcih2b2lkICpjdHggIEFUVFJJQlVURV9VTlVTRUQsIHhtbEVycm9yUHRyIGVycikgewogICAgY2hhciAqZmlsZSA9IE5VTEw7CiAgICBpbnQgbGluZSA9IDA7CiAgICBpbnQgY29kZSA9IC0xOwogICAgaW50IGRvbWFpbjsKICAgIHZvaWQgKmRhdGEgPSBOVUxMOwogICAgY29uc3QgY2hhciAqc3RyOwogICAgY29uc3QgeG1sQ2hhciAqbmFtZSA9IE5VTEw7CiAgICB4bWxOb2RlUHRyIG5vZGU7CiAgICB4bWxFcnJvckxldmVsIGxldmVsOwogICAgeG1sUGFyc2VySW5wdXRQdHIgaW5wdXQgPSBOVUxMOwogICAgeG1sUGFyc2VySW5wdXRQdHIgY3VyID0gTlVMTDsKICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dCA9IE5VTEw7CgogICAgaWYgKGVyciA9PSBOVUxMKQogICAgICAgIHJldHVybjsKCiAgICBmaWxlID0gZXJyLT5maWxlOwogICAgbGluZSA9IGVyci0+bGluZTsKICAgIGNvZGUgPSBlcnItPmNvZGU7CiAgICBkb21haW4gPSBlcnItPmRvbWFpbjsKICAgIGxldmVsID0gZXJyLT5sZXZlbDsKICAgIG5vZGUgPSBlcnItPm5vZGU7CiAgICBpZiAoKGRvbWFpbiA9PSBYTUxfRlJPTV9QQVJTRVIpIHx8IChkb21haW4gPT0gWE1MX0ZST01fSFRNTCkgfHwKICAgICAgICAoZG9tYWluID09IFhNTF9GUk9NX0RURCkgfHwgKGRvbWFpbiA9PSBYTUxfRlJPTV9OQU1FU1BBQ0UpIHx8CgkoZG9tYWluID09IFhNTF9GUk9NX0lPKSB8fCAoZG9tYWluID09IFhNTF9GUk9NX1ZBTElEKSkgewoJY3R4dCA9IGVyci0+Y3R4dDsKICAgIH0KICAgIHN0ciA9IGVyci0+bWVzc2FnZTsKCiAgICBpZiAoY29kZSA9PSBYTUxfRVJSX09LKQogICAgICAgIHJldHVybjsKCiAgICBpZiAoKG5vZGUgIT0gTlVMTCkgJiYgKG5vZGUtPnR5cGUgPT0gWE1MX0VMRU1FTlRfTk9ERSkpCiAgICAgICAgbmFtZSA9IG5vZGUtPm5hbWU7CgogICAgLyoKICAgICAqIE1haW50YWluIHRoZSBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGxlZ2FjeSBlcnJvciBoYW5kbGluZwogICAgICovCiAgICBpZiAoY3R4dCAhPSBOVUxMKSB7CiAgICAgICAgaW5wdXQgPSBjdHh0LT5pbnB1dDsKICAgICAgICBpZiAoKGlucHV0ICE9IE5VTEwpICYmIChpbnB1dC0+ZmlsZW5hbWUgPT0gTlVMTCkgJiYKICAgICAgICAgICAgKGN0eHQtPmlucHV0TnIgPiAxKSkgewogICAgICAgICAgICBjdXIgPSBpbnB1dDsKICAgICAgICAgICAgaW5wdXQgPSBjdHh0LT5pbnB1dFRhYltjdHh0LT5pbnB1dE5yIC0gMl07CiAgICAgICAgfQogICAgICAgIGlmIChpbnB1dCAhPSBOVUxMKSB7CiAgICAgICAgICAgIGlmIChpbnB1dC0+ZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBjaGFubmVsKGRhdGEsICIlczolZDogIiwgaW5wdXQtPmZpbGVuYW1lLCBpbnB1dC0+bGluZSk7CiAgICAgICAgICAgIGVsc2UgaWYgKChsaW5lICE9IDApICYmIChkb21haW4gPT0gWE1MX0ZST01fUEFSU0VSKSkKICAgICAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIkVudGl0eTogbGluZSAlZDogIiwgaW5wdXQtPmxpbmUpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGZpbGUgIT0gTlVMTCkKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiJXM6JWQ6ICIsIGZpbGUsIGxpbmUpOwogICAgICAgIGVsc2UgaWYgKChsaW5lICE9IDApICYmIChkb21haW4gPT0gWE1MX0ZST01fUEFSU0VSKSkKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiRW50aXR5OiBsaW5lICVkOiAiLCBsaW5lKTsKICAgIH0KICAgIGlmIChuYW1lICE9IE5VTEwpIHsKICAgICAgICBjaGFubmVsKGRhdGEsICJlbGVtZW50ICVzOiAiLCBuYW1lKTsKICAgIH0KICAgIGlmIChjb2RlID09IFhNTF9FUlJfT0spCiAgICAgICAgcmV0dXJuOwogICAgc3dpdGNoIChkb21haW4pIHsKICAgICAgICBjYXNlIFhNTF9GUk9NX1BBUlNFUjoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAicGFyc2VyICIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFhNTF9GUk9NX05BTUVTUEFDRToKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAibmFtZXNwYWNlICIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFhNTF9GUk9NX0RURDoKICAgICAgICBjYXNlIFhNTF9GUk9NX1ZBTElEOgogICAgICAgICAgICBjaGFubmVsKGRhdGEsICJ2YWxpZGl0eSAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9IVE1MOgogICAgICAgICAgICBjaGFubmVsKGRhdGEsICJIVE1MIHBhcnNlciAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9NRU1PUlk6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIm1lbW9yeSAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9PVVRQVVQ6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIm91dHB1dCAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9JTzoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiSS9PICIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFhNTF9GUk9NX1hJTkNMVURFOgogICAgICAgICAgICBjaGFubmVsKGRhdGEsICJYSW5jbHVkZSAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9YUEFUSDoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiWFBhdGggIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0ZST01fWFBPSU5URVI6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgInBhcnNlciAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9SRUdFWFA6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgInJlZ2V4cCAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9NT0RVTEU6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIm1vZHVsZSAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9TQ0hFTUFTVjoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiU2NoZW1hcyB2YWxpZGl0eSAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9TQ0hFTUFTUDoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiU2NoZW1hcyBwYXJzZXIgIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0ZST01fUkVMQVhOR1A6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIlJlbGF4LU5HIHBhcnNlciAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9SRUxBWE5HVjoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiUmVsYXgtTkcgdmFsaWRpdHkgIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0ZST01fQ0FUQUxPRzoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiQ2F0YWxvZyAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRlJPTV9DMTROOgogICAgICAgICAgICBjaGFubmVsKGRhdGEsICJDMTROICIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFhNTF9GUk9NX1hTTFQ6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIlhTTFQgIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGNvZGUgPT0gWE1MX0VSUl9PSykKICAgICAgICByZXR1cm47CiAgICBzd2l0Y2ggKGxldmVsKSB7CiAgICAgICAgY2FzZSBYTUxfRVJSX05PTkU6CiAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIjogIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0VSUl9XQVJOSU5HOgogICAgICAgICAgICBjaGFubmVsKGRhdGEsICJ3YXJuaW5nIDogIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0VSUl9FUlJPUjoKICAgICAgICAgICAgY2hhbm5lbChkYXRhLCAiZXJyb3IgOiAiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBYTUxfRVJSX0ZBVEFMOgogICAgICAgICAgICBjaGFubmVsKGRhdGEsICJlcnJvciA6ICIpOwogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChjb2RlID09IFhNTF9FUlJfT0spCiAgICAgICAgcmV0dXJuOwogICAgaWYgKHN0ciAhPSBOVUxMKSB7CiAgICAgICAgaW50IGxlbjsKCWxlbiA9IHhtbFN0cmxlbigoY29uc3QgeG1sQ2hhciAqKXN0cik7CglpZiAoKGxlbiA+IDApICYmIChzdHJbbGVuIC0gMV0gIT0gJ1xuJykpCgkgICAgY2hhbm5lbChkYXRhLCAiJXNcbiIsIHN0cik7CgllbHNlCgkgICAgY2hhbm5lbChkYXRhLCAiJXMiLCBzdHIpOwogICAgfSBlbHNlIHsKICAgICAgICBjaGFubmVsKGRhdGEsICIlc1xuIiwgIm91dCBvZiBtZW1vcnkgZXJyb3IiKTsKICAgIH0KICAgIGlmIChjb2RlID09IFhNTF9FUlJfT0spCiAgICAgICAgcmV0dXJuOwoKICAgIGlmIChjdHh0ICE9IE5VTEwpIHsKICAgICAgICB4bWxQYXJzZXJQcmludEZpbGVDb250ZXh0SW50ZXJuYWwoaW5wdXQsIGNoYW5uZWwsIGRhdGEpOwogICAgICAgIGlmIChjdXIgIT0gTlVMTCkgewogICAgICAgICAgICBpZiAoY3VyLT5maWxlbmFtZSkKICAgICAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIiVzOiVkOiBcbiIsIGN1ci0+ZmlsZW5hbWUsIGN1ci0+bGluZSk7CiAgICAgICAgICAgIGVsc2UgaWYgKChsaW5lICE9IDApICYmIChkb21haW4gPT0gWE1MX0ZST01fUEFSU0VSKSkKICAgICAgICAgICAgICAgIGNoYW5uZWwoZGF0YSwgIkVudGl0eTogbGluZSAlZDogXG4iLCBjdXItPmxpbmUpOwogICAgICAgICAgICB4bWxQYXJzZXJQcmludEZpbGVDb250ZXh0SW50ZXJuYWwoY3VyLCBjaGFubmVsLCBkYXRhKTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoKGRvbWFpbiA9PSBYTUxfRlJPTV9YUEFUSCkgJiYgKGVyci0+c3RyMSAhPSBOVUxMKSAmJgogICAgICAgIChlcnItPmludDEgPCAxMDApICYmCgkoZXJyLT5pbnQxIDwgeG1sU3RybGVuKChjb25zdCB4bWxDaGFyICopZXJyLT5zdHIxKSkpIHsKCXhtbENoYXIgYnVmWzE1MF07CglpbnQgaTsKCgljaGFubmVsKGRhdGEsICIlc1xuIiwgZXJyLT5zdHIxKTsKCWZvciAoaT0wO2kgPCBlcnItPmludDE7aSsrKQoJICAgICBidWZbaV0gPSAnICc7CglidWZbaSsrXSA9ICdeJzsKCWJ1ZltpXSA9IDA7CgljaGFubmVsKGRhdGEsICIlc1xuIiwgYnVmKTsKICAgIH0KfQoKc3RhdGljIHZvaWQKaW5pdGlhbGl6ZUxpYnhtbDIodm9pZCkgewogICAgeG1sR2V0V2FybmluZ3NEZWZhdWx0VmFsdWUgPSAwOwogICAgeG1sUGVkYW50aWNQYXJzZXJEZWZhdWx0KDApOwoKICAgIHhtbE1lbVNldHVwKHhtbE1lbUZyZWUsIHhtbE1lbU1hbGxvYywgeG1sTWVtUmVhbGxvYywgeG1sTWVtb3J5U3RyZHVwKTsKICAgIHhtbEluaXRQYXJzZXIoKTsKICAgIHhtbFNldEV4dGVybmFsRW50aXR5TG9hZGVyKHRlc3RFeHRlcm5hbEVudGl0eUxvYWRlcik7CiAgICB4bWxTZXRTdHJ1Y3R1cmVkRXJyb3JGdW5jKE5VTEwsIHRlc3RTdHJ1Y3R1cmVkRXJyb3JIYW5kbGVyKTsKI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKICAgIHhtbFNjaGVtYUluaXRUeXBlcygpOwogICAgeG1sUmVsYXhOR0luaXRUeXBlcygpOwojZW5kaWYKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJCQkJCQkqCiAqCQlGaWxlIG5hbWUgYW5kIHBhdGggdXRpbGl0aWVzCQkJCSoKICoJCQkJCQkJCQkqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgY29uc3QgY2hhciAqYmFzZUZpbGVuYW1lKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSB7CiAgICBjb25zdCBjaGFyICpjdXI7CiAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKICAgICAgICByZXR1cm4oTlVMTCk7CiAgICBjdXIgPSAmZmlsZW5hbWVbc3RybGVuKGZpbGVuYW1lKV07CiAgICB3aGlsZSAoKGN1ciA+IGZpbGVuYW1lKSAmJiAoKmN1ciAhPSAnLycpKQogICAgICAgIGN1ci0tOwogICAgaWYgKCpjdXIgPT0gJy8nKQogICAgICAgIHJldHVybihjdXIgKyAxKTsKICAgIHJldHVybihjdXIpOwp9CgpzdGF0aWMgY2hhciAqcmVzdWx0RmlsZW5hbWUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN1ZmZpeCkgewogICAgY29uc3QgY2hhciAqYmFzZTsKICAgIGNoYXIgcmVzWzUwMF07CiAgICBjaGFyIHN1ZmZpeGJ1ZmZbNTAwXTsKCi8qKioqKioqKioqKioqCiAgICBpZiAoKGZpbGVuYW1lWzBdID09ICd0JykgJiYgKGZpbGVuYW1lWzFdID09ICdlJykgJiYKICAgICAgICAoZmlsZW5hbWVbMl0gPT0gJ3MnKSAmJiAoZmlsZW5hbWVbM10gPT0gJ3QnKSAmJgoJKGZpbGVuYW1lWzRdID09ICcvJykpCglmaWxlbmFtZSA9ICZmaWxlbmFtZVs1XTsKICoqKioqKioqKioqKiovCgogICAgYmFzZSA9IGJhc2VGaWxlbmFtZShmaWxlbmFtZSk7CiAgICBpZiAoc3VmZml4ID09IE5VTEwpCiAgICAgICAgc3VmZml4ID0gIi50bXAiOwogICAgaWYgKG91dCA9PSBOVUxMKQogICAgICAgIG91dCA9ICIiOwoKICAgIHN0cm5jcHkoc3VmZml4YnVmZixzdWZmaXgsNDk5KTsKI2lmZGVmIFZNUwogICAgaWYoc3Ryc3RyKGJhc2UsIi4iKSAmJiBzdWZmaXhidWZmWzBdPT0nLicpCiAgICAgIHN1ZmZpeGJ1ZmZbMF09J18nOwojZW5kaWYKCiAgICBzbnByaW50ZihyZXMsIDQ5OSwgIiVzJXMlcyIsIG91dCwgYmFzZSwgc3VmZml4YnVmZik7CiAgICByZXNbNDk5XSA9IDA7CiAgICByZXR1cm4oc3RyZHVwKHJlcykpOwp9CgpzdGF0aWMgaW50IGNoZWNrVGVzdEZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKICAgIHN0cnVjdCBzdGF0IGJ1ZjsKCiAgICBpZiAoc3RhdChmaWxlbmFtZSwgJmJ1ZikgPT0gLTEpCiAgICAgICAgcmV0dXJuKDApOwoKI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQogICAgaWYgKCEoYnVmLnN0X21vZGUgJiBfU19JRlJFRykpCiAgICAgICAgcmV0dXJuKDApOwojZWxzZQogICAgaWYgKCFTX0lTUkVHKGJ1Zi5zdF9tb2RlKSkKICAgICAgICByZXR1cm4oMCk7CiNlbmRpZgoKICAgIHJldHVybigxKTsKfQoKc3RhdGljIGludCBjb21wYXJlRmlsZXMoY29uc3QgY2hhciAqcjEsIGNvbnN0IGNoYXIgKnIyKSB7CiAgICBpbnQgcmVzMSwgcmVzMjsKICAgIGludCBmZDEsIGZkMjsKICAgIGNoYXIgYnl0ZXMxWzQwOTZdOwogICAgY2hhciBieXRlczJbNDA5Nl07CgogICAgZmQxID0gb3BlbihyMSwgUkRfRkxBR1MpOwogICAgaWYgKGZkMSA8IDApCiAgICAgICAgcmV0dXJuKC0xKTsKICAgIGZkMiA9IG9wZW4ocjIsIFJEX0ZMQUdTKTsKICAgIGlmIChmZDIgPCAwKSB7CiAgICAgICAgY2xvc2UoZmQxKTsKICAgICAgICByZXR1cm4oLTEpOwogICAgfQogICAgd2hpbGUgKDEpIHsKICAgICAgICByZXMxID0gcmVhZChmZDEsIGJ5dGVzMSwgNDA5Nik7CiAgICAgICAgcmVzMiA9IHJlYWQoZmQyLCBieXRlczIsIDQwOTYpOwoJaWYgKChyZXMxICE9IHJlczIpIHx8IChyZXMxIDwgMCkpIHsKCSAgICBjbG9zZShmZDEpOwoJICAgIGNsb3NlKGZkMik7CgkgICAgcmV0dXJuKDEpOwoJfQoJaWYgKHJlczEgPT0gMCkKCSAgICBicmVhazsKCWlmIChtZW1jbXAoYnl0ZXMxLCBieXRlczIsIHJlczEpICE9IDApIHsKCSAgICBjbG9zZShmZDEpOwoJICAgIGNsb3NlKGZkMik7CgkgICAgcmV0dXJuKDEpOwoJfQogICAgfQogICAgY2xvc2UoZmQxKTsKICAgIGNsb3NlKGZkMik7CiAgICByZXR1cm4oMCk7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZUZpbGVNZW0oY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm1lbSwgaW50IHNpemUpIHsKICAgIGludCByZXM7CiAgICBpbnQgZmQ7CiAgICBjaGFyIGJ5dGVzWzQwOTZdOwogICAgaW50IGlkeCA9IDA7CiAgICBzdHJ1Y3Qgc3RhdCBpbmZvOwoKICAgIGlmIChzdGF0KGZpbGVuYW1lLCAmaW5mbykgPCAwKQoJcmV0dXJuKC0xKTsKICAgIGlmIChpbmZvLnN0X3NpemUgIT0gc2l6ZSkKICAgICAgICByZXR1cm4oLTEpOwogICAgZmQgPSBvcGVuKGZpbGVuYW1lLCBSRF9GTEFHUyk7CiAgICBpZiAoZmQgPCAwKQogICAgICAgIHJldHVybigtMSk7CiAgICB3aGlsZSAoaWR4IDwgc2l6ZSkgewogICAgICAgIHJlcyA9IHJlYWQoZmQsIGJ5dGVzLCA0MDk2KTsKCWlmIChyZXMgPD0gMCkKCSAgICBicmVhazsKCWlmIChyZXMgKyBpZHggPiBzaXplKQoJICAgIGJyZWFrOwoJaWYgKG1lbWNtcChieXRlcywgJm1lbVtpZHhdLCByZXMpICE9IDApIHsKCSAgICBpbnQgaXg7CgkgICAgZm9yIChpeD0wOyBpeDxyZXM7IGl4KyspCgkJaWYgKGJ5dGVzW2l4XSAhPSBtZW1baWR4K2l4XSkKCQkJYnJlYWs7CgkgICAgZnByaW50ZihzdGRlcnIsIkNvbXBhcmUgZXJyb3IgYXQgcG9zaXRpb24gJWRcbiIsIGlkeCtpeCk7CgkgICAgY2xvc2UoZmQpOwoJICAgIHJldHVybigxKTsKCX0KCWlkeCArPSByZXM7CiAgICB9CiAgICBjbG9zZShmZCk7CiAgICByZXR1cm4oaWR4ICE9IHNpemUpOwp9CgpzdGF0aWMgaW50IGxvYWRNZW0oY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKiptZW0sIGludCAqc2l6ZSkgewogICAgaW50IGZkLCByZXM7CiAgICBzdHJ1Y3Qgc3RhdCBpbmZvOwogICAgY2hhciAqYmFzZTsKICAgIGludCBzaXogPSAwOwogICAgaWYgKHN0YXQoZmlsZW5hbWUsICZpbmZvKSA8IDApCglyZXR1cm4oLTEpOwogICAgYmFzZSA9IG1hbGxvYyhpbmZvLnN0X3NpemUgKyAxKTsKICAgIGlmIChiYXNlID09IE5VTEwpCglyZXR1cm4oLTEpOwogICAgaWYgKChmZCA9IG9wZW4oZmlsZW5hbWUsIFJEX0ZMQUdTKSkgPCAwKSB7CiAgICAgICAgZnJlZShiYXNlKTsKCXJldHVybigtMSk7CiAgICB9CiAgICB3aGlsZSAoKHJlcyA9IHJlYWQoZmQsICZiYXNlW3Npel0sIGluZm8uc3Rfc2l6ZSAtIHNpeikpID4gMCkgewogICAgICAgIHNpeiArPSByZXM7CiAgICB9CiAgICBjbG9zZShmZCk7CiNpZiAhZGVmaW5lZChfV0lOMzIpCiAgICBpZiAoc2l6ICE9IGluZm8uc3Rfc2l6ZSkgewogICAgICAgIGZyZWUoYmFzZSk7CglyZXR1cm4oLTEpOwogICAgfQojZW5kaWYKICAgIGJhc2Vbc2l6XSA9IDA7CiAgICAqbWVtID0gYmFzZTsKICAgICpzaXplID0gc2l6OwogICAgcmV0dXJuKDApOwp9CgpzdGF0aWMgaW50IHVubG9hZE1lbShjb25zdCBjaGFyICptZW0pIHsKICAgIGZyZWUoKGNoYXIgKiltZW0pOwogICAgcmV0dXJuKDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJCQkJCQkJKgogKgkJVGVzdHMgaW1wbGVtZW50YXRpb25zCQkJCQkqCiAqCQkJCQkJCQkJKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQkJCQkJCSoKICoJCVBhcnNlIHRvIFNBWCBiYXNlZCB0ZXN0cwkJCQkqCiAqCQkJCQkJCQkJKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIEZJTEUgKlNBWGRlYnVnID0gTlVMTDsKCi8qCiAqIGVtcHR5IFNBWCBibG9jawogKi8Kc3RhdGljIHhtbFNBWEhhbmRsZXIgZW1wdHlTQVhIYW5kbGVyU3RydWN0ID0gewogICAgTlVMTCwgLyogaW50ZXJuYWxTdWJzZXQgKi8KICAgIE5VTEwsIC8qIGlzU3RhbmRhbG9uZSAqLwogICAgTlVMTCwgLyogaGFzSW50ZXJuYWxTdWJzZXQgKi8KICAgIE5VTEwsIC8qIGhhc0V4dGVybmFsU3Vic2V0ICovCiAgICBOVUxMLCAvKiByZXNvbHZlRW50aXR5ICovCiAgICBOVUxMLCAvKiBnZXRFbnRpdHkgKi8KICAgIE5VTEwsIC8qIGVudGl0eURlY2wgKi8KICAgIE5VTEwsIC8qIG5vdGF0aW9uRGVjbCAqLwogICAgTlVMTCwgLyogYXR0cmlidXRlRGVjbCAqLwogICAgTlVMTCwgLyogZWxlbWVudERlY2wgKi8KICAgIE5VTEwsIC8qIHVucGFyc2VkRW50aXR5RGVjbCAqLwogICAgTlVMTCwgLyogc2V0RG9jdW1lbnRMb2NhdG9yICovCiAgICBOVUxMLCAvKiBzdGFydERvY3VtZW50ICovCiAgICBOVUxMLCAvKiBlbmREb2N1bWVudCAqLwogICAgTlVMTCwgLyogc3RhcnRFbGVtZW50ICovCiAgICBOVUxMLCAvKiBlbmRFbGVtZW50ICovCiAgICBOVUxMLCAvKiByZWZlcmVuY2UgKi8KICAgIE5VTEwsIC8qIGNoYXJhY3RlcnMgKi8KICAgIE5VTEwsIC8qIGlnbm9yYWJsZVdoaXRlc3BhY2UgKi8KICAgIE5VTEwsIC8qIHByb2Nlc3NpbmdJbnN0cnVjdGlvbiAqLwogICAgTlVMTCwgLyogY29tbWVudCAqLwogICAgTlVMTCwgLyogeG1sUGFyc2VyV2FybmluZyAqLwogICAgTlVMTCwgLyogeG1sUGFyc2VyRXJyb3IgKi8KICAgIE5VTEwsIC8qIHhtbFBhcnNlckVycm9yICovCiAgICBOVUxMLCAvKiBnZXRQYXJhbWV0ZXJFbnRpdHkgKi8KICAgIE5VTEwsIC8qIGNkYXRhQmxvY2s7ICovCiAgICBOVUxMLCAvKiBleHRlcm5hbFN1YnNldDsgKi8KICAgIDEsCiAgICBOVUxMLAogICAgTlVMTCwgLyogc3RhcnRFbGVtZW50TnMgKi8KICAgIE5VTEwsIC8qIGVuZEVsZW1lbnROcyAqLwogICAgTlVMTCAgLyogeG1sU3RydWN0dXJlZEVycm9yRnVuYyAqLwp9OwoKc3RhdGljIHhtbFNBWEhhbmRsZXJQdHIgZW1wdHlTQVhIYW5kbGVyID0gJmVtcHR5U0FYSGFuZGxlclN0cnVjdDsKc3RhdGljIGludCBjYWxsYmFja3MgPSAwOwpzdGF0aWMgaW50IHF1aWV0ID0gMDsKCi8qKgogKiBpc1N0YW5kYWxvbmVEZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICoKICogSXMgdGhpcyBkb2N1bWVudCB0YWdnZWQgc3RhbmRhbG9uZSA/CiAqCiAqIFJldHVybnMgMSBpZiB0cnVlCiAqLwpzdGF0aWMgaW50CmlzU3RhbmRhbG9uZURlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VEKQp7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybigwKTsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguaXNTdGFuZGFsb25lKClcbiIpOwogICAgcmV0dXJuKDApOwp9CgovKioKICogaGFzSW50ZXJuYWxTdWJzZXREZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICoKICogRG9lcyB0aGlzIGRvY3VtZW50IGhhcyBhbiBpbnRlcm5hbCBzdWJzZXQKICoKICogUmV0dXJucyAxIGlmIHRydWUKICovCnN0YXRpYyBpbnQKaGFzSW50ZXJuYWxTdWJzZXREZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCkKewogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm4oMCk7CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmhhc0ludGVybmFsU3Vic2V0KClcbiIpOwogICAgcmV0dXJuKDApOwp9CgovKioKICogaGFzRXh0ZXJuYWxTdWJzZXREZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICoKICogRG9lcyB0aGlzIGRvY3VtZW50IGhhcyBhbiBleHRlcm5hbCBzdWJzZXQKICoKICogUmV0dXJucyAxIGlmIHRydWUKICovCnN0YXRpYyBpbnQKaGFzRXh0ZXJuYWxTdWJzZXREZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCkKewogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm4oMCk7CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmhhc0V4dGVybmFsU3Vic2V0KClcbiIpOwogICAgcmV0dXJuKDApOwp9CgovKioKICogaW50ZXJuYWxTdWJzZXREZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICoKICogRG9lcyB0aGlzIGRvY3VtZW50IGhhcyBhbiBpbnRlcm5hbCBzdWJzZXQKICovCnN0YXRpYyB2b2lkCmludGVybmFsU3Vic2V0RGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKm5hbWUsCgkgICAgICAgY29uc3QgeG1sQ2hhciAqRXh0ZXJuYWxJRCwgY29uc3QgeG1sQ2hhciAqU3lzdGVtSUQpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5pbnRlcm5hbFN1YnNldCglcywiLCBuYW1lKTsKICAgIGlmIChFeHRlcm5hbElEID09IE5VTEwpCglmcHJpbnRmKFNBWGRlYnVnLCAiICwiKTsKICAgIGVsc2UKCWZwcmludGYoU0FYZGVidWcsICIgJXMsIiwgRXh0ZXJuYWxJRCk7CiAgICBpZiAoU3lzdGVtSUQgPT0gTlVMTCkKCWZwcmludGYoU0FYZGVidWcsICIgKVxuIik7CiAgICBlbHNlCglmcHJpbnRmKFNBWGRlYnVnLCAiICVzKVxuIiwgU3lzdGVtSUQpOwp9CgovKioKICogZXh0ZXJuYWxTdWJzZXREZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICoKICogRG9lcyB0aGlzIGRvY3VtZW50IGhhcyBhbiBleHRlcm5hbCBzdWJzZXQKICovCnN0YXRpYyB2b2lkCmV4dGVybmFsU3Vic2V0RGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKm5hbWUsCgkgICAgICAgY29uc3QgeG1sQ2hhciAqRXh0ZXJuYWxJRCwgY29uc3QgeG1sQ2hhciAqU3lzdGVtSUQpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5leHRlcm5hbFN1YnNldCglcywiLCBuYW1lKTsKICAgIGlmIChFeHRlcm5hbElEID09IE5VTEwpCglmcHJpbnRmKFNBWGRlYnVnLCAiICwiKTsKICAgIGVsc2UKCWZwcmludGYoU0FYZGVidWcsICIgJXMsIiwgRXh0ZXJuYWxJRCk7CiAgICBpZiAoU3lzdGVtSUQgPT0gTlVMTCkKCWZwcmludGYoU0FYZGVidWcsICIgKVxuIik7CiAgICBlbHNlCglmcHJpbnRmKFNBWGRlYnVnLCAiICVzKVxuIiwgU3lzdGVtSUQpOwp9CgovKioKICogcmVzb2x2ZUVudGl0eURlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAcHVibGljSWQ6IFRoZSBwdWJsaWMgSUQgb2YgdGhlIGVudGl0eQogKiBAc3lzdGVtSWQ6IFRoZSBzeXN0ZW0gSUQgb2YgdGhlIGVudGl0eQogKgogKiBTcGVjaWFsIGVudGl0eSByZXNvbHZlciwgYmV0dGVyIGxlZnQgdG8gdGhlIHBhcnNlciwgaXQgaGFzCiAqIG1vcmUgY29udGV4dCB0aGFuIHRoZSBhcHBsaWNhdGlvbiBsYXllci4KICogVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIE5PVCByZXNvbHZlIHRoZSBlbnRpdGllcywgaW4gdGhhdCBjYXNlCiAqIHRoZSBFTlRJVFlfUkVGIG5vZGVzIGFyZSBidWlsdCBpbiB0aGUgc3RydWN0dXJlIChhbmQgdGhlIHBhcmFtZXRlcgogKiB2YWx1ZXMpLgogKgogKiBSZXR1cm5zIHRoZSB4bWxQYXJzZXJJbnB1dFB0ciBpZiBpbmxpbmVkIG9yIE5VTEwgZm9yIERPTSBiZWhhdmlvdXIuCiAqLwpzdGF0aWMgeG1sUGFyc2VySW5wdXRQdHIKcmVzb2x2ZUVudGl0eURlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICpwdWJsaWNJZCwgY29uc3QgeG1sQ2hhciAqc3lzdGVtSWQpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuKE5VTEwpOwogICAgLyogeG1sUGFyc2VyQ3R4dFB0ciBjdHh0ID0gKHhtbFBhcnNlckN0eHRQdHIpIGN0eDsgKi8KCgogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5yZXNvbHZlRW50aXR5KCIpOwogICAgaWYgKHB1YmxpY0lkICE9IE5VTEwpCglmcHJpbnRmKFNBWGRlYnVnLCAiJXMiLCAoY2hhciAqKXB1YmxpY0lkKTsKICAgIGVsc2UKCWZwcmludGYoU0FYZGVidWcsICIgIik7CiAgICBpZiAoc3lzdGVtSWQgIT0gTlVMTCkKCWZwcmludGYoU0FYZGVidWcsICIsICVzKVxuIiwgKGNoYXIgKilzeXN0ZW1JZCk7CiAgICBlbHNlCglmcHJpbnRmKFNBWGRlYnVnLCAiLCApXG4iKTsKLyoqKioqKioqKgogICAgaWYgKHN5c3RlbUlkICE9IE5VTEwpIHsKICAgICAgICByZXR1cm4oeG1sTmV3SW5wdXRGcm9tRmlsZShjdHh0LCAoY2hhciAqKSBzeXN0ZW1JZCkpOwogICAgfQogKioqKioqKioqLwogICAgcmV0dXJuKE5VTEwpOwp9CgovKioKICogZ2V0RW50aXR5RGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEBuYW1lOiBUaGUgZW50aXR5IG5hbWUKICoKICogR2V0IGFuIGVudGl0eSBieSBuYW1lCiAqCiAqIFJldHVybnMgdGhlIHhtbFBhcnNlcklucHV0UHRyIGlmIGlubGluZWQgb3IgTlVMTCBmb3IgRE9NIGJlaGF2aW91ci4KICovCnN0YXRpYyB4bWxFbnRpdHlQdHIKZ2V0RW50aXR5RGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKm5hbWUpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuKE5VTEwpOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5nZXRFbnRpdHkoJXMpXG4iLCBuYW1lKTsKICAgIHJldHVybihOVUxMKTsKfQoKLyoqCiAqIGdldFBhcmFtZXRlckVudGl0eURlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAbmFtZTogVGhlIGVudGl0eSBuYW1lCiAqCiAqIEdldCBhIHBhcmFtZXRlciBlbnRpdHkgYnkgbmFtZQogKgogKiBSZXR1cm5zIHRoZSB4bWxQYXJzZXJJbnB1dFB0cgogKi8Kc3RhdGljIHhtbEVudGl0eVB0cgpnZXRQYXJhbWV0ZXJFbnRpdHlEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sQ2hhciAqbmFtZSkKewogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm4oTlVMTCk7CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmdldFBhcmFtZXRlckVudGl0eSglcylcbiIsIG5hbWUpOwogICAgcmV0dXJuKE5VTEwpOwp9CgoKLyoqCiAqIGVudGl0eURlY2xEZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQG5hbWU6ICB0aGUgZW50aXR5IG5hbWUKICogQHR5cGU6ICB0aGUgZW50aXR5IHR5cGUKICogQHB1YmxpY0lkOiBUaGUgcHVibGljIElEIG9mIHRoZSBlbnRpdHkKICogQHN5c3RlbUlkOiBUaGUgc3lzdGVtIElEIG9mIHRoZSBlbnRpdHkKICogQGNvbnRlbnQ6IHRoZSBlbnRpdHkgdmFsdWUgKHdpdGhvdXQgcHJvY2Vzc2luZykuCiAqCiAqIEFuIGVudGl0eSBkZWZpbml0aW9uIGhhcyBiZWVuIHBhcnNlZAogKi8Kc3RhdGljIHZvaWQKZW50aXR5RGVjbERlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICpuYW1lLCBpbnQgdHlwZSwKICAgICAgICAgIGNvbnN0IHhtbENoYXIgKnB1YmxpY0lkLCBjb25zdCB4bWxDaGFyICpzeXN0ZW1JZCwgeG1sQ2hhciAqY29udGVudCkKewpjb25zdCB4bWxDaGFyICpudWxsc3RyID0gQkFEX0NBU1QgIihudWxsKSI7CiAgICAvKiBub3QgYWxsIGxpYnJhcmllcyBoYW5kbGUgcHJpbnRpbmcgbnVsbCBwb2ludGVycyBuaWNlbHkgKi8KICAgIGlmIChwdWJsaWNJZCA9PSBOVUxMKQogICAgICAgIHB1YmxpY0lkID0gbnVsbHN0cjsKICAgIGlmIChzeXN0ZW1JZCA9PSBOVUxMKQogICAgICAgIHN5c3RlbUlkID0gbnVsbHN0cjsKICAgIGlmIChjb250ZW50ID09IE5VTEwpCiAgICAgICAgY29udGVudCA9ICh4bWxDaGFyICopbnVsbHN0cjsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5lbnRpdHlEZWNsKCVzLCAlZCwgJXMsICVzLCAlcylcbiIsCiAgICAgICAgICAgIG5hbWUsIHR5cGUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgY29udGVudCk7Cn0KCi8qKgogKiBhdHRyaWJ1dGVEZWNsRGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEBuYW1lOiAgdGhlIGF0dHJpYnV0ZSBuYW1lCiAqIEB0eXBlOiAgdGhlIGF0dHJpYnV0ZSB0eXBlCiAqCiAqIEFuIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGhhcyBiZWVuIHBhcnNlZAogKi8Kc3RhdGljIHZvaWQKYXR0cmlidXRlRGVjbERlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICogZWxlbSwKICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lLCBpbnQgdHlwZSwgaW50IGRlZiwKICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKiBkZWZhdWx0VmFsdWUsIHhtbEVudW1lcmF0aW9uUHRyIHRyZWUpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQogICAgICAgIHJldHVybjsKICAgIGlmIChkZWZhdWx0VmFsdWUgPT0gTlVMTCkKICAgICAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmF0dHJpYnV0ZURlY2woJXMsICVzLCAlZCwgJWQsIE5VTEwsIC4uLilcbiIsCiAgICAgICAgICAgICAgICBlbGVtLCBuYW1lLCB0eXBlLCBkZWYpOwogICAgZWxzZQogICAgICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguYXR0cmlidXRlRGVjbCglcywgJXMsICVkLCAlZCwgJXMsIC4uLilcbiIsCiAgICAgICAgICAgICAgICBlbGVtLCBuYW1lLCB0eXBlLCBkZWYsIGRlZmF1bHRWYWx1ZSk7CiAgICB4bWxGcmVlRW51bWVyYXRpb24odHJlZSk7Cn0KCi8qKgogKiBlbGVtZW50RGVjbERlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAbmFtZTogIHRoZSBlbGVtZW50IG5hbWUKICogQHR5cGU6ICB0aGUgZWxlbWVudCB0eXBlCiAqIEBjb250ZW50OiB0aGUgZWxlbWVudCB2YWx1ZSAod2l0aG91dCBwcm9jZXNzaW5nKS4KICoKICogQW4gZWxlbWVudCBkZWZpbml0aW9uIGhhcyBiZWVuIHBhcnNlZAogKi8Kc3RhdGljIHZvaWQKZWxlbWVudERlY2xEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sQ2hhciAqbmFtZSwgaW50IHR5cGUsCgkgICAgeG1sRWxlbWVudENvbnRlbnRQdHIgY29udGVudCBBVFRSSUJVVEVfVU5VU0VEKQp7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguZWxlbWVudERlY2woJXMsICVkLCAuLi4pXG4iLAogICAgICAgICAgICBuYW1lLCB0eXBlKTsKfQoKLyoqCiAqIG5vdGF0aW9uRGVjbERlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAbmFtZTogVGhlIG5hbWUgb2YgdGhlIG5vdGF0aW9uCiAqIEBwdWJsaWNJZDogVGhlIHB1YmxpYyBJRCBvZiB0aGUgZW50aXR5CiAqIEBzeXN0ZW1JZDogVGhlIHN5c3RlbSBJRCBvZiB0aGUgZW50aXR5CiAqCiAqIFdoYXQgdG8gZG8gd2hlbiBhIG5vdGF0aW9uIGRlY2xhcmF0aW9uIGhhcyBiZWVuIHBhcnNlZC4KICovCnN0YXRpYyB2b2lkCm5vdGF0aW9uRGVjbERlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICpuYW1lLAoJICAgICBjb25zdCB4bWxDaGFyICpwdWJsaWNJZCwgY29uc3QgeG1sQ2hhciAqc3lzdGVtSWQpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5ub3RhdGlvbkRlY2woJXMsICVzLCAlcylcbiIsCiAgICAgICAgICAgIChjaGFyICopIG5hbWUsIChjaGFyICopIHB1YmxpY0lkLCAoY2hhciAqKSBzeXN0ZW1JZCk7Cn0KCi8qKgogKiB1bnBhcnNlZEVudGl0eURlY2xEZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBlbnRpdHkKICogQHB1YmxpY0lkOiBUaGUgcHVibGljIElEIG9mIHRoZSBlbnRpdHkKICogQHN5c3RlbUlkOiBUaGUgc3lzdGVtIElEIG9mIHRoZSBlbnRpdHkKICogQG5vdGF0aW9uTmFtZTogdGhlIG5hbWUgb2YgdGhlIG5vdGF0aW9uCiAqCiAqIFdoYXQgdG8gZG8gd2hlbiBhbiB1bnBhcnNlZCBlbnRpdHkgZGVjbGFyYXRpb24gaXMgcGFyc2VkCiAqLwpzdGF0aWMgdm9pZAp1bnBhcnNlZEVudGl0eURlY2xEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sQ2hhciAqbmFtZSwKCQkgICBjb25zdCB4bWxDaGFyICpwdWJsaWNJZCwgY29uc3QgeG1sQ2hhciAqc3lzdGVtSWQsCgkJICAgY29uc3QgeG1sQ2hhciAqbm90YXRpb25OYW1lKQp7CmNvbnN0IHhtbENoYXIgKm51bGxzdHIgPSBCQURfQ0FTVCAiKG51bGwpIjsKCiAgICBpZiAocHVibGljSWQgPT0gTlVMTCkKICAgICAgICBwdWJsaWNJZCA9IG51bGxzdHI7CiAgICBpZiAoc3lzdGVtSWQgPT0gTlVMTCkKICAgICAgICBzeXN0ZW1JZCA9IG51bGxzdHI7CiAgICBpZiAobm90YXRpb25OYW1lID09IE5VTEwpCiAgICAgICAgbm90YXRpb25OYW1lID0gbnVsbHN0cjsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC51bnBhcnNlZEVudGl0eURlY2woJXMsICVzLCAlcywgJXMpXG4iLAogICAgICAgICAgICAoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBwdWJsaWNJZCwgKGNoYXIgKikgc3lzdGVtSWQsCgkgICAgKGNoYXIgKikgbm90YXRpb25OYW1lKTsKfQoKLyoqCiAqIHNldERvY3VtZW50TG9jYXRvckRlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAbG9jOiBBIFNBWCBMb2NhdG9yCiAqCiAqIFJlY2VpdmUgdGhlIGRvY3VtZW50IGxvY2F0b3IgYXQgc3RhcnR1cCwgYWN0dWFsbHkgeG1sRGVmYXVsdFNBWExvY2F0b3IKICogRXZlcnl0aGluZyBpcyBhdmFpbGFibGUgb24gdGhlIGNvbnRleHQsIHNvIHRoaXMgaXMgdXNlbGVzcyBpbiBvdXIgY2FzZS4KICovCnN0YXRpYyB2b2lkCnNldERvY3VtZW50TG9jYXRvckRlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCB4bWxTQVhMb2NhdG9yUHRyIGxvYyBBVFRSSUJVVEVfVU5VU0VEKQp7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguc2V0RG9jdW1lbnRMb2NhdG9yKClcbiIpOwp9CgovKioKICogc3RhcnREb2N1bWVudERlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKgogKiBjYWxsZWQgd2hlbiB0aGUgZG9jdW1lbnQgc3RhcnQgYmVpbmcgcHJvY2Vzc2VkLgogKi8Kc3RhdGljIHZvaWQKc3RhcnREb2N1bWVudERlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VEKQp7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguc3RhcnREb2N1bWVudCgpXG4iKTsKfQoKLyoqCiAqIGVuZERvY3VtZW50RGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqCiAqIGNhbGxlZCB3aGVuIHRoZSBkb2N1bWVudCBlbmQgaGFzIGJlZW4gZGV0ZWN0ZWQuCiAqLwpzdGF0aWMgdm9pZAplbmREb2N1bWVudERlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VEKQp7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguZW5kRG9jdW1lbnQoKVxuIik7Cn0KCi8qKgogKiBzdGFydEVsZW1lbnREZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQG5hbWU6ICBUaGUgZWxlbWVudCBuYW1lCiAqCiAqIGNhbGxlZCB3aGVuIGFuIG9wZW5pbmcgdGFnIGhhcyBiZWVuIHByb2Nlc3NlZC4KICovCnN0YXRpYyB2b2lkCnN0YXJ0RWxlbWVudERlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICpuYW1lLCBjb25zdCB4bWxDaGFyICoqYXR0cykKewogICAgaW50IGk7CgogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm47CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLnN0YXJ0RWxlbWVudCglcyIsIChjaGFyICopIG5hbWUpOwogICAgaWYgKGF0dHMgIT0gTlVMTCkgewogICAgICAgIGZvciAoaSA9IDA7KGF0dHNbaV0gIT0gTlVMTCk7aSsrKSB7CgkgICAgZnByaW50ZihTQVhkZWJ1ZywgIiwgJXM9JyIsIGF0dHNbaSsrXSk7CgkgICAgaWYgKGF0dHNbaV0gIT0gTlVMTCkKCSAgICAgICAgZnByaW50ZihTQVhkZWJ1ZywgIiVzJyIsIGF0dHNbaV0pOwoJfQogICAgfQogICAgZnByaW50ZihTQVhkZWJ1ZywgIilcbiIpOwp9CgovKioKICogZW5kRWxlbWVudERlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAbmFtZTogIFRoZSBlbGVtZW50IG5hbWUKICoKICogY2FsbGVkIHdoZW4gdGhlIGVuZCBvZiBhbiBlbGVtZW50IGhhcyBiZWVuIGRldGVjdGVkLgogKi8Kc3RhdGljIHZvaWQKZW5kRWxlbWVudERlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICpuYW1lKQp7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguZW5kRWxlbWVudCglcylcbiIsIChjaGFyICopIG5hbWUpOwp9CgovKioKICogY2hhcmFjdGVyc0RlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAY2g6ICBhIHhtbENoYXIgc3RyaW5nCiAqIEBsZW46IHRoZSBudW1iZXIgb2YgeG1sQ2hhcgogKgogKiByZWNlaXZpbmcgc29tZSBjaGFycyBmcm9tIHRoZSBwYXJzZXIuCiAqIFF1ZXN0aW9uOiBob3cgbXVjaCBhdCBhIHRpbWUgPz8/CiAqLwpzdGF0aWMgdm9pZApjaGFyYWN0ZXJzRGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKmNoLCBpbnQgbGVuKQp7CiAgICBjaGFyIG91dHB1dFs0MF07CiAgICBpbnQgaTsKCiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZvciAoaSA9IDA7KGk8bGVuKSAmJiAoaSA8IDMwKTtpKyspCglvdXRwdXRbaV0gPSBjaFtpXTsKICAgIG91dHB1dFtpXSA9IDA7CgogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5jaGFyYWN0ZXJzKCVzLCAlZClcbiIsIG91dHB1dCwgbGVuKTsKfQoKLyoqCiAqIHJlZmVyZW5jZURlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAbmFtZTogIFRoZSBlbnRpdHkgbmFtZQogKgogKiBjYWxsZWQgd2hlbiBhbiBlbnRpdHkgcmVmZXJlbmNlIGlzIGRldGVjdGVkLgogKi8Kc3RhdGljIHZvaWQKcmVmZXJlbmNlRGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKm5hbWUpCnsKICAgIGNhbGxiYWNrcysrOwogICAgaWYgKHF1aWV0KQoJcmV0dXJuOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5yZWZlcmVuY2UoJXMpXG4iLCBuYW1lKTsKfQoKLyoqCiAqIGlnbm9yYWJsZVdoaXRlc3BhY2VEZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQGNoOiAgYSB4bWxDaGFyIHN0cmluZwogKiBAc3RhcnQ6IHRoZSBmaXJzdCBjaGFyIGluIHRoZSBzdHJpbmcKICogQGxlbjogdGhlIG51bWJlciBvZiB4bWxDaGFyCiAqCiAqIHJlY2VpdmluZyBzb21lIGlnbm9yYWJsZSB3aGl0ZXNwYWNlcyBmcm9tIHRoZSBwYXJzZXIuCiAqIFF1ZXN0aW9uOiBob3cgbXVjaCBhdCBhIHRpbWUgPz8/CiAqLwpzdGF0aWMgdm9pZAppZ25vcmFibGVXaGl0ZXNwYWNlRGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKmNoLCBpbnQgbGVuKQp7CiAgICBjaGFyIG91dHB1dFs0MF07CiAgICBpbnQgaTsKCiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZvciAoaSA9IDA7KGk8bGVuKSAmJiAoaSA8IDMwKTtpKyspCglvdXRwdXRbaV0gPSBjaFtpXTsKICAgIG91dHB1dFtpXSA9IDA7CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmlnbm9yYWJsZVdoaXRlc3BhY2UoJXMsICVkKVxuIiwgb3V0cHV0LCBsZW4pOwp9CgovKioKICogcHJvY2Vzc2luZ0luc3RydWN0aW9uRGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEB0YXJnZXQ6ICB0aGUgdGFyZ2V0IG5hbWUKICogQGRhdGE6IHRoZSBQSSBkYXRhJ3MKICogQGxlbjogdGhlIG51bWJlciBvZiB4bWxDaGFyCiAqCiAqIEEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBoYXMgYmVlbiBwYXJzZWQuCiAqLwpzdGF0aWMgdm9pZApwcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sQ2hhciAqdGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqZGF0YSkKewogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm47CiAgICBpZiAoZGF0YSAhPSBOVUxMKQoJZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oJXMsICVzKVxuIiwKCQkoY2hhciAqKSB0YXJnZXQsIChjaGFyICopIGRhdGEpOwogICAgZWxzZQoJZnByaW50ZihTQVhkZWJ1ZywgIlNBWC5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oJXMsIE5VTEwpXG4iLAoJCShjaGFyICopIHRhcmdldCk7Cn0KCi8qKgogKiBjZGF0YUJsb2NrRGVidWc6CiAqIEBjdHg6IHRoZSB1c2VyIGRhdGEgKFhNTCBwYXJzZXIgY29udGV4dCkKICogQHZhbHVlOiAgVGhlIHBjZGF0YSBjb250ZW50CiAqIEBsZW46ICB0aGUgYmxvY2sgbGVuZ3RoCiAqCiAqIGNhbGxlZCB3aGVuIGEgcGNkYXRhIGJsb2NrIGhhcyBiZWVuIHBhcnNlZAogKi8Kc3RhdGljIHZvaWQKY2RhdGFCbG9ja0RlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICp2YWx1ZSwgaW50IGxlbikKewogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm47CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLnBjZGF0YSglLjIwcywgJWQpXG4iLAoJICAgIChjaGFyICopIHZhbHVlLCBsZW4pOwp9CgovKioKICogY29tbWVudERlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAdmFsdWU6ICB0aGUgY29tbWVudCBjb250ZW50CiAqCiAqIEEgY29tbWVudCBoYXMgYmVlbiBwYXJzZWQuCiAqLwpzdGF0aWMgdm9pZApjb21tZW50RGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKnZhbHVlKQp7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguY29tbWVudCglcylcbiIsIHZhbHVlKTsKfQoKLyoqCiAqIHdhcm5pbmdEZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQG1zZzogIHRoZSBtZXNzYWdlIHRvIGRpc3BsYXkvdHJhbnNtaXQKICogQC4uLjogIGV4dHJhIHBhcmFtZXRlcnMgZm9yIHRoZSBtZXNzYWdlIGRpc3BsYXkKICoKICogRGlzcGxheSBhbmQgZm9ybWF0IGEgd2FybmluZyBtZXNzYWdlcywgZ2l2ZXMgZmlsZSwgbGluZSwgcG9zaXRpb24gYW5kCiAqIGV4dHJhIHBhcmFtZXRlcnMuCiAqLwpzdGF0aWMgdm9pZCBYTUxDREVDTAp3YXJuaW5nRGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IGNoYXIgKm1zZywgLi4uKQp7CiAgICB2YV9saXN0IGFyZ3M7CgogICAgY2FsbGJhY2tzKys7CiAgICBpZiAocXVpZXQpCglyZXR1cm47CiAgICB2YV9zdGFydChhcmdzLCBtc2cpOwogICAgZnByaW50ZihTQVhkZWJ1ZywgIlNBWC53YXJuaW5nOiAiKTsKICAgIHZmcHJpbnRmKFNBWGRlYnVnLCBtc2csIGFyZ3MpOwogICAgdmFfZW5kKGFyZ3MpOwp9CgovKioKICogZXJyb3JEZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQG1zZzogIHRoZSBtZXNzYWdlIHRvIGRpc3BsYXkvdHJhbnNtaXQKICogQC4uLjogIGV4dHJhIHBhcmFtZXRlcnMgZm9yIHRoZSBtZXNzYWdlIGRpc3BsYXkKICoKICogRGlzcGxheSBhbmQgZm9ybWF0IGEgZXJyb3IgbWVzc2FnZXMsIGdpdmVzIGZpbGUsIGxpbmUsIHBvc2l0aW9uIGFuZAogKiBleHRyYSBwYXJhbWV0ZXJzLgogKi8Kc3RhdGljIHZvaWQgWE1MQ0RFQ0wKZXJyb3JEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgY2hhciAqbXNnLCAuLi4pCnsKICAgIHZhX2xpc3QgYXJnczsKCiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIHZhX3N0YXJ0KGFyZ3MsIG1zZyk7CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmVycm9yOiAiKTsKICAgIHZmcHJpbnRmKFNBWGRlYnVnLCBtc2csIGFyZ3MpOwogICAgdmFfZW5kKGFyZ3MpOwp9CgovKioKICogZmF0YWxFcnJvckRlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAbXNnOiAgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheS90cmFuc21pdAogKiBALi4uOiAgZXh0cmEgcGFyYW1ldGVycyBmb3IgdGhlIG1lc3NhZ2UgZGlzcGxheQogKgogKiBEaXNwbGF5IGFuZCBmb3JtYXQgYSBmYXRhbEVycm9yIG1lc3NhZ2VzLCBnaXZlcyBmaWxlLCBsaW5lLCBwb3NpdGlvbiBhbmQKICogZXh0cmEgcGFyYW1ldGVycy4KICovCnN0YXRpYyB2b2lkIFhNTENERUNMCmZhdGFsRXJyb3JEZWJ1Zyh2b2lkICpjdHggQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgY2hhciAqbXNnLCAuLi4pCnsKICAgIHZhX2xpc3QgYXJnczsKCiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIHZhX3N0YXJ0KGFyZ3MsIG1zZyk7CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmZhdGFsRXJyb3I6ICIpOwogICAgdmZwcmludGYoU0FYZGVidWcsIG1zZywgYXJncyk7CiAgICB2YV9lbmQoYXJncyk7Cn0KCnN0YXRpYyB4bWxTQVhIYW5kbGVyIGRlYnVnU0FYSGFuZGxlclN0cnVjdCA9IHsKICAgIGludGVybmFsU3Vic2V0RGVidWcsCiAgICBpc1N0YW5kYWxvbmVEZWJ1ZywKICAgIGhhc0ludGVybmFsU3Vic2V0RGVidWcsCiAgICBoYXNFeHRlcm5hbFN1YnNldERlYnVnLAogICAgcmVzb2x2ZUVudGl0eURlYnVnLAogICAgZ2V0RW50aXR5RGVidWcsCiAgICBlbnRpdHlEZWNsRGVidWcsCiAgICBub3RhdGlvbkRlY2xEZWJ1ZywKICAgIGF0dHJpYnV0ZURlY2xEZWJ1ZywKICAgIGVsZW1lbnREZWNsRGVidWcsCiAgICB1bnBhcnNlZEVudGl0eURlY2xEZWJ1ZywKICAgIHNldERvY3VtZW50TG9jYXRvckRlYnVnLAogICAgc3RhcnREb2N1bWVudERlYnVnLAogICAgZW5kRG9jdW1lbnREZWJ1ZywKICAgIHN0YXJ0RWxlbWVudERlYnVnLAogICAgZW5kRWxlbWVudERlYnVnLAogICAgcmVmZXJlbmNlRGVidWcsCiAgICBjaGFyYWN0ZXJzRGVidWcsCiAgICBpZ25vcmFibGVXaGl0ZXNwYWNlRGVidWcsCiAgICBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EZWJ1ZywKICAgIGNvbW1lbnREZWJ1ZywKICAgIHdhcm5pbmdEZWJ1ZywKICAgIGVycm9yRGVidWcsCiAgICBmYXRhbEVycm9yRGVidWcsCiAgICBnZXRQYXJhbWV0ZXJFbnRpdHlEZWJ1ZywKICAgIGNkYXRhQmxvY2tEZWJ1ZywKICAgIGV4dGVybmFsU3Vic2V0RGVidWcsCiAgICAxLAogICAgTlVMTCwKICAgIE5VTEwsCiAgICBOVUxMLAogICAgTlVMTAp9OwoKc3RhdGljIHhtbFNBWEhhbmRsZXJQdHIgZGVidWdTQVhIYW5kbGVyID0gJmRlYnVnU0FYSGFuZGxlclN0cnVjdDsKCi8qCiAqIFNBWDIgc3BlY2lmaWMgY2FsbGJhY2tzCiAqLwovKioKICogc3RhcnRFbGVtZW50TnNEZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQG5hbWU6ICBUaGUgZWxlbWVudCBuYW1lCiAqCiAqIGNhbGxlZCB3aGVuIGFuIG9wZW5pbmcgdGFnIGhhcyBiZWVuIHByb2Nlc3NlZC4KICovCnN0YXRpYyB2b2lkCnN0YXJ0RWxlbWVudE5zRGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqbG9jYWxuYW1lLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKnByZWZpeCwKICAgICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICpVUkksCgkJICAgIGludCBuYl9uYW1lc3BhY2VzLAoJCSAgICBjb25zdCB4bWxDaGFyICoqbmFtZXNwYWNlcywKCQkgICAgaW50IG5iX2F0dHJpYnV0ZXMsCgkJICAgIGludCBuYl9kZWZhdWx0ZWQsCgkJICAgIGNvbnN0IHhtbENoYXIgKiphdHRyaWJ1dGVzKQp7CiAgICBpbnQgaTsKCiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguc3RhcnRFbGVtZW50TnMoJXMiLCAoY2hhciAqKSBsb2NhbG5hbWUpOwogICAgaWYgKHByZWZpeCA9PSBOVUxMKQoJZnByaW50ZihTQVhkZWJ1ZywgIiwgTlVMTCIpOwogICAgZWxzZQoJZnByaW50ZihTQVhkZWJ1ZywgIiwgJXMiLCAoY2hhciAqKSBwcmVmaXgpOwogICAgaWYgKFVSSSA9PSBOVUxMKQoJZnByaW50ZihTQVhkZWJ1ZywgIiwgTlVMTCIpOwogICAgZWxzZQoJZnByaW50ZihTQVhkZWJ1ZywgIiwgJyVzJyIsIChjaGFyICopIFVSSSk7CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiLCAlZCIsIG5iX25hbWVzcGFjZXMpOwoKICAgIGlmIChuYW1lc3BhY2VzICE9IE5VTEwpIHsKICAgICAgICBmb3IgKGkgPSAwO2kgPCBuYl9uYW1lc3BhY2VzICogMjtpKyspIHsKCSAgICBmcHJpbnRmKFNBWGRlYnVnLCAiLCB4bWxucyIpOwoJICAgIGlmIChuYW1lc3BhY2VzW2ldICE9IE5VTEwpCgkgICAgICAgIGZwcmludGYoU0FYZGVidWcsICI6JXMiLCBuYW1lc3BhY2VzW2ldKTsKCSAgICBpKys7CgkgICAgZnByaW50ZihTQVhkZWJ1ZywgIj0nJXMnIiwgbmFtZXNwYWNlc1tpXSk7Cgl9CiAgICB9CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiLCAlZCwgJWQiLCBuYl9hdHRyaWJ1dGVzLCBuYl9kZWZhdWx0ZWQpOwogICAgaWYgKGF0dHJpYnV0ZXMgIT0gTlVMTCkgewogICAgICAgIGZvciAoaSA9IDA7aSA8IG5iX2F0dHJpYnV0ZXMgKiA1O2kgKz0gNSkgewoJICAgIGlmIChhdHRyaWJ1dGVzW2kgKyAxXSAhPSBOVUxMKQoJCWZwcmludGYoU0FYZGVidWcsICIsICVzOiVzPSciLCBhdHRyaWJ1dGVzW2kgKyAxXSwgYXR0cmlidXRlc1tpXSk7CgkgICAgZWxzZQoJCWZwcmludGYoU0FYZGVidWcsICIsICVzPSciLCBhdHRyaWJ1dGVzW2ldKTsKCSAgICBmcHJpbnRmKFNBWGRlYnVnLCAiJS40cy4uLicsICVkIiwgYXR0cmlidXRlc1tpICsgM10sCgkJICAgIChpbnQpKGF0dHJpYnV0ZXNbaSArIDRdIC0gYXR0cmlidXRlc1tpICsgM10pKTsKCX0KICAgIH0KICAgIGZwcmludGYoU0FYZGVidWcsICIpXG4iKTsKfQoKLyoqCiAqIGVuZEVsZW1lbnREZWJ1ZzoKICogQGN0eHQ6ICBBbiBYTUwgcGFyc2VyIGNvbnRleHQKICogQG5hbWU6ICBUaGUgZWxlbWVudCBuYW1lCiAqCiAqIGNhbGxlZCB3aGVuIHRoZSBlbmQgb2YgYW4gZWxlbWVudCBoYXMgYmVlbiBkZXRlY3RlZC4KICovCnN0YXRpYyB2b2lkCmVuZEVsZW1lbnROc0RlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyICpsb2NhbG5hbWUsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbENoYXIgKnByZWZpeCwKICAgICAgICAgICAgICAgICAgY29uc3QgeG1sQ2hhciAqVVJJKQp7CiAgICBjYWxsYmFja3MrKzsKICAgIGlmIChxdWlldCkKCXJldHVybjsKICAgIGZwcmludGYoU0FYZGVidWcsICJTQVguZW5kRWxlbWVudE5zKCVzIiwgKGNoYXIgKikgbG9jYWxuYW1lKTsKICAgIGlmIChwcmVmaXggPT0gTlVMTCkKCWZwcmludGYoU0FYZGVidWcsICIsIE5VTEwiKTsKICAgIGVsc2UKCWZwcmludGYoU0FYZGVidWcsICIsICVzIiwgKGNoYXIgKikgcHJlZml4KTsKICAgIGlmIChVUkkgPT0gTlVMTCkKCWZwcmludGYoU0FYZGVidWcsICIsIE5VTEwpXG4iKTsKICAgIGVsc2UKCWZwcmludGYoU0FYZGVidWcsICIsICclcycpXG4iLCAoY2hhciAqKSBVUkkpOwp9CgpzdGF0aWMgeG1sU0FYSGFuZGxlciBkZWJ1Z1NBWDJIYW5kbGVyU3RydWN0ID0gewogICAgaW50ZXJuYWxTdWJzZXREZWJ1ZywKICAgIGlzU3RhbmRhbG9uZURlYnVnLAogICAgaGFzSW50ZXJuYWxTdWJzZXREZWJ1ZywKICAgIGhhc0V4dGVybmFsU3Vic2V0RGVidWcsCiAgICByZXNvbHZlRW50aXR5RGVidWcsCiAgICBnZXRFbnRpdHlEZWJ1ZywKICAgIGVudGl0eURlY2xEZWJ1ZywKICAgIG5vdGF0aW9uRGVjbERlYnVnLAogICAgYXR0cmlidXRlRGVjbERlYnVnLAogICAgZWxlbWVudERlY2xEZWJ1ZywKICAgIHVucGFyc2VkRW50aXR5RGVjbERlYnVnLAogICAgc2V0RG9jdW1lbnRMb2NhdG9yRGVidWcsCiAgICBzdGFydERvY3VtZW50RGVidWcsCiAgICBlbmREb2N1bWVudERlYnVnLAogICAgTlVMTCwKICAgIE5VTEwsCiAgICByZWZlcmVuY2VEZWJ1ZywKICAgIGNoYXJhY3RlcnNEZWJ1ZywKICAgIGlnbm9yYWJsZVdoaXRlc3BhY2VEZWJ1ZywKICAgIHByb2Nlc3NpbmdJbnN0cnVjdGlvbkRlYnVnLAogICAgY29tbWVudERlYnVnLAogICAgd2FybmluZ0RlYnVnLAogICAgZXJyb3JEZWJ1ZywKICAgIGZhdGFsRXJyb3JEZWJ1ZywKICAgIGdldFBhcmFtZXRlckVudGl0eURlYnVnLAogICAgY2RhdGFCbG9ja0RlYnVnLAogICAgZXh0ZXJuYWxTdWJzZXREZWJ1ZywKICAgIFhNTF9TQVgyX01BR0lDLAogICAgTlVMTCwKICAgIHN0YXJ0RWxlbWVudE5zRGVidWcsCiAgICBlbmRFbGVtZW50TnNEZWJ1ZywKICAgIE5VTEwKfTsKCnN0YXRpYyB4bWxTQVhIYW5kbGVyUHRyIGRlYnVnU0FYMkhhbmRsZXIgPSAmZGVidWdTQVgySGFuZGxlclN0cnVjdDsKCiNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECi8qKgogKiBodG1sc3RhcnRFbGVtZW50RGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEBuYW1lOiAgVGhlIGVsZW1lbnQgbmFtZQogKgogKiBjYWxsZWQgd2hlbiBhbiBvcGVuaW5nIHRhZyBoYXMgYmVlbiBwcm9jZXNzZWQuCiAqLwpzdGF0aWMgdm9pZApodG1sc3RhcnRFbGVtZW50RGVidWcodm9pZCAqY3R4IEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKm5hbWUsIGNvbnN0IHhtbENoYXIgKiphdHRzKQp7CiAgICBpbnQgaTsKCiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLnN0YXJ0RWxlbWVudCglcyIsIChjaGFyICopIG5hbWUpOwogICAgaWYgKGF0dHMgIT0gTlVMTCkgewogICAgICAgIGZvciAoaSA9IDA7KGF0dHNbaV0gIT0gTlVMTCk7aSsrKSB7CgkgICAgZnByaW50ZihTQVhkZWJ1ZywgIiwgJXMiLCBhdHRzW2krK10pOwoJICAgIGlmIChhdHRzW2ldICE9IE5VTEwpIHsKCQl1bnNpZ25lZCBjaGFyIG91dHB1dFs0MF07CgkJY29uc3QgdW5zaWduZWQgY2hhciAqYXR0ID0gYXR0c1tpXTsKCQlpbnQgb3V0bGVuLCBhdHRsZW47CgkgICAgICAgIGZwcmludGYoU0FYZGVidWcsICI9JyIpOwoJCXdoaWxlICgoYXR0bGVuID0gc3RybGVuKChjaGFyKilhdHQpKSA+IDApIHsKCQkgICAgb3V0bGVuID0gc2l6ZW9mIG91dHB1dCAtIDE7CgkJICAgIGh0bWxFbmNvZGVFbnRpdGllcyhvdXRwdXQsICZvdXRsZW4sIGF0dCwgJmF0dGxlbiwgJ1wnJyk7CgkJICAgIG91dHB1dFtvdXRsZW5dID0gMDsKCQkgICAgZnByaW50ZihTQVhkZWJ1ZywgIiVzIiwgKGNoYXIgKikgb3V0cHV0KTsKCQkgICAgYXR0ICs9IGF0dGxlbjsKCQl9CgkJZnByaW50ZihTQVhkZWJ1ZywgIiciKTsKCSAgICB9Cgl9CiAgICB9CiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiKVxuIik7Cn0KCi8qKgogKiBodG1sY2hhcmFjdGVyc0RlYnVnOgogKiBAY3R4dDogIEFuIFhNTCBwYXJzZXIgY29udGV4dAogKiBAY2g6ICBhIHhtbENoYXIgc3RyaW5nCiAqIEBsZW46IHRoZSBudW1iZXIgb2YgeG1sQ2hhcgogKgogKiByZWNlaXZpbmcgc29tZSBjaGFycyBmcm9tIHRoZSBwYXJzZXIuCiAqIFF1ZXN0aW9uOiBob3cgbXVjaCBhdCBhIHRpbWUgPz8/CiAqLwpzdGF0aWMgdm9pZApodG1sY2hhcmFjdGVyc0RlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICpjaCwgaW50IGxlbikKewogICAgdW5zaWduZWQgY2hhciBvdXRwdXRbNDBdOwogICAgaW50IGlubGVuID0gbGVuLCBvdXRsZW4gPSAzMDsKCiAgICBodG1sRW5jb2RlRW50aXRpZXMob3V0cHV0LCAmb3V0bGVuLCBjaCwgJmlubGVuLCAwKTsKICAgIG91dHB1dFtvdXRsZW5dID0gMDsKCiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmNoYXJhY3RlcnMoJXMsICVkKVxuIiwgb3V0cHV0LCBsZW4pOwp9CgovKioKICogaHRtbGNkYXRhRGVidWc6CiAqIEBjdHh0OiAgQW4gWE1MIHBhcnNlciBjb250ZXh0CiAqIEBjaDogIGEgeG1sQ2hhciBzdHJpbmcKICogQGxlbjogdGhlIG51bWJlciBvZiB4bWxDaGFyCiAqCiAqIHJlY2VpdmluZyBzb21lIGNkYXRhIGNoYXJzIGZyb20gdGhlIHBhcnNlci4KICogUXVlc3Rpb246IGhvdyBtdWNoIGF0IGEgdGltZSA/Pz8KICovCnN0YXRpYyB2b2lkCmh0bWxjZGF0YURlYnVnKHZvaWQgKmN0eCBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxDaGFyICpjaCwgaW50IGxlbikKewogICAgdW5zaWduZWQgY2hhciBvdXRwdXRbNDBdOwogICAgaW50IGlubGVuID0gbGVuLCBvdXRsZW4gPSAzMDsKCiAgICBodG1sRW5jb2RlRW50aXRpZXMob3V0cHV0LCAmb3V0bGVuLCBjaCwgJmlubGVuLCAwKTsKICAgIG91dHB1dFtvdXRsZW5dID0gMDsKCiAgICBmcHJpbnRmKFNBWGRlYnVnLCAiU0FYLmNkYXRhKCVzLCAlZClcbiIsIG91dHB1dCwgbGVuKTsKfQoKc3RhdGljIHhtbFNBWEhhbmRsZXIgZGVidWdIVE1MU0FYSGFuZGxlclN0cnVjdCA9IHsKICAgIGludGVybmFsU3Vic2V0RGVidWcsCiAgICBpc1N0YW5kYWxvbmVEZWJ1ZywKICAgIGhhc0ludGVybmFsU3Vic2V0RGVidWcsCiAgICBoYXNFeHRlcm5hbFN1YnNldERlYnVnLAogICAgcmVzb2x2ZUVudGl0eURlYnVnLAogICAgZ2V0RW50aXR5RGVidWcsCiAgICBlbnRpdHlEZWNsRGVidWcsCiAgICBub3RhdGlvbkRlY2xEZWJ1ZywKICAgIGF0dHJpYnV0ZURlY2xEZWJ1ZywKICAgIGVsZW1lbnREZWNsRGVidWcsCiAgICB1bnBhcnNlZEVudGl0eURlY2xEZWJ1ZywKICAgIHNldERvY3VtZW50TG9jYXRvckRlYnVnLAogICAgc3RhcnREb2N1bWVudERlYnVnLAogICAgZW5kRG9jdW1lbnREZWJ1ZywKICAgIGh0bWxzdGFydEVsZW1lbnREZWJ1ZywKICAgIGVuZEVsZW1lbnREZWJ1ZywKICAgIHJlZmVyZW5jZURlYnVnLAogICAgaHRtbGNoYXJhY3RlcnNEZWJ1ZywKICAgIGlnbm9yYWJsZVdoaXRlc3BhY2VEZWJ1ZywKICAgIHByb2Nlc3NpbmdJbnN0cnVjdGlvbkRlYnVnLAogICAgY29tbWVudERlYnVnLAogICAgd2FybmluZ0RlYnVnLAogICAgZXJyb3JEZWJ1ZywKICAgIGZhdGFsRXJyb3JEZWJ1ZywKICAgIGdldFBhcmFtZXRlckVudGl0eURlYnVnLAogICAgaHRtbGNkYXRhRGVidWcsCiAgICBleHRlcm5hbFN1YnNldERlYnVnLAogICAgMSwKICAgIE5VTEwsCiAgICBOVUxMLAogICAgTlVMTCwKICAgIE5VTEwKfTsKCnN0YXRpYyB4bWxTQVhIYW5kbGVyUHRyIGRlYnVnSFRNTFNBWEhhbmRsZXIgPSAmZGVidWdIVE1MU0FYSGFuZGxlclN0cnVjdDsKI2VuZGlmIC8qIExJQlhNTF9IVE1MX0VOQUJMRUQgKi8KCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECi8qKgogKiBzYXhQYXJzZVRlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gcGFyc2UKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlcwogKgogKiBQYXJzZSBhIGZpbGUgdXNpbmcgdGhlIFNBWCBBUEkgYW5kIGNoZWNrIGZvciBlcnJvcnMuCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50CnNheFBhcnNlVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqcmVzdWx0LAogICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyIEFUVFJJQlVURV9VTlVTRUQsCiAgICAgICAgICAgICBpbnQgb3B0aW9ucykgewogICAgaW50IHJldDsKICAgIGNoYXIgKnRlbXA7CgogICAgbmJfdGVzdHMrKzsKICAgIHRlbXAgPSByZXN1bHRGaWxlbmFtZShmaWxlbmFtZSwgIiIsICIucmVzIik7CiAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJvdXQgb2YgbWVtb3J5XG4iKTsKICAgICAgICBmYXRhbEVycm9yKCk7CiAgICB9CiAgICBTQVhkZWJ1ZyA9IGZvcGVuKHRlbXAsICJ3YiIpOwogICAgaWYgKFNBWGRlYnVnID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byB3cml0ZSB0byAlc1xuIiwgdGVtcCk7CglmcmVlKHRlbXApOwoJcmV0dXJuKC0xKTsKICAgIH0KCiAgICAvKiBmb3IgU0FYIHdlIHJlYWxseSB3YW50IHRoZSBjYWxsYmFja3MgdGhvdWdoIHRoZSBjb250ZXh0IGhhbmRsZXJzICovCiAgICB4bWxTZXRTdHJ1Y3R1cmVkRXJyb3JGdW5jKE5VTEwsIE5VTEwpOwogICAgeG1sU2V0R2VuZXJpY0Vycm9yRnVuYyhOVUxMLCB0ZXN0RXJyb3JIYW5kbGVyKTsKCiNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECiAgICBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9IVE1MKSB7CglodG1sU0FYUGFyc2VGaWxlKGZpbGVuYW1lLCBOVUxMLCBlbXB0eVNBWEhhbmRsZXIsIE5VTEwpOwoJcmV0ID0gMDsKICAgIH0gZWxzZQojZW5kaWYKICAgIHJldCA9IHhtbFNBWFVzZXJQYXJzZUZpbGUoZW1wdHlTQVhIYW5kbGVyLCBOVUxMLCBmaWxlbmFtZSk7CiAgICBpZiAocmV0ID09IFhNTF9XQVJfVU5ERUNMQVJFRF9FTlRJVFkpIHsKICAgICAgICBmcHJpbnRmKFNBWGRlYnVnLCAieG1sU0FYVXNlclBhcnNlRmlsZSByZXR1cm5lZCBlcnJvciAlZFxuIiwgcmV0KTsKICAgICAgICByZXQgPSAwOwogICAgfQogICAgaWYgKHJldCAhPSAwKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcGFyc2UgJXNcbiIsIGZpbGVuYW1lKTsKCXJldHVybigxKTsKICAgIH0KI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKICAgIGlmIChvcHRpb25zICYgWE1MX1BBUlNFX0hUTUwpIHsKCWh0bWxTQVhQYXJzZUZpbGUoZmlsZW5hbWUsIE5VTEwsIGRlYnVnSFRNTFNBWEhhbmRsZXIsIE5VTEwpOwoJcmV0ID0gMDsKICAgIH0gZWxzZQojZW5kaWYKICAgIGlmIChvcHRpb25zICYgWE1MX1BBUlNFX1NBWDEpIHsKCXJldCA9IHhtbFNBWFVzZXJQYXJzZUZpbGUoZGVidWdTQVhIYW5kbGVyLCBOVUxMLCBmaWxlbmFtZSk7CiAgICB9IGVsc2UgewoJcmV0ID0geG1sU0FYVXNlclBhcnNlRmlsZShkZWJ1Z1NBWDJIYW5kbGVyLCBOVUxMLCBmaWxlbmFtZSk7CiAgICB9CiAgICBpZiAocmV0ID09IFhNTF9XQVJfVU5ERUNMQVJFRF9FTlRJVFkpIHsKICAgICAgICBmcHJpbnRmKFNBWGRlYnVnLCAieG1sU0FYVXNlclBhcnNlRmlsZSByZXR1cm5lZCBlcnJvciAlZFxuIiwgcmV0KTsKICAgICAgICByZXQgPSAwOwogICAgfQogICAgZmNsb3NlKFNBWGRlYnVnKTsKICAgIGlmIChjb21wYXJlRmlsZXModGVtcCwgcmVzdWx0KSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiR290IGEgZGlmZmVyZW5jZSBmb3IgJXNcbiIsIGZpbGVuYW1lKTsKICAgICAgICByZXQgPSAxOwogICAgfQogICAgaWYgKHRlbXAgIT0gTlVMTCkgewogICAgICAgIHVubGluayh0ZW1wKTsKICAgICAgICBmcmVlKHRlbXApOwogICAgfQoKICAgIC8qIHN3aXRjaCBiYWNrIHRvIHN0cnVjdHVyZWQgZXJyb3IgaGFuZGxpbmcgKi8KICAgIHhtbFNldEdlbmVyaWNFcnJvckZ1bmMoTlVMTCwgTlVMTCk7CiAgICB4bWxTZXRTdHJ1Y3R1cmVkRXJyb3JGdW5jKE5VTEwsIHRlc3RTdHJ1Y3R1cmVkRXJyb3JIYW5kbGVyKTsKCiAgICByZXR1cm4ocmV0KTsKfQojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJCQkJCQkqCiAqCQlQYXJzZSB0byB0cmVlIGJhc2VkIHRlc3RzCQkJCSoKICoJCQkJCQkJCQkqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKgogKiBvbGRQYXJzZVRlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gcGFyc2UKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlczogdW51c2VkCiAqCiAqIFBhcnNlIGEgZmlsZSB1c2luZyB0aGUgb2xkIHhtbFBhcnNlRmlsZSBBUEksIHRoZW4gc2VyaWFsaXplIGJhY2sKICogcmVwYXJzZSB0aGUgcmVzdWx0IGFuZCBzZXJpYWxpemUgYWdhaW4sIHRoZW4gY2hlY2sgZm9yIGRldmlhdGlvbgogKiBpbiBzZXJpYWxpemF0aW9uLgogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludApvbGRQYXJzZVRlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnJlc3VsdCwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciBBVFRSSUJVVEVfVU5VU0VELAoJICAgICBpbnQgb3B0aW9ucyBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICB4bWxEb2NQdHIgZG9jOwogICAgY2hhciAqdGVtcDsKICAgIGludCByZXMgPSAwOwoKICAgIG5iX3Rlc3RzKys7CiAgICAvKgogICAgICogYmFzZSBvZiB0aGUgdGVzdCwgcGFyc2Ugd2l0aCB0aGUgb2xkIEFQSQogICAgICovCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECiAgICBkb2MgPSB4bWxQYXJzZUZpbGUoZmlsZW5hbWUpOwojZWxzZQogICAgZG9jID0geG1sUmVhZEZpbGUoZmlsZW5hbWUsIE5VTEwsIDApOwojZW5kaWYKICAgIGlmIChkb2MgPT0gTlVMTCkKICAgICAgICByZXR1cm4oMSk7CiAgICB0ZW1wID0gcmVzdWx0RmlsZW5hbWUoZmlsZW5hbWUsICIiLCAiLnJlcyIpOwogICAgaWYgKHRlbXAgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAib3V0IG9mIG1lbW9yeVxuIik7CiAgICAgICAgZmF0YWxFcnJvcigpOwogICAgfQogICAgeG1sU2F2ZUZpbGUodGVtcCwgZG9jKTsKICAgIGlmIChjb21wYXJlRmlsZXModGVtcCwgcmVzdWx0KSkgewogICAgICAgIHJlcyA9IDE7CiAgICB9CiAgICB4bWxGcmVlRG9jKGRvYyk7CgogICAgLyoKICAgICAqIFBhcnNlIHRoZSBzYXZlZCByZXN1bHQgdG8gbWFrZSBzdXJlIHRoZSByb3VuZCB0cmlwIGlzIG9rYXkKICAgICAqLwojaWZkZWYgTElCWE1MX1NBWDFfRU5BQkxFRAogICAgZG9jID0geG1sUGFyc2VGaWxlKHRlbXApOwojZWxzZQogICAgZG9jID0geG1sUmVhZEZpbGUodGVtcCwgTlVMTCwgMCk7CiNlbmRpZgogICAgaWYgKGRvYyA9PSBOVUxMKQogICAgICAgIHJldHVybigxKTsKICAgIHhtbFNhdmVGaWxlKHRlbXAsIGRvYyk7CiAgICBpZiAoY29tcGFyZUZpbGVzKHRlbXAsIHJlc3VsdCkpIHsKICAgICAgICByZXMgPSAxOwogICAgfQogICAgeG1sRnJlZURvYyhkb2MpOwoKICAgIGlmICh0ZW1wICE9IE5VTEwpIHsKICAgICAgICB1bmxpbmsodGVtcCk7CiAgICAgICAgZnJlZSh0ZW1wKTsKICAgIH0KICAgIHJldHVybihyZXMpOwp9CgojaWZkZWYgTElCWE1MX1BVU0hfRU5BQkxFRAovKioKICogcHVzaFBhcnNlVGVzdDoKICogQGZpbGVuYW1lOiB0aGUgZmlsZSB0byBwYXJzZQogKiBAcmVzdWx0OiB0aGUgZmlsZSB3aXRoIGV4cGVjdGVkIHJlc3VsdAogKiBAZXJyOiB0aGUgZmlsZSB3aXRoIGVycm9yIG1lc3NhZ2VzOiB1bnVzZWQKICoKICogUGFyc2UgYSBmaWxlIHVzaW5nIHRoZSBQdXNoIEFQSSwgdGhlbiBzZXJpYWxpemUgYmFjawogKiB0byBjaGVjayBmb3IgY29udGVudC4KICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKcHVzaFBhcnNlVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqcmVzdWx0LAogICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyIEFUVFJJQlVURV9VTlVTRUQsCgkgICAgIGludCBvcHRpb25zKSB7CiAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7CiAgICB4bWxEb2NQdHIgZG9jOwogICAgY29uc3QgY2hhciAqYmFzZTsKICAgIGludCBzaXplLCByZXM7CiAgICBpbnQgY3VyID0gMDsKCiAgICBuYl90ZXN0cysrOwogICAgLyoKICAgICAqIGxvYWQgdGhlIGRvY3VtZW50IGluIG1lbW9yeSBhbmQgd29yayBmcm9tIHRoZXJlLgogICAgICovCiAgICBpZiAobG9hZE1lbShmaWxlbmFtZSwgJmJhc2UsICZzaXplKSAhPSAwKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gbG9hZCAlc1xuIiwgZmlsZW5hbWUpOwoJcmV0dXJuKC0xKTsKICAgIH0KCiNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECiAgICBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9IVE1MKQoJY3R4dCA9IGh0bWxDcmVhdGVQdXNoUGFyc2VyQ3R4dChOVUxMLCBOVUxMLCBiYXNlICsgY3VyLCA0LCBmaWxlbmFtZSwKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX0NIQVJfRU5DT0RJTkdfTk9ORSk7CiAgICBlbHNlCiNlbmRpZgogICAgY3R4dCA9IHhtbENyZWF0ZVB1c2hQYXJzZXJDdHh0KE5VTEwsIE5VTEwsIGJhc2UgKyBjdXIsIDQsIGZpbGVuYW1lKTsKICAgIHhtbEN0eHRVc2VPcHRpb25zKGN0eHQsIG9wdGlvbnMpOwogICAgY3VyICs9IDQ7CiAgICB3aGlsZSAoY3VyIDwgc2l6ZSkgewogICAgICAgIGlmIChjdXIgKyAxMDI0ID49IHNpemUpIHsKI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKCSAgICBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9IVE1MKQoJCWh0bWxQYXJzZUNodW5rKGN0eHQsIGJhc2UgKyBjdXIsIHNpemUgLSBjdXIsIDEpOwoJICAgIGVsc2UKI2VuZGlmCgkgICAgeG1sUGFyc2VDaHVuayhjdHh0LCBiYXNlICsgY3VyLCBzaXplIC0gY3VyLCAxKTsKCSAgICBicmVhazsKCX0gZWxzZSB7CiNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECgkgICAgaWYgKG9wdGlvbnMgJiBYTUxfUEFSU0VfSFRNTCkKCQlodG1sUGFyc2VDaHVuayhjdHh0LCBiYXNlICsgY3VyLCAxMDI0LCAwKTsKCSAgICBlbHNlCiNlbmRpZgoJICAgIHhtbFBhcnNlQ2h1bmsoY3R4dCwgYmFzZSArIGN1ciwgMTAyNCwgMCk7CgkgICAgY3VyICs9IDEwMjQ7Cgl9CiAgICB9CiAgICBkb2MgPSBjdHh0LT5teURvYzsKI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKICAgIGlmIChvcHRpb25zICYgWE1MX1BBUlNFX0hUTUwpCiAgICAgICAgcmVzID0gMTsKICAgIGVsc2UKI2VuZGlmCiAgICByZXMgPSBjdHh0LT53ZWxsRm9ybWVkOwogICAgeG1sRnJlZVBhcnNlckN0eHQoY3R4dCk7CiAgICBmcmVlKChjaGFyICopYmFzZSk7CiAgICBpZiAoIXJlcykgewoJeG1sRnJlZURvYyhkb2MpOwoJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcGFyc2UgJXNcbiIsIGZpbGVuYW1lKTsKCXJldHVybigtMSk7CiAgICB9CiNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECiAgICBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9IVE1MKQoJaHRtbERvY0R1bXBNZW1vcnkoZG9jLCAoeG1sQ2hhciAqKikgJmJhc2UsICZzaXplKTsKICAgIGVsc2UKI2VuZGlmCiAgICB4bWxEb2NEdW1wTWVtb3J5KGRvYywgKHhtbENoYXIgKiopICZiYXNlLCAmc2l6ZSk7CiAgICB4bWxGcmVlRG9jKGRvYyk7CiAgICByZXMgPSBjb21wYXJlRmlsZU1lbShyZXN1bHQsIGJhc2UsIHNpemUpOwogICAgaWYgKChiYXNlID09IE5VTEwpIHx8IChyZXMgIT0gMCkpIHsKCWlmIChiYXNlICE9IE5VTEwpCgkgICAgeG1sRnJlZSgoY2hhciAqKWJhc2UpOwogICAgICAgIGZwcmludGYoc3RkZXJyLCAiUmVzdWx0IGZvciAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lKTsKCXJldHVybigtMSk7CiAgICB9CiAgICB4bWxGcmVlKChjaGFyICopYmFzZSk7CiAgICBpZiAoZXJyICE9IE5VTEwpIHsKCXJlcyA9IGNvbXBhcmVGaWxlTWVtKGVyciwgdGVzdEVycm9ycywgdGVzdEVycm9yc1NpemUpOwoJaWYgKHJlcyAhPSAwKSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBmb3IgJXMgZmFpbGVkXG4iLCBmaWxlbmFtZSk7CgkgICAgcmV0dXJuKC0xKTsKCX0KICAgIH0KICAgIHJldHVybigwKTsKfQojZW5kaWYKCi8qKgogKiBtZW1QYXJzZVRlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gcGFyc2UKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlczogdW51c2VkCiAqCiAqIFBhcnNlIGEgZmlsZSB1c2luZyB0aGUgb2xkIHhtbFJlYWRNZW1vcnkgQVBJLCB0aGVuIHNlcmlhbGl6ZSBiYWNrCiAqIHJlcGFyc2UgdGhlIHJlc3VsdCBhbmQgc2VyaWFsaXplIGFnYWluLCB0aGVuIGNoZWNrIGZvciBkZXZpYXRpb24KICogaW4gc2VyaWFsaXphdGlvbi4KICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKbWVtUGFyc2VUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpyZXN1bHQsCiAgICAgICAgICAgICBjb25zdCBjaGFyICplcnIgQVRUUklCVVRFX1VOVVNFRCwKCSAgICAgaW50IG9wdGlvbnMgQVRUUklCVVRFX1VOVVNFRCkgewogICAgeG1sRG9jUHRyIGRvYzsKICAgIGNvbnN0IGNoYXIgKmJhc2U7CiAgICBpbnQgc2l6ZSwgcmVzOwoKICAgIG5iX3Rlc3RzKys7CiAgICAvKgogICAgICogbG9hZCBhbmQgcGFyc2UgdGhlIG1lbW9yeQogICAgICovCiAgICBpZiAobG9hZE1lbShmaWxlbmFtZSwgJmJhc2UsICZzaXplKSAhPSAwKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gbG9hZCAlc1xuIiwgZmlsZW5hbWUpOwoJcmV0dXJuKC0xKTsKICAgIH0KCiAgICBkb2MgPSB4bWxSZWFkTWVtb3J5KGJhc2UsIHNpemUsIGZpbGVuYW1lLCBOVUxMLCAwKTsKICAgIHVubG9hZE1lbShiYXNlKTsKICAgIGlmIChkb2MgPT0gTlVMTCkgewogICAgICAgIHJldHVybigxKTsKICAgIH0KICAgIHhtbERvY0R1bXBNZW1vcnkoZG9jLCAoeG1sQ2hhciAqKikgJmJhc2UsICZzaXplKTsKICAgIHhtbEZyZWVEb2MoZG9jKTsKICAgIHJlcyA9IGNvbXBhcmVGaWxlTWVtKHJlc3VsdCwgYmFzZSwgc2l6ZSk7CiAgICBpZiAoKGJhc2UgPT0gTlVMTCkgfHwgKHJlcyAhPSAwKSkgewoJaWYgKGJhc2UgIT0gTlVMTCkKCSAgICB4bWxGcmVlKChjaGFyICopYmFzZSk7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJSZXN1bHQgZm9yICVzIGZhaWxlZFxuIiwgZmlsZW5hbWUpOwoJcmV0dXJuKC0xKTsKICAgIH0KICAgIHhtbEZyZWUoKGNoYXIgKiliYXNlKTsKICAgIHJldHVybigwKTsKfQoKLyoqCiAqIG5vZW50UGFyc2VUZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBmaWxlIHRvIHBhcnNlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXM6IHVudXNlZAogKgogKiBQYXJzZSBhIGZpbGUgd2l0aCBlbnRpdHkgcmVzb2x1dGlvbiwgdGhlbiBzZXJpYWxpemUgYmFjawogKiByZXBhcnNlIHRoZSByZXN1bHQgYW5kIHNlcmlhbGl6ZSBhZ2FpbiwgdGhlbiBjaGVjayBmb3IgZGV2aWF0aW9uCiAqIGluIHNlcmlhbGl6YXRpb24uCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50Cm5vZW50UGFyc2VUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpyZXN1bHQsCiAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciAgQVRUUklCVVRFX1VOVVNFRCwKCSAgICAgICBpbnQgb3B0aW9ucykgewogICAgeG1sRG9jUHRyIGRvYzsKICAgIGNoYXIgKnRlbXA7CiAgICBpbnQgcmVzID0gMDsKCiAgICBuYl90ZXN0cysrOwogICAgLyoKICAgICAqIGJhc2Ugb2YgdGhlIHRlc3QsIHBhcnNlIHdpdGggdGhlIG9sZCBBUEkKICAgICAqLwogICAgZG9jID0geG1sUmVhZEZpbGUoZmlsZW5hbWUsIE5VTEwsIG9wdGlvbnMpOwogICAgaWYgKGRvYyA9PSBOVUxMKQogICAgICAgIHJldHVybigxKTsKICAgIHRlbXAgPSByZXN1bHRGaWxlbmFtZShmaWxlbmFtZSwgIiIsICIucmVzIik7CiAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5XG4iKTsKICAgICAgICBmYXRhbEVycm9yKCk7CiAgICB9CiAgICB4bWxTYXZlRmlsZSh0ZW1wLCBkb2MpOwogICAgaWYgKGNvbXBhcmVGaWxlcyh0ZW1wLCByZXN1bHQpKSB7CiAgICAgICAgcmVzID0gMTsKICAgIH0KICAgIHhtbEZyZWVEb2MoZG9jKTsKCiAgICAvKgogICAgICogUGFyc2UgdGhlIHNhdmVkIHJlc3VsdCB0byBtYWtlIHN1cmUgdGhlIHJvdW5kIHRyaXAgaXMgb2theQogICAgICovCiAgICBkb2MgPSB4bWxSZWFkRmlsZShmaWxlbmFtZSwgTlVMTCwgb3B0aW9ucyk7CiAgICBpZiAoZG9jID09IE5VTEwpCiAgICAgICAgcmV0dXJuKDEpOwogICAgeG1sU2F2ZUZpbGUodGVtcCwgZG9jKTsKICAgIGlmIChjb21wYXJlRmlsZXModGVtcCwgcmVzdWx0KSkgewogICAgICAgIHJlcyA9IDE7CiAgICB9CiAgICB4bWxGcmVlRG9jKGRvYyk7CgogICAgaWYgKHRlbXAgIT0gTlVMTCkgewogICAgICAgIHVubGluayh0ZW1wKTsKICAgICAgICBmcmVlKHRlbXApOwogICAgfQogICAgcmV0dXJuKHJlcyk7Cn0KCi8qKgogKiBlcnJQYXJzZVRlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gcGFyc2UKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlcwogKgogKiBQYXJzZSBhIGZpbGUgdXNpbmcgdGhlIHhtbFJlYWRGaWxlIEFQSSBhbmQgY2hlY2sgZm9yIGVycm9ycy4KICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKZXJyUGFyc2VUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKmVyciwKICAgICAgICAgICAgIGludCBvcHRpb25zKSB7CiAgICB4bWxEb2NQdHIgZG9jOwogICAgY29uc3QgY2hhciAqYmFzZSA9IE5VTEw7CiAgICBpbnQgc2l6ZSwgcmVzID0gMDsKCiAgICBuYl90ZXN0cysrOwojaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAogICAgaWYgKG9wdGlvbnMgJiBYTUxfUEFSU0VfSFRNTCkgewogICAgICAgIGRvYyA9IGh0bWxSZWFkRmlsZShmaWxlbmFtZSwgTlVMTCwgb3B0aW9ucyk7CiAgICB9IGVsc2UKI2VuZGlmCiNpZmRlZiBMSUJYTUxfWElOQ0xVREVfRU5BQkxFRAogICAgaWYgKG9wdGlvbnMgJiBYTUxfUEFSU0VfWElOQ0xVREUpIHsKCWRvYyA9IHhtbFJlYWRGaWxlKGZpbGVuYW1lLCBOVUxMLCBvcHRpb25zKTsKCXhtbFhJbmNsdWRlUHJvY2Vzc0ZsYWdzKGRvYywgb3B0aW9ucyk7CiAgICB9IGVsc2UKI2VuZGlmCiAgICB7Cgl4bWxHZXRXYXJuaW5nc0RlZmF1bHRWYWx1ZSA9IDE7Cglkb2MgPSB4bWxSZWFkRmlsZShmaWxlbmFtZSwgTlVMTCwgb3B0aW9ucyk7CiAgICB9CiAgICB4bWxHZXRXYXJuaW5nc0RlZmF1bHRWYWx1ZSA9IDA7CiAgICBpZiAocmVzdWx0KSB7CglpZiAoZG9jID09IE5VTEwpIHsKCSAgICBiYXNlID0gIiI7CgkgICAgc2l6ZSA9IDA7Cgl9IGVsc2UgewojaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAoJICAgIGlmIChvcHRpb25zICYgWE1MX1BBUlNFX0hUTUwpIHsKCQlodG1sRG9jRHVtcE1lbW9yeShkb2MsICh4bWxDaGFyICoqKSAmYmFzZSwgJnNpemUpOwoJICAgIH0gZWxzZQojZW5kaWYKCSAgICB4bWxEb2NEdW1wTWVtb3J5KGRvYywgKHhtbENoYXIgKiopICZiYXNlLCAmc2l6ZSk7Cgl9CglyZXMgPSBjb21wYXJlRmlsZU1lbShyZXN1bHQsIGJhc2UsIHNpemUpOwogICAgfQogICAgaWYgKGRvYyAhPSBOVUxMKSB7CglpZiAoYmFzZSAhPSBOVUxMKQoJICAgIHhtbEZyZWUoKGNoYXIgKiliYXNlKTsKCXhtbEZyZWVEb2MoZG9jKTsKICAgIH0KICAgIGlmIChyZXMgIT0gMCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiUmVzdWx0IGZvciAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lKTsKCXJldHVybigtMSk7CiAgICB9CiAgICBpZiAoZXJyICE9IE5VTEwpIHsKCXJlcyA9IGNvbXBhcmVGaWxlTWVtKGVyciwgdGVzdEVycm9ycywgdGVzdEVycm9yc1NpemUpOwoJaWYgKHJlcyAhPSAwKSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBmb3IgJXMgZmFpbGVkXG4iLCBmaWxlbmFtZSk7CgkgICAgcmV0dXJuKC0xKTsKCX0KICAgIH0gZWxzZSBpZiAob3B0aW9ucyAmIFhNTF9QQVJTRV9EVERWQUxJRCkgewogICAgICAgIGlmICh0ZXN0RXJyb3JzU2l6ZSAhPSAwKQoJICAgIGZwcmludGYoc3RkZXJyLCAiVmFsaWRhdGlvbiBmb3IgJXMgZmFpbGVkXG4iLCBmaWxlbmFtZSk7CiAgICB9CgogICAgcmV0dXJuKDApOwp9CgojaWZkZWYgTElCWE1MX1JFQURFUl9FTkFCTEVECi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJCQkJCQkqCiAqCQlSZWFkZXIgYmFzZWQgdGVzdHMJCQkJCSoKICoJCQkJCQkJCQkqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCBwcm9jZXNzTm9kZShGSUxFICpvdXQsIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyKSB7CiAgICBjb25zdCB4bWxDaGFyICpuYW1lLCAqdmFsdWU7CiAgICBpbnQgdHlwZSwgZW1wdHk7CgogICAgdHlwZSA9IHhtbFRleHRSZWFkZXJOb2RlVHlwZShyZWFkZXIpOwogICAgZW1wdHkgPSB4bWxUZXh0UmVhZGVySXNFbXB0eUVsZW1lbnQocmVhZGVyKTsKCiAgICBuYW1lID0geG1sVGV4dFJlYWRlckNvbnN0TmFtZShyZWFkZXIpOwogICAgaWYgKG5hbWUgPT0gTlVMTCkKCW5hbWUgPSBCQURfQ0FTVCAiLS0iOwoKICAgIHZhbHVlID0geG1sVGV4dFJlYWRlckNvbnN0VmFsdWUocmVhZGVyKTsKCgogICAgZnByaW50ZihvdXQsICIlZCAlZCAlcyAlZCAlZCIsCgkgICAgeG1sVGV4dFJlYWRlckRlcHRoKHJlYWRlciksCgkgICAgdHlwZSwKCSAgICBuYW1lLAoJICAgIGVtcHR5LAoJICAgIHhtbFRleHRSZWFkZXJIYXNWYWx1ZShyZWFkZXIpKTsKICAgIGlmICh2YWx1ZSA9PSBOVUxMKQoJZnByaW50ZihvdXQsICJcbiIpOwogICAgZWxzZSB7CglmcHJpbnRmKG91dCwgIiAlc1xuIiwgdmFsdWUpOwogICAgfQp9CnN0YXRpYyBpbnQKc3RyZWFtUHJvY2Vzc1Rlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqZXJyLAogICAgICAgICAgICAgICAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlciwgY29uc3QgY2hhciAqcm5nKSB7CiAgICBpbnQgcmV0OwogICAgY2hhciAqdGVtcCA9IE5VTEw7CiAgICBGSUxFICp0ID0gTlVMTDsKCiAgICBpZiAocmVhZGVyID09IE5VTEwpCiAgICAgICAgcmV0dXJuKC0xKTsKCiAgICBuYl90ZXN0cysrOwogICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7Cgl0ZW1wID0gcmVzdWx0RmlsZW5hbWUoZmlsZW5hbWUsICIiLCAiLnJlcyIpOwoJaWYgKHRlbXAgPT0gTlVMTCkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiT3V0IG9mIG1lbW9yeVxuIik7CgkgICAgZmF0YWxFcnJvcigpOwoJfQoJdCA9IGZvcGVuKHRlbXAsICJ3YiIpOwoJaWYgKHQgPT0gTlVMTCkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3Qgb3BlbiB0ZW1wIGZpbGUgJXNcbiIsIHRlbXApOwoJICAgIGZyZWUodGVtcCk7CgkgICAgcmV0dXJuKC0xKTsKCX0KICAgIH0KI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKICAgIGlmIChybmcgIT0gTlVMTCkgewoJcmV0ID0geG1sVGV4dFJlYWRlclJlbGF4TkdWYWxpZGF0ZShyZWFkZXIsIHJuZyk7CglpZiAocmV0IDwgMCkgewoJICAgIHRlc3RFcnJvckhhbmRsZXIoTlVMTCwgIlJlbGF4LU5HIHNjaGVtYSAlcyBmYWlsZWQgdG8gY29tcGlsZVxuIiwKCSAgICAgICAgICAgICAgICAgICAgIHJuZyk7CgkgICAgZmNsb3NlKHQpOwogICAgICAgICAgICBpZiAodGVtcCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICB1bmxpbmsodGVtcCk7CiAgICAgICAgICAgICAgICBmcmVlKHRlbXApOwogICAgICAgICAgICB9CgkgICAgcmV0dXJuKDApOwoJfQogICAgfQojZW5kaWYKICAgIHhtbEdldFdhcm5pbmdzRGVmYXVsdFZhbHVlID0gMTsKICAgIHJldCA9IHhtbFRleHRSZWFkZXJSZWFkKHJlYWRlcik7CiAgICB3aGlsZSAocmV0ID09IDEpIHsKCWlmICgodCAhPSBOVUxMKSAmJiAocm5nID09IE5VTEwpKQoJICAgIHByb2Nlc3NOb2RlKHQsIHJlYWRlcik7CiAgICAgICAgcmV0ID0geG1sVGV4dFJlYWRlclJlYWQocmVhZGVyKTsKICAgIH0KICAgIGlmIChyZXQgIT0gMCkgewogICAgICAgIHRlc3RFcnJvckhhbmRsZXIoTlVMTCwgIiVzIDogZmFpbGVkIHRvIHBhcnNlXG4iLCBmaWxlbmFtZSk7CiAgICB9CiAgICBpZiAocm5nICE9IE5VTEwpIHsKICAgICAgICBpZiAoeG1sVGV4dFJlYWRlcklzVmFsaWQocmVhZGVyKSAhPSAxKSB7CgkgICAgdGVzdEVycm9ySGFuZGxlcihOVUxMLCAiJXMgZmFpbHMgdG8gdmFsaWRhdGVcbiIsIGZpbGVuYW1lKTsKCX0gZWxzZSB7CgkgICAgdGVzdEVycm9ySGFuZGxlcihOVUxMLCAiJXMgdmFsaWRhdGVzXG4iLCBmaWxlbmFtZSk7Cgl9CiAgICB9CiAgICB4bWxHZXRXYXJuaW5nc0RlZmF1bHRWYWx1ZSA9IDA7CiAgICBpZiAodCAhPSBOVUxMKSB7CiAgICAgICAgZmNsb3NlKHQpOwoJcmV0ID0gY29tcGFyZUZpbGVzKHRlbXAsIHJlc3VsdCk7CiAgICAgICAgaWYgKHRlbXAgIT0gTlVMTCkgewogICAgICAgICAgICB1bmxpbmsodGVtcCk7CiAgICAgICAgICAgIGZyZWUodGVtcCk7CiAgICAgICAgfQoJaWYgKHJldCkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiUmVzdWx0IGZvciAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lKTsKCSAgICByZXR1cm4oLTEpOwoJfQogICAgfQogICAgaWYgKGVyciAhPSBOVUxMKSB7CglyZXQgPSBjb21wYXJlRmlsZU1lbShlcnIsIHRlc3RFcnJvcnMsIHRlc3RFcnJvcnNTaXplKTsKCWlmIChyZXQgIT0gMCkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZm9yICVzIGZhaWxlZFxuIiwgZmlsZW5hbWUpOwoJICAgIHByaW50ZigiJXMiLCB0ZXN0RXJyb3JzKTsKCSAgICByZXR1cm4oLTEpOwoJfQogICAgfQoKICAgIHJldHVybigwKTsKfQoKLyoqCiAqIHN0cmVhbVBhcnNlVGVzdDoKICogQGZpbGVuYW1lOiB0aGUgZmlsZSB0byBwYXJzZQogKiBAcmVzdWx0OiB0aGUgZmlsZSB3aXRoIGV4cGVjdGVkIHJlc3VsdAogKiBAZXJyOiB0aGUgZmlsZSB3aXRoIGVycm9yIG1lc3NhZ2VzCiAqCiAqIFBhcnNlIGEgZmlsZSB1c2luZyB0aGUgcmVhZGVyIEFQSSBhbmQgY2hlY2sgZm9yIGVycm9ycy4KICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKc3RyZWFtUGFyc2VUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKmVyciwKICAgICAgICAgICAgICAgIGludCBvcHRpb25zKSB7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsKICAgIGludCByZXQ7CgogICAgcmVhZGVyID0geG1sUmVhZGVyRm9yRmlsZShmaWxlbmFtZSwgTlVMTCwgb3B0aW9ucyk7CiAgICByZXQgPSBzdHJlYW1Qcm9jZXNzVGVzdChmaWxlbmFtZSwgcmVzdWx0LCBlcnIsIHJlYWRlciwgTlVMTCk7CiAgICB4bWxGcmVlVGV4dFJlYWRlcihyZWFkZXIpOwogICAgcmV0dXJuKHJldCk7Cn0KCi8qKgogKiB3YWxrZXJQYXJzZVRlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gcGFyc2UKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlcwogKgogKiBQYXJzZSBhIGZpbGUgdXNpbmcgdGhlIHdhbGtlciwgaS5lLiBhIHJlYWRlciBidWlsdCBmcm9tIGEgYXRyZWUuCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50CndhbGtlclBhcnNlVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICplcnIsCiAgICAgICAgICAgICAgICBpbnQgb3B0aW9ucykgewogICAgeG1sRG9jUHRyIGRvYzsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOwogICAgaW50IHJldDsKCiAgICBkb2MgPSB4bWxSZWFkRmlsZShmaWxlbmFtZSwgTlVMTCwgb3B0aW9ucyk7CiAgICBpZiAoZG9jID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBwYXJzZSAlc1xuIiwgZmlsZW5hbWUpOwoJcmV0dXJuKC0xKTsKICAgIH0KICAgIHJlYWRlciA9IHhtbFJlYWRlcldhbGtlcihkb2MpOwogICAgcmV0ID0gc3RyZWFtUHJvY2Vzc1Rlc3QoZmlsZW5hbWUsIHJlc3VsdCwgZXJyLCByZWFkZXIsIE5VTEwpOwogICAgeG1sRnJlZVRleHRSZWFkZXIocmVhZGVyKTsKICAgIHhtbEZyZWVEb2MoZG9jKTsKICAgIHJldHVybihyZXQpOwp9CgovKioKICogc3RyZWFtTWVtUGFyc2VUZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBmaWxlIHRvIHBhcnNlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXMKICoKICogUGFyc2UgYSBmaWxlIHVzaW5nIHRoZSByZWFkZXIgQVBJIGZyb20gbWVtb3J5IGFuZCBjaGVjayBmb3IgZXJyb3JzLgogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludApzdHJlYW1NZW1QYXJzZVRlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqZXJyLAogICAgICAgICAgICAgICAgICAgaW50IG9wdGlvbnMpIHsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOwogICAgaW50IHJldDsKICAgIGNvbnN0IGNoYXIgKmJhc2U7CiAgICBpbnQgc2l6ZTsKCiAgICAvKgogICAgICogbG9hZCBhbmQgcGFyc2UgdGhlIG1lbW9yeQogICAgICovCiAgICBpZiAobG9hZE1lbShmaWxlbmFtZSwgJmJhc2UsICZzaXplKSAhPSAwKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gbG9hZCAlc1xuIiwgZmlsZW5hbWUpOwoJcmV0dXJuKC0xKTsKICAgIH0KICAgIHJlYWRlciA9IHhtbFJlYWRlckZvck1lbW9yeShiYXNlLCBzaXplLCBmaWxlbmFtZSwgTlVMTCwgb3B0aW9ucyk7CiAgICByZXQgPSBzdHJlYW1Qcm9jZXNzVGVzdChmaWxlbmFtZSwgcmVzdWx0LCBlcnIsIHJlYWRlciwgTlVMTCk7CiAgICBmcmVlKChjaGFyICopYmFzZSk7CiAgICB4bWxGcmVlVGV4dFJlYWRlcihyZWFkZXIpOwogICAgcmV0dXJuKHJldCk7Cn0KI2VuZGlmCgojaWZkZWYgTElCWE1MX1hQQVRIX0VOQUJMRUQKI2lmZGVmIExJQlhNTF9ERUJVR19FTkFCTEVECi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJCQkJCQkqCiAqCQlYUGF0aCBhbmQgWFBvaW50ZXIgYmFzZWQgdGVzdHMJCQkJKgogKgkJCQkJCQkJCSoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBGSUxFICp4cGF0aE91dHB1dDsKc3RhdGljIHhtbERvY1B0ciB4cGF0aERvY3VtZW50OwoKc3RhdGljIHZvaWQKdGVzdFhQYXRoKGNvbnN0IGNoYXIgKnN0ciwgaW50IHhwdHIsIGludCBleHByKSB7CiAgICB4bWxYUGF0aE9iamVjdFB0ciByZXM7CiAgICB4bWxYUGF0aENvbnRleHRQdHIgY3R4dDsKCiAgICBuYl90ZXN0cysrOwojaWYgZGVmaW5lZChMSUJYTUxfWFBUUl9FTkFCTEVEKQogICAgaWYgKHhwdHIpIHsKCWN0eHQgPSB4bWxYUHRyTmV3Q29udGV4dCh4cGF0aERvY3VtZW50LCBOVUxMLCBOVUxMKTsKCXJlcyA9IHhtbFhQdHJFdmFsKEJBRF9DQVNUIHN0ciwgY3R4dCk7CiAgICB9IGVsc2UgewojZW5kaWYKCWN0eHQgPSB4bWxYUGF0aE5ld0NvbnRleHQoeHBhdGhEb2N1bWVudCk7CgljdHh0LT5ub2RlID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoeHBhdGhEb2N1bWVudCk7CglpZiAoZXhwcikKCSAgICByZXMgPSB4bWxYUGF0aEV2YWxFeHByZXNzaW9uKEJBRF9DQVNUIHN0ciwgY3R4dCk7CgllbHNlIHsKCSAgICAvKiByZXMgPSB4bWxYUGF0aEV2YWwoQkFEX0NBU1Qgc3RyLCBjdHh0KTsgKi8KCSAgICB4bWxYUGF0aENvbXBFeHByUHRyIGNvbXA7CgoJICAgIGNvbXAgPSB4bWxYUGF0aENvbXBpbGUoQkFEX0NBU1Qgc3RyKTsKCSAgICBpZiAoY29tcCAhPSBOVUxMKSB7CgkJcmVzID0geG1sWFBhdGhDb21waWxlZEV2YWwoY29tcCwgY3R4dCk7CgkJeG1sWFBhdGhGcmVlQ29tcEV4cHIoY29tcCk7CgkgICAgfSBlbHNlCgkJcmVzID0gTlVMTDsKCX0KI2lmIGRlZmluZWQoTElCWE1MX1hQVFJfRU5BQkxFRCkKICAgIH0KI2VuZGlmCiAgICB4bWxYUGF0aERlYnVnRHVtcE9iamVjdCh4cGF0aE91dHB1dCwgcmVzLCAwKTsKICAgIHhtbFhQYXRoRnJlZU9iamVjdChyZXMpOwogICAgeG1sWFBhdGhGcmVlQ29udGV4dChjdHh0KTsKfQoKLyoqCiAqIHhwYXRoRXhwclRlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gcGFyc2UKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlcwogKgogKiBQYXJzZSBhIGZpbGUgY29udGFpbmluZyBYUGF0aCBzdGFuZGFsb25lIGV4cHJlc3Npb25zIGFuZCBldmFsdWF0ZSB0aGVtCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50CnhwYXRoQ29tbW9uVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqcmVzdWx0LAogICAgICAgICAgICAgICAgaW50IHhwdHIsIGludCBleHByKSB7CiAgICBGSUxFICppbnB1dDsKICAgIGNoYXIgZXhwcmVzc2lvbls1MDAwXTsKICAgIGludCBsZW4sIHJldCA9IDA7CiAgICBjaGFyICp0ZW1wOwoKICAgIHRlbXAgPSByZXN1bHRGaWxlbmFtZShmaWxlbmFtZSwgIiIsICIucmVzIik7CiAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5XG4iKTsKICAgICAgICBmYXRhbEVycm9yKCk7CiAgICB9CiAgICB4cGF0aE91dHB1dCA9IGZvcGVuKHRlbXAsICJ3YiIpOwogICAgaWYgKHhwYXRoT3V0cHV0ID09IE5VTEwpIHsKCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsIHRlbXApOwogICAgICAgIGZyZWUodGVtcCk7CglyZXR1cm4oLTEpOwogICAgfQoKICAgIGlucHV0ID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpOwogICAgaWYgKGlucHV0ID09IE5VTEwpIHsKICAgICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKCQkiQ2Fubm90IG9wZW4gJXMgZm9yIHJlYWRpbmdcbiIsIGZpbGVuYW1lKTsKICAgICAgICBmcmVlKHRlbXApOwoJcmV0dXJuKC0xKTsKICAgIH0KICAgIHdoaWxlIChmZ2V0cyhleHByZXNzaW9uLCA0NTAwLCBpbnB1dCkgIT0gTlVMTCkgewoJbGVuID0gc3RybGVuKGV4cHJlc3Npb24pOwoJbGVuLS07Cgl3aGlsZSAoKGxlbiA+PSAwKSAmJgoJICAgICAgICgoZXhwcmVzc2lvbltsZW5dID09ICdcbicpIHx8IChleHByZXNzaW9uW2xlbl0gPT0gJ1x0JykgfHwKCQkoZXhwcmVzc2lvbltsZW5dID09ICdccicpIHx8IChleHByZXNzaW9uW2xlbl0gPT0gJyAnKSkpIGxlbi0tOwoJZXhwcmVzc2lvbltsZW4gKyAxXSA9IDA7CglpZiAobGVuID49IDApIHsKCSAgICBmcHJpbnRmKHhwYXRoT3V0cHV0LAoJICAgICAgICAgICAgIlxuPT09PT09PT09PT09PT09PT09PT09PT09XG5FeHByZXNzaW9uOiAlc1xuIiwKCQkgICAgZXhwcmVzc2lvbikgOwoJICAgIHRlc3RYUGF0aChleHByZXNzaW9uLCB4cHRyLCBleHByKTsKCX0KICAgIH0KCiAgICBmY2xvc2UoaW5wdXQpOwogICAgZmNsb3NlKHhwYXRoT3V0cHV0KTsKICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgewoJcmV0ID0gY29tcGFyZUZpbGVzKHRlbXAsIHJlc3VsdCk7CglpZiAocmV0KSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJSZXN1bHQgZm9yICVzIGZhaWxlZFxuIiwgZmlsZW5hbWUpOwoJfQogICAgfQoKICAgIGlmICh0ZW1wICE9IE5VTEwpIHsKICAgICAgICB1bmxpbmsodGVtcCk7CiAgICAgICAgZnJlZSh0ZW1wKTsKICAgIH0KICAgIHJldHVybihyZXQpOwp9CgovKioKICogeHBhdGhFeHByVGVzdDoKICogQGZpbGVuYW1lOiB0aGUgZmlsZSB0byBwYXJzZQogKiBAcmVzdWx0OiB0aGUgZmlsZSB3aXRoIGV4cGVjdGVkIHJlc3VsdAogKiBAZXJyOiB0aGUgZmlsZSB3aXRoIGVycm9yIG1lc3NhZ2VzCiAqCiAqIFBhcnNlIGEgZmlsZSBjb250YWluaW5nIFhQYXRoIHN0YW5kYWxvbmUgZXhwcmVzc2lvbnMgYW5kIGV2YWx1YXRlIHRoZW0KICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKeHBhdGhFeHByVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqcmVzdWx0LAogICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICAgIGludCBvcHRpb25zIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybih4cGF0aENvbW1vblRlc3QoZmlsZW5hbWUsIHJlc3VsdCwgMCwgMSkpOwp9CgovKioKICogeHBhdGhEb2NUZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBmaWxlIHRvIHBhcnNlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXMKICoKICogUGFyc2UgYSBmaWxlIGNvbnRhaW5pbmcgWFBhdGggZXhwcmVzc2lvbnMgYW5kIGV2YWx1YXRlIHRoZW0gYWdhaW5zdAogKiBhIHNldCBvZiBjb3JyZXNwb25kaW5nIGRvY3VtZW50cy4KICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKeHBhdGhEb2NUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogICAgICAgICAgICAgY29uc3QgY2hhciAqcmVzdWwgQVRUUklCVVRFX1VOVVNFRCwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICAgaW50IG9wdGlvbnMpIHsKCiAgICBjaGFyIHBhdHRlcm5bNTAwXTsKICAgIGNoYXIgcmVzdWx0WzUwMF07CiAgICBnbG9iX3QgZ2xvYmJ1ZjsKICAgIHNpemVfdCBpOwogICAgaW50IHJldCA9IDAsIHJlczsKCiAgICB4cGF0aERvY3VtZW50ID0geG1sUmVhZEZpbGUoZmlsZW5hbWUsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyB8IFhNTF9QQVJTRV9EVERBVFRSIHwgWE1MX1BBUlNFX05PRU5UKTsKICAgIGlmICh4cGF0aERvY3VtZW50ID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBsb2FkICVzXG4iLCBmaWxlbmFtZSk7CglyZXR1cm4oLTEpOwogICAgfQoKICAgIHNucHJpbnRmKHBhdHRlcm4sIDQ5OSwgIi4vdGVzdC9YUGF0aC90ZXN0cy8lcyoiLCBiYXNlRmlsZW5hbWUoZmlsZW5hbWUpKTsKICAgIHBhdHRlcm5bNDk5XSA9IDA7CiAgICBnbG9iYnVmLmdsX29mZnMgPSAwOwogICAgZ2xvYihwYXR0ZXJuLCBHTE9CX0RPT0ZGUywgTlVMTCwgJmdsb2JidWYpOwogICAgZm9yIChpID0gMDtpIDwgZ2xvYmJ1Zi5nbF9wYXRoYztpKyspIHsKICAgICAgICBzbnByaW50ZihyZXN1bHQsIDQ5OSwgInJlc3VsdC9YUGF0aC90ZXN0cy8lcyIsCgkgICAgICAgICBiYXNlRmlsZW5hbWUoZ2xvYmJ1Zi5nbF9wYXRodltpXSkpOwoJcmVzID0geHBhdGhDb21tb25UZXN0KGdsb2JidWYuZ2xfcGF0aHZbaV0sICZyZXN1bHRbMF0sIDAsIDApOwoJaWYgKHJlcyAhPSAwKQoJICAgIHJldCA9IHJlczsKICAgIH0KICAgIGdsb2JmcmVlKCZnbG9iYnVmKTsKCiAgICB4bWxGcmVlRG9jKHhwYXRoRG9jdW1lbnQpOwogICAgcmV0dXJuKHJldCk7Cn0KCiNpZmRlZiBMSUJYTUxfWFBUUl9FTkFCTEVECi8qKgogKiB4cHRyRG9jVGVzdDoKICogQGZpbGVuYW1lOiB0aGUgZmlsZSB0byBwYXJzZQogKiBAcmVzdWx0OiB0aGUgZmlsZSB3aXRoIGV4cGVjdGVkIHJlc3VsdAogKiBAZXJyOiB0aGUgZmlsZSB3aXRoIGVycm9yIG1lc3NhZ2VzCiAqCiAqIFBhcnNlIGEgZmlsZSBjb250YWluaW5nIFhQYXRoIGV4cHJlc3Npb25zIGFuZCBldmFsdWF0ZSB0aGVtIGFnYWluc3QKICogYSBzZXQgb2YgY29ycmVzcG9uZGluZyBkb2N1bWVudHMuCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50CnhwdHJEb2NUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bCBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICBjb25zdCBjaGFyICplcnIgQVRUUklCVVRFX1VOVVNFRCwKICAgICAgICAgICAgaW50IG9wdGlvbnMpIHsKCiAgICBjaGFyIHBhdHRlcm5bNTAwXTsKICAgIGNoYXIgcmVzdWx0WzUwMF07CiAgICBnbG9iX3QgZ2xvYmJ1ZjsKICAgIHNpemVfdCBpOwogICAgaW50IHJldCA9IDAsIHJlczsKCiAgICB4cGF0aERvY3VtZW50ID0geG1sUmVhZEZpbGUoZmlsZW5hbWUsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyB8IFhNTF9QQVJTRV9EVERBVFRSIHwgWE1MX1BBUlNFX05PRU5UKTsKICAgIGlmICh4cGF0aERvY3VtZW50ID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBsb2FkICVzXG4iLCBmaWxlbmFtZSk7CglyZXR1cm4oLTEpOwogICAgfQoKICAgIHNucHJpbnRmKHBhdHRlcm4sIDQ5OSwgIi4vdGVzdC9YUGF0aC94cHRyLyVzKiIsIGJhc2VGaWxlbmFtZShmaWxlbmFtZSkpOwogICAgcGF0dGVybls0OTldID0gMDsKICAgIGdsb2JidWYuZ2xfb2ZmcyA9IDA7CiAgICBnbG9iKHBhdHRlcm4sIEdMT0JfRE9PRkZTLCBOVUxMLCAmZ2xvYmJ1Zik7CiAgICBmb3IgKGkgPSAwO2kgPCBnbG9iYnVmLmdsX3BhdGhjO2krKykgewogICAgICAgIHNucHJpbnRmKHJlc3VsdCwgNDk5LCAicmVzdWx0L1hQYXRoL3hwdHIvJXMiLAoJICAgICAgICAgYmFzZUZpbGVuYW1lKGdsb2JidWYuZ2xfcGF0aHZbaV0pKTsKCXJlcyA9IHhwYXRoQ29tbW9uVGVzdChnbG9iYnVmLmdsX3BhdGh2W2ldLCAmcmVzdWx0WzBdLCAxLCAwKTsKCWlmIChyZXMgIT0gMCkKCSAgICByZXQgPSByZXM7CiAgICB9CiAgICBnbG9iZnJlZSgmZ2xvYmJ1Zik7CgogICAgeG1sRnJlZURvYyh4cGF0aERvY3VtZW50KTsKICAgIHJldHVybihyZXQpOwp9CiNlbmRpZiAvKiBMSUJYTUxfWFBUUl9FTkFCTEVEICovCgovKioKICogeG1saWREb2NUZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBmaWxlIHRvIHBhcnNlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXMKICoKICogUGFyc2UgYSBmaWxlIGNvbnRhaW5pbmcgeG1sOmlkIGFuZCBjaGVjayBmb3IgZXJyb3JzIGFuZCB2ZXJpZnkKICogdGhhdCBYUGF0aCBxdWVyaWVzIHdpbGwgd29yayBvbiB0aGVtIGFzIGV4cGVjdGVkLgogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludAp4bWxpZERvY1Rlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bHQsCiAgICAgICAgICAgICBjb25zdCBjaGFyICplcnIsCiAgICAgICAgICAgICBpbnQgb3B0aW9ucykgewoKICAgIGludCByZXMgPSAwOwogICAgaW50IHJldCA9IDA7CiAgICBjaGFyICp0ZW1wOwoKICAgIHhwYXRoRG9jdW1lbnQgPSB4bWxSZWFkRmlsZShmaWxlbmFtZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zIHwgWE1MX1BBUlNFX0RUREFUVFIgfCBYTUxfUEFSU0VfTk9FTlQpOwogICAgaWYgKHhwYXRoRG9jdW1lbnQgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGxvYWQgJXNcbiIsIGZpbGVuYW1lKTsKCXJldHVybigtMSk7CiAgICB9CgogICAgdGVtcCA9IHJlc3VsdEZpbGVuYW1lKGZpbGVuYW1lLCAiIiwgIi5yZXMiKTsKICAgIGlmICh0ZW1wID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk91dCBvZiBtZW1vcnlcbiIpOwogICAgICAgIGZhdGFsRXJyb3IoKTsKICAgIH0KICAgIHhwYXRoT3V0cHV0ID0gZm9wZW4odGVtcCwgIndiIik7CiAgICBpZiAoeHBhdGhPdXRwdXQgPT0gTlVMTCkgewoJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSAlc1xuIiwgdGVtcCk7CiAgICAgICAgeG1sRnJlZURvYyh4cGF0aERvY3VtZW50KTsKICAgICAgICBmcmVlKHRlbXApOwoJcmV0dXJuKC0xKTsKICAgIH0KCiAgICB0ZXN0WFBhdGgoImlkKCdiYXInKSIsIDAsIDApOwoKICAgIGZjbG9zZSh4cGF0aE91dHB1dCk7CiAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKCXJldCA9IGNvbXBhcmVGaWxlcyh0ZW1wLCByZXN1bHQpOwoJaWYgKHJldCkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiUmVzdWx0IGZvciAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lKTsKCSAgICByZXMgPSAxOwoJfQogICAgfQoKICAgIGlmICh0ZW1wICE9IE5VTEwpIHsKICAgICAgICB1bmxpbmsodGVtcCk7CiAgICAgICAgZnJlZSh0ZW1wKTsKICAgIH0KICAgIHhtbEZyZWVEb2MoeHBhdGhEb2N1bWVudCk7CgogICAgaWYgKGVyciAhPSBOVUxMKSB7CglyZXQgPSBjb21wYXJlRmlsZU1lbShlcnIsIHRlc3RFcnJvcnMsIHRlc3RFcnJvcnNTaXplKTsKCWlmIChyZXQgIT0gMCkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZm9yICVzIGZhaWxlZFxuIiwgZmlsZW5hbWUpOwoJICAgIHJlcyA9IDE7Cgl9CiAgICB9CiAgICByZXR1cm4ocmVzKTsKfQoKI2VuZGlmIC8qIExJQlhNTF9ERUJVR19FTkFCTEVEICovCiNlbmRpZiAvKiBYUEFUSCAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJCQkJCQkJKgogKgkJCVVSSSBiYXNlZCB0ZXN0cwkJCQkJKgogKgkJCQkJCQkJCSoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkCmhhbmRsZVVSSShjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmJhc2UsIEZJTEUgKm8pIHsKICAgIGludCByZXQ7CiAgICB4bWxVUklQdHIgdXJpOwogICAgeG1sQ2hhciAqcmVzID0gTlVMTDsKCiAgICB1cmkgPSB4bWxDcmVhdGVVUkkoKTsKCiAgICBpZiAoYmFzZSA9PSBOVUxMKSB7CglyZXQgPSB4bWxQYXJzZVVSSVJlZmVyZW5jZSh1cmksIHN0cik7CglpZiAocmV0ICE9IDApCgkgICAgZnByaW50ZihvLCAiJXMgOiBlcnJvciAlZFxuIiwgc3RyLCByZXQpOwoJZWxzZSB7CgkgICAgeG1sTm9ybWFsaXplVVJJUGF0aCh1cmktPnBhdGgpOwoJICAgIHhtbFByaW50VVJJKG8sIHVyaSk7CgkgICAgZnByaW50ZihvLCAiXG4iKTsKCX0KICAgIH0gZWxzZSB7CglyZXMgPSB4bWxCdWlsZFVSSSgoeG1sQ2hhciAqKXN0ciwgKHhtbENoYXIgKikgYmFzZSk7CglpZiAocmVzICE9IE5VTEwpIHsKCSAgICBmcHJpbnRmKG8sICIlc1xuIiwgKGNoYXIgKikgcmVzKTsKCX0KCWVsc2UKCSAgICBmcHJpbnRmKG8sICI6OkVSUk9SOjpcbiIpOwogICAgfQogICAgaWYgKHJlcyAhPSBOVUxMKQoJeG1sRnJlZShyZXMpOwogICAgeG1sRnJlZVVSSSh1cmkpOwp9CgovKioKICogdXJpQ29tbW9uVGVzdDoKICogQGZpbGVuYW1lOiB0aGUgZmlsZSB0byBwYXJzZQogKiBAcmVzdWx0OiB0aGUgZmlsZSB3aXRoIGV4cGVjdGVkIHJlc3VsdAogKiBAZXJyOiB0aGUgZmlsZSB3aXRoIGVycm9yIG1lc3NhZ2VzCiAqCiAqIFBhcnNlIGEgZmlsZSBjb250YWluaW5nIFVSSSBhbmQgY2hlY2sgZm9yIGVycm9ycwogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludAp1cmlDb21tb25UZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogICAgICAgICAgICAgY29uc3QgY2hhciAqcmVzdWx0LAogICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyLAogICAgICAgICAgICAgY29uc3QgY2hhciAqYmFzZSkgewogICAgY2hhciAqdGVtcDsKICAgIEZJTEUgKm8sICpmOwogICAgY2hhciBzdHJbMTAyNF07CiAgICBpbnQgcmVzID0gMCwgaSwgcmV0OwoKICAgIHRlbXAgPSByZXN1bHRGaWxlbmFtZShmaWxlbmFtZSwgIiIsICIucmVzIik7CiAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5XG4iKTsKICAgICAgICBmYXRhbEVycm9yKCk7CiAgICB9CiAgICBvID0gZm9wZW4odGVtcCwgIndiIik7CiAgICBpZiAobyA9PSBOVUxMKSB7CglmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlICVzXG4iLCB0ZW1wKTsKICAgICAgICBmcmVlKHRlbXApOwoJcmV0dXJuKC0xKTsKICAgIH0KICAgIGYgPSBmb3BlbihmaWxlbmFtZSwgInJiIik7CiAgICBpZiAoZiA9PSBOVUxMKSB7CglmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBvcGVuIGlucHV0IGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKCWZjbG9zZShvKTsKICAgICAgICBpZiAodGVtcCAhPSBOVUxMKSB7CiAgICAgICAgICAgIHVubGluayh0ZW1wKTsKICAgICAgICAgICAgZnJlZSh0ZW1wKTsKICAgICAgICB9CglyZXR1cm4oLTEpOwogICAgfQoKICAgIHdoaWxlICgxKSB7CgkvKgoJICogcmVhZCBvbmUgbGluZSBpbiBzdHJpbmcgYnVmZmVyLgoJICovCglpZiAoZmdldHMgKCZzdHJbMF0sIHNpemVvZiAoc3RyKSAtIDEsIGYpID09IE5VTEwpCgkgICBicmVhazsKCgkvKgoJICogcmVtb3ZlIHRoZSBlbmRpbmcgc3BhY2VzCgkgKi8KCWkgPSBzdHJsZW4oc3RyKTsKCXdoaWxlICgoaSA+IDApICYmCgkgICAgICAgKChzdHJbaSAtIDFdID09ICdcbicpIHx8IChzdHJbaSAtIDFdID09ICdccicpIHx8CgkJKHN0cltpIC0gMV0gPT0gJyAnKSB8fCAoc3RyW2kgLSAxXSA9PSAnXHQnKSkpIHsKCSAgICBpLS07CgkgICAgc3RyW2ldID0gMDsKCX0KCW5iX3Rlc3RzKys7CgloYW5kbGVVUkkoc3RyLCBiYXNlLCBvKTsKICAgIH0KCiAgICBmY2xvc2UoZik7CiAgICBmY2xvc2Uobyk7CgogICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7CglyZXQgPSBjb21wYXJlRmlsZXModGVtcCwgcmVzdWx0KTsKCWlmIChyZXQpIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgIlJlc3VsdCBmb3IgJXMgZmFpbGVkXG4iLCBmaWxlbmFtZSk7CgkgICAgcmVzID0gMTsKCX0KICAgIH0KICAgIGlmIChlcnIgIT0gTlVMTCkgewoJcmV0ID0gY29tcGFyZUZpbGVNZW0oZXJyLCB0ZXN0RXJyb3JzLCB0ZXN0RXJyb3JzU2l6ZSk7CglpZiAocmV0ICE9IDApIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGZvciAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lKTsKCSAgICByZXMgPSAxOwoJfQogICAgfQoKICAgIGlmICh0ZW1wICE9IE5VTEwpIHsKICAgICAgICB1bmxpbmsodGVtcCk7CiAgICAgICAgZnJlZSh0ZW1wKTsKICAgIH0KICAgIHJldHVybihyZXMpOwp9CgovKioKICogdXJpUGFyc2VUZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBmaWxlIHRvIHBhcnNlCiAqIEByZXN1bHQ6IHRoZSBmaWxlIHdpdGggZXhwZWN0ZWQgcmVzdWx0CiAqIEBlcnI6IHRoZSBmaWxlIHdpdGggZXJyb3IgbWVzc2FnZXMKICoKICogUGFyc2UgYSBmaWxlIGNvbnRhaW5pbmcgVVJJIGFuZCBjaGVjayBmb3IgZXJyb3JzCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50CnVyaVBhcnNlVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlc3VsdCwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciwKICAgICAgICAgICAgIGludCBvcHRpb25zIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybih1cmlDb21tb25UZXN0KGZpbGVuYW1lLCByZXN1bHQsIGVyciwgTlVMTCkpOwp9CgovKioKICogdXJpQmFzZVRlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gcGFyc2UKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlcwogKgogKiBQYXJzZSBhIGZpbGUgY29udGFpbmluZyBVUkksIGNvbXBvc2UgdGhlbSBhZ2FpbnN0IGEgZml4ZWQgYmFzZSBhbmQKICogY2hlY2sgZm9yIGVycm9ycwogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludAp1cmlCYXNlVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlc3VsdCwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciwKICAgICAgICAgICAgIGludCBvcHRpb25zIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybih1cmlDb21tb25UZXN0KGZpbGVuYW1lLCByZXN1bHQsIGVyciwKICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vZm9vLmNvbS9wYXRoL3RvL2luZGV4Lmh0bWw/b3JpZyNoZWxwIikpOwp9CgpzdGF0aWMgaW50IHVyaXBfc3VjY2VzcyA9IDE7CnN0YXRpYyBpbnQgdXJpcF9jdXJyZW50ID0gMDsKc3RhdGljIGNvbnN0IGNoYXIgKnVyaXBfdGVzdFVSTHNbXSA9IHsKICAgICJ1cmlwOi8vZXhhbXBsZS5jb20vYSBiLmh0bWwiLAogICAgInVyaXA6Ly9leGFtcGxlLmNvbS9hJTIwYi5odG1sIiwKICAgICJmaWxlOi8vL3BhdGgvdG8vYSBiLmh0bWwiLAogICAgImZpbGU6Ly8vcGF0aC90by9hJTIwYi5odG1sIiwKICAgICIvcGF0aC90by9hIGIuaHRtbCIsCiAgICAiL3BhdGgvdG8vYSUyMGIuaHRtbCIsCiAgICAidXJpcDovL2V4YW1wbGUuY29tL3Lpc3Vt6S5odG1sIiwKICAgICJ1cmlwOi8vZXhhbXBsZS5jb20vdGVzdD9hPTEmYj0yJTI2MyZjPTQjZm9vIiwKICAgIE5VTEwKfTsKc3RhdGljIGNvbnN0IGNoYXIgKnVyaXBfcmN2c1VSTHNbXSA9IHsKICAgIC8qIGl0IGlzIGFuIFVSSSB0aGUgc3RyaW5ncyBtdXN0IGJlIGVzY2FwZWQgKi8KICAgICJ1cmlwOi8vZXhhbXBsZS5jb20vYSUyMGIuaHRtbCIsCiAgICAvKiBjaGVjayB0aGF0ICUgZXNjYXBpbmcgaXMgbm90IGJyb2tlbiAqLwogICAgInVyaXA6Ly9leGFtcGxlLmNvbS9hJTIwYi5odG1sIiwKICAgIC8qIGl0J3MgYW4gVVJJIHBhdGggdGhlIHN0cmluZ3MgbXVzdCBiZSBlc2NhcGVkICovCiAgICAiZmlsZTovLy9wYXRoL3RvL2ElMjBiLmh0bWwiLAogICAgLyogY2hlY2sgdGhhdCAlIGVzY2FwaW5nIGlzIG5vdCBicm9rZW4gKi8KICAgICJmaWxlOi8vL3BhdGgvdG8vYSUyMGIuaHRtbCIsCiAgICAvKiB0aGlzIGlzIG5vdCBhbiBVUkksIHRoaXMgaXMgYSBwYXRoLCBzbyB0aGlzIHNob3VsZCBub3QgYmUgZXNjYXBlZCAqLwogICAgIi9wYXRoL3RvL2EgYi5odG1sIiwKICAgIC8qIGNoZWNrIHRoYXQgcGF0aHMgd2l0aCAlIGFyZSBub3QgYnJva2VuICovCiAgICAiL3BhdGgvdG8vYSUyMGIuaHRtbCIsCiAgICAvKiBvdXQgb2YgY29udGV4dCB0aGUgZW5jb2RpbmcgY2FuJ3QgYmUgZ3Vlc3NlZCBieXRlIGJ5IGJ5dGUgY29udmVyc2lvbiAqLwogICAgInVyaXA6Ly9leGFtcGxlLmNvbS9yJUU5c3VtJUU5Lmh0bWwiLAogICAgLyogdmVyaWZ5IHdlIGRvbid0IGRlc3Ryb3kgVVJJcyBlc3BlY2lhbGx5IHRoZSBxdWVyeSBwYXJ0ICovCiAgICAidXJpcDovL2V4YW1wbGUuY29tL3Rlc3Q/YT0xJmI9MiUyNjMmYz00I2ZvbyIsCiAgICBOVUxMCn07CnN0YXRpYyBjb25zdCBjaGFyICp1cmlwX3JlcyA9ICI8bGlzdC8+IjsKc3RhdGljIGNvbnN0IGNoYXIgKnVyaXBfY3VyID0gTlVMTDsKc3RhdGljIGludCB1cmlwX3JsZW47CgovKioKICogdXJpcE1hdGNoOgogKiBAVVJJOiBhbiBVUkkgdG8gdGVzdAogKgogKiBDaGVjayBmb3IgYW4gdXJpcDogcXVlcnkKICoKICogUmV0dXJucyAxIGlmIHllcyBhbmQgMCBpZiBhbm90aGVyIElucHV0IG1vZHVsZSBzaG91bGQgYmUgdXNlZAogKi8Kc3RhdGljIGludAp1cmlwTWF0Y2goY29uc3QgY2hhciAqIFVSSSkgewogICAgaWYgKChVUkkgPT0gTlVMTCkgfHwgKCFzdHJjbXAoVVJJLCAiZmlsZTovLy9ldGMveG1sL2NhdGFsb2ciKSkpCiAgICAgICAgcmV0dXJuKDApOwogICAgLyogVmVyaWZ5IHdlIHJlY2VpdmVkIHRoZSBlc2NhcGVkIFVSTCAqLwogICAgaWYgKHN0cmNtcCh1cmlwX3JjdnNVUkxzW3VyaXBfY3VycmVudF0sIFVSSSkpCgl1cmlwX3N1Y2Nlc3MgPSAwOwogICAgcmV0dXJuKDEpOwp9CgovKioKICogdXJpcE9wZW46CiAqIEBVUkk6IGFuIFVSSSB0byB0ZXN0CiAqCiAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHVyaXA6IHF1ZXJ5IGhhbmRsZXIsIGluIHRoaXMgZXhhbXBsZSBzaW1wbHkKICogdGhlIHVyaXBfY3VycmVudCBwb2ludGVyLi4uCiAqCiAqIFJldHVybnMgYW4gSW5wdXQgY29udGV4dCBvciBOVUxMIGluIGNhc2Ugb3IgZXJyb3IKICovCnN0YXRpYyB2b2lkICoKdXJpcE9wZW4oY29uc3QgY2hhciAqIFVSSSkgewogICAgaWYgKChVUkkgPT0gTlVMTCkgfHwgKCFzdHJjbXAoVVJJLCAiZmlsZTovLy9ldGMveG1sL2NhdGFsb2ciKSkpCiAgICAgICAgcmV0dXJuKE5VTEwpOwogICAgLyogVmVyaWZ5IHdlIHJlY2VpdmVkIHRoZSBlc2NhcGVkIFVSTCAqLwogICAgaWYgKHN0cmNtcCh1cmlwX3JjdnNVUkxzW3VyaXBfY3VycmVudF0sIFVSSSkpCgl1cmlwX3N1Y2Nlc3MgPSAwOwogICAgdXJpcF9jdXIgPSB1cmlwX3JlczsKICAgIHVyaXBfcmxlbiA9IHN0cmxlbih1cmlwX3Jlcyk7CiAgICByZXR1cm4oKHZvaWQgKikgdXJpcF9jdXIpOwp9CgovKioKICogdXJpcENsb3NlOgogKiBAY29udGV4dDogdGhlIHJlYWQgY29udGV4dAogKgogKiBDbG9zZSB0aGUgdXJpcDogcXVlcnkgaGFuZGxlcgogKgogKiBSZXR1cm5zIDAgb3IgLTEgaW4gY2FzZSBvZiBlcnJvcgogKi8Kc3RhdGljIGludAp1cmlwQ2xvc2Uodm9pZCAqIGNvbnRleHQpIHsKICAgIGlmIChjb250ZXh0ID09IE5VTEwpIHJldHVybigtMSk7CiAgICB1cmlwX2N1ciA9IE5VTEw7CiAgICB1cmlwX3JsZW4gPSAwOwogICAgcmV0dXJuKDApOwp9CgovKioKICogdXJpcFJlYWQ6CiAqIEBjb250ZXh0OiB0aGUgcmVhZCBjb250ZXh0CiAqIEBidWZmZXI6IHdoZXJlIHRvIHN0b3JlIGRhdGEKICogQGxlbjogbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKICoKICogSW1wbGVtZW50IGFuIHVyaXA6IHF1ZXJ5IHJlYWQuCiAqCiAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IKICovCnN0YXRpYyBpbnQKdXJpcFJlYWQodm9pZCAqIGNvbnRleHQsIGNoYXIgKiBidWZmZXIsIGludCBsZW4pIHsKICAgY29uc3QgY2hhciAqcHRyID0gKGNvbnN0IGNoYXIgKikgY29udGV4dDsKCiAgIGlmICgoY29udGV4dCA9PSBOVUxMKSB8fCAoYnVmZmVyID09IE5VTEwpIHx8IChsZW4gPCAwKSkKICAgICAgIHJldHVybigtMSk7CgogICBpZiAobGVuID4gdXJpcF9ybGVuKSBsZW4gPSB1cmlwX3JsZW47CiAgIG1lbWNweShidWZmZXIsIHB0ciwgbGVuKTsKICAgdXJpcF9ybGVuIC09IGxlbjsKICAgcmV0dXJuKGxlbik7Cn0KCnN0YXRpYyBpbnQKdXJpcF9jaGVja1VSTChjb25zdCBjaGFyICpVUkwpIHsKICAgIHhtbERvY1B0ciBkb2M7CgogICAgZG9jID0geG1sUmVhZEZpbGUoVVJMLCBOVUxMLCAwKTsKICAgIGlmIChkb2MgPT0gTlVMTCkKICAgICAgICByZXR1cm4oLTEpOwogICAgeG1sRnJlZURvYyhkb2MpOwogICAgcmV0dXJuKDEpOwp9CgovKioKICogdXJpUGF0aFRlc3Q6CiAqIEBmaWxlbmFtZTogaWdub3JlZAogKiBAcmVzdWx0OiBpZ25vcmVkCiAqIEBlcnI6IGlnbm9yZWQKICoKICogUnVuIGEgc2V0IG9mIHRlc3RzIHRvIGNoZWNrIGhvdyBQYXRoIGFuZCBVUkkgYXJlIGhhbmRsZWQgYmVmb3JlCiAqIGJlaW5nIHBhc3NlZCB0byB0aGUgSS9PIGxheWVyCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50CnVyaVBhdGhUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lIEFUVFJJQlVURV9VTlVTRUQsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bHQgQVRUUklCVVRFX1VOVVNFRCwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICAgaW50IG9wdGlvbnMgQVRUUklCVVRFX1VOVVNFRCkgewogICAgaW50IHBhcnNlZDsKICAgIGludCBmYWlsdXJlcyA9IDA7CgogICAgLyoKICAgICAqIHJlZ2lzdGVyIHRoZSBuZXcgSS9PIGhhbmRsZXJzCiAgICAgKi8KICAgIGlmICh4bWxSZWdpc3RlcklucHV0Q2FsbGJhY2tzKHVyaXBNYXRjaCwgdXJpcE9wZW4sIHVyaXBSZWFkLCB1cmlwQ2xvc2UpIDwgMCkKICAgIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byByZWdpc3RlciBIVFRQIGhhbmRsZXJcbiIpOwoJcmV0dXJuKC0xKTsKICAgIH0KCiAgICBmb3IgKHVyaXBfY3VycmVudCA9IDA7dXJpcF90ZXN0VVJMc1t1cmlwX2N1cnJlbnRdICE9IE5VTEw7dXJpcF9jdXJyZW50KyspIHsKICAgICAgICB1cmlwX3N1Y2Nlc3MgPSAxOwogICAgICAgIHBhcnNlZCA9IHVyaXBfY2hlY2tVUkwodXJpcF90ZXN0VVJMc1t1cmlwX2N1cnJlbnRdKTsKCWlmICh1cmlwX3N1Y2Nlc3MgIT0gMSkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRoZSBVUkwgcGFzc2luZyB0ZXN0IGZvciAlcyIsCgkgICAgICAgICAgICB1cmlwX3Rlc3RVUkxzW3VyaXBfY3VycmVudF0pOwoJICAgIGZhaWx1cmVzKys7Cgl9IGVsc2UgaWYgKHBhcnNlZCAhPSAxKSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdGhlIHBhcnNpbmcgdGVzdCBmb3IgJXMiLAoJICAgICAgICAgICAgdXJpcF90ZXN0VVJMc1t1cmlwX2N1cnJlbnRdKTsKCSAgICBmYWlsdXJlcysrOwoJfQoJbmJfdGVzdHMrKzsKICAgIH0KCiAgICB4bWxQb3BJbnB1dENhbGxiYWNrcygpOwogICAgcmV0dXJuKGZhaWx1cmVzKTsKfQoKI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQkJCQkJCSoKICoJCQlTY2hlbWFzIHRlc3RzCQkJCQkqCiAqCQkJCQkJCQkJKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgaW50CnNjaGVtYXNPbmVUZXN0KGNvbnN0IGNoYXIgKnNjaCwKICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCiAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlc3VsdCwKCSAgICAgICBjb25zdCBjaGFyICplcnIsCgkgICAgICAgaW50IG9wdGlvbnMsCgkgICAgICAgeG1sU2NoZW1hUHRyIHNjaGVtYXMpIHsKICAgIHhtbERvY1B0ciBkb2M7CiAgICB4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dDsKICAgIGludCByZXQgPSAwOwogICAgaW50IHZhbGlkUmVzdWx0ID0gMDsKICAgIGNoYXIgKnRlbXA7CiAgICBGSUxFICpzY2hlbWFzT3V0cHV0OwoKICAgIGRvYyA9IHhtbFJlYWRGaWxlKGZpbGVuYW1lLCBOVUxMLCBvcHRpb25zKTsKICAgIGlmIChkb2MgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIHBhcnNlIGluc3RhbmNlICVzIGZvciAlc1xuIiwgZmlsZW5hbWUsIHNjaCk7CglyZXR1cm4oLTEpOwogICAgfQoKICAgIHRlbXAgPSByZXN1bHRGaWxlbmFtZShyZXN1bHQsICIiLCAiLnJlcyIpOwogICAgaWYgKHRlbXAgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiT3V0IG9mIG1lbW9yeVxuIik7CiAgICAgICAgZmF0YWxFcnJvcigpOwogICAgfQogICAgc2NoZW1hc091dHB1dCA9IGZvcGVuKHRlbXAsICJ3YiIpOwogICAgaWYgKHNjaGVtYXNPdXRwdXQgPT0gTlVMTCkgewoJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSAlc1xuIiwgdGVtcCk7Cgl4bWxGcmVlRG9jKGRvYyk7CiAgICAgICAgZnJlZSh0ZW1wKTsKCXJldHVybigtMSk7CiAgICB9CgogICAgY3R4dCA9IHhtbFNjaGVtYU5ld1ZhbGlkQ3R4dChzY2hlbWFzKTsKICAgIHhtbFNjaGVtYVNldFZhbGlkRXJyb3JzKGN0eHQsCiAgICAgICAgICh4bWxTY2hlbWFWYWxpZGl0eUVycm9yRnVuYykgdGVzdEVycm9ySGFuZGxlciwKICAgICAgICAgKHhtbFNjaGVtYVZhbGlkaXR5V2FybmluZ0Z1bmMpIHRlc3RFcnJvckhhbmRsZXIsCgkgY3R4dCk7CiAgICB2YWxpZFJlc3VsdCA9IHhtbFNjaGVtYVZhbGlkYXRlRG9jKGN0eHQsIGRvYyk7CiAgICBpZiAodmFsaWRSZXN1bHQgPT0gMCkgewoJZnByaW50ZihzY2hlbWFzT3V0cHV0LCAiJXMgdmFsaWRhdGVzXG4iLCBmaWxlbmFtZSk7CiAgICB9IGVsc2UgaWYgKHZhbGlkUmVzdWx0ID4gMCkgewoJZnByaW50ZihzY2hlbWFzT3V0cHV0LCAiJXMgZmFpbHMgdG8gdmFsaWRhdGVcbiIsIGZpbGVuYW1lKTsKICAgIH0gZWxzZSB7CglmcHJpbnRmKHNjaGVtYXNPdXRwdXQsICIlcyB2YWxpZGF0aW9uIGdlbmVyYXRlZCBhbiBpbnRlcm5hbCBlcnJvclxuIiwKCSAgICAgICBmaWxlbmFtZSk7CiAgICB9CiAgICBmY2xvc2Uoc2NoZW1hc091dHB1dCk7CiAgICBpZiAocmVzdWx0KSB7CglpZiAoY29tcGFyZUZpbGVzKHRlbXAsIHJlc3VsdCkpIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgIlJlc3VsdCBmb3IgJXMgb24gJXMgZmFpbGVkXG4iLCBmaWxlbmFtZSwgc2NoKTsKCSAgICByZXQgPSAxOwoJfQogICAgfQogICAgaWYgKHRlbXAgIT0gTlVMTCkgewogICAgICAgIHVubGluayh0ZW1wKTsKICAgICAgICBmcmVlKHRlbXApOwogICAgfQoKICAgIGlmICgodmFsaWRSZXN1bHQgIT0gMCkgJiYgKGVyciAhPSBOVUxMKSkgewoJaWYgKGNvbXBhcmVGaWxlTWVtKGVyciwgdGVzdEVycm9ycywgdGVzdEVycm9yc1NpemUpKSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBmb3IgJXMgb24gJXMgZmFpbGVkXG4iLCBmaWxlbmFtZSwgc2NoKTsKCSAgICByZXQgPSAxOwoJfQogICAgfQoKICAgIHhtbFNjaGVtYUZyZWVWYWxpZEN0eHQoY3R4dCk7CiAgICB4bWxGcmVlRG9jKGRvYyk7CiAgICByZXR1cm4ocmV0KTsKfQovKioKICogc2NoZW1hc1Rlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIHNjaGVtYXMgZmlsZQogKiBAcmVzdWx0OiB0aGUgZmlsZSB3aXRoIGV4cGVjdGVkIHJlc3VsdAogKiBAZXJyOiB0aGUgZmlsZSB3aXRoIGVycm9yIG1lc3NhZ2VzCiAqCiAqIFBhcnNlIGEgZmlsZSBjb250YWluaW5nIFVSSSwgY29tcG9zZSB0aGVtIGFnYWluc3QgYSBmaXhlZCBiYXNlIGFuZAogKiBjaGVjayBmb3IgZXJyb3JzCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50CnNjaGVtYXNUZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bCBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICBjb25zdCBjaGFyICplcnJyIEFUVFJJQlVURV9VTlVTRUQsCiAgICAgICAgICAgIGludCBvcHRpb25zKSB7CiAgICBjb25zdCBjaGFyICpiYXNlID0gYmFzZUZpbGVuYW1lKGZpbGVuYW1lKTsKICAgIGNvbnN0IGNoYXIgKmJhc2UyOwogICAgY29uc3QgY2hhciAqaW5zdGFuY2U7CiAgICB4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQ7CiAgICB4bWxTY2hlbWFQdHIgc2NoZW1hczsKICAgIGludCByZXMgPSAwLCBsZW4sIHJldDsKICAgIGNoYXIgcGF0dGVybls1MDBdOwogICAgY2hhciBwcmVmaXhbNTAwXTsKICAgIGNoYXIgcmVzdWx0WzUwMF07CiAgICBjaGFyIGVycls1MDBdOwogICAgZ2xvYl90IGdsb2JidWY7CiAgICBzaXplX3QgaTsKICAgIGNoYXIgY291bnQgPSAwOwoKICAgIC8qIGZpcnN0IGNvbXBpbGUgdGhlIHNjaGVtYXMgaWYgcG9zc2libGUgKi8KICAgIGN0eHQgPSB4bWxTY2hlbWFOZXdQYXJzZXJDdHh0KGZpbGVuYW1lKTsKICAgIHhtbFNjaGVtYVNldFBhcnNlckVycm9ycyhjdHh0LAogICAgICAgICAoeG1sU2NoZW1hVmFsaWRpdHlFcnJvckZ1bmMpIHRlc3RFcnJvckhhbmRsZXIsCiAgICAgICAgICh4bWxTY2hlbWFWYWxpZGl0eVdhcm5pbmdGdW5jKSB0ZXN0RXJyb3JIYW5kbGVyLAoJIGN0eHQpOwogICAgc2NoZW1hcyA9IHhtbFNjaGVtYVBhcnNlKGN0eHQpOwogICAgeG1sU2NoZW1hRnJlZVBhcnNlckN0eHQoY3R4dCk7CgogICAgLyoKICAgICAqIG1vc3Qgb2YgdGhlIG1lc3MgaXMgYWJvdXQgdGhlIG91dHB1dCBmaWxlbmFtZXMgZ2VuZXJhdGVkIGJ5IHRoZSBNYWtlZmlsZQogICAgICovCiAgICBsZW4gPSBzdHJsZW4oYmFzZSk7CiAgICBpZiAoKGxlbiA+IDQ5OSkgfHwgKGxlbiA8IDUpKSB7CiAgICAgICAgeG1sU2NoZW1hRnJlZShzY2hlbWFzKTsKCXJldHVybigtMSk7CiAgICB9CiAgICBsZW4gLT0gNDsgLyogcmVtb3ZlIHRyYWlsaW5nIC54c2QgKi8KICAgIGlmIChiYXNlW2xlbiAtIDJdID09ICdfJykgewogICAgICAgIGxlbiAtPSAyOyAvKiByZW1vdmUgc3VidGVzdCBudW1iZXIgKi8KICAgIH0KICAgIGlmIChiYXNlW2xlbiAtIDJdID09ICdfJykgewogICAgICAgIGxlbiAtPSAyOyAvKiByZW1vdmUgc3VidGVzdCBudW1iZXIgKi8KICAgIH0KICAgIG1lbWNweShwcmVmaXgsIGJhc2UsIGxlbik7CiAgICBwcmVmaXhbbGVuXSA9IDA7CgogICAgc25wcmludGYocGF0dGVybiwgNDk5LCAiLi90ZXN0L3NjaGVtYXMvJXNfPy54bWwiLCBwcmVmaXgpOwogICAgcGF0dGVybls0OTldID0gMDsKCiAgICBpZiAoYmFzZVtsZW5dID09ICdfJykgewogICAgICAgIGxlbiArPSAyOwoJbWVtY3B5KHByZWZpeCwgYmFzZSwgbGVuKTsKCXByZWZpeFtsZW5dID0gMDsKICAgIH0KCiAgICBnbG9iYnVmLmdsX29mZnMgPSAwOwogICAgZ2xvYihwYXR0ZXJuLCBHTE9CX0RPT0ZGUywgTlVMTCwgJmdsb2JidWYpOwogICAgZm9yIChpID0gMDtpIDwgZ2xvYmJ1Zi5nbF9wYXRoYztpKyspIHsKICAgICAgICB0ZXN0RXJyb3JzU2l6ZSA9IDA7Cgl0ZXN0RXJyb3JzWzBdID0gMDsKICAgICAgICBpbnN0YW5jZSA9IGdsb2JidWYuZ2xfcGF0aHZbaV07CgliYXNlMiA9IGJhc2VGaWxlbmFtZShpbnN0YW5jZSk7CglsZW4gPSBzdHJsZW4oYmFzZTIpOwoJaWYgKChsZW4gPiA2KSAmJiAoYmFzZTJbbGVuIC0gNl0gPT0gJ18nKSkgewoJICAgIGNvdW50ID0gYmFzZTJbbGVuIC0gNV07CgkgICAgc25wcmludGYocmVzdWx0LCA0OTksICJyZXN1bHQvc2NoZW1hcy8lc18lYyIsCgkJICAgICBwcmVmaXgsIGNvdW50KTsKCSAgICByZXN1bHRbNDk5XSA9IDA7CgkgICAgc25wcmludGYoZXJyLCA0OTksICJyZXN1bHQvc2NoZW1hcy8lc18lYy5lcnIiLAoJCSAgICAgcHJlZml4LCBjb3VudCk7CgkgICAgZXJyWzQ5OV0gPSAwOwoJfSBlbHNlIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgImRvbid0IGtub3cgaG93IHRvIHByb2Nlc3MgJXNcbiIsIGluc3RhbmNlKTsKCSAgICBjb250aW51ZTsKCX0KCWlmIChzY2hlbWFzID09IE5VTEwpIHsKCX0gZWxzZSB7CgkgICAgbmJfdGVzdHMrKzsKCSAgICByZXQgPSBzY2hlbWFzT25lVGVzdChmaWxlbmFtZSwgaW5zdGFuY2UsIHJlc3VsdCwgZXJyLAoJICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMsIHNjaGVtYXMpOwoJICAgIGlmIChyZXQgIT0gMCkKCQlyZXMgPSByZXQ7Cgl9CiAgICB9CiAgICBnbG9iZnJlZSgmZ2xvYmJ1Zik7CiAgICB4bWxTY2hlbWFGcmVlKHNjaGVtYXMpOwoKICAgIHJldHVybihyZXMpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJCQkJCQkJKgogKgkJCVNjaGVtYXMgdGVzdHMJCQkJCSoKICoJCQkJCQkJCQkqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBpbnQKcm5nT25lVGVzdChjb25zdCBjaGFyICpzY2gsCiAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bHQsCgkgICAgICAgY29uc3QgY2hhciAqZXJyLAoJICAgICAgIGludCBvcHRpb25zLAoJICAgICAgIHhtbFJlbGF4TkdQdHIgc2NoZW1hcykgewogICAgeG1sRG9jUHRyIGRvYzsKICAgIHhtbFJlbGF4TkdWYWxpZEN0eHRQdHIgY3R4dDsKICAgIGludCByZXQgPSAwOwogICAgY2hhciAqdGVtcDsKICAgIEZJTEUgKnNjaGVtYXNPdXRwdXQ7CgogICAgZG9jID0geG1sUmVhZEZpbGUoZmlsZW5hbWUsIE5VTEwsIG9wdGlvbnMpOwogICAgaWYgKGRvYyA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gcGFyc2UgaW5zdGFuY2UgJXMgZm9yICVzXG4iLCBmaWxlbmFtZSwgc2NoKTsKCXJldHVybigtMSk7CiAgICB9CgogICAgdGVtcCA9IHJlc3VsdEZpbGVuYW1lKHJlc3VsdCwgIiIsICIucmVzIik7CiAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5XG4iKTsKICAgICAgICBmYXRhbEVycm9yKCk7CiAgICB9CiAgICBzY2hlbWFzT3V0cHV0ID0gZm9wZW4odGVtcCwgIndiIik7CiAgICBpZiAoc2NoZW1hc091dHB1dCA9PSBOVUxMKSB7CglmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlICVzXG4iLCB0ZW1wKTsKCXhtbEZyZWVEb2MoZG9jKTsKICAgICAgICBmcmVlKHRlbXApOwoJcmV0dXJuKC0xKTsKICAgIH0KCiAgICBjdHh0ID0geG1sUmVsYXhOR05ld1ZhbGlkQ3R4dChzY2hlbWFzKTsKICAgIHhtbFJlbGF4TkdTZXRWYWxpZEVycm9ycyhjdHh0LAogICAgICAgICAoeG1sUmVsYXhOR1ZhbGlkaXR5RXJyb3JGdW5jKSB0ZXN0RXJyb3JIYW5kbGVyLAogICAgICAgICAoeG1sUmVsYXhOR1ZhbGlkaXR5V2FybmluZ0Z1bmMpIHRlc3RFcnJvckhhbmRsZXIsCgkgY3R4dCk7CiAgICByZXQgPSB4bWxSZWxheE5HVmFsaWRhdGVEb2MoY3R4dCwgZG9jKTsKICAgIGlmIChyZXQgPT0gMCkgewoJdGVzdEVycm9ySGFuZGxlcihOVUxMLCAiJXMgdmFsaWRhdGVzXG4iLCBmaWxlbmFtZSk7CiAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKCXRlc3RFcnJvckhhbmRsZXIoTlVMTCwgIiVzIGZhaWxzIHRvIHZhbGlkYXRlXG4iLCBmaWxlbmFtZSk7CiAgICB9IGVsc2UgewoJdGVzdEVycm9ySGFuZGxlcihOVUxMLCAiJXMgdmFsaWRhdGlvbiBnZW5lcmF0ZWQgYW4gaW50ZXJuYWwgZXJyb3JcbiIsCgkgICAgICAgZmlsZW5hbWUpOwogICAgfQogICAgZmNsb3NlKHNjaGVtYXNPdXRwdXQpOwogICAgcmV0ID0gMDsKICAgIGlmIChyZXN1bHQpIHsKCWlmIChjb21wYXJlRmlsZXModGVtcCwgcmVzdWx0KSkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiUmVzdWx0IGZvciAlcyBvbiAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lLCBzY2gpOwoJICAgIHJldCA9IDE7Cgl9CiAgICB9CiAgICBpZiAodGVtcCAhPSBOVUxMKSB7CiAgICAgICAgdW5saW5rKHRlbXApOwogICAgICAgIGZyZWUodGVtcCk7CiAgICB9CgogICAgaWYgKGVyciAhPSBOVUxMKSB7CglpZiAoY29tcGFyZUZpbGVNZW0oZXJyLCB0ZXN0RXJyb3JzLCB0ZXN0RXJyb3JzU2l6ZSkpIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGZvciAlcyBvbiAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lLCBzY2gpOwoJICAgIHJldCA9IDE7CgkgICAgcHJpbnRmKCIlcyIsIHRlc3RFcnJvcnMpOwoJfQogICAgfQoKCiAgICB4bWxSZWxheE5HRnJlZVZhbGlkQ3R4dChjdHh0KTsKICAgIHhtbEZyZWVEb2MoZG9jKTsKICAgIHJldHVybihyZXQpOwp9Ci8qKgogKiBybmdUZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBzY2hlbWFzIGZpbGUKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlcwogKgogKiBQYXJzZSBhbiBSTkcgc2NoZW1hcyBhbmQgdGhlbiBhcHBseSBpdCB0byB0aGUgcmVsYXRlZCAueG1sCiAqCiAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAqLwpzdGF0aWMgaW50CnJuZ1Rlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsCiAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlc3VsIEFUVFJJQlVURV9VTlVTRUQsCiAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycnIgQVRUUklCVVRFX1VOVVNFRCwKICAgICAgICAgICAgaW50IG9wdGlvbnMpIHsKICAgIGNvbnN0IGNoYXIgKmJhc2UgPSBiYXNlRmlsZW5hbWUoZmlsZW5hbWUpOwogICAgY29uc3QgY2hhciAqYmFzZTI7CiAgICBjb25zdCBjaGFyICppbnN0YW5jZTsKICAgIHhtbFJlbGF4TkdQYXJzZXJDdHh0UHRyIGN0eHQ7CiAgICB4bWxSZWxheE5HUHRyIHNjaGVtYXM7CiAgICBpbnQgcmVzID0gMCwgbGVuLCByZXQgPSAwOwogICAgY2hhciBwYXR0ZXJuWzUwMF07CiAgICBjaGFyIHByZWZpeFs1MDBdOwogICAgY2hhciByZXN1bHRbNTAwXTsKICAgIGNoYXIgZXJyWzUwMF07CiAgICBnbG9iX3QgZ2xvYmJ1ZjsKICAgIHNpemVfdCBpOwogICAgY2hhciBjb3VudCA9IDA7CgogICAgLyogZmlyc3QgY29tcGlsZSB0aGUgc2NoZW1hcyBpZiBwb3NzaWJsZSAqLwogICAgY3R4dCA9IHhtbFJlbGF4TkdOZXdQYXJzZXJDdHh0KGZpbGVuYW1lKTsKICAgIHhtbFJlbGF4TkdTZXRQYXJzZXJFcnJvcnMoY3R4dCwKICAgICAgICAgKHhtbFJlbGF4TkdWYWxpZGl0eUVycm9yRnVuYykgdGVzdEVycm9ySGFuZGxlciwKICAgICAgICAgKHhtbFJlbGF4TkdWYWxpZGl0eVdhcm5pbmdGdW5jKSB0ZXN0RXJyb3JIYW5kbGVyLAoJIGN0eHQpOwogICAgc2NoZW1hcyA9IHhtbFJlbGF4TkdQYXJzZShjdHh0KTsKICAgIHhtbFJlbGF4TkdGcmVlUGFyc2VyQ3R4dChjdHh0KTsKCiAgICAvKgogICAgICogbW9zdCBvZiB0aGUgbWVzcyBpcyBhYm91dCB0aGUgb3V0cHV0IGZpbGVuYW1lcyBnZW5lcmF0ZWQgYnkgdGhlIE1ha2VmaWxlCiAgICAgKi8KICAgIGxlbiA9IHN0cmxlbihiYXNlKTsKICAgIGlmICgobGVuID4gNDk5KSB8fCAobGVuIDwgNSkpIHsKICAgICAgICB4bWxSZWxheE5HRnJlZShzY2hlbWFzKTsKCXJldHVybigtMSk7CiAgICB9CiAgICBsZW4gLT0gNDsgLyogcmVtb3ZlIHRyYWlsaW5nIC5ybmcgKi8KICAgIG1lbWNweShwcmVmaXgsIGJhc2UsIGxlbik7CiAgICBwcmVmaXhbbGVuXSA9IDA7CgogICAgc25wcmludGYocGF0dGVybiwgNDk5LCAiLi90ZXN0L3JlbGF4bmcvJXNfPy54bWwiLCBwcmVmaXgpOwogICAgcGF0dGVybls0OTldID0gMDsKCiAgICBnbG9iYnVmLmdsX29mZnMgPSAwOwogICAgZ2xvYihwYXR0ZXJuLCBHTE9CX0RPT0ZGUywgTlVMTCwgJmdsb2JidWYpOwogICAgZm9yIChpID0gMDtpIDwgZ2xvYmJ1Zi5nbF9wYXRoYztpKyspIHsKICAgICAgICB0ZXN0RXJyb3JzU2l6ZSA9IDA7Cgl0ZXN0RXJyb3JzWzBdID0gMDsKICAgICAgICBpbnN0YW5jZSA9IGdsb2JidWYuZ2xfcGF0aHZbaV07CgliYXNlMiA9IGJhc2VGaWxlbmFtZShpbnN0YW5jZSk7CglsZW4gPSBzdHJsZW4oYmFzZTIpOwoJaWYgKChsZW4gPiA2KSAmJiAoYmFzZTJbbGVuIC0gNl0gPT0gJ18nKSkgewoJICAgIGNvdW50ID0gYmFzZTJbbGVuIC0gNV07CgkgICAgc25wcmludGYocmVzdWx0LCA0OTksICJyZXN1bHQvcmVsYXhuZy8lc18lYyIsCgkJICAgICBwcmVmaXgsIGNvdW50KTsKCSAgICByZXN1bHRbNDk5XSA9IDA7CgkgICAgc25wcmludGYoZXJyLCA0OTksICJyZXN1bHQvcmVsYXhuZy8lc18lYy5lcnIiLAoJCSAgICAgcHJlZml4LCBjb3VudCk7CgkgICAgZXJyWzQ5OV0gPSAwOwoJfSBlbHNlIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgImRvbid0IGtub3cgaG93IHRvIHByb2Nlc3MgJXNcbiIsIGluc3RhbmNlKTsKCSAgICBjb250aW51ZTsKCX0KCWlmIChzY2hlbWFzID09IE5VTEwpIHsKCX0gZWxzZSB7CgkgICAgbmJfdGVzdHMrKzsKCSAgICByZXQgPSBybmdPbmVUZXN0KGZpbGVuYW1lLCBpbnN0YW5jZSwgcmVzdWx0LCBlcnIsCgkgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywgc2NoZW1hcyk7CgkgICAgaWYgKHJlcyAhPSAwKQoJCXJldCA9IHJlczsKCX0KICAgIH0KICAgIGdsb2JmcmVlKCZnbG9iYnVmKTsKICAgIHhtbFJlbGF4TkdGcmVlKHNjaGVtYXMpOwoKICAgIHJldHVybihyZXQpOwp9CgojaWZkZWYgTElCWE1MX1JFQURFUl9FTkFCTEVECi8qKgogKiBybmdTdHJlYW1UZXN0OgogKiBAZmlsZW5hbWU6IHRoZSBzY2hlbWFzIGZpbGUKICogQHJlc3VsdDogdGhlIGZpbGUgd2l0aCBleHBlY3RlZCByZXN1bHQKICogQGVycjogdGhlIGZpbGUgd2l0aCBlcnJvciBtZXNzYWdlcwogKgogKiBQYXJzZSBhIHNldCBvZiBmaWxlcyB3aXRoIHN0cmVhbWluZywgYXBwbHlpbmcgYW4gUk5HIHNjaGVtYXMKICoKICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UKICovCnN0YXRpYyBpbnQKcm5nU3RyZWFtVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwKICAgICAgICAgICAgY29uc3QgY2hhciAqcmVzdWwgQVRUUklCVVRFX1VOVVNFRCwKICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyciBBVFRSSUJVVEVfVU5VU0VELAogICAgICAgICAgICBpbnQgb3B0aW9ucykgewogICAgY29uc3QgY2hhciAqYmFzZSA9IGJhc2VGaWxlbmFtZShmaWxlbmFtZSk7CiAgICBjb25zdCBjaGFyICpiYXNlMjsKICAgIGNvbnN0IGNoYXIgKmluc3RhbmNlOwogICAgaW50IHJlcyA9IDAsIGxlbiwgcmV0OwogICAgY2hhciBwYXR0ZXJuWzUwMF07CiAgICBjaGFyIHByZWZpeFs1MDBdOwogICAgY2hhciByZXN1bHRbNTAwXTsKICAgIGNoYXIgZXJyWzUwMF07CiAgICBnbG9iX3QgZ2xvYmJ1ZjsKICAgIHNpemVfdCBpOwogICAgY2hhciBjb3VudCA9IDA7CiAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsKICAgIGludCBkaXNhYmxlX2VyciA9IDA7CgogICAgLyoKICAgICAqIG1vc3Qgb2YgdGhlIG1lc3MgaXMgYWJvdXQgdGhlIG91dHB1dCBmaWxlbmFtZXMgZ2VuZXJhdGVkIGJ5IHRoZSBNYWtlZmlsZQogICAgICovCiAgICBsZW4gPSBzdHJsZW4oYmFzZSk7CiAgICBpZiAoKGxlbiA+IDQ5OSkgfHwgKGxlbiA8IDUpKSB7CglmcHJpbnRmKHN0ZGVyciwgImxlbihiYXNlKSA9PSAlZCAhXG4iLCBsZW4pOwoJcmV0dXJuKC0xKTsKICAgIH0KICAgIGxlbiAtPSA0OyAvKiByZW1vdmUgdHJhaWxpbmcgLnJuZyAqLwogICAgbWVtY3B5KHByZWZpeCwgYmFzZSwgbGVuKTsKICAgIHByZWZpeFtsZW5dID0gMDsKCiAgICAvKgogICAgICogc3RyaWN0bHkgdW5pZnlpbmcgdGhlIGVycm9yIG1lc3NhZ2VzIGlzIG5lYXJseSBpbXBvc3NpYmxlIHRoaXMKICAgICAqIGhhY2sgaXMgYWxzbyBkb25lIGluIHRoZSBNYWtlZmlsZQogICAgICovCiAgICBpZiAoKCFzdHJjbXAocHJlZml4LCAidHV0b3IxMF8xIikpIHx8ICghc3RyY21wKHByZWZpeCwgInR1dG9yMTBfMiIpKSB8fAogICAgICAgICghc3RyY21wKHByZWZpeCwgInR1dG9yM18yIikpIHx8ICghc3RyY21wKHByZWZpeCwgIjMwNzM3NyIpKSB8fAogICAgICAgICghc3RyY21wKHByZWZpeCwgInR1dG9yOF8yIikpKQoJZGlzYWJsZV9lcnIgPSAxOwoKICAgIHNucHJpbnRmKHBhdHRlcm4sIDQ5OSwgIi4vdGVzdC9yZWxheG5nLyVzXz8ueG1sIiwgcHJlZml4KTsKICAgIHBhdHRlcm5bNDk5XSA9IDA7CgogICAgZ2xvYmJ1Zi5nbF9vZmZzID0gMDsKICAgIGdsb2IocGF0dGVybiwgR0xPQl9ET09GRlMsIE5VTEwsICZnbG9iYnVmKTsKICAgIGZvciAoaSA9IDA7aSA8IGdsb2JidWYuZ2xfcGF0aGM7aSsrKSB7CiAgICAgICAgdGVzdEVycm9yc1NpemUgPSAwOwoJdGVzdEVycm9yc1swXSA9IDA7CiAgICAgICAgaW5zdGFuY2UgPSBnbG9iYnVmLmdsX3BhdGh2W2ldOwoJYmFzZTIgPSBiYXNlRmlsZW5hbWUoaW5zdGFuY2UpOwoJbGVuID0gc3RybGVuKGJhc2UyKTsKCWlmICgobGVuID4gNikgJiYgKGJhc2UyW2xlbiAtIDZdID09ICdfJykpIHsKCSAgICBjb3VudCA9IGJhc2UyW2xlbiAtIDVdOwoJICAgIHNucHJpbnRmKHJlc3VsdCwgNDk5LCAicmVzdWx0L3JlbGF4bmcvJXNfJWMiLAoJCSAgICAgcHJlZml4LCBjb3VudCk7CgkgICAgcmVzdWx0WzQ5OV0gPSAwOwoJICAgIHNucHJpbnRmKGVyciwgNDk5LCAicmVzdWx0L3JlbGF4bmcvJXNfJWMuZXJyIiwKCQkgICAgIHByZWZpeCwgY291bnQpOwoJICAgIGVycls0OTldID0gMDsKCX0gZWxzZSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJkb24ndCBrbm93IGhvdyB0byBwcm9jZXNzICVzXG4iLCBpbnN0YW5jZSk7CgkgICAgY29udGludWU7Cgl9CglyZWFkZXIgPSB4bWxSZWFkZXJGb3JGaWxlKGluc3RhbmNlLCBOVUxMLCBvcHRpb25zKTsKCWlmIChyZWFkZXIgPT0gTlVMTCkgewoJICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGJ1aWxkIHJlZGVyIGZvciAlc1xuIiwgaW5zdGFuY2UpOwoJfQoJaWYgKGRpc2FibGVfZXJyID09IDEpCgkgICAgcmV0ID0gc3RyZWFtUHJvY2Vzc1Rlc3QoaW5zdGFuY2UsIHJlc3VsdCwgTlVMTCwgcmVhZGVyLCBmaWxlbmFtZSk7CgllbHNlCgkgICAgcmV0ID0gc3RyZWFtUHJvY2Vzc1Rlc3QoaW5zdGFuY2UsIHJlc3VsdCwgZXJyLCByZWFkZXIsIGZpbGVuYW1lKTsKCXhtbEZyZWVUZXh0UmVhZGVyKHJlYWRlcik7CglpZiAocmV0ICE9IDApIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgImluc3RhbmNlICVzIGZhaWxlZFxuIiwgaW5zdGFuY2UpOwoJICAgIHJlcyA9IHJldDsKCX0KICAgIH0KICAgIGdsb2JmcmVlKCZnbG9iYnVmKTsKCiAgICByZXR1cm4ocmVzKTsKfQojZW5kaWYgLyogUkVBREVSICovCgojZW5kaWYKCiNpZmRlZiBMSUJYTUxfUEFUVEVSTl9FTkFCTEVECiNpZmRlZiBMSUJYTUxfUkVBREVSX0VOQUJMRUQKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQkJCQkJCSoKICoJCQlQYXR0ZXJucyB0ZXN0cwkJCQkJKgogKgkJCQkJCQkJCSoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQgcGF0dGVybk5vZGUoRklMRSAqb3V0LCB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0dGVybiwgeG1sUGF0dGVyblB0ciBwYXR0ZXJuYywKCQkJeG1sU3RyZWFtQ3R4dFB0ciBwYXRzdHJlYW0pIHsKICAgIHhtbENoYXIgKnBhdGggPSBOVUxMOwogICAgaW50IG1hdGNoID0gLTE7CiAgICBpbnQgdHlwZSwgZW1wdHk7CgogICAgdHlwZSA9IHhtbFRleHRSZWFkZXJOb2RlVHlwZShyZWFkZXIpOwogICAgZW1wdHkgPSB4bWxUZXh0UmVhZGVySXNFbXB0eUVsZW1lbnQocmVhZGVyKTsKCiAgICBpZiAodHlwZSA9PSBYTUxfUkVBREVSX1RZUEVfRUxFTUVOVCkgewoJLyogZG8gdGhlIGNoZWNrIG9ubHkgb24gZWxlbWVudCBzdGFydCAqLwoJbWF0Y2ggPSB4bWxQYXR0ZXJuTWF0Y2gocGF0dGVybmMsIHhtbFRleHRSZWFkZXJDdXJyZW50Tm9kZShyZWFkZXIpKTsKCglpZiAobWF0Y2gpIHsKCSAgICBwYXRoID0geG1sR2V0Tm9kZVBhdGgoeG1sVGV4dFJlYWRlckN1cnJlbnROb2RlKHJlYWRlcikpOwoJICAgIGZwcmludGYob3V0LCAiTm9kZSAlcyBtYXRjaGVzIHBhdHRlcm4gJXNcbiIsIHBhdGgsIHBhdHRlcm4pOwoJfQogICAgfQogICAgaWYgKHBhdHN0cmVhbSAhPSBOVUxMKSB7CglpbnQgcmV0OwoKCWlmICh0eXBlID09IFhNTF9SRUFERVJfVFlQRV9FTEVNRU5UKSB7CgkgICAgcmV0ID0geG1sU3RyZWFtUHVzaChwYXRzdHJlYW0sCgkJCQl4bWxUZXh0UmVhZGVyQ29uc3RMb2NhbE5hbWUocmVhZGVyKSwKCQkJCXhtbFRleHRSZWFkZXJDb25zdE5hbWVzcGFjZVVyaShyZWFkZXIpKTsKCSAgICBpZiAocmV0IDwgMCkgewoJCWZwcmludGYob3V0LCAieG1sU3RyZWFtUHVzaCgpIGZhaWx1cmVcbiIpOwoJCXhtbEZyZWVTdHJlYW1DdHh0KHBhdHN0cmVhbSk7CgkJcGF0c3RyZWFtID0gTlVMTDsKCSAgICB9IGVsc2UgaWYgKHJldCAhPSBtYXRjaCkgewoJCWlmIChwYXRoID09IE5VTEwpIHsKCQkgICAgcGF0aCA9IHhtbEdldE5vZGVQYXRoKAoJCQkJICAgeG1sVGV4dFJlYWRlckN1cnJlbnROb2RlKHJlYWRlcikpOwoJCX0KCQlmcHJpbnRmKG91dCwKCQkJInhtbFBhdHRlcm5NYXRjaCBhbmQgeG1sU3RyZWFtUHVzaCBkaXNhZ3JlZVxuIik7CgkJZnByaW50ZihvdXQsCgkJCSIgIHBhdHRlcm4gJXMgbm9kZSAlc1xuIiwKCQkJcGF0dGVybiwgcGF0aCk7CgkgICAgfQoKCgl9CglpZiAoKHR5cGUgPT0gWE1MX1JFQURFUl9UWVBFX0VORF9FTEVNRU5UKSB8fAoJICAgICgodHlwZSA9PSBYTUxfUkVBREVSX1RZUEVfRUxFTUVOVCkgJiYgKGVtcHR5KSkpIHsKCSAgICByZXQgPSB4bWxTdHJlYW1Qb3AocGF0c3RyZWFtKTsKCSAgICBpZiAocmV0IDwgMCkgewoJCWZwcmludGYob3V0LCAieG1sU3RyZWFtUG9wKCkgZmFpbHVyZVxuIik7CgkJeG1sRnJlZVN0cmVhbUN0eHQocGF0c3RyZWFtKTsKCQlwYXRzdHJlYW0gPSBOVUxMOwoJICAgIH0KCX0KICAgIH0KICAgIGlmIChwYXRoICE9IE5VTEwpCgl4bWxGcmVlKHBhdGgpOwp9CgovKioKICogcGF0dGVyblRlc3Q6CiAqIEBmaWxlbmFtZTogdGhlIHNjaGVtYXMgZmlsZQogKiBAcmVzdWx0OiB0aGUgZmlsZSB3aXRoIGV4cGVjdGVkIHJlc3VsdAogKiBAZXJyOiB0aGUgZmlsZSB3aXRoIGVycm9yIG1lc3NhZ2VzCiAqCiAqIFBhcnNlIGEgc2V0IG9mIGZpbGVzIHdpdGggc3RyZWFtaW5nLCBhcHBseWluZyBhbiBSTkcgc2NoZW1hcwogKgogKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogKi8Kc3RhdGljIGludApwYXR0ZXJuVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwKICAgICAgICAgICAgY29uc3QgY2hhciAqcmVzdWwgQVRUUklCVVRFX1VOVVNFRCwKICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyIEFUVFJJQlVURV9VTlVTRUQsCiAgICAgICAgICAgIGludCBvcHRpb25zKSB7CiAgICB4bWxQYXR0ZXJuUHRyIHBhdHRlcm5jID0gTlVMTDsKICAgIHhtbFN0cmVhbUN0eHRQdHIgcGF0c3RyZWFtID0gTlVMTDsKICAgIEZJTEUgKm8sICpmOwogICAgY2hhciBzdHJbMTAyNF07CiAgICBjaGFyIHhtbFs1MDBdOwogICAgY2hhciByZXN1bHRbNTAwXTsKICAgIGludCBsZW4sIGk7CiAgICBpbnQgcmV0ID0gMCwgcmVzOwogICAgY2hhciAqdGVtcDsKICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOwogICAgeG1sRG9jUHRyIGRvYzsKCiAgICBsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOwogICAgbGVuIC09IDQ7CiAgICBtZW1jcHkoeG1sLCBmaWxlbmFtZSwgbGVuKTsKICAgIHhtbFtsZW5dID0gMDsKICAgIHNucHJpbnRmKHJlc3VsdCwgNDk5LCAicmVzdWx0L3BhdHRlcm4vJXMiLCBiYXNlRmlsZW5hbWUoeG1sKSk7CiAgICByZXN1bHRbNDk5XSA9IDA7CiAgICBtZW1jcHkoeG1sICsgbGVuLCAiLnhtbCIsIDUpOwoKICAgIGlmICghY2hlY2tUZXN0RmlsZSh4bWwpKSB7CglmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgeG1sIGZpbGUgJXNcbiIsIHhtbCk7CglyZXR1cm4oLTEpOwogICAgfQogICAgaWYgKCFjaGVja1Rlc3RGaWxlKHJlc3VsdCkpIHsKCWZwcmludGYoc3RkZXJyLCAiTWlzc2luZyByZXN1bHQgZmlsZSAlc1xuIiwgcmVzdWx0KTsKCXJldHVybigtMSk7CiAgICB9CiAgICBmID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpOwogICAgaWYgKGYgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gJXNcbiIsIGZpbGVuYW1lKTsKCXJldHVybigtMSk7CiAgICB9CiAgICB0ZW1wID0gcmVzdWx0RmlsZW5hbWUoZmlsZW5hbWUsICIiLCAiLnJlcyIpOwogICAgaWYgKHRlbXAgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiT3V0IG9mIG1lbW9yeVxuIik7CiAgICAgICAgZmF0YWxFcnJvcigpOwogICAgfQogICAgbyA9IGZvcGVuKHRlbXAsICJ3YiIpOwogICAgaWYgKG8gPT0gTlVMTCkgewoJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSAlc1xuIiwgdGVtcCk7CglmY2xvc2UoZik7CiAgICAgICAgZnJlZSh0ZW1wKTsKCXJldHVybigtMSk7CiAgICB9CiAgICB3aGlsZSAoMSkgewoJLyoKCSAqIHJlYWQgb25lIGxpbmUgaW4gc3RyaW5nIGJ1ZmZlci4KCSAqLwoJaWYgKGZnZXRzICgmc3RyWzBdLCBzaXplb2YgKHN0cikgLSAxLCBmKSA9PSBOVUxMKQoJICAgYnJlYWs7CgoJLyoKCSAqIHJlbW92ZSB0aGUgZW5kaW5nIHNwYWNlcwoJICovCglpID0gc3RybGVuKHN0cik7Cgl3aGlsZSAoKGkgPiAwKSAmJgoJICAgICAgICgoc3RyW2kgLSAxXSA9PSAnXG4nKSB8fCAoc3RyW2kgLSAxXSA9PSAnXHInKSB8fAoJCShzdHJbaSAtIDFdID09ICcgJykgfHwgKHN0cltpIC0gMV0gPT0gJ1x0JykpKSB7CgkgICAgaS0tOwoJICAgIHN0cltpXSA9IDA7Cgl9Cglkb2MgPSB4bWxSZWFkRmlsZSh4bWwsIE5VTEwsIG9wdGlvbnMpOwoJaWYgKGRvYyA9PSBOVUxMKSB7CgkgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcGFyc2UgJXNcbiIsIHhtbCk7CgkgICAgcmV0ID0gMTsKCX0gZWxzZSB7CgkgICAgeG1sTm9kZVB0ciByb290OwoJICAgIGNvbnN0IHhtbENoYXIgKm5hbWVzcGFjZXNbMjJdOwoJICAgIGludCBqOwoJICAgIHhtbE5zUHRyIG5zOwoKCSAgICByb290ID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKTsKCSAgICBmb3IgKG5zID0gcm9vdC0+bnNEZWYsIGogPSAwO25zICE9IE5VTEwgJiYgaiA8IDIwO25zPW5zLT5uZXh0KSB7CgkJbmFtZXNwYWNlc1tqKytdID0gbnMtPmhyZWY7CgkJbmFtZXNwYWNlc1tqKytdID0gbnMtPnByZWZpeDsKCSAgICB9CgkgICAgbmFtZXNwYWNlc1tqKytdID0gTlVMTDsKCSAgICBuYW1lc3BhY2VzW2pdID0gTlVMTDsKCgkgICAgcGF0dGVybmMgPSB4bWxQYXR0ZXJuY29tcGlsZSgoY29uc3QgeG1sQ2hhciAqKSBzdHIsIGRvYy0+ZGljdCwKCQkJCQkgMCwgJm5hbWVzcGFjZXNbMF0pOwoJICAgIGlmIChwYXR0ZXJuYyA9PSBOVUxMKSB7CgkJdGVzdEVycm9ySGFuZGxlcihOVUxMLAoJCQkiUGF0dGVybiAlcyBmYWlsZWQgdG8gY29tcGlsZVxuIiwgc3RyKTsKCQl4bWxGcmVlRG9jKGRvYyk7CgkJcmV0ID0gMTsKCQljb250aW51ZTsKCSAgICB9CgkgICAgcGF0c3RyZWFtID0geG1sUGF0dGVybkdldFN0cmVhbUN0eHQocGF0dGVybmMpOwoJICAgIGlmIChwYXRzdHJlYW0gIT0gTlVMTCkgewoJCXJldCA9IHhtbFN0cmVhbVB1c2gocGF0c3RyZWFtLCBOVUxMLCBOVUxMKTsKCQlpZiAocmV0IDwgMCkgewoJCSAgICBmcHJpbnRmKHN0ZGVyciwgInhtbFN0cmVhbVB1c2goKSBmYWlsdXJlXG4iKTsKCQkgICAgeG1sRnJlZVN0cmVhbUN0eHQocGF0c3RyZWFtKTsKCQkgICAgcGF0c3RyZWFtID0gTlVMTDsKCQl9CgkgICAgfQoJICAgIG5iX3Rlc3RzKys7CgoJICAgIHJlYWRlciA9IHhtbFJlYWRlcldhbGtlcihkb2MpOwoJICAgIHJlcyA9IHhtbFRleHRSZWFkZXJSZWFkKHJlYWRlcik7CgkgICAgd2hpbGUgKHJlcyA9PSAxKSB7CgkJcGF0dGVybk5vZGUobywgcmVhZGVyLCBzdHIsIHBhdHRlcm5jLCBwYXRzdHJlYW0pOwoJCXJlcyA9IHhtbFRleHRSZWFkZXJSZWFkKHJlYWRlcik7CgkgICAgfQoJICAgIGlmIChyZXMgIT0gMCkgewoJCWZwcmludGYobywgIiVzIDogZmFpbGVkIHRvIHBhcnNlXG4iLCBmaWxlbmFtZSk7CgkgICAgfQoJICAgIHhtbEZyZWVUZXh0UmVhZGVyKHJlYWRlcik7CgkgICAgeG1sRnJlZURvYyhkb2MpOwoJICAgIHhtbEZyZWVTdHJlYW1DdHh0KHBhdHN0cmVhbSk7CgkgICAgcGF0c3RyZWFtID0gTlVMTDsKCSAgICB4bWxGcmVlUGF0dGVybihwYXR0ZXJuYyk7CgoJfQogICAgfQoKICAgIGZjbG9zZShmKTsKICAgIGZjbG9zZShvKTsKCiAgICByZXQgPSBjb21wYXJlRmlsZXModGVtcCwgcmVzdWx0KTsKICAgIGlmIChyZXQpIHsKCWZwcmludGYoc3RkZXJyLCAiUmVzdWx0IGZvciAlcyBmYWlsZWRcbiIsIGZpbGVuYW1lKTsKCXJldCA9IDE7CiAgICB9CiAgICBpZiAodGVtcCAhPSBOVUxMKSB7CiAgICAgICAgdW5saW5rKHRlbXApOwogICAgICAgIGZyZWUodGVtcCk7CiAgICB9CiAgICByZXR1cm4ocmV0KTsKfQojZW5kaWYgLyogUkVBREVSICovCiNlbmRpZiAvKiBQQVRURVJOICovCiNpZmRlZiBMSUJYTUxfQzE0Tl9FTkFCTEVECi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJCQkJCQkqCiAqCQkJQ2Fub25pY2FsaXphdGlvbiB0ZXN0cwkJCQkqCiAqCQkJCQkJCQkJKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgeG1sWFBhdGhPYmplY3RQdHIKbG9hZF94cGF0aF9leHByICh4bWxEb2NQdHIgcGFyZW50X2RvYywgY29uc3QgY2hhciogZmlsZW5hbWUpIHsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHhwYXRoOwogICAgeG1sRG9jUHRyIGRvYzsKICAgIHhtbENoYXIgKmV4cHI7CiAgICB4bWxYUGF0aENvbnRleHRQdHIgY3R4OwogICAgeG1sTm9kZVB0ciBub2RlOwogICAgeG1sTnNQdHIgbnM7CgogICAgLyoKICAgICAqIGxvYWQgWFBhdGggZXhwciBhcyBhIGZpbGUKICAgICAqLwogICAgeG1sTG9hZEV4dER0ZERlZmF1bHRWYWx1ZSA9IFhNTF9ERVRFQ1RfSURTIHwgWE1MX0NPTVBMRVRFX0FUVFJTOwogICAgeG1sU3Vic3RpdHV0ZUVudGl0aWVzRGVmYXVsdCgxKTsKCiAgICBkb2MgPSB4bWxSZWFkRmlsZShmaWxlbmFtZSwgTlVMTCwgWE1MX1BBUlNFX0RUREFUVFIgfCBYTUxfUEFSU0VfTk9FTlQpOwogICAgaWYgKGRvYyA9PSBOVUxMKSB7CglmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiB1bmFibGUgdG8gcGFyc2UgZmlsZSBcIiVzXCJcbiIsIGZpbGVuYW1lKTsKCXJldHVybihOVUxMKTsKICAgIH0KCiAgICAvKgogICAgICogQ2hlY2sgdGhlIGRvY3VtZW50IGlzIG9mIHRoZSByaWdodCBraW5kCiAgICAgKi8KICAgIGlmKHhtbERvY0dldFJvb3RFbGVtZW50KGRvYykgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCJFcnJvcjogZW1wdHkgZG9jdW1lbnQgZm9yIGZpbGUgXCIlc1wiXG4iLCBmaWxlbmFtZSk7Cgl4bWxGcmVlRG9jKGRvYyk7CglyZXR1cm4oTlVMTCk7CiAgICB9CgogICAgbm9kZSA9IGRvYy0+Y2hpbGRyZW47CiAgICB3aGlsZShub2RlICE9IE5VTEwgJiYgIXhtbFN0ckVxdWFsKG5vZGUtPm5hbWUsIChjb25zdCB4bWxDaGFyICopIlhQYXRoIikpIHsKCW5vZGUgPSBub2RlLT5uZXh0OwogICAgfQoKICAgIGlmKG5vZGUgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCJFcnJvcjogWFBhdGggZWxlbWVudCBleHBlY3RlZCBpbiB0aGUgZmlsZSAgXCIlc1wiXG4iLCBmaWxlbmFtZSk7Cgl4bWxGcmVlRG9jKGRvYyk7CglyZXR1cm4oTlVMTCk7CiAgICB9CgogICAgZXhwciA9IHhtbE5vZGVHZXRDb250ZW50KG5vZGUpOwogICAgaWYoZXhwciA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsIkVycm9yOiBYUGF0aCBjb250ZW50IGVsZW1lbnQgaXMgTlVMTCBcIiVzXCJcbiIsIGZpbGVuYW1lKTsKCXhtbEZyZWVEb2MoZG9jKTsKCXJldHVybihOVUxMKTsKICAgIH0KCiAgICBjdHggPSB4bWxYUGF0aE5ld0NvbnRleHQocGFyZW50X2RvYyk7CiAgICBpZihjdHggPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCJFcnJvcjogdW5hYmxlIHRvIGNyZWF0ZSBuZXcgY29udGV4dFxuIik7CiAgICAgICAgeG1sRnJlZShleHByKTsKICAgICAgICB4bWxGcmVlRG9jKGRvYyk7CiAgICAgICAgcmV0dXJuKE5VTEwpOwogICAgfQoKICAgIC8qCiAgICAgKiBSZWdpc3RlciBuYW1lc3BhY2VzCiAgICAgKi8KICAgIG5zID0gbm9kZS0+bnNEZWY7CiAgICB3aGlsZShucyAhPSBOVUxMKSB7CglpZih4bWxYUGF0aFJlZ2lzdGVyTnMoY3R4LCBucy0+cHJlZml4LCBucy0+aHJlZikgIT0gMCkgewoJICAgIGZwcmludGYoc3RkZXJyLCJFcnJvcjogdW5hYmxlIHRvIHJlZ2lzdGVyIE5TIHdpdGggcHJlZml4PVwiJXNcIiBhbmQgaHJlZj1cIiVzXCJcbiIsIG5zLT5wcmVmaXgsIG5zLT5ocmVmKTsKICAgIHhtbEZyZWUoZXhwcik7CgkgICAgeG1sWFBhdGhGcmVlQ29udGV4dChjdHgpOwoJICAgIHhtbEZyZWVEb2MoZG9jKTsKCSAgICByZXR1cm4oTlVMTCk7Cgl9CglucyA9IG5zLT5uZXh0OwogICAgfQoKICAgIC8qCiAgICAgKiBFdmFsdWF0ZSB4cGF0aAogICAgICovCiAgICB4cGF0aCA9IHhtbFhQYXRoRXZhbEV4cHJlc3Npb24oZXhwciwgY3R4KTsKICAgIGlmKHhwYXRoID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3I6IHVuYWJsZSB0byBldmFsdWF0ZSB4cGF0aCBleHByZXNzaW9uXG4iKTsKeG1sRnJlZShleHByKTsKICAgICAgICB4bWxYUGF0aEZyZWVDb250ZXh0KGN0eCk7CiAgICAgICAgeG1sRnJlZURvYyhkb2MpOwogICAgICAgIHJldHVybihOVUxMKTsKICAgIH0KCiAgICAvKiBwcmludF94cGF0aF9ub2Rlcyh4cGF0aC0+bm9kZXNldHZhbCk7ICovCgogICAgeG1sRnJlZShleHByKTsKICAgIHhtbFhQYXRoRnJlZUNvbnRleHQoY3R4KTsKICAgIHhtbEZyZWVEb2MoZG9jKTsKICAgIHJldHVybih4cGF0aCk7Cn0KCi8qCiAqIE1hY3JvIHVzZWQgdG8gZ3JvdyB0aGUgY3VycmVudCBidWZmZXIuCiAqLwojZGVmaW5lIHh4eF9ncm93QnVmZmVyUmVlbnRyYW50KCkgewkJCQkJCVwKICAgIGJ1ZmZlcl9zaXplICo9IDI7CQkJCQkJCVwKICAgIGJ1ZmZlciA9ICh4bWxDaGFyICoqKQkJCQkJCVwKCXhtbFJlYWxsb2MoYnVmZmVyLCBidWZmZXJfc2l6ZSAqIHNpemVvZih4bWxDaGFyKikpOwlcCiAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsJCQkJCQlcCglwZXJyb3IoInJlYWxsb2MgZmFpbGVkIik7CQkJCQlcCglyZXR1cm4oTlVMTCk7CQkJCQkJCVwKICAgIH0JCQkJCQkJCQlcCn0KCnN0YXRpYyB4bWxDaGFyICoqCnBhcnNlX2xpc3QoeG1sQ2hhciAqc3RyKSB7CiAgICB4bWxDaGFyICoqYnVmZmVyOwogICAgeG1sQ2hhciAqKm91dCA9IE5VTEw7CiAgICBpbnQgYnVmZmVyX3NpemUgPSAwOwogICAgaW50IGxlbjsKCiAgICBpZihzdHIgPT0gTlVMTCkgewoJcmV0dXJuKE5VTEwpOwogICAgfQoKICAgIGxlbiA9IHhtbFN0cmxlbihzdHIpOwogICAgaWYoKHN0clswXSA9PSAnXCcnKSAmJiAoc3RyW2xlbiAtIDFdID09ICdcJycpKSB7CglzdHJbbGVuIC0gMV0gPSAnXDAnOwoJc3RyKys7CiAgICB9CiAgICAvKgogICAgICogYWxsb2NhdGUgYW4gdHJhbnNsYXRpb24gYnVmZmVyLgogICAgICovCiAgICBidWZmZXJfc2l6ZSA9IDEwMDA7CiAgICBidWZmZXIgPSAoeG1sQ2hhciAqKikgeG1sTWFsbG9jKGJ1ZmZlcl9zaXplICogc2l6ZW9mKHhtbENoYXIqKSk7CiAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKCXBlcnJvcigibWFsbG9jIGZhaWxlZCIpOwoJcmV0dXJuKE5VTEwpOwogICAgfQogICAgb3V0ID0gYnVmZmVyOwoKICAgIHdoaWxlKCpzdHIgIT0gJ1wwJykgewoJaWYgKG91dCAtIGJ1ZmZlciA+IGJ1ZmZlcl9zaXplIC0gMTApIHsKCSAgICBpbnQgaW5keCA9IG91dCAtIGJ1ZmZlcjsKCgkgICAgeHh4X2dyb3dCdWZmZXJSZWVudHJhbnQoKTsKCSAgICBvdXQgPSAmYnVmZmVyW2luZHhdOwoJfQoJKCpvdXQrKykgPSBzdHI7Cgl3aGlsZSgqc3RyICE9ICcsJyAmJiAqc3RyICE9ICdcMCcpICsrc3RyOwoJaWYoKnN0ciA9PSAnLCcpICooc3RyKyspID0gJ1wwJzsKICAgIH0KICAgICgqb3V0KSA9IE5VTEw7CiAgICByZXR1cm4gYnVmZmVyOwp9CgpzdGF0aWMgaW50CmMxNG5SdW5UZXN0KGNvbnN0IGNoYXIqIHhtbF9maWxlbmFtZSwgaW50IHdpdGhfY29tbWVudHMsIGludCBtb2RlLAoJICAgIGNvbnN0IGNoYXIqIHhwYXRoX2ZpbGVuYW1lLCBjb25zdCBjaGFyICpuc19maWxlbmFtZSwKCSAgICBjb25zdCBjaGFyKiByZXN1bHRfZmlsZSkgewogICAgeG1sRG9jUHRyIGRvYzsKICAgIHhtbFhQYXRoT2JqZWN0UHRyIHhwYXRoID0gTlVMTDsKICAgIHhtbENoYXIgKnJlc3VsdCA9IE5VTEw7CiAgICBpbnQgcmV0OwogICAgeG1sQ2hhciAqKmluY2x1c2l2ZV9uYW1lc3BhY2VzID0gTlVMTDsKICAgIGNvbnN0IGNoYXIgKm5zbGlzdCA9IE5VTEw7CiAgICBpbnQgbnNzaXplOwoKCiAgICAvKgogICAgICogYnVpbGQgYW4gWE1MIHRyZWUgZnJvbSBhIHRoZSBmaWxlOyB3ZSBuZWVkIHRvIGFkZCBkZWZhdWx0CiAgICAgKiBhdHRyaWJ1dGVzIGFuZCByZXNvbHZlIGFsbCBjaGFyYWN0ZXIgYW5kIGVudGl0aWVzIHJlZmVyZW5jZXMKICAgICAqLwogICAgeG1sTG9hZEV4dER0ZERlZmF1bHRWYWx1ZSA9IFhNTF9ERVRFQ1RfSURTIHwgWE1MX0NPTVBMRVRFX0FUVFJTOwogICAgeG1sU3Vic3RpdHV0ZUVudGl0aWVzRGVmYXVsdCgxKTsKCiAgICBkb2MgPSB4bWxSZWFkRmlsZSh4bWxfZmlsZW5hbWUsIE5VTEwsIFhNTF9QQVJTRV9EVERBVFRSIHwgWE1MX1BBUlNFX05PRU5UKTsKICAgIGlmIChkb2MgPT0gTlVMTCkgewoJZnByaW50ZihzdGRlcnIsICJFcnJvcjogdW5hYmxlIHRvIHBhcnNlIGZpbGUgXCIlc1wiXG4iLCB4bWxfZmlsZW5hbWUpOwoJcmV0dXJuKC0xKTsKICAgIH0KCiAgICAvKgogICAgICogQ2hlY2sgdGhlIGRvY3VtZW50IGlzIG9mIHRoZSByaWdodCBraW5kCiAgICAgKi8KICAgIGlmKHhtbERvY0dldFJvb3RFbGVtZW50KGRvYykgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCJFcnJvcjogZW1wdHkgZG9jdW1lbnQgZm9yIGZpbGUgXCIlc1wiXG4iLCB4bWxfZmlsZW5hbWUpOwoJeG1sRnJlZURvYyhkb2MpOwoJcmV0dXJuKC0xKTsKICAgIH0KCiAgICAvKgogICAgICogbG9hZCB4cGF0aCBmaWxlIGlmIHNwZWNpZmllZAogICAgICovCiAgICBpZih4cGF0aF9maWxlbmFtZSkgewoJeHBhdGggPSBsb2FkX3hwYXRoX2V4cHIoZG9jLCB4cGF0aF9maWxlbmFtZSk7CglpZih4cGF0aCA9PSBOVUxMKSB7CgkgICAgZnByaW50ZihzdGRlcnIsIkVycm9yOiB1bmFibGUgdG8gZXZhbHVhdGUgeHBhdGggZXhwcmVzc2lvblxuIik7CgkgICAgeG1sRnJlZURvYyhkb2MpOwoJICAgIHJldHVybigtMSk7Cgl9CiAgICB9CgogICAgaWYgKG5zX2ZpbGVuYW1lICE9IE5VTEwpIHsKICAgICAgICBpZiAobG9hZE1lbShuc19maWxlbmFtZSwgJm5zbGlzdCwgJm5zc2l6ZSkpIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3I6IHVuYWJsZSB0byBldmFsdWF0ZSB4cGF0aCBleHByZXNzaW9uXG4iKTsKCSAgICBpZih4cGF0aCAhPSBOVUxMKSB4bWxYUGF0aEZyZWVPYmplY3QoeHBhdGgpOwoJICAgIHhtbEZyZWVEb2MoZG9jKTsKCSAgICByZXR1cm4oLTEpOwoJfQogICAgICAgIGluY2x1c2l2ZV9uYW1lc3BhY2VzID0gcGFyc2VfbGlzdCgoeG1sQ2hhciAqKSBuc2xpc3QpOwogICAgfQoKICAgIC8qCiAgICAgKiBDYW5vbmljYWwgZm9ybQogICAgICovCiAgICAvKiBmcHJpbnRmKHN0ZGVyciwiRmlsZSBcIiVzXCIgbG9hZGVkOiBzdGFydCBjYW5vbml6YXRpb25cbiIsIHhtbF9maWxlbmFtZSk7ICovCiAgICByZXQgPSB4bWxDMTRORG9jRHVtcE1lbW9yeShkb2MsCgkgICAgKHhwYXRoKSA/IHhwYXRoLT5ub2Rlc2V0dmFsIDogTlVMTCwKCSAgICBtb2RlLCBpbmNsdXNpdmVfbmFtZXNwYWNlcywKCSAgICB3aXRoX2NvbW1lbnRzLCAmcmVzdWx0KTsKICAgIGlmIChyZXQgPj0gMCkgewoJaWYocmVzdWx0ICE9IE5VTEwpIHsKCSAgICBpZiAoY29tcGFyZUZpbGVNZW0ocmVzdWx0X2ZpbGUsIChjb25zdCBjaGFyICopIHJlc3VsdCwgcmV0KSkgewoJCWZwcmludGYoc3RkZXJyLCAiUmVzdWx0IG1pc21hdGNoIGZvciAlc1xuIiwgeG1sX2ZpbGVuYW1lKTsKCQlmcHJpbnRmKHN0ZGVyciwgIlJFU1VMVDpcbiVzXG4iLCAoY29uc3QgY2hhciopcmVzdWx0KTsKCSAgICAgICAgcmV0ID0gLTE7CgkgICAgfQoJfQogICAgfSBlbHNlIHsKCWZwcmludGYoc3RkZXJyLCJFcnJvcjogZmFpbGVkIHRvIGNhbm9uaWNhbGl6ZSBYTUwgZmlsZSBcIiVzXCIgKHJldD0lZClcbiIsIHhtbF9maWxlbmFtZSwgcmV0KTsKCXJldCA9IC0xOwogICAgfQoKICAgIC8qCiAgICAgKiBDbGVhbnVwCiAgICAgKi8KICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgeG1sRnJlZShyZXN1bHQpOwogICAgaWYoeHBhdGggIT0gTlVMTCkgeG1sWFBhdGhGcmVlT2JqZWN0KHhwYXRoKTsKICAgIGlmIChpbmNsdXNpdmVfbmFtZXNwYWNlcyAhPSBOVUxMKSB4bWxGcmVlKGluY2x1c2l2ZV9uYW1lc3BhY2VzKTsKICAgIGlmIChuc2xpc3QgIT0gTlVMTCkgZnJlZSgoY2hhciAqKSBuc2xpc3QpOwogICAgeG1sRnJlZURvYyhkb2MpOwoKICAgIHJldHVybihyZXQpOwp9CgpzdGF0aWMgaW50CmMxNG5Db21tb25UZXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgd2l0aF9jb21tZW50cywgaW50IG1vZGUsCiAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN1YmRpcikgewogICAgY2hhciBidWZbNTAwXTsKICAgIGNoYXIgcHJlZml4WzUwMF07CiAgICBjb25zdCBjaGFyICpiYXNlOwogICAgaW50IGxlbjsKICAgIGNoYXIgKnJlc3VsdCA9IE5VTEw7CiAgICBjaGFyICp4cGF0aCA9IE5VTEw7CiAgICBjaGFyICpucyA9IE5VTEw7CiAgICBpbnQgcmV0ID0gMDsKCiAgICBiYXNlID0gYmFzZUZpbGVuYW1lKGZpbGVuYW1lKTsKICAgIGxlbiA9IHN0cmxlbihiYXNlKTsKICAgIGxlbiAtPSA0OwogICAgbWVtY3B5KHByZWZpeCwgYmFzZSwgbGVuKTsKICAgIHByZWZpeFtsZW5dID0gMDsKCiAgICBzbnByaW50ZihidWYsIDQ5OSwgInJlc3VsdC9jMTRuLyVzLyVzIiwgc3ViZGlyLHByZWZpeCk7CiAgICBpZiAoIWNoZWNrVGVzdEZpbGUoYnVmKSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyByZXN1bHQgZmlsZSAlcyIsIGJ1Zik7CglyZXR1cm4oLTEpOwogICAgfQogICAgcmVzdWx0ID0gc3RyZHVwKGJ1Zik7CiAgICBzbnByaW50ZihidWYsIDQ5OSwgInRlc3QvYzE0bi8lcy8lcy54cGF0aCIsIHN1YmRpcixwcmVmaXgpOwogICAgaWYgKGNoZWNrVGVzdEZpbGUoYnVmKSkgewoJeHBhdGggPSBzdHJkdXAoYnVmKTsKICAgIH0KICAgIHNucHJpbnRmKGJ1ZiwgNDk5LCAidGVzdC9jMTRuLyVzLyVzLm5zIiwgc3ViZGlyLHByZWZpeCk7CiAgICBpZiAoY2hlY2tUZXN0RmlsZShidWYpKSB7CglucyA9IHN0cmR1cChidWYpOwogICAgfQoKICAgIG5iX3Rlc3RzKys7CiAgICBpZiAoYzE0blJ1blRlc3QoZmlsZW5hbWUsIHdpdGhfY29tbWVudHMsIG1vZGUsCiAgICAgICAgICAgICAgICAgICAgeHBhdGgsIG5zLCByZXN1bHQpIDwgMCkKICAgICAgICByZXQgPSAxOwoKICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgZnJlZShyZXN1bHQpOwogICAgaWYgKHhwYXRoICE9IE5VTEwpIGZyZWUoeHBhdGgpOwogICAgaWYgKG5zICE9IE5VTEwpIGZyZWUobnMpOwogICAgcmV0dXJuKHJldCk7Cn0KCnN0YXRpYyBpbnQKYzE0bldpdGhDb21tZW50VGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bCBBVFRSSUJVVEVfVU5VU0VELAoJCSAgICBjb25zdCBjaGFyICplcnIgQVRUUklCVVRFX1VOVVNFRCwKCQkgICAgaW50IG9wdGlvbnMgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKGMxNG5Db21tb25UZXN0KGZpbGVuYW1lLCAxLCBYTUxfQzE0Tl8xXzAsICJ3aXRoLWNvbW1lbnRzIikpOwp9CnN0YXRpYyBpbnQKYzE0bldpdGhvdXRDb21tZW50VGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bCBBVFRSSUJVVEVfVU5VU0VELAoJCSAgICBjb25zdCBjaGFyICplcnIgQVRUUklCVVRFX1VOVVNFRCwKCQkgICAgaW50IG9wdGlvbnMgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKGMxNG5Db21tb25UZXN0KGZpbGVuYW1lLCAwLCBYTUxfQzE0Tl8xXzAsICJ3aXRob3V0LWNvbW1lbnRzIikpOwp9CnN0YXRpYyBpbnQKYzE0bkV4Y1dpdGhvdXRDb21tZW50VGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZXN1bCBBVFRSSUJVVEVfVU5VU0VELAoJCSAgICBjb25zdCBjaGFyICplcnIgQVRUUklCVVRFX1VOVVNFRCwKCQkgICAgaW50IG9wdGlvbnMgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKGMxNG5Db21tb25UZXN0KGZpbGVuYW1lLCAwLCBYTUxfQzE0Tl9FWENMVVNJVkVfMV8wLCAiZXhjLXdpdGhvdXQtY29tbWVudHMiKSk7Cn0Kc3RhdGljIGludApjMTRuMTFXaXRob3V0Q29tbWVudFRlc3QoY29uc3QgY2hhciAqZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVzdWwgQVRUUklCVVRFX1VOVVNFRCwKCQkgICAgY29uc3QgY2hhciAqZXJyIEFUVFJJQlVURV9VTlVTRUQsCgkJICAgIGludCBvcHRpb25zIEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIHJldHVybihjMTRuQ29tbW9uVGVzdChmaWxlbmFtZSwgMCwgWE1MX0MxNE5fMV8xLCAiMS0xLXdpdGhvdXQtY29tbWVudHMiKSk7Cn0KI2VuZGlmCiNpZiBkZWZpbmVkKExJQlhNTF9USFJFQURfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfQ0FUQUxPR19FTkFCTEVEKSAmJiBkZWZpbmVkIChMSUJYTUxfU0FYMV9FTkFCTEVEKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJCQkJCQkJKgogKgkJCUNhdGFsb2cgYW5kIHRocmVhZHMgdGVzdAkJCSoKICoJCQkJCQkJCQkqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBtb3N0bHkgYSBjdXQgYW5kIHBhc3RlIGZyb20gdGVzdFRocmVhZHMuYwogKi8KI2RlZmluZQlNQVhfQVJHQwkyMAoKc3RhdGljIGNvbnN0IGNoYXIgKmNhdGFsb2cgPSAidGVzdC90aHJlYWRzL2NvbXBsZXgueG1sIjsKc3RhdGljIGNvbnN0IGNoYXIgKnRlc3RmaWxlc1tdID0gewogICAgInRlc3QvdGhyZWFkcy9hYmMueG1sIiwKICAgICJ0ZXN0L3RocmVhZHMvYWNiLnhtbCIsCiAgICAidGVzdC90aHJlYWRzL2JhYy54bWwiLAogICAgInRlc3QvdGhyZWFkcy9iY2EueG1sIiwKICAgICJ0ZXN0L3RocmVhZHMvY2FiLnhtbCIsCiAgICAidGVzdC90aHJlYWRzL2NiYS54bWwiLAogICAgInRlc3QvdGhyZWFkcy9pbnZhbGlkLnhtbCIsCn07CgpzdGF0aWMgY29uc3QgY2hhciAqT2theSA9ICJPSyI7CnN0YXRpYyBjb25zdCBjaGFyICpGYWlsZWQgPSAiRmFpbGVkIjsKCiNpZm5kZWYgeG1sRG9WYWxpZGl0eUNoZWNraW5nRGVmYXVsdFZhbHVlCiNlcnJvciB4bWxEb1ZhbGlkaXR5Q2hlY2tpbmdEZWZhdWx0VmFsdWUgaXMgbm90IGEgbWFjcm8KI2VuZGlmCiNpZm5kZWYgeG1sR2VuZXJpY0Vycm9yQ29udGV4dAojZXJyb3IgeG1sR2VuZXJpY0Vycm9yQ29udGV4dCBpcyBub3QgYSBtYWNybwojZW5kaWYKCnN0YXRpYyB2b2lkICoKdGhyZWFkX3NwZWNpZmljX2RhdGEodm9pZCAqcHJpdmF0ZV9kYXRhKQp7CiAgICB4bWxEb2NQdHIgbXlEb2M7CiAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IChjb25zdCBjaGFyICopIHByaXZhdGVfZGF0YTsKICAgIGludCBva2F5ID0gMTsKCiAgICBpZiAoIXN0cmNtcChmaWxlbmFtZSwgInRlc3QvdGhyZWFkcy9pbnZhbGlkLnhtbCIpKSB7CiAgICAgICAgeG1sRG9WYWxpZGl0eUNoZWNraW5nRGVmYXVsdFZhbHVlID0gMDsKICAgICAgICB4bWxHZW5lcmljRXJyb3JDb250ZXh0ID0gc3Rkb3V0OwogICAgfSBlbHNlIHsKICAgICAgICB4bWxEb1ZhbGlkaXR5Q2hlY2tpbmdEZWZhdWx0VmFsdWUgPSAxOwogICAgICAgIHhtbEdlbmVyaWNFcnJvckNvbnRleHQgPSBzdGRlcnI7CiAgICB9CiAgICBteURvYyA9IHhtbFBhcnNlRmlsZShmaWxlbmFtZSk7CiAgICBpZiAobXlEb2MpIHsKICAgICAgICB4bWxGcmVlRG9jKG15RG9jKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnRmKCJwYXJzZSBmYWlsZWRcbiIpOwogICAgICAgIG9rYXkgPSAwOwogICAgfQogICAgaWYgKCFzdHJjbXAoZmlsZW5hbWUsICJ0ZXN0L3RocmVhZHMvaW52YWxpZC54bWwiKSkgewogICAgICAgIGlmICh4bWxEb1ZhbGlkaXR5Q2hlY2tpbmdEZWZhdWx0VmFsdWUgIT0gMCkgewogICAgICAgICAgICBwcmludGYoIlZhbGlkaXR5Q2hlY2tpbmdEZWZhdWx0VmFsdWUgb3ZlcnJpZGUgZmFpbGVkXG4iKTsKICAgICAgICAgICAgb2theSA9IDA7CiAgICAgICAgfQogICAgICAgIGlmICh4bWxHZW5lcmljRXJyb3JDb250ZXh0ICE9IHN0ZG91dCkgewogICAgICAgICAgICBwcmludGYoInhtbEdlbmVyaWNFcnJvckNvbnRleHQgb3ZlcnJpZGUgZmFpbGVkXG4iKTsKICAgICAgICAgICAgb2theSA9IDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZiAoeG1sRG9WYWxpZGl0eUNoZWNraW5nRGVmYXVsdFZhbHVlICE9IDEpIHsKICAgICAgICAgICAgcHJpbnRmKCJWYWxpZGl0eUNoZWNraW5nRGVmYXVsdFZhbHVlIG92ZXJyaWRlIGZhaWxlZFxuIik7CiAgICAgICAgICAgIG9rYXkgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCAhPSBzdGRlcnIpIHsKICAgICAgICAgICAgcHJpbnRmKCJ4bWxHZW5lcmljRXJyb3JDb250ZXh0IG92ZXJyaWRlIGZhaWxlZFxuIik7CiAgICAgICAgICAgIG9rYXkgPSAwOwogICAgICAgIH0KICAgIH0KICAgIGlmIChva2F5ID09IDApCiAgICAgICAgcmV0dXJuICgodm9pZCAqKSBGYWlsZWQpOwogICAgcmV0dXJuICgodm9pZCAqKSBPa2F5KTsKfQoKI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19zdW4pIHx8IGRlZmluZWQoX19BUFBMRV9DQ19fKQoKI2luY2x1ZGUgPHB0aHJlYWQuaD4KCnN0YXRpYyBwdGhyZWFkX3QgdGlkW01BWF9BUkdDXTsKCnN0YXRpYyBpbnQKdGVzdFRocmVhZCh2b2lkKQp7CiAgICB1bnNpZ25lZCBpbnQgaSwgcmVwZWF0OwogICAgdW5zaWduZWQgaW50IG51bV90aHJlYWRzID0gc2l6ZW9mKHRlc3RmaWxlcykgLyBzaXplb2YodGVzdGZpbGVzWzBdKTsKICAgIHZvaWQgKnJlc3VsdHNbTUFYX0FSR0NdOwogICAgaW50IHJldDsKICAgIGludCByZXMgPSAwOwoKICAgIHhtbEluaXRQYXJzZXIoKTsKCiAgICBmb3IgKHJlcGVhdCA9IDA7IHJlcGVhdCA8IDUwMDsgcmVwZWF0KyspIHsKICAgICAgICB4bWxMb2FkQ2F0YWxvZyhjYXRhbG9nKTsKICAgICAgICBuYl90ZXN0cysrOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3RocmVhZHM7IGkrKykgewogICAgICAgICAgICByZXN1bHRzW2ldID0gTlVMTDsKICAgICAgICAgICAgdGlkW2ldID0gKHB0aHJlYWRfdCkgLSAxOwogICAgICAgIH0KCiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspIHsKICAgICAgICAgICAgcmV0ID0gcHRocmVhZF9jcmVhdGUoJnRpZFtpXSwgMCwgdGhyZWFkX3NwZWNpZmljX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIHRlc3RmaWxlc1tpXSk7CiAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgewogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwdGhyZWFkX2NyZWF0ZSBmYWlsZWRcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuICgxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3RocmVhZHM7IGkrKykgewogICAgICAgICAgICByZXQgPSBwdGhyZWFkX2pvaW4odGlkW2ldLCAmcmVzdWx0c1tpXSk7CiAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgewogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwdGhyZWFkX2pvaW4gZmFpbGVkXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAoMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHhtbENhdGFsb2dDbGVhbnVwKCk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspCiAgICAgICAgICAgIGlmIChyZXN1bHRzW2ldICE9ICh2b2lkICopIE9rYXkpIHsKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkICVkIGhhbmRsaW5nICVzIGZhaWxlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgaSwgdGVzdGZpbGVzW2ldKTsKICAgICAgICAgICAgICAgIHJlcyA9IDE7CiAgICAgICAgICAgIH0KICAgIH0KICAgIHJldHVybiAocmVzKTsKfQoKI2VsaWYgZGVmaW5lZCBXSU4zMgojaW5jbHVkZSA8d2luZG93cy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojZGVmaW5lIFRFU1RfUkVQRUFUX0NPVU5UIDUwMAoKc3RhdGljIEhBTkRMRSB0aWRbTUFYX0FSR0NdOwoKc3RhdGljIERXT1JEIFdJTkFQSQp3aW4zMl90aHJlYWRfc3BlY2lmaWNfZGF0YSh2b2lkICpwcml2YXRlX2RhdGEpCnsKICAgIHJldHVybigoRFdPUkQpIHRocmVhZF9zcGVjaWZpY19kYXRhKHByaXZhdGVfZGF0YSkpOwp9CgpzdGF0aWMgaW50CnRlc3RUaHJlYWQodm9pZCkKewogICAgdW5zaWduZWQgaW50IGksIHJlcGVhdDsKICAgIHVuc2lnbmVkIGludCBudW1fdGhyZWFkcyA9IHNpemVvZih0ZXN0ZmlsZXMpIC8gc2l6ZW9mKHRlc3RmaWxlc1swXSk7CiAgICBEV09SRCByZXN1bHRzW01BWF9BUkdDXTsKICAgIEJPT0wgcmV0OwogICAgaW50IHJlcyA9IDA7CgogICAgeG1sSW5pdFBhcnNlcigpOwogICAgZm9yIChyZXBlYXQgPSAwOyByZXBlYXQgPCBURVNUX1JFUEVBVF9DT1VOVDsgcmVwZWF0KyspIHsKICAgICAgICB4bWxMb2FkQ2F0YWxvZyhjYXRhbG9nKTsKICAgICAgICBuYl90ZXN0cysrOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3RocmVhZHM7IGkrKykgewogICAgICAgICAgICByZXN1bHRzW2ldID0gMDsKICAgICAgICAgICAgdGlkW2ldID0gKEhBTkRMRSkgLSAxOwogICAgICAgIH0KCiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspIHsKICAgICAgICAgICAgRFdPUkQgdXNlbGVzczsKCiAgICAgICAgICAgIHRpZFtpXSA9IENyZWF0ZVRocmVhZChOVUxMLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luMzJfdGhyZWFkX3NwZWNpZmljX2RhdGEsCgkJCQkgICh2b2lkICopIHRlc3RmaWxlc1tpXSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VsZXNzKTsKICAgICAgICAgICAgaWYgKHRpZFtpXSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNyZWF0ZVRocmVhZCBmYWlsZWRcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuKDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoV2FpdEZvck11bHRpcGxlT2JqZWN0cyhudW1fdGhyZWFkcywgdGlkLCBUUlVFLCBJTkZJTklURSkgPT0KICAgICAgICAgICAgV0FJVF9GQUlMRUQpIHsKICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJXYWl0Rm9yTXVsdGlwbGVPYmplY3RzIGZhaWxlZFxuIik7CgkgICAgcmV0dXJuKDEpOwoJfQoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3RocmVhZHM7IGkrKykgewogICAgICAgICAgICByZXQgPSBHZXRFeGl0Q29kZVRocmVhZCh0aWRbaV0sICZyZXN1bHRzW2ldKTsKICAgICAgICAgICAgaWYgKHJldCA9PSAwKSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkdldEV4aXRDb2RlVGhyZWFkIGZhaWxlZFxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4oMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQ2xvc2VIYW5kbGUodGlkW2ldKTsKICAgICAgICB9CgogICAgICAgIHhtbENhdGFsb2dDbGVhbnVwKCk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspIHsKICAgICAgICAgICAgaWYgKHJlc3VsdHNbaV0gIT0gKERXT1JEKSBPa2F5KSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRocmVhZCAlZCBoYW5kbGluZyAlcyBmYWlsZWRcbiIsCgkJICAgICAgICBpLCB0ZXN0ZmlsZXNbaV0pOwoJICAgICAgICByZXMgPSAxOwoJICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIChyZXMpOwp9CgojZWxpZiBkZWZpbmVkIF9fQkVPU19fCiNpbmNsdWRlIDxPUy5oPgoKc3RhdGljIHRocmVhZF9pZCB0aWRbTUFYX0FSR0NdOwoKc3RhdGljIGludAp0ZXN0VGhyZWFkKHZvaWQpCnsKICAgIHVuc2lnbmVkIGludCBpLCByZXBlYXQ7CiAgICB1bnNpZ25lZCBpbnQgbnVtX3RocmVhZHMgPSBzaXplb2YodGVzdGZpbGVzKSAvIHNpemVvZih0ZXN0ZmlsZXNbMF0pOwogICAgdm9pZCAqcmVzdWx0c1tNQVhfQVJHQ107CiAgICBzdGF0dXNfdCByZXQ7CiAgICBpbnQgcmVzID0gMDsKCiAgICB4bWxJbml0UGFyc2VyKCk7CiAgICBmb3IgKHJlcGVhdCA9IDA7IHJlcGVhdCA8IDUwMDsgcmVwZWF0KyspIHsKICAgICAgICB4bWxMb2FkQ2F0YWxvZyhjYXRhbG9nKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3RocmVhZHM7IGkrKykgewogICAgICAgICAgICByZXN1bHRzW2ldID0gTlVMTDsKICAgICAgICAgICAgdGlkW2ldID0gKHRocmVhZF9pZCkgLSAxOwogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3RocmVhZHM7IGkrKykgewogICAgICAgICAgICB0aWRbaV0gPQogICAgICAgICAgICAgICAgc3Bhd25fdGhyZWFkKHRocmVhZF9zcGVjaWZpY19kYXRhLCAieG1sVGVzdFRocmVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQl9OT1JNQUxfUFJJT1JJVFksICh2b2lkICopIHRlc3RmaWxlc1tpXSk7CiAgICAgICAgICAgIGlmICh0aWRbaV0gPCBCX09LKSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJlb3NfdGhyZWFkX2NyZWF0ZSBmYWlsZWRcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuICgxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludGYoImJlb3NfdGhyZWFkX2NyZWF0ZSAlZCAtPiAlZFxuIiwgaSwgdGlkW2ldKTsKICAgICAgICB9CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspIHsKICAgICAgICAgICAgcmV0ID0gd2FpdF9mb3JfdGhyZWFkKHRpZFtpXSwgJnJlc3VsdHNbaV0pOwogICAgICAgICAgICBwcmludGYoImJlb3NfdGhyZWFkX3dhaXQgJWQgLT4gJWRcbiIsIGksIHJldCk7CiAgICAgICAgICAgIGlmIChyZXQgIT0gQl9PSykgewogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJiZW9zX3RocmVhZF93YWl0IGZhaWxlZFxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gKDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB4bWxDYXRhbG9nQ2xlYW51cCgpOwogICAgICAgIHJldCA9IEJfT0s7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspCiAgICAgICAgICAgIGlmIChyZXN1bHRzW2ldICE9ICh2b2lkICopIE9rYXkpIHsKICAgICAgICAgICAgICAgIHByaW50ZigiVGhyZWFkICVkIGhhbmRsaW5nICVzIGZhaWxlZFxuIiwgaSwgdGVzdGZpbGVzW2ldKTsKICAgICAgICAgICAgICAgIHJldCA9IEJfRVJST1I7CiAgICAgICAgICAgIH0KICAgIH0KICAgIGlmIChyZXQgIT0gQl9PSykKICAgICAgICByZXR1cm4oMSk7CiAgICByZXR1cm4gKDApOwp9CiNlbHNlCnN0YXRpYyBpbnQKdGVzdFRocmVhZCh2b2lkKQp7CiAgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgIlNwZWNpZmljIHBsYXRmb3JtIHRocmVhZCBzdXBwb3J0IG5vdCBkZXRlY3RlZFxuIik7CiAgICByZXR1cm4gKC0xKTsKfQojZW5kaWYKc3RhdGljIGludAp0aHJlYWRzVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSBBVFRSSUJVVEVfVU5VU0VELAoJICAgIGNvbnN0IGNoYXIgKnJlc3VsIEFUVFJJQlVURV9VTlVTRUQsCgkgICAgY29uc3QgY2hhciAqZXJyIEFUVFJJQlVURV9VTlVTRUQsCgkgICAgaW50IG9wdGlvbnMgQVRUUklCVVRFX1VOVVNFRCkgewogICAgcmV0dXJuKHRlc3RUaHJlYWQoKSk7Cn0KI2VuZGlmCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJCQkJCQkqCiAqCQkJVGVzdHMgRGVzY3JpcHRpb25zCQkJCSoKICoJCQkJCQkJCQkqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMKdGVzdERlc2MgdGVzdERlc2NyaXB0aW9uc1tdID0gewogICAgeyAiWE1MIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgb2xkUGFyc2VUZXN0LCAiLi90ZXN0LyoiLCAicmVzdWx0LyIsICIiLCBOVUxMLAogICAgICAwIH0sCiAgICB7ICJYTUwgcmVncmVzc2lvbiB0ZXN0cyBvbiBtZW1vcnkiICwKICAgICAgbWVtUGFyc2VUZXN0LCAiLi90ZXN0LyoiLCAicmVzdWx0LyIsICIiLCBOVUxMLAogICAgICAwIH0sCiAgICB7ICJYTUwgZW50aXR5IHN1YnN0IHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgbm9lbnRQYXJzZVRlc3QsICIuL3Rlc3QvKiIsICJyZXN1bHQvbm9lbnQvIiwgIiIsIE5VTEwsCiAgICAgIFhNTF9QQVJTRV9OT0VOVCB9LAogICAgeyAiWE1MIE5hbWVzcGFjZXMgcmVncmVzc2lvbiB0ZXN0cyIsCiAgICAgIGVyclBhcnNlVGVzdCwgIi4vdGVzdC9uYW1lc3BhY2VzLyoiLCAicmVzdWx0L25hbWVzcGFjZXMvIiwgIiIsICIuZXJyIiwKICAgICAgMCB9LAogICAgeyAiRXJyb3IgY2FzZXMgcmVncmVzc2lvbiB0ZXN0cyIsCiAgICAgIGVyclBhcnNlVGVzdCwgIi4vdGVzdC9lcnJvcnMvKi54bWwiLCAicmVzdWx0L2Vycm9ycy8iLCAiIiwgIi5lcnIiLAogICAgICAwIH0sCiNpZmRlZiBMSUJYTUxfUkVBREVSX0VOQUJMRUQKICAgIHsgIkVycm9yIGNhc2VzIHN0cmVhbSByZWdyZXNzaW9uIHRlc3RzIiwKICAgICAgc3RyZWFtUGFyc2VUZXN0LCAiLi90ZXN0L2Vycm9ycy8qLnhtbCIsICJyZXN1bHQvZXJyb3JzLyIsIE5VTEwsICIuc3RyIiwKICAgICAgMCB9LAogICAgeyAiUmVhZGVyIHJlZ3Jlc3Npb24gdGVzdHMiLAogICAgICBzdHJlYW1QYXJzZVRlc3QsICIuL3Rlc3QvKiIsICJyZXN1bHQvIiwgIi5yZHIiLCBOVUxMLAogICAgICAwIH0sCiAgICB7ICJSZWFkZXIgZW50aXRpZXMgc3Vic3RpdHV0aW9uIHJlZ3Jlc3Npb24gdGVzdHMiLAogICAgICBzdHJlYW1QYXJzZVRlc3QsICIuL3Rlc3QvKiIsICJyZXN1bHQvIiwgIi5yZGUiLCBOVUxMLAogICAgICBYTUxfUEFSU0VfTk9FTlQgfSwKICAgIHsgIlJlYWRlciBvbiBtZW1vcnkgcmVncmVzc2lvbiB0ZXN0cyIsCiAgICAgIHN0cmVhbU1lbVBhcnNlVGVzdCwgIi4vdGVzdC8qIiwgInJlc3VsdC8iLCAiLnJkciIsIE5VTEwsCiAgICAgIDAgfSwKICAgIHsgIldhbGtlciByZWdyZXNzaW9uIHRlc3RzIiwKICAgICAgd2Fsa2VyUGFyc2VUZXN0LCAiLi90ZXN0LyoiLCAicmVzdWx0LyIsICIucmRyIiwgTlVMTCwKICAgICAgMCB9LAojZW5kaWYKI2lmZGVmIExJQlhNTF9TQVgxX0VOQUJMRUQKICAgIHsgIlNBWDEgY2FsbGJhY2tzIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgc2F4UGFyc2VUZXN0LCAiLi90ZXN0LyoiLCAicmVzdWx0LyIsICIuc2F4IiwgTlVMTCwKICAgICAgWE1MX1BBUlNFX1NBWDEgfSwKICAgIHsgIlNBWDIgY2FsbGJhY2tzIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgc2F4UGFyc2VUZXN0LCAiLi90ZXN0LyoiLCAicmVzdWx0LyIsICIuc2F4MiIsIE5VTEwsCiAgICAgIDAgfSwKI2VuZGlmCiNpZmRlZiBMSUJYTUxfUFVTSF9FTkFCTEVECiAgICB7ICJYTUwgcHVzaCByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIHB1c2hQYXJzZVRlc3QsICIuL3Rlc3QvKiIsICJyZXN1bHQvIiwgIiIsIE5VTEwsCiAgICAgIDAgfSwKI2VuZGlmCiNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECiAgICB7ICJIVE1MIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgZXJyUGFyc2VUZXN0LCAiLi90ZXN0L0hUTUwvKiIsICJyZXN1bHQvSFRNTC8iLCAiIiwgIi5lcnIiLAogICAgICBYTUxfUEFSU0VfSFRNTCB9LAojaWZkZWYgTElCWE1MX1BVU0hfRU5BQkxFRAogICAgeyAiUHVzaCBIVE1MIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgcHVzaFBhcnNlVGVzdCwgIi4vdGVzdC9IVE1MLyoiLCAicmVzdWx0L0hUTUwvIiwgIiIsICIuZXJyIiwKICAgICAgWE1MX1BBUlNFX0hUTUwgfSwKI2VuZGlmCiNpZmRlZiBMSUJYTUxfU0FYMV9FTkFCTEVECiAgICB7ICJIVE1MIFNBWCByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIHNheFBhcnNlVGVzdCwgIi4vdGVzdC9IVE1MLyoiLCAicmVzdWx0L0hUTUwvIiwgIi5zYXgiLCBOVUxMLAogICAgICBYTUxfUEFSU0VfSFRNTCB9LAojZW5kaWYKI2VuZGlmCiNpZmRlZiBMSUJYTUxfVkFMSURfRU5BQkxFRAogICAgeyAiVmFsaWQgZG9jdW1lbnRzIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgZXJyUGFyc2VUZXN0LCAiLi90ZXN0L1ZDTS8qIiwgTlVMTCwgTlVMTCwgTlVMTCwKICAgICAgWE1MX1BBUlNFX0RURFZBTElEIH0sCiAgICB7ICJWYWxpZGl0eSBjaGVja2luZyByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIGVyclBhcnNlVGVzdCwgIi4vdGVzdC9WQy8qIiwgInJlc3VsdC9WQy8iLCBOVUxMLCAiIiwKICAgICAgWE1MX1BBUlNFX0RURFZBTElEIH0sCiAgICB7ICJHZW5lcmFsIGRvY3VtZW50cyB2YWxpZCByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIGVyclBhcnNlVGVzdCwgIi4vdGVzdC92YWxpZC8qIiwgInJlc3VsdC92YWxpZC8iLCAiIiwgIi5lcnIiLAogICAgICBYTUxfUEFSU0VfRFREVkFMSUQgfSwKI2VuZGlmCiNpZmRlZiBMSUJYTUxfWElOQ0xVREVfRU5BQkxFRAogICAgeyAiWEluY2x1ZGUgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICBlcnJQYXJzZVRlc3QsICIuL3Rlc3QvWEluY2x1ZGUvZG9jcy8qIiwgInJlc3VsdC9YSW5jbHVkZS8iLCAiIiwgTlVMTCwKICAgICAgLyogSWdub3JlIGVycm9ycyBhdCB0aGlzIHBvaW50ICIuZXJyIiwgKi8KICAgICAgWE1MX1BBUlNFX1hJTkNMVURFIH0sCiNpZmRlZiBMSUJYTUxfUkVBREVSX0VOQUJMRUQKICAgIHsgIlhJbmNsdWRlIHhtbFJlYWRlciByZWdyZXNzaW9uIHRlc3RzIiwKICAgICAgc3RyZWFtUGFyc2VUZXN0LCAiLi90ZXN0L1hJbmNsdWRlL2RvY3MvKiIsICJyZXN1bHQvWEluY2x1ZGUvIiwgIi5yZHIiLAogICAgICAvKiBJZ25vcmUgZXJyb3JzIGF0IHRoaXMgcG9pbnQgIi5lcnIiLCAqLwogICAgICBOVUxMLCBYTUxfUEFSU0VfWElOQ0xVREUgfSwKI2VuZGlmCiAgICB7ICJYSW5jbHVkZSByZWdyZXNzaW9uIHRlc3RzIHN0cmlwcGluZyBpbmNsdWRlIG5vZGVzIiAsCiAgICAgIGVyclBhcnNlVGVzdCwgIi4vdGVzdC9YSW5jbHVkZS9kb2NzLyoiLCAicmVzdWx0L1hJbmNsdWRlLyIsICIiLCBOVUxMLAogICAgICAvKiBJZ25vcmUgZXJyb3JzIGF0IHRoaXMgcG9pbnQgIi5lcnIiLCAqLwogICAgICBYTUxfUEFSU0VfWElOQ0xVREUgfCBYTUxfUEFSU0VfTk9YSU5DTk9ERSB9LAojaWZkZWYgTElCWE1MX1JFQURFUl9FTkFCTEVECiAgICB7ICJYSW5jbHVkZSB4bWxSZWFkZXIgcmVncmVzc2lvbiB0ZXN0cyBzdHJpcHBpbmcgaW5jbHVkZSBub2RlcyIsCiAgICAgIHN0cmVhbVBhcnNlVGVzdCwgIi4vdGVzdC9YSW5jbHVkZS9kb2NzLyoiLCAicmVzdWx0L1hJbmNsdWRlLyIsICIucmRyIiwKICAgICAgLyogSWdub3JlIGVycm9ycyBhdCB0aGlzIHBvaW50ICIuZXJyIiwgKi8KICAgICAgTlVMTCwgWE1MX1BBUlNFX1hJTkNMVURFIHwgWE1MX1BBUlNFX05PWElOQ05PREUgfSwKI2VuZGlmCiNlbmRpZgojaWZkZWYgTElCWE1MX1hQQVRIX0VOQUJMRUQKI2lmZGVmIExJQlhNTF9ERUJVR19FTkFCTEVECiAgICB7ICJYUGF0aCBleHByZXNzaW9ucyByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIHhwYXRoRXhwclRlc3QsICIuL3Rlc3QvWFBhdGgvZXhwci8qIiwgInJlc3VsdC9YUGF0aC9leHByLyIsICIiLCBOVUxMLAogICAgICAwIH0sCiAgICB7ICJYUGF0aCBkb2N1bWVudCBxdWVyaWVzIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgeHBhdGhEb2NUZXN0LCAiLi90ZXN0L1hQYXRoL2RvY3MvKiIsIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgIDAgfSwKI2lmZGVmIExJQlhNTF9YUFRSX0VOQUJMRUQKICAgIHsgIlhQb2ludGVyIGRvY3VtZW50IHF1ZXJpZXMgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICB4cHRyRG9jVGVzdCwgIi4vdGVzdC9YUGF0aC9kb2NzLyoiLCBOVUxMLCBOVUxMLCBOVUxMLAogICAgICAwIH0sCiNlbmRpZgogICAgeyAieG1sOmlkIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgeG1saWREb2NUZXN0LCAiLi90ZXN0L3htbGlkLyoiLCAicmVzdWx0L3htbGlkLyIsICIiLCAiLmVyciIsCiAgICAgIDAgfSwKI2VuZGlmCiNlbmRpZgogICAgeyAiVVJJIHBhcnNpbmcgdGVzdHMiICwKICAgICAgdXJpUGFyc2VUZXN0LCAiLi90ZXN0L1VSSS8qLnVyaSIsICJyZXN1bHQvVVJJLyIsICIiLCBOVUxMLAogICAgICAwIH0sCiAgICB7ICJVUkkgYmFzZSBjb21wb3NpdGlvbiB0ZXN0cyIgLAogICAgICB1cmlCYXNlVGVzdCwgIi4vdGVzdC9VUkkvKi5kYXRhIiwgInJlc3VsdC9VUkkvIiwgIiIsIE5VTEwsCiAgICAgIDAgfSwKICAgIHsgIlBhdGggVVJJIGNvbnZlcnNpb24gdGVzdHMiICwKICAgICAgdXJpUGF0aFRlc3QsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgIDAgfSwKI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKICAgIHsgIlNjaGVtYXMgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICBzY2hlbWFzVGVzdCwgIi4vdGVzdC9zY2hlbWFzLypfKi54c2QiLCBOVUxMLCBOVUxMLCBOVUxMLAogICAgICAwIH0sCiAgICB7ICJSZWxheC1ORyByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIHJuZ1Rlc3QsICIuL3Rlc3QvcmVsYXhuZy8qLnJuZyIsIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgIFhNTF9QQVJTRV9EVERBVFRSIHwgWE1MX1BBUlNFX05PRU5UIH0sCiNpZmRlZiBMSUJYTUxfUkVBREVSX0VOQUJMRUQKICAgIHsgIlJlbGF4LU5HIHN0cmVhbWluZyByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIHJuZ1N0cmVhbVRlc3QsICIuL3Rlc3QvcmVsYXhuZy8qLnJuZyIsIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgIFhNTF9QQVJTRV9EVERBVFRSIHwgWE1MX1BBUlNFX05PRU5UIH0sCiNlbmRpZgojZW5kaWYKI2lmZGVmIExJQlhNTF9QQVRURVJOX0VOQUJMRUQKI2lmZGVmIExJQlhNTF9SRUFERVJfRU5BQkxFRAogICAgeyAiUGF0dGVybiByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIHBhdHRlcm5UZXN0LCAiLi90ZXN0L3BhdHRlcm4vKi5wYXQiLCAicmVzdWx0L3BhdHRlcm4vIiwgTlVMTCwgTlVMTCwKICAgICAgMCB9LAojZW5kaWYKI2VuZGlmCiNpZmRlZiBMSUJYTUxfQzE0Tl9FTkFCTEVECiAgICB7ICJDMTROIHdpdGggY29tbWVudHMgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICBjMTRuV2l0aENvbW1lbnRUZXN0LCAiLi90ZXN0L2MxNG4vd2l0aC1jb21tZW50cy8qLnhtbCIsIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgIDAgfSwKICAgIHsgIkMxNE4gd2l0aG91dCBjb21tZW50cyByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIGMxNG5XaXRob3V0Q29tbWVudFRlc3QsICIuL3Rlc3QvYzE0bi93aXRob3V0LWNvbW1lbnRzLyoueG1sIiwgTlVMTCwgTlVMTCwgTlVMTCwKICAgICAgMCB9LAogICAgeyAiQzE0TiBleGNsdXNpdmUgd2l0aG91dCBjb21tZW50cyByZWdyZXNzaW9uIHRlc3RzIiAsCiAgICAgIGMxNG5FeGNXaXRob3V0Q29tbWVudFRlc3QsICIuL3Rlc3QvYzE0bi9leGMtd2l0aG91dC1jb21tZW50cy8qLnhtbCIsIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgIDAgfSwKICAgIHsgIkMxNE4gMS4xIHdpdGhvdXQgY29tbWVudHMgcmVncmVzc2lvbiB0ZXN0cyIgLAogICAgICBjMTRuMTFXaXRob3V0Q29tbWVudFRlc3QsICIuL3Rlc3QvYzE0bi8xLTEtd2l0aG91dC1jb21tZW50cy8qLnhtbCIsIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgIDAgfSwKI2VuZGlmCiNpZiBkZWZpbmVkKExJQlhNTF9USFJFQURfRU5BQkxFRCkgJiYgZGVmaW5lZChMSUJYTUxfQ0FUQUxPR19FTkFCTEVEKSAmJiBkZWZpbmVkKExJQlhNTF9TQVgxX0VOQUJMRUQpCiAgICB7ICJDYXRhbG9nIGFuZCBUaHJlYWRzIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgdGhyZWFkc1Rlc3QsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgIDAgfSwKI2VuZGlmCiAgICB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMH0KfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJCQkJCQkqCiAqCQlUaGUgbWFpbiBjb2RlIGRyaXZpbmcgdGhlIHRlc3RzCQkJCSoKICoJCQkJCQkJCQkqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgaW50CmxhdW5jaFRlc3RzKHRlc3REZXNjUHRyIHRzdCkgewogICAgaW50IHJlcyA9IDAsIGVyciA9IDA7CiAgICBzaXplX3QgaTsKICAgIGNoYXIgKnJlc3VsdDsKICAgIGNoYXIgKmVycm9yOwogICAgaW50IG1lbTsKCiAgICBpZiAodHN0ID09IE5VTEwpIHJldHVybigtMSk7CiAgICBpZiAodHN0LT5pbiAhPSBOVUxMKSB7CglnbG9iX3QgZ2xvYmJ1ZjsKCglnbG9iYnVmLmdsX29mZnMgPSAwOwoJZ2xvYih0c3QtPmluLCBHTE9CX0RPT0ZGUywgTlVMTCwgJmdsb2JidWYpOwoJZm9yIChpID0gMDtpIDwgZ2xvYmJ1Zi5nbF9wYXRoYztpKyspIHsKCSAgICBpZiAoIWNoZWNrVGVzdEZpbGUoZ2xvYmJ1Zi5nbF9wYXRodltpXSkpCgkgICAgICAgIGNvbnRpbnVlOwoJICAgIGlmICh0c3QtPnN1ZmZpeCAhPSBOVUxMKSB7CgkJcmVzdWx0ID0gcmVzdWx0RmlsZW5hbWUoZ2xvYmJ1Zi5nbF9wYXRodltpXSwgdHN0LT5vdXQsCgkJCQkJdHN0LT5zdWZmaXgpOwoJCWlmIChyZXN1bHQgPT0gTlVMTCkgewoJCSAgICBmcHJpbnRmKHN0ZGVyciwgIk91dCBvZiBtZW1vcnkgIVxuIik7CgkJICAgIGZhdGFsRXJyb3IoKTsKCQl9CgkgICAgfSBlbHNlIHsKCSAgICAgICAgcmVzdWx0ID0gTlVMTDsKCSAgICB9CgkgICAgaWYgKHRzdC0+ZXJyICE9IE5VTEwpIHsKCQllcnJvciA9IHJlc3VsdEZpbGVuYW1lKGdsb2JidWYuZ2xfcGF0aHZbaV0sIHRzdC0+b3V0LAoJCSAgICAgICAgICAgICAgICAgICAgICAgIHRzdC0+ZXJyKTsKCQlpZiAoZXJyb3IgPT0gTlVMTCkgewoJCSAgICBmcHJpbnRmKHN0ZGVyciwgIk91dCBvZiBtZW1vcnkgIVxuIik7CgkJICAgIGZhdGFsRXJyb3IoKTsKCQl9CgkgICAgfSBlbHNlIHsKCSAgICAgICAgZXJyb3IgPSBOVUxMOwoJICAgIH0KCSAgICBpZiAoKHJlc3VsdCkgJiYoIWNoZWNrVGVzdEZpbGUocmVzdWx0KSkpIHsKCSAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIHJlc3VsdCBmaWxlICVzXG4iLCByZXN1bHQpOwoJICAgIH0gZWxzZSBpZiAoKGVycm9yKSAmJighY2hlY2tUZXN0RmlsZShlcnJvcikpKSB7CgkgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBlcnJvciBmaWxlICVzXG4iLCBlcnJvcik7CgkgICAgfSBlbHNlIHsKCQltZW0gPSB4bWxNZW1Vc2VkKCk7CgkJZXh0cmFNZW1vcnlGcm9tUmVzb2x2ZXIgPSAwOwoJCXRlc3RFcnJvcnNTaXplID0gMDsKCQl0ZXN0RXJyb3JzWzBdID0gMDsKCQlyZXMgPSB0c3QtPmZ1bmMoZ2xvYmJ1Zi5nbF9wYXRodltpXSwgcmVzdWx0LCBlcnJvciwKCQkgICAgICAgICAgICAgICAgdHN0LT5vcHRpb25zIHwgWE1MX1BBUlNFX0NPTVBBQ1QpOwoJCXhtbFJlc2V0TGFzdEVycm9yKCk7CgkJaWYgKHJlcyAhPSAwKSB7CgkJICAgIGZwcmludGYoc3RkZXJyLCAiRmlsZSAlcyBnZW5lcmF0ZWQgYW4gZXJyb3JcbiIsCgkJICAgICAgICAgICAgZ2xvYmJ1Zi5nbF9wYXRodltpXSk7CgkJICAgIG5iX2Vycm9ycysrOwoJCSAgICBlcnIrKzsKCQl9CgkJZWxzZSBpZiAoeG1sTWVtVXNlZCgpICE9IG1lbSkgewoJCSAgICBpZiAoKHhtbE1lbVVzZWQoKSAhPSBtZW0pICYmCgkJICAgICAgICAoZXh0cmFNZW1vcnlGcm9tUmVzb2x2ZXIgPT0gMCkpIHsKCQkJZnByaW50ZihzdGRlcnIsICJGaWxlICVzIGxlYWtlZCAlZCBieXRlc1xuIiwKCQkJCWdsb2JidWYuZ2xfcGF0aHZbaV0sIHhtbE1lbVVzZWQoKSAtIG1lbSk7CgkJCW5iX2xlYWtzKys7CgkJCWVycisrOwoJCSAgICB9CgkJfQoJCXRlc3RFcnJvcnNTaXplID0gMDsKCSAgICB9CgkgICAgaWYgKHJlc3VsdCkKCQlmcmVlKHJlc3VsdCk7CgkgICAgaWYgKGVycm9yKQoJCWZyZWUoZXJyb3IpOwoJfQoJZ2xvYmZyZWUoJmdsb2JidWYpOwogICAgfSBlbHNlIHsKICAgICAgICB0ZXN0RXJyb3JzU2l6ZSA9IDA7Cgl0ZXN0RXJyb3JzWzBdID0gMDsKCWV4dHJhTWVtb3J5RnJvbVJlc29sdmVyID0gMDsKICAgICAgICByZXMgPSB0c3QtPmZ1bmMoTlVMTCwgTlVMTCwgTlVMTCwgdHN0LT5vcHRpb25zKTsKCWlmIChyZXMgIT0gMCkgewoJICAgIG5iX2Vycm9ycysrOwoJICAgIGVycisrOwoJfQogICAgfQogICAgcmV0dXJuKGVycik7Cn0KCnN0YXRpYyBpbnQgdmVyYm9zZSA9IDA7CnN0YXRpYyBpbnQgdGVzdHNfcXVpZXQgPSAwOwoKc3RhdGljIGludApydW50ZXN0KGludCBpKSB7CiAgICBpbnQgcmV0ID0gMCwgcmVzOwogICAgaW50IG9sZF9lcnJvcnMsIG9sZF90ZXN0cywgb2xkX2xlYWtzOwoKICAgIG9sZF9lcnJvcnMgPSBuYl9lcnJvcnM7CiAgICBvbGRfdGVzdHMgPSBuYl90ZXN0czsKICAgIG9sZF9sZWFrcyA9IG5iX2xlYWtzOwogICAgaWYgKCh0ZXN0c19xdWlldCA9PSAwKSAmJiAodGVzdERlc2NyaXB0aW9uc1tpXS5kZXNjICE9IE5VTEwpKQoJcHJpbnRmKCIjIyAlc1xuIiwgdGVzdERlc2NyaXB0aW9uc1tpXS5kZXNjKTsKICAgIHJlcyA9IGxhdW5jaFRlc3RzKCZ0ZXN0RGVzY3JpcHRpb25zW2ldKTsKICAgIGlmIChyZXMgIT0gMCkKCXJldCsrOwogICAgaWYgKHZlcmJvc2UpIHsKCWlmICgobmJfZXJyb3JzID09IG9sZF9lcnJvcnMpICYmIChuYl9sZWFrcyA9PSBvbGRfbGVha3MpKQoJICAgIHByaW50ZigiUmFuICVkIHRlc3RzLCBubyBlcnJvcnNcbiIsIG5iX3Rlc3RzIC0gb2xkX3Rlc3RzKTsKCWVsc2UKCSAgICBwcmludGYoIlJhbiAlZCB0ZXN0cywgJWQgZXJyb3JzLCAlZCBsZWFrc1xuIiwKCQkgICBuYl90ZXN0cyAtIG9sZF90ZXN0cywKCQkgICBuYl9lcnJvcnMgLSBvbGRfZXJyb3JzLAoJCSAgIG5iX2xlYWtzIC0gb2xkX2xlYWtzKTsKICAgIH0KICAgIHJldHVybihyZXQpOwp9CgppbnQKbWFpbihpbnQgYXJnYyBBVFRSSUJVVEVfVU5VU0VELCBjaGFyICoqYXJndiBBVFRSSUJVVEVfVU5VU0VEKSB7CiAgICBpbnQgaSwgYSwgcmV0ID0gMDsKICAgIGludCBzdWJzZXQgPSAwOwoKICAgIGluaXRpYWxpemVMaWJ4bWwyKCk7CgogICAgZm9yIChhID0gMTsgYSA8IGFyZ2M7YSsrKSB7CiAgICAgICAgaWYgKCFzdHJjbXAoYXJndlthXSwgIi12IikpCgkgICAgdmVyYm9zZSA9IDE7CiAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2FdLCAiLXF1aWV0IikpCgkgICAgdGVzdHNfcXVpZXQgPSAxOwoJZWxzZSB7CgkgICAgZm9yIChpID0gMDsgdGVzdERlc2NyaXB0aW9uc1tpXS5mdW5jICE9IE5VTEw7IGkrKykgewoJICAgICAgICBpZiAoc3Ryc3RyKHRlc3REZXNjcmlwdGlvbnNbaV0uZGVzYywgYXJndlthXSkpIHsKCQkgICAgcmV0ICs9IHJ1bnRlc3QoaSk7CgkJICAgIHN1YnNldCsrOwoJCX0KCSAgICB9Cgl9CiAgICB9CiAgICBpZiAoc3Vic2V0ID09IDApIHsKCWZvciAoaSA9IDA7IHRlc3REZXNjcmlwdGlvbnNbaV0uZnVuYyAhPSBOVUxMOyBpKyspIHsKCSAgICByZXQgKz0gcnVudGVzdChpKTsKCX0KICAgIH0KICAgIGlmICgobmJfZXJyb3JzID09IDApICYmIChuYl9sZWFrcyA9PSAwKSkgewogICAgICAgIHJldCA9IDA7CglwcmludGYoIlRvdGFsICVkIHRlc3RzLCBubyBlcnJvcnNcbiIsCgkgICAgICAgbmJfdGVzdHMpOwogICAgfSBlbHNlIHsKICAgICAgICByZXQgPSAxOwoJcHJpbnRmKCJUb3RhbCAlZCB0ZXN0cywgJWQgZXJyb3JzLCAlZCBsZWFrc1xuIiwKCSAgICAgICBuYl90ZXN0cywgbmJfZXJyb3JzLCBuYl9sZWFrcyk7CiAgICB9CiAgICB4bWxDbGVhbnVwUGFyc2VyKCk7CiAgICB4bWxNZW1vcnlEdW1wKCk7CgogICAgcmV0dXJuKHJldCk7Cn0KCiNlbHNlIC8qICEgTElCWE1MX09VVFBVVF9FTkFCTEVEICovCmludAptYWluKGludCBhcmdjIEFUVFJJQlVURV9VTlVTRUQsIGNoYXIgKiphcmd2IEFUVFJJQlVURV9VTlVTRUQpIHsKICAgIGZwcmludGYoc3RkZXJyLCAicnVudGVzdCByZXF1aXJlcyBvdXRwdXQgdG8gYmUgZW5hYmxlZCBpbiBsaWJ4bWwyXG4iKTsKICAgIHJldHVybigxKTsKfQojZW5kaWYK