Iy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weTogdGVzdHMgZm9yIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgYW5kCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlcy4KIwojIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiMKIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KIwojIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCiMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwojIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCiMKIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiMgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgojCiMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKIyAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQojICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQojICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiMgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KCmltcG9ydCB1bml0dGVzdAppbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKCmRlZiBmdW5jX3JldHVybnRleHQoKToKICAgIHJldHVybiAiZm9vIgpkZWYgZnVuY19yZXR1cm51bmljb2RlKCk6CiAgICByZXR1cm4gdSJiYXIiCmRlZiBmdW5jX3JldHVybmludCgpOgogICAgcmV0dXJuIDQyCmRlZiBmdW5jX3JldHVybmZsb2F0KCk6CiAgICByZXR1cm4gMy4xNApkZWYgZnVuY19yZXR1cm5udWxsKCk6CiAgICByZXR1cm4gTm9uZQpkZWYgZnVuY19yZXR1cm5ibG9iKCk6CiAgICByZXR1cm4gYnVmZmVyKCJibG9iIikKZGVmIGZ1bmNfcmFpc2VleGNlcHRpb24oKToKICAgIDUvMAoKZGVmIGZ1bmNfaXNzdHJpbmcodik6CiAgICByZXR1cm4gdHlwZSh2KSBpcyB1bmljb2RlCmRlZiBmdW5jX2lzaW50KHYpOgogICAgcmV0dXJuIHR5cGUodikgaXMgaW50CmRlZiBmdW5jX2lzZmxvYXQodik6CiAgICByZXR1cm4gdHlwZSh2KSBpcyBmbG9hdApkZWYgZnVuY19pc25vbmUodik6CiAgICByZXR1cm4gdHlwZSh2KSBpcyB0eXBlKE5vbmUpCmRlZiBmdW5jX2lzYmxvYih2KToKICAgIHJldHVybiB0eXBlKHYpIGlzIGJ1ZmZlcgoKY2xhc3MgQWdnck5vU3RlcDoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIGZpbmFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiAxCgpjbGFzcyBBZ2dyTm9GaW5hbGl6ZToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIHN0ZXAoc2VsZiwgeCk6CiAgICAgICAgcGFzcwoKY2xhc3MgQWdnckV4Y2VwdGlvbkluSW5pdDoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICA1LzAKCiAgICBkZWYgc3RlcChzZWxmLCB4KToKICAgICAgICBwYXNzCgogICAgZGVmIGZpbmFsaXplKHNlbGYpOgogICAgICAgIHBhc3MKCmNsYXNzIEFnZ3JFeGNlcHRpb25JblN0ZXA6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBzdGVwKHNlbGYsIHgpOgogICAgICAgIDUvMAoKICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gNDIKCmNsYXNzIEFnZ3JFeGNlcHRpb25JbkZpbmFsaXplOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgc3RlcChzZWxmLCB4KToKICAgICAgICBwYXNzCgogICAgZGVmIGZpbmFsaXplKHNlbGYpOgogICAgICAgIDUvMAoKY2xhc3MgQWdnckNoZWNrVHlwZToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLnZhbCA9IE5vbmUKCiAgICBkZWYgc3RlcChzZWxmLCB3aGljaFR5cGUsIHZhbCk6CiAgICAgICAgdGhlVHlwZSA9IHsic3RyIjogdW5pY29kZSwgImludCI6IGludCwgImZsb2F0IjogZmxvYXQsICJOb25lIjogdHlwZShOb25lKSwgImJsb2IiOiBidWZmZXJ9CiAgICAgICAgc2VsZi52YWwgPSBpbnQodGhlVHlwZVt3aGljaFR5cGVdIGlzIHR5cGUodmFsKSkKCiAgICBkZWYgZmluYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudmFsCgpjbGFzcyBBZ2dyU3VtOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYudmFsID0gMC4wCgogICAgZGVmIHN0ZXAoc2VsZiwgdmFsKToKICAgICAgICBzZWxmLnZhbCArPSB2YWwKCiAgICBkZWYgZmluYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudmFsCgpjbGFzcyBGdW5jdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCgogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJudGV4dCIsIDAsIGZ1bmNfcmV0dXJudGV4dCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybnVuaWNvZGUiLCAwLCBmdW5jX3JldHVybnVuaWNvZGUpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5pbnQiLCAwLCBmdW5jX3JldHVybmludCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybmZsb2F0IiwgMCwgZnVuY19yZXR1cm5mbG9hdCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybm51bGwiLCAwLCBmdW5jX3JldHVybm51bGwpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5ibG9iIiwgMCwgZnVuY19yZXR1cm5ibG9iKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmFpc2VleGNlcHRpb24iLCAwLCBmdW5jX3JhaXNlZXhjZXB0aW9uKQoKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzc3RyaW5nIiwgMSwgZnVuY19pc3N0cmluZykKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzaW50IiwgMSwgZnVuY19pc2ludCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzZmxvYXQiLCAxLCBmdW5jX2lzZmxvYXQpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc25vbmUiLCAxLCBmdW5jX2lzbm9uZSkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzYmxvYiIsIDEsIGZ1bmNfaXNibG9iKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCgogICAgZGVmIENoZWNrRnVuY0Vycm9yT25DcmVhdGUoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImJsYSIsIC0xMDAsIGxhbWJkYSB4OiAyKngpCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKICAgICAgICAgICAgcGFzcwoKICAgIGRlZiBDaGVja0Z1bmNSZWZDb3VudChzZWxmKToKICAgICAgICBkZWYgZ2V0ZnVuYygpOgogICAgICAgICAgICBkZWYgZigpOgogICAgICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgICAgcmV0dXJuIGYKICAgICAgICBmID0gZ2V0ZnVuYygpCiAgICAgICAgZ2xvYmFscygpWyJmb28iXSA9IGYKICAgICAgICAjIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmVmdGVzdCIsIDAsIGdldGZ1bmMoKSkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJlZnRlc3QiLCAwLCBmKQogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZWZ0ZXN0KCkiKQoKICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5UZXh0KHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm50ZXh0KCkiKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCB1bmljb2RlKQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgImZvbyIpCgogICAgZGVmIENoZWNrRnVuY1JldHVyblVuaWNvZGUoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybnVuaWNvZGUoKSIpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHZhbCksIHVuaWNvZGUpCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCB1ImJhciIpCgogICAgZGVmIENoZWNrRnVuY1JldHVybkludChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJuaW50KCkiKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCBpbnQpCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCA0MikKCiAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuRmxvYXQoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybmZsb2F0KCkiKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCBmbG9hdCkKICAgICAgICBpZiB2YWwgPCAzLjEzOSBvciB2YWwgPiAzLjE0MToKICAgICAgICAgICAgc2VsZi5mYWlsKCJ3cm9uZyB2YWx1ZSIpCgogICAgZGVmIENoZWNrRnVuY1JldHVybk51bGwoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybm51bGwoKSIpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHZhbCksIHR5cGUoTm9uZSkpCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCBOb25lKQoKICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5CbG9iKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm5ibG9iKCkiKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCBidWZmZXIpCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCBidWZmZXIoImJsb2IiKSkKCiAgICBkZWYgQ2hlY2tGdW5jRXhjZXB0aW9uKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJhaXNlZXhjZXB0aW9uKCkiKQogICAgICAgICAgICBjdXIuZmV0Y2hvbmUoKQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBPcGVyYXRpb25hbEVycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsIGU6CiAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgJ3VzZXItZGVmaW5lZCBmdW5jdGlvbiByYWlzZWQgZXhjZXB0aW9uJykKCiAgICBkZWYgQ2hlY2tQYXJhbVN0cmluZyhzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNzdHJpbmcoPykiLCAoImZvbyIsKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tQYXJhbUludChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNpbnQoPykiLCAoNDIsKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tQYXJhbUZsb2F0KHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc2Zsb2F0KD8pIiwgKDMuMTQsKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tQYXJhbU5vbmUoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzbm9uZSg/KSIsIChOb25lLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCgogICAgZGVmIENoZWNrUGFyYW1CbG9iKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc2Jsb2IoPykiLCAoYnVmZmVyKCJibG9iIiksKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKCmNsYXNzIEFnZ3JlZ2F0ZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgiIiIKICAgICAgICAgICAgY3JlYXRlIHRhYmxlIHRlc3QoCiAgICAgICAgICAgICAgICB0IHRleHQsCiAgICAgICAgICAgICAgICBpIGludGVnZXIsCiAgICAgICAgICAgICAgICBmIGZsb2F0LAogICAgICAgICAgICAgICAgbiwKICAgICAgICAgICAgICAgIGIgYmxvYgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAiIiIpCiAgICAgICAgY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QodCwgaSwgZiwgbiwgYikgdmFsdWVzICg/LCA/LCA/LCA/LCA/KSIsCiAgICAgICAgICAgICgiZm9vIiwgNSwgMy4xNCwgTm9uZSwgYnVmZmVyKCJibG9iIiksKSkKCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgibm9zdGVwIiwgMSwgQWdnck5vU3RlcCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJub2ZpbmFsaXplIiwgMSwgQWdnck5vRmluYWxpemUpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgiZXhjSW5pdCIsIDEsIEFnZ3JFeGNlcHRpb25JbkluaXQpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgiZXhjU3RlcCIsIDEsIEFnZ3JFeGNlcHRpb25JblN0ZXApCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgiZXhjRmluYWxpemUiLCAxLCBBZ2dyRXhjZXB0aW9uSW5GaW5hbGl6ZSkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJjaGVja1R5cGUiLCAyLCBBZ2dyQ2hlY2tUeXBlKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoIm15c3VtIiwgMSwgQWdnclN1bSkKCiAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgI3NlbGYuY3VyLmNsb3NlKCkKICAgICAgICAjc2VsZi5jb24uY2xvc2UoKQogICAgICAgIHBhc3MKCiAgICBkZWYgQ2hlY2tBZ2dyRXJyb3JPbkNyZWF0ZShzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigiYmxhIiwgLTEwMCwgQWdnclN1bSkKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yOgogICAgICAgICAgICBwYXNzCgogICAgZGVmIENoZWNrQWdnck5vU3RlcChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIHRyeToKICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBub3N0ZXAodCkgZnJvbSB0ZXN0IikKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gQXR0cmlidXRlRXJyb3IiKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvciwgZToKICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZS5hcmdzWzBdLCAiQWdnck5vU3RlcCBpbnN0YW5jZSBoYXMgbm8gYXR0cmlidXRlICdzdGVwJyIpCgogICAgZGVmIENoZWNrQWdnck5vRmluYWxpemUoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9maW5hbGl6ZSh0KSBmcm9tIHRlc3QiKQogICAgICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsIGU6CiAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnZmluYWxpemUnIG1ldGhvZCByYWlzZWQgZXJyb3IiKQoKICAgIGRlZiBDaGVja0FnZ3JFeGNlcHRpb25JbkluaXQoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjSW5pdCh0KSBmcm9tIHRlc3QiKQogICAgICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsIGU6CiAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnX19pbml0X18nIG1ldGhvZCByYWlzZWQgZXJyb3IiKQoKICAgIGRlZiBDaGVja0FnZ3JFeGNlcHRpb25JblN0ZXAoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjU3RlcCh0KSBmcm9tIHRlc3QiKQogICAgICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsIGU6CiAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnc3RlcCcgbWV0aG9kIHJhaXNlZCBlcnJvciIpCgogICAgZGVmIENoZWNrQWdnckV4Y2VwdGlvbkluRmluYWxpemUoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjRmluYWxpemUodCkgZnJvbSB0ZXN0IikKICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBlOgogICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChlLmFyZ3NbMF0sICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ2ZpbmFsaXplJyBtZXRob2QgcmFpc2VkIGVycm9yIikKCiAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbVN0cihzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdzdHInLCA/KSIsICgiZm9vIiwpKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQoKICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtSW50KHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ2ludCcsID8pIiwgKDQyLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCgogICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1GbG9hdChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdmbG9hdCcsID8pIiwgKDMuMTQsKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbU5vbmUoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZSgnTm9uZScsID8pIiwgKE5vbmUsKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbUJsb2Ioc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZSgnYmxvYicsID8pIiwgKGJ1ZmZlcigiYmxvYiIpLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCgogICAgZGVmIENoZWNrQWdnckNoZWNrQWdnclN1bShzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKICAgICAgICBjdXIuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg/KSIsIFsoMTAsKSwgKDIwLCksICgzMCwpXSkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IG15c3VtKGkpIGZyb20gdGVzdCIpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDYwKQoKZGVmIGF1dGhvcml6ZXJfY2IoYWN0aW9uLCBhcmcxLCBhcmcyLCBkYm5hbWUsIHNvdXJjZSk6CiAgICBpZiBhY3Rpb24gIT0gc3FsaXRlLlNRTElURV9TRUxFQ1Q6CiAgICAgICAgcmV0dXJuIHNxbGl0ZS5TUUxJVEVfREVOWQogICAgaWYgYXJnMiA9PSAnYzInIG9yIGFyZzEgPT0gJ3QyJzoKICAgICAgICByZXR1cm4gc3FsaXRlLlNRTElURV9ERU5ZCiAgICByZXR1cm4gc3FsaXRlLlNRTElURV9PSwoKY2xhc3MgQXV0aG9yaXplclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgc2VsZi5jb24uZXhlY3V0ZXNjcmlwdCgiIiIKICAgICAgICAgICAgY3JlYXRlIHRhYmxlIHQxIChjMSwgYzIpOwogICAgICAgICAgICBjcmVhdGUgdGFibGUgdDIgKGMxLCBjMik7CiAgICAgICAgICAgIGluc2VydCBpbnRvIHQxIChjMSwgYzIpIHZhbHVlcyAoMSwgMik7CiAgICAgICAgICAgIGluc2VydCBpbnRvIHQyIChjMSwgYzIpIHZhbHVlcyAoNCwgNSk7CiAgICAgICAgICAgICIiIikKCiAgICAgICAgIyBGb3Igb3VyIHNlY3VyaXR5IHRlc3Q6CiAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IGMyIGZyb20gdDIiKQoKICAgICAgICBzZWxmLmNvbi5zZXRfYXV0aG9yaXplcihhdXRob3JpemVyX2NiKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIENoZWNrVGFibGVBY2Nlc3Moc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgKiBmcm9tIHQyIikKICAgICAgICBleGNlcHQgc3FsaXRlLkRhdGFiYXNlRXJyb3IsIGU6CiAgICAgICAgICAgIGlmIG5vdCBlLmFyZ3NbMF0uZW5kc3dpdGgoInByb2hpYml0ZWQiKToKICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgZXhjZXB0aW9uIHRleHQ6ICVzIiAlIGUuYXJnc1swXSkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gZXhjZXB0aW9uIGR1ZSB0byBtaXNzaW5nIHByaXZpbGVnZXMiKQoKICAgIGRlZiBDaGVja0NvbHVtbkFjY2VzcyhzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCBjMiBmcm9tIHQxIikKICAgICAgICBleGNlcHQgc3FsaXRlLkRhdGFiYXNlRXJyb3IsIGU6CiAgICAgICAgICAgIGlmIG5vdCBlLmFyZ3NbMF0uZW5kc3dpdGgoInByb2hpYml0ZWQiKToKICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgZXhjZXB0aW9uIHRleHQ6ICVzIiAlIGUuYXJnc1swXSkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gZXhjZXB0aW9uIGR1ZSB0byBtaXNzaW5nIHByaXZpbGVnZXMiKQoKZGVmIHN1aXRlKCk6CiAgICBmdW5jdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShGdW5jdGlvblRlc3RzLCAiQ2hlY2siKQogICAgYWdncmVnYXRlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEFnZ3JlZ2F0ZVRlc3RzLCAiQ2hlY2siKQogICAgYXV0aG9yaXplcl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShBdXRob3JpemVyVGVzdHMsICJDaGVjayIpCiAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChmdW5jdGlvbl9zdWl0ZSwgYWdncmVnYXRlX3N1aXRlLCBhdXRob3JpemVyX3N1aXRlKSkKCmRlZiB0ZXN0KCk6CiAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCiAgICBydW5uZXIucnVuKHN1aXRlKCkpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgdGVzdCgpCg==