xiaomianao666

插件名:global_(改)网盘直链下载助手

Mar 21st, 2024
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_(改)网盘直链下载助手@base64://Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgICAgIO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJiwovLyBAbmFtZXNwYWNlICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL3N5aHl6MTk5MC9iYWlkdXl1bgovLyBAdmVyc2lvbiAgICAgICAgICAgMS4wLjguMwovLyBAYXV0aG9yICAgICAgICAgICAgSG1qejEwMOOAgeayueWwj+eMtAovLyBAaWNvbiAgICAgICAgICAgICAgZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhacFpYZENiM2c5SWpBZ01DQXhNamdnTVRJNElqNDhjR0YwYUNCa1BTSk5NVEF6TGpZZ01UQTNMalJqTXk0MUxUSXVNaUE0TGprdE5pNHhJREV6TGpndE1USXVOWE0zTGpNdE1USXVOU0E0TGpVdE1UWXVOV011TlMweExqY2dNaTR5TFRjdU5TQXlMakl0TVRRdU55QXdMVEV3TGpFdE15NHpMVEkxTGpFdE1UVXVOQzB6Tmk0NExURTBMalV0TVRRdE16SXVNUzB4TkM0ekxUTTFMamN0TVRRdU15MDRJREF0TVRVdU55QXhMamt0TWpJdU5pQTFMakpETkRRZ01qTWdNelV1TnlBek1TNDBJRE13TGpnZ05ERXVOMk10TVM0eklESXVPQzAwSURRdU55MDNMakVnTlMwMElDNHpMVGN1TlNBMExqUXRPQzQ1SURrdU5pMHVOU0F4TGprdE1TNDJJRE11TlMwekxqRWdOQzQzUXpRdU5DQTJOaTQ0SURBZ056VXVOeUF3SURnMVl6QWdOaTQ0SURJdU15QXhNeTR4SURZdU1TQXhPQzR5SURVdU5TQTNMalFnTVRRdU1pQXhNaTR5SURJMElERXlMakpvTkRjdU1XTTBMalFnTUNBeE1TMHVOU0F4T0M0ekxUTXVOU0F6TGpJdE1TNDBJRFV1T1MweklEZ3VNUzAwTGpWNklpQm1hV3hzUFNJalFUQTVPVVl3SWk4K1BIQmhkR2dnWkQwaVRURXhPUzQ0SURZMExqTmpMakV0TVRjdU1TMHhNQzQwTFRJNExURXlMalV0TXpBdU1VTTVOU0F5TWk0eElEYzVMamtnTWpFdU9DQTNOaTQ1SURJeExqaGpMVEUzTGpZZ01DMHpNeTR6SURFd0xqVXRNemt1T1NBeU5pNDNMUzQySURFdU15MHhMamdnTWk0ekxUTXVOQ0F5TGpOb0xTNDBZeTAxTGpnZ01DMHhNQzQySURRdU9DMHhNQzQySURFd0xqZDJMalZqTUNBeExqUXRMamdnTWk0MkxURXVPU0F6TGpORE1UTXVOQ0EyT1NBNExqZ2dOell1T0NBNExqZ2dPRFZqTUNBeE1pNHlJRGt1T1NBeU1pNHpJREl5TGpJZ01qSXVNMmcwTlM0eVl6TXVOaTB1TVNBeE55NDJMUzQ1SURJNUxqWXRNVElnTWk0NUxUSXVPQ0F4TXk0NUxURXpMamNnTVRRdE16RjZJaUJtYVd4c1BTSWpOVGMwUVVJNElpOCtQSEJoZEdnZ1pEMGlUVEV4TUM0NElEVTNMalJzTGpJZ015NHpZekFnTVM0ekxURXVNU0F5TGpRdE1pNHpJREl1TkMweExqTWdNQzB5TGpNdE1TNHhMVEl1TXkweUxqUnNMUzR4TFRJdU9IWXRMak5qTUMweExqSXVPUzB5TGpJZ01pNHhMVEl1TTJndU0yTXVOeUF3SURFdU15NHpJREV1Tnk0M0xTNHlMakV1TXk0MUxqUWdNUzQwZW0wdE15NHpMVEV3TGpOak1DQXhMakl0TVNBeUxqTXRNaTR5SURJdU0yZ3RMakZqTFM0NElEQXRNUzQyTFM0MUxUSXRNUzR5TFRRdU5pMDRMak10TVRNdU15MHhNeTQxTFRJeUxqZ3RNVE11TlMweExqSWdNQzB5TGpNdE1TMHlMak10TWk0eWRpMHVNV013TFRFdU1pQXhMVEl1TXlBeUxqSXRNaTR6YUM0eFlUTXdMak0zSURNd0xqTTNJREFnTUNBeElERTFMamdnTkM0MFl6UXVOaUF5TGpnZ09DNDBJRFl1T0NBeE1TNHhJREV4TGpVdU1TNHpMakl1Tnk0eUlERXVNWHBOT0RndU15QTNNeTQ0VERjekxqVWdPVE11TW1NdE1TNDFJREV1T1MwekxqVWdNeTR4TFRVdU55QXpMalZvTFM0eVl5MHVOQzR4TFM0NExqRXRNUzR5TGpFdExqWWdNQzB4TGpFdExqRXRNUzQyTFM0eUxUSXVNaTB1TkMwMExqSXRNUzQzTFRVdU5pMHpMalZNTkRRdU15QTNNeTQ1WXkweUxUSXVOaTB5TGpVdE5TNDBMVEV1TkMwM0xqY3VNUzB1TVM0eExTNHlMakl0TGpJZ01TNHlMVElnTXk0MUxUTXVNaUEyTGpRdE15NHlhRFl1Tm5ZdE5TNDNZekF0Tmk0NElEUXVOeTB4TWlBeE1DNDVMVEV5SURRdU9DQXdJRGd1TlNBeUxqWWdNVEF1TXlBM0xqSXVOU0F4TGpNdExqSWdNaTQzTFRFdU5TQXpMakp6TFRJdU9DMHVNUzB6TGpNdE1TNDBZeTB4TGpFdE1pNDNMVEl1T1MwMExUVXVOUzAwTFRNdU5TQXdMVFlnTXkwMklEZDJPQzR4WXpBZ0xqVXRMaklnTVMwdU5pQXhMalF0TGpZdU55MHhMamNnTVM0eExUSXVOaUF4TGpGb0xUZ3VOR010TVM0eklEQXRNaUF1TkMweUxqRXVOeTB1TWk0MElEQWdNUzR6TGprZ01pNDBURFl6TGpFZ09UQmpMamtnTVM0eUlESXVNU0F4TGpnZ015NHpJREV1T0hNeUxqTXRMallnTXk0eExURXVOMnd4TkM0NExURTVMak5qTGprdE1TNHhJREV1TVMweUlDNDVMVEl1TkMwdU1pMHVNeTB1T1MwdU55MHlMakV0TGpkb0xUY3VObU10TGprZ01DMHhMamN0TGpVdE1pNHhMVEV1TWkwdU15MHVOQzB1TkMwdU9DMHVOQzB4TGpNZ01DMHhMalFnTVM0eExUSXVOU0F5TGpVdE1pNDFhRGN1Tm1NekxqRWdNQ0ExTGpVZ01TNHpJRFl1TmlBekxqVnNMak11TjJNdU55QXlMakV1TVNBMExqWXRNUzQzSURZdU9Yb2lJR1pwYkd3OUlpTm1abVlpTHo0OEwzTjJaejQ9Ci8vIEBkZXNjcmlwdGlvbiAgICAgICDlj6/ku6Xojrflj5bnvZHnm5jmlofku7bnnJ/lrp7kuIvovb3lnLDlnYDjgILnjrDlt7LmlK/mjIHnmb7luqbnvZHnm5jpmL/ph4znvZHnm5jlpKnnv7znvZHnm5jov4Xpm7fnvZHnm5jlpLjlhYvnvZHnm5jnp7vliqjnvZHnm5jlha3lpKfnvZHnm5jvvIzln7rkuo7jgJDnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJHkv67mlLnoh6o2LjEuNOeJiOacrCzoh6rnlKgs5Y675o6o5bm/LOS/ruWOn+aciUJVRyzkv67mlLnnlYzpnaIs55Sa6Iez5q+U5Y6f54mI6L+Y5aW955So77yBCi8vIEBsaWNlbnNlICAgICAgICAgICBBR1BMLTMuMC1vci1sYXRlcgovLyBAaG9tZXBhZ2UgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2htanoxMDAvT25saW5lLWRpc2stZGlyZWN0LWxpbmstZG93bmxvYWQtYXNzaXN0YW50LwovLyBAc3VwcG9ydFVSTCAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2htanoxMDAvT25saW5lLWRpc2stZGlyZWN0LWxpbmstZG93bmxvYWQtYXNzaXN0YW50L2lzc3VlcwovLyBAY29tcGF0aWJsZQkgICAgICBDaHJvbWUKLy8gQGNvbXBhdGlibGUJICAgICAgRWRnZQovLyBAY29tcGF0aWJsZQkgICAgICBGaXJlZm94Ci8vIEBjb21wYXRpYmxlCSAgICAgIFNhZmFyaQovLyBAY29tcGF0aWJsZQkgICAgICBPcGVyYQovLyBAcmVxdWlyZSAgICAgICAgICAgaHR0cHM6Ly91bnBrZy5jb20vanF1ZXJ5QDMuNi4wL2Rpc3QvanF1ZXJ5Lm1pbi5qcwovLyBAcmVxdWlyZSAgICAgICAgICAgaHR0cHM6Ly91bnBrZy5jb20vc3dlZXRhbGVydDJAMTEvZGlzdC9zd2VldGFsZXJ0Mi5taW4uanMKLy8gQHJlcXVpcmUgICAgICAgICAgIGh0dHBzOi8vdW5wa2cuY29tL2pzLW1kNUAwLjcuMy9idWlsZC9tZDUubWluLmpzCi8vIEByZXNvdXJjZSBTd2FsICAgICBodHRwczovL3VucGtnLmNvbS9zd2VldGFsZXJ0MkAxMS9kaXN0L3N3ZWV0YWxlcnQyLm1pbi5jc3MKLy8gQHJlc291cmNlIFN3YWxEYXJrIGh0dHBzOi8vdW5wa2cuY29tL0Bzd2VldGFsZXJ0Mi90aGVtZS1kYXJrQDUuMC4xNS9kYXJrLm1pbi5jc3MKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL2Rpc2svaG9tZSoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly95dW4uYmFpZHUuY29tL2Rpc2svaG9tZSoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL2Rpc2svbWFpbioKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly95dW4uYmFpZHUuY29tL2Rpc2svbWFpbioKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL2Rpc2svYmFzZSoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly95dW4uYmFpZHUuY29tL2Rpc2svYmFzZSoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL3dhcC9ob21lKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3l1bi5iYWlkdS5jb20vd2FwL2hvbWUqCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS93YXAvbWFpbioKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly95dW4uYmFpZHUuY29tL3dhcC9tYWluKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3Bhbi5iYWlkdS5jb20vcy8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS9haXBhbi8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8veXVuLmJhaWR1LmNvbS9zLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly95dW4uYmFpZHUuY29tL2FpcGFuLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL3NoYXJlLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly95dW4uYmFpZHUuY29tL3NoYXJlLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3d3dy5hbGl5dW5kcml2ZS5jb20vZHJpdmUqCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vd3d3LmFsaXBhbi5jb20vcy8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vd3d3LmFsaXBhbi5jb20vZHJpdmUqCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vY2xvdWQuMTg5LmNuL3dlYi8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vcGFuLnh1bmxlaS5jb20vKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3Bhbi5xdWFyay5jbi8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8veXVuLjEzOS5jb20vKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL2NhaXl1bi4xMzkuY29tLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly8qLnlvdXhpYW9ob3UuY29tLyoKLy8gQGNvbm5lY3QgICAgICAgICAgIGJhaWR1LmNvbQovLyBAY29ubmVjdCAgICAgICAgICAgYmFpZHVwY3MuY29tCi8vIEBjb25uZWN0ICAgICAgICAgICBhbGl5dW5kcml2ZS5jb20KLy8gQGNvbm5lY3QgICAgICAgICAgIGFsaXl1bmRyaXZlLm5ldAovLyBAY29ubmVjdCAgICAgICAgICAgYWxpcGFuLmNvbQovLyBAY29ubmVjdCAgICAgICAgICAgYWxpY2xvdWRjY3AuY29tCi8vIEBjb25uZWN0ICAgICAgICAgICAxODkuY24KLy8gQGNvbm5lY3QgICAgICAgICAgIHh1bmxlaS5jb20KLy8gQGNvbm5lY3QgICAgICAgICAgIHF1YXJrLmNuCi8vIEBjb25uZWN0ICAgICAgICAgICB5b3V4aWFvaG91LmNvbQovLyBAY29ubmVjdCAgICAgICAgICAgZ2NvcmUuanNkZWxpdnIubmV0Ci8vIEBjb25uZWN0ICAgICAgICAgICBsb2NhbGhvc3QKLy8gQGNvbm5lY3QgICAgICAgICAgICoKLy8gQHJ1bi1hdCAgICAgICAgICAgIGRvY3VtZW50LWlkbGUKLy8gQGdyYW50ICAgICAgICAgICAgIHVuc2FmZVdpbmRvdwovLyBAZ3JhbnQgICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3QKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX3NldENsaXBib2FyZAovLyBAZ3JhbnQgICAgICAgICAgICAgR01fc2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX2dldFZhbHVlCi8vIEBncmFudCAgICAgICAgICAgICBHTV9vcGVuSW5UYWIKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX2luZm8KLy8gQGdyYW50ICAgICAgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX2Nvb2tpZQovLyBAZ3JhbnQgICAgICAgICAgICAgR01fYWRkU3R5bGUKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX2dldFJlc291cmNlVGV4dAovLyBAZG93bmxvYWRVUkwgaHR0cHM6Ly91cGRhdGUuZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy80NDkyOTEvJUVGJUJDJTg4JUU2JTk0JUI5JUVGJUJDJTg5JUU3JUJEJTkxJUU3JTlCJTk4JUU3JTlCJUI0JUU5JTkzJUJFJUU0JUI4JThCJUU4JUJEJUJEJUU1JThBJUE5JUU2JTg5JThCLnVzZXIuanMKLy8gQHVwZGF0ZVVSTCBodHRwczovL3VwZGF0ZS5ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzQ0OTI5MS8lRUYlQkMlODglRTYlOTQlQjklRUYlQkMlODklRTclQkQlOTElRTclOUIlOTglRTclOUIlQjQlRTklOTMlQkUlRTQlQjglOEIlRTglQkQlQkQlRTUlOEElQTklRTYlODklOEIubWV0YS5qcwovLyA9PS9Vc2VyU2NyaXB0PT0KCihmdW5jdGlvbiAoKSB7CgkndXNlIHN0cmljdCc7CgoJLy8g55WM6Z2i5Y+C5pWwCglsZXQgcHQgPSAnJywgc2VsZWN0TGlzdCA9IFtdLCBwYXJhbXMgPSB7fSwgbW9kZSA9ICcnLCB3aWR0aCA9ICcnLCBwYW4gPSB7fSwgY29sb3IgPSAnJywKCQl1cGRhdGUgPSAnJywgdXBkYXRlX2JhaWR1ID0gJycsIHVwZGF0ZV9iYWlkdVggPSAnJywKCQlkb2MgPSAkKGRvY3VtZW50KSwgcHJvZ3Jlc3MgPSB7fSwgcmVxdWVzdCA9IHt9LCBpbnMgPSB7fSwgaWRtID0ge307CgoKCS8vIOWHhuWkh+WlveWvueW6lOeahOWFg+e0oAoJbGV0IGN1c3RvbUNsYXNzID0gewoJCXBvcHVwOiAncGwtcG9wdXAnLAoJCWhlYWRlcjogJ3BsLWhlYWRlcicsCgkJdGl0bGU6ICdwbC10aXRsZScsCgkJY2xvc2VCdXR0b246ICdwbC1jbG9zZScsCgkJY29udGVudDogJ3BsLWNvbnRlbnQnLAoJCWlucHV0OiAncGwtaW5wdXQnLAoJCWZvb3RlcjogJ3BsLWZvb3RlcicKCX07CgoKCS8vIOWHhuWkh+WlvVNoZWxs57G75Z6L77yI55So5LqOY3VybOS4i+i9ve+8iQoJbGV0IHRlcm1pbmFsVHlwZSA9IHsKCQl3YzogIk1pY3Jvc29mdCBXaW5kb3dzIOWRveS7pOaPkOekuuespiIsCgkJd3A6ICJNaWNyb3NvZnQgV2luZG93cyBQb3dlclNoZWxsIiwKCQlsdDogIkxpbnV4IOe7iOerryIsCgkJbHM6ICJMaW51eCBTaGVsbCIsCgkJbXQ6ICJBcHBsZSBNYWNPUyDnu4jnq68iLAoJfTsKCgkvL+WHhuWkh+WlveS/oeaBr+eVjOmdoueahOiuvue9rumAiemhuQoJbGV0IHVwZGF0ZWNoZWNrID0gewoJCXllczogIuiHquWKqOajgOafpeabtOaWsCIsCgkJbm86ICLkuI3mo4Dmn6Xmm7TmlrAiCgl9CglsZXQgeW91c2VydmVyID0gewoJCXYxOiAi5L2/55SoIFvnlKjmsrnlsI/njLTmnI3liqHlmaggVjEg5o6l5Y+jXSIsCgkJdjI6ICLkvb/nlKggW+eUqOayueWwj+eMtOacjeWKoeWZqCBWMiDmjqXlj6NdIiwKCQlubzogIuS4jeS9v+eUqCBb55SoIGpzZGVsaXZyIOi/nuaOpeacrOmhueebriBHaXRodWIg5LuT5bqTXSjmm7TmlrDlj6/og73kuI3lj4rml7YpIgoJfTsKCWxldCBiYWlkdXRoZW1lID0gewoJCXllczogIuS/ruaUueS4u+mimOiJsiIsCgkJbm86ICLkuI3kv67mlLnkuLvpopjoibIiCgl9OwoKCS8v5YeG5aSH5aW95Y+z5LiK6KeS55qEVG9hc3Tmj5DnpLoKCWxldCB0b2FzdCA9IFN3YWwubWl4aW4oewoJCXRvYXN0OiB0cnVlLAoJCXBvc2l0aW9uOiAndG9wLWVuZCcsCgkJc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLAoJCXRpbWVyOiAzNTAwLAoJCXRpbWVyUHJvZ3Jlc3NCYXI6IHRydWUsCgkJc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAoJCWRpZE9wZW46ICh0b2FzdCkgPT4gewoJCQl0b2FzdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgU3dhbC5zdG9wVGltZXIpOwoJCQl0b2FzdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgU3dhbC5yZXN1bWVUaW1lcik7CgkJfQoJfSk7CgoJLy/mj5DnpLrnmoTkv6Hmga/lhoXlrrkKCWxldCBtZXNzYWdlID0gewoJCXN1Y2Nlc3M6ICh0ZXh0KSA9PiB7CgkJCXRvYXN0LmZpcmUoe3RpdGxlOiB0ZXh0LCBpY29uOiAnc3VjY2Vzcyd9KTsKCQl9LAoJCWVycm9yOiAodGV4dCkgPT4gewoJCQl0b2FzdC5maXJlKHt0aXRsZTogdGV4dCwgaWNvbjogJ2Vycm9yJ30pOwoJCX0sCgkJd2FybmluZzogKHRleHQpID0+IHsKCQkJdG9hc3QuZmlyZSh7dGl0bGU6IHRleHQsIGljb246ICd3YXJuaW5nJ30pOwoJCX0sCgkJaW5mbzogKHRleHQpID0+IHsKCQkJdG9hc3QuZmlyZSh7dGl0bGU6IHRleHQsIGljb246ICdpbmZvJ30pOwoJCX0sCgkJcXVlc3Rpb246ICh0ZXh0KSA9PiB7CgkJCXRvYXN0LmZpcmUoe3RpdGxlOiB0ZXh0LCBpY29uOiAncXVlc3Rpb24nfSk7CgkJfQoJfTsKCgkvLyDlsIHoo4Xlpb3opoHnlKjnmoTlh73mlbAKCWxldCBiYXNlID0gewoJCS8vIOm7mOiupOiPnOWNlQoJCXJlZ2lzdGVyTWVudUNvbW1hbmQoKSB7CgkJCUdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoJ+Kame+4jyDorr7nva4nLCAoKSA9PiB7CgkJCQliYXNlLnNob3dTZXR0aW5nKCk7CgkJCX0pOwoJCQlHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCfwn5ODIOabtOaWsCcsICgpID0+IHsKCQkJCWJhc2Uuc2hvd1VwZGF0ZUxvZygpOwoJCQl9KTsKCQkJR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgn8J+boO+4jyDosIPor5UnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dJbmZvKCk7CgkJCX0pOwoJCX0sCgoJCS8vIOWvueS6jumdnue9keebmOeahOiPnOWNlQoJCXJlZ2lzdGVyUGFuTWVudUNvbW1hbmQoKSB7CgkJCUdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoJ+Kame+4jyDorr7nva4nLCAoKSA9PiB7CgkJCQliYXNlLnNob3dTZXR0aW5nKCk7CgkJCX0pOwoJCQlHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCfwn5ODIOabtOaWsCcsICgpID0+IHsKCQkJCWJhc2Uuc2hvd1VwZGF0ZUxvZygpOwoJCQl9KTsKCQkJR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgn8J+boO+4jyDosIPor5UnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dQYW5JbmZvKCk7CgkJCX0pOwoJCX0sCgoJCS8vIOWPlua2iOeCueS6ruaMiemSruaMieS4i+WQjui/kOihjOeahAoJCXJlZ2lzdGVySW5pdENvZGUodmFsdWUpIHsKCQkJY29uc29sZS5sb2coIuOAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkVxu5q2j5Zyo5rOo5YWl5Y+W5raI54K55Lqu5oyJ6ZKu6K6+572u6aG555uuLi4uIik7CgkJCW1lc3NhZ2Uud2FybmluZygi5q2j5Zyo5rOo5YWl5Y+W5raI54K55Lqu5oyJ6ZKu6K6+572u6aG555uuLi4uKOaCqOWPr+S7peWGjeasoeeCueS6ruaMiemSrikiKTsKCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19pbml0X2NvZGUnLCB2YWx1ZSk7CgkJCWhpc3RvcnkuZ28oMCkKCQl9LAoKCQkvLyDojrflj5ZDb29raWUKCQlnZXRDb29raWUobmFtZSkgewoJCQlsZXQgY29va2llcyA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpOwoJCQlmb3IgKGxldCBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHsKCQkJCWxldCBjb29raWVQYWlyID0gY29va2llc1tpXS50cmltKCkuc3BsaXQoJz0nKTsKCQkJCWlmIChjb29raWVQYWlyLmxlbmd0aCA9PT0gMikgewoJCQkJCWxldCBjb29raWVOYW1lID0gY29va2llUGFpclswXTsKCQkJCQlpZiAoY29va2llTmFtZSA9PT0gbmFtZSkgewoJCQkJCQlyZXR1cm4gY29va2llUGFpclsxXTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJcmV0dXJuICcnOwoJCX0sCgoJCS8qLS0g5a+56LGh57G75Z6L5Yik5patCgkJ56S65L6L77yaCgkJCWlzVHlwZShbXSkgLy8g6L6T5Ye6ImFycmF5IgoJCQlpc1R5cGUoMTIzKSAvLyDovpPlh7oibnVtYmVyIgoJCQlpc1R5cGUobnVsbCkgLy8g6L6T5Ye6Im51bGwiCgkJCWlzVHlwZShuZXcgRGF0ZSgpKSAvLyDovpPlh7oiZGF0ZSIKCQkqLwoJCWlzVHlwZShvYmopIHsKCQkJcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopLnJlcGxhY2UoL15cW29iamVjdCAoLispXF0kLywgJyQxJykudG9Mb3dlckNhc2UoKTsKCQl9LAoKCgkJLy8g6I635Y+W5pys5Zyw5L+d5a2Y55qE5pWw5YC877yI5LuF55So5LqOIEdyZWFzZW1vbmtlee+8iQoJCWdldFZhbHVlKG5hbWUpIHsKCQkJcmV0dXJuIEdNX2dldFZhbHVlKG5hbWUpOwoJCX0sCgoJCS8vIOS/ruaUueacrOWcsOS/neWtmOeahOaVsOWAvO+8iOS7heeUqOS6jiBHcmVhc2Vtb25rZXnvvIkKCQlzZXRWYWx1ZShuYW1lLCB2YWx1ZSkgewoJCQlHTV9zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7CgkJfSwKCgkJLy8g6I635Y+W5pys5Zyw5L+d5a2Y55qE5pWw5YC8CgkJZ2V0U3RvcmFnZShrZXkpIHsKCQkJdHJ5IHsKCQkJCXJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkpOwoJCQl9IGNhdGNoIChlKSB7CgkJCQlyZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTsKCQkJfQoJCX0sCgoJCS8vIOS/ruaUueacrOWcsOS/neWtmOeahOaVsOWAvAoJCXNldFN0b3JhZ2Uoa2V5LCB2YWx1ZSkgewoJCQlpZiAodGhpcy5pc1R5cGUodmFsdWUpID09PSAnb2JqZWN0JyB8fCB0aGlzLmlzVHlwZSh2YWx1ZSkgPT09ICdhcnJheScpIHsKCQkJCXJldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7CgkJCX0KCQkJcmV0dXJuIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpOwoJCX0sCgoJCS8vIOiuvue9ruWJqui0tOadv++8iOS7heeUqOS6jiBHcmVhc2Vtb25rZXnvvIkKCQlzZXRDbGlwYm9hcmQodGV4dCkgewoJCQlHTV9zZXRDbGlwYm9hcmQodGV4dCwgJ3RleHQnKTsKCQl9LAoKCQkvLyDliqDlr4bmiJBiYXNlNjTvvIjlhYjovazmjaLmiJBVUkznvJbnoIHvvIkKCQllbmNvZGUoc3RyKSB7CgkJCXJldHVybiBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKSk7CgkJfSwKCgkJLy8g5LuOYmFzZTY06Kej5a+GCgkJZGVjb2RlKHN0cikgewoJCQlyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShhdG9iKHN0cikpKTsKCQl9LAoKCQkvL+aVsOWtl+ihpembtgoJCXJlcGFpclRpbWVyKGkpewoJCQlpZiAoaSA+PSAwICYmIGkgPD0gOSkgewoJCQkJcmV0dXJuICIwIiArIGk7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gaTsKCQkJfQoJCX0sCgoJCS8vIOaOpeWPl+aWh+S7tuWQjeW5tui/lOWbnuWkp+WGmeaJqeWxleWQjQoJCWdldEV4dGVuc2lvbihuYW1lKSB7CgkJCWNvbnN0IHJlZyA9IC8oPyFcLilcdyskLzsKCQkJaWYgKHJlZy50ZXN0KG5hbWUpKSB7CgkJCQlsZXQgbWF0Y2ggPSBuYW1lLm1hdGNoKHJlZyk7CgkJCQlyZXR1cm4gbWF0Y2hbMF0udG9VcHBlckNhc2UoKTsKCQkJfQoJCQlyZXR1cm4gJyc7CgkJfSwKCgkJLy8g5paH5Lu25aSn5bCP6L2s5o2i77yI5Lul5a2X6IqC5Li65Y2V5L2N77yJCgkJc2l6ZUZvcm1hdCh2YWx1ZSkgewoJCQlpZiAodmFsdWUgPT09ICt2YWx1ZSkgewoJCQkJbGV0IHVuaXQgPSBbIuWtl+iKgihCKSIsICLljYPlrZfoioIoS0IpIiwgIuWFhuWtl+iKgihNQikiLCAi5ZCJ5a2X6IqCKEdCKSIsICLlpKrlrZfoioIoVEIpIiwgIuaLjeWtl+iKgihQQikiLCAi6Im+5a2X6IqCKEVCKSIsICLms73lrZfoioIoWkIpIiwgIuWwp+Wtl+iKgihZQikiXTsKCQkJCWlmICh2YWx1ZSA9PT0gMCkgewoJCQkJCXJldHVybiAiMOWtl+iKgihCKSI7CgkJCQl9IGVsc2UgewoJCQkJCWxldCBpbmRleCA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5sb2coMTAyNCkpOwoJCQkJCWxldCBzaXplID0gdmFsdWUgLyBNYXRoLnBvdygxMDI0LCBpbmRleCk7CgkJCQkJc2l6ZSA9IHNpemUudG9GaXhlZCgxKTsKCQkJCQlyZXR1cm4gc2l6ZSArIHVuaXRbaW5kZXhdOwoJCQkJfQoJCQl9CgkJCXJldHVybiAnJzsKCQl9LAoKCQkvLyDmoLnmja7mlbDnu4TkuK3nmoTmr4/kuKrmlofku7blkI3ov5vooYzmjpLluo/vvIzkvb/nlKjkuoZsb2NhbGVDb21wYXJl5pa55rOV5p2l5q+U6L6D5Lit5paH5a2X56ym5Liy55qE6aG65bqP44CCCgkJc29ydEJ5TmFtZShhcnIpIHsKCQkJY29uc3QgaGFuZGxlID0gKCkgPT4gewoJCQkJcmV0dXJuIChhLCBiKSA9PiB7CgkJCQkJY29uc3QgcDEgPSBhLmZpbGVuYW1lID8gYS5maWxlbmFtZSA6IGEuc2VydmVyX2ZpbGVuYW1lOwoJCQkJCWNvbnN0IHAyID0gYi5maWxlbmFtZSA/IGIuZmlsZW5hbWUgOiBiLnNlcnZlcl9maWxlbmFtZTsKCQkJCQlyZXR1cm4gcDEubG9jYWxlQ29tcGFyZShwMiwgInpoLUNOIik7CgkJCQl9OwoJCQl9OwoJCQlhcnIuc29ydChoYW5kbGUoKSk7CgkJfSwKCgkJLy8g5pu/5o2i54m55q6K5a2X56ym5Li65LiL5YiS57q/CgkJZml4RmlsZW5hbWUobmFtZSkgewoJCQlsZXQgcmVwbGFjZSA9IC9bIT8mfGAiJypcLzo8PlxcXS9nCgkJCXJldHVybiBuYW1lLnJlcGxhY2UocmVwbGFjZSwgJ18nKTsKCQl9LAoKCQkvLyDmjqXlj5dCbG9i5a+56LGh5ZKM5paH5Lu25ZCN77yM54S25ZCO5Yib5bu65Li05pe26ZO+5o6l5oyH5ZCRYmxvYuWvueixoe+8jOS5i+WQjuWIm+W7umHmoIfnrb7mjIflkJHkuLTml7bpk77mjqXlkozorr7nva7mlofku7blkI3vvIzmnIDlkI7mqKHmi5/ngrnlh7th5qCH562+5a6e546w5LiL6L295ZKM6YeK5pS+5Li05pe26ZO+5o6lCgkJYmxvYkRvd25sb2FkKGJsb2IsIGZpbGVuYW1lKSB7CgkJCWlmIChibG9iIGluc3RhbmNlb2YgQmxvYikgewoJCQkJY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKCQkJCWNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CgkJCQlhLmhyZWYgPSB1cmw7CgkJCQlhLmRvd25sb2FkID0gZmlsZW5hbWU7CgkJCQlhLmNsaWNrKCk7CgkJCQlVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7CgkJCX0KCQl9LAoKCQkvLyDkvb/nlKhQb3N05Y+R6YCB6K+35rGCCgkJcG9zdCh1cmwsIGRhdGEsIGhlYWRlcnMsIHR5cGUsIG1heFJldHJpZXMgPSAxMCwgY3VycmVudFJldHJ5ID0gMCkgewoJCQlpZiAodGhpcy5pc1R5cGUoZGF0YSkgPT09ICdvYmplY3QnKSB7CgkJCQlkYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7CgkJCX0KCQkJcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKCQkJCWNvbnN0IHNlbmRSZXF1ZXN0ID0gKCkgPT4gewoJCQkJCUdNX3htbGh0dHBSZXF1ZXN0KHsKCQkJCQkJbWV0aG9kOiAiUE9TVCIsIHVybCwgaGVhZGVycywgZGF0YSwKCQkJCQkJcmVzcG9uc2VUeXBlOiB0eXBlIHx8ICdqc29uJywKCQkJCQkJb25sb2FkOiAocmVzKSA9PiB7CgkJCQkJCQlpZiAoL15bQS1aYS16MC05Ky89XHNdKyQvLnRlc3QocmVzLnJlc3BvbnNlKSAmJiAvXltBLVphLXowLTkrLz1cc10rJC8udGVzdChyZXMucmVzcG9uc2VUZXh0KSkgewoJCQkJCQkJCWlmIChyZXMucmVzcG9uc2UpIHsKCQkJCQkJCQkJcmVzLmRlY29kZWRSZXNwb25zZSA9IEpTT04ucGFyc2UoYmFzZS5kZWNvZGUocmVzLnJlc3BvbnNlKSk7CgkJCQkJCQkJfQoJCQkJCQkJCWlmIChyZXMucmVzcG9uc2VUZXh0KSB7CgkJCQkJCQkJCXJlcy5kZWNvZGVkUmVzcG9uc2VUZXh0ID0gYmFzZS5kZWNvZGUocmVzLnJlc3BvbnNlVGV4dCk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJY29uc29sZS5sb2coJ+OAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkVBvc3Rcbuivt+axguWcsOWdgO+8micgKyB1cmwgKyAnXG7or7fmsYLlpLTpg6jvvJonICsgSlNPTi5zdHJpbmdpZnkoaGVhZGVycykgKyAnXG7or7fmsYLnu5PmnpzvvJonLCByZXMpOwoJCQkJCQkJdHlwZSA9PT0gJ2Jsb2InID8gcmVzb2x2ZShyZXMpIDogcmVzb2x2ZShyZXMucmVzcG9uc2UgfHwgcmVzLnJlc3BvbnNlVGV4dCk7CgkJCQkJCX0sCgkJCQkJCW9uZXJyb3I6IChlcnIpID0+IHsKCQkJCQkJCWlmIChjdXJyZW50UmV0cnkgPCBtYXhSZXRyaWVzKSB7CgkJCQkJCQkJY3VycmVudFJldHJ5Kys7CgkJCQkJCQkJY29uc29sZS5lcnJvcihg44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRUG9zdFxu6K+35rGC5Ye6546w6ZSZ6K+v77yM5Y+v6IO95piv572R57uc6Zeu6aKYXG4156eS5ZCO5bCG6YeN6K+VICjplJnor6/mrKHmlbDvvJoke2N1cnJlbnRSZXRyeX0vJHttYXhSZXRyaWVzfSkuLi5gLCBlcnIpOwoJCQkJCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCQkJCQkJCQkJY29uc29sZS5sb2coYOOAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkVBvc3RcbumHjeaWsOWwneivleivt+axgi4uLmApOwoJCQkJCQkJCQlzZW5kUmVxdWVzdCgpOyAvLyDph43mlrDlj5HpgIHor7fmsYIKCQkJCQkJCQl9LDUwMDApCgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCXJlamVjdCgn44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRUG9zdFxu6K+35rGC5Ye6546w6ZSZ6K+v77yM5Y+v6IO95piv572R57uc6Zeu6aKYXG7ml6Dms5Xnu6fnu63or7fmsYLvvIzovr7liLDmnIDlpKfplJnor6/mrKHmlbDjgIInLCBlcnIpOyAvLyDovr7liLDmnIDlpKfph43or5XmrKHmlbDvvIzmi5Lnu50gUHJvbWlzZQoJCQkJCQkJfQoJCQkJCQl9LAoJCQkJCX0pOwoJCQkJfTsKCQkJCXNlbmRSZXF1ZXN0KCk7IC8vIOWIneWni+ivt+axggoJCQl9KTsKCQl9LAoKCQkvLyDkvb/nlKhHZXTlj5HpgIHor7fmsYIKCQlnZXQodXJsLCBoZWFkZXJzLCB0eXBlLCBleHRyYSwgbWF4UmV0cmllcyA9IDEwLCBjdXJyZW50UmV0cnkgPSAwKSB7CgkJCXJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CgkJCQljb25zdCBzZW5kUmVxdWVzdCA9ICgpID0+IHsKCQkJCQlsZXQgcmVxdWVzdE9iaiA9IEdNX3htbGh0dHBSZXF1ZXN0KHsKCQkJCQkJbWV0aG9kOiAiR0VUIiwgdXJsLCBoZWFkZXJzLAoJCQkJCQlyZXNwb25zZVR5cGU6IHR5cGUgfHwgJ2pzb24nLAoJCQkJCQlvbmxvYWQ6IChyZXMpID0+IHsKCQkJCQkJCWNvbnNvbGUubG9nKCfjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFHZXQgT25sb2FkXG7or7fmsYLlnLDlnYDvvJonICsgdXJsICsgJ1xu6K+35rGC5aS06YOo77yaJyArIEpTT04uc3RyaW5naWZ5KGhlYWRlcnMpICsgJ1xu6K+35rGC57uT5p6c77yaJywgcmVzKTsKCQkJCQkJCWlmIChyZXMuc3RhdHVzID09PSAyMDQpIHsKCQkJCQkJCQlyZXF1ZXN0T2JqLmFib3J0KCk7CgkJCQkJCQkJaWRtW2V4dHJhLmluZGV4XSA9IHRydWU7CgkJCQkJCQl9CgkJCQkJCQlpZiAodHlwZSA9PT0gJ2Jsb2InKSB7CgkJCQkJCQkJcmVzLnN0YXR1cyA9PT0gMjAwICYmIGJhc2UuYmxvYkRvd25sb2FkKHJlcy5yZXNwb25zZSwgZXh0cmEuZmlsZW5hbWUpOwoJCQkJCQkJCXJlc29sdmUocmVzKTsKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJcmVzb2x2ZShyZXMucmVzcG9uc2UgfHwgcmVzLnJlc3BvbnNlVGV4dCk7CgkJCQkJCQl9CgkJCQkJCX0sCgkJCQkJCW9ucHJvZ3Jlc3M6IChyZXMpID0+IHsKCQkJCQkJCWlmIChleHRyYSAmJiBleHRyYS5maWxlbmFtZSAmJiBleHRyYS5pbmRleCkgewoJCQkJCQkJCXJlcy50b3RhbCA+IDAgPyBwcm9ncmVzc1tleHRyYS5pbmRleF0gPSAocmVzLmxvYWRlZCAqIDEwMCAvIHJlcy50b3RhbCkudG9GaXhlZCgyKSA6IHByb2dyZXNzW2V4dHJhLmluZGV4XSA9IDAuMDA7CgkJCQkJCQl9CgkJCQkJCX0sCgkJCQkJCW9ubG9hZHN0YXJ0KCkgewoJCQkJCQkJY29uc29sZS5sb2coJ+OAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkUdldCBPbmxvYWRTdGFydFxu6K+35rGC5Zyw5Z2A77yaJyArIHVybCArICdcbuivt+axguWktOmDqO+8micgKyBKU09OLnN0cmluZ2lmeShoZWFkZXJzKSk7CgkJCQkJCQlleHRyYSAmJiBleHRyYS5maWxlbmFtZSAmJiBleHRyYS5pbmRleCAmJiAocmVxdWVzdFtleHRyYS5pbmRleF0gPSByZXF1ZXN0T2JqKTsKCQkJCQkJfSwKCQkJCQkJb25lcnJvcjogKGVycikgPT4gewoJCQkJCQkJaWYgKGN1cnJlbnRSZXRyeSA8IG1heFJldHJpZXMpIHsKCQkJCQkJCQljdXJyZW50UmV0cnkrKzsKCQkJCQkJCQljb25zb2xlLmVycm9yKGDjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFHZXRcbuivt+axguWHuueOsOmUmeivr++8jOWPr+iDveaYr+e9kee7nOmXrumimFxuNeenkuWQjuWwhumHjeivlSAo6ZSZ6K+v5qyh5pWw77yaJHtjdXJyZW50UmV0cnl9LyR7bWF4UmV0cmllc30pLi4uYCwgZXJyKTsKCQkJCQkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgkJCQkJCQkJCWNvbnNvbGUubG9nKGDjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFHZXRcbumHjeaWsOWwneivleivt+axgi4uLmApOwoJCQkJCQkJCQlzZW5kUmVxdWVzdCgpOyAvLyDph43mlrDlj5HpgIHor7fmsYIKCQkJCQkJCQl9LDUwMDApCgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCXJlamVjdCgn44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRR2V0XG7or7fmsYLlh7rnjrDplJnor6/vvIzlj6/og73mmK/nvZHnu5zpl67pophcbuaXoOazlee7p+e7reivt+axgu+8jOi+vuWIsOacgOWkp+mUmeivr+asoeaVsOOAgicsIGVycik7IC8vIOi+vuWIsOacgOWkp+mHjeivleasoeaVsO+8jOaLkue7nSBQcm9taXNlCgkJCQkJCQl9CgkJCQkJCX0sCgkJCQkJfSk7CgkJCQl9OwoKCQkJCXNlbmRSZXF1ZXN0KCk7IC8vIOWIneWni+ivt+axggoJCQl9KTsKCQl9LAoKCQkvLyDojrflj5bmnIDnu4jpk77mjqUKCQlnZXRGaW5hbFVybCh1cmwsIGhlYWRlcnMsIG1heFJldHJpZXMgPSAxMCwgY3VycmVudFJldHJ5ID0gMCkgewoJCQlyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewoJCQkJY29uc3Qgc2VuZFJlcXVlc3QgPSAoKSA9PiB7CgkJCQkJbGV0IHJlcXVlc3RPYmogPSBHTV94bWxodHRwUmVxdWVzdCh7CgkJCQkJCW1ldGhvZDogIkdFVCIsIHVybCwgaGVhZGVycywKCQkJCQkJb25sb2FkOiAocmVzKSA9PiB7CgkJCQkJCQljb25zb2xlLmxvZygn44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRR2V0IEZpbmFsVXJsXG7or7fmsYLlnLDlnYDvvJonICsgdXJsICsgJ1xu6K+35rGC5aS06YOo77yaJyArIEpTT04uc3RyaW5naWZ5KGhlYWRlcnMpICsgJ1xu6L+U5Zue57uT5p6c77yaJywgcmVzKTsKCQkJCQkJCXJlc29sdmUocmVzLmZpbmFsVXJsKTsKCQkJCQkJfSwKCQkJCQkJb25lcnJvcjogKGVycikgPT4gewoJCQkJCQkJaWYgKGN1cnJlbnRSZXRyeSA8IG1heFJldHJpZXMpIHsKCQkJCQkJCQljdXJyZW50UmV0cnkrKzsKCQkJCQkJCQljb25zb2xlLmVycm9yKGDjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFHZXQgRmluYWxVcmxcbuivt+axguWHuueOsOmUmeivr++8jOWPr+iDveaYr+e9kee7nOmXrumimFxuNeenkuWQjuWwhumHjeivlSAo6ZSZ6K+v5qyh5pWw77yaJHtjdXJyZW50UmV0cnl9LyR7bWF4UmV0cmllc30pLi4uYCk7CgkJCQkJCQkJc2V0VGltZW91dChmdW5jdGlvbigpewoJCQkJCQkJCQljb25zb2xlLmxvZyhg44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRR2V0IEZpbmFsVXJsXG7ph43mlrDlsJ3or5Xor7fmsYIuLi5gKTsKCQkJCQkJCQkJc2VuZFJlcXVlc3QoKTsgLy8g6YeN5paw5Y+R6YCB6K+35rGCCgkJCQkJCQkJfSw1MDAwKQoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlyZWplY3QoJ+OAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkUdldCBGaW5hbFVybFxu6K+35rGC5Ye6546w6ZSZ6K+v77yM5Y+v6IO95piv572R57uc6Zeu6aKYXG7ml6Dms5Xnu6fnu63or7fmsYLvvIzovr7liLDmnIDlpKfplJnor6/mrKHmlbDjgIInLCBlcnIpOyAvLyDovr7liLDmnIDlpKfph43or5XmrKHmlbDvvIzmi5Lnu50gUHJvbWlzZQoJCQkJCQkJfQoJCQkJCQl9LAoJCQkJCX0pOwoJCQkJfTsKCgkJCQlzZW5kUmVxdWVzdCgpOyAvLyDliJ3lp4vor7fmsYIKCQkJfSk7CgkJfSwKCgkJLy8g6I635Y+W6ISa5pys5L+h5oGvCgkJZmV0Y2hTY3JpcHRJbmZvKHVybCwgcmV0cnlDb3VudCkgewoJCQlyZXR1cm4gZmV0Y2godXJsKQoJCQkJLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuanNvbigpKQoJCQkJLnRoZW4oZGF0YSA9PiB7CgkJCQljb25zb2xlLmxvZygn44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRRmV0Y2hcbuivt+axguWcsOWdgO+8micgKyB1cmwgKyAnIChHcmVhc3lGb3JrKVxu6L+U5Zue57uT5p6c77yaJywgZGF0YSk7CgkJCQlyZXR1cm4gZGF0YTsKCQkJfSkKCQkJCS5jYXRjaChlcnJvciA9PiB7CgkJCQljb25zb2xlLmVycm9yKCfjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFGZXRjaFxu6I635Y+W6ISa5pys54mI5pys5pe25Y+R55Sf6ZSZ6K+vJywgZXJyb3IpOwoJCQkJaWYgKHJldHJ5Q291bnQgPiAwKSB7CgkJCQkJY29uc29sZS5sb2coIuOAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkUZldGNoXG4156eS5ZCO5bCG6YeN5paw5bCd6K+V6I635Y+W54mI5pysIik7CgkJCQkJcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MDAwKSkKCQkJCQkJLnRoZW4oKCkgPT4gewoJCQkJCQljb25zb2xlLmxvZygn44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRRmV0Y2hcbumHjeaWsOWwneivleiOt+WPluiEmuacrOS/oeaBry4uLicpOwoJCQkJCQlyZXR1cm4gZmV0Y2hTY3JpcHRJbmZvKHVybCwgcmV0cnlDb3VudCAtIDEpOwoJCQkJCX0pOwoJCQkJfSBlbHNlIHsKCQkJCQljb25zb2xlLmVycm9yKCfjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFGZXRjaFxu6K+35rGC5Ye6546w6ZSZ6K+v77yM5Y+v6IO95piv572R57uc6Zeu6aKYXG7ml6Dms5Xojrflj5bohJrmnKzkv6Hmga/vvIzovr7liLDmnIDlpKflsJ3or5XmrKHmlbDjgIInKTsKCQkJCQl0aHJvdyBlcnJvcjsKCQkJCX0KCQkJfSk7CgkJfSwKCgkJLy8gUlBD5rWL6K+VCgkJYXN5bmMgcnBjVGVzdChkb21haW4sIHBvcnQsIHBhdGgsIHRva2VuKSB7CgkJCXJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CgkJCQlsZXQgcnBjID0geyBkb21haW4sIHBvcnQsIHBhdGgsIHRva2VuIH07CgkJCQlsZXQgdXJsID0gYCR7cnBjLmRvbWFpbn06JHtycGMucG9ydH0ke3JwYy5wYXRofWA7CgkJCQlsZXQgcnBjRGF0YSA9IHsKCQkJCQlpZDogbmV3IERhdGUoKS5nZXRUaW1lKCksCgkJCQkJanNvbnJwYzogJzIuMCcsCgkJCQkJbWV0aG9kOiAnc3lzdGVtLmxpc3RNZXRob2RzJywKCQkJCQlwYXJhbXM6IFtgdG9rZW46JHtycGMudG9rZW59YF0sCgkJCQl9OwoJCQkJR01feG1saHR0cFJlcXVlc3QoewoJCQkJCW1ldGhvZDogIlBPU1QiLCB1cmwsIGhlYWRlcnM6IHt9LCBkYXRhOiBKU09OLnN0cmluZ2lmeShycGNEYXRhKSwKCQkJCQlyZXNwb25zZVR5cGU6ICdqc29uJywKCQkJCQlvbmxvYWQ6IChyZXMpID0+IHsKCQkJCQkJY29uc29sZS5sb2coJ+OAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkVBvc3QgUlBDVGVzdFxu6K+35rGC5Zyw5Z2A77yaJyArIHVybCArICdcbuivt+axgue7k+aenO+8micsIHJlcyk7CgkJCQkJCWlmKHJlcy5yZXNwb25zZSl7CgkJCQkJCQlyZXNvbHZlKCJzdWNjZXNzIik7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlyZXNvbHZlKCJmYWlsIik7CgkJCQkJCX0KCQkJCQl9LAoJCQkJCW9uZXJyb3I6IChlcnIpID0+IHsKCQkJCQkJY29uc29sZS5lcnJvcign44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRUG9zdCBSUENUZXN0XG7or7fmsYLlpLHotKUnLCBlcnIpOwoJCQkJCQlyZXNvbHZlKCJmYWlsIik7CgkJCQkJfSwKCQkJCX0pOwoJCQl9KTsKCQl9LAoKCQlzdHJpbmdpZnkob2JqKSB7CgkJCWxldCBzdHIgPSAnJzsKCQkJZm9yICh2YXIga2V5IGluIG9iaikgewoJCQkJaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CgkJCQkJdmFyIHZhbHVlID0gb2JqW2tleV07CgkJCQkJaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CgkJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsKCQkJCQkJCXN0ciArPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZVtpXSkgKyAnJic7CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQlzdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpICsgJyYnOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlyZXR1cm4gc3RyLnNsaWNlKDAsIC0xKTsgLy8g5Y675o6J5pyr5bC+55qEICImIgoJCX0sCgoJCWFkZFN0eWxlKGlkLCB0YWcsIGNzcykgewoJCQl0YWcgPSB0YWcgfHwgJ3N0eWxlJzsKCQkJbGV0IGRvYyA9IGRvY3VtZW50LCBzdHlsZURvbSA9IGRvYy5nZXRFbGVtZW50QnlJZChpZCk7CgkJCWlmIChzdHlsZURvbSkgc3R5bGVEb20ucmVtb3ZlKCk7CgkJCWxldCBzdHlsZSA9IGRvYy5jcmVhdGVFbGVtZW50KHRhZyk7CgkJCXN0eWxlLnJlbCA9ICdzdHlsZXNoZWV0JzsKCQkJc3R5bGUuaWQgPSBpZDsKCQkJdGFnID09PSAnc3R5bGUnID8gc3R5bGUuaW5uZXJIVE1MID0gY3NzIDogc3R5bGUuaHJlZiA9IGNzczsKCQkJZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF0uYXBwZW5kQ2hpbGQoc3R5bGUpOwoJCX0sCgoJCXNsZWVwKHRpbWUpIHsKCQkJcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCB0aW1lKSk7CgkJfSwKCgkJZmluZFJlYWN0KGRvbSwgdHJhdmVyc2VVcCA9IDApIHsKCQkJY29uc3Qga2V5ID0gT2JqZWN0LmtleXMoZG9tKS5maW5kKGtleSA9PiB7CgkJCQlyZXR1cm4ga2V5LnN0YXJ0c1dpdGgoIl9fcmVhY3RGaWJlciQiKQoJCQkJfHwga2V5LnN0YXJ0c1dpdGgoIl9fcmVhY3RJbnRlcm5hbEluc3RhbmNlJCIpOwoJCQl9KTsKCQkJY29uc3QgZG9tRmliZXIgPSBkb21ba2V5XTsKCQkJaWYgKGRvbUZpYmVyID09IG51bGwpIHJldHVybiBudWxsOwoKCQkJaWYgKGRvbUZpYmVyLl9jdXJyZW50RWxlbWVudCkgewoJCQkJbGV0IGNvbXBGaWJlciA9IGRvbUZpYmVyLl9jdXJyZW50RWxlbWVudC5fb3duZXI7CgkJCQlmb3IgKGxldCBpID0gMDsgaSA8IHRyYXZlcnNlVXA7IGkrKykgewoJCQkJCWNvbXBGaWJlciA9IGNvbXBGaWJlci5fY3VycmVudEVsZW1lbnQuX293bmVyOwoJCQkJfQoJCQkJcmV0dXJuIGNvbXBGaWJlci5faW5zdGFuY2U7CgkJCX0KCgkJCWNvbnN0IEdldENvbXBGaWJlciA9IGZpYmVyID0+IHsKCQkJCWxldCBwYXJlbnRGaWJlciA9IGZpYmVyLnJldHVybjsKCQkJCXdoaWxlICh0eXBlb2YgcGFyZW50RmliZXIudHlwZSA9PSAic3RyaW5nIikgewoJCQkJCXBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuOwoJCQkJfQoJCQkJcmV0dXJuIHBhcmVudEZpYmVyOwoJCQl9OwoJCQlsZXQgY29tcEZpYmVyID0gR2V0Q29tcEZpYmVyKGRvbUZpYmVyKTsKCQkJZm9yIChsZXQgaSA9IDA7IGkgPCB0cmF2ZXJzZVVwOyBpKyspIHsKCQkJCWNvbXBGaWJlciA9IEdldENvbXBGaWJlcihjb21wRmliZXIpOwoJCQl9CgkJCXJldHVybiBjb21wRmliZXIuc3RhdGVOb2RlIHx8IGNvbXBGaWJlcjsKCQl9LAoKCQkvL+azqOWGjOm7mOiupOiuvue9rgoJCWluaXREZWZhdWx0Q29uZmlnKCkgewoJCQlsZXQgdmFsdWUgPSBbewoJCQkJbmFtZTogJ3NldHRpbmdfcnBjX2RvbWFpbicsCgkJCQl2YWx1ZTogJ2h0dHA6Ly9sb2NhbGhvc3QnCgkJCX0sIHsKCQkJCW5hbWU6ICdzZXR0aW5nX3JwY19wb3J0JywKCQkJCXZhbHVlOiAnMTY4MDAnCgkJCX0sIHsKCQkJCW5hbWU6ICdzZXR0aW5nX3JwY19wYXRoJywKCQkJCXZhbHVlOiAnL2pzb25ycGMnCgkJCX0sIHsKCQkJCW5hbWU6ICdzZXR0aW5nX3JwY190b2tlbicsCgkJCQl2YWx1ZTogJycKCQkJfSwgewoJCQkJbmFtZTogJ3NldHRpbmdfcnBjX2RpcicsCgkJCQl2YWx1ZTogJ0Q6XERvd25sb2FkcycKCQkJfSwgewoJCQkJbmFtZTogJ3NldHRpbmdfdGVybWluYWxfdHlwZScsCgkJCQl2YWx1ZTogJ3djJwoJCQl9LCB7CgkJCQluYW1lOiAnc2V0dGluZ190aGVtZV9jb2xvcicsCgkJCQl2YWx1ZTogJyM1NzRBQjgnCgkJCX0sIHsKCQkJCW5hbWU6ICdzZXR0aW5nX2luaXRfY29kZScsCgkJCQl2YWx1ZTogJycKCQkJfSwgewoJCQkJbmFtZTogJ2xpY2Vuc2UnLAoJCQkJdmFsdWU6ICcnCgkJCX0sIHsKCQkJCW5hbWU6ICdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJywKCQkJCXZhbHVlOiAndjInCgkJCX0sIHsKCQkJCW5hbWU6ICdzZXR0aW5nX2JhaWR1X3RoZW1lJywKCQkJCXZhbHVlOiAnbm8nCgkJCX1dOwoKCQkJdmFsdWUuZm9yRWFjaCgodikgPT4gewoJCQkJLy8g5rKh5pyJ5a+55bqU55qE6aG555uu5bCx5re75Yqg5LiK6aG555uuCgkJCQliYXNlLmdldFZhbHVlKHYubmFtZSkgPT09IHVuZGVmaW5lZCAmJiBiYXNlLnNldFZhbHVlKHYubmFtZSwgdi52YWx1ZSk7CgkJCX0pOwoJCX0sCgoJCS8vIOiuvue9rueVjOmdogoJCXNob3dTZXR0aW5nKCkgewoJCQlsZXQgZG9tID0gJycsCgkJCQlidG4gPSAnJywKCQkJCWNvbG9yTGlzdCA9IFsnIzA5QUFGRicsJyNjYzMyMzUnLCcjNjM3ZGY4JywnIzUxOGMxNycsJyNlZDk0NGInLCcjZjk2OWE1JywnI2JjYTI4MCcsJyM1NzRBQjgnLCcjMGQ1M2ZmJywnIzYzN2RmZicsJyMzMTgxZjknLCcjZjhkODAwJywnIzAzOTZmZicsJyMzMmNjYmMnLCcjZjY0MTZjJywnIzIyNzFiMScsJyM1OTUyNGMnLCcjMTAxNzFkJywnIzFkMjMyNycsJyMxOGE0OTcnXSwKCQkJCWNvbG9yTmFtZUxpc3QgPSBbJ+W6puebmDxicj7nu4/lhbjok50nLCfluqbnm5g8YnI+5bmz5a6J57qiJywn5bqm55uYPGJyPumcnuWFiee0qycsJ+W6puebmDxicj7nm47nhLbnu78nLCfluqbnm5g8YnI+5ZGo5bm05qmZJywn5bqm55uYPGJyPuW5uOS8mueyiScsJ+W6puebmDxicj7ljYjlkI7mo5UnLCfluqbnm5g8YnI+5pif56m657SrJywn5aS45YWLPGJyPuaYjuS6ruiTnScsJ+mYv+mHjDxicj7kupHnm5jntKsnLCfnp7vliqg8YnI+5b2p5LqR6JOdJywn5p6c5qC4PGJyPuafoOaqrOm7hCcsJ+aenOaguDxicj7pu5jorqTok50nLCfmnpzmoLg8YnI+56Kn5rOi57u/Jywn5p6c5qC4PGJyPueOq+eRsOe6oicsJ+aWh+a0vjxicj7pu5jorqTok50nLCfmlofmtL48YnI+5ZKW5ZWh54GwJywn5paH5rS+PGJyPum7mOiupOm7kScsJ09wZW5BSTxicj7pu5jorqTpu5EnLCdPcGVuQUk8YnI+6buY6K6k6Z2SJ107CgkJCWRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+UlBD5Li75py6PC9kaXY+PGlucHV0IHR5cGU9InRleHQiICBwbGFjZWhvbGRlcj0i5Li75py65Zyw5Z2A77yM6ZyA5bim5LiKaHR0cChzKTovL++8jOS9huS4jemcgOimgeWGmeerr+WPo+S4jui3r+W+hCIgY2xhc3M9InN3YWwyLWlucHV0IHBsLWlucHV0IGxpc3RlbmVyLWRvbWFpbiIgdmFsdWU9IiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyl9Ij48L2xhYmVsPmA7CgkJCWRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+UlBD56uv5Y+jPC9kaXY+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSLnq6/lj6Plj7fvvIzkvovlpoLvvJpNb3RyaXjkuIvovb3lmajkuLoxNjgwMCIgY2xhc3M9InN3YWwyLWlucHV0IHBsLWlucHV0IGxpc3RlbmVyLXBvcnQiIHZhbHVlPSIke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKX0iPjwvbGFiZWw+YDsKCQkJZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5SUEPot6/lvoQ8L2Rpdj48aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9Iui3r+W+hO+8jOm7mOiupOS4ui9qc29ucnBjIiBjbGFzcz0ic3dhbDItaW5wdXQgcGwtaW5wdXQgbGlzdGVuZXItcGF0aCIgdmFsdWU9IiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpfSI+PC9sYWJlbD5gOwoJCQlkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlJQQ+WvhumSpTwvZGl2PjxpbnB1dCB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0i5peg5a+G6ZKl5peg6ZyA5aGr5YaZIiBjbGFzcz0ic3dhbDItaW5wdXQgcGwtaW5wdXQgbGlzdGVuZXItdG9rZW4iIHZhbHVlPSIke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyl9Ij48L2xhYmVsPmA7CgkJCWRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5L+d5a2Y6Lev5b6EPC9kaXY+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSLmlofku7bkuIvovb3lkI7kv53lrZjot6/lvoTvvIzkvovlpoLvvJpEOiIgY2xhc3M9InN3YWwyLWlucHV0IHBsLWlucHV0IGxpc3RlbmVyLWRpciIgdmFsdWU9IiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJyl9Ij48L2xhYmVsPmA7CgkJCWRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5b2T5YmNUlBDPC9kaXY+PGRpdj48c3BhbiBpZD0icGwtcnBjRG9tYWluIj4ke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpfTwvc3Bhbj46PHNwYW4gaWQ9InBsLXJwY1BvcnQiPiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpfTwvc3Bhbj48c3BhbiBpZD0icGwtcnBjUGF0aCI+JHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyl9PC9zcGFuPjxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0icGwtYnV0dG9uLW1pbmkgc3dhbDItY29uZmlybSBzd2FsMi1zdHlsZWQgbGlzdGVuZXItcnBjLXRlc3QiPua1i+ivlTwvYnV0dG9uPjwvZGl2PjwvbGFiZWw+YDsKCgkJCWNvbG9yTGlzdC5mb3JFYWNoKCh2LCBpKSA9PiB7CgkJCQlidG4gKz0gYDxkaXYgc3R5bGU9ImJhY2tncm91bmQ6ICR7dn07Ym9yZGVyOiAxcHggc29saWQgJHt2fSIgY2xhc3M9InBsLWNvbG9yLWJveCAke3YgPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGhlbWVfY29sb3InKSA/ICdsaXN0ZW5lci1jb2xvcicgOiAnbGlzdGVuZXItY29sb3InfSI+CgkJCQk8ZGl2IGRhdGEtY29sb3I9IiR7dn0iIGNsYXNzPSJwbC1tYXNrIj4ke2NvbG9yTmFtZUxpc3RbaV19ICR7diA9PT0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190aGVtZV9jb2xvcicpID8gJzxzcGFuIGlkPSJwbC10aGlzQ29sb3IiPijlvZPliY0pPC9zcGFuPicgOiAnJ308L2Rpdj4KCQkJPC9kaXY+YDsKCQkJfSk7CgoKCQkJZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7nu4jnq6/nsbvlnos8L2Rpdj48c2VsZWN0IGNsYXNzPSJzd2FsMi1zZWxlY3QgcGwtaW5wdXQgbGlzdGVuZXItdGVybWluYWwiPmA7CgkJCU9iamVjdC5rZXlzKHRlcm1pbmFsVHlwZSkuZm9yRWFjaChrID0+IHsKCQkJCWRvbSArPSBgPG9wdGlvbiB2YWx1ZT0iJHtrfSIgJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKSA9PT0gayA/ICdzZWxlY3RlZCcgOiAnJ30+JHt0ZXJtaW5hbFR5cGVba119PC9vcHRpb24+YDsKCQkJfSk7CgkJCWRvbSArPSBgPC9zZWxlY3Q+PC9sYWJlbD5gOwoKCQkJZG9tICs9YDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlvlrp7pqozpgInpobldPGJyLz7kv67mlLnnmb7luqbnvZHnm5jnlYzpnaLkuLrliqnmiYvkuLvpopjoibI8L2Rpdj48c2VsZWN0IGNsYXNzPSJzd2FsMi1zZWxlY3QgcGwtaW5wdXQgYmFpZHVfdGhlbWUiPmA7CgkJCU9iamVjdC5rZXlzKGJhaWR1dGhlbWUpLmZvckVhY2godmFsdWUgPT4ge2RvbSArPSBgPG9wdGlvbiB2YWx1ZT0iJHt2YWx1ZX0iICR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19iYWlkdV90aGVtZScpID09PSB2YWx1ZSA/ICdzZWxlY3RlZCcgOiAnJ30+JHtiYWlkdXRoZW1lW3ZhbHVlXX08L29wdGlvbj5gO30pOwoJCQlkb20gKz0gYDwvc2VsZWN0PjwvbGFiZWw+YDsKCgkJCWRvbSArPWA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7kvb/nlKjmsrnlsI/njLTmnI3liqHlmag8L2Rpdj48c2VsZWN0IGNsYXNzPSJzd2FsMi1zZWxlY3QgcGwtaW5wdXQgeW91eGlhb2hvdV9zZXJ2ZXIiPmA7CgkJCU9iamVjdC5rZXlzKHlvdXNlcnZlcikuZm9yRWFjaCh2YWx1ZSA9PiB7ZG9tICs9IGA8b3B0aW9uIHZhbHVlPSIke3ZhbHVlfSIgJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09IHZhbHVlID8gJ3NlbGVjdGVkJyA6ICcnfT4ke3lvdXNlcnZlclt2YWx1ZV19PC9vcHRpb24+YDt9KTsKCQkJZG9tICs9IGA8L3NlbGVjdD48L2xhYmVsPmA7CgoJCQlkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPuS4u+mimOminOiJsjwvZGl2PiA8ZGl2IGNsYXNzPSJwbC1jb2xvciI+JHtidG59PC9kaXY+PC9sYWJlbD5gOwoKCQkJZG9tICs9IGA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgc3R5bGU9Im1hcmdpbi10b3A6IDMwcHg7IiBjbGFzcz0icGwtYnV0dG9uLW1pbmkgc3dhbDItZGVueSBzd2FsMi1zdHlsZWQgbGlzdGVuZXItcmVnaXN0ZXIiPueGhOeBreW3sue7j+eCueS6rueahOaMiemSrjwvYnV0dG9uPmAKCgkJCWRvbSA9ICc8ZGl2PicgKyBkb20gKyAnPC9kaXY+JzsKCgkJCVN3YWwuZmlyZSh7CgkJCQl0aXRsZTogJ+WKqeaJi+iuvue9ricsCgkJCQlodG1sOiBkb20sCgkJCQlpY29uOiAnaW5mbycsCgkJCQlpY29uSHRtbDogJ+KamScsCgkJCQlhbGxvd091dHNpZGVDbGljazogZmFsc2UsCgkJCQlzaG93Q2xvc2VCdXR0b246IHRydWUsCgkJCQlzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsCgkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJZm9vdGVyOiBwYW4uZm9vdGVyLAoJCQl9KS50aGVuKChyZXN1bHQpID0+IHsKCQkJCVN3YWwuZmlyZSh7CgkJCQkJdGl0bGU6ICLorr7nva7lt7Lkv53lrZgiLAoJCQkJCWljb246ICdzdWNjZXNzJywKCQkJCQlhbGxvd091dHNpZGVDbGljazogZmFsc2UsCgkJCQkJc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAoJCQkJCXNob3dEZW55QnV0dG9uOiB0cnVlLAoJCQkJCWNvbmZpcm1CdXR0b25UZXh0OiAn5Yi35pawJywKCQkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCQlzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKCQkJCQlodG1sOiBg5bey57uP5L+d5a2Y6K6+572u5LqG5ZOmfiDliLfmlrDlsLHnlJ/mlYjllaYhYCwKCQkJCQlkZW55QnV0dG9uVGV4dDogJ+WPlua2iCcKCQkJCX0pLnRoZW4oKHJlc3VsdCkgPT4gewoJCQkJCWlmIChyZXN1bHQuaXNDb25maXJtZWQpewoJCQkJCQltZXNzYWdlLnN1Y2Nlc3MoJ+WIt+aWsOS4rScpOwoJCQkJCQloaXN0b3J5LmdvKDApOwoJCQkJCX0KCQkJCX0pOwoJCQl9KTsKCgoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1yZWdpc3RlcicsIGFzeW5jIChlKSA9PiB7CgkJCQliYXNlLnJlZ2lzdGVySW5pdENvZGUoMTExMTExKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXJwYy10ZXN0JywgYXN5bmMgKGUpID0+IHsKCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCWxldCBkb21haW4gPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSwKCQkJCQlwb3J0ID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAoJCQkJCXBhdGggPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyksCgkJCQkJdG9rZW4gPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpOwoJCQkJZS50YXJnZXQuaW5uZXJIVE1MID0gIuetieW+hSI7CgkJCQlsZXQgcmVzdWx0ID0gYXdhaXQgYmFzZS5ycGNUZXN0KGRvbWFpbiwgcG9ydCwgcGF0aCwgdG9rZW4pOwoJCQkJaWYgKHJlc3VsdCA9PT0gInN1Y2Nlc3MiKSB7CgkJCQkJZS50YXJnZXQuaW5uZXJIVE1MID0gIuaIkOWKnyI7CgkJCQkJZS50YXJnZXQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gIiM1MmM0MWEiOwoJCQkJfSBlbHNlIHsKCQkJCQllLnRhcmdldC5pbm5lckhUTUwgPSAi5aSx6LSlIjsKCQkJCQllLnRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAiI2NiMTYxNiI7CgkJCQl9CgkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgkJCQkJZS50YXJnZXQuaW5uZXJIVE1MID0gIua1i+ivlSI7CgkJCQkJZS50YXJnZXQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190aGVtZV9jb2xvcicpOwoJCQkJfSw1MDAwKQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItY29sb3InLCBhc3luYyAoZSkgPT4gewoJCQkJaWYoZS50YXJnZXQuZGF0YXNldC5jb2xvcil7CgkJCQkJaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC10aGlzQ29sb3IiKSl7CgkJCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC10aGlzQ29sb3IiKS5yZW1vdmUoKTsKCQkJCQl9CgkJCQkJZS50YXJnZXQuaW5uZXJIVE1MICs9ICc8c3BhbiBpZD0icGwtdGhpc0NvbG9yIj4o5b2T5YmNKTwvc3Bhbj4nOwoJCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfdGhlbWVfY29sb3InLCBlLnRhcmdldC5kYXRhc2V0LmNvbG9yKTsKCQkJCQliYXNlLmFkZFBhbkxpbmtlclN0eWxlKCk7CgkJCQl9CgkJCX0pOwoJCQlkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci1kb21haW4nLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJywgZS50YXJnZXQudmFsdWUpOwoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLXJwY0RvbWFpbiIpLmlubmVySFRNTCA9IGUudGFyZ2V0LnZhbHVlOwoJCQl9KTsKCQkJZG9jLm9uKCdpbnB1dCcsICcubGlzdGVuZXItcG9ydCcsIGFzeW5jIChlKSA9PiB7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JywgZS50YXJnZXQudmFsdWUpOwoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLXJwY1BvcnQiKS5pbm5lckhUTUwgPSBlLnRhcmdldC52YWx1ZTsKCQkJfSk7CgkJCWRvYy5vbignaW5wdXQnLCAnLmxpc3RlbmVyLXBhdGgnLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcsIGUudGFyZ2V0LnZhbHVlKTsKCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1ycGNQYXRoIikuaW5uZXJIVE1MID0gZS50YXJnZXQudmFsdWU7CgkJCX0pOwoJCQlkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci10b2tlbicsIGFzeW5jIChlKSA9PiB7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicsIGUudGFyZ2V0LnZhbHVlKTsKCQkJfSk7CgkJCWRvYy5vbignaW5wdXQnLCAnLmxpc3RlbmVyLWRpcicsIGFzeW5jIChlKSA9PiB7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3JwY19kaXInLCBlLnRhcmdldC52YWx1ZSk7CgkJCX0pOwoJCQlkb2Mub24oJ2NoYW5nZScsICcubGlzdGVuZXItdGVybWluYWwnLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJywgZS50YXJnZXQudmFsdWUpOwoJCQl9KTsKCQkJZG9jLm9uKCdjaGFuZ2UnLCAnLmJhaWR1X3RoZW1lJywgYXN5bmMgKGUpID0+IHsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfYmFpZHVfdGhlbWUnLCBlLnRhcmdldC52YWx1ZSk7CgkJCX0pOwoJCQlkb2Mub24oJ2NoYW5nZScsICcueW91eGlhb2hvdV9zZXJ2ZXInLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicsIGUudGFyZ2V0LnZhbHVlKTsKCQkJfSk7CgkJfSwKCgkJLy8g5omL5py654mI6K6+572u55WM6Z2iCgkJc2hvd1dhcFNldHRpbmcoKSB7CgkJCWxldCBkb20gPSAnJywKCQkJCWJ0biA9ICcnLAoJCQkJY29sb3JMaXN0ID0gWycjMDlBQUZGJywnI2NjMzIzNScsJyM2MzdkZjgnLCcjNTE4YzE3JywnI2VkOTQ0YicsJyNmOTY5YTUnLCcjYmNhMjgwJywnIzU3NEFCOCcsJyMwZDUzZmYnLCcjNjM3ZGZmJywnIzMxODFmOSddLAoJCQkJY29sb3JOYW1lTGlzdCA9IFsn5bqm55uYPGJyPue7j+WFuOiTnScsJ+W6puebmDxicj7lubPlronnuqInLCfluqbnm5g8YnI+6Zye5YWJ57SrJywn5bqm55uYPGJyPuebjueEtue7vycsJ+W6puebmDxicj7lkajlubTmqZknLCfluqbnm5g8YnI+5bm45Lya57KJJywn5bqm55uYPGJyPuWNiOWQjuajlScsJ+W6puebmDxicj7mmJ/nqbrntKsnLCflpLjlhYs8YnI+5piO5Lqu6JOdJywn6Zi/6YeMPGJyPuS6keebmOe0qycsJ+enu+WKqDxicj7lvankupHok50nXTsKCQkJZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5SUEPkuLvmnLo8L2Rpdj48aW5wdXQgdHlwZT0idGV4dCIgIHBsYWNlaG9sZGVyPSLkuLvmnLrlnLDlnYDvvIzpnIDluKbkuIpodHRwKHMpOi8vIiBjbGFzcz0ic3dhbDItaW5wdXQgcGwtaW5wdXQgbGlzdGVuZXItZG9tYWluIiB2YWx1ZT0iJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKX0iPjwvbGFiZWw+YDsKCQkJZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5SUEPnq6/lj6M8L2Rpdj48aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9Iuerr+WPo+WPt++8jOS+i+Wmgu+8mk1vdHJpeOS4ujE2ODAwIiBjbGFzcz0ic3dhbDItaW5wdXQgcGwtaW5wdXQgbGlzdGVuZXItcG9ydCIgdmFsdWU9IiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpfSI+PC9sYWJlbD5gOwoJCQlkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlJQQ+i3r+W+hDwvZGl2PjxpbnB1dCB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0i6Lev5b6E77yM6buY6K6k5Li6L2pzb25ycGMiIGNsYXNzPSJzd2FsMi1pbnB1dCBwbC1pbnB1dCBsaXN0ZW5lci1wYXRoIiB2YWx1ZT0iJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyl9Ij48L2xhYmVsPmA7CgkJCWRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+UlBD5a+G6ZKlPC9kaXY+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSLml6Dlr4bpkqXml6DpnIDloavlhpkiIGNsYXNzPSJzd2FsMi1pbnB1dCBwbC1pbnB1dCBsaXN0ZW5lci10b2tlbiIgdmFsdWU9IiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKX0iPjwvbGFiZWw+YDsKCQkJZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7kv53lrZjot6/lvoQ8L2Rpdj48aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IuaWh+S7tuS4i+i9veWQjuS/neWtmOi3r+W+hO+8jOS+i+Wmgu+8mkQ6IiBjbGFzcz0ic3dhbDItaW5wdXQgcGwtaW5wdXQgbGlzdGVuZXItZGlyIiB2YWx1ZT0iJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kaXInKX0iPjwvbGFiZWw+YDsKCQkJZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7lvZPliY1SUEM8L2Rpdj48ZGl2PjxzcGFuIGlkPSJwbC1ycGNEb21haW4iPiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyl9PC9zcGFuPjo8c3BhbiBpZD0icGwtcnBjUG9ydCI+JHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0Jyl9PC9zcGFuPjxzcGFuIGlkPSJwbC1ycGNQYXRoIj4ke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKX08L3NwYW4+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJwbC1idXR0b24tbWluaSBzd2FsMi1jb25maXJtIHN3YWwyLXN0eWxlZCBsaXN0ZW5lci1ycGMtdGVzdCI+5rWL6K+VPC9idXR0b24+PC9kaXY+PC9sYWJlbD5gOwoKCQkJY29sb3JMaXN0LmZvckVhY2goKHYsIGkpID0+IHsKCQkJCWJ0biArPSBgPGRpdiBzdHlsZT0iYmFja2dyb3VuZDogJHt2fTtib3JkZXI6IDFweCBzb2xpZCAke3Z9IiBjbGFzcz0icGwtY29sb3ItYm94ICR7diA9PT0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190aGVtZV9jb2xvcicpID8gJ2xpc3RlbmVyLWNvbG9yJyA6ICdsaXN0ZW5lci1jb2xvcid9Ij4KCQkJCTxkaXYgZGF0YS1jb2xvcj0iJHt2fSIgY2xhc3M9InBsLW1hc2siPiR7Y29sb3JOYW1lTGlzdFtpXX0gJHt2ID09PSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3RoZW1lX2NvbG9yJykgPyAnPHNwYW4gaWQ9InBsLXRoaXNDb2xvciI+KOW9k+WJjSk8L3NwYW4+JyA6ICcnfTwvZGl2PgoJCQk8L2Rpdj5gOwoJCQl9KTsKCgoJCQlkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPue7iOerr+exu+WeizwvZGl2PjxzZWxlY3QgY2xhc3M9InN3YWwyLXNlbGVjdCBwbC1pbnB1dCBsaXN0ZW5lci10ZXJtaW5hbCI+YDsKCQkJT2JqZWN0LmtleXModGVybWluYWxUeXBlKS5mb3JFYWNoKGsgPT4gewoJCQkJZG9tICs9IGA8b3B0aW9uIHZhbHVlPSIke2t9IiAke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpID09PSBrID8gJ3NlbGVjdGVkJyA6ICcnfT4ke3Rlcm1pbmFsVHlwZVtrXX08L29wdGlvbj5gOwoJCQl9KTsKCQkJZG9tICs9IGA8L3NlbGVjdD48L2xhYmVsPmA7CgoJCQlkb20gKz1gPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+W+WunumqjOmAiemhuV08YnIvPuS/ruaUueeZvuW6pue9keebmOeVjOmdouS4uuWKqeaJi+S4u+mimOiJsjwvZGl2PjxzZWxlY3QgY2xhc3M9InN3YWwyLXNlbGVjdCBwbC1pbnB1dCBiYWlkdV90aGVtZSI+YDsKCQkJT2JqZWN0LmtleXMoYmFpZHV0aGVtZSkuZm9yRWFjaCh2YWx1ZSA9PiB7ZG9tICs9IGA8b3B0aW9uIHZhbHVlPSIke3ZhbHVlfSIgJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX2JhaWR1X3RoZW1lJykgPT09IHZhbHVlID8gJ3NlbGVjdGVkJyA6ICcnfT4ke2JhaWR1dGhlbWVbdmFsdWVdfTwvb3B0aW9uPmA7fSk7CgkJCWRvbSArPSBgPC9zZWxlY3Q+PC9sYWJlbD5gOwoKCQkJZG9tICs9YDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPuS9v+eUqOayueWwj+eMtOacjeWKoeWZqDwvZGl2PjxzZWxlY3QgY2xhc3M9InN3YWwyLXNlbGVjdCBwbC1pbnB1dCB5b3V4aWFvaG91X3NlcnZlciI+YDsKCQkJT2JqZWN0LmtleXMoeW91c2VydmVyKS5mb3JFYWNoKHZhbHVlID0+IHtkb20gKz0gYDxvcHRpb24gdmFsdWU9IiR7dmFsdWV9IiAke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gdmFsdWUgPyAnc2VsZWN0ZWQnIDogJyd9PiR7eW91c2VydmVyW3ZhbHVlXX08L29wdGlvbj48L3NlbGVjdD48L2xhYmVsPmA7fSk7CgoJCQlkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPuS4u+mimOminOiJsjwvZGl2PiA8ZGl2IGNsYXNzPSJwbC1jb2xvciI+JHtidG59PC9kaXY+PC9sYWJlbD5gOwoKCQkJZG9tICs9IGA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InBsLWJ1dHRvbi1taW5pIHN3YWwyLWRlbnkgc3dhbDItc3R5bGVkIGxpc3RlbmVyLXJlZ2lzdGVyIj7nhoTnga3lt7Lnu4/ngrnkuq7nmoTmjInpkq48L2J1dHRvbj5gCgoJCQlkb20gPSAnPGRpdj4nICsgZG9tICsgJzwvZGl2Pic7CgoJCQlTd2FsLmZpcmUoewoJCQkJdGl0bGU6ICfliqnmiYvorr7nva4nLAoJCQkJaHRtbDogZG9tLAoJCQkJaWNvbjogJ2luZm8nLAoJCQkJaWNvbkh0bWw6ICfimpknLAoJCQkJc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAoJCQkJc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLAoJCQkJaGVpZ2h0QXV0bzogZmFsc2UsCgkJCQlzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKCQkJCWZvb3RlcjogcGFuLmZvb3RlciwKCQkJfSkudGhlbigocmVzdWx0KSA9PiB7CgkJCQlTd2FsLmZpcmUoewoJCQkJCXRpdGxlOiAi6K6+572u5bey5L+d5a2YIiwKCQkJCQlpY29uOiAnc3VjY2VzcycsCgkJCQkJYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAoJCQkJCXNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKCQkJCQlzaG93RGVueUJ1dHRvbjogdHJ1ZSwKCQkJCQljb25maXJtQnV0dG9uVGV4dDogJ+WIt+aWsCcsCgkJCQkJaGVpZ2h0QXV0bzogZmFsc2UsCgkJCQkJc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCgkJCQkJaHRtbDogYOW3sue7j+S/neWtmOiuvue9ruS6huWTpn4g5Yi35paw5bCx55Sf5pWI5ZWmIWAsCgkJCQkJZGVueUJ1dHRvblRleHQ6ICflj5bmtognCgkJCQl9KS50aGVuKChyZXN1bHQpID0+IHsKCQkJCQlpZiAocmVzdWx0LmlzQ29uZmlybWVkKXsKCQkJCQkJbWVzc2FnZS5zdWNjZXNzKCfliLfmlrDkuK0nKTsKCQkJCQkJaGlzdG9yeS5nbygwKTsKCQkJCQl9CgkJCQl9KTsKCQkJfSk7CgoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1yZWdpc3RlcicsIGFzeW5jIChlKSA9PiB7CgkJCQliYXNlLnJlZ2lzdGVySW5pdENvZGUoMTExMTExKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWNvbG9yJywgYXN5bmMgKGUpID0+IHsKCQkJCWlmKGUudGFyZ2V0LmRhdGFzZXQuY29sb3IpewoJCQkJCWlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtdGhpc0NvbG9yIikpewoJCQkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtdGhpc0NvbG9yIikucmVtb3ZlKCk7CgkJCQkJfQoJCQkJCWUudGFyZ2V0LmlubmVySFRNTCArPSAnPHNwYW4gaWQ9InBsLXRoaXNDb2xvciI+KOW9k+WJjSk8L3NwYW4+JzsKCQkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3RoZW1lX2NvbG9yJywgZS50YXJnZXQuZGF0YXNldC5jb2xvcik7CgkJCQkJYmFzZS5hZGRQYW5MaW5rZXJTdHlsZSgpOwoJCQkJfQoJCQl9KTsKCQkJZG9jLm9uKCdpbnB1dCcsICcubGlzdGVuZXItZG9tYWluJywgYXN5bmMgKGUpID0+IHsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicsIGUudGFyZ2V0LnZhbHVlKTsKCQkJfSk7CgkJCWRvYy5vbignaW5wdXQnLCAnLmxpc3RlbmVyLXBvcnQnLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcsIGUudGFyZ2V0LnZhbHVlKTsKCQkJfSk7CgkJCWRvYy5vbignaW5wdXQnLCAnLmxpc3RlbmVyLXBhdGgnLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcsIGUudGFyZ2V0LnZhbHVlKTsKCQkJfSk7CgkJCWRvYy5vbignaW5wdXQnLCAnLmxpc3RlbmVyLXRva2VuJywgYXN5bmMgKGUpID0+IHsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJywgZS50YXJnZXQudmFsdWUpOwoJCQl9KTsKCQkJZG9jLm9uKCdpbnB1dCcsICcubGlzdGVuZXItZGlyJywgYXN5bmMgKGUpID0+IHsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RpcicsIGUudGFyZ2V0LnZhbHVlKTsKCQkJfSk7CgkJCWRvYy5vbignY2hhbmdlJywgJy5saXN0ZW5lci10ZXJtaW5hbCcsIGFzeW5jIChlKSA9PiB7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnLCBlLnRhcmdldC52YWx1ZSk7CgkJCX0pOwoJCQlkb2Mub24oJ2NoYW5nZScsICcuYmFpZHVfdGhlbWUnLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19iYWlkdV90aGVtZScsIGUudGFyZ2V0LnZhbHVlKTsKCQkJfSk7CgkJCWRvYy5vbignY2hhbmdlJywgJy55b3V4aWFvaG91X3NlcnZlcicsIGFzeW5jIChlKSA9PiB7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJywgZS50YXJnZXQudmFsdWUpOwoJCQl9KTsKCQl9LAoKCQlzaG93SW5mbygpIHsKCQkJbGV0IGhpZGVpbmZvPScnOwoJCQloaWRlaW5mbyArPWA8c3Bhbj7ku6XkuIvlhoXlrrnpg73mmK/ohJrmnKzoh6rlt7Hmo4DmtYvliLDnmoTkv6Hmga88YnI+5pys6aG16Z2i5LuF5L2c5Li66LCD6K+V5L2/55SoPHNwYW4+YDsKCQkJaGlkZWluZm8gKz1gPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+W+WGhee9rl08YnIvPuiEmuacrOeJiOacrDwvZGl2PiR7cmVhbHZlcnNpb259PC9sYWJlbD5gOwoJCQloaWRlaW5mbyArPWA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5b5LiK5oqlXTxici8+6ISa5pys54mI5pysPC9kaXY+JHt2ZXJzaW9ufTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz1gPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+W+WGhee9rl08YnIvPuiEmuacrOS9nOiAhTwvZGl2PiR7cmVhbGF1dGhvcn08L2xhYmVsPmA7CgkJCWhpZGVpbmZvICs9YDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlvkuIrmiqVdPGJyLz7ohJrmnKzkvZzogIU8L2Rpdj4ke2F1dGhvcn08L2xhYmVsPmA7CgkJCWhpZGVpbmZvICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5b5LiL5Y+RXTxici8+5Yid5aeL5YyW5pqX5Y+3PC9kaXY+JHtwYW4ubnVtfTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlvkuIvlj5FdPGJyLz7liJ3lp4vljJbljY/orq48L2Rpdj4ke3Bhbi5saWNlbnNlfTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlvkuIvlj5FdPGJyLz5VQeS7o+eQhjwvZGl2PiR7cGFuLnVhfTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlvkuIvlj5FdPGJyLz7lhazkvJflj7flnLDlnYA8L2Rpdj4ke3Bhbi5pbWd9PC9sYWJlbD5gOwoJCQloaWRlaW5mbyArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+W+S4i+WPkV08YnIvPue9keebmOS4h+iDveWKqeaJizwvZGl2PiR7cGFuLmFzc2lzdGFudH08L2xhYmVsPmA7CgkJCWhpZGVpbmZvICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5b5LiL5Y+RXTxici8+572R55uYQ0ROPC9kaXY+JHtwYW4ubWlycm9yfTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlvkuIvlj5FdPGJyLz5SUEPnrqHnkIY8L2Rpdj4ke3Bhbi5kfTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlvkuIvlj5FdPGJyLz5JRE3ku4vnu408L2Rpdj4ke3Bhbi5pZG19PC9sYWJlbD5gOwoJCQloaWRlaW5mbyArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+W+S4i+WPkV08YnIvPuaPkOekuuaWh+acrDwvZGl2PjDjgIEke3Bhbi5pbml0WzBdfTxicj4x44CBJHtwYW4uaW5pdFsxXX08YnI+MuOAgSR7cGFuLmluaXRbMl19PGJyPjPjgIEke3Bhbi5pbml0WzNdfTxicj4044CBJHtwYW4uaW5pdFs0XX08YnI+NeOAgSR7cGFuLmluaXRbNV19PC9sYWJlbD5gOwoJCQloaWRlaW5mbyArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+W+WGhee9rl08YnIvPlRvYXN06aG16ISaPC9kaXY+JHtwYW4uZm9vdGVyfTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gPSAnPGRpdj4nICsgaGlkZWluZm8gKyAnPC9kaXY+JzsKCgkJCVN3YWwuZmlyZSh7CgkJCQlpY29uOiAnaW5mbycsCgkJCQl0aXRsZTogJ+iwg+ivleS/oeaBrycsCgkJCQlodG1sOiBoaWRlaW5mbywKCQkJCWFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKCQkJCXNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCgkJCQljb25maXJtQnV0dG9uVGV4dDogJ+WFs+mXrScKCQkJfSk7CgkJfSwKCgkJc2hvd1BhbkluZm8oKSB7CgkJCWxldCBoaWRlaW5mbz0nJzsKCQkJaGlkZWluZm8gKz1gPHNwYW4+5pys6aG16Z2i5LuF5L2c5Li66LCD6K+V5L2/55SoPHNwYW4+YDsKCQkJaGlkZWluZm8gKz1gPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+54mI5pysPC9kaXY+JHtyZWFsdmVyc2lvbn08L2xhYmVsPmA7CgkJCWhpZGVpbmZvICs9YDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPuS9nOiAhTwvZGl2PiR7cmVhbGF1dGhvcn08L2xhYmVsPmA7CgkJCWhpZGVpbmZvICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7liJ3lp4vljJbmmpflj7c8L2Rpdj4ke3Bhbi5udW19PC9sYWJlbD5gOwoJCQloaWRlaW5mbyArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5Yid5aeL5YyW5Y2P6K6uPC9kaXY+JHtwYW4ubGljZW5zZX08L2xhYmVsPmA7CgkJCWhpZGVpbmZvICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7lhazkvJflj7flnLDlnYA8L2Rpdj4ke3Bhbi5pbWd9PC9sYWJlbD5gOwoJCQloaWRlaW5mbyArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+572R55uY5LiH6IO95Yqp5omLPC9kaXY+JHtwYW4uYXNzaXN0YW50fTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlJQQ+euoeeQhjwvZGl2PiR7cGFuLmR9PC9sYWJlbD5gOwoJCQloaWRlaW5mbyArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+SURN5LuL57uNPC9kaXY+JHtwYW4uaWRtfTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gPSAnPGRpdj4nICsgaGlkZWluZm8gKyAnPC9kaXY+JzsKCgkJCVN3YWwuZmlyZSh7CgkJCQlpY29uOiAnaW5mbycsCgkJCQl0aXRsZTogJ+iwg+ivleS/oeaBrycsCgkJCQlodG1sOiBoaWRlaW5mbywKCQkJCWFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKCQkJCXNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCgkJCQljb25maXJtQnV0dG9uVGV4dDogJ+WFs+mXrScKCQkJfSk7CgkJfSwKCgkJc2hvd1VwZGF0ZUxvZygpIHsKCQkJU3dhbC5maXJlKHsKCQkJCWljb246ICdpbmZvJywKCQkJCXRpdGxlOiAn5pu05paw5pel5b+XKOWFs+mXreaMiemSruWcqOS4i+mdouWTpiknLAoJCQkJaHRtbDogYDxzcGFuPgoJCQkJVjEuMC44LjM8YnI+MeOAgemAgumFjemYv+mHjOS6keebmOaWsOWfn+WQjWFsaXBhbi5jb23jgII8YnI+PGJyPgoJCQkJVjEuMC44LjI8YnI+MeOAgeabtOaNouaWsOWbvuagh+OAgjxicj48YnI+CgkJCQlWMS4wLjguMTxicj4x44CB5L+u5aSN5Zug6YeN5aSN57uR5a6a5oyJ6ZKu6ICM5a+86Ie0UlBD5LiL6L295Lya5Y+R6YCB5aSa5p2h5LiL6L296K+35rGC55qEQnVn77ybPGJyPjLjgIHpgInmi6nkuI3kvb/nlKjmsrnlsI/njLTmnI3liqHlmajml7bvvIzigJznlKhnaHByb3h56L+e5o6lR2l0aHVi5LuT5bqT4oCd5pu05o2i5Li64oCc55SoanNkZWxpdnLov57mjqVHaXRodWLku5PlupPigJ3vvJs8YnI+M+OAgei3n+i/m+WumOaWuVY2LjEuNOeJiOacrO+8jOS/ruWkjeenu+WKqOe9keebmOaXoOazleiOt+WPlumTvuaOpe+8jOaUr+aMgemYv+mHjOS6keebmOaWsOWfn+WQjWFsaXBhbi5jb23jgII8YnI+PGJyPgoJCQkJVjEuMC44PGJyPjHjgIHkv67lpI3ov4Xpm7fnvZHnm5jml6Dms5Xli77pgInmlofku7bjgII8YnI+PGJyPgoJCQkJVjEuMC43Ljk8YnI+MeOAgeabtOaWsOeyvueugOe9keebmOWFg+e0oOWMuemFjeinhOWIme+8jOmYsuatouWboOmAmuefpeaoquadoeiAjOWvvOiHtOS4jeiDveeCueWIsOKAnEFQSeS4i+i9veKAneS7peS4i+eahOaMiemSruOAgjxicj48YnI+CgkJCQlWMS4wLjcuODxicj4x44CB6Lef6L+b5a6Y5pa5VjYuMS4y77yM5Yqg5YWlVjLmjqXlj6PjgII8YnI+MuOAgeS/ruWkjeeZvuW6pue9keebmOS4i+i9veaXtuWboOS4uuiOt+WPluS4jeWIsGFjY2Vzc1Rva2Vu6ICM5LiA55u06L2s5ZyI44CCPGJyPjxicj4KCQkJCVYxLjAuNy43PGJyPjHjgIHkv67lpI3nmb7luqbnvZHnm5jnmoTmjInpkq7kvJrlm6DkuLrkuLvpopjkuI3lkIzogIzooqvmlLnlj5jpopzoibLnmoRCdWfvvJs8YnI+MuOAgeabtOaWsOWkuOWFi+e9keebmOaMiemSruS4jueVjOmdouOAgjxicj48YnI+CgkJCQlWMS4wLjcuNjxicj4x44CB5L+u5aSN4oCc5rOo5YWl4oCd5Yqf6IO977ybPGJyPjLjgIHpu5HmmpfmqKHlvI/mlK/mjIHpmo/orr7nva7ng63liIfmjaLjgII8YnI+PGJyPgoJCQkJVjEuMC43LjU8YnI+MeOAgeS/ruWkjemYv+mHjOS6keebmOS4i+i9vemAu+i+ke+8mzxicj4y44CB57K+566A5Luj56CB77ybPGJyPjPjgIHmlK/mjIHmt7HoibLmqKHlvI/vvJs8YnI+NOOAgeS/ruaUuemDqOWIhuaPkOekuuaWh+acrO+8mzxicj4144CB5L+u5pS56YOo5YiGQ1NT77ybPGJyPjbjgIHorr7nva7lj6/mtYvor5VSUEPov57mjqXjgII8YnI+PGJyPgoJCQkJVjEuMC43LjQ8YnI+MeOAgeS8mOWMluS4i+i9vemAu+i+ke+8mzxicj4y44CB5L+u5aSN6Zi/6YeM5LqR55uY5peg5rOV5L2/55SoQVBJ5LiL6L2944CCPGJyPjxicj4KCQkJCVYxLjAuNy4zPGJyPjHjgIHlpoLmnpzlh7rnjrDnvZHnu5zor7fmsYLplJnor6/ml7bmlK/mjIHoh6rliqjph43mlrDor7fmsYLvvJs8YnI+MuOAgeWPr+mAieaLqeaYr+WQpuS9v+eUqOayueWwj+eMtOacjeWKoeWZqOOAgjxicj48YnI+CgkJCQlWMS4wLjcuMjxicj4x44CB5L+u5aSN5L2/55SoUlBD5LiL6L295pe25Lya6YeN5aSN5Y+R6YCB6ZO+5o6l55qEQnVn44CCPGJyPjxicj4KCQkJCVYxLjAuNy4xPGJyPjHjgIFb5a6e6aqM5Yqf6IO977yM5LiN5b2x5ZON5q2j5bi45L2/55SoXeaUr+aMgeeZvuW6pue9keebmOaJi+acuue9kemhteeJiO+8jOWLvumAieaWh+S7tuWQjuWPr+WcqOmhtuagj+aJvuWIsOKAnOS4i+i9veWKqeaJi+KAneaMiemSruOAgjxicj48YnI+CgkJCQlWMS4wLjc8YnI+MeOAgemHjeaehOWkuOWFi+e9keebmOOAgemYv+mHjOS6keebmOaMiemSruOAgjxicj48YnI+CgkJCQlWMS4wLjYuOTxicj4x44CB5LiL6L2956qX5Y+j5Yqg5YWl5YWz6Zet5oyJ6ZKu44CCPGJyPjxicj4KCQkJCVYxLjAuNi44PGJyPjHjgIHkv67lpI3lpLjlhYvnvZHnm5jmjInpkq7plJnkvY3jgII8YnI+PGJyPgoJCQkJVjEuMC42Ljc8YnI+MeOAgeWwhueZvuW6pue9keebmOeVjOmdouS/ruaUueS4uuS4u+mimOiJsu+8jOWPr+WcqOiuvue9rumAieaLqeaYr+WQpuS/ruaUue+8mzxicj4y44CB5aKe5Yqg5Li76aKY6Imy5ZCN56ew77yM5pu05pS56YOo5YiG5YaF5a656aKc6Imy77ybPGJyPjPjgIHnp7vliqjkupHnm5hBUEnkuIvovb3mlK/mjIHmibnph4/lpI3liLbvvJs8YnI+NOOAgeS8mOWMluaOp+WItuWPsOi+k+WHuue7k+aenO+8mzxicj4144CB55m+5bqm572R55uYQVBJ5LiL6L295LiN5L2/55SoSURN5pe25Y+v5Lul5pi+56S65Ymp5L2Z5pe26Ze077ybPGJyPjbjgIHigJzlj5bmtojngrnkuq7mjInpkq7igJ3mjInpkq7nmoTkvY3nva7njrDlt7Lnp7vliqjliLDorr7nva7pobXpnaLjgII8YnI+N+OAgWhvbW/nibnmnInnmoTlvanom4vlj4jlm57mnaXlipso5ZacKeOAgjxicj48YnI+CgkJCQlWMS4wLjYuNjxicj4x44CB5L+u5aSN5pqX5Y+36ZSZ6K+v44CCPGJyPjxicj4KCQkJCVYxLjAuNi41PGJyPjHjgIHkv67lpI3ljbPkvb/ovpPlhaXmraPnoa7mmpflj7fkuZ/kuI3og73miJDlip/ngrnkuq7mjInpkq7nmoTmnI3liqHlmajplJnor6/jgII8YnI+PGJyPgoJCQkJVjEuMC42LjQ8YnI+MeOAgei3n+i/m+WumOaWuVY2LjEuMeeJiOacrO+8jOS/ruWkjemYv+mHjOS6keebmOiOt+WPluS4i+i9vemTvuaOpeaXtueahOmXrumimOOAgjxicj48YnI+CgkJCQlWMS4wLjYuMzxicj4x44CB54Wn6aG+5bCP5bGP5bmV55So5oi377yM5bCG5aeL57uI5pi+56S65aSN5Yi25YWo6YOo6ZO+5o6l55qE5oyJ6ZKu77ybPGJyPjLjgIHlop7liqDlj5bmtojkuIvovb3ml7bnmoTliqjnlLvjgII8YnI+PGJyPgoJCQkJVjEuMC42LjI8YnI+MeOAgeS/ruWkjemDqOWIhueVjOmdoumUmeS9je+8jOWunueOsENTU+WGhee9ru+8mzxicj4y44CB55m+5bqm572R55uY55WM6Z2i5bCG5Y+Y5b6X5pu05Yqg566A5rSB44CCPGJyPjxicj4KCQkJCVYxLjAuNi4xPGJyPjHjgIHmlrDlop7nmb7luqbkupHnm5hBUEnkuIvovb3mlK/mjIHlpI3liLbpk77mjqXvvJs8YnI+MuOAgeS4uuS6hueFp+mhvuaJi+acuua1j+iniOWZqOeUqOaIt++8jOWinuWkp+mhueebruS5i+mXtOmXtOmame+8jOaWsOWinumakOiXj0lETeaPkOekuumAiemhue+8jOWPr+WcqOWKqeaJi+iuvue9ruS4reWQr+eUqO+8mzxicj4z44CB5L+u5pS5Q1NT77yM55WM6Z2i5Lya5Ye6546w5pu05aSa55qE5Li76aKY6Imy77ybPGJyPjTjgIHmlK/mjIHlnKjmuLjlsI/njLTlrpjnvZHmn6XnnIvmmpflj7fvvJs8YnI+NeOAgeS/ruWkjemDqOWIhuivreazlemUmeivr+OAgjxicj48YnI+CgkJCQlWMS4wLjY8YnI+MeOAgeS/ruWkjeS6huaJk+W8gOmYv+mHjOS6keebmOWIhuS6q+i/nuaOpeaXtuWboOS4i+i9veenu+WKqOerr+W5v+WRiuWvvOiHtOWPquiDveeCueWHu0FQSeS4i+i9ve+8mzxicj4y44CB6Lef6L+b5a6Y5pa5Ni4wLjTniYjmnKzvvIzkv67lpI3lpLjlhYvnvZHnm5jojrflj5bkuIvovb3pk77mjqXlpLHmlYjjgIHmlK/mjIHnp7vliqjkupHnm5jjgII8YnI+PGJyPgoJCQkJVjEuMC41LjU8YnI+MeOAgeaEn+iwojxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9OaWdodC1zdGFycy0xIj5OaWdodC1zdGFycy0xPC9hPueahOW4ruWKqe+8jOS/ruWkjeWboOS4uuWOn+S9nOiAheacjeWKoeWZqOWvvOiHtOeahOWIneWni+WMluaal+WPt+ivhuWIq+mUmeivr++8mzxicj4y44CB5L+u5pS55LiA5Lqb5paH5pys5Lul5Y+K5o+Q5L6b57uZ5pyN5Yqh5Zmo55qE5L+h5oGv44CCPGJyPjxicj4KCQkJCVYxLjAuNS40PGJyPjHjgIHlsI/kv67lsI/mlLljc3PvvIzorqnkuLvpopjoibLlh7rnjrDlnKjmm7TlpJrlnLDmlrnvvJs8YnI+MuOAgeS/ruaUueS4i+i9vemTvuaOpeiOt+WPluWksei0peeahOaPkOekuu+8mzxicj4z44CB5aKe5Yqg5pu05aSa55qE5Li76aKY6Imy77yM5Y+v5Zyo5Yqp5omL6K6+572u5p+l55yL77ybPGJyPjTjgIFob21v5b2p6JuL6KKr5Yig5Y675Yqb77yI5oKy77yJ44CCPGJyPjxicj4KCQkJCVYxLjAuNS4zPGJyPjHjgIHkv67llabkv67llabvvIzpmL/ph4zkupHnm5jlj6/ku6XmkbjliLDkuIvovb3oj5zljZXkuobjgII8YnI+PGJyPgoJCQkJVjEuMC41LjI8YnI+MeOAgeWinuWKoOiEmuacrOS/oeaBr+iPnOWNle+8iOayoeacieeUqO+8ie+8mzxicj4y44CB5LyY5YyW6Zi/6YeM5LqR55uY5pi+56S6c3Zn5Zu+54mH77ybPGJyPjPjgIHkv67mlLnlvLnnqpfmjInpkq7popzoibLjgII8YnI+PGJyPgoJCQkJVjEuMC41LjE8YnI+MeOAgeS/ruWkjeWcqOWIh+aNouaMiemSruS4u+mimOWQjuWkuOWFi+e9keebmOS4jeiDveato+W4uOaYvuekuuaMiemSruOAgjxicj48YnI+CgkJCQlWMS4wLjU8YnI+MeOAgei3n+i/m+WumOaWuVY1LjAuNOeJiOacrO+8mzxicj4y44CB5bCP5pS55Yqo77yM54Wn552A5a6Y5pa554mI5pys5pu05q2j5paH5Lu25ZCN56ew5qOA5rWL77ybPGJyPjPjgIHkv53nlZnlvanom4vvvIzkvYblv4XpobvoiI3lvIPlrpjmlrnmmpflj7fjgII8YnI+PGJyPgoJCQkJVjEuMC40PGJyPuWkp+aUue+8gTxicj4x44CB5L+u5aSN5LqG5Y6f5L2c6ICF55WZ5LiL55qE5aS45YWL572R55uY5YiH5o2i5paH5Lu25aS55bCx5aSa5LiA5Liq4oCc5LiL6L295Yqp5omL4oCd5oyJ6ZKu55qE5aSnQlVH77ybPGJyPjLjgIHnu4jkuo7mnaXkuobvvIzlnKjkuIvovb3oj5zljZXlop7liqDigJzliqnmiYvorr7nva7igJ3igJzmm7TmlrDml6Xlv5figJ3mjInpkq7vvJs8YnI+44CQ5YaN5Lmf5LiN55So54K56L+b5rK554y0566h55CG5YaN6L+b6K6+572u5LqGKOS/neeVmeayueeMtOeuoeeQhuWGheiuvue9rinjgJE8YnI+M+OAgeS/ruaUuemYv+mHjOS6keebmOWSjOWkuOWFi+e9keebmOS4i+i9veWKqeaJi+aMiemSruagt+W8j++8mzxicj4044CB5aKe5Yqg4oCc5Y+W5raI54K55Lqu5oyJ6ZKu4oCd5rK554y06I+c5Y2V77ybPGJyPjXjgIHkv67mlLnpg6jliIZjc3PvvIzkvb/lhbbkuI7pgInmi6nnmoTkuLvpopjmm7TotLTliIfjgII8YnI+PGJyPgoJCQkJVjEuMC4zPGJyPjHjgIHlop7liqDkuIDkuKrlsI/lvanom4vvvJsg5o+Q56S677yaPGJyPmhvbW/vvIjpnIDlnKjmnKrngrnkuq7mjInpkq7nirbmgIHop6blj5HvvIk8YnI+44CQ6ZyA6KaB6YeN5paw5oGi5aSN5oyJ6ZKu5Li65pyq54K55Lqu54q25oCB6K+36L+b5YWlIOW3suWuieijheiEmuacrC0+57yW6L6RLT7lvIDlj5HogIUtPumHjee9ruWIsOWHuuWOgi0+56Gu5a6a44CRPGJyPjLjgIHkv67mlLkv5aKe5Yqg6buY6K6k5Li76aKY6Imy44CCPGJyPjxicj4KCQkJCVYxLjAuMjxicj4x44CB5L+u5pS55bm25Yqg5a6955WM6Z2i77yM6LCD5pW06YOo5YiGY3Nz77yM5L2/U3dlZXRhbGVydDLnlYzpnaLmm7Tnvo7op4LvvIzmm7TkuI7ljp/niYjnm7jov5HvvJs8YnI+MuOAgeS/ruaUuemDqOWIhuaPkOekuuaWh+Wtl++8jOS9v+aWh+Wtl+abtOWuueaYk+WkjeWItuOAgiA8YnI+PGJyPgoJCQkJVjEuMC4xPGJyPjHjgIHljrvpmaTmm7TmlrDmj5DnpLrvvJs8YnI+MuOAgeabtOaWsFN3ZWV0YWxlcnQy6IezMTHniYjmnKzvvJs8YnI+M+OAgemDqOWIhkNETuiKgueCueabtOaNouS4umpzZGVsaXZy44CCPGJyPjxicj4KCQkJCVYxLjAuMDxicj4x44CB5aKe5Yqg4oCc5rOo5YWl4oCd5Yqf6IO977yIYnVzaGnvvInvvJs8YnI+MuOAgeWOu+mZpOW5v+WRiuOAggoJCQkJPC9zcGFuPmAsCgkJCQlhbGxvd091dHNpZGVDbGljazogZmFsc2UsCgkJCQlzaG93Q2xvc2VCdXR0b246IGZhbHNlLAoJCQkJaGVpZ2h0QXV0bzogZmFsc2UsCgkJCQlzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKCQkJCWNvbmZpcm1CdXR0b25UZXh0OiAn5oiR5bey6ZiFJywKCQkJfSk7CgkJfSwKCgkJY3JlYXRlVGlwKCkgewoJCQkkKCdib2R5JykuYXBwZW5kKCc8ZGl2IGNsYXNzPSJwbC10b29sdGlwIj48L2Rpdj4nKTsKCgkJCWRvYy5vbignbW91c2VlbnRlciBtb3VzZWxlYXZlJywgJy5saXN0ZW5lci10aXAnLCAoZSkgPT4gewoJCQkJaWYgKGUudHlwZSA9PT0gJ21vdXNlZW50ZXInKSB7CgkJCQkJbGV0IGZpbGVuYW1lID0gZS5jdXJyZW50VGFyZ2V0LmlubmVyVGV4dDsKCQkJCQlsZXQgc2l6ZSA9IGUuY3VycmVudFRhcmdldC5kYXRhc2V0LnNpemU7CgkJCQkJbGV0IHRpcCA9IGAke2ZpbGVuYW1lfTxzcGFuIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDtjb2xvcjogJHtjb2xvcn0iPiR7c2l6ZX08L3NwYW4+YDsKCQkJCQkkKGUuY3VycmVudFRhcmdldCkuY3NzKHtvcGFjaXR5OiAnMC41J30pOwoJCQkJCSQoJy5wbC10b29sdGlwJykuaHRtbCh0aXApLmNzcyh7CgkJCQkJCSdsZWZ0JzogZS5wYWdlWCArIDEwICsgJ3B4JywKCQkJCQkJJ3RvcCc6IGUucGFnZVkgLSBlLmN1cnJlbnRUYXJnZXQub2Zmc2V0VG9wID4gMTQgPyBlLnBhZ2VZICsgJ3B4JyA6IGUucGFnZVkgKyAyMCArICdweCcKCQkJCQl9KS5zaG93KCk7CgkJCQl9IGVsc2UgewoJCQkJCSQoZS5jdXJyZW50VGFyZ2V0KS5jc3Moe29wYWNpdHk6ICcxJ30pOwoJCQkJCSQoJy5wbC10b29sdGlwJykuaGlkZSgwKTsKCQkJCX0KCQkJfSk7CgkJfSwKCgkJY3JlYXRlTG9hZGluZygpIHsKCQkJcmV0dXJuICQoJzxkaXYgY2xhc3M9InBsLWxvYWRpbmciPjxkaXYgY2xhc3M9InBsLWxvYWRpbmctYm94Ij48ZGl2PjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4nKTsKCQl9LAoKCQljcmVhdGVEb3dubG9hZElmcmFtZSgpIHsKCQkJbGV0ICRkaXYgPSAkKCc8ZGl2IHN0eWxlPSJwYWRkaW5nOjA7bWFyZ2luOjA7ZGlzcGxheTpibG9jayI+PC9kaXY+Jyk7CgkJCWxldCAkaWZyYW1lID0gJCgnPGlmcmFtZSBzcmM9ImphdmFzY3JpcHQ6OyIgaWQ9ImRvd25sb2FkSWZyYW1lIiBzdHlsZT0iZGlzcGxheTpub25lIj48L2lmcmFtZT4nKTsKCQkJJGRpdi5hcHBlbmQoJGlmcmFtZSk7CgkJCSQoJ2JvZHknKS5hcHBlbmQoJGRpdik7CgkJfSwKCgkJZ2V0TWlycm9yTGlzdChsaW5rLCBtaXJyb3IsIHRocmVhZCA9IDIpIHsKCQkJbGV0IGhvc3QgPSBuZXcgVVJMKGxpbmspLmhvc3Q7CgkJCWxldCBtaXJyb3JzID0gW107CgkJCWZvciAobGV0IGkgPSAwOyBpIDwgbWlycm9yLmxlbmd0aDsgaSsrKSB7CgkJCQlmb3IgKGxldCBqID0gMDsgaiA8IHRocmVhZDsgaisrKSB7CgkJCQkJbGV0IGl0ZW0gPSBsaW5rLnJlcGxhY2UoaG9zdCwgbWlycm9yW2ldKSArICcmJy5yZXBlYXQoaik7CgkJCQkJbWlycm9ycy5wdXNoKGl0ZW0pOwoJCQkJfQoJCQl9CgkJCXJldHVybiBtaXJyb3JzLmpvaW4oJ1xuJyk7CgkJfSwKCgkJbGlzdGVuRWxlbWVudChlbGVtZW50LCBjYWxsYmFjaykgewoJCQlsZXQgY2hlY2tJbnRlcnZhbCA9IDUwMDsgLy8g5qOA5p+l5YWD57Sg55qE6Ze06ZqU5pe26Ze077yI5q+r56eS77yJCgkJCWxldCB3YXNFbGVtZW50Rm91bmQgPSBmYWxzZTsgLy8g55So5LqO6Lef6Liq5YWD57Sg5piv5ZCm5LmL5YmN5bey57uP5om+5YiwCgoJCQlmdW5jdGlvbiBjaGVja0VsZW1lbnQoKSB7CgkJCQlpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50KSkgewoJCQkJCXdhc0VsZW1lbnRGb3VuZCA9IHRydWU7CgkJCQkJY2FsbGJhY2soKTsKCQkJCX0gZWxzZSBpZiAod2FzRWxlbWVudEZvdW5kKSB7CgkJCQkJd2FzRWxlbWVudEZvdW5kID0gZmFsc2U7IC8vIOWFg+e0oOa2iOWkseWQjumHjee9ruagh+W/lwoJCQkJfQoKCQkJCXNldFRpbWVvdXQoY2hlY2tFbGVtZW50LCBjaGVja0ludGVydmFsKTsKCQkJfQoJCQljaGVja0VsZW1lbnQoKTsKCQl9LAoKCQlhZGRQYW5MaW5rZXJTdHlsZSgpIHsKCQkJY29sb3IgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3RoZW1lX2NvbG9yJyk7CgoJCQlsZXQgc3dhbGNzcyA9IGAKCQkJLnN3YWwyLWxvYWRlcntkaXNwbGF5Om5vbmU7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6Mi4yZW07aGVpZ2h0OjIuMmVtO21hcmdpbjowIDEuODc1ZW07LXdlYmtpdC1hbmltYXRpb246c3dhbDItcm90YXRlLWxvYWRpbmcgMS41cyBsaW5lYXIgMHMgaW5maW5pdGUgbm9ybWFsO2FuaW1hdGlvbjpzd2FsMi1yb3RhdGUtbG9hZGluZyAxLjVzIGxpbmVhciAwcyBpbmZpbml0ZSBub3JtYWw7Ym9yZGVyLXdpZHRoOi4yNWVtO2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItcmFkaXVzOjEwMCU7Ym9yZGVyLWNvbG9yOiR7Y29sb3J9IHRyYW5zcGFyZW50ICR7Y29sb3J9IHRyYW5zcGFyZW50IH0KCQkJLnN3YWwyLXN0eWxlZC5zd2FsMi1jb25maXJte2JvcmRlcjowO2JvcmRlci1yYWRpdXM6LjI1ZW07YmFja2dyb3VuZDppbml0aWFsO2JhY2tncm91bmQtY29sb3I6JHtjb2xvcn07Y29sb3I6I2ZmZjtmb250LXNpemU6MWVtfQoJCQkuc3dhbDItc3R5bGVkLnN3YWwyLWNvbmZpcm06Zm9jdXN7Ym94LXNoYWRvdzowIDAgMCAzcHggJHtjb2xvcn04MCB9CgkJCS5zd2FsMi10aW1lci1wcm9ncmVzcy1iYXItY29udGFpbmVye3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO2dyaWQtY29sdW1uOmF1dG87b3ZlcmZsb3c6aGlkZGVuO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjVweDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjVweH0KCQkJLnN3YWwyLXRpbWVyLXByb2dyZXNzLWJhcnt3aWR0aDoxMDAlO2hlaWdodDouMjVlbTtiYWNrZ3JvdW5kOiR7Y29sb3J9MzMgfQoJCQkuc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgLnN3YWwyLXByb2dyZXNzLXN0ZXB7ei1pbmRleDoyMDtmbGV4LXNocmluazowO3dpZHRoOjJlbTtoZWlnaHQ6MmVtO2JvcmRlci1yYWRpdXM6MmVtO2JhY2tncm91bmQ6JHtjb2xvcn07Y29sb3I6I2ZmZjtsaW5lLWhlaWdodDoyZW07dGV4dC1hbGlnbjpjZW50ZXJ9CgkJCS5zd2FsMi1wcm9ncmVzcy1zdGVwcyAuc3dhbDItcHJvZ3Jlc3Mtc3RlcC5zd2FsMi1hY3RpdmUtcHJvZ3Jlc3Mtc3RlcHtiYWNrZ3JvdW5kOiR7Y29sb3J9IH0KCQkJLnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwLWxpbmV7ei1pbmRleDoxMDtmbGV4LXNocmluazowO3dpZHRoOjIuNWVtO2hlaWdodDouNGVtO21hcmdpbjowIC0xcHg7YmFja2dyb3VuZDoke2NvbG9yfX0KCQkJLnN3YWwyLXBvcHVwIHtwYWRkaW5nOjAgMCAxLjI1ZW07ZmxleC1kaXJlY3Rpb246Y29sdW1ufQoJCQkuc3dhbDItY2xvc2Uge3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3JpZ2h0OjB9CgkJCWRpdjp3aGVyZSguc3dhbDItY29udGFpbmVyKSAuc3dhbDItaHRtbC1jb250YWluZXJ7bWFyZ2luOiAxZW0gMS4zZW0gMC4zZW07fQoJCQlgOwoKCQkJLy8g5YWI55uR5ZCs6aKc6Imy5pa55qGI5Y+Y5YyWIFBhbmxpbmtlci1Td2VldEFsZXJ0Mi1EZWZhdWx0CgkJCXdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykuYWRkTGlzdGVuZXIoKGUpID0+IHsKCQkJCWlmIChlLm1hdGNoZXMpIHsKCQkJCQkvLyDliIfmjaLliLDmmpfoibLkuLvpopgKCQkJCQl0aGlzLmFkZFN0eWxlKCdzd2FsLXB1Yi1zdHlsZScsICdzdHlsZScsIEdNX2dldFJlc291cmNlVGV4dCgnU3dhbERhcmsnKSk7CgkJCQl9IGVsc2UgewoJCQkJCS8vIOWIh+aNouWIsOa1heiJsuS4u+mimAoJCQkJCXRoaXMuYWRkU3R5bGUoJ3N3YWwtcHViLXN0eWxlJywgJ3N0eWxlJywgR01fZ2V0UmVzb3VyY2VUZXh0KCdTd2FsJykpOwoJCQkJfQoJCQkJdGhpcy5hZGRTdHlsZSgnUGFubGlua2VyLVN3ZWV0QWxlcnQyLVVzZXInLCAnc3R5bGUnLCBzd2FsY3NzKTsKCQkJfSk7CgkJCS8vIOWGjeS/ruaUueS4u+mimCBQYW5saW5rZXItU3dlZXRBbGVydDItRGVmYXVsdAoJCQlpZiAod2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5tYXRjaGVzKSB7CgkJCQkvLyDliIfmjaLliLDmmpfoibLkuLvpopgKCQkJCXRoaXMuYWRkU3R5bGUoJ3N3YWwtcHViLXN0eWxlJywgJ3N0eWxlJywgR01fZ2V0UmVzb3VyY2VUZXh0KCdTd2FsRGFyaycpKTsKCQkJfSBlbHNlIHsKCQkJCS8vIOWIh+aNouWIsOa1heiJsuS4u+mimAoJCQkJdGhpcy5hZGRTdHlsZSgnc3dhbC1wdWItc3R5bGUnLCAnc3R5bGUnLCBHTV9nZXRSZXNvdXJjZVRleHQoJ1N3YWwnKSk7CgkJCX0KCQkJdGhpcy5hZGRTdHlsZSgnUGFubGlua2VyLVN3ZWV0QWxlcnQyLVVzZXInLCAnc3R5bGUnLCBzd2FsY3NzKTsKCgoJCQlsZXQgdWljc3MgPSBgCgkJCWJvZHk6Oi13ZWJraXQtc2Nyb2xsYmFyIHsgZGlzcGxheTogbm9uZSB9CgkJCTo6LXdlYmtpdC1zY3JvbGxiYXIgeyB3aWR0aDogNnB4OyBoZWlnaHQ6IDEwcHggfQoJCQk6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsgYm9yZGVyLXJhZGl1czogMDsgYmFja2dyb3VuZDogbm9uZSB9CgkJCTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgeyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDg1LDg1LDg1LC40KSB9CgkJCTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIsOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7IGJvcmRlci1yYWRpdXM6IDVweDsgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDAgNnB4IHJnYmEoMCwwLDAsLjIpIH0KCQkJOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6IHJnYmEoODUsODUsODUsLjMpIH0KCQkJLnN3YWwyLXBvcHVwIHsgZm9udC1zaXplOiAxNnB4IH0KCQkJLnBsLXBvcHVwIHsgZm9udC1zaXplOiAxMnB4OyB3aWR0aDogOTAlO30KCQkJLnBsLXBvcHVwIGEgeyBjb2xvcjogJHtjb2xvcn07IH0KCQkJLnBsLWhlYWRlciB7IHBhZGRpbmc6IDA7YWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlOyBtYXJnaW46IDAgMCAxMHB4OyBwYWRkaW5nOiAwIDAgNXB4OyB9CgkJCS5wbC10aXRsZSB7IGZvbnQtc2l6ZTogMTZweDsgbGluZS1oZWlnaHQ6IDE7d2hpdGUtc3BhY2U6IG5vd3JhcDsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7fQoJCQkucGwtY29udGVudCB7IHBhZGRpbmc6IDA7IGZvbnQtc2l6ZTogMTJweDsgfQoJCQkucGwtbWFpbiB7IGJhY2tncm91bmQtY29sb3I6JHtjb2xvcn0xNTtvdmVyZmxvdzphdXRvOyBib3JkZXItcmFkaXVzOiA1cHg7IG1heC1oZWlnaHQ6Y2FsYygke2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHR9cHggLSAyNTBweCk7fQoJCQkucGwtZm9vdGVyIHtmb250LXNpemU6IDE1cHg7IG1hcmdpbi10b3A6IDEwcHg7IHBhZGRpbmctdG9wOiA1cHg7IGNvbG9yOiAjZjU2YzZjOyB0ZXh0LWFsaWduOiBjZW50ZXI7fQoJCQkucGwtaXRlbSB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGxpbmUtaGVpZ2h0OiAyMnB4OyBoZWlnaHQ6IDUwcHg7IGJhY2tncm91bmQtY29sb3I6ICR7Y29sb3J9MzA7IGJvcmRlci1yYWRpdXM6IDVweDsgbWFyZ2luOiA4cHggNnB4OyB9CgkJCS5wbC1pdGVtLW5hbWUgeyBmbGV4OiAwIDAgMTcwcHg7IHRleHQtYWxpZ246IGxlZnQ7bWFyZ2luOiA2cHg7IG92ZXJmbG93OiBoaWRkZW47IHdoaXRlLXNwYWNlOiBub3dyYXA7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyBjdXJzb3I6ZGVmYXVsdDsgaGVpZ2h0OiAzMHB4O30KCQkJLnBsLWl0ZW0tbGluayB7IGZsZXg6IDE7IHRleHQtYWxpZ246IGxlZnQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO2N1cnNvcjpwb2ludGVyOyBvdmVyZmxvdzogaGlkZGVuOyB9CgkJCS5wbC1pdGVtLWJ0biB7IGJhY2tncm91bmQ6ICR7Y29sb3J9OyBib3JkZXItcmFkaXVzOiAzcHg7IGNvbG9yOiAjZmZmZmZmOyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMTJweDsgb3V0bGluZTogbm9uZTsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IG1hcmdpbjogNnB4IDZweDsgcGFkZGluZzogMC42MjVlbSAxLjFlbTsgfQoJCQkucGwtaXRlbS10aXAgeyBkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47ZmxleDogMTsgfQoJCQkucGwtYmFjayB7IHdpZHRoOiA3MHB4OyBiYWNrZ3JvdW5kOiAjZGRkOyBib3JkZXItcmFkaXVzOiAzcHg7IGN1cnNvcjpwb2ludGVyOyBtYXJnaW46MXB4IDZweDsgY29sb3I6ICMwMDA7IH0KCQkJLnBsLWV4dCB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgd2lkdGg6IDQ0cHg7IGJhY2tncm91bmQ6ICM5OTk7IGNvbG9yOiAjZmZmOyBoZWlnaHQ6IDE2cHg7IGxpbmUtaGVpZ2h0OiAxNnB4OyBmb250LXNpemU6IDEycHg7IGJvcmRlci1yYWRpdXM6IDNweDt9CgkJCS5wbC1yZXRyeSB7cGFkZGluZzogM3B4IDEwcHg7IGJhY2tncm91bmQ6ICNjYzMyMzU7IGNvbG9yOiAjZmZmOyBib3JkZXItcmFkaXVzOiAzcHg7IGN1cnNvcjogcG9pbnRlcjt9CgkJCS5wbC1icm93c2VyZG93bmxvYWQgeyBwYWRkaW5nOiAzcHggMTBweDsgYmFja2dyb3VuZDogJHtjb2xvcn07IGNvbG9yOiAjZmZmOyBib3JkZXItcmFkaXVzOiAzcHg7IGN1cnNvcjogcG9pbnRlcjt9CgkJCS5wbC1pdGVtLXByb2dyZXNzIHsgZGlzcGxheTpmbGV4O2ZsZXg6IDE7YWxpZ24taXRlbXM6Y2VudGVyfQoJCQkucGwtcHJvZ3Jlc3MgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTt3aWR0aDogMTAwJTsgYm94LXNpemluZzogYm9yZGVyLWJveDtsaW5lLWhlaWdodDogMTtwb3NpdGlvbjogcmVsYXRpdmU7aGVpZ2h0OjE1cHg7IGZsZXg6IDF9CgkJCS5wbC1wcm9ncmVzcy1vdXRlciB7IGhlaWdodDogMTVweDtib3JkZXItcmFkaXVzOiAxMDBweDtiYWNrZ3JvdW5kLWNvbG9yOiAjYzFjMWMxYTE7b3ZlcmZsb3c6IGhpZGRlbjtwb3NpdGlvbjogcmVsYXRpdmU7dmVydGljYWwtYWxpZ246IG1pZGRsZTt9CgkJCS5wbC1wcm9ncmVzcy1pbm5lcnsgcG9zaXRpb246IGFic29sdXRlO2xlZnQ6IDA7dG9wOiAwO2JhY2tncm91bmQtY29sb3I6ICR7Y29sb3J9O3RleHQtYWxpZ246IGNlbnRlcjtib3JkZXItcmFkaXVzOiAxMDBweDtsaW5lLWhlaWdodDogMTt3aGl0ZS1zcGFjZTogbm93cmFwO3RyYW5zaXRpb246IHdpZHRoIC42cyBlYXNlO2hlaWdodDogMTVweH0KCQkJLnBsLXByb2dyZXNzLWlubmVyLXRleHQgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTtjb2xvcjogI2ZmZmZmZjtmb250LXNpemU6IDEycHg7bWFyZ2luOiAwIDVweDtoZWlnaHQ6IDE1cHh9CgkJCS5wbC1wcm9ncmVzcy10aXB7IGZsZXg6MTsgdGV4dC1hbGlnbjpyaWdodH0KCQkJLnBsLXByb2dyZXNzLWhvd3sgZmxleDogMCAwIDEwMHB4OyBiYWNrZ3JvdW5kOiAjZGRkOyBib3JkZXItcmFkaXVzOiAzcHg7IG1hcmdpbi1sZWZ0OiAxMHB4OyBjdXJzb3I6IHBvaW50ZXI7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IzAwMDt9CgkJCS5wbC1wcm9ncmVzcy1zdG9weyBmbGV4OiAwIDAgODBweDsgYmFja2dyb3VuZDogI2NjMzIzNTsgY3Vyc29yOiBwb2ludGVyOyBtYXJnaW46IDZweCA2cHggNnB4IDEwcHg7IGZvbnQtc2l6ZTogMTJweDsgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IGNvbG9yOiAjZmZmZmZmOyBvdXRsaW5lOiBub25lOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgcGFkZGluZzogMC42MjVlbSAxLjFlbTt9CgkJCS5wbC1wcm9ncmVzcy1pbm5lci10ZXh0OmFmdGVyIHsgZGlzcGxheTogaW5saW5lLWJsb2NrO2NvbnRlbnQ6ICIiO2hlaWdodDogMTAwJTt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO30KCQkJLnBsLWJ0bi1wcmltYXJ5IHsgYmFja2dyb3VuZDogJHtjb2xvcn07IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNHB4OyBjb2xvcjogI2ZmZmZmZjsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDEycHg7IG91dGxpbmU6IG5vbmU7IGRpc3BsYXk6ZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IG1hcmdpbjogNnB4IDZweDsgcGFkZGluZzogMC42MjVlbSAxLjFlbTt0cmFuc2l0aW9uOiAwLjNzIG9wYWNpdHk7IH0KCQkJLnBsLWJ0bi1wcmltYXJ5OmhvdmVyIHsgb3BhY2l0eTogMC45O3RyYW5zaXRpb246IDAuM3Mgb3BhY2l0eTsgfQoJCQkucGwtYnRuLXN1Y2Nlc3MgeyBiYWNrZ3JvdW5kOiAjNTVhZjI4OyBhbmltYXRpb246IGVhc2VPcGFjaXR5IDEuMnMgMjsgYW5pbWF0aW9uLWZpbGwtbW9kZTpmb3J3YXJkcyB9CgkJCS5wbC1idG4taW5mbyB7IGJhY2tncm91bmQ6ICM2MDYyNjY7IH0KCQkJLnBsLWJ0bi13YXJuaW5nIHsgYmFja2dyb3VuZDogI2RhOTMyODsgfQoJCQkucGwtYnRuLXdhcm5pbmcgeyBiYWNrZ3JvdW5kOiAjZGE5MzI4OyB9CgkJCS5wbC1idG4tZGFuZ2VyIHsgYmFja2dyb3VuZDogI2NjMzIzNTsgfQoJCQkucGwtYnV0dG9uLW1pbmkge3BhZGRpbmc6IDVweCAxMHB4OyB9CgkJCS5wbC1kcm9wZG93bi1tZW51LWl0ZW0ge2hlaWdodDogMzBweDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGN1cnNvcjogcG9pbnRlcjsgY29sb3I6ICR7Y29sb3J9OyB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO30KCQkJLnBsLWRyb3Bkb3duLW1lbnUtaXRlbTpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6ICR7Y29sb3J9MTU7fQoJCQkucGwtYnV0dG9uLW1vZGUge3BhZGRpbmc6IDBwOyBwYWRkaW5nLWxlZnQ6IDBweCAhaW1wb3J0YW50OyBjb2xvcjogJHtjb2xvcn0gIWltcG9ydGFudDsgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTt9CgkJCS5wbC1idXR0b24tbW9kZTpob3ZlciB7YmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcn0zMyAhaW1wb3J0YW50O30KCQkJLnBsLWJ1dHRvbiwgLnBsLWRyb3Bkb3duLW1lbnUgeyB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO30KCQkJLnBsLWJ1dHRvbiAucGwtZHJvcGRvd24tbWVudSB7IGRpc3BsYXk6IG5vbmU7fQoJCQkucGwtYnV0dG9uOmhvdmVyIC5wbC1kcm9wZG93bi1tZW51IHsgZGlzcGxheTogYmxvY2s7IH0KCQkJLnBsLWJ1dHRvbi1pbml0IHsgb3BhY2l0eTogMC41OyBhbmltYXRpb246IGVhc2VJbml0T3BhY2l0eSAxLjJzIDM7IGFuaW1hdGlvbi1maWxsLW1vZGU6Zm9yd2FyZHMgfQoJCQlAa2V5ZnJhbWVzIGVhc2VJbml0T3BhY2l0eSB7IGZyb20geyBvcGFjaXR5OiAwLjU7IH0gNTAlIHsgb3BhY2l0eTogMSB9IHRvIHsgb3BhY2l0eTogMC41OyB9IH0KCQkJQGtleWZyYW1lcyBlYXNlT3BhY2l0eSB7IGZyb20geyBvcGFjaXR5OiAxOyB9IDUwJSB7IG9wYWNpdHk6IDAuMzUgfSB0byB7IG9wYWNpdHk6IDE7IH0gfQoJCQkuYmFpZHUtYnV0dG9uIHtiYWNrZ3JvdW5kOiAke2NvbG9yfSAhaW1wb3J0YW50OyBib3JkZXItY29sb3I6ICR7Y29sb3J9ICFpbXBvcnRhbnQ7IGJvcmRlcjogMXB4IHNvbGlkICR7Y29sb3J9ICFpbXBvcnRhbnQ7fQoJCQkuYmFpZHUtYnV0dG9uOmhvdmVyIHsgYmFja2dyb3VuZDogJHtjb2xvcn1iMCAhaW1wb3J0YW50OyBib3JkZXItY29sb3I6ICR7Y29sb3J9ICFpbXBvcnRhbnQ7fQoJCQloZWFkZXJbc3R5bGU9ImRpc3BsYXk6IG5vbmU7Il0gfiAjcGwtYnV0dG9uLWxpbmsgewoJCQkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCQkJcG9zaXRpb246IGZpeGVkOwoJCQkJdG9wOiAwLjZlbTsKCQkJCWxlZnQ6IDY1JTsKCQkJCXotaW5kZXg6IDk5OTk5OwoJCQl9CgkJCS5iYWlkdS13YXAtYnV0dG9uIHtkaXNwbGF5OiBub25lOyBjb2xvcjogJHtjb2xvcn07IGZvbnQtc2l6ZTogLjI4cmVtOyBwYWRkaW5nOiAwLjNlbTt9CgkJCS5iYWlkdS13YXAtYnV0dG9uOmFmdGVyIHtjb250ZW50OiAi5LiL6L295Yqp5omLIjt9CgkJCS5iYWlkdS13YXAtbW9kZSB7cGFkZGluZzogMTBweCAwcHg7fQoJCQkuYWxpLWJ1dHRvbiB7Ym9yZGVyOiAwIHNvbGlkIHRyYW5zcGFyZW50O2ZvbnQtc2l6ZTogMTRweDttYXJnaW4tbGVmdDogMjBweDtwYWRkaW5nOiAxcHggMTJweDtwb3NpdGlvbjogcmVsYXRpdmU7aGVpZ2h0OiAzMnB4O3dpZHRoOiAzMnB4O2JhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMjkuMTJkZWcsICR7Y29sb3J9IDAlLCByZ2JhKDk5LCAxMjUsIDI1NSwgMC43NSkgMTAwJSk7Ym9yZGVyLXJhZGl1czogMTAwcHg7ZGlzcGxheTogZmxleDthbGlnbi1pdGVtczogY2VudGVyO2p1c3RpZnktY29udGVudDogY2VudGVyO2NvbG9yOiB2YXIoLS1iYXNpY193aGl0ZSk7Y3Vyc29yOiBwb2ludGVyO3RyYW5zaXRpb246IGFsbCAuM3MgZWFzZTt9CgkJCS5hbGktYnV0dG9uOmhvdmVyIHtiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTI5LjEyZGVnLCAjNDQ2ZGZmIDAlLCAke2NvbG9yfSAxMDAlKTt9CgkJCS5hbGktYnRuLWljb24ge3ZlcnRpY2FsLWFsaWduOiAtMC4yZW07fQoJCQkudGlhbnlpLWJ1dHRvbiB7bWFyZ2luLXJpZ2h0OiAyMHB4OyBwYWRkaW5nOiA0cHggMTJweDsgYm9yZGVyLXJhZGl1czogNHB4OyBjb2xvcjogI2ZmZjsgZm9udC1zaXplOiAxMnB4OyBib3JkZXI6IDFweCBzb2xpZCAke2NvbG9yfTsgYmFja2dyb3VuZDogJHtjb2xvcn07IGN1cnNvcjogcG9pbnRlcjsgcG9zaXRpb246IHJlbGF0aXZlO30KCQkJLnRpYW55aS1idXR0b246aG92ZXIge2JvcmRlci1jb2xvcjogJHtjb2xvcn1iMDsgYmFja2dyb3VuZDogJHtjb2xvcn1iMDt9CgkJCS55aWRvbmctYnV0dG9uIHtmbG9hdDogbGVmdDsgcG9zaXRpb246IHJlbGF0aXZlOyBtYXJnaW46IDIwcHggMjRweCAyMHB4IDA7IHdpZHRoOiAxMTBweDsgaGVpZ2h0OiAzNnB4OyBiYWNrZ3JvdW5kOiAke2NvbG9yfTsgYm9yZGVyLXJhZGl1czogMnB4OyBmb250LXNpemU6IDE0cHg7IGNvbG9yOiAjZmZmOyBsaW5lLWhlaWdodDogMzlweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjdXJzb3I6IHBvaW50ZXI7fQoJCQkueWlkb25nLXNoYXJlLWJ1dHRvbiB7ZGlzcGxheTogaW5saW5lLWJsb2NrOyBwb3NpdGlvbjogcmVsYXRpdmU7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDM2cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICNmZmY7IGJvcmRlcjogMXB4IHNvbGlkICR7Y29sb3J9OyBib3JkZXItcmFkaXVzOiAycHg7IHBhZGRpbmc6IDAgMjRweDsgYmFja2dyb3VuZDogJHtjb2xvcn07fQoJCQkueWlkb25nLXNoYXJlLWJ1dHRvbjpob3ZlciB7YmFja2dyb3VuZDogJHtjb2xvcn1iMDt9CgkJCS55aWRvbmctYnV0dG9uOmhvdmVyIHtiYWNrZ3JvdW5kOiAke2NvbG9yfWIwO30KCQkJLnlpZG9uZy1idG4geyBiYWNrZ3JvdW5kOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDZ0FBQUFvQ0FNQUFBQzdJRWhmQUFBQUFYTlNSMElCMmNrc2Z3QUFBQWx3U0ZsekFBQUxFd0FBQ3hNQkFKcWNHQUFBQUdOUVRGUkZBQUFBLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9ta1VOb0FBQUFDRjBVazVUQUFiSFBQOUFNUnRyOVB3clY4enFYZm1OZ0RPREhUTEQ0aUp4aEdKSjhaMjY5bTBhRGdBQUFNWkpSRUZVZUp6ZDBzc09neUFRQlZEVUs3NHJXcTBQRlAzL3J5eHFUTWRHcUp0dXZHSEQ1Q1REVEdEczNuRmMxN2tFUGNDN0JIM0F0L1Rqdms1QVliQlUrTmNyd2doTDR1UURrM2d0UlNGMUtXQ0NRRXBnaGtkKzNqcC9JQ05Rb0RBTlUwQVFDSlFtV0FKM2g4K3EzbUZkdlN5d1FkdHRzR3ZSV0dBUExSZW9IWHJiRzZXV0F6Qm9KKzNEYUNuV0kzOU5MYmN2c3p2TGV1VEIyZllvcWJOQk5vN3NHanprMzFCaE1zRUppdHhtaUtrOHpTUXdFOGdGakJHY051Q3pPbWRxUHJpYjVBMkpSUTdxSzlnK2hRQUFBQUJKUlU1RXJrSmdnZz09KTsgaGVpZ2h0OiAyMHB4OyBsaW5lLWhlaWdodDogMjBweDsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OyBiYWNrZ3JvdW5kLXNpemU6IDIwcHggMjBweDsgdGV4dC1pbmRlbnQ6IDI1cHg7fQoJCQkueHVubGVpLWJ1dHRvbiB7ZGlzcGxheTogaW5saW5lLWZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtib3JkZXI6IDAgc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJhZGl1czogNXB4O2JveC1zaGFkb3c6IDAgMCAwIDAgdHJhbnNwYXJlbnQ7d2lkdGg6IGZpdC1jb250ZW50O3doaXRlLXNwYWNlOiBub3dyYXA7ZmxleC1zaHJpbms6IDA7Zm9udC1zaXplOiAxNHB4O2xpbmUtaGVpZ2h0OiAxLjU7b3V0bGluZTogMDt0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjt0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIC4zcyBlYXNlLGNvbG9yIC4zcyBlYXNlLGJvcmRlciAuM3MgZWFzZSxib3gtc2hhZG93IC4zcyBlYXNlO2NvbG9yOiAjZmZmO2JhY2tncm91bmQ6ICR7Y29sb3J9O21hcmdpbi1sZWZ0OiAxMnB4O3BhZGRpbmc6IDBweCAxMnB4O3Bvc2l0aW9uOiByZWxhdGl2ZTsgY3Vyc29yOnBvaW50ZXI7IGhlaWdodDogMzZweDt9CgkJCS54dW5sZWktYnV0dG9uOmhvdmVyIHtiYWNrZ3JvdW5kOiAke2NvbG9yfWIwO30KCQkJLnF1YXJrLWJ1dHRvbiB7YmFja2dyb3VuZDogJHtjb2xvcn0gIWltcG9ydGFudDsgYmFja2dyb3VuZC1jb2xvcjoke2NvbG9yfSAhaW1wb3J0YW50O30KCQkJLnF1YXJrLWJ1dHRvbjpob3ZlciB7IGJhY2tncm91bmQ6ICR7Y29sb3J9YjAgIWltcG9ydGFudDsgYmFja2dyb3VuZC1jb2xvcjoke2NvbG9yfWIwICFpbXBvcnRhbnQ7fQoJCQkucXVhcmstYnRuLWljb24ge3dpZHRoOiAyMHB4OyBoZWlnaHQ6IDIwcHg7IHZlcnRpY2FsLWFsaWduOiAtMC4zZW07fQoJCQkuZWxlbWVudC1jbGlja2VkIHsgb3BhY2l0eTogMC41OyB9CgkJCS5wbC1leHRyYSB7IG1hcmdpbi10b3A6IDEwcHg7ZGlzcGxheTpmbGV4fQoJCQkucGwtZXh0cmEgYnV0dG9uIHsgZmxleDogMX0KCQkJLnBvaW50ZXIgeyBjdXJzb3I6cG9pbnRlciB9CgkJCS5wbC1zZXR0aW5nLWxhYmVsIHsgZGlzcGxheTogZmxleDthbGlnbi1pdGVtczogY2VudGVyO2p1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtwYWRkaW5nLXRvcDogMTBweDsgfQoJCQkucGwtbGFiZWwgeyBmbGV4OiAwIDAgMTAwcHg7dGV4dC1hbGlnbjpsZWZ0OyB9CgkJCS5wbC1pbnB1dCB7IGZsZXg6IDE7IHBhZGRpbmc6IDhweCAxMHB4ICFpbXBvcnRhbnQ7IGJvcmRlcjogMXB4IHNvbGlkICNjMmMyYzI7IGJvcmRlci1yYWRpdXM6IDVweDsgZm9udC1zaXplOiAxNHB4ICFpbXBvcnRhbnQ7IG1pbi13aWR0aDogMzAwcHg7IG1hcmdpbjogMDtkYXJrdGhlbWV9CgkJCS5pbml0LWlucHV0IHsKCQkJCXdpZHRoOiAzNzNweDsKCQkJCWZvbnQtc2l6ZTogMjBweDsKCQkJCXRleHQtYWxpZ246IGNlbnRlcjsKCQkJCWZvbnQtZmFtaWx5OiBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgIlNlZ29lIFVJIiwgUm9ib3RvLCBVYnVudHUsICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CgkJCQlmb250LXdlaWdodDogMzAwOwoJCQl9CgkJCS5wbC1jb2xvciB7ZmxleDogMTsgZGlzcGxheTogZmxleDsgZmxleC13cmFwOiB3cmFwfQoJCQkucGwtY29sb3ItYm94IHt3aWR0aDogNTVweDsgaGVpZ2h0OiA1NXB4OyBtYXJnaW46MTBweCAxMHB4IDAgMDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgYm9yZGVyOjFweCBzb2xpZCAjZmZmOyBjdXJzb3I6cG9pbnRlciB9CgkJCS5wbC1tYXNrIHsKCQkJCXdpZHRoOiA1M3B4OwoJCQkJaGVpZ2h0OiA1M3B4OwoJCQkJb3BhY2l0eTogMDsKCQkJCXRyYW5zaXRpb246IG9wYWNpdHkgMC4zczsKCQkJCWNvbG9yOiAjZmZmOwoJCQkJZm9udC1zaXplOiAxM3B4OwoJCQkJZGlzcGxheTogZmxleDsKCQkJCWFsaWduLWl0ZW1zOiBjZW50ZXI7CgkJCQlqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKCQkJCWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CgkJCX0KCQkJLnBsLWNvbG9yLWJveDpob3ZlciAucGwtbWFzayB7CgkJCQlvcGFjaXR5OiAxOwoJCQl9CgkJCS5wbC1jbG9zZTpmb2N1cyB7IG91dGxpbmU6IDA7IGJveC1zaGFkb3c6IG5vbmU7IH0KCQkJLnRhZy1kYW5nZXIge2NvbG9yOiNjYzMyMzU7bWFyZ2luOiAwIDVweDt9CgkJCS5wbC10b29sdGlwIHsgcG9zaXRpb246IGFic29sdXRlOyBjb2xvcjogI2ZmZmZmZjsgbWF4LXdpZHRoOiA2MDBweDsgZm9udC1zaXplOiAxMnB4OyBwYWRkaW5nOiA1cHggMTBweDsgYmFja2dyb3VuZDogIzMzMzsgYm9yZGVyLXJhZGl1czogNXB4OyB6LWluZGV4OiAxMTAwMDA7IGxpbmUtaGVpZ2h0OiAxLjM7IGRpc3BsYXk6bm9uZTsgd29yZC1icmVhazogYnJlYWstYWxsO30KCQkJIEBrZXlmcmFtZXMgbG9hZCB7IDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMGRlZykgfSAxMDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKSB9IH0KCQkJLnBsLWxvYWRpbmctYm94ID4gZGl2ID4gZGl2IHsgcG9zaXRpb246IGFic29sdXRlO2JvcmRlci1yYWRpdXM6IDUwJTt9CgkJCS5wbC1sb2FkaW5nLWJveCA+IGRpdiA+IGRpdjpudGgtY2hpbGQoMSkgeyB0b3A6IDlweDtsZWZ0OiA5cHg7d2lkdGg6IDgycHg7aGVpZ2h0OiA4MnB4O2JhY2tncm91bmQ6ICNmZmZmZmY7fQoJCQkucGwtbG9hZGluZy1ib3ggPiBkaXYgPiBkaXY6bnRoLWNoaWxkKDIpIHsgdG9wOiAxNHB4O2xlZnQ6IDM4cHg7d2lkdGg6IDI1cHg7aGVpZ2h0OiAyNXB4O2JhY2tncm91bmQ6ICM2NjY2NjY7YW5pbWF0aW9uOiBsb2FkIDFzIGxpbmVhciBpbmZpbml0ZTt0cmFuc2Zvcm0tb3JpZ2luOiAxMnB4IDM2cHg7fQoJCQkucGwtbG9hZGluZyB7IHdpZHRoOiAxNnB4O2hlaWdodDogMTZweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7b3ZlcmZsb3c6IGhpZGRlbjtiYWNrZ3JvdW5kOiBub25lO30KCQkJLnBsLWxvYWRpbmctYm94IHsgd2lkdGg6IDEwMCU7aGVpZ2h0OiAxMDAlO3Bvc2l0aW9uOiByZWxhdGl2ZTt0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCkgc2NhbGUoMC4xNik7YmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO3RyYW5zZm9ybS1vcmlnaW46IDAgMDt9CgkJCS5wbC1sb2FkaW5nLWJveCBkaXYgeyBib3gtc2l6aW5nOiBjb250ZW50LWJveDsgfQoJCQkucGwtZHJvcGRvd24tbWVudSB7cG9zaXRpb246IGFic29sdXRlO3BhZGRpbmc6IDVweCAwO2NvbG9yOiAke2NvbG9yfTtiYWNrZ3JvdW5kOiB0aGVtZWNvbG9yO3otaW5kZXg6IDk5OTt3aWR0aDogMTEwcHg7Ym9yZGVyLXJhZGl1czogMTBweDtib3gtc2hhZG93OiAwIDAgMXB4IDFweCByZ2IoMjggMjggMzIgLyA1JSksIDAgOHB4IDI0cHggcmdiKDI4IDI4IDMyIC8gMTIlKTsgdGV4dC1hbGlnbjogY2VudGVyOyBib3JkZXI6IG5vbmU7IHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7fQoJCQkuc3dhbDItY29udGFpbmVyIHsgei1pbmRleDoxMDAwMDA7IH0KCQkJYm9keS5zd2FsMi1oZWlnaHQtYXV0byB7IGhlaWdodDogaW5oZXJpdDsgfQoKCQkJQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgW2RhdGEtdGhlbWU9c3lzdGVtXSAqIHsKCQkJCWNvbG9yLXNjaGVtZTogZGFyazsKCQkJfQoKCQkJLyogd2Via2l0LCBvcGVyYSwgSUU5LCBDaHJvbWUqLwoJCQk6OnNlbGVjdGlvbiB7CgkJCQliYWNrZ3JvdW5kLWNvbG9yOiAke2NvbG9yfSFpbXBvcnRhbnQ7CgkJCQliYWNrZ3JvdW5kOiAke2NvbG9yfSFpbXBvcnRhbnQ7CgkJCQljb2xvcjogd2hpdGUhaW1wb3J0YW50OwoJCQl9CgkJCS8qIG1vemlsbGEgZmlyZWZveCAqLwoJCQk6Oi1tb3otc2VsZWN0aW9uIHsKCQkJCWJhY2tncm91bmQtY29sb3I6ICR7Y29sb3J9IWltcG9ydGFudDsKCQkJCWJhY2tncm91bmQ6ICR7Y29sb3J9IWltcG9ydGFudDsKCQkJCWNvbG9yOiB3aGl0ZSFpbXBvcnRhbnQ7CgkJCX0KCQkJLyog55m+5bqm572R55uYICovCgkJCTpub3QoW2NsYXNzKj0icndsLWV4ZW1wdCJdKSA6OnNlbGVjdGlvbiB7CgkJCQliYWNrZ3JvdW5kLWNvbG9yOiAke2NvbG9yfSFpbXBvcnRhbnQ7CgkJCQliYWNrZ3JvdW5kOiAke2NvbG9yfSFpbXBvcnRhbnQ7CgkJCQljb2xvcjogd2hpdGUhaW1wb3J0YW50OwoJCQl9CgkJCWA7CgkJCS8vIOWFiOebkeWQrOminOiJsuaWueahiOWPmOWMlgoJCQl3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLmFkZExpc3RlbmVyKChlKSA9PiB7CgkJCQlpZiAoZS5tYXRjaGVzKSB7CgkJCQkJLy8g5YiH5o2i5Yiw5pqX6Imy5Li76aKYCgkJCQkJbGV0IGRhcmsgPSB1aWNzcy5yZXBsYWNlKCJ0aGVtZWNvbG9yIiwiIzE5MTkxYSIpLnJlcGxhY2UoImRhcmt0aGVtZSIsImNvbG9yLXNjaGVtZTogZGFyazsiKTsKCQkJCQl0aGlzLmFkZFN0eWxlKCdQYW5saW5rZXItVUknLCAnc3R5bGUnLCBkYXJrKTsKCQkJCX0gZWxzZSB7CgkJCQkJLy8g5YiH5o2i5Yiw5rWF6Imy5Li76aKYCgkJCQkJbGV0IGxpZ2h0ID0gdWljc3MucmVwbGFjZSgidGhlbWVjb2xvciIsIiNmZmYiKS5yZXBsYWNlKCJkYXJrdGhlbWUiLCIiKTsKCQkJCQl0aGlzLmFkZFN0eWxlKCdQYW5saW5rZXItVUknLCAnc3R5bGUnLCBsaWdodCk7CgkJCQl9CgkJCX0pOwoJCQkvLyDlho3kv67mlLnkuLvpopgKCQkJaWYgKHdpbmRvdy5tYXRjaE1lZGlhICYmIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcykgewoJCQkJbGV0IGRhcmsgPSB1aWNzcy5yZXBsYWNlKCJ0aGVtZWNvbG9yIiwiIzE5MTkxYSIpLnJlcGxhY2UoImRhcmt0aGVtZSIsImNvbG9yLXNjaGVtZTogZGFyazsiKTsKCQkJCXRoaXMuYWRkU3R5bGUoJ1Bhbmxpbmtlci1VSScsICdzdHlsZScsIGRhcmspOwoJCQl9IGVsc2UgewoJCQkJLy8g5YiH5o2i5Yiw5rWF6Imy5Li76aKYCgkJCQlsZXQgbGlnaHQgPSB1aWNzcy5yZXBsYWNlKCJ0aGVtZWNvbG9yIiwiI2ZmZiIpLnJlcGxhY2UoImRhcmt0aGVtZSIsIiIpOwoJCQkJdGhpcy5hZGRTdHlsZSgnUGFubGlua2VyLVVJJywgJ3N0eWxlJywgbGlnaHQpOwoJCQl9CgoKCQkJbGV0IGJhaWR1Y3NzID0gYAoJCQkud3Atcy1hc2lkZS1uYXZfX2ZpbGUtbGlzdC1hbGwuaXMtYWN0aXZlLmlzLWV4YWN0LWFjdGl2ZSwgLndwLXMtYXNpZGUtbmF2X19zdWItY29udGFpbmVyLmlzLWFjdGl2ZSwgLndwLXMtYXNpZGUtbmF2X19zdWItaXRlbS5pcy1hY3RpdmUsIC53cC1zLWFzaWRlLW5hdl9fbWFpbi1pdGVtLmlzLWFjdGl2ZSwgLndwLXMtYWdpbGUtdG9vbC1iYXJfX2gtYWN0aW9uLWJ1dHRvbjpob3ZlciwgLnUtYnV0dG9uLS10ZXh0LCAud3Atcy1zZWFyY2ggLnUtaW5wdXRfX2lubmVyOmZvY3VzKy51LWlucHV0X19zdWZmaXggLndwLXMtc2VhcmNoX19zZWFyY2gtdGV4dCwgLndwLXMtc2VhcmNoIC51LWlucHV0X19pbm5lcjpob3ZlcisudS1pbnB1dF9fc3VmZml4IC53cC1zLXNlYXJjaF9fc2VhcmNoLXRleHQsIC53cC1zLXBhbi1saXN0X19maWxlLW5hbWUtdGl0bGUtdGV4dDpob3ZlciwgLmFpVG9vbHMtYXNpZGVfX2l0ZW0tLWFjdGl2ZSwgLndwLXMtcGFuLXRhYmxlX19zb3J0IC5pY29uLmFjdGl2ZSwgLmctYnV0dG9uLCAudS1idXR0b24tLXdlZWssIC5uZC1saXN0LW5hbWVfX3RpdGxlLXRleHQ6aG92ZXIsIC5OSGNHdyAub3Blbi1lbmFibGUgLmZpbGUtbmFtZSBhOmhvdmVyLCAuTkhjR3cgLm9wZW4tZW5hYmxlIC5maWxlLW5hbWUgYTphY3RpdmUsIC5CTmZJeVBiIC5jRWVmeXoub3Blbi1lbmFibGUgLmZpbGUtbmFtZSBhOmhvdmVyLCAuQk5mSXlQYiAuY0VlZnl6Lm9wZW4tZW5hYmxlIC5maWxlLW5hbWUgYTphY3RpdmUsIC53cC1zLXBhbi1maWxlLW1haW5fX25hdi1pdGVtLXRpdGxlLCAudGhlbWUtcHJpbWFyeS10ZXh0LCAuaWNvbi5hY3RpdmUsIC53cmFwcGVyIC5ibHVlQnRuW2RhdGEtdi1jNzRjZmM3NF0sIC5tb2R1bGUtdGltZWxpbmUtcnVsZXIgLmhvdmVyLWRheS1kZXNjIC5kYXktZGVzY1tkYXRhLXYtMDhkOGFiYmVdLCAuaW1jLWVkaXQta2V5d29yZF9fYnJlYWRjcnVtYi1nb2xpc3QsIC5pbWMtZWRpdC1rZXl3b3JkX19ib3R0b20td3JhcHBlciAudS1idXR0b24tLXdlZWsuaXMtZGlzYWJsZWQsIC5pbWMta2V5d29yZC1saXN0X190YWJsZS1saXN0IC5hY3Rpb24tYnRuIHsKCQkJCWNvbG9yOiAke2NvbG9yfTsKCQkJfQoJCQkud3Atcy1hc2lkZS1uYXZfX2ZpbGUtbGlzdC1hbGwuaXMtYWN0aXZlLmlzLWV4YWN0LWFjdGl2ZSwgLndwLXMtYWdpbGUtdG9vbC1iYXJfX2gtbW9yZS1ncm91cCwgLndwLXMtcGFuLXRhYmxlX19ib2R5LXJvdzpob3ZlciwgLndwLXMtYWdpbGUtdG9vbC1iYXJfX2gtYWN0aW9uLCAuYWlUb29scy1hc2lkZV9faXRlbS0tYWN0aXZlLCAud3Atcy1hZ2lsZS10b29sLWJhcl9faC1hY3Rpb24uaXMtbmVlZC1sZWZ0LXNlcCsuaXMtbmVlZC1sZWZ0LXNlcDphZnRlciwgLndwLXMtYXNpZGUtbmF2X19zdWItaXRlbS5pcy1hY3RpdmUsIC5OSGNHdyAuamxpbFI5Z28sIC5OSGNHdyAudnp4cm00UiwgLnUtYnV0dG9uLS13ZWVrLCAudS1idXR0b24tLXdlZWs6Zm9jdXMsIC51LWJ1dHRvbi0td2Vlazpob3ZlciwgLmctZHJvcGRvd24tYnV0dG9uIC5tZW51IC5nLWJ1dHRvbi1tZW51OmhvdmVyLCAueEdMTUlhYiAuZnVmSHlBOmhvdmVyLCAubW9kdWxlLXRpbWVsaW5lLXJ1bGVyIC5ob3Zlci1kYXktZGVzYyAuZGF5LWRlc2NbZGF0YS12LTA4ZDhhYmJlXSwgLmltYy1lZGl0LWtleXdvcmRfX2JvdHRvbS13cmFwcGVyIC51LWJ1dHRvbi0td2Vlay5pcy1kaXNhYmxlZCwgLndwLXMtcGFuLXRhYmxlX19ib2R5LXJvdy5zZWxlY3RlZCwgLm5kLXRhYmxlX19ib2R5LXJvdy5zZWxlY3RlZCB7CgkJCQl0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOwoJCQkJYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcn0xMDsKCQkJCWJhY2tncm91bmQ6ICR7Y29sb3J9MTA7CgkJCX0KCQkJLm16Zl9uZXdfYnRuLCAudS1idXR0b24tLXByaW1hcnksIC53cC1zLWFzaWRlLW5hdl9fcXVvdGEtcHJvZ3Jlc3MtcmF0ZSwgLnUtY2hlY2tib3hfX2lucHV0LmlzLWNoZWNrZWQgLnUtY2hlY2tib3hfX2lubmVyLCAudS1jaGVja2JveF9faW5wdXQuaXMtaW5kZXRlcm1pbmF0ZSAudS1jaGVja2JveF9faW5uZXIsIC5nLWJ1dHRvbi1ibHVlLCAuZy1idXR0b24tYmx1ZS1sYXJnZSwgLnNlbGVjdCwgLm0tYnV0dG9uLCAudS10YWJzX19hY3RpdmUtYmFyLCAubW9kdWxlLXRpbWVsaW5lLXJ1bGVyIC5saW5lLWN1cnJlbnRbZGF0YS12LTA4ZDhhYmJlXSwgLm1vZHVsZS10aW1lbGluZS1ydWxlciAubGluZS1ob3ZlcltkYXRhLXYtMDhkOGFiYmVdLCAubW9kdWxlLXRpbWVsaW5lLXJ1bGVyIC5saW5lLWN1cnJlbnRbZGF0YS12LTA4ZDhhYmJlXTphZnRlciwgLm1vZHVsZS10aW1lbGluZS1ydWxlciAubGluZS1ob3ZlcltkYXRhLXYtMDhkOGFiYmVdOmFmdGVyLCAudS1zd2l0Y2guaXMtY2hlY2tlZCAudS1zd2l0Y2hfX2NvcmUgewoJCQkJdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTsKCQkJCWJhY2tncm91bmQtY29sb3I6ICR7Y29sb3J9OwoJCQl9CgkJCS53cC1zLXBhbi10YWJsZV9fYm9keS1yb3c6aG92ZXIsIC53cC1zLXNlYXJjaCAudS1pbnB1dC0tc21hbGwgLnUtaW5wdXRfX2lubmVyOmhvdmVyLCAudS1jaGVja2JveF9faW5wdXQuaXMtY2hlY2tlZCAudS1jaGVja2JveF9faW5uZXIsIC51LWNoZWNrYm94X19pbm5lcjpob3ZlciwgLnUtY2hlY2tib3hfX2lucHV0LmlzLWluZGV0ZXJtaW5hdGUgLnUtY2hlY2tib3hfX2lubmVyLCAubmQtdGFibGVfX2JvZHktcm93OmhvdmVyIC51LWNoZWNrYm94X19pbm5lciwgLk5IY0d3IC5qbGlsUjlnbywgLk5IY0d3IC52enhybTRSLCAudS1idXR0b24tLXdlZWssIC51LWJ1dHRvbi0tcHJpbWFyeSwgLmctYnV0dG9uLCAudS1zd2l0Y2guaXMtY2hlY2tlZCAudS1zd2l0Y2hfX2NvcmUgewoJCQkJdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTsKCQkJCWJvcmRlci1jb2xvcjogJHtjb2xvcn07CgkJCX0KCQkJLndwLXMtYXNpZGUtbmF2X19maWxlLWxpc3QtY2F0ZS5pcy1hY3RpdmUgewoJCQkJYmFja2dyb3VuZC1jb2xvcjogI2ZmZiAKCQkJfQoJCQkuZy1idXR0b246aG92ZXIsIC53cC1zLXBhbi1maWxlLW1haW5fX25hdi1pdGVtLXNlcCB7CgkJCQl0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOwoJCQkJY29sb3I6ICR7Y29sb3J9ZDA7CgkJCX0KCQkJLmctYnV0dG9uLWJsdWU6aG92ZXIsIC5nLWJ1dHRvbi5nLWJ1dHRvbi1ibHVlLWxhcmdlOmhvdmVyIHsKCQkJCXRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7CgkJCQljb2xvcjogJHtjb2xvcn1kMDsKCQkJCWJhY2tncm91bmQtY29sb3I6ICR7Y29sb3J9YjA7CgkJCX0KCQkJLmctYnV0dG9uOmhvdmVyIC5pY29uIHsKCQkJCWNvbG9yOiAke2NvbG9yfWQwOwoJCQl9CgkJCS5iYWNrLW9sZC12ZXJzaW9uIHsKCQkJCWJhY2tncm91bmQ6ICNmMWYzZjg7CgkJCQlib3JkZXItcmFkaXVzOiAzMnB4OwoJCQkJd2lkdGg6IDMwcHg7CgkJCQloZWlnaHQ6IDMwcHg7CgkJCQlkaXNwbGF5OiBmbGV4OwoJCQkJanVzdGlmeS1jb250ZW50OiBjZW50ZXI7CgkJCX0KCQkJYAoJCQlpZiAoLyhwYW58eXVuKS5iYWlkdS5jb20vLnRlc3QobG9jYXRpb24uaG9zdCkgJiYgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19iYWlkdV90aGVtZScpID09PSAneWVzJykgewoJCQkJdGhpcy5hZGRTdHlsZSgnUGFubGlua2VyLUJhaWR1VUknLCAnc3R5bGUnLCBiYWlkdWNzcyk7CgkJCX07CgkJfSwKCgkJYXN5bmMgaW5pdERpYWxvZygpIHsKCQkJbGV0IHNlY3JldCA9ICIiCgkJCWlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICd2MScpIHsKCQkJCXNlY3JldCA9ICLlvZPliY3mmpflj7fmmK/vvJrigJwiICsgcGFuLm51bSArICLigJ3jgIIiOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gJ3YyJykgewoJCQkJc2VjcmV0ID0gIuW9k+WJjeaal+WPt+aYr++8muKAnCIgKyBwYW4ubnVtICsgIuKAne+8jOW8gOa6kOWNj+iuruaYr+KAnCIgKyBwYW4ubGljZW5zZSArICLigJ3jgIIiOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gIm5vIikgewoJCQkJc2VjcmV0ID0gIuW9k+WJjeaal+WPt+aYr++8muKAnCIgKyBwYW4ubnVtICsgIuKAneOAgiI7CgkJCX0gZWxzZSB7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJywgJ3YyJyk7CgkJCQlzZWNyZXQgPSAi5b2T5YmN6YWN572u5LiN5q2j56Gu77yM6K+35Yi35paw6aG16Z2i5YaN57un57utIjsKCQkJfQoJCQlsZXQgcmVzdWx0ID0gYXdhaXQgU3dhbC5maXJlKHsKCQkJCXRpdGxlOiBwYW4uaW5pdFswXSwKCQkJCWFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKCQkJCXNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKCQkJCXNob3dEZW55QnV0dG9uOiB0cnVlLAoJCQkJY29uZmlybUJ1dHRvblRleHQ6ICfnoa7lrponLAoJCQkJaGVpZ2h0QXV0bzogZmFsc2UsCgkJCQlzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKCQkJCWh0bWw6IGA8ZGl2PjxpbWcgc3R5bGU9IndpZHRoOiAyNTBweDttYXJnaW4tYm90dG9tOiAxMHB4OyIgc3JjPSIke3Bhbi5pbWd9IiBhbHQ9IiR7cGFuLmltZ30iPgoJCQkJPGlucHV0IGNsYXNzPSJzd2FsMi1pbnB1dCBpbml0LWlucHV0IiBpZD0iaW5pdCIgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IiR7cGFuLmluaXRbMV19Ij48L2Rpdj4KCQkJCTxkaXY+PHNwYW4+5L2g5Y+v5Lul6YCJ5oupIuazqOWFpSLnq4vljbPngrnkuq7mjInpkq48L3NwYW4+PC9kaXY+CgkJCQk8ZGl2PjxzcGFuPuaIluiAhei+k+WFpSDmmpflj7cv5byA5rqQ5Y2P6K6uIOeCueS6ri4uLjwvc3Bhbj48L2Rpdj4KCQkJCTxkaXY+PHNwYW4+JHtzZWNyZXR9PC9zcGFuPjwvZGl2PgoJCQkJPGRpdj48c3Bhbj7ljp/kvZzogIXlvIDlj5Hlvojovpvoi6bvvIzmiYDku6Xor7fmiavnoIHmlK/mjIHkuIDkuIvku5bnmoTnmoTlhazkvJflj7c8L3NwYW4+PC9kaXY+CgkJCQk8ZGl2PjxzcGFuPuaIluiAheadpee7mei/meS4quaUueeJiOeCueS4qjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9obWp6MTAwL09ubGluZS1kaXNrLWRpcmVjdC1saW5rLWRvd25sb2FkLWFzc2lzdGFudC8iPlN0YXI8L2E+Li4uPC9zcGFuPjwvZGl2PgoJCQkJPGRpdj48c3Bhbj7ngrnkuq7lkI7lj6/ku6Xnsr7nroDpg6jliIbnvZHnm5jnlYzpnaLlk6YhPC9zcGFuPjwvZGl2PgoJCQkJYCwKCQkJCWRlbnlCdXR0b25UZXh0OiAn5rOo5YWlKOeCueS6ruS4i+i9veWKqeaJi+aMiemSriknCgkJCX0pOwoJCQlpZiAocmVzdWx0LmlzRGVuaWVkKSB7CgkJCQljb25zb2xlLmxvZygi44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRXG7mraPlnKjms6jlhaXngrnkuq7mjInpkq7orr7nva7pobnnm64uLi4iKTsKCQkJCW1lc3NhZ2Uud2FybmluZygi5q2j5Zyo5rOo5YWl54K55Lqu5oyJ6ZKu6K6+572u6aG555uuLi4uIik7CgkJCQlzZXRUaW1lb3V0KCgpID0+IHsKCQkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX2luaXRfY29kZScsIHBhbi5udW0pOwoJCQkJCWJhc2Uuc2V0VmFsdWUoJ2xpY2Vuc2UnLCBwYW4ubGljZW5zZSk7CgkJCQkJbWVzc2FnZS5zdWNjZXNzKCLms6jlhaXmiJDlip/kuobmrLghIik7CgkJCQkJc2V0VGltZW91dCgoKSA9PiB7CgkJCQkJCW1lc3NhZ2Uuc3VjY2VzcyhwYW4uaW5pdFsyXSk7CgkJCQkJCXNldFRpbWVvdXQoKCkgPT4gewoJCQkJCQkJaGlzdG9yeS5nbygwKTsKCQkJCQkJfSwgMzAwMCk7CgkJCQkJfSwgMzAwMCk7CgkJCQl9LCA1MDAwKTsKCQkJfTsKCQkJaWYgKHJlc3VsdC5pc0NvbmZpcm1lZCl7CgkJCQlpZiAocGFuLm51bSA9PT0gJCgnI2luaXQnKS52YWwoKSB8fCBwYW4ubGljZW5zZSA9PT0gJCgnI2luaXQnKS52YWwoKSkgewoJCQkJCWNvbnNvbGUubG9nKCLjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFcbuaal+WPt+aIluWNj+iuruato+ehriIpCgkJCQkJbWVzc2FnZS5zdWNjZXNzKHBhbi5pbml0WzJdKTsKCQkJCQlzZXRUaW1lb3V0KCgpID0+IHsKCQkJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19pbml0X2NvZGUnLCBwYW4ubnVtKTsKCQkJCQkJYmFzZS5zZXRWYWx1ZSgnbGljZW5zZScsIHBhbi5saWNlbnNlKTsKCQkJCQkJaGlzdG9yeS5nbygwKTsKCQkJCQl9LCAzMDAwKQoJCQkJfSBlbHNlIGlmICgkKCcjaW5pdCcpLnZhbCgpID09PSAnMTE0NTE0JyB8fCAkKCcjaW5pdCcpLnZhbCgpID09PSAnMTkxOTgxMCcgfHwgJCgnI2luaXQnKS52YWwoKSA9PT0gJzExNDUxNDE5MTk4MTAnKSB7CgkJCQkJLyotLS0KCQkJCQkJaG9tb+W9qeibi+WPiOWbnuadpeWKm++8iOWWnO+8iQoJCQkJCQlpbWFnZVVybDogJ2h0dHBzOi8vcGljNC56aGltZy5jb20vODAvdjItMWI5N2EwODhlMTU2YzAxNTEwOGRlYzY2M2JiYThiMDQuanBnJywKCQkJCQkJaW1hZ2VVcmw6ICdodHRwczovL2xoMS5oZXRhb3VzZXJjb250ZW50LmNvbS9pbWcvN2Q0YzFjMGI0YWRiMGU5NS5qcGcnLAoJCQkJCSovCgkJCQkJYXdhaXQgU3dhbC5maXJlKHsKCQkJCQkJaWNvbjogJ2Vycm9yJywKCQkJCQkJdGl0bGU6ICcxMTQ1MTQxOTE5ODEwJywKCQkJCQkJaHRtbDogJzxzcGFuPmhvbW/nibnmnInnmoTmlbDlrZflvZPnhLbkuI3ooYzllaY8YnI+5ZO85ZO85ZO85ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWKPC9zcGFuPicsCgkJCQkJCXRpbWVyOiA4MDAwLAoJCQkJCQlpbWFnZVVybDogJ2h0dHBzOi8vcGljNC56aGltZy5jb20vODAvdjItMWI5N2EwODhlMTU2YzAxNTEwOGRlYzY2M2JiYThiMDQuanBnJywKCQkJCQkJYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAoJCQkJCQl0aW1lclByb2dyZXNzQmFyOiB0cnVlLAoJCQkJCQlzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsCgkJCQkJCXNob3dEZW55QnV0dG9uOiB0cnVlLAoJCQkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCQkJc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCgkJCQkJCWRlbnlCdXR0b25UZXh0OiAn5ZO85ZO85ZO85ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWKJywKCQkJCQl9KTsKCQkJCQltZXNzYWdlLmluZm8oIuaIkOWwse+8muS9oOinpuWPkeS6huS4gOS4qmhvbW/nibnmnInnmoTlvanom4vvvIEiKTsKCQkJCQlzZXRUaW1lb3V0KCgpID0+IHsKCQkJCQkJU3dhbC5maXJlKHsKCQkJCQkJCXRpdGxlOiAnMTE0NTE0MTkxOTgxMCcsCgkJCQkJCQl0ZXh0Oidob21v54m55pyJ55qE5pWw5a2X5b2T54S25LiN6KGM5ZWmLi4u5ZCX77yfJywKCQkJCQkJCWljb246ICdxdWVzdGlvbicsCgkJCQkJCQlpbWFnZVVybDogJ2h0dHBzOi8vbGgxLmhldGFvdXNlcmNvbnRlbnQuY29tL2ltZy83ZDRjMWMwYjRhZGIwZTk1LmpwZycsCgkJCQkJCQlzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsCgkJCQkJCQlhbGxvd091dHNpZGVDbGljazogZmFsc2UsCgkJCQkJCX0pOwoJCQkJCQlzZXRUaW1lb3V0KCgpID0+IHsKCQkJCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJywgcGFuLm51bSk7CgkJCQkJCQltZXNzYWdlLnN1Y2Nlc3MoIuaIkOWwse+8muWTvOWTvOWTvOWViuWViuWViuWViuWViuWViuWViuWViuWcsOazqOWFpeaIkOWKnyjllpwpIik7CgkJCQkJCQlzZXRUaW1lb3V0KCgpID0+IHsKCQkJCQkJCQloaXN0b3J5LmdvKDApOwoJCQkJCQkJfSwgMzAwMCk7CgkJCQkJCX0sIDMwMDApCgkJCQkJfSwgNDAwMCkKCQkJCX0gZWxzZSB7CgkJCQkJY29uc29sZS5sb2coIuOAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkVxu5pqX5Y+36ZSZ6K+vIikKCQkJCQlhd2FpdCBTd2FsLmZpcmUoewoJCQkJCQlpbWFnZVVybDogcGFuLmltZywKCQkJCQkJdGl0bGU6IHBhbi5pbml0WzNdLAoJCQkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCQkJc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCgkJCQkJCWh0bWw6IGA8ZGl2PjxzcGFuPiR7cGFuLmluaXRbNF19PGJyPuS9oOWPr+S7peWcqOi/lOWbnuWQjumAieaLqeKAnOazqOWFpeKAneeri+WNs+eCueS6ruaMiemSru+8jDxicj7miJbogIXlnKjovpPlhaXmoYbplK7lhaXku6XkuIvmmpflj7fvvJrigJwke3Bhbi5udW194oCd44CCPC9zcGFuPjwvZGl2PmAsCgkJCQkJCWNvbmZpcm1CdXR0b25UZXh0OiAn6YeN5paw6L6T5YWlJywKCQkJCQl9KTsKCQkJCQlhd2FpdCB0aGlzLmluaXREaWFsb2coKTsKCQkJCQlyZXR1cm47CgkJCQl9OwoJCQl9CgkJfSwKCgkJYXN5bmMgaW5pdERpYWxvZ1dhcCgpIHsKCQkJbGV0IHNlY3JldCA9ICIiCgkJCWlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICd2MScpIHsKCQkJCXNlY3JldCA9ICLlvZPliY3mmpflj7fmmK/vvJrigJwiICsgcGFuLm51bSArICLigJ3jgIIiOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gJ3YyJykgewoJCQkJc2VjcmV0ID0gIuW9k+WJjeaal+WPt+aYr++8muKAnCIgKyBwYW4ubnVtICsgIuKAne+8jOW8gOa6kOWNj+iuruaYr+KAnCIgKyBwYW4ubGljZW5zZSArICLigJ3jgIIiOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gIm5vIikgewoJCQkJc2VjcmV0ID0gIuW9k+WJjeaal+WPt+aYr++8muKAnCIgKyBwYW4ubnVtICsgIuKAneOAgiI7CgkJCX0gZWxzZSB7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJywgJ3YyJyk7CgkJCQlzZWNyZXQgPSAi5b2T5YmN6YWN572u5LiN5q2j56Gu77yM6K+35Yi35paw6aG16Z2i5YaN57un57utIjsKCQkJfQoJCQlsZXQgcmVzdWx0ID0gYXdhaXQgU3dhbC5maXJlKHsKCQkJCXRpdGxlOiBwYW4uaW5pdFswXSwKCQkJCWFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKCQkJCXNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKCQkJCXNob3dEZW55QnV0dG9uOiB0cnVlLAoJCQkJcG9zaXRpb246ICd0b3AnLAoJCQkJaGVpZ2h0QXV0bzogZmFsc2UsCgkJCQlzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKCQkJCWNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywKCQkJCWh0bWw6IGA8ZGl2PjxpbWcgc3R5bGU9IndpZHRoOiAyNTBweDttYXJnaW4tYm90dG9tOiAxMHB4OyIgc3JjPSIke3Bhbi5pbWd9IiBhbHQ9IiR7cGFuLmltZ30iPgoJCQkJPGlucHV0IGNsYXNzPSJzd2FsMi1pbnB1dCBpbml0LWlucHV0IiBpZD0iaW5pdCIgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IiR7cGFuLmluaXRbMV19Ij48YnI+CgkJCQk8ZGl2PjxzcGFuPuS9oOWPr+S7pemAieaLqSLms6jlhaUi56uL5Y2z54K55Lqu5oyJ6ZKuPC9zcGFuPjwvZGl2PgoJCQkJPGRpdj48c3Bhbj7miJbogIXovpPlhaUg5pqX5Y+3L+W8gOa6kOWNj+iuriDngrnkuq4uLi48L3NwYW4+PC9kaXY+CgkJCQk8ZGl2PjxzcGFuPiR7c2VjcmV0fTwvc3Bhbj48L2Rpdj4KCQkJCTxkaXY+PHNwYW4+5Y6f5L2c6ICF5byA5Y+R5b6I6L6b6Ium77yM5omA5Lul6K+35omr56CB5pSv5oyB5LiA5LiL5LuW55qE55qE5YWs5LyX5Y+3PC9zcGFuPjwvZGl2PgoJCQkJPGRpdj48c3Bhbj7miJbogIXmnaXnu5nov5nkuKrmlLnniYjngrnkuKo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnQvIj5TdGFyPC9hPi4uLjwvc3Bhbj48L2Rpdj4KCQkJCTxkaXY+PHNwYW4+54K55Lqu5ZCO5Y+v5Lul57K+566A6YOo5YiG572R55uY55WM6Z2i5ZOmITwvc3Bhbj48L2Rpdj4KCQkJCTwvZGl2PmAsCgkJCQlkZW55QnV0dG9uVGV4dDogJ+azqOWFpScKCQkJfSk7CgkJCWlmIChyZXN1bHQuaXNEZW5pZWQpIHsKCQkJCWNvbnNvbGUubG9nKCLjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFcbuato+WcqOazqOWFpeeCueS6ruaMiemSruiuvue9rumhueebri4uLiIpOwoJCQkJbWVzc2FnZS53YXJuaW5nKCLmraPlnKjms6jlhaXngrnkuq7mjInpkq7orr7nva7pobnnm64uLi4iKTsKCQkJCXNldFRpbWVvdXQoKCkgPT4gewoJCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJywgcGFuLm51bSk7CgkJCQkJbWVzc2FnZS5zdWNjZXNzKCLms6jlhaXmiJDlip/kuobmrLghIik7CgkJCQkJc2V0VGltZW91dCgoKSA9PiB7CgkJCQkJCW1lc3NhZ2Uuc3VjY2VzcyhwYW4uaW5pdFsyXSk7CgkJCQkJCXNldFRpbWVvdXQoKCkgPT4gewoJCQkJCQkJaGlzdG9yeS5nbygwKTsKCQkJCQkJfSwgMzAwMCk7CgkJCQkJfSwgMzAwMCk7CgkJCQl9LCA1MDAwKTsKCQkJfTsKCQkJaWYgKHJlc3VsdC5pc0NvbmZpcm1lZCl7CgkJCQlpZiAocGFuLm51bSA9PT0gJCgnI2luaXQnKS52YWwoKSkgewoJCQkJCWNvbnNvbGUubG9nKCLjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFcbuaal+WPt+ato+ehriIpCgkJCQkJbWVzc2FnZS5zdWNjZXNzKHBhbi5pbml0WzJdKTsKCQkJCQlzZXRUaW1lb3V0KCgpID0+IHsKCQkJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19pbml0X2NvZGUnLCBwYW4ubnVtKTsKCQkJCQkJaGlzdG9yeS5nbygwKTsKCQkJCQl9LCAzMDAwKQoJCQkJfSBlbHNlIGlmICgkKCcjaW5pdCcpLnZhbCgpID09PSAnMTE0NTE0JyB8fCAkKCcjaW5pdCcpLnZhbCgpID09PSAnMTkxOTgxMCcgfHwgJCgnI2luaXQnKS52YWwoKSA9PT0gJzExNDUxNDE5MTk4MTAnKSB7CgkJCQkJLyotLS0KCQkJCQkJaG9tb+W9qeibi+WPiOWbnuadpeWKm++8iOWWnO+8iQoJCQkJCQlpbWFnZVVybDogJ2h0dHBzOi8vcGljNC56aGltZy5jb20vODAvdjItMWI5N2EwODhlMTU2YzAxNTEwOGRlYzY2M2JiYThiMDQuanBnJywKCQkJCQkJaW1hZ2VVcmw6ICdodHRwczovL2xoMS5oZXRhb3VzZXJjb250ZW50LmNvbS9pbWcvN2Q0YzFjMGI0YWRiMGU5NS5qcGcnLAoJCQkJCSovCgkJCQkJYXdhaXQgU3dhbC5maXJlKHsKCQkJCQkJaWNvbjogJ2Vycm9yJywKCQkJCQkJdGl0bGU6ICcxMTQ1MTQxOTE5ODEwJywKCQkJCQkJaHRtbDogJzxzcGFuPmhvbW/nibnmnInnmoTmlbDlrZflvZPnhLbkuI3ooYzllaY8YnI+5ZO85ZO85ZO85ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWKPC9zcGFuPicsCgkJCQkJCXRpbWVyOiA4MDAwLAoJCQkJCQlpbWFnZVVybDogJ2h0dHBzOi8vcGljNC56aGltZy5jb20vODAvdjItMWI5N2EwODhlMTU2YzAxNTEwOGRlYzY2M2JiYThiMDQuanBnJywKCQkJCQkJYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAoJCQkJCQl0aW1lclByb2dyZXNzQmFyOiB0cnVlLAoJCQkJCQlzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsCgkJCQkJCXNob3dEZW55QnV0dG9uOiB0cnVlLAoJCQkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCQkJc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCgkJCQkJCWRlbnlCdXR0b25UZXh0OiAn5ZO85ZO85ZO85ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWK5ZWKJywKCQkJCQl9KTsKCQkJCQltZXNzYWdlLmluZm8oIuaIkOWwse+8muS9oOinpuWPkeS6huS4gOS4qmhvbW/nibnmnInnmoTlvanom4vvvIEiKTsKCQkJCQlzZXRUaW1lb3V0KCgpID0+IHsKCQkJCQkJU3dhbC5maXJlKHsKCQkJCQkJCXRpdGxlOiAnMTE0NTE0MTkxOTgxMCcsCgkJCQkJCQl0ZXh0Oidob21v54m55pyJ55qE5pWw5a2X5b2T54S25LiN6KGM5ZWmLi4u5ZCX77yfJywKCQkJCQkJCWljb246ICdxdWVzdGlvbicsCgkJCQkJCQlpbWFnZVVybDogJ2h0dHBzOi8vbGgxLmhldGFvdXNlcmNvbnRlbnQuY29tL2ltZy83ZDRjMWMwYjRhZGIwZTk1LmpwZycsCgkJCQkJCQlzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsCgkJCQkJCQlhbGxvd091dHNpZGVDbGljazogZmFsc2UsCgkJCQkJCX0pOwoJCQkJCQlzZXRUaW1lb3V0KCgpID0+IHsKCQkJCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJywgcGFuLm51bSk7CgkJCQkJCQltZXNzYWdlLnN1Y2Nlc3MoIuaIkOWwse+8muWTvOWTvOWTvOWViuWViuWViuWViuWViuWViuWViuWViuWcsOazqOWFpeaIkOWKnyjllpwpIik7CgkJCQkJCQlzZXRUaW1lb3V0KCgpID0+IHsKCQkJCQkJCQloaXN0b3J5LmdvKDApOwoJCQkJCQkJfSwgMzAwMCk7CgkJCQkJCX0sIDMwMDApCgkJCQkJfSwgNDAwMCkKCQkJCX0gZWxzZSB7CgkJCQkJY29uc29sZS5sb2coIuOAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkVxu5pqX5Y+36ZSZ6K+vIikKCQkJCQlhd2FpdCBTd2FsLmZpcmUoewoJCQkJCQlpbWFnZVVybDogcGFuLmltZywKCQkJCQkJdGl0bGU6IHBhbi5pbml0WzNdLAoJCQkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCQkJc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCgkJCQkJCWh0bWw6IGA8ZGl2PjxzcGFuPiR7cGFuLmluaXRbNF19PGJyPuS9oOWPr+S7peWcqOi/lOWbnuWQjumAieaLqeKAnOazqOWFpeKAneeri+WNs+eCueS6ruaMiemSru+8jDxicj7miJbogIXlnKjovpPlhaXmoYbplK7lhaXku6XkuIvmmpflj7fvvJrigJwke3Bhbi5udW194oCd44CCPC9zcGFuPjwvZGl2PmAsCgkJCQkJCWNvbmZpcm1CdXR0b25UZXh0OiAn6YeN5paw6L6T5YWlJywKCQkJCQl9KTsKCQkJCQlhd2FpdCB0aGlzLmluaXREaWFsb2coKTsKCQkJCQlyZXR1cm47CgkJCQl9OwoJCQl9CgkJfSwKCX07CgoJLy/nmb7luqbnvZHnm5gKCWxldCBiYWlkdSA9IHsKCgkJX2dldEV4dHJhKCkgewoJCQlsZXQgc2VLZXkgPSBkZWNvZGVVUklDb21wb25lbnQoYmFzZS5nZXRDb29raWUoJ0JEQ0xORCcpKTsKCQkJcmV0dXJuICd7JyArICcic2VrZXkiOiInICsgc2VLZXkgKyAnIicgKyAifSI7CgkJfSwKCgkJX2dldFN1cmwoKSB7CgkJCWxldCByZWcgPSAvKD88PXNcL3xzdXJsPSkoW2EtekEtWjAtOV8tXSspL2c7CgkJCWlmIChyZWcudGVzdChsb2NhdGlvbi5ocmVmKSkgewoJCQkJcmV0dXJuIGxvY2F0aW9uLmhyZWYubWF0Y2gocmVnKVswXTsKCQkJfQoJCQlyZXR1cm4gJyc7CgkJfSwKCgkJX2dldEZpZExpc3QoKSB7CgkJCWxldCBmaWRsaXN0ID0gW107CgkJCXNlbGVjdExpc3QuZm9yRWFjaCh2ID0+IHsKCQkJCWlmICgrdi5pc2RpciA9PT0gMSkgcmV0dXJuOwoJCQkJZmlkbGlzdC5wdXNoKHYuZnNfaWQpOwoJCQl9KTsKCQkJcmV0dXJuICdbJyArIGZpZGxpc3QgKyAnXSc7CgkJfSwKCgkJX3Jlc2V0RGF0YSgpIHsKCQkJcHJvZ3Jlc3MgPSB7fTsKCQkJJC5lYWNoKHJlcXVlc3QsIChrZXkpID0+IHsKCQkJCShyZXF1ZXN0W2tleV0pLmFib3J0KCk7CgkJCX0pOwoJCQkkLmVhY2goaW5zLCAoa2V5KSA9PiB7CgkJCQljbGVhckludGVydmFsKGluc1trZXldKTsKCQkJfSk7CgkJCWlkbSA9IHt9OwoJCQlpbnMgPSB7fTsKCQkJcmVxdWVzdCA9IHt9OwoJCX0sCgoJCXNldEJEVVNTKCkgewoJCQl0cnkgewoJCQkJR01fY29va2llICYmIEdNX2Nvb2tpZSgnbGlzdCcsIHtuYW1lOiAnQkRVU1MnfSwgKGNvb2tpZXMsIGVycm9yKSA9PiB7CgkJCQkJaWYgKCFlcnJvcikgewoJCQkJCQliYXNlLnNldFN0b3JhZ2UoImJhaWR1eXVuUGx1Z2luX0JEVVNTIiwge0JEVVNTOiBjb29raWVzWzBdLnZhbHVlfSk7CgkJCQkJfQoJCQkJfSk7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCWNvbnNvbGUuZXJyb3IoIuOAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkVxuc2V0QkRVU1NcbumUmeivr+S/oeaBr++8miIsZSkKCQkJfQoJCX0sCgoJCWdldEJEVVNTKCkgewoJCQlsZXQgYmFpZHV5dW5QbHVnaW5fQkRVU1MgPSBiYXNlLmdldFN0b3JhZ2UoJ2JhaWR1eXVuUGx1Z2luX0JEVVNTJykgPyBiYXNlLmdldFN0b3JhZ2UoJ2JhaWR1eXVuUGx1Z2luX0JEVVNTJykgOiAneyJiYWlkdXl1blBsdWdpbl9CRFVTUyI6IiJ9JzsKCQkJcmV0dXJuIGJhaWR1eXVuUGx1Z2luX0JEVVNTLkJEVVNTIHx8ICcnOwoJCX0sCgoJCWNvbnZlcnRMaW5rVG9BcmlhKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlsZXQgQkRVU1MgPSB0aGlzLmdldEJEVVNTKCk7CgkJCWlmICghIUJEVVNTKSB7CgkJCQlmaWxlbmFtZSA9IGJhc2UuZml4RmlsZW5hbWUoZmlsZW5hbWUpOwoJCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYXJpYTJjICIke2xpbmt9IiAtLW91dCAiJHtmaWxlbmFtZX0iIC0taGVhZGVyICJVc2VyLUFnZW50OiAke3VhfSIgLS1oZWFkZXIgIkNvb2tpZTogQkRVU1M9JHtCRFVTU30iYCk7CgkJCX0KCQkJcmV0dXJuIHsKCQkJCWxpbms6IHBhbi5hc3Npc3RhbnQsCgkJCQl0ZXh0OiBwYW4uaW5pdFs1XQoJCQl9OwoJCX0sCgoJCWNvbnZlcnRMaW5rVG9CQyhsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJbGV0IEJEVVNTID0gdGhpcy5nZXRCRFVTUygpOwoJCQlpZiAoISFCRFVTUykgewoJCQkJbGV0IGNvb2tpZSA9IGBCRFVTUz0ke0JEVVNTfWA7CgkJCQlsZXQgYmMgPSBgQUEvJHtlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpfS8/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpbmspfSZjb29raWU9JHtlbmNvZGVVUklDb21wb25lbnQoY29va2llKX0mdXNlcl9hZ2VudD0ke2VuY29kZVVSSUNvbXBvbmVudCh1YSl9WlpgOwoJCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYmM6Ly9odHRwLyR7YmFzZS5lbmNvZGUoYmMpfWApOwoJCQl9CgkJCXJldHVybiB7CgkJCQlsaW5rOiBwYW4uYXNzaXN0YW50LAoJCQkJdGV4dDogcGFuLmluaXRbNV0KCQkJfTsKCQl9LAoKCQljb252ZXJ0TGlua1RvQ3VybChsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJbGV0IEJEVVNTID0gdGhpcy5nZXRCRFVTUygpOwoJCQlpZiAoISFCRFVTUykgewoJCQkJbGV0IHRlcm1pbmFsID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyk7CgkJCQlmaWxlbmFtZSA9IGJhc2UuZml4RmlsZW5hbWUoZmlsZW5hbWUpOwoJCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgJHt0ZXJtaW5hbCAhPT0gJ3dwJyA/ICdjdXJsJyA6ICdjdXJsLmV4ZSd9IC1MIC1DIC0gIiR7bGlua30iIC1vICIke2ZpbGVuYW1lfSIgLUEgIiR7dWF9IiAtYiAiQkRVU1M9JHtCRFVTU30iYCk7CgkJCX0KCQkJcmV0dXJuIHsKCQkJCWxpbms6IHBhbi5hc3Npc3RhbnQsCgkJCQl0ZXh0OiBwYW4uaW5pdFs1XQoJCQl9OwoJCX0sCgoJCWFkZFBhZ2VMaXN0ZW5lcigpIHsKCQkJZnVuY3Rpb24gX2ZhY3RvcnkoZSkgewoJCQkJbGV0IHRhcmdldCA9ICQoZS50YXJnZXQpOwoJCQkJbGV0IGl0ZW0gPSB0YXJnZXQucGFyZW50cygnLnBsLWl0ZW0nKTsKCQkJCWxldCBsaW5rID0gaXRlbS5maW5kKCcucGwtaXRlbS1saW5rJyk7CgkJCQlsZXQgcHJvZ3Jlc3MgPSBpdGVtLmZpbmQoJy5wbC1pdGVtLXByb2dyZXNzJyk7CgkJCQlsZXQgdGlwID0gaXRlbS5maW5kKCcucGwtaXRlbS10aXAnKTsKCQkJCWxldCBjb3B5ID0gaXRlbS5maW5kKCcucGwtaXRlbS1jb3B5Jyk7CgkJCQlsZXQgaG93aWRtID0gaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3MtaG93Jyk7CgkJCQlsZXQgYmFjayA9IGl0ZW0uZmluZCgnLnBsLXByb2dyZXNzLWJhY2snKTsKCQkJCWxldCBzdG9wID0gaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3Mtc3RvcCcpOwoJCQkJcmV0dXJuIHsKCQkJCQlpdGVtLCBsaW5rLCBwcm9ncmVzcywgdGlwLCBjb3B5LCBob3dpZG0sIGJhY2ssIHN0b3AsIHRhcmdldCwKCQkJCX07CgkJCX0KCgkJCWZ1bmN0aW9uIF9yZXNldChpKSB7CgkJCQlpbnNbaV0gJiYgY2xlYXJJbnRlcnZhbChpbnNbaV0pOwoJCQkJcmVxdWVzdFtpXSAmJiByZXF1ZXN0W2ldLmFib3J0KCk7CgkJCQlwcm9ncmVzc1tpXSA9IDA7CgkJCQlpZG1baV0gPSBmYWxzZTsKCQkJfQoKCQkJZG9jLm9uKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2xpY2snLCAnLnBsLWJ1dHRvbi5nLWRyb3Bkb3duLWJ1dHRvbicsIChlKSA9PiB7CgkJCQlpZiAoZS50eXBlID09PSAnbW91c2VsZWF2ZScpIHsKCQkJCQkkKGUuY3VycmVudFRhcmdldCkucmVtb3ZlQ2xhc3MoJ2J1dHRvbi1vcGVuJyk7CgkJCQl9IGVsc2UgewoJCQkJCSQoZS5jdXJyZW50VGFyZ2V0KS5hZGRDbGFzcygnYnV0dG9uLW9wZW4nKTsKCQkJCQkkKGUuY3VycmVudFRhcmdldCkuZmluZCgnLnBsLWRyb3Bkb3duLW1lbnUnKS5zaG93KCk7CgkJCQl9CgkJCX0pOwoJCQlkb2Mub24oJ21vdXNlbGVhdmUnLCAnLnBsLWJ1dHRvbi5nLWRyb3Bkb3duLWJ1dHRvbiAucGwtZHJvcGRvd24tbWVudScsIChlKSA9PiB7CgkJCQkkKGUuY3VycmVudFRhcmdldCkuaGlkZSgpOwoJCQl9KTsKCgkJCWRvYy5vbignY2xpY2snLCAnLnBsLWJ1dHRvbi1tb2RlJywgKGUpID0+IHsKCQkJCW1vZGUgPSBlLnRhcmdldC5kYXRhc2V0Lm1vZGU7CgkJCQlTd2FsLmZpcmUoewoJCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJCXNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKCQkJCQlodG1sOiBg6ZO+5o6l6I635Y+W5LitYCwKCQkJCQl3aWxsT3BlbjogZnVuY3Rpb24oKSB7CgkJCQkJCVN3YWwuc2hvd0xvYWRpbmcoKTsKCQkJCQl9CgkJCQl9KTsKCQkJCXRoaXMuZ2V0UENTTGluaygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcGknLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJbGV0IG8gPSBfZmFjdG9yeShlKTsKCQkJCWxldCAkd2lkdGggPSBvLml0ZW0uZmluZCgnLnBsLXByb2dyZXNzLWlubmVyJyk7CgkJCQlsZXQgJHRleHQgPSBvLml0ZW0uZmluZCgnLnBsLXByb2dyZXNzLWlubmVyLXRleHQnKTsKCQkJCWxldCBmaWxlbmFtZSA9IG8ubGlua1swXS5kYXRhc2V0LmZpbGVuYW1lOwoJCQkJbGV0IGluZGV4ID0gby5saW5rWzBdLmRhdGFzZXQuaW5kZXg7CgkJCQlfcmVzZXQoaW5kZXgpOwoJCQkJYmFzZS5nZXQoby5saW5rWzBdLmRhdGFzZXQubGluaywgeyJVc2VyLUFnZW50IjogcGFuLnVhfSwgJ2Jsb2InLCB7ZmlsZW5hbWUsIGluZGV4fSk7CgkJCQlsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTsgLy8g6K6w5b2V5LiL6L295byA5aeL5pe26Ze0CgkJCQlsZXQgcHJldkxvYWRlZCA9IDA7IC8vIOS4iuS4gOasoeeahOW3suS4i+i9veaVsOaNrumHjwoJCQkJbGV0IHByZXZUaW1lID0gc3RhcnRUaW1lOyAvLyDkuIrkuIDmrKHnmoTml7bpl7QKCQkJCWxldCBzaXplID0gTnVtYmVyKG8ubGlua1swXS5kYXRhc2V0LnNpemUpOwoJCQkJaW5zW2luZGV4XSA9IHNldEludGVydmFsKCgpID0+IHsKCQkJCQlsZXQgcHJvZyA9ICtwcm9ncmVzc1tpbmRleF0gfHwgMDsKCQkJCQlsZXQgaXNJRE0gPSBpZG1baW5kZXhdIHx8IGZhbHNlOwoKCQkJCQlpZiAoaXNJRE0pIHsKCQkJCQkJLy8g5aSE55CGSURN55qE5Luj56CBCgkJCQkJCW8udGlwLmhpZGUoKTsKCQkJCQkJby5wcm9ncmVzcy5oaWRlKCk7CgkJCQkJCW8uY29weS5zaG93KCk7CgkJCQkJCW8ubGluay50ZXh0KCfpk77mjqXlt7LooqtJRE3mjZXojrd+6K+35p+l55yLSURN5LiL6L2956qX5Y+j5ZOmIScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKS5zaG93KCk7CgkJCQkJCWNsZWFySW50ZXJ2YWwoaW5zW2luZGV4XSk7CgkJCQkJCXNldFRpbWVvdXQoCgkJCQkJCQlmdW5jdGlvbiAoKXsKCQkJCQkJCQlvLmxpbmsudGV4dCgn6YeN5paw5LiL6L29JykuYW5pbWF0ZSh7b3BhY2l0eTogJzEnfSwgInNsb3ciKTsKCQkJCQkJCX0sMjAwMAoJCQkJCQkpCgkJCQkJCWlkbVtpbmRleF0gPSBmYWxzZTsKCQkJCQl9IGVsc2UgewoJCQkJCQkvLyDlpITnkIbmma7pgJrkuIvovb3nmoTmg4XlhrUuLi4KCQkJCQkJbGV0IGN1cnJlbnRUaW1lID0gRGF0ZS5ub3coKTsKCQkJCQkJbGV0IGVsYXBzZWRUaW1lID0gY3VycmVudFRpbWUgLSBzdGFydFRpbWU7CgkJCQkJCWxldCB0b3RhbFByb2dyZXNzID0gcHJvZyAvIDEwMDsKCQkJCQkJbGV0IHRvdGFsRWxhcHNlZFNlY29uZHMgPSBlbGFwc2VkVGltZSAvIDEwMDA7CgkJCQkJCWxldCBlc3RpbWF0ZWRUb3RhbFRpbWVTZWNvbmRzID0gdG90YWxFbGFwc2VkU2Vjb25kcyAvIHRvdGFsUHJvZ3Jlc3M7CgkJCQkJCWxldCByZW1haW5pbmdUaW1lU2Vjb25kcyA9IGVzdGltYXRlZFRvdGFsVGltZVNlY29uZHMgLSB0b3RhbEVsYXBzZWRTZWNvbmRzOwoKCQkJCQkJLy8g5bCG5Ymp5L2Z5pe26Ze06L2s5o2i5Li65aSp44CB5pe244CB5YiG44CB56eSCgkJCQkJCWxldCByZW1haW5pbmdEYXlzID0gTWF0aC5mbG9vcihyZW1haW5pbmdUaW1lU2Vjb25kcyAvICg2MCAqIDYwICogMjQpKTsKCQkJCQkJcmVtYWluaW5nVGltZVNlY29uZHMgJT0gKDYwICogNjAgKiAyNCk7CgoJCQkJCQlsZXQgcmVtYWluaW5nSG91cnMgPSBNYXRoLmZsb29yKHJlbWFpbmluZ1RpbWVTZWNvbmRzIC8gKDYwICogNjApKTsKCQkJCQkJcmVtYWluaW5nVGltZVNlY29uZHMgJT0gKDYwICogNjApOwoKCQkJCQkJbGV0IHJlbWFpbmluZ01pbnV0ZXMgPSBNYXRoLmZsb29yKHJlbWFpbmluZ1RpbWVTZWNvbmRzIC8gNjApOwoJCQkJCQlsZXQgcmVtYWluaW5nU2Vjb25kcyA9IE1hdGguZmxvb3IocmVtYWluaW5nVGltZVNlY29uZHMgJSA2MCk7CgoJCQkJCQkvLyDorqHnrpfkuIvovb3pgJ/luqYKCQkJCQkJbGV0IGxvYWRlZCA9IHByb2cgKiBzaXplIC8gMTAwOyAvLyDlt7LkuIvovb3mlbDmja7ph48KCQkJCQkJbGV0IGN1cnJlbnRUaW1lRGlmZiA9IGN1cnJlbnRUaW1lIC0gcHJldlRpbWU7IC8vIOW9k+WJjeaXtumXtOS4juS4iuS4gOasoeaXtumXtOeahOW3ruWAvAoJCQkJCQlsZXQgbG9hZGVkRGlmZiA9IGxvYWRlZCAtIHByZXZMb2FkZWQ7IC8vIOW9k+WJjeW3suS4i+i9veaVsOaNrumHj+S4juS4iuS4gOasoeeahOW3ruWAvAoJCQkJCQlsZXQgZG93bmxvYWRTcGVlZCA9IChjdXJyZW50VGltZURpZmYgIT09IDApID8gbG9hZGVkRGlmZiAvIChjdXJyZW50VGltZURpZmYgLyAxMDAwKSA6IDA7IC8vIOS4i+i9vemAn+W6pu+8iOWNleS9je+8muWtl+iKgi/np5LvvIkKCgkJCQkJCS8vIOabtOaWsOS4iuS4gOasoeeahOaVsOaNrgoJCQkJCQlwcmV2TG9hZGVkID0gbG9hZGVkOwoJCQkJCQlwcmV2VGltZSA9IGN1cnJlbnRUaW1lOwoKCQkJCQkJLy8g5pu05pS555WM6Z2iCgkJCQkJCW8ubGluay5oaWRlKCk7CgkJCQkJCW8udGlwLmhpZGUoKTsKCQkJCQkJby5zdG9wLnNob3coKTsKCQkJCQkJby5jb3B5LmhpZGUoKTsKCQkJCQkJby5wcm9ncmVzcy5zaG93KCk7CgoJCQkJCQkvLyDmm7TmlrDov5vluqbmnaEKCQkJCQkJJHdpZHRoLmNzcygnd2lkdGgnLCBwcm9nICsgJyUnKTsKCgkJCQkJCS8vIOabtOaWsOi/m+W6puadoeaWh+acrAoJCQkJCQlsZXQgdGltZVRleHQgPSAnJzsKCQkJCQkJaWYgKE51bWJlci5pc0Zpbml0ZShyZW1haW5pbmdEYXlzKSAmJiByZW1haW5pbmdEYXlzID4gMCkgewoJCQkJCQkJdGltZVRleHQgPSByZW1haW5pbmdEYXlzICsgJ+WkqSAnICsgYmFzZS5yZXBhaXJUaW1lcihyZW1haW5pbmdIb3VycykgKyAn5pe2OicgKyBiYXNlLnJlcGFpclRpbWVyKHJlbWFpbmluZ01pbnV0ZXMpICsgJ+WIhjonICsgYmFzZS5yZXBhaXJUaW1lcihyZW1haW5pbmdTZWNvbmRzKSArICfnp5InOwoJCQkJCQl9IGVsc2UgaWYgKE51bWJlci5pc0Zpbml0ZShyZW1haW5pbmdIb3VycykgJiYgcmVtYWluaW5nSG91cnMgPiAwKSB7CgkJCQkJCQl0aW1lVGV4dCA9IGJhc2UucmVwYWlyVGltZXIocmVtYWluaW5nSG91cnMpICsgJ+aXtjonICsgYmFzZS5yZXBhaXJUaW1lcihyZW1haW5pbmdNaW51dGVzKSArICfliIY6JyArIGJhc2UucmVwYWlyVGltZXIocmVtYWluaW5nU2Vjb25kcykgKyAn56eSJzsKCQkJCQkJfSBlbHNlIGlmIChOdW1iZXIuaXNGaW5pdGUocmVtYWluaW5nTWludXRlcykgJiYgcmVtYWluaW5nTWludXRlcyA+IDApIHsKCQkJCQkJCXRpbWVUZXh0ID0gYmFzZS5yZXBhaXJUaW1lcihyZW1haW5pbmdNaW51dGVzKSArICfliIY6JyArIGJhc2UucmVwYWlyVGltZXIocmVtYWluaW5nU2Vjb25kcykgKyAn56eSJzsKCQkJCQkJfSBlbHNlIGlmIChOdW1iZXIuaXNGaW5pdGUocmVtYWluaW5nU2Vjb25kcykgJiYgcmVtYWluaW5nU2Vjb25kcyA+IDApIHsKCQkJCQkJCXRpbWVUZXh0ID0gcmVtYWluaW5nU2Vjb25kcyArICfnp5InOwoJCQkJCQl9IGVsc2UgaWYgKE51bWJlci5pc0Zpbml0ZShyZW1haW5pbmdTZWNvbmRzKSAmJiByZW1haW5pbmdTZWNvbmRzID09PSAwKSB7CgkJCQkJCQl0aW1lVGV4dCA9ICfljbPlsIblrozmiJAnOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJdGltZVRleHQgPSAn6K6h566X5LitLi4uJzsKCQkJCQkJfQoKCQkJCQkJbGV0IHNwZWVkVGV4dCA9Jyc7CgkJCQkJCXNwZWVkVGV4dCA9IGJhc2Uuc2l6ZUZvcm1hdChkb3dubG9hZFNwZWVkKQoKCgkJCQkJCWlmIChwdCA9PT0gJ3dhcCcpIHsKCQkJCQkJCSR0ZXh0LnRleHQocHJvZyArICclJyk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkdGV4dC50ZXh0KHByb2cgKyAnJSB8IOWJqeS9meaXtumXtO+8micgKyB0aW1lVGV4dCArICcgfCDpgJ/luqbvvJonICsgc3BlZWRUZXh0ICsgJy/np5InKTsKCQkJCQkJfQoKCQkJCQkJaWYgKHByb2cgPT09IDEwMCkgewoJCQkJCQkJc2V0VGltZW91dChmdW5jdGlvbiAoKXsKCQkJCQkJCQljbGVhckludGVydmFsKGluc1tpbmRleF0pOwoJCQkJCQkJCXByb2dyZXNzW2luZGV4XSA9IDA7CgkJCQkJCQkJby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1zdG9wJykuaGlkZSgpOwoJCQkJCQkJCW8uaG93aWRtLmhpZGUoKTsKCQkJCQkJCQkkdGV4dC50ZXh0KCfkuIvovb3lrozmiJDkuoYh5rWP6KeI5Zmo5LiL6L295qGG5bqU6K+l5by55Ye65p2l5LqG5ZOmficpOwoJCQkJCQkJCW8uYmFjay5zaG93KCkKCQkJCQkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uICgpewoJCQkJCQkJCQlvLmxpbmsudGV4dCgn6YeN5paw5LiL6L29JykuYW5pbWF0ZSh7b3BhY2l0eTogJzEnfSwgInNsb3ciKTsKCQkJCQkJCQl9LDMwMDApCgkJCQkJCQl9LDMwMDApCgkJCQkJCX0KCQkJCQl9CgkJCQl9LCA1MDApOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItcmV0cnknLCBhc3luYyAoZSkgPT4gewoJCQkJbGV0IG8gPSBfZmFjdG9yeShlKTsKCQkJCW8udGlwLmhpZGUoKTsKCQkJCW8ubGluay5zaG93KCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1ob3cnLCBhc3luYyAoZSkgPT4gewoJCQkJbGV0IG8gPSBfZmFjdG9yeShlKTsKCQkJCWxldCBpbmRleCA9IG8ubGlua1swXS5kYXRhc2V0LmluZGV4OwoJCQkJaWYgKHJlcXVlc3RbaW5kZXhdKSB7CgkJCQkJcmVxdWVzdFtpbmRleF0uYWJvcnQoKTsKCQkJCQljbGVhckludGVydmFsKGluc1tpbmRleF0pOwoJCQkJCW8ucHJvZ3Jlc3MuaGlkZSgpOwoJCQkJCW8udGlwLnNob3coKTsKCQkJCX0KCgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1zdG9wJywgYXN5bmMgKGUpID0+IHsKCQkJCWxldCBvID0gX2ZhY3RvcnkoZSk7CgkJCQlsZXQgaW5kZXggPSBvLmxpbmtbMF0uZGF0YXNldC5pbmRleDsKCQkJCWlmIChyZXF1ZXN0W2luZGV4XSkgewoJCQkJCXJlcXVlc3RbaW5kZXhdLmFib3J0KCk7CgkJCQkJY2xlYXJJbnRlcnZhbChpbnNbaW5kZXhdKTsKCQkJCQlvLml0ZW0uZmluZCgnLnBsLXByb2dyZXNzLWlubmVyLXRleHQnKS50ZXh0KCfmraPlnKjlj5bmtoguLi4nKTsKCQkJCQlvLml0ZW0uZmluZCgnLnBsLXByb2dyZXNzLWlubmVyJykuY3NzKCd3aWR0aCcsIDEwMCArICclJyk7CgkJCQkJc2V0VGltZW91dChmdW5jdGlvbigpewoJCQkJCQlvLnRpcC5oaWRlKCk7CgkJCQkJCW8uYmFjay5oaWRlKCk7CgkJCQkJCW8ubGluay5zaG93KDApOwoJCQkJCQlvLmNvcHkuc2hvdygpOwoJCQkJCQlvLnByb2dyZXNzLmhpZGUoKTsKCQkJCQkJby5zdG9wLmhpZGUoKTsKCQkJCQl9LDEwNTApCgkJCQl9CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1iYWNrJywgYXN5bmMgKGUpID0+IHsKCQkJCWxldCBvID0gX2ZhY3RvcnkoZSk7CgkJCQlvLnByb2dyZXNzLmhpZGUoKTsKCQkJCW8udGlwLmhpZGUoKTsKCQkJCW8ubGluay5zaG93KCk7CgkJCQlvLmNvcHkuc2hvdygpOwoJCQkJby5zdG9wLmhpZGUoKTsKCQkJCW8uYmFjay5oaWRlKCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFsbCcsIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQlpZiAoIWUudGFyZ2V0LmRhdGFzZXQubGluaykgewoJCQkJCSQoZS50YXJnZXQpLnJlbW92ZUNsYXNzKCdsaXN0ZW5lci1jb3B5LWFsbCcpLmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykuaHRtbChgJHtwYW4uaW5pdFs1XX3wn5GJPGEgaHJlZj0iJHtwYW4uYXNzaXN0YW50fSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJwbC1hIj7ngrnlh7vmraTlpITlronoo4U8L2E+8J+RiGApOwoJCQkJfSBlbHNlIHsKCQkJCQliYXNlLnNldENsaXBib2FyZChkZWNvZGVVUklDb21wb25lbnQoZS50YXJnZXQuZGF0YXNldC5saW5rKSk7CgkJCQkJJChlLnRhcmdldCkudGV4dCgn5aSN5Yi25oiQ5YqfJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQkJCXNldFRpbWVvdXQoCgkJCQkJCWZ1bmN0aW9uICgpewoJCQkJCQkJJChlLnRhcmdldCkudGV4dCgn6YeN5paw5aSN5Yi2JykuYW5pbWF0ZSh7b3BhY2l0eTogJzEnfSwgInNsb3ciKTsKCQkJCQkJfSwyMDAwCgkJCQkJKQoJCQkJfQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItZG93bmxvYWQtYWxsJywgKGUpID0+IHsKCQkJCSQoJy5wbC1pdGVtLWxpbmsnKS5jbGljaygpOwoJCQkJJChlLnRhcmdldCkudGV4dCgn5LiL6L295byA5aeL77yM5LiL6L296L+b5bqm6KeB5LiK5pa55oyJ6ZKu5ZOmficpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCXNldFRpbWVvdXQoCgkJCQkJZnVuY3Rpb24gKCl7CgkJCQkJCSQoZS50YXJnZXQpLnRleHQoJ+S4i+i9veWFqOmDqOmTvuaOpScpLmFuaW1hdGUoe29wYWNpdHk6ICcxJ30sICJzbG93Iik7CgkJCQkJfSwyMDAwCgkJCQkpCgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLXJwYycsIGFzeW5jIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQlsZXQgdGFyZ2V0ID0gJChlLmN1cnJlbnRUYXJnZXQpOyAKCgkJCQl0YXJnZXQuZmluZCgnLmljb24nKS5yZW1vdmUoKTsKCQkJCXRhcmdldC5maW5kKCcucGwtbG9hZGluZycpLnJlbW92ZSgpOwoJCQkJdGFyZ2V0LnByZXBlbmQoYmFzZS5jcmVhdGVMb2FkaW5nKCkpOwoKCQkJCWxldCByZXMgPSBhd2FpdCB0aGlzLnNlbmRMaW5rVG9SUEMoZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuZmlsZW5hbWUsIGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmxpbmspOwoJCQkJaWYgKHJlcyA9PT0gJ3N1Y2Nlc3MnKSB7CgkJCQkJJCgnLmxpc3RlbmVyLXJwYy10YXNrJykuc2hvdygpOwoJCQkJCXRhcmdldC5yZW1vdmVDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoJ+WPkemAgeaIkOWKn+S6hiHlv6vljrvnnIvnnIvlkKd+JykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQkJfSBlbHNlIGlmIChyZXMgPT09ICdhc3Npc3RhbnQnKSB7CgkJCQkJdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykuaHRtbChgJHtwYW4uaW5pdFs1XX3wn5GJPGEgaHJlZj0iJHtwYW4uYXNzaXN0YW50fSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJwbC1hIj7ngrnlh7vmraTlpITlronoo4U8L2E+8J+RiGApOwoJCQkJfSBlbHNlIHsKCQkJCQl0YXJnZXQuYWRkQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS50ZXh0KCflj5HpgIHlpLHotKXvvIzmo4Dmn6XkuIDkuIvmgqjnmoRSUEPphY3nva7kv6Hmga/lk6YhJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQkJfQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItc2VuZC1ycGMnLCAoZSkgPT4gewoJCQkJJCgnLmxpc3RlbmVyLWxpbmstcnBjJykuY2xpY2soKTsKCQkJCSQoZS50YXJnZXQpLnRleHQoJ+WPkemAgeWujOaIkO+8jOWPkemAgee7k+aenOingeS4iuaWueaMiemSruWTpn4nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXNldHRpbmcnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dTZXR0aW5nKCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXdhcHNldHRpbmcnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dXYXBTZXR0aW5nKCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXVwZGF0ZWxvZycsICgpID0+IHsKCQkJCWJhc2Uuc2hvd1VwZGF0ZUxvZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItcnBjLXRhc2snLCAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJbGV0IHJwYyA9IEpTT04uc3RyaW5naWZ5KHsKCQkJCQlkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAoJCQkJCXBvcnQ6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKCQkJCX0pLCB1cmwgPSBgJHtwYW4uZH0vP3JwYz0ke2Jhc2UuZW5jb2RlKHJwYyl9IyR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKX1gOwoJCQkJR01fb3BlbkluVGFiKHVybCwge2FjdGl2ZTogdHJ1ZX0pOwoJCQl9KTsKCQkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCAoZSkgPT4gewoJCQkJaWYgKGUudGFyZ2V0Lm5vZGVOYW1lID09PSAnQScgJiYgfmUudGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mKCdwbC1hJykpIHsKCQkJCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJCQkJfQoJCQl9LCB0cnVlKTsKCQl9LAoKCQlhZGRCdXR0b24oKSB7CgkJCWlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpKXsKCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpLnJlbW92ZSgpCgkJCX0KCQkJd2FpdEZvcktleUVsZW1lbnRzKCIud3Atcy1oZWFkZXJfX3ZpcC1idG4tdGlwIiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IHZpcDEgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ3cC1zLWhlYWRlcl9fdmlwLWJ0bi10aXAiKVswXTsKCQkJCXZpcDEucmVtb3ZlKCk7CgkJCX0sdHJ1ZSk7CgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLmFwcC11c2VyLXZpcC1jZW50ZXItdGlwIiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IHZpcDIgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJhcHAtdXNlci12aXAtY2VudGVyLXRpcCIpWzBdOwoJCQkJdmlwMi5yZW1vdmUoKTsKCQkJfSx0cnVlKTsKCQkJd2FpdEZvcktleUVsZW1lbnRzKCIud2ViLWhlYWRlci10ZXh0LXMtNDUiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgdmlwMyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ3ZWItaGVhZGVyLXRleHQtcy00NSIpOwoJCQkJdmlwMy5yZW1vdmUoKTsKCQkJfSx0cnVlKTsKCQkJd2FpdEZvcktleUVsZW1lbnRzKCIud3Atcy1oZWFkZXJfX3ZpcC1idG4iLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgdmlwNCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIndwLXMtaGVhZGVyX192aXAtYnRuIilbMF07CgkJCQl2aXA0LmlubmVyVGV4dCA9ICLkvJrlkZjkuK3lv4MiOwoJCQl9LHRydWUpOwoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi5LUWNIeUEiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgdmlwNSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIktRY0h5QSIpWzBdOwoJCQkJdmlwNS5pbm5lclRleHQgPSAi5Lya5ZGY5Lit5b+DIjsKCQkJfSx0cnVlKTsKCQkJd2FpdEZvcktleUVsZW1lbnRzKCIuZ09JYnpQYiIsIGZ1bmN0aW9uICgpIHsKCQkJCWxldCB2aXA2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZ09JYnpQYiIpWzBdOwoJCQkJdmlwNi5yZW1vdmUoKTsKCQkJfSx0cnVlKTsKCQkJd2FpdEZvcktleUVsZW1lbnRzKCIuYXBwLXVzZXItdmlwLWNlbnRlci1ib3giLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgdmlwNyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImFwcC11c2VyLXZpcC1jZW50ZXItYm94IHZpcC1jZW50ZXItdHlwZS0yIilbMF07CgkJCQl2aXA3LnJlbW92ZSgpOwoJCQl9LHRydWUpOwoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi51LXBvcG92ZXIiLCBmdW5jdGlvbiAoKSB7CgkJCQlzZXRJbnRlcnZhbChmdW5jdGlvbigpewoJCQkJCWxldCB2aXA4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgid3Atcy1oZWFkZXItdXNlcl9fdmlwLWNlbnRlciIpWzBdOwoJCQkJCWxldCBhcnJvdyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInBvcHBlcl9fYXJyb3ciKVswXTsKCQkJCQlpZih2aXA4KXsKCQkJCQkJdmlwOC5yZW1vdmUoKTsKCQkJCQl9CgkJCQkJaWYoYXJyb3cpewoJCQkJCQlhcnJvdy5yZW1vdmUoKTsKCQkJCQl9OwoJCQkJfSwxMCkKCQkJfSx0cnVlKTsKCQkJd2FpdEZvcktleUVsZW1lbnRzKCIud3Atcy1oZWFkZXItdXNlcl9fY3JlYXRlLXRlYW0tdGl0bGUiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgYWQxID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgid3Atcy1oZWFkZXItdXNlcl9fY3JlYXRlLXRlYW0tdGl0bGUiKVswXTsKCQkJCWFkMS5yZW1vdmUoKTsKCQkJfSx0cnVlKTsKCQkJd2FpdEZvcktleUVsZW1lbnRzKCIud3Atc2lkZS1vcHRpb25zIGctY2xlYXJmaXgiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgYWQyID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgid3Atc2lkZS1vcHRpb25zIGctY2xlYXJmaXgiKVswXTsKCQkJCWFkMi5yZW1vdmUoKTsKCQkJfSx0cnVlKTsKCQkJd2FpdEZvcktleUVsZW1lbnRzKCIud2ViLWhlYWRlci1hZC1pdGVtIiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IGFkMyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi53ZWItaGVhZGVyLWFkLWl0ZW0iKVswXTsKCQkJCWFkMy5yZW1vdmUoKTsKCQkJfSx0cnVlKTsKCQkJd2FpdEZvcktleUVsZW1lbnRzKCIud3Atcy1oZWFkZXJfX2dhbWUtZW50cnkiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgYWQ0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgid3Atcy1oZWFkZXJfX2dhbWUtZW50cnkiKVswXTsKCQkJCWFkNC5yZW1vdmUoKTsKCQkJfSx0cnVlKQoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi5vcGVyYXRlLWd1aWRlLWNsb3NlIiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IGFkd2luZG93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgib3BlcmF0ZS1ndWlkZS1jbG9zZSIpWzBdOwoJCQkJYWR3aW5kb3cuY2xpY2soKTsKCQkJfSx0cnVlKQoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi5uZC1vcGVyYXRlLWd1aWRhbmNlX19jbG9zZSIsIGZ1bmN0aW9uICgpIHsKCQkJCWxldCBhZHdpbmRvdyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm5kLW9wZXJhdGUtZ3VpZGFuY2VfX2Nsb3NlIilbMF07CgkJCQlhZHdpbmRvdy5jbGljaygpOwoJCQl9LHRydWUpCgkJCXdhaXRGb3JLZXlFbGVtZW50cygiY3R4LW1lbnUtY29udGFpbmVyIiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IGN0eG1lbnVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmN0eC1tZW51LWNvbnRhaW5lciIpOwoJCQkJY3R4bWVudXMuZm9yRWFjaChjdHhtZW51ID0+IGN0eG1lbnUucmVtb3ZlKCkpOwoJCQl9LHRydWUpCgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLm5ld0ljb24iLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgbmV3aWNvbjEgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJuZXdJY29uIilbMF07CgkJCQluZXdpY29uMS5yZW1vdmUoKTsKCQkJfSx0cnVlKTsKCQkJd2FpdEZvcktleUVsZW1lbnRzKCIudS1iYWRnZV9fY29udGVudCIsIGZ1bmN0aW9uICgpIHsKCQkJCWxldCBuZXdpY29uMiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInUtYmFkZ2VfX2NvbnRlbnQgaXMtZG90IilbMF07CgkJCQlpZihuZXdpY29uMikgewoJCQkJCW5ld2ljb24yLnJlbW92ZSgpOwoJCQkJfQoJCQl9LHRydWUpOwoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi53cC1zaWRlLW9wdGlvbnMtYnRuIiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IHFpeWUxID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgid3Atc2lkZS1vcHRpb25zIGctY2xlYXJmaXgiKVswXTsKCQkJCXFpeWUxLnJlbW92ZSgpOwoJCQl9LHRydWUpOwoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi5hcHAtZG93bmxvYWQiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgYXBwMSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImFwcC1kb3dubG9hZCIpWzBdOwoJCQkJYXBwMS5yZW1vdmUoKTsKCQkJfSx0cnVlKTsKCQkJaWYgKCFwdCkgcmV0dXJuOwoJCQlsZXQgJHRvb2xXcmFwOwoJCQlsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9ImctZHJvcGRvd24tYnV0dG9uIHBvaW50ZXIgcGwtYnV0dG9uIiBpZD0icGwtYnV0dG9uLWxpbmsiPjxkaXYgY2xhc3M9ImJhaWR1LWJ1dHRvbiBnLWJ1dHRvbiBnLWJ1dHRvbi1ibHVlIj48c3BhbiBjbGFzcz0iZy1idXR0b24tcmlnaHQiPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRvd25sb2FkIiBzdHlsZT0iY29sb3I6I2ZmZjsiPjwvZW0+PHNwYW4gY2xhc3M9InRleHQiIHN0eWxlPSJ3aWR0aDogNjBweDsiPuS4i+i9veWKqeaJizwvc3Bhbj48L3NwYW4+PC9kaXY+PGRpdiBjbGFzcz0ibWVudSIgc3R5bGU9ImNvbG9yOiAke2NvbG9yfTtib3JkZXItY29sb3I6ICR7Y29sb3J9O3dpZHRoOmF1dG87ei1pbmRleDo0MTsiPjxkaXYgY2xhc3M9ImctYnV0dG9uLW1lbnUgcGwtYnV0dG9uLW1vZGUiIHN0eWxlPSJwYWRkaW5nOiAwcHg7IiBkYXRhLW1vZGU9ImFwaSIgIj5BUEnkuIvovb08L2Rpdj48ZGl2IGNsYXNzPSJnLWJ1dHRvbi1tZW51IHBsLWJ1dHRvbi1tb2RlIiBzdHlsZT0icGFkZGluZzogMHB4OyIgZGF0YS1tb2RlPSJhcmlhIiAiPkFyaWHkuIvovb08L2Rpdj48ZGl2IGNsYXNzPSJnLWJ1dHRvbi1tZW51IHBsLWJ1dHRvbi1tb2RlIiBzdHlsZT0icGFkZGluZzogMHB4OyIgZGF0YS1tb2RlPSJycGMiICI+UlBD5LiL6L29PC9kaXY+PGRpdiBjbGFzcz0iZy1idXR0b24tbWVudSBwbC1idXR0b24tbW9kZSIgc3R5bGU9InBhZGRpbmc6IDBweDsiIGRhdGEtbW9kZT0iY3VybCIgIj5jVVJM5LiL6L29PC9kaXY+PGRpdiBjbGFzcz0iZy1idXR0b24tbWVudSBwbC1idXR0b24tbW9kZSIgc3R5bGU9InBhZGRpbmc6IDBweDsiIGRhdGEtbW9kZT0iYmMiICI+QkPkuIvovb08L2Rpdj48ZGl2IGNsYXNzPSJnLWJ1dHRvbi1tZW51IHBsLWJ1dHRvbi1tb2RlIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9InBhZGRpbmc6IDBweDsiICI+5Yqp5omL6K6+572uPC9kaXY+PGRpdiBjbGFzcz0iZy1idXR0b24tbWVudSBwbC1idXR0b24tbW9kZSBsaXN0ZW5lci1vcGVuLXVwZGF0ZWxvZyIgc3R5bGU9InBhZGRpbmc6IDBweDsiICI+5pu05paw5pel5b+XPC9kaXY+PC9kaXY+PC9kaXY+YCk7CgkJCWlmIChwdCA9PT0gJ2hvbWUnKSAkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CgkJCWlmIChwdCA9PT0gJ21haW4nKSB7CgkJCQkkdG9vbFdyYXAgPSAkKHBhbi5idG4ubWFpbik7CgkJCQkkYnV0dG9uID0gJChgPC9kaXY+PGRpdiBjbGFzcz0icGwtYnV0dG9uIiBpZD0icGwtYnV0dG9uLWxpbmsiIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgbWFyZ2luLXJpZ2h0OiA4cHg7Ij48YnV0dG9uIGNsYXNzPSJiYWlkdS1idXR0b24gdS1idXR0b24gdS1idXR0b24tLXByaW1hcnkgdS1idXR0b24tLXNtYWxsIGlzLXJvdW5kIGlzLWhhcy1pY29uIiBzdHlsZT0iZm9udC1zaXplOiAxNHB4OyBwYWRkaW5nOiA4cHggMTZweDsgaGVpZ2h0OiAzMnB4OyBib3JkZXI6IG5vbmU7Ij48aSBjbGFzcz0idS1pY29uIHUtaWNvbi1kb3dubG9hZCI+PC9pPjxzcGFuPuS4i+i9veWKqeaJizwvc3Bhbj48L2J1dHRvbj48dWwgY2xhc3M9ImRyb3Bkb3duLWxpc3QgbmQtY29tbW9uLWZsb2F0LW1lbnUgcGwtZHJvcGRvd24tbWVudSI+PGxpIGNsYXNzPSJwbC1idXR0b24tbW9kZSBzdWIgY3Vyc29yLXAiIGRhdGEtbW9kZT0iYXBpIj5BUEnkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtYnV0dG9uLW1vZGUgc3ViIGN1cnNvci1wIiBkYXRhLW1vZGU9ImFyaWEiPkFyaWHkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtYnV0dG9uLW1vZGUgc3ViIGN1cnNvci1wIiBkYXRhLW1vZGU9InJwYyI+UlBD5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWJ1dHRvbi1tb2RlIHN1YiBjdXJzb3ItcCIgZGF0YS1tb2RlPSJjdXJsIj5jVVJM5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWJ1dHRvbi1tb2RlIHN1YiBjdXJzb3ItcCIgZGF0YS1tb2RlPSJiYyI+QkPkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtYnV0dG9uLW1vZGUgc3ViIGN1cnNvci1wIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIiPuWKqeaJi+iuvue9rjwvbGk+PGxpIGNsYXNzPSJwbC1idXR0b24tbW9kZSBzdWIgY3Vyc29yLXAgbGlzdGVuZXItb3Blbi11cGRhdGVsb2ciPuabtOaWsOaXpeW/lzwvbGk+PC91bD48L2Rpdj5gKTsKCQkJfQoJCQlpZiAocHQgPT09ICdzaGFyZScpICR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CgkJCWlmIChwdCA9PT0gJ3dhcCcpIHsKCQkJCSR0b29sV3JhcCA9ICQoJy5tYWluLWNvbnRhaW5lcicpOwoJCQkJJGJ1dHRvbiA9ICQoYDxzcGFuIGlkPSJwbC1idXR0b24tbGluayIgY2xhc3M9IndhcGZvbnQgbm9uZS1wb2ludGVyIHBsLWJ1dHRvbiBiYWlkdS13YXAtYnV0dG9uIj48c3Bhbj48L3NwYW4+PHVsIGNsYXNzPSJkcm9wZG93bi1saXN0IG5kLWNvbW1vbi1mbG9hdC1tZW51IHBsLWRyb3Bkb3duLW1lbnUiIHN0eWxlPSJ0b3A6IDQwcHg7IHJpZ2h0OiAwOyI+PGxpIGNsYXNzPSJiYWlkdS13YXAtbW9kZSBwbC1idXR0b24tbW9kZSBzdWIgY3Vyc29yLXAiIGRhdGEtbW9kZT0iYXBpIj5BUEnkuIvovb08L2xpPjxsaSBjbGFzcz0iYmFpZHUtd2FwLW1vZGUgcGwtYnV0dG9uLW1vZGUgc3ViIGN1cnNvci1wIiBkYXRhLW1vZGU9ImFyaWEiPkFyaWHkuIvovb08L2xpPjxsaSBjbGFzcz0iYmFpZHUtd2FwLW1vZGUgcGwtYnV0dG9uLW1vZGUgc3ViIGN1cnNvci1wIiBkYXRhLW1vZGU9InJwYyI+UlBD5LiL6L29PC9saT48bGkgY2xhc3M9ImJhaWR1LXdhcC1tb2RlIHBsLWJ1dHRvbi1tb2RlIHN1YiBjdXJzb3ItcCIgZGF0YS1tb2RlPSJjdXJsIj5jVVJM5LiL6L29PC9saT48bGkgY2xhc3M9ImJhaWR1LXdhcC1tb2RlIHBsLWJ1dHRvbi1tb2RlIHN1YiBjdXJzb3ItcCIgZGF0YS1tb2RlPSJiYyI+QkPkuIvovb08L2xpPjxsaSBjbGFzcz0iYmFpZHUtd2FwLW1vZGUgcGwtYnV0dG9uLW1vZGUgc3ViIGN1cnNvci1wIGxpc3RlbmVyLW9wZW4td2Fwc2V0dGluZyIiPuWKqeaJi+iuvue9rjwvbGk+PC91bD48L3NwYW4+YCk7CgkJCQkkKCdoZWFkZXIgaDFbZGF0YS12LTU5Nzc5ZTM0XScpLmNzcyh7ImxlZnQiOiI3NSUifSkKCQkJCSR0b29sV3JhcC5hcHBlbmQoJGJ1dHRvbik7CgkJCX0gZWxzZSB7CgkJCQkkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKCQkJfQoJCQl0aGlzLnNldEJEVVNTKCk7CgkJCXRoaXMuYWRkUGFnZUxpc3RlbmVyKCk7CgkJfSwKCgkJYWRkSW5pdEJ1dHRvbigpIHsKCQkJaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikpewoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikucmVtb3ZlKCkKCQkJfQoJCQlpZiAoIXB0KSByZXR1cm47CgkJCWxldCAkdG9vbFdyYXA7CgkJCWxldCAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0iZy1kcm9wZG93bi1idXR0b24gcG9pbnRlciBwbC1idXR0b24taW5pdCIgaWQ9InBsLWJ1dHRvbi1saW5rIiBzdHlsZT0ib3BhY2l0eTowLjUiPjxkaXYgc3R5bGU9ImNvbG9yOiNmZmY7IiBjbGFzcz0iZy1idXR0b24gZy1idXR0b24tYmx1ZSI+PHNwYW4gY2xhc3M9ImctYnV0dG9uLXJpZ2h0Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kb3dubG9hZCIgc3R5bGU9ImNvbG9yOiNmZmY7Ij48L2VtPjxzcGFuIGNsYXNzPSJ0ZXh0IiBzdHlsZT0id2lkdGg6IDYwcHg7Ij7kuIvovb3liqnmiYs8L3NwYW4+PC9zcGFuPjwvZGl2PjwvZGl2PmApOwoJCQlpZiAocHQgPT09ICdob21lJykgewoJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLmhvbWUpOwoJCQl9CgkJCWlmIChwdCA9PT0gJ21haW4nKSB7CgkJCQkkdG9vbFdyYXAgPSAkKHBhbi5idG4ubWFpbik7CgkJCQkkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0icGwtYnV0dG9uLWluaXQiIGlkPSJwbC1idXR0b24tbGluayIgc3R5bGU9Im9wYWNpdHk6LjU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgbWFyZ2luLXJpZ2h0OiA4cHg7Ij48YnV0dG9uIGNsYXNzPSJiYWlkdS1idXR0b24gdS1idXR0b24gdS1idXR0b24tLXByaW1hcnkgdS1idXR0b24tLXNtYWxsIGlzLXJvdW5kIGlzLWhhcy1pY29uIiBzdHlsZT0iZm9udC1zaXplOiAxNHB4OyBwYWRkaW5nOiA4cHggMTZweDsgaGVpZ2h0OiAzMnB4OyBib3JkZXI6IG5vbmU7Ij48aSBjbGFzcz0idS1pY29uIHUtaWNvbi1kb3dubG9hZCI+PC9pPjxzcGFuPuS4i+i9veWKqeaJiyjmnKrngrnkuq4pPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmApOwoJCQl9CgkJCWlmIChwdCA9PT0gJ3NoYXJlJykgJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKCQkJaWYgKHB0ID09PSAnd2FwJykgewoJCQkJJHRvb2xXcmFwID0gJCgnLm1haW4tY29udGFpbmVyJyk7CgkJCQkkYnV0dG9uID0gJChgPHNwYW4gaWQ9InBsLWJ1dHRvbi1saW5rIiBjbGFzcz0id2FwZm9udCBub25lLXBvaW50ZXIgcGwtYnV0dG9uLWluaXQgYmFpZHUtd2FwLWJ1dHRvbiI+PHNwYW4+PC9zcGFuPjwvc3Bhbj5gKTsKCQkJCSQoJ2hlYWRlciBoMVtkYXRhLXYtNTk3NzllMzRdJykuY3NzKHsibGVmdCI6Ijc1JSJ9KQoJCQkJJHRvb2xXcmFwLmFwcGVuZCgkYnV0dG9uKTsKCQkJCSRidXR0b24uY2xpY2soKCkgPT4gYmFzZS5pbml0RGlhbG9nV2FwKCkpOwoJCQl9IGVsc2UgewoJCQkJJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CgkJCQkkYnV0dG9uLmNsaWNrKCgpID0+IGJhc2UuaW5pdERpYWxvZygpKTsKCQkJfQoJCX0sCgoJCWFzeW5jIGdldFRva2VuKCkgewoJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5nZXRGaW5hbFVybChwYW4ucGNzWzNdKTsKCQkJLy8g5aaC5p6c6L+U5Zue57uT5p6c5Lit5rKh5pyJ5YyF5ZCrJ2FjY2Vzc190b2tlbiflrZfnrKbkuLIKCQkJaWYgKHJlcy5pbmRleE9mKCdhY2Nlc3NfdG9rZW4nKSA9PT0gLTEpIHsKCgkJCQkvLyDkvb/nlKhhd2FpdOWFs+mUruWtl+etieW+hWJhc2UuZ2V05Ye95pWw55qE6L+U5Zue57uT5p6c77yM6I635Y+W572R6aG15YaF5a65CgkJCQlsZXQgaHRtbCA9IGF3YWl0IGJhc2UuZ2V0KHBhbi5wY3NbM10sIHt9LCAndGV4dCcpOwoKCQkJCS8vIOS9v+eUqOato+WImeihqOi+vuW8j+WMuemFjWh0bWzkuK3nmoQnYmRzdG9rZW4n5ZKMJ2NsaWVudF9pZCcKCQkJCWxldCBiZHN0b2tlbiA9IGh0bWwubWF0Y2goL25hbWU9ImJkc3Rva2VuIlxzK3ZhbHVlPSIoW14iXSspIi8pPy5bMV07CgkJCQlsZXQgY2xpZW50X2lkID0gaHRtbC5tYXRjaCgvbmFtZT0iY2xpZW50X2lkIlxzK3ZhbHVlPSIoW14iXSspIi8pPy5bMV07CgoJCQkJLy8g5p6E5bu65LiA5Liq5YyF5ZCr5omA6ZyA5Y+C5pWw55qE5pWw5o2u5a+56LGh77yM5YyF5ZCr55m+5bqm5o6I5p2D5omA6ZyA5Y+C5pWwCgkJCQlsZXQgZGF0YSA9IHsKCQkJCQlncmFudF9wZXJtaXNzaW9uc19hcnI6ICduZXRkaXNrJywKCQkJCQliZHN0b2tlbjogYmRzdG9rZW4sCgkJCQkJY2xpZW50X2lkOiBjbGllbnRfaWQsCgkJCQkJcmVzcG9uc2VfdHlwZTogInRva2VuIiwKCQkJCQlkaXNwbGF5OiAicGFnZSIsCgkJCQkJZ3JhbnRfcGVybWlzc2lvbnM6ICJiYXNpYyxuZXRkaXNrIgoJCQkJfQoKCQkJCS8vIOWQkeacjeWKoeWZqOWPkemAgVBPU1Tor7fmsYLvvIzlrp7njrDoh6rliqjmjojmnYMKCQkJCWF3YWl0IGJhc2UucG9zdChwYW4ucGNzWzNdLCBiYXNlLnN0cmluZ2lmeShkYXRhKSwgewoJCQkJCSdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJywKCQkJCX0pCgoJCQkJLy8g5o6I5p2D5a6M5ZCO5YaN5qyh6I635Y+WJ2FjY2Vzc190b2tlbicKCQkJCWxldCByZXMyID0gYXdhaXQgYmFzZS5nZXRGaW5hbFVybChwYW4ucGNzWzNdKTsKCQkJCWxldCBhY2Nlc3NUb2tlbiA9IHJlczIubWF0Y2goL2FjY2Vzc190b2tlbj0oW14mXSspLyk/LlsxXTsKCQkJCWFjY2Vzc1Rva2VuICYmIGJhc2Uuc2V0U3RvcmFnZSgnYWNjZXNzVG9rZW4nLCBhY2Nlc3NUb2tlbik7CgkJCQlyZXR1cm4gYWNjZXNzVG9rZW47CgkJCX0KCQkJLy8g5aaC5p6c5bey5pyJJ2FjY2Vzc190b2tlbifvvIzliJnojrflj5bmlrDnmoQnYWNjZXNzX3Rva2VuJwoJCQlsZXQgYWNjZXNzVG9rZW4gPSByZXMubWF0Y2goL2FjY2Vzc190b2tlbj0oW14mXSspLyk/LlsxXTsKCQkJYWNjZXNzVG9rZW4gJiYgYmFzZS5zZXRTdG9yYWdlKCdhY2Nlc3NUb2tlbicsIGFjY2Vzc1Rva2VuKTsKCQkJcmV0dXJuIGFjY2Vzc1Rva2VuOwoJCX0sCgoJCWFzeW5jIGdldFBDU0xpbmsobWF4UmVxdWVzdFRpbWUgPSAyKSB7CgkJCXNlbGVjdExpc3QgPSB0aGlzLmdldFNlbGVjdGVkTGlzdCgpOwoJCQlsZXQgZmlkTGlzdCA9IHRoaXMuX2dldEZpZExpc3QoKSwgdXJsLCByZXM7CgoJCQlpZiAocHQgPT09ICdob21lJyB8fCBwdCA9PT0gJ21haW4nIHx8IHB0ID09PSAnd2FwJykgewoJCQkJaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CgkJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7lhYjli77pgInopoHkuIvovb3nmoTmlofku7bmjY9+Jyk7CgkJCQl9CgkJCQlpZiAoZmlkTGlzdC5sZW5ndGggPT09IDIpIHsKCQkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+aJk+W8gOaWh+S7tuWkueWQjuWGjeWLvumAieaWh+S7tn4nKTsKCQkJCX0KCQkJCWZpZExpc3QgPSBlbmNvZGVVUklDb21wb25lbnQoZmlkTGlzdCk7CgkJCQlsZXQgYWNjZXNzVG9rZW4gPSBiYXNlLmdldFN0b3JhZ2UoJ2FjY2Vzc1Rva2VuJykgfHwgYXdhaXQgdGhpcy5nZXRUb2tlbigpOwoJCQkJdXJsID0gYCR7cGFuLnBjc1swXX0mZnNpZHM9JHtmaWRMaXN0fSZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gOwoJCQkJcmVzID0gYXdhaXQgYmFzZS5nZXQodXJsLCB7IlVzZXItQWdlbnQiOiBwYW4udWF9KTsKCQkJfQoJCQlpZiAocHQgPT09ICdzaGFyZScpIHsKCQkJCXRoaXMuZ2V0U2hhcmVEYXRhKCk7CgkJCQlpZiAoc2VsZWN0TGlzdC5sZW5ndGggPT09IDApIHsKCQkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+WFiOWLvumAieimgeS4i+i9veeahOaWh+S7tuaNj34nKTsKCQkJCX0KCQkJCWlmIChmaWRMaXN0Lmxlbmd0aCA9PT0gMikgewoJCQkJCXJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+6K+35omT5byA5paH5Lu25aS55ZCO5YaN5Yu+6YCJ5paH5Lu2ficpOwoJCQkJfQoJCQkJaWYgKCFwYXJhbXMuc2lnbikgewoJCQkJCWxldCB1cmwgPSBgJHtwYW4ucGNzWzJdfSZzdXJsPSR7cGFyYW1zLnN1cmx9JmxvZ2lkPSR7cGFyYW1zLmxvZ2lkfWA7CgkJCQkJbGV0IHIgPSBhd2FpdCBiYXNlLmdldCh1cmwpOwoJCQkJCWlmIChyLmVycm5vID09PSAwKSB7CgkJCQkJCXBhcmFtcy5zaWduID0gci5kYXRhLnNpZ247CgkJCQkJCXBhcmFtcy50aW1lc3RhbXAgPSByLmRhdGEudGltZXN0YW1wOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWxldCBkaWFsb2cgPSBhd2FpdCBTd2FsLmZpcmUoewoJCQkJCQkJdG9hc3Q6IHRydWUsCgkJCQkJCQlpY29uOiAnaW5mbycsCgkJCQkJCQl0aXRsZTogYOaPkOekuu+8mjxicj7or7flsIbmlofku7Y8c3BhbiBjbGFzcz0idGFnLWRhbmdlciI+W+S/neWtmOWIsOe9keebmF08L3NwYW4+5ZCO5YaN8J+RieWJjeW+gDxzcGFuIGNsYXNzPSJ0YWctZGFuZ2VyIj5b5oiR55qE572R55uYXTwvc3Bhbj7kuK3kuIvovb3lk6YhYCwKCQkJCQkJCXNob3dDb25maXJtQnV0dG9uOiB0cnVlLAoJCQkJCQkJY29uZmlybUJ1dHRvblRleHQ6ICfngrnlh7vkv53lrZgnLAoJCQkJCQkJcG9zaXRpb246ICd0b3AnLAoJCQkJCQl9KTsKCQkJCQkJaWYgKGRpYWxvZy5pc0NvbmZpcm1lZCkgewoJCQkJCQkJJCgnLnRvb2xzLXNoYXJlLXNhdmUtaGInKVswXS5jbGljaygpOwoJCQkJCQl9CgkJCQkJCXJldHVybjsKCQkJCQl9CgkJCQl9CgkJCQlpZiAoIXBhcmFtcy5iZHN0b2tlbikgewoJCQkJCXJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+6K+35YWI55m75b2V572R55uYficpOwoJCQkJfQoJCQkJbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CgkJCQlmb3JtRGF0YS5hcHBlbmQoJ2VuY3J5cHQnLCBwYXJhbXMuZW5jcnlwdCk7CgkJCQlmb3JtRGF0YS5hcHBlbmQoJ3Byb2R1Y3QnLCBwYXJhbXMucHJvZHVjdCk7CgkJCQlmb3JtRGF0YS5hcHBlbmQoJ3VrJywgcGFyYW1zLnVrKTsKCQkJCWZvcm1EYXRhLmFwcGVuZCgncHJpbWFyeWlkJywgcGFyYW1zLnByaW1hcnlpZCk7CgkJCQlmb3JtRGF0YS5hcHBlbmQoJ2ZpZF9saXN0JywgZmlkTGlzdCk7CgkJCQlmb3JtRGF0YS5hcHBlbmQoJ2xvZ2lkJywgcGFyYW1zLmxvZ2lkKTsKCQkJCXBhcmFtcy5zaGFyZVR5cGUgPT09ICdzZWNyZXQnID8gZm9ybURhdGEuYXBwZW5kKCdleHRyYScsIHBhcmFtcy5leHRyYSkgOiAnJzsKCQkJCXVybCA9IGAke3Bhbi5wY3NbMV19JnNpZ249JHtwYXJhbXMuc2lnbn0mdGltZXN0YW1wPSR7cGFyYW1zLnRpbWVzdGFtcH1gOwoJCQkJcmVzID0gYXdhaXQgYmFzZS5wb3N0KHVybCwgZm9ybURhdGEsIHsiVXNlci1BZ2VudCI6IHBhbi51YX0pOwoJCQl9CgkJCWlmIChyZXMuZXJybm8gPT09IDApIHsKCQkJCWxldCBodG1sID0gdGhpcy5nZW5lcmF0ZURvbShyZXMubGlzdCk7CgkJCQl0aGlzLnNob3dNYWluRGlhbG9nKHBhblttb2RlXVswXSwgaHRtbCwgcGFuW21vZGVdWzFdKTsKCQkJfSBlbHNlIGlmIChyZXMuZXJybm8gPT09IDExMikgewoJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7pobXpnaLov4fmnJ/kuobvvIzliLfmlrDph43or5XkuIvlkKd+Jyk7CgkJCX0gZWxzZSBpZiAocmVzLmVycm5vID09PSA5MDE5KSB7CgkJCQltYXhSZXF1ZXN0VGltZS0tOwoJCQkJYXdhaXQgdGhpcy5nZXRUb2tlbigpOwoJCQkJaWYgKG1heFJlcXVlc3RUaW1lID4gMCkgewoJCQkJCWF3YWl0IHRoaXMuZ2V0UENTTGluayhtYXhSZXF1ZXN0VGltZSk7CgkJCQl9IGVsc2UgewoJCQkJCW1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7ojrflj5bkuIvovb3pk77mjqXlpLHotKXvvIzliLfmlrDnvZHpobXlkI7lho3or5Xor5XlkKd+Jyk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQltZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+6I635Y+W5LiL6L296ZO+5o6l5aSx6LSl77yM5Yi35paw572R6aG15ZCO5LiN6KGM55qE6K+d5YaN6K+V6K+V6YeN5paw55m75b2V572R55uY5ZCnficpOwoJCQl9CgkJfSwKCgkJZ2VuZXJhdGVEb20obGlzdCkgewoJCQlsZXQgY29udGVudCA9ICc8ZGl2IGNsYXNzPSJwbC1tYWluIj4nOwoJCQlsZXQgYWxpbmtBbGxUZXh0ID0gJyc7CgkJCWJhc2Uuc29ydEJ5TmFtZShsaXN0KTsKCQkJbGlzdC5mb3JFYWNoKCh2LCBpKSA9PiB7CgkJCQlpZiAodi5pc2RpciA9PT0gMSkgcmV0dXJuOwoJCQkJbGV0IGZpbGVuYW1lID0gdi5zZXJ2ZXJfZmlsZW5hbWUgfHwgdi5maWxlbmFtZTsKCQkJCWxldCBleHQgPSBiYXNlLmdldEV4dGVuc2lvbihmaWxlbmFtZSk7CgkJCQlsZXQgc2l6ZSA9IGJhc2Uuc2l6ZUZvcm1hdCh2LnNpemUpOwoJCQkJbGV0IGRsaW5rID0gdi5kbGluazsKCQkJCWlmIChwdCA9PT0gJ3dhcCcpIHsKCQkJCQlpZiAobW9kZSA9PT0gJ2FwaScpIHsKCQkJCQkJYWxpbmtBbGxUZXh0ICs9IGRsaW5rICsgJ1xyXG4nOwoJCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9IiBzdHlsZT0iZGlzcGxheTogbm9uZSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIGxpc3RlbmVyLWxpbmstYXBpIiBocmVmPSIke2RsaW5rfSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iIGRhdGEtc2l6ZT0iJHt2LnNpemV9IiBkYXRhLWluZGV4PSIke2l9Ij4ke2RsaW5rfTxicj7kuIvovb0gICR7ZmlsZW5hbWV9PC9hPgoJCQkJCQkJCQk8YnV0dG9uIGNsYXNzPSJwbC1pdGVtLWNvcHkgcGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGhyZWY9IiR7ZGxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi26ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSI+5aSN5Yi26ZO+5o6lPC9idXR0b24+CgkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tdGlwIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+PHNwYW4+6Iul5rKh5pyJ5by55Ye6SURN5LiL6L295qGG77yM5om+5YiwSURNIDxiPumAiemhuTwvYj4gLT4gPGI+5paH5Lu257G75Z6LPC9iPiAtPiA8Yj7nrKzkuIDkuKrmoYY8L2I+IOS4rea3u+WKoOWQjue8gCA8c3BhbiBjbGFzcz0icGwtZXh0Ij4ke2V4dH08L3NwYW4+77yMPGEgaHJlZj0iJHtwYW4uaWRtfSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJwbC1hIj7or6bop4HmraTlpIQ8L2E+PC9zcGFuPiA8c3BhbiBjbGFzcz0icGwtYmFjayBsaXN0ZW5lci1iYWNrIj7ov5Tlm548L3NwYW4+PC9kaXY+CgkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tcHJvZ3Jlc3MiIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KCQkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLXByb2dyZXNzIj4KCQkJCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1wcm9ncmVzcy1vdXRlciI+PC9kaXY+CgkJCQkJCQkJCQkJPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3MtaW5uZXIiIHN0eWxlPSJ3aWR0aDo1JSI+CgkJCQkJCQkJCQkJPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3MtaW5uZXItdGV4dCI+5q2j5Zyo5Yqg6L296L+b5bqmLi4uMCU8L2Rpdj4KCQkJCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCQkJPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLXN0b3AgbGlzdGVuZXItc3RvcCI+5Y+W5raI5LiL6L29PC9zcGFuPgoJCQkJCQkJCQlgOwoJCQkJCQljb250ZW50ICs9IGA8c3BhbiBjbGFzcz0icGwtcHJvZ3Jlc3MtdGlwIiBzdHlsZT0iZGlzcGxheTogbm9uZSIgPuacquWPkeeOsElETe+8jOS9v+eUqOiHquW4pua1j+iniOWZqOS4i+i9vTwvc3Bhbj4KCQkJCQkJCQkJPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLWJhY2sgcGwtYmFjayBsaXN0ZW5lci1iYWNrIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+6L+U5ZuePC9zcGFuPgoJCQkJCQkJCQk8c3BhbiBjbGFzcz0icGwtcHJvZ3Jlc3MtaG93IGxpc3RlbmVyLWhvdyIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPuWmguS9leWUpOi1t0lETe+8nzwvc3Bhbj4KCQkJCQkJCQkJYAoJCQkJCQljb250ZW50ICs9YDwvZGl2PjwvZGl2PmAKCQkJCQl9CgkJCQkJaWYgKG1vZGUgPT09ICdhcmlhJykgewoJCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9BcmlhKGRsaW5rLCBmaWxlbmFtZSwgcGFuLnVhKTsKCQkJCQkJaWYgKHR5cGVvZiAoYWxpbmspID09PSAnb2JqZWN0JykgewoJCQkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IiR7YWxpbmsubGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmsubGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rLnRleHQpfTxicj7lpI3liLYgJHtmaWxlbmFtZX0g5LiL6L295ZG95Luk6KGMPC9hPiA8L2Rpdj5gOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwoJCQkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2YXJpYTJj6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTxicj7lpI3liLYgJHtmaWxlbmFtZX0g5LiL6L295ZG95Luk6KGMPC9hPiA8L2Rpdj5gOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWlmIChtb2RlID09PSAncnBjJykgewoJCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQkJPGJ1dHRvbiBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstcnBjIHBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi1pbmZvIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSI+PGVtIGNsYXNzPSJpY29uIGljb24tZGV2aWNlIj48L2VtPjxzcGFuIHN0eWxlPSJtYXJnaW4tbGVmdDogNXB4OyI+5bCGICR7ZmlsZW5hbWV9IOaOqOmAgeWIsCBSUEMg5LiL6L295ZmoPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmA7CgkJCQkJfQoJCQkJCWlmIChtb2RlID09PSAnY3VybCcpIHsKCQkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQ3VybChkbGluaywgZmlsZW5hbWUsIHBhbi51YSk7CgkJCQkJCWlmICh0eXBlb2YgKGFsaW5rKSA9PT0gJ29iamVjdCcpIHsKCQkJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEiIHRhcmdldD0iX2JsYW5rIiBocmVmPSIke2FsaW5rLmxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2Y3VybOmTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGluay5saW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmsudGV4dCl9PGJyPuWkjeWItiAke2ZpbGVuYW1lfSDkuIvovb3lkb3ku6TooYw8L2E+IDwvZGl2PmA7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7CgkJCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZjdXJs6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTxicj7lpI3liLYgJHtmaWxlbmFtZX0g5LiL6L295ZG95Luk6KGMPC9hPiA8L2Rpdj5gOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWlmIChtb2RlID09PSAnYmMnKSB7CgkJCQkJCWxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0JDKGRsaW5rLCBmaWxlbmFtZSwgcGFuLnVhKTsKCQkJCQkJaWYgKHR5cGVvZiAoYWxpbmspID09PSAnb2JqZWN0JykgewoJCQkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSIgaHJlZj0iJHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmsubGluayl9IiB0aXRsZT0i54K55Ye755So5q+U54m55b2X5pif5LiL6L29IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmsudGV4dCl9PGJyPuS4i+i9vSAke2ZpbGVuYW1lfTwvYT4gPC9kaXY+YDsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCWFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKCQkJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX0iIHRpdGxlPSLngrnlh7vnlKjmr5TnibnlvZfmmJ/kuIvovb0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PGJyPuS4i+i9vSAke2ZpbGVuYW1lfTwvYT4gPC9kaXY+YDsKCQkJCQkJfQoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJaWYgKG1vZGUgPT09ICdhcGknKSB7CgkJCQkJCWFsaW5rQWxsVGV4dCArPSBkbGluayArICdcclxuJzsKCQkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSBsaXN0ZW5lci1saW5rLWFwaSIgaHJlZj0iJHtkbGlua30iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLXNpemU9IiR7di5zaXplfSIgZGF0YS1saW5rPSIke2RsaW5rfSIgZGF0YS1pbmRleD0iJHtpfSI+JHtkbGlua308YnI+5LiL6L29ICAke2ZpbGVuYW1lfTwvYT4KCQkJCQkJCQk8IS0tPGEgY2xhc3M9InBsLWl0ZW0tY29weSIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IiR7ZGxpbmt9IiB0aXRsZT0i54K55Ye75L2/55So5rWP6KeI5Zmo5LiL6L29IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSI+5Lyg57uf5LiL6L29PC9hPi0tPgoJCQkJCQkJCTwhLS08YnV0dG9uIGNsYXNzPSJwbC1pdGVtLWNvcHkgcGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGhyZWY9IiR7ZGxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi26ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSI+5aSN5Yi26ZO+5o6lPC9idXR0b24+LS0+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS10aXAiIHN0eWxlPSJkaXNwbGF5OiBub25lIj48c3Bhbj7oi6XmsqHmnInlvLnlh7pJRE3kuIvovb3moYbvvIzmib7liLBJRE0gPGI+6YCJ6aG5PC9iPiAtPiA8Yj7mlofku7bnsbvlnos8L2I+IC0+IDxiPuesrOS4gOS4quahhjwvYj4g5Lit5re75Yqg5ZCO57yAIDxzcGFuIGNsYXNzPSJwbC1leHQiPiR7ZXh0fTwvc3Bhbj7vvIw8YSBocmVmPSIke3Bhbi5pZG19IiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9InBsLWEiPuivpuingeatpOWkhDwvYT48L3NwYW4+IDxzcGFuIGNsYXNzPSJwbC1iYWNrIGxpc3RlbmVyLWJhY2siPui/lOWbnjwvc3Bhbj48L2Rpdj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLXByb2dyZXNzIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+CgkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLXByb2dyZXNzIj4KCQkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLXByb2dyZXNzLW91dGVyIj48L2Rpdj4KCQkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLXByb2dyZXNzLWlubmVyIiBzdHlsZT0id2lkdGg6NSUiPgoJCQkJCQkJCQkJPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3MtaW5uZXItdGV4dCI+5q2j5Zyo5Yqg6L296L+b5bqmLi4uMCU8L2Rpdj4KCQkJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQkJPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLXN0b3AgbGlzdGVuZXItc3RvcCI+5Y+W5raI5LiL6L29PC9zcGFuPgoJCQkJCQkJCWA7CgkJCQkJY29udGVudCArPSBgPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLXRpcCIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiID7mnKrlj5HnjrBJRE3vvIzkvb/nlKjoh6rluKbmtY/op4jlmajkuIvovb08L3NwYW4+CgkJCQkJCQkJPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLWJhY2sgcGwtYmFjayBsaXN0ZW5lci1iYWNrIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+6L+U5ZuePC9zcGFuPgoJCQkJCQkJCTxzcGFuIGNsYXNzPSJwbC1wcm9ncmVzcy1ob3cgbGlzdGVuZXItaG93IiBzdHlsZT0iZGlzcGxheTogbm9uZSI+5aaC5L2V5ZSk6LW3SURN77yfPC9zcGFuPgoJCQkJCQkJCWA7CgkJCQkJY29udGVudCArPWA8L2Rpdj48L2Rpdj5gCgkJCQl9CgkJCQkJaWYgKG1vZGUgPT09ICdhcmlhJykgewoJCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9BcmlhKGRsaW5rLCBmaWxlbmFtZSwgcGFuLnVhKTsKCQkJCQkJaWYgKHR5cGVvZiAoYWxpbmspID09PSAnb2JqZWN0JykgewoJCQkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IiR7YWxpbmsubGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmsubGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rLnRleHQpfTxicj7lpI3liLYgJHtmaWxlbmFtZX0g5LiL6L295ZG95Luk6KGMPC9hPiA8L2Rpdj5gOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKCQkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2YXJpYTJj6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTxicj7lpI3liLYgJHtmaWxlbmFtZX0g5LiL6L295ZG95Luk6KGMPC9hPiA8L2Rpdj5gOwoJCQkJCX0KCQkJCX0KCQkJCQlpZiAobW9kZSA9PT0gJ3JwYycpIHsKCQkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxidXR0b24gY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLXJwYyBwbC1idG4tcHJpbWFyeSBwbC1idG4taW5mbyIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRldmljZSI+PC9lbT48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDVweDsiPuWwhiAke2ZpbGVuYW1lfSDmjqjpgIHliLAgUlBDIOS4i+i9veWZqDwvc3Bhbj48L2J1dHRvbj48L2Rpdj5gOwoJCQkJfQoJCQkJCWlmIChtb2RlID09PSAnY3VybCcpIHsKCQkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQ3VybChkbGluaywgZmlsZW5hbWUsIHBhbi51YSk7CgkJCQkJCWlmICh0eXBlb2YgKGFsaW5rKSA9PT0gJ29iamVjdCcpIHsKCQkJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEiIHRhcmdldD0iX2JsYW5rIiBocmVmPSIke2FsaW5rLmxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2Y3VybOmTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGluay5saW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmsudGV4dCl9PGJyPuWkjeWItiAke2ZpbGVuYW1lfSDkuIvovb3lkb3ku6TooYw8L2E+IDwvZGl2PmA7CgkJCQkJfSBlbHNlIHsKCQkJCQkJYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwoJCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZjdXJs6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTxicj7lpI3liLYgJHtmaWxlbmFtZX0g5LiL6L295ZG95Luk6KGMPC9hPiA8L2Rpdj5gOwoJCQkJCX0KCQkJCX0KCQkJCQlpZiAobW9kZSA9PT0gJ2JjJykgewoJCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9CQyhkbGluaywgZmlsZW5hbWUsIHBhbi51YSk7CgkJCQkJCWlmICh0eXBlb2YgKGFsaW5rKSA9PT0gJ29iamVjdCcpIHsKCQkJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rLmxpbmspfSIgdGl0bGU9IueCueWHu+eUqOavlOeJueW9l+aYn+S4i+i9vSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rLnRleHQpfTxicj7kuIvovb0gJHtmaWxlbmFtZX08L2E+IDwvZGl2PmA7CgkJCQkJfSBlbHNlIHsKCQkJCQkJYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwoJCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIiBocmVmPSIke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9IiB0aXRsZT0i54K55Ye755So5q+U54m55b2X5pif5LiL6L29IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTxicj7kuIvovb0gJHtmaWxlbmFtZX08L2E+IDwvZGl2PmA7CgkJCQkJfQoJCQkJfQoJCQkJfQoJCQl9KTsKCgkJCWNvbnRlbnQgKz0gJzwvZGl2Pic7CgoJCQlpZiAobW9kZSA9PT0gJ2FwaScpCgkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItZG93bmxvYWQtYWxsIj7kuIvovb3lhajpg6jpk77mjqU8L2J1dHRvbj48L2Rpdj5gOwoJCQlpZiAobW9kZSA9PT0gJ2FyaWEnKQoJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLWNvcHktYWxsIiBkYXRhLWxpbms9IiR7YWxpbmtBbGxUZXh0fSI+5aSN5Yi25YWo6YOo5ZG95Luk6KGMPC9idXR0b24+PC9kaXY+YDsKCQkJaWYgKG1vZGUgPT09ICdycGMnKSB7CgkJCQlsZXQgcnBjID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJykgKyAnOicgKyBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JykgKyBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyk7CgkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItc2VuZC1ycGMiPuWPkemAgeWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gdGl0bGU9IiR7cnBjfSIgY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4Ij7orr7nva4gUlBDIOWPguaVsO+8iOW9k+WJjeS4uu+8miR7cnBjfe+8iTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi1zdWNjZXNzIGxpc3RlbmVyLXJwYy10YXNrIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHg7ZGlzcGxheTogbm9uZSI+5p+l55yL5LiL6L295Lu75YqhPC9idXR0b24+PC9kaXY+YDsKCQkJfQoJCQlpZiAobW9kZSA9PT0gJ2N1cmwnKSB7CgkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDsiPuiuvue9rue7iOerr+exu+Wei++8iOW9k+WJjeS4uu+8miR7dGVybWluYWxUeXBlW2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpXX3vvIk8L2J1dHRvbj48L2Rpdj5gO30KCQkJcmV0dXJuIGNvbnRlbnQ7CgkJfSwKCgkJYXN5bmMgc2VuZExpbmtUb1JQQyhmaWxlbmFtZSwgbGluaykgewoJCQlsZXQgcnBjID0gewoJCQkJZG9tYWluOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSwKCQkJCXBvcnQ6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKCQkJCXBhdGg6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKSwKCQkJCXRva2VuOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpLAoJCQkJZGlyOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kaXInKSwKCQkJfTsKCQkJbGV0IEJEVVNTID0gdGhpcy5nZXRCRFVTUygpOwoJCQlpZiAoIUJEVVNTKSByZXR1cm4gJ2Fzc2lzdGFudCc7CgoJCQlsZXQgdXJsID0gYCR7cnBjLmRvbWFpbn06JHtycGMucG9ydH0ke3JwYy5wYXRofWA7CgkJCWxldCBycGNEYXRhID0gewoJCQkJaWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAoJCQkJanNvbnJwYzogJzIuMCcsCgkJCQltZXRob2Q6ICdhcmlhMi5hZGRVcmknLAoJCQkJcGFyYW1zOiBbYHRva2VuOiR7cnBjLnRva2VufWAsIFtsaW5rXSwgewoJCQkJCWRpcjogcnBjLmRpciwKCQkJCQlvdXQ6IGZpbGVuYW1lLAoJCQkJCWhlYWRlcjogW2BVc2VyLUFnZW50OiAke3Bhbi51YX1gLCBgQ29va2llOiBCRFVTUz0ke0JEVVNTfWBdCgkJCQl9XQoJCQl9OwoJCQl0cnkgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdCh1cmwsIHJwY0RhdGEsIHsiVXNlci1BZ2VudCI6IHBhbi51YX0sICcnKTsKCQkJCWlmIChyZXMucmVzdWx0KSByZXR1cm4gJ3N1Y2Nlc3MnOwoJCQkJcmV0dXJuICdmYWlsJzsKCQkJfSBjYXRjaCAoZSkgewoJCQkJcmV0dXJuICdmYWlsJzsKCQkJfQoJCX0sCgoJCWdldFNlbGVjdGVkTGlzdCgpIHsKCQkJdHJ5IHsKCQkJCXZhciBMaXN0ID0gcmVxdWlyZSgic3lzdGVtLWNvcmU6Y29udGV4dC9jb250ZXh0LmpzIikuaW5zdGFuY2VGb3JTeXN0ZW0ubGlzdDsKCQkJCXZhciBzZWxlY3RMaXN0ID0gTGlzdC5nZXRTZWxlY3RlZCgpOwoJCQkJaWYgKCFzZWxlY3RMaXN0Lmxlbmd0aCkgewoJCQkJCXNlbGVjdExpc3QgPSBMaXN0LmdldEN1cnJlbnRMaXN0KCk7CgkJCQl9CgkJCQlyZXR1cm4gc2VsZWN0TGlzdDsKCQkJfSBjYXRjaCAoZSkgewoJCQkJdmFyIGxpc3QxID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndwLXMtY29yZS1wYW4nKTsKCQkJCWlmIChsaXN0MSAmJiBsaXN0MS5fX3Z1ZV9fKSB7CgkJCQkJcmV0dXJuIGxpc3QxLl9fdnVlX18uc2VsZWN0ZWRMaXN0OwoJCQkJfSBlbHNlIHsKCQkJCQl2YXIgbGlzdDIgPSAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZmlsZS1saXN0IilbMF07CgkJCQkJcmV0dXJuIGxpc3QyLl9fdnVlX18uYWxsRmlsZUxpc3QuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiAhIWl0ZW0uc2VsZWN0ZWQ7IH0pOwoJCQkJfQoJCQl9CgkJfSwKCgkJZ2V0TG9naWQoKSB7CgkJCWxldCB1dCA9IHJlcXVpcmUoInN5c3RlbS1jb3JlOmNvbnRleHQvY29udGV4dC5qcyIpLmluc3RhbmNlRm9yU3lzdGVtLnRvb2xzLmJhc2VTZXJ2aWNlOwoJCQlyZXR1cm4gdXQuYmFzZTY0RW5jb2RlKGJhc2UuZ2V0Q29va2llKCJCQUlEVUlEIikpOwoJCX0sCgoJCWdldFNoYXJlRGF0YSgpIHsKCQkJbGV0IHJlcyA9IGxvY2Fscy5kdW1wKCk7CgkJCXBhcmFtcy5zaGFyZVR5cGUgPSAnc2VjcmV0JzsKCQkJcGFyYW1zLnNpZ24gPSAnJzsKCQkJcGFyYW1zLnRpbWVzdGFtcCA9ICcnOwoJCQlwYXJhbXMuYmRzdG9rZW4gPSByZXMuYmRzdG9rZW4udmFsdWU7CgkJCXBhcmFtcy5jaGFubmVsID0gJ2NodW5sZWknOwoJCQlwYXJhbXMuY2xpZW50dHlwZSA9IDA7CgkJCXBhcmFtcy53ZWIgPSAxOwoJCQlwYXJhbXMuYXBwX2lkID0gMjUwNTI4OwoJCQlwYXJhbXMuZW5jcnlwdCA9IDA7CgkJCXBhcmFtcy5wcm9kdWN0ID0gJ3NoYXJlJzsKCQkJcGFyYW1zLmxvZ2lkID0gdGhpcy5nZXRMb2dpZCgpOwoJCQlwYXJhbXMucHJpbWFyeWlkID0gcmVzLnNoYXJlaWQudmFsdWU7CgkJCXBhcmFtcy51ayA9IHJlcy5zaGFyZV91ay52YWx1ZTsKCQkJcGFyYW1zLnNoYXJlVHlwZSA9PT0gJ3NlY3JldCcgJiYgKHBhcmFtcy5leHRyYSA9IHRoaXMuX2dldEV4dHJhKCkpOwoJCQlwYXJhbXMuc3VybCA9IHRoaXMuX2dldFN1cmwoKTsKCQl9LAoKCQlkZXRlY3RQYWdlKCkgewoJCQlsZXQgcGF0aCA9IGxvY2F0aW9uLnBhdGhuYW1lOwoJCQlpZiAoL15cL2Rpc2tcL2hvbWUvLnRlc3QocGF0aCkpIHJldHVybiAnaG9tZSc7CgkJCWlmICgvXlwvZGlza1wvbWFpbi8udGVzdChwYXRoKSkgcmV0dXJuICdtYWluJzsKCQkJaWYgKC9eXC93YXBcL2hvbWUvLnRlc3QocGF0aCkpIHJldHVybiAnd2FwJzsKCQkJaWYgKC9eXC8oc3xzaGFyZSlcLy8udGVzdChwYXRoKSkgcmV0dXJuICdzaGFyZSc7CgkJCXJldHVybiAnJzsKCQkJcmV0dXJuICcnOwoJCX0sCgoJCXNob3dNYWluRGlhbG9nKHRpdGxlLCBodG1sLCBmb290ZXIpIHsKCQkJU3dhbC5maXJlKHsKCQkJCXRpdGxlLAoJCQkJaHRtbCwKCQkJCWZvb3RlciwKCQkJCWFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKCQkJCXNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCgkJCQlwb3NpdGlvbjogJ2NlbnRlcicsLy90b3AKCQkJCXdpZHRoLAoJCQkJcGFkZGluZzogJzE1cHggMjBweCA1cHgnLAoJCQkJY3VzdG9tQ2xhc3MsCgkJCQljb25maXJtQnV0dG9uVGV4dDogJ+WFs+mXrScsCgkJCX0pLnRoZW4oKCkgPT4gewoJCQkJdGhpcy5fcmVzZXREYXRhKCk7CgkJCX0pOwoJCX0sCgoJCWFzeW5jIGluaXRQYW5MaW5rZXIoKSB7CgkJCXB0ID0gdGhpcy5kZXRlY3RQYWdlKCk7CgkJCWJhc2UuY3JlYXRlVGlwKCk7CgkJCWJhc2UucmVnaXN0ZXJNZW51Q29tbWFuZCgpOwoJCQlpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAndjEnKSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KGBodHRwczovL2FwaS55b3V4aWFvaG91LmNvbS9jb25maWcvP3Zlcj0ke3ZlcnNpb259JmE9JHthdXRob3J9YCwge30sIHt9LCAndGV4dCcpOwoJCQkJcGFuID0gSlNPTi5wYXJzZShiYXNlLmRlY29kZShyZXMpKTsKCQkJfSBlbHNlIGlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICd2MicpIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QoYGh0dHBzOi8vYXBpLnlvdXhpYW9ob3UuY29tL2NvbmZpZy92Mi8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gIm5vIikgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KGBodHRwczovL2djb3JlLmpzZGVsaXZyLm5ldC9naC9obWp6MTAwL09ubGluZS1kaXNrLWRpcmVjdC1saW5rLWRvd25sb2FkLWFzc2lzdGFudEBtYWluL2NvbmZpZy9jb25maWcuanNvbmAsIHt9LCAidGV4dCIsIHt9KTsKCQkJCXBhbiA9IEpTT04ucGFyc2UocmVzKTsKCQkJfSBlbHNlIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLmdldChgaHR0cHM6Ly9nY29yZS5qc2RlbGl2ci5uZXQvZ2gvaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnRAbWFpbi9jb25maWcvY29uZmlnLmpzb25gLCB7fSwgInRleHQiLCB7fSk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKHJlcyk7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJywgJ3YyJyk7CgkJCX0KCQkJT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKHBhbik7CgkJCXBhbi5udW0gPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJykgfHwgcGFuLmxpY2Vuc2UgPT09IGJhc2UuZ2V0VmFsdWUoJ2xpY2Vuc2UnKSA/IHRoaXMuYWRkQnV0dG9uKCkgOiB0aGlzLmFkZEluaXRCdXR0b24oKTsKCQl9Cgl9OwoKCS8v6Zi/6YeM5LqR55uYCglsZXQgYWxpID0gewoKCQljb252ZXJ0TGlua1RvQXJpYShsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYXJpYTJjICIke2xpbmt9IiAtLW91dCAiJHtmaWxlbmFtZX0iIC0taGVhZGVyICJSZWZlcmVyOiBodHRwczovLyR7bG9jYXRpb24uaG9zdH0vImApOwoJCX0sCgoJCWNvbnZlcnRMaW5rVG9CQyhsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJbGV0IGJjID0gYEFBLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVuYW1lKX0vP3VybD0ke2VuY29kZVVSSUNvbXBvbmVudChsaW5rKX0mcmVmZXI9JHtlbmNvZGVVUklDb21wb25lbnQoYGh0dHBzOi8vJHtsb2NhdGlvbi5ob3N0fS9gKX1aWmA7CgkJCXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYGJjOi8vaHR0cC8ke2Jhc2UuZW5jb2RlKGJjKX1gKTsKCQl9LAoKCQljb252ZXJ0TGlua1RvQ3VybChsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJbGV0IHRlcm1pbmFsID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyk7CgkJCWZpbGVuYW1lID0gYmFzZS5maXhGaWxlbmFtZShmaWxlbmFtZSk7CgkJCXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYCR7dGVybWluYWwgIT09ICd3cCcgPyAnY3VybCcgOiAnY3VybC5leGUnfSAtTCAtQyAtICIke2xpbmt9IiAtbyAiJHtmaWxlbmFtZX0iIC1lICJodHRwczovLyR7bG9jYXRpb24uaG9zdH0vImApOwoJCX0sCgoJCWFkZFBhZ2VMaXN0ZW5lcigpIHsKCQkJZnVuY3Rpb24gX2ZhY3RvcnkoZSkgewoJCQkJbGV0IHRhcmdldCA9ICQoZS50YXJnZXQpOwoJCQkJbGV0IGl0ZW0gPSB0YXJnZXQucGFyZW50cygnLnBsLWl0ZW0nKTsKCQkJCWxldCBsaW5rID0gaXRlbS5maW5kKCcucGwtaXRlbS1saW5rJyk7CgkJCQlsZXQgcHJvZ3Jlc3MgPSBpdGVtLmZpbmQoJy5wbC1pdGVtLXByb2dyZXNzJyk7CgkJCQlsZXQgdGlwID0gaXRlbS5maW5kKCcucGwtaXRlbS10aXAnKTsKCQkJCWxldCBjb3B5ID0gaXRlbS5maW5kKCcucGwtaXRlbS1jb3B5Jyk7CgkJCQlsZXQgaG93aWRtID0gaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3MtaG93Jyk7CgkJCQlsZXQgYmFjayA9IGl0ZW0uZmluZCgnLnBsLXByb2dyZXNzLWJhY2snKTsKCQkJCWxldCBzdG9wID0gaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3Mtc3RvcCcpOwoJCQkJcmV0dXJuIHsKCQkJCQlpdGVtLCBsaW5rLCBwcm9ncmVzcywgdGlwLCBjb3B5LCBob3dpZG0sIGJhY2ssIHN0b3AsIHRhcmdldCwKCQkJCX07CgkJCX0KCgkJCWZ1bmN0aW9uIF9yZXNldChpKSB7CgkJCQlpbnNbaV0gJiYgY2xlYXJJbnRlcnZhbChpbnNbaV0pOwoJCQkJcmVxdWVzdFtpXSAmJiByZXF1ZXN0W2ldLmFib3J0KCk7CgkJCQlwcm9ncmVzc1tpXSA9IDA7CgkJCQlpZG1baV0gPSBmYWxzZTsKCQkJfQoJCQlkb2Mub24oJ2NsaWNrJywgJy5wbC1idXR0b24tbW9kZScsIChlKSA9PiB7CgkJCQltb2RlID0gZS50YXJnZXQuZGF0YXNldC5tb2RlOwoJCQkJU3dhbC5maXJlKHsKCQkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCQlzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKCQkJCQlzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsCgkJCQkJaHRtbDogYOmTvuaOpeiOt+WPluS4rWAsCgkJCQkJd2lsbE9wZW46IGZ1bmN0aW9uKCkgewoJCQkJCQlTd2FsLnNob3dMb2FkaW5nKCk7CgkJCQkJfQoJCQkJfSk7CgkJCQl0aGlzLmdldFBDU0xpbmsoKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstYXBpJywgYXN5bmMgKGUpID0+IHsKCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCWxldCBvID0gX2ZhY3RvcnkoZSk7CgkJCQlsZXQgJHdpZHRoID0gby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1pbm5lcicpOwoJCQkJbGV0ICR0ZXh0ID0gby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1pbm5lci10ZXh0Jyk7CgkJCQlsZXQgZmlsZW5hbWUgPSBvLmxpbmtbMF0uZGF0YXNldC5maWxlbmFtZTsKCQkJCWxldCBpbmRleCA9IG8ubGlua1swXS5kYXRhc2V0LmluZGV4OwoJCQkJX3Jlc2V0KGluZGV4KTsKCQkJCWxldCBkYXRhc2V0ID0gZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQ7CgkJCQlsZXQgaHJlZiA9IGRhdGFzZXQubGluazsKCQkJCWxldCB1cmwgPSBhd2FpdCB0aGlzLmdldFJlYWxMaW5rKGRhdGFzZXQuZGlkLCBkYXRhc2V0LmZpZCk7CgkJCQlpZiAodXJsKSBocmVmID0gdXJsOwoJCQkJYmFzZS5nZXQoaHJlZiwgeyJVc2VyLUFnZW50IjogcGFuLnVhLCAiUmVmZXJlciI6IGBodHRwczovLyR7bG9jYXRpb24uaG9zdH0vYH0sICdibG9iJywge2ZpbGVuYW1lLCBpbmRleH0pOwoJCQkJbGV0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7IC8vIOiusOW9leS4i+i9veW8gOWni+aXtumXtAoJCQkJbGV0IHByZXZMb2FkZWQgPSAwOyAvLyDkuIrkuIDmrKHnmoTlt7LkuIvovb3mlbDmja7ph48KCQkJCWxldCBwcmV2VGltZSA9IHN0YXJ0VGltZTsgLy8g5LiK5LiA5qyh55qE5pe26Ze0CgkJCQlsZXQgc2l6ZSA9IE51bWJlcihvLmxpbmtbMF0uZGF0YXNldC5zaXplKTsKCQkJCWluc1tpbmRleF0gPSBzZXRJbnRlcnZhbCgoKSA9PiB7CgkJCQkJbGV0IHByb2cgPSArcHJvZ3Jlc3NbaW5kZXhdIHx8IDA7CgkJCQkJLy8g5aSE55CG5pmu6YCa5LiL6L2955qE5oOF5Ya1Li4uCgkJCQkJbGV0IGN1cnJlbnRUaW1lID0gRGF0ZS5ub3coKTsKCQkJCQlsZXQgZWxhcHNlZFRpbWUgPSBjdXJyZW50VGltZSAtIHN0YXJ0VGltZTsKCQkJCQlsZXQgdG90YWxQcm9ncmVzcyA9IHByb2cgLyAxMDA7CgkJCQkJbGV0IHRvdGFsRWxhcHNlZFNlY29uZHMgPSBlbGFwc2VkVGltZSAvIDEwMDA7CgkJCQkJbGV0IGVzdGltYXRlZFRvdGFsVGltZVNlY29uZHMgPSB0b3RhbEVsYXBzZWRTZWNvbmRzIC8gdG90YWxQcm9ncmVzczsKCQkJCQlsZXQgcmVtYWluaW5nVGltZVNlY29uZHMgPSBlc3RpbWF0ZWRUb3RhbFRpbWVTZWNvbmRzIC0gdG90YWxFbGFwc2VkU2Vjb25kczsKCgkJCQkJLy8g5bCG5Ymp5L2Z5pe26Ze06L2s5o2i5Li65aSp44CB5pe244CB5YiG44CB56eSCgkJCQkJbGV0IHJlbWFpbmluZ0RheXMgPSBNYXRoLmZsb29yKHJlbWFpbmluZ1RpbWVTZWNvbmRzIC8gKDYwICogNjAgKiAyNCkpOwoJCQkJCXJlbWFpbmluZ1RpbWVTZWNvbmRzICU9ICg2MCAqIDYwICogMjQpOwoKCQkJCQlsZXQgcmVtYWluaW5nSG91cnMgPSBNYXRoLmZsb29yKHJlbWFpbmluZ1RpbWVTZWNvbmRzIC8gKDYwICogNjApKTsKCQkJCQlyZW1haW5pbmdUaW1lU2Vjb25kcyAlPSAoNjAgKiA2MCk7CgoJCQkJCWxldCByZW1haW5pbmdNaW51dGVzID0gTWF0aC5mbG9vcihyZW1haW5pbmdUaW1lU2Vjb25kcyAvIDYwKTsKCQkJCQlsZXQgcmVtYWluaW5nU2Vjb25kcyA9IE1hdGguZmxvb3IocmVtYWluaW5nVGltZVNlY29uZHMgJSA2MCk7CgoJCQkJCS8vIOiuoeeul+S4i+i9vemAn+W6pgoJCQkJCWxldCBsb2FkZWQgPSBwcm9nICogc2l6ZSAvIDEwMDsgLy8g5bey5LiL6L295pWw5o2u6YePCgkJCQkJbGV0IGN1cnJlbnRUaW1lRGlmZiA9IGN1cnJlbnRUaW1lIC0gcHJldlRpbWU7IC8vIOW9k+WJjeaXtumXtOS4juS4iuS4gOasoeaXtumXtOeahOW3ruWAvAoJCQkJCWxldCBsb2FkZWREaWZmID0gbG9hZGVkIC0gcHJldkxvYWRlZDsgLy8g5b2T5YmN5bey5LiL6L295pWw5o2u6YeP5LiO5LiK5LiA5qyh55qE5beu5YC8CgkJCQkJbGV0IGRvd25sb2FkU3BlZWQgPSAoY3VycmVudFRpbWVEaWZmICE9PSAwKSA/IGxvYWRlZERpZmYgLyAoY3VycmVudFRpbWVEaWZmIC8gMTAwMCkgOiAwOyAvLyDkuIvovb3pgJ/luqbvvIjljZXkvY3vvJrlrZfoioIv56eS77yJCgoJCQkJCS8vIOabtOaWsOS4iuS4gOasoeeahOaVsOaNrgoJCQkJCXByZXZMb2FkZWQgPSBsb2FkZWQ7CgkJCQkJcHJldlRpbWUgPSBjdXJyZW50VGltZTsKCgkJCQkJLy8g5pu05pS555WM6Z2iCgkJCQkJby5saW5rLmhpZGUoKTsKCQkJCQlvLnRpcC5oaWRlKCk7CgkJCQkJby5zdG9wLnNob3coKTsKCQkJCQlvLmNvcHkuaGlkZSgpOwoJCQkJCW8ucHJvZ3Jlc3Muc2hvdygpOwoKCQkJCQkvLyDmm7TmlrDov5vluqbmnaEKCQkJCQkkd2lkdGguY3NzKCd3aWR0aCcsIHByb2cgKyAnJScpOwoKCQkJCQkvLyDmm7TmlrDov5vluqbmnaHmlofmnKwKCQkJCQlsZXQgdGltZVRleHQgPSAnJzsKCQkJCQlpZiAoTnVtYmVyLmlzRmluaXRlKHJlbWFpbmluZ0RheXMpICYmIHJlbWFpbmluZ0RheXMgPiAwKSB7CgkJCQkJCXRpbWVUZXh0ID0gcmVtYWluaW5nRGF5cyArICflpKkgJyArIGJhc2UucmVwYWlyVGltZXIocmVtYWluaW5nSG91cnMpICsgJ+aXtjonICsgYmFzZS5yZXBhaXJUaW1lcihyZW1haW5pbmdNaW51dGVzKSArICfliIY6JyArIGJhc2UucmVwYWlyVGltZXIocmVtYWluaW5nU2Vjb25kcykgKyAn56eSJzsKCQkJCQl9IGVsc2UgaWYgKE51bWJlci5pc0Zpbml0ZShyZW1haW5pbmdIb3VycykgJiYgcmVtYWluaW5nSG91cnMgPiAwKSB7CgkJCQkJCXRpbWVUZXh0ID0gYmFzZS5yZXBhaXJUaW1lcihyZW1haW5pbmdIb3VycykgKyAn5pe2OicgKyBiYXNlLnJlcGFpclRpbWVyKHJlbWFpbmluZ01pbnV0ZXMpICsgJ+WIhjonICsgYmFzZS5yZXBhaXJUaW1lcihyZW1haW5pbmdTZWNvbmRzKSArICfnp5InOwoJCQkJCX0gZWxzZSBpZiAoTnVtYmVyLmlzRmluaXRlKHJlbWFpbmluZ01pbnV0ZXMpICYmIHJlbWFpbmluZ01pbnV0ZXMgPiAwKSB7CgkJCQkJCXRpbWVUZXh0ID0gYmFzZS5yZXBhaXJUaW1lcihyZW1haW5pbmdNaW51dGVzKSArICfliIY6JyArIGJhc2UucmVwYWlyVGltZXIocmVtYWluaW5nU2Vjb25kcykgKyAn56eSJzsKCQkJCQl9IGVsc2UgaWYgKE51bWJlci5pc0Zpbml0ZShyZW1haW5pbmdTZWNvbmRzKSAmJiByZW1haW5pbmdTZWNvbmRzID4gMCkgewoJCQkJCQl0aW1lVGV4dCA9IHJlbWFpbmluZ1NlY29uZHMgKyAn56eSJzsKCQkJCQl9IGVsc2UgaWYgKE51bWJlci5pc0Zpbml0ZShyZW1haW5pbmdTZWNvbmRzKSAmJiByZW1haW5pbmdTZWNvbmRzID09PSAwKSB7CgkJCQkJCXRpbWVUZXh0ID0gJ+WNs+WwhuWujOaIkCc7CgkJCQkJfSBlbHNlIHsKCQkJCQkJdGltZVRleHQgPSAn6K6h566X5LitLi4uJzsKCQkJCQl9CgoJCQkJCWxldCBzcGVlZFRleHQgPScnOwoJCQkJCXNwZWVkVGV4dCA9IGJhc2Uuc2l6ZUZvcm1hdChkb3dubG9hZFNwZWVkKQoKCQkJCQkkdGV4dC50ZXh0KHByb2cgKyAnJSB8IOWJqeS9meaXtumXtO+8micgKyB0aW1lVGV4dCArICcgfCDpgJ/luqbvvJonICsgc3BlZWRUZXh0ICsgJy/np5InKTsKCgkJCQkJaWYgKHByb2cgPT09IDEwMCkgewoJCQkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uICgpewoJCQkJCQkJY2xlYXJJbnRlcnZhbChpbnNbaW5kZXhdKTsKCQkJCQkJCXByb2dyZXNzW2luZGV4XSA9IDA7CgkJCQkJCQlvLml0ZW0uZmluZCgnLnBsLXByb2dyZXNzLXN0b3AnKS5oaWRlKCk7CgkJCQkJCQlvLmhvd2lkbS5oaWRlKCk7CgkJCQkJCQkkdGV4dC50ZXh0KCfkuIvovb3lrozmiJDkuoYh5rWP6KeI5Zmo5LiL6L295qGG5bqU6K+l5by55Ye65p2l5LqG5ZOmficpOwoJCQkJCQkJby5iYWNrLnNob3coKQoJCQkJCQkJc2V0VGltZW91dChmdW5jdGlvbiAoKXsKCQkJCQkJCQlvLmxpbmsudGV4dCgn6YeN5paw5LiL6L29JykuYW5pbWF0ZSh7b3BhY2l0eTogJzEnfSwgInNsb3ciKTsKCQkJCQkJCX0sMzAwMCkKCQkJCQkJfSwzMDAwKQoJCQkJCX0KCQkJCX0sIDUwMCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1yZXRyeScsIGFzeW5jIChlKSA9PiB7CgkJCQlsZXQgbyA9IF9mYWN0b3J5KGUpOwoJCQkJby50aXAuaGlkZSgpOwoJCQkJby5saW5rLnNob3coKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWhvdycsIGFzeW5jIChlKSA9PiB7CgkJCQlsZXQgbyA9IF9mYWN0b3J5KGUpOwoJCQkJbGV0IGluZGV4ID0gby5saW5rWzBdLmRhdGFzZXQuaW5kZXg7CgkJCQlpZiAocmVxdWVzdFtpbmRleF0pIHsKCQkJCQlyZXF1ZXN0W2luZGV4XS5hYm9ydCgpOwoJCQkJCWNsZWFySW50ZXJ2YWwoaW5zW2luZGV4XSk7CgkJCQkJby5wcm9ncmVzcy5oaWRlKCk7CgkJCQkJby50aXAuc2hvdygpOwoJCQkJfQoKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXN0b3AnLCBhc3luYyAoZSkgPT4gewoJCQkJbGV0IG8gPSBfZmFjdG9yeShlKTsKCQkJCWxldCBpbmRleCA9IG8ubGlua1swXS5kYXRhc2V0LmluZGV4OwoJCQkJaWYgKHJlcXVlc3RbaW5kZXhdKSB7CgkJCQkJcmVxdWVzdFtpbmRleF0uYWJvcnQoKTsKCQkJCQljbGVhckludGVydmFsKGluc1tpbmRleF0pOwoJCQkJCW8uaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3MtaW5uZXItdGV4dCcpLnRleHQoJ+ato+WcqOWPlua2iC4uLicpOwoJCQkJCW8uaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3MtaW5uZXInKS5jc3MoJ3dpZHRoJywgMTAwICsgJyUnKTsKCQkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgkJCQkJCW8udGlwLmhpZGUoKTsKCQkJCQkJby5iYWNrLmhpZGUoKTsKCQkJCQkJby5saW5rLnNob3coMCk7CgkJCQkJCW8uY29weS5zaG93KCk7CgkJCQkJCW8ucHJvZ3Jlc3MuaGlkZSgpOwoJCQkJCQlvLnN0b3AuaGlkZSgpOwoJCQkJCX0sMTA1MCkKCQkJCX0KCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWJhY2snLCBhc3luYyAoZSkgPT4gewoJCQkJbGV0IG8gPSBfZmFjdG9yeShlKTsKCQkJCW8ucHJvZ3Jlc3MuaGlkZSgpOwoJCQkJby50aXAuaGlkZSgpOwoJCQkJby5saW5rLnNob3coKTsKCQkJCW8uY29weS5zaG93KCk7CgkJCQlvLnN0b3AuaGlkZSgpOwoJCQkJby5iYWNrLmhpZGUoKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstYXBpLWJ0bicsIGFzeW5jIChlKSA9PiB7CgkJCQliYXNlLnNldENsaXBib2FyZChlLnRhcmdldC5kYXRhc2V0LmZpbGVuYW1lKTsKCQkJCSQoZS50YXJnZXQpLnRleHQoJ+WkjeWItuaIkOWKnycpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCXNldFRpbWVvdXQoCgkJCQkJZnVuY3Rpb24gKCl7CgkJCQkJCSQoZS50YXJnZXQpLnRleHQoJ+mHjeaWsOWkjeWIticpLmFuaW1hdGUoe29wYWNpdHk6ICcxJ30sICJzbG93Iik7CgkJCQkJfSwyMDAwCgkJCQkpCgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFsbCcsIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQliYXNlLnNldENsaXBib2FyZChkZWNvZGVVUklDb21wb25lbnQoZS50YXJnZXQuZGF0YXNldC5saW5rKSk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflpI3liLbmiJDlip8nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCQlzZXRUaW1lb3V0KAoJCQkJCWZ1bmN0aW9uICgpewoJCQkJCQkkKGUudGFyZ2V0KS50ZXh0KCfph43mlrDlpI3liLYnKS5hbmltYXRlKHtvcGFjaXR5OiAnMSd9LCAic2xvdyIpOwoJCQkJCX0sMjAwMAoJCQkJKQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJbGV0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTsgCgoJCQkJdGFyZ2V0LmZpbmQoJy5pY29uJykucmVtb3ZlKCk7CgkJCQl0YXJnZXQuZmluZCgnLnBsLWxvYWRpbmcnKS5yZW1vdmUoKTsKCQkJCXRhcmdldC5wcmVwZW5kKGJhc2UuY3JlYXRlTG9hZGluZygpKTsKCgkJCQlsZXQgcmVzID0gYXdhaXQgdGhpcy5zZW5kTGlua1RvUlBDKGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmZpbGVuYW1lLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKCQkJCWlmIChyZXMgPT09ICdzdWNjZXNzJykgewoJCQkJCSQoJy5saXN0ZW5lci1ycGMtdGFzaycpLnNob3coKTsKCQkJCQl0YXJnZXQucmVtb3ZlQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKCflj5HpgIHmiJDlip/kuoYh5b+r5Y6755yL55yL5ZCnficpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0gZWxzZSBpZiAocmVzID09PSAnYXNzaXN0YW50JykgewoJCQkJCXRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoYCR7cGFuLmluaXRbNV198J+RiTxhIGhyZWY9IiR7cGFuLmFzc2lzdGFudH0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0icGwtYSI+54K55Ye75q2k5aSE5a6J6KOFPC9hPvCfkYhgKTsKCQkJCX0gZWxzZSB7CgkJCQkJdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykudGV4dCgn5Y+R6YCB5aSx6LSl77yM5qOA5p+l5LiA5LiL5oKo55qEUlBD6YWN572u5L+h5oGv5ZOmIScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0KCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsKCQkJCSQoJy5saXN0ZW5lci1saW5rLXJwYycpLmNsaWNrKCk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflj5HpgIHlrozmiJDvvIzlj5HpgIHnu5Pmnpzop4HkuIrmlrnmjInpkq7lk6Z+JykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItZG93bmxvYWQtYWxsJywgKGUpID0+IHsKCQkJCSQoJy5wbC1pdGVtLWxpbmsnKS5jbGljaygpOwoJCQkJJChlLnRhcmdldCkudGV4dCgn5LiL6L295byA5aeL77yM5LiL6L296L+b5bqm6KeB5LiK5pa55oyJ6ZKu5ZOmficpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCXNldFRpbWVvdXQoCgkJCQkJZnVuY3Rpb24gKCl7CgkJCQkJCSQoZS50YXJnZXQpLnRleHQoJ+S4i+i9veWFqOmDqOmTvuaOpScpLmFuaW1hdGUoe29wYWNpdHk6ICcxJ30sICJzbG93Iik7CgkJCQkJfSwyMDAwCgkJCQkpCgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXNldHRpbmcnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dTZXR0aW5nKCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXVwZGF0ZWxvZycsICgpID0+IHsKCQkJCWJhc2Uuc2hvd1VwZGF0ZUxvZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItcnBjLXRhc2snLCAoKSA9PiB7CgkJCQlsZXQgcnBjID0gSlNPTi5zdHJpbmdpZnkoewoJCQkJCWRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCgkJCQkJcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAoJCQkJfSksIHVybCA9IGAke3Bhbi5kfS8/cnBjPSR7YmFzZS5lbmNvZGUocnBjKX0jJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpfWA7CgkJCQlHTV9vcGVuSW5UYWIodXJsLCB7YWN0aXZlOiB0cnVlfSk7CgkJCX0pOwoJCQlkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIChlKSA9PiB7CgkJCQlpZiAoZS50YXJnZXQubm9kZU5hbWUgPT09ICdBJyAmJiB+ZS50YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoJ3BsLWEnKSkgewoJCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCQl9CgkJCX0sIHRydWUpOwoJCX0sCgoJCWFzeW5jIGdldFJlYWxMaW5rKGQsIGYpIHsKCQkJbGV0IGF1dGhvcml6YXRpb24gPSBgJHtiYXNlLmdldFN0b3JhZ2UoJ3Rva2VuJykudG9rZW5fdHlwZX0gJHtiYXNlLmdldFN0b3JhZ2UoJ3Rva2VuJykuYWNjZXNzX3Rva2VufWA7CgkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QocGFuLnBjc1sxXSwgewoJCQkJZHJpdmVfaWQ6IGQsCgkJCQlmaWxlX2lkOiBmCgkJCX0sIHsKCQkJCWF1dGhvcml6YXRpb24sCgkJCQkiY29udGVudC10eXBlIjogImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCIsCgkJCX0pOwoJCQlpZiAocmVzLnVybCkgewoJCQkJcmV0dXJuIHJlcy51cmw7CgkJCX0KCQkJcmV0dXJuICcnOwoJCX0sCgoJCWFkZEJ1dHRvbigpIHsKCQkJaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikpewoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikucmVtb3ZlKCkKCQkJfQoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoJ1tjbGFzc149InNoYXJlLWxpc3QtYmFubmVyIl0nLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgYWQxID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2NsYXNzXj0ic2hhcmUtbGlzdC1iYW5uZXIiXScpOwoJCQkJLy9hZDEuc3R5bGUuekluZGV4ID0gMDsKCQkJCWFkMS5yZW1vdmUoKTsKCQkJfSx0cnVlKTsKCQkJd2FpdEZvcktleUVsZW1lbnRzKCdbY2xhc3NePSJ0by1hcHAiXScsIGZ1bmN0aW9uICgpIHsKCQkJCWxldCBhZDIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbY2xhc3NePSJ0by1hcHAiXScpOwoJCQkJYWQyLnJlbW92ZSgpOwoJCQl9LHRydWUpOwoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoJ1tjbGFzc149ImJ0bi1tb2JpbGUtc2F2ZSJdJywgZnVuY3Rpb24gKCkgewoJCQkJbGV0IGFkMyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tjbGFzc149ImJ0bi1tb2JpbGUtc2F2ZSJdJyk7CgkJCQlhZDMucmVtb3ZlKCk7CgkJCX0sdHJ1ZSk7CgkJCXdhaXRGb3JLZXlFbGVtZW50cygnW2NsYXNzXj0idGV4dCJdJywgZnVuY3Rpb24gKCkgewoJCQkJbGV0IGFkNCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tjbGFzc149InRleHQiXScpOwoJCQkJaWYgKGFkNC5pbm5lckhUTUwubWF0Y2goIlNWSVAiKSAmJiBhZDQuaW5uZXJIVE1MLm1hdGNoKCLmir0iKSAmJiBhZDQuaW5uZXJIVE1MLm1hdGNoKCLotaIiKSkKCQkJCQlhZDQucmVtb3ZlKCk7CgkJCX0sdHJ1ZSk7CgkJCXdhaXRGb3JLZXlFbGVtZW50cygnW2NsYXNzXj0iU3BsYXNoU2NyZWVuSW1nLS1jbG9zZSJdJywgZnVuY3Rpb24gKCkgewoJCQkJbGV0IHZpcDEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbY2xhc3NePSJTcGxhc2hTY3JlZW5JbWctLWNsb3NlIl0nKTsKCQkJCXZpcDEuY2xpY2soKTsKCQkJfSx0cnVlKTsKCQkJd2FpdEZvcktleUVsZW1lbnRzKCdbY2xhc3NePSJwb3B1cF9tYWluX2Nsb3NlIl0nLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgdmlwMiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tjbGFzc149InBvcHVwX21haW5fY2xvc2UiXScpOwoJCQkJdmlwMi5jbGljaygpOwoJCQl9LHRydWUpOwoJCQlpZiAoIXB0KSByZXR1cm47CgkJCWxldCAkdG9vbFdyYXA7CgkJCWxldCAkYnV0dG9uID0gJChgPGRpdiBpZD0icGwtYnV0dG9uLWxpbmsiIGNsYXNzPSJhbGktYnV0dG9uIHBsLWJ1dHRvbiI+PHNwYW4gZGF0YS1yb2xlPSJpY29uIiBkYXRhLXJlbmRlci1hcz0ic3ZnIiBjbGFzcz0iaWNvbiI+PHN2ZyBjbGFzcz0iYWxpLWJ0bi1pY29uIiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTg1My4zMzMgOTM4LjY2N0gxNzAuNjY3YTg1LjMzMyA4NS4zMzMgMCAwIDEtODUuMzM0LTg1LjMzNHYtMzg0QTg1LjMzMyA4NS4zMzMgMCAwIDEgMTcwLjY2NyAzODRIMjg4YTMyIDMyIDAgMCAxIDAgNjRIMTcwLjY2N2EyMS4zMzMgMjEuMzMzIDAgMCAwLTIxLjMzNCAyMS4zMzN2Mzg0YTIxLjMzMyAyMS4zMzMgMCAwIDAgMjEuMzM0IDIxLjMzNGg2ODIuNjY2YTIxLjMzMyAyMS4zMzMgMCAwIDAgMjEuMzM0LTIxLjMzNHYtMzg0QTIxLjMzMyAyMS4zMzMgMCAwIDAgODUzLjMzMyA0NDhINzM2YTMyIDMyIDAgMCAxIDAtNjRoMTE3LjMzM2E4NS4zMzMgODUuMzMzIDAgMCAxIDg1LjMzNCA4NS4zMzN2Mzg0YTg1LjMzMyA4NS4zMzMgMCAwIDEtODUuMzM0IDg1LjMzNHoiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD48cGF0aCBkPSJNNzE1LjAzIDU0My41NTJhMzIuODEgMzIuODEgMCAwIDAtNDYuMjUxIDBMNTU0LjAwNSA2NTcuODEzdi01NDAuNDhhMzIgMzIgMCAwIDAtNjQgMHY1MzkuNzM0TDM3NS44OTMgNTQzLjQ4OGEzMi43OSAzMi43OSAwIDAgMC00Ni4yMjkgMCAzMi40MjcgMzIuNDI3IDAgMCAwIDAgNDYuMDM3bDE2OS41NTcgMTY4LjgxMWEzMi44MSAzMi44MSAwIDAgMCA0Ni4yNTEgMGwxNjkuNTU3LTE2OC44MWEzMi40NyAzMi40NyAwIDAgMCAwLTQ1Ljk3NHoiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD48L3N2Zz48L3NwYW4+PHVsIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51IiBzdHlsZT0idG9wOiAzMHB4OyByaWdodDogMDsiPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImFwaSI+QVBJ5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcmlhIiA+QXJpYeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0icnBjIj5SUEPkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImN1cmwiPmNVUkzkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImJjIiA+QkPkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIGxpc3RlbmVyLW9wZW4tc2V0dGluZyI+5Yqp5omL6K6+572uPC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSBsaXN0ZW5lci1vcGVuLXVwZGF0ZWxvZyI+5pu05paw5pel5b+XPC9saT48L3VsPjwvZGl2PmApOwoJCQlpZiAocHQgPT09ICdob21lJykgewoJCQkJYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uaG9tZSwgKCkgPT4gewoJCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJCQkkKCcucGwtYnV0dG9uJykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5hcHBlbmQoJGJ1dHRvbik7CgkJCQl9KQoJCQl9CgkJCWlmIChwdCA9PT0gJ3NoYXJlJykgewoJCQkJbGV0ICRidXR0b24gPSAkKGA8ZGl2IGlkPSJwbC1idXR0b24tbGluayIgY2xhc3M9ImFsaS1idXR0b24gcGwtYnV0dG9uIj48c3BhbiBkYXRhLXJvbGU9Imljb24iIGRhdGEtcmVuZGVyLWFzPSJzdmciIGNsYXNzPSJpY29uIj48c3ZnIGNsYXNzPSJhbGktYnRuLWljb24iIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDNweDsiIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ij48cGF0aCBkPSJNODUzLjMzMyA5MzguNjY3SDE3MC42NjdhODUuMzMzIDg1LjMzMyAwIDAgMS04NS4zMzQtODUuMzM0di0zODRBODUuMzMzIDg1LjMzMyAwIDAgMSAxNzAuNjY3IDM4NEgyODhhMzIgMzIgMCAwIDEgMCA2NEgxNzAuNjY3YTIxLjMzMyAyMS4zMzMgMCAwIDAtMjEuMzM0IDIxLjMzM3YzODRhMjEuMzMzIDIxLjMzMyAwIDAgMCAyMS4zMzQgMjEuMzM0aDY4Mi42NjZhMjEuMzMzIDIxLjMzMyAwIDAgMCAyMS4zMzQtMjEuMzM0di0zODRBMjEuMzMzIDIxLjMzMyAwIDAgMCA4NTMuMzMzIDQ0OEg3MzZhMzIgMzIgMCAwIDEgMC02NGgxMTcuMzMzYTg1LjMzMyA4NS4zMzMgMCAwIDEgODUuMzM0IDg1LjMzM3YzODRhODUuMzMzIDg1LjMzMyAwIDAgMS04NS4zMzQgODUuMzM0eiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPjxwYXRoIGQ9Ik03MTUuMDMgNTQzLjU1MmEzMi44MSAzMi44MSAwIDAgMC00Ni4yNTEgMEw1NTQuMDA1IDY1Ny44MTN2LTU0MC40OGEzMiAzMiAwIDAgMC02NCAwdjUzOS43MzRMMzc1Ljg5MyA1NDMuNDg4YTMyLjc5IDMyLjc5IDAgMCAwLTQ2LjIyOSAwIDMyLjQyNyAzMi40MjcgMCAwIDAgMCA0Ni4wMzdsMTY5LjU1NyAxNjguODExYTMyLjgxIDMyLjgxIDAgMCAwIDQ2LjI1MSAwbDE2OS41NTctMTY4LjgxYTMyLjQ3IDMyLjQ3IDAgMCAwIDAtNDUuOTc0eiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPjwvc3ZnPuS4i+i9veWKqeaJizwvc3Bhbj48dWwgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUiIHN0eWxlPSJ0b3A6IDMwcHg7IHJpZ2h0OiAxNnB4OyI+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXBpIj5BUEnkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImFyaWEiID5Bcmlh5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJycGMiPlJQQ+S4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iY3VybCI+Y1VSTOS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYmMiID5CQ+S4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUgbGlzdGVuZXItb3Blbi1zZXR0aW5nIj7liqnmiYvorr7nva48L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIGxpc3RlbmVyLW9wZW4tdXBkYXRlbG9nIj7mm7TmlrDml6Xlv5c8L2xpPjwvdWw+PC9kaXY+YCk7CgkJCQkkYnV0dG9uLmNzcyh7J21hcmdpbi1yaWdodCc6ICcxMHB4JywiaGVpZ2h0IjoiMzZweCIsIndpZHRoIjoiYXV0byIsInBhZGRpbmciOiIxcHggMzBweCJ9KTsKCQkJCWJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLnNoYXJlLCAoKSA9PiB7CgkJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKCQkJCQkkKCcucGwtYnV0dG9uJykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJfSkKCQkJfQoJCQl0aGlzLmFkZFBhZ2VMaXN0ZW5lcigpOwoJCQliYXNlLmNyZWF0ZURvd25sb2FkSWZyYW1lKCk7CgkJfSwKCgkJYWRkSW5pdEJ1dHRvbigpIHsKCQkJaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikpewoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikucmVtb3ZlKCkKCQkJfQoJCQlpZiAoIXB0KSByZXR1cm47CgkJCWxldCAkdG9vbFdyYXA7CgkJCWxldCAkYnV0dG9uID0gJChgPGRpdiBpZD0icGwtYnV0dG9uLWxpbmsiIGNsYXNzPSJhbGktYnV0dG9uIHBsLWJ1dHRvbi1pbml0Ij48c3BhbiBkYXRhLXJvbGU9Imljb24iIGRhdGEtcmVuZGVyLWFzPSJzdmciIGNsYXNzPSJpY29uIj48c3ZnIGNsYXNzPSJhbGktYnRuLWljb24iIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDNweDsiIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ij48cGF0aCBkPSJNODUzLjMzMyA5MzguNjY3SDE3MC42NjdhODUuMzMzIDg1LjMzMyAwIDAgMS04NS4zMzQtODUuMzM0di0zODRBODUuMzMzIDg1LjMzMyAwIDAgMSAxNzAuNjY3IDM4NEgyODhhMzIgMzIgMCAwIDEgMCA2NEgxNzAuNjY3YTIxLjMzMyAyMS4zMzMgMCAwIDAtMjEuMzM0IDIxLjMzM3YzODRhMjEuMzMzIDIxLjMzMyAwIDAgMCAyMS4zMzQgMjEuMzM0aDY4Mi42NjZhMjEuMzMzIDIxLjMzMyAwIDAgMCAyMS4zMzQtMjEuMzM0di0zODRBMjEuMzMzIDIxLjMzMyAwIDAgMCA4NTMuMzMzIDQ0OEg3MzZhMzIgMzIgMCAwIDEgMC02NGgxMTcuMzMzYTg1LjMzMyA4NS4zMzMgMCAwIDEgODUuMzM0IDg1LjMzM3YzODRhODUuMzMzIDg1LjMzMyAwIDAgMS04NS4zMzQgODUuMzM0eiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPjxwYXRoIGQ9Ik03MTUuMDMgNTQzLjU1MmEzMi44MSAzMi44MSAwIDAgMC00Ni4yNTEgMEw1NTQuMDA1IDY1Ny44MTN2LTU0MC40OGEzMiAzMiAwIDAgMC02NCAwdjUzOS43MzRMMzc1Ljg5MyA1NDMuNDg4YTMyLjc5IDMyLjc5IDAgMCAwLTQ2LjIyOSAwIDMyLjQyNyAzMi40MjcgMCAwIDAgMCA0Ni4wMzdsMTY5LjU1NyAxNjguODExYTMyLjgxIDMyLjgxIDAgMCAwIDQ2LjI1MSAwbDE2OS41NTctMTY4LjgxYTMyLjQ3IDMyLjQ3IDAgMCAwIDAtNDUuOTc0eiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPjwvc3ZnPijmnKrngrnkuq4pPC9zcGFuPjwvZGl2PmApOwoJCQkkYnV0dG9uLmNzcyh7IndpZHRoIjoiYXV0byJ9KTsKCQkJaWYgKHB0ID09PSAnaG9tZScpIHsKCQkJCWJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLmhvbWUsICgpID0+IHsKCQkJCQkkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CgkJCQkJJCgnLnBsLWJ1dHRvbi1pbml0JykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5hcHBlbmQoJGJ1dHRvbik7CgkJCQl9KQoJCQl9CgkJCWlmIChwdCA9PT0gJ3NoYXJlJykgewoJCQkJbGV0ICRidXR0b24gPSAkKGA8ZGl2IGlkPSJwbC1idXR0b24tbGluayIgY2xhc3M9ImFsaS1idXR0b24gcGwtYnV0dG9uLWluaXQiPjxzcGFuIGRhdGEtcm9sZT0iaWNvbiIgZGF0YS1yZW5kZXItYXM9InN2ZyIgY2xhc3M9Imljb24iPjxzdmcgY2xhc3M9ImFsaS1idG4taWNvbiIgc3R5bGU9Im1hcmdpbi1yaWdodDogM3B4OyIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik04NTMuMzMzIDkzOC42NjdIMTcwLjY2N2E4NS4zMzMgODUuMzMzIDAgMCAxLTg1LjMzNC04NS4zMzR2LTM4NEE4NS4zMzMgODUuMzMzIDAgMCAxIDE3MC42NjcgMzg0SDI4OGEzMiAzMiAwIDAgMSAwIDY0SDE3MC42NjdhMjEuMzMzIDIxLjMzMyAwIDAgMC0yMS4zMzQgMjEuMzMzdjM4NGEyMS4zMzMgMjEuMzMzIDAgMCAwIDIxLjMzNCAyMS4zMzRoNjgyLjY2NmEyMS4zMzMgMjEuMzMzIDAgMCAwIDIxLjMzNC0yMS4zMzR2LTM4NEEyMS4zMzMgMjEuMzMzIDAgMCAwIDg1My4zMzMgNDQ4SDczNmEzMiAzMiAwIDAgMSAwLTY0aDExNy4zMzNhODUuMzMzIDg1LjMzMyAwIDAgMSA4NS4zMzQgODUuMzMzdjM4NGE4NS4zMzMgODUuMzMzIDAgMCAxLTg1LjMzNCA4NS4zMzR6IiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+PHBhdGggZD0iTTcxNS4wMyA1NDMuNTUyYTMyLjgxIDMyLjgxIDAgMCAwLTQ2LjI1MSAwTDU1NC4wMDUgNjU3LjgxM3YtNTQwLjQ4YTMyIDMyIDAgMCAwLTY0IDB2NTM5LjczNEwzNzUuODkzIDU0My40ODhhMzIuNzkgMzIuNzkgMCAwIDAtNDYuMjI5IDAgMzIuNDI3IDMyLjQyNyAwIDAgMCAwIDQ2LjAzN2wxNjkuNTU3IDE2OC44MTFhMzIuODEgMzIuODEgMCAwIDAgNDYuMjUxIDBsMTY5LjU1Ny0xNjguODFhMzIuNDcgMzIuNDcgMCAwIDAgMC00NS45NzR6IiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+PC9zdmc+KOacqueCueS6rik8L3NwYW4+PC9kaXY+YCk7CgkJCQkkYnV0dG9uLmNzcyh7J21hcmdpbi1yaWdodCc6ICcxMHB4JywiaGVpZ2h0IjoiMzZweCIsInBhZGRpbmciOiIxcHggMzBweCIsIndpZHRoIjoiYXV0byJ9KTsKCQkJCWJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLnNoYXJlLCAoKSA9PiB7CgkJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKCQkJCQkkKCcucGwtYnV0dG8taW5pdCcpLmxlbmd0aCA9PT0gMCAmJiAkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKCQkJCX0pCgkJCX0KCQkJJGJ1dHRvbi5jbGljaygoKSA9PiBiYXNlLmluaXREaWFsb2coKSk7CgkJfSwKCgkJYXN5bmMgZ2V0UENTTGluaygpIHsKCQkJbGV0IHJlYWN0RG9tR3JpZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocGFuLmRvbS5ncmlkKTsKCQkJaWYgKHJlYWN0RG9tR3JpZCkgewoJCQkJbGV0IHJlcyA9IGF3YWl0IFN3YWwuZmlyZSh7CgkJCQkJdGl0bGU6ICfmj5DnpLonLAoJCQkJCWh0bWw6ICc8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4O2FsaWduLWl0ZW1zOiBjZW50ZXI7anVzdGlmeS1jb250ZW50OiBjZW50ZXI7Ij7or7flhYjliIfmjaLliLAmbmJzcDsmbmJzcDs8Yj7liJfooajop4blm748L2I+Jm5ic3A74oCcPHN2ZyBjbGFzcz0iaWNvbiIgY2xhc3M9Imljb24tLUQza01rICIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIj48dXNlIHhsaW5rOmhyZWY9IiNQRFNEcmFnIj48L3VzZT48L3N2Zz7igJ0mbmJzcDsmbmJzcDvlkI7ojrflj5bkuIvovb3pk77mjqU8L2Rpdj4nLAoJCQkJCWljb246ICdpbmZvJywKCQkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCQlzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKCQkJCQljb25maXJtQnV0dG9uVGV4dDogJ+eCueWHu+WIh+aNoicKCQkJCX0pOwoJCQkJaWYgKHJlcykgewoJCQkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocGFuLmRvbS5zd2l0Y2gpLmNsaWNrKCk7CgkJCQkJcmV0dXJuIG1lc3NhZ2Uuc3VjY2Vzcygn5YiH5o2i5Li65YiX6KGo6KeG5Zu+5oiQ5Yqf77yM6K+35YaN6I635Y+W5LiA5qyh5LiL6L296ZO+5o6l5ZGificpOwoJCQkJfQoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCXNlbGVjdExpc3QgPSB0aGlzLmdldFNlbGVjdGVkTGlzdCgpOwoJCQlpZiAoc2VsZWN0TGlzdC5sZW5ndGggPT09IDApIHsKCQkJCXJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+6K+35YWI5Yu+6YCJ6KaB5LiL6L2955qE5paH5Lu25o2PficpOwoJCQl9CgkJCWlmICh0aGlzLmlzT25seUZvbGRlcigpKSB7CgkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+aJk+W8gOaWh+S7tuWkueWQjuWGjeWLvumAieaWh+S7tn4nKTsKCQkJfQoJCQlpZiAocHQgPT09ICdzaGFyZScpIHsKCQkJCWlmIChzZWxlY3RMaXN0Lmxlbmd0aCA+IDIwKSB7CgkJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7kuIDmrKHmnIDlpJrlj6rog73li77pgIkgMjAg5Liq5paH5Lu25ZOmIScpOwoJCQkJfQoJCQkJdHJ5IHsKCQkJCQlsZXQgYXV0aG9yaXphdGlvbiA9IGAke2Jhc2UuZ2V0U3RvcmFnZSgndG9rZW4nKS50b2tlbl90eXBlfSAke2Jhc2UuZ2V0U3RvcmFnZSgndG9rZW4nKS5hY2Nlc3NfdG9rZW59YDsKCQkJCQlsZXQgeFNoYXJlVG9rZW4gPSBiYXNlLmdldFN0b3JhZ2UoJ3NoYXJlVG9rZW4nKS5zaGFyZV90b2tlbjsKCgkJCQkJZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3RMaXN0Lmxlbmd0aDsgaSsrKSB7CgkJCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QocGFuLnBjc1swXSwgewoJCQkJCQkJZXhwaXJlX3NlYzogNjAwLAoJCQkJCQkJZmlsZV9pZDogc2VsZWN0TGlzdFtpXS5maWxlSWQsCgkJCQkJCQlzaGFyZV9pZDogc2VsZWN0TGlzdFtpXS5zaGFyZUlkCgkJCQkJCX0sIHsKCQkJCQkJCWF1dGhvcml6YXRpb24sCgkJCQkJCQkiY29udGVudC10eXBlIjogImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCIsCgkJCQkJCQkieC1zaGFyZS10b2tlbiI6IHhTaGFyZVRva2VuCgkJCQkJCX0pOwoJCQkJCQlpZiAocmVzLmRvd25sb2FkX3VybCkgewoJCQkJCQkJc2VsZWN0TGlzdFtpXS5kb3dubG9hZFVybCA9IHJlcy5kb3dubG9hZF91cmw7CgkJCQkJCX0KCQkJCQl9CgkJCQl9IGNhdGNoIChlKSB7CgkJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7flhYjnmbvlvZXnvZHnm5h+Jyk7CgkJCQl9CgkJCX0KCQkJbGV0IGh0bWwgPSB0aGlzLmdlbmVyYXRlRG9tKHNlbGVjdExpc3QpOwoJCQl0aGlzLnNob3dNYWluRGlhbG9nKHBhblttb2RlXVswXSwgaHRtbCwgcGFuW21vZGVdWzFdKTsKCQl9LAoKCQlnZW5lcmF0ZURvbShsaXN0KSB7CgkJCWxldCBjb250ZW50ID0gJzxkaXYgY2xhc3M9InBsLW1haW4iPic7CgkJCWxldCBhbGlua0FsbFRleHQgPSAnJzsKCQkJY29uc29sZS5sb2cobGlzdCkKCQkJbGlzdC5mb3JFYWNoKCh2LCBpKSA9PiB7CgkJCQlpZiAodi50eXBlID09PSAnZm9sZGVyJykgcmV0dXJuOwoJCQkJbGV0IGZpbGVuYW1lID0gdi5uYW1lOwoJCQkJbGV0IGZpZCA9IHYuZmlsZUlkOwoJCQkJbGV0IGRpZCA9IHYuZHJpdmVJZDsKCQkJCWxldCBzaXplID0gYmFzZS5zaXplRm9ybWF0KHYuc2l6ZSk7CgkJCQlsZXQgZGxpbmsgPSB2LmRvd25sb2FkVXJsIHx8IHYudXJsOwoJCQkJaWYgKG1vZGUgPT09ICdhcGknKSB7CgkJCQkJYWxpbmtBbGxUZXh0ICs9IGRsaW5rICsgJ1xyXG4nOwoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSIgPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIGxpc3RlbmVyLWxpbmstYXBpIiBocmVmPSIke2RsaW5rfSIgZGF0YS1kaWQ9IiR7ZGlkfSIgZGF0YS1maWQ9IiR7ZmlkfSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iIGRhdGEtc2l6ZT0iJHt2LnNpemV9IiBkYXRhLWluZGV4PSIke2l9Ij4ke2RsaW5rfTxicj7kuIvovb0gICR7ZmlsZW5hbWV9PC9hPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tY29weSBwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1saW5rLWFwaS1idG4iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9Ij7lpI3liLbmlofku7blkI08L2Rpdj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLXRpcCIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPjxzcGFuPjxzcGFuIGNsYXNzPSJwbC1leHQiPjwvc3Bhbj48L3NwYW4+IDxzcGFuIGNsYXNzPSJwbC1iYWNrIGxpc3RlbmVyLWJhY2siPui/lOWbnjwvc3Bhbj48L2Rpdj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLXByb2dyZXNzIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+CgkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLXByb2dyZXNzIj4KCQkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLXByb2dyZXNzLW91dGVyIj48L2Rpdj4KCQkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLXByb2dyZXNzLWlubmVyIiBzdHlsZT0id2lkdGg6NSUiPgoJCQkJCQkJCQkJPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3MtaW5uZXItdGV4dCI+5q2j5Zyo5Yqg6L296L+b5bqmLi4uMCU8L2Rpdj4KCQkJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQkJPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLXN0b3AgbGlzdGVuZXItc3RvcCI+5Y+W5raI5LiL6L29PC9zcGFuPgoJCQkJCWA7CgkJCQkJY29udGVudCs9YDxzcGFuIGNsYXNzPSJwbC1wcm9ncmVzcy10aXAiIHN0eWxlPSJkaXNwbGF5OiBub25lIiA+5L2/55So6Ieq5bim5rWP6KeI5Zmo5LiL6L29PC9zcGFuPgoJCQkJCQkJCTxzcGFuIGNsYXNzPSJwbC1wcm9ncmVzcy1iYWNrIHBsLWJhY2sgbGlzdGVuZXItYmFjayIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPui/lOWbnjwvc3Bhbj4KCQkJCQkJCQk8c3BhbiBjbGFzcz0icGwtcHJvZ3Jlc3MtaG93IGxpc3RlbmVyLWhvdyIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPuWmguS9leWUpOi1t0lETe+8nzwvc3Bhbj4KCQkJCQlgOwoJCQkJCWNvbnRlbnQgKz1gPC9kaXY+PC9kaXY+YDsKCQkJCX0KCQkJCWlmIChtb2RlID09PSAnYXJpYScpIHsKCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9BcmlhKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQkJaWYgKG1vZGUgPT09ICdycGMnKSB7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxidXR0b24gY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLXJwYyBwbC1idG4tcHJpbWFyeSBwbC1idG4taW5mbyIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRldmljZSI+PC9lbT48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDVweDsiPuaOqOmAgeWIsCBSUEMg5LiL6L295ZmoPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2N1cmwnKSB7CgkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQ3VybChkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwoJCQkJCWFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2Y3VybOmTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2JjJykgewoJCQkJCWxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0JDKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX0iIHRpdGxlPSLngrnlh7vnlKjmr5TnibnlvZfmmJ/kuIvovb0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQl9KTsKCQkJY29udGVudCArPSAnPC9kaXY+JzsKCQkJaWYgKG1vZGUgPT09ICdhcGknKQoJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLWRvd25sb2FkLWFsbCI+5LiL6L295YWo6YOo6ZO+5o6lPC9idXR0b24+PC9kaXY+YDsKCQkJaWYgKG1vZGUgPT09ICdhcmlhJykKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOWRveS7pOihjDwvYnV0dG9uPjwvZGl2PmA7CgkJCWlmIChtb2RlID09PSAncnBjJykgewoJCQkJbGV0IHJwYyA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpICsgJzonICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpOwoJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLXNlbmQtcnBjIj7lj5HpgIHlhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIHRpdGxlPSIke3JwY30iIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweCI+6K6+572uIFJQQyDlj4LmlbDvvIjlvZPliY3kuLrvvJoke3JwY33vvIk8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4tc3VjY2VzcyBsaXN0ZW5lci1ycGMtdGFzayIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4O2Rpc3BsYXk6IG5vbmUiPuafpeeci+S4i+i9veS7u+WKoTwvYnV0dG9uPjwvZGl2PmA7CgkJCX0KCQkJaWYgKG1vZGUgPT09ICdjdXJsJykKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+5YmN5b6A5Yqp5omL6K6+572u5L+u5pS55b2T5YmN57uI56uv57G75Z6L77yIJHt0ZXJtaW5hbFR5cGVbYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyldfe+8iTwvYnV0dG9uPjwvZGl2PmA7CgkJCXJldHVybiBjb250ZW50OwoJCX0sCgoJCWFzeW5jIHNlbmRMaW5rVG9SUEMoZmlsZW5hbWUsIGxpbmspIHsKCQkJbGV0IHJwYyA9IHsKCQkJCWRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCgkJCQlwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCgkJCQlwYXRoOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyksCgkJCQl0b2tlbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKSwKCQkJCWRpcjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJyksCgkJCX07CgoJCQlsZXQgdXJsID0gYCR7cnBjLmRvbWFpbn06JHtycGMucG9ydH0ke3JwYy5wYXRofWA7CgkJCWxldCBycGNEYXRhID0gewoJCQkJaWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAoJCQkJanNvbnJwYzogJzIuMCcsCgkJCQltZXRob2Q6ICdhcmlhMi5hZGRVcmknLAoJCQkJcGFyYW1zOiBbYHRva2VuOiR7cnBjLnRva2VufWAsIFtsaW5rXSwgewoJCQkJCWRpcjogcnBjLmRpciwKCQkJCQlvdXQ6IGZpbGVuYW1lLAoJCQkJCWhlYWRlcjogW2BSZWZlcmVyOiBodHRwczovLyR7bG9jYXRpb24uaG9zdH0vYF0KCQkJCX1dCgkJCX07CgkJCXRyeSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHVybCwgcnBjRGF0YSwgeyJSZWZlcmVyIjogYGh0dHBzOi8vJHtsb2NhdGlvbi5ob3N0fS9gfSwgJycpOwoJCQkJaWYgKHJlcy5yZXN1bHQpIHJldHVybiAnc3VjY2Vzcyc7CgkJCQlyZXR1cm4gJ2ZhaWwnOwoJCQl9IGNhdGNoIChlKSB7CgkJCQlyZXR1cm4gJ2ZhaWwnOwoJCQl9CgkJfSwKCgkJZ2V0U2VsZWN0ZWRMaXN0KCkgewoJCQl0cnkgewoJCQkJbGV0IHNlbGVjdGVkTGlzdCA9IFtdOwoJCQkJbGV0IHJlYWN0RG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihwYW4uZG9tLmxpc3QpOwoJCQkJbGV0IHJlYWN0T2JqID0gYmFzZS5maW5kUmVhY3QocmVhY3REb20sIDEpOwoJCQkJbGV0IHByb3BzID0gcmVhY3RPYmoucGVuZGluZ1Byb3BzOwoJCQkJaWYgKHByb3BzKSB7CgkJCQkJbGV0IGZpbGVMaXN0ID0gcHJvcHMuZGF0YVNvdXJjZSB8fCBbXTsKCQkJCQlsZXQgc2VsZWN0ZWRLZXlzID0gcHJvcHMuc2VsZWN0ZWRLZXlzLnNwbGl0KCcsJyk7CgkJCQkJZmlsZUxpc3QuZm9yRWFjaCgodmFsKSA9PiB7CgkJCQkJCWlmIChzZWxlY3RlZEtleXMuaW5jbHVkZXModmFsLmZpbGVJZCkpIHsKCQkJCQkJCXNlbGVjdGVkTGlzdC5wdXNoKHZhbCk7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCX0KCQkJCXJldHVybiBzZWxlY3RlZExpc3Q7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCXJldHVybiBbXTsKCQkJfQoJCX0sCgoJCWRldGVjdFBhZ2UoKSB7CgkJCWxldCBwYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CgkJCWlmICgvXlwvKGRyaXZlKS8udGVzdChwYXRoKSkgcmV0dXJuICdob21lJzsKCQkJaWYgKC9eXC8oc3xzaGFyZSlcLy8udGVzdChwYXRoKSkgcmV0dXJuICdzaGFyZSc7CgkJCXJldHVybiAnJzsKCQl9LAoKCQlpc09ubHlGb2xkZXIoKSB7CgkJCWZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0TGlzdC5sZW5ndGg7IGkrKykgewoJCQkJaWYgKHNlbGVjdExpc3RbaV0udHlwZSA9PT0gJ2ZpbGUnKSByZXR1cm4gZmFsc2U7CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJc2hvd01haW5EaWFsb2codGl0bGUsIGh0bWwsIGZvb3RlcikgewoJCQlTd2FsLmZpcmUoewoJCQkJdGl0bGUsCgkJCQlodG1sLAoJCQkJZm9vdGVyLAoJCQkJYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAoJCQkJc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAoJCQkJcG9zaXRpb246ICdjZW50ZXInLC8vdG9wCgkJCQl3aWR0aCwKCQkJCXBhZGRpbmc6ICcxNXB4IDIwcHggNXB4JywKCQkJCWN1c3RvbUNsYXNzLAoJCQkJY29uZmlybUJ1dHRvblRleHQ6ICflhbPpl60nLAoJCQl9KTsKCQl9LAoKCQlhc3luYyBpbml0UGFuTGlua2VyKCkgewoJCQlwdCA9IHRoaXMuZGV0ZWN0UGFnZSgpOwoJCQliYXNlLmNyZWF0ZVRpcCgpOwoJCQliYXNlLnJlZ2lzdGVyTWVudUNvbW1hbmQoKTsKCQkJaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gJ3YxJykgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL2FsaS8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gJ3YyJykgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL3YyL2FsaS8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gIm5vIikgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KGBodHRwczovL2djb3JlLmpzZGVsaXZyLm5ldC9naC9obWp6MTAwL09ubGluZS1kaXNrLWRpcmVjdC1saW5rLWRvd25sb2FkLWFzc2lzdGFudEBtYWluL2NvbmZpZy9hbGkuanNvbmAsIHt9LCAidGV4dCIsIHt9KTsKCQkJCXBhbiA9IEpTT04ucGFyc2UocmVzKTsKCQkJfSBlbHNlIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLmdldChgaHR0cHM6Ly9nY29yZS5qc2RlbGl2ci5uZXQvZ2gvaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnRAbWFpbi9jb25maWcvY29uZmlnLmpzb25gLCB7fSwgInRleHQiLCB7fSk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKHJlcyk7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJywgJ3YyJyk7CgkJCX0KCQkJT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKHBhbik7CgkJCXBhbi5udW0gPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJykgfHwgcGFuLmxpY2Vuc2UgPT09IGJhc2UuZ2V0VmFsdWUoJ2xpY2Vuc2UnKSA/IHRoaXMuYWRkQnV0dG9uKCkgOiB0aGlzLmFkZEluaXRCdXR0b24oKTsKCQl9Cgl9OwoKCS8v5aSp57+85LqRCglsZXQgdGlhbnlpID0gewoKCQljb252ZXJ0TGlua1RvQXJpYShsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYXJpYTJjICIke2xpbmt9IiAtLW91dCAiJHtmaWxlbmFtZX0iYCk7CgkJfSwKCgkJY29udmVydExpbmtUb0JDKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlsZXQgYmMgPSBgQUEvJHtlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpfS8/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpbmspfVpaYDsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYmM6Ly9odHRwLyR7YmFzZS5lbmNvZGUoYmMpfWApOwoJCX0sCgoJCWNvbnZlcnRMaW5rVG9DdXJsKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlsZXQgdGVybWluYWwgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKTsKCQkJZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgJHt0ZXJtaW5hbCAhPT0gJ3dwJyA/ICdjdXJsJyA6ICdjdXJsLmV4ZSd9IC1MIC1DIC0gIiR7bGlua30iIC1vICIke2ZpbGVuYW1lfSJgKTsKCQl9LAoKCQlhZGRQYWdlTGlzdGVuZXIoKSB7CgkJCWRvYy5vbignY2xpY2snLCAnLnBsLWJ1dHRvbi1tb2RlJywgKGUpID0+IHsKCQkJCW1vZGUgPSBlLnRhcmdldC5kYXRhc2V0Lm1vZGU7CgkJCQlTd2FsLmZpcmUoewoJCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJCXNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKCQkJCQlodG1sOiBg6ZO+5o6l6I635Y+W5LitYCwKCQkJCQl3aWxsT3BlbjogZnVuY3Rpb24oKSB7CgkJCQkJCVN3YWwuc2hvd0xvYWRpbmcoKTsKCQkJCQl9CgkJCQl9KTsKCQkJCXRoaXMuZ2V0UENTTGluaygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcGknLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJJCgnI2Rvd25sb2FkSWZyYW1lJykuYXR0cignc3JjJywgZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQubGluayk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFsbCcsIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQliYXNlLnNldENsaXBib2FyZChkZWNvZGVVUklDb21wb25lbnQoZS50YXJnZXQuZGF0YXNldC5saW5rKSk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflpI3liLbmiJDlip8nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCQlzZXRUaW1lb3V0KAoJCQkJCWZ1bmN0aW9uICgpewoJCQkJCQkkKGUudGFyZ2V0KS50ZXh0KCfph43mlrDlpI3liLYnKS5hbmltYXRlKHtvcGFjaXR5OiAnMSd9LCAic2xvdyIpOwoJCQkJCX0sMjAwMAoJCQkJKQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJbGV0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTsgCgoJCQkJdGFyZ2V0LmZpbmQoJy5pY29uJykucmVtb3ZlKCk7CgkJCQl0YXJnZXQuZmluZCgnLnBsLWxvYWRpbmcnKS5yZW1vdmUoKTsKCQkJCXRhcmdldC5wcmVwZW5kKGJhc2UuY3JlYXRlTG9hZGluZygpKTsKCgkJCQlsZXQgcmVzID0gYXdhaXQgdGhpcy5zZW5kTGlua1RvUlBDKGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmZpbGVuYW1lLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKCQkJCWlmIChyZXMgPT09ICdzdWNjZXNzJykgewoJCQkJCSQoJy5saXN0ZW5lci1ycGMtdGFzaycpLnNob3coKTsKCQkJCQl0YXJnZXQucmVtb3ZlQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKCflj5HpgIHmiJDlip/kuoYh5b+r5Y6755yL55yL5ZCnficpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0gZWxzZSBpZiAocmVzID09PSAnYXNzaXN0YW50JykgewoJCQkJCXRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoYCR7cGFuLmluaXRbNV198J+RiTxhIGhyZWY9IiR7cGFuLmFzc2lzdGFudH0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0icGwtYSI+54K55Ye75q2k5aSE5a6J6KOFPC9hPvCfkYhgKTsKCQkJCX0gZWxzZSB7CgkJCQkJdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykudGV4dCgn5Y+R6YCB5aSx6LSl77yM5qOA5p+l5LiA5LiL5oKo55qEUlBD6YWN572u5L+h5oGv5ZOmIScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0KCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsKCQkJCSQoJy5saXN0ZW5lci1saW5rLXJwYycpLmNsaWNrKCk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflj5HpgIHlrozmiJDvvIzlj5HpgIHnu5Pmnpzop4HkuIrmlrnmjInpkq7lk6Z+JykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi1zZXR0aW5nJywgKCkgPT4gewoJCQkJYmFzZS5zaG93U2V0dGluZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi11cGRhdGVsb2cnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dVcGRhdGVMb2coKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXJwYy10YXNrJywgKCkgPT4gewoJCQkJbGV0IHJwYyA9IEpTT04uc3RyaW5naWZ5KHsKCQkJCQlkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAoJCQkJCXBvcnQ6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKCQkJCX0pLCB1cmwgPSBgJHtwYW4uZH0vP3JwYz0ke2Jhc2UuZW5jb2RlKHJwYyl9IyR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKX1gOwoJCQkJR01fb3BlbkluVGFiKHVybCwge2FjdGl2ZTogdHJ1ZX0pOwoJCQl9KTsKCQl9LAoKCQlhZGRCdXR0b24oKSB7CgkJCWlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpKXsKCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpLnJlbW92ZSgpCgkJCX0KCQkJaWYgKCFwdCkgcmV0dXJuOwoJCQlsZXQgJHRvb2xXcmFwOwoJCQlsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9InRpYW55aS1idXR0b24gcGwtYnV0dG9uIiBpZD0icGwtYnV0dG9uLWxpbmsiPuS4i+i9veWKqeaJizx1bCBjbGFzcz0icGwtZHJvcGRvd24tbWVudSIgc3R5bGU9InRvcDogMjZweDsiPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImFwaSI+QVBJ5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcmlhIiA+QXJpYeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0icnBjIj5SUEPkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImN1cmwiPmNVUkzkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImJjIiA+QkPkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIGxpc3RlbmVyLW9wZW4tc2V0dGluZyI+5Yqp5omL6K6+572uPC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSBsaXN0ZW5lci1vcGVuLXVwZGF0ZWxvZyI+5pu05paw5pel5b+XPC9saT48L3VsPjwvZGl2PmApOwoJCQlpZiAocHQgPT09ICdob21lJykgewoJCQkJYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uaG9tZSwgKCkgPT4gewoJCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJCQkkKCcucGwtYnV0dG9uJykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJfSkKCQkJfQoJCQlpZiAocHQgPT09ICdzaGFyZScpIHsKCQkJCWJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLnNoYXJlLCAoKSA9PiB7CgkJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKCQkJCQkkKCcucGwtYnV0dG9uJykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJfSkKCQkJfQoJCQl0aGlzLmFkZFBhZ2VMaXN0ZW5lcigpOwoJCQliYXNlLmNyZWF0ZURvd25sb2FkSWZyYW1lKCk7CgkJfSwKCgkJYWRkSW5pdEJ1dHRvbigpIHsKCQkJaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikpewoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikucmVtb3ZlKCkKCQkJfQoJCQlpZiAoIXB0KSByZXR1cm47CgkJCWxldCAkdG9vbFdyYXA7CgkJCWxldCAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0idGlhbnlpLWJ1dHRvbiBwbC1idXR0b24taW5pdCIgaWQ9InBsLWJ1dHRvbi1saW5rIj7kuIvovb3liqnmiYso5pyq54K55LquKTwvZGl2PmApOwoJCQlpZiAocHQgPT09ICdob21lJykgewoJCQkJYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uaG9tZSwgKCkgPT4gewoJCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJCQkkKCcucGwtYnV0dG9uLWluaXQnKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CgkJCQl9KQoJCQl9CgkJCWlmIChwdCA9PT0gJ3NoYXJlJykgewoJCQkJJGJ1dHRvbi5jc3MoeydtYXJnaW4tcmlnaHQnOiAnMTBweCd9KTsKCQkJCWJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLnNoYXJlLCAoKSA9PiB7CgkJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKCQkJCQkkKCcucGwtYnV0dG9uLWluaXQnKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CgkJCQl9KQoJCQl9CgkJCSRidXR0b24uY2xpY2soKCkgPT4gYmFzZS5pbml0RGlhbG9nKCkpOwoJCX0sCgoJCWFzeW5jIGdldFRva2VuKCkgewoJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5nZXRGaW5hbFVybChwYW4ucGNzWzFdLCB7fSk7CgkJCWxldCBhY2Nlc3NUb2tlbiA9IHJlcy5tYXRjaCgvYWNjZXNzVG9rZW49KFx3KykvKT8uWzFdOwoJCQlhY2Nlc3NUb2tlbiAmJiBiYXNlLnNldFN0b3JhZ2UoJ2FjY2Vzc1Rva2VuJywgYWNjZXNzVG9rZW4pOwoJCQlyZXR1cm4gYWNjZXNzVG9rZW47CgkJfSwKCgkJYXN5bmMgZ2V0RmlsZVVybEJ5T25jZShpdGVtLCBpbmRleCwgdG9rZW4pIHsKCQkJdHJ5IHsKCQkJCWlmIChpdGVtLmRvd25sb2FkVXJsKSByZXR1cm4gewoJCQkJCWluZGV4LAoJCQkJCWRvd25sb2FkVXJsOiBpdGVtLmRvd25sb2FkVXJsCgkJCQl9OwoJCQkJbGV0IHRpbWUgPSBEYXRlLm5vdygpLAoJCQkJCWZpbGVJZCA9IGl0ZW0uZmlsZUlkLAoJCQkJCW8gPSAiQWNjZXNzVG9rZW49IiArIHRva2VuICsgIiZUaW1lc3RhbXA9IiArIHRpbWUgKyAiJmZpbGVJZD0iICsgZmlsZUlkLAoJCQkJCXVybCA9IHBhbi5wY3NbMl0gKyAnP2ZpbGVJZD0nICsgZmlsZUlkOwoJCQkJaWYgKGl0ZW0uc2hhcmVJZCkgewoJCQkJCW8gPSAiQWNjZXNzVG9rZW49IiArIHRva2VuICsgIiZUaW1lc3RhbXA9IiArIHRpbWUgKyAiJmR0PTEmZmlsZUlkPSIgKyBmaWxlSWQgKyAiJnNoYXJlSWQ9IiArIGl0ZW0uc2hhcmVJZDsKCQkJCQl1cmwgKz0gJyZkdD0xJnNoYXJlSWQ9JyArIGl0ZW0uc2hhcmVJZDsKCQkJCX0KCQkJCWxldCBzaWduID0gbWQ1KG8pLnRvU3RyaW5nKCk7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5nZXQodXJsLCB7CgkJCQkJImFjY2VwdCI6ICJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgiLAoJCQkJCSJzaWduLXR5cGUiOiAxLAoJCQkJCSJhY2Nlc3N0b2tlbiI6IHRva2VuLAoJCQkJCSJ0aW1lc3RhbXAiOiB0aW1lLAoJCQkJCSJzaWduYXR1cmUiOiBzaWduCgkJCQl9KTsKCQkJCWlmIChyZXMucmVzX2NvZGUgPT09IDApIHsKCQkJCQlyZXR1cm4gewoJCQkJCQlpbmRleCwKCQkJCQkJZG93bmxvYWRVcmw6IHJlcy5maWxlRG93bmxvYWRVcmwKCQkJCQl9OwoJCQkJfSBlbHNlIGlmIChyZXMuZXJyb3JDb2RlID09PSAnSW52YWxpZFNlc3Npb25LZXknKSB7CgkJCQkJcmV0dXJuIHsKCQkJCQkJaW5kZXgsCgkJCQkJCWRvd25sb2FkVXJsOiAn5o+Q56S677yaPGJyPuivt+WFiOeZu+W9lee9keebmH4nCgkJCQkJfTsKCQkJCX0gZWxzZSBpZiAocmVzLnJlc19jb2RlID09PSAnU2hhcmVOb3RGb3VuZEZsYXREaXInKSB7CgkJCQkJcmV0dXJuIHsKCQkJCQkJaW5kZXgsCgkJCQkJCWRvd25sb2FkVXJsOiAn5o+Q56S677yaPGJyPuivt+WFiFvovazlrZhd5paH5Lu277yM5LmL5ZCO5YaN8J+RieWJjeW+gFvmiJHnmoTnvZHnm5hd5Lit5LiL6L295ZOmficKCQkJCQl9OwoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gewoJCQkJCQlpbmRleCwKCQkJCQkJZG93bmxvYWRVcmw6ICfojrflj5bkuIvovb3lnLDlnYDlpLHotKXvvIzliLfmlrDlkI7lho3or5Xor5XlkKd+JwoJCQkJCX07CgkJCQl9CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCXJldHVybiB7CgkJCQkJaW5kZXgsCgkJCQkJZG93bmxvYWRVcmw6ICfojrflj5bkuIvovb3lnLDlnYDlpLHotKXvvIzliLfmlrDlkI7lho3or5Xor5XlkKd+JwoJCQkJfTsKCQkJfQoJCX0sCgoJCWFzeW5jIGdldFBDU0xpbmsoKSB7CgkJCXNlbGVjdExpc3QgPSB0aGlzLmdldFNlbGVjdGVkTGlzdCgpOwoJCQlpZiAoc2VsZWN0TGlzdC5sZW5ndGggPT09IDApIHsKCQkJCXJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+6K+35YWI5Yu+6YCJ6KaB5LiL6L2955qE5paH5Lu25o2PficpOwoJCQl9CgkJCWlmICh0aGlzLmlzT25seUZvbGRlcigpKSB7CgkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+aJk+W8gOaWh+S7tuWkueWQjuWGjeWLvumAieaWh+S7tn4nKTsKCQkJfQoJCQlsZXQgdG9rZW4gPSBiYXNlLmdldFN0b3JhZ2UoJ2FjY2Vzc1Rva2VuJykgfHwgYXdhaXQgdGhpcy5nZXRUb2tlbigpOwoJCQlpZiAoIXRva2VuKSB7CgkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+WFiOeZu+W9lee9keebmH4nKTsKCQkJfQoJCQlsZXQgcXVldWUgPSBbXTsKCQkJc2VsZWN0TGlzdC5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4gewoJCQkJcXVldWUucHVzaCh0aGlzLmdldEZpbGVVcmxCeU9uY2UoaXRlbSwgaW5kZXgsIHRva2VuKSk7CgkJCX0pOwoKCQkJY29uc3QgcmVzID0gYXdhaXQgUHJvbWlzZS5hbGwocXVldWUpOwoJCQlyZXMuZm9yRWFjaCh2YWwgPT4gewoJCQkJc2VsZWN0TGlzdFt2YWwuaW5kZXhdLmRvd25sb2FkVXJsID0gdmFsLmRvd25sb2FkVXJsOwoJCQl9KTsKCgkJCWxldCBodG1sID0gdGhpcy5nZW5lcmF0ZURvbShzZWxlY3RMaXN0KTsKCQkJdGhpcy5zaG93TWFpbkRpYWxvZyhwYW5bbW9kZV1bMF0sIGh0bWwsIHBhblttb2RlXVsxXSk7CgkJfSwKCgkJZ2VuZXJhdGVEb20obGlzdCkgewoJCQlsZXQgY29udGVudCA9ICc8ZGl2IGNsYXNzPSJwbC1tYWluIj4nOwoJCQlsZXQgYWxpbmtBbGxUZXh0ID0gJyc7CgkJCWxpc3QuZm9yRWFjaCgodiwgaSkgPT4gewoJCQkJaWYgKHYuaXNGb2xkZXIpIHJldHVybjsKCQkJCWxldCBmaWxlbmFtZSA9IHYuZmlsZU5hbWU7CgkJCQlsZXQgc2l6ZSA9IGJhc2Uuc2l6ZUZvcm1hdCh2LnNpemUpOwoJCQkJbGV0IGRsaW5rID0gdi5kb3dubG9hZFVybDsKCQkJCWlmIChtb2RlID09PSAnYXBpJykgewoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXBpIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSIgZGF0YS1pbmRleD0iJHtpfSI+JHtkbGlua308L2E+CgkJCQkJCQkJPC9kaXY+YDsKCQkJCX0KCQkJCWlmIChtb2RlID09PSAnYXJpYScpIHsKCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9BcmlhKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQkJaWYgKG1vZGUgPT09ICdycGMnKSB7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxidXR0b24gY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLXJwYyBwbC1idG4tcHJpbWFyeSBwbC1idG4taW5mbyIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRldmljZSI+PC9lbT48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDVweDsiPuaOqOmAgeWIsCBSUEMg5LiL6L295ZmoPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2N1cmwnKSB7CgkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQ3VybChkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwoJCQkJCWFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2Y3VybOmTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2JjJykgewoJCQkJCWxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0JDKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX0iIHRpdGxlPSLngrnlh7vnlKjmr5TnibnlvZfmmJ/kuIvovb0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQl9KTsKCQkJY29udGVudCArPSAnPC9kaXY+JzsKCQkJaWYgKG1vZGUgPT09ICdhcmlhJykKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOWRveS7pOihjDwvYnV0dG9uPjwvZGl2PmA7CgkJCWlmIChtb2RlID09PSAncnBjJykgewoJCQkJbGV0IHJwYyA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpICsgJzonICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpOwoJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLXNlbmQtcnBjIj7lj5HpgIHlhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIHRpdGxlPSIke3JwY30iIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweCI+6K6+572uIFJQQyDlj4LmlbDvvIjlvZPliY3kuLrvvJoke3JwY33vvIk8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4tc3VjY2VzcyBsaXN0ZW5lci1ycGMtdGFzayIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4O2Rpc3BsYXk6IG5vbmUiPuafpeeci+S4i+i9veS7u+WKoTwvYnV0dG9uPjwvZGl2PmA7CgkJCX0KCQkJaWYgKG1vZGUgPT09ICdjdXJsJykKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+6K6+572u57uI56uv57G75Z6L77yI5b2T5YmN5Li677yaJHt0ZXJtaW5hbFR5cGVbYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyldfe+8iTwvYnV0dG9uPjwvZGl2PmA7CgkJCXJldHVybiBjb250ZW50OwoJCX0sCgoJCWFzeW5jIHNlbmRMaW5rVG9SUEMoZmlsZW5hbWUsIGxpbmspIHsKCQkJbGV0IHJwYyA9IHsKCQkJCWRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCgkJCQlwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCgkJCQlwYXRoOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyksCgkJCQl0b2tlbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKSwKCQkJCWRpcjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJyksCgkJCX07CgoJCQlsZXQgdXJsID0gYCR7cnBjLmRvbWFpbn06JHtycGMucG9ydH0ke3JwYy5wYXRofWA7CgkJCWxldCBycGNEYXRhID0gewoJCQkJaWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAoJCQkJanNvbnJwYzogJzIuMCcsCgkJCQltZXRob2Q6ICdhcmlhMi5hZGRVcmknLAoJCQkJcGFyYW1zOiBbYHRva2VuOiR7cnBjLnRva2VufWAsIFtsaW5rXSwgewoJCQkJCWRpcjogcnBjLmRpciwKCQkJCQlvdXQ6IGZpbGVuYW1lLAoJCQkJCWhlYWRlcjogW10KCQkJCX1dCgkJCX07CgkJCXRyeSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHVybCwgcnBjRGF0YSwge30sICcnKTsKCQkJCWlmIChyZXMucmVzdWx0KSByZXR1cm4gJ3N1Y2Nlc3MnOwoJCQkJcmV0dXJuICdmYWlsJzsKCQkJfSBjYXRjaCAoZSkgewoJCQkJcmV0dXJuICdmYWlsJzsKCQkJfQoJCX0sCgoJCWdldFNlbGVjdGVkTGlzdCgpIHsKCQkJdHJ5IHsKCQkJCXJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuYy1maWxlLWxpc3QiKS5fX3Z1ZV9fLnNlbGVjdGVkTGlzdDsKCQkJfSBjYXRjaCAoZSkgewoJCQkJcmV0dXJuIFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuaW5mby1kZXRhaWwiKS5fX3Z1ZV9fLmZpbGVEZXRhaWxdOwoJCQl9CgkJfSwKCgkJZGV0ZWN0UGFnZSgpIHsKCQkJbGV0IHBhdGggPSBsb2NhdGlvbi5wYXRobmFtZTsKCQkJaWYgKC9eXC93ZWJcL21haW4vLnRlc3QocGF0aCkpIHJldHVybiAnaG9tZSc7CgkJCWlmICgvXlwvd2ViXC9zaGFyZS8udGVzdChwYXRoKSkgcmV0dXJuICdzaGFyZSc7CgkJCXJldHVybiAnJzsKCQl9LAoKCQlpc09ubHlGb2xkZXIoKSB7CgkJCWZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0TGlzdC5sZW5ndGg7IGkrKykgewoJCQkJaWYgKCFzZWxlY3RMaXN0W2ldLmlzRm9sZGVyKSByZXR1cm4gZmFsc2U7CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJc2hvd01haW5EaWFsb2codGl0bGUsIGh0bWwsIGZvb3RlcikgewoJCQlTd2FsLmZpcmUoewoJCQkJdGl0bGUsCgkJCQlodG1sLAoJCQkJZm9vdGVyLAoJCQkJYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAoJCQkJc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAoJCQkJcG9zaXRpb246ICdjZW50ZXInLC8vdG9wCgkJCQl3aWR0aCwKCQkJCXBhZGRpbmc6ICcxNXB4IDIwcHggNXB4JywKCQkJCWN1c3RvbUNsYXNzLAoJCQkJY29uZmlybUJ1dHRvblRleHQ6ICflhbPpl60nLAoJCQl9KTsKCQl9LAoKCQlhc3luYyBpbml0UGFuTGlua2VyKCkgewoJCQlwdCA9IHRoaXMuZGV0ZWN0UGFnZSgpOwoJCQliYXNlLmNyZWF0ZVRpcCgpOwoJCQliYXNlLnJlZ2lzdGVyTWVudUNvbW1hbmQoKTsKCQkJaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gJ3YxJykgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL3RpYW55aS8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gJ3YyJykgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL3YyL3RpYW55aS8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gIm5vIikgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KGBodHRwczovL2djb3JlLmpzZGVsaXZyLm5ldC9naC9obWp6MTAwL09ubGluZS1kaXNrLWRpcmVjdC1saW5rLWRvd25sb2FkLWFzc2lzdGFudEBtYWluL2NvbmZpZy90aWFueWkuanNvbmAsIHt9LCAidGV4dCIsIHt9KTsKCQkJCXBhbiA9IEpTT04ucGFyc2UocmVzKTsKCQkJfSBlbHNlIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLmdldChgaHR0cHM6Ly9nY29yZS5qc2RlbGl2ci5uZXQvZ2gvaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnRAbWFpbi9jb25maWcvY29uZmlnLmpzb25gLCB7fSwgInRleHQiLCB7fSk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKHJlcyk7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJywgJ3YyJyk7CgkJCX0KCQkJT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKHBhbik7CgkJCXBhbi5udW0gPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJykgfHwgcGFuLmxpY2Vuc2UgPT09IGJhc2UuZ2V0VmFsdWUoJ2xpY2Vuc2UnKSA/IHRoaXMuYWRkQnV0dG9uKCkgOiB0aGlzLmFkZEluaXRCdXR0b24oKTsKCQkJdGhpcy5nZXRUb2tlbigpOwoJCX0KCX07CgoJLy/ov4Xpm7fkupHnm5gKCWxldCB4dW5sZWkgPSB7CgoJCWNvbnZlcnRMaW5rVG9BcmlhKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlmaWxlbmFtZSA9IGJhc2UuZml4RmlsZW5hbWUoZmlsZW5hbWUpOwoJCQlyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBhcmlhMmMgIiR7bGlua30iIC0tb3V0ICIke2ZpbGVuYW1lfSJgKTsKCQl9LAoKCQljb252ZXJ0TGlua1RvQkMobGluaywgZmlsZW5hbWUsIHVhKSB7CgkJCWxldCBiYyA9IGBBQS8ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlbmFtZSl9Lz91cmw9JHtlbmNvZGVVUklDb21wb25lbnQobGluayl9WlpgOwoJCQlyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBiYzovL2h0dHAvJHtiYXNlLmVuY29kZShiYyl9YCk7CgkJfSwKCgkJY29udmVydExpbmtUb0N1cmwobGluaywgZmlsZW5hbWUsIHVhKSB7CgkJCWxldCB0ZXJtaW5hbCA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpOwoJCQlmaWxlbmFtZSA9IGJhc2UuZml4RmlsZW5hbWUoZmlsZW5hbWUpOwoJCQlyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGAke3Rlcm1pbmFsICE9PSAnd3AnID8gJ2N1cmwnIDogJ2N1cmwuZXhlJ30gLUwgLUMgLSAiJHtsaW5rfSIgLW8gIiR7ZmlsZW5hbWV9ImApOwoJCX0sCgoJCWFkZFBhZ2VMaXN0ZW5lcigpIHsKCQkJZG9jLm9uKCdjbGljaycsICcucGwtYnV0dG9uLW1vZGUnLCAoZSkgPT4gewoJCQkJbW9kZSA9IGUudGFyZ2V0LmRhdGFzZXQubW9kZTsKCQkJCVN3YWwuZmlyZSh7CgkJCQkJaGVpZ2h0QXV0bzogZmFsc2UsCgkJCQkJc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCgkJCQkJc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLAoJCQkJCWh0bWw6IGDpk77mjqXojrflj5bkuK1gLAoJCQkJCXdpbGxPcGVuOiBmdW5jdGlvbigpIHsKCQkJCQkJU3dhbC5zaG93TG9hZGluZygpOwoJCQkJCX0KCQkJCX0pOwoJCQkJdGhpcy5nZXRQQ1NMaW5rKCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFwaScsIGFzeW5jIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQkkKCcjZG93bmxvYWRJZnJhbWUnKS5hdHRyKCdzcmMnLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstYXBpLWJ0bicsIGFzeW5jIChlKSA9PiB7CgkJCQliYXNlLnNldENsaXBib2FyZChlLnRhcmdldC5kYXRhc2V0LmZpbGVuYW1lKTsKCQkJCSQoZS50YXJnZXQpLnRleHQoJ+WkjeWItuaIkOWKnycpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCXNldFRpbWVvdXQoCgkJCQkJZnVuY3Rpb24gKCl7CgkJCQkJCSQoZS50YXJnZXQpLnRleHQoJ+mHjeaWsOWkjeWIticpLmFuaW1hdGUoe29wYWNpdHk6ICcxJ30sICJzbG93Iik7CgkJCQkJfSwyMDAwCgkJCQkpCgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWJjLWJ0bicsIGFzeW5jIChlKSA9PiB7CgkJCQlsZXQgbWlycm9yID0gYmFzZS5nZXRNaXJyb3JMaXN0KGUudGFyZ2V0LmRhdGFzZXQuZGxpbmssIHBhbi5taXJyb3IpOwoJCQkJYmFzZS5zZXRDbGlwYm9hcmQobWlycm9yKTsKCQkJCSQoZS50YXJnZXQpLnRleHQoJ+WkjeWItuaIkOWKnycpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCXNldFRpbWVvdXQoCgkJCQkJZnVuY3Rpb24gKCl7CgkJCQkJCSQoZS50YXJnZXQpLnRleHQoJ+mHjeaWsOWkjeWIticpLmFuaW1hdGUoe29wYWNpdHk6ICcxJ30sICJzbG93Iik7CgkJCQkJfSwyMDAwCgkJCQkpCgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFsbCcsIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQliYXNlLnNldENsaXBib2FyZChkZWNvZGVVUklDb21wb25lbnQoZS50YXJnZXQuZGF0YXNldC5saW5rKSk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflpI3liLbmiJDlip8nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCQlzZXRUaW1lb3V0KAoJCQkJCWZ1bmN0aW9uICgpewoJCQkJCQkkKGUudGFyZ2V0KS50ZXh0KCfph43mlrDlpI3liLYnKS5hbmltYXRlKHtvcGFjaXR5OiAnMSd9LCAic2xvdyIpOwoJCQkJCX0sMjAwMAoJCQkJKQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJbGV0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTsgCgoJCQkJdGFyZ2V0LmZpbmQoJy5pY29uJykucmVtb3ZlKCk7CgkJCQl0YXJnZXQuZmluZCgnLnBsLWxvYWRpbmcnKS5yZW1vdmUoKTsKCQkJCXRhcmdldC5wcmVwZW5kKGJhc2UuY3JlYXRlTG9hZGluZygpKTsKCgkJCQlsZXQgcmVzID0gYXdhaXQgdGhpcy5zZW5kTGlua1RvUlBDKGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmZpbGVuYW1lLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKCQkJCWlmIChyZXMgPT09ICdzdWNjZXNzJykgewoJCQkJCSQoJy5saXN0ZW5lci1ycGMtdGFzaycpLnNob3coKTsKCQkJCQl0YXJnZXQucmVtb3ZlQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKCflj5HpgIHmiJDlip/kuoYh5b+r5Y6755yL55yL5ZCnficpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0gZWxzZSBpZiAocmVzID09PSAnYXNzaXN0YW50JykgewoJCQkJCXRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoYCR7cGFuLmluaXRbNV198J+RiTxhIGhyZWY9IiR7cGFuLmFzc2lzdGFudH0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0icGwtYSI+54K55Ye75q2k5aSE5a6J6KOFPC9hPvCfkYhgKTsKCQkJCX0gZWxzZSB7CgkJCQkJdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykudGV4dCgn5Y+R6YCB5aSx6LSl77yM5qOA5p+l5LiA5LiL5oKo55qEUlBD6YWN572u5L+h5oGv5ZOmIScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0KCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsKCQkJCSQoJy5saXN0ZW5lci1saW5rLXJwYycpLmNsaWNrKCk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflj5HpgIHlrozmiJDvvIzlj5HpgIHnu5Pmnpzop4HkuIrmlrnmjInpkq7lk6Z+JykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi1zZXR0aW5nJywgKCkgPT4gewoJCQkJYmFzZS5zaG93U2V0dGluZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi11cGRhdGVsb2cnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dVcGRhdGVMb2coKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXJwYy10YXNrJywgKCkgPT4gewoJCQkJbGV0IHJwYyA9IEpTT04uc3RyaW5naWZ5KHsKCQkJCQlkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAoJCQkJCXBvcnQ6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKCQkJCX0pLCB1cmwgPSBgJHtwYW4uZH0vP3JwYz0ke2Jhc2UuZW5jb2RlKHJwYyl9IyR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKX1gOwoJCQkJR01fb3BlbkluVGFiKHVybCwge2FjdGl2ZTogdHJ1ZX0pOwoJCQl9KTsKCQl9LAoKCQlhZGRCdXR0b24oKSB7CgkJCWlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpKXsKCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpLnJlbW92ZSgpCgkJCX0KCQkJaWYgKCFwdCkgcmV0dXJuOwoJCQlsZXQgJHRvb2xXcmFwOwoJCQlsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9Inh1bmxlaS1idXR0b24gcGwtYnV0dG9uIiBpZD0icGwtYnV0dG9uLWxpbmsiPjxpIGNsYXNzPSJ4bHBmb250IHhscC1kb3dubG9hZCI+PC9pPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEzcHg7bWFyZ2luLWxlZnQ6IDZweDsiPuS4i+i9veWKqeaJizwvc3Bhbj48dWwgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUiIHN0eWxlPSJ0b3A6IDM0cHg7Ij48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcGkiPkFQSeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXJpYSIgPkFyaWHkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9InJwYyI+UlBD5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJjdXJsIj5jVVJM5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJiYyIgPkJD5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSBsaXN0ZW5lci1vcGVuLXNldHRpbmciPuWKqeaJi+iuvue9rjwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUgbGlzdGVuZXItb3Blbi11cGRhdGVsb2ciPuabtOaWsOaXpeW/lzwvbGk+PC91bD48L2Rpdj5gKTsKCQkJaWYgKHB0ID09PSAnaG9tZScpIHsKCQkJCWJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLmhvbWUsICgpID0+IHsKCQkJCQkkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CgkJCQkJJCgnLnBsLWJ1dHRvbicpLmxlbmd0aCA9PT0gMCAmJiAkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKCQkJCX0pCgkJCX0KCQkJaWYgKHB0ID09PSAnc2hhcmUnKSB7CgkJCQkkYnV0dG9uLmNzcyh7J21hcmdpbi1yaWdodCc6ICcxMHB4J30pOwoJCQkJYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uc2hhcmUsICgpID0+IHsKCQkJCQkkdG9vbFdyYXAgPSAkKHBhbi5idG4uc2hhcmUpOwoJCQkJCSQoJy5wbC1idXR0b24nKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CgkJCQl9KQoJCQl9CgkJCXRoaXMuYWRkUGFnZUxpc3RlbmVyKCk7CgkJCWJhc2UuY3JlYXRlRG93bmxvYWRJZnJhbWUoKTsKCQl9LAoKCQlhZGRJbml0QnV0dG9uKCkgewoJCQlpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKSl7CgkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKS5yZW1vdmUoKQoJCQl9CgkJCWlmICghcHQpIHJldHVybjsKCQkJbGV0ICR0b29sV3JhcDsKCQkJbGV0ICRidXR0b24gPSAkKGA8ZGl2IGNsYXNzPSJ4dW5sZWktYnV0dG9uIHBsLWJ1dHRvbi1pbml0IiBpZD0icGwtYnV0dG9uLWxpbmsiPjxpIGNsYXNzPSJ4bHBmb250IHhscC1kb3dubG9hZCI+PC9pPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEzcHg7bWFyZ2luLWxlZnQ6IDZweDsiPuS4i+i9veWKqeaJiyjmnKrngrnkuq4pPC9zcGFuPjwvZGl2PmApOwoJCQlpZiAocHQgPT09ICdob21lJykgewoJCQkJYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uaG9tZSwgKCkgPT4gewoJCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJCQkkKCcucGwtYnV0dG9uLWluaXQnKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CgkJCQl9KQoJCQl9CgkJCWlmIChwdCA9PT0gJ3NoYXJlJykgewoJCQkJJGJ1dHRvbi5jc3MoeydtYXJnaW4tcmlnaHQnOiAnMTBweCd9KTsKCQkJCWJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLnNoYXJlLCAoKSA9PiB7CgkJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKCQkJCQkkKCcucGwtYnV0dG9uLWluaXQnKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CgkJCQl9KQoJCQl9CgkJCSRidXR0b24uY2xpY2soKCkgPT4gYmFzZS5pbml0RGlhbG9nKCkpOwoJCX0sCgoJCWdldFRva2VuKCkgewoJCQlsZXQgY3JlZGVudGlhbHMgPSB7fSwgY2FwdGNoYSA9IHt9OwoJCQlmb3IgKGxldCBpID0gMDsgaSA8IGxvY2FsU3RvcmFnZS5sZW5ndGg7IGkrKykgewoJCQkJaWYgKC9eY3JlZGVudGlhbHNfLy50ZXN0KGxvY2FsU3RvcmFnZS5rZXkoaSkpKSB7CgkJCQkJY3JlZGVudGlhbHMgPSBiYXNlLmdldFN0b3JhZ2UobG9jYWxTdG9yYWdlLmtleShpKSk7CgkJCQkJYmFzZS5zZXRTdG9yYWdlKCcnKTsKCQkJCX0KCQkJCWlmICgvXmNhcHRjaGFfW1x3XXsxNn0vLnRlc3QobG9jYWxTdG9yYWdlLmtleShpKSkpIHsKCQkJCQljYXB0Y2hhID0gYmFzZS5nZXRTdG9yYWdlKGxvY2FsU3RvcmFnZS5rZXkoaSkpOwoJCQkJfQoJCQl9CgkJCWxldCBkZXZpY2VpZCA9IC8oXHd7MzJ9KS8uZXhlYyhiYXNlLmdldFN0b3JhZ2UoJ2RldmljZWlkJykuc3BsaXQoJywnKSlbMF07CgkJCWxldCB0b2tlbiA9IHsKCQkJCWNyZWRlbnRpYWxzLAoJCQkJY2FwdGNoYSwKCQkJCWRldmljZWlkCgkJCX07CgkJCXJldHVybiB0b2tlbjsKCQl9LAoKCQlhc3luYyBnZXRGaWxlVXJsQnlPbmNlKGl0ZW0sIGluZGV4LCB0b2tlbikgewoJCQl0cnkgewoJCQkJaWYgKGl0ZW0uZG93bmxvYWRVcmwpIHJldHVybiB7CgkJCQkJaW5kZXgsCgkJCQkJZG93bmxvYWRVcmw6IGl0ZW0uZG93bmxvYWRVcmwKCQkJCX07CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5nZXQocGFuLnBjc1swXSArIGl0ZW0uaWQsIHsKCQkJCQknQXV0aG9yaXphdGlvbic6IGAke3Rva2VuLmNyZWRlbnRpYWxzLnRva2VuX3R5cGV9ICR7dG9rZW4uY3JlZGVudGlhbHMuYWNjZXNzX3Rva2VufWAsCgkJCQkJJ2NvbnRlbnQtdHlwZSc6ICJhcHBsaWNhdGlvbi9qc29uIiwKCQkJCQkneC1jYXB0Y2hhLXRva2VuJzogdG9rZW4uY2FwdGNoYS50b2tlbiwKCQkJCQkneC1kZXZpY2UtaWQnOiB0b2tlbi5kZXZpY2VpZCwKCQkJCX0pOwoJCQkJaWYgKHJlcy53ZWJfY29udGVudF9saW5rKSB7CgkJCQkJcmV0dXJuIHsKCQkJCQkJaW5kZXgsCgkJCQkJCWRvd25sb2FkVXJsOiByZXMud2ViX2NvbnRlbnRfbGluawoJCQkJCX07CgkJCQl9IGVsc2UgewoJCQkJCXJldHVybiB7CgkJCQkJCWluZGV4LAoJCQkJCQlkb3dubG9hZFVybDogJ+iOt+WPluS4i+i9veWcsOWdgOWksei0pe+8jOWIt+aWsOWQjuWGjeivleivleWQp34nCgkJCQkJfTsKCQkJCX0KCQkJfSBjYXRjaCAoZSkgewoJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7flhYjnmbvlvZXnvZHnm5jlkI7lho3liLfmlrDpobXpnaLlkaJ+Jyk7CgkJCX0KCQl9LAoKCQlhc3luYyBnZXRQQ1NMaW5rKCkgewoJCQlzZWxlY3RMaXN0ID0gdGhpcy5nZXRTZWxlY3RlZExpc3QoKTsKCQkJaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CgkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+WFiOWLvumAieimgeS4i+i9veeahOaWh+S7tuaNj34nKTsKCQkJfQoJCQlpZiAodGhpcy5pc09ubHlGb2xkZXIoKSkgewoJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7fmiZPlvIDmlofku7blpLnlkI7lho3li77pgInmlofku7Z+Jyk7CgkJCX0KCQkJaWYgKHB0ID09PSAnaG9tZScpIHsKCQkJCWxldCBxdWV1ZSA9IFtdOwoJCQkJbGV0IHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwoJCQkJc2VsZWN0TGlzdC5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4gewoJCQkJCXF1ZXVlLnB1c2godGhpcy5nZXRGaWxlVXJsQnlPbmNlKGl0ZW0sIGluZGV4LCB0b2tlbikpOwoJCQkJfSk7CgkJCQljb25zdCByZXMgPSBhd2FpdCBQcm9taXNlLmFsbChxdWV1ZSk7CgkJCQlyZXMuZm9yRWFjaCh2YWwgPT4gewoJCQkJCXNlbGVjdExpc3RbdmFsLmluZGV4XS5kb3dubG9hZFVybCA9IHZhbC5kb3dubG9hZFVybDsKCQkJCX0pOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7fkv53lrZjliLDoh6rlt7HnvZHnm5jlkI7lho3ljrvnvZHnm5jkuLvpobXkuIvovb3lk6Z+Jyk7CgkJCX0KCQkJbGV0IGh0bWwgPSB0aGlzLmdlbmVyYXRlRG9tKHNlbGVjdExpc3QpOwoJCQl0aGlzLnNob3dNYWluRGlhbG9nKHBhblttb2RlXVswXSwgaHRtbCwgcGFuW21vZGVdWzFdKTsKCgkJfSwKCgkJZ2VuZXJhdGVEb20obGlzdCkgewoJCQlsZXQgY29udGVudCA9ICc8ZGl2IGNsYXNzPSJwbC1tYWluIj4nOwoJCQlsZXQgYWxpbmtBbGxUZXh0ID0gJyc7CgkJCWxpc3QuZm9yRWFjaCgodiwgaSkgPT4gewoJCQkJaWYgKHYua2luZCA9PT0gJ2RyaXZlI2ZvbGRlcicpIHJldHVybjsKCQkJCWxldCBmaWxlbmFtZSA9IHYubmFtZTsKCQkJCWxldCBzaXplID0gYmFzZS5zaXplRm9ybWF0KCt2LnNpemUpOwoJCQkJbGV0IGRsaW5rID0gdi5kb3dubG9hZFVybDsKCQkJCWlmIChtb2RlID09PSAnYXBpJykgewoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXBpIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSIgZGF0YS1pbmRleD0iJHtpfSI+JHtkbGlua308L2E+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1idG4gbGlzdGVuZXItbGluay1hcGktYnRuIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSI+5aSN5Yi25paH5Lu25ZCNPC9kaXY+CgkJCQkJCQkJPC9kaXY+YDsKCQkJCX0KCQkJCWlmIChtb2RlID09PSAnYXJpYScpIHsKCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9BcmlhKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQkJaWYgKG1vZGUgPT09ICdycGMnKSB7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxidXR0b24gY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLXJwYyBwbC1idG4tcHJpbWFyeSBwbC1idG4taW5mbyIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRldmljZSI+PC9lbT48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDVweDsiPuaOqOmAgeWIsCBSUEMg5LiL6L295ZmoPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2N1cmwnKSB7CgkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQ3VybChkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwoJCQkJCWFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2Y3VybOmTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2JjJykgewoJCQkJCWxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0JDKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX0iIHRpdGxlPSLngrnlh7vnlKjmr5TnibnlvZfmmJ/kuIvovb0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tYnRuIGxpc3RlbmVyLWxpbmstYmMtYnRuIiBkYXRhLWRsaW5rPSIke2RsaW5rfSI+5aSN5Yi26ZWc5YOP5Zyw5Z2APC9kaXY+CgkJCQkJCQkJPC9kaXY+YDsKCQkJCX0KCQkJfSk7CgkJCWNvbnRlbnQgKz0gJzwvZGl2Pic7CgkJCWlmIChtb2RlID09PSAnYXJpYScpCgkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jlkb3ku6TooYw8L2J1dHRvbj48L2Rpdj5gOwoJCQlpZiAobW9kZSA9PT0gJ3JwYycpIHsKCQkJCWxldCBycGMgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSArICc6JyArIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSArIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKTsKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1zZW5kLXJwYyI+5Y+R6YCB5YWo6YOo6ZO+5o6lPC9idXR0b24+PGJ1dHRvbiB0aXRsZT0iJHtycGN9IiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXdhcm5pbmcgbGlzdGVuZXItb3Blbi1zZXR0aW5nIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHgiPuiuvue9riBSUEMg5Y+C5pWw77yI5b2T5YmN5Li677yaJHtycGN977yJPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXN1Y2Nlc3MgbGlzdGVuZXItcnBjLXRhc2siIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDtkaXNwbGF5OiBub25lIj7mn6XnnIvkuIvovb3ku7vliqE8L2J1dHRvbj48L2Rpdj5gOwoJCQl9CgkJCWlmIChtb2RlID09PSAnY3VybCcpCgkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDsiPuiuvue9rue7iOerr+exu+Wei++8iOW9k+WJjeS4uu+8miR7dGVybWluYWxUeXBlW2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpXX3vvIk8L2J1dHRvbj48L2Rpdj5gOwoJCQlyZXR1cm4gY29udGVudDsKCQl9LAoKCQlhc3luYyBzZW5kTGlua1RvUlBDKGZpbGVuYW1lLCBsaW5rKSB7CgkJCWxldCBycGMgPSB7CgkJCQlkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAoJCQkJcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAoJCQkJcGF0aDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpLAoJCQkJdG9rZW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyksCgkJCQlkaXI6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RpcicpLAoJCQl9OwoKCQkJbGV0IHVybCA9IGAke3JwYy5kb21haW59OiR7cnBjLnBvcnR9JHtycGMucGF0aH1gOwoJCQlsZXQgcnBjRGF0YSA9IHsKCQkJCWlkOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKCQkJCWpzb25ycGM6ICcyLjAnLAoJCQkJbWV0aG9kOiAnYXJpYTIuYWRkVXJpJywKCQkJCXBhcmFtczogW2B0b2tlbjoke3JwYy50b2tlbn1gLCBbbGlua10sIHsKCQkJCQlkaXI6IHJwYy5kaXIsCgkJCQkJb3V0OiBmaWxlbmFtZSwKCQkJCQloZWFkZXI6IFtdCgkJCQl9XQoJCQl9OwoJCQl0cnkgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdCh1cmwsIHJwY0RhdGEsIHt9LCAnJyk7CgkJCQlpZiAocmVzLnJlc3VsdCkgcmV0dXJuICdzdWNjZXNzJzsKCQkJCXJldHVybiAnZmFpbCc7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCXJldHVybiAnZmFpbCc7CgkJCX0KCQl9LAoKCQlnZXRTZWxlY3RlZExpc3QoKSB7CgkJCXRyeSB7CgkJCQlsZXQgZG9tcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wYW4tbGlzdCBsaScpOwoJCQkJbGV0IHNlbGVjdGVkTGlzdCA9IFtdOwoJCQkJZm9yIChsZXQgZG9tIG9mIGRvbXMpIHsKCQkJCQlsZXQgZG9tVnVlID0gZG9tLl9fdnVlX187CgkJCQkJaWYgKGRvbVZ1ZS5zZWxlY3RlZC5pbmNsdWRlcyhkb21WdWUuaW5mby5pZCkpIHsKCQkJCQkJc2VsZWN0ZWRMaXN0LnB1c2goZG9tVnVlLmluZm8pOwoJCQkJCX0KCQkJCX0KCQkJCXJldHVybiBzZWxlY3RlZExpc3Q7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCXJldHVybiBbXTsKCQkJfQoJCX0sCgoJCWRldGVjdFBhZ2UoKSB7CgkJCWxldCBwYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CgkJCWlmICgvXlwvJC8udGVzdChwYXRoKSkgcmV0dXJuICdob21lJzsKCQkJaWYgKC9eXC8oc3xzaGFyZSlcLy8udGVzdChwYXRoKSkgcmV0dXJuICdzaGFyZSc7CgkJCXJldHVybiAnJzsKCQl9LAoKCQlpc09ubHlGb2xkZXIoKSB7CgkJCWZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0TGlzdC5sZW5ndGg7IGkrKykgewoJCQkJaWYgKHNlbGVjdExpc3RbaV0ua2luZCA9PT0gJ2RyaXZlI2ZpbGUnKSByZXR1cm4gZmFsc2U7CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJc2hvd01haW5EaWFsb2codGl0bGUsIGh0bWwsIGZvb3RlcikgewoJCQlTd2FsLmZpcmUoewoJCQkJdGl0bGUsCgkJCQlodG1sLAoJCQkJZm9vdGVyLAoJCQkJYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAoJCQkJc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAoJCQkJcG9zaXRpb246ICdjZW50ZXInLC8vdG9wCgkJCQl3aWR0aCwKCQkJCXBhZGRpbmc6ICcxNXB4IDIwcHggNXB4JywKCQkJCWN1c3RvbUNsYXNzLAoJCQkJY29uZmlybUJ1dHRvblRleHQ6ICflhbPpl60nLAoJCQl9KTsKCQl9LAoKCQlhc3luYyBpbml0UGFuTGlua2VyKCkgewoJCQlwdCA9IHRoaXMuZGV0ZWN0UGFnZSgpOwoJCQliYXNlLmNyZWF0ZVRpcCgpOwoJCQliYXNlLnJlZ2lzdGVyTWVudUNvbW1hbmQoKTsKCQkJaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gJ3YxJykgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL3h1bmxlaS8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gJ3YyJykgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL3YyL3h1bmxlaS8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gIm5vIikgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KGBodHRwczovL2djb3JlLmpzZGVsaXZyLm5ldC9naC9obWp6MTAwL09ubGluZS1kaXNrLWRpcmVjdC1saW5rLWRvd25sb2FkLWFzc2lzdGFudEBtYWluL2NvbmZpZy94dW5sZWkuanNvbmAsIHt9LCAidGV4dCIsIHt9KTsKCQkJCXBhbiA9IEpTT04ucGFyc2UocmVzKTsKCQkJfSBlbHNlIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLmdldChgaHR0cHM6Ly9nY29yZS5qc2RlbGl2ci5uZXQvZ2gvaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnRAbWFpbi9jb25maWcvY29uZmlnLmpzb25gLCB7fSwgInRleHQiLCB7fSk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKHJlcyk7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJywgJ3YyJyk7CgkJCX0KCQkJT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKHBhbik7CgkJCXBhbi5udW0gPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJykgfHwgcGFuLmxpY2Vuc2UgPT09IGJhc2UuZ2V0VmFsdWUoJ2xpY2Vuc2UnKSA/IHRoaXMuYWRkQnV0dG9uKCkgOiB0aGlzLmFkZEluaXRCdXR0b24oKTsKCQl9Cgl9OwoKCS8v5aS45YWL572R55uYCglsZXQgcXVhcmsgPSB7CgoJCWNvbnZlcnRMaW5rVG9BcmlhKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlmaWxlbmFtZSA9IGJhc2UuZml4RmlsZW5hbWUoZmlsZW5hbWUpOwoJCQlyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBhcmlhMmMgIiR7bGlua30iIC0tb3V0ICIke2ZpbGVuYW1lfSIgLS1oZWFkZXIgIkNvb2tpZTogJHtkb2N1bWVudC5jb29raWV9ImApOwoJCX0sCgoJCWNvbnZlcnRMaW5rVG9CQyhsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJbGV0IGJjID0gYEFBLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVuYW1lKX0vP3VybD0ke2VuY29kZVVSSUNvbXBvbmVudChsaW5rKX0mY29va2llPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LmNvb2tpZSl9WlpgOwoJCQlyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBiYzovL2h0dHAvJHtiYXNlLmVuY29kZShiYyl9YCk7CgkJfSwKCgkJY29udmVydExpbmtUb0N1cmwobGluaywgZmlsZW5hbWUsIHVhKSB7CgkJCWxldCB0ZXJtaW5hbCA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpOwoJCQlmaWxlbmFtZSA9IGJhc2UuZml4RmlsZW5hbWUoZmlsZW5hbWUpOwoJCQlyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGAke3Rlcm1pbmFsICE9PSAnd3AnID8gJ2N1cmwnIDogJ2N1cmwuZXhlJ30gLUwgLUMgLSAiJHtsaW5rfSIgLW8gIiR7ZmlsZW5hbWV9IiAtYiAiJHtkb2N1bWVudC5jb29raWV9ImApOwoJCX0sCgoJCWFkZFBhZ2VMaXN0ZW5lcigpIHsKCQkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc2hjaGFuZ2UnLCBhc3luYyAoZSkgPT4gewoJCQkJbGV0IGhvbWUgPSAnaHR0cHM6Ly9wYW4ucXVhcmsuY24vbGlzdCMvJywgYWxsID0gJ2h0dHBzOi8vcGFuLnF1YXJrLmNuL2xpc3QjL2xpc3QvYWxsJzsKCQkJCWlmIChlLm9sZFVSTCA9PT0gaG9tZSAmJiBlLm5ld1VSTCA9PT0gYWxsKSByZXR1cm47CgkJCQlhd2FpdCBiYXNlLnNsZWVwKDE1MCk7CgkJCQlpZiAoJCgnLnF1YXJrLWJ1dHRvbicpLmxlbmd0aCA+IDApIHJldHVybjsKCQkJCXBhbi5udW0gPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJykgfHwgcGFuLmxpY2Vuc2UgPT09IGJhc2UuZ2V0VmFsdWUoJ2xpY2Vuc2UnKSA/IHRoaXMuYWRkQnV0dG9uKCkgOiB0aGlzLmFkZEluaXRCdXR0b24oKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLnBsLWJ1dHRvbi1tb2RlJywgKGUpID0+IHsKCQkJCW1vZGUgPSBlLnRhcmdldC5kYXRhc2V0Lm1vZGU7CgkJCQlTd2FsLmZpcmUoewoJCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJCXNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKCQkJCQlodG1sOiBg6ZO+5o6l6I635Y+W5LitYCwKCQkJCQl3aWxsT3BlbjogZnVuY3Rpb24oKSB7CgkJCQkJCVN3YWwuc2hvd0xvYWRpbmcoKTsKCQkJCQl9CgkJCQl9KTsKCQkJCXRoaXMuZ2V0UENTTGluaygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1zYXZlJywgYXN5bmMgKGUpID0+IHsKCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCXNlbGVjdExpc3QgPSB0aGlzLmdldFNlbGVjdGVkTGlzdCgpOwoJCQkJaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CgkJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7flhYjli77pgInopoHkv53lrZjliLDnvZHnm5jnmoTmlofku7bmjY9+Jyk7CgkJCQl9CgkJCQltZXNzYWdlLmluZm8oJ+aPkOekuu+8mjxicj7lm6DlpLjlhYvpmZDliLbvvIzor7flhYjkv53lrZjliLDoh6rlt7HnvZHnm5jlkI7lho3kuIvovb3lk6YhJyk7CgkJCQlhd2FpdCBiYXNlLnNsZWVwKDUwMCk7CgkJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZmlsZS1pbmZvX3InKS5jbGljaygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcGknLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJJCgnI2Rvd25sb2FkSWZyYW1lJykuYXR0cignc3JjJywgZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQubGluayk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFsbCcsIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQliYXNlLnNldENsaXBib2FyZChkZWNvZGVVUklDb21wb25lbnQoZS50YXJnZXQuZGF0YXNldC5saW5rKSk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflpI3liLbmiJDlip8nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCQlzZXRUaW1lb3V0KAoJCQkJCWZ1bmN0aW9uICgpewoJCQkJCQkkKGUudGFyZ2V0KS50ZXh0KCfph43mlrDlpI3liLYnKS5hbmltYXRlKHtvcGFjaXR5OiAnMSd9LCAic2xvdyIpOwoJCQkJCX0sMjAwMAoJCQkJKQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJbGV0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTsgCgoJCQkJdGFyZ2V0LmZpbmQoJy5pY29uJykucmVtb3ZlKCk7CgkJCQl0YXJnZXQuZmluZCgnLnBsLWxvYWRpbmcnKS5yZW1vdmUoKTsKCQkJCXRhcmdldC5wcmVwZW5kKGJhc2UuY3JlYXRlTG9hZGluZygpKTsKCgkJCQlsZXQgcmVzID0gYXdhaXQgdGhpcy5zZW5kTGlua1RvUlBDKGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmZpbGVuYW1lLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKCQkJCWlmIChyZXMgPT09ICdzdWNjZXNzJykgewoJCQkJCSQoJy5saXN0ZW5lci1ycGMtdGFzaycpLnNob3coKTsKCQkJCQl0YXJnZXQucmVtb3ZlQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKCflj5HpgIHmiJDlip/kuoYh5b+r5Y6755yL55yL5ZCnficpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0gZWxzZSBpZiAocmVzID09PSAnYXNzaXN0YW50JykgewoJCQkJCXRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoYCR7cGFuLmluaXRbNV198J+RiTxhIGhyZWY9IiR7cGFuLmFzc2lzdGFudH0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0icGwtYSI+54K55Ye75q2k5aSE5a6J6KOFPC9hPvCfkYhgKTsKCQkJCX0gZWxzZSB7CgkJCQkJdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykudGV4dCgn5Y+R6YCB5aSx6LSl77yM5qOA5p+l5LiA5LiL5oKo55qEUlBD6YWN572u5L+h5oGv5ZOmIScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0KCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsKCQkJCSQoJy5saXN0ZW5lci1saW5rLXJwYycpLmNsaWNrKCk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflj5HpgIHlrozmiJDvvIzlj5HpgIHnu5Pmnpzop4HkuIrmlrnmjInpkq7lk6Z+JykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi1zZXR0aW5nJywgKCkgPT4gewoJCQkJYmFzZS5zaG93U2V0dGluZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi11cGRhdGVsb2cnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dVcGRhdGVMb2coKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXJwYy10YXNrJywgKCkgPT4gewoJCQkJbGV0IHJwYyA9IEpTT04uc3RyaW5naWZ5KHsKCQkJCQlkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAoJCQkJCXBvcnQ6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKCQkJCX0pLCB1cmwgPSBgJHtwYW4uZH0vP3JwYz0ke2Jhc2UuZW5jb2RlKHJwYyl9IyR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKX1gOwoJCQkJR01fb3BlbkluVGFiKHVybCwge2FjdGl2ZTogdHJ1ZX0pOwoJCQl9KTsKCQl9LAoKCQlhZGRCdXR0b24oKSB7CgkJCWxldCBzdmcgPSAnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTWpJaUlHaGxhV2RvZEQwaU1qSWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQR2NnWm1sc2JEMGlibTl1WlNJZ1ptbHNiQzF5ZFd4bFBTSmxkbVZ1YjJSa0lpQnpkSEp2YTJVOUlpTkdSa1pHUmtZaUlITjBjbTlyWlMxM2FXUjBhRDBpTWlJK1BIQmhkR2dnYzNSeWIydGxMV3hwYm1WallYQTlJbkp2ZFc1a0lpQnpkSEp2YTJVdGJHbHVaV3B2YVc0OUluSnZkVzVrSWlCa1BTSk5PU0F4TW13eUlESWdNaTB5ZWlJdlBqeHdZWFJvSUdROUlrMHhOQ0E0YURFdU5UVXpZeTQ0TlNBd0lERXVNVFl1TURreklERXVORGN1TWpZM0xqTXhNUzR4TnpRdU5UVTJMalF6TGpjeU1pNDNOVFl1TVRZMkxqTXlOaTR5TlRVdU5qVXVNalUxSURFdU5UUjJOQzQ0TnpOak1DQXVPRGt5TFM0d09Ea2dNUzR5TVRVdExqSTFOU0F4TGpVMExTNHhOall1TXpJM0xTNDBNUzQxT0RNdExqY3lNaTQzTlRjdExqTXhMakUzTkMwdU5qSXVNalkzTFRFdU5EY3VNalkzU0RZdU5EUTNZeTB1T0RVZ01DMHhMakUyTFM0d09UTXRNUzQwTnkwdU1qWTNZVEV1TnpjNElERXVOemM0SURBZ01ERXRMamN5TWkwdU56VTJZeTB1TVRZMkxTNHpNall0TGpJMU5TMHVOalV0TGpJMU5TMHhMalUwZGkwMExqZzNNMk13TFM0NE9USXVNRGc1TFRFdU1qRTFMakkxTlMweExqVTBMakUyTmkwdU16STNMalF4TFM0MU9ETXVOekl5TFM0M05UY3VNekV0TGpFM05DNDJNaTB1TWpZM0lERXVORGN0TGpJMk4wZ3hNU0l2UGp4d1lYUm9JSE4wY205clpTMXNhVzVsWTJGd1BTSnliM1Z1WkNJZ2MzUnliMnRsTFd4cGJtVnFiMmx1UFNKeWIzVnVaQ0lnWkQwaVRURXhJRE4yTVRBaUx6NDhMMmMrUEM5emRtYysnOwoJCQlpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKSl7CgkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKS5yZW1vdmUoKQoJCQl9CgkJCWlmICghcHQpIHJldHVybjsKCgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLm5leHQtYm94IiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IGFkMSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm5leHQtYm94IilbMF07CgkJCQlhZDEucmVtb3ZlKCk7CgkJCX0sdHJ1ZSk7CgoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi5hbnQtbW9kYWwtY2xvc2UiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgbG9naW4xID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYW50LW1vZGFsLWNsb3NlIilbMF07CgkJCQkvLyBsb2dpbjEuY2xpY2soKTsKCQkJfSx0cnVlKTsKCgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLnRpcHMiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgdmlwMSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInRpcHMiKVswXTsKCQkJCXZpcDEucmVtb3ZlKCk7CgkJCQlsZXQgdmlwMiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wYy1tZW1iZXItZW50cmFuY2Ugc3BhbicpOwoJCQkJdmlwMi5pbm5lckhUTUwgPSAi5byA6YCaU1ZJUCI7CgkJCX0sdHJ1ZSk7CgoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi5wYXktbW9kYWwgLmNsb3NlIiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IHZpcDMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGF5LW1vZGFsIC5jbG9zZScpOwoJCQkJdmlwMy5jbGljaygpOwoJCQl9KTsKCgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLnJlZC1lbnZlbG9wZSAuY2xvc2UiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgdmlwNCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5yZWQtZW52ZWxvcGUgLmNsb3NlJyk7CgkJCQl2aXA0LmNsaWNrKCk7CgkJCX0pOwoKCQkJbGV0ICR0b29sV3JhcDsKCQkJaWYgKHB0ID09PSAnaG9tZScpIHsKCQkJCWxldCAkYnV0dG9uID0gJChgPGRpdiBpZD0icGwtYnV0dG9uLWxpbmsiIGNsYXNzPSJhbnQtZHJvcGRvd24tdHJpZ2dlciBwbC1idXR0b24iPjxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0icXVhcmstYnV0dG9uIGFudC1idG4gYnRuLWZpbGUgYW50LWJ0bi1wcmltYXJ5Ij48aW1nIGNsYXNzPSJxdWFyay1idG4taWNvbiIgc3JjPSJgKyBzdmcgK2AiPjxzcGFuPuS4i+i9veWKqeaJizwvc3Bhbj48L2J1dHRvbj48dWwgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUiIHN0eWxlPSJ0b3A6IDU1cHg7Ij48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcGkiPkFQSeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXJpYSI+QXJpYeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0icnBjIj5SUEPkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImN1cmwiPmNVUkzkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImJjIj5CQ+S4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUgbGlzdGVuZXItb3Blbi1zZXR0aW5nIj7liqnmiYvorr7nva48L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIGxpc3RlbmVyLW9wZW4tdXBkYXRlbG9nIj7mm7TmlrDml6Xlv5c8L2xpPjwvdWw+PC9kaXY+YCk7CgkJCQkkYnV0dG9uLmNzcyh7Im1hcmdpbi1yaWdodCI6IjEwcHgiLCJkaXNwbGF5IjoiaW5saW5lLWJsb2NrIn0pOwoJCQkJYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uaG9tZSwgKCkgPT4gewoJCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJCQkkKCcucGwtYnV0dG9uJykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJfSk7CgkJCX0KCQkJaWYgKHB0ID09PSAnc2hhcmUnKSB7CgkJCQlsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgaWQ9InBsLWJ1dHRvbi1saW5rIiBjbGFzcz0iYW50LWRyb3Bkb3duLXRyaWdnZXIgcGwtYnV0dG9uIj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InF1YXJrLWJ1dHRvbiBhbnQtYnRuIGJ0bi1maWxlIGFudC1idG4tcHJpbWFyeSIgc3R5bGU9ImhlaWdodDogNDBweDsiPjxpbWcgY2xhc3M9InF1YXJrLWJ0bi1pY29uIiBzcmM9ImArIHN2ZyArYCI+PHNwYW4+5LiL6L295Yqp5omLPC9zcGFuPjwvYnV0dG9uPjx1bCBjbGFzcz0icGwtZHJvcGRvd24tbWVudSIgc3R5bGU9InRvcDogMTAwcHg7Ij48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSBsaXN0ZW5lci1saW5rLXNhdmUiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAke2NvbG9yfWIwICFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiAhaW1wb3J0YW50OyIgZGF0YS1tb2RlPSJzYXZlIj48c3BhbiBjbGFzcz0ic2F2ZS1idG4taWNvbiI+PC9zcGFuPuS/neWtmOWQjuS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUgbGlzdGVuZXItb3Blbi1zZXR0aW5nIj7liqnmiYvorr7nva48L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIGxpc3RlbmVyLW9wZW4tdXBkYXRlbG9nIj7mm7TmlrDml6Xlv5c8L2xpPjwvdWw+PC9kaXY+YCk7CgkJCQkkYnV0dG9uLmNzcyh7Im1hcmdpbi1yaWdodCI6IjEwcHgiLCJkaXNwbGF5IjoiaW5saW5lLWJsb2NrIn0pOwoJCQkJYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uc2hhcmUsICgpID0+IHsKCQkJCQkkdG9vbFdyYXAgPSAkKHBhbi5idG4uc2hhcmUpOwoJCQkJCSQoJy5wbC1idXR0b24nKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CgkJCQl9KTsKCQkJfQoJCQl0aGlzLmFkZFBhZ2VMaXN0ZW5lcigpOwoJCX0sCgoJCWFkZEluaXRCdXR0b24oKSB7CgkJCWxldCBzdmcgPSAnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTWpJaUlHaGxhV2RvZEQwaU1qSWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQR2NnWm1sc2JEMGlibTl1WlNJZ1ptbHNiQzF5ZFd4bFBTSmxkbVZ1YjJSa0lpQnpkSEp2YTJVOUlpTkdSa1pHUmtZaUlITjBjbTlyWlMxM2FXUjBhRDBpTWlJK1BIQmhkR2dnYzNSeWIydGxMV3hwYm1WallYQTlJbkp2ZFc1a0lpQnpkSEp2YTJVdGJHbHVaV3B2YVc0OUluSnZkVzVrSWlCa1BTSk5PU0F4TW13eUlESWdNaTB5ZWlJdlBqeHdZWFJvSUdROUlrMHhOQ0E0YURFdU5UVXpZeTQ0TlNBd0lERXVNVFl1TURreklERXVORGN1TWpZM0xqTXhNUzR4TnpRdU5UVTJMalF6TGpjeU1pNDNOVFl1TVRZMkxqTXlOaTR5TlRVdU5qVXVNalUxSURFdU5UUjJOQzQ0TnpOak1DQXVPRGt5TFM0d09Ea2dNUzR5TVRVdExqSTFOU0F4TGpVMExTNHhOall1TXpJM0xTNDBNUzQxT0RNdExqY3lNaTQzTlRjdExqTXhMakUzTkMwdU5qSXVNalkzTFRFdU5EY3VNalkzU0RZdU5EUTNZeTB1T0RVZ01DMHhMakUyTFM0d09UTXRNUzQwTnkwdU1qWTNZVEV1TnpjNElERXVOemM0SURBZ01ERXRMamN5TWkwdU56VTJZeTB1TVRZMkxTNHpNall0TGpJMU5TMHVOalV0TGpJMU5TMHhMalUwZGkwMExqZzNNMk13TFM0NE9USXVNRGc1TFRFdU1qRTFMakkxTlMweExqVTBMakUyTmkwdU16STNMalF4TFM0MU9ETXVOekl5TFM0M05UY3VNekV0TGpFM05DNDJNaTB1TWpZM0lERXVORGN0TGpJMk4wZ3hNU0l2UGp4d1lYUm9JSE4wY205clpTMXNhVzVsWTJGd1BTSnliM1Z1WkNJZ2MzUnliMnRsTFd4cGJtVnFiMmx1UFNKeWIzVnVaQ0lnWkQwaVRURXhJRE4yTVRBaUx6NDhMMmMrUEM5emRtYysnOwoJCQlpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKSl7CgkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKS5yZW1vdmUoKQoJCQl9CgkJCWlmICghcHQpIHJldHVybjsKCQkJbGV0ICR0b29sV3JhcDsKCQkJbGV0ICRidXR0b24gPSAkKGA8ZGl2IGlkPSJwbC1idXR0b24tbGluayIgY2xhc3M9ImFudC1kcm9wZG93bi10cmlnZ2VyIHBsLWJ1dHRvbi1pbml0Ij48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InF1YXJrLWJ1dHRvbiBhbnQtYnRuIGJ0bi1maWxlIGFudC1idG4tcHJpbWFyeSIgc3R5bGU9ImhlaWdodDogNDBweDsiPjxpbWcgY2xhc3M9InF1YXJrLWJ0bi1pY29uIiBzcmM9ImArIHN2ZyArYCI+PHNwYW4+5LiL6L295Yqp5omLKOacqueCueS6rik8L3NwYW4+PC9idXR0b24+PC9kaXY+YCk7CgkJCSRidXR0b24uY3NzKHsibWFyZ2luLXJpZ2h0IjoiMTBweCIsImRpc3BsYXkiOiJpbmxpbmUtYmxvY2sifSk7CgkJCWlmIChwdCA9PT0gJ2hvbWUnKSB7CgkJCQliYXNlLmxpc3RlbkVsZW1lbnQocGFuLmJ0bi5ob21lLCAoKSA9PiB7CgkJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLmhvbWUpOwoJCQkJCSQoJy5wbC1idXR0b24taW5pdCcpLmxlbmd0aCA9PT0gMCAmJiAkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKCQkJCX0pCgkJCX0KCQkJaWYgKHB0ID09PSAnc2hhcmUnKSB7CgkJCQliYXNlLmxpc3RlbkVsZW1lbnQocGFuLmJ0bi5zaGFyZSwgKCkgPT4gewoJCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CgkJCQkJJCgnLnBsLWJ1dHRvbi1pbml0JykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJfSkKCQkJfQoJCQkkYnV0dG9uLmNsaWNrKCgpID0+IGJhc2UuaW5pdERpYWxvZygpKTsKCQl9LAoKCQlhc3luYyBnZXRQQ1NMaW5rKCkgewoJCQlzZWxlY3RMaXN0ID0gdGhpcy5nZXRTZWxlY3RlZExpc3QoKTsKCQkJaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CgkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+WFiOWLvumAieimgeS4i+i9veeahOaWh+S7tuaNj34nKTsKCQkJfQoJCQlpZiAodGhpcy5pc09ubHlGb2xkZXIoKSkgewoJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7fmiZPlvIDmlofku7blpLnlkI7lho3li77pgInmlofku7Z+Jyk7CgkJCX0KCQkJbGV0IGZpZHMgPSBbXTsKCQkJc2VsZWN0TGlzdC5mb3JFYWNoKHZhbCA9PiB7CgkJCQlmaWRzLnB1c2godmFsLmZpZCk7CgkJCX0pOwoJCQlpZiAocHQgPT09ICdob21lJykgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChwYW4ucGNzWzBdLCB7CgkJCQkJImZpZHMiOiBmaWRzCgkJCQl9LCB7ImNvbnRlbnQtdHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgiLCAidXNlci1hZ2VudCI6IHBhbi51YX0pOwoJCQkJaWYgKHJlcy5jb2RlID09PSAzMTAwMSkgewoJCQkJCXJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+6K+35YWI55m75b2V572R55uYficpOwoJCQkJfQoJCQkJaWYgKHJlcy5jb2RlICE9PSAwKSB7CgkJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7ojrflj5bpk77mjqXlpLHotKXkuoZ+Jyk7CgkJCQl9CgkJCQlsZXQgaHRtbCA9IHRoaXMuZ2VuZXJhdGVEb20ocmVzLmRhdGEpOwoJCQkJdGhpcy5zaG93TWFpbkRpYWxvZyhwYW5bbW9kZV1bMF0sIGh0bWwsIHBhblttb2RlXVsxXSk7CgkJCX0gZWxzZSB7CgkJCQltZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+6K+35L+d5a2Y5Yiw6Ieq5bex572R55uY5ZCO5YaN5Y67572R55uY5Li76aG15LiL6L295ZOmficpOwoJCQkJYXdhaXQgYmFzZS5zbGVlcCgxMDAwKTsKCQkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5maWxlLWluZm9fcicpLmNsaWNrKCk7CgkJCQlyZXR1cm47CgkJCX0KCQl9LAoKCQlnZW5lcmF0ZURvbShsaXN0KSB7CgkJCWxldCBjb250ZW50ID0gJzxkaXYgY2xhc3M9InBsLW1haW4iPic7CgkJCWxldCBhbGlua0FsbFRleHQgPSAnJzsKCQkJbGlzdC5mb3JFYWNoKCh2LCBpKSA9PiB7CgkJCQlpZiAodi5maWxlID09PSBmYWxzZSkgcmV0dXJuOwoJCQkJbGV0IGZpbGVuYW1lID0gdi5maWxlX25hbWU7CgkJCQlsZXQgZmlkID0gdi5maWQ7CgkJCQlsZXQgc2l6ZSA9IGJhc2Uuc2l6ZUZvcm1hdCh2LnNpemUpOwoJCQkJbGV0IGRsaW5rID0gdi5kb3dubG9hZF91cmw7CgkJCQlpZiAobW9kZSA9PT0gJ2FwaScpIHsKCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFwaSIgZGF0YS1maWQ9IiR7ZmlkfSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iIGRhdGEtaW5kZXg9IiR7aX0iPiR7ZGxpbmt9PC9hPgoJCQkJCQkJCTwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2FyaWEnKSB7CgkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQXJpYShkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwoJCQkJCWFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2YXJpYTJj6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKCQkJCX0KCQkJCWlmIChtb2RlID09PSAncnBjJykgewoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YnV0dG9uIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1ycGMgcGwtYnRuLXByaW1hcnkgcGwtYnRuLWluZm8iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kZXZpY2UiPjwvZW0+PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OiA1cHg7Ij7mjqjpgIHliLAgUlBDIOS4i+i9veWZqDwvc3Bhbj48L2J1dHRvbj48L2Rpdj5gOwoJCQkJfQoJCQkJaWYgKG1vZGUgPT09ICdjdXJsJykgewoJCQkJCWxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0N1cmwoZGxpbmssIGZpbGVuYW1lLCBuYXZpZ2F0b3IudXNlckFnZW50KTsKCQkJCQlhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1hcmlhIiBocmVmPSIke2FsaW5rfSIgdGl0bGU9IueCueWHu+WkjeWItmN1cmzpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQkJaWYgKG1vZGUgPT09ICdiYycpIHsKCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9CQyhkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIiBocmVmPSIke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9IiB0aXRsZT0i54K55Ye755So5q+U54m55b2X5pif5LiL6L29IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKCQkJCX0KCQkJfSk7CgkJCWNvbnRlbnQgKz0gJzwvZGl2Pic7CgkJCWlmIChtb2RlID09PSAnYXJpYScpCgkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jlkb3ku6TooYw8L2J1dHRvbj48L2Rpdj5gOwoJCQlpZiAobW9kZSA9PT0gJ3JwYycpIHsKCQkJCWxldCBycGMgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSArICc6JyArIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSArIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKTsKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1zZW5kLXJwYyI+5Y+R6YCB5YWo6YOo6ZO+5o6lPC9idXR0b24+PGJ1dHRvbiB0aXRsZT0iJHtycGN9IiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXdhcm5pbmcgbGlzdGVuZXItb3Blbi1zZXR0aW5nIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHgiPuiuvue9riBSUEMg5Y+C5pWw77yI5b2T5YmN5Li677yaJHtycGN977yJPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXN1Y2Nlc3MgbGlzdGVuZXItcnBjLXRhc2siIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDtkaXNwbGF5OiBub25lIj7mn6XnnIvkuIvovb3ku7vliqE8L2J1dHRvbj48L2Rpdj5gOwoJCQl9CgkJCWlmIChtb2RlID09PSAnY3VybCcpCgkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDsiPuiuvue9rue7iOerr+exu+Wei++8iOW9k+WJjeS4uu+8miR7dGVybWluYWxUeXBlW2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpXX3vvIk8L2J1dHRvbj48L2Rpdj5gOwoJCQlyZXR1cm4gY29udGVudDsKCQl9LAoKCQlhc3luYyBzZW5kTGlua1RvUlBDKGZpbGVuYW1lLCBsaW5rKSB7CgkJCWxldCBycGMgPSB7CgkJCQlkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAoJCQkJcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAoJCQkJcGF0aDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpLAoJCQkJdG9rZW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyksCgkJCQlkaXI6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RpcicpLAoJCQl9OwoKCQkJbGV0IHVybCA9IGAke3JwYy5kb21haW59OiR7cnBjLnBvcnR9JHtycGMucGF0aH1gOwoJCQlsZXQgcnBjRGF0YSA9IHsKCQkJCWlkOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKCQkJCWpzb25ycGM6ICcyLjAnLAoJCQkJbWV0aG9kOiAnYXJpYTIuYWRkVXJpJywKCQkJCXBhcmFtczogW2B0b2tlbjoke3JwYy50b2tlbn1gLCBbbGlua10sIHsKCQkJCQlkaXI6IHJwYy5kaXIsCgkJCQkJb3V0OiBmaWxlbmFtZSwKCQkJCQloZWFkZXI6IFtgQ29va2llOiAke2RvY3VtZW50LmNvb2tpZX1gXQoJCQkJfV0KCQkJfTsKCQkJdHJ5IHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QodXJsLCBycGNEYXRhLCB7IkNvb2tpZSI6IGRvY3VtZW50LmNvb2tpZX0sICcnKTsKCQkJCWlmIChyZXMucmVzdWx0KSByZXR1cm4gJ3N1Y2Nlc3MnOwoJCQkJcmV0dXJuICdmYWlsJzsKCQkJfSBjYXRjaCAoZSkgewoJCQkJcmV0dXJuICdmYWlsJzsKCQkJfQoJCX0sCgoJCWdldFNlbGVjdGVkTGlzdCgpIHsKCQkJdHJ5IHsKCQkJCWxldCBzZWxlY3RlZExpc3QgPSBbXTsKCQkJCWxldCByZWFjdERvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2ZpbGUtbGlzdCcpWzBdOwoJCQkJbGV0IHJlYWN0T2JqID0gYmFzZS5maW5kUmVhY3QocmVhY3REb20pOwoJCQkJbGV0IHByb3BzID0gcmVhY3RPYmoucHJvcHM7CgkJCQlpZiAocHJvcHMpIHsKCQkJCQlsZXQgZmlsZUxpc3QgPSBwcm9wcy5saXN0IHx8IFtdOwoJCQkJCWxldCBzZWxlY3RlZEtleXMgPSBwcm9wcy5zZWxlY3RlZFJvd0tleXMgfHwgW107CgkJCQkJZmlsZUxpc3QuZm9yRWFjaCgodmFsKSA9PiB7CgkJCQkJCWlmIChzZWxlY3RlZEtleXMuaW5jbHVkZXModmFsLmZpZCkpIHsKCQkJCQkJCXNlbGVjdGVkTGlzdC5wdXNoKHZhbCk7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCX0KCQkJCXJldHVybiBzZWxlY3RlZExpc3Q7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCXJldHVybiBbXTsKCQkJfQoJCX0sCgoJCWRldGVjdFBhZ2UoKSB7CgkJCWxldCBwYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CgkJCWlmICgvXlwvKGxpc3QpLy50ZXN0KHBhdGgpKSByZXR1cm4gJ2hvbWUnOwoJCQlpZiAoL15cLyhzfHNoYXJlKVwvLy50ZXN0KHBhdGgpKSByZXR1cm4gJ3NoYXJlJzsKCQkJcmV0dXJuICcnOwoJCX0sCgoJCWlzT25seUZvbGRlcigpIHsKCQkJZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3RMaXN0Lmxlbmd0aDsgaSsrKSB7CgkJCQlpZiAoc2VsZWN0TGlzdFtpXS5maWxlKSByZXR1cm4gZmFsc2U7CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJc2hvd01haW5EaWFsb2codGl0bGUsIGh0bWwsIGZvb3RlcikgewoJCQlTd2FsLmZpcmUoewoJCQkJdGl0bGUsCgkJCQlodG1sLAoJCQkJZm9vdGVyLAoJCQkJYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAoJCQkJc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAoJCQkJcG9zaXRpb246ICdjZW50ZXInLC8vdG9wCgkJCQl3aWR0aCwKCQkJCXBhZGRpbmc6ICcxNXB4IDIwcHggNXB4JywKCQkJCWN1c3RvbUNsYXNzLAoJCQkJY29uZmlybUJ1dHRvblRleHQ6ICflhbPpl60nLAoJCQl9KTsKCQl9LAoKCQlhc3luYyBpbml0UGFuTGlua2VyKCkgewoJCQlwdCA9IHRoaXMuZGV0ZWN0UGFnZSgpOwoJCQliYXNlLmNyZWF0ZVRpcCgpOwoJCQliYXNlLnJlZ2lzdGVyTWVudUNvbW1hbmQoKTsKCQkJaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gJ3YxJykgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL3F1YXJrLz92ZXI9JHt2ZXJzaW9ufSZhPSR7YXV0aG9yfWAsIHt9LCB7fSwgJ3RleHQnKTsKCQkJCXBhbiA9IEpTT04ucGFyc2UoYmFzZS5kZWNvZGUocmVzKSk7CgkJCX0gZWxzZSBpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAndjInKSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KGBodHRwczovL2FwaS55b3V4aWFvaG91LmNvbS9jb25maWcvdjIvcXVhcmsvP3Zlcj0ke3ZlcnNpb259JmE9JHthdXRob3J9YCwge30sIHt9LCAndGV4dCcpOwoJCQkJcGFuID0gSlNPTi5wYXJzZShiYXNlLmRlY29kZShyZXMpKTsKCQkJfSBlbHNlIGlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICJubyIpIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLmdldChgaHR0cHM6Ly9nY29yZS5qc2RlbGl2ci5uZXQvZ2gvaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnRAbWFpbi9jb25maWcvcXVhcmsuanNvbmAsIHt9LCAidGV4dCIsIHt9KTsKCQkJCXBhbiA9IEpTT04ucGFyc2UocmVzKTsKCQkJfSBlbHNlIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLmdldChgaHR0cHM6Ly9nY29yZS5qc2RlbGl2ci5uZXQvZ2gvaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnRAbWFpbi9jb25maWcvY29uZmlnLmpzb25gLCB7fSwgInRleHQiLCB7fSk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKHJlcyk7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJywgJ3YyJyk7CgkJCX0KCQkJT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKHBhbik7CgkJCXBhbi5udW0gPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJykgfHwgcGFuLmxpY2Vuc2UgPT09IGJhc2UuZ2V0VmFsdWUoJ2xpY2Vuc2UnKSA/IHRoaXMuYWRkQnV0dG9uKCkgOiB0aGlzLmFkZEluaXRCdXR0b24oKTsKCQkJYmFzZS5jcmVhdGVEb3dubG9hZElmcmFtZSgpOwoJCX0KCX07CgoJLy/kuK3lm73np7vliqjkupHnm5gv5ZKM5b2p5LqRCglsZXQgeWlkb25nID0gewoKCQljb252ZXJ0TGlua1RvQXJpYShsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYXJpYTJjICIke2xpbmt9IiAtLW91dCAiJHtmaWxlbmFtZX0iYCk7CgkJfSwKCgkJY29udmVydExpbmtUb0JDKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlsZXQgYmMgPSBgQUEvJHtlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpfS8/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpbmspfVpaYDsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYmM6Ly9odHRwLyR7YmFzZS5lbmNvZGUoYmMpfWApOwoJCX0sCgoJCWNvbnZlcnRMaW5rVG9DdXJsKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlsZXQgdGVybWluYWwgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKTsKCQkJZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgJHt0ZXJtaW5hbCAhPT0gJ3dwJyA/ICdjdXJsJyA6ICdjdXJsLmV4ZSd9IC1MIC1DIC0gIiR7bGlua30iIC1vICIke2ZpbGVuYW1lfSJgKTsKCQl9LAoKCQlhZGRQYWdlTGlzdGVuZXIoKSB7CgkJCWRvYy5vbignY2xpY2snLCAnLnBsLWJ1dHRvbi1tb2RlJywgKGUpID0+IHsKCQkJCW1vZGUgPSBlLnRhcmdldC5kYXRhc2V0Lm1vZGU7CgkJCQlTd2FsLmZpcmUoewoJCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJCXNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKCQkJCQlodG1sOiBg6ZO+5o6l6I635Y+W5LitYCwKCQkJCQl3aWxsT3BlbjogZnVuY3Rpb24oKSB7CgkJCQkJCVN3YWwuc2hvd0xvYWRpbmcoKTsKCQkJCQl9CgkJCQl9KTsKCQkJCXRoaXMuZ2V0UENTTGluaygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcGknLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJJCgnI2Rvd25sb2FkSWZyYW1lJykuYXR0cignc3JjJywgZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQubGluayk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFsbCcsIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQliYXNlLnNldENsaXBib2FyZChkZWNvZGVVUklDb21wb25lbnQoZS50YXJnZXQuZGF0YXNldC5saW5rKSk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflpI3liLbmiJDlip8nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCQlzZXRUaW1lb3V0KAoJCQkJCWZ1bmN0aW9uICgpewoJCQkJCQkkKGUudGFyZ2V0KS50ZXh0KCfph43mlrDlpI3liLYnKS5hbmltYXRlKHtvcGFjaXR5OiAnMSd9LCAic2xvdyIpOwoJCQkJCX0sMjAwMAoJCQkJKQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItY29weS1hbGwtYXBpJywgKGUpID0+IHsKCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCWJhc2Uuc2V0Q2xpcGJvYXJkKGRlY29kZVVSSUNvbXBvbmVudChlLnRhcmdldC5kYXRhc2V0LmxpbmspKTsKCQkJCSQoZS50YXJnZXQpLnRleHQoJ+WkjeWItuaIkOWKnycpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCXNldFRpbWVvdXQoCgkJCQkJZnVuY3Rpb24gKCl7CgkJCQkJCSQoZS50YXJnZXQpLnRleHQoJ+mHjeaWsOWkjeWIticpLmFuaW1hdGUoe29wYWNpdHk6ICcxJ30sICJzbG93Iik7CgkJCQkJfSwyMDAwCgkJCQkpCgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLXJwYycsIGFzeW5jIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQlsZXQgdGFyZ2V0ID0gJChlLmN1cnJlbnRUYXJnZXQpOyAKCgkJCQl0YXJnZXQuZmluZCgnLmljb24nKS5yZW1vdmUoKTsKCQkJCXRhcmdldC5maW5kKCcucGwtbG9hZGluZycpLnJlbW92ZSgpOwoJCQkJdGFyZ2V0LnByZXBlbmQoYmFzZS5jcmVhdGVMb2FkaW5nKCkpOwoKCQkJCWxldCByZXMgPSBhd2FpdCB0aGlzLnNlbmRMaW5rVG9SUEMoZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuZmlsZW5hbWUsIGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmxpbmspOwoJCQkJaWYgKHJlcyA9PT0gJ3N1Y2Nlc3MnKSB7CgkJCQkJJCgnLmxpc3RlbmVyLXJwYy10YXNrJykuc2hvdygpOwoJCQkJCXRhcmdldC5yZW1vdmVDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoJ+WPkemAgeaIkOWKn+S6hiHlv6vljrvnnIvnnIvlkKd+JykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQkJfSBlbHNlIGlmIChyZXMgPT09ICdhc3Npc3RhbnQnKSB7CgkJCQkJdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykuaHRtbChgJHtwYW4uaW5pdFs1XX3wn5GJPGEgaHJlZj0iJHtwYW4uYXNzaXN0YW50fSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJwbC1hIj7ngrnlh7vmraTlpITlronoo4U8L2E+8J+RiGApOwoJCQkJfSBlbHNlIHsKCQkJCQl0YXJnZXQuYWRkQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS50ZXh0KCflj5HpgIHlpLHotKXvvIzmo4Dmn6XkuIDkuIvmgqjnmoRSUEPphY3nva7kv6Hmga/lk6YhJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQkJfQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItc2VuZC1ycGMnLCAoZSkgPT4gewoJCQkJJCgnLmxpc3RlbmVyLWxpbmstcnBjJykuY2xpY2soKTsKCQkJCSQoZS50YXJnZXQpLnRleHQoJ+WPkemAgeWujOaIkO+8jOWPkemAgee7k+aenOingeS4iuaWueaMiemSruWTpn4nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXNldHRpbmcnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dTZXR0aW5nKCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXVwZGF0ZWxvZycsICgpID0+IHsKCQkJCWJhc2Uuc2hvd1VwZGF0ZUxvZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItcnBjLXRhc2snLCAoKSA9PiB7CgkJCQlsZXQgcnBjID0gSlNPTi5zdHJpbmdpZnkoewoJCQkJCWRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCgkJCQkJcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAoJCQkJfSksIHVybCA9IGAke3Bhbi5kfS8/cnBjPSR7YmFzZS5lbmNvZGUocnBjKX0jJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpfWA7CgkJCQlHTV9vcGVuSW5UYWIodXJsLCB7YWN0aXZlOiB0cnVlfSk7CgkJCX0pOwoJCX0sCgoJCWFkZEJ1dHRvbigpIHsKCQkJaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikpewoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikucmVtb3ZlKCkKCQkJfQoJCQlpZiAoIXB0KSByZXR1cm47CgkJCWxldCAkdG9vbFdyYXA7CgkJCWxldCAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0ieWlkb25nLWJ1dHRvbiBwbC1idXR0b24gYnRuLXRvcCIgaWQ9InBsLWJ1dHRvbi1saW5rIj48c3BhbiBjbGFzcz0ieWlkb25nLWJ0biI+5LiL6L295Yqp5omLPC9zcGFuPjx1bCBjbGFzcz0icGwtZHJvcGRvd24tbWVudSIgc3R5bGU9InRvcDogMzZweDsiPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImFwaSI+QVBJ5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcmlhIiA+QXJpYeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0icnBjIj5SUEPkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImN1cmwiPmNVUkzkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImJjIiA+QkPkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIGxpc3RlbmVyLW9wZW4tc2V0dGluZyI+5Yqp5omL6K6+572uPC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSBsaXN0ZW5lci1vcGVuLXVwZGF0ZWxvZyI+5pu05paw5pel5b+XPC9saT48L3VsPjwvZGl2PmApOwoJCQlpZiAocHQgPT09ICdob21lJykgewoJCQkJYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uaG9tZSwgKCkgPT4gewoJCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJCQkkKCcucGwtYnV0dG9uJykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJfSkKCQkJfQoJCQlpZiAocHQgPT09ICdzaGFyZScpIHsKCQkJCSRidXR0b24ucmVtb3ZlQ2xhc3MoJ3lpZG9uZy1idXR0b24nKS5hZGRDbGFzcygneWlkb25nLXNoYXJlLWJ1dHRvbicpOwoJCQkJYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uc2hhcmUsICgpID0+IHsKCQkJCQkkdG9vbFdyYXAgPSAkKHBhbi5idG4uc2hhcmUpOwoJCQkJCSQoJy5wbC1idXR0b24nKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CgkJCQl9KQoJCQl9CgkJCXRoaXMuYWRkUGFnZUxpc3RlbmVyKCk7CgkJCWJhc2UuY3JlYXRlRG93bmxvYWRJZnJhbWUoKTsKCQl9LAoKCQlhZGRJbml0QnV0dG9uKCkgewoJCQlpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKSl7CgkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKS5yZW1vdmUoKQoJCQl9CgkJCWlmICghcHQpIHJldHVybjsKCQkJbGV0ICR0b29sV3JhcDsKCQkJbGV0ICRidXR0b24gPSAkKGA8ZGl2IGNsYXNzPSJ5aWRvbmctYnV0dG9uIHBsLWJ1dHRvbi1pbml0IGJ0bi10b3AiIGlkPSJwbC1idXR0b24tbGluayI+PHNwYW4gY2xhc3M9InlpZG9uZy1idG4iPuS4i+i9veWKqeaJiyjmnKrngrnkuq4pPC9zcGFuPjwvZGl2PmApOwoJCQlpZiAocHQgPT09ICdob21lJykgewoJCQkJYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uaG9tZSwgKCkgPT4gewoJCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJCQkkKCcucGwtYnV0dG9uLWluaXQnKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CgkJCQl9KQoJCQl9CgkJCWlmIChwdCA9PT0gJ3NoYXJlJykgewoJCQkJJGJ1dHRvbi5yZW1vdmVDbGFzcygneWlkb25nLWJ1dHRvbicpLmFkZENsYXNzKCd5aWRvbmctc2hhcmUtYnV0dG9uJyk7CgkJCQliYXNlLmxpc3RlbkVsZW1lbnQocGFuLmJ0bi5zaGFyZSwgKCkgPT4gewoJCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CgkJCQkJJCgnLnBsLWJ1dHRvbi1pbml0JykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJfSkKCQkJfQoJCQkkYnV0dG9uLmNsaWNrKCgpID0+IGJhc2UuaW5pdERpYWxvZygpKTsKCQl9LAoKCQlnZXRSYW5kb21TdHJpbmcobGVuKSB7CgkJCWxlbiA9IGxlbiB8fCAxNjsKCQkJbGV0ICRjaGFycyA9ICdBQkNERUZHSEpLTU5QUVJTVFdYWVphYmNkZWZoaWprbW5wcnN0d3h5ejIzNDU2NzgnOwoJCQlsZXQgbWF4UG9zID0gJGNoYXJzLmxlbmd0aDsKCQkJbGV0IHB3ZCA9ICcnOwoJCQlmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkJCQlwd2QgKz0gJGNoYXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBtYXhQb3MpKTsKCQkJfQoJCQlyZXR1cm4gcHdkOwoJCX0sCgoJCXV0b2Ioc3RyKSB7CgkJCWNvbnN0IHUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlOwoJCQlyZXR1cm4gc3RyLnJlcGxhY2UoL1tcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGRl18W15ceDAwLVx4N0ZdL2csICh0KSA9PiB7CgkJCQlpZiAodC5sZW5ndGggPCAyKSB7CgkJCQkJbGV0IGUgPSB0LmNoYXJDb2RlQXQoMCk7CgkJCQkJcmV0dXJuIGUgPCAxMjggPyB0IDogZSA8IDIwNDggPyB1KDE5MiB8IGUgPj4+IDYpICsgdSgxMjggfCA2MyAmIGUpIDogdSgyMjQgfCBlID4+PiAxMiAmIDE1KSArIHUoMTI4IHwgZSA+Pj4gNiAmIDYzKSArIHUoMTI4IHwgNjMgJiBlKTsKCQkJCX0KCQkJCWUgPSA2NTUzNiArIDEwMjQgKiAodC5jaGFyQ29kZUF0KDApIC0gNTUyOTYpICsgKHQuY2hhckNvZGVBdCgxKSAtIDU2MzIwKTsKCQkJCXJldHVybiB1KDI0MCB8IGUgPj4+IDE4ICYgNykgKyB1KDEyOCB8IGUgPj4+IDEyICYgNjMpICsgdSgxMjggfCBlID4+PiA2ICYgNjMpICsgdSgxMjggfCA2MyAmIGUpOwoJCQl9KTsKCQl9LAoKCQlnZXRTaWduKGUsIHQsIGEsIG4pIHsKCQkJbGV0IHIgPSAiIiwKCQkJCWkgPSAiIjsKCQkJaWYgKHQpIHsKCQkJCWxldCBzID0gT2JqZWN0LmFzc2lnbih7fSwgdCk7CgkJCQlpID0gSlNPTi5zdHJpbmdpZnkocyksCgkJCQkJaSA9IGkucmVwbGFjZSgvXHMqL2csICIiKSwKCQkJCQlpID0gZW5jb2RlVVJJQ29tcG9uZW50KGkpOwoJCQkJbGV0IGMgPSBpLnNwbGl0KCIiKSwKCQkJCQl1ID0gYy5zb3J0KCk7CgkJCQlpID0gdS5qb2luKCIiKTsKCQkJfQoJCQlsZXQgQSA9IG1kNShiYXNlLmVuY29kZSh0aGlzLnV0b2IoaSkpKTsKCQkJbGV0IGwgPSBtZDUoYSArICI6IiArIG4pOwoJCQlyZXR1cm4gbWQ1KEEgKyBsKS50b1VwcGVyQ2FzZSgpOwoJCX0sCgoJCWFzeW5jIGdldEZpbGVVcmxCeU9uY2UoaXRlbSwgaW5kZXgpIHsKCQkJdHJ5IHsKCQkJCWlmIChpdGVtLmRvd25sb2FkVXJsKSByZXR1cm4gewoJCQkJCWluZGV4LAoJCQkJCWRvd25sb2FkVXJsOiBpdGVtLmRvd25sb2FkVXJsCgkJCQl9OwoKCQkJCWlmICh0aGlzLmRldGVjdFBhZ2UoKSA9PT0gJ2hvbWUnKSB7CgkJCQkJbGV0IGJvZHkgPSB7CgkJCQkJCSJjb250ZW50SUQiOiBpdGVtLmNvbnRlbnRJRCwKCQkJCQkJImNvbW1vbkFjY291bnRJbmZvIjogeyJhY2NvdW50IjogaXRlbS5vd25lciwgImFjY291bnRUeXBlIjogMX0sCgkJCQkJCSJvcGVyYXRpb24iOiAiMCIsCgkJCQkJCSJpbmxpbmUiOiAiMCIsCgkJCQkJCSJleHRJbmZvIjogeyJpc1JldHVybkNkbkRvd25sb2FkVXJsIjogIjEifQoJCQkJCX07CgkJCQkJbGV0IHRpbWUgPSBuZXcgRGF0ZSgrbmV3IERhdGUoKSArIDggKiAzNjAwICogMTAwMCkudG9KU09OKCkuc3Vic3RyKDAsIDE5KS5yZXBsYWNlKCdUJywgJyAnKTsKCQkJCQlsZXQga2V5ID0gdGhpcy5nZXRSYW5kb21TdHJpbmcoMTYpOwoJCQkJCWxldCBzaWduID0gdGhpcy5nZXRTaWduKHVuZGVmaW5lZCwgYm9keSwgdGltZSwga2V5KTsKCgkJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChwYW4ucGNzWzBdLCBib2R5LCB7CgkJCQkJCSdhdXRob3JpemF0aW9uJzogYmFzZS5nZXRDb29raWUoJ2F1dGhvcml6YXRpb24nKSwKCQkJCQkJJ3gtaHVhd2VpLWNoYW5uZWxTcmMnOiAnMTAwMDAwMzQnLAoJCQkJCQkneC1pbm5lci1udHdrJzogJzInLAoJCQkJCQknbWNsb3VkLWNoYW5uZWwnOiAnMTAwMDEwMScsCgkJCQkJCSdtY2xvdWQtY2xpZW50JzogJzEwNzAxJywKCQkJCQkJJ21jbG91ZC1zaWduJzogdGltZSArICIsIiArIGtleSArICIsIiArIHNpZ24sCgkJCQkJCSdjb250ZW50LXR5cGUnOiAiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04IiwKCQkJCQkJJ2NhbGxlcic6ICd3ZWInLAoJCQkJCQknQ01TLURFVklDRSc6ICdkZWZhdWx0JywKCQkJCQkJJ3gtRGV2aWNlSW5mbyc6ICd8fDl8Ny4xMi4wfGNocm9tZXwxMTkuMC4wLjB8fHx3aW5kb3dzIDEwfHx6aC1DTnx8fCcsCgkJCQkJCSd4LVN2Y1R5cGUnOiAnMScsCgkJCQkJfSk7CgkJCQkJaWYgKHJlcy5zdWNjZXNzKSB7CgkJCQkJCXJldHVybiB7CgkJCQkJCQlpbmRleCwKCQkJCQkJCWRvd25sb2FkVXJsOiByZXMuZGF0YS5kb3dubG9hZFVSTAoJCQkJCQl9OwoJCQkJCX0gZWxzZSB7CgkJCQkJCXJldHVybiB7CgkJCQkJCQlpbmRleCwKCQkJCQkJCWRvd25sb2FkVXJsOiAn6I635Y+W5LiL6L295Zyw5Z2A5aSx6LSl77yM5Yi35paw5ZCO5YaN6K+V6K+V5ZCnficKCQkJCQkJfTsKCQkJCQl9CgkJCQl9CgkJCQlpZiAodGhpcy5kZXRlY3RQYWdlKCkgPT09ICdzaGFyZScpIHsKCQkJCQlsZXQgdnVlRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmhvbWUtcGFnZSIpLl9fdnVlX187CgoJCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QocGFuLnBjc1sxXSwgYGxpbmtJZD0ke3Z1ZURvbS5saW5rSUR9JmNvbnRlbnRJZHM9JHtlbmNvZGVVUklDb21wb25lbnQodnVlRG9tLmN1cnJlbnRQYXRoLmlkICsgJy8nICsgaXRlbS5jb0lEKX0mY2F0YWxvZ0lkcz1gLCB7CgkJCQkJCSdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJywKCQkJCQl9KTsKCQkJCQlpZiAocmVzLmNvZGUgPT09IDApIHsKCQkJCQkJcmV0dXJuIHsKCQkJCQkJCWluZGV4LAoJCQkJCQkJZG93bmxvYWRVcmw6IHJlcy5kYXRhLnJlZHJVcmwKCQkJCQkJfTsKCQkJCQl9IGVsc2UgewoJCQkJCQlyZXR1cm4gewoJCQkJCQkJaW5kZXgsCgkJCQkJCQlkb3dubG9hZFVybDogJ+iOt+WPluS4i+i9veWcsOWdgOWksei0pe+8jOWIt+aWsOWQjuWGjeivleivleWQp34nCgkJCQkJCX07CgkJCQkJfQoJCQkJfQoJCQl9IGNhdGNoIChlKSB7CgkJCQlyZXR1cm4gewoJCQkJCWluZGV4LAoJCQkJCWRvd25sb2FkVXJsOiAn6I635Y+W5LiL6L295Zyw5Z2A5aSx6LSl77yM5Yi35paw5ZCO5YaN6K+V6K+V5ZCnficKCQkJCX07CgkJCX0KCQl9LAoKCQlhc3luYyBnZXRQQ1NMaW5rKCkgewoJCQlzZWxlY3RMaXN0ID0gdGhpcy5nZXRTZWxlY3RlZExpc3QoKTsKCQkJaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CgkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+WFiOWLvumAieimgeS4i+i9veeahOaWh+S7tuaNj34nKTsKCQkJfQoJCQlpZiAodGhpcy5pc09ubHlGb2xkZXIoKSkgewoJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7fmiZPlvIDmlofku7blpLnlkI7lho3li77pgInmlofku7Z+Jyk7CgkJCX0KCgkJCWxldCBxdWV1ZSA9IFtdOwoJCQlzZWxlY3RMaXN0LmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7CgkJCQlxdWV1ZS5wdXNoKHRoaXMuZ2V0RmlsZVVybEJ5T25jZShpdGVtLCBpbmRleCkpOwoJCQl9KTsKCgkJCWNvbnN0IHJlcyA9IGF3YWl0IFByb21pc2UuYWxsKHF1ZXVlKTsKCQkJcmVzLmZvckVhY2godmFsID0+IHsKCQkJCXNlbGVjdExpc3RbdmFsLmluZGV4XS5kb3dubG9hZFVybCA9IHZhbC5kb3dubG9hZFVybDsKCQkJfSk7CgoJCQlsZXQgaHRtbCA9IHRoaXMuZ2VuZXJhdGVEb20oc2VsZWN0TGlzdCk7CgkJCXRoaXMuc2hvd01haW5EaWFsb2cocGFuW21vZGVdWzBdLCBodG1sLCBwYW5bbW9kZV1bMV0pOwoJCX0sCgoJCWdlbmVyYXRlRG9tKGxpc3QpIHsKCQkJbGV0IGNvbnRlbnQgPSAnPGRpdiBjbGFzcz0icGwtbWFpbiI+JzsKCQkJbGV0IGFsaW5rQWxsVGV4dCA9ICcnOwoJCQlsaXN0LmZvckVhY2goKHYsIGkpID0+IHsKCQkJCWlmICh2LmRpckV0YWcgfHwgdi5jYU5hbWUpIHJldHVybjsKCQkJCWxldCBmaWxlbmFtZSA9IHYuY29udGVudE5hbWUgfHwgdi5jb05hbWU7CgkJCQlsZXQgc2l6ZSA9IGJhc2Uuc2l6ZUZvcm1hdCh2LmNvbnRlbnRTaXplIHx8IHYuY29TaXplKTsKCQkJCWxldCBkbGluayA9IHYuZG93bmxvYWRVcmw7CgkJCQlpZiAobW9kZSA9PT0gJ2FwaScpIHsKCQkJCQlhbGlua0FsbFRleHQgKz0gZGxpbmsgKyAnXHJcbic7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1hcGkiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9IiBkYXRhLWluZGV4PSIke2l9Ij4ke2RsaW5rfTwvYT4KCQkJCQkJCQk8YnV0dG9uIGNsYXNzPSJwbC1pdGVtLWNvcHkgcGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGhyZWY9IiR7ZGxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi26ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSI+5aSN5Yi26ZO+5o6lPC9idXR0b24+CgkJCQkJCQkJPC9kaXY+YDsKCQkJCX0KCQkJCWlmIChtb2RlID09PSAnYXJpYScpIHsKCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9BcmlhKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQkJaWYgKG1vZGUgPT09ICdycGMnKSB7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxidXR0b24gY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLXJwYyBwbC1idG4tcHJpbWFyeSBwbC1idG4taW5mbyIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRldmljZSI+PC9lbT48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDVweDsiPuaOqOmAgeWIsCBSUEMg5LiL6L295ZmoPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2N1cmwnKSB7CgkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQ3VybChkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwoJCQkJCWFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2Y3VybOmTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2JjJykgewoJCQkJCWxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0JDKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX0iIHRpdGxlPSLngrnlh7vnlKjmr5TnibnlvZfmmJ/kuIvovb0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQl9KTsKCQkJY29udGVudCArPSAnPC9kaXY+JzsKCQkJaWYgKG1vZGUgPT09ICdhcGknKXsKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbC1hcGkiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48L2Rpdj5gO30KCQkJaWYgKG1vZGUgPT09ICdhcmlhJykKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOWRveS7pOihjDwvYnV0dG9uPjwvZGl2PmA7CgkJCWlmIChtb2RlID09PSAncnBjJykgewoJCQkJbGV0IHJwYyA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpICsgJzonICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpOwoJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLXNlbmQtcnBjIj7lj5HpgIHlhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIHRpdGxlPSIke3JwY30iIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweCI+6K6+572uIFJQQyDlj4LmlbDvvIjlvZPliY3kuLrvvJoke3JwY33vvIk8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4tc3VjY2VzcyBsaXN0ZW5lci1ycGMtdGFzayIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4O2Rpc3BsYXk6IG5vbmUiPuafpeeci+S4i+i9veS7u+WKoTwvYnV0dG9uPjwvZGl2PmA7CgkJCX0KCQkJaWYgKG1vZGUgPT09ICdjdXJsJykKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+6K6+572u57uI56uv57G75Z6L77yI5b2T5YmN5Li677yaJHt0ZXJtaW5hbFR5cGVbYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyldfe+8iTwvYnV0dG9uPjwvZGl2PmA7CgkJCXJldHVybiBjb250ZW50OwoJCX0sCgoJCWFzeW5jIHNlbmRMaW5rVG9SUEMoZmlsZW5hbWUsIGxpbmspIHsKCQkJbGV0IHJwYyA9IHsKCQkJCWRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCgkJCQlwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCgkJCQlwYXRoOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyksCgkJCQl0b2tlbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKSwKCQkJCWRpcjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJyksCgkJCX07CgoJCQlsZXQgdXJsID0gYCR7cnBjLmRvbWFpbn06JHtycGMucG9ydH0ke3JwYy5wYXRofWA7CgkJCWxldCBycGNEYXRhID0gewoJCQkJaWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAoJCQkJanNvbnJwYzogJzIuMCcsCgkJCQltZXRob2Q6ICdhcmlhMi5hZGRVcmknLAoJCQkJcGFyYW1zOiBbYHRva2VuOiR7cnBjLnRva2VufWAsIFtsaW5rXSwgewoJCQkJCWRpcjogcnBjLmRpciwKCQkJCQlvdXQ6IGZpbGVuYW1lLAoJCQkJCWhlYWRlcjogW10KCQkJCX1dCgkJCX07CgkJCXRyeSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHVybCwgcnBjRGF0YSwge30sICcnKTsKCQkJCWlmIChyZXMucmVzdWx0KSByZXR1cm4gJ3N1Y2Nlc3MnOwoJCQkJcmV0dXJuICdmYWlsJzsKCQkJfSBjYXRjaCAoZSkgewoJCQkJcmV0dXJuICdmYWlsJzsKCQkJfQoJCX0sCgoJCWdldFNlbGVjdGVkTGlzdCgpIHsKCQkJdHJ5IHsKCQkJCXJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubWFpbl9maWxlX2xpc3QiKS5fX3Z1ZV9fLnNlbGVjdExpc3QubWFwKHZhbCA9PiB2YWwuaXRlbSk7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCWxldCB2dWVEb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuaG9tZS1wYWdlIikuX192dWVfXzsKCQkJCWxldCBmaWxlTGlzdCA9IHZ1ZURvbS5fY29tcHV0ZWRXYXRjaGVycy5maWxlTGlzdC52YWx1ZTsKCQkJCWxldCBkaXJMaXN0ID0gdnVlRG9tLl9jb21wdXRlZFdhdGNoZXJzLmRpckxpc3QudmFsdWU7CgkJCQlsZXQgc2VsZWN0ZWRGaWxlSW5kZXggPSB2dWVEb20uc2VsZWN0ZWRGaWxlOwoJCQkJbGV0IHNlbGVjdGVkRGlySW5kZXggPSB2dWVEb20uc2VsZWN0ZWREaXI7CgkJCQlsZXQgc2VsZWN0RmlsZUxpc3QgPSBmaWxlTGlzdC5maWx0ZXIoKHYsIGkpID0+IHsKCQkJCQlyZXR1cm4gc2VsZWN0ZWRGaWxlSW5kZXguaW5jbHVkZXMoaSk7CgkJCQl9KTsKCQkJCWxldCBzZWxlY3REaXJMaXN0ID0gZGlyTGlzdC5maWx0ZXIoKHYsIGkpID0+IHsKCQkJCQlyZXR1cm4gc2VsZWN0ZWREaXJJbmRleC5pbmNsdWRlcyhpKTsKCQkJCX0pOwoJCQkJcmV0dXJuIFsuLi5zZWxlY3RGaWxlTGlzdCwgLi4uc2VsZWN0RGlyTGlzdF07CgkJCX0KCQl9LAoKCQlkZXRlY3RQYWdlKCkgewoJCQlsZXQgaG9zdG5hbWUgPSBsb2NhdGlvbi5ob3N0bmFtZTsKCQkJaWYgKC9eeXVuLy50ZXN0KGhvc3RuYW1lKSkgcmV0dXJuICdob21lJzsKCQkJaWYgKC9eY2FpeXVuLy50ZXN0KGhvc3RuYW1lKSkgcmV0dXJuICdzaGFyZSc7CgkJCXJldHVybiAnJzsKCQl9LAoKCQlpc09ubHlGb2xkZXIoKSB7CgkJCWZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0TGlzdC5sZW5ndGg7IGkrKykgewoJCQkJaWYgKHNlbGVjdExpc3RbaV0uZmlsZUV0YWcgfHwgc2VsZWN0TGlzdFtpXS5jb05hbWUpIHJldHVybiBmYWxzZTsKCQkJfQoJCQlyZXR1cm4gdHJ1ZTsKCQl9LAoKCQlzaG93TWFpbkRpYWxvZyh0aXRsZSwgaHRtbCwgZm9vdGVyKSB7CgkJCVN3YWwuZmlyZSh7CgkJCQl0aXRsZSwKCQkJCWh0bWwsCgkJCQlmb290ZXIsCgkJCQlhbGxvd091dHNpZGVDbGljazogZmFsc2UsCgkJCQlzaG93Q2xvc2VCdXR0b246IHRydWUsCgkJCQlwb3NpdGlvbjogJ2NlbnRlcicsLy90b3AKCQkJCXdpZHRoLAoJCQkJcGFkZGluZzogJzE1cHggMjBweCA1cHgnLAoJCQkJY3VzdG9tQ2xhc3MsCgkJCQljb25maXJtQnV0dG9uVGV4dDogJ+WFs+mXrScsCgkJCX0pOwoJCX0sCgoJCWFzeW5jIGluaXRQYW5MaW5rZXIoKSB7CgkJCXB0ID0gdGhpcy5kZXRlY3RQYWdlKCk7CgkJCWJhc2UuY3JlYXRlVGlwKCk7CgkJCWJhc2UucmVnaXN0ZXJNZW51Q29tbWFuZCgpOwoJCQlpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAndjEnKSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KGBodHRwczovL2FwaS55b3V4aWFvaG91LmNvbS9jb25maWcveWlkb25nLz92ZXI9JHt2ZXJzaW9ufSZhPSR7YXV0aG9yfWAsIHt9LCB7fSwgJ3RleHQnKTsKCQkJCXBhbiA9IEpTT04ucGFyc2UoYmFzZS5kZWNvZGUocmVzKSk7CgkJCX0gZWxzZSBpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAndjInKSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KGBodHRwczovL2FwaS55b3V4aWFvaG91LmNvbS9jb25maWcvdjIveWlkb25nLz92ZXI9JHt2ZXJzaW9ufSZhPSR7YXV0aG9yfWAsIHt9LCB7fSwgJ3RleHQnKTsKCQkJCXBhbiA9IEpTT04ucGFyc2UoYmFzZS5kZWNvZGUocmVzKSk7CgkJCX0gZWxzZSBpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAibm8iKSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5nZXQoYGh0dHBzOi8vZ2NvcmUuanNkZWxpdnIubmV0L2doL2htanoxMDAvT25saW5lLWRpc2stZGlyZWN0LWxpbmstZG93bmxvYWQtYXNzaXN0YW50QG1haW4vY29uZmlnL3lpZG9uZy5qc29uYCwge30sICJ0ZXh0Iiwge30pOwoJCQkJcGFuID0gSlNPTi5wYXJzZShyZXMpOwoJCQl9IGVsc2UgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KGBodHRwczovL2djb3JlLmpzZGVsaXZyLm5ldC9naC9obWp6MTAwL09ubGluZS1kaXNrLWRpcmVjdC1saW5rLWRvd25sb2FkLWFzc2lzdGFudEBtYWluL2NvbmZpZy9jb25maWcuanNvbmAsIHt9LCAidGV4dCIsIHt9KTsKCQkJCXBhbiA9IEpTT04ucGFyc2UocmVzKTsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInLCAndjInKTsKCQkJfQoJCQlPYmplY3QuZnJlZXplICYmIE9iamVjdC5mcmVlemUocGFuKTsKCQkJcGFuLm51bSA9PT0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19pbml0X2NvZGUnKSB8fCBwYW4ubGljZW5zZSA9PT0gYmFzZS5nZXRWYWx1ZSgnbGljZW5zZScpID8gdGhpcy5hZGRCdXR0b24oKSA6IHRoaXMuYWRkSW5pdEJ1dHRvbigpOwoJCX0KCX07CgoJLy8g5rK55bCP54y0CglsZXQgeW91eGlhb2hvdSA9ewoJCWFzeW5jIGluaXRQYW5MaW5rZXIoKSB7CgkJCWJhc2UuY3JlYXRlVGlwKCk7CgkJCWJhc2UucmVnaXN0ZXJQYW5NZW51Q29tbWFuZCgpOwoJCQlpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAndjEnKSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KGBodHRwczovL2FwaS55b3V4aWFvaG91LmNvbS9jb25maWcvP3Zlcj0ke3ZlcnNpb259JmE9JHthdXRob3J9YCwge30sIHt9LCAndGV4dCcpOwoJCQkJcGFuID0gSlNPTi5wYXJzZShiYXNlLmRlY29kZShyZXMpKTsKCQkJfSBlbHNlIGlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICd2MicpIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QoYGh0dHBzOi8vYXBpLnlvdXhpYW9ob3UuY29tL2NvbmZpZy92Mi8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gIm5vIikgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KGBodHRwczovL2djb3JlLmpzZGVsaXZyLm5ldC9naC9obWp6MTAwL09ubGluZS1kaXNrLWRpcmVjdC1saW5rLWRvd25sb2FkLWFzc2lzdGFudEBtYWluL2NvbmZpZy9jb25maWcuanNvbmAsIHt9LCAidGV4dCIsIHt9KTsKCQkJCXBhbiA9IEpTT04ucGFyc2UocmVzKTsKCQkJfSBlbHNlIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLmdldChgaHR0cHM6Ly9nY29yZS5qc2RlbGl2ci5uZXQvZ2gvaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnRAbWFpbi9jb25maWcvY29uZmlnLmpzb25gLCB7fSwgInRleHQiLCB7fSk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKHJlcyk7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJywgJ3YyJyk7CgkJCX0KCQkJT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKHBhbik7CgoJCQlsZXQgJGJ1dHRvbiA9IGAKCQkJPGRpdiBjbGFzcz0ibmF2LWl0ZW0iPgoJCQkJPGRpdiBjbGFzcz0iZHJvcGRvd24td3JhcHBlciI+CgkJCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGFyaWEtbGFiZWw9IijmlLkp5LiL6L295Yqp5omLIiBjbGFzcz0iZHJvcGRvd24tdGl0bGUiPgoJCQkJCQk8c3BhbiBjbGFzcz0idGl0bGUiPijmlLkp5LiL6L295Yqp5omL4qyH77iPPC9zcGFuPgoJCQkJCQk8c3BhbiBjbGFzcz0iYXJyb3cgZG93biI+PC9zcGFuPgoJCQkJCTwvYnV0dG9uPgoJCQkJCTxidXR0b24gdHlwZT0iYnV0dG9uIiBhcmlhLWxhYmVsPSIo5pS5KeS4i+i9veWKqeaJiyIgY2xhc3M9Im1vYmlsZS1kcm9wZG93bi10aXRsZSI+CgkJCQkJCTxzcGFuIGNsYXNzPSJ0aXRsZSI+KOaUuSnkuIvovb3liqnmiYvirIfvuI88L3NwYW4+CgkJCQkJCTxzcGFuIGNsYXNzPSJhcnJvdyByaWdodCI+PC9zcGFuPgoJCQkJCTwvYnV0dG9uPgoJCQkJCTx1bCBjbGFzcz0ibmF2LWRyb3Bkb3duIiBzdHlsZT0iZGlzcGxheTpub25lOyI+CgkJCQkJCTxsaSBjbGFzcz0iZHJvcGRvd24taXRlbSI+CgkJCQkJCQk8aDQ+CgkJCQkJCQkJ5Yqp5omLCgkJCQkJCQk8L2g0PgoJCQkJCQkJPHVsIGNsYXNzPSJkcm9wZG93bi1zdWJpdGVtLXdyYXBwZXIiPgoJCQkJCQkJCTxsaSBjbGFzcz0iZHJvcGRvd24tc3ViaXRlbSI+CgkJCQkJCQkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgY2xhc3M9Imxpc3RlbmVyLW9wZW4taW5mbyBuYXYtbGluayI+CgkJCQkJCQkJCQnwn5ug77iPIOiwg+ivlSjmn6XnnIvmmpflj7cv5Y2P6K6uKQoJCQkJCQkJCQk8L2E+CgkJCQkJCQkJPC9saT4KCQkJCQkJCTwvdWw+CgkJCQkJCTwvbGk+CgkJCQkJCTxsaSBjbGFzcz0iZHJvcGRvd24taXRlbSI+CgkJCQkJCQk8aDQ+CgkJCQkJCQkJ6YCJ6aG5CgkJCQkJCQk8L2g0PgoJCQkJCQkJPHVsIGNsYXNzPSJkcm9wZG93bi1zdWJpdGVtLXdyYXBwZXIiPgoJCQkJCQkJCTxsaSBjbGFzcz0iZHJvcGRvd24tc3ViaXRlbSI+CgkJCQkJCQkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgY2xhc3M9Imxpc3RlbmVyLW9wZW4tc2V0dGluZyBuYXYtbGluayI+CgkJCQkJCQkJCQnimpnvuI8g5Yqp5omL6K6+572uCgkJCQkJCQkJCTwvYT4KCQkJCQkJCQk8L2xpPgoJCQkJCQkJCTxsaSBjbGFzcz0iZHJvcGRvd24tc3ViaXRlbSI+CgkJCQkJCQkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgY2xhc3M9Imxpc3RlbmVyLW9wZW4tdXBkYXRlbG9nIG5hdi1saW5rIj4KCQkJCQkJCQkJCfCfk4Mg5pu05paw5pel5b+XCgkJCQkJCQkJCTwvYT4KCQkJCQkJCQk8L2xpPgoJCQkJCQkJPC91bD4KCQkJCQkJPC9saT4KCQkJCQk8L3VsPgoJCQkJPC9kaXY+CgkJCTwvZGl2PgoJCQlgOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXNldHRpbmcnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dTZXR0aW5nKCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXVwZGF0ZWxvZycsICgpID0+IHsKCQkJCWJhc2Uuc2hvd1VwZGF0ZUxvZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi1pbmZvJywgKCkgPT4gewoJCQkJYmFzZS5zaG93UGFuSW5mbygpOwoJCQl9KTsKCgkJCWZvciAobGV0IGkgPSAwOyBpIDwgMjsgaSsrKSB7CgkJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIubmF2LWxpbmtzIilbaV0uaW5uZXJIVE1MICs9ICRidXR0b24KCQkJfQoJCX0KCX0KCgoJLy8g6I635Y+W5Y6f6ISa5pys55qER3JlYXN5Rm9ya+S/oeaBr++8jOehruS/neayueWwj+eMtOacjeWKoeWZqOS/oeS7uwoJYmFzZS5mZXRjaFNjcmlwdEluZm8oJ2h0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy80MzY0NDYuanNvbicsIDUpLnRoZW4ocmVzID0+IHsKCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3NjcmlwdF92ZXJzaW9uJywgcmVzLnZlcnNpb24pOwoJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfc2NyaXB0X2F1dGhvcicsICdHcmVhc3lGb3JrJyk7CgkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19zY3JpcHRfbmFtZScsIHJlcy5uYW1lKTsKCX0pCgoJLy8g55So5LqO5rK55bCP54y05pyN5Yqh5Zmo5qOA5rWL55qE6ISa5pys5L+h5oGvCglsZXQgc2NyaXB0SW5mbyA9IEdNX2luZm8uc2NyaXB0OwoKCS8vIOeUqOS6juayueWwj+eMtOacjeWKoeWZqOajgOa1i+eahOiEmuacrOS9nOiAhQoJbGV0IHJlYWxhdXRob3IgPSBzY3JpcHRJbmZvLmF1dGhvcjsKCWxldCBhdXRob3IgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3NjcmlwdF9hdXRob3InKTsKCgkvLyDnlKjkuo7msrnlsI/njLTmnI3liqHlmajmo4DmtYvnmoTohJrmnKzlkI3np7AKCWxldCByZWFsbmFtZSA9IHNjcmlwdEluZm8ubmFtZTsKCWxldCBuYW1lID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19zY3JpcHRfbmFtZScpOwoKCS8vIOeUqOS6juayueWwj+eMtOacjeWKoeWZqOajgOa1i+eahOiEmuacrOeJiOacrCzpmLLmraLmnI3liqHlmajov5Tlm57mm7TmlrDkv6Hmga8KCWxldCByZWFsdmVyc2lvbiA9IHNjcmlwdEluZm8udmVyc2lvbjsKCWxldCB2ZXJzaW9uID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19zY3JpcHRfdmVyc2lvbicpOwoKCS8qLS0tIHdhaXRGb3JLZXlFbGVtZW50cygpOiDkuIDkuKrlrp7nlKjlh73mlbDvvIznlKjkuo5HcmVhc2Vtb25rZXnohJrmnKzvvIwKCeWug+WPr+S7peajgOa1i+WSjOWkhOeQhkFKQVjliqDovb3nmoTlhoXlrrnjgIIKCeS9v+eUqOekuuS+i++8mgoJCXdhaXRGb3JLZXlFbGVtZW50cyAoCgkJCSJkaXYuY29tbWVudHMiCgkJCSwgY29tbWVudENhbGxiYWNrRnVuY3Rpb24KCQkpOwoJCS8vIOmhtemdoueJueWumueahOWHveaVsO+8jOeUqOS6juWcqOaJvuWIsOiKgueCueaXtuaJp+ihjOaIkeS7rOaDs+imgeeahOaTjeS9nOOAggoJCWZ1bmN0aW9uIGNvbW1lbnRDYWxsYmFja0Z1bmN0aW9uIChqTm9kZSkgewoJCQlqTm9kZS50ZXh0ICgid2FpdEZvcktleUVsZW1lbnRzKCkg5pu05pS55LqG6L+Z5q615rOo6YeK44CCIik7CgkJfQoJ6YeN6KaB5o+Q56S677yaPGJyPui/meS4quWHveaVsOmcgOimgeS9oOeahOiEmuacrOWKoOi9veS6hmpRdWVyeeOAggoJKi8KCWZ1bmN0aW9uIHdhaXRGb3JLZXlFbGVtZW50cyhzZWxlY3RvclR4dCwgYWN0aW9uRnVuY3Rpb24sIGJXYWl0T25jZSwgaWZyYW1lU2VsZWN0b3IpIHsKCQl2YXIgdGFyZ2V0Tm9kZXMsIGJ0YXJnZXRzRm91bmQ7CgoJCWlmICh0eXBlb2YgaWZyYW1lU2VsZWN0b3IgPT0gInVuZGVmaW5lZCIpCgkJCXRhcmdldE5vZGVzID0gJChzZWxlY3RvclR4dCk7CgkJZWxzZQoJCQl0YXJnZXROb2RlcyA9ICQoaWZyYW1lU2VsZWN0b3IpLmNvbnRlbnRzKCkKCQkJCS5maW5kKHNlbGVjdG9yVHh0KTsKCgkJaWYgKHRhcmdldE5vZGVzICYmIHRhcmdldE5vZGVzLmxlbmd0aCA+IDApIHsKCQkJYnRhcmdldHNGb3VuZCA9IHRydWU7CgkJCXRhcmdldE5vZGVzLmVhY2goZnVuY3Rpb24gKCkgewoJCQkJdmFyIGpUaGlzID0gJCh0aGlzKTsKCQkJCXZhciBhbHJlYWR5Rm91bmQgPSBqVGhpcy5kYXRhKCdhbHJlYWR5Rm91bmQnKSB8fCBmYWxzZTsKCgkJCQlpZiAoIWFscmVhZHlGb3VuZCkgewoJCQkJCS8vLS0tIOiwg+eUqOi9veiNt+WHveaVsOOAggoJCQkJCXZhciBjYW5jZWxGb3VuZCA9IGFjdGlvbkZ1bmN0aW9uKGpUaGlzKTsKCQkJCQlpZiAoY2FuY2VsRm91bmQpIHsKCQkJCQkJYnRhcmdldHNGb3VuZCA9IGZhbHNlOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWpUaGlzLmRhdGEoJ2FscmVhZHlGb3VuZCcsIHRydWUpOwoJCQkJCX0KCQkJCX0KCQkJfSk7CgkJfSBlbHNlIHsKCQkJYnRhcmdldHNGb3VuZCA9IGZhbHNlOwoJCX0KCgkJLy8tLS0g6I635Y+W6L+Z5Liq6YCJ5oup5Zmo55qE5a6a5pe25Zmo5o6n5Yi25Y+Y6YeP44CCCgkJdmFyIGNvbnRyb2xPYmogPSB3YWl0Rm9yS2V5RWxlbWVudHMuY29udHJvbE9iaiB8fCB7fTsKCQl2YXIgY29udHJvbEtleSA9IHNlbGVjdG9yVHh0LnJlcGxhY2UoL1teXHddL2csICJfIik7CgkJdmFyIHRpbWVDb250cm9sID0gY29udHJvbE9ialtjb250cm9sS2V5XTsKCgkJLy8tLS0g546w5Zyo5qC55o2u5oOF5Ya16K6+572u5oiW5riF6Zmk5a6a5pe25Zmo44CCCgkJaWYgKGJ0YXJnZXRzRm91bmQgJiYgYldhaXRPbmNlICYmIHRpbWVDb250cm9sKSB7CgkJCS8vLS0tIOWUr+S4gOmcgOimgea4hemZpOWumuaXtuWZqOeahOaDheWGteOAggoJCQljbGVhckludGVydmFsKHRpbWVDb250cm9sKTsKCQkJZGVsZXRlIGNvbnRyb2xPYmpbY29udHJvbEtleV0KCQl9IGVsc2UgewoJCQkvLy0tLSDlpoLmnpzpnIDopoHnmoTor53vvIzorr7nva7kuIDkuKrlrprml7blmajjgIIKCQkJaWYgKCF0aW1lQ29udHJvbCkgewoJCQkJdGltZUNvbnRyb2wgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CgkJCQkJd2FpdEZvcktleUVsZW1lbnRzKHNlbGVjdG9yVHh0LCBhY3Rpb25GdW5jdGlvbiwgYldhaXRPbmNlLCBpZnJhbWVTZWxlY3Rvcik7CgkJCQl9LCAzMDApOwoJCQkJY29udHJvbE9ialtjb250cm9sS2V5XSA9IHRpbWVDb250cm9sOwoJCQl9CgkJfQoJCXdhaXRGb3JLZXlFbGVtZW50cy5jb250cm9sT2JqID0gY29udHJvbE9iajsKCX0KCgkvLyDkuLvku6PnoIEKCWxldCBtYWluID0gewoJCWluaXQoKSB7CgkJCS8vIOWFiOWKoOi9vem7mOiupOiuvue9rgoJCQliYXNlLmluaXREZWZhdWx0Q29uZmlnKCk7CgkJCS8vIOWGjeWKoOi9vee9kemhteagt+W8jwoJCQliYXNlLmFkZFBhbkxpbmtlclN0eWxlKCk7CgkJCS8vIOWIpOaWree9keebmOWcsOWdgOW5tuWKoOi9veWvueW6lOeahGluaXRQYW5MaW5rZXIKCQkJaWYgKC8ocGFufHl1bikuYmFpZHUuY29tLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CgkJCQliYWlkdS5pbml0UGFuTGlua2VyKCk7CgkJCX0KCQkJaWYgKC93d3cuKGFsaXl1bmRyaXZlfGFsaXBhbikuY29tLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CgkJCQlhbGkuaW5pdFBhbkxpbmtlcigpOwoJCQl9CgkJCWlmICgvY2xvdWQuMTg5LmNuLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CgkJCQl0aWFueWkuaW5pdFBhbkxpbmtlcigpOwoJCQl9CgkJCWlmICgvcGFuLnh1bmxlaS5jb20vLnRlc3QobG9jYXRpb24uaG9zdCkpIHsKCQkJCXh1bmxlaS5pbml0UGFuTGlua2VyKCk7CgkJCX0KCQkJaWYgKC9wYW4ucXVhcmsuY24vLnRlc3QobG9jYXRpb24uaG9zdCkpIHsKCQkJCXF1YXJrLmluaXRQYW5MaW5rZXIoKTsKCQkJfQoJCQlpZiAoLyh5dW58Y2FpeXVuKS4xMzkuY29tLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CgkJCQl5aWRvbmcuaW5pdFBhbkxpbmtlcigpOwoJCQl9CgkJCWlmICgvd3d3LnlvdXhpYW9ob3UuY29tLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CgkJCQl5b3V4aWFvaG91LmluaXRQYW5MaW5rZXIoKTsKCQkJfQoJCX0KCX07CgltYWluLmluaXQoKTsKfSkoKTsKLy8g5rKJ6buY5piv6YeR
Add Comment
Please, Sign In to add comment