You are viewing a single comment's thread from:

RE: Test title

in #topic15 years ago

{
"id": "ssc-00000000000000000002",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "tokens",
"params": "",
"code": "Ly9jb25zdCBhY3Rpb25zID0ge30KLy9jb25zdCBhcGkgPSB7fQoKYWN0aW9ucy5jcmVhdGVTU0MgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgndG9rZW5zJywgWydzeW1ib2wnXSk7CiAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCdiYWxhbmNlcycsIFsnYWNjb3VudCddKTsKICBhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoJ2NvbnRyYWN0c0JhbGFuY2VzJywgWydhY2NvdW50J10pOwogIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgncGFyYW1zJyk7CiAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCdwZW5kaW5nVW5zdGFrZXMnLCBbJ2FjY291bnQnLCAndW5zdGFrZUNvbXBsZXRlVGltZXN0YW1wJ10pOwoKICBjb25zdCBwYXJhbXMgPSB7fTsKICBwYXJhbXMudG9rZW5DcmVhdGlvbkZlZSA9ICcwJzsKICBhd2FpdCBhcGkuZGIuaW5zZXJ0KCdwYXJhbXMnLCBwYXJhbXMpOwp9OwoKYWN0aW9ucy51cGRhdGVQYXJhbXMgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGlmIChhcGkuc2VuZGVyICE9PSBhcGkub3duZXIpIHJldHVybjsKCiAgY29uc3QgeyB0b2tlbkNyZWF0aW9uRmVlIH0gPSBwYXlsb2FkOwoKICBjb25zdCBwYXJhbXMgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncGFyYW1zJywge30pOwoKICBwYXJhbXMudG9rZW5DcmVhdGlvbkZlZSA9IHR5cGVvZiB0b2tlbkNyZWF0aW9uRmVlID09PSAnbnVtYmVyJyA/IHRva2VuQ3JlYXRpb25GZWUudG9GaXhlZCg4KSA6IHRva2VuQ3JlYXRpb25GZWU7CgogIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3BhcmFtcycsIHBhcmFtcyk7Cn07CgphY3Rpb25zLnVwZGF0ZVVybCA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgY29uc3QgeyB1cmwsIHN5bWJvbCB9ID0gcGF5bG9hZDsKCiAgaWYgKGFwaS5hc3NlcnQoc3ltYm9sICYmIHR5cGVvZiBzeW1ib2wgPT09ICdzdHJpbmcnCiAgICAmJiB1cmwgJiYgdHlwZW9mIHVybCA9PT0gJ3N0cmluZycsICdpbnZhbGlkIHBhcmFtcycpCiAgICAmJiBhcGkuYXNzZXJ0KHVybC5sZW5ndGggPD0gMjU1LCAnaW52YWxpZCB1cmw6IG1heCBsZW5ndGggb2YgMjU1JykpIHsKICAgIC8vIGNoZWNrIGlmIHRoZSB0b2tlbiBleGlzdHMKICAgIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3Rva2VucycsIHsgc3ltYm9sIH0pOwoKICAgIGlmICh0b2tlbikgewogICAgICBpZiAoYXBpLmFzc2VydCh0b2tlbi5pc3N1ZXIgPT09IGFwaS5zZW5kZXIsICdtdXN0IGJlIHRoZSBpc3N1ZXInKSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IEpTT04ucGFyc2UodG9rZW4ubWV0YWRhdGEpOwoKICAgICAgICAgIGlmIChhcGkuYXNzZXJ0KG1ldGFkYXRhICYmIG1ldGFkYXRhLnVybCwgJ2FuIGVycm9yIG9jY3VyZWQgd2hlbiB0cnlpbmcgdG8gdXBkYXRlIHRoZSB1cmwnKSkgewogICAgICAgICAgICBtZXRhZGF0YS51cmwgPSB1cmw7CiAgICAgICAgICAgIHRva2VuLm1ldGFkYXRhID0gSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEpOwogICAgICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCd0b2tlbnMnLCB0b2tlbik7CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgLy8gZXJyb3Igd2hlbiBwYXJzaW5nIHRoZSBtZXRhZGF0YQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfTsKCmFjdGlvbnMudXBkYXRlTWV0YWRhdGEgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsgbWV0YWRhdGEsIHN5bWJvbCB9ID0gcGF5bG9hZDsKCiAgaWYgKGFwaS5hc3NlcnQoc3ltYm9sICYmIHR5cGVvZiBzeW1ib2wgPT09ICdzdHJpbmcnCiAgICAmJiBtZXRhZGF0YSAmJiB0eXBlb2YgbWV0YWRhdGEgPT09ICdvYmplY3QnLCAnaW52YWxpZCBwYXJhbXMnKSkgewogICAgLy8gY2hlY2sgaWYgdGhlIHRva2VuIGV4aXN0cwogICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndG9rZW5zJywgeyBzeW1ib2wgfSk7CgogICAgaWYgKHRva2VuKSB7CiAgICAgIGlmIChhcGkuYXNzZXJ0KHRva2VuLmlzc3VlciA9PT0gYXBpLnNlbmRlciwgJ211c3QgYmUgdGhlIGlzc3VlcicpKSB7CgogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCBmaW5hbE1ldGFkYXRhID0gSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEpOwoKICAgICAgICAgIGlmIChhcGkuYXNzZXJ0KGZpbmFsTWV0YWRhdGEubGVuZ3RoIDw9IDEwMDAsICdpbnZhbGlkIG1ldGFkYXRhOiBtYXggbGVuZ3RoIG9mIDEwMDAnKSkgewogICAgICAgICAgICB0b2tlbi5tZXRhZGF0YSA9IGZpbmFsTWV0YWRhdGE7CiAgICAgICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3Rva2VucycsIHRva2VuKTsKICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAvLyBlcnJvciB3aGVuIHN0cmluZ2lmeWluZyB0aGUgbWV0YWRhdGEKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07CgphY3Rpb25zLnRyYW5zZmVyT3duZXJzaGlwID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7IHN5bWJvbCwgdG8sIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSB9ID0gcGF5bG9hZDsKCiAgaWYgKGFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAneW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5JykKICAgICYmIGFwaS5hc3NlcnQoc3ltYm9sICYmIHR5cGVvZiBzeW1ib2wgPT09ICdzdHJpbmcnCiAgICAgICYmIHRvICYmIHR5cGVvZiB0byA9PT0gJ3N0cmluZycsICdpbnZhbGlkIHBhcmFtcycpKSB7CiAgICAvLyBjaGVjayBpZiB0aGUgdG9rZW4gZXhpc3RzCiAgICBsZXQgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndG9rZW5zJywgeyBzeW1ib2wgfSk7CgogICAgaWYgKHRva2VuKSB7CiAgICAgIGlmIChhcGkuYXNzZXJ0KHRva2VuLmlzc3VlciA9PT0gYXBpLnNlbmRlciwgJ211c3QgYmUgdGhlIGlzc3VlcicpKSB7CiAgICAgICAgY29uc3QgZmluYWxUbyA9IHRvLnRyaW0oKTsKCiAgICAgICAgLy8gYSB2YWxpZCBzdGVlbSBhY2NvdW50IGlzIGJldHdlZW4gMyBhbmQgMTYgY2hhcmFjdGVycyBpbiBsZW5ndGgKICAgICAgICBpZiAoYXBpLmFzc2VydChmaW5hbFRvLmxlbmd0aCA+PSAzICYmIGZpbmFsVG8ubGVuZ3RoIDw9IDE2LCAnaW52YWxpZCB0bycpKSB7CiAgICAgICAgICB0b2tlbi5pc3N1ZXIgPSBmaW5hbFRvCiAgICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCd0b2tlbnMnLCB0b2tlbik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9OwoKY29uc3QgY3JlYXRlVk9uZSA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgY29uc3QgewogICAgbmFtZSwgc3ltYm9sLCB1cmwsIHByZWNpc2lvbiwgbWF4U3VwcGx5LCBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgfSA9IHBheWxvYWQ7CgogIC8vIGdldCBjb250cmFjdCBwYXJhbXMKICBjb25zdCBwYXJhbXMgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncGFyYW1zJywge30pOwogIGNvbnN0IHsgdG9rZW5DcmVhdGlvbkZlZSB9ID0gcGFyYW1zOwoKICAvLyBnZXQgYXBpLnNlbmRlcidzIFVUSUxJVFlfVE9LRU5fU1lNQk9MIGJhbGFuY2UKICBjb25zdCB1dGlsaXR5VG9rZW5CYWxhbmNlID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ2JhbGFuY2VzJywgeyBhY2NvdW50OiBhcGkuc2VuZGVyLCBzeW1ib2w6ICJTU0MiIH0pOwoKICBjb25zdCBhdXRob3JpemVkQ3JlYXRpb24gPSBhcGkuQmlnTnVtYmVyKHRva2VuQ3JlYXRpb25GZWUpLmx0ZSgnMCcpID8gdHJ1ZSA6IHV0aWxpdHlUb2tlbkJhbGFuY2UgJiYgYXBpLkJpZ051bWJlcih1dGlsaXR5VG9rZW5CYWxhbmNlLmJhbGFuY2UpLmd0ZSh0b2tlbkNyZWF0aW9uRmVlKTsKCiAgaWYgKGFwaS5hc3NlcnQoYXV0aG9yaXplZENyZWF0aW9uLCAneW91IG11c3QgaGF2ZSBlbm91Z2ggdG9rZW5zIHRvIGNvdmVyIHRoZSBjcmVhdGlvbiBmZWVzJykKICAgICYmIGFwaS5hc3NlcnQobmFtZSAmJiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycKICAgICAgJiYgc3ltYm9sICYmIHR5cGVvZiBzeW1ib2wgPT09ICdzdHJpbmcnCiAgICAgICYmICh1cmwgPT09IHVuZGVmaW5lZCB8fCAodXJsICYmIHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSkKICAgICAgJiYgKChwcmVjaXNpb24gJiYgdHlwZW9mIHByZWNpc2lvbiA9PT0gJ251bWJlcicpIHx8IHByZWNpc2lvbiA9PT0gMCkKICAgICAgJiYgbWF4U3VwcGx5ICYmIHR5cGVvZiBtYXhTdXBwbHkgPT09ICdudW1iZXInLCAnaW52YWxpZCBwYXJhbXMnKSkgewogICAgLy8gdGhlIHByZWNpc2lvbiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgOCBhbmQgbXVzdCBiZSBhbiBpbnRlZ2VyCiAgICAvLyB0aGUgbWF4IHN1cHBseSBtdXN0IGJlIHBvc2l0aXZlCiAgICBpZiAoYXBpLmFzc2VydChhcGkudmFsaWRhdG9yLmlzQWxwaGEoc3ltYm9sKSAmJiBhcGkudmFsaWRhdG9yLmlzVXBwZXJjYXNlKHN5bWJvbCkgJiYgc3ltYm9sLmxlbmd0aCA+IDAgJiYgc3ltYm9sLmxlbmd0aCA8PSAxMCwgJ2ludmFsaWQgc3ltYm9sOiB1cHBlcmNhc2UgbGV0dGVycyBvbmx5LCBtYXggbGVuZ3RoIG9mIDEwJykKICAgICAgJiYgYXBpLmFzc2VydChhcGkudmFsaWRhdG9yLmlzQWxwaGFudW1lcmljKGFwaS52YWxpZGF0b3IuYmxhY2tsaXN0KG5hbWUsICcgJykpICYmIG5hbWUubGVuZ3RoID4gMCAmJiBuYW1lLmxlbmd0aCA8PSA1MCwgJ2ludmFsaWQgbmFtZTogbGV0dGVycywgbnVtYmVycywgd2hpdGVzcGFjZXMgb25seSwgbWF4IGxlbmd0aCBvZiA1MCcpCiAgICAgICYmIGFwaS5hc3NlcnQodXJsID09PSB1bmRlZmluZWQgfHwgdXJsLmxlbmd0aCA8PSAyNTUsICdpbnZhbGlkIHVybDogbWF4IGxlbmd0aCBvZiAyNTUnKQogICAgICAmJiBhcGkuYXNzZXJ0KChwcmVjaXNpb24gPj0gMCAmJiBwcmVjaXNpb24gPD0gOCkgJiYgKE51bWJlci5pc0ludGVnZXIocHJlY2lzaW9uKSksICdpbnZhbGlkIHByZWNpc2lvbicpCiAgICAgICYmIGFwaS5hc3NlcnQobWF4U3VwcGx5ID4gMCwgJ21heFN1cHBseSBtdXN0IGJlIHBvc2l0aXZlJykKICAgICAgJiYgYXBpLmFzc2VydChhcGkuYmxvY2tOdW1iZXIgPT09IDAgfHwgKGFwaS5ibG9ja051bWJlciA+IDAgJiYgbWF4U3VwcGx5IDw9IDEwMDAwMDAwMDAwMDApLCAnbWF4U3VwcGx5IG11c3QgYmUgbG93ZXIgdGhhbiAxMDAwMDAwMDAwMDAwJykpIHsKICAgICAgLy8gY2hlY2sgaWYgdGhlIHRva2VuIGFscmVhZHkgZXhpc3RzCiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3Rva2VucycsIHsgc3ltYm9sIH0pOwoKICAgICAgaWYgKGFwaS5hc3NlcnQodG9rZW4gPT09IG51bGwsICdzeW1ib2wgYWxyZWFkeSBleGlzdHMnKSkgewogICAgICAgIGNvbnN0IGZpbmFsVXJsID0gdXJsID09PSB1bmRlZmluZWQgPyAnJyA6IHVybDsKCiAgICAgICAgbGV0IG1ldGFkYXRhID0gewogICAgICAgICAgdXJsOiBmaW5hbFVybCwKICAgICAgICB9OwoKICAgICAgICBtZXRhZGF0YSA9IEpTT04uc3RyaW5naWZ5KG1ldGFkYXRhKTsKCiAgICAgICAgY29uc3QgbmV3VG9rZW4gPSB7CiAgICAgICAgICBpc3N1ZXI6IGFwaS5zZW5kZXIsCiAgICAgICAgICBzeW1ib2wsCiAgICAgICAgICBuYW1lLAogICAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgICBwcmVjaXNpb24sCiAgICAgICAgICBtYXhTdXBwbHksCiAgICAgICAgICBzdXBwbHk6IDAsCiAgICAgICAgICBjaXJjdWxhdGluZ1N1cHBseTogMCwKICAgICAgICB9OwoKICAgICAgICBhd2FpdCBhcGkuZGIuaW5zZXJ0KCd0b2tlbnMnLCBuZXdUb2tlbik7CgogICAgICAgIC8vIGJ1cm4gdGhlIHRva2VuIGNyZWF0aW9uIGZlZXMKICAgICAgICBpZiAoYXBpLkJpZ051bWJlcih0b2tlbkNyZWF0aW9uRmVlKS5ndCgwKSkgewogICAgICAgICAgYXdhaXQgYWN0aW9ucy50cmFuc2Zlcih7CiAgICAgICAgICAgIHRvOiAnbnVsbCcsIHN5bWJvbDogIlNTQyIsIHF1YW50aXR5OiBhcGkuQmlnTnVtYmVyKHRva2VuQ3JlYXRpb25GZWUpLnRvTnVtYmVyKCksIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfTsKCmNvbnN0IGNyZWF0ZVZUd28gPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsKICAgIG5hbWUsIHN5bWJvbCwgdXJsLCBwcmVjaXNpb24sIG1heFN1cHBseSwgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogIH0gPSBwYXlsb2FkOwoKICAvLyBnZXQgY29udHJhY3QgcGFyYW1zCiAgY29uc3QgcGFyYW1zID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3BhcmFtcycsIHt9KTsKICBjb25zdCB7IHRva2VuQ3JlYXRpb25GZWUgfSA9IHBhcmFtczsKCiAgLy8gZ2V0IGFwaS5zZW5kZXIncyBVVElMSVRZX1RPS0VOX1NZTUJPTCBiYWxhbmNlCiAgY29uc3QgdXRpbGl0eVRva2VuQmFsYW5jZSA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdiYWxhbmNlcycsIHsgYWNjb3VudDogYXBpLnNlbmRlciwgc3ltYm9sOiAiU1NDIiB9KTsKCiAgY29uc3QgYXV0aG9yaXplZENyZWF0aW9uID0gYXBpLkJpZ051bWJlcih0b2tlbkNyZWF0aW9uRmVlKS5sdGUoMCkKICAgID8gdHJ1ZQogICAgOiB1dGlsaXR5VG9rZW5CYWxhbmNlICYmIGFwaS5CaWdOdW1iZXIodXRpbGl0eVRva2VuQmFsYW5jZS5iYWxhbmNlKS5ndGUodG9rZW5DcmVhdGlvbkZlZSk7CgogIGlmIChhcGkuYXNzZXJ0KGF1dGhvcml6ZWRDcmVhdGlvbiwgJ3lvdSBtdXN0IGhhdmUgZW5vdWdoIHRva2VucyB0byBjb3ZlciB0aGUgY3JlYXRpb24gZmVlcycpCiAgICAmJiBhcGkuYXNzZXJ0KG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnCiAgICAgICYmIHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJwogICAgICAmJiAodXJsID09PSB1bmRlZmluZWQgfHwgKHVybCAmJiB0eXBlb2YgdXJsID09PSAnc3RyaW5nJykpCiAgICAgICYmICgocHJlY2lzaW9uICYmIHR5cGVvZiBwcmVjaXNpb24gPT09ICdudW1iZXInKSB8fCBwcmVjaXNpb24gPT09IDApCiAgICAgICYmIG1heFN1cHBseSAmJiB0eXBlb2YgbWF4U3VwcGx5ID09PSAnc3RyaW5nJyAmJiAhYXBpLkJpZ051bWJlcihtYXhTdXBwbHkpLmlzTmFOKCksICdpbnZhbGlkIHBhcmFtcycpKSB7CgogICAgLy8gdGhlIHByZWNpc2lvbiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgOCBhbmQgbXVzdCBiZSBhbiBpbnRlZ2VyCiAgICAvLyB0aGUgbWF4IHN1cHBseSBtdXN0IGJlIHBvc2l0aXZlCiAgICBpZiAoYXBpLmFzc2VydChhcGkudmFsaWRhdG9yLmlzQWxwaGEoc3ltYm9sKSAmJiBhcGkudmFsaWRhdG9yLmlzVXBwZXJjYXNlKHN5bWJvbCkgJiYgc3ltYm9sLmxlbmd0aCA+IDAgJiYgc3ltYm9sLmxlbmd0aCA8PSAxMCwgJ2ludmFsaWQgc3ltYm9sOiB1cHBlcmNhc2UgbGV0dGVycyBvbmx5LCBtYXggbGVuZ3RoIG9mIDEwJykKICAgICAgJiYgYXBpLmFzc2VydChhcGkudmFsaWRhdG9yLmlzQWxwaGFudW1lcmljKGFwaS52YWxpZGF0b3IuYmxhY2tsaXN0KG5hbWUsICcgJykpICYmIG5hbWUubGVuZ3RoID4gMCAmJiBuYW1lLmxlbmd0aCA8PSA1MCwgJ2ludmFsaWQgbmFtZTogbGV0dGVycywgbnVtYmVycywgd2hpdGVzcGFjZXMgb25seSwgbWF4IGxlbmd0aCBvZiA1MCcpCiAgICAgICYmIGFwaS5hc3NlcnQodXJsID09PSB1bmRlZmluZWQgfHwgdXJsLmxlbmd0aCA8PSAyNTUsICdpbnZhbGlkIHVybDogbWF4IGxlbmd0aCBvZiAyNTUnKQogICAgICAmJiBhcGkuYXNzZXJ0KChwcmVjaXNpb24gPj0gMCAmJiBwcmVjaXNpb24gPD0gOCkgJiYgKE51bWJlci5pc0ludGVnZXIocHJlY2lzaW9uKSksICdpbnZhbGlkIHByZWNpc2lvbicpCiAgICAgICYmIGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihtYXhTdXBwbHkpLmd0KDApLCAnbWF4U3VwcGx5IG11c3QgYmUgcG9zaXRpdmUnKQogICAgICAmJiBhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIobWF4U3VwcGx5KS5sdGUoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLCAnbWF4U3VwcGx5IG11c3QgYmUgbG93ZXIgdGhhbiAnICsgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpKSB7CgogICAgICAvLyBjaGVjayBpZiB0aGUgdG9rZW4gYWxyZWFkeSBleGlzdHMKICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndG9rZW5zJywgeyBzeW1ib2wgfSk7CgogICAgICBpZiAoYXBpLmFzc2VydCh0b2tlbiA9PT0gbnVsbCwgJ3N5bWJvbCBhbHJlYWR5IGV4aXN0cycpKSB7CiAgICAgICAgY29uc3QgZmluYWxVcmwgPSB1cmwgPT09IHVuZGVmaW5lZCA/ICcnIDogdXJsOwoKICAgICAgICBsZXQgbWV0YWRhdGEgPSB7CiAgICAgICAgICB1cmw6IGZpbmFsVXJsLAogICAgICAgIH07CgogICAgICAgIG1ldGFkYXRhID0gSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEpOwogICAgICAgIGNvbnN0IG5ld1Rva2VuID0gewogICAgICAgICAgaXNzdWVyOiBhcGkuc2VuZGVyLAogICAgICAgICAgc3ltYm9sLAogICAgICAgICAgbmFtZSwKICAgICAgICAgIG1ldGFkYXRhLAogICAgICAgICAgcHJlY2lzaW9uLAogICAgICAgICAgbWF4U3VwcGx5OiBhcGkuQmlnTnVtYmVyKG1heFN1cHBseSkudG9GaXhlZChwcmVjaXNpb24pLAogICAgICAgICAgc3VwcGx5OiAnMCcsCiAgICAgICAgICBjaXJjdWxhdGluZ1N1cHBseTogJzAnLAogICAgICAgICAgc3Rha2luZ0VuYWJsZWQ6IGZhbHNlLAogICAgICAgICAgdW5zdGFraW5nQ29vbGRvd246IDEsCiAgICAgICAgICBuYkRheXMxMDBQZXJjZW50Vm90ZVJlZ2VuZXJhdGlvbjogMSwKICAgICAgICB9OwoKICAgICAgICBhd2FpdCBhcGkuZGIuaW5zZXJ0KCd0b2tlbnMnLCBuZXdUb2tlbik7CgogICAgICAgIC8vIGJ1cm4gdGhlIHRva2VuIGNyZWF0aW9uIGZlZXMKICAgICAgICBpZiAoYXBpLkJpZ051bWJlcih0b2tlbkNyZWF0aW9uRmVlKS5ndCgwKSkgewogICAgICAgICAgYXdhaXQgYWN0aW9ucy50cmFuc2Zlcih7CiAgICAgICAgICAgIHRvOiAnbnVsbCcsIHN5bWJvbDogIlNTQyIsIHF1YW50aXR5OiB0b2tlbkNyZWF0aW9uRmVlLCBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07CgphY3Rpb25zLmNyZWF0ZSA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgaWYgKGFwaS5yZWZTdGVlbUJsb2NrTnVtYmVyIDwgMzA4OTY1MDApIHsKICAgIGF3YWl0IGNyZWF0ZVZPbmUocGF5bG9hZCk7CiAgfSBlbHNlIHsKICAgIGF3YWl0IGNyZWF0ZVZUd28ocGF5bG9hZCk7CiAgfQp9OwoKY29uc3QgaXNzdWVWT25lID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICB0bywgc3ltYm9sLCBxdWFudGl0eSwgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogIH0gPSBwYXlsb2FkOwoKICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgJiYgYXBpLmFzc2VydCh0byAmJiB0eXBlb2YgdG8gPT09ICdzdHJpbmcnCiAgICAgICYmIHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJwogICAgICAmJiBxdWFudGl0eSAmJiB0eXBlb2YgcXVhbnRpdHkgPT09ICdudW1iZXInLCAnaW52YWxpZCBwYXJhbXMnKSkgewogICAgY29uc3QgZmluYWxUbyA9IHRvLnRyaW0oKTsKCiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCd0b2tlbnMnLCB7IHN5bWJvbCB9KTsKCiAgICAvLyB0aGUgc3ltYm9sIG11c3QgZXhpc3QKICAgIC8vIHRoZSBhcGkuc2VuZGVyIG11c3QgYmUgdGhlIGlzc3VlcgogICAgLy8gdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIHF1YW50aXR5IGlzIGNvcnJlY3QKICAgIGlmIChhcGkuYXNzZXJ0KHRva2VuICE9PSBudWxsLCAnc3ltYm9sIGRvZXMgbm90IGV4aXN0JykKICAgICAgJiYgYXBpLmFzc2VydCh0b2tlbi5pc3N1ZXIgPT09IGFwaS5zZW5kZXIsICdub3QgYWxsb3dlZCB0byBpc3N1ZSB0b2tlbnMnKQogICAgICAmJiBhcGkuYXNzZXJ0KGNvdW50RGVjaW1hbHMocXVhbnRpdHkpIDw9IHRva2VuLnByZWNpc2lvbiwgJ3N5bWJvbCBwcmVjaXNpb24gbWlzbWF0Y2gnKQogICAgICAmJiBhcGkuYXNzZXJ0KHF1YW50aXR5ID4gMCwgJ211c3QgaXNzdWUgcG9zaXRpdmUgcXVhbnRpdHknKQogICAgICAmJiBhcGkuYXNzZXJ0KHF1YW50aXR5IDw9IChhcGkuQmlnTnVtYmVyKHRva2VuLm1heFN1cHBseSkubWludXModG9rZW4uc3VwcGx5KS50b051bWJlcigpKSwgJ3F1YW50aXR5IGV4Y2VlZHMgYXZhaWxhYmxlIHN1cHBseScpKSB7CgogICAgICAvLyBhIHZhbGlkIHN0ZWVtIGFjY291bnQgaXMgYmV0d2VlbiAzIGFuZCAxNiBjaGFyYWN0ZXJzIGluIGxlbmd0aAogICAgICBpZiAoYXBpLmFzc2VydChmaW5hbFRvLmxlbmd0aCA+PSAzICYmIGZpbmFsVG8ubGVuZ3RoIDw9IDE2LCAnaW52YWxpZCB0bycpKSB7CiAgICAgICAgLy8gd2UgbWFkZSBhbGwgdGhlIHJlcXVpcmVkIHZlcmlmaWNhdGlvbiwgbGV0J3Mgbm93IGlzc3VlIHRoZSB0b2tlbnMKCiAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGFkZEJhbGFuY2VWT25lKHRva2VuLmlzc3VlciwgdG9rZW4sIHF1YW50aXR5LCAnYmFsYW5jZXMnKTsKCiAgICAgICAgaWYgKHJlcyA9PT0gdHJ1ZSAmJiBmaW5hbFRvICE9PSB0b2tlbi5pc3N1ZXIpIHsKICAgICAgICAgIGlmIChhd2FpdCBzdWJCYWxhbmNlVk9uZSh0b2tlbi5pc3N1ZXIsIHRva2VuLCBxdWFudGl0eSwgJ2JhbGFuY2VzJykpIHsKICAgICAgICAgICAgcmVzID0gYXdhaXQgYWRkQmFsYW5jZVZPbmUoZmluYWxUbywgdG9rZW4sIHF1YW50aXR5LCAnYmFsYW5jZXMnKTsKCiAgICAgICAgICAgIGlmIChyZXMgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgYXdhaXQgYWRkQmFsYW5jZVZPbmUodG9rZW4uaXNzdWVyLCB0b2tlbiwgcXVhbnRpdHksICdiYWxhbmNlcycpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAocmVzID09PSB0cnVlKSB7CiAgICAgICAgICB0b2tlbi5zdXBwbHkgPSBjYWxjdWxhdGVCYWxhbmNlVk9uZSh0b2tlbi5zdXBwbHksIHF1YW50aXR5LCB0b2tlbi5wcmVjaXNpb24sIHRydWUpOwoKICAgICAgICAgIGlmIChmaW5hbFRvICE9PSAnbnVsbCcpIHsKICAgICAgICAgICAgdG9rZW4uY2lyY3VsYXRpbmdTdXBwbHkgPSBjYWxjdWxhdGVCYWxhbmNlVk9uZSgKICAgICAgICAgICAgICB0b2tlbi5jaXJjdWxhdGluZ1N1cHBseSwgcXVhbnRpdHksIHRva2VuLnByZWNpc2lvbiwgdHJ1ZSwKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KCiAgICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCd0b2tlbnMnLCB0b2tlbik7CgogICAgICAgICAgYXBpLmVtaXQoJ3RyYW5zZmVyRnJvbUNvbnRyYWN0JywgewogICAgICAgICAgICBmcm9tOiAndG9rZW5zJywgdG86IGZpbmFsVG8sIHN5bWJvbCwgcXVhbnRpdHksCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07Cgpjb25zdCBpc3N1ZVZUd28gPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsKICAgIHRvLCBzeW1ib2wsIHF1YW50aXR5LCBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgfSA9IHBheWxvYWQ7CgogIGlmIChhcGkuYXNzZXJ0KGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZSwgJ3lvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleScpCiAgICAmJiBhcGkuYXNzZXJ0KHRvICYmIHR5cGVvZiB0byA9PT0gJ3N0cmluZycKICAgICAgJiYgc3ltYm9sICYmIHR5cGVvZiBzeW1ib2wgPT09ICdzdHJpbmcnCiAgICAgICYmIHF1YW50aXR5ICYmIHR5cGVvZiBxdWFudGl0eSA9PT0gJ3N0cmluZycgJiYgIWFwaS5CaWdOdW1iZXIocXVhbnRpdHkpLmlzTmFOKCksICdpbnZhbGlkIHBhcmFtcycpKSB7CiAgICBjb25zdCBmaW5hbFRvID0gdG8udHJpbSgpOwogICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndG9rZW5zJywgeyBzeW1ib2wgfSk7CgogICAgLy8gdGhlIHN5bWJvbCBtdXN0IGV4aXN0CiAgICAvLyB0aGUgYXBpLnNlbmRlciBtdXN0IGJlIHRoZSBpc3N1ZXIKICAgIC8vIHRoZW4gd2UgbmVlZCB0byBjaGVjayB0aGF0IHRoZSBxdWFudGl0eSBpcyBjb3JyZWN0CiAgICBpZiAoYXBpLmFzc2VydCh0b2tlbiAhPT0gbnVsbCwgJ3N5bWJvbCBkb2VzIG5vdCBleGlzdCcpCiAgICAgICYmIGFwaS5hc3NlcnQodG9rZW4uaXNzdWVyID09PSBhcGkuc2VuZGVyLCAnbm90IGFsbG93ZWQgdG8gaXNzdWUgdG9rZW5zJykKICAgICAgJiYgYXBpLmFzc2VydChjb3VudERlY2ltYWxzKHF1YW50aXR5KSA8PSB0b2tlbi5wcmVjaXNpb24sICdzeW1ib2wgcHJlY2lzaW9uIG1pc21hdGNoJykKICAgICAgJiYgYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKHF1YW50aXR5KS5ndCgwKSwgJ211c3QgaXNzdWUgcG9zaXRpdmUgcXVhbnRpdHknKQogICAgICAmJiBhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIodG9rZW4ubWF4U3VwcGx5KS5taW51cyh0b2tlbi5zdXBwbHkpLmd0ZShxdWFudGl0eSksICdxdWFudGl0eSBleGNlZWRzIGF2YWlsYWJsZSBzdXBwbHknKSkgewoKICAgICAgLy8gYSB2YWxpZCBzdGVlbSBhY2NvdW50IGlzIGJldHdlZW4gMyBhbmQgMTYgY2hhcmFjdGVycyBpbiBsZW5ndGgKICAgICAgaWYgKGFwaS5hc3NlcnQoZmluYWxUby5sZW5ndGggPj0gMyAmJiBmaW5hbFRvLmxlbmd0aCA8PSAxNiwgJ2ludmFsaWQgdG8nKSkgewogICAgICAgIC8vIHdlIG1hZGUgYWxsIHRoZSByZXF1aXJlZCB2ZXJpZmljYXRpb24sIGxldCdzIG5vdyBpc3N1ZSB0aGUgdG9rZW5zCgogICAgICAgIGxldCByZXMgPSBhd2FpdCBhZGRCYWxhbmNlVlR3byh0b2tlbi5pc3N1ZXIsIHRva2VuLCBxdWFudGl0eSwgJ2JhbGFuY2VzJyk7CgogICAgICAgIGlmIChyZXMgPT09IHRydWUgJiYgZmluYWxUbyAhPT0gdG9rZW4uaXNzdWVyKSB7CiAgICAgICAgICBpZiAoYXdhaXQgc3ViQmFsYW5jZVZUd28odG9rZW4uaXNzdWVyLCB0b2tlbiwgcXVhbnRpdHksICdiYWxhbmNlcycpKSB7CiAgICAgICAgICAgIHJlcyA9IGF3YWl0IGFkZEJhbGFuY2VWVHdvKGZpbmFsVG8sIHRva2VuLCBxdWFudGl0eSwgJ2JhbGFuY2VzJyk7CgogICAgICAgICAgICBpZiAocmVzID09PSBmYWxzZSkgewogICAgICAgICAgICAgIGF3YWl0IGFkZEJhbGFuY2VWVHdvKHRva2VuLmlzc3VlciwgdG9rZW4sIHF1YW50aXR5LCAnYmFsYW5jZXMnKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHJlcyA9PT0gdHJ1ZSkgewogICAgICAgICAgdG9rZW4uc3VwcGx5ID0gY2FsY3VsYXRlQmFsYW5jZVZUd28odG9rZW4uc3VwcGx5LCBxdWFudGl0eSwgdG9rZW4ucHJlY2lzaW9uLCB0cnVlKTsKCiAgICAgICAgICBpZiAoZmluYWxUbyAhPT0gJ251bGwnKSB7CiAgICAgICAgICAgIHRva2VuLmNpcmN1bGF0aW5nU3VwcGx5ID0gY2FsY3VsYXRlQmFsYW5jZVZUd28oCiAgICAgICAgICAgICAgdG9rZW4uY2lyY3VsYXRpbmdTdXBwbHksIHF1YW50aXR5LCB0b2tlbi5wcmVjaXNpb24sIHRydWUsCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CgogICAgICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgndG9rZW5zJywgdG9rZW4pOwoKICAgICAgICAgIGFwaS5lbWl0KCd0cmFuc2ZlckZyb21Db250cmFjdCcsIHsKICAgICAgICAgICAgZnJvbTogJ3Rva2VucycsIHRvOiBmaW5hbFRvLCBzeW1ib2wsIHF1YW50aXR5LAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9OwoKYWN0aW9ucy5pc3N1ZSA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgaWYgKGFwaS5yZWZTdGVlbUJsb2NrTnVtYmVyIDwgMzA4OTY1MDApIHsKICAgIGF3YWl0IGlzc3VlVk9uZShwYXlsb2FkKTsKICB9IGVsc2UgewogICAgYXdhaXQgaXNzdWVWVHdvKHBheWxvYWQpOwogIH0KfTsKCmNvbnN0IHRyYW5zZmVyVk9uZSA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgY29uc3QgewogICAgdG8sIHN5bWJvbCwgcXVhbnRpdHksIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKCiAgaWYgKGFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAneW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5JykKICAgICYmIGFwaS5hc3NlcnQodG8gJiYgdHlwZW9mIHRvID09PSAnc3RyaW5nJwogICAgICAmJiBzeW1ib2wgJiYgdHlwZW9mIHN5bWJvbCA9PT0gJ3N0cmluZycKICAgICAgJiYgcXVhbnRpdHkgJiYgdHlwZW9mIHF1YW50aXR5ID09PSAnbnVtYmVyJywgJ2ludmFsaWQgcGFyYW1zJykpIHsKICAgIGNvbnN0IGZpbmFsVG8gPSB0by50cmltKCk7CiAgICBpZiAoYXBpLmFzc2VydChmaW5hbFRvICE9PSBhcGkuc2VuZGVyLCAnY2Fubm90IHRyYW5zZmVyIHRvIHNlbGYnKSkgewogICAgICAvLyBhIHZhbGlkIHN0ZWVtIGFjY291bnQgaXMgYmV0d2VlbiAzIGFuZCAxNiBjaGFyYWN0ZXJzIGluIGxlbmd0aAogICAgICBpZiAoYXBpLmFzc2VydChmaW5hbFRvLmxlbmd0aCA+PSAzICYmIGZpbmFsVG8ubGVuZ3RoIDw9IDE2LCAnaW52YWxpZCB0bycpKSB7CiAgICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndG9rZW5zJywgeyBzeW1ib2wgfSk7CgogICAgICAgIC8vIHRoZSBzeW1ib2wgbXVzdCBleGlzdAogICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBjaGVjayB0aGF0IHRoZSBxdWFudGl0eSBpcyBjb3JyZWN0CiAgICAgICAgaWYgKGFwaS5hc3NlcnQodG9rZW4gIT09IG51bGwsICdzeW1ib2wgZG9lcyBub3QgZXhpc3QnKQogICAgICAgICAgJiYgYXBpLmFzc2VydChjb3VudERlY2ltYWxzKHF1YW50aXR5KSA8PSB0b2tlbi5wcmVjaXNpb24sICdzeW1ib2wgcHJlY2lzaW9uIG1pc21hdGNoJykKICAgICAgICAgICYmIGFwaS5hc3NlcnQocXVhbnRpdHkgPiAwLCAnbXVzdCB0cmFuc2ZlciBwb3NpdGl2ZSBxdWFudGl0eScpKSB7CgogICAgICAgICAgaWYgKGF3YWl0IHN1YkJhbGFuY2VWT25lKGFwaS5zZW5kZXIsIHRva2VuLCBxdWFudGl0eSwgJ2JhbGFuY2VzJykpIHsKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYWRkQmFsYW5jZVZPbmUoZmluYWxUbywgdG9rZW4sIHF1YW50aXR5LCAnYmFsYW5jZXMnKTsKCiAgICAgICAgICAgIGlmIChyZXMgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgYXdhaXQgYWRkQmFsYW5jZVZPbmUoYXBpLnNlbmRlciwgdG9rZW4sIHF1YW50aXR5LCAnYmFsYW5jZXMnKTsKCiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmluYWxUbyA9PT0gJ251bGwnKSB7CiAgICAgICAgICAgICAgdG9rZW4uY2lyY3VsYXRpbmdTdXBwbHkgPSBjYWxjdWxhdGVCYWxhbmNlVk9uZSgKICAgICAgICAgICAgICAgIHRva2VuLmNpcmN1bGF0aW5nU3VwcGx5LCBxdWFudGl0eSwgdG9rZW4ucHJlY2lzaW9uLCBmYWxzZSwKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3Rva2VucycsIHRva2VuKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYXBpLmVtaXQoJ3RyYW5zZmVyJywgewogICAgICAgICAgICAgIGZyb206IGFwaS5zZW5kZXIsIHRvOiBmaW5hbFRvLCBzeW1ib2wsIHF1YW50aXR5LAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIGZhbHNlOwp9OwoKY29uc3QgdHJhbnNmZXJWVHdvID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICB0bywgc3ltYm9sLCBxdWFudGl0eSwgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogIH0gPSBwYXlsb2FkOwoKICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgJiYgYXBpLmFzc2VydCh0byAmJiB0eXBlb2YgdG8gPT09ICdzdHJpbmcnCiAgICAgICYmIHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJwogICAgICAmJiBxdWFudGl0eSAmJiB0eXBlb2YgcXVhbnRpdHkgPT09ICdzdHJpbmcnICYmICFhcGkuQmlnTnVtYmVyKHF1YW50aXR5KS5pc05hTigpLCAnaW52YWxpZCBwYXJhbXMnKSkgewogICAgY29uc3QgZmluYWxUbyA9IHRvLnRyaW0oKTsKICAgIGlmIChhcGkuYXNzZXJ0KGZpbmFsVG8gIT09IGFwaS5zZW5kZXIsICdjYW5ub3QgdHJhbnNmZXIgdG8gc2VsZicpKSB7CiAgICAgIC8vIGEgdmFsaWQgc3RlZW0gYWNjb3VudCBpcyBiZXR3ZWVuIDMgYW5kIDE2IGNoYXJhY3RlcnMgaW4gbGVuZ3RoCiAgICAgIGlmIChhcGkuYXNzZXJ0KGZpbmFsVG8ubGVuZ3RoID49IDMgJiYgZmluYWxUby5sZW5ndGggPD0gMTYsICdpbnZhbGlkIHRvJykpIHsKICAgICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCd0b2tlbnMnLCB7IHN5bWJvbCB9KTsKCiAgICAgICAgLy8gdGhlIHN5bWJvbCBtdXN0IGV4aXN0CiAgICAgICAgLy8gdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIHF1YW50aXR5IGlzIGNvcnJlY3QKICAgICAgICBpZiAoYXBpLmFzc2VydCh0b2tlbiAhPT0gbnVsbCwgJ3N5bWJvbCBkb2VzIG5vdCBleGlzdCcpCiAgICAgICAgICAmJiBhcGkuYXNzZXJ0KGNvdW50RGVjaW1hbHMocXVhbnRpdHkpIDw9IHRva2VuLnByZWNpc2lvbiwgJ3N5bWJvbCBwcmVjaXNpb24gbWlzbWF0Y2gnKQogICAgICAgICAgJiYgYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKHF1YW50aXR5KS5ndCgwKSwgJ211c3QgdHJhbnNmZXIgcG9zaXRpdmUgcXVhbnRpdHknKSkgewogICAgICAgICAgaWYgKGF3YWl0IHN1YkJhbGFuY2VWVHdvKGFwaS5zZW5kZXIsIHRva2VuLCBxdWFudGl0eSwgJ2JhbGFuY2VzJykpIHsKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYWRkQmFsYW5jZVZUd28oZmluYWxUbywgdG9rZW4sIHF1YW50aXR5LCAnYmFsYW5jZXMnKTsKCiAgICAgICAgICAgIGlmIChyZXMgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgYXdhaXQgYWRkQmFsYW5jZVZUd28oYXBpLnNlbmRlciwgdG9rZW4sIHF1YW50aXR5LCAnYmFsYW5jZXMnKTsKCiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmluYWxUbyA9PT0gJ251bGwnKSB7CiAgICAgICAgICAgICAgdG9rZW4uY2lyY3VsYXRpbmdTdXBwbHkgPSBjYWxjdWxhdGVCYWxhbmNlVlR3bygKICAgICAgICAgICAgICAgIHRva2VuLmNpcmN1bGF0aW5nU3VwcGx5LCBxdWFudGl0eSwgdG9rZW4ucHJlY2lzaW9uLCBmYWxzZSwKICAgICAgICAgICAgICApOwogICAgICAgICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3Rva2VucycsIHRva2VuKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYXBpLmVtaXQoJ3RyYW5zZmVyJywgewogICAgICAgICAgICAgIGZyb206IGFwaS5zZW5kZXIsIHRvOiBmaW5hbFRvLCBzeW1ib2wsIHF1YW50aXR5LAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIGZhbHNlOwp9OwoKYWN0aW9ucy50cmFuc2ZlciA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgaWYgKGFwaS5yZWZTdGVlbUJsb2NrTnVtYmVyIDwgMzA4OTY1MDApIHsKICAgIGF3YWl0IHRyYW5zZmVyVk9uZShwYXlsb2FkKTsKICB9IGVsc2UgewogICAgYXdhaXQgdHJhbnNmZXJWVHdvKHBheWxvYWQpOwogIH0KfTsKCmFjdGlvbnMudHJhbnNmZXJUb0NvbnRyYWN0ID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICB0bywgc3ltYm9sLCBxdWFudGl0eSwgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogIH0gPSBwYXlsb2FkOwoKICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgJiYgYXBpLmFzc2VydCh0byAmJiB0eXBlb2YgdG8gPT09ICdzdHJpbmcnCiAgICAgICYmIHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJwogICAgICAmJiBxdWFudGl0eSAmJiB0eXBlb2YgcXVhbnRpdHkgPT09ICdzdHJpbmcnICYmICFhcGkuQmlnTnVtYmVyKHF1YW50aXR5KS5pc05hTigpLCAnaW52YWxpZCBwYXJhbXMnKSkgewogICAgY29uc3QgZmluYWxUbyA9IHRvLnRyaW0oKTsKICAgIGlmIChhcGkuYXNzZXJ0KGZpbmFsVG8gIT09IGFwaS5zZW5kZXIsICdjYW5ub3QgdHJhbnNmZXIgdG8gc2VsZicpKSB7CiAgICAgIC8vIGEgdmFsaWQgY29udHJhY3QgYWNjb3VudCBpcyBiZXR3ZWVuIDMgYW5kIDUwIGNoYXJhY3RlcnMgaW4gbGVuZ3RoCiAgICAgIGlmIChhcGkuYXNzZXJ0KGZpbmFsVG8ubGVuZ3RoID49IDMgJiYgZmluYWxUby5sZW5ndGggPD0gNTAsICdpbnZhbGlkIHRvJykpIHsKICAgICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCd0b2tlbnMnLCB7IHN5bWJvbCB9KTsKCiAgICAgICAgLy8gdGhlIHN5bWJvbCBtdXN0IGV4aXN0CiAgICAgICAgLy8gdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIHF1YW50aXR5IGlzIGNvcnJlY3QKICAgICAgICBpZiAoYXBpLmFzc2VydCh0b2tlbiAhPT0gbnVsbCwgJ3N5bWJvbCBkb2VzIG5vdCBleGlzdCcpCiAgICAgICAgICAmJiBhcGkuYXNzZXJ0KGNvdW50RGVjaW1hbHMocXVhbnRpdHkpIDw9IHRva2VuLnByZWNpc2lvbiwgJ3N5bWJvbCBwcmVjaXNpb24gbWlzbWF0Y2gnKQogICAgICAgICAgJiYgYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKHF1YW50aXR5KS5ndCgwKSwgJ211c3QgdHJhbnNmZXIgcG9zaXRpdmUgcXVhbnRpdHknKSkgewogICAgICAgICAgaWYgKGF3YWl0IHN1YkJhbGFuY2VWVHdvKGFwaS5zZW5kZXIsIHRva2VuLCBxdWFudGl0eSwgJ2JhbGFuY2VzJykpIHsKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYWRkQmFsYW5jZVZUd28oZmluYWxUbywgdG9rZW4sIHF1YW50aXR5LCAnY29udHJhY3RzQmFsYW5jZXMnKTsKCiAgICAgICAgICAgIGlmIChyZXMgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgYXdhaXQgYWRkQmFsYW5jZVZUd28oYXBpLnNlbmRlciwgdG9rZW4sIHF1YW50aXR5LCAnYmFsYW5jZXMnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAoZmluYWxUbyA9PT0gJ251bGwnKSB7CiAgICAgICAgICAgICAgICB0b2tlbi5jaXJjdWxhdGluZ1N1cHBseSA9IGNhbGN1bGF0ZUJhbGFuY2VWVHdvKAogICAgICAgICAgICAgICAgICB0b2tlbi5jaXJjdWxhdGluZ1N1cHBseSwgcXVhbnRpdHksIHRva2VuLnByZWNpc2lvbiwgZmFsc2UsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgndG9rZW5zJywgdG9rZW4pOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgYXBpLmVtaXQoJ3RyYW5zZmVyVG9Db250cmFjdCcsIHsKICAgICAgICAgICAgICAgIGZyb206IGFwaS5zZW5kZXIsIHRvOiBmaW5hbFRvLCBzeW1ib2wsIHF1YW50aXR5LAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9OwoKYWN0aW9ucy50cmFuc2ZlckZyb21Db250cmFjdCA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgLy8gdGhpcyBhY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSAnbnVsbCcgYWNjb3VudCB3aGljaCBvbmx5IHRoZSBjb3JlIGNvZGUgY2FuIHVzZQogIGlmIChhcGkuYXNzZXJ0KGFwaS5zZW5kZXIgPT09ICdudWxsJywgJ25vdCBhdXRob3JpemVkJykpIHsKICAgIGNvbnN0IHsKICAgICAgZnJvbSwgdG8sIHN5bWJvbCwgcXVhbnRpdHksIHR5cGUsIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICAgIH0gPSBwYXlsb2FkOwogICAgY29uc3QgdHlwZXMgPSBbJ3VzZXInLCAnY29udHJhY3QnXTsKCiAgICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgICAmJiBhcGkuYXNzZXJ0KHRvICYmIHR5cGVvZiB0byA9PT0gJ3N0cmluZycKICAgICAgICAmJiBmcm9tICYmIHR5cGVvZiBmcm9tID09PSAnc3RyaW5nJwogICAgICAgICYmIHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJwogICAgICAgICYmIHR5cGUgJiYgKHR5cGVzLmluY2x1ZGVzKHR5cGUpKQogICAgICAgICYmIHF1YW50aXR5ICYmIHR5cGVvZiBxdWFudGl0eSA9PT0gJ3N0cmluZycgJiYgIWFwaS5CaWdOdW1iZXIocXVhbnRpdHkpLmlzTmFOKCksICdpbnZhbGlkIHBhcmFtcycpKSB7CiAgICAgIGNvbnN0IGZpbmFsVG8gPSB0by50cmltKCk7CiAgICAgIGNvbnN0IHRhYmxlID0gdHlwZSA9PT0gJ3VzZXInID8gJ2JhbGFuY2VzJyA6ICdjb250cmFjdHNCYWxhbmNlcyc7CgogICAgICBpZiAoYXBpLmFzc2VydCh0eXBlID09PSAndXNlcicgfHwgKHR5cGUgPT09ICdjb250cmFjdCcgJiYgZmluYWxUbyAhPT0gZnJvbSksICdjYW5ub3QgdHJhbnNmZXIgdG8gc2VsZicpKSB7CiAgICAgICAgLy8gdmFsaWRhdGUgdGhlICJ0byIKICAgICAgICBjb25zdCB0b1ZhbGlkID0gdHlwZSA9PT0gJ3VzZXInID8gZmluYWxUby5sZW5ndGggPj0gMyAmJiBmaW5hbFRvLmxlbmd0aCA8PSAxNiA6IGZpbmFsVG8ubGVuZ3RoID49IDMgJiYgZmluYWxUby5sZW5ndGggPD0gNTA7CgogICAgICAgIC8vIHRoZSBhY2NvdW50IG11c3QgZXhpc3QKICAgICAgICBpZiAoYXBpLmFzc2VydCh0b1ZhbGlkID09PSB0cnVlLCAnaW52YWxpZCB0bycpKSB7CiAgICAgICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCd0b2tlbnMnLCB7IHN5bWJvbCB9KTsKCiAgICAgICAgICAvLyB0aGUgc3ltYm9sIG11c3QgZXhpc3QKICAgICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBjaGVjayB0aGF0IHRoZSBxdWFudGl0eSBpcyBjb3JyZWN0CiAgICAgICAgICBpZiAoYXBpLmFzc2VydCh0b2tlbiAhPT0gbnVsbCwgJ3N5bWJvbCBkb2VzIG5vdCBleGlzdCcpCiAgICAgICAgICAgICYmIGFwaS5hc3NlcnQoY291bnREZWNpbWFscyhxdWFudGl0eSkgPD0gdG9rZW4ucHJlY2lzaW9uLCAnc3ltYm9sIHByZWNpc2lvbiBtaXNtYXRjaCcpCiAgICAgICAgICAgICYmIGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihxdWFudGl0eSkuZ3QoMCksICdtdXN0IHRyYW5zZmVyIHBvc2l0aXZlIHF1YW50aXR5JykpIHsKCiAgICAgICAgICAgIGlmIChhd2FpdCBzdWJCYWxhbmNlVlR3byhmcm9tLCB0b2tlbiwgcXVhbnRpdHksICdjb250cmFjdHNCYWxhbmNlcycpKSB7CiAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYWRkQmFsYW5jZVZUd28oZmluYWxUbywgdG9rZW4sIHF1YW50aXR5LCB0YWJsZSk7CgogICAgICAgICAgICAgIGlmIChyZXMgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBhd2FpdCBhZGRCYWxhbmNlVlR3byhmcm9tLCB0b2tlbiwgcXVhbnRpdHksICdjb250cmFjdHNCYWxhbmNlcycpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoZmluYWxUbyA9PT0gJ251bGwnKSB7CiAgICAgICAgICAgICAgICAgIHRva2VuLmNpcmN1bGF0aW5nU3VwcGx5ID0gY2FsY3VsYXRlQmFsYW5jZVZUd28oCiAgICAgICAgICAgICAgICAgICAgdG9rZW4uY2lyY3VsYXRpbmdTdXBwbHksIHF1YW50aXR5LCB0b2tlbi5wcmVjaXNpb24sIGZhbHNlLAogICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCd0b2tlbnMnLCB0b2tlbik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYXBpLmVtaXQoJ3RyYW5zZmVyRnJvbUNvbnRyYWN0JywgewogICAgICAgICAgICAgICAgICBmcm9tLCB0bzogZmluYWxUbywgc3ltYm9sLCBxdWFudGl0eSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfTsKCmNvbnN0IHByb2Nlc3NVbnN0YWtlID0gYXN5bmMgKHVuc3Rha2UpID0+IHsKICBjb25zdCB7CiAgICBhY2NvdW50LAogICAgc3ltYm9sLAogICAgcXVhbnRpdHksCiAgICBxdWFudGl0eUxlZnQsCiAgICBudW1iZXJUcmFuc2FjdGlvbnNMZWZ0LAogIH0gPSB1bnN0YWtlOwoKICBjb25zdCBuZXdVbnN0YWtlID0gdW5zdGFrZTsKCiAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdiYWxhbmNlcycsIHsgYWNjb3VudCwgc3ltYm9sIH0pOwogIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3Rva2VucycsIHsgc3ltYm9sIH0pOwogIGxldCB0b2tlbnNUb1JlbGVhc2UgPSAwOwoKICBpZiAoYXBpLmFzc2VydChiYWxhbmNlICE9PSBudWxsLCAnYmFsYW5jZSBkb2VzIG5vdCBleGlzdCcpKSB7CiAgICAvLyBpZiBsYXN0IHRyYW5zYWN0aW9uIHRvIHByb2Nlc3MKICAgIGlmIChudW1iZXJUcmFuc2FjdGlvbnNMZWZ0ID09PSAxKSB7CiAgICAgIHRva2Vuc1RvUmVsZWFzZSA9IHF1YW50aXR5TGVmdDsKICAgICAgYXdhaXQgYXBpLmRiLnJlbW92ZSgncGVuZGluZ1Vuc3Rha2VzJywgdW5zdGFrZSk7CiAgICB9IGVsc2UgewogICAgICB0b2tlbnNUb1JlbGVhc2UgPSBhcGkuQmlnTnVtYmVyKHF1YW50aXR5KQogICAgICAgIC5kaXZpZGVkQnkodG9rZW4ubnVtYmVyVHJhbnNhY3Rpb25zKQogICAgICAgIC50b0ZpeGVkKHRva2VuLnByZWNpc2lvbiwgYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKCiAgICAgIG5ld1Vuc3Rha2UucXVhbnRpdHlMZWZ0ID0gYXBpLkJpZ051bWJlcihuZXdVbnN0YWtlLnF1YW50aXR5TGVmdCkKICAgICAgICAubWludXModG9rZW5zVG9SZWxlYXNlKQogICAgICAgIC50b0ZpeGVkKHRva2VuLnByZWNpc2lvbik7CgogICAgICBuZXdVbnN0YWtlLm51bWJlclRyYW5zYWN0aW9uc0xlZnQgLT0gMTsKCiAgICAgIG5ld1Vuc3Rha2UubmV4dFRyYW5zYWN0aW9uVGltZXN0YW1wID0gYXBpLkJpZ051bWJlcihuZXdVbnN0YWtlLm5leHRUcmFuc2FjdGlvblRpbWVzdGFtcCkKICAgICAgICAucGx1cyhuZXdVbnN0YWtlLm1pbGxpc2VjUGVyUGVyaW9kKQogICAgICAgIC50b051bWJlcigpOwoKICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncGVuZGluZ1Vuc3Rha2VzJywgbmV3VW5zdGFrZSk7CiAgICB9CgogICAgaWYgKGFwaS5CaWdOdW1iZXIodG9rZW5zVG9SZWxlYXNlKS5ndCgwKSkgewogICAgICBjb25zdCBvcmlnaW5hbEJhbGFuY2UgPSBiYWxhbmNlLmJhbGFuY2U7CiAgICAgIGNvbnN0IG9yaWdpbmFsUGVuZGluZ1N0YWtlID0gYmFsYW5jZS5wZW5kaW5nVW5zdGFrZTsKCiAgICAgIGJhbGFuY2UuYmFsYW5jZSA9IGNhbGN1bGF0ZUJhbGFuY2VWVHdvKAogICAgICAgIGJhbGFuY2UuYmFsYW5jZSwgdG9rZW5zVG9SZWxlYXNlLCB0b2tlbi5wcmVjaXNpb24sIHRydWUsCiAgICAgICk7CiAgICAgIGJhbGFuY2UucGVuZGluZ1Vuc3Rha2UgPSBjYWxjdWxhdGVCYWxhbmNlVlR3bygKICAgICAgICBiYWxhbmNlLnBlbmRpbmdVbnN0YWtlLCB0b2tlbnNUb1JlbGVhc2UsIHRva2VuLnByZWNpc2lvbiwgZmFsc2UsCiAgICAgICk7CgogICAgICBpZiAoYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKGJhbGFuY2UucGVuZGluZ1Vuc3Rha2UpLmx0KG9yaWdpbmFsUGVuZGluZ1N0YWtlKQogICAgICAgICYmIGFwaS5CaWdOdW1iZXIoYmFsYW5jZS5iYWxhbmNlKS5ndChvcmlnaW5hbEJhbGFuY2UpLCAnY2Fubm90IHN1YnRyYWN0JykpIHsKICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCdiYWxhbmNlcycsIGJhbGFuY2UpOwoKICAgICAgICBhcGkuZW1pdCgndW5zdGFrZScsIHsgYWNjb3VudCwgc3ltYm9sLCBxdWFudGl0eTogdG9rZW5zVG9SZWxlYXNlIH0pOwogICAgICB9CiAgICB9CiAgfQp9OwoKYWN0aW9ucy5jaGVja1BlbmRpbmdVbnN0YWtlcyA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgaWYgKGFwaS5hc3NlcnQoYXBpLnNlbmRlciA9PT0gJ251bGwnLCAnbm90IGF1dGhvcml6ZWQnKSkgewogICAgY29uc3QgYmxvY2tEYXRlID0gbmV3IERhdGUoYCR7YXBpLnN0ZWVtQmxvY2tUaW1lc3RhbXB9LjAwMFpgKTsKICAgIGNvbnN0IHRpbWVzdGFtcCA9IGJsb2NrRGF0ZS5nZXRUaW1lKCk7CgogICAgLy8gZ2V0IGFsbCB0aGUgcGVuZGluZyB1bnN0YWtlcyB0aGF0IGFyZSByZWFkeSB0byBiZSByZWxlYXNlZAogICAgbGV0IHBlbmRpbmdVbnN0YWtlcyA9IGF3YWl0IGFwaS5kYi5maW5kKAogICAgICAncGVuZGluZ1Vuc3Rha2VzJywKICAgICAgewogICAgICAgIG5leHRUcmFuc2FjdGlvblRpbWVzdGFtcDogewogICAgICAgICAgJGx0ZTogdGltZXN0YW1wLAogICAgICAgIH0sCiAgICAgIH0pOwoKICAgIGxldCBuYlBlbmRpbmdVbnN0YWtlcyA9IHBlbmRpbmdVbnN0YWtlcy5sZW5ndGg7CiAgICB3aGlsZSAobmJQZW5kaW5nVW5zdGFrZXMgPiAwKSB7CiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBuYlBlbmRpbmdVbnN0YWtlczsgaW5kZXggKz0gMSkgewogICAgICAgIGNvbnN0IHBlbmRpbmdVbnN0YWtlID0gcGVuZGluZ1Vuc3Rha2VzW2luZGV4XTsKICAgICAgICBhd2FpdCBwcm9jZXNzVW5zdGFrZShwZW5kaW5nVW5zdGFrZSk7CiAgICAgIH0KCiAgICAgIHBlbmRpbmdVbnN0YWtlcyA9IGF3YWl0IGFwaS5kYi5maW5kKAogICAgICAgICdwZW5kaW5nVW5zdGFrZXMnLAogICAgICAgIHsKICAgICAgICAgIG5leHRUcmFuc2FjdGlvblRpbWVzdGFtcDogewogICAgICAgICAgICAkbHRlOiB0aW1lc3RhbXAsCiAgICAgICAgICB9LAogICAgICAgIH0pOwogIAogICAgICBuYlBlbmRpbmdVbnN0YWtlcyA9IHBlbmRpbmdVbnN0YWtlcy5sZW5ndGg7CiAgICB9CiAgfQp9OwoKYWN0aW9ucy5lbmFibGVTdGFraW5nID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7IHN5bWJvbCwgdW5zdGFraW5nQ29vbGRvd24sIG51bWJlclRyYW5zYWN0aW9ucywgaXNTaWduZWRXaXRoQWN0aXZlS2V5IH0gPSBwYXlsb2FkOwoKICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgJiYgYXBpLmFzc2VydChzeW1ib2wgJiYgdHlwZW9mIHN5bWJvbCA9PT0gJ3N0cmluZycsICdpbnZhbGlkIHN5bWJvbCcpCiAgICAmJiBhcGkuYXNzZXJ0KHVuc3Rha2luZ0Nvb2xkb3duICYmIE51bWJlci5pc0ludGVnZXIodW5zdGFraW5nQ29vbGRvd24pICYmIHVuc3Rha2luZ0Nvb2xkb3duID4gMCAmJiB1bnN0YWtpbmdDb29sZG93biA8PSAzNjUsICd1bnN0YWtpbmdDb29sZG93biBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAzNjUnKQogICAgJiYgYXBpLmFzc2VydChudW1iZXJUcmFuc2FjdGlvbnMgJiYgTnVtYmVyLmlzSW50ZWdlcihudW1iZXJUcmFuc2FjdGlvbnMpICYmIG51bWJlclRyYW5zYWN0aW9ucyA+IDAgJiYgbnVtYmVyVHJhbnNhY3Rpb25zIDw9IDM2NSwgJ251bWJlclRyYW5zYWN0aW9ucyBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAzNjUnKSkgewogICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndG9rZW5zJywgeyBzeW1ib2wgfSk7CgogICAgaWYgKGFwaS5hc3NlcnQodG9rZW4gIT09IG51bGwsICdzeW1ib2wgZG9lcyBub3QgZXhpc3QnKQogICAgICAmJiBhcGkuYXNzZXJ0KHRva2VuLmlzc3VlciA9PT0gYXBpLnNlbmRlciwgJ211c3QgYmUgdGhlIGlzc3VlcicpCiAgICAgICYmIGFwaS5hc3NlcnQodG9rZW4uc3Rha2luZ0VuYWJsZWQgPT09IHVuZGVmaW5lZCB8fCB0b2tlbi5zdGFraW5nRW5hYmxlZCA9PT0gZmFsc2UsICdzdGFraW5nIGFscmVhZHkgZW5hYmxlZCcpKSB7CiAgICAgIHRva2VuLnN0YWtpbmdFbmFibGVkID0gdHJ1ZTsKICAgICAgdG9rZW4udW5zdGFraW5nQ29vbGRvd24gPSB1bnN0YWtpbmdDb29sZG93bjsKICAgICAgdG9rZW4ubnVtYmVyVHJhbnNhY3Rpb25zID0gbnVtYmVyVHJhbnNhY3Rpb25zOwogICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCd0b2tlbnMnLCB0b2tlbik7CiAgICB9CiAgfQp9OwoKYWN0aW9ucy5lbmFibGVWb3RpbmcgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsgc3ltYm9sLCBuYkRheXMxMDBQZXJjZW50UmVnZW5lcmF0aW9uLCBpc1NpZ25lZFdpdGhBY3RpdmVLZXkgfSA9IHBheWxvYWQ7CgogIGlmIChhcGkuYXNzZXJ0KGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZSwgJ3lvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleScpCiAgICAmJiBhcGkuYXNzZXJ0KHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJywgJ2ludmFsaWQgc3ltYm9sJykKICAgICYmIGFwaS5hc3NlcnQobmJEYXlzMTAwUGVyY2VudFJlZ2VuZXJhdGlvbiAmJiBOdW1iZXIuaXNJbnRlZ2VyKG5iRGF5czEwMFBlcmNlbnRSZWdlbmVyYXRpb24pICYmIG5iRGF5czEwMFBlcmNlbnRSZWdlbmVyYXRpb24gPiAwICYmIG5iRGF5czEwMFBlcmNlbnRSZWdlbmVyYXRpb24gPD0gMzY1LCAnbmJEYXlzMTAwUGVyY2VudFJlZ2VuZXJhdGlvbiBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAzNjUnKSkgewogICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndG9rZW5zJywgeyBzeW1ib2wgfSk7CgogICAgaWYgKGFwaS5hc3NlcnQodG9rZW4gIT09IG51bGwsICdzeW1ib2wgZG9lcyBub3QgZXhpc3QnKQogICAgICAmJiBhcGkuYXNzZXJ0KHRva2VuLmlzc3VlciA9PT0gYXBpLnNlbmRlciwgJ211c3QgYmUgdGhlIGlzc3VlcicpCiAgICAgICYmIGFwaS5hc3NlcnQodG9rZW4uc3Rha2luZ0VuYWJsZWQgPT09IGZhbHNlLCAndm90aW5nIGFscmVhZHkgZW5hYmxlZCcpKSB7CiAgICAgIHRva2VuLnZvdGluZ0VuYWJsZWQgPSB0cnVlOwogICAgICB0b2tlbi5uYkRheXMxMDBQZXJjZW50UmVnZW5lcmF0aW9uID0gbmJEYXlzMTAwUGVyY2VudFJlZ2VuZXJhdGlvbjsKICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgndG9rZW5zJywgdG9rZW4pOwogICAgfQogIH0KfTsKCmFjdGlvbnMuc3Rha2UgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsgc3ltYm9sLCBxdWFudGl0eSwgaXNTaWduZWRXaXRoQWN0aXZlS2V5IH0gPSBwYXlsb2FkOwoKICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgJiYgYXBpLmFzc2VydChzeW1ib2wgJiYgdHlwZW9mIHN5bWJvbCA9PT0gJ3N0cmluZycKICAgICAgJiYgcXVhbnRpdHkgJiYgdHlwZW9mIHF1YW50aXR5ID09PSAnc3RyaW5nJyAmJiAhYXBpLkJpZ051bWJlcihxdWFudGl0eSkuaXNOYU4oKSwgJ2ludmFsaWQgcGFyYW1zJykpIHsKCiAgICAvLyBhIHZhbGlkIHN0ZWVtIGFjY291bnQgaXMgYmV0d2VlbiAzIGFuZCAxNiBjaGFyYWN0ZXJzIGluIGxlbmd0aAogICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndG9rZW5zJywgeyBzeW1ib2wgfSk7CgogICAgLy8gdGhlIHN5bWJvbCBtdXN0IGV4aXN0CiAgICAvLyB0aGVuIHdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgcXVhbnRpdHkgaXMgY29ycmVjdAogICAgaWYgKGFwaS5hc3NlcnQodG9rZW4gIT09IG51bGwsICdzeW1ib2wgZG9lcyBub3QgZXhpc3QnKQogICAgICAmJiBhcGkuYXNzZXJ0KGNvdW50RGVjaW1hbHMocXVhbnRpdHkpIDw9IHRva2VuLnByZWNpc2lvbiwgJ3N5bWJvbCBwcmVjaXNpb24gbWlzbWF0Y2gnKQogICAgICAmJiBhcGkuYXNzZXJ0KHRva2VuLnN0YWtpbmdFbmFibGVkID09PSB0cnVlLCAnc3Rha2luZyBub3QgZW5hYmxlZCcpCiAgICAgICYmIGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihxdWFudGl0eSkuZ3QoMCksICdtdXN0IHN0YWtlIHBvc2l0aXZlIHF1YW50aXR5JykpIHsKICAgICAgaWYgKGF3YWl0IHN1YkJhbGFuY2VWVHdvKGFwaS5zZW5kZXIsIHRva2VuLCBxdWFudGl0eSwgJ2JhbGFuY2VzJykpIHsKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBhZGRTdGFrZShhcGkuc2VuZGVyLCB0b2tlbiwgcXVhbnRpdHkpOwoKICAgICAgICBpZiAocmVzID09PSBmYWxzZSkgewogICAgICAgICAgYXdhaXQgYWRkQmFsYW5jZVZUd28oYXBpLnNlbmRlciwgdG9rZW4sIHF1YW50aXR5LCAnYmFsYW5jZXMnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXBpLmVtaXQoJ3N0YWtlJywgeyBhY2NvdW50OiBhcGkuc2VuZGVyLCBzeW1ib2wsIHF1YW50aXR5IH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfTsKCmNvbnN0IHN0YXJ0VW5zdGFrZSA9IGFzeW5jIChhY2NvdW50LCB0b2tlbiwgcXVhbnRpdHkpID0+IHsKICBjb25zdCBibG9ja0RhdGUgPSBuZXcgRGF0ZShgJHthcGkuc3RlZW1CbG9ja1RpbWVzdGFtcH0uMDAwWmApOwogIGNvbnN0IGNvb2xkb3duUGVyaW9kTWlsbGlzZWMgPSB0b2tlbi51bnN0YWtpbmdDb29sZG93biAqIDI0ICogMzYwMCAqIDEwMDA7CiAgY29uc3QgbWlsbGlzZWNQZXJQZXJpb2QgPSBhcGkuQmlnTnVtYmVyKGNvb2xkb3duUGVyaW9kTWlsbGlzZWMpCiAgICAuZGl2aWRlZEJ5KHRva2VuLm51bWJlclRyYW5zYWN0aW9ucykKICAgIC5pbnRlZ2VyVmFsdWUoYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKTsKCiAgY29uc3QgbmV4dFRyYW5zYWN0aW9uVGltZXN0YW1wID0gYXBpLkJpZ051bWJlcihibG9ja0RhdGUuZ2V0VGltZSgpKQogICAgLnBsdXMobWlsbGlzZWNQZXJQZXJpb2QpCiAgICAudG9OdW1iZXIoKTsKCiAgY29uc3QgdW5zdGFrZSA9IHsKICAgIGFjY291bnQsCiAgICBzeW1ib2w6IHRva2VuLnN5bWJvbCwKICAgIHF1YW50aXR5LAogICAgcXVhbnRpdHlMZWZ0OiBxdWFudGl0eSwKICAgIG5leHRUcmFuc2FjdGlvblRpbWVzdGFtcCwKICAgIG51bWJlclRyYW5zYWN0aW9uc0xlZnQ6IHRva2VuLm51bWJlclRyYW5zYWN0aW9ucywKICAgIG1pbGxpc2VjUGVyUGVyaW9kLAogICAgdHhJRDogYXBpLnRyYW5zYWN0aW9uSWQsCiAgfTsKCiAgYXdhaXQgYXBpLmRiLmluc2VydCgncGVuZGluZ1Vuc3Rha2VzJywgdW5zdGFrZSk7Cn07CgphY3Rpb25zLnVuc3Rha2UgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsgc3ltYm9sLCBxdWFudGl0eSwgaXNTaWduZWRXaXRoQWN0aXZlS2V5IH0gPSBwYXlsb2FkOwoKICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgJiYgYXBpLmFzc2VydChzeW1ib2wgJiYgdHlwZW9mIHN5bWJvbCA9PT0gJ3N0cmluZycKICAgICAgJiYgcXVhbnRpdHkgJiYgdHlwZW9mIHF1YW50aXR5ID09PSAnc3RyaW5nJyAmJiAhYXBpLkJpZ051bWJlcihxdWFudGl0eSkuaXNOYU4oKSwgJ2ludmFsaWQgcGFyYW1zJykpIHsKCiAgICAvLyBhIHZhbGlkIHN0ZWVtIGFjY291bnQgaXMgYmV0d2VlbiAzIGFuZCAxNiBjaGFyYWN0ZXJzIGluIGxlbmd0aAogICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndG9rZW5zJywgeyBzeW1ib2wgfSk7CgogICAgLy8gdGhlIHN5bWJvbCBtdXN0IGV4aXN0CiAgICAvLyB0aGVuIHdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgcXVhbnRpdHkgaXMgY29ycmVjdAogICAgaWYgKGFwaS5hc3NlcnQodG9rZW4gIT09IG51bGwsICdzeW1ib2wgZG9lcyBub3QgZXhpc3QnKQogICAgICAmJiBhcGkuYXNzZXJ0KHRva2VuLnN0YWtpbmdFbmFibGVkID09PSB0cnVlLCAnc3Rha2luZyBub3QgZW5hYmxlZCcpCiAgICAgICYmIGFwaS5hc3NlcnQoY291bnREZWNpbWFscyhxdWFudGl0eSkgPD0gdG9rZW4ucHJlY2lzaW9uLCAnc3ltYm9sIHByZWNpc2lvbiBtaXNtYXRjaCcpCiAgICAgICYmIGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihxdWFudGl0eSkuZ3QoMCksICdtdXN0IHVuc3Rha2UgcG9zaXRpdmUgcXVhbnRpdHknKSkgewoKICAgICAgaWYgKGF3YWl0IHN1YlN0YWtlKGFwaS5zZW5kZXIsIHRva2VuLCBxdWFudGl0eSkpIHsKICAgICAgICBhd2FpdCBzdGFydFVuc3Rha2UoYXBpLnNlbmRlciwgdG9rZW4sIHF1YW50aXR5KTsKCiAgICAgICAgYXBpLmVtaXQoJ3Vuc3Rha2VTdGFydCcsIHsgYWNjb3VudDogYXBpLnNlbmRlciwgc3ltYm9sLCBxdWFudGl0eSB9KTsKICAgICAgfQogICAgfQogIH0KfTsKCmNvbnN0IHByb2Nlc3NDYW5jZWxVbnN0YWtlID0gYXN5bmMgKHVuc3Rha2UpID0+IHsKICBjb25zdCB7CiAgICBhY2NvdW50LAogICAgc3ltYm9sLAogICAgcXVhbnRpdHlMZWZ0LAogIH0gPSB1bnN0YWtlOwoKICBjb25zdCBiYWxhbmNlID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ2JhbGFuY2VzJywgeyBhY2NvdW50LCBzeW1ib2wgfSk7CiAgY29uc3QgdG9rZW4gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgndG9rZW5zJywgeyBzeW1ib2wgfSk7CgogIGlmIChhcGkuYXNzZXJ0KGJhbGFuY2UgIT09IG51bGwsICdiYWxhbmNlIGRvZXMgbm90IGV4aXN0JykKICAgICYmIGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihiYWxhbmNlLnBlbmRpbmdVbnN0YWtlKS5ndGUocXVhbnRpdHlMZWZ0KSwgJ292ZXJkcmF3biBwZW5kaW5nVW5zdGFrZScpKSB7CiAgICBjb25zdCBvcmlnaW5hbFN0YWtlID0gYmFsYW5jZS5zdGFrZTsKICAgIGNvbnN0IG9yaWdpbmFsUGVuZGluZ1N0YWtlID0gYmFsYW5jZS5wZW5kaW5nVW5zdGFrZTsKCiAgICBiYWxhbmNlLnN0YWtlID0gY2FsY3VsYXRlQmFsYW5jZVZUd28oCiAgICAgIGJhbGFuY2Uuc3Rha2UsIHF1YW50aXR5TGVmdCwgdG9rZW4ucHJlY2lzaW9uLCB0cnVlLAogICAgKTsKICAgIGJhbGFuY2UucGVuZGluZ1Vuc3Rha2UgPSBjYWxjdWxhdGVCYWxhbmNlVlR3bygKICAgICAgYmFsYW5jZS5wZW5kaW5nVW5zdGFrZSwgcXVhbnRpdHlMZWZ0LCB0b2tlbi5wcmVjaXNpb24sIGZhbHNlLAogICAgKTsKCiAgICBpZiAoYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKGJhbGFuY2UucGVuZGluZ1Vuc3Rha2UpLmx0KG9yaWdpbmFsUGVuZGluZ1N0YWtlKQogICAgICAmJiBhcGkuQmlnTnVtYmVyKGJhbGFuY2Uuc3Rha2UpLmd0KG9yaWdpbmFsU3Rha2UpLCAnY2Fubm90IHN1YnRyYWN0JykpIHsKICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgnYmFsYW5jZXMnLCBiYWxhbmNlKTsKCiAgICAgIGFwaS5lbWl0KCd1bnN0YWtlJywgeyBhY2NvdW50LCBzeW1ib2wsIHF1YW50aXR5OiBxdWFudGl0eUxlZnQgfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgcmV0dXJuIGZhbHNlOwp9OwoKYWN0aW9ucy5jYW5jZWxVbnN0YWtlID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7IHR4SUQsIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSB9ID0gcGF5bG9hZDsKCiAgaWYgKGFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAneW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5JykKICAgICAgJiYgYXBpLmFzc2VydCh0eElEICYmIHR5cGVvZiB0eElEID09PSAnc3RyaW5nJywgJ2ludmFsaWQgcGFyYW1zJykpIHsKICAgIC8vIGdldCB1bnN0YWtlCiAgICBjb25zdCB1bnN0YWtlID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3BlbmRpbmdVbnN0YWtlcycsIHsgYWNjb3VudDogYXBpLnNlbmRlciwgdHhJRCB9KTsKCiAgICBpZiAoYXBpLmFzc2VydCh1bnN0YWtlLCAndW5zdGFrZSBkb2VzIG5vdCBleGlzdCcpKSB7CiAgICAgIGlmIChhd2FpdCBwcm9jZXNzQ2FuY2VsVW5zdGFrZSh1bnN0YWtlKSkgewogICAgICAgIGF3YWl0IGFwaS5kYi5yZW1vdmUoJ3BlbmRpbmdVbnN0YWtlcycsIHVuc3Rha2UpOwogICAgICB9CiAgICB9CiAgfQp9OwoKY29uc3QgYWRkU3Rha2UgPSBhc3luYyAoYWNjb3VudCwgdG9rZW4sIHF1YW50aXR5KSA9PiB7CiAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdiYWxhbmNlcycsIHsgYWNjb3VudCwgc3ltYm9sOiB0b2tlbi5zeW1ib2wgfSk7CgogIGNvbnN0IG9yaWdpbmFsU3Rha2UgPSBiYWxhbmNlLnN0YWtlOwoKICBiYWxhbmNlLnN0YWtlID0gY2FsY3VsYXRlQmFsYW5jZVZUd28oYmFsYW5jZS5zdGFrZSwgcXVhbnRpdHksIHRva2VuLnByZWNpc2lvbiwgdHJ1ZSk7CiAgaWYgKGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihiYWxhbmNlLnN0YWtlKS5ndChvcmlnaW5hbFN0YWtlKSwgJ2Nhbm5vdCBhZGQnKSkgewogICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgnYmFsYW5jZXMnLCBiYWxhbmNlKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgcmV0dXJuIGZhbHNlOwp9OwoKY29uc3Qgc3ViU3Rha2UgPSBhc3luYyAoYWNjb3VudCwgdG9rZW4sIHF1YW50aXR5KSA9PiB7CiAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdiYWxhbmNlcycsIHsgYWNjb3VudCwgc3ltYm9sOiB0b2tlbi5zeW1ib2wgfSk7CgogIGlmIChhcGkuYXNzZXJ0KGJhbGFuY2UgIT09IG51bGwsICdiYWxhbmNlIGRvZXMgbm90IGV4aXN0JykKICAgICYmIGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihiYWxhbmNlLnN0YWtlKS5ndGUocXVhbnRpdHkpLCAnb3ZlcmRyYXduIHN0YWtlJykpIHsKICAgIGNvbnN0IG9yaWdpbmFsU3Rha2UgPSBiYWxhbmNlLnN0YWtlOwogICAgY29uc3Qgb3JpZ2luYWxQZW5kaW5nU3Rha2UgPSBiYWxhbmNlLnBlbmRpbmdVbnN0YWtlOwoKICAgIGJhbGFuY2Uuc3Rha2UgPSBjYWxjdWxhdGVCYWxhbmNlVlR3byhiYWxhbmNlLnN0YWtlLCBxdWFudGl0eSwgdG9rZW4ucHJlY2lzaW9uLCBmYWxzZSk7CiAgICBiYWxhbmNlLnBlbmRpbmdVbnN0YWtlID0gY2FsY3VsYXRlQmFsYW5jZVZUd28oCiAgICAgIGJhbGFuY2UucGVuZGluZ1Vuc3Rha2UsIHF1YW50aXR5LCB0b2tlbi5wcmVjaXNpb24sIHRydWUsCiAgICApOwoKICAgIGlmIChhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIoYmFsYW5jZS5zdGFrZSkubHQob3JpZ2luYWxTdGFrZSkKICAgICAgJiYgYXBpLkJpZ051bWJlcihiYWxhbmNlLnBlbmRpbmdVbnN0YWtlKS5ndChvcmlnaW5hbFBlbmRpbmdTdGFrZSksICdjYW5ub3Qgc3VidHJhY3QnKSkgewogICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCdiYWxhbmNlcycsIGJhbGFuY2UpOwoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfQoKICByZXR1cm4gZmFsc2U7Cn07Cgpjb25zdCBzdWJCYWxhbmNlVk9uZSA9IGFzeW5jIChhY2NvdW50LCB0b2tlbiwgcXVhbnRpdHksIHRhYmxlKSA9PiB7CiAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IGFwaS5kYi5maW5kT25lKHRhYmxlLCB7IGFjY291bnQsIHN5bWJvbDogdG9rZW4uc3ltYm9sIH0pOwogIGlmIChhcGkuYXNzZXJ0KGJhbGFuY2UgIT09IG51bGwsICdiYWxhbmNlIGRvZXMgbm90IGV4aXN0JykgCiAgICAmJiBhcGkuYXNzZXJ0KGJhbGFuY2UuYmFsYW5jZSA+PSBxdWFudGl0eSwgJ292ZXJkcmF3biBiYWxhbmNlJykpIHsKICAgIGNvbnN0IG9yaWdpbmFsQmFsYW5jZSA9IGJhbGFuY2UuYmFsYW5jZTsKCiAgICBiYWxhbmNlLmJhbGFuY2UgPSBjYWxjdWxhdGVCYWxhbmNlVk9uZShiYWxhbmNlLmJhbGFuY2UsIHF1YW50aXR5LCB0b2tlbi5wcmVjaXNpb24sIGZhbHNlKTsKCiAgICBpZiAoYXBpLmFzc2VydChiYWxhbmNlLmJhbGFuY2UgPCBvcmlnaW5hbEJhbGFuY2UsICdjYW5ub3Qgc3VidHJhY3QnKSkgewogICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKHRhYmxlLCBiYWxhbmNlKTsKCiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgcmV0dXJuIGZhbHNlOwp9OwoKY29uc3Qgc3ViQmFsYW5jZVZUd28gPSBhc3luYyAoYWNjb3VudCwgdG9rZW4sIHF1YW50aXR5LCB0YWJsZSkgPT4gewogIGNvbnN0IGJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSh0YWJsZSwgeyBhY2NvdW50LCBzeW1ib2w6IHRva2VuLnN5bWJvbCB9KTsKCiAgaWYgKGFwaS5hc3NlcnQoYmFsYW5jZSAhPT0gbnVsbCwgJ2JhbGFuY2UgZG9lcyBub3QgZXhpc3QnKQogICAgJiYgYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKGJhbGFuY2UuYmFsYW5jZSkuZ3RlKHF1YW50aXR5KSwgJ292ZXJkcmF3biBiYWxhbmNlJykpIHsKICAgIGNvbnN0IG9yaWdpbmFsQmFsYW5jZSA9IGJhbGFuY2UuYmFsYW5jZTsKCiAgICBiYWxhbmNlLmJhbGFuY2UgPSBjYWxjdWxhdGVCYWxhbmNlVlR3byhiYWxhbmNlLmJhbGFuY2UsIHF1YW50aXR5LCB0b2tlbi5wcmVjaXNpb24sIGZhbHNlKTsKCiAgICBpZiAoYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKGJhbGFuY2UuYmFsYW5jZSkubHQob3JpZ2luYWxCYWxhbmNlKSwgJ2Nhbm5vdCBzdWJ0cmFjdCcpKSB7CiAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUodGFibGUsIGJhbGFuY2UpOwoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfQoKICByZXR1cm4gZmFsc2U7Cn07Cgpjb25zdCBhZGRCYWxhbmNlVk9uZSA9IGFzeW5jIChhY2NvdW50LCB0b2tlbiwgcXVhbnRpdHksIHRhYmxlKSA9PiB7CiAgbGV0IGJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSh0YWJsZSwgeyBhY2NvdW50LCBzeW1ib2w6IHRva2VuLnN5bWJvbCB9KTsKICBpZiAoYmFsYW5jZSA9PT0gbnVsbCkgewogICAgYmFsYW5jZSA9IHsKICAgICAgYWNjb3VudCwKICAgICAgc3ltYm9sOiB0b2tlbi5zeW1ib2wsCiAgICAgIGJhbGFuY2U6IHF1YW50aXR5CiAgICB9OwoKICAgIGF3YWl0IGFwaS5kYi5pbnNlcnQodGFibGUsIGJhbGFuY2UpOwoKICAgIHJldHVybiB0cnVlOwogIH0KICBjb25zdCBvcmlnaW5hbEJhbGFuY2UgPSBiYWxhbmNlLmJhbGFuY2U7CgogIGJhbGFuY2UuYmFsYW5jZSA9IGNhbGN1bGF0ZUJhbGFuY2VWT25lKGJhbGFuY2UuYmFsYW5jZSwgcXVhbnRpdHksIHRva2VuLnByZWNpc2lvbiwgdHJ1ZSk7CiAgaWYgKGFwaS5hc3NlcnQoYmFsYW5jZS5iYWxhbmNlID4gb3JpZ2luYWxCYWxhbmNlLCAnY2Fubm90IGFkZCcpKSB7CiAgICBhd2FpdCBhcGkuZGIudXBkYXRlKHRhYmxlLCBiYWxhbmNlKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgcmV0dXJuIGZhbHNlOwp9OwoKY29uc3QgYWRkQmFsYW5jZVZUd28gPSBhc3luYyAoYWNjb3VudCwgdG9rZW4sIHF1YW50aXR5LCB0YWJsZSkgPT4gewogIGxldCBiYWxhbmNlID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUodGFibGUsIHsgYWNjb3VudCwgc3ltYm9sOiB0b2tlbi5zeW1ib2wgfSk7CiAgaWYgKGJhbGFuY2UgPT09IG51bGwpIHsKICAgIGJhbGFuY2UgPSB7CiAgICAgIGFjY291bnQsCiAgICAgIHN5bWJvbDogdG9rZW4uc3ltYm9sLAogICAgICBiYWxhbmNlOiBxdWFudGl0eSwKICAgICAgc3Rha2U6ICcwJywKICAgICAgZGVsZWdhdGVkU3Rha2U6ICcwJywKICAgICAgcmVjZWl2ZWRTdGFrZTogJzAnLAogICAgICBwZW5kaW5nVW5zdGFrZTogJzAnLAogICAgICB2b3RpbmdQb3dlcjogJzEwMCcsCiAgICAgIGxhc3RWb3RlVGltZTogMCwKICAgIH07CgogICAgYXdhaXQgYXBpLmRiLmluc2VydCh0YWJsZSwgYmFsYW5jZSk7CgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBjb25zdCBvcmlnaW5hbEJhbGFuY2UgPSBiYWxhbmNlLmJhbGFuY2U7CgogIGJhbGFuY2UuYmFsYW5jZSA9IGNhbGN1bGF0ZUJhbGFuY2VWVHdvKGJhbGFuY2UuYmFsYW5jZSwgcXVhbnRpdHksIHRva2VuLnByZWNpc2lvbiwgdHJ1ZSk7CiAgaWYgKGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihiYWxhbmNlLmJhbGFuY2UpLmd0KG9yaWdpbmFsQmFsYW5jZSksICdjYW5ub3QgYWRkJykpIHsKICAgIGF3YWl0IGFwaS5kYi51cGRhdGUodGFibGUsIGJhbGFuY2UpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICByZXR1cm4gZmFsc2U7Cn07Cgpjb25zdCBjYWxjdWxhdGVCYWxhbmNlVk9uZSA9IChiYWxhbmNlLCBxdWFudGl0eSwgcHJlY2lzaW9uLCBhZGQpID0+IHsKICBpZiAocHJlY2lzaW9uID09PSAwKSB7CiAgICByZXR1cm4gYWRkID8gYmFsYW5jZSArIHF1YW50aXR5IDogYmFsYW5jZSAtIHF1YW50aXR5OwogIH0KCiAgcmV0dXJuIGFkZAogICAgPyBhcGkuQmlnTnVtYmVyKGJhbGFuY2UpLnBsdXMocXVhbnRpdHkpLnRvTnVtYmVyKCkKICAgIDogYXBpLkJpZ051bWJlcihiYWxhbmNlKS5taW51cyhxdWFudGl0eSkudG9OdW1iZXIoKTsKfTsKCmNvbnN0IGNhbGN1bGF0ZUJhbGFuY2VWVHdvID0gKGJhbGFuY2UsIHF1YW50aXR5LCBwcmVjaXNpb24sIGFkZCkgPT4gewogIHJldHVybiBhZGQKICAgID8gYXBpLkJpZ051bWJlcihiYWxhbmNlKS5wbHVzKHF1YW50aXR5KS50b0ZpeGVkKHByZWNpc2lvbikKICAgIDogYXBpLkJpZ051bWJlcihiYWxhbmNlKS5taW51cyhxdWFudGl0eSkudG9GaXhlZChwcmVjaXNpb24pOwp9OwoKY29uc3QgY2FsY3VsYXRlVm90aW5nUG93ZXIgPSAoYmFsYW5jZSwgbmJEYXlzMTAwUGVyY2VudFJlZ2VuZXJhdGlvbiwgbm93VGltZVNlYykgPT4gewogIGlmIChiYWxhbmNlLmxhc3RWb3RlVGltZSA9PT0gMCB8fCBhcGkuQmlnTnVtYmVyKGJhbGFuY2Uudm90aW5nUG93ZXIpLmVxKDEwMCkpIHsKICAgIHJldHVybiBiYWxhbmNlLnZvdGluZ1Bvd2VyOwogIH0KCiAgY29uc3Qgc2Vjb25kc2FnbyA9IG5vd1RpbWVTZWMgLSBiYWxhbmNlLmxhc3RWb3RlVGltZTsKICBjb25zdCBuYkRheXMxMDBQZXJjZW50UmVnZW5lcmF0aW9uU2VjcyA9IG5iRGF5czEwMFBlcmNlbnRSZWdlbmVyYXRpb24gKiAyNCAqIDYwICogNjA7CiAgY29uc3QgcmVnZW5lcmF0ZWRQb3dlciA9IGFwaS5CaWdOdW1iZXIoMTAwKQogICAgLmRpdmlkZWRCeShuYkRheXMxMDBQZXJjZW50UmVnZW5lcmF0aW9uU2VjcykKICAgIC5tdWx0aXBsaWVkQnkoc2Vjb25kc2FnbykKICAgIC50b0ZpeGVkKDIpOwoKICBjb25zdCBuZXdWb3RpbmdQb3dlciA9IGFwaS5CaWdOdW1iZXIoYmFsYW5jZS52b3RpbmdQb3dlcikKICAgIC5wbHVzKHJlZ2VuZXJhdGVkUG93ZXIpCiAgICAudG9GaXhlZCgyKTsKCiAgcmV0dXJuIGFwaS5CaWdOdW1iZXIobmV3Vm90aW5nUG93ZXIpLmd0KDEwMCkgPyAnMTAwLjAwJyA6IG5ld1ZvdGluZ1Bvd2VyOwp9OwoKY29uc3QgY291bnREZWNpbWFscyA9IHZhbHVlID0+IGFwaS5CaWdOdW1iZXIodmFsdWUpLmRwKCk7Cg=="
}
}
}