xiaomianao666

插件名:global_B站哔哩哔哩使用增强,全网VIP视频免费破解去广告,知乎使用增强,短视频无水印下载,油管、Facebook等国外视频解析下载等😈

Sep 13th, 2023
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_B站哔哩哔哩使用增强,全网VIP视频免费破解去广告,知乎使用增强,短视频无水印下载,油管、Facebook等国外视频解析下载等😈@base64://Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgICAgIELnq5nlk5Tlk6nlk5Tlk6nkvb/nlKjlop7lvLrvvIzlhajnvZFWSVDop4bpopHlhY3otLnnoLTop6Pljrvlub/lkYrvvIznn6XkuY7kvb/nlKjlop7lvLrvvIznn63op4bpopHml6DmsLTljbDkuIvovb3vvIzmsrnnrqHjgIFGYWNlYm9va+etieWbveWkluinhumikeino+aekOS4i+i9veetifCfmIgKLy8gQG5hbWU6emggICAgICAgICAgIELnq5nlk5Tlk6nlk5Tlk6nkvb/nlKjlop7lvLrvvIzlhajnvZFWSVDop4bpopHlhY3otLnnoLTop6Pljrvlub/lkYrvvIznn6XkuY7kvb/nlKjlop7lvLrvvIznn63op4bpopHml6DmsLTljbDkuIvovb3vvIzmsrnnrqHjgIFGYWNlYm9va+etieWbveWkluinhumikeino+aekOS4i+i9veetifCfmIgKLy8gQG5hbWU6emgtVFcJCSAgQuermeWXtuWTqeWXtuWTqeS9v+eUqOWinuW8t++8jOWFqOe2slZJUOimlumgu+WFjeiyu+egtOino+WOu+W7o+WRiu+8jOefpeS5juS9v+eUqOWinuW8t++8jOefreimlumgu+eEoeawtOWNsOS4i+i8ie+8jOayueeuoeOAgUZhY2Vib29r562J5ZyL5aSW6KaW6aC76Kej5p6Q5LiL6LyJ562J8J+YiAovLyBAbmFtZXNwYWNlICAgICAgICAgYmlsaWJpbGlfbmFtZXNwYWNlXzIwMjMwNjI1Ci8vIEB2ZXJzaW9uICAgICAgICAgICAxLjAuOAovLyBAZGVzY3JpcHRpb24gICAgICAg5Yqf6IO95Y+v6YCJ5oup5oCn5omT5byA77yaMeOAgULnq5nkvb/nlKjlop7lvLrvvJrmlK/mjIHop4bpopHkuIvovb0o8J+RieaUr+aMgeWkmlDmibnph4/lv6vpgJ/kuIvovb3wn5GIKeOAgea1j+iniOiusOW9leaPkOekuuOAgeS4gOmUruS4iei/nuOAgeiHquWKqOetvuWIsOOAgeaPj+i/sOaWh+acrOe9keWdgOi9rOmTvuaOpeetie+8mzLjgIHlhajnvZFWSVDop4bpopHop6PmnpDvvJrniLHlpYfoibrjgIHohb7orq/jgIHkvJjphbfjgIFiaWxpYmlsaeetieinhumikeWFjei0ueino+aekCjmlK/mjIHoh6rlrprkuYnop6PmnpDmjqXlj6Mp77ybM+OAgeefpeS5juS9v+eUqOWKqeaJi++8muWGheWuueenjeexu+agh+ivhuOAgemXruetlOaYvuekuuS8mOWMluOAgeinhumikeS4i+i9veetie+8mzTjgIHnn63op4bpopHljrvmsLTljbDkuIvovb3vvJrmlK/mjIHnn6XkuY7jgIHmipbpn7PjgIHlv6vmiYvnrYnvvJs144CB5rK5566h44CBRmFjZWJvb2vnrYnlm73lpJbop4bpopHop6PmnpDkuIvovb3vvJs244CB5pCc57Si5byV5pOO5a+86IiqLOaUr+aMgeiHquWumuS5iee9keWdgOOAkOiEmuacrOmVv+acn+e7tOaKpOabtOaWsO+8jOWujOWFqOWFjei0ue+8jOaXoOW5v+WRiu+8jOS7hemZkOWtpuS5oOS6pOa1ge+8ge+8geOAkQovLyBAZGVzY3JpcHRpb246emggICAg5Yqf6IO95Y+v6YCJ5oup5oCn5omT5byA77yaMeOAgULnq5nkvb/nlKjlop7lvLrvvJrmlK/mjIHop4bpopHkuIvovb0o8J+RieaUr+aMgeWkmlDmibnph4/lv6vpgJ/kuIvovb3wn5GIKeOAgea1j+iniOiusOW9leaPkOekuuOAgeS4gOmUruS4iei/nuOAgeiHquWKqOetvuWIsOOAgeaPj+i/sOaWh+acrOe9keWdgOi9rOmTvuaOpeetie+8mzLjgIHlhajnvZFWSVDop4bpopHop6PmnpDvvJrniLHlpYfoibrjgIHohb7orq/jgIHkvJjphbfjgIFiaWxpYmlsaeetieinhumikeWFjei0ueino+aekCjmlK/mjIHoh6rlrprkuYnop6PmnpDmjqXlj6Mp77ybM+OAgeefpeS5juS9v+eUqOWKqeaJi++8muWGheWuueenjeexu+agh+ivhuOAgemXruetlOaYvuekuuS8mOWMluOAgeinhumikeS4i+i9veetie+8mzTjgIHnn63op4bpopHljrvmsLTljbDkuIvovb3vvJrmlK/mjIHnn6XkuY7jgIHmipbpn7PjgIHlv6vmiYvnrYnvvJs144CB5rK5566h44CBRmFjZWJvb2vnrYnlm73lpJbop4bpopHop6PmnpDkuIvovb3vvJs244CB5pCc57Si5byV5pOO5a+86IiqLOaUr+aMgeiHquWumuS5iee9keWdgOOAkOiEmuacrOmVv+acn+e7tOaKpOabtOaWsO+8jOWujOWFqOWFjei0ue+8jOaXoOW5v+WRiu+8jOS7hemZkOWtpuS5oOS6pOa1ge+8ge+8geOAkQovLyBAZGVzY3JpcHRpb246emgtVFcg5Yqf6IO95Y+v6YG45pOH5oCn6ZaL5ZWf77yaMeOAgULnq5nkvb/nlKjlop7lvLfvvJrmlK/mj7ToppbpoLvkuIvovIko8J+RieaUr+aPtOWkmlDmibnph4/lv6vpgJ/kuIvovInwn5GIKeOAgeeAj+imveiomOmMhOaPkOekuuOAgeS4gOmNteS4iemAo+OAgeiHquWLleewveWIsOOAgeaPj+i/sOaWh+acrOe2suWdgOi9iemAo+e1kOetie+8mzLjgIHlhajntrJWSVDoppbpoLvop6PmnpDvvJrmhJvlpYfol53jgIHpqLDoqIrjgIHlhKrphbfjgIFiaWxpYmlsaeetieimlumgu+WFjeiyu+ino+aekCjmlK/mj7Toh6rlrprnvqnop6PmnpDku4vpnaIp77ybM+OAgeefpeS5juS9v+eUqOWKqeaJi++8muWFp+WuueeorumhnuaomeitmOOAgeWVj+etlOmhr+ekuuWEquWMluOAgeimlumgu+S4i+i8ieetie+8mzTjgIHnn63oppbpoLvljrvmsLTljbDkuIvovInvvJrmlK/mj7Tnn6XkuY7jgIHmipbpn7PjgIHlv6vmiYvnrYnvvJs144CB5rK5566h44CBRmFjZWJvb2vnrYnlnIvlpJboppbpoLvop6PmnpDkuIvovInvvJs244CB5pCc57Si5byV5pOO5bCO6IiqLOaUr+aPtOiHquWumue+qee2suWdgOOAkOaMh+S7pOeivOaIluebtOitr+W8j+eoi+W8j+mVt+acn+e2reitt+abtOaWsO+8jOWujOWFqOWFjeiyu++8jOeEoeW7o+WRiu+8jOWDhemZkOWtuOe/kuS6pOa1ge+8ge+8geOAkQovLyBAYXV0aG9yICAgICAgICAgICAg54ix55S755S755qE54yrCi8vIEBpY29uICAgICAgICAgICAgICBkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNBQUFBQWdDQVlBQUFCemVucjBBQUFDUzBsRVFWUllSOFdYejJvVFVSVEd2M01ucHFoTkt5MVVXbXhSVEdkYWlMU1FSS2tLSW9LNEZWclJQb0h1N0JNWW4wQjMrZ1FxdXVpdWlDNmthRlZzQWhHRVprS3FHLytWcnRwMFlXc3lSMjdLbEV3ejB4bm5UM0xnd2pCMzd2bCs5N3R6ejl3aGREaW93L3B3QkNqb2ZOMEFKb2h3S1Fna014WUY4RG10MGJ4ZG5oYUFRb1dUWE1jekVOSkJoRnZHTWdxazRHWTZTWlhtUGd2QW15L2NuWWlqR3Fyd3ZtVFZIU1F1cDJqTHZHMEJ5SmY1RVlEYlVRSUFlSnhSNlU0TFFIR1YxVm9kZXNUaWpmUXhCZHJrYVNyTDZ6MEhsc3Q4aTRBbjdRQmdZRGFyMGxNcmdNNDVJdHhyQ3dEamZsYWpuQytBdFI4R3ZuOHpHcHo5eHdWT2pvci9abWEvQU50L0dJc0xOV3h0OHA3bzRJaUFtbExRUCtDOXB2a0crRm95VVB4WXM1MnhoRkRQS0loM3VSdmlHMkNsV0lkc1RwSG9KWXltRk5kbGlRekFCQnNhRVpnNHArRHdVZnRsaVJ4QWdnd09DMHhkaWRtYTFSYUFJOTJFYTlPSE9nY3dQcWxBTnJ1STFBRWxoc2EyZEJLWFFKRUJuRGdsR2x2eFdOL0JOY0UzZ0t5Q1M2OWI2NEFVbE1JU3dFdjRCcERKMzc3OGkvWGZ1NVhRdEZ0YUxxKzlSaUNBNmdaai9kY3VRTjhBdWRvZDZrdm9kWVp1ejlrN1VPSzdKUERBYlhBWS9XeGdManRHRHkyZjQwOFZQaThNTElVaDRKYkRFTGh3TmtudkxRRHlRTm9UaDg3QWtGdUNJUDBFL056Y2dXWWVUQzBiZHJrTnA2TG05YmM0WU00cXIvTnpFR2FDek5KeExPTkZScU1iemYyMkpTdS93bGNwaGh3enBzSUFJY0lIcmlHWEdhZFgrL01kV0RQZmxUalJ4Y0gra0xZSmhZdGo1UGl6NC8wZ0Y0WVZOams2RHZBUERiMGFNRXI4L25FQUFBQUFTVVZPUks1Q1lJST0KLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly8qLnlvdWt1LmNvbS92XyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly8qLmlxaXlpLmNvbS92XyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly8qLmlxaXlpLmNvbS93XyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly8qLmlxaXlpLmNvbS9hXyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly8qLmlxaXlpLmNvbS9yZXNvdXJjZS9wY3cvcGxheS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vKi5sZS5jb20vcHR2L3ZwbGF5LyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly92LnFxLmNvbS94L2NvdmVyLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly92LnFxLmNvbS94L3BhZ2UvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL3YucXEuY29tL3R2LyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly8qLnR1ZG91LmNvbS9saXN0cGxheS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vKi50dWRvdS5jb20vYWxidW1wbGF5LyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly8qLnR1ZG91LmNvbS9wcm9ncmFtcy92aWV3LyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly8qLm1ndHYuY29tL2IvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL2ZpbG0uc29odS5jb20vYWxidW0vKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL3R2LnNvaHUuY29tL3YvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovLyouYmFvZmVuZy5jb20vcGxheS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vdmlwLnBwdHYuY29tL3Nob3cvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL3YucHB0di5jb20vc2hvdy8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vd3d3LmxlLmNvbS9wdHYvdnBsYXkvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL3d3dy53YXN1LmNuL1BsYXkvc2hvdy8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vKi4xOTA1LmNvbS92aWRlby8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vKi4xOTA1LmNvbS9wbGF5LyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly8qLjE5MDUuY29tLyovcGxheS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vd3d3Lm1pZ3V2aWRlby5jb20vbWdzLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9tLnYucXEuY29tL3gvY292ZXIvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL20udi5xcS5jb20veC9wYWdlLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9tLnYucXEuY29tLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9tLmlxaXlpLmNvbS92XyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9tLmlxaXlpLmNvbS93XyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9tLmlxaXlpLmNvbS9hXyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9tLnlvdWt1LmNvbS9hbGlwYXlfdmlkZW8vKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL20ueW91a3UuY29tL3ZpZGVvL2lkXyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9tLm1ndHYuY29tL2IvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL20udHYuc29odS5jb20vdi8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vbS5maWxtLnNvaHUuY29tL2FsYnVtLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9tLmxlLmNvbS9wdHYvdnBsYXkvKgovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL20ucHB0di5jb20vc2hvdy8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vbS5hY2Z1bi5jbi92LyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9tLndhc3UuY24vUGxheS9zaG93LyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly93d3cuYmFpZHUuY29tLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly93d3cuc28uY29tL3MqCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vd3d3LnNvZ291LmNvbS93ZWIqCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vd3d3LnNvZ291LmNvbS9zb2dvdSoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9jbi5iaW5nLmNvbS9zZWFyY2gqCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vd3d3LmJpbmcuY29tL3NlYXJjaCoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly93d3c0LmJpbmcuY29tL3NlYXJjaCoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9zby50b3V0aWFvLmNvbS9zZWFyY2gqCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoKgovLyBAaW5jbHVkZQkgICAJICAgICAgKjovL3d3dy5iaWxpYmlsaS5jb20vKioKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly9zZWFyY2guYmlsaWJpbGkuY29tLyoqCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vc3BhY2UuYmlsaWJpbGkuY29tLyoqCi8vIEBpbmNsdWRlICAgICAgCSAgKjovLyouemhpaHUuY29tLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly93d3cuZG91eWluLmNvbS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vd3d3Lmt1YWlzaG91LmNvbS8qCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vd3d3LnlvdXR1YmUuY29tCi8vIEBpbmNsdWRlICAgICAgICAgICAqOi8vd3d3LnlvdXR1YmUuY29tLwovLyBAaW5jbHVkZSAgICAgICAgICAgKjovL3d3dy55b3V0dWJlLmNvbS93YXRjaCoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly93d3cuZmFjZWJvb2suY29tLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly95dDFzLmNvbS9mYWNlYm9vay1kb3dubG9hZGVyCi8vIEByZXF1aXJlICAgICAgICAgICBodHRwczovL2xmMjYtY2RuLXRvcy5ieXRlY2RudHAuY29tL2Nkbi9leHBpcmUtMS1NL2pxdWVyeS8zLjIuMS9qcXVlcnkubWluLmpzCi8vIEByZXF1aXJlICAgICAgICAgICBodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvNDU0MjM2LWZpbmRhbmRyZXBsYWNlZG9tdGV4dC1odWFodWFjYXQvY29kZS9maW5kQW5kUmVwbGFjZURPTVRleHQtaHVhaHVhY2F0LmpzP3ZlcnNpb249MTExMjk5MAovLyBAY29ubmVjdCAgICAgICAgICAgYXBpLmJpbGliaWxpLmNvbQovLyBAY29ubmVjdCAgICAgICAgICAgYXBpLmxpdmUuYmlsaWJpbGkuY29tCi8vIEBjb25uZWN0ICAgICAgICAgICBhcGkuc3RhdGljai50b3AKLy8gQGNvbm5lY3QgICAgICAgICAgIGNkbi5qc2RlbGl2ci5uZXQKLy8gQGdyYW50ICAgICAgICAgICAgIHVuc2FmZVdpbmRvdwovLyBAZ3JhbnQgICAgICAgICAgICAgR01fb3BlbkluVGFiCi8vIEBncmFudCAgICAgICAgICAgICBHTS5vcGVuSW5UYWIKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX2dldFZhbHVlCi8vIEBncmFudCAgICAgICAgICAgICBHTS5nZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgICAgICAgR01fc2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICAgICAgIEdNLnNldFZhbHVlCi8vIEBncmFudCAgICAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAZ3JhbnQgICAgICAgICAgICAgR00ueG1sSHR0cFJlcXVlc3QKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQKLy8gQGxpY2Vuc2UgICAgICAgICAgIEFHUEwgTGljZW5zZQovLyBAY2hhcnNldAkJICAgICAgVVRGLTgKLy8gQHJ1bi1hdCAgICAgICAgICAgIGRvY3VtZW50LWlkbGUKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24gKCkgewoJJ3VzZSBzdHJpY3QnOwoJCgkvKioKCSAqIOmDqOWIhuS7o+eggeWAn+mJtOS6huapmOWtkOeIseWTreeahOS7o+egge+8jOS7peiOt+W+l+WOn+S9nOiAheaOiOadgwoJICog5Y6f6ISa5pys5Zyw5Z2A77yaaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzM5MDk1MgoJICovCgkKCS8v5YWx5pyJ5pa55rOV77yM5YWo5bGA5YWx5LqrCglmdW5jdGlvbiBjb21tb25GdW5jdGlvbigpewoJCXRoaXMuR01nZXRWYWx1ZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZT1udWxsKSB7CgkJCWxldCBzdG9yYWdlVmFsdWUgPSB2YWx1ZTsKCQkJaWYgKHR5cGVvZiBHTV9nZXRWYWx1ZSA9PT0gImZ1bmN0aW9uIikgewoJCQkJc3RvcmFnZVZhbHVlID0gR01fZ2V0VmFsdWUobmFtZSwgdmFsdWUpOwoJCQl9IGVsc2UgaWYodHlwZW9mIEdNLnNldFZhbHVlID09PSAiZnVuY3Rpb24iKXsKCQkJCXN0b3JhZ2VWYWx1ZSA9IEdNLmdldFZhbHVlKG5hbWUsIHZhbHVlKTsKCQkJfWVsc2V7CgkJCQl2YXIgYXJyID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpOwoJCQkJaWYoYXJyICE9IG51bGwpewoJCQkJCXN0b3JhZ2VWYWx1ZSA9IGFycgoJCQkJfQoJCQl9CgkJCXJldHVybiBzdG9yYWdlVmFsdWU7CgkJfTsKCQl0aGlzLkdNc2V0VmFsdWUgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSl7CgkJCWlmICh0eXBlb2YgR01fc2V0VmFsdWUgPT09ICJmdW5jdGlvbiIpIHsKCQkJCUdNX3NldFZhbHVlKG5hbWUsIHZhbHVlKTsKCQkJfSBlbHNlIGlmKHR5cGVvZiBHTS5zZXRWYWx1ZSA9PT0gImZ1bmN0aW9uIil7CgkJCQlHTS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7CgkJCX1lbHNlewoJCQkJd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKG5hbWUsIHZhbHVlKQoJCQl9CgkJfTsKCQl0aGlzLkdNYWRkU3R5bGUgPSBmdW5jdGlvbihjc3MpewoJCQl2YXIgbXlTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CgkJCW15U3R5bGUudGV4dENvbnRlbnQgPSBjc3M7CgkJCXZhciBkb2MgPSBkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCQkJZG9jLmFwcGVuZENoaWxkKG15U3R5bGUpOwoJCX07CgkJdGhpcy5HTW9wZW5JblRhYiA9IGZ1bmN0aW9uKHVybCwgb3B0aW9ucz17ImFjdGl2ZSI6dHJ1ZSwgImluc2VydCI6dHJ1ZSwgInNldFBhcmVudCI6dHJ1ZX0pewoJCQlpZiAodHlwZW9mIEdNX29wZW5JblRhYiA9PT0gImZ1bmN0aW9uIikgewoJCQkJR01fb3BlbkluVGFiKHVybCwgb3B0aW9ucyk7CgkJCX0gZWxzZSB7CgkJCQlHTS5vcGVuSW5UYWIodXJsLCBvcHRpb25zKTsKCQkJfQoJCX07CgkJdGhpcy5hZGRTY3JpcHQgPSBmdW5jdGlvbih1cmwpewoJCQl2YXIgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwoJCQlzLnNldEF0dHJpYnV0ZSgnc3JjJyx1cmwpOwoJCQlkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHMpOwoJCX07CgkJdGhpcy5yYW5kb21OdW1iZXIgPSBmdW5jdGlvbigpewoJCQlyZXR1cm4gTWF0aC5jZWlsKE1hdGgucmFuZG9tKCkqMTAwMDAwMDAwKTsKCQl9OwoJCXRoaXMucmVxdWVzdCA9IGZ1bmN0aW9uKG1vdGhlZCwgdXJsLCBwYXJhbSl7ICAgLy/nvZHnu5zor7fmsYIKCQkJcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CgkJCQlHTV94bWxodHRwUmVxdWVzdCh7CgkJCQkJdXJsOiB1cmwsCgkJCQkJbWV0aG9kOiBtb3RoZWQsCgkJCQkJZGF0YTpwYXJhbSwKCQkJCQlvbmxvYWQ6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7CgkJCQkJCXZhciBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7CgkJCQkJCXZhciBwbGF5dXJsID0gIiI7CgkJCQkJCWlmKHN0YXR1cz09MjAwfHxzdGF0dXM9PScyMDAnKXsKCQkJCQkJCXZhciByZXNwb25zZVRleHQgPSByZXNwb25zZS5yZXNwb25zZVRleHQ7CgkJCQkJCQlyZXNvbHZlKHsicmVzdWx0Ijoic3VjY2VzcyIsICJkYXRhIjpyZXNwb25zZVRleHR9KTsKCQkJCQkJfWVsc2V7CgkJCQkJCQlyZWplY3QoeyJyZXN1bHQiOiJlcnJvciIsICJkYXRhIjpudWxsfSk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9KTsKCQkJfSkKCQl9OwoJCXRoaXMuYWRkQ29tbW9uSHRtbENzcyA9IGZ1bmN0aW9uKCl7CgkJCXZhciBjc3NUZXh0ID0gCgkJCQlgCgkJCQlAa2V5ZnJhbWVzIGZhZGVJbiB7CgkJCQkJMCUgICAge29wYWNpdHk6IDB9CgkJCQkJMTAwJSAge29wYWNpdHk6IDF9CgkJCQl9CgkJCQlALXdlYmtpdC1rZXlmcmFtZXMgZmFkZUluIHsKCQkJCQkwJSAgICB7b3BhY2l0eTogMH0KCQkJCQkxMDAlICB7b3BhY2l0eTogMX0KCQkJCX0KCQkJCUAtbW96LWtleWZyYW1lcyBmYWRlSW4gewoJCQkJCTAlICAgIHtvcGFjaXR5OiAwfQoJCQkJCTEwMCUgIHtvcGFjaXR5OiAxfQoJCQkJfQoJCQkJQC1vLWtleWZyYW1lcyBmYWRlSW4gewoJCQkJCTAlICAgIHtvcGFjaXR5OiAwfQoJCQkJCTEwMCUgIHtvcGFjaXR5OiAxfQoJCQkJfQoJCQkJQC1tcy1rZXlmcmFtZXMgZmFkZUluIHsKCQkJCQkwJSAgICB7b3BhY2l0eTogMH0KCQkJCQkxMDAlICB7b3BhY2l0eTogMX0KCQkJCX0KCQkJCUBrZXlmcmFtZXMgZmFkZU91dCB7CgkJCQkJMCUgICAge29wYWNpdHk6IDF9CgkJCQkJMTAwJSAge29wYWNpdHk6IDB9CgkJCQl9CgkJCQlALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dCB7CgkJCQkJMCUgICAge29wYWNpdHk6IDF9CgkJCQkJMTAwJSAge29wYWNpdHk6IDB9CgkJCQl9CgkJCQlALW1vei1rZXlmcmFtZXMgZmFkZU91dCB7CgkJCQkJMCUgICAge29wYWNpdHk6IDF9CgkJCQkJMTAwJSAge29wYWNpdHk6IDB9CgkJCQl9CgkJCQlALW8ta2V5ZnJhbWVzIGZhZGVPdXQgewoJCQkJCTAlICAgIHtvcGFjaXR5OiAxfQoJCQkJCTEwMCUgIHtvcGFjaXR5OiAwfQoJCQkJfQoJCQkJQC1tcy1rZXlmcmFtZXMgZmFkZU91dCB7CgkJCQkJMCUgICAge29wYWNpdHk6IDF9CgkJCQkJMTAwJSAge29wYWNpdHk6IDB9CgkJCQl9CgkJCQkud2ViLXRvYXN0LWtrbGk5ewoJCQkJCXBvc2l0aW9uOiBmaXhlZDsKCQkJCQliYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNyk7CgkJCQkJY29sb3I6ICNmZmY7CgkJCQkJZm9udC1zaXplOiAxNHB4OwoJCQkJCWxpbmUtaGVpZ2h0OiAxOwoJCQkJCXBhZGRpbmc6MTBweDsKCQkJCQlib3JkZXItcmFkaXVzOiAzcHg7CgkJCQkJbGVmdDogNTAlOwoJCQkJCXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKCQkJCQktd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKCQkJCQktbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKCQkJCQktby10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CgkJCQkJLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKCQkJCQl6LWluZGV4OiA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk7CgkJCQkJd2hpdGUtc3BhY2U6IG5vd3JhcDsKCQkJCX0KCQkJCS5mYWRlT3V0ewoJCQkJCWFuaW1hdGlvbjogZmFkZU91dCAuNXM7CgkJCQl9CgkJCQkuZmFkZUluewoJCQkJCWFuaW1hdGlvbjpmYWRlSW4gLjVzOwoJCQkJfQoJCQkJYDsKCQkJdGhpcy5HTWFkZFN0eWxlKGNzc1RleHQpOwoJCX07CgkJdGhpcy53ZWJUb2FzdCA9IGZ1bmN0aW9uKHBhcmFtcykgewkvL+Wwj+aPkOekuuahhgoJCQl2YXIgdGltZSA9IHBhcmFtcy50aW1lOwoJCQl2YXIgYmFja2dyb3VuZCA9IHBhcmFtcy5iYWNrZ3JvdW5kOwoJCQl2YXIgY29sb3IgPSBwYXJhbXMuY29sb3I7CgkJCXZhciBwb3NpdGlvbiA9IHBhcmFtcy5wb3NpdGlvbjsgIC8vY2VudGVyLXRvcCwgY2VudGVyLWJvdHRvbQoJCQl2YXIgZGVmYXVsdE1hcmdpblZhbHVlID0gNTA7CgkJCQoJCQlpZih0aW1lID09IHVuZGVmaW5lZCB8fCB0aW1lID09ICcnKXsKCQkJCXRpbWUgPSAxNTAwOwoJCQl9CgkJCQoJCQl2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCQkJZWwuc2V0QXR0cmlidXRlKCJjbGFzcyIsICJ3ZWItdG9hc3Qta2tsaTkiKTsKCQkJZWwuaW5uZXJIVE1MID0gcGFyYW1zLm1lc3NhZ2U7CgkJCS8v6IOM5pmv6aKc6ImyCgkJCWlmKGJhY2tncm91bmQhPXVuZGVmaW5lZCAmJiBiYWNrZ3JvdW5kIT0nJyl7CgkJCQllbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9YmFja2dyb3VuZDsKCQkJfQoJCQkvL+Wtl+S9k+minOiJsgoJCQlpZihjb2xvciE9dW5kZWZpbmVkICYmIGNvbG9yIT0nJyl7CgkJCQllbC5zdHlsZS5jb2xvcj1jb2xvcjsKCQkJfQoJCQkKCQkJLy/mmL7npLrkvY3nva4KCQkJaWYocG9zaXRpb249PXVuZGVmaW5lZCB8fCBwb3NpdGlvbj09JycpewoJCQkJcG9zaXRpb24gPSAiY2VudGVyLWJvdHRvbSI7CgkJCX0KCQkJCgkJCS8v6K6+572u5pi+56S65L2N572u77yM5b2T5YmN5pyJ56eN5Lik56eN5b2i5byPCgkJCWlmKHBvc2l0aW9uPT09ImNlbnRlci1ib3R0b20iKXsKCQkJCWVsLnN0eWxlLmJvdHRvbSA9IGRlZmF1bHRNYXJnaW5WYWx1ZSsicHgiOyAKCQkJfWVsc2V7CgkJCQllbC5zdHlsZS50b3AgPSBkZWZhdWx0TWFyZ2luVmFsdWUrInB4IjsgCgkJCX0KCQkJZWwuc3R5bGUuekluZGV4PTk5OTk5OTsKCQkJCgkJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWwpOwoJCQllbC5jbGFzc0xpc3QuYWRkKCJmYWRlSW4iKTsKCQkJc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CgkJCQllbC5jbGFzc0xpc3QucmVtb3ZlKCJmYWRlSW4iKTsKCQkJCWVsLmNsYXNzTGlzdC5hZGQoImZhZGVPdXQiKTsKCQkJCS8q55uR5ZCs5Yqo55S757uT5p2f77yM56e76Zmk5o+Q56S65L+h5oGv5YWD57SgKi8KCQkJCWVsLmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmVuZCIsIGZ1bmN0aW9uICgpIHsKCQkJCQlkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGVsKTsKCQkJCX0pOwoJCQkJZWwuYWRkRXZlbnRMaXN0ZW5lcigid2Via2l0QW5pbWF0aW9uRW5kIiwgZnVuY3Rpb24gKCkgewoJCQkJCWRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWwpOwoJCQkJfSk7CgkJCX0sIHRpbWUpOwoJCX07CgkJdGhpcy5xdWVyeVVybFBhcmFtdGVyID0gZnVuY3Rpb24odGV4dCwgdGFnKSB7IC8v5p+l6K+iR0VU6K+35rGCdXJs5Lit55qE5Y+C5pWwCgkJCWlmKHRleHQuaW5kZXhPZigiPyIpIT0tMSl7IC8v6YCJ5Y+WP+WQjumdoueahOWtl+espuS4sizlhbzlrrl3aW5kb3cubG9jYXRpb24uc2VhcmNo77yM5YmN6Z2i55qEP+S4jeiDveWOu+aOiQoJCQkJdmFyIHRleHRBcnJheSA9IHRleHQuc3BsaXQoIj8iKTsKCQkJCXRleHQgPSAiPyIrdGV4dEFycmF5W3RleHRBcnJheS5sZW5ndGgtMV07CgkJCX0KCQkJdmFyIHQgPSBuZXcgUmVnRXhwKCIoXnwmKSIgKyB0YWcgKyAiPShbXiZdKikoJnwkKSIpOwoJCQl2YXIgYSA9IHRleHQuc3Vic3RyKDEpLm1hdGNoKHQpOwoJCQlpZiAoYSAhPSBudWxsKXsKCQkJCXJldHVybiBhWzJdOwoJCQl9CgkJCXJldHVybiAiIjsKCQl9OwoJCXRoaXMuaXNQQyA9IGZ1bmN0aW9uKCl7CgkJCXZhciB1c2VyQWdlbnRJbmZvID0gbmF2aWdhdG9yLnVzZXJBZ2VudDsKCQkJdmFyIEFnZW50cyA9IFsiQW5kcm9pZCIsICJpUGhvbmUiLCJTeW1iaWFuT1MiLCAiV2luZG93cyBQaG9uZSIsICJpUGFkIiwgImlQb2QiXTsKCQkJdmFyIGZsYWcgPSB0cnVlOwoJCQlmb3IgKHZhciB2ID0gMDsgdiA8IEFnZW50cy5sZW5ndGg7IHYrKykgewoJCQkJaWYgKHVzZXJBZ2VudEluZm8uaW5kZXhPZihBZ2VudHNbdl0pID4gMCkgewoJCQkJCWZsYWcgPSBmYWxzZTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gZmxhZzsKCQl9OwoJCXRoaXMuZ2V0QmlsaWJpbGlCVj1mdW5jdGlvbigpewoJCQl2YXIgcGF0aG5hbWUgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7CgkJCXZhciBidiA9IHBhdGhuYW1lLnJlcGxhY2UoIi92aWRlby8iLCIiKS5yZXBsYWNlKCIvIiwiIik7CgkJCXJldHVybiBidjsKCQl9OwoJCXRoaXMuZ2V0U3lzdGVtT1M9ZnVuY3Rpb24oKXsKCQkJdmFyIHUgPSBuYXZpZ2F0b3IudXNlckFnZW50OwoJCQlpZiAoISF1Lm1hdGNoKC9jb21wYXRpYmxlL2kpIHx8IHUubWF0Y2goL1dpbmRvd3MvaSkpIHsKCQkJCXJldHVybiAnd2luZG93cyc7CgkJCX0gZWxzZSBpZiAoISF1Lm1hdGNoKC9NYWNpbnRvc2gvaSkgfHwgdS5tYXRjaCgvTWFjSW50ZWwvaSkpIHsKCQkJCXJldHVybiAnbWFjT1MnOwoJCQl9IGVsc2UgaWYgKCEhdS5tYXRjaCgvaXBob25lL2kpIHx8IHUubWF0Y2goL0lwYWQvaSkpIHsKCQkJCXJldHVybiAnaW9zJzsKCQkJfSBlbHNlIGlmICghIXUubWF0Y2goL2FuZHJvaWQvaSkpIHsKCQkJCXJldHVybiAnYW5kcm9pZCc7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gJ290aGVyJzsKCQkJfQoJCX07CgkJdGhpcy5SUENEb3dubG9hZEZpbGUgPSBmdW5jdGlvbihmaWxlTmFtZSwgdXJsLCBzYXZlUGF0aD0iRDovIiwgUlBDVVJMPSJ3czovL2xvY2FsaG9zdDoxNjgwMC9qc29ucnBjIiwgUlBDVG9rZW49IiIpIHsJCQoJCQljb25zdCBzZWxmID0gdGhpczsKCQkJaWYoIXNhdmVQYXRoKXsKCQkJCXNhdmVQYXRoID0gIkQ6LyI7CgkJCX0KCQkJaWYoIVJQQ1VSTCl7CgkJCQlSUENVUkwgPSAid3M6Ly9sb2NhbGhvc3Q6MTY4MDAvanNvbnJwYyI7CgkJCX0KCQkJbGV0IG9wdGlvbnMgPSB7IC8v5LiL6L296YWN572u5paH5Lu2CgkJCQkiZGlyIjpzYXZlUGF0aCwKCQkJCSJtYXgtY29ubmVjdGlvbi1wZXItc2VydmVyIjogIjE2IiwKCQkJCSJoZWFkZXIiOlsiVXNlci1BZ2VudDoiK25hdmlnYXRvci51c2VyQWdlbnQrIiIsICJDb29raWU6Iitkb2N1bWVudC5jb29raWUrIiIsICJSZWZlcmVyOiIrd2luZG93LmxvY2F0aW9uLmhyZWYrIiJdCgkJCX0KCQkJaWYoISFmaWxlTmFtZSkgewoJCQkJb3B0aW9ucy5vdXQgPSBmaWxlTmFtZTsKCQkJfQoJCQlsZXQganNvblJQQyA9IHsKCQkJCSJqc29ucnBjIjogIjIuMCIsCgkJCQkiaWQiOiAiaHVhaHVhY2F0IiwKCQkJCSJtZXRob2QiOiAiYXJpYTIuYWRkVXJpIiwKCQkJCSJwYXJhbXMiOiBbW3VybF0sIG9wdGlvbnNdLAoJCQl9CgkJCWlmICghIVJQQ1Rva2VuKSB7CgkJCQlqc29uUlBDLnBhcmFtcy51bnNoaWZ0KCJ0b2tlbjoiICsgUlBDVG9rZW4pOyAvLyDlv4XpobvopoHliqDlnKjnrKzkuIDkuKoKCQkJfQoJCQlyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CgkJCQl2YXIgd2ViU29ja2V0ID0gbmV3IFdlYlNvY2tldChSUENVUkwpOwoJCQkJd2ViU29ja2V0Lm9uZXJyb3IgPSBmdW5jdGlvbihldmVudCkgewoJCQkJCWNvbnNvbGUubG9nKCJ3ZWJTb2NrZXQub25lcnJvciIsIGV2ZW50KTsKCQkJCQlyZWplY3QoIkFyaWEy6L+e5o6l6ZSZ6K+v77yM6K+35omT5byAQXJpYTLlkozmo4Dmn6VSUEPorr7nva7vvIEiKTsKCQkJCX0KCQkJCXdlYlNvY2tldC5vbm9wZW4gPSBmdW5jdGlvbigpewoJCQkJCXdlYlNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KGpzb25SUEMpKTsKCQkJCX0KCQkJCXdlYlNvY2tldC5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCl7CgkJCQkJbGV0IHJlc3VsdCA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7CgkJCQkJc3dpdGNoIChyZXN1bHQubWV0aG9kKSB7CgkJCQkJCWNhc2UgImFyaWEyLm9uRG93bmxvYWRTdGFydCI6CgkJCQkJCQlyZXNvbHZlKCJBcmlhMiDlvIDlp4vkuIvovb3jgJAiK2ZpbGVOYW1lKyLjgJEiKTsKCQkJCQkJCXdlYlNvY2tldC5jbG9zZSgpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgImFyaWEyLm9uRG93bmxvYWRDb21wbGV0ZSI6CgkJCQkJCQlicmVhazsKCQkJCQkJZGVmYXVsdDoKCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfSk7CgkJfTsKCQl0aGlzLmdldEVsZW1lbnRPYmplY3QgPSBmdW5jdGlvbihzZWxlY3RvciwgYWxsb3dFbXB0eSA9IHRydWUsIGRlbGF5PTIwMCl7CgkJCXJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpID0+ewoJCQkJbGV0IHRvdGFsRGVsYXkgPSAwOwoJCQkJbGV0IGVsZW1lbnRJbnRlcnZhbCA9IHNldEludGVydmFsKCgpPT57CgkJCQkJaWYodG90YWxEZWxheSA+PSAzMDAwKXsgLy/mgLvlhbHmo4Dmn6Uzc++8jOWmguaenOi/mOaYr+ayoeaJvuWIsO+8jOWImei/lOWbngoJCQkJCQlyZWplY3QoZmFsc2UpOwoJCQkJCQljbGVhckludGVydmFsKGVsZW1lbnRJbnRlcnZhbCk7CgkJCQkJfQoJCQkJCWxldCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CgkJCQkJbGV0IHJlc3VsdCA9IGFsbG93RW1wdHkgPyAhIWVsZW1lbnQgOiAoISFlbGVtZW50ICYmICEhZWxlbWVudC5pbm5lckhUTUwpOwoJCQkJCWlmKHJlc3VsdCl7CgkJCQkJCWNsZWFySW50ZXJ2YWwoZWxlbWVudEludGVydmFsKTsKCQkJCQkJcmVzb2x2ZShlbGVtZW50KTsKCQkJCQl9ZWxzZXsKCQkJCQkJdG90YWxEZWxheSArPSBkZWxheTsKCQkJCQl9CgkJCQl9LCBkZWxheSk7CgkJCX0pOwoJCX07CgkJLyoqCgkJICogQHBhcmFtIHtPYmplY3R9IHRpbWUKCQkgKiBAcGFyYW0ge09iamVjdH0gZm9ybWF0CgkJICog5pe26Ze05qC85byP5YyWCgkJICogRGF0ZUZvcm1hdChuZXcgRGF0ZShkYXRlQ3JlYXRlZCksICJ5eXl5LU1NLWRkIGhoOm1tOnNzIikKCQkgKi8KCQl0aGlzLkRhdGVGb3JtYXQgPSBmdW5jdGlvbih0aW1lLCBmb3JtYXQpIHsKCQkJdmFyIG8gPSB7CgkJCQkiTSsiOiB0aW1lLmdldE1vbnRoKCkgKyAxLCAvL+aciOS7vSAKCQkJCSJkKyI6IHRpbWUuZ2V0RGF0ZSgpLCAvL+aXpSAKCQkJCSJoKyI6IHRpbWUuZ2V0SG91cnMoKSwgLy/lsI/ml7YgCgkJCQkibSsiOiB0aW1lLmdldE1pbnV0ZXMoKSwgLy/liIYgCgkJCQkicysiOiB0aW1lLmdldFNlY29uZHMoKSwgLy/np5IgCgkJCQkicSsiOiBNYXRoLmZsb29yKCh0aW1lLmdldE1vbnRoKCkgKyAzKSAvIDMpLCAvL+Wto+W6piAKCQkJCSJTIjogdGltZS5nZXRNaWxsaXNlY29uZHMoKSAvL+avq+enkiAKCQkJfTsKCQkJaWYoLyh5KykvLnRlc3QoZm9ybWF0KSl7CgkJCQlmb3JtYXQgPSBmb3JtYXQucmVwbGFjZShSZWdFeHAuJDEsICh0aW1lLmdldEZ1bGxZZWFyKCkgKyAiIikuc3Vic3RyKDQgLSBSZWdFeHAuJDEubGVuZ3RoKSk7CgkJCX0KCQkJZm9yKHZhciBrIGluIG8pewoJCQkJaWYobmV3IFJlZ0V4cCgiKCIgKyBrICsgIikiKS50ZXN0KGZvcm1hdCkpewoJCQkJCWZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKFJlZ0V4cC4kMSwgKFJlZ0V4cC4kMS5sZW5ndGggPT0gMSkgPyAob1trXSkgOiAoKCIwMCIgKyBvW2tdKS5zdWJzdHIoKCIiICsgb1trXSkubGVuZ3RoKSkpOwoJCQkJfQoJCQl9CgkJCXJldHVybiBmb3JtYXQ7CgkJfQoJfQoJCgkvL+WFqOWxgOW8ueeql+WvueixoQoJY29uc3QgcG9wdXAgPSAoZnVuY3Rpb24oKXsKCQljbGFzcyBQb3B1cCB7CgkJCWNvbnN0cnVjdG9yKCkgewoJCQkJdGhpcy5tYXNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykKCQkJCXRoaXMuc2V0U3R5bGUodGhpcy5tYXNrLCB7CgkJCQkJIndpZHRoIjogJzEwMCUnLAoJCQkJCSJoZWlnaHQiOiAnMTAwJScsCgkJCQkJImJhY2tncm91bmRDb2xvciI6ICdyZ2JhKDAsIDAsIDAsIC42KScsCgkJCQkJInBvc2l0aW9uIjogJ2ZpeGVkJywKCQkJCQkibGVmdCI6ICIwcHgiLAoJCQkJCSJ0b3AiOiAiMHB4IiwKCQkJCQkiYm90dG9tIjoiMHB4IiwKCQkJCQkicmlnaHQiOiIwcHgiLAoJCQkJCSJ6LWluZGV4IjoiOTk5OTkiCgkJCQl9KQoJCQkJLy8g5Yib5bu65Lit6Ze05pi+56S65YaF5a6555qE5rC05bmz5bm25Z6C55u05bGF5Lit55qEZGl2CgkJCQl0aGlzLmNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKQoJCQkJdGhpcy5zZXRTdHlsZSh0aGlzLmNvbnRlbnQsIHsKCQkJCQkibWF4LXdpZHRoIjogJzQwMHB4JywKCQkJCQkid2lkdGgiOiIxMDAlIiwKCQkJCQkibWF4LWhlaWdodCI6ICc2MDBweCcsCgkJCQkJImJhY2tncm91bmRDb2xvciI6ICcjZmZmJywKCQkJCQkiYm94U2hhZG93IjogJzAgMCAycHggIzk5OScsCgkJCQkJInBvc2l0aW9uIjogJ2Fic29sdXRlJywKCQkJCQkibGVmdCI6ICc1MCUnLAoJCQkJCSJ0b3AiOiAnNTAlJywKCQkJCQkidHJhbnNmb3JtIjogJ3RyYW5zbGF0ZSgtNTAlLC01MCUpJywKCQkJCQkiYm9yZGVyUmFkaXVzIjogJzNweCcKCQkJCX0pCgkJCQkvLyDlsIbov5nkuKrlsI9kaXbmlL7lnKjpga7nvankuK0KCQkJCXRoaXMubWFzay5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnQpCgkJCX0KCQkJbWlkZGxlQm94KHBhcmFtKSB7CgkJCQkvLyDlhYjmuIXnqbrkuK3pl7TlsI9kaXbnmoTlhoXlrrkgLSDpmLLmraLosIPnlKjlpJrmrKHvvIzlh7rnjrDmt7fkubEKCQkJCXRoaXMuY29udGVudC5pbm5lckhUTUwgPSAnJwoJCQkJbGV0IHRpdGxlID0gJ+m7mOiupOagh+mimOWGheWuuSc7CgkJCQkvLyDmo4DmtYvlj4LmlbDnsbvlnosKCQkJCWlmKHt9LnRvU3RyaW5nLmNhbGwocGFyYW0pID09PSAnW29iamVjdCBTdHJpbmddJykgewoJCQkJCXRpdGxlID0gcGFyYW0KCQkJCX0gZWxzZSBpZih7fS50b1N0cmluZy5jYWxsKHBhcmFtKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHsKCQkJCQl0aXRsZSA9IHBhcmFtLnRpdGxlCgkJCQl9CgkJCQkvLyDlsIbpga7nvanmlL7lnKhib2R55Lit5pi+56S6CgkJCQlkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMubWFzaykKCQkJCS8vIOe7meS4remXtOeahOWwj2Rpduiuvue9rum7mOiupOeahOaOkueJiAoJCQkJLy8g5LiK6Z2i5qCH6aKY6YOo5YiGCgkJCQl0aGlzLnRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykKCQkJCS8vIOiuvue9ruagt+W8jwoJCQkJdGhpcy5zZXRTdHlsZSh0aGlzLnRpdGxlLCB7CgkJCQkJIndpZHRoIjogJzEwMCUnLAoJCQkJCSJoZWlnaHQiOiAnNDBweCcsCgkJCQkJImxpbmVIZWlnaHQiOiAnNDBweCcsCgkJCQkJImJveFNpemluZyI6ICdib3JkZXItYm94JywKCQkJCQkiYmFja2dyb3VuZC1jb2xvciI6IiNGRjRENDAiLAoJCQkJCSJjb2xvciI6ICcjRkZGJywKCQkJCQkidGV4dC1hbGlnbiI6ICdjZW50ZXInLAoJCQkJCSJmb250LXdlaWdodCI6IjcwMCIsCgkJCQkJImZvbnQtc2l6ZSI6IjE2cHgiCgkJCQkJCgkJCQl9KQoJCQkJLy8g6K6+572u6buY6K6k5qCH6aKY5YaF5a65CgkJCQl0aGlzLnRpdGxlLmlubmVyVGV4dCA9IHRpdGxlCgkJCQkvLyDlsIbmoIfpopjpg6jliIbmlL7lnKjkuK3pl7RkaXbkuK0KCQkJCXRoaXMuY29udGVudC5hcHBlbmRDaGlsZCh0aGlzLnRpdGxlKQoJCQkJLy8g5YWz6Zet5oyJ6ZKuCgkJCQl0aGlzLmNsb3NlQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykKCQkJCS8vIOiuvue9ruWGheWuuQoJCQkJdGhpcy5jbG9zZUJ0bi5pbm5lclRleHQgPSAnw5cnCgkJCQkvLyDorr7nva7moLflvI8KCQkJCXRoaXMuc2V0U3R5bGUodGhpcy5jbG9zZUJ0biwgewoJCQkJCSJ0ZXh0RGVjb3JhdGlvbiI6ICdub25lJywKCQkJCQkiY29sb3IiOiAnIzY2NicsCgkJCQkJInBvc2l0aW9uIjogJ2Fic29sdXRlJywKCQkJCQkicmlnaHQiOiAnMTBweCcsCgkJCQkJInRvcCI6ICcwcHgnLAoJCQkJCSJmb250U2l6ZSI6ICcyNXB4JywKCQkJCQkiY29sb3IiOiAnI0ZGRicsCgkJCQkJImRpc3BsYXkiOiJpbmxpbmUtYmxvY2siLAoJCQkJCSJjdXJzb3IiOiJwb2ludGVyIgoJCQkJfSkKCQkJCS8vIOWwhuWFs+mXreaMiemSruaUvuWcqOS4remXtOWwj2RpduS4rQoJCQkJdGhpcy50aXRsZS5hcHBlbmRDaGlsZCh0aGlzLmNsb3NlQnRuKQoJCQkJdGhpcy5jbG9zZUJ0bi5vbmNsaWNrID0gKCkgPT4gdGhpcy5jbG9zZSgpCgkJCX0KCQkJLy8g5by55Ye65o+Q56S65qGGCgkJCWRpYWxvZyhwYXJhbSkgewoJCQkJdGhpcy5taWRkbGVCb3gocGFyYW0pOwoJCQkJdGhpcy5kaWFsb2dDb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykKCQkJCXRoaXMuc2V0U3R5bGUodGhpcy5kaWFsb2dDb250ZW50LHsKCQkJCQkicGFkZGluZyI6IjE1cHgiLAoJCQkJCSJtYXgtaGVpZ2h0IjoiNDAwcHgiCgkJCQl9KQoJCQkJdGhpcy5kaWFsb2dDb250ZW50LmlubmVySFRNTCA9IHBhcmFtLmNvbnRlbnQ7CgkJCQl0aGlzLmNvbnRlbnQuYXBwZW5kQ2hpbGQodGhpcy5kaWFsb2dDb250ZW50KQoJCQkJcGFyYW0ub25Db250ZW50UmVhZHkodGhpcyk7CgkJCX0KCQkJY2xvc2UoKSB7CgkJCQlkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRoaXMubWFzaykKCQkJCXdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKCQkJfQoJCQlzZXRTdHlsZShlbGUsIHN0eWxlT2JqKSB7IC8vIOiuvue9ruagt+W8j+eahOWHveaVsAoJCQkJZm9yKGxldCBhdHRyIGluIHN0eWxlT2JqKXsKCQkJCQllbGUuc3R5bGVbYXR0cl0gPSBzdHlsZU9ialthdHRyXQoJCQkJfQoJCQl9CgkJfQoJCWxldCBwb3B1cCA9IG51bGw7CgkJcmV0dXJuIChmdW5jdGlvbigpIHsKCQkJaWYoIXBvcHVwKSB7CgkJCQlwb3B1cCA9IG5ldyBQb3B1cCgpCgkJCX0KCQkJcmV0dXJuIHBvcHVwOwoJCX0pKCkKCX0pKCk7CgkKCS8v6Kej5p6Q5o6l5Y+j6YWN572uCgkvL3Nob3dUeXBlPTEo5LuFUEMpLCBzaG93VHlwZT0yKOS7hW1vYmlsZSksIHNob3dUeXBlPTMo5ZCM5pe25pi+56S6KQoJY29uc3Qgb3JpZ2luYWxJbnRlcmZhY2VMaXN0ID0gWwoJCQoJXTsKCQoJLy/lhajlsYDnu5/kuIDmlrnms5Xlr7nosaEKCWNvbnN0IGNvbW1vbkZ1bmN0aW9uT2JqZWN0ID0gbmV3IGNvbW1vbkZ1bmN0aW9uKCk7IAoJY29tbW9uRnVuY3Rpb25PYmplY3QuYWRkQ29tbW9uSHRtbENzcygpOwkvL+e7n+S4gGh0bWzjgIFjc3PlhYPntKDmt7vliqAKCS8v57uf5LiA5o6l5Y+jCglsZXQgbmV3T3JpZ2luYWxJbnRlcmZhY2VMaXN0ID0gb3JpZ2luYWxJbnRlcmZhY2VMaXN0OwoJCgkvL+ebuOWFs+WKn+iDveWFs+mXreaOp+WItgoJbGV0IGZ1bmN0aW9uQ29udHJvbGxlcj0gY29tbW9uRnVuY3Rpb25PYmplY3QuR01nZXRWYWx1ZSgic2V0aW5nRGF0YSIpOwoJaWYoIWZ1bmN0aW9uQ29udHJvbGxlcil7CgkJZnVuY3Rpb25Db250cm9sbGVyPXsKCQkJImJpbGliaWxpSGVscGVyIjp0cnVlLCJzdXBlclZpZGVvSGVscGVyIjp0cnVlLCJhYnJvYWRWaWRlb0hlbHBlciI6dHJ1ZSwKCQkJInNlYXJjaEVuZ2luZXNOYXZpZ2F0aW9uIjp0cnVlLCJ6aGlodUhlbHBlciI6dHJ1ZSwKCQkJInNob3J0VmlkZW9Eb3dubG9hZCI6dHJ1ZQoJCX0KCX0JCgkvL+eUqOaIt+WKn+iDveiuvue9ruWHveaVsAoJZnVuY3Rpb24gdXNlcnNTZXRpbmcoKXsKCQl2YXIgYmlsaWJpbGlIZWxwZXI9dHJ1ZSwgc3VwZXJWaWRlb0hlbHBlcj10cnVlLCBhYnJvYWRWaWRlb0hlbHBlcj10cnVlLCAKCQlzZWFyY2hFbmdpbmVzTmF2aWdhdGlvbj10cnVlLCB6aGlodUhlbHBlcj10cnVlLCBzaG9ydFZpZGVvRG93bmxvYWQ9dHJ1ZTsKCQl2YXIgaXNVcGRhdGVTdG9yYWdlID0gZmFsc2U7CgkJaWYoIWZ1bmN0aW9uQ29udHJvbGxlci5oYXNPd25Qcm9wZXJ0eSgiYmlsaWJpbGlIZWxwZXIiKSl7CgkJCWZ1bmN0aW9uQ29udHJvbGxlci5iaWxpYmlsaUhlbHBlciA9IHRydWU7CgkJCWlzVXBkYXRlU3RvcmFnZSA9IHRydWU7CgkJfWVsc2V7CgkJCWJpbGliaWxpSGVscGVyID0gZnVuY3Rpb25Db250cm9sbGVyLmJpbGliaWxpSGVscGVyOwoJCX0KCQlpZighZnVuY3Rpb25Db250cm9sbGVyLmhhc093blByb3BlcnR5KCJzdXBlclZpZGVvSGVscGVyIikpewoJCQlmdW5jdGlvbkNvbnRyb2xsZXIuc3VwZXJWaWRlb0hlbHBlciA9IHRydWU7CgkJCWlzVXBkYXRlU3RvcmFnZSA9IHRydWU7CgkJfWVsc2V7CgkJCXN1cGVyVmlkZW9IZWxwZXIgPSBmdW5jdGlvbkNvbnRyb2xsZXIuc3VwZXJWaWRlb0hlbHBlcjsKCQl9CgkJaWYoIWZ1bmN0aW9uQ29udHJvbGxlci5oYXNPd25Qcm9wZXJ0eSgiYWJyb2FkVmlkZW9IZWxwZXIiKSl7CgkJCWZ1bmN0aW9uQ29udHJvbGxlci5hYnJvYWRWaWRlb0hlbHBlciA9IHRydWU7CgkJCWlzVXBkYXRlU3RvcmFnZSA9IHRydWU7CgkJfWVsc2V7CgkJCWFicm9hZFZpZGVvSGVscGVyID0gZnVuY3Rpb25Db250cm9sbGVyLmFicm9hZFZpZGVvSGVscGVyOwoJCX0KCQlpZighZnVuY3Rpb25Db250cm9sbGVyLmhhc093blByb3BlcnR5KCJzZWFyY2hFbmdpbmVzTmF2aWdhdGlvbiIpKXsKCQkJZnVuY3Rpb25Db250cm9sbGVyLnNlYXJjaEVuZ2luZXNOYXZpZ2F0aW9uID0gdHJ1ZTsKCQkJaXNVcGRhdGVTdG9yYWdlID0gdHJ1ZTsKCQl9ZWxzZXsKCQkJc2VhcmNoRW5naW5lc05hdmlnYXRpb24gPSBmdW5jdGlvbkNvbnRyb2xsZXIuc2VhcmNoRW5naW5lc05hdmlnYXRpb247CgkJfQoJCWlmKCFmdW5jdGlvbkNvbnRyb2xsZXIuaGFzT3duUHJvcGVydHkoInpoaWh1SGVscGVyIikpewoJCQlmdW5jdGlvbkNvbnRyb2xsZXIuemhpaHVIZWxwZXIgPSB0cnVlOwoJCQlpc1VwZGF0ZVN0b3JhZ2UgPSB0cnVlOwoJCX1lbHNlewoJCQl6aGlodUhlbHBlciA9IGZ1bmN0aW9uQ29udHJvbGxlci56aGlodUhlbHBlcjsKCQl9CgkJaWYoIWZ1bmN0aW9uQ29udHJvbGxlci5oYXNPd25Qcm9wZXJ0eSgic2hvcnRWaWRlb0Rvd25sb2FkIikpewoJCQlmdW5jdGlvbkNvbnRyb2xsZXIuc2hvcnRWaWRlb0Rvd25sb2FkID0gdHJ1ZTsKCQkJaXNVcGRhdGVTdG9yYWdlID0gdHJ1ZTsKCQl9ZWxzZXsKCQkJc2hvcnRWaWRlb0Rvd25sb2FkID0gZnVuY3Rpb25Db250cm9sbGVyLnNob3J0VmlkZW9Eb3dubG9hZDsKCQl9CgkJaWYoaXNVcGRhdGVTdG9yYWdlKXsKCQkJY29tbW9uRnVuY3Rpb25PYmplY3QuR01zZXRWYWx1ZSgic2V0aW5nRGF0YSIsZnVuY3Rpb25Db250cm9sbGVyKTsKCQl9CgkJdmFyIHNldGluZ0RhdGE9WwoJCQl7InRhZyI6ImJpbGliaWxpSGVscGVyIiwgIm5hbWUiOiJC56uZ5L2/55So5Yqp5omLKOinhumikeS4i+i9veaUr+aMgeaJuemHj+OAgea1j+iniOiusOW9leOAgeS4gOmUruS4iei/nikiLCAiY2hlY2tlZCI6YmlsaWJpbGlIZWxwZXJ9LAoJCQl7InRhZyI6InpoaWh1SGVscGVyIiwgIm5hbWUiOiLnn6XkuY7kvb/nlKjliqnmiYso5YaF5a655qCH6K+G44CB6Zeu562U5pi+56S65LyY5YyW44CB6KeG6aKR5LiL6L29562JKSIsICJjaGVja2VkIjp6aGlodUhlbHBlcn0sCgkJCXsidGFnIjoic3VwZXJWaWRlb0hlbHBlciIsICJuYW1lIjoi5YWo572RVklQ6KeG6aKR6Kej5p6QKOaUr+aMgeeIseWlh+iJuuOAgeiFvuiur+inhumikeOAgULnq5nnlarliafnrYkpIiwgImNoZWNrZWQiOnN1cGVyVmlkZW9IZWxwZXJ9LAoJCQl7InRhZyI6InNob3J0VmlkZW9Eb3dubG9hZCIsICJuYW1lIjoi55+t6KeG6aKR5Y675rC05Y2w5LiL6L29KOaUr+aMgeaKlumfs+OAgeW/q+aJi+etiSkiLCAiY2hlY2tlZCI6c2hvcnRWaWRlb0Rvd25sb2FkfSwKCQkJeyJ0YWciOiJhYnJvYWRWaWRlb0hlbHBlciIsICJuYW1lIjoi5Zu95aSW6KeG6aKR6Kej5p6Q5LiL6L29KOaUr+aMgeayueeuoeOAgUZhY2Vib29r562JKSIsICJjaGVja2VkIjphYnJvYWRWaWRlb0hlbHBlcn0sCgkJCXsidGFnIjoic2VhcmNoRW5naW5lc05hdmlnYXRpb24iLCAibmFtZSI6IuaQnOe0ouW8leaTjui1hOa6kOWvvOiIqijpgILphY3nmb7luqbjgIEzNjDjgIHmkJzni5fjgIHlv4XlupTnrYkpIiwgImNoZWNrZWQiOnNlYXJjaEVuZ2luZXNOYXZpZ2F0aW9ufSwKCQldCgkJdmFyIGNvbnRlbnQgPSAiIjsKCQlmb3IodmFyIGk9MDsgaTxzZXRpbmdEYXRhLmxlbmd0aDtpKyspewoJCQl2YXIgb25lID0gc2V0aW5nRGF0YVtpXTsKCQkJY29udGVudCArPSBgCgkJCQk8ZGl2IHN0eWxlPSJwYWRkaW5nOiA1cHggMHB4OyI+CgkJCQkJPGlucHV0IHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDogMTVweDtoZWlnaHQ6IDE1cHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IC13ZWJraXQtYXBwZWFyYW5jZTpjaGVja2JveDttYXJnaW4tYm90dG9tOiAzcHg7Y3Vyc29yOiBwb2ludGVyOyIgbmFtZT0iQ2hlY2tib3giIHR5cGU9ImNoZWNrYm94IiBkYXRhLXRhZz0iYCtvbmUudGFnK2AiIGArKG9uZS5jaGVja2VkID8gImNoZWNrZWQiIDogIiIpK2A+CgkJCQkJPGxhYmVsIHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6IDE0cHg7bWFyZ2luOjNweCAwO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Zm9udC13ZWlnaHQ6NTAwO2NvbG9yOiMwMDA7Ij5gK29uZS5uYW1lK2A8L2xhYmVsPgoJCQkJPC9kaXY+CgkJCWAKCQl9CgkJcG9wdXAuZGlhbG9nKHsKCQkJInRpdGxlIjoi5Yqf6IO95byA5YWzIiwKCQkJImNvbnRlbnQiOmNvbnRlbnQsCgkJCSJvbkNvbnRlbnRSZWFkeSI6ZnVuY3Rpb24oJHRoYXQpewoJCQkJJHRoYXQuZGlhbG9nQ29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFt0eXBlPSdjaGVja2JveCddIikuZm9yRWFjaChmdW5jdGlvbihjaGVja2JveCl7CgkJCQkJY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbihlKXsKCQkJCQkJdmFyIHRhZyA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgiZGF0YS10YWciKTsKCQkJCQkJdmFyIGNoZWNrZWQgPSBlLnRhcmdldC5jaGVja2VkOwoJCQkJCQlmdW5jdGlvbkNvbnRyb2xsZXJbdGFnXSA9IGNoZWNrZWQ7CgkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNc2V0VmFsdWUoInNldGluZ0RhdGEiLGZ1bmN0aW9uQ29udHJvbGxlcik7CgkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LndlYlRvYXN0KHsibWVzc2FnZSI6IuaTjeS9nOaIkOWKnyIsICJiYWNrZ3JvdW5kIjoiI0ZGNEQ0MCJ9KTsKCQkJCQl9KTsKCQkJCX0pCgkJCX0KCQl9KTsKCX0KCQoJLy8g6I+c5Y2V5oyJ6ZKu5by55qGGCglpZihjb21tb25GdW5jdGlvbk9iamVjdC5pc1BDKCkpewoJCUdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoIuWKn+iDveW8gOWFsyIsKCk9PnVzZXJzU2V0aW5nKCkpOwoJfWVsc2V7CgkJZnVuY3Rpb25Db250cm9sbGVyLmJpbGliaWxpSGVscGVyID0gZmFsc2U7CgkJZnVuY3Rpb25Db250cm9sbGVyLmFicm9hZFZpZGVvSGVscGVyID0gZmFsc2U7CgkJZnVuY3Rpb25Db250cm9sbGVyLnNlYXJjaEVuZ2luZXNOYXZpZ2F0aW9uID0gZmFsc2U7CgkJZnVuY3Rpb25Db250cm9sbGVyLnpoaWh1SGVscGVyID0gZmFsc2U7Cgl9CgkKCS8qKgoJICog6LaF57qn6Kej5p6Q5Yqp5omL5Yqf6IO9CgkgKiAKCSAqIOWOn+S7o+eggeS9nOiAhe+8muWwj+iJvueJuQoJICog6ISa5pys5Zyw5Z2A77yaaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzQwNzg0NwoJICog6KeG6aKR6Kej5p6Q5o6l5Y+j5p2l6Ieq77yM5L2c6ICF77ya5oeS5ZOI5ZOICgkgKiDohJrmnKzlnLDlnYDvvJpodHRwczovL2dyZWFzeWZvcmsub3JnL3poLUNOL3NjcmlwdHMvMzcwNjM0CgkgKiDpgbXlvqpBR1BMIExpY2Vuc2XlvIDmupDljY/orq4KCSAqLwoJZnVuY3Rpb24gc3VwZXJWaWRlb0hlbHBlcihvcmlnaW5hbEludGVyZmFjZUxpc3QpewoJCXRoaXMub3JpZ2luYWxJbnRlcmZhY2VMaXN0ID0gb3JpZ2luYWxJbnRlcmZhY2VMaXN0OwoJCXRoaXMuZWxlbWVudElkID0gTWF0aC5jZWlsKE1hdGgucmFuZG9tKCkqMTAwMDAwMDAwKSsibW14IjsKCQl0aGlzLmN1c3RvbUludGVyZmFjZUtleSA9ICJjdXN0b21faW50ZXJmYWNlX2tleV9kZGRzZHh4YSI7CgkJdGhpcy5xdWlja2x5SW50ZXJmYWNlS2V5ID0gImN1c3RvbV9xdWlja2x5X2ludGVyZmFjZV9rZXlfZGRkc2R4eGEiOwoJCXRoaXMuZGVmYXVsdFF1aWNrbHlJbnRlcmZhY2VJbmRleCA9IDE7CgkJdGhpcy5pc1J1biA9IGZ1bmN0aW9uKCl7IC8v5Yik5pat5piv5ZCm6L+Q6KGMCgkJCWNvbnN0IGhvc3QgPSB3aW5kb3cubG9jYXRpb24uaG9zdDsKCQkJY29uc3QgdXJscyA9IFsid3d3LmlxaXlpLmNvbSIsInYucXEuY29tIiwieW91a3UuY29tIiwgInd3dy5sZS5jb20iLCJtZ3R2LmNvbSIsInNvaHUuY29tIiwgImFjZnVuLmNuIiwiYmlsaWJpbGkuY29tIiwKCQkJCSJiYW9mZW5nLmNvbSIsInBwdHYuY29tIiwiMTkwNS5jb20iLCJtaWd1dmlkZW8uY29tIiwic3BvcnRzLmlxaXlpLmNvbSJdOwoJCQl2YXIgcmVzdWx0ID0gZmFsc2U7CgkJCWlmKCFob3N0LnN0YXJ0c1dpdGgoIm0uIikpeyAvL+S4jeaYr+enu+WKqOerr+aJp+ihjAoJCQkJZm9yKHZhciBpPTA7IGk8dXJscy5sZW5ndGg7aSsrKXsgLy/kuI3mmK9C56uZ55u05o6l5Yik5patCgkJCQkJaWYod2luZG93LmxvY2F0aW9uLmhvc3QuaW5kZXhPZigiYmlsaWJpbGkuY29tIik9PS0xKXsKCQkJCQkJaWYod2luZG93LmxvY2F0aW9uLmhvc3QuaW5kZXhPZih1cmxzW2ldKSE9LTEpewoJCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfWVsc2V7CgkJCQkJCWlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoInd3dy5iaWxpYmlsaS5jb20vYmFuZ3VtaS9wbGF5IikhPS0xKXsgLy/mmK9C56uZ5Y+q5pyJ55Wq5Ymn5omN5byA5ZCvVklQ6Kej5p6QCgkJCQkJCQlyZXN1bHQgPSB0cnVlOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHJlc3VsdDsKCQl9OwoJCXRoaXMuc2hvd1BsYXllcldpbmRvdyA9IGZ1bmN0aW9uKHBsYXlPYmplY3QpewkvL+aYvuekuuaSreaUvueql+WPowoJCQl2YXIgdXJsID0gcGxheU9iamVjdC51cmwgKyB3aW5kb3cubG9jYXRpb24uaHJlZjsKCQkJY29tbW9uRnVuY3Rpb25PYmplY3QuR01vcGVuSW5UYWIodXJsKTsKCQl9OwoJCXRoaXMuYW5hbHlzaXNDdXN0b21JbnRlcmZhY2UgPSBmdW5jdGlvbigpeyAvL+iHquWumuS5ieaOpeWPo+ino+aekAoJCQl2YXIgY3VzdG9tSW50ZXJmYWNlID0gY29tbW9uRnVuY3Rpb25PYmplY3QuR01nZXRWYWx1ZSh0aGlzLmN1c3RvbUludGVyZmFjZUtleSwiIik7CgkJCWlmKCEhY3VzdG9tSW50ZXJmYWNlKXsKCQkJCXRyeXsKCQkJCQl2YXIgY3VzdG9taXplSW50ZXJmYWNlTGlzdCA9IG5ldyBBcnJheSgpOwoJCQkJCXZhciBhbmFseXNpc0FycmF5ID0gY3VzdG9tSW50ZXJmYWNlLnNwbGl0KCJcbiIpOwoJCQkJCWZvcih2YXIgaT0wO2k8YW5hbHlzaXNBcnJheS5sZW5ndGg7aSsrKXsKCQkJCQkJdmFyIG9uZVBpZWNlID0gYW5hbHlzaXNBcnJheVtpXTsKCQkJCQkJaWYoISFvbmVQaWVjZSAmJiBvbmVQaWVjZS5pbmRleE9mKCIsIikhPS0xKXsKCQkJCQkJCXZhciBvbmVQaWVjZUFycmF5ID0gb25lUGllY2Uuc3BsaXQoIiwiKTsgCgkJCQkJCQkKCQkJCQkJCWlmKG9uZVBpZWNlQXJyYXkubGVuZ3RoPT0yICYmICEhb25lUGllY2VBcnJheVswXSAmJiAvKGh0dHB8aHR0cHMpOlwvXC9cUyovLnRlc3Qob25lUGllY2VBcnJheVsxXSkpewoJCQkJCQkJCWN1c3RvbWl6ZUludGVyZmFjZUxpc3QucHVzaCh7Im5hbWUiOiIiK29uZVBpZWNlQXJyYXlbMF0rIiIsInVybCI6IiIrb25lUGllY2VBcnJheVsxXSsiIiwgInNob3dUeXBlIjoxfSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQkJdGhpcy5vcmlnaW5hbEludGVyZmFjZUxpc3QgPSBjdXN0b21pemVJbnRlcmZhY2VMaXN0LmNvbmNhdCh0aGlzLm9yaWdpbmFsSW50ZXJmYWNlTGlzdCk7CgkJCQl9Y2F0Y2goZSl7fQoJCQl9CgkJfTsKCQl0aGlzLmdldFF1aWNrbHlJbnRlcmZhY2VJbmRleCA9IGZ1bmN0aW9uKCl7CgkJCXZhciBxdWlja2x5SW50ZXJmYWNlSW5kZXhTdHJpbmcgPSBjb21tb25GdW5jdGlvbk9iamVjdC5HTWdldFZhbHVlKHRoaXMucXVpY2tseUludGVyZmFjZUtleSwiIikrIiI7CgkJCXZhciBxdWlja2x5SW50ZXJmYWNlSW5kZXggPSB0aGlzLmRlZmF1bHRRdWlja2x5SW50ZXJmYWNlSW5kZXg7CgkJCWlmKCEhcXVpY2tseUludGVyZmFjZUluZGV4U3RyaW5nKXsKCQkJCXF1aWNrbHlJbnRlcmZhY2VJbmRleCA9IHBhcnNlSW50KHF1aWNrbHlJbnRlcmZhY2VJbmRleFN0cmluZyk7CgkJCX0KCQkJaWYodGhpcy5vcmlnaW5hbEludGVyZmFjZUxpc3QubGVuZ3RoLTE8cXVpY2tseUludGVyZmFjZUluZGV4KXsKCQkJCXF1aWNrbHlJbnRlcmZhY2VJbmRleCA9IHRoaXMuZGVmYXVsdFF1aWNrbHlJbnRlcmZhY2VJbmRleDsKCQkJfQoJCQlyZXR1cm4gcXVpY2tseUludGVyZmFjZUluZGV4OwoJCX07CgkJdGhpcy5hZGRIdG1sRWxlbWVudHMgPSBmdW5jdGlvbigpeyAgLy/mt7vliqBIVE1MCgkJCWNvbnN0IHZpcFZpZGVvSW1hZ2VCYXNlNjQgPSAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEQUFBQUF3Q0FZQUFBQlhBdm1IQUFBQzlrbEVRVlJvUSsyWlBXZ1ZRUkRILzcvQ1dxT0lZT0ZIRmJSU2pKaEdNR0RwQnlvSWFnbzcwY3F2VXRRZ2RpcFdGcWF3TVdnaEdJaWRoY0hLUUFKcUVVUkJSZkVEMUNDQ2pjM0lQdTRlbTMxNzc1SjdkM204Y0F0WDNPN3N6UDduUHpzeng2RWVIL1Q0K1ZVRDZEYURUUWJNYkUrM0Q3TVkrOENra3c4QlBGdU1raTdLRHRVQXV1aDlaM29aTXRCbGp4WTJYOWVCd3E0cmFXUE5RRW1PTEt4bStUQmdacXNrblExZEFWek5jbytaaFdzbTZaYWtIWkxDMW1ReXJaNU9YMlJ2ek14blNhOGx6UUovWXdMekdEQ3plNUpPZW9JL2diVnRBTXhKNnZQVzd3S25rcjRxYkV1YXhjY0RjR1dCc2ZOVjBtak1tU0dBZzVMR0E2WGJnRmVoSVRQYkxlbDVNTjg0WkFVQVVqTVBnV08relpZN1lHYnZKVzBPdlJvQjhFalNFVzkrQmhoSXZPdkNwMHdHZlBQYmdaZnBSQXpBVFVubjU2R0VtSnlMZDM5Y0JOeGVGOTlGQURUYTQyQnNrdVFlZjR3RGg5b0IyQ1hwUmJEcE1QQTRuVE96MDVMdUJETHJnVytkQUFDR0lreGZrSFREbS84RHJNd0VrQnhnT3Nra3Fkd0VjTUFENEdMZjNZRjBQQUNPZSt1RkdNZ0E0Qmo0RUFBYkFHYmNYTFFPbU5rbFNkZUNUUnVCVDJiV0wrbE5zTFlmZUZJUmdIMlNKZ0o3R3dDWFlqTUJySmIwSzlqVWlIRXpHNUYwMlZ1YkE5YjRza1h2UU1pQW1XMlZkRlNTbjI0L0FzMGtrMW1KemV5cHBMM2V3YWFCbldZMksybUxOejhTNXVlQ0FNTHd6M3EvRFp4cmV3ZVNlM0JDMHYxQWk3dGtZWHJzQjk2V3dNQkNBZlFCdjNNQkpDRCtTVnJoYVhhWjU0ejNQZ1VNaHBZclpLQ0Y3YmJObkprNUJod1Q2ZmdoeVc4dGhvR3hpZ0U0bXk2dFh3ZW1RbHQ1QUdJMW9hbURTSUZMbUN1VVJpVzVCT0dQTDhDN2RyR1YyMDZiMlhkSjZ5Skt4b0RobVBLQ0llUzYxWlpDbG5jeEZnTEF0Y3l4cm5Fd1Jta25ERlFGSUZZVFduSi9DVm1vR2dZU2o3WjgxT1I4NkxnN3NPZ1Btblk2czBJcE40VHlZckRiNnpXQW1vRU9QVkNIVUljTzdIaDcvWWVtWXhjV1U3QU1mM0JrTkdERi9GUDlya3dHcWpkZGtvV1d2NVFsNlYxeU5YVWRXSEtYQndaN25vSC9kUCtIUU5xaGVUb0FBQUFBU1VWT1JLNUNZSUk9IjsKCQkJY29uc3QgcXVpY2tseUJhc2U2NCA9ICJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNBQUFBQWdDQVlBQUFCemVucjBBQUFBQVhOU1IwSUFyczRjNlFBQUF2MUpSRUZVV0VmRmwwMklWV1VZeDM5L0VEZEtvQ2lDR1lxdXhOdzQwNFFMK3dBL3dJVWZBNWx1TW90azBqR29pRFFGdjFvTXFDQ09Ga1lRdG9wY3pLeE1Hc1VVRjJiTktzV0ZLQnJvSnRMSTJxandsK2R5N3VWNDdqbm5ubnRueWdjT0Y5N25mZDcvNzc3bmZaN25QZUlabThaYjMvWnNZQkV3RTVnRnpBR21BWDhsejkvQUEwbDdRbnZjQUd3dkJkNEUxZ09USy95eHZRRXhaZ0RiYndIdkFxOVVFRTFQT1N6cHd6RUIyRDRLYkcxVHVENzlHMG52ZEF4ZysyZWdwMFB4Q0J1UzFOc1JnRzJQUWJnZWVsYlMwcllCYko4RFhpc0F1QWRjQjJZa3A3K004enRKR3lvRDJINEorQXhZVTdEcW9LUVA2ajdiMjRBakpRUURrbmFVQXRpZUR2UW16L0tTeFVZa05mbHR4MDdGanVWWnY2UmpoUUMyMXdJSGdIa1YzdmMyU1pFUlRXYjdkK0NGSEZldnBLRmNBTnZ2QTE5VUVLNVBXU25waHdLQVM4RExHZDgvd0l1U2JqY0IySTRTdWJzTjhaajZpYVNEQlFCL0FsTXp2cThsdlJkalR3RWs1WFNrVGZIYWRFbDVmeVlPWVJ6R3JDMlRkT1lwQU52ZHdDK2RpS2RpdGdOWGt4UmNCU3pMV2UrQ3BGZnI0dzFxMjFlQUJabUF4OERGa3J6dmhIZWpwRy96QVBxU2JoYUN0VWZTdjdZSGdFODdVY3FKT1NhcFB6MWVxUkRaL2g1NFk0d1FseVZsczZINmZjRDJyMEJYcHhCNWg3UXBDMW90Ymp0cS9aUlc4ekwrbnlTOVhoVFRxaFIzU1JwTkI5dStrMXkzcW5BTVM0cUtXbWhGbFhBbHNDL1o4bHZBaWZvZExsYXlQUXlzcmtEUUk2azB0Zk9LeDBUZ0dqQTNJN0JPMHNuNm1PMUR3RWNsRUQ5S1d0RUtNZy9nT0xBNUovQ3VwT2N6cnlOMmFVbEJuZWlURkd1VldyWVVSNnBGeWhWWmQ4NlplQVJNeUFUY0FCWkwrcU15Z08wNDNlZUJoUVZCbzVLaVhEZk05aVFnT2x2V2FxMjJsWGo0MDZYNGMyQm5RZEROYUNxU1RtVUE0aDJmenNSc2tmUmxGZkVHZ08zNVFQVHQ1M0lDdjByRUgyWjl0dmNEdTFManRZK05xdUpwZ0xoOHhDVWtiYjhCKzlNblB3Y2dmVUZ0dE5oT0FOSUx4YmZiSUhCSTB2Mnl4V3gvREd3QzNwWVVwYnB0cTUyQjVCWVVQVHJ5UDI2MzhmdS9XS1Z1K0YrU1BBRzdsL3doNE5zSk9RQUFBQUJKUlU1RXJrSmdnZz09IjsKCQkJY29uc3QgY3VycmVudEhvc3QgPSB3aW5kb3cubG9jYXRpb24uaG9zdDsKCQkJCgkJCWNvbnN0IHF1aWNrbHlJbnRlcmZhY2VJbmRleCA9IHRoaXMuZ2V0UXVpY2tseUludGVyZmFjZUluZGV4KCk7CgkJCXZhciBjdXJyZW50UXVpY2tseUludGVyZmFjZU9iamVjdCA9IG51bGw7CgkJCQoJCQl2YXIgY2F0ZWdvcnlfMV9odG1sID0gIiI7CgkJCXRoaXMub3JpZ2luYWxJbnRlcmZhY2VMaXN0LmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7CgkJCQlpZihpdGVtLnNob3dUeXBlICE9IDIpewoJCQkJCXZhciBzZWxlY3RlZCA9ICIiCgkJCQkJaWYoaW5kZXg9PXF1aWNrbHlJbnRlcmZhY2VJbmRleCl7CgkJCQkJCXNlbGVjdGVkID0gInNlbGVjdGVkIjsKCQkJCQkJY3VycmVudFF1aWNrbHlJbnRlcmZhY2VPYmplY3QgPSAgaXRlbTsKCQkJCQl9CgkJCQkJY2F0ZWdvcnlfMV9odG1sICs9ICI8c3BhbiB0aXRsZT0nIitpdGVtLm5hbWUrIicgZGF0YS1pbmRleD0nIitpbmRleCsiJyBjbGFzcz0nIitzZWxlY3RlZCsiJz4iICsgaXRlbS5uYW1lICsgIjwvc3Bhbj4iOwoJCQkJfQoJCQl9KTsKCQkJCgkJCS8v6I635b6X6Ieq5a6a5LmJ5L2N572uCgkJCXZhciBsZWZ0ID0gMDsKCQkJdmFyIHRvcCA9IDEyMDsKCQkJdmFyIFBvc2l0aW9uID0gY29tbW9uRnVuY3Rpb25PYmplY3QuR01nZXRWYWx1ZSgiUG9zaXRpb25fIiArIGN1cnJlbnRIb3N0KTsKCQkJaWYoISFQb3NpdGlvbil7CgkJCQlsZWZ0ID0gUG9zaXRpb24ubGVmdDsKCQkJCXRvcCA9IFBvc2l0aW9uLnRvcDsKCQkJfQoJCQl2YXIgY29sb3IgPSAiI0ZGNEQ0MCI7CgkJCXZhciBob3ZlckNvbG9yID0gIiMwMDAwMDAiOwoJCQlpZihjdXJyZW50SG9zdC5pbmRleE9mKCJiaWxpYmlsaS5jb20iKSE9LTEpeyAvL+iHquWumuS5ieS4u+mimAoJCQkJY29sb3IgPSAiI2ZiNzI5OSI7CgkJCQlob3ZlckNvbG9yID0gIiMwMEIwRTEiOwoJCQl9CgkJCXZhciBjc3NNb3VsZCA9IGAjdmlwX21vdmllX2JveGArdGhpcy5lbGVtZW50SWQrYHtjdXJzb3I6cG9pbnRlcjsgcG9zaXRpb246Zml4ZWQ7IHRvcDpgICsgdG9wICsgYHB4OyBsZWZ0OmAgKyBsZWZ0ICsgYHB4OyB3aWR0aDowcHg7IHotaW5kZXg6OTk5OTk5OTk7IGZvbnQtc2l6ZToxNnB4OyB0ZXh0LWFsaWduOmxlZnQ7fQoJCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLmltZ19ib3hgK3RoaXMuZWxlbWVudElkK2B7d2lkdGg6MjRweDsgaGVpZ2h0OjMycHg7bGluZS1oZWlnaHQ6MzJweDt0ZXh0LWFsaWduOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOmArY29sb3IrYDt9CgkJCQkJCQkjdmlwX21vdmllX2JveGArdGhpcy5lbGVtZW50SWQrYCAuaW1nX2JveGArdGhpcy5lbGVtZW50SWQrYDpob3ZlcnsKCQkJCQkJCQliYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMzBkZWcsICMyYTY2ZmYgNDAlLCBgK2NvbG9yK2ApOwoJCQkJCQkJfQoJCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLmltZ19ib3hgK3RoaXMuZWxlbWVudElkK2A+aW1nIHt3aWR0aDoyMHB4OyBkaXNwbGF5OmlubGluZS1ibG9jazsgdmVydGljYWwtYWxpZ246bWlkZGxlO30KCQkJCQkJCQoJCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLnNob3doaWRlX2JveGArdGhpcy5lbGVtZW50SWQrYHtkaXNwbGF5Om5vbmU7cGFkZGluZy1sZWZ0OjVweDtwb3NpdGlvbjogYWJzb2x1dGU7bGVmdDogMjRweDt0b3A6IDA7fQoJCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLnZpcF9tb2RfYm94X2FjdGlvbl82ODdpaXt3aWR0aDozODBweDsgbWF4LWhlaWdodDo0MDBweDsgb3ZlcmZsb3cteTphdXRvO2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDEsMjQxLDI0MSk7fQoJCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLmRlZmF1bHQtc2Nyb2xsYmFyLTU1Njc4Ojotd2Via2l0LXNjcm9sbGJhcnt3aWR0aDo1cHg7IGhlaWdodDoxcHg7fQoJCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLmRlZmF1bHQtc2Nyb2xsYmFyLTU1Njc4Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYntib3gtc2hhZG93Omluc2V0IDAgMCA1cHggcmdiYSgwLCAwLCAwLCAwLjIpOyBiYWNrZ3JvdW5kOiNBOEE4QTg7fQoJCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLmRlZmF1bHQtc2Nyb2xsYmFyLTU1Njc4Ojotd2Via2l0LXNjcm9sbGJhci10cmFja3tib3gtc2hhZG93Omluc2V0IDAgMCA1cHggcmdiYSgwLCAwLCAwLCAwLjIpOyBiYWNrZ3JvdW5kOiNGMUYxRjE7fQoJCQkJCQkJCgkJCQkJCQkjdmlwX21vdmllX2JveGArdGhpcy5lbGVtZW50SWQrYCAudmlwX21vZF9ib3hfYWN0aW9uXzY4N2lpPiAuaXRlbV9ib3hgK3RoaXMuZWxlbWVudElkK2B7bWFyZ2luLWJvdHRvbToxMHB4O30KCQkJCQkJCSN2aXBfbW92aWVfYm94YCt0aGlzLmVsZW1lbnRJZCtgIC52aXBfbW9kX2JveF9hY3Rpb25fNjg3aWk+IC5pdGVtX2JveGArdGhpcy5lbGVtZW50SWQrYDpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MHB4O30KCQkJCQkJCSN2aXBfbW92aWVfYm94YCt0aGlzLmVsZW1lbnRJZCtgIC52aXBfbW9kX2JveF9hY3Rpb25fNjg3aWk+IC5pdGVtX2JveGArdGhpcy5lbGVtZW50SWQrYCA+LnRpdGxlYCt0aGlzLmVsZW1lbnRJZCtge2ZvbnQtc2l6ZToxNHB4OyB0ZXh0LWFsaWduOmxlZnQ7Y29sb3I6IzAwMDAwMDtmb250LXdlaWdodDo2MDA7bWFyZ2luOjVweCAzcHg7fQoJCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLnZpcF9tb2RfYm94X2FjdGlvbl82ODdpaT4gLml0ZW1fYm94YCt0aGlzLmVsZW1lbnRJZCtgID4uaW50ZXJmYWNlX2JveGArdGhpcy5lbGVtZW50SWQrYHt9CgkJCQkJCQkjdmlwX21vdmllX2JveGArdGhpcy5lbGVtZW50SWQrYCAudmlwX21vZF9ib3hfYWN0aW9uXzY4N2lpPiAuaXRlbV9ib3hgK3RoaXMuZWxlbWVudElkK2AgPi5pbnRlcmZhY2VfYm94YCt0aGlzLmVsZW1lbnRJZCtgPnNwYW57Ym9yZGVyLXJhZGl1czozcHg7Ym9yZGVyLXRvcDozcHggc29saWQgYCtjb2xvcitgOyBib3JkZXItYm90dG9tOjNweCBzb2xpZCBgK2NvbG9yK2A7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6Y2FsYygyNSUgLSA2cHgpO3dpZHRoOi1tb3otY2FsYygyNSUgLSA2cHgpO3dpZHRoOiAtd2Via2l0LWNhbGMoMjUlIC0gNnB4KTtoZWlnaHQ6MjBweDtsaW5lLWhlaWdodDoyMHB4O2JhY2tncm91bmQtY29sb3I6YCtjb2xvcitgO2NvbG9yOiNGRkY7Y3Vyc29yOnBvaW50ZXI7bWFyZ2luOjNweDt0ZXh0LWFsaWduOmNlbnRlcjtvdmVyZmxvdzpoaWRkZW47d2hpdGUtc3BhY2U6IG5vd3JhcDt0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczstby10ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2ZvbnQtc2l6ZToxMnB4IWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94IWltcG9ydGFudDt9CQkJCQkJCQoJCQkJCQkJI3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AgLnZpcF9tb2RfYm94X2FjdGlvbl82ODdpaT4gLml0ZW1fYm94YCt0aGlzLmVsZW1lbnRJZCtgID4uaW50ZXJmYWNlX2JveGArdGhpcy5lbGVtZW50SWQrYD5zcGFuOmhvdmVye2JvcmRlci10b3A6M3B4IHNvbGlkIGAraG92ZXJDb2xvcitgOyBib3JkZXItYm90dG9tOjNweCBzb2xpZCBgK2hvdmVyQ29sb3IrYDt9CgkJCQkJCQkjdmlwX21vdmllX2JveGArdGhpcy5lbGVtZW50SWQrYCAudmlwX21vZF9ib3hfYWN0aW9uXzY4N2lpPiAuaXRlbV9ib3hgK3RoaXMuZWxlbWVudElkK2AgPi5pbnRlcmZhY2VfYm94YCt0aGlzLmVsZW1lbnRJZCtgPnNwYW4uc2VsZWN0ZWR7Ym9yZGVyLXRvcDozcHggc29saWQgYCtob3ZlckNvbG9yK2A7IGJvcmRlci1ib3R0b206M3B4IHNvbGlkIGAraG92ZXJDb2xvcitgO30KCQkJCQkJCSN2aXBfbW92aWVfYm94YCt0aGlzLmVsZW1lbnRJZCtgIC52aXBfbW9kX2JveF9hY3Rpb25fNjg3aWk+IC5pdGVtX2JveGArdGhpcy5lbGVtZW50SWQrYCA+LmNvbnRlbnRgK3RoaXMuZWxlbWVudElkK2B7Zm9udC1zaXplOjEycHg7Y29sb3I6IzAwMDAwMDttYXJnaW4tbGVmdDozcHg7fQoJCQkJCQkJYAoJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTWFkZFN0eWxlKGNzc01vdWxkKTsKCQkJCgkJCS8v5Yqg5YWlSFRNTAoJCQl2YXIgaHRtbE1vdWxkID0gYDxkaXYgaWQ9J3ZpcF9tb3ZpZV9ib3hgK3RoaXMuZWxlbWVudElkK2AnPgoJCQkJCQkJCTxkaXYgY2xhc3M9J3BsdWdpbl9pbm5lcl9gK3RoaXMuZWxlbWVudElkK2AnPgoJCQkJCQkJCQk8ZGl2IGNsYXNzPSJpbWdfYm94YCt0aGlzLmVsZW1lbnRJZCtgIiBpZD0iaW1nX2JveF9qdW1wXzY2Njc4OTdpaW8iPjxpbWcgc3JjPSdgKyB2aXBWaWRlb0ltYWdlQmFzZTY0ICtgJyB0aXRsZT0n6YCJ5oup6Kej5p6Q57q/6LevJy8+PC9kaXY+CgkJCQkJCQkJCTxkaXYgY2xhc3M9J3Nob3doaWRlX2JveGArdGhpcy5lbGVtZW50SWQrYCc+CQkJCQkJCQkJCgkJCQkJCQkJCQk8ZGl2IGNsYXNzPSd2aXBfbW9kX2JveF9hY3Rpb25fNjg3aWkgZGVmYXVsdC1zY3JvbGxiYXItNTU2NzgnPgoJCQkJCQkJCQkJCTxkaXYgY2xhc3M9J2l0ZW1fYm94YCt0aGlzLmVsZW1lbnRJZCtgJz4KCQkJCQkJCQkJCQkJPGRpdiBjbGFzcz0ndGl0bGVgK3RoaXMuZWxlbWVudElkK2AnPjxiPuaOpeWPo+a3u+WKoDwvYj48L2Rpdj4KCQkJCQkJCQkJCQkJPGRpdiBjbGFzcz0nY29udGVudGArdGhpcy5lbGVtZW50SWQrYCc+CgkJCQkJCQkJCQkJCQnlr7nnjrDmnInmjqXlj6PkuI3mu6HmhI/vvJ/lj6/mt7vliqDoh6rlrprkuYnmjqXlj6Plk59+PHNwYW4gaWQ9ImltZ19zZXRfNjY2Nzg5N2lpbyIgc3R5bGU9ImRpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci1yYWRpdXM6MnB4O21hcmdpbi1sZWZ0OjVweDtwYWRkaW5nOjNweCA1cHg7YmFja2dyb3VuZC1jb2xvcjojQ0NDO2N1cnNvcjpwb2ludGVyOyI+5re75Yqg5o6l5Y+jPC9zcGFuPgoJCQkJCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQkJCQkJPGRpdiBjbGFzcz0ndGl0bGVgK3RoaXMuZWxlbWVudElkK2AnPgoJCQkJCQkJCQkJCQkJPGEgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2NvbG9yOmJsdWU7IiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiB0YXJnZXQ9Il9ibGFuayI+5o6l5Y+j6K+36Ieq6KGM5re75YqgfjwvYT4KCQkJCQkJCQkJCQkJPC9kaXY+CgkJCQkJCQkJCQkJPC9kaXY+CgkJCQkJCQkJCQkJPGRpdiBjbGFzcz0naXRlbV9ib3hgK3RoaXMuZWxlbWVudElkK2AnIHN0eWxlPSdtaW4taGVpZ2h0OjgwcHg7Ym9yZGVyOjFweCBkYXNoZWQgIzAwMDsnPgoJCQkJCQkJCQkJCQk8ZGl2IGNsYXNzPSdpbnRlcmZhY2VfYm94YCt0aGlzLmVsZW1lbnRJZCtgJz4KCQkJCQkJCQkJCQkJCWAgKyBjYXRlZ29yeV8xX2h0bWwgKyBgCgkJCQkJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCQkJCTxkaXYgY2xhc3M9J2l0ZW1fYm94YCt0aGlzLmVsZW1lbnRJZCtgJz4KCQkJCQkJCQkJCQkJPGRpdiBjbGFzcz0ndGl0bGVgK3RoaXMuZWxlbWVudElkK2AnPjxiPuWFjei0o+WjsOaYju+8mjwvYj48L2Rpdj4KCQkJCQkJCQkJCQkJPGRpdiBjbGFzcz0nY29udGVudGArdGhpcy5lbGVtZW50SWQrYCc+CgkJCQkJCQkJCQkJCQkx44CBPGIgc3R5bGU9J2NvbG9yOnJlZDsnPumcgOimgeS9v+eUqFZJUOinhumikeino+aekOeahO+8jOivt+iHquihjOa3u+WKoOaOpeWPozwvYj7vvIzniYjmnYPpl67popjor7fogZTns7vnm7jlhbPop6PmnpDmjqXlj6PmiYDmnInogIXvvIzohJrmnKzkuI3mib/mi4Xnm7jlhbPotKPku7vvvIEiPGJyPgoJCQkJCQkJCQkJCQkJMuOAgeS4uuWIm+mAoOiJr+WlveeahOWIm+S9nOawm+WbtO+8jOivt+Wkp+WutuaUr+aMgeato+eJiO+8gTxicj4KCQkJCQkJCQkJCQkJCTPjgIHohJrmnKzku4XpmZDkuKrkurrlrabkuaDkuqTmtYHvvIzkvb/nlKjljbPlt7Lku6Pooajmgqjlt7Lnu4/lhYXliIbkuobop6Pnm7jlhbPpl67popjvvIzlkKbliJnlkI7mnpzoh6rotJ/vvIznibnmraTlo7DmmI7vvIE8YnI+CgkJCQkJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCQkJPC9kaXY+CgkJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCTxkaXYgY2xhc3M9ImltZ19ib3hgK3RoaXMuZWxlbWVudElkK2AiIGlkPSJpbWdfcXVpY2tseV82NjY3ODk3aWlvIj48aW1nIHNyYz0nYCtxdWlja2x5QmFzZTY0K2AnIHRpdGxlPSflv6vpgJ/lvIDlp4so5b2T5YmN5omA6YCJ5o6l5Y+j77yaYCsoY3VycmVudFF1aWNrbHlJbnRlcmZhY2VPYmplY3Q9PW51bGwgPyAn5pegJyA6IGN1cnJlbnRRdWlja2x5SW50ZXJmYWNlT2JqZWN0Lm5hbWUpK2ApJy8+PC9kaXY+CgkJCQkJCQk8L2Rpdj4KCQkJCQkJCWA7CgkJCSQoImJvZHkiKS5hcHBlbmQoaHRtbE1vdWxkKTsKCQl9OwoJCXRoaXMucnVuRXZlbnQgPSBmdW5jdGlvbigpewkgLy/kuovku7bov5DooYwKCQkJdmFyIHRoYXQgPSB0aGlzOwoJCQkkKCIjdmlwX21vdmllX2JveCIrdGhpcy5lbGVtZW50SWQrIiA+LnBsdWdpbl9pbm5lcl8iK3RoaXMuZWxlbWVudElkKS5vbigibW91c2VvdmVyIiwgKCkgPT4gewoJCQkJJCgiLnNob3doaWRlX2JveCIrdGhpcy5lbGVtZW50SWQpLnNob3coKTsKCQkJfSk7CgkJCSQoIiN2aXBfbW92aWVfYm94Iit0aGlzLmVsZW1lbnRJZCsiID4ucGx1Z2luX2lubmVyXyIrdGhpcy5lbGVtZW50SWQpLm9uKCJtb3VzZW91dCIsICgpID0+IHsKCQkJCSQoIi5zaG93aGlkZV9ib3giK3RoaXMuZWxlbWVudElkKS5oaWRlKCk7CgkJCX0pOwoJCQkkKCJib2R5Iikub24oImNsaWNrIiwiI3ZpcF9tb3ZpZV9ib3giK3RoaXMuZWxlbWVudElkKyIgLnZpcF9tb2RfYm94X2FjdGlvbl82ODdpaT4uaXRlbV9ib3giK3RoaXMuZWxlbWVudElkKyI+LmludGVyZmFjZV9ib3giK3RoaXMuZWxlbWVudElkKyI+c3BhbiIsZnVuY3Rpb24oKXsKCQkJCXZhciBpbmRleCA9IHBhcnNlSW50KCQodGhpcykuYXR0cigiZGF0YS1pbmRleCIpKTsKCQkJCXZhciBwbGF5T2JqZWN0ID0gdGhhdC5vcmlnaW5hbEludGVyZmFjZUxpc3RbaW5kZXhdOwoJCQkJdGhhdC5zaG93UGxheWVyV2luZG93KHBsYXlPYmplY3QpOwoJCQkJCgkJCQkkKCIjdmlwX21vdmllX2JveCIrdGhhdC5lbGVtZW50SWQrIiAudmlwX21vZF9ib3hfYWN0aW9uXzY4N2lpPiAuaXRlbV9ib3giK3RoYXQuZWxlbWVudElkKyI+LmludGVyZmFjZV9ib3giK3RoYXQuZWxlbWVudElkKyI+c3BhbiIpLnJlbW92ZUNsYXNzKCJzZWxlY3RlZCIpOwoJCQkJJCh0aGlzKS5hZGRDbGFzcygic2VsZWN0ZWQiKTsKCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNc2V0VmFsdWUodGhhdC5xdWlja2x5SW50ZXJmYWNlS2V5LCBpbmRleCk7CgkJCQkKCQkJCSQoIiNpbWdfcXVpY2tseV82NjY3ODk3aWlvIikuZmluZCgiaW1nIikuYXR0cigidGl0bGUiLCLlv6vpgJ/lvIDlp4so5b2T5YmN5omA6YCJ5o6l5Y+j77yaIitwbGF5T2JqZWN0Lm5hbWUrIikiKTsKCQkJfSk7CgkJCQkJCQoJCQkvL+eCueWHu+inhumikeaSreaUvueVjOmdogoJCQkkKCIjaW1nX2JveF9qdW1wXzY2Njc4OTdpaW8iKS5vbigiY2xpY2siLCBmdW5jdGlvbigpewoJCQkJY29tbW9uRnVuY3Rpb25PYmplY3QuR01vcGVuSW5UYWIoImh0dHBzOi8vbGFpc295aWJhLmNvbS9tb3Yvcy8/c3Y9MyZ1cmw9Iit3aW5kb3cubG9jYXRpb24uaHJlZik7CgkJCX0pOwoJCQkKCQkJLy/ngrnlh7vlvLnlh7rorr7nva7moYYKCQkJJCgiI2ltZ19zZXRfNjY2Nzg5N2lpbyIpLm9uKCJjbGljayIsIGZ1bmN0aW9uKCl7CgkJCQl0aGF0LnNob3dTZXRpbmdEaWFsb2coKTsKCQkJfSk7CgkJCQoJCQkkKCIjaW1nX3F1aWNrbHlfNjY2Nzg5N2lpbyIpLm9uKCJjbGljayIsIGZ1bmN0aW9uKCl7CgkJCQljb25zdCBxdWlja2x5SW50ZXJmYWNlSW5kZXggPSB0aGF0LmdldFF1aWNrbHlJbnRlcmZhY2VJbmRleCgpOwoJCQkJdmFyIHBsYXlPYmplY3QgPSB0aGF0Lm9yaWdpbmFsSW50ZXJmYWNlTGlzdFtxdWlja2x5SW50ZXJmYWNlSW5kZXhdOwoJCQkJdGhhdC5zaG93UGxheWVyV2luZG93KHBsYXlPYmplY3QpOwoJCQl9KTsKCQkJCgkJCS8v5Y+z6ZSu56e75Yqo5L2N572uCgkJCXZhciBtb3ZpZV9ib3ggPSAkKCIjdmlwX21vdmllX2JveCIrdGhpcy5lbGVtZW50SWQpOwoJCQltb3ZpZV9ib3gubW91c2Vkb3duKGZ1bmN0aW9uKGUpIHsKCQkJCWlmIChlLndoaWNoID09IDMpIHsKCQkJCQllLnByZXZlbnREZWZhdWx0KCkKCQkJCQltb3ZpZV9ib3guY3NzKCJjdXJzb3IiLCAibW92ZSIpOwoJCQkJCXZhciBwb3NpdGlvbkRpdiA9ICQodGhpcykub2Zmc2V0KCk7CgkJCQkJdmFyIGRpc3RlbmNlWCA9IGUucGFnZVggLSBwb3NpdGlvbkRpdi5sZWZ0OwoJCQkJCXZhciBkaXN0ZW5jZVkgPSBlLnBhZ2VZIC0gcG9zaXRpb25EaXYudG9wOwoJCQkJCQoJCQkJCSQoZG9jdW1lbnQpLm1vdXNlbW92ZShmdW5jdGlvbihlKSB7CgkJCQkJCXZhciB4ID0gZS5wYWdlWCAtIGRpc3RlbmNlWDsKCQkJCQkJdmFyIHkgPSBlLnBhZ2VZIC0gZGlzdGVuY2VZOwoJCQkJCQl2YXIgd2luZG93V2lkdGggPSAkKHdpbmRvdykud2lkdGgoKTsKCQkJCQkJdmFyIHdpbmRvd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTsKCQkJCQkJCgkJCQkJCWlmICh4IDwgMCkgewoJCQkJCQkJeCA9IDA7CgkJCQkJCX0gZWxzZSBpZiAoeCA+ICB3aW5kb3dXaWR0aC0gbW92aWVfYm94Lm91dGVyV2lkdGgodHJ1ZSkgLSAxMDApIHsKCQkJCQkJCXggPSB3aW5kb3dXaWR0aCAtIG1vdmllX2JveC5vdXRlcldpZHRoKHRydWUpIC0gMTAwOwoJCQkJCQl9CgkJCQkJCQoJCQkJCQlpZiAoeSA8IDApIHsKCQkJCQkJCXkgPSAwOwoJCQkJCQl9IGVsc2UgaWYgKHkgPiB3aW5kb3dIZWlnaHQgLSBtb3ZpZV9ib3gub3V0ZXJIZWlnaHQodHJ1ZSkpIHsKCQkJCQkJCXkgPSB3aW5kb3dIZWlnaHQgLSBtb3ZpZV9ib3gub3V0ZXJIZWlnaHQodHJ1ZSk7CgkJCQkJCX0KCQkJCQkJbW92aWVfYm94LmNzcygibGVmdCIsIHgpOwoJCQkJCQltb3ZpZV9ib3guY3NzKCJ0b3AiLCB5KTsKCQkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3QuR01zZXRWYWx1ZSgiUG9zaXRpb25fIiArIHdpbmRvdy5sb2NhdGlvbi5ob3N0LHsgImxlZnQiOngsICJ0b3AiOnl9KTsKCQkJCQl9KTsKCQkJCQkkKGRvY3VtZW50KS5tb3VzZXVwKGZ1bmN0aW9uKCkgewoJCQkJCQkkKGRvY3VtZW50KS5vZmYoJ21vdXNlbW92ZScpOwoJCQkJCQltb3ZpZV9ib3guY3NzKCJjdXJzb3IiLCAicG9pbnRlciIpOwoJCQkJCX0pOwoJCQkJCSQoZG9jdW1lbnQpLmNvbnRleHRtZW51KGZ1bmN0aW9uKGUpIHsKCQkJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJCX0pCgkJCQl9CgkJCX0pOwoJCX07CgkJdGhpcy5yZW1vdmVWaWRlb0FkQmxvY2tfaXFpeWkgPSBmdW5jdGlvbigpewoJCQkKCQl9LAoJCXRoaXMucmVtb3ZlVmlkZW9BZEJsb2NrX3ZxcSA9IGZ1bmN0aW9uKCl7CgoJCX0sCgkJdGhpcy5yZW1vdmVWaWRlb0FkQmxvY2tfeW91a3UgPSBmdW5jdGlvbigpewoJCQkKCQl9LAoJCXRoaXMucmVtb3ZlVmlkZW9BZEJsb2NrX21ndHYgPSBmdW5jdGlvbigpewoJCQkKCQl9LAoJCXRoaXMucmVtb3ZlVmlkZW9BZEJsb2NrX3NvaHUgPSBmdW5jdGlvbigpewoJCQkKCQl9LAoJCXRoaXMucmVtb3ZlVmlkZW9BZEJsb2NrID0gZnVuY3Rpb24oKXsKCQkJY29uc3QgY3VycmVudEhvc3QgPSB3aW5kb3cubG9jYXRpb24uaG9zdDsKCQkJaWYoY3VycmVudEhvc3QuaW5kZXhPZigid3d3LmlxaXlpLmNvbSIpIT0tMSl7CgkJCQl0aGlzLnJlbW92ZVZpZGVvQWRCbG9ja19pcWl5aSgpOwoJCQl9ZWxzZSBpZihjdXJyZW50SG9zdC5pbmRleE9mKCJ2LnFxLmNvbSIpIT0tMSl7CgkJCQl0aGlzLnJlbW92ZVZpZGVvQWRCbG9ja192cXEoKTsKCQkJfWVsc2UgaWYoY3VycmVudEhvc3QuaW5kZXhPZigidi55b3VrdS5jb20iKSE9LTEpewoJCQkJdGhpcy5yZW1vdmVWaWRlb0FkQmxvY2tfeW91a3UoKTsKCQkJfWVsc2UgaWYoY3VycmVudEhvc3QuaW5kZXhPZigid3d3Lm1ndHYuY29tIikhPS0xKXsKCQkJCXRoaXMucmVtb3ZlVmlkZW9BZEJsb2NrX21ndHYoKTsKCQkJfWVsc2UgaWYoY3VycmVudEhvc3QuaW5kZXhPZigidHYuc29odS5jb20iKSE9LTEpewoJCQkJdGhpcy5yZW1vdmVWaWRlb0FkQmxvY2tfc29odSgpOwoJCQl9CgkJfTsKCQl0aGlzLnNob3dTZXRpbmdEaWFsb2cgPSBmdW5jdGlvbigpewoJCQljb25zdCB0aGF0ID0gdGhpczsKCQkJdmFyIGN1c3RvbUludGVyZmFjZUtleSA9IHRoYXQuY3VzdG9tSW50ZXJmYWNlS2V5OwoJCQl2YXIgY3VzdG9tSW50ZXJmYWNlID0gY29tbW9uRnVuY3Rpb25PYmplY3QuR01nZXRWYWx1ZShjdXN0b21JbnRlcmZhY2VLZXksICIiKTsKCQkJCgkJCXZhciBjb250ZW50ID0gYAoJCQkJPGRpdj4KCQkJCQk8ZGl2IHN0eWxlPSJmb250LXNpemU6MTRweDtmb250LXdlaWdodDo3MDA7Y29sb3I6IzAwMDsiPuiHquWumuS5ieino+aekOaOpeWPozwvZGl2PgoJCQkJCTxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2NvbG9yOnJlZDsiPgkJCQkJCgkJCQkJCeaVsOaNruagvOW8j++8mlvlkI3lrZddICsgWyxdICsgW+aOpeWPo+WcsOWdgF08YnI+CgkJCQkJCeS+i+Wmgu+8muWwseaYr+WQjeWtl+iAjOW3sixodHRwczovL3h4eHh4eD91cmw9PGJyPgoJCQkJCQnms6jvvJrkuIDooYzkuIDkuKoKCQkJCQk8L2Rpdj4KCQkJCQk8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOjVweDtoZWlnaHQ6MjAwcHg7d2lkdGg6MTAwJTsiPgoJCQkJCQk8dGV4dGFyZWEgCgkJCQkJCQlwbGFjZWhvbGRlcj0i6K+35Lil5qC85oyJ54Wn5qC85byP5aGr5YaZ77yM5ZCm5YiZ5LiN55Sf5pWIIgoJCQkJCQkJY2xhc3M9ImN1c3RvbS1pbnRlcmZhY2UtdGV4dGFyZWEiCgkJCQkJCQlzdHlsZT0iY29sb3I6IzAwMDtmb250LXNpemU6MTRweDtib3gtc2l6aW5nOiBib3JkZXItYm94Oy13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDstbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7cGFkZGluZzo1cHg7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTtPdmVyZmxvdzphdXRvO2JvcmRlcjoxcHggc29saWQgI2NjYztyZXNpemU6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiNGRkY7b3V0bGluZTpub25lOyI+YCtjdXN0b21JbnRlcmZhY2UrYDwvdGV4dGFyZWE+CgkJCQkJPC9kaXY+CgkJCQkJPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luLXRvcDoxNXB4OyI+CgkJCQkJCTxidXR0b24gY2xhc3M9InNhdmUtY3VzdG9tLWludGVyZmFjZS1idG4iIHN0eWxlPSJjb2xvcjojMDAwO2N1cnNvcjpwb2ludGVyOyI+5L+d5a2Y6Ieq5a6a5LmJ5o6l5Y+jPC9idXR0b24+CgkJCQkJPC9kaXY+CgkJCQk8L2Rpdj4KCQkJYDsKCQkJcG9wdXAuZGlhbG9nKHsKCQkJCSJ0aXRsZSI6Iuino+aekOaOpeWPo+a3u+WKoCIsCgkJCQkiY29udGVudCI6Y29udGVudCwKCQkJCSJvbkNvbnRlbnRSZWFkeSI6ZnVuY3Rpb24oJHRoYXQpewoJCQkJCXZhciAkc2F2ZUN1c3RvbUludGVyZmFjZUJ0biA9ICR0aGF0LmRpYWxvZ0NvbnRlbnQucXVlcnlTZWxlY3RvcigiLnNhdmUtY3VzdG9tLWludGVyZmFjZS1idG4iKTsKCQkJCQkkc2F2ZUN1c3RvbUludGVyZmFjZUJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uKCl7CgkJCQkJCXZhciAkY3VzdG9tSW50ZXJmYWNlVGV4dGFyZWEgPSAkdGhhdC5kaWFsb2dDb250ZW50LnF1ZXJ5U2VsZWN0b3IoIi5jdXN0b20taW50ZXJmYWNlLXRleHRhcmVhIik7CgkJCQkJCXZhciBjb250ZW50ID0gJGN1c3RvbUludGVyZmFjZVRleHRhcmVhLnZhbHVlOwoJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTXNldFZhbHVlKGN1c3RvbUludGVyZmFjZUtleSwgY29udGVudCk7CgkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LndlYlRvYXN0KHsibWVzc2FnZSI6IuiHquWumuS5ieaOpeWPo+S/neWtmOaIkOWKnyIsICJiYWNrZ3JvdW5kIjoiI0ZGNEQ0MCJ9KTsKCQkJCQl9KTsKCQkJCX0KCQkJfSkKCQl9CgkJdGhpcy5zdGFydCA9IGZ1bmN0aW9uKCl7CQkJCgkJCWxldCBkZWxheVRpbWVNcyA9IDA7CgkJCWlmKHdpbmRvdy5sb2NhdGlvbi5ob3N0LmluZGV4T2YoInd3dy5iaWxpYmlsaS5jb20iKSE9LTEpewoJCQkJZGVsYXlUaW1lTXMgPSAyMjAwOwoJCQl9CgkJCXNldFRpbWVvdXQoKCk9PnsKCQkJCXRyeXsKCQkJCQl0aGlzLnJlbW92ZVZpZGVvQWRCbG9jaygpOwoJCQkJfWNhdGNoKGUpe30KCQkJCXRyeXsKCQkJCQl0aGlzLmFuYWx5c2lzQ3VzdG9tSW50ZXJmYWNlKCk7CgkJCQkJdGhpcy5hZGRIdG1sRWxlbWVudHMoKTsKCQkJCQl0aGlzLnJ1bkV2ZW50KCk7CgkJCQl9Y2F0Y2goZSl7fQoJCQl9LCBkZWxheVRpbWVNcyk7CgkJfTsKCX07CgkKCS8qKgoJICog56e75Yqo56uvVklQ6Kej5p6QCgkgKiBAcGFyYW0ge09iamVjdH0gb3JpZ2luYWxJbnRlcmZhY2VMaXN0CgkgKi8KCWZ1bmN0aW9uIHN1cGVyVmlkZW9IZWxwZXJNb2JpbGUob3JpZ2luYWxJbnRlcmZhY2VMaXN0KXsKCQl0aGlzLm9yaWdpbmFsSW50ZXJmYWNlTGlzdCA9IG9yaWdpbmFsSW50ZXJmYWNlTGlzdDsKCQl0aGlzLmVsZW1lbnRJZCA9IE1hdGguY2VpbChNYXRoLnJhbmRvbSgpKjEwMDAwMDAwMCkrIm1teCI7CgkJdGhpcy5xdWlja2x5SW50ZXJmYWNlS2V5ID0gImN1c3RvbV9tb2JpbGVfcXVpY2tseV9pbnRlcmZhY2Vfa2V5X2RkZHNkeHhhIjsKCQl0aGlzLmRlZmF1bHRRdWlja2x5SW50ZXJmYWNlSW5kZXggPSAyOwoJCXRoaXMucGxheWVyTm9kZXM9WwoJCQl7InVybCI6Im0uaXFpeWkuY29tIiwgInNob3dOb2RlIjoiLm0tdmlkZW8tcGxheWVyLXdyYXAiLCAiY29sb3IiOiIjMDVCMDNCIn0sCgkJCXsidXJsIjoibS52LnFxLmNvbSIsICJzaG93Tm9kZSI6Ii5tb2RfcGxheWVyIiwgImNvbG9yIjoiI0Y5OUQzOSJ9LAoJCQl7InVybCI6Im0ueW91a3UuY29tIiwgInNob3dOb2RlIjoiLmg1LWRldGFpbC1wbGF5ZXIiLCAiY29sb3IiOiIjMDhCQUZEIn0sCgkJCXsidXJsIjoibS5tZ3R2LmNvbSIsICJzaG93Tm9kZSI6Ii52aWRlby1hcmVhIiwgImNvbG9yIjoiI0U5NTkwNCJ9CgkJXTsKCQl0aGlzLmlzUnVuID0gZnVuY3Rpb24oKXsgLy/liKTmlq3mmK/lkKbov5DooYwKCQkJY29uc3QgaG9zdCA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0OwoJCQljb25zdCB1cmxzID0gWyJtLmlxaXlpLmNvbSIsIm0udi5xcS5jb20iLCJtLnlvdWt1LmNvbSIsICJtLm1ndHYuY29tIiwgIm0uYmlsaWJpbGkuY29tIl07CgkJCXZhciByZXN1bHQgPSBmYWxzZTsKCQkJaWYoaG9zdC5zdGFydHNXaXRoKCJtLiIpKXsgLy/mmK/np7vliqjnq6/miafooYwKCQkJCWZvcih2YXIgaT0wOyBpPHVybHMubGVuZ3RoOyBpKyspewoJCQkJCWlmKGhvc3QuaW5kZXhPZih1cmxzW2ldKSAhPSAtMSl7CgkJCQkJCXJlc3VsdCA9IHRydWU7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlyZXR1cm4gcmVzdWx0OwoJCX07CgkJdGhpcy5nZXR3aW5kb3dFbGVtZW50ID0gZnVuY3Rpb24oKXsKCQkJdmFyIG5vZGVPYmplY3QgPSBudWxsOwoJCQlmb3IodmFyIGkgaW4gdGhpcy5wbGF5ZXJOb2RlcykgeyAvL+iOt+W+l+eql+WPo0lECgkJCQlpZiAodGhpcy5wbGF5ZXJOb2Rlc1tpXS51cmwgPT0gd2luZG93LmxvY2F0aW9uLmhvc3QpIHsKCQkJCQlub2RlT2JqZWN0ID0gdGhpcy5wbGF5ZXJOb2Rlc1tpXTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gbm9kZU9iamVjdDsKCQl9OwoJCXRoaXMuZ2V0UXVpY2tseUludGVyZmFjZUluZGV4ID0gZnVuY3Rpb24oKXsKCQkJdmFyIHF1aWNrbHlJbnRlcmZhY2VJbmRleFN0cmluZyA9IGNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNZ2V0VmFsdWUodGhpcy5xdWlja2x5SW50ZXJmYWNlS2V5LCIiKSsiIjsKCQkJdmFyIHF1aWNrbHlJbnRlcmZhY2VJbmRleCA9IHRoaXMuZGVmYXVsdFF1aWNrbHlJbnRlcmZhY2VJbmRleDsKCQkJaWYoISFxdWlja2x5SW50ZXJmYWNlSW5kZXhTdHJpbmcpewoJCQkJcXVpY2tseUludGVyZmFjZUluZGV4ID0gcGFyc2VJbnQocXVpY2tseUludGVyZmFjZUluZGV4U3RyaW5nKTsKCQkJfQoJCQlpZih0aGlzLm9yaWdpbmFsSW50ZXJmYWNlTGlzdC5sZW5ndGgtMTxxdWlja2x5SW50ZXJmYWNlSW5kZXgpewoJCQkJcXVpY2tseUludGVyZmFjZUluZGV4ID0gdGhpcy5kZWZhdWx0UXVpY2tseUludGVyZmFjZUluZGV4OwoJCQl9CgkJCXJldHVybiBxdWlja2x5SW50ZXJmYWNlSW5kZXg7CgkJfTsKCQl0aGlzLmFkZEh0bWxFbGVtZW50cyA9IGZ1bmN0aW9uKCl7CgkJCWxldCBub2RlT2JqZWN0ID0gdGhpcy5nZXR3aW5kb3dFbGVtZW50KCk7CgkJCWNvbnN0IHF1aWNrbHlJbnRlcmZhY2VJbmRleCA9IHRoaXMuZ2V0UXVpY2tseUludGVyZmFjZUluZGV4KCk7CgkJCWlmKCFub2RlT2JqZWN0KSByZXR1cm47CgkJCXJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KT0+ewoJCQkJY29uc3QgZWxlbWVudEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCk9PnsKCQkJCQljb25zdCBub2RlRWxlbWVudE9iamVjdCA9ICQobm9kZU9iamVjdC5zaG93Tm9kZSksIHRoZW1lQ29sb3IgPSBub2RlT2JqZWN0LmNvbG9yOwoJCQkJCQoJCQkJCWlmKG5vZGVFbGVtZW50T2JqZWN0Lmxlbmd0aCA9PSAwKSByZXR1cm47CgkJCQkJY2xlYXJJbnRlcnZhbChlbGVtZW50SW50ZXJ2YWwpOwoJCQkJCQkJCQkJCgkJCQkJLy/mt7vliqBIVE1MCgkJCQkJbGV0IGNhdGVnb3J5XzFfaHRtbCA9ICIiOwoJCQkJCXRoaXMub3JpZ2luYWxJbnRlcmZhY2VMaXN0LmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7CgkJCQkJCWlmIChpdGVtLnNob3dUeXBlICE9IDEpIHsKCQkJCQkJCXZhciBzZWxlY3RlZCA9ICIiOwoJCQkJCQkJaWYoaW5kZXg9PXF1aWNrbHlJbnRlcmZhY2VJbmRleCl7CgkJCQkJCQkJc2VsZWN0ZWQgPSAic2VsZWN0ZWQiOwoJCQkJCQkJfQoJCQkJCQkJY2F0ZWdvcnlfMV9odG1sICs9ICI8b3B0aW9uIHZhbHVlPSciK2l0ZW0udXJsKyInIGluZGV4PSciK2luZGV4KyInICIrc2VsZWN0ZWQrIj4iK2l0ZW0ubmFtZSsiPC9vcHRpb24+IjsKCQkJCQkJfQoJCQkJCX0pOwoJCQkJCXZhciBodG1sTW91bGQgPSBgCgkJCQkJCTxkaXYgc3R5bGU9Im1hcmdpbjoxNXB4IDE1cHggNTBweCAxNXB4O3BhZGRpbmc6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOmArdGhlbWVDb2xvcitgO2JvcmRlci1yYWRpdXM6NHB4O2N1cnNvcjpwb2ludGVyO3otaW5kZXg6IDk5OTk5OTk5OTk5OTk5OTk5OTk5OTtjb2xvcjojRkZGOyI+CgkJCQkJCQkJPGRpdiBzdHlsZT0iZm9udC13ZWlnaHQ6NzAwO2ZvbnQtc2l6ZToxNHB4O3RleHQtYWxpZ246Y2VudGVyOyI+CgkJCQkJCQkJCTxzcGFuPumAieaLqeino+aekOaOpeWPozwvc3Bhbj4KCQkJCQkJCQkJPHNlbGVjdCBpZD0iaW50ZXJmYWNlX3NlbGVjdGlvbl9gK3RoaXMuZWxlbWVudElkK2AiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiNGRkY7cGFkZGluZzogMHB4IDEwcHg7Ij4KCQkJCQkJCQkJCWArY2F0ZWdvcnlfMV9odG1sK2AKCQkJCQkJCQkJPC9zZWxlY3Q+CgkJCQkJCQkJPC9kaXY+CgkJCQkJCQkJPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Ij4KCQkJCQkJCQkJPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgaWQ9InN0YXJ0X2FuYWx5c2lzX291dGVyX2ArdGhpcy5lbGVtZW50SWQrYCIgc3R5bGU9ImJveC1zaXppbmc6Ym9yZGVyLWJveDttYXJnaW46MTBweCAwcHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzoxMHB4IDBweDt3aWR0aDoxMDAlO2JvcmRlci1yYWRpdXM6NHB4O2NvbG9yOiNGRkY7YmFja2dyb3VuZC1jb2xvcjojRjI1MDNGO2ZvbnQtc2l6ZToxNHB4OyI+56uZ5aSW6Kej5p6QPC9hPgoJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCTxkaXYgc3R5bGU9InRleHQtYWxpZ246bGVmdDtmb250LXNpemU6MTBweDsiPgoJCQkJCQkJCQk8ZGl2PgoJCQkJCQkJCQkJ5YWN6LSj55Sz5piO77yaMeOAgVZJUOinhumikeino+aekOS4reaJgOeUqOWIsOeahOino+aekOaOpeWPo+WFqOmDqOaUtumbhuiHquS6kuiBlOe9ke+8iOa6kOeggeWPr+inge+8ie+8jOeJiOadg+mXrumimOivt+iBlOezu+ebuOWFs+ino+aekOaOpeWPo+aJgOacieiAhe+8gQoJCQkJCQkJCQkJMuOAgeS4uuWIm+mAoOiJr+WlveeahOWIm+S9nOawm+WbtO+8jOivt+Wkp+WutuaUr+aMgeato+eJiO+8gQoJCQkJCQkJCQkJM+OAgeiEmuacrOS7hemZkOS4quS6uuWtpuS5oOS6pOa1ge+8jOWIh+WLv+eUqOS6juS7u+S9leWVhuS4muetieWFtuWug+eUqOmAlO+8gQoJCQkJCQkJCQkJNOOAgee7p+e7reS9v+eUqO+8jOWNs+ihqOaYjuS9oOW3sue7j+aYjuehruS9v+eUqOiEmuacrOWPr+iDveW4puadpeeahOmjjumZqe+8jOS4lOaEv+aEj+iHquihjOaJv+aLheebuOWFs+mjjumZqe+8jOWvueS6jumjjumZqeiEmuacrOS4jeaJv+aLheS7u+S9lei0o+S7u++8gQoJCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQk8L2Rpdj4KCQkJCQkJPC9kaXY+CgkJCQkJYDsKCQkJCQlub2RlRWxlbWVudE9iamVjdC5hZnRlcihodG1sTW91bGQpOwoJCQkJCXJlc29sdmUoIm9rIik7CgkJCQl9LCAxMDApOwoJCQl9KTsKCQl9OwoJCXRoaXMuZ2V0UGxheU9iamVjdEJ5U2VsZWN0ID0gZnVuY3Rpb24oKXsKCQkJCgkJCXZhciBpbmRleFN0cmluZyA9ICQoIiNpbnRlcmZhY2Vfc2VsZWN0aW9uXyIrdGhpcy5lbGVtZW50SWQpLmZpbmQoIm9wdGlvbjpzZWxlY3RlZCIpLmF0dHIoImluZGV4Iik7CgkJCXZhciBpbmRleCA9IDA7CgkJCWlmKCEhaW5kZXhTdHJpbmcpewoJCQkJaW5kZXggPSBwYXJzZUludChpbmRleFN0cmluZyk7CgkJCX0KCQkJcmV0dXJuIHRoaXMub3JpZ2luYWxJbnRlcmZhY2VMaXN0W2luZGV4XTsKCQl9OwoJCXRoaXMucnVuRXZlbnQgPSBmdW5jdGlvbigpewkgLy/kuovku7bov5DooYwKCQkJY29uc3Qgc2VsZiA9IHRoaXM7CgoJCQkvL+WIneWni+WMlgoJCQl2YXIgcGxheU9iamVjdCA9IHNlbGYuZ2V0UGxheU9iamVjdEJ5U2VsZWN0KCk7CgkJCSQoJyNzdGFydF9hbmFseXNpc19vdXRlcl8nK3NlbGYuZWxlbWVudElkKS5hdHRyKCJocmVmIiwgcGxheU9iamVjdC51cmwgKyB3aW5kb3cubG9jYXRpb24uaHJlZik7CgkJCSQoJyNzdGFydF9hbmFseXNpc19vdXRlcl8nK3NlbGYuZWxlbWVudElkKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkgewoJCQkJaWYoY29tbW9uRnVuY3Rpb25PYmplY3QuR01nZXRWYWx1ZSgiY29weXJpZ2h0X3ZpZGVvX3JlbWluZF9tb2JpbGVfb3V0ZXIiLG51bGwpPT09InRydWUiKXsKCQkJCQkKCQkJCX1lbHNlewoJCQkJCXZhciByPWNvbmZpcm0oCgkJCQkJCSLohJrmnKzov5DooYzmj5DphpLvvIHvvIHvvIFcdTAwMGQiKwoJCQkJCQki5L2/55So56uZ5aSW6Kej5p6Q5Yqf6IO977yM6KeG6aKR6Kej5p6Q5pe26ISa5pys6Lez5Ye65pys6aG16Z2i77yM5aaC5LiN5ZCM5oSP5q2k6ISa5pys6KGM5Li677yM6K+354K55Ye744CQ5Y+W5raI44CR5oyJ6ZKu77yB77yBIgoJCQkJCSk7CgkJCQkJaWYocj09ZmFsc2UpewoJCQkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQkJfWVsc2V7CgkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNc2V0VmFsdWUoImNvcHlyaWdodF92aWRlb19yZW1pbmRfbW9iaWxlX291dGVyIiwidHJ1ZSIpOwoJCQkJCX0KCQkJCX0KCQkJfSk7CgkJCS8v5o6l5Y+j5YiH5o2iCgkJCSQoJyNpbnRlcmZhY2Vfc2VsZWN0aW9uXycrc2VsZi5lbGVtZW50SWQpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CgkJCQl2YXIgJG9wdGlvbiA9ICQodGhpcykuZmluZCgib3B0aW9uOnNlbGVjdGVkIik7CgkJCQl2YXIgdmFsdWUgPSAkb3B0aW9uLnZhbCgpOwoJCQkJdmFyIGluZGV4ID0gcGFyc2VJbnQoJG9wdGlvbi5hdHRyKCJpbmRleCIpKTsKCQkJCSQoJyNzdGFydF9hbmFseXNpc19vdXRlcl8nK3NlbGYuZWxlbWVudElkKS5hdHRyKCJocmVmIiwgdmFsdWUrd2luZG93LmxvY2F0aW9uLmhyZWYpOwoJCQkJY29tbW9uRnVuY3Rpb25PYmplY3QuR01zZXRWYWx1ZShzZWxmLnF1aWNrbHlJbnRlcmZhY2VLZXksIGluZGV4KTsKCQkJfSk7CgkJfTsKCQl0aGlzLnN0YXJ0ID0gZnVuY3Rpb24oKXsKCQkJY29uc3Qgc2VsZiA9IHRoaXM7CgkJCWlmKHRoaXMuaXNSdW4oKSl7CgkJCQl0aGlzLmFkZEh0bWxFbGVtZW50cygpLnRoZW4oKCk9PnsKCQkJCQlzZWxmLnJ1bkV2ZW50KCk7CgkJCQl9KTsKCQkJfQoJCX0KCX0KCQoJLyoqCgkgKiBC56uZ55u45YWz5Yqf6IO977ya6KeG6aKR5aSaUOS4i+i9ve+8jOS4gOmUruS4ieiBlO+8jOa1j+iniOiusOW9leetiQoJICovCglmdW5jdGlvbiBiaWxpYmlsaUhlbHBlcigpewoJCXRoaXMuaXNSdW4gPSBmdW5jdGlvbigpewoJCQlyZXR1cm4gd2luZG93LmxvY2F0aW9uLmhvc3QuaW5kZXhPZigiYmlsaWJpbGkuY29tIikgIT0gLTEKCQl9CgkJdGhpcy5iYXNlRnVuY3Rpb24gPSBmdW5jdGlvbigpewoJCQkvKioKCQkJICogYuermeWfuuacrOWKn+iDve+8jOS4gOS7tuS4iei/nuOAgeinhumikeino+aekOOAgeinhumikeS4i+i9vQoJCQkgKi8gCgkJCWZ1bmN0aW9uIGJhc2VGdW5jdGlvbk9iamVjdCgpewoJCQkJdGhpcy5lbGVtZW50SWQgPSBNYXRoLmNlaWwoTWF0aC5yYW5kb20oKSoxMDAwMDAwMDApKyJtbXgiOwoJCQkJdGhpcy5kb3dubG9hZFJlc3V0RXJyb3I9ZnVuY3Rpb24oYnRuRWxlbWVudCl7CgkJCQkJYnRuRWxlbWVudC50ZXh0KCLkuIvovb3op4bpopHvvIjmnIDpq5jmuIXvvIkiKTsKCQkJCQlidG5FbGVtZW50LnJlbW92ZUF0dHIoImRpc2FibGVkIik7CgkJCQl9OwoJCQkJdGhpcy5kb3dubG9hZFJlc3V0U3VjY2Vzcz1mdW5jdGlvbihidG5FbGVtZW50KXsKCQkJCQlidG5FbGVtZW50LnRleHQoIuS4i+i9veinhumike+8iOacgOmrmOa4he+8iSIpOwoJCQkJCWJ0bkVsZW1lbnQucmVtb3ZlQXR0cigiZGlzYWJsZWQiKTsKCQkJCX07CgkJCQl0aGlzLmdldERvd25sb2FkUGFnZXMgPSBmdW5jdGlvbigpewoJCQkJCXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKCQkJCQkJdmFyIHBhdGhuYW1lID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLCBidiA9IG51bGw7CgkJCQkJCWlmIChwYXRobmFtZS5pbmRleE9mKCIvbWVkaWFsaXN0L3BsYXkvd2F0Y2hsYXRlci8iKSAhPSAtMSkgeyAvLyDlnKjkuIvovb3op4bpopHnmoTml7blgJnpkojlr7nnqI3lkI7lho3nnIvpobXpnaLnmoTpk77mjqXmib5CVuWPtwoJCQkJCQkJYnYgPSBwYXRobmFtZS5yZXBsYWNlKCIvbWVkaWFsaXN0L3BsYXkvd2F0Y2hsYXRlci8iLCIiKS5yZXBsYWNlKCIvIiwiIik7CgkJCQkJCX1lbHNlewoJCQkJCQkJYnYgPSBwYXRobmFtZS5yZXBsYWNlKCIvdmlkZW8vIiwiIikucmVwbGFjZSgiLyIsIiIpOwoJCQkJCQl9CgkJCQkJCWlmKCFidil7CgkJCQkJCQlyZXNvbHZlKHsic3RhdHVzIjoiYnZfbnVsbCJ9KTsKCQkJCQkJCXJldHVybjsKCQkJCQkJfQoJCQkJCQkvL2J26L2sYXYKCQkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3QucmVxdWVzdCgiZ2V0IiwgImh0dHBzOi8vYXBpLmJpbGliaWxpLmNvbS94L3dlYi1pbnRlcmZhY2Uvdmlldz9idmlkPSIrYnYsIG51bGwpLnRoZW4oKHJlc3VsdERhdGEpPT57CgkJCQkJCQlsZXQgZGF0YUpzb24gPSBKU09OLnBhcnNlKHJlc3VsdERhdGEuZGF0YSk7CgkJCQkJCQlpZighZGF0YUpzb24gfHwgZGF0YUpzb24uY29kZSE9PTAgfHwgIWRhdGFKc29uLmRhdGEpewoJCQkJCQkJCXJlc29sdmUoeyJzdGF0dXMiOiJyZXF1ZXN0X2Vycm9yIn0pOwoJCQkJCQkJCXJldHVybjsKCQkJCQkJCX0KCQkJCQkJCQoJCQkJCQkJbGV0IGRhdGEgPSBkYXRhSnNvbi5kYXRhOwoJCQkJCQkJaWYoIWRhdGEpewoJCQkJCQkJCXJlc29sdmUoeyJzdGF0dXMiOiJhaWRfbnVsbCJ9KTsKCQkJCQkJCQlyZXR1cm47CgkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJCWxldCBhaWQgPSBkYXRhLmFpZDsKCQkJCQkJCWxldCBwaWMgPSBkYXRhLnBpYzsKCQkJCQkJCWxldCB0aXRsZSA9IGRhdGEudGl0bGUKCQkJCQkJCWlmKCFhaWQpewoJCQkJCQkJCXJlc29sdmUoeyJzdGF0dXMiOiJhaWRfbnVsbCJ9KTsKCQkJCQkJCQlyZXR1cm47CgkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJCS8v6I635Y+WY2lkCgkJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC5yZXF1ZXN0KCJnZXQiLCAiaHR0cHM6Ly9hcGkuYmlsaWJpbGkuY29tL3gvd2ViLWludGVyZmFjZS92aWV3P2FpZD0iK2FpZCwgbnVsbCkudGhlbigocmVzdWx0RGF0YTIpPT57CgkJCQkJCQkJbGV0IGRhdGFKc29uMiA9IEpTT04ucGFyc2UocmVzdWx0RGF0YTIuZGF0YSk7CgkJCQkJCQkJaWYoIWRhdGFKc29uMiB8fCBkYXRhSnNvbjIuY29kZSE9PTAgfHwgIWRhdGFKc29uMi5kYXRhKXsKCQkJCQkJCQkJcmVzb2x2ZSh7InN0YXR1cyI6InJlcXVlc3RfZXJyb3IifSk7CgkJCQkJCQkJCXJldHVybjsKCQkJCQkJCQl9CgkJCQkJCQkJY29uc3QgZG93bmxvYWREYXRhID0gZGF0YUpzb24yLmRhdGE7CgkJCQkJCQkJY29uc3QgYWlkID0gZG93bmxvYWREYXRhLmFpZCwgYnZpZCA9IGRvd25sb2FkRGF0YS5idmlkOwoJCQkJCQkJCWNvbnN0IHBhZ2VzID0gbmV3IEFycmF5KCk7CgkJCQkJCQkJZm9yKHZhciBpPTA7IGk8ZG93bmxvYWREYXRhLnBhZ2VzLmxlbmd0aDsgaSsrKXsKCQkJCQkJCQkJbGV0IHBhZ2VEYXRhID0gZG93bmxvYWREYXRhLnBhZ2VzW2ldOwoJCQkJCQkJCQlwYWdlcy5wdXNoKHsKCQkJCQkJCQkJCSJjb3ZlciI6cGFnZURhdGEuZmlyc3RfZnJhbWUsCgkJCQkJCQkJCQkicGFnZSI6cGFnZURhdGEucGFnZSwKCQkJCQkJCQkJCSJwYXJ0IjpwYWdlRGF0YS5wYXJ0LAoJCQkJCQkJCQkJImNpZCI6cGFnZURhdGEuY2lkCgkJCQkJCQkJCX0pOwoJCQkJCQkJCX0KCQkJCQkJCQlyZXNvbHZlKHsic3RhdHVzIjoic3VjY2VzcyIsICJkb3dubG9hZERhdGEiOnsKCQkJCQkJCQkJImFpZCI6YWlkLCAiYnZpZCI6YnZpZCwgInBhZ2VzIjpwYWdlcywgInBpYyI6cGljLCAidGl0bGUiOnRpdGxlCgkJCQkJCQkJfX0pOwoJCQkJCQkJfSkuY2F0Y2goKGVycm9yRGF0YSk9PnsKCQkJCQkJCQlyZXNvbHZlKHsic3RhdHVzIjoicmVxdWVzdF9lcnJvciJ9KTsKCQkJCQkJCX0pOwoJCQkJCQl9KS5jYXRjaCgoZXJyb3JEYXRhKT0+ewoJCQkJCQkJcmVzb2x2ZSh7InN0YXR1cyI6InJlcXVlc3RfZXJyb3IifSk7CgkJCQkJCX0pOwoJCQkJCX0pOwoJCQkJfTsKCQkJCXRoaXMuc3RhcnREb3dubG9hZEZpbGUgPSBmdW5jdGlvbihvcHRpb25zKXsKCQkJCQlsZXQgYWlkID0gb3B0aW9ucy5haWQsIGNpZCA9IG9wdGlvbnMuY2lkLCBmaWxlTmFtZSA9IG9wdGlvbnMuZmlsZU5hbWUsIAoJCQkJCQlzYXZlUGF0aCA9IG9wdGlvbnMuc2F2ZVBhdGgsIFJQQ1VSTCA9IG9wdGlvbnMuUlBDVVJMLCBSUENUb2tlbiA9IG9wdGlvbnMuUlBDVG9rZW47CgkJCQkJbGV0IGlzQnlQUkMgPSBvcHRpb25zLmlzQnlQUkM7CgkJCQkJCgkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3QucmVxdWVzdCgiZ2V0IiwgImh0dHBzOi8vYXBpLmJpbGliaWxpLmNvbS94L3BsYXllci9wbGF5dXJsP2F2aWQ9IithaWQrIiZjaWQ9IitjaWQrIiZxbj0xMTIiLCBudWxsKS50aGVuKChyZXN1bHREYXRhMyk9PnsKCQkJCQkJbGV0IGRhdGFKc29uMyA9IEpTT04ucGFyc2UocmVzdWx0RGF0YTMuZGF0YSk7CgkJCQkJCWNvbnNvbGUubG9nKCLojrflj5bop4bpopHmlbDmja7vvIzlh4blpIfkuIvovb0iLCBkYXRhSnNvbjMpOwoJCQkJCQlpZighIWRhdGFKc29uMyAmJiBkYXRhSnNvbjMuY29kZT09PTAgJiYgISFkYXRhSnNvbjMuZGF0YSl7CgkJCQkJCQlsZXQgZG93bmxvYWRVcmwgPSBkYXRhSnNvbjMuZGF0YS5kdXJsWzBdLnVybDsKCQkJCQkJCWlmKGlzQnlQUkMpewoJCQkJCQkJCWlmKCFmaWxlTmFtZSkgZmlsZU5hbWUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpKyIiOwoJCQkJCQkJCWZpbGVOYW1lID0gZmlsZU5hbWUucmVwbGFjZSgvW1wgfFx+fFxgfFw9fFx8fFxcfFw7fFw6fFwifFwnfFwsfFwufFw+fFwvXS9nLCIiKSArICIuZmx2IjsgIC8vQuermeS4i+i9vem7mOiupEZMVuagvOW8jwoJCQkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LlJQQ0Rvd25sb2FkRmlsZShmaWxlTmFtZSwgZG93bmxvYWRVcmwsIHNhdmVQYXRoLCBSUENVUkwpLnRoZW4oKGRhdGEpPT57CgkJCQkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LndlYlRvYXN0KHsibWVzc2FnZSI6ZGF0YSwgInRpbWUiOjMwMDB9KTsKCQkJCQkJCQl9KS5jYXRjaCgoZGF0YSk9PnsKCQkJCQkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3Qud2ViVG9hc3QoeyJtZXNzYWdlIjpkYXRhLCAidGltZSI6MzAwMH0pOwoJCQkJCQkJCX0pOwoJCQkJCQkJfWVsc2V7CgkJCQkJCQkJd2luZG93Lm9wZW4oZG93bmxvYWRVcmwpOwoJCQkJCQkJfQoJCQkJCQl9ZWxzZXsKCQkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LndlYlRvYXN0KHsibWVzc2FnZSI6IuiOt+WPluS4i+i9vemTvuaOpeWksei0pSIsICJiYWNrZ3JvdW5kIjoiI0ZGNEQ0MCJ9KTsKCQkJCQkJfQoJCQkJCX0pLmNhdGNoKChlcnJvckRhdGEpPT57CgkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LndlYlRvYXN0KHsibWVzc2FnZSI6IuiOt+WPluS4i+i9vemTvuaOpeWksei0pSIsICJiYWNrZ3JvdW5kIjoiI0ZGNEQ0MCJ9KTsKCQkJCQl9KTsKCQkJCX07CgkJCQl0aGlzLmNyZWF0ZU1vZGFscyA9IGZ1bmN0aW9uKCl7CgkJCQkJdmFyIGNzcyA9IGAKCQkJCQkJLm1vZGFsLW1hc2stYCt0aGlzLmVsZW1lbnRJZCtgewoJCQkJCQkJcG9zaXRpb246Zml4ZWQ7CgkJCQkJCQl0b3A6MDsKCQkJCQkJCWxlZnQ6MDsKCQkJCQkJCXotaW5kZXg6OTk5OwoJCQkJCQkJd2lkdGg6MTAwJTsKCQkJCQkJCWhlaWdodDoxMDAlOwoJCQkJCQkJZGlzcGxheTpub25lOwoJCQkJCQkJYmFja2dyb3VuZC1jb2xvcjojMDAwOwoJCQkJCQkJb3BhY2l0eTowLjM7CgkJCQkJCQlvdmVyZmxvdzpoaWRkZW47CgkJCQkJCX0KCQkJCQkJLm1vZGFsLWJvZHktYCt0aGlzLmVsZW1lbnRJZCtgewoJCQkJCQkJcG9zaXRpb246Zml4ZWQ7CgkJCQkJCQlib3JkZXItcmFkaXVzOjVweDsKCQkJCQkJCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7CgkJCQkJCQl0b3A6MTAlOwoJCQkJCQkJd2lkdGg6NjAwcHg7CgkJCQkJCQltYXgtd2lkdGg6OTAlOwoJCQkJCQkJbWF4LWhlaWdodDo4MCU7CgkJCQkJCQl6LWluZGV4OjEwMDA7CgkJCQkJCQlsZWZ0OiA1MCU7CgkJCQkJCQl0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CgkJCQkJCQlkaXNwbGF5Om5vbmU7CgkJCQkJCQlwYWRkaW5nOiAxMHB4OwoJCQkJCQkJb3ZlcmZsb3cteTogYXV0bzsKCQkJCQkJfQoJCQkJCQkubW9kYWwtYm9keS1gK3RoaXMuZWxlbWVudElkK2AgPi5wYWdlLWhlYWRlcnsKCQkJCQkJCWhlaWdodDozMHB4OwoJCQkJCQkJbGluZS1oZWlnaHQ6MzBweDsKCQkJCQkJCXBvc2l0aW9uOnJlbGF0aXZlOwoJCQkJCQl9CgkJCQkJCS5tb2RhbC1ib2R5LWArdGhpcy5lbGVtZW50SWQrYCA+LnBhZ2UtaGVhZGVyID5zcGFuewoJCQkJCQkJZGlzcGxheTppbmxpbmUtYmxvY2s7CgkJCQkJCX0KCQkJCQkJLm1vZGFsLWJvZHktYCt0aGlzLmVsZW1lbnRJZCtgID4ucGFnZS1oZWFkZXIgPnNwYW46bnRoLWNoaWxkKDEpIHsKCQkJCQkJCWZvbnQtc2l6ZToxOHB4OwoJCQkJCQkJZm9udC13ZWlnaHQ6Ym9sZDsKCQkJCQkJCXBvc2l0aW9uOmFic29sdXRlOwoJCQkJCQkJbGVmdDoxMHB4OwoJCQkJCQl9CgkJCQkJCS5tb2RhbC1ib2R5LWArdGhpcy5lbGVtZW50SWQrYCA+LnBhZ2UtaGVhZGVyID5zcGFuOm50aC1jaGlsZCgyKSB7CgkJCQkJCQlmb250LXNpemU6MjhweDsKCQkJCQkJCWZvbnQtd2VpZ2h0OmJvbGQ7CgkJCQkJCQlwb3NpdGlvbjphYnNvbHV0ZTsKCQkJCQkJCXJpZ2h0OjEwcHg7CgkJCQkJCQljdXJzb3I6cG9pbnRlcjsKCQkJCQkJfQoJCQkJCQkubW9kYWwtYm9keS1gK3RoaXMuZWxlbWVudElkK2AgPi5wYWdlLWNvbnRhaW5lcnsKCQkJCQkJCW1heC1oZWlnaHQ6IDUwMHB4OwoJCQkJCQkJb3ZlcmZsb3cteTogYXV0bzsKCQkJCQkJfQoJCQkJCQkubW9kYWwtYm9keS1gK3RoaXMuZWxlbWVudElkK2AgLnBhZ2Utd3JhcHsKCQkJCQkJCWRpc3BsYXk6IGZsZXg7CgkJCQkJCQlmbGV4LXdyYXA6IHdyYXA7CgkJCQkJCQltYXJnaW4tdG9wOjVweDsKCQkJCQkJfQoJCQkJCQkubW9kYWwtYm9keS1gK3RoaXMuZWxlbWVudElkK2AgLnBhZ2Utd3JhcCA+LmJvYXJkLWl0ZW17CgkJCQkJCQlkaXNwbGF5OiBibG9jazsKCQkJCQkJCXdpZHRoOiBjYWxjKDUwJSAtIDEwcHgpOwoJCQkJCQkJYmFja2dyb3VuZC1jb2xvcjogIzZBNUY2MDsKCQkJCQkJCW1hcmdpbjogNXB4OwoJCQkJCQkJYmFja2dyb3VuZC1jb2xvcjojRkI3Mjk5OwoJCQkJCQkJY29sb3I6I0ZGRkZGRjsKCQkJCQkJCWN1cnNvcjogcG9pbnRlcjsKCQkJCQkJCW92ZXJmbG93OmhpZGRlbjsKCQkJCQkJCXdoaXRlLXNwYWNlOm5vd3JhcDsKCQkJCQkJCXRleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7CgkJCQkJCX0KCQkJCQkJLm1vZGFsLWJvZHktYCt0aGlzLmVsZW1lbnRJZCtgIC5wYWdlLXdyYXAgPi5ib2FyZC1pdGVtID5pbnB1dHsKCQkJCQkJCXdpZHRoOiAxNHB4OwoJCQkJCQkJaGVpZ2h0OiAxNHB4OwoJCQkJCQkJdmVydGljYWwtYWxpZ246IG1pZGRsZTsKCQkJCQkJCW1hcmdpbi1yaWdodDo1cHg7CgkJCQkJCX0KCQkJCQkJLm1vZGFsLWJvZHktYCt0aGlzLmVsZW1lbnRJZCtgIC5wYWdlLXdyYXAgPi5ib2FyZC1pdGVtID5zcGFuewoJCQkJCQkJdmVydGljYWwtYWxpZ246IG1pZGRsZTsKCQkJCQkJfQoJCQkJCQkubW9kYWwtYm9keS1gK3RoaXMuZWxlbWVudElkK2AgLm1vZGFsLWJ0bi13cmFwewoJCQkJCQkJdGV4dC1hbGlnbjogY2VudGVyOwoJCQkJCQkJbWFyZ2luLXRvcDogMTBweDsKCQkJCQkJCWN1cnNvcjogcG9pbnRlcjsKCQkJCQkJfQoJCQkJCQkubW9kYWwtYm9keS1gK3RoaXMuZWxlbWVudElkK2AgLmFyaWEyLXNldHRpbmd7CgkJCQkJCQlib3JkZXI6MXB4IGRhc2hlZCAjRjFGMUYxOwoJCQkJCQkJYm9yZGVyLXJhZGl1czo0cHg7CgkJCQkJCQltYXJnaW4tdG9wOjEwcHg7CgkJCQkJCX0KCQkJCQkJLm1vZGFsLWJvZHktYCt0aGlzLmVsZW1lbnRJZCtgIC5hcmlhMi1zZXR0aW5nID4uc2V0dGluZy1pdGVtewoJCQkJCQkJdGV4dC1hbGlnbjogY2VudGVyOwoJCQkJCQkJZm9udC1zaXplOjE0cHg7CgkJCQkJCQltYXJnaW46MTBweCAwcHg7CgkJCQkJCX0KCQkJCQkJLm1vZGFsLWJvZHktYCt0aGlzLmVsZW1lbnRJZCtgIC5hcmlhMi1zZXR0aW5nID4uc2V0dGluZy1pdGVtIC50b3BpYy1uYW1lewoJCQkJCQkJZGlzcGxheTppbmxpbmUtYmxvY2s7CgkJCQkJCQl3aWR0aDo4MHB4OwoJCQkJCQkJdGV4dC1hbGlnbjpsZWZ0OwoJCQkJCQl9CgkJCQkJCS5tb2RhbC1ib2R5LWArdGhpcy5lbGVtZW50SWQrYCAuYXJpYTItc2V0dGluZyA+LnNldHRpbmctaXRlbT4gaW5wdXR7CgkJCQkJCQl3aWR0aDozMDBweDsKCQkJCQkJCXBhZGRpbmctbGVmdDoxMHB4OwoJCQkJCQkJYm9yZGVyOjFweCBzb2xpZCAjODg4OwoJCQkJCQkJb3V0bGluZTpub25lOwoJCQkJCQkJYm9yZGVyLXJhZGl1czozcHg7CgkJCQkJCX0KCQkJCQkJLm1vZGFsLWJvZHktYCt0aGlzLmVsZW1lbnRJZCtgIC5tb2RhbC1idG4td3JhcCA+c3BhbnsKCQkJCQkJCWJvcmRlcjoxcHggc29saWQgI2NjYzsKCQkJCQkJCWRpc3BsYXk6aW5saW5lLWJsb2NrOwoJCQkJCQkJcGFkZGluZzozcHggNXB4OwoJCQkJCQkJbWFyZ2luOjBweCA1cHg7CgkJCQkJCQlib3JkZXItcmFkaXVzOjNweDsKCQkJCQkJfQoJCQkJCQkubW9kYWwtYm9keS1gK3RoaXMuZWxlbWVudElkK2AgLnRpcC13cmFwewoJCQkJCQkJbWFyZ2luLXRvcDogMTBweDsKCQkJCQkJCWZvbnQtc2l6ZToxMnB4OwoJCQkJCQl9CgkJCQkJCS5tb2RhbC1ib2R5LWArdGhpcy5lbGVtZW50SWQrYCAudGlwLXdyYXAgPi50aXRsZXsKCQkJCQkJCWZvbnQtc2l6ZToxNnB4OwoJCQkJCQkJZm9udC13ZWlnaHQ6Ym9sZDsKCQkJCQkJfQoJCQkJCQkubW9kYWwtYm9keS1gK3RoaXMuZWxlbWVudElkK2AgLnRpcC13cmFwID4uY29udGVudCA+dWwgPmxpewoJCQkJCQkJbWFyZ2luLXRvcDo1cHg7CgkJCQkJCX0KCQkJCQlgOwoJCQkJCQoJCQkJCXZhciBzYXZlUGF0aCA9ICJEOi8iOwoJCQkJCWlmKCJtYWNPUyI9PT1jb21tb25GdW5jdGlvbk9iamVjdC5nZXRTeXN0ZW1PUygpKXsKCQkJCQkJc2F2ZVBhdGggPSAiL1VzZXJzIgoJCQkJCX0KCQkJCQl2YXIgaHRtbCA9IGAKCQkJCQkJPGRpdiBjbGFzcz0nbW9kYWwtbWFzay1gK3RoaXMuZWxlbWVudElkK2AnPjwvZGl2PgoJCQkJCQk8ZGl2IGNsYXNzPSdtb2RhbC1ib2R5LWArdGhpcy5lbGVtZW50SWQrYCc+CgkJCQkJCQk8ZGl2IGNsYXNzPSJwYWdlLWhlYWRlciI+CgkJCQkJCQkJPHNwYW4+6KeG6aKR5LiL6L29KOWPr+aJuemHjyk8L3NwYW4+CgkJCQkJCQkJPHNwYW4gY2xhc3M9ImNsb3NlIj7Dlzwvc3Bhbj4KCQkJCQkJCTwvZGl2PgoJCQkJCQkJPGRpdiBjbGFzcz0icGFnZS1jb250YWluZXIiPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBhZ2Utd3JhcCI+PC9kaXY+CgkJCQkJCQkJPGRpdiBjbGFzcz0iYXJpYTItc2V0dGluZyI+CgkJCQkJCQkJCTxkaXYgY2xhc3M9InNldHRpbmctaXRlbSI+CgkJCQkJCQkJCQk8bGFiZWwgY2xhc3M9InRvcGljLW5hbWUiPumFjee9rlJQQzo8L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJSUENVUkwiIHZhbHVlPSJ3czovL2xvY2FsaG9zdDoxNjgwMC9qc29ucnBjIiBwbGFjZWhvbGRlcj0i6K+35YeG56Gu6L6T5YWlUlBD5a+55bqU6L2v5Lu255qE5Zyw5Z2A77yM6buY6K6k77yaTW90cml4Ij4KCQkJCQkJCQkJPC9kaXY+CgkJCQkJCQkJCTxkaXYgY2xhc3M9InNldHRpbmctaXRlbSI+CgkJCQkJCQkJCQk8bGFiZWwgY2xhc3M9InRvcGljLW5hbWUiPumFjee9rlRva2VuOjwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlJQQ1Rva2VuIiBwbGFjZWhvbGRlcj0i6buY6K6k5peg6ZyA5aGr5YaZIj4KCQkJCQkJCQkJPC9kaXY+CgkJCQkJCQkJCTxkaXYgY2xhc3M9InNldHRpbmctaXRlbSI+CgkJCQkJCQkJCQk8bGFiZWwgY2xhc3M9InRvcGljLW5hbWUiPuS/neWtmOi3r+W+hDo8L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzYXZlUGF0aCIgdmFsdWU9ImArc2F2ZVBhdGgrYCIgcGxhY2Vob2xkZXI9Iuivt+WHhuehrui+k+WFpeaWh+S7tuS/neWtmOi3r+W+hCI+CgkJCQkJCQkJCQk8ZGl2IHN0eWxlPSJmb250LXNpemU6MTJweDtjb2xvcjojODg4OyI+5pyA5aW96Ieq5a6a5LmJ5LiL6L295Zyw5Z2A77yM6buY6K6k5Zyw5Z2A5Y+v6IO95LiN5ruh6Laz6ZyA6KaBPC9kaXY+CgkJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCTxkaXYgY2xhc3M9Im1vZGFsLWJ0bi13cmFwIj4KCQkJCQkJCQkJPHNwYW4gbmFtZT0ic2VsZWN0YWxsIj7lhajpgIk8L3NwYW4+CgkJCQkJCQkJCTxzcGFuIG5hbWU9InJlbW92ZVNlbGVjdCI+5Y+W5raI6YCJ5oupPC9zcGFuPgoJCQkJCQkJCQk8c3BhbiBuYW1lPSJkb3dubG9hZEFsbCI+5om56YeP5LiL6L29PC9zcGFuPgoJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCTxkaXYgY2xhc3M9InRpcC13cmFwIj4KCQkJCQkJCQkJPGRpdiBjbGFzcz0idGl0bGUiPuWFs+S6juWNlVDkuIvovb3vvJo8L2Rpdj4KCQkJCQkJCQkJPGRpdiBjbGFzcz0iY29udGVudCI+PHNwYW4+54K55Ye75by55qGG5Y2V5Liq6YCJ6ZuG77yM5Y2z5Y+v5LiL6L295Y2V6ZuG6KeG6aKRKOW9k+WJjeeJiOacrOWNlVDkuIvovb3lpLHmlYjvvIzmraPlnKjmg7Plip7ms5Xop6PlhrMpPC9zcGFuPjwvZGl2PgoJCQkJCQkJCQk8ZGl2IGNsYXNzPSJjb250ZW50Ij48c3BhbiBzdHlsZT0iY29sb3I6cmVkOyI+5Y2VUOS4i+i9ve+8jOaOqOiNkOWkp+WutuS9v+eUqEJCRG93buS4i+i9ve+8jOatpOW3peWFt+WKn+iDveW+iOW8uuWkp++8jOWFt+S9k+afpeeci++8mjxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbmlsYW9kYS9CQkRvd24iPmh0dHBzOi8vZ2l0aHViLmNvbS9uaWxhb2RhL0JCRG93bjwvYT48L3NwYW4+PC9kaXY+CgkJCQkJCQkJPC9kaXY+CgkJCQkJCQkJPGRpdiBjbGFzcz0idGlwLXdyYXAiPgoJCQkJCQkJCQk8ZGl2IGNsYXNzPSJ0aXRsZSI+5YWz5LqO5om56YeP5LiL6L2977yaPC9kaXY+CgkJCQkJCQkJCTxkaXYgY2xhc3M9ImNvbnRlbnQiPgoJCQkJCQkJCQkJPHVsPgoJCQkJCQkJCQkJCTxsaT4KCQkJCQkJCQkJCQkJPGI+MeOAgeaJuemHj+S4i+i9vemcgOimgeesrOS4ieaWuei9r+S7tueahOaUr+aMge+8jOiEmuacrOaOqOiNkOS9v+eUqO+8mk1vdHJpeDwvYj4KCQkJCQkJCQkJCQkJPHVsPgoJCQkJCQkJCQkJCQkJPGxpPk1vdHJpeOS4i+i9veWcsOWdgO+8mjxhIGhyZWY9Imh0dHBzOi8vbW90cml4LmFwcC96aC1DTi8iIHRhcmdldD0iX2JsYW5rIj5odHRwczovL21vdHJpeC5hcHAvemgtQ04vPC9hPjwvbGk+CgkJCQkJCQkJCQkJCQk8bGk+QXJpYU5nR1VJ5LiL6L295Zyw5Z2A77yaPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1htYWRlci9hcmlhLW5nLWd1aSIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vZ2l0aHViLmNvbS9YbWFkZXIvYXJpYS1uZy1ndWk8L2E+PC9saT4KCQkJCQkJCQkJCQkJPC91bD4KCQkJCQkJCQkJCQk8L2xpPgoJCQkJCQkJCQkJCTxsaT4KCQkJCQkJCQkJCQkJPGI+MuOAgeWcqOaJuemHj+S4i+i9veWJjemcgOimgeaPkOWJjeaJk+W8gOi9r+S7tu+8jOacrOaVmeeoi+S7pU1vdHJpeOS4uuWHhjwvYj4KCQkJCQkJCQkJCQkJPHVsPgoJCQkJCQkJCQkJCQkJPGxpPigxKeOAgeWmguaenOWFqOmDqOaMieeFp+m7mOiupOmFjee9ru+8jOWPqumcgOimgeaJk+W8gOi9r+S7tuWNs+WPrzwvbGk+CgkJCQkJCQkJCQkJCQk8bGk+KDIp44CB5aaC5p6c5oOz6Ieq5a6a5LmJUlBD5Zyw5Z2A5ZKM5paH5Lu25L+d5a2Y6Lev5b6E77yM5Y+v5pu05pS55LiK6Z2i6L6T5YWl5qGG55qE5YaF5a6577yI5q2k5pWw5o2u6Z2e5bi46YeN6KaB77yM6K+35YeG56Gu5aGr5YaZ77yJPC9saT4KCQkJCQkJCQkJCQkJCTxsaT4KCQkJCQkJCQkJCQkJCSgzKeOAgU1vdHJpeOi/kOihjOWbvueJhwoJCQkJCQkJCQkJCQkJPGltZyBzcmM9Imh0dHBzOi8vcGljLnJtYi5iZHN0YXRpYy5jb20vYmpoLzg5MTI1ODJjMDQxNjExOTQwNWVjMzdlYTI3ZDEyMzc2LmpwZWciIHdpZHRoPSIxMDAlIiAvPgoJCQkJCQkJCQkJCQkJPC9saT4KCQkJCQkJCQkJCQkJPC91aT4KCQkJCQkJCQkJCQk8L2xpPgoJCQkJCQkJCQkJCTxsaT4KCQkJCQkJCQkJCQkJPGI+M+OAgem7mOiupFJQQ+m7mOiupOWcsOWdgDwvYj4KCQkJCQkJCQkJCQkJPHVsPgoJCQkJCQkJCQkJCQkJPGxpPigxKeOAgU1vdHJpeCBSUEPpu5jorqTlnLDlnYDvvJp3czovL2xvY2FsaG9zdDoxNjgwMC9qc29ucnBjPC9saT4KCQkJCQkJCQkJCQkJCTxsaT4oMinjgIFBcmlhMiBSUEPpu5jorqTlnLDlnYDvvJp3czovL2xvY2FsaG9zdDo2ODAwL2pzb25ycGM8L2xpPgoJCQkJCQkJCQkJCQk8L3VsPgoJCQkJCQkJCQkJCTwvbGk+CgkJCQkJCQkJCQkJPGxpPgoJCQkJCQkJCQkJCQk8Yj4z44CB5aaC5L2/55SoQXJpYU5nR1VJ77yM5L2/55So5pa55byP57G75Ly877yM5aSn5a625Y+v5Lul6Ieq6KGM56CU56m2PC9iPgoJCQkJCQkJCQkJCTwvbGk+CgkJCQkJCQkJCQk8L3VsPgoJCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJ0aXAtd3JhcCI+CgkJCQkJCQkJCTxkaXYgY2xhc3M9InRpdGxlIj7lv4XopoHor7TmmI7vvJo8L2Rpdj4KCQkJCQkJCQkJPGRpdiBjbGFzcz0iY29udGVudCI+CgkJCQkJCQkJCQnnlLPmmI7vvJrmnKzlip/og73ku4Xog73kvZzkuLrlrabkuaDkuqTmtYHkvb/nlKjvvIzkuJTkuI3lj6/nlKjkuo7lhbblroPnlKjpgJTvvIzlkKbliJnlkI7mnpzoh6rotJ/jgILor7flpKflrrbph43op4bniYjmnYPvvIzlsIrph43liJvkvZzogIXvvIzliIfli7/mkKzov5DmioTooq3jgILor7flpKflrrblpJrnlKhb5LiA6ZSu5LiJ6L+eXeS4uuWIm+S9nOiAheaKleW4gX7vvIzlsI/noLTnq5nniZvmjrDvvIEKCQkJCQkJCQkJPC9kaXY+CgkJCQkJCQkJPC9kaXY+CgkJCQkJCQk8L2Rpdj4KCQkJCQkJPC9kaXY+CgkJCQkJYDsKCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTWFkZFN0eWxlKGNzcyk7CgkJCQkJJCgiYm9keSIpLmFwcGVuZChodG1sKTsKCQkJCX07CgkJCQl0aGlzLmhpZGVNb2RhbHMgPSBmdW5jdGlvbigpewoJCQkJCSQoIi5tb2RhbC1ib2R5LSIrdGhpcy5lbGVtZW50SWQrIiIpLmNzcygnZGlzcGxheScsJ25vbmUnKTsKCQkJCQkkKCIubW9kYWwtbWFzay0iK3RoaXMuZWxlbWVudElkKyIiKS5jc3MoJ2Rpc3BsYXknLCdub25lJyk7CgkJCQl9OwoJCQkJdGhpcy5zaG93TW9kYWxzID0gZnVuY3Rpb24ocGFnZUh0bWwpewoJCQkJCWNvbnN0IHNlbGYgPSB0aGlzOwoJCQkJCSQoIi5tb2RhbC1ib2R5LSIrc2VsZi5lbGVtZW50SWQrIiIpLmNzcygnZGlzcGxheScsJ2Jsb2NrJyk7CgkJCQkJJCgiLm1vZGFsLW1hc2stIitzZWxmLmVsZW1lbnRJZCsiIikuY3NzKCdkaXNwbGF5JywnYmxvY2snKTsKCQkJCQkkKCIubW9kYWwtYm9keS0iK3NlbGYuZWxlbWVudElkKyIgLnBhZ2Utd3JhcCIpLmh0bWwocGFnZUh0bWwpOwoJCQkJCQoJCQkJCSQoIi5tb2RhbC1ib2R5LSIrc2VsZi5lbGVtZW50SWQrIiAucGFnZS13cmFwID4uYm9hcmQtaXRlbSA+c3BhbiIpLm9mZigiY2xpY2siKS5vbigiY2xpY2siLCBmdW5jdGlvbigpewoJCQkJCQkkKHRoaXMpLmNzcygiYmFja2dyb3VuZC1jb2xvciIsIiNjY2MiKTsKCQkJCQkJbGV0IGRvd25sb2FkT3B0aW9ucz17CgkJCQkJCQkiYWlkIjokKHRoaXMpLmRhdGEoImFpZCIpLAoJCQkJCQkJImNpZCI6JCh0aGlzKS5kYXRhKCJjaWQiKSwKCQkJCQkJCSJpc0J5UFJDIjpmYWxzZQoJCQkJCQl9CgkJCQkJCXNlbGYuc3RhcnREb3dubG9hZEZpbGUoZG93bmxvYWRPcHRpb25zKTsKCQkJCQl9KTsKCQkJCQkkKCIubW9kYWwtYm9keS0iK3NlbGYuZWxlbWVudElkKyIgLnBhZ2UtaGVhZGVyID5zcGFuLmNsb3NlIikub2ZmKCJjbGljayIpLm9uKCJjbGljayIsIGZ1bmN0aW9uKCl7CgkJCQkJCXNlbGYuaGlkZU1vZGFscygpOwoJCQkJCX0pOwoJCQkJCSQoIi5tb2RhbC1ib2R5LSIrc2VsZi5lbGVtZW50SWQrIiAubW9kYWwtYnRuLXdyYXAgPnNwYW5bbmFtZT0nc2VsZWN0YWxsJ10iKS5vZmYoImNsaWNrIikub24oImNsaWNrIiwgZnVuY3Rpb24oKXsKCQkJCQkJJCgiLm1vZGFsLWJvZHktIitzZWxmLmVsZW1lbnRJZCsiIC5wYWdlLXdyYXAiKS5maW5kKCJpbnB1dFt0eXBlPSdjaGVja2JveCddIikuZWFjaChmdW5jdGlvbigpewoJCQkJCQkJJCh0aGlzKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CgkJCQkJCX0pOwoJCQkJCX0pOwoJCQkJCSQoIi5tb2RhbC1ib2R5LSIrc2VsZi5lbGVtZW50SWQrIiAubW9kYWwtYnRuLXdyYXAgPnNwYW5bbmFtZT0ncmVtb3ZlU2VsZWN0J10iKS5vZmYoImNsaWNrIikub24oImNsaWNrIiwgZnVuY3Rpb24oKXsKCQkJCQkJJCgiLm1vZGFsLWJvZHktIitzZWxmLmVsZW1lbnRJZCsiIC5wYWdlLXdyYXAiKS5maW5kKCJpbnB1dFt0eXBlPSdjaGVja2JveCddIikuZWFjaChmdW5jdGlvbigpewoJCQkJCQkJJCh0aGlzKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwoJCQkJCQl9KTsKCQkJCQl9KTsKCQkJCQkkKCIubW9kYWwtYm9keS0iK3NlbGYuZWxlbWVudElkKyIgLm1vZGFsLWJ0bi13cmFwID5zcGFuW25hbWU9J2Rvd25sb2FkQWxsJ10iKS5vZmYoImNsaWNrIikub24oImNsaWNrIiwgZnVuY3Rpb24oKXsKCQkJCQkJbGV0IGlucHV0RWxlbWVudHMgPSAkKCIubW9kYWwtYm9keS0iK3NlbGYuZWxlbWVudElkKyIgLnBhZ2Utd3JhcCBpbnB1dFt0eXBlPSdjaGVja2JveCddOmNoZWNrZWQiKTsKCQkJCQkJaWYoaW5wdXRFbGVtZW50cy5sZW5ndGggPT0gMCl7CgkJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC53ZWJUb2FzdCh7Im1lc3NhZ2UiOiLoh7PlsJHpnIDopoHpgInkuK0xUCIsICJiYWNrZ3JvdW5kIjoiI0ZGNEQ0MCJ9KTsKCQkJCQkJCXJldHVybjsKCQkJCQkJfQoJCQkJCQlsZXQgUlBDVVJMID0gJCgiLm1vZGFsLWJvZHktIitzZWxmLmVsZW1lbnRJZCsiIGlucHV0W25hbWU9J1JQQ1VSTCddIikudmFsKCk7CgkJCQkJCWxldCBzYXZlUGF0aCA9ICQoIi5tb2RhbC1ib2R5LSIrc2VsZi5lbGVtZW50SWQrIiBpbnB1dFtuYW1lPSdzYXZlUGF0aCddIikudmFsKCk7CgkJCQkJCWxldCBSUENUb2tlbiA9ICQoIi5tb2RhbC1ib2R5LSIrc2VsZi5lbGVtZW50SWQrIiBpbnB1dFtuYW1lPSdSUENUb2tlbiddIikudmFsKCk7CgkJCQkJCQoJCQkJCQlpZighc2F2ZVBhdGgpewoJCQkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3Qud2ViVG9hc3QoeyJtZXNzYWdlIjoi5L+d5a2Y6Lev5b6E5LiN6IO95Li656m6IiwgImJhY2tncm91bmQiOiIjRkY0RDQwIn0pOwoJCQkJCQkJcmV0dXJuOwoJCQkJCQl9CgkJCQkJCWlmKCFSUENVUkwpewoJCQkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3Qud2ViVG9hc3QoeyJtZXNzYWdlIjoiUFJD5Zyw5Z2A5LiN6IO95Li656m6IiwgImJhY2tncm91bmQiOiIjRkY0RDQwIn0pOwoJCQkJCQkJcmV0dXJuOwoJCQkJCQl9CgkJCQkJCVJQQ1Rva2VuID0gIVJQQ1Rva2VuID8gIiIgOiBSUENUb2tlbjsKCQkJCQkJbGV0IGRvd25sb2FkT3B0aW9ucyA9IHsKCQkJCQkJCSJhaWQiOiIiLAoJCQkJCQkJImNpZCI6IiIsCgkJCQkJCQkiaXNCeVBSQyI6dHJ1ZSwKCQkJCQkJCSJmaWxlTmFtZSI6IiIsCgkJCQkJCQkic2F2ZVBhdGgiOnNhdmVQYXRoLAoJCQkJCQkJIlJQQ1VSTCI6UlBDVVJMLAoJCQkJCQkJIlJQQ1Rva2VuIjpSUENUb2tlbgoJCQkJCQl9CgkJCQkJCWNvbnNvbGUubG9nKCJkb3dubG9hZE9wdGlvbnMiLCBkb3dubG9hZE9wdGlvbnMpOwoJCQkJCQlpbnB1dEVsZW1lbnRzLmVhY2goZnVuY3Rpb24oKXsKCQkJCQkJCXNldFRpbWVvdXQoKCk9PnsKCQkJCQkJCQlsZXQgYWlkPSQodGhpcykuZGF0YSgiYWlkIiksIGNpZCA9ICQodGhpcykuZGF0YSgiY2lkIiksIGZpbGVOYW1lID0gJCh0aGlzKS5hdHRyKCJ0aXRsZSIpOwoJCQkJCQkJCWRvd25sb2FkT3B0aW9ucy5haWQgPSBhaWQ7CgkJCQkJCQkJZG93bmxvYWRPcHRpb25zLmNpZCA9IGNpZDsKCQkJCQkJCQlkb3dubG9hZE9wdGlvbnMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKCQkJCQkJCQlzZWxmLnN0YXJ0RG93bmxvYWRGaWxlKGRvd25sb2FkT3B0aW9ucyk7CgkJCQkJCQl9LCAxMDAwKTsKCQkJCQkJfSkKCQkJCQl9KTsKCQkJCX07CgkJCQl0aGlzLmNyZWF0ZUVsZW1lbnRIdG1sID0gZnVuY3Rpb24oKXsKCQkJCQl0aGlzLmNyZWF0ZU1vZGFscygpOyAgLy/liJvlu7rlvLnmoYYKCQkJCQljb25zdCByYW5kb21OdW1iZXIgPSB0aGlzLmVsZW1lbnRJZCwgc2VsZiA9IHRoaXM7CgkJCQkJbGV0IGNzc1RleHQgPSBgCgkJCQkJCSNiaWxpYmlsaV9leHRpX2ArcmFuZG9tTnVtYmVyK2B7CgkJCQkJCQlwYWRkaW5nOjEwcHg7CgkJCQkJCX0KCQkJCQkJI2JpbGliaWxpX2V4dGlfYCtyYW5kb21OdW1iZXIrYCA+LnNlbGZfc19idG57CgkJCQkJCQliYWNrZ3JvdW5kLWNvbG9yOiNGQjcyOTk7CgkJCQkJCQljb2xvcjojRkZGOwoJCQkJCQkJZm9udC1zaXplOjEwcHg7CgkJCQkJCQlkaXNwbGF5OmlubGluZS1ibG9jazsKCQkJCQkJCW1hcmdpbi1yaWdodDoxNXB4OwoJCQkJCQkJcGFkZGluZzoycHggNHB4OwoJCQkJCQkJYm9yZGVyLXJhZGl1czozcHg7CgkJCQkJCQljdXJzb3I6cG9pbnRlcjsKCQkJCQkJfQoJCQkJCWA7CgkJCQkJbGV0IGh0bWxUZXh0PWAKCQkJCQkJPGRpdiBpZD0iYmlsaWJpbGlfZXh0aV9gK3JhbmRvbU51bWJlcitgIj4KCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWxmX3NfYnRuIiBpZD0iZG93bmxvYWRfc19gK3JhbmRvbU51bWJlcitgIj7kuIvovb3op4bpopEv5bCB6Z2i77yI5pyA6auY5riF77yJPC9zcGFuPgoJCQkJCQkJPHNwYW4gY2xhc3M9InNlbGZfc19idG4iIGlkPSJmb2N1c19zX2ArcmFuZG9tTnVtYmVyK2AiPuS4gOmUruS4iei/njwvc3Bhbj4KCQkJCQkJPC9kaXY+CgkJCQkJYDsKCQkJCQlzZXRUaW1lb3V0KCgpPT57IC8v5bu25pe255qE55uu55qE5piv6K6pQuermeWFiOWKoOi9veWujOWFqAkJCQkKCQkJCQkJY29uc3QgcGxheWVySW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKT0+ewoJCQkJCQkJbGV0ICR2aWV3Ym94UmVwb3J0ID0gJCgiI2FyY190b29sYmFyX3JlcG9ydCIpOwoJCQkJCQkJaWYoJCgiI2ZvY3VzX3NfIityYW5kb21OdW1iZXIpLmxlbmd0aD09MCAmJiAkdmlld2JveFJlcG9ydC5sZW5ndGghPTApewoJCQkJCQkJCSQoImJvZHkiKS5wcmVwZW5kKCI8c3R5bGU+Iitjc3NUZXh0KyI8L3N0eWxlPiIpOwoJCQkJCQkJCSR2aWV3Ym94UmVwb3J0LmJlZm9yZShodG1sVGV4dCk7CgkJCQkJCQl9ZWxzZXsKCQkJCQkJCQljbGVhckludGVydmFsKHBsYXllckludGVydmFsKTsKCQkJCQkJCX0KCQkJCQkJfSwgMTAwKTsKCQkJCQl9LCAyODAwKTsKCQkJCQkKCQkJCQkkKCJib2R5Iikub24oImNsaWNrIiwgIiNkb3dubG9hZF9zXyIrcmFuZG9tTnVtYmVyLCBmdW5jdGlvbigpewoJCQkJCQljb25zdCBidG5FbGVtZW50ID0gJCh0aGlzKTsKCQkJCQkJYnRuRWxlbWVudC5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwoJCQkJCQlidG5FbGVtZW50LnRleHQoIuS4i+i9veinhumikS/lsIHpnaLvvIjlh4blpIfkuK3vvIkiKTsKCQkJCQkJLy/lvIDlp4vlh4blpIfkuIvovb3mlbDmja4KCQkJCQkJc2VsZi5nZXREb3dubG9hZFBhZ2VzKCkudGhlbigocmVzdWxlKT0+ewoJCQkJCQkJaWYocmVzdWxlLnN0YXR1cz09PSJzdWNjZXNzIil7CgkJCQkJCQkJdmFyIGFpZCA9IHJlc3VsZS5kb3dubG9hZERhdGEuYWlkLCBwYWdlcyA9IHJlc3VsZS5kb3dubG9hZERhdGEucGFnZXMsIGl0ZW1IdG1sID0gIiIsIHBpYz1yZXN1bGUuZG93bmxvYWREYXRhLnBpYywgdGl0bGU9cmVzdWxlLmRvd25sb2FkRGF0YS50aXRsZTsKCQkJCQkJCQlpdGVtSHRtbCArPSAiPGRpdiBzdHlsZT0nd2lkdGg6MTAwJTsnPjxhIGhyZWY9JyIrcGljKyInIHRhcmdldD0nX2JsYW5rJz7moIfpopjvvJoiK3RpdGxlKyLvvIjngrnmiJHot7PovazlsIHpnaLvvIk8L2E+PC9kaXY+IjsKCQkJCQkJCQlmb3IodmFyIGk9MDsgaTxwYWdlcy5sZW5ndGg7IGkrKyl7CgkJCQkJCQkJCXRpdGxlICs9ICLjgJBQIitwYWdlc1tpXS5wYWdlKyLjgJEiK3BhZ2VzW2ldLnBhcnQrIiI7CgkJCQkJCQkJCWl0ZW1IdG1sICs9ICI8ZGl2IGNsYXNzPSdib2FyZC1pdGVtJz4iOwoJCQkJCQkJCQlpdGVtSHRtbCArPSAiPGlucHV0IGRhdGEtYWlkPSciK2FpZCsiJyBkYXRhLWNpZD0nIitwYWdlc1tpXS5jaWQrIicgdGl0bGU9JyIrdGl0bGUrIicgdHlwZT0nY2hlY2tib3gnPiIKCQkJCQkJCQkJaXRlbUh0bWwgKz0gIjxzcGFuIGRhdGEtYWlkPSciK2FpZCsiJyBkYXRhLWNpZD0nIitwYWdlc1tpXS5jaWQrIicgdGl0bGU9JyIrdGl0bGUrIic+Iit0aXRsZSsiPC9zcGFuPiI7CgkJCQkJCQkJCWl0ZW1IdG1sICs9ICI8L2Rpdj4iOwoJCQkJCQkJCX0KCQkJCQkJCQlzZWxmLnNob3dNb2RhbHMoaXRlbUh0bWwpOwoJCQkJCQkJCXNlbGYuZG93bmxvYWRSZXN1dFN1Y2Nlc3MoYnRuRWxlbWVudCk7CgkJCQkJCQl9ZWxzZXsKCQkJCQkJCQlzZWxmLmRvd25sb2FkUmVzdXRFcnJvcihidG5FbGVtZW50KTsKCQkJCQkJCX0KCQkJCQkJfSkuY2F0Y2goKGVycm9yKT0+ewoJCQkJCQkJc2VsZi5kb3dubG9hZFJlc3V0RXJyb3IoYnRuRWxlbWVudCk7CgkJCQkJCX0pOwoJCQkJCX0pOwoJCQkJCSQoImJvZHkiKS5vbigiY2xpY2siLCAiI2ZvY3VzX3NfIityYW5kb21OdW1iZXIsIGZ1bmN0aW9uKCl7CgkJCQkJCSQoIiNhcmNfdG9vbGJhcl9yZXBvcnQgLnZpZGVvLWxpa2UiKS5jbGljaygpOyAvLyDngrnotZ4KCQkJCQkJJCgiI2FyY190b29sYmFyX3JlcG9ydCAudmlkZW8tY29pbiIpLmNsaWNrKCk7IC8vIOaKleW4gQoJCQkJCQkvLyAkKCIjYXJjX3Rvb2xiYXJfcmVwb3J0IC52aWRlby1mYXYiKS5jbGljaygpOyAvLyDmlLbol48KCQkJCQl9KTsKCQkJCX0KCQkJCXRoaXMuc3RhcnQgPSBmdW5jdGlvbigpewoJCQkJCWxldCBsb2NhdGlvbkhvc3QgPSB3aW5kb3cubG9jYXRpb24uaG9zdCwgbG9jYXRpb25QYXRobmFtZSA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKCQkJCQlpZihsb2NhdGlvbkhvc3Q9PT0id3d3LmJpbGliaWxpLmNvbSIgJiYgKGxvY2F0aW9uUGF0aG5hbWUuaW5kZXhPZigiL3ZpZGVvIikhPS0xIHx8IGxvY2F0aW9uUGF0aG5hbWUuaW5kZXhPZigiL3dhdGNobGF0ZXIiKSE9LTEpKXsKCQkJCQkJdGhpcy5jcmVhdGVFbGVtZW50SHRtbCgpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQl0cnl7CgkJCQkobmV3IGJhc2VGdW5jdGlvbk9iamVjdCgpKS5zdGFydCgpOwoJCQl9Y2F0Y2goZSl7CgkJCQljb25zb2xlLmxvZygiYmFzZUZ1bmN0aW9uT2JqZWN0IG5ldyBlcnJvciIsIGUpOwoJCQl9CgkJfTsKCQkvKioKCQkgKiDmtY/op4jljoblj7LorrDlvZXmj5DphpIKCQkgKi8KCQl0aGlzLnJlY29yZFZpZXdGdW5jdGlvbiA9IGZ1bmN0aW9uKCl7CgkJCWZ1bmN0aW9uIHJlY29yZFZpZXdPYmplY3QoKXsKCQkJCXRoaXMubG9jYWxDYWNoZU5hbWUgPSAiYmlsaWJpbGlfdmlkZW9fcmVjb3JkIjsgCgkJCQl0aGlzLnJlY29yZE9uZVZpZGVvID0gZnVuY3Rpb24oKXsKCQkJCQlsZXQgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpPT57CgkJCQkJCWxldCBidiA9IGNvbW1vbkZ1bmN0aW9uT2JqZWN0LmdldEJpbGliaWxpQlYoKTsKCQkJCQkJbGV0IGNhY2hlVGV4dCA9IGNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNZ2V0VmFsdWUodGhpcy5sb2NhbENhY2hlTmFtZSk7CgkJCQkJCWNhY2hlVGV4dCA9ICFjYWNoZVRleHQgPyAiIiA6IGNhY2hlVGV4dAoJCQkJCQlsZXQgbWF4TGVuZ3RoID0gMTIqNTAwOwoJCQkJCQlsZXQgY3VycmVudExlbmd0aCA9IGNhY2hlVGV4dC5sZW5ndGg7CgkJCQkJCWlmKGN1cnJlbnRMZW5ndGggPiBtYXhMZW5ndGgpewoJCQkJCQkJY2FjaGVUZXh0ID0gY2FjaGVUZXh0LnN1YnN0cmluZygxMioxMDAsIGN1cnJlbnRMZW5ndGgpOwoJCQkJCQl9CgkJCQkJCQoJCQkJCQlpZihjYWNoZVRleHQuaW5kZXhPZihidik9PS0xKXsKCQkJCQkJCWNhY2hlVGV4dCArPSBidjsKCQkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNc2V0VmFsdWUodGhpcy5sb2NhbENhY2hlTmFtZSwgY2FjaGVUZXh0KTsKCQkJCQkJfQoJCQkJCQlyZXNvbHZlKHsicmVzdWx0Ijoic3VjY2VzcyJ9KTsKCQkJCQl9KTsKCQkJCX07CgkJCQl0aGlzLnNlYXJjaFBhZ2VSZW1pbmRIdG1sID0gZnVuY3Rpb24oJGVsZSwgdG9wPTgsIHJpZ2h0PTgpewoJCQkJCWlmKCRlbGUuZmluZCgiZGl2W25hbWU9J21hcmtsb29rZWQnXSIpLmxlbmd0aD09MCl7CQkJCQkJCgkJCQkJCSRlbGUuY3NzKCJwb3NpdGlvbiIsInJlbGF0aXZlIik7CgkJCQkJCSRlbGUuYXBwZW5kKCI8ZGl2IG5hbWU9J21hcmtsb29rZWQnIHN0eWxlPSd6LWluZGV4OiAxMDA7cG9zaXRpb246YWJzb2x1dGU7IHRvcDoiK3RvcCsicHg7IHJpZ2h0OiIrcmlnaHQrInB4OyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1MSwxMjMsMTU5LDEpOyBib3JkZXItcmFkaXVzOjNweDsgZm9udC1zaXplOjEwcHg7IGNvbG9yOiNGRkY7cGFkZGluZzowcHggMnB4Oyc+5bey55yLPC9kaXY+Iik7CgkJCQkJfQoJCQkJfTsKCQkJCXRoaXMuc2VhcmNoUGFnZVJlbWluZCA9IGZ1bmN0aW9uKCl7CgkJCQkJbGV0ICR0aGF0ID0gdGhpczsKCQkJCQl2YXIgZWxlbWVudEFycmF5ID0gWwoJCQkJCQl7Im5vZGUiOiIuYmlsaS12aWRlby1jYXJkIiwgInRvcCI6OCwgInJpZ2h0IjoxMn0sICAvL+WFvOWuuSBNQUMgTTHmkJzntKLnu5PmnpwKCQkJCQkJeyJub2RlIjoiI3BhZ2UtaW5kZXggLnNtYWxsLWl0ZW0iLCAidG9wIjoxMiwgInJpZ2h0IjoxMn0sICAvL+eUqOaIt+aKleeovwoJCQkJCQl7Im5vZGUiOiIjc3VibWl0LXZpZGVvLWxpc3QgLnNtYWxsLWl0ZW0iLCAidG9wIjoxMiwgInJpZ2h0IjoxMn0sIC8v55So5oi35Li76aG1CgkJCQkJCXsibm9kZSI6IiNwYWdlLXNlcmllcy1kZXRhaWwgLnNtYWxsLWl0ZW0uZmFrZURhbm11LWl0ZW0iLCAidG9wIjoxMiwgInJpZ2h0IjoxMn0sIC8v55So5oi35Li76aG15oqV56i/CgkJCQkJXTsKCQkJCQlzZXRJbnRlcnZhbChmdW5jdGlvbigpewoJCQkJCQlsZXQgY2FjaGVUZXh0ID0gY29tbW9uRnVuY3Rpb25PYmplY3QuR01nZXRWYWx1ZSgkdGhhdC5sb2NhbENhY2hlTmFtZSk7CgkJCQkJCWNhY2hlVGV4dCA9ICFjYWNoZVRleHQgPyAiIiA6IGNhY2hlVGV4dDsKCQkJCQkJZm9yKHZhciBpPTA7IGk8ZWxlbWVudEFycmF5Lmxlbmd0aDsgaSsrKXsKCQkJCQkJCXZhciBlbGVtZW50b2JqID0gZWxlbWVudEFycmF5W2ldOwoJCQkJCQkJJChlbGVtZW50b2JqLm5vZGUpLmVhY2goZnVuY3Rpb24oKXsKCQkJCQkJCQlpZigkKHRoaXMpLmF0dHIoImRlYWx4bGwiKSE9PSJ0cnVlIil7CgkJCQkJCQkJCXZhciB2aWRlb3VybCA9ICQodGhpcykuZmluZCgiYVtocmVmXj0nLy93d3cuYmlsaWJpbGkuY29tL3ZpZGVvJ10iKS5hdHRyKCJocmVmIik7CgkJCQkJCQkJCWlmKCEhdmlkZW91cmwpewoJCQkJCQkJCQkJdmFyIGJ2cyA9IHZpZGVvdXJsLm1hdGNoKC8oXC9CViguKj8pXC8pL2cpCgkJCQkJCQkJCQlpZihidnMubGVuZ3RoPT0xKXsKCQkJCQkJCQkJCQl2YXIgYnYgPSBidnNbMF0ucmVwbGFjZSgvXC8vZywiIik7CgkJCQkJCQkJCQkJaWYoY2FjaGVUZXh0LmluZGV4T2YoYnYpICE9IC0xKXsKCQkJCQkJCQkJCQkJJHRoYXQuc2VhcmNoUGFnZVJlbWluZEh0bWwoJCh0aGlzKSwgZWxlbWVudG9iai50b3AsIGVsZW1lbnRvYmoucmlnaHQpOwoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQkkKHRoaXMpLnVuYmluZCgiY2xpY2siKS5iaW5kKCJjbGljayIsICgpPT57ICAvL+W+queOr+aTjeS9nO+8jOWNleeLrOe7keWumgoJCQkJCQkJCQkJCQkkdGhhdC5zZWFyY2hQYWdlUmVtaW5kSHRtbCgkKHRoaXMpLCBlbGVtZW50b2JqLnRvcCwgZWxlbWVudG9iai5yaWdodCk7CgkJCQkJCQkJCQkJfSkKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCSQodGhpcykuYXR0cigiZGVhbHhsbCIsInRydWUiKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0pOwoJCQkJCQl9CgkJCQkJfSwgNTAwKTsKCQkJCX0KCQkJCXRoaXMuc3RhcnQ9ZnVuY3Rpb24oKXsKCQkJCQlsZXQgJHRoYXQgPSB0aGlzOwoJCQkJCWlmKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5pbmRleE9mKCIvdmlkZW8iKSE9LTEgJiYgd2luZG93LmxvY2F0aW9uLmhvc3Q9PT0id3d3LmJpbGliaWxpLmNvbSIpewoJCQkJCQlsZXQgY3VycmVudEhyZWYgPSAiIjsKCQkJCQkJc2V0SW50ZXJ2YWwoKCk9PnsgLy/pnIDopoHlvqrnjq/lrZjlgqgKCQkJCQkJCWlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmICE9PSBjdXJyZW50SHJlZil7CgkJCQkJCQkJdGhpcy5yZWNvcmRPbmVWaWRlbygpOwoJCQkJCQkJCWN1cnJlbnRIcmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CgkJCQkJCQl9CgkJCQkJCX0sIDUwMCk7CgkJCQkJfQoJCQkJCS8v5pCc57Si57uT5p6c5ZKM55So5oi35Li76aG15bey57uP55yL6L+H55qE6KeG6aKR5o+Q6YaSCgkJCQkJaWYod2luZG93LmxvY2F0aW9uLmhvc3QuaW5kZXhPZigiYmlsaWJpbGkuY29tIikhPS0xKXsKCQkJCQkJdGhpcy5zZWFyY2hQYWdlUmVtaW5kKCk7CgkJCQkJCUdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoIua4heepukLnq5nmtY/op4jorrDlvZUiLGZ1bmN0aW9uKCl7CgkJCQkJCQlpZihjb25maXJtKCfmmK/lkKbopoHmuIXnqbpC56uZ5rWP6KeI6K6w5b2V77yf5riF56m65ZCO5bCG5LiN5Y+v5oGi5aSNLi4uJykpewoJCQkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNc2V0VmFsdWUoJHRoYXQubG9jYWxDYWNoZU5hbWUsICIiKTsKCQkJCQkJCX0KCQkJCQkJfSk7CgkJCQkJfQoJCQkJfTsKCQkJfQoJCQl0cnl7CgkJCQkobmV3IHJlY29yZFZpZXdPYmplY3QoKSkuc3RhcnQoKTsKCQkJfWNhdGNoKGUpewoJCQkJY29uc29sZS5sb2coInJlY29yZFZpZXdPYmplY3QgbmV3IGVycm9yIiwgZSk7CgkJCX0KCQl9OwoJCS8qKgoJCSAqIOinhumikeaPj+i/sOaWh+acrOi9rOmTvuaOpQoJCSAqLwoJCXRoaXMudGV4dFRvTGlua0Z1bmN0aW9uID0gZnVuY3Rpb24oKSB7CgkJCWZ1bmN0aW9uIHRleHRUb0xpbmtPYmplY3QoKXsKCQkJCXRoaXMubGluayA9IGZ1bmN0aW9uKCl7CgkJCQkJaWYgKGZpbmRBbmRSZXBsYWNlRE9NVGV4dChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuZGVzYy1pbmZvLXRleHQiKSwgewoJCQkJCQlmaW5kOiAvKGh0dHB8ZnRwfGh0dHBzKTpcL1wvW1x3XC1fXSsoXC5bXHdcLV9dKykrKFtcd1wtXC4sQD9ePSUmYW1wOzovflwrI10qW1x3XC1cQD9ePSUmYW1wOy9+XCsjXSk/L2csCgkJCQkJCXJlcGxhY2U6IGZ1bmN0aW9uIChlLCB0KSB7CgkJCQkJCQlsZXQgdGV4dCA9IGUudGV4dDsKCQkJCQkJCWxldCBlbGVtZW50ID0gbnVsbDsKCQkJCQkJCWlmKHRleHQuaW5kZXhPZigiYmlsaWJpbGkuY29tIik9PS0xICYmIC9eKGh0dHB8ZnRwfGh0dHBzKS9pLnRlc3QodGV4dCkpewoJCQkJCQkJCWVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CgkJCQkJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoImhyZWYiLCB0ZXh0KQoJCQkJCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0YXJnZXQiLCAiX2JsYW5rIik7CgkJCQkJCQl9ZWxzZXsKCQkJCQkJCQllbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwoJCQkJCQkJfQoJCQkJCQkJZWxlbWVudC5pbm5lclRleHQgPSB0ZXh0OwoJCQkJCQkJcmV0dXJuIGVsZW1lbnQ7CgkJCQkJCX0sIAoJCQkJCQlwcmVzZXQ6ICJwcm9zZSIKCQkJCQl9KSk7CgkJCQl9CgkJCQl0aGlzLnN0YXJ0ID0gZnVuY3Rpb24oKXsKCQkJCQlsZXQgTXV0YXRpb25PYnNlcnZlciA9IHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyIHx8IHdpbmRvdy5XZWJLaXRNdXRhdGlvbk9ic2VydmVyIHx8IHdpbmRvdy5Nb3pNdXRhdGlvbk9ic2VydmVyCgkJCQkJbGV0IGJvZHlNdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCk9PnsKCQkJCQkJdGhpcy5saW5rKCkKCQkJCQl9KTsKCQkJCQlsZXQgdGl0bGVFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigidGl0bGUiKTsKCQkJCQlpZih0aXRsZUVsZW1lbnQpewoJCQkJCQlib2R5TXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKHRpdGxlRWxlbWVudCwgeyJjaGFyYWN0ZXJEYXRhIjp0cnVlLCJhdHRyaWJ1dGVzIjp0cnVlLCAiY2hpbGRMaXN0Ijp0cnVlfSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXRyeXsKCQkJCShuZXcgdGV4dFRvTGlua09iamVjdCgpKS5zdGFydCgpOwoJCQl9Y2F0Y2goZSl7CgkJCQljb25zb2xlLmxvZygidGV4dFRvTGlua09iamVjdCBuZXcgZXJyb3IiLCBlKTsKCQkJfQoJCX0KCQl0aGlzLnNpZ25JbiA9IGFzeW5jIGZ1bmN0aW9uKCl7IC8vQmxpYmlsaSDoh6rliqjnrb7liLAKCQkJY29uc3QgbXlEYXRlID0gbmV3IERhdGUoKQoJCQl2YXIgY3VycmVudERhdGUgPSBteURhdGUuZ2V0RnVsbFllYXIoKSsiLSIrKG15RGF0ZS5nZXRNb250aCgpICsgMSkgKyAiLSIrbXlEYXRlLmdldERhdGUoKTsKCQkJdmFyIHRleHQgPSAi5LuK5pel5bey562+IjsKCQkJaWYoY29tbW9uRnVuY3Rpb25PYmplY3QuR01nZXRWYWx1ZSgiYmlsaWJpbGlfc2lnbkluIiwgbnVsbCkgPT09IGN1cnJlbnREYXRlKXsgLy/lt7Lnu4/nrb7liLAKCQkJCXRleHQgPSAi5LuK5pel5bey562+IjsKCQkJfWVsc2V7CgkJCQl0cnl7CgkJCQkJY29uc3QgcmVzdWx0ID0gYXdhaXQgY29tbW9uRnVuY3Rpb25PYmplY3QucmVxdWVzdCgiR0VUIiwgImh0dHBzOi8vYXBpLmxpdmUuYmlsaWJpbGkuY29tL3NpZ24vZG9TaWduIiwgbnVsbCk7CgkJCQkJaWYocmVzdWx0ICYmIHJlc3VsdC5yZXN1bHQ9PSJzdWNjZXNzIil7CgkJCQkJCWNvbnN0IGpzb24gPSBKU09OLnBhcnNlKHJlc3VsdC5kYXRhKTsKCQkJCQkJaWYoanNvbi5oYXNPd25Qcm9wZXJ0eSgiY29kZSIpKXsKCQkJCQkJCWNvbnN0IGNvZGUgPSBqc29uLmNvZGU7CgkJCQkJCQlpZihjb2RlID09IC0xMDEpeyAvL+acqueZu+W9lQoJCQkJCQkJCXRleHQgPSAi5pyq55m75b2VIjsKCQkJCQkJCX1lbHNlIGlmKGNvZGUgPT0gMTAxMTA0MCl7Ly/lt7Lnu4/nrb7liLDkuoYKCQkJCQkJCQl0ZXh0ID0gIuS7iuaXpeW3suetviI7CgkJCQkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3QuR01zZXRWYWx1ZSgiYmlsaWJpbGlfc2lnbkluIiwgY3VycmVudERhdGUpOwoJCQkJCQkJfWVsc2UgaWYoY29kZSA9PSAwKXsvL+etvuWIsOaIkOWKnwoJCQkJCQkJCXRleHQgPSAi5LuK5pel5bey562+IjsKCQkJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTXNldFZhbHVlKCJiaWxpYmlsaV9zaWduSW4iLCBjdXJyZW50RGF0ZSk7CgkJCQkJCQl9ZWxzZXsKCQkJCQkJCQl0ZXh0ID0gIuetvuWIsOW8guW4uCI7CgkJCQkJCQl9CgkJCQkJCX1lbHNlewoJCQkJCQkJdGV4dCA9ICLnrb7liLDlvILluLgiOwoJCQkJCQl9CgkJCQkJfQoJCQkJfWNhdGNoKGUpewoJCQkJCXRleHQgPSAi562+5Yiw5Ye66ZSZIgoJCQkJfQoJCQl9CgkJCXZhciBodG1sID0gYAoJCQkJPGRpdiBpZD0iYmlsaWJpbGlfc2lnbkluIiBzdHlsZT0id2lkdGg6MTJweDtmb250LXNpemU6MTJweDtwb3NpdGlvbjpmaXhlZDt0b3A6MjAwcHg7bGVmdDowcHg7YmFja2dyb3VuZC1jb2xvcjojRkM4QkFCO2NvbG9yOiNGRkY7Ij5gK3RleHQrYDwvZGl2PgoJCQlgOwoJCQkkKCJib2R5IikuYXBwZW5kKGh0bWwpOwoJCX0KCQl0aGlzLnN0YXJ0ID0gZnVuY3Rpb24oKXsKCQkJaWYodGhpcy5pc1J1bigpKXsKCQkJCXRoaXMuYmFzZUZ1bmN0aW9uKCk7CgkJCQl0aGlzLnJlY29yZFZpZXdGdW5jdGlvbigpOwoJCQkJdGhpcy50ZXh0VG9MaW5rRnVuY3Rpb24oKTsKCQkJCXRoaXMuc2lnbkluKCk7CgkJCX0KCQl9Cgl9CgkKCS8v5Zu95aSW55qE5LiA5Lqb6Kej5p6QCglmdW5jdGlvbiBhYnJvYWRWaWRlb0hlbHBlcigpewoJCXRoaXMuaXNSdW4gPSBmdW5jdGlvbigpewoJCQl2YXIgdXJscz1bInlvdXR1YmUuY29tIiwgImZhY2Vib29rLmNvbSJdOwoJCQlmb3IodmFyIGk9MDsgaTx1cmxzLmxlbmd0aDtpKyspewoJCQkJaWYod2luZG93LmxvY2F0aW9uLmhvc3QuaW5kZXhPZih1cmxzW2ldKSE9LTEpewoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9OwoJCXRoaXMuc3RhcnQgPSBmdW5jdGlvbigpewoJCQlpZighdGhpcy5pc1J1bigpKXsKCQkJCXJldHVybjsKCQkJfQoJCQlzZXRJbnRlcnZhbChmdW5jdGlvbigpewoJCQkJY29uc3QgaG9zdCA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0OwoJCQkJY29uc3QgaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwoJCQkJY29uc3QgZWxlSWQgPSAiZnJlZS14eDEtcGxheWVyLXNjcmlwdC05OTk5IjsKCQkJCQoJCQkJLy95b3V0dWJl6Kej5p6QCgkJCQlpZihob3N0LmluZGV4T2YoInlvdXR1YmUuY29tIikhPS0xKXsKCQkJCQlpZihocmVmLmluZGV4T2YoInlvdXR1YmUuY29tL3dhdGNoIikhPS0xKXsKCQkJCQkJaWYoJCgiIyIrZWxlSWQpLmxlbmd0aCAhPSAwKXsKCQkJCQkJCXJldHVybjsKCQkJCQkJfQoJCQkJCQkkKCIjcGxheWVyLXRoZWF0ZXItY29udGFpbmVyIikuY3NzKCJ6LWluZGV4Iiw5OTk5OTk5OTk5KTsgLy/kv67lpI3lhajlsY/mmL7npLrop6PmnpDmjInpkq7nmoTpl67popgKCQkJCQkJdmFyIGljb25WaWRlbyA9ICJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQURBQUFBQXdDQVlBQUFCWEF2bUhBQUFET1VsRVFWUm9RKzJaejR1TlVSakhQOStGOGc4Z3lrS0pOSk1VVW16TURLWm1ZVllzTEJSaE9hRW1GaFJSTENaRFk0UEJySlJSRWtVTW1ZM1VSQ2svczZHTWhSOVpXTms5T3ZYTzdiMTMzdmUrNTd3LzdzelVuTHFiZTU5Zm4vT2M4NXpubkN2bStOQWNqNTk1Z0hnR3pXd0RzQlpZRGF3RUZnSS9nVC9BUjBuRFpXZThsQXlZV1Rld0Y5aVRFZUE0TUNUcGJsa2doUUhNN0J4d1BEQ2dBVW45Z1RxSjRvVUF6T3dLY0NobklDT1M5dVhVcmFubEJqQ3phOENCZ2dGY2xIU2tpSTFjQUdiV0JUd3Q0amltMnkzcFNWNWJ3UUJtdGdxNEJhelA2N1JCN3czZ3N2QVgrQ2JwVjRoZEw0Q29QRzRIM0tjanhFRU9XVmR5SHdQamtxNW02V2NDbU5tRmFJYXliRlh4KzJ2Z3NxU1JOT09wQUdhMkdIaFk0bElwQW5oYTBxa2tBNGtBWnVaTzBrOUZQRmFnMnlISkhZUjFJdzNnTzdDc2dpQ0ttUHdNZEVtYWpCdVpCbUJtYnVNY0xPS3BRdDFCU1VkVEFjek1WWm1RbWp3dHBUbUMzeHFvMHlicHc1Uk9YUWJNckErNDVHdFFVbVlWeTdKbFpwWWwwL0I3M1ladUJBanFiV1lJNEtXa3pXa1plQlZTTnVNQVp1YTFGQm9yU1k0TVRFcGFuZ1lRbE00RWdPZFp5NkV4YXprQWlOdG9YRUx2Z0xhc0lHcjBzVDBRWmFBVkFPOGx0YWRsWUJUWU5jc0I3a2phblFad0hqZzJ5d0dhVmlIWElydU43RFZtWUErNGxudWRwQytKR1hCZmhsd1Rad0RBUFFpNHM2bzJrbG9KOXl6eXlLY1hhakdBNjRGNkpMMXRDaEJsd2RYMG9JclNnaXJVSytsKzQ5cHVkaC9JaEdoaEJ2b2xEU1J0ekthOWpKa3RCZHhyV2sraWN2WG53TzNvSWV4RldsWEpiTWJNYkFHd0pRV2cxbzBXV0VLcExValNCY1o3Q1huVjBaaFFYb0JRUC9NQVV6TmdadTVaOEViUkdRVDJTN3FaMTA3bUhtaG11SVFubDJsWHhGQ1FRZ0RSbVRFR2JBdDFESXhKMnBGRHIwNmxESUJGZ0RzZGx3UUU4d05vbC9RN1FDZFJ0REJBbElWTzRGbEFNSjJTTWs5NkgzdWxBRVFRaDRGQkQ2ZDlrb1k4NUx4RVNnT0lJSzY3cXRMRTg3Q2tVdCtjU2dXSUlDYUFqUWtRRTVJMmVVMXJnRkFWQUNzQTkvRGsvcUdjR3YrQU5aSytCc1RtSlZvNlFKU0ZYdUJlTElLZGtoNTRSUlFvVkFsQUJIRUNPQU9jbEhRMk1DNXY4Y29BSW9qUitBdUNkMVFCZ3BVQ0JNU1JXM1FlSVBmVWxhVDRIMC83UlVBaTJhL05BQUFBQUVsRlRrU3VRbUNDIjsKCQkJCQkJdmFyIGh0bWw9JzxkaXYgaWQ9IicrZWxlSWQrJyIgc3R5bGU9IndpZHRoOjI1cHg7cGFkZGluZzoxMHB4IDBweDt0ZXh0LWFsaWduOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiNFNTIxMkU7cG9zaXRpb246Zml4ZWQ7dG9wOjI1MHB4O2xlZnQ6MHB4O2NvbG9yOiNGRkY7Zm9udC1zaXplOjBweDtjdXJzb3I6cG9pbnRlcjttYXJnaW46MHB4IGF1dG87dGV4dC1hbGlnbjpjZW50ZXI7ei1pbmRleDo5OTk5OTk5OyI+JysKCQkJCQkJCSc8aW1nIHNyYz0iJytpY29uVmlkZW8rJyIgc3R5bGU9IndpZHRoOjIwcHg7Ij4nKwoJCQkJCQkJJzwvZGl2Pic7CgkJCQkJCSQoImJvZHkiKS5hcHBlbmQoaHRtbCk7CgkJCQkJCSQoImJvZHkiKS5vbigiY2xpY2siLCAiIyIrZWxlSWQsIGZ1bmN0aW9uKCl7CgkJCQkJCQl2YXIgbG9jYXRpb25fdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CgkJCQkJCQl2YXIgdmlkZW91cmwgPSAiaHR0cHM6Ly93d3cueXRkb3duZmsuY29tL3NlYXJjaD91cmw9Iitsb2NhdGlvbl91cmw7CgkJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTW9wZW5JblRhYih2aWRlb3VybCk7CgkJCQkJCX0pOwoJCQkJCX1lbHNlewoJCQkJCQkkKCIjIitlbGVJZCkucmVtb3ZlKCk7CgkJCQkJfQoJCQkJfQoJCQkJCgkJCQkvL2ZhY2Vib29r6Kej5p6QCgkJCQlpZihob3N0LmluZGV4T2YoImZhY2Vib29rLmNvbSIpIT0tMSl7CgkJCQkJaWYoaHJlZi5pbmRleE9mKCJmYWNlYm9vay5jb20vd2F0Y2giKSE9LTEgfHwgaHJlZi5pbmRleE9mKCIvdmlkZW9zLyIpIT0tMSl7CgkJCQkJCWlmKCQoIiMiK2VsZUlkKS5sZW5ndGggIT0gMCl7CgkJCQkJCQlyZXR1cm47CgkJCQkJCX0KCQkJCQkJdmFyIGljb25WaWRlbyA9ICJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQURBQUFBQXdDQVlBQUFCWEF2bUhBQUFET1VsRVFWUm9RKzJaejR1TlVSakhQOStGOGc4Z3lrS0pOSk1VVW16TURLWm1ZVllzTEJSaE9hRW1GaFJSTENaRFk0UEJySlJSRWtVTW1ZM1VSQ2svczZHTWhSOVpXTms5T3ZYTzdiMTMzdmUrNTd3LzdzelVuTHFiZTU5Zm4vT2M4NXpubkN2bStOQWNqNTk1Z0hnR3pXd0RzQlpZRGF3RUZnSS9nVC9BUjBuRFpXZThsQXlZV1Rld0Y5aVRFZUE0TUNUcGJsa2doUUhNN0J4d1BEQ2dBVW45Z1RxSjRvVUF6T3dLY0NobklDT1M5dVhVcmFubEJqQ3phOENCZ2dGY2xIU2tpSTFjQUdiV0JUd3Q0amltMnkzcFNWNWJ3UUJtdGdxNEJhelA2N1JCN3czZ3N2QVgrQ2JwVjRoZEw0Q29QRzRIM0tjanhFRU9XVmR5SHdQamtxNW02V2NDbU5tRmFJYXliRlh4KzJ2Z3NxU1JOT09wQUdhMkdIaFk0bElwQW5oYTBxa2tBNGtBWnVaTzBrOUZQRmFnMnlISkhZUjFJdzNnTzdDc2dpQ0ttUHdNZEVtYWpCdVpCbUJtYnVNY0xPS3BRdDFCU1VkVEFjek1WWm1RbWp3dHBUbUMzeHFvMHlicHc1Uk9YUWJNckErNDVHdFFVbVlWeTdKbFpwWWwwL0I3M1ladUJBanFiV1lJNEtXa3pXa1plQlZTTnVNQVp1YTFGQm9yU1k0TVRFcGFuZ1lRbE00RWdPZFp5NkV4YXprQWlOdG9YRUx2Z0xhc0lHcjBzVDBRWmFBVkFPOGx0YWRsWUJUWU5jc0I3a2phblFad0hqZzJ5d0dhVmlIWElydU43RFZtWUErNGxudWRwQytKR1hCZmhsd1Rad0RBUFFpNHM2bzJrbG9KOXl6eXlLY1hhakdBNjRGNkpMMXRDaEJsd2RYMG9JclNnaXJVSytsKzQ5cHVkaC9JaEdoaEJ2b2xEU1J0ekthOWpKa3RCZHhyV2sraWN2WG53TzNvSWV4RldsWEpiTWJNYkFHd0pRV2cxbzBXV0VLcExValNCY1o3Q1huVjBaaFFYb0JRUC9NQVV6TmdadTVaOEViUkdRVDJTN3FaMTA3bUhtaG11SVFubDJsWHhGQ1FRZ0RSbVRFR2JBdDFESXhKMnBGRHIwNmxESUJGZ0RzZGx3UUU4d05vbC9RN1FDZFJ0REJBbElWTzRGbEFNSjJTTWs5NkgzdWxBRVFRaDRGQkQ2ZDlrb1k4NUx4RVNnT0lJSzY3cXRMRTg3Q2tVdCtjU2dXSUlDYUFqUWtRRTVJMmVVMXJnRkFWQUNzQTkvRGsvcUdjR3YrQU5aSytCc1RtSlZvNlFKU0ZYdUJlTElLZGtoNTRSUlFvVkFsQUJIRUNPQU9jbEhRMk1DNXY4Y29BSW9qUitBdUNkMVFCZ3BVQ0JNU1JXM1FlSVBmVWxhVDRIMC83UlVBaTJhL05BQUFBQUVsRlRrU3VRbUNDIjsKCQkJCQkJdmFyIGh0bWw9JzxkaXYgaWQ9IicrZWxlSWQrJyIgc3R5bGU9IndpZHRoOjI1cHg7cGFkZGluZzoxMHB4IDBweDt0ZXh0LWFsaWduOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiNFNTIxMkU7cG9zaXRpb246Zml4ZWQ7dG9wOjI1MHB4O2xlZnQ6MHB4O2NvbG9yOiNGRkY7Zm9udC1zaXplOjBweDt6LWluZGV4Ojk5OTk5OTk5OTk5OTk7Y3Vyc29yOnBvaW50ZXI7bWFyZ2luOjBweCBhdXRvO3RleHQtYWxpZ246Y2VudGVyOyI+JysKCQkJCQkJCSc8aW1nIHNyYz0iJytpY29uVmlkZW8rJyIgc3R5bGU9IndpZHRoOjIwcHg7Ij4nKwoJCQkJCQkJJzwvZGl2Pic7CgkJCQkJCSQoImJvZHkiKS5hcHBlbmQoaHRtbCk7CgkJCQkJCSQoImJvZHkiKS5vbigiY2xpY2siLCAiIyIrZWxlSWQsIGZ1bmN0aW9uKCl7CgkJCQkJCQl2YXIgbG9jYXRpb25fdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CgkJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTXNldFZhbHVlKCJmYWNlYm9va19kb3dubG9hZGVyX29iaiIsIHsiZmFjZWJvb2tfdXJsIjpsb2NhdGlvbl91cmx9KTsKCQkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNb3BlbkluVGFiKCJodHRwczovL3l0MXMuY29tL2ZhY2Vib29rLWRvd25sb2FkZXIiKTsKCQkJCQkJfSk7CgkJCQkJfWVsc2V7CgkJCQkJCSQoIiMiK2VsZUlkKS5yZW1vdmUoKTsKCQkJCQl9CgkJCQl9CgkJCX0sIDUwMCk7CgkJCQoJCQlpZih3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ5dDFzLmNvbS9mYWNlYm9vay1kb3dubG9hZGVyIikhPS0xKXsgLy9mYWNlYm9va+S4i+i9vQoJCQkJdmFyIGZhY2Vib29rT2JqZWN0ID0gY29tbW9uRnVuY3Rpb25PYmplY3QuR01nZXRWYWx1ZSgiZmFjZWJvb2tfZG93bmxvYWRlcl9vYmoiKTsKCQkJCWlmKCEhZmFjZWJvb2tPYmplY3QpewoJCQkJCSQoIiNzX2lucHV0IikudmFsKGZhY2Vib29rT2JqZWN0LmZhY2Vib29rX3VybCk7CgkJCQl9CgkJCX0KCQl9Cgl9CgkJCQoJLyoqCgkgKiDmkJzntKLlvJXmk47otYTmupDmj5DphpIKCSAqLwoJZnVuY3Rpb24gc2VhcmNoRW5naW5lc05hdmlnYXRpb24oKXsKCQl0aGlzLm5hdmlnYXRpb25EYXRhQ2FjaGUgPSAibmF2aWdhdGlvbl9kYXRhX2NhY2hlXzg4OTgiOwoJCXRoaXMuY3VzdG9tTmF2aWdhdGlvbmtleSA9ICJjdXN0b21fbmF2aWdhdGlvbl9rZXlfODg5OCI7CgkJdGhpcy5zZWFyY2hFbmdpbmVzRGF0YT1bCgkJCXsiaG9zdCI6Ind3dy5iYWlkdS5jb20iLCAiZWxlbWVudCI6IiNjb250ZW50X3JpZ2h0IiwiZWxlbWVudElucHV0IjoiI2t3In0sCgkJCXsiaG9zdCI6Ind3dy5zby5jb20iLCAiZWxlbWVudCI6IiNzaWRlIiwiZWxlbWVudElucHV0IjoiI2tleXdvcmQifSwKCQkJeyJob3N0Ijoid3d3LnNvZ291LmNvbSIsICJlbGVtZW50IjoiI3JpZ2h0IiwiZWxlbWVudElucHV0IjoiI3VwcXVlcnkifSwKCQkJeyJob3N0IjoiY24uYmluZy5jb20iLCAiZWxlbWVudCI6IiNiX2NvbnRleHQiLCJlbGVtZW50SW5wdXQiOiIjc2JfZm9ybV9xIn0sCgkJCXsiaG9zdCI6Ind3dy5iaW5nLmNvbSIsICJlbGVtZW50IjoiI2JfY29udGV4dCIsImVsZW1lbnRJbnB1dCI6IiNzYl9mb3JtX3EifSwKCQkJeyJob3N0Ijoid3d3NC5iaW5nLmNvbSIsICJlbGVtZW50IjoiI2JfY29udGV4dCIsImVsZW1lbnRJbnB1dCI6IiNzYl9mb3JtX3EifSwKCQkJeyJob3N0Ijoic28udG91dGlhby5jb20iLCAiZWxlbWVudCI6Ii5zLXNpZGUtbGlzdCIsImVsZW1lbnRJbnB1dCI6ImlucHV0W3R5cGU9J3NlYXJjaCddIn0sCgkJCXsiaG9zdCI6Ind3dy5nb29nbGUuY29tIiwgImVsZW1lbnQiOiIjcmhzIiwiZWxlbWVudElucHV0IjoiaW5wdXRbdHlwZT0ndGV4dCddIn0KCQldOwoJCXRoaXMuZ2V0TmF2aWdhdGlvbkRhdGEgPSBmdW5jdGlvbihlbGVtZW50LCBlbGVtZW50SW5wdXQpewoJCQljb25zdCBkZWZhdWx0TmF2aWdhdGlvbkRhdGEgPSBbCgkJCQl7Im5hbWUiOiLotYTmupDmkJzntKIiLCJsaXN0IjpbCgkJCQkJeyJuYW1lIjoi6LSi57uP5pCc57SiIiwgInVybCI6Imh0dHBzOi8vd3d3LnNoYWR1aXppLmNvbS9zL3NlYXJjaD9xPUBAJmN1cnJlbnRQYWdlPTEifSwKCQkJCQl7Im5hbWUiOiLnmb7luqbnmb7np5EiLCAidXJsIjoiaHR0cHM6Ly9iYWlrZS5iYWlkdS5jb20vaXRlbS9AQCJ9LAoJCQkJCXsibmFtZSI6IuefpeS5juaQnOe0oiIsICJ1cmwiOiJodHRwczovL3d3dy56aGlodS5jb20vc2VhcmNoP3R5cGU9Y29udGVudCZxPUBAIn0sCgkJCQkJeyJuYW1lIjoiQuermeaQnOe0oiIsICJ1cmwiOiJodHRwczovL3NlYXJjaC5iaWxpYmlsaS5jb20vYWxsP2tleXdvcmQ9QEAmZnJvbV9zb3VyY2U9d2VidG9wX3NlYXJjaCZzcG1faWRfZnJvbT0zMzMuODUxIn0sCgkJCQkJeyJuYW1lIjoi5oqW6Z+z5pCc57SiIiwgInVybCI6Imh0dHBzOi8vd3d3LmRvdXlpbi5jb20vc2VhcmNoL0BAP2FpZD0wYTlmYzc0Yi0wMWU4LTRmYjAtOTUwOS0zMDdjNWMwN2ZkYTEmcHVibGlzaF90aW1lPTAmc29ydF90eXBlPTAmc291cmNlPW5vcm1hbF9zZWFyY2gmdHlwZT1nZW5lcmFsIn0sCgkJCQkJeyJuYW1lIjoi5pCc54uXfOWFrOS8l+WPtyIsICJ1cmwiOiJodHRwczovL3dlaXhpbi5zb2dvdS5jb20vd2VpeGluP3R5cGU9MiZxdWVyeT1AQCJ9LAoJCQkJCXsibmFtZSI6IuaQnOeLl3znn6XkuY4iLCAidXJsIjoiaHR0cHM6Ly93d3cuc29nb3UuY29tL3NvZ291P3BpZD1zb2dvdS13c3NlLWZmMTExZTRhNTQwNmVkNDAmaW5zaXRlPXpoaWh1LmNvbSZpZT11dGY4JnA9NzMzNTEyMDEmcXVlcnk9QEAmaWU9dXRmOCZwPTczMzUxMjAxJnF1ZXJ5PUBAIn0sCgkJCQkJeyJuYW1lIjoi6LGG55Oj5pCc57SiIiwgInVybCI6Imh0dHBzOi8vd3d3LmRvdWJhbi5jb20vc2VhcmNoP3E9QEAifSwKCQkJCQl7Im5hbWUiOiLnlLXlvbHmkJzntKIiLCAidXJsIjoiaHR0cHM6Ly93d3cuY3VwZm94LmNvbS9zZWFyY2g/a2V5PUBAIn0sCgkJCQkJeyJuYW1lIjoi57u05Z+655m+56eRIiwgInVybCI6Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93L2luZGV4LnBocD9zZWFyY2g9QEAifSwKCQkJCQl7Im5hbWUiOiLms5Xlvovms5Xop4QiLCAidXJsIjoiaHR0cHM6Ly93d3cucGt1bGF3LmNvbS9sYXcvY2hsP0tleXdvcmRzPUBAIn0sCgkJCQkJeyJuYW1lIjoiaWNvbuaQnOe0oiIsICJ1cmwiOiJodHRwczovL3d3dy5pY29uZm9udC5jbi9zZWFyY2gvaW5kZXg/c2VhcmNoVHlwZT1pY29uJnE9QEAifSwKCQkJCQl7Im5hbWUiOiJnaXRodWIiLCAidXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL3NlYXJjaD9xPUBAIn0sCgkJCQkJeyJuYW1lIjoiY3NkbiIsICJ1cmwiOiJodHRwczovL3NvLmNzZG4ubmV0L3NvL3NlYXJjaD9xPUBAJnQ9JnU9In0sCgkJCQkJeyJuYW1lIjoic3RhY2tvdmVyZmxvdyIsICJ1cmwiOiJodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tLyJ9LAoJCQkJXX0sCgkJCQl7Im5hbWUiOiLmkJzntKLlvJXmk44iLCJsaXN0IjpbCgkJCQkJeyJuYW1lIjoi55m+5bqmIiwgInVybCI6Imh0dHBzOi8vd3d3LmJhaWR1LmNvbS9zP3dkPUBAIn0sCgkJCQkJeyJuYW1lIjoi5b+F5bqUIiwgInVybCI6Imh0dHBzOi8vY24uYmluZy5jb20vc2VhcmNoP3E9QEAifSwKCQkJCQl7Im5hbWUiOiJHb29nbGUiLCAidXJsIjoiaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/cT1AQCJ9LAoJCQkJCXsibmFtZSI6IjM2MOaQnOe0oiIsICJ1cmwiOiJodHRwczovL3d3dy5zby5jb20vcz9pZT11dGYtOCZmcj1ub25lJnNyYz0zNjBzb3VfbmV3aG9tZSZubHB2PWJhc2VzdCZxPUBAIn0sCgkJCQkJeyJuYW1lIjoi5pCc54uXIiwgInVybCI6Imh0dHBzOi8vd3d3LnNvZ291LmNvbS93ZWI/cXVlcnk9QEAifSwKCQkJCQl7Im5hbWUiOiLlpLTmnaHmkJzntKIiLCAidXJsIjoiaHR0cHM6Ly9zby50b3V0aWFvLmNvbS9zZWFyY2g/ZHZwZj1wYyZzb3VyY2U9aW5wdXQma2V5d29yZD1AQCJ9CgkJCQldfQoJCQldOwoJCQkKCQkJY29uc3Qgc2VsZiA9IHRoaXM7CgkJCWxldCBjYWNoZU5hdmlnYXRpb25EYXRhID0gIGNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNZ2V0VmFsdWUoc2VsZi5uYXZpZ2F0aW9uRGF0YUNhY2hlLCBudWxsKTsgLy8g57yT5a2Y55qE5pWw5o2uCgkJCWlmKCFjYWNoZU5hdmlnYXRpb25EYXRhKXsKCQkJCWNhY2hlTmF2aWdhdGlvbkRhdGEgPSBkZWZhdWx0TmF2aWdhdGlvbkRhdGEKCQkJfQoJCQkvLyDlkIjlubbmlbDmja4KCQkJdmFyIGZpbmFsTmF2aWdhdGlvbkRhdGEgPSBudWxsOwoJCQl0cnl7CgkJCQlsZXQgY3VzdG9tTmF2aWdhdGlvbkRhdGEgPSBjb21tb25GdW5jdGlvbk9iamVjdC5HTWdldFZhbHVlKHNlbGYuY3VzdG9tTmF2aWdhdGlvbmtleSwgbnVsbCk7IC8vIOiHquWumuS5ieeahOaVsOaNrgoJCQkJaWYoISFjdXN0b21OYXZpZ2F0aW9uRGF0YSl7CgkJCQkJZmluYWxOYXZpZ2F0aW9uRGF0YSA9IGNhY2hlTmF2aWdhdGlvbkRhdGEuY29uY2F0KGN1c3RvbU5hdmlnYXRpb25EYXRhKTsKCQkJCX1lbHNlewoJCQkJCWZpbmFsTmF2aWdhdGlvbkRhdGEgPSBjYWNoZU5hdmlnYXRpb25EYXRhOwoJCQkJfQoJCQl9Y2F0Y2goZSl7CgkJCQlmaW5hbE5hdmlnYXRpb25EYXRhID0gY2FjaGVOYXZpZ2F0aW9uRGF0YTsKCQkJfQoJCQlzZWxmLmNyZWF0ZUh0bWwoZWxlbWVudCwgZWxlbWVudElucHV0LCBmaW5hbE5hdmlnYXRpb25EYXRhKTsKCQkJCgkJCS8v5Yik5pat5YC85piv5ZCm5pyJ5Y+Y5Yqo77yM5aaC5p6c5pyJ5Y+Y5Yqo5bCx5pu05paw5o2i5a2Y77yM566A5Y2V5aSE55CG77yM6ZW/5bqm5piv5ZCm5LiA6Ie0CgkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LnJlcXVlc3QoImdldCIsICJodHRwOi8vYXBpLnN0YXRpY2oudG9wL3NjcmlwdC9hcGkvZ2V0L25hdmlnYXRpb25fanNvbl91cmw/dD0iK25ldyBEYXRlKCkuZ2V0VGltZSgpLCBudWxsKS50aGVuKChyZXN1bHREYXRhKT0+ewoJCQkJbGV0IGRhdGFKc29uID0gSlNPTi5wYXJzZShyZXN1bHREYXRhLmRhdGEpOwoJCQkJaWYoISFkYXRhSnNvbiAmJiAhIWRhdGFKc29uLnVybCl7CgkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3QucmVxdWVzdCgiZ2V0IiwgZGF0YUpzb24udXJsLCBudWxsKS50aGVuKChyZXN1bHREYXRhMik9PnsKCQkJCQkJbGV0IHNlcnZlck5hdmlnYXRpb25EYXRhID0gcmVzdWx0RGF0YTIuZGF0YTsKCQkJCQkJaWYoIWNhY2hlTmF2aWdhdGlvbkRhdGEgfHwgKCEhY2FjaGVOYXZpZ2F0aW9uRGF0YSAmJiBzZXJ2ZXJOYXZpZ2F0aW9uRGF0YS5sZW5ndGghPUpTT04uc3RyaW5naWZ5KGNhY2hlTmF2aWdhdGlvbkRhdGEpLmxlbmd0aCkpewoJCQkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3QuR01zZXRWYWx1ZShzZWxmLm5hdmlnYXRpb25EYXRhQ2FjaGUsIEpTT04ucGFyc2Uoc2VydmVyTmF2aWdhdGlvbkRhdGEpKTsKCQkJCQkJfQoJCQkJCX0pLmNhdGNoKCgpPT57fSk7CgkJCQl9CgkJCX0pLmNhdGNoKCgpPT57fSk7CgkJfTsKCQl0aGlzLmNyZWF0ZUNzcyA9IGZ1bmN0aW9uKGVsZW1lbnROdW0pewoJCQl2YXIgaW5ubmVyQ3NzID0gYAoJCQkJLmRkZmRmZGArZWxlbWVudE51bStgZGZmc3NxYXsKCQkJCQltYXJnaW4tdG9wOjE1cHg7CgkJCQl9CgkJCQkuZGRmZGZkYCtlbGVtZW50TnVtK2BkZmZzc3FhOm50aC1sYXN0ewoJCQkJCW1hcmdpbi10b3A6MHB4OwoJCQkJfQoJCQkJLmRkZmRmZGArZWxlbWVudE51bStgZGZmc3NxYT4udGl0bGV7CgkJCQkJZm9udC1zaXplOjE2cHg7CgkJCQl9CgkJCQkuZGRmZGZkYCtlbGVtZW50TnVtK2BkZmZzc3FhPi5jb250ZW50LWxpc3R7CgkJCQkJCgkJCQl9CgkJCQkuZGRmZGZkYCtlbGVtZW50TnVtK2BkZmZzc3FhPi5jb250ZW50LWxpc3Q+YXsKCQkJCQlkaXNwbGF5OmlubGluZS1ibG9jazsKCQkJCQl3aWR0aDpjYWxjKDI1JSAtIDE2cHgpOwoJCQkJCWJvcmRlcjoxcHggc29saWQgI2NjYzsKCQkJCQlib3JkZXItcmFkaXVzOjRweDsKCQkJCQl0ZXh0LWFsaWduOmNlbnRlcjsKCQkJCQltYXJnaW4tcmlnaHQ6MTVweDsKCQkJCQltYXJnaW4tdG9wOjZweDsKCQkJCQlvdmVyZmxvdzogaGlkZGVuOwoJCQkJCXdoaXRlLXNwYWNlOiBub3dyYXA7CgkJCQkJdGV4dC1vdmVyZmxvdzplbGxpcHNpczsKCQkJCQlwYWRkaW5nOjJweDsKCQkJCQlib3gtc2l6aW5nOmJvcmRlci1ib3g7CgkJCQkJZm9udC1zaXplOjEzcHg7CgkJCQkJbGluZS1oZWlnaHQ6MjBweDsKCQkJCX0KCQkJCS5kZGZkZmRgK2VsZW1lbnROdW0rYGRmZnNzcWE+LmNvbnRlbnQtbGlzdD5hOm50aC1jaGlsZCg0bil7CgkJCQkJbWFyZ2luLXJpZ2h0OjBweDsKCQkJCX0KCQkJYDsKCQkJaWYoJCgiI3BsdWdpbl9jc3Nfc3R5bGVfZGRkc29vIikubGVuZ3RoPT0wKXsKCQkJCSQoImJvZHkiKS5wcmVwZW5kKCI8c3R5bGUgaWQ9J3BsdWdpbl9jc3Nfc3R5bGVfZGRkc29vJz4iK2lubm5lckNzcysiPC9zdHlsZT4iKTsKCQkJfQoJCX07CgkJdGhpcy5zaG93U2V0aW5nRGlhbG9nID0gZnVuY3Rpb24oKXsKCQkJY29uc3Qgc2VsZiA9IHRoaXM7CgkJCQoJCQl2YXIgY3VzdG9tTmF2aWdhdGlvbkRhdGEgPSAiIjsKCQkJY29uc3QgY3VzdG9tTmF2aWdhdGlvbiA9IGNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNZ2V0VmFsdWUoc2VsZi5jdXN0b21OYXZpZ2F0aW9ua2V5LCBudWxsKTsKCQkJaWYoISFjdXN0b21OYXZpZ2F0aW9uKXsKCQkJCWN1c3RvbU5hdmlnYXRpb25EYXRhID0gSlNPTi5zdHJpbmdpZnkoY3VzdG9tTmF2aWdhdGlvbiwgbnVsbCwgNCk7CgkJCX0KCQkJY29uc3QgY29udGVudCA9IGAKCQkJCTxkaXY+CgkJCQkJPGRpdiBzdHlsZT0iZm9udC1zaXplOjEzcHg7Y29sb3I6cmVkOyI+CgkJCQkJCeazqOaEj+S6i+mhueWmguS4i++8mgoJCQkJCQk8YnI+MeOAgeivt+S4peagvOaMieeFp+agvOW8j+a3u+WKoO+8jOWQpuWImeS4jeeUn+aViAoJCQkJCQk8YnI+MuOAgeaVsOaNruS4umpzb27moLzlvI/vvIzor7fnoa7kv51qc29u5qC85byP5q2j56Gu77yM5b+F6KaB5pe26K+35YiwPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd3d3Lmpzb24uY24vIj5odHRwczovL3d3dy5qc29uLmNuLzwvYT7moKHpqowKCQkJCQkJPGJyPjPjgIHngrnlh7vkuIvpnaLigJ3npLrkvovigJzmjInpkq7vvIzmn6XnnIvlhbfkvZPmoLzlvI/mg4XlhrUKCQkJCQkJPGJyPjTjgIHpk77mjqXkuK3nmoTmkJzntKLlhbPplK7or43or7fnlKjigJ1AQOKAnOS7o+abv++8jOiEmuacrOS8muiHquWKqOabv+aNouaIkOW9k+WJjeaQnOe0ouivjeOAguS+i+Wmgu+8mmh0dHBzOi8vd3d3LmJhaWR1LmNvbS9zP3dkPUBACgkJCQkJCTxicj4144CB5riF56m6IC0+IOS/neWtmO+8jOWImeWPlua2iOiHquWumuS5ieeahOWvvOiIque9keWdgAoJCQkJCTwvZGl2PgoJCQkJCTxkaXYgc3R5bGU9Im1hcmdpbi10b3A6NXB4O2hlaWdodDoyMDBweDt3aWR0aDoxMDAlOyI+CgkJCQkJCTx0ZXh0YXJlYSAKCQkJCQkJCXBsYWNlaG9sZGVyPSLor7fkuKXmoLzmjInnhafmoLzlvI/loavlhpnvvIzlkKbliJnkuI3nlJ/mlYgiCgkJCQkJCQljbGFzcz0ibmF2aWdhdGlvbi10ZXh0YXJlYSIKCQkJCQkJCXN0eWxlPSJjb2xvcjojMDAwO2ZvbnQtc2l6ZToxNHB4O2JveC1zaXppbmc6IGJvcmRlci1ib3g7LXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94Oy1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtwYWRkaW5nOjVweDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlO092ZXJmbG93OmF1dG87Ym9yZGVyOjFweCBzb2xpZCAjY2NjO3Jlc2l6ZTpub25lO2JhY2tncm91bmQtY29sb3I6I0ZGRjtvdXRsaW5lOm5vbmU7Ij5gK2N1c3RvbU5hdmlnYXRpb25EYXRhK2A8L3RleHRhcmVhPgoJCQkJCTwvZGl2PgoJCQkJCTxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO21hcmdpbi10b3A6MTVweDsiPgoJCQkJCQk8YnV0dG9uIGNsYXNzPSJuYXZpZ2F0aW9uLWV4YW1wbGUiIHN0eWxlPSJjb2xvcjojMDAwO2N1cnNvcjpwb2ludGVyOyI+56S65L6LPC9idXR0b24+CgkJCQkJCTxidXR0b24gY2xhc3M9Im5hdmlnYXRpb24tY2xlYXIiIHN0eWxlPSJjb2xvcjojMDAwO2N1cnNvcjpwb2ludGVyOyI+5riF56m6PC9idXR0b24+CgkJCQkJCTxidXR0b24gY2xhc3M9Im5hdmlnYXRpb24tc2F2ZSIgc3R5bGU9ImNvbG9yOiMwMDA7Y3Vyc29yOnBvaW50ZXI7Ij7kv53lrZjoh6rlrprkuYnlr7zoiKo8L2J1dHRvbj4KCQkJCQk8L2Rpdj4KCQkJCTwvZGl2PgoJCQlgOwoJCQlwb3B1cC5kaWFsb2coewoJCQkJInRpdGxlIjoi6Ieq5a6a5LmJ5re75Yqg5a+86IiqIiwKCQkJCSJjb250ZW50Ijpjb250ZW50LAoJCQkJIm9uQ29udGVudFJlYWR5IjpmdW5jdGlvbigkdGhhdCl7CgkJCQkJdmFyICRuYXZpZ2F0aW9uRXhhbXBsZSA9ICR0aGF0LmRpYWxvZ0NvbnRlbnQucXVlcnlTZWxlY3RvcigiLm5hdmlnYXRpb24tZXhhbXBsZSIpOwoJCQkJCXZhciAkbmF2aWdhdGlvbkNsZWFyID0gJHRoYXQuZGlhbG9nQ29udGVudC5xdWVyeVNlbGVjdG9yKCIubmF2aWdhdGlvbi1jbGVhciIpOwoJCQkJCXZhciAkbmF2aWdhdGlvblNhdmUgPSAkdGhhdC5kaWFsb2dDb250ZW50LnF1ZXJ5U2VsZWN0b3IoIi5uYXZpZ2F0aW9uLXNhdmUiKTsKCQkJCQkKCQkJCQl2YXIgJHRleHRhcmVhID0gJHRoYXQuZGlhbG9nQ29udGVudC5xdWVyeVNlbGVjdG9yKCIubmF2aWdhdGlvbi10ZXh0YXJlYSIpOwoJCQkJCXZhciBleGFtcGxlSnNvbiA9IEpTT04ucGFyc2UoJ1t7Im5hbWUiOiLmiJHmmK/moIfpopgiLCJsaXN0IjpbeyJuYW1lIjoi55m+5bqmIiwidXJsIjoi5YaZ572R5Z2AIn0seyJuYW1lIjoi5b+F5bqUIiwidXJsIjoi5YaZ572R5Z2AIn1dfSx7Im5hbWUiOiLmiJHmmK/moIfpopgiLCJsaXN0IjpbeyJuYW1lIjoi55m+5bqmIiwidXJsIjoi5YaZ572R5Z2AIn1dfV0nKTsKCQkJCQkkbmF2aWdhdGlvbkV4YW1wbGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbigpewoJCQkJCQkkdGV4dGFyZWEudmFsdWUgPSBKU09OLnN0cmluZ2lmeShleGFtcGxlSnNvbiwgbnVsbCwgNCk7CgkJCQkJfSk7CgkJCQkJJG5hdmlnYXRpb25DbGVhci5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uKCl7CgkJCQkJCSR0ZXh0YXJlYS52YWx1ZSA9ICIiCgkJCQkJfSk7CgkJCQkJJG5hdmlnYXRpb25TYXZlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24oKXsKCQkJCQkJdmFyIGNvbnRlbnQgPSAkdGV4dGFyZWEudmFsdWU7CgkJCQkJCWlmKCFjb250ZW50KXsKCQkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNc2V0VmFsdWUoc2VsZi5jdXN0b21OYXZpZ2F0aW9ua2V5LCBudWxsKTsKCQkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LndlYlRvYXN0KHsibWVzc2FnZSI6IuS/neWtmOaIkOWKn++8muaVsOaNruS4uuepuiIsICJiYWNrZ3JvdW5kIjoiI0ZGNEQ0MCJ9KTsKCQkJCQkJCXJldHVybjsKCQkJCQkJfQoJCQkJCQlpZihjb250ZW50Lmxlbmd0aD09MCB8fCBjb250ZW50LmluZGV4T2YoInsiKT09LTEgfHwgY29udGVudC5pbmRleE9mKCJbIik9PS0xKXsKCQkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LndlYlRvYXN0KHsibWVzc2FnZSI6IuagvOW8j+mUmeivr++8jOivt+abtOatoyIsICJiYWNrZ3JvdW5kIjoiI0ZGNEQ0MCJ9KTsKCQkJCQkJCXJldHVybjsKCQkJCQkJfQoJCQkJCQl0cnl7CgkJCQkJCQl2YXIgY29udGVudEpzb24gPSBKU09OLnBhcnNlKGNvbnRlbnQpOwoJCQkJCQkJaWYoQXJyYXkuaXNBcnJheShjb250ZW50SnNvbikpeyAvL+W8gOWni+W/hemhu+aYr+aVsOe7hAoJCQkJCQkJCXZhciBpc09LID0gdHJ1ZTsKCQkJCQkJCQlmb3IodmFyIGk9MDsgaTxjb250ZW50SnNvbi5sZW5ndGg7IGkrKykgewoJCQkJCQkJCQlpZihBcnJheS5pc0FycmF5KGNvbnRlbnRKc29uW2ldKSl7IC8v5q2k5aSE5b+F6aG75piv5a+56LGhCgkJCQkJCQkJCQlpc09LID0gZmFsc2U7CgkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJfQoJCQkJCQkJCQlpZighY29udGVudEpzb25baV0uaGFzT3duUHJvcGVydHkoIm5hbWUiKSB8fCAhY29udGVudEpzb25baV0uaGFzT3duUHJvcGVydHkoImxpc3QiKSl7CgkJCQkJCQkJCQlpc09LID0gZmFsc2U7CgkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJfQoJCQkJCQkJCQlpZih0eXBlb2YoY29udGVudEpzb25baV1bIm5hbWUiXSkhPSJzdHJpbmciKXsKCQkJCQkJCQkJCWlzT0sgPSBmYWxzZTsKCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWlmKCFBcnJheS5pc0FycmF5KGNvbnRlbnRKc29uW2ldWyJsaXN0Il0pKXsgLy/mraTlpITlv4XpobvmmK/mlbDnu4QKCQkJCQkJCQkJCWlzT0sgPSBmYWxzZTsKCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWZvcih2YXIgaj0wOyBqPGNvbnRlbnRKc29uW2ldWyJsaXN0Il0ubGVuZ3RoOyBqKyspewoJCQkJCQkJCQkJaWYoIWNvbnRlbnRKc29uW2ldWyJsaXN0Il1bal0uaGFzT3duUHJvcGVydHkoIm5hbWUiKSB8fCAhY29udGVudEpzb25baV1bImxpc3QiXVtqXS5oYXNPd25Qcm9wZXJ0eSgidXJsIikpewoJCQkJCQkJCQkJCWlzT0sgPSBmYWxzZTsKCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCWlmKHR5cGVvZihjb250ZW50SnNvbltpXVsibGlzdCJdW2pdWyJuYW1lIl0pIT0ic3RyaW5nIiB8fCB0eXBlb2YoY29udGVudEpzb25baV1bImxpc3QiXVtqXVsidXJsIl0pIT0ic3RyaW5nIil7CgkJCQkJCQkJCQkJaXNPSyA9IGZhbHNlOwoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJCWlmKCFpc09LKXsKCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJCWlmKGlzT0spewoJCQkJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTXNldFZhbHVlKHNlbGYuY3VzdG9tTmF2aWdhdGlvbmtleSwgY29udGVudEpzb24pOwoJCQkJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC53ZWJUb2FzdCh7Im1lc3NhZ2UiOiLkv53lrZjmiJDlip8iLCAiYmFja2dyb3VuZCI6IiNGRjRENDAifSk7CgkJCQkJCQkJfWVsc2V7CgkJCQkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LndlYlRvYXN0KHsibWVzc2FnZSI6IuagvOW8j+mUmeivr++8jOivt+abtOatoyIsICJiYWNrZ3JvdW5kIjoiI0ZGNEQ0MCJ9KTsKCQkJCQkJCQl9CgkJCQkJCQl9ZWxzZXsKCQkJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC53ZWJUb2FzdCh7Im1lc3NhZ2UiOiLmoLzlvI/plJnor6/vvIzor7fmm7TmraMiLCAiYmFja2dyb3VuZCI6IiNGRjRENDAifSk7CgkJCQkJCQl9CgkJCQkJCX1jYXRjaChlKXsKCQkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LndlYlRvYXN0KHsibWVzc2FnZSI6IuagvOW8j+mUmeivr++8jOivt+abtOatoyIsICJiYWNrZ3JvdW5kIjoiI0ZGNEQ0MCJ9KTsKCQkJCQkJfQoJCQkJCX0pOwoJCQkJfQoJCQl9KQoJCX0KCQl0aGlzLmNyZWF0ZUh0bWwgPSBmdW5jdGlvbihlbGVtZW50LCBlbGVtZW50SW5wdXQsIG5hdmlnYXRpb25EYXRhKXsKCQkJJCgiI2RzZHNkOTltbW1qajc3NjAwMTEiKS5yZW1vdmUoKTsKCQkJCgkJCXZhciBpc0NvbXBsYXRlID0gdHJ1ZTsKCQkJY29uc3QgaG9zdCA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0OwoJCQljb25zdCBzZWxmID0gdGhpczsKCQkJY29uc3QgZWxlbWVudE51bSA9IGNvbW1vbkZ1bmN0aW9uT2JqZWN0LnJhbmRvbU51bWJlcigpOwoJCQljb25zdCBlbGVtZW50SW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoJCQkJaWYoaXNDb21wbGF0ZSl7CgkJCQkJdmFyICRlbGVtZW50ID0gJChlbGVtZW50KTsKCQkJCQl2YXIgJGJveCA9ICQoIiNkc2RzZDk5bW1tamo3NzYwMDExIik7CgkJCQkJaXNDb21wbGF0ZSA9IGZhbHNlOwoJCQkJCWlmKCRlbGVtZW50Lmxlbmd0aCE9MCAmJiAkYm94Lmxlbmd0aD09MCl7CgkJCQkJCXZhciBodG1sID0gIiI7CgkJCQkJCWh0bWwgICs9ICI8ZGl2IGlkPSdkc2RzZDk5bW1tamo3NzYwMDExJz4iOwoJCQkJCQlmb3IodmFyIGk9MDsgaTxuYXZpZ2F0aW9uRGF0YS5sZW5ndGg7IGkrKyl7CgkJCQkJCQlodG1sICArPSAiPGRpdiBjbGFzcz0nZGRmZGZkIitlbGVtZW50TnVtKyJkZmZzc3FhJz4iOwoJCQkJCQkJaHRtbCAgKz0gIjxkaXYgY2xhc3M9J3RpdGxlJz48Yj4iK25hdmlnYXRpb25EYXRhW2ldLm5hbWUrIjwvYj48L2Rpdj4iOwoJCQkJCQkJaHRtbCAgKz0gIjxkaXYgY2xhc3M9J2NvbnRlbnQtbGlzdCc+IjsKCQkJCQkJCWZvcih2YXIgaj0wO2o8bmF2aWdhdGlvbkRhdGFbaV0ubGlzdC5sZW5ndGg7aisrKXsKCQkJCQkJCQlsZXQgdXJsID0gbmF2aWdhdGlvbkRhdGFbaV0ubGlzdFtqXS51cmw7CgkJCQkJCQkJbGV0IG5hbWUgPSBuYXZpZ2F0aW9uRGF0YVtpXS5saXN0W2pdLm5hbWU7CgkJCQkJCQkJaHRtbCArPSAiPGEgdGFyZ2V0PSdfYmxhbmsnIG5hbWU9J25hdmlnYXRpb24nIGRhdGEtdXJsPSciK3VybCsiJyBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCk7Jz4iK25hbWUrIjwvYT4iCQkJCQoJCQkJCQkJfQoJCQkJCQkJaHRtbCArPSAiPC9kaXY+IjsKCQkJCQkJCWh0bWwgKz0gIjwvZGl2PiI7CgkJCQkJCX0KCQkJCQkJaHRtbCArPSBgCgkJCQkJCQk8ZGl2IHN0eWxlPSdtYXJnaW4tYm90dG9tOjEwcHg7bWFyZ2luLXRvcDo1cHg7Zm9udC1zaXplOjEycHg7Jz4KCQkJCQkJCQk8YSB0YXJnZXQ9J19ibGFuaycgaHJlZj0naHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzQ2OTQwNyc+CgkJCQkJCQkJCSror6XmlbDmja7nlLHmsrnnjLTohJrmnKzmj5DkvpsKCQkJCQkJCQk8L2E+CgkJCQkJCQkJJm5ic3A7Jm5ic3A7CgkJCQkJCQkJPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgbmFtZT0iY3VzdG9tTmF2aWdhdGlvbiI+CgkJCQkJCQkJCfCflKfoh6rlrprkuYnnvZHlnYAKCQkJCQkJCQk8L2E+CgkJCQkJCQk8L2Rpdj5gOwoJCQkJCQlodG1sICs9ICI8L2Rpdj4iOwoJCQkJCQkKCQkJCQkJLy/mt7vliqBjc3Mg5re75YqgaHRtbAoJCQkJCQlzZWxmLmNyZWF0ZUNzcyhlbGVtZW50TnVtKTsKCQkJCQkJJGVsZW1lbnQucHJlcGVuZChodG1sKTsKCQkJCQkJCgkJCQkJCSQoIiNkc2RzZDk5bW1tamo3NzYwMDExIGFbbmFtZT0nbmF2aWdhdGlvbiddIikub24oImNsaWNrIiwgZnVuY3Rpb24oZSl7CgkJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTW9wZW5JblRhYigkKHRoaXMpLmRhdGEoInVybCIpLnJlcGxhY2UoIkBAIiwkKGVsZW1lbnRJbnB1dCkudmFsKCkpKTsKCQkJCQkJCWUucHJldmVudERlZmF1bHQoKQoJCQkJCQl9KTsKCQkJCQkJCgkJCQkJCSQoIiNkc2RzZDk5bW1tamo3NzYwMDExIGFbbmFtZT0nY3VzdG9tTmF2aWdhdGlvbiddIikub24oImNsaWNrIiwgZnVuY3Rpb24oZSl7CgkJCQkJCQlzZWxmLnNob3dTZXRpbmdEaWFsb2coKTsKCQkJCQkJCWUucHJldmVudERlZmF1bHQoKQoJCQkJCQl9KQoJCQkJCX0KCQkJCQlpc0NvbXBsYXRlID0gdHJ1ZTsKCQkJCX0KCQkJfSwgMTAwKTsJCQkKCQl9OwoJCXRoaXMuc2hvdyA9IGZ1bmN0aW9uKCl7CgkJCWNvbnN0IHNlbGYgPSB0aGlzOwoJCQljb25zdCBob3N0ID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7CgkJCWNvbnN0IGhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKCQkJaWYoKGhvc3Q9PT0id3d3LmJhaWR1LmNvbSIpCgkJCQl8fCAoaG9zdD09PSJ3d3cuc28uY29tIiAmJiBocmVmLmluZGV4T2YoInd3dy5zby5jb20vcyIpIT0tMSkKCQkJCXx8IChob3N0PT09Ind3dy5zb2dvdS5jb20iICYmIChocmVmLmluZGV4T2YoInd3dy5zb2dvdS5jb20vd2ViIikhPS0xIHx8IGhyZWYuaW5kZXhPZigid3d3LnNvZ291LmNvbS9zb2dvdSIpIT0tMSkpCgkJCQl8fCAoaG9zdD09PSJjbi5iaW5nLmNvbSIgJiYgaHJlZi5pbmRleE9mKCJjbi5iaW5nLmNvbS9zZWFyY2giKSE9LTEpCgkJCQl8fCAoaG9zdD09PSJ3d3cuYmluZy5jb20iICYmIGhyZWYuaW5kZXhPZigid3d3LmJpbmcuY29tL3NlYXJjaCIpIT0tMSkKCQkJCXx8IChob3N0PT09Ind3dzQuYmluZy5jb20iICYmIGhyZWYuaW5kZXhPZigid3d3NC5iaW5nLmNvbS9zZWFyY2giKSE9LTEpCgkJCQl8fCAoaG9zdD09PSJzby50b3V0aWFvLmNvbSIgJiYgaHJlZi5pbmRleE9mKCJzby50b3V0aWFvLmNvbS9zZWFyY2giKSE9LTEpCgkJCQl8fCAoaG9zdD09PSJ3d3cuZ29vZ2xlLmNvbSIgJiYgaHJlZi5pbmRleE9mKCJ3d3cuZ29vZ2xlLmNvbS9zZWFyY2giKSE9LTEpKXsKCQkJCWxldCBjdXJyZW50U2VhcmNoRW5naW5lc0RhdGEgPSBudWxsOwoJCQkJZm9yKHZhciBpPTA7IGk8c2VsZi5zZWFyY2hFbmdpbmVzRGF0YS5sZW5ndGg7IGkrKyl7CgkJCQkJaWYoaG9zdD09PXNlbGYuc2VhcmNoRW5naW5lc0RhdGFbaV0uaG9zdCl7CgkJCQkJCWN1cnJlbnRTZWFyY2hFbmdpbmVzRGF0YSA9IHNlbGYuc2VhcmNoRW5naW5lc0RhdGFbaV07CgkJCQkJfQoJCQkJfQoJCQkJaWYoY3VycmVudFNlYXJjaEVuZ2luZXNEYXRhIT1udWxsKXsKCQkJCQlzZWxmLmdldE5hdmlnYXRpb25EYXRhKGN1cnJlbnRTZWFyY2hFbmdpbmVzRGF0YS5lbGVtZW50LCBjdXJyZW50U2VhcmNoRW5naW5lc0RhdGEuZWxlbWVudElucHV0KTsKCQkJCX0KCQkJfQoJCX07CgkJdGhpcy5zdGFydCA9IGZ1bmN0aW9uKCl7CgkJCXRoaXMuc2hvdygpOwoJCX07Cgl9CgkKCS8qKgoJICog55+l5LmO5Yqp5omL5byA5aeLCgkgKi8KCS8vLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkvL+acrOiEmuacrOmDqOWIhuS7o+eggeWAn+mJtOiHquOAkOS6uumsvOaDheacquS6huOAkeeahOiEmuacrO+8jOW3sue7j+iOt+W+l+WOn+S9nOiAheeahOWujOWFqOaOiOadg++8jOiEmuacrOS7o+eggeWPr+S7pemaj+aEj+S/ruaUueS9v+eUqO+8jOeJueatpOeUs+aYju+8gQoJLy8vL+OAkOS6uumsvOaDheacquS6huOAkeiEmuacrOWQjeWtl++8muefpeS5jue9kemhteWKqeaJiwoJLy8vL+OAkOS6uumsvOaDheacquS6huOAkeiEmuacrOWcsOWdgO+8mmh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy8zODQxNzIKCS8vLy/mnKzohJrmnKzlgZrlh7rnmoTkv67mlLnvvJrph43mnoTkuobpg6jliIbpgLvovpEKCS8vLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCglmdW5jdGlvbiB6aGlodUhlbHBlcigpewoJCXRoaXMubWFya0FydGljbGVPclF1ZXN0aW9uID0gZnVuY3Rpb24oKXsKCQkJdmFyIHF1ZXN0aW9uc0NzcyA9IGAKCQkJCS5BbnN3ZXJJdGVtIC5Db250ZW50SXRlbS10aXRsZSBhOjpiZWZvcmUgewoJCQkJCWNvbnRlbnQ6ICfpl67popgnOwoJCQkJCWNvbG9yOiAjZjY4YjgzOwoJCQkJCWJhY2tncm91bmQtY29sb3I6ICNmNjhiODMzMzsKCQkJCQlmb250LXdlaWdodDogYm9sZDsKCQkJCQlmb250LXNpemU6IDEzcHg7CgkJCQkJcGFkZGluZzogMXB4IDRweCAwcHg7CgkJCQkJYm9yZGVyLXJhZGl1czogMnB4OwoJCQkJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQkJCQl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoJCQkJCW1hcmdpbjogMHB4IDRweCAwcHggMHB4OwoJCQkJfQoJCQkJLkFydGljbGVJdGVtIC5Db250ZW50SXRlbS10aXRsZSBhOjpiZWZvcmUgewoJCQkJCWNvbnRlbnQ6ICfmlofnq6AnOwoJCQkJCWNvbG9yOiAjMDA2NkZGOwoJCQkJCWJhY2tncm91bmQtY29sb3I6ICNFNUVGRkY7CgkJCQkJZm9udC13ZWlnaHQ6IGJvbGQ7CgkJCQkJZm9udC1zaXplOiAxM3B4OwoJCQkJCXBhZGRpbmc6IDFweCA0cHggMDsKCQkJCQlib3JkZXItcmFkaXVzOiAycHg7CgkJCQkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCQkJCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgkJCQkJbWFyZ2luOiAwcHggNHB4IDBweCAwcHg7CgkJCQl9CgkJCQkuWnZpZGVvSXRlbSAuQ29udGVudEl0ZW0tdGl0bGUgYTo6YmVmb3JlIHsKCQkJCQljb250ZW50Oifop4bpopEnOwoJCQkJCWNvbG9yOiAjMDBCQ0Q0OwoJCQkJCWJhY2tncm91bmQtY29sb3I6ICMwMEJDRDQzMzsKCQkJCQlmb250LXdlaWdodDogYm9sZDsKCQkJCQlmb250LXNpemU6IDEzcHg7CgkJCQkJcGFkZGluZzogMXB4IDRweCAwOwoJCQkJCWJvcmRlci1yYWRpdXM6IDJweDsKCQkJCQlkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgkJCQkJdmVydGljYWwtYWxpZ246IG1pZGRsZTsKCQkJCQltYXJnaW46IDBweCA0cHggMHB4IDBweDsKCQkJCX0KCQkJCS5Ub3BzdG9yeUl0ZW0tLWFkdmVydENhcmR7CgkJCQkJdGV4dC1kZWNvcmF0aW9uOmxpbmUtdGhyb3VnaDsKCQkJCX0KCQkJYDsKCQkJY29tbW9uRnVuY3Rpb25PYmplY3QuR01hZGRTdHlsZShxdWVzdGlvbnNDc3MpOwoJCX0KCQl0aGlzLmF1dG9KdW1wVGFyZ2V0ID0gZnVuY3Rpb24oKXsKCQkJdmFyIHJlZ2V4UmVzdWx0ID0gbG9jYXRpb24uc2VhcmNoLm1hdGNoKC90YXJnZXQ9KC4rPykoJnwkKS8pOwoJCQlpZihyZWdleFJlc3VsdCAmJiByZWdleFJlc3VsdC5sZW5ndGg9PTMpewoJCQkJbG9jYXRpb24uaHJlZiA9IGRlY29kZVVSSUNvbXBvbmVudChyZWdleFJlc3VsdFsxXSk7CgkJCX0KCQl9OwoJCS8vIOS4uumXrumimOacrOi6q+a3u+WKoOaXtumXtAoJCXRoaXMuYWRkRGF0ZVF1ZXN0aW9uID0gZnVuY3Rpb24oKXsKCQkJdmFyIHRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLlF1ZXN0aW9uUGFnZSIpOwoJCQlpZighIXRpdGxlKXsKCQkJCXZhciBkYXRlQ3JlYXRlZCA9IHRpdGxlLnF1ZXJ5U2VsZWN0b3IoIltpdGVtcHJvcH49ZGF0ZUNyZWF0ZWRdW2NvbnRlbnRdIikuY29udGVudDsKCQkJCXZhciBkYXRlTW9kaWZpZWQgPSB0aXRsZS5xdWVyeVNlbGVjdG9yKCJbaXRlbXByb3B+PWRhdGVNb2RpZmllZF1bY29udGVudF0iKS5jb250ZW50OwoJCQkJdmFyIGNyZWF0ZURhdGUgPSBjb21tb25GdW5jdGlvbk9iamVjdC5EYXRlRm9ybWF0KG5ldyBEYXRlKGRhdGVDcmVhdGVkKSwgInl5eXktTU0tZGQgaGg6bW06c3MiKTsKCQkJCXZhciBlZGl0RGF0ZSA9IGNvbW1vbkZ1bmN0aW9uT2JqZWN0LkRhdGVGb3JtYXQobmV3IERhdGUoZGF0ZU1vZGlmaWVkKSwgInl5eXktTU0tZGQgaGg6bW06c3MiKTsKCQkJCQoJCQkJdmFyIHNpZGUgPSB0aXRsZS5xdWVyeVNlbGVjdG9yKCIuUXVlc3Rpb25IZWFkZXItc2lkZSIpOwoJCQkJdmFyIHRpbWVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKCQkJCXRpbWVEaXYuaW5uZXJIVE1MID0gYDxwPuWIm+W7uuS6jjombmJzcDske2NyZWF0ZURhdGV9PC9wPjxwPue8lui+keS6jjombmJzcDske2VkaXREYXRlfTwvcD5gOwoJCQkJdGltZURpdi5zdHlsZS5jc3NUZXh0ID0gJ2NvbG9yOiM2ZjZmNmY7Zm9udC1zaXplOjEzcHg7JzsKCQkJCXNpZGUuYXBwZW5kQ2hpbGQodGltZURpdik7CgkJCX0KCQl9OwoJCS8vIOS4uuWbnuetlOa3u+WKoOaXtumXtAoJCXRoaXMuYWRkVGltZUFuc3dlckl0ZW1zID0gZnVuY3Rpb24oKXsKCQkJdmFyIGxpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuQW5zd2VySXRlbTpub3QoZGl2W3poX2RhdGVfbWs9J3RydWUnXSkiKTsKCQkJdmFyIGl0ZW0gPSBudWxsOwoJCQlmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKCQkJCWl0ZW0gPSBsaXN0W2ldOwoJCQkJaWYgKGl0ZW0uZ2V0QXR0cmlidXRlKCd6aF9kYXRlX21rJykgPT09ICd0cnVlJykgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJaXRlbS5zZXRBdHRyaWJ1dGUoInpoX2RhdGVfbWsiLCAidHJ1ZSIpOwoJCQkJdHJ5ewkJCQkJCgkJCQkJdmFyIGRhdGVDcmVhdGVkID0gaXRlbS5xdWVyeVNlbGVjdG9yKCJbaXRlbXByb3B+PWRhdGVDcmVhdGVkXVtjb250ZW50XSIpLmNvbnRlbnQ7CgkJCQkJdmFyIGRhdGVNb2RpZmllZCA9IGl0ZW0ucXVlcnlTZWxlY3RvcigiW2l0ZW1wcm9wfj1kYXRlTW9kaWZpZWRdW2NvbnRlbnRdIikuY29udGVudDsKCQkJCQl2YXIgY3JlYXRlRGF0ZSA9IGNvbW1vbkZ1bmN0aW9uT2JqZWN0LkRhdGVGb3JtYXQobmV3IERhdGUoZGF0ZUNyZWF0ZWQpLCAieXl5eS1NTS1kZCBoaDptbTpzcyIpOwoJCQkJCXZhciBlZGl0RGF0ZSA9IGNvbW1vbkZ1bmN0aW9uT2JqZWN0LkRhdGVGb3JtYXQobmV3IERhdGUoZGF0ZU1vZGlmaWVkKSwgInl5eXktTU0tZGQgaGg6bW06c3MiKTsKCQkJCQkJIAoJCQkJCXZhciBzaWRlSXRlbSA9IGl0ZW0ucXVlcnlTZWxlY3RvcigiLkNvbnRlbnRJdGVtLW1ldGEiKTsKCQkJCQl2YXIgdGltZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwoJCQkJCXRpbWVEaXYuaW5uZXJIVE1MID0gYOWIm+W7uuS6jjombmJzcDske2NyZWF0ZURhdGV9Jm5ic3A7Jm5ic3A7Jm5ic3A75L+u5pS55LqOOiZuYnNwOyR7ZWRpdERhdGV9YDsKCQkJCQl0aW1lRGl2LmNsYXNzID0gIlZvdGVycyI7CgkJCQkJdGltZURpdi5zdHlsZS5jc3NUZXh0ID0gJ2NvbG9yOiM2ZjZmNmY7Zm9udC1zaXplOjEzcHg7ZGlzcGxheTpibG9jaztwYWRkaW5nOjVweCAwcHg7JzsKCQkJCQlzaWRlSXRlbS5hcHBlbmRDaGlsZCh0aW1lRGl2KTsKCQkJCX1jYXRjaChlKXt9CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfTsKCQkvLyDmj5Dpl67ogIXmoIfor4blh7rmnaUKCQl0aGlzLnNob3dRdWVzdGlvbkF1dGhvciA9IGZ1bmN0aW9uKCl7CgkJCS8v5q2k5aSE5Luj56CB5YCf6Ym06IeqIC0g55+l5LmO5aKe5by6CgkJCS8v5Y6f5L2c6ICF77yaWC5JLlUKCQkJLy9odHRwczovL2dyZWFzeWZvcmsub3JnL3poLUNOL3NjcmlwdHMvNDE5MDgxLSVFNyU5RiVBNSVFNCVCOSU4RSVFNSVBMiU5RSVFNSVCQyVCQQoJCQlpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkJyYW5kUXVlc3Rpb25TeW1ib2wsIC5RdWVzdGlvbkF1dGhvcicpKSByZXR1cm4KCQkJbGV0IHFKc29uID0gSlNPTi5wYXJzZShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjanMtaW5pdGlhbERhdGEnKS50ZXh0Q29udGVudCkuaW5pdGlhbFN0YXRlLmVudGl0aWVzLnF1ZXN0aW9uc1svXGQrLy5leGVjKGxvY2F0aW9uLnBhdGhuYW1lKVswXV0uYXV0aG9yLAoJCQkJaHRtbCA9IGA8ZGl2IGNsYXNzPSJCcmFuZFF1ZXN0aW9uU3ltYm9sIj48YSBjbGFzcz0iQnJhbmRRdWVzdGlvblN5bWJvbC1icmFuZExpbmsiIGhyZWY9Ii9wZW9wbGUvJHtxSnNvbi51cmxUb2tlbn0iPjxpbWcgcm9sZT0icHJlc2VudGF0aW9uIiBzcmM9IiR7cUpzb24uYXZhdGFyVXJsfSIgY2xhc3M9IkJyYW5kUXVlc3Rpb25TeW1ib2wtbG9nbyIgYWx0PSIiPjxzcGFuIGNsYXNzPSJCcmFuZFF1ZXN0aW9uU3ltYm9sLW5hbWUiPiR7cUpzb24ubmFtZX08L3NwYW4+PC9hPjxkaXYgY2xhc3M9IkJyYW5kUXVlc3Rpb25TeW1ib2wtZGl2aWRlciIgc3R5bGU9Im1hcmdpbi1sZWZ0OiA1cHg7bWFyZ2luLXJpZ2h0OiAxMHB4OyI+PC9kaXY+PC9kaXY+YDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLlF1ZXN0aW9uSGVhZGVyLXRvcGljcycpLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlYmVnaW4nLCBodG1sKTsKCQl9OwoJCXRoaXMuc3RhcnREZWFsd2l0aFF1ZXN0aW9uID0gZnVuY3Rpb24oKXsKCQkJbGV0IGlzTWFya0NvbXBsZXRlID0gdHJ1ZTsKCQkJc2V0SW50ZXJ2YWwoKCk9PnsKCQkJCWlmKGlzTWFya0NvbXBsZXRlKXsKCQkJCQlpc01hcmtDb21wbGV0ZSA9IGZhbHNlOwoJCQkJCWlzTWFya0NvbXBsZXRlID0gdGhpcy5hZGRUaW1lQW5zd2VySXRlbXMoKTsKCQkJCX0KCQkJfSwgMTk5OSk7CgkJCXRoaXMuc2hvd1F1ZXN0aW9uQXV0aG9yKCk7CgkJCXRoaXMuYWRkRGF0ZVF1ZXN0aW9uKCk7CgkJfTsKCQl0aGlzLmRvd25sb2FkVmlkZW8gPSBmdW5jdGlvbigpewoJCQlsZXQgaXNNYXJrQ29tcGxldGUgPSB0cnVlOwoJCQlmdW5jdGlvbiBhZGREb3dubG9hZEJ1dHRvbigpewoJCQkJaWYoIWlzTWFya0NvbXBsZXRlKSByZXR1cm47CgkJCQlpc01hcmtDb21wbGV0ZSA9IGZhbHNlOwoJCQkJCgkJCQl2YXIgaXRlbUFycmF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLl8xdGc4b2lyOm5vdChzcGFuW3poX2RhdGVfbWs9J3RydWUnXSkiKTsKCQkJCXZhciBpdGVtID0gbnVsbDsKCQkJCS8vIGNvbnNvbGUubG9nKCLnn6XkuY7op4bpopHkuIvovb3lvqrlnY/nm5HlkKzmrKHmlbDvvJoiLCBpdGVtQXJyYXkubGVuZ3RoKTsKCQkJCWZvcih2YXIgaT0wOyBpPGl0ZW1BcnJheS5sZW5ndGg7IGkrKyl7CgkJCQkJaXRlbSA9IGl0ZW1BcnJheVtpXTsKCQkJCQlpZiAoaXRlbS5nZXRBdHRyaWJ1dGUoJ3poX2RhdGVfbWsnKSA9PT0gJ3RydWUnKSB7CgkJCQkJCWNvbnRpbnVlOwoJCQkJCX0KCQkJCQlpdGVtLnNldEF0dHJpYnV0ZSgiemhfZGF0ZV9tayIsICJ0cnVlIik7CgkJCQkJCgkJCQkJaWYoaXRlbS5pbm5lclRleHQgIT0gIuWAjemAnyIpewoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQkJCgkJCQkJdmFyIHBsYXlCdXRMaSA9IGl0ZW0ucGFyZW50Tm9kZS5wYXJlbnROb2RlOwoJCQkJCXZhciBkb3dubG9hZEJ1dCA9IHBsYXlCdXRMaS5jbG9uZU5vZGUodHJ1ZSkKCQkJCQlpZighZG93bmxvYWRCdXQucXVlcnlTZWxlY3RvcignLl8xdGc4b2lyJykpIHJldHVybjsKCQkJCQkKCQkJCQkvLyDliKDpmaTlhbblroPlhYPntKAKCQkJCQl2YXIgZG93bmxvYWRCdXRDaGlsZHJlbiA9IGRvd25sb2FkQnV0LmNoaWxkcmVuOwoJCQkJCWZvcih2YXIgaj0wOyBqPGRvd25sb2FkQnV0Q2hpbGRyZW4ubGVuZ3RoOyBqKyspewoJCQkJCQlpZihkb3dubG9hZEJ1dENoaWxkcmVuW2pdLm5vZGVOYW1lICE9PSAiQlVUVE9OIil7CgkJCQkJCQlkb3dubG9hZEJ1dC5yZW1vdmVDaGlsZChkb3dubG9hZEJ1dENoaWxkcmVuW2pdKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQkKCQkJCQlkb3dubG9hZEJ1dC5zZXRBdHRyaWJ1dGUoInpoX2RhdGVfbWsiLCAidHJ1ZSIpOwoJCQkJCWRvd25sb2FkQnV0LnF1ZXJ5U2VsZWN0b3IoJy5fMXRnOG9pcicpLmlubmVyVGV4dD0n5LiL6L29JzsKCQkJCQkKCQkJCQlwbGF5QnV0TGkuYmVmb3JlKGRvd25sb2FkQnV0KTsKCQkJCQlkb3dubG9hZEJ1dC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXsKCQkJCQkJbGV0IGhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKCQkJCQkJbGV0IGZpbmRDbGFzc05hbWUgPSAiLlpWaWRlb0l0ZW0tdmlkZW8iOyAvLyDpppbpobUKCQkJCQkJaWYoaHJlZi5pbmRleE9mKCJ3d3cuemhpaHUuY29tL3NlYXJjaCIpIT0tMSl7IC8v5pCc57Si55WM6Z2iCgkJCQkJCQlmaW5kQ2xhc3NOYW1lID0gIi5MaXN0LWl0ZW0iOwoJCQkJCQl9ZWxzZSBpZihocmVmLmluZGV4T2YoInd3dy56aGlodS5jb20venZpZGVvLyIpIT0tMSl7IC8v5Y2V54us6KeG6aKR5pKt5pS+55WM6Z2iCgkJCQkJCQlmaW5kQ2xhc3NOYW1lID0gIi5aVmlkZW8tcGxheWVyIjsKCQkJCQkJfWVsc2UgaWYoaHJlZi5pbmRleE9mKCJodHRwczovL3ZpZGVvLnpoaWh1LmNvbS92aWRlbyIpIT0tMSl7IC8v6KeG6aKR5pKt5pS+aWZyYW1lCgkJCQkJCQlmaW5kQ2xhc3NOYW1lID0gIiNwbGF5ZXIiCgkJCQkJCX0KCQkJCQkJaWYoIWZpbmRDbGFzc05hbWUpIHJldHVybjsKCQkJCQkJbGV0IHBsYXlVcmwgPSAkKGl0ZW0pLnBhcmVudHMoZmluZENsYXNzTmFtZSkuZmluZCgidmlkZW8iKS5hdHRyKCJzcmMiKTsKCQkJCQkJaWYoISFwbGF5VXJsKXsKCQkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNb3BlbkluVGFiKHBsYXlVcmwpOwoJCQkJCQl9CgkJCQkJfSk7CgkJCQl9CgkJCQlpc01hcmtDb21wbGV0ZSA9IHRydWU7CgkJCX0KCQkJCgkJCXNldEludGVydmFsKCgpPT57CgkJCQlhZGREb3dubG9hZEJ1dHRvbigpOwoJCQl9LCAxNDk5KTsKCQl9OwoJCXRoaXMuc3RhcnQgPSBmdW5jdGlvbigpewoJCQljb25zdCBob3N0ID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7CgkJCWNvbnN0IHNlbGYgPSB0aGlzOwoJCQlpZihob3N0ID09ICJsaW5rLnpoaWh1LmNvbSIpeyAKCQkJCXRoaXMuYXV0b0p1bXBUYXJnZXQoKTsKCQkJfQoJCQlpZihob3N0LmluZGV4T2YoInpoaWh1LmNvbSIpIT0tMSl7CgkJCQl0aGlzLm1hcmtBcnRpY2xlT3JRdWVzdGlvbigpOwoJCQkJaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigid3d3LnpoaWh1LmNvbS9xdWVzdGlvbi8iKSE9LTEpewoJCQkJCXRoaXMuc3RhcnREZWFsd2l0aFF1ZXN0aW9uKCk7CgkJCQl9CgkJCQkvL3RoaXMuZG93bmxvYWRWaWRlbygpOwoJCQl9CgkJfTsKCX0KCQkKCS8v5pyA5ZCO57uf5LiA6LCD55SoCgl0cnl7CgkJaWYoZnVuY3Rpb25Db250cm9sbGVyLnN1cGVyVmlkZW9IZWxwZXIpewoJCQljb25zdCBzdXBlclZpZGVvSGVscGVyT2JqZWN0ID0gbmV3IHN1cGVyVmlkZW9IZWxwZXIobmV3T3JpZ2luYWxJbnRlcmZhY2VMaXN0KTsKCQkJaWYoc3VwZXJWaWRlb0hlbHBlck9iamVjdC5pc1J1bigpKXsKCQkJCWlmKGNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNZ2V0VmFsdWUoImNvcHlyaWdodF92aWRlb19yZW1pbmQiLG51bGwpPT09InRydWUiKXsKCQkJCQlzdXBlclZpZGVvSGVscGVyT2JqZWN0LnN0YXJ0KCk7CgkJCQl9ZWxzZXsKCQkJCQl2YXIgcj1jb25maXJtKAoJCQkJCQki6ISa5pys6L+Q6KGM5o+Q6YaS77yB77yB77yBXHUwMDBkIisKCQkJCQkJIjHjgIFWSVDop4bpopHop6PmnpDkuK3miYDnlKjliLDnmoTop6PmnpDmjqXlj6Plhajpg6jmlLbpm4boh6rkupLogZTnvZHvvIjmupDnoIHlj6/op4HvvInvvIzniYjmnYPpl67popjor7fogZTns7vnm7jlhbPop6PmnpDmjqXlj6PmiYDmnInogIXvvIFcdTAwMGQiKwoJCQkJCQkiMuOAgeS4uuWIm+mAoOiJr+WlveeahOWIm+S9nOawm+WbtO+8jOivt+Wkp+WutuaUr+aMgeato+eJiO+8gVx1MDAwZCIrCgkJCQkJCSIz44CB6ISa5pys5LuF6ZmQ5Liq5Lq65a2m5Lmg5Lqk5rWB77yM5YiH5Yu/55So5LqO5Lu75L2V5ZWG5Lia562J5YW25a6D55So6YCU77yBXHUwMDBkIisKCQkJCQkJIjTjgIHnu6fnu63kvb/nlKjvvIzljbPooajmmI7kvaDlt7Lnu4/mmI7noa7kvb/nlKjohJrmnKzlj6/og73luKbmnaXnmoTpo47pmanvvIzkuJTmhL/mhI/oh6rooYzmib/mi4Xnm7jlhbPpo47pmanvvIzlr7nkuo7po47pmanohJrmnKzkuI3mib/mi4Xku7vkvZXotKPku7vvvIFcdTAwMGQiKwoJCQkJCQkiNeOAgeatpOaPkOmGkuWPquW8ueWHuuS4gOasoe+8jOehruiupOWQju+8jOWQjue7reWwhuS4jeWcqOW8ueWHuu+8jOivt+efpeaCie+8gSIKCQkJCQkpOwoJCQkJCWlmKHI9PXRydWUpewoJCQkJCQljb21tb25GdW5jdGlvbk9iamVjdC5HTXNldFZhbHVlKCJjb3B5cmlnaHRfdmlkZW9fcmVtaW5kIiwidHJ1ZSIpOwoJCQkJCQlzdXBlclZpZGVvSGVscGVyT2JqZWN0LnN0YXJ0KCk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCQoJCQkobmV3IHN1cGVyVmlkZW9IZWxwZXJNb2JpbGUobmV3T3JpZ2luYWxJbnRlcmZhY2VMaXN0KSkuc3RhcnQoKTsKCQl9Cgl9Y2F0Y2goZSl7CgkJY29uc29sZS5sb2coIuWFqOe9kVZJUOino+aekO+8mmVycm9y77yaIitlKTsKCX0KCQoJLyoqCgkgKiDnn63op4bpopHljrvmsLTljbDkuIvovb3vvIzkuI7mva7njqnlpKnkuIvlhbHlkIzlvIDlj5Hnu7TmiqQKCSAqIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy80NTI2NjAKCSAqLwoJZnVuY3Rpb24gc2hvcnRWaWRlb0Rvd25sb2FkZXIoKXsKCQl0aGlzLmRvdXlpblZpZGVvRG93bmxvYWRlciA9IGZ1bmN0aW9uKCl7CgkJCWlmKHdpbmRvdy5sb2NhdGlvbi5ob3N0ICE9PSAid3d3LmRvdXlpbi5jb20iKXsKCQkJCXJldHVybjsKCQkJfQoJCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsZnVuY3Rpb24oKXsKCQkJCS8v6L+Z5piv5pCc57Si55WM6Z2iCgkJCQlpZih3aW5kb3cubG9jYXRpb24uaHJlZi5tYXRjaCgvaHR0cHM6XC9cL3d3d1wuZG91eWluXC5jb21cL3NlYXJjaFwvLio/LykpewoJCQkJCWZ1bmN0aW9uIGRvd25sb2FkZXIoKXsKCQkJCQkJY29uc3QgdmlkZW9Db250YWluZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnBsYXllci1pbmZvIik7CgkJCQkJCXZpZGVvQ29udGFpbmVycy5mb3JFYWNoKChlbGVtZW50KT0+ewoJCQkJCQkJaWYoZWxlbWVudC5nZXRBdHRyaWJ1dGUoImRlYWx3aXRoIikpewoJCQkJCQkJCXJldHVybjsKCQkJCQkJCX0KCQkJCQkJCWxldCBib3R0b21NZW51ID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCd4Zy1yaWdodC1ncmlkJyk7CgkJCQkJCQlpZighYm90dG9tTWVudSl7CgkJCQkJCQkJcmV0dXJuOwoJCQkJCQkJfQoJCQkJCQkJbGV0IHBsYXliYWNrU2V0dGluZyA9IGJvdHRvbU1lbnUucXVlcnlTZWxlY3RvcignLnhncGxheWVyLXBsYXliYWNrLXNldHRpbmcnKTsKCQkJCQkJCWlmKCFwbGF5YmFja1NldHRpbmcpewoJCQkJCQkJCXJldHVybjsKCQkJCQkJCX0KCQkJCQkJCWxldCBkb3dubG9hZCA9IHBsYXliYWNrU2V0dGluZy5jbG9uZU5vZGUodHJ1ZSk7IC8vIOaLt+i0neS4gOS4quiKgueCuQoJCQkJCQkJbGV0IGRvd25sb2FkVGV4dCA9IGRvd25sb2FkLnF1ZXJ5U2VsZWN0b3IoJ2RpdjpmaXJzdC1jaGlsZCcpOwoJCQkJCQkJbGV0IHZpZGVvID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpOwoJCQkJCQkJZG93bmxvYWRUZXh0LmlubmVyVGV4dD0n5LiL6L29JzsKCQkJCQkJCWRvd25sb2FkVGV4dC5zdHlsZSA9ICdmb250LXNpemU6MTNweCc7CgkJCQkJCQlwbGF5YmFja1NldHRpbmcuYWZ0ZXIoZG93bmxvYWQpOwoJCQkJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoImRlYWx3aXRoIiwidHJ1ZSIpOwoJCQkJCQkJZG93bmxvYWQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLChlKT0+ewoJCQkJCQkJCWxldCBwbGF5ZXJVcmwgPSB2aWRlby5jaGlsZHJlblswXS5zcmM7CgkJCQkJCQkJY29tbW9uRnVuY3Rpb25PYmplY3QuR01vcGVuSW5UYWIocGxheWVyVXJsKTsKCQkJCQkJCX0pOwoJCQkJCQl9KTsKCQkJCQl9CgkJCQkJZG93bmxvYWRlcigpOwoJCQkJCXNldEludGVydmFsKGZ1bmN0aW9uKCl7CgkJCQkJCWRvd25sb2FkZXIoKTsKCQkJCQl9LDUwMCk7CgkJCQl9ZWxzZXsKCQkJCQlhc3luYyBmdW5jdGlvbiBkb3dubG9hZGVyKCl7CgkJCQkJCXRyeXsKCQkJCQkJCS8v5bu26L+f5Yqg6L29562J5Yiw5piv5ZCm5a6M5oiQCgkJCQkJCQlsZXQgdmlkZW9Db250YWluZXIgPSBhd2FpdCBjb21tb25GdW5jdGlvbk9iamVjdC5nZXRFbGVtZW50T2JqZWN0KCIueGctdmlkZW8tY29udGFpbmVyIik7CgkJCQkJCQlpZighdmlkZW9Db250YWluZXIpewoJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCX0KCQkJCQkJCWxldCBib3R0b21NZW51cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy54Zy1yaWdodC1ncmlkJyk7CgkJCQkJCQlsZXQgYm90dG9tTWVudUxlbmd0aCA9IGJvdHRvbU1lbnVzLmxlbmd0aDsKCQkJCQkJCWxldCBib3R0b21NZW51ID0gYm90dG9tTWVudXMubGVuZ3RoPjEgPyBib3R0b21NZW51c1tib3R0b21NZW51TGVuZ3RoIC0gMl0gOiBib3R0b21NZW51c1tib3R0b21NZW51TGVuZ3RoIC0gMV07CgkJCQkJCQlsZXQgZG91eWluVmlkZW9Eb3dubG9hZGVyRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2RvdXlpbi12aWRlby1kb3dubG9kZXInKTsKCQkJCQkJCWlmKGRvdXlpblZpZGVvRG93bmxvYWRlckRvbSl7CgkJCQkJCQkJZG91eWluVmlkZW9Eb3dubG9hZGVyRG9tLnBhcmVudE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkb3V5aW5WaWRlb0Rvd25sb2FkZXJEb20ucGFyZW50Tm9kZSk7CgkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJCS8vIOaLt+i0neS4gOS4quiKgueCuQoJCQkJCQkJbGV0IHBsYXliYWNrU2V0dGluZyA9IGJvdHRvbU1lbnUucXVlcnlTZWxlY3RvcignLnhncGxheWVyLXBsYXliYWNrLXNldHRpbmcnKTsKCQkJCQkJCWlmKCFwbGF5YmFja1NldHRpbmcpewoJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCX0KCQkJCQkJCWxldCBkb3dubG9hZCA9IHBsYXliYWNrU2V0dGluZy5jbG9uZU5vZGUodHJ1ZSk7CgkJCQkJCQlsZXQgZG93bmxvYWRUZXh0ID0gZG93bmxvYWQucXVlcnlTZWxlY3RvcignZGl2OmZpcnN0LWNoaWxkJyk7CgkJCQkJCQlkb3dubG9hZFRleHQuaW5uZXJUZXh0PSfkuIvovb0nOwoJCQkJCQkJZG93bmxvYWRUZXh0LnN0eWxlID0gJ2ZvbnQtc2l6ZToxNHB4JzsKCQkJCQkJCWRvd25sb2FkVGV4dC5zZXRBdHRyaWJ1dGUoJ2lkJywnZG91eWluLXZpZGVvLWRvd25sb2RlcicpOwoJCQkJCQkJCgkJCQkJCQlsZXQgYXV0b3BsYXlTZXR0aW5nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnhncGxheWVyLWF1dG9wbGF5LXNldHRpbmcnKTsKCQkJCQkJCWlmKCFhdXRvcGxheVNldHRpbmcpewoJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCX0KCQkJCQkJCWF1dG9wbGF5U2V0dGluZy5hZnRlcihkb3dubG9hZCk7CgkJCQkJCQlsZXQgdmlkZW9QbGF5ZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndmlkZW8nKTsKCQkJCQkJCWxldCB2aWRlb1BsYXlEb20gPSB2aWRlb1BsYXllcnNbdmlkZW9QbGF5ZXJzLmxlbmd0aD4xID8gdmlkZW9QbGF5ZXJzLmxlbmd0aC0yIDogdmlkZW9QbGF5ZXJzLmxlbmd0aC0xXTsJCQoJCQkJCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2RvdXlpbi12aWRlby1kb3dubG9kZXIiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIChlKT0+ewoJCQkJCQkJCWxldCBwbGF5ZXJVcmwgPSB2aWRlb1BsYXlEb20uY2hpbGRyZW5bMF0uc3JjOwoJCQkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNb3BlbkluVGFiKHBsYXllclVybCk7CgkJCQkJCQl9KTsKCQkJCQkJfWNhdGNoKGUpe30KCQkJCQl9CgkJCQkJLy/nm5HlkKzpvKDmoIcKCQkJCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLGRvd25sb2FkZXIpOwoJCQkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxmdW5jdGlvbihlKXsKCQkJCQkJaWYoZS5jb2RlID09ICdBcnJvd0Rvd24nIHx8IGUuY29kZSA9PSAnQXJyb3dVcCcpewoJCQkJCQkJZG93bmxvYWRlcigpOwoJCQkJCQl9CgkJCQkJfSk7CgkJCQkJLy/op4bpopHmlLnlj5jlkI7op6blj5EKCQkJCQlhc3luYyBmdW5jdGlvbiBkb21Ob2RlSW5zZXJ0ZWQoKXsKCQkJCQkJbGV0IGZpbmRWaWRlb0ludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCQkJCQkJCWxldCB2aWRlb0VsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpOwoJCQkJCQkJaWYodmlkZW9FbGVtZW50KXsKCQkJCQkJCQl2aWRlb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZUluc2VydGVkJywoZSkgPT4gewoJCQkJCQkJCQlkb3dubG9hZGVyKCk7CgkJCQkJCQkJfSk7CgkJCQkJCQkJY2xlYXJJbnRlcnZhbChmaW5kVmlkZW9JbnRlcnZhbCk7CgkJCQkJCQl9CgkJCQkJCX0sIDIwMCk7CgkJCQkJfQoJCQkJCWRvbU5vZGVJbnNlcnRlZCgpOwoJCQkJCWRvd25sb2FkZXIoKTsKCQkJCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGRvd25sb2FkZXIpOwoJCQkJfQoJCQl9KTsKCQl9OwoJCXRoaXMua3VhaXNob3VWaWRlb0Rvd25sb2FkZXIgPSBmdW5jdGlvbigpewoJCQlpZih3aW5kb3cubG9jYXRpb24uaG9zdCAhPT0gInd3dy5rdWFpc2hvdS5jb20iKXsKCQkJCXJldHVybjsKCQkJfQoJCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsZnVuY3Rpb24oKXsKCQkJCWFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkZXIoKXsKCQkJCQlsZXQga3VhaXNob3VWaWRlb0Rvd25sb2RlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNrdWFpc2hvdS12aWRlby1kb3dubG9kZXIiKTsKCQkJCQlpZigha3VhaXNob3VWaWRlb0Rvd25sb2Rlcil7CgkJCQkJCWxldCBkb3dubG9hZERJViA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJCQkJCQlkb3dubG9hZERJVi5zdHlsZSA9ICJjdXJzb3I6cG9pbnRlcjt3aWR0aDo1MHB4O2hlaWdodDo0MHB4O2xpbmUtaGVpZ2h0OjQwcHg7dGV4dC1hbGlnbjpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjojRkZGO2NvbG9yOiMwMDA7cG9zaXRpb246Zml4ZWQ7dG9wOjIwMHB4O2xlZnQ6MHB4O3otaW5kZXg6OTk5OyI7CgkJCQkJCWRvd25sb2FkRElWLmlubmVyVGV4dCA9ICLkuIvovb0iOwoJCQkJCQlkb3dubG9hZERJVi5zZXRBdHRyaWJ1dGUoJ2lkJywna3VhaXNob3UtdmlkZW8tZG93bmxvZGVyJyk7CgkJCQkJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG93bmxvYWRESVYpOwoJCQkJCQkKCQkJCQkJZG93bmxvYWRESVYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbihlKXsKCQkJCQkJCWxldCB2aWRlb0RvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5ZXItdmlkZW8nKTsKCQkJCQkJCWlmKCF2aWRlb0RvbSl7CgkJCQkJCQkJY29uc29sZS5sb2coJ+ayoeacieaJvuWIsERPTScpOwoJCQkJCQkJCXJldHVybjsKCQkJCQkJCX0KCQkJCQkJCWxldCB2aWRlb1NyYyA9IHZpZGVvRG9tLmdldEF0dHJpYnV0ZSgnc3JjJyk7CQkJCQkKCQkJCQkJCWlmKHZpZGVvU3JjLm1hdGNoKC9eYmxvYi8pKXsKCQkJCQkJCQljb25zb2xlLmxvZygnYmxvYuinhumikeaXoOazleS4i+i9vScpOwoJCQkJCQkJCXJldHVybjsKCQkJCQkJCX0KCQkJCQkJCWNvbW1vbkZ1bmN0aW9uT2JqZWN0LkdNb3BlbkluVGFiKHZpZGVvU3JjKTsKCQkJCQkJfSk7CgkJCQkJfQoJCQkJfQoJCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnN3aXRjaC1pdGVtIikuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSl7CgkJCQkJdmFsdWUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbigpewoJCQkJCQlkb3dubG9hZGVyKCk7CgkJCQkJfSk7CgkJCQl9KQoJCQkJZG93bmxvYWRlcigpOwoJCQkJc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCQkJCQlsZXQga3VhaXNob3VWaWRlb0Rvd25sb2RlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNrdWFpc2hvdS12aWRlby1kb3dubG9kZXIiKTsKCQkJCQlpZihrdWFpc2hvdVZpZGVvRG93bmxvZGVyKXsKCQkJCQkJaWYod2luZG93LmxvY2F0aW9uLmhyZWYubWF0Y2goL2h0dHBzOlwvXC93d3dcLmt1YWlzaG91XC5jb21cL3Nob3J0LXZpZGVvXC8uKj8vKSl7CgkJCQkJCQlrdWFpc2hvdVZpZGVvRG93bmxvZGVyLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwoJCQkJCQl9ZWxzZXsKCQkJCQkJCWt1YWlzaG91VmlkZW9Eb3dubG9kZXIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKCQkJCQkJfQoJCQkJCX0KCQkJCX0sIDgwMCk7CgkJCX0pOwoJCX07CgkJdGhpcy5zdGFydCA9IGZ1bmN0aW9uKCl7CgkJCXRoaXMuZG91eWluVmlkZW9Eb3dubG9hZGVyKCk7CgkJCXRoaXMua3VhaXNob3VWaWRlb0Rvd25sb2FkZXIoKTsKCQl9OwoJfTsKCQoJdHJ5ewoJCWlmKGZ1bmN0aW9uQ29udHJvbGxlci5hYnJvYWRWaWRlb0hlbHBlcil7CgkJCShuZXcgYWJyb2FkVmlkZW9IZWxwZXIoKSkuc3RhcnQoKTsKCQl9Cgl9Y2F0Y2goZSl7CgkJY29uc29sZS5sb2coIuWbveWkluinhumikeino+aekO+8mmVycm9y77yaIitlKTsKCX0KCQkKCXRyeXsKCQlpZihmdW5jdGlvbkNvbnRyb2xsZXIuYmlsaWJpbGlIZWxwZXIpewoJCQluZXcgYmlsaWJpbGlIZWxwZXIoY29tbW9uRnVuY3Rpb25PYmplY3QpLnN0YXJ0KCk7CgkJfQoJfWNhdGNoKGUpewoJCWNvbnNvbGUubG9nKCJC56uZ6KeG6aKR5LiL6L2977yaZXJyb3LvvJoiK2UpOwoJfQoJCQoJdHJ5ewoJCWlmKGZ1bmN0aW9uQ29udHJvbGxlci5zZWFyY2hFbmdpbmVzTmF2aWdhdGlvbil7CgkJCW5ldyBzZWFyY2hFbmdpbmVzTmF2aWdhdGlvbihjb21tb25GdW5jdGlvbk9iamVjdCkuc3RhcnQoKTsKCQl9Cgl9Y2F0Y2goZSl7CgkJY29uc29sZS5sb2coIuaQnOe0ouW8leaTjuWvvOiIqu+8mmVycm9y77yaIitlKTsKCX0KCQoJdHJ5ewoJCWlmKGZ1bmN0aW9uQ29udHJvbGxlci56aGlodUhlbHBlcil7CgkJCW5ldyB6aGlodUhlbHBlcihjb21tb25GdW5jdGlvbk9iamVjdCkuc3RhcnQoKTsKCQl9Cgl9Y2F0Y2goZSl7CgkJY29uc29sZS5sb2coIuefpeS5juWKqeaJi++8mmVycm9y77yaIitlKTsKCX0KCQoJdHJ5ewoJCWlmKGZ1bmN0aW9uQ29udHJvbGxlci5zaG9ydFZpZGVvRG93bmxvYWQpewoJCQkobmV3IHNob3J0VmlkZW9Eb3dubG9hZGVyKCkpLnN0YXJ0KCk7CgkJfQoJfWNhdGNoKGUpewoJCWNvbnNvbGUubG9nKCLnn63op4bpopHljrvmsLTljbDkuIvovb3vvJplcnJvcu+8miIrZSk7Cgl9Cn0pKCk7
Add Comment
Please, Sign In to add comment