diff --git a/fluxer_app_proxy/src/frozen_snapshots.rs b/fluxer_app_proxy/src/frozen_snapshots.rs index edb3cd8be..6a8e04427 100644 --- a/fluxer_app_proxy/src/frozen_snapshots.rs +++ b/fluxer_app_proxy/src/frozen_snapshots.rs @@ -5,7 +5,6 @@ use base64::Engine; use std::sync::LazyLock; const STABLE_SNAPSHOT_SHA: &str = "3250c73cbf94e97e8b9ca5a0ecb03c20bdde3867"; -const CANARY_SNAPSHOT_SHA: &str = "2026.605.11941"; const STABLE_INDEX_HTML: &str = "\ PCFkb2N0eXBlIGh0bWw+PGh0bWwgbGFuZz0iZW4iPjxoZWFkPjxtZXRhIGNoYXJzZXQ9InV0Zi04Ij48dGl0bGU+Rmx1eGVyPC90\ @@ -304,312 +303,6 @@ eyJzaGEiOiIzMjUwYzczY2JmOTRlOTdlOGI5Y2E1YTBlY2IwM2MyMGJkZGUzODY3IiwiYnVpbGROdW1i aW1lc3RhbXAiOiIxNzgwNzgxMTY4In0=\ "; -const CANARY_INDEX_HTML: &str = "\ -PCFkb2N0eXBlIGh0bWw+PGh0bWwgbGFuZz0iZW4iPjxoZWFkPjxtZXRhIGNoYXJzZXQ9InV0Zi04Ij48dGl0bGU+Rmx1eGVyPC90aXRsZT48bWV0YSBuYW1l\ -PSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLGluaXRpYWwtc2NhbGU9MSx2aWV3cG9ydC1maXQ9Y292ZXIsaW50ZXJhY3RpdmUtd2lk\ -Z2V0PXJlc2l6ZXMtY29udGVudCxtYXhpbXVtLXNjYWxlPTEsdXNlci1zY2FsYWJsZT1ubyI+PG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkZs\ -dXhlciBpcyBhIGZyZWUgYW5kIG9wZW4gc291cmNlIGluc3RhbnQgbWVzc2FnaW5nIGFuZCBWb0lQIGNoYXQgYXBwIGJ1aWx0IGZvciBmcmllbmRzLCBncm91\ -cHMsIGFuZCBjb21tdW5pdGllcy4iPjxsaW5rIHJlbD0icHJlY29ubmVjdCIgaHJlZj0ie3tTVEFUSUNfQ0ROX0VORFBPSU5UfX0iPjxsaW5rIHJlbD0ic3R5\ -bGVzaGVldCIgaHJlZj0ie3tTVEFUSUNfQ0ROX0VORFBPSU5UfX0vZm9udHMvaWJtLXBsZXguY3NzIj48bGluayByZWw9Im1hbmlmZXN0IiBocmVmPSIvbWFu\ -aWZlc3QuanNvbiI+PGxpbmsgcmVsPSJpY29uIiB0eXBlPSJpbWFnZS9wbmciIHNpemVzPSIzMngzMiIgaHJlZj0ie3tTVEFUSUNfQ0ROX0VORFBPSU5UfX0v\ -d2ViL2Zhdmljb24tMzJ4MzIucG5nIj48bGluayByZWw9ImFwcGxlLXRvdWNoLWljb24iIHNpemVzPSIxODB4MTgwIiBocmVmPSJ7e1NUQVRJQ19DRE5fRU5E\ -UE9JTlR9fS93ZWIvYXBwbGUtdG91Y2gtaWNvbi5wbmciPjxtZXRhIG5hbWU9ImFwcGxlLW1vYmlsZS13ZWItYXBwLWNhcGFibGUiIGNvbnRlbnQ9InllcyI+\ -PG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtc3RhdHVzLWJhci1zdHlsZSIgY29udGVudD0iZGVmYXVsdCI+PG1ldGEgbmFtZT0iYXBwbGUtbW9i\ -aWxlLXdlYi1hcHAtdGl0bGUiIGNvbnRlbnQ9IkZsdXhlciI+PG1ldGEgbmFtZT0ibW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIgY29udGVudD0ieWVzIj48bWV0\ -YSBuYW1lPSJ0aGVtZS1jb2xvciIgY29udGVudD0iIzQ2NDFEOSI+PG1ldGEgbmFtZT0ibXNhcHBsaWNhdGlvbi1uYXZidXR0b24tY29sb3IiIGNvbnRlbnQ9\ -IiM0NjQxRDkiPjxtZXRhIG5hbWU9Im1zYXBwbGljYXRpb24tVGlsZUNvbG9yIiBjb250ZW50PSIjNDY0MUQ5Ij48bWV0YSBuYW1lPSJmb3JtYXQtZGV0ZWN0\ -aW9uIiBjb250ZW50PSJ0ZWxlcGhvbmU9bm8iPjxtZXRhIG5hbWU9ImRpc3BsYXkiIGNvbnRlbnQ9InN0YW5kYWxvbmUiPjxzY3JpcHQgbm9uY2U9Int7Q1NQ\ -X05PTkNFX1BMQUNFSE9MREVSfX0iPiFmdW5jdGlvbigpe3RyeXt2YXIgZT13aW5kb3cubG9jYXRpb247aWYoIi8iPT09ZS5wYXRobmFtZSl7dmFyIGE9Ii9j\ -aGFubmVscy9AbWUiO2Uuc2VhcmNoJiYoYSs9ZS5zZWFyY2gpLGUuaGFzaCYmKGErPWUuaGFzaCksZS5yZXBsYWNlKGEpfX1jYXRjaChlKXt9fSgpLGZ1bmN0\ -aW9uKCl7dHJ5e3ZhciBlPWxvY2FsU3RvcmFnZS5nZXRJdGVtKCJ0aGVtZSIpO2UmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCJ0\ -aGVtZS0iK2UpfWNhdGNoe319KCk8L3NjcmlwdD48bGluayBocmVmPSJodHRwczovL2ZsdXhlcnN0YXRpYy5jb20vYXNzZXRzL2JiZjQxNDA1ZDkyZTI3MjYu\ -Y3NzIiByZWw9InN0eWxlc2hlZXQiPjwvaGVhZD48Ym9keT48ZGl2IGlkPSJyb290Ij48L2Rpdj4KPG5vc2NyaXB0PkphdmFTY3JpcHQgaXMgcmVxdWlyZWQg\ -dG8gdXNlIHRoaXMgYXBwbGljYXRpb24uPC9ub3NjcmlwdD4KCgo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9mbHV4ZXJzdGF0aWMuY29tL2Fzc2V0cy9kODI1ZDc0\ -Y2I3NGVjMjc3LmpzIiB0eXBlPSJtb2R1bGUiPjwvc2NyaXB0PjxzY3JpcHQgc3JjPSJodHRwczovL2ZsdXhlcnN0YXRpYy5jb20vYXNzZXRzLzNhYzFlYmYx\ -YjY1ZTBhYjMuanMiIHR5cGU9Im1vZHVsZSI+PC9zY3JpcHQ+PHNjcmlwdCBzcmM9Imh0dHBzOi8vZmx1eGVyc3RhdGljLmNvbS9hc3NldHMvZTE5NGM4MTEx\ -NzNmMDhhNy5qcyIgdHlwZT0ibW9kdWxlIj48L3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9mbHV4ZXJzdGF0aWMuY29tL2Fzc2V0cy9lYTUyM2JkOWM4\ -NjBkZjI1LmpzIiB0eXBlPSJtb2R1bGUiPjwvc2NyaXB0PjxzY3JpcHQgc3JjPSJodHRwczovL2ZsdXhlcnN0YXRpYy5jb20vYXNzZXRzLzVhYjdjNzdiM2I5\ -NzI3ODYuanMiIHR5cGU9Im1vZHVsZSI+PC9zY3JpcHQ+PHNjcmlwdCBzcmM9Imh0dHBzOi8vZmx1eGVyc3RhdGljLmNvbS9hc3NldHMvM2E4NjFhMjYzM2Q4\ -NzM2My5qcyIgdHlwZT0ibW9kdWxlIj48L3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9mbHV4ZXJzdGF0aWMuY29tL2Fzc2V0cy84NjY3MzIxZDM3OWQ3\ -NGZmLmpzIiB0eXBlPSJtb2R1bGUiPjwvc2NyaXB0PjxzY3JpcHQgc3JjPSJodHRwczovL2ZsdXhlcnN0YXRpYy5jb20vYXNzZXRzLzZiODVkYTIyNjRiZmI5\ -ODAuanMiIHR5cGU9Im1vZHVsZSI+PC9zY3JpcHQ+PHNjcmlwdCBzcmM9Imh0dHBzOi8vZmx1eGVyc3RhdGljLmNvbS9hc3NldHMvYjU4MDVjYTAzZTJmYzI4\ -Ni5qcyIgdHlwZT0ibW9kdWxlIj48L3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9mbHV4ZXJzdGF0aWMuY29tL2Fzc2V0cy80NzRiODYwYjA1ZjJlZThm\ -LmpzIiB0eXBlPSJtb2R1bGUiPjwvc2NyaXB0PjxzY3JpcHQgc3JjPSJodHRwczovL2ZsdXhlcnN0YXRpYy5jb20vYXNzZXRzL2I3MWM5MjhjMWZiMGZlNzYu\ -anMiIHR5cGU9Im1vZHVsZSI+PC9zY3JpcHQ+PHNjcmlwdCBzcmM9Imh0dHBzOi8vZmx1eGVyc3RhdGljLmNvbS9hc3NldHMvYjI1MDgxOWM4NDZhZGVmZS5q\ -cyIgdHlwZT0ibW9kdWxlIj48L3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9mbHV4ZXJzdGF0aWMuY29tL2Fzc2V0cy9hN2U1MjQ1ZTFjNDc4MmJkLmpz\ -IiB0eXBlPSJtb2R1bGUiPjwvc2NyaXB0PjxzY3JpcHQgc3JjPSJodHRwczovL2ZsdXhlcnN0YXRpYy5jb20vYXNzZXRzLzZiZWJjYTI2NjBlNDdmZmQuanMi\ -IHR5cGU9Im1vZHVsZSI+PC9zY3JpcHQ+PHNjcmlwdCBzcmM9Imh0dHBzOi8vZmx1eGVyc3RhdGljLmNvbS9hc3NldHMvNzk5Yjc3Y2Y0MjJkNjRiMS5qcyIg\ -dHlwZT0ibW9kdWxlIj48L3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9mbHV4ZXJzdGF0aWMuY29tL2Fzc2V0cy80MjZmMDA2NDY2ZTc2Mzc5LmpzIiB0\ -eXBlPSJtb2R1bGUiPjwvc2NyaXB0PjwvYm9keT48L2h0bWw+\ -"; -const CANARY_SW_JS: &str = "\ -InVzZSBzdHJpY3QiOwooKCkgPT4gewogIC8vIDxkZWZpbmU6X19GTFVYRVJfUFJFQ0FDSEVfTUFOSUZFU1RfXz4KICB2YXIgZGVmaW5lX0ZMVVhFUl9QUkVD\ -QUNIRV9NQU5JRkVTVF9kZWZhdWx0ID0gW3sgdXJsOiAiL2luZGV4Lmh0bWwiLCByZXZpc2lvbjogIjMxODY6MTc4MDYyMjQ5MTM2MSIgfSwgeyB1cmw6ICIv\ -IiwgcmV2aXNpb246ICIzMTg2OjE3ODA2MjI0OTEzNjEiIH0sIHsgdXJsOiAiL21hbmlmZXN0Lmpzb24iLCByZXZpc2lvbjogIjExNTA6MTc4MDYyMjQ5MTM1\ -NyIgfSwgeyB1cmw6ICIvYnJvd3NlcmNvbmZpZy54bWwiLCByZXZpc2lvbjogIjI0ODoxNzgwNjIyNDkxMjkzIiB9LCB7IHVybDogIi9yb2JvdHMudHh0Iiwg\ -cmV2aXNpb246ICIyMzoxNzgwNjIyNDkxNDc3IiB9LCB7IHVybDogIi92ZXJzaW9uLmpzb24iLCByZXZpc2lvbjogIjI4OjE3ODA2MjI0OTE1NjEiIH1dOwoK\ -ICAvLyBzcmMvZmVhdHVyZXMvYXBwL2NvbmZpZy9Qcm9kdWN0Q29uc3RhbnRzLnRzCiAgdmFyIFBST0RVQ1RfTkFNRSA9ICJGbHV4ZXIiOwoKICAvLyBzcmMv\ -ZmVhdHVyZXMvcGxhdGZvcm0vbm90aWZpY2F0aW9ucy9Ob3RpZmljYXRpb25BbGVydE9wdGlvbnMudHMKICB2YXIgTk9USUZJQ0FUSU9OX1ZJQlJBVElPTl9Q\ -QVRURVJOID0gWzIwMCwgMTAwLCAyMDBdOwogIGZ1bmN0aW9uIGlzSU9TTW9iaWxlT3JUYWJsZXRVc2VyQWdlbnQodXNlckFnZW50LCBtYXhUb3VjaFBvaW50\ -cyA9IDApIHsKICAgIHJldHVybiAvaVBob25lfGlQYWR8aVBvZC9pLnRlc3QodXNlckFnZW50KSB8fCAvTWFjaW50b3NoL2kudGVzdCh1c2VyQWdlbnQpICYm\ -IG1heFRvdWNoUG9pbnRzID4gMTsKICB9CiAgZnVuY3Rpb24gaXNNb2JpbGVPclRhYmxldFVzZXJBZ2VudCh1c2VyQWdlbnQsIG1heFRvdWNoUG9pbnRzID0g\ -MCkgewogICAgcmV0dXJuIC9BbmRyb2lkL2kudGVzdCh1c2VyQWdlbnQpIHx8IGlzSU9TTW9iaWxlT3JUYWJsZXRVc2VyQWdlbnQodXNlckFnZW50LCBtYXhU\ -b3VjaFBvaW50cyk7CiAgfQogIGZ1bmN0aW9uIGdldE5vdGlmaWNhdGlvbkFsZXJ0T3B0aW9ucyh7CiAgICBtb2JpbGVPclRhYmxldCwKICAgIHNpbGVudE9u\ -Tm9uTW9iaWxlCiAgfSkgewogICAgaWYgKG1vYmlsZU9yVGFibGV0KSB7CiAgICAgIHJldHVybiB7IHZpYnJhdGU6IFsuLi5OT1RJRklDQVRJT05fVklCUkFU\ -SU9OX1BBVFRFUk5dIH07CiAgICB9CiAgICBpZiAoc2lsZW50T25Ob25Nb2JpbGUpIHsKICAgICAgcmV0dXJuIHsgc2lsZW50OiB0cnVlIH07CiAgICB9CiAg\ -ICByZXR1cm4ge307CiAgfQoKICAvLyBzcmMvZmVhdHVyZXMvcGxhdGZvcm0vc2VydmljZV93b3JrZXIvV29ya2VyQ2FjaGVDbGVhbnVwLnRzCiAgdmFyIFdP\ -UktFUl9DQUNIRV9QUkVGSVggPSAiZmx1eGVyIjsKICB2YXIgTEVHQUNZX0VYUFJFU1NJT05fQVNTRVRfQ0FDSEVfUFJFRklYID0gYCR7V09SS0VSX0NBQ0hF\ -X1BSRUZJWH0tZXhwcmVzc2lvbi1hc3NldHNgOwogIGZ1bmN0aW9uIGlzTGVnYWN5RXhwcmVzc2lvbkFzc2V0Q2FjaGVOYW1lKGNhY2hlTmFtZSkgewogICAg\ -cmV0dXJuIGNhY2hlTmFtZSA9PT0gTEVHQUNZX0VYUFJFU1NJT05fQVNTRVRfQ0FDSEVfUFJFRklYIHx8IGNhY2hlTmFtZS5zdGFydHNXaXRoKGAke0xFR0FD\ -WV9FWFBSRVNTSU9OX0FTU0VUX0NBQ0hFX1BSRUZJWH0tYCk7CiAgfQogIGZ1bmN0aW9uIHNob3VsZERlbGV0ZVdvcmtlckNhY2hlKGNhY2hlTmFtZSwgZXhw\ -ZWN0ZWRDYWNoZXMpIHsKICAgIGlmIChpc0xlZ2FjeUV4cHJlc3Npb25Bc3NldENhY2hlTmFtZShjYWNoZU5hbWUpKSB7CiAgICAgIHJldHVybiB0cnVlOwog\ -ICAgfQogICAgaWYgKCFjYWNoZU5hbWUuc3RhcnRzV2l0aChgJHtXT1JLRVJfQ0FDSEVfUFJFRklYfS1gKSB8fCBleHBlY3RlZENhY2hlcy5oYXMoY2FjaGVO\ -YW1lKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoY2FjaGVOYW1lLnN0YXJ0c1dpdGgoYCR7V09SS0VSX0NBQ0hFX1BSRUZJWH0tYXNz\ -ZXRzLWApKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgLy8gc3JjL2ZlYXR1cmVzL3BsYXRmb3JtL3NlcnZp\ -Y2Vfd29ya2VyL1dvcmtlck5hdmlnYXRpb24udHMKICB2YXIgQVBQX05BVklHQVRJT05fRVhBQ1RfUEFUSFMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChb\ -CiAgICAiLyIsCiAgICAiL2xvZ2luIiwKICAgICIvcmVnaXN0ZXIiLAogICAgIi9mb3Jnb3QiLAogICAgIi9yZXNldCIsCiAgICAiL3ZlcmlmeSIsCiAgICAi\ -L2F1dGhvcml6ZS1pcCIsCiAgICAiL3dhc250bWUiLAogICAgIi9wZW5kaW5nIiwKICAgICIvb2F1dGgyL2F1dGhvcml6ZSIsCiAgICAiL2F1dGgvc3NvL2Nh\ -bGxiYWNrIiwKICAgICIvYm9va21hcmtzIiwKICAgICIvbWVudGlvbnMiLAogICAgIi9ub3RpZmljYXRpb25zIiwKICAgICIveW91IiwKICAgICIvcmVwb3J0\ -IiwKICAgICIvcHJlbWl1bS1jYWxsYmFjayIsCiAgICAiL2FnZS12ZXJpZmljYXRpb24tY2FsbGJhY2siLAogICAgIi9jb25uZWN0aW9uLWNhbGxiYWNrIiwK\ -ICAgICIvdGhlbWUtc3R1ZGlvIiwKICAgICIvX19ub3Rmb3VuZCIsCiAgICAiL2ludml0ZSIsCiAgICAiL2dpZnQiLAogICAgIi90aGVtZSIKICBdKTsKICB2\ -YXIgQVBQX05BVklHQVRJT05fUFJFRklYRVMgPSBbIi9jaGFubmVscy8iLCAiL3VzZXJzLyIsICIvaW52aXRlLyIsICIvZ2lmdC8iLCAiL3RoZW1lLyJdOwog\ -IGZ1bmN0aW9uIGlzQXBwTmF2aWdhdGlvblBhdGgocGF0aG5hbWUpIHsKICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRobmFtZSA9IHBhdGhuYW1lLmxlbmd0aCA+\ -IDEgPyBwYXRobmFtZS5yZXBsYWNlKC9cLyskLywgIiIpIDogcGF0aG5hbWU7CiAgICBpZiAoQVBQX05BVklHQVRJT05fRVhBQ1RfUEFUSFMuaGFzKG5vcm1h\ -bGl6ZWRQYXRobmFtZSkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gQVBQX05BVklHQVRJT05fUFJFRklYRVMuc29tZSgocHJlZml4\ -KSA9PiBub3JtYWxpemVkUGF0aG5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKTsKICB9CgogIC8vIHNyYy9mZWF0dXJlcy9wbGF0Zm9ybS9zZXJ2aWNlX3dvcmtl\ -ci9Xb3JrZXJGZXRjaFJvdXRpbmcudHMKICBmdW5jdGlvbiBpc05hdmlnYXRpb25SZXF1ZXN0KHJlcXVlc3QpIHsKICAgIGlmIChyZXF1ZXN0Lm1vZGUgPT09\ -ICJuYXZpZ2F0ZSIpIHJldHVybiB0cnVlOwogICAgY29uc3QgYWNjZXB0ID0gcmVxdWVzdC5oZWFkZXJzLmdldCgiYWNjZXB0IikgPz8gIiI7CiAgICByZXR1\ -cm4gcmVxdWVzdC5kZXN0aW5hdGlvbiA9PT0gImRvY3VtZW50IiB8fCBhY2NlcHQuaW5jbHVkZXMoInRleHQvaHRtbCIpOwogIH0KICBmdW5jdGlvbiBnZXRX\ -b3JrZXJGZXRjaFJvdXRlKHJlcXVlc3QsIHdvcmtlck9yaWdpbikgewogICAgaWYgKHJlcXVlc3QubWV0aG9kICE9PSAiR0VUIikgewogICAgICByZXR1cm4g\ -Imlnbm9yZSI7CiAgICB9CiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTsKICAgIGlmICh1cmwub3JpZ2luICE9PSB3b3JrZXJPcmlnaW4p\ -IHsKICAgICAgcmV0dXJuICJpZ25vcmUiOwogICAgfQogICAgaWYgKGlzTmF2aWdhdGlvblJlcXVlc3QocmVxdWVzdCkpIHsKICAgICAgcmV0dXJuIGlzQXBw\ -TmF2aWdhdGlvblBhdGgodXJsLnBhdGhuYW1lKSA/ICJuYXZpZ2F0aW9uIiA6ICJpZ25vcmUiOwogICAgfQogICAgaWYgKHVybC5wYXRobmFtZS5zdGFydHNX\ -aXRoKCIvYXNzZXRzLyIpKSB7CiAgICAgIHJldHVybiAic3RhdGljLWFzc2V0IjsKICAgIH0KICAgIGlmICh1cmwucGF0aG5hbWUgPT09ICIvbWFuaWZlc3Qu\ -anNvbiIgfHwgdXJsLnBhdGhuYW1lID09PSAiL3ZlcnNpb24uanNvbiIpIHsKICAgICAgcmV0dXJuICJtZXRhZGF0YSI7CiAgICB9CiAgICByZXR1cm4gImln\ -bm9yZSI7CiAgfQoKICAvLyBzcmMvZmVhdHVyZXMvcGxhdGZvcm0vc2VydmljZV93b3JrZXIvV29ya2VyUHVzaFBheWxvYWQudHMKICB2YXIgbm9ybWFsaXpl\ -UHVzaFBheWxvYWQgPSAocmF3KSA9PiB7CiAgICBjb25zdCBwYXlsb2FkID0gcmF3ID8/IHt9OwogICAgaWYgKHBheWxvYWQud2ViX3B1c2ggPT09IDgwMzAg\ -JiYgcGF5bG9hZC5ub3RpZmljYXRpb24gJiYgdHlwZW9mIHBheWxvYWQubm90aWZpY2F0aW9uID09PSAib2JqZWN0IikgewogICAgICBjb25zdCBpbm5lciA9\ -IHBheWxvYWQubm90aWZpY2F0aW9uOwogICAgICBjb25zdCBuYXZpZ2F0ZVVybCA9IGlubmVyLm5hdmlnYXRlOwogICAgICBjb25zdCBkYXRhID0geyAuLi5p\ -bm5lci5kYXRhID8/IHt9IH07CiAgICAgIGlmICh0eXBlb2YgbmF2aWdhdGVVcmwgPT09ICJzdHJpbmciICYmICFkYXRhLnVybCkgZGF0YS51cmwgPSBuYXZp\ -Z2F0ZVVybDsKICAgICAgcmV0dXJuIHsgLi4uaW5uZXIsIGRhdGEgfTsKICAgIH0KICAgIHJldHVybiBwYXlsb2FkOwogIH07CiAgdmFyIGdldEJhZGdlQ291\ -bnQgPSAocGF5bG9hZCkgPT4gewogICAgY29uc3QgYmFkZ2VWYWx1ZSA9IHBheWxvYWQuZGF0YT8uYmFkZ2VfY291bnQ7CiAgICBpZiAodHlwZW9mIGJhZGdl\ -VmFsdWUgPT09ICJudW1iZXIiICYmIE51bWJlci5pc0Zpbml0ZShiYWRnZVZhbHVlKSkgewogICAgICByZXR1cm4gYmFkZ2VWYWx1ZTsKICAgIH0KICAgIGlm\ -ICh0eXBlb2YgYmFkZ2VWYWx1ZSA9PT0gInN0cmluZyIgJiYgYmFkZ2VWYWx1ZS5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcihi\ -YWRnZVZhbHVlKTsKICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYXJzZWQpID8gcGFyc2VkIDogbnVsbDsKICAgIH0KICAgIHJldHVybiBudWxsOwog\ -IH07CiAgdmFyIHJlc29sdmVQdXNoTm90aWZpY2F0aW9uVGFnID0gKHBheWxvYWQpID0+IHsKICAgIGNvbnN0IGV4cGxpY2l0VGFnID0gcGF5bG9hZC50YWcg\ -Pz8gcGF5bG9hZC5kYXRhPy5ub3RpZmljYXRpb25fdGFnID8/IHBheWxvYWQuZGF0YT8udGFnOwogICAgaWYgKHR5cGVvZiBleHBsaWNpdFRhZyA9PT0gInN0\ -cmluZyIgJiYgZXhwbGljaXRUYWcubGVuZ3RoID4gMCkgewogICAgICByZXR1cm4gZXhwbGljaXRUYWc7CiAgICB9CiAgICBjb25zdCBjaGFubmVsSWQgPSBw\ -YXlsb2FkLmRhdGE/LmNoYW5uZWxfaWQ7CiAgICBpZiAodHlwZW9mIGNoYW5uZWxJZCA9PT0gInN0cmluZyIgJiYgY2hhbm5lbElkLmxlbmd0aCA+IDApIHsK\ -ICAgICAgcmV0dXJuIGBjaGFubmVsOiR7Y2hhbm5lbElkfWA7CiAgICB9CiAgICByZXR1cm4gdm9pZCAwOwogIH07CiAgdmFyIGdldFB1c2hOb3RpZmljYXRp\ -b25DbGllbnRTdGF0ZSA9IChjbGllbnRzKSA9PiAoewogICAgaGFzV2luZG93Q2xpZW50OiBjbGllbnRzLmxlbmd0aCA+IDAsCiAgICBoYXNWaXNpYmxlQ2xp\ -ZW50OiBjbGllbnRzLnNvbWUoKGNsaWVudCkgPT4gY2xpZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gInZpc2libGUiKQogIH0pOwogIHZhciBzaG91bGRTaWxl\ -bmNlTm9uTW9iaWxlUHVzaE5vdGlmaWNhdGlvbiA9IChjbGllbnRTdGF0ZSkgPT4gY2xpZW50U3RhdGUuaGFzV2luZG93Q2xpZW50OwogIHZhciBpc05vdGlm\ -aWNhdGlvbkNsZWFyUGF5bG9hZCA9IChwYXlsb2FkKSA9PiB7CiAgICBjb25zdCByZWNvcmQgPSBwYXlsb2FkOwogICAgY29uc3QgZGF0YSA9IHBheWxvYWQu\ -ZGF0YSA/PyB7fTsKICAgIHJldHVybiByZWNvcmQudHlwZSA9PT0gIm5vdGlmaWNhdGlvbl9jbGVhciIgfHwgcmVjb3JkLmFjdGlvbiA9PT0gImNsZWFyX2No\ -YW5uZWwiIHx8IGRhdGEudHlwZSA9PT0gIm5vdGlmaWNhdGlvbl9jbGVhciIgfHwgZGF0YS5hY3Rpb24gPT09ICJjbGVhcl9jaGFubmVsIiB8fCBwYXlsb2Fk\ -Lm5vdGlmaWNhdGlvbj8uZGF0YT8udHlwZSA9PT0gIm5vdGlmaWNhdGlvbl9jbGVhciIgfHwgcGF5bG9hZC5ub3RpZmljYXRpb24/LmRhdGE/LmFjdGlvbiA9\ -PT0gImNsZWFyX2NoYW5uZWwiOwogIH07CgogIC8vIHNyYy9mZWF0dXJlcy9wbGF0Zm9ybS9zZXJ2aWNlX3dvcmtlci9Xb3JrZXIudHMKICB2YXIgd29ya2Vy\ -TmF2aWdhdG9yID0gc2VsZi5uYXZpZ2F0b3I7CiAgdmFyIGVuc3VyZVNlcnZpY2VXb3JrZXJSZWFkeSA9IFByb21pc2UucmVzb2x2ZSgpOwogIHZhciBTRVJW\ -SUNFX1dPUktFUl9WRVJTSU9OID0gdHJ1ZSA/ICIxNzgwNjIyNDkyMjcxIiA6ICJkZXYiOwogIHZhciBQUkVDQUNIRV9NQU5JRkVTVCA9IHR5cGVvZiBkZWZp\ -bmVfRkxVWEVSX1BSRUNBQ0hFX01BTklGRVNUX2RlZmF1bHQgPT09ICJ1bmRlZmluZWQiID8gW10gOiBkZWZpbmVfRkxVWEVSX1BSRUNBQ0hFX01BTklGRVNU\ -X2RlZmF1bHQ7CiAgdmFyIFBSRUNBQ0hFX0NBQ0hFID0gYCR7V09SS0VSX0NBQ0hFX1BSRUZJWH0tcHJlY2FjaGUtJHtTRVJWSUNFX1dPUktFUl9WRVJTSU9O\ -fWA7CiAgdmFyIEFTU0VUX0NBQ0hFID0gYCR7V09SS0VSX0NBQ0hFX1BSRUZJWH0tYXNzZXRzLSR7U0VSVklDRV9XT1JLRVJfVkVSU0lPTn1gOwogIHZhciBO\ -QVZJR0FUSU9OX0NBQ0hFID0gYCR7V09SS0VSX0NBQ0hFX1BSRUZJWH0tbmF2aWdhdGlvbi0ke1NFUlZJQ0VfV09SS0VSX1ZFUlNJT059YDsKICB2YXIgRVhQ\ -RUNURURfQ0FDSEVTID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW1BSRUNBQ0hFX0NBQ0hFLCBBU1NFVF9DQUNIRSwgTkFWSUdBVElPTl9DQUNIRV0pOwog\ -IHZhciBOQVZJR0FUSU9OX05FVFdPUktfVElNRU9VVF9NUyA9IDY1MDsKICB2YXIgc2VydmljZVdvcmtlckNhY2hlcyA9IHNlbGYuY2FjaGVzOwogIHZhciBp\ -c05hdGl2ZURlc2t0b3BVc2VyQWdlbnQgPSAodXNlckFnZW50KSA9PiAvXGJFbGVjdHJvblwvXGQrKD86XC5cZCspKi8udGVzdCh1c2VyQWdlbnQpOwogIHRy\ -eSB7CiAgICBkZWxldGUgc2VsZi5jYWNoZXM7CiAgfSBjYXRjaCB7CiAgfQogIHZhciBsb2cgPSBhc3luYyAobGV2ZWwsIG1lc3NhZ2UsIGRhdGEpID0+IHsK\ -ICAgIHRyeSB7CiAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICBjb25zdCBmbiA9IGxldmVsID09PSAiZXJyb3Ii\ -ID8gY29uc29sZS5lcnJvciA6IGxldmVsID09PSAid2FybiIgPyBjb25zb2xlLndhcm4gOiBsZXZlbCA9PT0gImluZm8iID8gY29uc29sZS5pbmZvIDogY29u\ -c29sZS5kZWJ1ZzsKICAgICAgICBpZiAoZGF0YSAhPT0gdm9pZCAwKSBmbj8uY2FsbChjb25zb2xlLCAiW1NXXSIsIG1lc3NhZ2UsIGRhdGEpOwogICAgICAg\ -IGVsc2UgZm4/LmNhbGwoY29uc29sZSwgIltTV10iLCBtZXNzYWdlKTsKICAgICAgfQogICAgfSBjYXRjaCB7CiAgICB9CiAgfTsKICB2YXIgaXNDYWNoZWFi\ -bGVSZXNwb25zZSA9IChyZXNwb25zZSkgPT4gewogICAgcmV0dXJuIHJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlLnR5cGUgPT09ICJvcGFxdWUiOwogIH07CiAg\ -dmFyIHBydW5lQ2FjaGVFbnRyaWVzID0gYXN5bmMgKGNhY2hlLCBtYXhFbnRyaWVzKSA9PiB7CiAgICBjb25zdCBrZXlzID0gYXdhaXQgY2FjaGUua2V5cygp\ -OwogICAgY29uc3Qgb3ZlcmZsb3cgPSBrZXlzLmxlbmd0aCAtIG1heEVudHJpZXM7CiAgICBpZiAob3ZlcmZsb3cgPD0gMCkgewogICAgICByZXR1cm47CiAg\ -ICB9CiAgICBhd2FpdCBQcm9taXNlLmFsbChrZXlzLnNsaWNlKDAsIG92ZXJmbG93KS5tYXAoKHJlcXVlc3QpID0+IGNhY2hlLmRlbGV0ZShyZXF1ZXN0KSkp\ -OwogIH07CiAgdmFyIGNhY2hlUmVxdWVzdCA9IGFzeW5jIChjYWNoZU5hbWUsIHJlcXVlc3QsIHJlc3BvbnNlLCBtYXhFbnRyaWVzKSA9PiB7CiAgICBpZiAo\ -IWlzQ2FjaGVhYmxlUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRyeSB7CiAgICAgIGlmICghc2VydmljZVdvcmtlckNh\ -Y2hlcykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBjYWNoZSA9IGF3YWl0IHNlcnZpY2VXb3JrZXJDYWNoZXMub3BlbihjYWNoZU5h\ -bWUpOwogICAgICBhd2FpdCBjYWNoZS5wdXQocmVxdWVzdCwgcmVzcG9uc2UuY2xvbmUoKSk7CiAgICAgIGlmIChtYXhFbnRyaWVzICE9IG51bGwpIHsKICAg\ -ICAgICBhd2FpdCBwcnVuZUNhY2hlRW50cmllcyhjYWNoZSwgbWF4RW50cmllcyk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGF3YWl0\ -IGxvZygid2FybiIsICJjYWNoZSBwdXQgZmFpbGVkIiwgeyBjYWNoZU5hbWUsIGVycm9yOiBkZXNjcmliZUVycm9yKGVycm9yKSB9KTsKICAgIH0KICB9Owog\ -IHZhciBwcmVjYWNoZUFwcFNoZWxsID0gYXN5bmMgKCkgPT4gewogICAgaWYgKCFzZXJ2aWNlV29ya2VyQ2FjaGVzKSB7CiAgICAgIHJldHVybjsKICAgIH0K\ -ICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgc2VydmljZVdvcmtlckNhY2hlcy5vcGVuKFBSRUNBQ0hFX0NBQ0hFKTsKICAgIGF3YWl0IFByb21pc2UuYWxsU2V0\ -dGxlZCgKICAgICAgUFJFQ0FDSEVfTUFOSUZFU1QubWFwKGFzeW5jIChlbnRyeSkgPT4gewogICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChu\ -ZXcgVVJMKGVudHJ5LnVybCwgc2VsZi5sb2NhdGlvbi5vcmlnaW4pLnRvU3RyaW5nKCksIHsgY2FjaGU6ICJyZWxvYWQiIH0pOwogICAgICAgIGNvbnN0IHJl\ -c3BvbnNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7CiAgICAgICAgaWYgKGlzQ2FjaGVhYmxlUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgICBhd2Fp\ -dCBjYWNoZS5wdXQoZW50cnkudXJsLCByZXNwb25zZSk7CiAgICAgICAgfQogICAgICB9KQogICAgKTsKICB9OwogIHZhciBjbGVhbnVwT2xkQ2FjaGVzID0g\ -YXN5bmMgKCkgPT4gewogICAgaWYgKCFzZXJ2aWNlV29ya2VyQ2FjaGVzKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG5hbWVzID0gYXdhaXQg\ -c2VydmljZVdvcmtlckNhY2hlcy5rZXlzKCk7CiAgICBhd2FpdCBQcm9taXNlLmFsbCgKICAgICAgbmFtZXMubWFwKChuYW1lKSA9PiB7CiAgICAgICAgaWYg\ -KCFzaG91bGREZWxldGVXb3JrZXJDYWNoZShuYW1lLCBFWFBFQ1RFRF9DQUNIRVMpKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAg\ -ICAgICByZXR1cm4gc2VydmljZVdvcmtlckNhY2hlcy5kZWxldGUobmFtZSk7CiAgICAgIH0pCiAgICApOwogIH07CiAgdmFyIGdldENhY2hlZEFwcFNoZWxs\ -ID0gYXN5bmMgKCkgPT4gewogICAgaWYgKCFzZXJ2aWNlV29ya2VyQ2FjaGVzKSB7CiAgICAgIHJldHVybiB2b2lkIDA7CiAgICB9CiAgICByZXR1cm4gYXdh\ -aXQgc2VydmljZVdvcmtlckNhY2hlcy5tYXRjaCgiL2luZGV4Lmh0bWwiKSA/PyBhd2FpdCBzZXJ2aWNlV29ya2VyQ2FjaGVzLm1hdGNoKCIvIikgPz8gYXdh\ -aXQgc2VydmljZVdvcmtlckNhY2hlcy5tYXRjaChuZXcgUmVxdWVzdCgiL2luZGV4Lmh0bWwiLCB7IGNhY2hlOiAicmVsb2FkIiB9KSkgPz8gdm9pZCAwOwog\ -IH07CiAgdmFyIGZldGNoTmF2aWdhdGlvbiA9IGFzeW5jIChyZXF1ZXN0KSA9PiB7CiAgICBjb25zdCB0aW1lb3V0ID0gbmV3IFByb21pc2UoKHJlc29sdmUp\ -ID0+IHsKICAgICAgc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKHZvaWQgMCksIE5BVklHQVRJT05fTkVUV09SS19USU1FT1VUX01TKTsKICAgIH0pOwogICAg\ -Y29uc3QgbmV0d29yayA9IGZldGNoKHJlcXVlc3QpLnRoZW4oYXN5bmMgKHJlc3BvbnNlKSA9PiB7CiAgICAgIGF3YWl0IGNhY2hlUmVxdWVzdChOQVZJR0FU\ -SU9OX0NBQ0hFLCAiL2luZGV4Lmh0bWwiLCByZXNwb25zZSk7CiAgICAgIHJldHVybiByZXNwb25zZTsKICAgIH0pOwogICAgbGV0IG5ldHdvcmtSZXNwb25z\ -ZTsKICAgIHRyeSB7CiAgICAgIG5ldHdvcmtSZXNwb25zZSA9IGF3YWl0IFByb21pc2UucmFjZShbbmV0d29yaywgdGltZW91dF0pOwogICAgICBpZiAobmV0\ -d29ya1Jlc3BvbnNlICYmIGlzQ2FjaGVhYmxlUmVzcG9uc2UobmV0d29ya1Jlc3BvbnNlKSkgewogICAgICAgIHJldHVybiBuZXR3b3JrUmVzcG9uc2U7CiAg\ -ICAgIH0KICAgIH0gY2F0Y2ggewogICAgfQogICAgY29uc3QgY2FjaGVkID0gYXdhaXQgZ2V0Q2FjaGVkQXBwU2hlbGwoKTsKICAgIGlmIChjYWNoZWQpIHsK\ -ICAgICAgbmV0d29yay5jYXRjaCgoKSA9PiB2b2lkIDApOwogICAgICByZXR1cm4gY2FjaGVkOwogICAgfQogICAgaWYgKG5ldHdvcmtSZXNwb25zZSkgewog\ -ICAgICByZXR1cm4gbmV0d29ya1Jlc3BvbnNlOwogICAgfQogICAgcmV0dXJuIG5ldHdvcms7CiAgfTsKICB2YXIgZmV0Y2hDYWNoZUZpcnN0ID0gYXN5bmMg\ -KHJlcXVlc3QpID0+IHsKICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IHNlcnZpY2VXb3JrZXJDYWNoZXM/Lm1hdGNoKHJlcXVlc3QpOwogICAgaWYgKGNhY2hl\ -ZCkgewogICAgICByZXR1cm4gY2FjaGVkOwogICAgfQogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTsKICAgIGF3YWl0IGNhY2hl\ -UmVxdWVzdChBU1NFVF9DQUNIRSwgcmVxdWVzdCwgcmVzcG9uc2UpOwogICAgcmV0dXJuIHJlc3BvbnNlOwogIH07CiAgdmFyIGZldGNoTmV0d29ya0ZpcnN0\ -ID0gYXN5bmMgKHJlcXVlc3QpID0+IHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7CiAgICAgIGF3YWl0\ -IGNhY2hlUmVxdWVzdChQUkVDQUNIRV9DQUNIRSwgcmVxdWVzdCwgcmVzcG9uc2UpOwogICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICB9IGNhdGNoIChlcnJv\ -cikgewogICAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCBzZXJ2aWNlV29ya2VyQ2FjaGVzPy5tYXRjaChyZXF1ZXN0KTsKICAgICAgaWYgKGNhY2hlZCkgewog\ -ICAgICAgIHJldHVybiBjYWNoZWQ7CiAgICAgIH0KICAgICAgdGhyb3cgZXJyb3I7CiAgICB9CiAgfTsKICBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoImluc3Rh\ -bGwiLCAoZXZlbnQpID0+IHsKICAgIGV2ZW50LndhaXRVbnRpbCgKICAgICAgKGFzeW5jICgpID0+IHsKICAgICAgICBhd2FpdCBlbnN1cmVTZXJ2aWNlV29y\ -a2VyUmVhZHk7CiAgICAgICAgYXdhaXQgcHJlY2FjaGVBcHBTaGVsbCgpOwogICAgICAgIGF3YWl0IGxvZygiaW5mbyIsICJpbnN0YWxsIik7CiAgICAgICAg\ -c2VsZi5za2lwV2FpdGluZygpOwogICAgICB9KSgpCiAgICApOwogIH0pOwogIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcigiYWN0aXZhdGUiLCAoZXZlbnQpID0+\ -IHsKICAgIGV2ZW50LndhaXRVbnRpbCgKICAgICAgKGFzeW5jICgpID0+IHsKICAgICAgICBhd2FpdCBlbnN1cmVTZXJ2aWNlV29ya2VyUmVhZHk7CiAgICAg\ -ICAgYXdhaXQgbG9nKCJpbmZvIiwgImFjdGl2YXRlIik7CiAgICAgICAgYXdhaXQgY2xlYW51cE9sZENhY2hlcygpOwogICAgICAgIGF3YWl0IHNlbGYuY2xp\ -ZW50cy5jbGFpbSgpOwogICAgICAgIGF3YWl0IGxvZygiZGVidWciLCAiY2xpZW50cyBjbGFpbWVkIik7CiAgICAgIH0pKCkKICAgICk7CiAgfSk7CiAgc2Vs\ -Zi5hZGRFdmVudExpc3RlbmVyKCJmZXRjaCIsIChldmVudCkgPT4gewogICAgY29uc3QgcmVxdWVzdCA9IGV2ZW50LnJlcXVlc3Q7CiAgICBjb25zdCByb3V0\ -ZSA9IGdldFdvcmtlckZldGNoUm91dGUocmVxdWVzdCwgc2VsZi5sb2NhdGlvbi5vcmlnaW4pOwogICAgaWYgKHJvdXRlID09PSAibmF2aWdhdGlvbiIpIHsK\ -ICAgICAgZXZlbnQucmVzcG9uZFdpdGgoZmV0Y2hOYXZpZ2F0aW9uKHJlcXVlc3QpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHJvdXRlID09PSAi\ -c3RhdGljLWFzc2V0IikgewogICAgICBldmVudC5yZXNwb25kV2l0aChmZXRjaENhY2hlRmlyc3QocmVxdWVzdCkpOwogICAgICByZXR1cm47CiAgICB9CiAg\ -ICBpZiAocm91dGUgPT09ICJtZXRhZGF0YSIpIHsKICAgICAgZXZlbnQucmVzcG9uZFdpdGgoZmV0Y2hOZXR3b3JrRmlyc3QocmVxdWVzdCkpOwogICAgfQog\ -IH0pOwogIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIChldmVudCkgPT4gewogICAgY29uc3QgZGF0YSA9IGV2ZW50LmRhdGE7CiAgICBjb25z\ -dCB0eXBlID0gZGF0YT8udHlwZTsKICAgIGlmICh0eXBlID09PSAiU0tJUF9XQUlUSU5HIikgewogICAgICBldmVudC53YWl0VW50aWwobG9nKCJpbmZvIiwg\ -Im1lc3NhZ2U6IFNLSVBfV0FJVElORyIpKTsKICAgICAgc2VsZi5za2lwV2FpdGluZygpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodHlwZSA9PT0g\ -IkFQUF9VUERBVEVfQkFER0UiKSB7CiAgICAgIGNvbnN0IHJhd0NvdW50ID0gZGF0YT8uY291bnQ7CiAgICAgIGxldCBiYWRnZUNvdW50ID0gbnVsbDsKICAg\ -ICAgaWYgKHR5cGVvZiByYXdDb3VudCA9PT0gIm51bWJlciIgJiYgTnVtYmVyLmlzRmluaXRlKHJhd0NvdW50KSkgewogICAgICAgIGJhZGdlQ291bnQgPSBy\ -YXdDb3VudDsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmF3Q291bnQgPT09ICJzdHJpbmciICYmIHJhd0NvdW50Lmxlbmd0aCA+IDApIHsKICAgICAgICBj\ -b25zdCBwYXJzZWQgPSBOdW1iZXIocmF3Q291bnQpOwogICAgICAgIGJhZGdlQ291bnQgPSBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSA/IHBhcnNlZCA6IG51\ -bGw7CiAgICAgIH0KICAgICAgZXZlbnQud2FpdFVudGlsKHVwZGF0ZUFwcEJhZGdlKGJhZGdlQ291bnQpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZXZl\ -bnQud2FpdFVudGlsKGxvZygiZGVidWciLCAibWVzc2FnZTogdW5rbm93biIsIHsgdHlwZSB9KSk7CiAgfSk7CiAgdmFyIHVwZGF0ZUFwcEJhZGdlID0gYXN5\ -bmMgKGNvdW50KSA9PiB7CiAgICBpZiAodHlwZW9mIG5hdmlnYXRvci5zZXRBcHBCYWRnZSAhPT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgbmF2aWdhdG9yLmNs\ -ZWFyQXBwQmFkZ2UgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdHJ5IHsKICAgICAgaWYgKGNvdW50ICE9PSBudWxsICYmIGNv\ -dW50ID4gMCkgewogICAgICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yLnNldEFwcEJhZGdlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICBhd2FpdCBuYXZp\ -Z2F0b3Iuc2V0QXBwQmFkZ2UoY291bnQpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmF2aWdhdG9yLmNsZWFyQXBwQmFkZ2UgPT09ICJm\ -dW5jdGlvbiIpIHsKICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xlYXJBcHBCYWRnZSgpOwogICAgICB9CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBh\ -d2FpdCBsb2coImVycm9yIiwgIkZhaWxlZCB0byB1cGRhdGUgYXBwIGJhZGdlIiwgeyBlcnJvcjogZGVzY3JpYmVFcnJvcihlcnJvcikgfSk7CiAgICB9CiAg\ -fTsKICB2YXIgY2xvc2VQdXNoTm90aWZpY2F0aW9ucyA9IGFzeW5jICh0YWcpID0+IHsKICAgIGlmICghdGFnIHx8IHR5cGVvZiBzZWxmLnJlZ2lzdHJhdGlv\ -bi5nZXROb3RpZmljYXRpb25zICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgdHJ5IHsKICAgICAgY29uc3Qgbm90aWZpY2F0\ -aW9ucyA9IGF3YWl0IHNlbGYucmVnaXN0cmF0aW9uLmdldE5vdGlmaWNhdGlvbnMoeyB0YWcgfSk7CiAgICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uIG9m\ -IG5vdGlmaWNhdGlvbnMpIHsKICAgICAgICBub3RpZmljYXRpb24uY2xvc2UoKTsKICAgICAgfQogICAgICByZXR1cm4gbm90aWZpY2F0aW9ucy5sZW5ndGg7\ -CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBhd2FpdCBsb2coImVycm9yIiwgInB1c2g6IGZhaWxlZCB0byBjbG9zZSBub3RpZmljYXRpb25zIiwgeyB0\ -YWcsIGVycm9yOiBkZXNjcmliZUVycm9yKGVycm9yKSB9KTsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgfTsKICB2YXIgcmVzb2x2ZVRhcmdldFVybCA9ICh1\ -cmwpID0+IHsKICAgIGlmICghdXJsKSByZXR1cm4gbnVsbDsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHJlc29sdmVkID0gbmV3IFVSTCh1cmwsIHNlbGYubG9j\ -YXRpb24ub3JpZ2luKTsKICAgICAgaWYgKHJlc29sdmVkLnByb3RvY29sICE9PSAiaHR0cDoiICYmIHJlc29sdmVkLnByb3RvY29sICE9PSAiaHR0cHM6Iikg\ -cmV0dXJuIG51bGw7CiAgICAgIHJldHVybiByZXNvbHZlZC50b1N0cmluZygpOwogICAgfSBjYXRjaCB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH07\ -CiAgdmFyIHBvc3RNZXNzYWdlVG9DbGllbnRzID0gYXN5bmMgKG1lc3NhZ2UpID0+IHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGNsaWVudExpc3QgPSBhd2Fp\ -dCBzZWxmLmNsaWVudHMubWF0Y2hBbGwoewogICAgICAgIHR5cGU6ICJ3aW5kb3ciLAogICAgICAgIGluY2x1ZGVVbmNvbnRyb2xsZWQ6IHRydWUKICAgICAg\ -fSk7CiAgICAgIGZvciAoY29uc3QgY2xpZW50IG9mIGNsaWVudExpc3QpIHsKICAgICAgICBjbGllbnQucG9zdE1lc3NhZ2UobWVzc2FnZSk7CiAgICAgIH0K\ -ICAgICAgcmV0dXJuIGNsaWVudExpc3Q7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBhd2FpdCBsb2coImVycm9yIiwgIlVuYWJsZSB0byBicm9hZGNh\ -c3QgdG8gY2xpZW50cyIsIHsgZXJyb3I6IGRlc2NyaWJlRXJyb3IoZXJyb3IpIH0pOwogICAgICByZXR1cm4gW107CiAgICB9CiAgfTsKICB2YXIgZm9jdXNP\ -ck9wZW5DbGllbnQgPSBhc3luYyAodGFyZ2V0VXJsLCB0YXJnZXRVc2VySWQpID0+IHsKICAgIGNvbnN0IG1lc3NhZ2UgPSB7CiAgICAgIHR5cGU6ICJOT1RJ\ -RklDQVRJT05fQ0xJQ0tfTkFWSUdBVEUiLAogICAgICB1cmw6IHRhcmdldFVybAogICAgfTsKICAgIGlmICh0YXJnZXRVc2VySWQpIHsKICAgICAgbWVzc2Fn\ -ZS50YXJnZXRVc2VySWQgPSB0YXJnZXRVc2VySWQ7CiAgICB9CiAgICBjb25zdCBjbGllbnRMaXN0ID0gYXdhaXQgcG9zdE1lc3NhZ2VUb0NsaWVudHMobWVz\ -c2FnZSk7CiAgICBjb25zdCBleGFjdCA9IGNsaWVudExpc3QuZmluZCgoYykgPT4gYy51cmwgPT09IHRhcmdldFVybCk7CiAgICBpZiAoZXhhY3QpIHsKICAg\ -ICAgYXdhaXQgbG9nKCJkZWJ1ZyIsICJmb2N1cyBleGFjdCBjbGllbnQiLCB7IHVybDogdGFyZ2V0VXJsIH0pOwogICAgICBhd2FpdCBleGFjdC5mb2N1cygp\ -OwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzYW1lT3JpZ2luID0gY2xpZW50TGlzdC5maW5kKChjKSA9PiB7CiAgICAgIHRyeSB7CiAgICAgICAg\ -cmV0dXJuIG5ldyBVUkwoYy51cmwpLm9yaWdpbiA9PT0gc2VsZi5sb2NhdGlvbi5vcmlnaW47CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHJldHVybiBmYWxz\ -ZTsKICAgICAgfQogICAgfSk7CiAgICBpZiAoc2FtZU9yaWdpbikgewogICAgICBhd2FpdCBsb2coImRlYnVnIiwgImZvY3VzIHNhbWUtb3JpZ2luIGNsaWVu\ -dCIsIHsgdXJsOiBzYW1lT3JpZ2luLnVybCB9KTsKICAgICAgYXdhaXQgc2FtZU9yaWdpbi5mb2N1cygpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAo\ -c2VsZi5jbGllbnRzLm9wZW5XaW5kb3cpIHsKICAgICAgYXdhaXQgbG9nKCJkZWJ1ZyIsICJvcGVuV2luZG93IiwgeyB1cmw6IHRhcmdldFVybCB9KTsKICAg\ -ICAgYXdhaXQgc2VsZi5jbGllbnRzLm9wZW5XaW5kb3codGFyZ2V0VXJsKTsKICAgIH0KICB9OwogIGZ1bmN0aW9uIGRlc2NyaWJlRXJyb3IoZXJyb3IpIHsK\ -ICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7CiAgICAgIHJldHVybiB7IG5hbWU6IGVycm9yLm5hbWUsIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2Us\ -IHN0YWNrOiBlcnJvci5zdGFjayB9OwogICAgfQogICAgcmV0dXJuIHsgdmFsdWU6IFN0cmluZyhlcnJvcikgfTsKICB9CiAgc2VsZi5hZGRFdmVudExpc3Rl\ -bmVyKCJwdXNoIiwgKGV2ZW50KSA9PiB7CiAgICBldmVudC53YWl0VW50aWwoCiAgICAgIChhc3luYyAoKSA9PiB7CiAgICAgICAgYXdhaXQgZW5zdXJlU2Vy\ -dmljZVdvcmtlclJlYWR5OwogICAgICAgIGxldCByYXc7CiAgICAgICAgbGV0IHJhd1RleHQgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICByYXdU\ -ZXh0ID0gZXZlbnQuZGF0YT8udGV4dCgpID8/IG51bGw7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICByYXdUZXh0ID0gbnVsbDsKICAgICAgICB9CiAg\ -ICAgICAgdHJ5IHsKICAgICAgICAgIHJhdyA9IGV2ZW50LmRhdGE/Lmpzb24/LigpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICBhd2Fp\ -dCBsb2coImVycm9yIiwgInB1c2g6IEpTT04gcGFyc2UgZmFpbGVkIiwgewogICAgICAgICAgICBlcnJvcjogZGVzY3JpYmVFcnJvcihlcnJvciksCiAgICAg\ -ICAgICAgIHJhd1ByZXZpZXc6IHJhd1RleHQ/LnNsaWNlKDAsIDUxMikgPz8gbnVsbAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBh\ -eWxvYWQgPSBub3JtYWxpemVQdXNoUGF5bG9hZChyYXcgPz8geyB0aXRsZTogUFJPRFVDVF9OQU1FIH0pOwogICAgICAgIGNvbnN0IHRpdGxlID0gcGF5bG9h\ -ZC50aXRsZSA/PyBQUk9EVUNUX05BTUU7CiAgICAgICAgY29uc3QgdGFnID0gcmVzb2x2ZVB1c2hOb3RpZmljYXRpb25UYWcocGF5bG9hZCk7CiAgICAgICAg\ -Y29uc3QgYmFkZ2VDb3VudCA9IGdldEJhZGdlQ291bnQocGF5bG9hZCk7CiAgICAgICAgaWYgKGlzTm90aWZpY2F0aW9uQ2xlYXJQYXlsb2FkKHBheWxvYWQp\ -KSB7CiAgICAgICAgICBjb25zdCBjbG9zZWRDb3VudCA9IGF3YWl0IGNsb3NlUHVzaE5vdGlmaWNhdGlvbnModGFnKTsKICAgICAgICAgIGF3YWl0IHVwZGF0\ -ZUFwcEJhZGdlKGJhZGdlQ291bnQpOwogICAgICAgICAgYXdhaXQgbG9nKCJpbmZvIiwgInB1c2ggY2xlYXIgcmVjZWl2ZWQiLCB7IHRhZywgY2xvc2VkQ291\ -bnQsIGJhZGdlQ291bnQgfSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChpc05hdGl2ZURlc2t0b3BVc2VyQWdlbnQod29ya2Vy\ -TmF2aWdhdG9yLnVzZXJBZ2VudCkpIHsKICAgICAgICAgIGF3YWl0IHVwZGF0ZUFwcEJhZGdlKGJhZGdlQ291bnQpOwogICAgICAgICAgYXdhaXQgbG9nKCJ3\ -YXJuIiwgInB1c2ggaWdub3JlZCBpbiBuYXRpdmUgZGVza3RvcCBzZXJ2aWNlIHdvcmtlciIsIHsgYmFkZ2VDb3VudCB9KTsKICAgICAgICAgIHJldHVybjsK\ -ICAgICAgICB9CiAgICAgICAgY29uc3QgYm9keSA9IHBheWxvYWQuYm9keSA/PyAiIjsKICAgICAgICBsZXQgY2xpZW50U3RhdGUgPSBnZXRQdXNoTm90aWZp\ -Y2F0aW9uQ2xpZW50U3RhdGUoW10pOwogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCBjbGllbnRMaXN0ID0gYXdhaXQgc2VsZi5jbGllbnRzLm1hdGNo\ -QWxsKHsKICAgICAgICAgICAgdHlwZTogIndpbmRvdyIsCiAgICAgICAgICAgIGluY2x1ZGVVbmNvbnRyb2xsZWQ6IHRydWUKICAgICAgICAgIH0pOwogICAg\ -ICAgICAgY2xpZW50U3RhdGUgPSBnZXRQdXNoTm90aWZpY2F0aW9uQ2xpZW50U3RhdGUoY2xpZW50TGlzdCk7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAg\ -fQogICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7CiAgICAgICAgICBib2R5LAogICAgICAgICAgaWNvbjogcGF5bG9hZC5pY29uID8/IHZvaWQgMCwKICAgICAg\ -ICAgIGJhZGdlOiBwYXlsb2FkLmJhZGdlID8/IHZvaWQgMCwKICAgICAgICAgIGRhdGE6IHBheWxvYWQuZGF0YSA/PyB2b2lkIDAsCiAgICAgICAgICB0YWcs\ -CiAgICAgICAgICByZW5vdGlmeTogdGFnICE9PSB2b2lkIDAsCiAgICAgICAgICAuLi5nZXROb3RpZmljYXRpb25BbGVydE9wdGlvbnMoewogICAgICAgICAg\ -ICBtb2JpbGVPclRhYmxldDogaXNNb2JpbGVPclRhYmxldFVzZXJBZ2VudCh3b3JrZXJOYXZpZ2F0b3IudXNlckFnZW50LCB3b3JrZXJOYXZpZ2F0b3IubWF4\ -VG91Y2hQb2ludHMgPz8gMCksCiAgICAgICAgICAgIHNpbGVudE9uTm9uTW9iaWxlOiBzaG91bGRTaWxlbmNlTm9uTW9iaWxlUHVzaE5vdGlmaWNhdGlvbihj\ -bGllbnRTdGF0ZSkKICAgICAgICAgIH0pCiAgICAgICAgfTsKICAgICAgICBhd2FpdCBsb2coImluZm8iLCAicHVzaCByZWNlaXZlZCIsIHsKICAgICAgICAg\ -IHRpdGxlLAogICAgICAgICAgaGFzQm9keTogQm9vbGVhbihwYXlsb2FkLmJvZHkpLAogICAgICAgICAgdGFnLAogICAgICAgICAgaGFzRGF0YTogcGF5bG9h\ -ZC5kYXRhICE9PSB2b2lkIDAsCiAgICAgICAgICBiYWRnZUNvdW50LAogICAgICAgICAgaGFzV2luZG93Q2xpZW50OiBjbGllbnRTdGF0ZS5oYXNXaW5kb3dD\ -bGllbnQsCiAgICAgICAgICBoYXNWaXNpYmxlQ2xpZW50OiBjbGllbnRTdGF0ZS5oYXNWaXNpYmxlQ2xpZW50LAogICAgICAgICAgd2ViUHVzaDogcGF5bG9h\ -ZC53ZWJfcHVzaCA/PyBudWxsCiAgICAgICAgfSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtzZWxmLnJlZ2lzdHJhdGlv\ -bi5zaG93Tm90aWZpY2F0aW9uKHRpdGxlLCBvcHRpb25zKSwgdXBkYXRlQXBwQmFkZ2UoYmFkZ2VDb3VudCldKTsKICAgICAgICB9IGNhdGNoIChlcnJvcikg\ -ewogICAgICAgICAgYXdhaXQgbG9nKCJlcnJvciIsICJwdXNoOiBzaG93Tm90aWZpY2F0aW9uIGZhaWxlZCwgc2hvd2luZyBmYWxsYmFjayIsIHsgZXJyb3I6\ -IGRlc2NyaWJlRXJyb3IoZXJyb3IpIH0pOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgYXdhaXQgc2VsZi5yZWdpc3RyYXRpb24uc2hvd05vdGlmaWNh\ -dGlvbihQUk9EVUNUX05BTUUsIHsgYm9keTogIiIgfSk7CiAgICAgICAgICB9IGNhdGNoIChmYWxsYmFja0Vycm9yKSB7CiAgICAgICAgICAgIGF3YWl0IGxv\ -ZygiZXJyb3IiLCAicHVzaDogZmFsbGJhY2sgc2hvd05vdGlmaWNhdGlvbiBhbHNvIGZhaWxlZCIsIHsKICAgICAgICAgICAgICBlcnJvcjogZGVzY3JpYmVF\ -cnJvcihmYWxsYmFja0Vycm9yKQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pKCkKICAgICk7CiAgfSk7CiAgc2VsZi5h\ -ZGRFdmVudExpc3RlbmVyKCJub3RpZmljYXRpb25jbGljayIsIChldmVudCkgPT4gewogICAgZXZlbnQubm90aWZpY2F0aW9uLmNsb3NlKCk7CiAgICBjb25z\ -dCB0YXJnZXRVcmwgPSByZXNvbHZlVGFyZ2V0VXJsKGV2ZW50Lm5vdGlmaWNhdGlvbi5kYXRhPy51cmwpOwogICAgY29uc3QgdGFyZ2V0VXNlcklkID0gZXZl\ -bnQubm90aWZpY2F0aW9uLmRhdGE/LnRhcmdldF91c2VyX2lkOwogICAgZXZlbnQud2FpdFVudGlsKAogICAgICAoYXN5bmMgKCkgPT4gewogICAgICAgIGF3\ -YWl0IGVuc3VyZVNlcnZpY2VXb3JrZXJSZWFkeTsKICAgICAgICBhd2FpdCBsb2coImluZm8iLCAibm90aWZpY2F0aW9uY2xpY2siLCB7IHRhcmdldFVybCwg\ -dGFyZ2V0VXNlcklkLCB0YWc6IGV2ZW50Lm5vdGlmaWNhdGlvbi50YWcgfSk7CiAgICAgICAgaWYgKCF0YXJnZXRVcmwpIHJldHVybjsKICAgICAgICB0cnkg\ -ewogICAgICAgICAgYXdhaXQgZm9jdXNPck9wZW5DbGllbnQodGFyZ2V0VXJsLCB0YXJnZXRVc2VySWQpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAg\ -ICAgICAgICBhd2FpdCBsb2coImVycm9yIiwgIm5vdGlmaWNhdGlvbmNsaWNrOiBmb2N1c09yT3BlbiBmYWlsZWQiLCB7IGVycm9yOiBkZXNjcmliZUVycm9y\ -KGVycm9yKSB9KTsKICAgICAgICB9CiAgICAgIH0pKCkKICAgICk7CiAgfSk7CiAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCJub3RpZmljYXRpb25jbG9zZSIs\ -IChldmVudCkgPT4gewogICAgZXZlbnQud2FpdFVudGlsKGxvZygiZGVidWciLCAibm90aWZpY2F0aW9uY2xvc2UiLCB7IHRhZzogZXZlbnQubm90aWZpY2F0\ -aW9uLnRhZyB9KSk7CiAgfSk7CiAgdmFyIGFycmF5QnVmZmVyVG9CYXNlNjRVcmwgPSAoYnVmZmVyKSA9PiB7CiAgICBpZiAoIWJ1ZmZlcikgcmV0dXJuIG51\ -bGw7CiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7CiAgICBsZXQgYmluYXJ5ID0gIiI7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8\ -IGJ5dGVzLmxlbmd0aDsgaSArPSAxKSBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7CiAgICByZXR1cm4gYnRvYShiaW5hcnkpLnJl\ -cGxhY2UoL1wrL2csICItIikucmVwbGFjZSgvXC8vZywgIl8iKS5yZXBsYWNlKC89KyQvLCAiIik7CiAgfTsKICB2YXIgdXJsQmFzZTY0VG9VaW50OEFycmF5\ -ID0gKGJhc2U2NCkgPT4gewogICAgY29uc3QgcGFkZGluZyA9ICI9Ii5yZXBlYXQoKDQgLSBiYXNlNjQubGVuZ3RoICUgNCkgJSA0KTsKICAgIGNvbnN0IHJh\ -dyA9IGF0b2IoKGJhc2U2NCArIHBhZGRpbmcpLnJlcGxhY2UoLy0vZywgIisiKS5yZXBsYWNlKC9fL2csICIvIikpOwogICAgY29uc3Qgb3V0ID0gbmV3IFVp\ -bnQ4QXJyYXkocmF3Lmxlbmd0aCk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhdy5sZW5ndGg7IGkgKz0gMSkgb3V0W2ldID0gcmF3LmNoYXJDb2RlQXQo\ -aSk7CiAgICByZXR1cm4gb3V0OwogIH07CiAgdmFyIGZldGNoSW5zdGFuY2VDb25maWcgPSBhc3luYyAoKSA9PiB7CiAgICB0cnkgewogICAgICBjb25zdCBy\ -ZXMgPSBhd2FpdCBmZXRjaCgiLy53ZWxsLWtub3duL2ZsdXhlciIsIHsgY3JlZGVudGlhbHM6ICJpbmNsdWRlIiB9KTsKICAgICAgaWYgKCFyZXMub2spIHJl\ -dHVybiBudWxsOwogICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgY29uc3QgYXBpQ2xpZW50ID0gZGF0YS5lbmRwb2ludHM/LmFw\ -aV9jbGllbnQgPz8gZGF0YS5lbmRwb2ludHM/LmFwaTsKICAgICAgaWYgKCFhcGlDbGllbnQpIHJldHVybiBudWxsOwogICAgICByZXR1cm4geyBhcGlDbGll\ -bnQsIHZhcGlkS2V5OiBkYXRhLnB1c2g/LnB1YmxpY192YXBpZF9rZXkgPz8gbnVsbCB9OwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgYXdhaXQgbG9n\ -KCJlcnJvciIsICJGYWlsZWQgdG8gZmV0Y2ggaW5zdGFuY2UgY29uZmlnIGluIFNXIiwgeyBlcnJvcjogZGVzY3JpYmVFcnJvcihlcnJvcikgfSk7CiAgICAg\ -IHJldHVybiBudWxsOwogICAgfQogIH07CiAgdmFyIFNXX0FQSV9WRVJTSU9OID0gMTsKICB2YXIgcm90YXRlU3Vic2NyaXB0aW9uT25TZXJ2ZXIgPSBhc3lu\ -YyAob2xkRW5kcG9pbnQsIG5ld1N1YiwgYXBpQ2xpZW50KSA9PiB7CiAgICBjb25zdCBwMjU2ZGggPSBhcnJheUJ1ZmZlclRvQmFzZTY0VXJsKG5ld1N1Yi5n\ -ZXRLZXkoInAyNTZkaCIpKTsKICAgIGNvbnN0IGF1dGggPSBhcnJheUJ1ZmZlclRvQmFzZTY0VXJsKG5ld1N1Yi5nZXRLZXkoImF1dGgiKSk7CiAgICBpZiAo\ -IXAyNTZkaCB8fCAhYXV0aCkgewogICAgICBhd2FpdCBsb2coImVycm9yIiwgInJvdGF0ZTogbmV3IHN1YnNjcmlwdGlvbiBtaXNzaW5nIGtleXMiKTsKICAg\ -ICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgdXJsID0gYCR7YXBpQ2xpZW50fS92JHtTV19BUElfVkVSU0lPTn0vdXNlcnMvQG1lL3B1c2gvcm90YXRlYDsK\ -ICAgIHRyeSB7CiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgewogICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgIGNyZWRlbnRpYWxz\ -OiAiaW5jbHVkZSIsCiAgICAgICAgaGVhZGVyczogeyAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iIH0sCiAgICAgICAgYm9keTogSlNPTi5z\ -dHJpbmdpZnkoewogICAgICAgICAgb2xkX2VuZHBvaW50OiBvbGRFbmRwb2ludCwKICAgICAgICAgIGVuZHBvaW50OiBuZXdTdWIuZW5kcG9pbnQsCiAgICAg\ -ICAgICBrZXlzOiB7IHAyNTZkaCwgYXV0aCB9LAogICAgICAgICAgdXNlcl9hZ2VudDogc2VsZi5uYXZpZ2F0b3IudXNlckFnZW50CiAgICAgICAgfSkKICAg\ -ICAgfSk7CiAgICAgIGF3YWl0IGxvZyhyZXMub2sgPyAiaW5mbyIgOiAiZXJyb3IiLCAicm90YXRlOiBzZXJ2ZXIgcmVzcG9uc2UiLCB7IHN0YXR1czogcmVz\ -LnN0YXR1cywgb2s6IHJlcy5vayB9KTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGF3YWl0IGxvZygiZXJyb3IiLCAicm90YXRlOiBmZXRjaCBmYWls\ -ZWQiLCB7IGVycm9yOiBkZXNjcmliZUVycm9yKGVycm9yKSB9KTsKICAgIH0KICB9OwogIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcigicHVzaHN1YnNjcmlwdGlv\ -bmNoYW5nZSIsIChldmVudCkgPT4gewogICAgZXZlbnQud2FpdFVudGlsKAogICAgICAoYXN5bmMgKCkgPT4gewogICAgICAgIGF3YWl0IGVuc3VyZVNlcnZp\ -Y2VXb3JrZXJSZWFkeTsKICAgICAgICBhd2FpdCBsb2coImluZm8iLCAicHVzaHN1YnNjcmlwdGlvbmNoYW5nZSIsIHsKICAgICAgICAgIGhhc09sZDogQm9v\ -bGVhbihldmVudC5vbGRTdWJzY3JpcHRpb24pLAogICAgICAgICAgaGFzTmV3OiBCb29sZWFuKGV2ZW50Lm5ld1N1YnNjcmlwdGlvbiksCiAgICAgICAgICBv\ -bGRFbmRwb2ludDogZXZlbnQub2xkU3Vic2NyaXB0aW9uPy5lbmRwb2ludCA/PyBudWxsLAogICAgICAgICAgbmV3RW5kcG9pbnQ6IGV2ZW50Lm5ld1N1YnNj\ -cmlwdGlvbj8uZW5kcG9pbnQgPz8gbnVsbAogICAgICAgIH0pOwogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCBvbGRFbmRwb2ludCA9IGV2ZW50Lm9s\ -ZFN1YnNjcmlwdGlvbj8uZW5kcG9pbnQgPz8gbnVsbDsKICAgICAgICAgIGxldCBhcHBTZXJ2ZXJLZXkgPSBldmVudC5vbGRTdWJzY3JpcHRpb24/Lm9wdGlv\ -bnM/LmFwcGxpY2F0aW9uU2VydmVyS2V5ID8/IG51bGw7CiAgICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCBmZXRjaEluc3RhbmNlQ29uZmlnKCk7CiAg\ -ICAgICAgICBpZiAoIWFwcFNlcnZlcktleSAmJiBjb25maWc/LnZhcGlkS2V5KSB7CiAgICAgICAgICAgIGFwcFNlcnZlcktleSA9IHVybEJhc2U2NFRvVWlu\ -dDhBcnJheShjb25maWcudmFwaWRLZXkpLmJ1ZmZlcjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghYXBwU2VydmVyS2V5KSB7CiAgICAgICAgICAgIGF3\ -YWl0IGxvZygiZXJyb3IiLCAicHVzaHN1YnNjcmlwdGlvbmNoYW5nZTogbm8gVkFQSUQga2V5IGF2YWlsYWJsZSIpOwogICAgICAgICAgICBhd2FpdCBwb3N0\ -TWVzc2FnZVRvQ2xpZW50cyh7IHR5cGU6ICJQVVNIX1NVQlNDUklQVElPTl9DSEFOR0UiIH0pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAg\ -ICAgICAgICBjb25zdCBuZXdTdWIgPSBldmVudC5uZXdTdWJzY3JpcHRpb24gPz8gYXdhaXQgc2VsZi5yZWdpc3RyYXRpb24ucHVzaE1hbmFnZXIuc3Vic2Ny\ -aWJlKHsKICAgICAgICAgICAgdXNlclZpc2libGVPbmx5OiB0cnVlLAogICAgICAgICAgICBhcHBsaWNhdGlvblNlcnZlcktleTogYXBwU2VydmVyS2V5CiAg\ -ICAgICAgICB9KTsKICAgICAgICAgIGlmIChvbGRFbmRwb2ludCAmJiBjb25maWcpIHsKICAgICAgICAgICAgYXdhaXQgcm90YXRlU3Vic2NyaXB0aW9uT25T\ -ZXJ2ZXIob2xkRW5kcG9pbnQsIG5ld1N1YiwgY29uZmlnLmFwaUNsaWVudCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhd2FpdCBsb2coIndh\ -cm4iLCAicHVzaHN1YnNjcmlwdGlvbmNoYW5nZTogdW5hYmxlIHRvIHJvdGF0ZSBvbiBzZXJ2ZXIiLCB7CiAgICAgICAgICAgICAgaGFzT2xkRW5kcG9pbnQ6\ -IEJvb2xlYW4ob2xkRW5kcG9pbnQpLAogICAgICAgICAgICAgIGhhc0NvbmZpZzogQm9vbGVhbihjb25maWcpCiAgICAgICAgICAgIH0pOwogICAgICAgICAg\ -fQogICAgICAgICAgYXdhaXQgcG9zdE1lc3NhZ2VUb0NsaWVudHMoeyB0eXBlOiAiUFVTSF9TVUJTQ1JJUFRJT05fQ0hBTkdFIiB9KTsKICAgICAgICB9IGNh\ -dGNoIChlcnJvcikgewogICAgICAgICAgYXdhaXQgbG9nKCJlcnJvciIsICJwdXNoc3Vic2NyaXB0aW9uY2hhbmdlIGhhbmRsZXIgZmFpbGVkIiwgeyBlcnJv\ -cjogZGVzY3JpYmVFcnJvcihlcnJvcikgfSk7CiAgICAgICAgICBhd2FpdCBwb3N0TWVzc2FnZVRvQ2xpZW50cyh7IHR5cGU6ICJQVVNIX1NVQlNDUklQVElP\ -Tl9DSEFOR0UiIH0pLmNhdGNoKCgpID0+IHZvaWQgMCk7CiAgICAgICAgfQogICAgICB9KSgpCiAgICApOwogIH0pOwp9KSgpOwovLyMgc291cmNlTWFwcGlu\ -Z1VSTD1zdy5qcy5tYXAK\ -"; -const CANARY_VERSION_JSON: &str = "\ -eyJ2ZXJzaW9uIjoiMjAyNi42MDUuMTE5NDEifQ==\ -"; - fn decode(b64: &str) -> Vec { base64::engine::general_purpose::STANDARD .decode(b64) @@ -623,13 +316,6 @@ pub static STABLE_SNAPSHOT: LazyLock = LazyLock::new(|| FrozenSn version_json: decode(STABLE_VERSION_JSON), }); -pub static CANARY_SNAPSHOT: LazyLock = LazyLock::new(|| FrozenSnapshot { - sha: CANARY_SNAPSHOT_SHA.to_owned(), - index_html: decode(CANARY_INDEX_HTML), - sw_js: decode(CANARY_SW_JS), - version_json: decode(CANARY_VERSION_JSON), -}); - #[cfg(test)] mod tests { use super::*; @@ -639,27 +325,19 @@ mod tests { assert_eq!(STABLE_SNAPSHOT.sha, STABLE_SNAPSHOT_SHA); } - #[test] - fn canary_snapshot_sha_matches() { - assert_eq!(CANARY_SNAPSHOT.sha, CANARY_SNAPSHOT_SHA); - } - #[test] fn index_html_decodes_and_starts_with_doctype() { assert_index_html(&STABLE_SNAPSHOT); - assert_index_html(&CANARY_SNAPSHOT); } #[test] fn sw_js_decodes_and_is_javascript() { assert_sw_js(&STABLE_SNAPSHOT); - assert_sw_js(&CANARY_SNAPSHOT); } #[test] fn version_json_decodes_and_is_valid_json() { assert_version_json(&STABLE_SNAPSHOT); - assert_version_json(&CANARY_SNAPSHOT); } fn assert_index_html(snapshot: &FrozenSnapshot) { diff --git a/fluxer_app_proxy/src/time_freeze.rs b/fluxer_app_proxy/src/time_freeze.rs index d9e3d94c7..454f6b597 100644 --- a/fluxer_app_proxy/src/time_freeze.rs +++ b/fluxer_app_proxy/src/time_freeze.rs @@ -99,11 +99,10 @@ pub fn load_time_freeze_config_for_index_source( #[cfg(feature = "time-freeze")] fn load_frozen_snapshot(release_channel: ReleaseChannel) -> Option { - let snapshot = match release_channel { - ReleaseChannel::Stable => &*crate::frozen_snapshots::STABLE_SNAPSHOT, - ReleaseChannel::Canary => &*crate::frozen_snapshots::CANARY_SNAPSHOT, - }; - Some(snapshot.clone()) + match release_channel { + ReleaseChannel::Stable => Some(crate::frozen_snapshots::STABLE_SNAPSHOT.clone()), + ReleaseChannel::Canary => None, + } } #[cfg(not(feature = "time-freeze"))] @@ -291,14 +290,15 @@ mod tests { #[cfg(feature = "time-freeze")] #[test] - fn canary_channel_has_frozen_snapshot() { + fn canary_channel_has_no_frozen_snapshot() { let config = load_time_freeze_config(ReleaseChannel::Canary, false); - assert!( - config.snapshot.is_some(), - "canary channel should have a frozen snapshot" - ); assert_eq!(config.release_channel, ReleaseChannel::Canary); - assert!(should_serve_frozen(&config).is_some()); + assert!(config.snapshot.is_none()); + assert!(should_serve_frozen(&config).is_none()); + + let debug = describe_decision(&config); + assert_eq!(debug.decision, TimeFreezeDecision::NoSnapshot); + assert!(debug.snapshot_sha.is_none()); } #[test] @@ -340,7 +340,7 @@ mod tests { #[cfg(feature = "time-freeze")] #[test] fn exempt_client_gets_live_content_even_with_snapshot() { - let config = load_time_freeze_config(ReleaseChannel::Canary, true); + let config = load_time_freeze_config(ReleaseChannel::Stable, true); assert!(config.snapshot.is_some()); assert!(should_serve_frozen(&config).is_none());