PGh0bWw+CjwhLS0KTk9URTogVGhpcyBpbnRlbnRpb25hbGx5IGRvZXMgbm90IHVzZSBkZXNjcmlwdGlvbigpIGFuZCBkb2VzIG5vdCBpbmNsdWRlIGpzLXRlc3QtcG9zdCBiZWNhdXNlCmRvaW5nIGVpdGhlciBvZiB0aG9zZSB0aGluZ3MgbWFkZSB0aGUgYnVnIGdvIGF3YXkuCgpOT1RFOiBUaGlzIGludGVudGlvbmFsbHkgZG9lcyBub3QgdXNlIHRoZSBuYW1lIGBDU1MuZXNjYXBlYCBiZWNhdXNlIHRoYXQgZnVuY3Rpb24gZXhpc3RzIG5vdyBidXQKZGlkIG5vdCB3aGVuIHRoaXMgdGVzdCB3YXMgYWRkZWQuIFRoZSBuYW1lIHdhcyBjaGFuZ2VkIHRvIGBDU1MubGF5b3V0VGVzdEVzY2FwZWAgZm9yIHRoaXMgdGVzdC4KLS0+CiAgPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9qcy10ZXN0LXByZS5qcyI+PC9zY3JpcHQ+CiAgPHNjcmlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnPgovKiEgaHR0cHM6Ly9tdGhzLmJlL2Nzc2VzY2FwZSB2MS4xLjAgYnkgQG1hdGhpYXMgfCBNSVQgbGljZW5zZSAqLwo7KGZ1bmN0aW9uKHJvb3QpIHsKCglpZiAoIXJvb3QuQ1NTKSB7CgkJcm9vdC5DU1MgPSB7fTsKCX0KCgl2YXIgQ1NTID0gcm9vdC5DU1M7CgoJdmFyIEludmFsaWRDaGFyYWN0ZXJFcnJvciA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwoJfTsKCUludmFsaWRDaGFyYWN0ZXJFcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3I7CglJbnZhbGlkQ2hhcmFjdGVyRXJyb3IucHJvdG90eXBlLm5hbWUgPSAnSW52YWxpZENoYXJhY3RlckVycm9yJzsKCglpZiAoIUNTUy5sYXlvdXRUZXN0RXNjYXBlKSB7CgkJLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNzZXJpYWxpemUtYW4taWRlbnRpZmllcgoJCUNTUy5sYXlvdXRUZXN0RXNjYXBlID0gZnVuY3Rpb24odmFsdWUpIHsKCQkJdmFyIHN0cmluZyA9IFN0cmluZyh2YWx1ZSk7CgkJCXZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoOwoJCQl2YXIgaW5kZXggPSAtMTsKCQkJdmFyIGNvZGVVbml0OwoJCQl2YXIgcmVzdWx0ID0gJyc7CgkJCXZhciBmaXJzdENvZGVVbml0ID0gc3RyaW5nLmNoYXJDb2RlQXQoMCk7CgkJCXdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CgkJCQljb2RlVW5pdCA9IHN0cmluZy5jaGFyQ29kZUF0KGluZGV4KTsKCQkJCS8vIE5vdGU6IHRoZXJlknMgbm8gbmVlZCB0byBzcGVjaWFsLWNhc2UgYXN0cmFsIHN5bWJvbHMsIHN1cnJvZ2F0ZQoJCQkJLy8gcGFpcnMsIG9yIGxvbmUgc3Vycm9nYXRlcy4KCgkJCQkvLyBJZiB0aGUgY2hhcmFjdGVyIGlzIE5VTEwgKFUrMDAwMCksIHRoZW4gdGhyb3cgYW4KCQkJCS8vIGBJbnZhbGlkQ2hhcmFjdGVyRXJyb3JgIGV4Y2VwdGlvbiBhbmQgdGVybWluYXRlIHRoZXNlIHN0ZXBzLgoJCQkJaWYgKGNvZGVVbml0ID09IDB4MDAwMCkgewoJCQkJCXRocm93IG5ldyBJbnZhbGlkQ2hhcmFjdGVyRXJyb3IoCgkJCQkJCSdJbnZhbGlkIGNoYXJhY3RlcjogdGhlIGlucHV0IGNvbnRhaW5zIFUrMDAwMC4nCgkJCQkJKTsKCQkJCX0KCgkJCQlpZiAoCgkJCQkJLy8gSWYgdGhlIGNoYXJhY3RlciBpcyBpbiB0aGUgcmFuZ2UgW1wxLVwxRl0gKFUrMDAwMSB0byBVKzAwMUYpIG9yIGlzCgkJCQkJLy8gVSswMDdGLCBbhV0KCQkJCQkoY29kZVVuaXQgPj0gMHgwMDAxICYmIGNvZGVVbml0IDw9IDB4MDAxRikgfHwgY29kZVVuaXQgPT0gMHgwMDdGIHx8CgkJCQkJLy8gSWYgdGhlIGNoYXJhY3RlciBpcyB0aGUgZmlyc3QgY2hhcmFjdGVyIGFuZCBpcyBpbiB0aGUgcmFuZ2UgWzAtOV0KCQkJCQkvLyAoVSswMDMwIHRvIFUrMDAzOSksIFuFXQoJCQkJCShpbmRleCA9PSAwICYmIGNvZGVVbml0ID49IDB4MDAzMCAmJiBjb2RlVW5pdCA8PSAweDAwMzkpIHx8CgkJCQkJLy8gSWYgdGhlIGNoYXJhY3RlciBpcyB0aGUgc2Vjb25kIGNoYXJhY3RlciBhbmQgaXMgaW4gdGhlIHJhbmdlIFswLTldCgkJCQkJLy8gKFUrMDAzMCB0byBVKzAwMzkpIGFuZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGEgYC1gIChVKzAwMkQpLCBbhV0KCQkJCQkoCgkJCQkJCWluZGV4ID09IDEgJiYKCQkJCQkJY29kZVVuaXQgPj0gMHgwMDMwICYmIGNvZGVVbml0IDw9IDB4MDAzOSAmJgoJCQkJCQlmaXJzdENvZGVVbml0ID09IDB4MDAyRAoJCQkJCSkKCQkJCSkgewoJCQkJCS8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3NvbS8jZXNjYXBlLWEtY2hhcmFjdGVyLWFzLWNvZGUtcG9pbnQKCQkJCQlyZXN1bHQgKz0gJ1xcJyArIGNvZGVVbml0LnRvU3RyaW5nKDE2KSArICcgJzsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQlpZiAoCgkJCQkJLy8gSWYgdGhlIGNoYXJhY3RlciBpcyB0aGUgZmlyc3QgY2hhcmFjdGVyIGFuZCBpcyBhIGAtYCAoVSswMDJEKSwgYW5kCgkJCQkJLy8gdGhlcmUgaXMgbm8gc2Vjb25kIGNoYXJhY3RlciwgW4VdCgkJCQkJaW5kZXggPT0gMCAmJgoJCQkJCWxlbmd0aCA9PSAxICYmCgkJCQkJY29kZVVuaXQgPT0gMHgwMDJECgkJCQkpIHsKCQkJCQlyZXN1bHQgKz0gJ1xcJyArIHN0cmluZy5jaGFyQXQoaW5kZXgpOwoJCQkJCWNvbnRpbnVlOwoJCQkJfQoKCQkJCS8vIElmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IGhhbmRsZWQgYnkgb25lIG9mIHRoZSBhYm92ZSBydWxlcyBhbmQgaXMKCQkJCS8vIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBVKzAwODAsIGlzIGAtYCAoVSswMDJEKSBvciBgX2AgKFUrMDA1RiksIG9yCgkJCQkvLyBpcyBpbiBvbmUgb2YgdGhlIHJhbmdlcyBbMC05XSAoVSswMDMwIHRvIFUrMDAzOSksIFtBLVpdIChVKzAwNDEgdG8KCQkJCS8vIFUrMDA1QSksIG9yIFthLXpdIChVKzAwNjEgdG8gVSswMDdBKSwgW4VdCgkJCQlpZiAoCgkJCQkJY29kZVVuaXQgPj0gMHgwMDgwIHx8CgkJCQkJY29kZVVuaXQgPT0gMHgwMDJEIHx8CgkJCQkJY29kZVVuaXQgPT0gMHgwMDVGIHx8CgkJCQkJY29kZVVuaXQgPj0gMHgwMDMwICYmIGNvZGVVbml0IDw9IDB4MDAzOSB8fAoJCQkJCWNvZGVVbml0ID49IDB4MDA0MSAmJiBjb2RlVW5pdCA8PSAweDAwNUEgfHwKCQkJCQljb2RlVW5pdCA+PSAweDAwNjEgJiYgY29kZVVuaXQgPD0gMHgwMDdBCgkJCQkpIHsKCQkJCQkvLyB0aGUgY2hhcmFjdGVyIGl0c2VsZgoJCQkJCXJlc3VsdCArPSBzdHJpbmcuY2hhckF0KGluZGV4KTsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkvLyBPdGhlcndpc2UsIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci4KCQkJCS8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3NvbS8jZXNjYXBlLWEtY2hhcmFjdGVyCgkJCQlyZXN1bHQgKz0gJ1xcJyArIHN0cmluZy5jaGFyQXQoaW5kZXgpOwoKCQkJfQoJCQlyZXR1cm4gcmVzdWx0OwoJCX07Cgl9Cgp9KHR5cGVvZiBnbG9iYWwgIT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB0aGlzKSk7CgogIDwvc2NyaXB0PgogIDxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz4KICAgIHRyeSB7CiAgICAgIHRlc3RSdW5uZXIuZHVtcEFzVGV4dCh3aW5kb3cuZW5hYmxlUGl4ZWxUZXN0aW5nKTsKICAgICAgdGVzdFJ1bm5lci53YWl0VW50aWxEb25lKCk7CiAgICB9IGNhdGNoIChlKSB7IH0KICAgIGlmICghd2luZG93LkNTUy5sYXlvdXRUZXN0RXNjYXBlKSB7CiAgICAgIGRlYnVnKCd3aW5kb3cuQ1NTLmxheW91dFRlc3RFc2NhcGUgbm90IGxvYWRlZCcpOwogICAgfQogICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgaWYgKHdpbmRvdy5DU1MubGF5b3V0VGVzdEVzY2FwZSkKICAgICAgICBkZWJ1Zygid2luZG93LkNTUy5sYXlvdXRUZXN0RXNjYXBlIHN0aWxsIGhlcmUiKTsKICAgICAgZWxzZQogICAgICAgIGRlYnVnKCd3aW5kb3cuQ1NTLmxheW91dFRlc3RFc2NhcGUgbWlzc2luZyBpbiBldmVudCcpOwogICAgICB0cnkgewogICAgICAgIHRlc3RSdW5uZXIubm90aWZ5RG9uZSgpOwogICAgICB9IGNhdGNoIChlKSB7IH0KICAgIH0sNTApOwogIDwvc2NyaXB0Pgo8L2h0bWw+Cg==