xiaomianao666

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

Jan 10th, 2024
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_(改)网盘直链下载助手@base64://Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgICAgIO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJiwovLyBAbmFtZXNwYWNlICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL3N5aHl6MTk5MC9iYWlkdXl1bgovLyBAdmVyc2lvbiAgICAgICAgICAgMS4wLjguMgovLyBAYXV0aG9yICAgICAgICAgICAgSG1qejEwMOOAgeayueWwj+eMtAovLyBAaWNvbiAgICAgICAgICAgICAgZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhacFpYZENiM2c5SWpBZ01DQXhNamdnTVRJNElqNDhjR0YwYUNCa1BTSk5NVEF6TGpZZ01UQTNMalJqTXk0MUxUSXVNaUE0TGprdE5pNHhJREV6TGpndE1USXVOWE0zTGpNdE1USXVOU0E0TGpVdE1UWXVOV011TlMweExqY2dNaTR5TFRjdU5TQXlMakl0TVRRdU55QXdMVEV3TGpFdE15NHpMVEkxTGpFdE1UVXVOQzB6Tmk0NExURTBMalV0TVRRdE16SXVNUzB4TkM0ekxUTTFMamN0TVRRdU15MDRJREF0TVRVdU55QXhMamt0TWpJdU5pQTFMakpETkRRZ01qTWdNelV1TnlBek1TNDBJRE13TGpnZ05ERXVOMk10TVM0eklESXVPQzAwSURRdU55MDNMakVnTlMwMElDNHpMVGN1TlNBMExqUXRPQzQ1SURrdU5pMHVOU0F4TGprdE1TNDJJRE11TlMwekxqRWdOQzQzUXpRdU5DQTJOaTQ0SURBZ056VXVOeUF3SURnMVl6QWdOaTQ0SURJdU15QXhNeTR4SURZdU1TQXhPQzR5SURVdU5TQTNMalFnTVRRdU1pQXhNaTR5SURJMElERXlMakpvTkRjdU1XTTBMalFnTUNBeE1TMHVOU0F4T0M0ekxUTXVOU0F6TGpJdE1TNDBJRFV1T1MweklEZ3VNUzAwTGpWNklpQm1hV3hzUFNJalFUQTVPVVl3SWk4K1BIQmhkR2dnWkQwaVRURXhPUzQ0SURZMExqTmpMakV0TVRjdU1TMHhNQzQwTFRJNExURXlMalV0TXpBdU1VTTVOU0F5TWk0eElEYzVMamtnTWpFdU9DQTNOaTQ1SURJeExqaGpMVEUzTGpZZ01DMHpNeTR6SURFd0xqVXRNemt1T1NBeU5pNDNMUzQySURFdU15MHhMamdnTWk0ekxUTXVOQ0F5TGpOb0xTNDBZeTAxTGpnZ01DMHhNQzQySURRdU9DMHhNQzQySURFd0xqZDJMalZqTUNBeExqUXRMamdnTWk0MkxURXVPU0F6TGpORE1UTXVOQ0EyT1NBNExqZ2dOell1T0NBNExqZ2dPRFZqTUNBeE1pNHlJRGt1T1NBeU1pNHpJREl5TGpJZ01qSXVNMmcwTlM0eVl6TXVOaTB1TVNBeE55NDJMUzQ1SURJNUxqWXRNVElnTWk0NUxUSXVPQ0F4TXk0NUxURXpMamNnTVRRdE16RjZJaUJtYVd4c1BTSWpOVGMwUVVJNElpOCtQSEJoZEdnZ1pEMGlUVEV4TUM0NElEVTNMalJzTGpJZ015NHpZekFnTVM0ekxURXVNU0F5TGpRdE1pNHpJREl1TkMweExqTWdNQzB5TGpNdE1TNHhMVEl1TXkweUxqUnNMUzR4TFRJdU9IWXRMak5qTUMweExqSXVPUzB5TGpJZ01pNHhMVEl1TTJndU0yTXVOeUF3SURFdU15NHpJREV1Tnk0M0xTNHlMakV1TXk0MUxqUWdNUzQwZW0wdE15NHpMVEV3TGpOak1DQXhMakl0TVNBeUxqTXRNaTR5SURJdU0yZ3RMakZqTFM0NElEQXRNUzQyTFM0MUxUSXRNUzR5TFRRdU5pMDRMak10TVRNdU15MHhNeTQxTFRJeUxqZ3RNVE11TlMweExqSWdNQzB5TGpNdE1TMHlMak10TWk0eWRpMHVNV013TFRFdU1pQXhMVEl1TXlBeUxqSXRNaTR6YUM0eFlUTXdMak0zSURNd0xqTTNJREFnTUNBeElERTFMamdnTkM0MFl6UXVOaUF5TGpnZ09DNDBJRFl1T0NBeE1TNHhJREV4TGpVdU1TNHpMakl1Tnk0eUlERXVNWHBOT0RndU15QTNNeTQ0VERjekxqVWdPVE11TW1NdE1TNDFJREV1T1MwekxqVWdNeTR4TFRVdU55QXpMalZvTFM0eVl5MHVOQzR4TFM0NExqRXRNUzR5TGpFdExqWWdNQzB4TGpFdExqRXRNUzQyTFM0eUxUSXVNaTB1TkMwMExqSXRNUzQzTFRVdU5pMHpMalZNTkRRdU15QTNNeTQ1WXkweUxUSXVOaTB5TGpVdE5TNDBMVEV1TkMwM0xqY3VNUzB1TVM0eExTNHlMakl0TGpJZ01TNHlMVElnTXk0MUxUTXVNaUEyTGpRdE15NHlhRFl1Tm5ZdE5TNDNZekF0Tmk0NElEUXVOeTB4TWlBeE1DNDVMVEV5SURRdU9DQXdJRGd1TlNBeUxqWWdNVEF1TXlBM0xqSXVOU0F4TGpNdExqSWdNaTQzTFRFdU5TQXpMakp6TFRJdU9DMHVNUzB6TGpNdE1TNDBZeTB4TGpFdE1pNDNMVEl1T1MwMExUVXVOUzAwTFRNdU5TQXdMVFlnTXkwMklEZDJPQzR4WXpBZ0xqVXRMaklnTVMwdU5pQXhMalF0TGpZdU55MHhMamNnTVM0eExUSXVOaUF4TGpGb0xUZ3VOR010TVM0eklEQXRNaUF1TkMweUxqRXVOeTB1TWk0MElEQWdNUzR6TGprZ01pNDBURFl6TGpFZ09UQmpMamtnTVM0eUlESXVNU0F4TGpnZ015NHpJREV1T0hNeUxqTXRMallnTXk0eExURXVOMnd4TkM0NExURTVMak5qTGprdE1TNHhJREV1TVMweUlDNDVMVEl1TkMwdU1pMHVNeTB1T1MwdU55MHlMakV0TGpkb0xUY3VObU10TGprZ01DMHhMamN0TGpVdE1pNHhMVEV1TWkwdU15MHVOQzB1TkMwdU9DMHVOQzB4TGpNZ01DMHhMalFnTVM0eExUSXVOU0F5TGpVdE1pNDFhRGN1Tm1NekxqRWdNQ0ExTGpVZ01TNHpJRFl1TmlBekxqVnNMak11TjJNdU55QXlMakV1TVNBMExqWXRNUzQzSURZdU9Yb2lJR1pwYkd3OUlpTm1abVlpTHo0OEwzTjJaejQ9Ci8vIEBkZXNjcmlwdGlvbiAgICAgICDlj6/ku6Xojrflj5bnvZHnm5jmlofku7bnnJ/lrp7kuIvovb3lnLDlnYDjgILnjrDlt7LmlK/mjIHnmb7luqbnvZHnm5jpmL/ph4znvZHnm5jlpKnnv7znvZHnm5jov4Xpm7fnvZHnm5jlpLjlhYvnvZHnm5jnp7vliqjnvZHnm5jlha3lpKfnvZHnm5jvvIzln7rkuo7jgJDnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJHkv67mlLnoh6o2LjEuNOeJiOacrCzoh6rnlKgs5Y675o6o5bm/LOS/ruWOn+aciUJVRyzkv67mlLnnlYzpnaIs55Sa6Iez5q+U5Y6f54mI6L+Y5aW955So77yBCi8vIEBsaWNlbnNlICAgICAgICAgICBBR1BMLTMuMC1vci1sYXRlcgovLyBAaG9tZXBhZ2UgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2htanoxMDAvT25saW5lLWRpc2stZGlyZWN0LWxpbmstZG93bmxvYWQtYXNzaXN0YW50LwovLyBAc3VwcG9ydFVSTCAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2htanoxMDAvT25saW5lLWRpc2stZGlyZWN0LWxpbmstZG93bmxvYWQtYXNzaXN0YW50L2lzc3VlcwovLyBAY29tcGF0aWJsZQkgICAgICBDaHJvbWUKLy8gQGNvbXBhdGlibGUJICAgICAgRWRnZQovLyBAY29tcGF0aWJsZQkgICAgICBGaXJlZm94Ci8vIEBjb21wYXRpYmxlCSAgICAgIFNhZmFyaQovLyBAY29tcGF0aWJsZQkgICAgICBPcGVyYQovLyBAcmVxdWlyZSAgICAgICAgICAgaHR0cHM6Ly91bnBrZy5jb20vanF1ZXJ5QDMuNi4wL2Rpc3QvanF1ZXJ5Lm1pbi5qcwovLyBAcmVxdWlyZSAgICAgICAgICAgaHR0cHM6Ly91bnBrZy5jb20vc3dlZXRhbGVydDJAMTEvZGlzdC9zd2VldGFsZXJ0Mi5taW4uanMKLy8gQHJlcXVpcmUgICAgICAgICAgIGh0dHBzOi8vdW5wa2cuY29tL2pzLW1kNUAwLjcuMy9idWlsZC9tZDUubWluLmpzCi8vIEByZXNvdXJjZSBTd2FsICAgICBodHRwczovL3VucGtnLmNvbS9zd2VldGFsZXJ0MkAxMS9kaXN0L3N3ZWV0YWxlcnQyLm1pbi5jc3MKLy8gQHJlc291cmNlIFN3YWxEYXJrIGh0dHBzOi8vdW5wa2cuY29tL0Bzd2VldGFsZXJ0Mi90aGVtZS1kYXJrQDUuMC4xNS9kYXJrLm1pbi5jc3MKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL2Rpc2svaG9tZSoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly95dW4uYmFpZHUuY29tL2Rpc2svaG9tZSoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL2Rpc2svbWFpbioKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly95dW4uYmFpZHUuY29tL2Rpc2svbWFpbioKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL2Rpc2svYmFzZSoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly95dW4uYmFpZHUuY29tL2Rpc2svYmFzZSoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL3dhcC9ob21lKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3l1bi5iYWlkdS5jb20vd2FwL2hvbWUqCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS93YXAvbWFpbioKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly95dW4uYmFpZHUuY29tL3dhcC9tYWluKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3Bhbi5iYWlkdS5jb20vcy8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS9haXBhbi8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8veXVuLmJhaWR1LmNvbS9zLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly95dW4uYmFpZHUuY29tL2FpcGFuLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL3NoYXJlLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly95dW4uYmFpZHUuY29tL3NoYXJlLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3d3dy5hbGl5dW5kcml2ZS5jb20vZHJpdmUqCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vd3d3LmFsaXBhbi5jb20vcy8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vd3d3LmFsaXBhbi5jb20vZHJpdmUqCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vY2xvdWQuMTg5LmNuL3dlYi8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vcGFuLnh1bmxlaS5jb20vKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3Bhbi5xdWFyay5jbi8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8veXVuLjEzOS5jb20vKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL2NhaXl1bi4xMzkuY29tLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly8qLnlvdXhpYW9ob3UuY29tLyoKLy8gQGNvbm5lY3QgICAgICAgICAgIGJhaWR1LmNvbQovLyBAY29ubmVjdCAgICAgICAgICAgYmFpZHVwY3MuY29tCi8vIEBjb25uZWN0ICAgICAgICAgICBhbGl5dW5kcml2ZS5jb20KLy8gQGNvbm5lY3QgICAgICAgICAgIGFsaXl1bmRyaXZlLm5ldAovLyBAY29ubmVjdCAgICAgICAgICAgYWxpcGFuLmNvbQovLyBAY29ubmVjdCAgICAgICAgICAgMTg5LmNuCi8vIEBjb25uZWN0ICAgICAgICAgICB4dW5sZWkuY29tCi8vIEBjb25uZWN0ICAgICAgICAgICBxdWFyay5jbgovLyBAY29ubmVjdCAgICAgICAgICAgeW91eGlhb2hvdS5jb20KLy8gQGNvbm5lY3QgICAgICAgICAgIGdjb3JlLmpzZGVsaXZyLm5ldAovLyBAY29ubmVjdCAgICAgICAgICAgbG9jYWxob3N0Ci8vIEBjb25uZWN0ICAgICAgICAgICAqCi8vIEBydW4tYXQgICAgICAgICAgICBkb2N1bWVudC1pZGxlCi8vIEBncmFudCAgICAgICAgICAgICB1bnNhZmVXaW5kb3cKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0Ci8vIEBncmFudCAgICAgICAgICAgICBHTV9zZXRDbGlwYm9hcmQKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX3NldFZhbHVlCi8vIEBncmFudCAgICAgICAgICAgICBHTV9nZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgICAgICAgR01fb3BlbkluVGFiCi8vIEBncmFudCAgICAgICAgICAgICBHTV9pbmZvCi8vIEBncmFudCAgICAgICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kCi8vIEBncmFudCAgICAgICAgICAgICBHTV9jb29raWUKLy8gQGdyYW50ICAgICAgICAgICAgIEdNX2FkZFN0eWxlCi8vIEBncmFudCAgICAgICAgICAgICBHTV9nZXRSZXNvdXJjZVRleHQKLy8gQGRvd25sb2FkVVJMIGh0dHBzOi8vdXBkYXRlLmdyZWFzeWZvcmsub3JnL3NjcmlwdHMvNDQ5MjkxLyVFRiVCQyU4OCVFNiU5NCVCOSVFRiVCQyU4OSVFNyVCRCU5MSVFNyU5QiU5OCVFNyU5QiVCNCVFOSU5MyVCRSVFNCVCOCU4QiVFOCVCRCVCRCVFNSU4QSVBOSVFNiU4OSU4Qi51c2VyLmpzCi8vIEB1cGRhdGVVUkwgaHR0cHM6Ly91cGRhdGUuZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy80NDkyOTEvJUVGJUJDJTg4JUU2JTk0JUI5JUVGJUJDJTg5JUU3JUJEJTkxJUU3JTlCJTk4JUU3JTlCJUI0JUU5JTkzJUJFJUU0JUI4JThCJUU4JUJEJUJEJUU1JThBJUE5JUU2JTg5JThCLm1ldGEuanMKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24gKCkgewoJJ3VzZSBzdHJpY3QnOwoKCS8vIOeVjOmdouWPguaVsAoJbGV0IHB0ID0gJycsIHNlbGVjdExpc3QgPSBbXSwgcGFyYW1zID0ge30sIG1vZGUgPSAnJywgd2lkdGggPSAnJywgcGFuID0ge30sIGNvbG9yID0gJycsCgkJdXBkYXRlID0gJycsIHVwZGF0ZV9iYWlkdSA9ICcnLCB1cGRhdGVfYmFpZHVYID0gJycsCgkJZG9jID0gJChkb2N1bWVudCksIHByb2dyZXNzID0ge30sIHJlcXVlc3QgPSB7fSwgaW5zID0ge30sIGlkbSA9IHt9OwoKCgkvLyDlh4blpIflpb3lr7nlupTnmoTlhYPntKAKCWxldCBjdXN0b21DbGFzcyA9IHsKCQlwb3B1cDogJ3BsLXBvcHVwJywKCQloZWFkZXI6ICdwbC1oZWFkZXInLAoJCXRpdGxlOiAncGwtdGl0bGUnLAoJCWNsb3NlQnV0dG9uOiAncGwtY2xvc2UnLAoJCWNvbnRlbnQ6ICdwbC1jb250ZW50JywKCQlpbnB1dDogJ3BsLWlucHV0JywKCQlmb290ZXI6ICdwbC1mb290ZXInCgl9OwoKCgkvLyDlh4blpIflpb1TaGVsbOexu+Wei++8iOeUqOS6jmN1cmzkuIvovb3vvIkKCWxldCB0ZXJtaW5hbFR5cGUgPSB7CgkJd2M6ICJNaWNyb3NvZnQgV2luZG93cyDlkb3ku6Tmj5DnpLrnrKYiLAoJCXdwOiAiTWljcm9zb2Z0IFdpbmRvd3MgUG93ZXJTaGVsbCIsCgkJbHQ6ICJMaW51eCDnu4jnq68iLAoJCWxzOiAiTGludXggU2hlbGwiLAoJCW10OiAiQXBwbGUgTWFjT1Mg57uI56uvIiwKCX07CgoJLy/lh4blpIflpb3kv6Hmga/nlYzpnaLnmoTorr7nva7pgInpobkKCWxldCB1cGRhdGVjaGVjayA9IHsKCQl5ZXM6ICLoh6rliqjmo4Dmn6Xmm7TmlrAiLAoJCW5vOiAi5LiN5qOA5p+l5pu05pawIgoJfQoJbGV0IHlvdXNlcnZlciA9IHsKCQl2MTogIuS9v+eUqCBb55So5rK55bCP54y05pyN5Yqh5ZmoIFYxIOaOpeWPo10iLAoJCXYyOiAi5L2/55SoIFvnlKjmsrnlsI/njLTmnI3liqHlmaggVjIg5o6l5Y+jXSIsCgkJbm86ICLkuI3kvb/nlKggW+eUqCBqc2RlbGl2ciDov57mjqXmnKzpobnnm64gR2l0aHViIOS7k+W6k10o5pu05paw5Y+v6IO95LiN5Y+K5pe2KSIKCX07CglsZXQgYmFpZHV0aGVtZSA9IHsKCQl5ZXM6ICLkv67mlLnkuLvpopjoibIiLAoJCW5vOiAi5LiN5L+u5pS55Li76aKY6ImyIgoJfTsKCgkvL+WHhuWkh+WlveWPs+S4iuinkueahFRvYXN05o+Q56S6CglsZXQgdG9hc3QgPSBTd2FsLm1peGluKHsKCQl0b2FzdDogdHJ1ZSwKCQlwb3NpdGlvbjogJ3RvcC1lbmQnLAoJCXNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKCQl0aW1lcjogMzUwMCwKCQl0aW1lclByb2dyZXNzQmFyOiB0cnVlLAoJCXNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKCQlkaWRPcGVuOiAodG9hc3QpID0+IHsKCQkJdG9hc3QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIFN3YWwuc3RvcFRpbWVyKTsKCQkJdG9hc3QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIFN3YWwucmVzdW1lVGltZXIpOwoJCX0KCX0pOwoKCS8v5o+Q56S655qE5L+h5oGv5YaF5a65CglsZXQgbWVzc2FnZSA9IHsKCQlzdWNjZXNzOiAodGV4dCkgPT4gewoJCQl0b2FzdC5maXJlKHt0aXRsZTogdGV4dCwgaWNvbjogJ3N1Y2Nlc3MnfSk7CgkJfSwKCQllcnJvcjogKHRleHQpID0+IHsKCQkJdG9hc3QuZmlyZSh7dGl0bGU6IHRleHQsIGljb246ICdlcnJvcid9KTsKCQl9LAoJCXdhcm5pbmc6ICh0ZXh0KSA9PiB7CgkJCXRvYXN0LmZpcmUoe3RpdGxlOiB0ZXh0LCBpY29uOiAnd2FybmluZyd9KTsKCQl9LAoJCWluZm86ICh0ZXh0KSA9PiB7CgkJCXRvYXN0LmZpcmUoe3RpdGxlOiB0ZXh0LCBpY29uOiAnaW5mbyd9KTsKCQl9LAoJCXF1ZXN0aW9uOiAodGV4dCkgPT4gewoJCQl0b2FzdC5maXJlKHt0aXRsZTogdGV4dCwgaWNvbjogJ3F1ZXN0aW9uJ30pOwoJCX0KCX07CgoJLy8g5bCB6KOF5aW96KaB55So55qE5Ye95pWwCglsZXQgYmFzZSA9IHsKCQkvLyDpu5jorqToj5zljZUKCQlyZWdpc3Rlck1lbnVDb21tYW5kKCkgewoJCQlHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCfimpnvuI8g6K6+572uJywgKCkgPT4gewoJCQkJYmFzZS5zaG93U2V0dGluZygpOwoJCQl9KTsKCQkJR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgn8J+TgyDmm7TmlrAnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dVcGRhdGVMb2coKTsKCQkJfSk7CgkJCUdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoJ/Cfm6DvuI8g6LCD6K+VJywgKCkgPT4gewoJCQkJYmFzZS5zaG93SW5mbygpOwoJCQl9KTsKCQl9LAoKCQkvLyDlr7nkuo7pnZ7nvZHnm5jnmoToj5zljZUKCQlyZWdpc3RlclBhbk1lbnVDb21tYW5kKCkgewoJCQlHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCfimpnvuI8g6K6+572uJywgKCkgPT4gewoJCQkJYmFzZS5zaG93U2V0dGluZygpOwoJCQl9KTsKCQkJR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgn8J+TgyDmm7TmlrAnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dVcGRhdGVMb2coKTsKCQkJfSk7CgkJCUdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoJ/Cfm6DvuI8g6LCD6K+VJywgKCkgPT4gewoJCQkJYmFzZS5zaG93UGFuSW5mbygpOwoJCQl9KTsKCQl9LAoKCQkvLyDlj5bmtojngrnkuq7mjInpkq7mjInkuIvlkI7ov5DooYznmoQKCQlyZWdpc3RlckluaXRDb2RlKHZhbHVlKSB7CgkJCWNvbnNvbGUubG9nKCLjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFcbuato+WcqOazqOWFpeWPlua2iOeCueS6ruaMiemSruiuvue9rumhueebri4uLiIpOwoJCQltZXNzYWdlLndhcm5pbmcoIuato+WcqOazqOWFpeWPlua2iOeCueS6ruaMiemSruiuvue9rumhueebri4uLijmgqjlj6/ku6Xlho3mrKHngrnkuq7mjInpkq4pIik7CgkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJywgdmFsdWUpOwoJCQloaXN0b3J5LmdvKDApCgkJfSwKCgkJLy8g6I635Y+WQ29va2llCgkJZ2V0Q29va2llKG5hbWUpIHsKCQkJbGV0IGNvb2tpZXMgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKCQkJZm9yIChsZXQgaSA9IDA7IGkgPCBjb29raWVzLmxlbmd0aDsgaSsrKSB7CgkJCQlsZXQgY29va2llUGFpciA9IGNvb2tpZXNbaV0udHJpbSgpLnNwbGl0KCc9Jyk7CgkJCQlpZiAoY29va2llUGFpci5sZW5ndGggPT09IDIpIHsKCQkJCQlsZXQgY29va2llTmFtZSA9IGNvb2tpZVBhaXJbMF07CgkJCQkJaWYgKGNvb2tpZU5hbWUgPT09IG5hbWUpIHsKCQkJCQkJcmV0dXJuIGNvb2tpZVBhaXJbMV07CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXJldHVybiAnJzsKCQl9LAoKCQkvKi0tIOWvueixoeexu+Wei+WIpOaWrQoJCeekuuS+i++8mgoJCQlpc1R5cGUoW10pIC8vIOi+k+WHuiJhcnJheSIKCQkJaXNUeXBlKDEyMykgLy8g6L6T5Ye6Im51bWJlciIKCQkJaXNUeXBlKG51bGwpIC8vIOi+k+WHuiJudWxsIgoJCQlpc1R5cGUobmV3IERhdGUoKSkgLy8g6L6T5Ye6ImRhdGUiCgkJKi8KCQlpc1R5cGUob2JqKSB7CgkJCXJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKS5yZXBsYWNlKC9eXFtvYmplY3QgKC4rKVxdJC8sICckMScpLnRvTG93ZXJDYXNlKCk7CgkJfSwKCgoJCS8vIOiOt+WPluacrOWcsOS/neWtmOeahOaVsOWAvO+8iOS7heeUqOS6jiBHcmVhc2Vtb25rZXnvvIkKCQlnZXRWYWx1ZShuYW1lKSB7CgkJCXJldHVybiBHTV9nZXRWYWx1ZShuYW1lKTsKCQl9LAoKCQkvLyDkv67mlLnmnKzlnLDkv53lrZjnmoTmlbDlgLzvvIjku4XnlKjkuo4gR3JlYXNlbW9ua2V577yJCgkJc2V0VmFsdWUobmFtZSwgdmFsdWUpIHsKCQkJR01fc2V0VmFsdWUobmFtZSwgdmFsdWUpOwoJCX0sCgoJCS8vIOiOt+WPluacrOWcsOS/neWtmOeahOaVsOWAvAoJCWdldFN0b3JhZ2Uoa2V5KSB7CgkJCXRyeSB7CgkJCQlyZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpKTsKCQkJfSBjYXRjaCAoZSkgewoJCQkJcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7CgkJCX0KCQl9LAoKCQkvLyDkv67mlLnmnKzlnLDkv53lrZjnmoTmlbDlgLwKCQlzZXRTdG9yYWdlKGtleSwgdmFsdWUpIHsKCQkJaWYgKHRoaXMuaXNUeXBlKHZhbHVlKSA9PT0gJ29iamVjdCcgfHwgdGhpcy5pc1R5cGUodmFsdWUpID09PSAnYXJyYXknKSB7CgkJCQlyZXR1cm4gbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpOwoJCQl9CgkJCXJldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTsKCQl9LAoKCQkvLyDorr7nva7liarotLTmnb/vvIjku4XnlKjkuo4gR3JlYXNlbW9ua2V577yJCgkJc2V0Q2xpcGJvYXJkKHRleHQpIHsKCQkJR01fc2V0Q2xpcGJvYXJkKHRleHQsICd0ZXh0Jyk7CgkJfSwKCgkJLy8g5Yqg5a+G5oiQYmFzZTY077yI5YWI6L2s5o2i5oiQVVJM57yW56CB77yJCgkJZW5jb2RlKHN0cikgewoJCQlyZXR1cm4gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSkpOwoJCX0sCgoJCS8vIOS7jmJhc2U2NOino+WvhgoJCWRlY29kZShzdHIpIHsKCQkJcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoYXRvYihzdHIpKSk7CgkJfSwKCgkJLy/mlbDlrZfooaXpm7YKCQlyZXBhaXJUaW1lcihpKXsKCQkJaWYgKGkgPj0gMCAmJiBpIDw9IDkpIHsKCQkJCXJldHVybiAiMCIgKyBpOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIGk7CgkJCX0KCQl9LAoKCQkvLyDmjqXlj5fmlofku7blkI3lubbov5Tlm57lpKflhpnmianlsZXlkI0KCQlnZXRFeHRlbnNpb24obmFtZSkgewoJCQljb25zdCByZWcgPSAvKD8hXC4pXHcrJC87CgkJCWlmIChyZWcudGVzdChuYW1lKSkgewoJCQkJbGV0IG1hdGNoID0gbmFtZS5tYXRjaChyZWcpOwoJCQkJcmV0dXJuIG1hdGNoWzBdLnRvVXBwZXJDYXNlKCk7CgkJCX0KCQkJcmV0dXJuICcnOwoJCX0sCgoJCS8vIOaWh+S7tuWkp+Wwj+i9rOaNou+8iOS7peWtl+iKguS4uuWNleS9je+8iQoJCXNpemVGb3JtYXQodmFsdWUpIHsKCQkJaWYgKHZhbHVlID09PSArdmFsdWUpIHsKCQkJCWxldCB1bml0ID0gWyLlrZfoioIoQikiLCAi5Y2D5a2X6IqCKEtCKSIsICLlhYblrZfoioIoTUIpIiwgIuWQieWtl+iKgihHQikiLCAi5aSq5a2X6IqCKFRCKSIsICLmi43lrZfoioIoUEIpIiwgIuiJvuWtl+iKgihFQikiLCAi5rO95a2X6IqCKFpCKSIsICLlsKflrZfoioIoWUIpIl07CgkJCQlpZiAodmFsdWUgPT09IDApIHsKCQkJCQlyZXR1cm4gIjDlrZfoioIoQikiOwoJCQkJfSBlbHNlIHsKCQkJCQlsZXQgaW5kZXggPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGgubG9nKDEwMjQpKTsKCQkJCQlsZXQgc2l6ZSA9IHZhbHVlIC8gTWF0aC5wb3coMTAyNCwgaW5kZXgpOwoJCQkJCXNpemUgPSBzaXplLnRvRml4ZWQoMSk7CgkJCQkJcmV0dXJuIHNpemUgKyB1bml0W2luZGV4XTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gJyc7CgkJfSwKCgkJLy8g5qC55o2u5pWw57uE5Lit55qE5q+P5Liq5paH5Lu25ZCN6L+b6KGM5o6S5bqP77yM5L2/55So5LqGbG9jYWxlQ29tcGFyZeaWueazleadpeavlOi+g+S4reaWh+Wtl+espuS4sueahOmhuuW6j+OAggoJCXNvcnRCeU5hbWUoYXJyKSB7CgkJCWNvbnN0IGhhbmRsZSA9ICgpID0+IHsKCQkJCXJldHVybiAoYSwgYikgPT4gewoJCQkJCWNvbnN0IHAxID0gYS5maWxlbmFtZSA/IGEuZmlsZW5hbWUgOiBhLnNlcnZlcl9maWxlbmFtZTsKCQkJCQljb25zdCBwMiA9IGIuZmlsZW5hbWUgPyBiLmZpbGVuYW1lIDogYi5zZXJ2ZXJfZmlsZW5hbWU7CgkJCQkJcmV0dXJuIHAxLmxvY2FsZUNvbXBhcmUocDIsICJ6aC1DTiIpOwoJCQkJfTsKCQkJfTsKCQkJYXJyLnNvcnQoaGFuZGxlKCkpOwoJCX0sCgoJCS8vIOabv+aNoueJueauiuWtl+espuS4uuS4i+WIkue6vwoJCWZpeEZpbGVuYW1lKG5hbWUpIHsKCQkJbGV0IHJlcGxhY2UgPSAvWyE/JnxgIicqXC86PD5cXF0vZwoJCQlyZXR1cm4gbmFtZS5yZXBsYWNlKHJlcGxhY2UsICdfJyk7CgkJfSwKCgkJLy8g5o6l5Y+XQmxvYuWvueixoeWSjOaWh+S7tuWQje+8jOeEtuWQjuWIm+W7uuS4tOaXtumTvuaOpeaMh+WQkWJsb2Llr7nosaHvvIzkuYvlkI7liJvlu7ph5qCH562+5oyH5ZCR5Li05pe26ZO+5o6l5ZKM6K6+572u5paH5Lu25ZCN77yM5pyA5ZCO5qih5ouf54K55Ye7Yeagh+etvuWunueOsOS4i+i9veWSjOmHiuaUvuS4tOaXtumTvuaOpQoJCWJsb2JEb3dubG9hZChibG9iLCBmaWxlbmFtZSkgewoJCQlpZiAoYmxvYiBpbnN0YW5jZW9mIEJsb2IpIHsKCQkJCWNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CgkJCQljb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwoJCQkJYS5ocmVmID0gdXJsOwoJCQkJYS5kb3dubG9hZCA9IGZpbGVuYW1lOwoJCQkJYS5jbGljaygpOwoJCQkJVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpOwoJCQl9CgkJfSwKCgkJLy8g5L2/55SoUG9zdOWPkemAgeivt+axggoJCXBvc3QodXJsLCBkYXRhLCBoZWFkZXJzLCB0eXBlLCBtYXhSZXRyaWVzID0gMTAsIGN1cnJlbnRSZXRyeSA9IDApIHsKCQkJaWYgKHRoaXMuaXNUeXBlKGRhdGEpID09PSAnb2JqZWN0JykgewoJCQkJZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpOwoJCQl9CgkJCXJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CgkJCQljb25zdCBzZW5kUmVxdWVzdCA9ICgpID0+IHsKCQkJCQlHTV94bWxodHRwUmVxdWVzdCh7CgkJCQkJCW1ldGhvZDogIlBPU1QiLCB1cmwsIGhlYWRlcnMsIGRhdGEsCgkJCQkJCXJlc3BvbnNlVHlwZTogdHlwZSB8fCAnanNvbicsCgkJCQkJCW9ubG9hZDogKHJlcykgPT4gewoJCQkJCQkJaWYgKC9eW0EtWmEtejAtOSsvPVxzXSskLy50ZXN0KHJlcy5yZXNwb25zZSkgJiYgL15bQS1aYS16MC05Ky89XHNdKyQvLnRlc3QocmVzLnJlc3BvbnNlVGV4dCkpIHsKCQkJCQkJCQlpZiAocmVzLnJlc3BvbnNlKSB7CgkJCQkJCQkJCXJlcy5kZWNvZGVkUmVzcG9uc2UgPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcy5yZXNwb25zZSkpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAocmVzLnJlc3BvbnNlVGV4dCkgewoJCQkJCQkJCQlyZXMuZGVjb2RlZFJlc3BvbnNlVGV4dCA9IGJhc2UuZGVjb2RlKHJlcy5yZXNwb25zZVRleHQpOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWNvbnNvbGUubG9nKCfjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFQb3N0XG7or7fmsYLlnLDlnYDvvJonICsgdXJsICsgJ1xu6K+35rGC5aS06YOo77yaJyArIEpTT04uc3RyaW5naWZ5KGhlYWRlcnMpICsgJ1xu6K+35rGC57uT5p6c77yaJywgcmVzKTsKCQkJCQkJCXR5cGUgPT09ICdibG9iJyA/IHJlc29sdmUocmVzKSA6IHJlc29sdmUocmVzLnJlc3BvbnNlIHx8IHJlcy5yZXNwb25zZVRleHQpOwoJCQkJCQl9LAoJCQkJCQlvbmVycm9yOiAoZXJyKSA9PiB7CgkJCQkJCQlpZiAoY3VycmVudFJldHJ5IDwgbWF4UmV0cmllcykgewoJCQkJCQkJCWN1cnJlbnRSZXRyeSsrOwoJCQkJCQkJCWNvbnNvbGUuZXJyb3IoYOOAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkVBvc3Rcbuivt+axguWHuueOsOmUmeivr++8jOWPr+iDveaYr+e9kee7nOmXrumimFxuNeenkuWQjuWwhumHjeivlSAo6ZSZ6K+v5qyh5pWw77yaJHtjdXJyZW50UmV0cnl9LyR7bWF4UmV0cmllc30pLi4uYCwgZXJyKTsKCQkJCQkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgkJCQkJCQkJCWNvbnNvbGUubG9nKGDjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFQb3N0XG7ph43mlrDlsJ3or5Xor7fmsYIuLi5gKTsKCQkJCQkJCQkJc2VuZFJlcXVlc3QoKTsgLy8g6YeN5paw5Y+R6YCB6K+35rGCCgkJCQkJCQkJfSw1MDAwKQoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlyZWplY3QoJ+OAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkVBvc3Rcbuivt+axguWHuueOsOmUmeivr++8jOWPr+iDveaYr+e9kee7nOmXrumimFxu5peg5rOV57un57ut6K+35rGC77yM6L6+5Yiw5pyA5aSn6ZSZ6K+v5qyh5pWw44CCJywgZXJyKTsgLy8g6L6+5Yiw5pyA5aSn6YeN6K+V5qyh5pWw77yM5ouS57udIFByb21pc2UKCQkJCQkJCX0KCQkJCQkJfSwKCQkJCQl9KTsKCQkJCX07CgkJCQlzZW5kUmVxdWVzdCgpOyAvLyDliJ3lp4vor7fmsYIKCQkJfSk7CgkJfSwKCgkJLy8g5L2/55SoR2V05Y+R6YCB6K+35rGCCgkJZ2V0KHVybCwgaGVhZGVycywgdHlwZSwgZXh0cmEsIG1heFJldHJpZXMgPSAxMCwgY3VycmVudFJldHJ5ID0gMCkgewoJCQlyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewoJCQkJY29uc3Qgc2VuZFJlcXVlc3QgPSAoKSA9PiB7CgkJCQkJbGV0IHJlcXVlc3RPYmogPSBHTV94bWxodHRwUmVxdWVzdCh7CgkJCQkJCW1ldGhvZDogIkdFVCIsIHVybCwgaGVhZGVycywKCQkJCQkJcmVzcG9uc2VUeXBlOiB0eXBlIHx8ICdqc29uJywKCQkJCQkJb25sb2FkOiAocmVzKSA9PiB7CgkJCQkJCQljb25zb2xlLmxvZygn44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRR2V0IE9ubG9hZFxu6K+35rGC5Zyw5Z2A77yaJyArIHVybCArICdcbuivt+axguWktOmDqO+8micgKyBKU09OLnN0cmluZ2lmeShoZWFkZXJzKSArICdcbuivt+axgue7k+aenO+8micsIHJlcyk7CgkJCQkJCQlpZiAocmVzLnN0YXR1cyA9PT0gMjA0KSB7CgkJCQkJCQkJcmVxdWVzdE9iai5hYm9ydCgpOwoJCQkJCQkJCWlkbVtleHRyYS5pbmRleF0gPSB0cnVlOwoJCQkJCQkJfQoJCQkJCQkJaWYgKHR5cGUgPT09ICdibG9iJykgewoJCQkJCQkJCXJlcy5zdGF0dXMgPT09IDIwMCAmJiBiYXNlLmJsb2JEb3dubG9hZChyZXMucmVzcG9uc2UsIGV4dHJhLmZpbGVuYW1lKTsKCQkJCQkJCQlyZXNvbHZlKHJlcyk7CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCXJlc29sdmUocmVzLnJlc3BvbnNlIHx8IHJlcy5yZXNwb25zZVRleHQpOwoJCQkJCQkJfQoJCQkJCQl9LAoJCQkJCQlvbnByb2dyZXNzOiAocmVzKSA9PiB7CgkJCQkJCQlpZiAoZXh0cmEgJiYgZXh0cmEuZmlsZW5hbWUgJiYgZXh0cmEuaW5kZXgpIHsKCQkJCQkJCQlyZXMudG90YWwgPiAwID8gcHJvZ3Jlc3NbZXh0cmEuaW5kZXhdID0gKHJlcy5sb2FkZWQgKiAxMDAgLyByZXMudG90YWwpLnRvRml4ZWQoMikgOiBwcm9ncmVzc1tleHRyYS5pbmRleF0gPSAwLjAwOwoJCQkJCQkJfQoJCQkJCQl9LAoJCQkJCQlvbmxvYWRzdGFydCgpIHsKCQkJCQkJCWNvbnNvbGUubG9nKCfjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFHZXQgT25sb2FkU3RhcnRcbuivt+axguWcsOWdgO+8micgKyB1cmwgKyAnXG7or7fmsYLlpLTpg6jvvJonICsgSlNPTi5zdHJpbmdpZnkoaGVhZGVycykpOwoJCQkJCQkJZXh0cmEgJiYgZXh0cmEuZmlsZW5hbWUgJiYgZXh0cmEuaW5kZXggJiYgKHJlcXVlc3RbZXh0cmEuaW5kZXhdID0gcmVxdWVzdE9iaik7CgkJCQkJCX0sCgkJCQkJCW9uZXJyb3I6IChlcnIpID0+IHsKCQkJCQkJCWlmIChjdXJyZW50UmV0cnkgPCBtYXhSZXRyaWVzKSB7CgkJCQkJCQkJY3VycmVudFJldHJ5Kys7CgkJCQkJCQkJY29uc29sZS5lcnJvcihg44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRR2V0XG7or7fmsYLlh7rnjrDplJnor6/vvIzlj6/og73mmK/nvZHnu5zpl67pophcbjXnp5LlkI7lsIbph43or5UgKOmUmeivr+asoeaVsO+8miR7Y3VycmVudFJldHJ5fS8ke21heFJldHJpZXN9KS4uLmAsIGVycik7CgkJCQkJCQkJc2V0VGltZW91dChmdW5jdGlvbigpewoJCQkJCQkJCQljb25zb2xlLmxvZyhg44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRR2V0XG7ph43mlrDlsJ3or5Xor7fmsYIuLi5gKTsKCQkJCQkJCQkJc2VuZFJlcXVlc3QoKTsgLy8g6YeN5paw5Y+R6YCB6K+35rGCCgkJCQkJCQkJfSw1MDAwKQoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlyZWplY3QoJ+OAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkUdldFxu6K+35rGC5Ye6546w6ZSZ6K+v77yM5Y+v6IO95piv572R57uc6Zeu6aKYXG7ml6Dms5Xnu6fnu63or7fmsYLvvIzovr7liLDmnIDlpKfplJnor6/mrKHmlbDjgIInLCBlcnIpOyAvLyDovr7liLDmnIDlpKfph43or5XmrKHmlbDvvIzmi5Lnu50gUHJvbWlzZQoJCQkJCQkJfQoJCQkJCQl9LAoJCQkJCX0pOwoJCQkJfTsKCgkJCQlzZW5kUmVxdWVzdCgpOyAvLyDliJ3lp4vor7fmsYIKCQkJfSk7CgkJfSwKCgkJLy8g6I635Y+W5pyA57uI6ZO+5o6lCgkJZ2V0RmluYWxVcmwodXJsLCBoZWFkZXJzLCBtYXhSZXRyaWVzID0gMTAsIGN1cnJlbnRSZXRyeSA9IDApIHsKCQkJcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKCQkJCWNvbnN0IHNlbmRSZXF1ZXN0ID0gKCkgPT4gewoJCQkJCWxldCByZXF1ZXN0T2JqID0gR01feG1saHR0cFJlcXVlc3QoewoJCQkJCQltZXRob2Q6ICJHRVQiLCB1cmwsIGhlYWRlcnMsCgkJCQkJCW9ubG9hZDogKHJlcykgPT4gewoJCQkJCQkJY29uc29sZS5sb2coJ+OAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkUdldCBGaW5hbFVybFxu6K+35rGC5Zyw5Z2A77yaJyArIHVybCArICdcbuivt+axguWktOmDqO+8micgKyBKU09OLnN0cmluZ2lmeShoZWFkZXJzKSArICdcbui/lOWbnue7k+aenO+8micsIHJlcyk7CgkJCQkJCQlyZXNvbHZlKHJlcy5maW5hbFVybCk7CgkJCQkJCX0sCgkJCQkJCW9uZXJyb3I6IChlcnIpID0+IHsKCQkJCQkJCWlmIChjdXJyZW50UmV0cnkgPCBtYXhSZXRyaWVzKSB7CgkJCQkJCQkJY3VycmVudFJldHJ5Kys7CgkJCQkJCQkJY29uc29sZS5lcnJvcihg44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRR2V0IEZpbmFsVXJsXG7or7fmsYLlh7rnjrDplJnor6/vvIzlj6/og73mmK/nvZHnu5zpl67pophcbjXnp5LlkI7lsIbph43or5UgKOmUmeivr+asoeaVsO+8miR7Y3VycmVudFJldHJ5fS8ke21heFJldHJpZXN9KS4uLmApOwoJCQkJCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCQkJCQkJCQkJY29uc29sZS5sb2coYOOAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkUdldCBGaW5hbFVybFxu6YeN5paw5bCd6K+V6K+35rGCLi4uYCk7CgkJCQkJCQkJCXNlbmRSZXF1ZXN0KCk7IC8vIOmHjeaWsOWPkemAgeivt+axggoJCQkJCQkJCX0sNTAwMCkKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJcmVqZWN0KCfjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFHZXQgRmluYWxVcmxcbuivt+axguWHuueOsOmUmeivr++8jOWPr+iDveaYr+e9kee7nOmXrumimFxu5peg5rOV57un57ut6K+35rGC77yM6L6+5Yiw5pyA5aSn6ZSZ6K+v5qyh5pWw44CCJywgZXJyKTsgLy8g6L6+5Yiw5pyA5aSn6YeN6K+V5qyh5pWw77yM5ouS57udIFByb21pc2UKCQkJCQkJCX0KCQkJCQkJfSwKCQkJCQl9KTsKCQkJCX07CgoJCQkJc2VuZFJlcXVlc3QoKTsgLy8g5Yid5aeL6K+35rGCCgkJCX0pOwoJCX0sCgoJCS8vIOiOt+WPluiEmuacrOS/oeaBrwoJCWZldGNoU2NyaXB0SW5mbyh1cmwsIHJldHJ5Q291bnQpIHsKCQkJcmV0dXJuIGZldGNoKHVybCkKCQkJCS50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSkKCQkJCS50aGVuKGRhdGEgPT4gewoJCQkJY29uc29sZS5sb2coJ+OAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkUZldGNoXG7or7fmsYLlnLDlnYDvvJonICsgdXJsICsgJyAoR3JlYXN5Rm9yaylcbui/lOWbnue7k+aenO+8micsIGRhdGEpOwoJCQkJcmV0dXJuIGRhdGE7CgkJCX0pCgkJCQkuY2F0Y2goZXJyb3IgPT4gewoJCQkJY29uc29sZS5lcnJvcign44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRRmV0Y2hcbuiOt+WPluiEmuacrOeJiOacrOaXtuWPkeeUn+mUmeivrycsIGVycm9yKTsKCQkJCWlmIChyZXRyeUNvdW50ID4gMCkgewoJCQkJCWNvbnNvbGUubG9nKCLjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFGZXRjaFxuNeenkuWQjuWwhumHjeaWsOWwneivleiOt+WPlueJiOacrCIpOwoJCQkJCXJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTAwMCkpCgkJCQkJCS50aGVuKCgpID0+IHsKCQkJCQkJY29uc29sZS5sb2coJ+OAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkUZldGNoXG7ph43mlrDlsJ3or5Xojrflj5bohJrmnKzkv6Hmga8uLi4nKTsKCQkJCQkJcmV0dXJuIGZldGNoU2NyaXB0SW5mbyh1cmwsIHJldHJ5Q291bnQgLSAxKTsKCQkJCQl9KTsKCQkJCX0gZWxzZSB7CgkJCQkJY29uc29sZS5lcnJvcign44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRRmV0Y2hcbuivt+axguWHuueOsOmUmeivr++8jOWPr+iDveaYr+e9kee7nOmXrumimFxu5peg5rOV6I635Y+W6ISa5pys5L+h5oGv77yM6L6+5Yiw5pyA5aSn5bCd6K+V5qyh5pWw44CCJyk7CgkJCQkJdGhyb3cgZXJyb3I7CgkJCQl9CgkJCX0pOwoJCX0sCgoJCS8vIFJQQ+a1i+ivlQoJCWFzeW5jIHJwY1Rlc3QoZG9tYWluLCBwb3J0LCBwYXRoLCB0b2tlbikgewoJCQlyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewoJCQkJbGV0IHJwYyA9IHsgZG9tYWluLCBwb3J0LCBwYXRoLCB0b2tlbiB9OwoJCQkJbGV0IHVybCA9IGAke3JwYy5kb21haW59OiR7cnBjLnBvcnR9JHtycGMucGF0aH1gOwoJCQkJbGV0IHJwY0RhdGEgPSB7CgkJCQkJaWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAoJCQkJCWpzb25ycGM6ICcyLjAnLAoJCQkJCW1ldGhvZDogJ3N5c3RlbS5saXN0TWV0aG9kcycsCgkJCQkJcGFyYW1zOiBbYHRva2VuOiR7cnBjLnRva2VufWBdLAoJCQkJfTsKCQkJCUdNX3htbGh0dHBSZXF1ZXN0KHsKCQkJCQltZXRob2Q6ICJQT1NUIiwgdXJsLCBoZWFkZXJzOiB7fSwgZGF0YTogSlNPTi5zdHJpbmdpZnkocnBjRGF0YSksCgkJCQkJcmVzcG9uc2VUeXBlOiAnanNvbicsCgkJCQkJb25sb2FkOiAocmVzKSA9PiB7CgkJCQkJCWNvbnNvbGUubG9nKCfjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFQb3N0IFJQQ1Rlc3Rcbuivt+axguWcsOWdgO+8micgKyB1cmwgKyAnXG7or7fmsYLnu5PmnpzvvJonLCByZXMpOwoJCQkJCQlpZihyZXMucmVzcG9uc2UpewoJCQkJCQkJcmVzb2x2ZSgic3VjY2VzcyIpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJcmVzb2x2ZSgiZmFpbCIpOwoJCQkJCQl9CgkJCQkJfSwKCQkJCQlvbmVycm9yOiAoZXJyKSA9PiB7CgkJCQkJCWNvbnNvbGUuZXJyb3IoJ+OAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkVBvc3QgUlBDVGVzdFxu6K+35rGC5aSx6LSlJywgZXJyKTsKCQkJCQkJcmVzb2x2ZSgiZmFpbCIpOwoJCQkJCX0sCgkJCQl9KTsKCQkJfSk7CgkJfSwKCgkJc3RyaW5naWZ5KG9iaikgewoJCQlsZXQgc3RyID0gJyc7CgkJCWZvciAodmFyIGtleSBpbiBvYmopIHsKCQkJCWlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgewoJCQkJCXZhciB2YWx1ZSA9IG9ialtrZXldOwoJCQkJCWlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewoJCQkJCQlmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7CgkJCQkJCQlzdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWVbaV0pICsgJyYnOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJc3RyICs9IGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSArICcmJzsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHN0ci5zbGljZSgwLCAtMSk7IC8vIOWOu+aOieacq+WwvueahCAiJiIKCQl9LAoKCQlhZGRTdHlsZShpZCwgdGFnLCBjc3MpIHsKCQkJdGFnID0gdGFnIHx8ICdzdHlsZSc7CgkJCWxldCBkb2MgPSBkb2N1bWVudCwgc3R5bGVEb20gPSBkb2MuZ2V0RWxlbWVudEJ5SWQoaWQpOwoJCQlpZiAoc3R5bGVEb20pIHN0eWxlRG9tLnJlbW92ZSgpOwoJCQlsZXQgc3R5bGUgPSBkb2MuY3JlYXRlRWxlbWVudCh0YWcpOwoJCQlzdHlsZS5yZWwgPSAnc3R5bGVzaGVldCc7CgkJCXN0eWxlLmlkID0gaWQ7CgkJCXRhZyA9PT0gJ3N0eWxlJyA/IHN0eWxlLmlubmVySFRNTCA9IGNzcyA6IHN0eWxlLmhyZWYgPSBjc3M7CgkJCWRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdLmFwcGVuZENoaWxkKHN0eWxlKTsKCQl9LAoKCQlzbGVlcCh0aW1lKSB7CgkJCXJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZSkpOwoJCX0sCgoJCWZpbmRSZWFjdChkb20sIHRyYXZlcnNlVXAgPSAwKSB7CgkJCWNvbnN0IGtleSA9IE9iamVjdC5rZXlzKGRvbSkuZmluZChrZXkgPT4gewoJCQkJcmV0dXJuIGtleS5zdGFydHNXaXRoKCJfX3JlYWN0RmliZXIkIikKCQkJCXx8IGtleS5zdGFydHNXaXRoKCJfX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSQiKTsKCQkJfSk7CgkJCWNvbnN0IGRvbUZpYmVyID0gZG9tW2tleV07CgkJCWlmIChkb21GaWJlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKCgkJCWlmIChkb21GaWJlci5fY3VycmVudEVsZW1lbnQpIHsKCQkJCWxldCBjb21wRmliZXIgPSBkb21GaWJlci5fY3VycmVudEVsZW1lbnQuX293bmVyOwoJCQkJZm9yIChsZXQgaSA9IDA7IGkgPCB0cmF2ZXJzZVVwOyBpKyspIHsKCQkJCQljb21wRmliZXIgPSBjb21wRmliZXIuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjsKCQkJCX0KCQkJCXJldHVybiBjb21wRmliZXIuX2luc3RhbmNlOwoJCQl9CgoJCQljb25zdCBHZXRDb21wRmliZXIgPSBmaWJlciA9PiB7CgkJCQlsZXQgcGFyZW50RmliZXIgPSBmaWJlci5yZXR1cm47CgkJCQl3aGlsZSAodHlwZW9mIHBhcmVudEZpYmVyLnR5cGUgPT0gInN0cmluZyIpIHsKCQkJCQlwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjsKCQkJCX0KCQkJCXJldHVybiBwYXJlbnRGaWJlcjsKCQkJfTsKCQkJbGV0IGNvbXBGaWJlciA9IEdldENvbXBGaWJlcihkb21GaWJlcik7CgkJCWZvciAobGV0IGkgPSAwOyBpIDwgdHJhdmVyc2VVcDsgaSsrKSB7CgkJCQljb21wRmliZXIgPSBHZXRDb21wRmliZXIoY29tcEZpYmVyKTsKCQkJfQoJCQlyZXR1cm4gY29tcEZpYmVyLnN0YXRlTm9kZSB8fCBjb21wRmliZXI7CgkJfSwKCgkJLy/ms6jlhozpu5jorqTorr7nva4KCQlpbml0RGVmYXVsdENvbmZpZygpIHsKCQkJbGV0IHZhbHVlID0gW3sKCQkJCW5hbWU6ICdzZXR0aW5nX3JwY19kb21haW4nLAoJCQkJdmFsdWU6ICdodHRwOi8vbG9jYWxob3N0JwoJCQl9LCB7CgkJCQluYW1lOiAnc2V0dGluZ19ycGNfcG9ydCcsCgkJCQl2YWx1ZTogJzE2ODAwJwoJCQl9LCB7CgkJCQluYW1lOiAnc2V0dGluZ19ycGNfcGF0aCcsCgkJCQl2YWx1ZTogJy9qc29ucnBjJwoJCQl9LCB7CgkJCQluYW1lOiAnc2V0dGluZ19ycGNfdG9rZW4nLAoJCQkJdmFsdWU6ICcnCgkJCX0sIHsKCQkJCW5hbWU6ICdzZXR0aW5nX3JwY19kaXInLAoJCQkJdmFsdWU6ICdEOlxEb3dubG9hZHMnCgkJCX0sIHsKCQkJCW5hbWU6ICdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnLAoJCQkJdmFsdWU6ICd3YycKCQkJfSwgewoJCQkJbmFtZTogJ3NldHRpbmdfdGhlbWVfY29sb3InLAoJCQkJdmFsdWU6ICcjNTc0QUI4JwoJCQl9LCB7CgkJCQluYW1lOiAnc2V0dGluZ19pbml0X2NvZGUnLAoJCQkJdmFsdWU6ICcnCgkJCX0sIHsKCQkJCW5hbWU6ICdsaWNlbnNlJywKCQkJCXZhbHVlOiAnJwoJCQl9LCB7CgkJCQluYW1lOiAnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicsCgkJCQl2YWx1ZTogJ3YyJwoJCQl9LCB7CgkJCQluYW1lOiAnc2V0dGluZ19iYWlkdV90aGVtZScsCgkJCQl2YWx1ZTogJ25vJwoJCQl9XTsKCgkJCXZhbHVlLmZvckVhY2goKHYpID0+IHsKCQkJCS8vIOayoeacieWvueW6lOeahOmhueebruWwsea3u+WKoOS4iumhueebrgoJCQkJYmFzZS5nZXRWYWx1ZSh2Lm5hbWUpID09PSB1bmRlZmluZWQgJiYgYmFzZS5zZXRWYWx1ZSh2Lm5hbWUsIHYudmFsdWUpOwoJCQl9KTsKCQl9LAoKCQkvLyDorr7nva7nlYzpnaIKCQlzaG93U2V0dGluZygpIHsKCQkJbGV0IGRvbSA9ICcnLAoJCQkJYnRuID0gJycsCgkJCQljb2xvckxpc3QgPSBbJyMwOUFBRkYnLCcjY2MzMjM1JywnIzYzN2RmOCcsJyM1MThjMTcnLCcjZWQ5NDRiJywnI2Y5NjlhNScsJyNiY2EyODAnLCcjNTc0QUI4JywnIzBkNTNmZicsJyM2MzdkZmYnLCcjMzE4MWY5JywnI2Y4ZDgwMCcsJyMwMzk2ZmYnLCcjMzJjY2JjJywnI2Y2NDE2YycsJyMyMjcxYjEnLCcjNTk1MjRjJywnIzEwMTcxZCcsJyMxZDIzMjcnLCcjMThhNDk3J10sCgkJCQljb2xvck5hbWVMaXN0ID0gWyfluqbnm5g8YnI+57uP5YW46JOdJywn5bqm55uYPGJyPuW5s+Wuiee6oicsJ+W6puebmDxicj7pnJ7lhYnntKsnLCfluqbnm5g8YnI+55uO54S257u/Jywn5bqm55uYPGJyPuWRqOW5tOapmScsJ+W6puebmDxicj7lubjkvJrnsoknLCfluqbnm5g8YnI+5Y2I5ZCO5qOVJywn5bqm55uYPGJyPuaYn+epuue0qycsJ+WkuOWFizxicj7mmI7kuq7ok50nLCfpmL/ph4w8YnI+5LqR55uY57SrJywn56e75YqoPGJyPuW9qeS6keiTnScsJ+aenOaguDxicj7mn6Dmqqzpu4QnLCfmnpzmoLg8YnI+6buY6K6k6JOdJywn5p6c5qC4PGJyPueip+azoue7vycsJ+aenOaguDxicj7njqvnkbDnuqInLCfmlofmtL48YnI+6buY6K6k6JOdJywn5paH5rS+PGJyPuWSluWVoeeBsCcsJ+aWh+a0vjxicj7pu5jorqTpu5EnLCdPcGVuQUk8YnI+6buY6K6k6buRJywnT3BlbkFJPGJyPum7mOiupOmdkiddOwoJCQlkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlJQQ+S4u+acujwvZGl2PjxpbnB1dCB0eXBlPSJ0ZXh0IiAgcGxhY2Vob2xkZXI9IuS4u+acuuWcsOWdgO+8jOmcgOW4puS4imh0dHAocyk6Ly/vvIzkvYbkuI3pnIDopoHlhpnnq6/lj6PkuI7ot6/lvoQiIGNsYXNzPSJzd2FsMi1pbnB1dCBwbC1pbnB1dCBsaXN0ZW5lci1kb21haW4iIHZhbHVlPSIke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpfSI+PC9sYWJlbD5gOwoJCQlkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlJQQ+err+WPozwvZGl2PjxpbnB1dCB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0i56uv5Y+j5Y+377yM5L6L5aaC77yaTW90cml45LiL6L295Zmo5Li6MTY4MDAiIGNsYXNzPSJzd2FsMi1pbnB1dCBwbC1pbnB1dCBsaXN0ZW5lci1wb3J0IiB2YWx1ZT0iJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0Jyl9Ij48L2xhYmVsPmA7CgkJCWRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+UlBD6Lev5b6EPC9kaXY+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSLot6/lvoTvvIzpu5jorqTkuLovanNvbnJwYyIgY2xhc3M9InN3YWwyLWlucHV0IHBsLWlucHV0IGxpc3RlbmVyLXBhdGgiIHZhbHVlPSIke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKX0iPjwvbGFiZWw+YDsKCQkJZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5SUEPlr4bpkqU8L2Rpdj48aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IuaXoOWvhumSpeaXoOmcgOWhq+WGmSIgY2xhc3M9InN3YWwyLWlucHV0IHBsLWlucHV0IGxpc3RlbmVyLXRva2VuIiB2YWx1ZT0iJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpfSI+PC9sYWJlbD5gOwoJCQlkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPuS/neWtmOi3r+W+hDwvZGl2PjxpbnB1dCB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0i5paH5Lu25LiL6L295ZCO5L+d5a2Y6Lev5b6E77yM5L6L5aaC77yaRDoiIGNsYXNzPSJzd2FsMi1pbnB1dCBwbC1pbnB1dCBsaXN0ZW5lci1kaXIiIHZhbHVlPSIke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RpcicpfSI+PC9sYWJlbD5gOwoJCQlkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPuW9k+WJjVJQQzwvZGl2PjxkaXY+PHNwYW4gaWQ9InBsLXJwY0RvbWFpbiI+JHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKX08L3NwYW4+OjxzcGFuIGlkPSJwbC1ycGNQb3J0Ij4ke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKX08L3NwYW4+PHNwYW4gaWQ9InBsLXJwY1BhdGgiPiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpfTwvc3Bhbj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InBsLWJ1dHRvbi1taW5pIHN3YWwyLWNvbmZpcm0gc3dhbDItc3R5bGVkIGxpc3RlbmVyLXJwYy10ZXN0Ij7mtYvor5U8L2J1dHRvbj48L2Rpdj48L2xhYmVsPmA7CgoJCQljb2xvckxpc3QuZm9yRWFjaCgodiwgaSkgPT4gewoJCQkJYnRuICs9IGA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiAke3Z9O2JvcmRlcjogMXB4IHNvbGlkICR7dn0iIGNsYXNzPSJwbC1jb2xvci1ib3ggJHt2ID09PSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3RoZW1lX2NvbG9yJykgPyAnbGlzdGVuZXItY29sb3InIDogJ2xpc3RlbmVyLWNvbG9yJ30iPgoJCQkJPGRpdiBkYXRhLWNvbG9yPSIke3Z9IiBjbGFzcz0icGwtbWFzayI+JHtjb2xvck5hbWVMaXN0W2ldfSAke3YgPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGhlbWVfY29sb3InKSA/ICc8c3BhbiBpZD0icGwtdGhpc0NvbG9yIj4o5b2T5YmNKTwvc3Bhbj4nIDogJyd9PC9kaXY+CgkJCTwvZGl2PmA7CgkJCX0pOwoKCgkJCWRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+57uI56uv57G75Z6LPC9kaXY+PHNlbGVjdCBjbGFzcz0ic3dhbDItc2VsZWN0IHBsLWlucHV0IGxpc3RlbmVyLXRlcm1pbmFsIj5gOwoJCQlPYmplY3Qua2V5cyh0ZXJtaW5hbFR5cGUpLmZvckVhY2goayA9PiB7CgkJCQlkb20gKz0gYDxvcHRpb24gdmFsdWU9IiR7a30iICR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJykgPT09IGsgPyAnc2VsZWN0ZWQnIDogJyd9PiR7dGVybWluYWxUeXBlW2tdfTwvb3B0aW9uPmA7CgkJCX0pOwoJCQlkb20gKz0gYDwvc2VsZWN0PjwvbGFiZWw+YDsKCgkJCWRvbSArPWA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5b5a6e6aqM6YCJ6aG5XTxici8+5L+u5pS555m+5bqm572R55uY55WM6Z2i5Li65Yqp5omL5Li76aKY6ImyPC9kaXY+PHNlbGVjdCBjbGFzcz0ic3dhbDItc2VsZWN0IHBsLWlucHV0IGJhaWR1X3RoZW1lIj5gOwoJCQlPYmplY3Qua2V5cyhiYWlkdXRoZW1lKS5mb3JFYWNoKHZhbHVlID0+IHtkb20gKz0gYDxvcHRpb24gdmFsdWU9IiR7dmFsdWV9IiAke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfYmFpZHVfdGhlbWUnKSA9PT0gdmFsdWUgPyAnc2VsZWN0ZWQnIDogJyd9PiR7YmFpZHV0aGVtZVt2YWx1ZV19PC9vcHRpb24+YDt9KTsKCQkJZG9tICs9IGA8L3NlbGVjdD48L2xhYmVsPmA7CgoJCQlkb20gKz1gPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5L2/55So5rK55bCP54y05pyN5Yqh5ZmoPC9kaXY+PHNlbGVjdCBjbGFzcz0ic3dhbDItc2VsZWN0IHBsLWlucHV0IHlvdXhpYW9ob3Vfc2VydmVyIj5gOwoJCQlPYmplY3Qua2V5cyh5b3VzZXJ2ZXIpLmZvckVhY2godmFsdWUgPT4ge2RvbSArPSBgPG9wdGlvbiB2YWx1ZT0iJHt2YWx1ZX0iICR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSB2YWx1ZSA/ICdzZWxlY3RlZCcgOiAnJ30+JHt5b3VzZXJ2ZXJbdmFsdWVdfTwvb3B0aW9uPmA7fSk7CgkJCWRvbSArPSBgPC9zZWxlY3Q+PC9sYWJlbD5gOwoKCQkJZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7kuLvpopjpopzoibI8L2Rpdj4gPGRpdiBjbGFzcz0icGwtY29sb3IiPiR7YnRufTwvZGl2PjwvbGFiZWw+YDsKCgkJCWRvbSArPSBgPGJ1dHRvbiB0eXBlPSJidXR0b24iIHN0eWxlPSJtYXJnaW4tdG9wOiAzMHB4OyIgY2xhc3M9InBsLWJ1dHRvbi1taW5pIHN3YWwyLWRlbnkgc3dhbDItc3R5bGVkIGxpc3RlbmVyLXJlZ2lzdGVyIj7nhoTnga3lt7Lnu4/ngrnkuq7nmoTmjInpkq48L2J1dHRvbj5gCgoJCQlkb20gPSAnPGRpdj4nICsgZG9tICsgJzwvZGl2Pic7CgoJCQlTd2FsLmZpcmUoewoJCQkJdGl0bGU6ICfliqnmiYvorr7nva4nLAoJCQkJaHRtbDogZG9tLAoJCQkJaWNvbjogJ2luZm8nLAoJCQkJaWNvbkh0bWw6ICfimpknLAoJCQkJYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAoJCQkJc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAoJCQkJc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLAoJCQkJaGVpZ2h0QXV0bzogZmFsc2UsCgkJCQlzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKCQkJCWZvb3RlcjogcGFuLmZvb3RlciwKCQkJfSkudGhlbigocmVzdWx0KSA9PiB7CgkJCQlTd2FsLmZpcmUoewoJCQkJCXRpdGxlOiAi6K6+572u5bey5L+d5a2YIiwKCQkJCQlpY29uOiAnc3VjY2VzcycsCgkJCQkJYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAoJCQkJCXNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKCQkJCQlzaG93RGVueUJ1dHRvbjogdHJ1ZSwKCQkJCQljb25maXJtQnV0dG9uVGV4dDogJ+WIt+aWsCcsCgkJCQkJaGVpZ2h0QXV0bzogZmFsc2UsCgkJCQkJc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCgkJCQkJaHRtbDogYOW3sue7j+S/neWtmOiuvue9ruS6huWTpn4g5Yi35paw5bCx55Sf5pWI5ZWmIWAsCgkJCQkJZGVueUJ1dHRvblRleHQ6ICflj5bmtognCgkJCQl9KS50aGVuKChyZXN1bHQpID0+IHsKCQkJCQlpZiAocmVzdWx0LmlzQ29uZmlybWVkKXsKCQkJCQkJbWVzc2FnZS5zdWNjZXNzKCfliLfmlrDkuK0nKTsKCQkJCQkJaGlzdG9yeS5nbygwKTsKCQkJCQl9CgkJCQl9KTsKCQkJfSk7CgoKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItcmVnaXN0ZXInLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5yZWdpc3RlckluaXRDb2RlKDExMTExMSk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1ycGMtdGVzdCcsIGFzeW5jIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQlsZXQgZG9tYWluID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCgkJCQkJcG9ydCA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKCQkJCQlwYXRoID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpLAoJCQkJCXRva2VuID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKTsKCQkJCWUudGFyZ2V0LmlubmVySFRNTCA9ICLnrYnlvoUiOwoJCQkJbGV0IHJlc3VsdCA9IGF3YWl0IGJhc2UucnBjVGVzdChkb21haW4sIHBvcnQsIHBhdGgsIHRva2VuKTsKCQkJCWlmIChyZXN1bHQgPT09ICJzdWNjZXNzIikgewoJCQkJCWUudGFyZ2V0LmlubmVySFRNTCA9ICLmiJDlip8iOwoJCQkJCWUudGFyZ2V0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICIjNTJjNDFhIjsKCQkJCX0gZWxzZSB7CgkJCQkJZS50YXJnZXQuaW5uZXJIVE1MID0gIuWksei0pSI7CgkJCQkJZS50YXJnZXQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gIiNjYjE2MTYiOwoJCQkJfQoJCQkJc2V0VGltZW91dChmdW5jdGlvbigpewoJCQkJCWUudGFyZ2V0LmlubmVySFRNTCA9ICLmtYvor5UiOwoJCQkJCWUudGFyZ2V0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGhlbWVfY29sb3InKTsKCQkJCX0sNTAwMCkKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWNvbG9yJywgYXN5bmMgKGUpID0+IHsKCQkJCWlmKGUudGFyZ2V0LmRhdGFzZXQuY29sb3IpewoJCQkJCWlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtdGhpc0NvbG9yIikpewoJCQkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtdGhpc0NvbG9yIikucmVtb3ZlKCk7CgkJCQkJfQoJCQkJCWUudGFyZ2V0LmlubmVySFRNTCArPSAnPHNwYW4gaWQ9InBsLXRoaXNDb2xvciI+KOW9k+WJjSk8L3NwYW4+JzsKCQkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3RoZW1lX2NvbG9yJywgZS50YXJnZXQuZGF0YXNldC5jb2xvcik7CgkJCQkJYmFzZS5hZGRQYW5MaW5rZXJTdHlsZSgpOwoJCQkJfQoJCQl9KTsKCQkJZG9jLm9uKCdpbnB1dCcsICcubGlzdGVuZXItZG9tYWluJywgYXN5bmMgKGUpID0+IHsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicsIGUudGFyZ2V0LnZhbHVlKTsKCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1ycGNEb21haW4iKS5pbm5lckhUTUwgPSBlLnRhcmdldC52YWx1ZTsKCQkJfSk7CgkJCWRvYy5vbignaW5wdXQnLCAnLmxpc3RlbmVyLXBvcnQnLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcsIGUudGFyZ2V0LnZhbHVlKTsKCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1ycGNQb3J0IikuaW5uZXJIVE1MID0gZS50YXJnZXQudmFsdWU7CgkJCX0pOwoJCQlkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci1wYXRoJywgYXN5bmMgKGUpID0+IHsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnLCBlLnRhcmdldC52YWx1ZSk7CgkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtcnBjUGF0aCIpLmlubmVySFRNTCA9IGUudGFyZ2V0LnZhbHVlOwoJCQl9KTsKCQkJZG9jLm9uKCdpbnB1dCcsICcubGlzdGVuZXItdG9rZW4nLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nLCBlLnRhcmdldC52YWx1ZSk7CgkJCX0pOwoJCQlkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci1kaXInLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJywgZS50YXJnZXQudmFsdWUpOwoJCQl9KTsKCQkJZG9jLm9uKCdjaGFuZ2UnLCAnLmxpc3RlbmVyLXRlcm1pbmFsJywgYXN5bmMgKGUpID0+IHsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScsIGUudGFyZ2V0LnZhbHVlKTsKCQkJfSk7CgkJCWRvYy5vbignY2hhbmdlJywgJy5iYWlkdV90aGVtZScsIGFzeW5jIChlKSA9PiB7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX2JhaWR1X3RoZW1lJywgZS50YXJnZXQudmFsdWUpOwoJCQl9KTsKCQkJZG9jLm9uKCdjaGFuZ2UnLCAnLnlvdXhpYW9ob3Vfc2VydmVyJywgYXN5bmMgKGUpID0+IHsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInLCBlLnRhcmdldC52YWx1ZSk7CgkJCX0pOwoJCX0sCgoJCS8vIOaJi+acuueJiOiuvue9rueVjOmdogoJCXNob3dXYXBTZXR0aW5nKCkgewoJCQlsZXQgZG9tID0gJycsCgkJCQlidG4gPSAnJywKCQkJCWNvbG9yTGlzdCA9IFsnIzA5QUFGRicsJyNjYzMyMzUnLCcjNjM3ZGY4JywnIzUxOGMxNycsJyNlZDk0NGInLCcjZjk2OWE1JywnI2JjYTI4MCcsJyM1NzRBQjgnLCcjMGQ1M2ZmJywnIzYzN2RmZicsJyMzMTgxZjknXSwKCQkJCWNvbG9yTmFtZUxpc3QgPSBbJ+W6puebmDxicj7nu4/lhbjok50nLCfluqbnm5g8YnI+5bmz5a6J57qiJywn5bqm55uYPGJyPumcnuWFiee0qycsJ+W6puebmDxicj7nm47nhLbnu78nLCfluqbnm5g8YnI+5ZGo5bm05qmZJywn5bqm55uYPGJyPuW5uOS8mueyiScsJ+W6puebmDxicj7ljYjlkI7mo5UnLCfluqbnm5g8YnI+5pif56m657SrJywn5aS45YWLPGJyPuaYjuS6ruiTnScsJ+mYv+mHjDxicj7kupHnm5jntKsnLCfnp7vliqg8YnI+5b2p5LqR6JOdJ107CgkJCWRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+UlBD5Li75py6PC9kaXY+PGlucHV0IHR5cGU9InRleHQiICBwbGFjZWhvbGRlcj0i5Li75py65Zyw5Z2A77yM6ZyA5bim5LiKaHR0cChzKTovLyIgY2xhc3M9InN3YWwyLWlucHV0IHBsLWlucHV0IGxpc3RlbmVyLWRvbWFpbiIgdmFsdWU9IiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyl9Ij48L2xhYmVsPmA7CgkJCWRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+UlBD56uv5Y+jPC9kaXY+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSLnq6/lj6Plj7fvvIzkvovlpoLvvJpNb3RyaXjkuLoxNjgwMCIgY2xhc3M9InN3YWwyLWlucHV0IHBsLWlucHV0IGxpc3RlbmVyLXBvcnQiIHZhbHVlPSIke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKX0iPjwvbGFiZWw+YDsKCQkJZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5SUEPot6/lvoQ8L2Rpdj48aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9Iui3r+W+hO+8jOm7mOiupOS4ui9qc29ucnBjIiBjbGFzcz0ic3dhbDItaW5wdXQgcGwtaW5wdXQgbGlzdGVuZXItcGF0aCIgdmFsdWU9IiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpfSI+PC9sYWJlbD5gOwoJCQlkb20gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlJQQ+WvhumSpTwvZGl2PjxpbnB1dCB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0i5peg5a+G6ZKl5peg6ZyA5aGr5YaZIiBjbGFzcz0ic3dhbDItaW5wdXQgcGwtaW5wdXQgbGlzdGVuZXItdG9rZW4iIHZhbHVlPSIke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyl9Ij48L2xhYmVsPmA7CgkJCWRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5L+d5a2Y6Lev5b6EPC9kaXY+PGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSLmlofku7bkuIvovb3lkI7kv53lrZjot6/lvoTvvIzkvovlpoLvvJpEOiIgY2xhc3M9InN3YWwyLWlucHV0IHBsLWlucHV0IGxpc3RlbmVyLWRpciIgdmFsdWU9IiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJyl9Ij48L2xhYmVsPmA7CgkJCWRvbSArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5b2T5YmNUlBDPC9kaXY+PGRpdj48c3BhbiBpZD0icGwtcnBjRG9tYWluIj4ke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpfTwvc3Bhbj46PHNwYW4gaWQ9InBsLXJwY1BvcnQiPiR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpfTwvc3Bhbj48c3BhbiBpZD0icGwtcnBjUGF0aCI+JHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyl9PC9zcGFuPjxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0icGwtYnV0dG9uLW1pbmkgc3dhbDItY29uZmlybSBzd2FsMi1zdHlsZWQgbGlzdGVuZXItcnBjLXRlc3QiPua1i+ivlTwvYnV0dG9uPjwvZGl2PjwvbGFiZWw+YDsKCgkJCWNvbG9yTGlzdC5mb3JFYWNoKCh2LCBpKSA9PiB7CgkJCQlidG4gKz0gYDxkaXYgc3R5bGU9ImJhY2tncm91bmQ6ICR7dn07Ym9yZGVyOiAxcHggc29saWQgJHt2fSIgY2xhc3M9InBsLWNvbG9yLWJveCAke3YgPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGhlbWVfY29sb3InKSA/ICdsaXN0ZW5lci1jb2xvcicgOiAnbGlzdGVuZXItY29sb3InfSI+CgkJCQk8ZGl2IGRhdGEtY29sb3I9IiR7dn0iIGNsYXNzPSJwbC1tYXNrIj4ke2NvbG9yTmFtZUxpc3RbaV19ICR7diA9PT0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190aGVtZV9jb2xvcicpID8gJzxzcGFuIGlkPSJwbC10aGlzQ29sb3IiPijlvZPliY0pPC9zcGFuPicgOiAnJ308L2Rpdj4KCQkJPC9kaXY+YDsKCQkJfSk7CgoKCQkJZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7nu4jnq6/nsbvlnos8L2Rpdj48c2VsZWN0IGNsYXNzPSJzd2FsMi1zZWxlY3QgcGwtaW5wdXQgbGlzdGVuZXItdGVybWluYWwiPmA7CgkJCU9iamVjdC5rZXlzKHRlcm1pbmFsVHlwZSkuZm9yRWFjaChrID0+IHsKCQkJCWRvbSArPSBgPG9wdGlvbiB2YWx1ZT0iJHtrfSIgJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKSA9PT0gayA/ICdzZWxlY3RlZCcgOiAnJ30+JHt0ZXJtaW5hbFR5cGVba119PC9vcHRpb24+YDsKCQkJfSk7CgkJCWRvbSArPSBgPC9zZWxlY3Q+PC9sYWJlbD5gOwoKCQkJZG9tICs9YDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlvlrp7pqozpgInpobldPGJyLz7kv67mlLnnmb7luqbnvZHnm5jnlYzpnaLkuLrliqnmiYvkuLvpopjoibI8L2Rpdj48c2VsZWN0IGNsYXNzPSJzd2FsMi1zZWxlY3QgcGwtaW5wdXQgYmFpZHVfdGhlbWUiPmA7CgkJCU9iamVjdC5rZXlzKGJhaWR1dGhlbWUpLmZvckVhY2godmFsdWUgPT4ge2RvbSArPSBgPG9wdGlvbiB2YWx1ZT0iJHt2YWx1ZX0iICR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19iYWlkdV90aGVtZScpID09PSB2YWx1ZSA/ICdzZWxlY3RlZCcgOiAnJ30+JHtiYWlkdXRoZW1lW3ZhbHVlXX08L29wdGlvbj5gO30pOwoJCQlkb20gKz0gYDwvc2VsZWN0PjwvbGFiZWw+YDsKCgkJCWRvbSArPWA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7kvb/nlKjmsrnlsI/njLTmnI3liqHlmag8L2Rpdj48c2VsZWN0IGNsYXNzPSJzd2FsMi1zZWxlY3QgcGwtaW5wdXQgeW91eGlhb2hvdV9zZXJ2ZXIiPmA7CgkJCU9iamVjdC5rZXlzKHlvdXNlcnZlcikuZm9yRWFjaCh2YWx1ZSA9PiB7ZG9tICs9IGA8b3B0aW9uIHZhbHVlPSIke3ZhbHVlfSIgJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09IHZhbHVlID8gJ3NlbGVjdGVkJyA6ICcnfT4ke3lvdXNlcnZlclt2YWx1ZV19PC9vcHRpb24+PC9zZWxlY3Q+PC9sYWJlbD5gO30pOwoKCQkJZG9tICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7kuLvpopjpopzoibI8L2Rpdj4gPGRpdiBjbGFzcz0icGwtY29sb3IiPiR7YnRufTwvZGl2PjwvbGFiZWw+YDsKCgkJCWRvbSArPSBgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJwbC1idXR0b24tbWluaSBzd2FsMi1kZW55IHN3YWwyLXN0eWxlZCBsaXN0ZW5lci1yZWdpc3RlciI+54aE54Gt5bey57uP54K55Lqu55qE5oyJ6ZKuPC9idXR0b24+YAoKCQkJZG9tID0gJzxkaXY+JyArIGRvbSArICc8L2Rpdj4nOwoKCQkJU3dhbC5maXJlKHsKCQkJCXRpdGxlOiAn5Yqp5omL6K6+572uJywKCQkJCWh0bWw6IGRvbSwKCQkJCWljb246ICdpbmZvJywKCQkJCWljb25IdG1sOiAn4pqZJywKCQkJCXNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKCQkJCXNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCgkJCQlmb290ZXI6IHBhbi5mb290ZXIsCgkJCX0pLnRoZW4oKHJlc3VsdCkgPT4gewoJCQkJU3dhbC5maXJlKHsKCQkJCQl0aXRsZTogIuiuvue9ruW3suS/neWtmCIsCgkJCQkJaWNvbjogJ3N1Y2Nlc3MnLAoJCQkJCWFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKCQkJCQlzaG93Q2xvc2VCdXR0b246IHRydWUsCgkJCQkJc2hvd0RlbnlCdXR0b246IHRydWUsCgkJCQkJY29uZmlybUJ1dHRvblRleHQ6ICfliLfmlrAnLAoJCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJCWh0bWw6IGDlt7Lnu4/kv53lrZjorr7nva7kuoblk6Z+IOWIt+aWsOWwseeUn+aViOWVpiFgLAoJCQkJCWRlbnlCdXR0b25UZXh0OiAn5Y+W5raIJwoJCQkJfSkudGhlbigocmVzdWx0KSA9PiB7CgkJCQkJaWYgKHJlc3VsdC5pc0NvbmZpcm1lZCl7CgkJCQkJCW1lc3NhZ2Uuc3VjY2Vzcygn5Yi35paw5LitJyk7CgkJCQkJCWhpc3RvcnkuZ28oMCk7CgkJCQkJfQoJCQkJfSk7CgkJCX0pOwoKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItcmVnaXN0ZXInLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5yZWdpc3RlckluaXRDb2RlKDExMTExMSk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1jb2xvcicsIGFzeW5jIChlKSA9PiB7CgkJCQlpZihlLnRhcmdldC5kYXRhc2V0LmNvbG9yKXsKCQkJCQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLXRoaXNDb2xvciIpKXsKCQkJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLXRoaXNDb2xvciIpLnJlbW92ZSgpOwoJCQkJCX0KCQkJCQllLnRhcmdldC5pbm5lckhUTUwgKz0gJzxzcGFuIGlkPSJwbC10aGlzQ29sb3IiPijlvZPliY0pPC9zcGFuPic7CgkJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ190aGVtZV9jb2xvcicsIGUudGFyZ2V0LmRhdGFzZXQuY29sb3IpOwoJCQkJCWJhc2UuYWRkUGFuTGlua2VyU3R5bGUoKTsKCQkJCX0KCQkJfSk7CgkJCWRvYy5vbignaW5wdXQnLCAnLmxpc3RlbmVyLWRvbWFpbicsIGFzeW5jIChlKSA9PiB7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nLCBlLnRhcmdldC52YWx1ZSk7CgkJCX0pOwoJCQlkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci1wb3J0JywgYXN5bmMgKGUpID0+IHsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnLCBlLnRhcmdldC52YWx1ZSk7CgkJCX0pOwoJCQlkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci1wYXRoJywgYXN5bmMgKGUpID0+IHsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnLCBlLnRhcmdldC52YWx1ZSk7CgkJCX0pOwoJCQlkb2Mub24oJ2lucHV0JywgJy5saXN0ZW5lci10b2tlbicsIGFzeW5jIChlKSA9PiB7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicsIGUudGFyZ2V0LnZhbHVlKTsKCQkJfSk7CgkJCWRvYy5vbignaW5wdXQnLCAnLmxpc3RlbmVyLWRpcicsIGFzeW5jIChlKSA9PiB7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3JwY19kaXInLCBlLnRhcmdldC52YWx1ZSk7CgkJCX0pOwoJCQlkb2Mub24oJ2NoYW5nZScsICcubGlzdGVuZXItdGVybWluYWwnLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJywgZS50YXJnZXQudmFsdWUpOwoJCQl9KTsKCQkJZG9jLm9uKCdjaGFuZ2UnLCAnLmJhaWR1X3RoZW1lJywgYXN5bmMgKGUpID0+IHsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfYmFpZHVfdGhlbWUnLCBlLnRhcmdldC52YWx1ZSk7CgkJCX0pOwoJCQlkb2Mub24oJ2NoYW5nZScsICcueW91eGlhb2hvdV9zZXJ2ZXInLCBhc3luYyAoZSkgPT4gewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicsIGUudGFyZ2V0LnZhbHVlKTsKCQkJfSk7CgkJfSwKCgkJc2hvd0luZm8oKSB7CgkJCWxldCBoaWRlaW5mbz0nJzsKCQkJaGlkZWluZm8gKz1gPHNwYW4+5Lul5LiL5YaF5a656YO95piv6ISa5pys6Ieq5bex5qOA5rWL5Yiw55qE5L+h5oGvPGJyPuacrOmhtemdouS7heS9nOS4uuiwg+ivleS9v+eUqDxzcGFuPmA7CgkJCWhpZGVpbmZvICs9YDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlvlhoXnva5dPGJyLz7ohJrmnKzniYjmnKw8L2Rpdj4ke3JlYWx2ZXJzaW9ufTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz1gPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+W+S4iuaKpV08YnIvPuiEmuacrOeJiOacrDwvZGl2PiR7dmVyc2lvbn08L2xhYmVsPmA7CgkJCWhpZGVpbmZvICs9YDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlvlhoXnva5dPGJyLz7ohJrmnKzkvZzogIU8L2Rpdj4ke3JlYWxhdXRob3J9PC9sYWJlbD5gOwoJCQloaWRlaW5mbyArPWA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5b5LiK5oqlXTxici8+6ISa5pys5L2c6ICFPC9kaXY+JHthdXRob3J9PC9sYWJlbD5gOwoJCQloaWRlaW5mbyArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+W+S4i+WPkV08YnIvPuWIneWni+WMluaal+WPtzwvZGl2PiR7cGFuLm51bX08L2xhYmVsPmA7CgkJCWhpZGVpbmZvICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5b5LiL5Y+RXTxici8+5Yid5aeL5YyW5Y2P6K6uPC9kaXY+JHtwYW4ubGljZW5zZX08L2xhYmVsPmA7CgkJCWhpZGVpbmZvICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5b5LiL5Y+RXTxici8+VUHku6PnkIY8L2Rpdj4ke3Bhbi51YX08L2xhYmVsPmA7CgkJCWhpZGVpbmZvICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5b5LiL5Y+RXTxici8+5YWs5LyX5Y+35Zyw5Z2APC9kaXY+JHtwYW4uaW1nfTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlvkuIvlj5FdPGJyLz7nvZHnm5jkuIfog73liqnmiYs8L2Rpdj4ke3Bhbi5hc3Npc3RhbnR9PC9sYWJlbD5gOwoJCQloaWRlaW5mbyArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+W+S4i+WPkV08YnIvPue9keebmENETjwvZGl2PiR7cGFuLm1pcnJvcn08L2xhYmVsPmA7CgkJCWhpZGVpbmZvICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5b5LiL5Y+RXTxici8+UlBD566h55CGPC9kaXY+JHtwYW4uZH08L2xhYmVsPmA7CgkJCWhpZGVpbmZvICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5b5LiL5Y+RXTxici8+SURN5LuL57uNPC9kaXY+JHtwYW4uaWRtfTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlvkuIvlj5FdPGJyLz7mj5DnpLrmlofmnKw8L2Rpdj4w44CBJHtwYW4uaW5pdFswXX08YnI+MeOAgSR7cGFuLmluaXRbMV19PGJyPjLjgIEke3Bhbi5pbml0WzJdfTxicj4z44CBJHtwYW4uaW5pdFszXX08YnI+NOOAgSR7cGFuLmluaXRbNF19PGJyPjXjgIEke3Bhbi5pbml0WzVdfTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPlvlhoXnva5dPGJyLz5Ub2FzdOmhteiEmjwvZGl2PiR7cGFuLmZvb3Rlcn08L2xhYmVsPmA7CgkJCWhpZGVpbmZvID0gJzxkaXY+JyArIGhpZGVpbmZvICsgJzwvZGl2Pic7CgoJCQlTd2FsLmZpcmUoewoJCQkJaWNvbjogJ2luZm8nLAoJCQkJdGl0bGU6ICfosIPor5Xkv6Hmga8nLAoJCQkJaHRtbDogaGlkZWluZm8sCgkJCQlhbGxvd091dHNpZGVDbGljazogZmFsc2UsCgkJCQlzaG93Q2xvc2VCdXR0b246IHRydWUsCgkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJY29uZmlybUJ1dHRvblRleHQ6ICflhbPpl60nCgkJCX0pOwoJCX0sCgoJCXNob3dQYW5JbmZvKCkgewoJCQlsZXQgaGlkZWluZm89Jyc7CgkJCWhpZGVpbmZvICs9YDxzcGFuPuacrOmhtemdouS7heS9nOS4uuiwg+ivleS9v+eUqDxzcGFuPmA7CgkJCWhpZGVpbmZvICs9YDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPueJiOacrDwvZGl2PiR7cmVhbHZlcnNpb259PC9sYWJlbD5gOwoJCQloaWRlaW5mbyArPWA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj7kvZzogIU8L2Rpdj4ke3JlYWxhdXRob3J9PC9sYWJlbD5gOwoJCQloaWRlaW5mbyArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5Yid5aeL5YyW5pqX5Y+3PC9kaXY+JHtwYW4ubnVtfTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPuWIneWni+WMluWNj+iurjwvZGl2PiR7cGFuLmxpY2Vuc2V9PC9sYWJlbD5gOwoJCQloaWRlaW5mbyArPSBgPGxhYmVsIGNsYXNzPSJwbC1zZXR0aW5nLWxhYmVsIj48ZGl2IGNsYXNzPSJwbC1sYWJlbCI+5YWs5LyX5Y+35Zyw5Z2APC9kaXY+JHtwYW4uaW1nfTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPue9keebmOS4h+iDveWKqeaJizwvZGl2PiR7cGFuLmFzc2lzdGFudH08L2xhYmVsPmA7CgkJCWhpZGVpbmZvICs9IGA8bGFiZWwgY2xhc3M9InBsLXNldHRpbmctbGFiZWwiPjxkaXYgY2xhc3M9InBsLWxhYmVsIj5SUEPnrqHnkIY8L2Rpdj4ke3Bhbi5kfTwvbGFiZWw+YDsKCQkJaGlkZWluZm8gKz0gYDxsYWJlbCBjbGFzcz0icGwtc2V0dGluZy1sYWJlbCI+PGRpdiBjbGFzcz0icGwtbGFiZWwiPklETeS7i+e7jTwvZGl2PiR7cGFuLmlkbX08L2xhYmVsPmA7CgkJCWhpZGVpbmZvID0gJzxkaXY+JyArIGhpZGVpbmZvICsgJzwvZGl2Pic7CgoJCQlTd2FsLmZpcmUoewoJCQkJaWNvbjogJ2luZm8nLAoJCQkJdGl0bGU6ICfosIPor5Xkv6Hmga8nLAoJCQkJaHRtbDogaGlkZWluZm8sCgkJCQlhbGxvd091dHNpZGVDbGljazogZmFsc2UsCgkJCQlzaG93Q2xvc2VCdXR0b246IHRydWUsCgkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJY29uZmlybUJ1dHRvblRleHQ6ICflhbPpl60nCgkJCX0pOwoJCX0sCgoJCXNob3dVcGRhdGVMb2coKSB7CgkJCVN3YWwuZmlyZSh7CgkJCQlpY29uOiAnaW5mbycsCgkJCQl0aXRsZTogJ+abtOaWsOaXpeW/lyjlhbPpl63mjInpkq7lnKjkuIvpnaLlk6YpJywKCQkJCWh0bWw6IGA8c3Bhbj4KCQkJCVYxLjAuOC4yPGJyPjHjgIHmm7TmjaLmlrDlm77moIfjgII8YnI+PGJyPgoJCQkJVjEuMC44LjE8YnI+MeOAgeS/ruWkjeWboOmHjeWkjee7keWumuaMiemSruiAjOWvvOiHtFJQQ+S4i+i9veS8muWPkemAgeWkmuadoeS4i+i9veivt+axgueahEJ1Z++8mzxicj4y44CB6YCJ5oup5LiN5L2/55So5rK55bCP54y05pyN5Yqh5Zmo5pe277yM4oCc55SoZ2hwcm94eei/nuaOpUdpdGh1YuS7k+W6k+KAneabtOaNouS4uuKAnOeUqGpzZGVsaXZy6L+e5o6lR2l0aHVi5LuT5bqT4oCd77ybPGJyPjPjgIHot5/ov5vlrpjmlrlWNi4xLjTniYjmnKzvvIzkv67lpI3np7vliqjnvZHnm5jml6Dms5Xojrflj5bpk77mjqXvvIzmlK/mjIHpmL/ph4zkupHnm5jmlrDln5/lkI1hbGlwYW4uY29t44CCPGJyPjxicj4KCQkJCVYxLjAuODxicj4x44CB5L+u5aSN6L+F6Zu3572R55uY5peg5rOV5Yu+6YCJ5paH5Lu244CCPGJyPjxicj4KCQkJCVYxLjAuNy45PGJyPjHjgIHmm7TmlrDnsr7nroDnvZHnm5jlhYPntKDljLnphY3op4TliJnvvIzpmLLmraLlm6DpgJrnn6XmqKrmnaHogIzlr7zoh7TkuI3og73ngrnliLDigJxBUEnkuIvovb3igJ3ku6XkuIvnmoTmjInpkq7jgII8YnI+PGJyPgoJCQkJVjEuMC43Ljg8YnI+MeOAgei3n+i/m+WumOaWuVY2LjEuMu+8jOWKoOWFpVYy5o6l5Y+j44CCPGJyPjLjgIHkv67lpI3nmb7luqbnvZHnm5jkuIvovb3ml7blm6DkuLrojrflj5bkuI3liLBhY2Nlc3NUb2tlbuiAjOS4gOebtOi9rOWciOOAgjxicj48YnI+CgkJCQlWMS4wLjcuNzxicj4x44CB5L+u5aSN55m+5bqm572R55uY55qE5oyJ6ZKu5Lya5Zug5Li65Li76aKY5LiN5ZCM6ICM6KKr5pS55Y+Y6aKc6Imy55qEQnVn77ybPGJyPjLjgIHmm7TmlrDlpLjlhYvnvZHnm5jmjInpkq7kuI7nlYzpnaLjgII8YnI+PGJyPgoJCQkJVjEuMC43LjY8YnI+MeOAgeS/ruWkjeKAnOazqOWFpeKAneWKn+iDve+8mzxicj4y44CB6buR5pqX5qih5byP5pSv5oyB6ZqP6K6+572u54Ot5YiH5o2i44CCPGJyPjxicj4KCQkJCVYxLjAuNy41PGJyPjHjgIHkv67lpI3pmL/ph4zkupHnm5jkuIvovb3pgLvovpHvvJs8YnI+MuOAgeeyvueugOS7o+egge+8mzxicj4z44CB5pSv5oyB5rex6Imy5qih5byP77ybPGJyPjTjgIHkv67mlLnpg6jliIbmj5DnpLrmlofmnKzvvJs8YnI+NeOAgeS/ruaUuemDqOWIhkNTU++8mzxicj4244CB6K6+572u5Y+v5rWL6K+VUlBD6L+e5o6l44CCPGJyPjxicj4KCQkJCVYxLjAuNy40PGJyPjHjgIHkvJjljJbkuIvovb3pgLvovpHvvJs8YnI+MuOAgeS/ruWkjemYv+mHjOS6keebmOaXoOazleS9v+eUqEFQSeS4i+i9veOAgjxicj48YnI+CgkJCQlWMS4wLjcuMzxicj4x44CB5aaC5p6c5Ye6546w572R57uc6K+35rGC6ZSZ6K+v5pe25pSv5oyB6Ieq5Yqo6YeN5paw6K+35rGC77ybPGJyPjLjgIHlj6/pgInmi6nmmK/lkKbkvb/nlKjmsrnlsI/njLTmnI3liqHlmajjgII8YnI+PGJyPgoJCQkJVjEuMC43LjI8YnI+MeOAgeS/ruWkjeS9v+eUqFJQQ+S4i+i9veaXtuS8mumHjeWkjeWPkemAgemTvuaOpeeahEJ1Z+OAgjxicj48YnI+CgkJCQlWMS4wLjcuMTxicj4x44CBW+WunumqjOWKn+iDve+8jOS4jeW9seWTjeato+W4uOS9v+eUqF3mlK/mjIHnmb7luqbnvZHnm5jmiYvmnLrnvZHpobXniYjvvIzli77pgInmlofku7blkI7lj6/lnKjpobbmoI/mib7liLDigJzkuIvovb3liqnmiYvigJ3mjInpkq7jgII8YnI+PGJyPgoJCQkJVjEuMC43PGJyPjHjgIHph43mnoTlpLjlhYvnvZHnm5jjgIHpmL/ph4zkupHnm5jmjInpkq7jgII8YnI+PGJyPgoJCQkJVjEuMC42Ljk8YnI+MeOAgeS4i+i9veeql+WPo+WKoOWFpeWFs+mXreaMiemSruOAgjxicj48YnI+CgkJCQlWMS4wLjYuODxicj4x44CB5L+u5aSN5aS45YWL572R55uY5oyJ6ZKu6ZSZ5L2N44CCPGJyPjxicj4KCQkJCVYxLjAuNi43PGJyPjHjgIHlsIbnmb7luqbnvZHnm5jnlYzpnaLkv67mlLnkuLrkuLvpopjoibLvvIzlj6/lnKjorr7nva7pgInmi6nmmK/lkKbkv67mlLnvvJs8YnI+MuOAgeWinuWKoOS4u+mimOiJsuWQjeensO+8jOabtOaUuemDqOWIhuWGheWuueminOiJsu+8mzxicj4z44CB56e75Yqo5LqR55uYQVBJ5LiL6L295pSv5oyB5om56YeP5aSN5Yi277ybPGJyPjTjgIHkvJjljJbmjqfliLblj7DovpPlh7rnu5PmnpzvvJs8YnI+NeOAgeeZvuW6pue9keebmEFQSeS4i+i9veS4jeS9v+eUqElETeaXtuWPr+S7peaYvuekuuWJqeS9meaXtumXtO+8mzxicj4244CB4oCc5Y+W5raI54K55Lqu5oyJ6ZKu4oCd5oyJ6ZKu55qE5L2N572u546w5bey56e75Yqo5Yiw6K6+572u6aG16Z2i44CCPGJyPjfjgIFob21v54m55pyJ55qE5b2p6JuL5Y+I5Zue5p2l5YqbKOWWnCnjgII8YnI+PGJyPgoJCQkJVjEuMC42LjY8YnI+MeOAgeS/ruWkjeaal+WPt+mUmeivr+OAgjxicj48YnI+CgkJCQlWMS4wLjYuNTxicj4x44CB5L+u5aSN5Y2z5L2/6L6T5YWl5q2j56Gu5pqX5Y+35Lmf5LiN6IO95oiQ5Yqf54K55Lqu5oyJ6ZKu55qE5pyN5Yqh5Zmo6ZSZ6K+v44CCPGJyPjxicj4KCQkJCVYxLjAuNi40PGJyPjHjgIHot5/ov5vlrpjmlrlWNi4xLjHniYjmnKzvvIzkv67lpI3pmL/ph4zkupHnm5jojrflj5bkuIvovb3pk77mjqXml7bnmoTpl67popjjgII8YnI+PGJyPgoJCQkJVjEuMC42LjM8YnI+MeOAgeeFp+mhvuWwj+Wxj+W5leeUqOaIt++8jOWwhuWni+e7iOaYvuekuuWkjeWItuWFqOmDqOmTvuaOpeeahOaMiemSru+8mzxicj4y44CB5aKe5Yqg5Y+W5raI5LiL6L295pe255qE5Yqo55S744CCPGJyPjxicj4KCQkJCVYxLjAuNi4yPGJyPjHjgIHkv67lpI3pg6jliIbnlYzpnaLplJnkvY3vvIzlrp7njrBDU1PlhoXnva7vvJs8YnI+MuOAgeeZvuW6pue9keebmOeVjOmdouWwhuWPmOW+l+abtOWKoOeugOa0geOAgjxicj48YnI+CgkJCQlWMS4wLjYuMTxicj4x44CB5paw5aKe55m+5bqm5LqR55uYQVBJ5LiL6L295pSv5oyB5aSN5Yi26ZO+5o6l77ybPGJyPjLjgIHkuLrkuobnhafpob7miYvmnLrmtY/op4jlmajnlKjmiLfvvIzlop7lpKfpobnnm67kuYvpl7Tpl7TpmpnvvIzmlrDlop7pmpDol49JRE3mj5DnpLrpgInpobnvvIzlj6/lnKjliqnmiYvorr7nva7kuK3lkK/nlKjvvJs8YnI+M+OAgeS/ruaUuUNTU++8jOeVjOmdouS8muWHuueOsOabtOWkmueahOS4u+mimOiJsu+8mzxicj4044CB5pSv5oyB5Zyo5ri45bCP54y05a6Y572R5p+l55yL5pqX5Y+377ybPGJyPjXjgIHkv67lpI3pg6jliIbor63ms5XplJnor6/jgII8YnI+PGJyPgoJCQkJVjEuMC42PGJyPjHjgIHkv67lpI3kuobmiZPlvIDpmL/ph4zkupHnm5jliIbkuqvov57mjqXml7blm6DkuIvovb3np7vliqjnq6/lub/lkYrlr7zoh7Tlj6rog73ngrnlh7tBUEnkuIvovb3vvJs8YnI+MuOAgei3n+i/m+WumOaWuTYuMC4054mI5pys77yM5L+u5aSN5aS45YWL572R55uY6I635Y+W5LiL6L296ZO+5o6l5aSx5pWI44CB5pSv5oyB56e75Yqo5LqR55uY44CCPGJyPjxicj4KCQkJCVYxLjAuNS41PGJyPjHjgIHmhJ/osKI8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vTmlnaHQtc3RhcnMtMSI+TmlnaHQtc3RhcnMtMTwvYT7nmoTluK7liqnvvIzkv67lpI3lm6DkuLrljp/kvZzogIXmnI3liqHlmajlr7zoh7TnmoTliJ3lp4vljJbmmpflj7for4bliKvplJnor6/vvJs8YnI+MuOAgeS/ruaUueS4gOS6m+aWh+acrOS7peWPiuaPkOS+m+e7meacjeWKoeWZqOeahOS/oeaBr+OAgjxicj48YnI+CgkJCQlWMS4wLjUuNDxicj4x44CB5bCP5L+u5bCP5pS5Y3Nz77yM6K6p5Li76aKY6Imy5Ye6546w5Zyo5pu05aSa5Zyw5pa577ybPGJyPjLjgIHkv67mlLnkuIvovb3pk77mjqXojrflj5blpLHotKXnmoTmj5DnpLrvvJs8YnI+M+OAgeWinuWKoOabtOWkmueahOS4u+mimOiJsu+8jOWPr+WcqOWKqeaJi+iuvue9ruafpeeci++8mzxicj4044CBaG9tb+W9qeibi+iiq+WIoOWOu+WKm++8iOaCsu+8ieOAgjxicj48YnI+CgkJCQlWMS4wLjUuMzxicj4x44CB5L+u5ZWm5L+u5ZWm77yM6Zi/6YeM5LqR55uY5Y+v5Lul5pG45Yiw5LiL6L296I+c5Y2V5LqG44CCPGJyPjxicj4KCQkJCVYxLjAuNS4yPGJyPjHjgIHlop7liqDohJrmnKzkv6Hmga/oj5zljZXvvIjmsqHmnInnlKjvvInvvJs8YnI+MuOAgeS8mOWMlumYv+mHjOS6keebmOaYvuekunN2Z+WbvueJh++8mzxicj4z44CB5L+u5pS55by556qX5oyJ6ZKu6aKc6Imy44CCPGJyPjxicj4KCQkJCVYxLjAuNS4xPGJyPjHjgIHkv67lpI3lnKjliIfmjaLmjInpkq7kuLvpopjlkI7lpLjlhYvnvZHnm5jkuI3og73mraPluLjmmL7npLrmjInpkq7jgII8YnI+PGJyPgoJCQkJVjEuMC41PGJyPjHjgIHot5/ov5vlrpjmlrlWNS4wLjTniYjmnKzvvJs8YnI+MuOAgeWwj+aUueWKqO+8jOeFp+edgOWumOaWueeJiOacrOabtOato+aWh+S7tuWQjeensOajgOa1i++8mzxicj4z44CB5L+d55WZ5b2p6JuL77yM5L2G5b+F6aG76IiN5byD5a6Y5pa55pqX5Y+344CCPGJyPjxicj4KCQkJCVYxLjAuNDxicj7lpKfmlLnvvIE8YnI+MeOAgeS/ruWkjeS6huWOn+S9nOiAheeVmeS4i+eahOWkuOWFi+e9keebmOWIh+aNouaWh+S7tuWkueWwseWkmuS4gOS4quKAnOS4i+i9veWKqeaJi+KAneaMiemSrueahOWkp0JVR++8mzxicj4y44CB57uI5LqO5p2l5LqG77yM5Zyo5LiL6L296I+c5Y2V5aKe5Yqg4oCc5Yqp5omL6K6+572u4oCd4oCc5pu05paw5pel5b+X4oCd5oyJ6ZKu77ybPGJyPuOAkOWGjeS5n+S4jeeUqOeCuei/m+ayueeMtOeuoeeQhuWGjei/m+iuvue9ruS6hijkv53nlZnmsrnnjLTnrqHnkIblhoXorr7nva4p44CRPGJyPjPjgIHkv67mlLnpmL/ph4zkupHnm5jlkozlpLjlhYvnvZHnm5jkuIvovb3liqnmiYvmjInpkq7moLflvI/vvJs8YnI+NOOAgeWinuWKoOKAnOWPlua2iOeCueS6ruaMiemSruKAneayueeMtOiPnOWNle+8mzxicj4144CB5L+u5pS56YOo5YiGY3Nz77yM5L2/5YW25LiO6YCJ5oup55qE5Li76aKY5pu06LS05YiH44CCPGJyPjxicj4KCQkJCVYxLjAuMzxicj4x44CB5aKe5Yqg5LiA5Liq5bCP5b2p6JuL77ybIOaPkOekuu+8mjxicj5ob21v77yI6ZyA5Zyo5pyq54K55Lqu5oyJ6ZKu54q25oCB6Kem5Y+R77yJPGJyPuOAkOmcgOimgemHjeaWsOaBouWkjeaMiemSruS4uuacqueCueS6rueKtuaAgeivt+i/m+WFpSDlt7Llronoo4XohJrmnKwtPue8lui+kS0+5byA5Y+R6ICFLT7ph43nva7liLDlh7rljoItPuehruWumuOAkTxicj4y44CB5L+u5pS5L+WinuWKoOm7mOiupOS4u+mimOiJsuOAgjxicj48YnI+CgkJCQlWMS4wLjI8YnI+MeOAgeS/ruaUueW5tuWKoOWuveeVjOmdou+8jOiwg+aVtOmDqOWIhmNzc++8jOS9v1N3ZWV0YWxlcnQy55WM6Z2i5pu0576O6KeC77yM5pu05LiO5Y6f54mI55u46L+R77ybPGJyPjLjgIHkv67mlLnpg6jliIbmj5DnpLrmloflrZfvvIzkvb/mloflrZfmm7TlrrnmmJPlpI3liLbjgIIgPGJyPjxicj4KCQkJCVYxLjAuMTxicj4x44CB5Y676Zmk5pu05paw5o+Q56S677ybPGJyPjLjgIHmm7TmlrBTd2VldGFsZXJ0MuiHszEx54mI5pys77ybPGJyPjPjgIHpg6jliIZDRE7oioLngrnmm7TmjaLkuLpqc2RlbGl2cuOAgjxicj48YnI+CgkJCQlWMS4wLjA8YnI+MeOAgeWinuWKoOKAnOazqOWFpeKAneWKn+iDve+8iGJ1c2hp77yJ77ybPGJyPjLjgIHljrvpmaTlub/lkYrjgIIKCQkJCTwvc3Bhbj5gLAoJCQkJYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAoJCQkJc2hvd0Nsb3NlQnV0dG9uOiBmYWxzZSwKCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCgkJCQljb25maXJtQnV0dG9uVGV4dDogJ+aIkeW3sumYhScsCgkJCX0pOwoJCX0sCgoJCWNyZWF0ZVRpcCgpIHsKCQkJJCgnYm9keScpLmFwcGVuZCgnPGRpdiBjbGFzcz0icGwtdG9vbHRpcCI+PC9kaXY+Jyk7CgoJCQlkb2Mub24oJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScsICcubGlzdGVuZXItdGlwJywgKGUpID0+IHsKCQkJCWlmIChlLnR5cGUgPT09ICdtb3VzZWVudGVyJykgewoJCQkJCWxldCBmaWxlbmFtZSA9IGUuY3VycmVudFRhcmdldC5pbm5lclRleHQ7CgkJCQkJbGV0IHNpemUgPSBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5zaXplOwoJCQkJCWxldCB0aXAgPSBgJHtmaWxlbmFtZX08c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHg7Y29sb3I6ICR7Y29sb3J9Ij4ke3NpemV9PC9zcGFuPmA7CgkJCQkJJChlLmN1cnJlbnRUYXJnZXQpLmNzcyh7b3BhY2l0eTogJzAuNSd9KTsKCQkJCQkkKCcucGwtdG9vbHRpcCcpLmh0bWwodGlwKS5jc3MoewoJCQkJCQknbGVmdCc6IGUucGFnZVggKyAxMCArICdweCcsCgkJCQkJCSd0b3AnOiBlLnBhZ2VZIC0gZS5jdXJyZW50VGFyZ2V0Lm9mZnNldFRvcCA+IDE0ID8gZS5wYWdlWSArICdweCcgOiBlLnBhZ2VZICsgMjAgKyAncHgnCgkJCQkJfSkuc2hvdygpOwoJCQkJfSBlbHNlIHsKCQkJCQkkKGUuY3VycmVudFRhcmdldCkuY3NzKHtvcGFjaXR5OiAnMSd9KTsKCQkJCQkkKCcucGwtdG9vbHRpcCcpLmhpZGUoMCk7CgkJCQl9CgkJCX0pOwoJCX0sCgoJCWNyZWF0ZUxvYWRpbmcoKSB7CgkJCXJldHVybiAkKCc8ZGl2IGNsYXNzPSJwbC1sb2FkaW5nIj48ZGl2IGNsYXNzPSJwbC1sb2FkaW5nLWJveCI+PGRpdj48ZGl2PjwvZGl2PjxkaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+Jyk7CgkJfSwKCgkJY3JlYXRlRG93bmxvYWRJZnJhbWUoKSB7CgkJCWxldCAkZGl2ID0gJCgnPGRpdiBzdHlsZT0icGFkZGluZzowO21hcmdpbjowO2Rpc3BsYXk6YmxvY2siPjwvZGl2PicpOwoJCQlsZXQgJGlmcmFtZSA9ICQoJzxpZnJhbWUgc3JjPSJqYXZhc2NyaXB0OjsiIGlkPSJkb3dubG9hZElmcmFtZSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9pZnJhbWU+Jyk7CgkJCSRkaXYuYXBwZW5kKCRpZnJhbWUpOwoJCQkkKCdib2R5JykuYXBwZW5kKCRkaXYpOwoJCX0sCgoJCWdldE1pcnJvckxpc3QobGluaywgbWlycm9yLCB0aHJlYWQgPSAyKSB7CgkJCWxldCBob3N0ID0gbmV3IFVSTChsaW5rKS5ob3N0OwoJCQlsZXQgbWlycm9ycyA9IFtdOwoJCQlmb3IgKGxldCBpID0gMDsgaSA8IG1pcnJvci5sZW5ndGg7IGkrKykgewoJCQkJZm9yIChsZXQgaiA9IDA7IGogPCB0aHJlYWQ7IGorKykgewoJCQkJCWxldCBpdGVtID0gbGluay5yZXBsYWNlKGhvc3QsIG1pcnJvcltpXSkgKyAnJicucmVwZWF0KGopOwoJCQkJCW1pcnJvcnMucHVzaChpdGVtKTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gbWlycm9ycy5qb2luKCdcbicpOwoJCX0sCgoJCWxpc3RlbkVsZW1lbnQoZWxlbWVudCwgY2FsbGJhY2spIHsKCQkJbGV0IGNoZWNrSW50ZXJ2YWwgPSA1MDA7IC8vIOajgOafpeWFg+e0oOeahOmXtOmalOaXtumXtO+8iOavq+enku+8iQoJCQlsZXQgd2FzRWxlbWVudEZvdW5kID0gZmFsc2U7IC8vIOeUqOS6jui3n+i4quWFg+e0oOaYr+WQpuS5i+WJjeW3sue7j+aJvuWIsAoKCQkJZnVuY3Rpb24gY2hlY2tFbGVtZW50KCkgewoJCQkJaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlbWVudCkpIHsKCQkJCQl3YXNFbGVtZW50Rm91bmQgPSB0cnVlOwoJCQkJCWNhbGxiYWNrKCk7CgkJCQl9IGVsc2UgaWYgKHdhc0VsZW1lbnRGb3VuZCkgewoJCQkJCXdhc0VsZW1lbnRGb3VuZCA9IGZhbHNlOyAvLyDlhYPntKDmtojlpLHlkI7ph43nva7moIflv5cKCQkJCX0KCgkJCQlzZXRUaW1lb3V0KGNoZWNrRWxlbWVudCwgY2hlY2tJbnRlcnZhbCk7CgkJCX0KCQkJY2hlY2tFbGVtZW50KCk7CgkJfSwKCgkJYWRkUGFuTGlua2VyU3R5bGUoKSB7CgkJCWNvbG9yID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190aGVtZV9jb2xvcicpOwoKCQkJbGV0IHN3YWxjc3MgPSBgCgkJCS5zd2FsMi1sb2FkZXJ7ZGlzcGxheTpub25lO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3dpZHRoOjIuMmVtO2hlaWdodDoyLjJlbTttYXJnaW46MCAxLjg3NWVtOy13ZWJraXQtYW5pbWF0aW9uOnN3YWwyLXJvdGF0ZS1sb2FkaW5nIDEuNXMgbGluZWFyIDBzIGluZmluaXRlIG5vcm1hbDthbmltYXRpb246c3dhbDItcm90YXRlLWxvYWRpbmcgMS41cyBsaW5lYXIgMHMgaW5maW5pdGUgbm9ybWFsO2JvcmRlci13aWR0aDouMjVlbTtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXJhZGl1czoxMDAlO2JvcmRlci1jb2xvcjoke2NvbG9yfSB0cmFuc3BhcmVudCAke2NvbG9yfSB0cmFuc3BhcmVudCB9CgkJCS5zd2FsMi1zdHlsZWQuc3dhbDItY29uZmlybXtib3JkZXI6MDtib3JkZXItcmFkaXVzOi4yNWVtO2JhY2tncm91bmQ6aW5pdGlhbDtiYWNrZ3JvdW5kLWNvbG9yOiR7Y29sb3J9O2NvbG9yOiNmZmY7Zm9udC1zaXplOjFlbX0KCQkJLnN3YWwyLXN0eWxlZC5zd2FsMi1jb25maXJtOmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgM3B4ICR7Y29sb3J9ODAgfQoJCQkuc3dhbDItdGltZXItcHJvZ3Jlc3MtYmFyLWNvbnRhaW5lcntwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO2JvdHRvbTowO2xlZnQ6MDtncmlkLWNvbHVtbjphdXRvO292ZXJmbG93OmhpZGRlbjtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo1cHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo1cHh9CgkJCS5zd2FsMi10aW1lci1wcm9ncmVzcy1iYXJ7d2lkdGg6MTAwJTtoZWlnaHQ6LjI1ZW07YmFja2dyb3VuZDoke2NvbG9yfTMzIH0KCQkJLnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwe3otaW5kZXg6MjA7ZmxleC1zaHJpbms6MDt3aWR0aDoyZW07aGVpZ2h0OjJlbTtib3JkZXItcmFkaXVzOjJlbTtiYWNrZ3JvdW5kOiR7Y29sb3J9O2NvbG9yOiNmZmY7bGluZS1oZWlnaHQ6MmVtO3RleHQtYWxpZ246Y2VudGVyfQoJCQkuc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgLnN3YWwyLXByb2dyZXNzLXN0ZXAuc3dhbDItYWN0aXZlLXByb2dyZXNzLXN0ZXB7YmFja2dyb3VuZDoke2NvbG9yfSB9CgkJCS5zd2FsMi1wcm9ncmVzcy1zdGVwcyAuc3dhbDItcHJvZ3Jlc3Mtc3RlcC1saW5le3otaW5kZXg6MTA7ZmxleC1zaHJpbms6MDt3aWR0aDoyLjVlbTtoZWlnaHQ6LjRlbTttYXJnaW46MCAtMXB4O2JhY2tncm91bmQ6JHtjb2xvcn0gfQoJCQkuc3dhbDItcG9wdXAge3BhZGRpbmc6IDAgMCAxLjI1ZW07fQoJCQlkaXY6d2hlcmUoLnN3YWwyLWNvbnRhaW5lcikgLnN3YWwyLWh0bWwtY29udGFpbmVye21hcmdpbjogMWVtIDEuM2VtIDAuM2VtO30KCQkJYDsKCgkJCS8vIOWFiOebkeWQrOminOiJsuaWueahiOWPmOWMliBQYW5saW5rZXItU3dlZXRBbGVydDItRGVmYXVsdAoJCQl3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLmFkZExpc3RlbmVyKChlKSA9PiB7CgkJCQlpZiAoZS5tYXRjaGVzKSB7CgkJCQkJLy8g5YiH5o2i5Yiw5pqX6Imy5Li76aKYCgkJCQkJdGhpcy5hZGRTdHlsZSgnc3dhbC1wdWItc3R5bGUnLCAnc3R5bGUnLCBHTV9nZXRSZXNvdXJjZVRleHQoJ1N3YWxEYXJrJykpOwoJCQkJfSBlbHNlIHsKCQkJCQkvLyDliIfmjaLliLDmtYXoibLkuLvpopgKCQkJCQl0aGlzLmFkZFN0eWxlKCdzd2FsLXB1Yi1zdHlsZScsICdzdHlsZScsIEdNX2dldFJlc291cmNlVGV4dCgnU3dhbCcpKTsKCQkJCX0KCQkJCXRoaXMuYWRkU3R5bGUoJ1Bhbmxpbmtlci1Td2VldEFsZXJ0Mi1Vc2VyJywgJ3N0eWxlJywgc3dhbGNzcyk7CgkJCX0pOwoJCQkvLyDlho3kv67mlLnkuLvpopggUGFubGlua2VyLVN3ZWV0QWxlcnQyLURlZmF1bHQKCQkJaWYgKHdpbmRvdy5tYXRjaE1lZGlhICYmIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcykgewoJCQkJLy8g5YiH5o2i5Yiw5pqX6Imy5Li76aKYCgkJCQl0aGlzLmFkZFN0eWxlKCdzd2FsLXB1Yi1zdHlsZScsICdzdHlsZScsIEdNX2dldFJlc291cmNlVGV4dCgnU3dhbERhcmsnKSk7CgkJCX0gZWxzZSB7CgkJCQkvLyDliIfmjaLliLDmtYXoibLkuLvpopgKCQkJCXRoaXMuYWRkU3R5bGUoJ3N3YWwtcHViLXN0eWxlJywgJ3N0eWxlJywgR01fZ2V0UmVzb3VyY2VUZXh0KCdTd2FsJykpOwoJCQl9CgkJCXRoaXMuYWRkU3R5bGUoJ1Bhbmxpbmtlci1Td2VldEFsZXJ0Mi1Vc2VyJywgJ3N0eWxlJywgc3dhbGNzcyk7CgoKCQkJbGV0IHVpY3NzID0gYAoJCQlib2R5Ojotd2Via2l0LXNjcm9sbGJhciB7IGRpc3BsYXk6IG5vbmUgfQoJCQk6Oi13ZWJraXQtc2Nyb2xsYmFyIHsgd2lkdGg6IDZweDsgaGVpZ2h0OiAxMHB4IH0KCQkJOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7IGJvcmRlci1yYWRpdXM6IDA7IGJhY2tncm91bmQ6IG5vbmUgfQoJCQk6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg4NSw4NSw4NSwuNCkgfQoJCQk6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iLDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgeyBib3JkZXItcmFkaXVzOiA1cHg7IC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAwIDZweCByZ2JhKDAsMCwwLC4yKSB9CgkJCTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDg1LDg1LDg1LC4zKSB9CgkJCS5zd2FsMi1wb3B1cCB7IGZvbnQtc2l6ZTogMTZweCB9CgkJCS5wbC1wb3B1cCB7IGZvbnQtc2l6ZTogMTJweDsgd2lkdGg6IDkwJTt9CgkJCS5wbC1wb3B1cCBhIHsgY29sb3I6ICR7Y29sb3J9OyB9CgkJCS5wbC1oZWFkZXIgeyBwYWRkaW5nOiAwO2FsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZTsgbWFyZ2luOiAwIDAgMTBweDsgcGFkZGluZzogMCAwIDVweDsgfQoJCQkucGwtdGl0bGUgeyBmb250LXNpemU6IDE2cHg7IGxpbmUtaGVpZ2h0OiAxO3doaXRlLXNwYWNlOiBub3dyYXA7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO30KCQkJLnBsLWNvbnRlbnQgeyBwYWRkaW5nOiAwOyBmb250LXNpemU6IDEycHg7IH0KCQkJLnBsLW1haW4geyBiYWNrZ3JvdW5kLWNvbG9yOiR7Y29sb3J9MTU7b3ZlcmZsb3c6YXV0bzsgYm9yZGVyLXJhZGl1czogNXB4OyBtYXgtaGVpZ2h0OmNhbGMoJHtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0fXB4IC0gMjUwcHgpO30KCQkJLnBsLWZvb3RlciB7Zm9udC1zaXplOiAxNXB4OyBtYXJnaW4tdG9wOiAxMHB4OyBwYWRkaW5nLXRvcDogNXB4OyBjb2xvcjogI2Y1NmM2YzsgdGV4dC1hbGlnbjogY2VudGVyO30KCQkJLnBsLWl0ZW0geyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBsaW5lLWhlaWdodDogMjJweDsgaGVpZ2h0OiA1MHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAke2NvbG9yfTMwOyBib3JkZXItcmFkaXVzOiA1cHg7IG1hcmdpbjogOHB4IDZweDsgfQoJCQkucGwtaXRlbS1uYW1lIHsgZmxleDogMCAwIDE3MHB4OyB0ZXh0LWFsaWduOiBsZWZ0O21hcmdpbjogNnB4OyBvdmVyZmxvdzogaGlkZGVuOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgY3Vyc29yOmRlZmF1bHQ7IGhlaWdodDogMzBweDt9CgkJCS5wbC1pdGVtLWxpbmsgeyBmbGV4OiAxOyB0ZXh0LWFsaWduOiBsZWZ0OyB3aGl0ZS1zcGFjZTogbm93cmFwOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztjdXJzb3I6cG9pbnRlcjsgb3ZlcmZsb3c6IGhpZGRlbjsgfQoJCQkucGwtaXRlbS1idG4geyBiYWNrZ3JvdW5kOiAke2NvbG9yfTsgYm9yZGVyLXJhZGl1czogM3B4OyBjb2xvcjogI2ZmZmZmZjsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDEycHg7IG91dGxpbmU6IG5vbmU7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBtYXJnaW46IDZweCA2cHg7IHBhZGRpbmc6IDAuNjI1ZW0gMS4xZW07IH0KCQkJLnBsLWl0ZW0tdGlwIHsgZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2ZsZXg6IDE7IH0KCQkJLnBsLWJhY2sgeyB3aWR0aDogNzBweDsgYmFja2dyb3VuZDogI2RkZDsgYm9yZGVyLXJhZGl1czogM3B4OyBjdXJzb3I6cG9pbnRlcjsgbWFyZ2luOjFweCA2cHg7IGNvbG9yOiAjMDAwOyB9CgkJCS5wbC1leHQgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdpZHRoOiA0NHB4OyBiYWNrZ3JvdW5kOiAjOTk5OyBjb2xvcjogI2ZmZjsgaGVpZ2h0OiAxNnB4OyBsaW5lLWhlaWdodDogMTZweDsgZm9udC1zaXplOiAxMnB4OyBib3JkZXItcmFkaXVzOiAzcHg7fQoJCQkucGwtcmV0cnkge3BhZGRpbmc6IDNweCAxMHB4OyBiYWNrZ3JvdW5kOiAjY2MzMjM1OyBjb2xvcjogI2ZmZjsgYm9yZGVyLXJhZGl1czogM3B4OyBjdXJzb3I6IHBvaW50ZXI7fQoJCQkucGwtYnJvd3NlcmRvd25sb2FkIHsgcGFkZGluZzogM3B4IDEwcHg7IGJhY2tncm91bmQ6ICR7Y29sb3J9OyBjb2xvcjogI2ZmZjsgYm9yZGVyLXJhZGl1czogM3B4OyBjdXJzb3I6IHBvaW50ZXI7fQoJCQkucGwtaXRlbS1wcm9ncmVzcyB7IGRpc3BsYXk6ZmxleDtmbGV4OiAxO2FsaWduLWl0ZW1zOmNlbnRlcn0KCQkJLnBsLXByb2dyZXNzIHsgZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7d2lkdGg6IDEwMCU7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7bGluZS1oZWlnaHQ6IDE7cG9zaXRpb246IHJlbGF0aXZlO2hlaWdodDoxNXB4OyBmbGV4OiAxfQoJCQkucGwtcHJvZ3Jlc3Mtb3V0ZXIgeyBoZWlnaHQ6IDE1cHg7Ym9yZGVyLXJhZGl1czogMTAwcHg7YmFja2dyb3VuZC1jb2xvcjogI2MxYzFjMWExO292ZXJmbG93OiBoaWRkZW47cG9zaXRpb246IHJlbGF0aXZlO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7fQoJCQkucGwtcHJvZ3Jlc3MtaW5uZXJ7IHBvc2l0aW9uOiBhYnNvbHV0ZTtsZWZ0OiAwO3RvcDogMDtiYWNrZ3JvdW5kLWNvbG9yOiAke2NvbG9yfTt0ZXh0LWFsaWduOiBjZW50ZXI7Ym9yZGVyLXJhZGl1czogMTAwcHg7bGluZS1oZWlnaHQ6IDE7d2hpdGUtc3BhY2U6IG5vd3JhcDt0cmFuc2l0aW9uOiB3aWR0aCAuNnMgZWFzZTtoZWlnaHQ6IDE1cHh9CgkJCS5wbC1wcm9ncmVzcy1pbm5lci10ZXh0IHsgZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Y29sb3I6ICNmZmZmZmY7Zm9udC1zaXplOiAxMnB4O21hcmdpbjogMCA1cHg7aGVpZ2h0OiAxNXB4fQoJCQkucGwtcHJvZ3Jlc3MtdGlweyBmbGV4OjE7IHRleHQtYWxpZ246cmlnaHR9CgkJCS5wbC1wcm9ncmVzcy1ob3d7IGZsZXg6IDAgMCAxMDBweDsgYmFja2dyb3VuZDogI2RkZDsgYm9yZGVyLXJhZGl1czogM3B4OyBtYXJnaW4tbGVmdDogMTBweDsgY3Vyc29yOiBwb2ludGVyOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiMwMDA7fQoJCQkucGwtcHJvZ3Jlc3Mtc3RvcHsgZmxleDogMCAwIDgwcHg7IGJhY2tncm91bmQ6ICNjYzMyMzU7IGN1cnNvcjogcG9pbnRlcjsgbWFyZ2luOiA2cHggNnB4IDZweCAxMHB4OyBmb250LXNpemU6IDEycHg7IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNHB4OyBjb2xvcjogI2ZmZmZmZjsgb3V0bGluZTogbm9uZTsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IHBhZGRpbmc6IDAuNjI1ZW0gMS4xZW07fQoJCQkucGwtcHJvZ3Jlc3MtaW5uZXItdGV4dDphZnRlciB7IGRpc3BsYXk6IGlubGluZS1ibG9jaztjb250ZW50OiAiIjtoZWlnaHQ6IDEwMCU7dmVydGljYWwtYWxpZ246IG1pZGRsZTt9CgkJCS5wbC1idG4tcHJpbWFyeSB7IGJhY2tncm91bmQ6ICR7Y29sb3J9OyBib3JkZXI6IDA7IGJvcmRlci1yYWRpdXM6IDRweDsgY29sb3I6ICNmZmZmZmY7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAxMnB4OyBvdXRsaW5lOiBub25lOyBkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBtYXJnaW46IDZweCA2cHg7IHBhZGRpbmc6IDAuNjI1ZW0gMS4xZW07dHJhbnNpdGlvbjogMC4zcyBvcGFjaXR5OyB9CgkJCS5wbC1idG4tcHJpbWFyeTpob3ZlciB7IG9wYWNpdHk6IDAuOTt0cmFuc2l0aW9uOiAwLjNzIG9wYWNpdHk7IH0KCQkJLnBsLWJ0bi1zdWNjZXNzIHsgYmFja2dyb3VuZDogIzU1YWYyODsgYW5pbWF0aW9uOiBlYXNlT3BhY2l0eSAxLjJzIDI7IGFuaW1hdGlvbi1maWxsLW1vZGU6Zm9yd2FyZHMgfQoJCQkucGwtYnRuLWluZm8geyBiYWNrZ3JvdW5kOiAjNjA2MjY2OyB9CgkJCS5wbC1idG4td2FybmluZyB7IGJhY2tncm91bmQ6ICNkYTkzMjg7IH0KCQkJLnBsLWJ0bi13YXJuaW5nIHsgYmFja2dyb3VuZDogI2RhOTMyODsgfQoJCQkucGwtYnRuLWRhbmdlciB7IGJhY2tncm91bmQ6ICNjYzMyMzU7IH0KCQkJLnBsLWJ1dHRvbi1taW5pIHtwYWRkaW5nOiA1cHggMTBweDsgfQoJCQkucGwtZHJvcGRvd24tbWVudS1pdGVtIHtoZWlnaHQ6IDMwcHg7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBjdXJzb3I6IHBvaW50ZXI7IGNvbG9yOiAke2NvbG9yfTsgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTt9CgkJCS5wbC1kcm9wZG93bi1tZW51LWl0ZW06aG92ZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiAke2NvbG9yfTE1O30KCQkJLnBsLWJ1dHRvbi1tb2RlIHtwYWRkaW5nOiAwcDsgcGFkZGluZy1sZWZ0OiAwcHggIWltcG9ydGFudDsgY29sb3I6ICR7Y29sb3J9ICFpbXBvcnRhbnQ7IHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7fQoJCQkucGwtYnV0dG9uLW1vZGU6aG92ZXIge2JhY2tncm91bmQtY29sb3I6ICR7Y29sb3J9MzMgIWltcG9ydGFudDt9CgkJCS5wbC1idXR0b24sIC5wbC1kcm9wZG93bi1tZW51IHsgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTt9CgkJCS5wbC1idXR0b24gLnBsLWRyb3Bkb3duLW1lbnUgeyBkaXNwbGF5OiBub25lO30KCQkJLnBsLWJ1dHRvbjpob3ZlciAucGwtZHJvcGRvd24tbWVudSB7IGRpc3BsYXk6IGJsb2NrOyB9CgkJCS5wbC1idXR0b24taW5pdCB7IG9wYWNpdHk6IDAuNTsgYW5pbWF0aW9uOiBlYXNlSW5pdE9wYWNpdHkgMS4ycyAzOyBhbmltYXRpb24tZmlsbC1tb2RlOmZvcndhcmRzIH0KCQkJQGtleWZyYW1lcyBlYXNlSW5pdE9wYWNpdHkgeyBmcm9tIHsgb3BhY2l0eTogMC41OyB9IDUwJSB7IG9wYWNpdHk6IDEgfSB0byB7IG9wYWNpdHk6IDAuNTsgfSB9CgkJCUBrZXlmcmFtZXMgZWFzZU9wYWNpdHkgeyBmcm9tIHsgb3BhY2l0eTogMTsgfSA1MCUgeyBvcGFjaXR5OiAwLjM1IH0gdG8geyBvcGFjaXR5OiAxOyB9IH0KCQkJLmJhaWR1LWJ1dHRvbiB7YmFja2dyb3VuZDogJHtjb2xvcn0gIWltcG9ydGFudDsgYm9yZGVyLWNvbG9yOiAke2NvbG9yfSAhaW1wb3J0YW50OyBib3JkZXI6IDFweCBzb2xpZCAke2NvbG9yfSAhaW1wb3J0YW50O30KCQkJLmJhaWR1LWJ1dHRvbjpob3ZlciB7IGJhY2tncm91bmQ6ICR7Y29sb3J9YjAgIWltcG9ydGFudDsgYm9yZGVyLWNvbG9yOiAke2NvbG9yfSAhaW1wb3J0YW50O30KCQkJaGVhZGVyW3N0eWxlPSJkaXNwbGF5OiBub25lOyJdIH4gI3BsLWJ1dHRvbi1saW5rIHsKCQkJCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCQkJCXBvc2l0aW9uOiBmaXhlZDsKCQkJCXRvcDogMC42ZW07CgkJCQlsZWZ0OiA2NSU7CgkJCQl6LWluZGV4OiA5OTk5OTsKCQkJfQoJCQkuYmFpZHUtd2FwLWJ1dHRvbiB7ZGlzcGxheTogbm9uZTsgY29sb3I6ICR7Y29sb3J9OyBmb250LXNpemU6IC4yOHJlbTsgcGFkZGluZzogMC4zZW07fQoJCQkuYmFpZHUtd2FwLWJ1dHRvbjphZnRlciB7Y29udGVudDogIuS4i+i9veWKqeaJiyI7fQoJCQkuYmFpZHUtd2FwLW1vZGUge3BhZGRpbmc6IDEwcHggMHB4O30KCQkJLmFsaS1idXR0b24ge2JvcmRlcjogMCBzb2xpZCB0cmFuc3BhcmVudDtmb250LXNpemU6IDE0cHg7bWFyZ2luLWxlZnQ6IDIwcHg7cGFkZGluZzogMXB4IDEycHg7cG9zaXRpb246IHJlbGF0aXZlO2hlaWdodDogMzJweDt3aWR0aDogMzJweDtiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTI5LjEyZGVnLCAke2NvbG9yfSAwJSwgcmdiYSg5OSwgMTI1LCAyNTUsIDAuNzUpIDEwMCUpO2JvcmRlci1yYWRpdXM6IDEwMHB4O2Rpc3BsYXk6IGZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtjb2xvcjogdmFyKC0tYmFzaWNfd2hpdGUpO2N1cnNvcjogcG9pbnRlcjt0cmFuc2l0aW9uOiBhbGwgLjNzIGVhc2U7fQoJCQkuYWxpLWJ1dHRvbjpob3ZlciB7YmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEyOS4xMmRlZywgIzQ0NmRmZiAwJSwgJHtjb2xvcn0gMTAwJSk7fQoJCQkuYWxpLWJ0bi1pY29uIHt2ZXJ0aWNhbC1hbGlnbjogLTAuMmVtO30KCQkJLnRpYW55aS1idXR0b24ge21hcmdpbi1yaWdodDogMjBweDsgcGFkZGluZzogNHB4IDEycHg7IGJvcmRlci1yYWRpdXM6IDRweDsgY29sb3I6ICNmZmY7IGZvbnQtc2l6ZTogMTJweDsgYm9yZGVyOiAxcHggc29saWQgJHtjb2xvcn07IGJhY2tncm91bmQ6ICR7Y29sb3J9OyBjdXJzb3I6IHBvaW50ZXI7IHBvc2l0aW9uOiByZWxhdGl2ZTt9CgkJCS50aWFueWktYnV0dG9uOmhvdmVyIHtib3JkZXItY29sb3I6ICR7Y29sb3J9YjA7IGJhY2tncm91bmQ6ICR7Y29sb3J9YjA7fQoJCQkueWlkb25nLWJ1dHRvbiB7ZmxvYXQ6IGxlZnQ7IHBvc2l0aW9uOiByZWxhdGl2ZTsgbWFyZ2luOiAyMHB4IDI0cHggMjBweCAwOyB3aWR0aDogMTEwcHg7IGhlaWdodDogMzZweDsgYmFja2dyb3VuZDogJHtjb2xvcn07IGJvcmRlci1yYWRpdXM6IDJweDsgZm9udC1zaXplOiAxNHB4OyBjb2xvcjogI2ZmZjsgbGluZS1oZWlnaHQ6IDM5cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY3Vyc29yOiBwb2ludGVyO30KCQkJLnlpZG9uZy1zaGFyZS1idXR0b24ge2Rpc3BsYXk6IGlubGluZS1ibG9jazsgcG9zaXRpb246IHJlbGF0aXZlOyBmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAzNnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjZmZmOyBib3JkZXI6IDFweCBzb2xpZCAke2NvbG9yfTsgYm9yZGVyLXJhZGl1czogMnB4OyBwYWRkaW5nOiAwIDI0cHg7IGJhY2tncm91bmQ6ICR7Y29sb3J9O30KCQkJLnlpZG9uZy1zaGFyZS1idXR0b246aG92ZXIge2JhY2tncm91bmQ6ICR7Y29sb3J9YjA7fQoJCQkueWlkb25nLWJ1dHRvbjpob3ZlciB7YmFja2dyb3VuZDogJHtjb2xvcn1iMDt9CgkJCS55aWRvbmctYnRuIHsgYmFja2dyb3VuZDogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ2dBQUFBb0NBTUFBQUM3SUVoZkFBQUFBWE5TUjBJQjJja3Nmd0FBQUFsd1NGbHpBQUFMRXdBQUN4TUJBSnFjR0FBQUFHTlFURlJGQUFBQS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vbWtVTm9BQUFBQ0YwVWs1VEFBYkhQUDlBTVJ0cjlQd3JWOHpxWGZtTmdET0RIVExENGlKeGhHSko4WjI2OW0wYURnQUFBTVpKUkVGVWVKemQwc3NPZ3lBUUJWRFVLNzRyV3EwUEZQMy9yeXhxVE1kR3FKdHV2R0hENUNURFRHRHMzbkZjMTdrRVBjQzdCSDNBdC9UanZrNUFZYkJVK05jcndnaEw0dVFEazNndFJTRjFLV0NDUUVwZ2hrZCszanAvSUNOUW9EQU5VMEFRQ0pRbVdBSjNoOCtxM21GZHZTeXdRZHR0c0d2UldHQVBMUmVvSFhyYkc2V1dBekJvSiszRGFDbldJMzlOTGJjdnN6dkxldVRCMmZZb3FiTkJObzdzR2p6azMxQmhNc0VKaXR4bWlLazh6U1F3RThnRmpCR2NOdUN6T21kcVByaWI1QTJKUlE3cUs5ZytoUUFBQUFCSlJVNUVya0pnZ2c9PSk7IGhlaWdodDogMjBweDsgbGluZS1oZWlnaHQ6IDIwcHg7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsgYmFja2dyb3VuZC1zaXplOiAyMHB4IDIwcHg7IHRleHQtaW5kZW50OiAyNXB4O30KCQkJLnh1bmxlaS1idXR0b24ge2Rpc3BsYXk6IGlubGluZS1mbGV4O2FsaWduLWl0ZW1zOiBjZW50ZXI7anVzdGlmeS1jb250ZW50OiBjZW50ZXI7Ym9yZGVyOiAwIHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6IDVweDtib3gtc2hhZG93OiAwIDAgMCAwIHRyYW5zcGFyZW50O3dpZHRoOiBmaXQtY29udGVudDt3aGl0ZS1zcGFjZTogbm93cmFwO2ZsZXgtc2hyaW5rOiAwO2ZvbnQtc2l6ZTogMTRweDtsaW5lLWhlaWdodDogMS41O291dGxpbmU6IDA7dG91Y2gtYWN0aW9uOiBtYW5pcHVsYXRpb247dHJhbnNpdGlvbjogYmFja2dyb3VuZCAuM3MgZWFzZSxjb2xvciAuM3MgZWFzZSxib3JkZXIgLjNzIGVhc2UsYm94LXNoYWRvdyAuM3MgZWFzZTtjb2xvcjogI2ZmZjtiYWNrZ3JvdW5kOiAke2NvbG9yfTttYXJnaW4tbGVmdDogMTJweDtwYWRkaW5nOiAwcHggMTJweDtwb3NpdGlvbjogcmVsYXRpdmU7IGN1cnNvcjpwb2ludGVyOyBoZWlnaHQ6IDM2cHg7fQoJCQkueHVubGVpLWJ1dHRvbjpob3ZlciB7YmFja2dyb3VuZDogJHtjb2xvcn1iMDt9CgkJCS5xdWFyay1idXR0b24ge2JhY2tncm91bmQ6ICR7Y29sb3J9ICFpbXBvcnRhbnQ7IGJhY2tncm91bmQtY29sb3I6JHtjb2xvcn0gIWltcG9ydGFudDt9CgkJCS5xdWFyay1idXR0b246aG92ZXIgeyBiYWNrZ3JvdW5kOiAke2NvbG9yfWIwICFpbXBvcnRhbnQ7IGJhY2tncm91bmQtY29sb3I6JHtjb2xvcn1iMCAhaW1wb3J0YW50O30KCQkJLnF1YXJrLWJ0bi1pY29uIHt3aWR0aDogMjBweDsgaGVpZ2h0OiAyMHB4OyB2ZXJ0aWNhbC1hbGlnbjogLTAuM2VtO30KCQkJLmVsZW1lbnQtY2xpY2tlZCB7IG9wYWNpdHk6IDAuNTsgfQoJCQkucGwtZXh0cmEgeyBtYXJnaW4tdG9wOiAxMHB4O2Rpc3BsYXk6ZmxleH0KCQkJLnBsLWV4dHJhIGJ1dHRvbiB7IGZsZXg6IDF9CgkJCS5wb2ludGVyIHsgY3Vyc29yOnBvaW50ZXIgfQoJCQkucGwtc2V0dGluZy1sYWJlbCB7IGRpc3BsYXk6IGZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47cGFkZGluZy10b3A6IDEwcHg7IH0KCQkJLnBsLWxhYmVsIHsgZmxleDogMCAwIDEwMHB4O3RleHQtYWxpZ246bGVmdDsgfQoJCQkucGwtaW5wdXQgeyBmbGV4OiAxOyBwYWRkaW5nOiA4cHggMTBweCAhaW1wb3J0YW50OyBib3JkZXI6IDFweCBzb2xpZCAjYzJjMmMyOyBib3JkZXItcmFkaXVzOiA1cHg7IGZvbnQtc2l6ZTogMTRweCAhaW1wb3J0YW50OyBtaW4td2lkdGg6IDMwMHB4OyBtYXJnaW46IDA7ZGFya3RoZW1lfQoJCQkuaW5pdC1pbnB1dCB7CgkJCQl3aWR0aDogMzczcHg7CgkJCQlmb250LXNpemU6IDIwcHg7CgkJCQl0ZXh0LWFsaWduOiBjZW50ZXI7CgkJCQlmb250LWZhbWlseTogc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICJTZWdvZSBVSSIsIFJvYm90bywgVWJ1bnR1LCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmOwoJCQkJZm9udC13ZWlnaHQ6IDMwMDsKCQkJfQoJCQkucGwtY29sb3Ige2ZsZXg6IDE7IGRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcH0KCQkJLnBsLWNvbG9yLWJveCB7d2lkdGg6IDU1cHg7IGhlaWdodDogNTVweDsgbWFyZ2luOjEwcHggMTBweCAwIDA7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGJvcmRlcjoxcHggc29saWQgI2ZmZjsgY3Vyc29yOnBvaW50ZXIgfQoJCQkucGwtbWFzayB7CgkJCQl3aWR0aDogNTNweDsKCQkJCWhlaWdodDogNTNweDsKCQkJCW9wYWNpdHk6IDA7CgkJCQl0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3M7CgkJCQljb2xvcjogI2ZmZjsKCQkJCWZvbnQtc2l6ZTogMTNweDsKCQkJCWRpc3BsYXk6IGZsZXg7CgkJCQlhbGlnbi1pdGVtczogY2VudGVyOwoJCQkJanVzdGlmeS1jb250ZW50OiBjZW50ZXI7CgkJCQlmbGV4LWRpcmVjdGlvbjogY29sdW1uOwoJCQl9CgkJCS5wbC1jb2xvci1ib3g6aG92ZXIgLnBsLW1hc2sgewoJCQkJb3BhY2l0eTogMTsKCQkJfQoJCQkucGwtY2xvc2U6Zm9jdXMgeyBvdXRsaW5lOiAwOyBib3gtc2hhZG93OiBub25lOyB9CgkJCS50YWctZGFuZ2VyIHtjb2xvcjojY2MzMjM1O21hcmdpbjogMCA1cHg7fQoJCQkucGwtdG9vbHRpcCB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgY29sb3I6ICNmZmZmZmY7IG1heC13aWR0aDogNjAwcHg7IGZvbnQtc2l6ZTogMTJweDsgcGFkZGluZzogNXB4IDEwcHg7IGJhY2tncm91bmQ6ICMzMzM7IGJvcmRlci1yYWRpdXM6IDVweDsgei1pbmRleDogMTEwMDAwOyBsaW5lLWhlaWdodDogMS4zOyBkaXNwbGF5Om5vbmU7IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDt9CgkJCSBAa2V5ZnJhbWVzIGxvYWQgeyAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpIH0gMTAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZykgfSB9CgkJCS5wbC1sb2FkaW5nLWJveCA+IGRpdiA+IGRpdiB7IHBvc2l0aW9uOiBhYnNvbHV0ZTtib3JkZXItcmFkaXVzOiA1MCU7fQoJCQkucGwtbG9hZGluZy1ib3ggPiBkaXYgPiBkaXY6bnRoLWNoaWxkKDEpIHsgdG9wOiA5cHg7bGVmdDogOXB4O3dpZHRoOiA4MnB4O2hlaWdodDogODJweDtiYWNrZ3JvdW5kOiAjZmZmZmZmO30KCQkJLnBsLWxvYWRpbmctYm94ID4gZGl2ID4gZGl2Om50aC1jaGlsZCgyKSB7IHRvcDogMTRweDtsZWZ0OiAzOHB4O3dpZHRoOiAyNXB4O2hlaWdodDogMjVweDtiYWNrZ3JvdW5kOiAjNjY2NjY2O2FuaW1hdGlvbjogbG9hZCAxcyBsaW5lYXIgaW5maW5pdGU7dHJhbnNmb3JtLW9yaWdpbjogMTJweCAzNnB4O30KCQkJLnBsLWxvYWRpbmcgeyB3aWR0aDogMTZweDtoZWlnaHQ6IDE2cHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO292ZXJmbG93OiBoaWRkZW47YmFja2dyb3VuZDogbm9uZTt9CgkJCS5wbC1sb2FkaW5nLWJveCB7IHdpZHRoOiAxMDAlO2hlaWdodDogMTAwJTtwb3NpdGlvbjogcmVsYXRpdmU7dHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApIHNjYWxlKDAuMTYpO2JhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjt0cmFuc2Zvcm0tb3JpZ2luOiAwIDA7fQoJCQkucGwtbG9hZGluZy1ib3ggZGl2IHsgYm94LXNpemluZzogY29udGVudC1ib3g7IH0KCQkJLnBsLWRyb3Bkb3duLW1lbnUge3Bvc2l0aW9uOiBhYnNvbHV0ZTtwYWRkaW5nOiA1cHggMDtjb2xvcjogJHtjb2xvcn07YmFja2dyb3VuZDogdGhlbWVjb2xvcjt6LWluZGV4OiA5OTk7d2lkdGg6IDExMHB4O2JvcmRlci1yYWRpdXM6IDEwcHg7Ym94LXNoYWRvdzogMCAwIDFweCAxcHggcmdiKDI4IDI4IDMyIC8gNSUpLCAwIDhweCAyNHB4IHJnYigyOCAyOCAzMiAvIDEyJSk7IHRleHQtYWxpZ246IGNlbnRlcjsgYm9yZGVyOiBub25lOyB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO30KCQkJLnN3YWwyLWNvbnRhaW5lciB7IHotaW5kZXg6MTAwMDAwOyB9CgkJCWJvZHkuc3dhbDItaGVpZ2h0LWF1dG8geyBoZWlnaHQ6IGluaGVyaXQ7IH0KCgkJCUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIFtkYXRhLXRoZW1lPXN5c3RlbV0gKiB7CgkJCQljb2xvci1zY2hlbWU6IGRhcms7CgkJCX0KCgkJCS8qIHdlYmtpdCwgb3BlcmEsIElFOSwgQ2hyb21lKi8KCQkJOjpzZWxlY3Rpb24gewoJCQkJYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcn0haW1wb3J0YW50OwoJCQkJYmFja2dyb3VuZDogJHtjb2xvcn0haW1wb3J0YW50OwoJCQkJY29sb3I6IHdoaXRlIWltcG9ydGFudDsKCQkJfQoJCQkvKiBtb3ppbGxhIGZpcmVmb3ggKi8KCQkJOjotbW96LXNlbGVjdGlvbiB7CgkJCQliYWNrZ3JvdW5kLWNvbG9yOiAke2NvbG9yfSFpbXBvcnRhbnQ7CgkJCQliYWNrZ3JvdW5kOiAke2NvbG9yfSFpbXBvcnRhbnQ7CgkJCQljb2xvcjogd2hpdGUhaW1wb3J0YW50OwoJCQl9CgkJCS8qIOeZvuW6pue9keebmCAqLwoJCQk6bm90KFtjbGFzcyo9InJ3bC1leGVtcHQiXSkgOjpzZWxlY3Rpb24gewoJCQkJYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcn0haW1wb3J0YW50OwoJCQkJYmFja2dyb3VuZDogJHtjb2xvcn0haW1wb3J0YW50OwoJCQkJY29sb3I6IHdoaXRlIWltcG9ydGFudDsKCQkJfQoJCQlgOwoJCQkvLyDlhYjnm5HlkKzpopzoibLmlrnmoYjlj5jljJYKCQkJd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5hZGRMaXN0ZW5lcigoZSkgPT4gewoJCQkJaWYgKGUubWF0Y2hlcykgewoJCQkJCS8vIOWIh+aNouWIsOaal+iJsuS4u+mimAoJCQkJCWxldCBkYXJrID0gdWljc3MucmVwbGFjZSgidGhlbWVjb2xvciIsIiMxOTE5MWEiKS5yZXBsYWNlKCJkYXJrdGhlbWUiLCJjb2xvci1zY2hlbWU6IGRhcms7Iik7CgkJCQkJdGhpcy5hZGRTdHlsZSgnUGFubGlua2VyLVVJJywgJ3N0eWxlJywgZGFyayk7CgkJCQl9IGVsc2UgewoJCQkJCS8vIOWIh+aNouWIsOa1heiJsuS4u+mimAoJCQkJCWxldCBsaWdodCA9IHVpY3NzLnJlcGxhY2UoInRoZW1lY29sb3IiLCIjZmZmIikucmVwbGFjZSgiZGFya3RoZW1lIiwiIik7CgkJCQkJdGhpcy5hZGRTdHlsZSgnUGFubGlua2VyLVVJJywgJ3N0eWxlJywgbGlnaHQpOwoJCQkJfQoJCQl9KTsKCQkJLy8g5YaN5L+u5pS55Li76aKYCgkJCWlmICh3aW5kb3cubWF0Y2hNZWRpYSAmJiB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXMpIHsKCQkJCWxldCBkYXJrID0gdWljc3MucmVwbGFjZSgidGhlbWVjb2xvciIsIiMxOTE5MWEiKS5yZXBsYWNlKCJkYXJrdGhlbWUiLCJjb2xvci1zY2hlbWU6IGRhcms7Iik7CgkJCQl0aGlzLmFkZFN0eWxlKCdQYW5saW5rZXItVUknLCAnc3R5bGUnLCBkYXJrKTsKCQkJfSBlbHNlIHsKCQkJCS8vIOWIh+aNouWIsOa1heiJsuS4u+mimAoJCQkJbGV0IGxpZ2h0ID0gdWljc3MucmVwbGFjZSgidGhlbWVjb2xvciIsIiNmZmYiKS5yZXBsYWNlKCJkYXJrdGhlbWUiLCIiKTsKCQkJCXRoaXMuYWRkU3R5bGUoJ1Bhbmxpbmtlci1VSScsICdzdHlsZScsIGxpZ2h0KTsKCQkJfQoKCgkJCWxldCBiYWlkdWNzcyA9IGAKCQkJLndwLXMtYXNpZGUtbmF2X19maWxlLWxpc3QtYWxsLmlzLWFjdGl2ZS5pcy1leGFjdC1hY3RpdmUsIC53cC1zLWFzaWRlLW5hdl9fc3ViLWNvbnRhaW5lci5pcy1hY3RpdmUsIC53cC1zLWFzaWRlLW5hdl9fc3ViLWl0ZW0uaXMtYWN0aXZlLCAud3Atcy1hc2lkZS1uYXZfX21haW4taXRlbS5pcy1hY3RpdmUsIC53cC1zLWFnaWxlLXRvb2wtYmFyX19oLWFjdGlvbi1idXR0b246aG92ZXIsIC51LWJ1dHRvbi0tdGV4dCwgLndwLXMtc2VhcmNoIC51LWlucHV0X19pbm5lcjpmb2N1cysudS1pbnB1dF9fc3VmZml4IC53cC1zLXNlYXJjaF9fc2VhcmNoLXRleHQsIC53cC1zLXNlYXJjaCAudS1pbnB1dF9faW5uZXI6aG92ZXIrLnUtaW5wdXRfX3N1ZmZpeCAud3Atcy1zZWFyY2hfX3NlYXJjaC10ZXh0LCAud3Atcy1wYW4tbGlzdF9fZmlsZS1uYW1lLXRpdGxlLXRleHQ6aG92ZXIsIC5haVRvb2xzLWFzaWRlX19pdGVtLS1hY3RpdmUsIC53cC1zLXBhbi10YWJsZV9fc29ydCAuaWNvbi5hY3RpdmUsIC5nLWJ1dHRvbiwgLnUtYnV0dG9uLS13ZWVrLCAubmQtbGlzdC1uYW1lX190aXRsZS10ZXh0OmhvdmVyLCAuTkhjR3cgLm9wZW4tZW5hYmxlIC5maWxlLW5hbWUgYTpob3ZlciwgLk5IY0d3IC5vcGVuLWVuYWJsZSAuZmlsZS1uYW1lIGE6YWN0aXZlLCAuQk5mSXlQYiAuY0VlZnl6Lm9wZW4tZW5hYmxlIC5maWxlLW5hbWUgYTpob3ZlciwgLkJOZkl5UGIgLmNFZWZ5ei5vcGVuLWVuYWJsZSAuZmlsZS1uYW1lIGE6YWN0aXZlLCAud3Atcy1wYW4tZmlsZS1tYWluX19uYXYtaXRlbS10aXRsZSwgLnRoZW1lLXByaW1hcnktdGV4dCwgLmljb24uYWN0aXZlLCAud3JhcHBlciAuYmx1ZUJ0bltkYXRhLXYtYzc0Y2ZjNzRdLCAubW9kdWxlLXRpbWVsaW5lLXJ1bGVyIC5ob3Zlci1kYXktZGVzYyAuZGF5LWRlc2NbZGF0YS12LTA4ZDhhYmJlXSwgLmltYy1lZGl0LWtleXdvcmRfX2JyZWFkY3J1bWItZ29saXN0LCAuaW1jLWVkaXQta2V5d29yZF9fYm90dG9tLXdyYXBwZXIgLnUtYnV0dG9uLS13ZWVrLmlzLWRpc2FibGVkLCAuaW1jLWtleXdvcmQtbGlzdF9fdGFibGUtbGlzdCAuYWN0aW9uLWJ0biB7CgkJCQljb2xvcjogJHtjb2xvcn07CgkJCX0KCQkJLndwLXMtYXNpZGUtbmF2X19maWxlLWxpc3QtYWxsLmlzLWFjdGl2ZS5pcy1leGFjdC1hY3RpdmUsIC53cC1zLWFnaWxlLXRvb2wtYmFyX19oLW1vcmUtZ3JvdXAsIC53cC1zLXBhbi10YWJsZV9fYm9keS1yb3c6aG92ZXIsIC53cC1zLWFnaWxlLXRvb2wtYmFyX19oLWFjdGlvbiwgLmFpVG9vbHMtYXNpZGVfX2l0ZW0tLWFjdGl2ZSwgLndwLXMtYWdpbGUtdG9vbC1iYXJfX2gtYWN0aW9uLmlzLW5lZWQtbGVmdC1zZXArLmlzLW5lZWQtbGVmdC1zZXA6YWZ0ZXIsIC53cC1zLWFzaWRlLW5hdl9fc3ViLWl0ZW0uaXMtYWN0aXZlLCAuTkhjR3cgLmpsaWxSOWdvLCAuTkhjR3cgLnZ6eHJtNFIsIC51LWJ1dHRvbi0td2VlaywgLnUtYnV0dG9uLS13ZWVrOmZvY3VzLCAudS1idXR0b24tLXdlZWs6aG92ZXIsIC5nLWRyb3Bkb3duLWJ1dHRvbiAubWVudSAuZy1idXR0b24tbWVudTpob3ZlciwgLnhHTE1JYWIgLmZ1Zkh5QTpob3ZlciwgLm1vZHVsZS10aW1lbGluZS1ydWxlciAuaG92ZXItZGF5LWRlc2MgLmRheS1kZXNjW2RhdGEtdi0wOGQ4YWJiZV0sIC5pbWMtZWRpdC1rZXl3b3JkX19ib3R0b20td3JhcHBlciAudS1idXR0b24tLXdlZWsuaXMtZGlzYWJsZWQsIC53cC1zLXBhbi10YWJsZV9fYm9keS1yb3cuc2VsZWN0ZWQsIC5uZC10YWJsZV9fYm9keS1yb3cuc2VsZWN0ZWQgewoJCQkJdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTsKCQkJCWJhY2tncm91bmQtY29sb3I6ICR7Y29sb3J9MTA7CgkJCQliYWNrZ3JvdW5kOiAke2NvbG9yfTEwOwoJCQl9CgkJCS5temZfbmV3X2J0biwgLnUtYnV0dG9uLS1wcmltYXJ5LCAud3Atcy1hc2lkZS1uYXZfX3F1b3RhLXByb2dyZXNzLXJhdGUsIC51LWNoZWNrYm94X19pbnB1dC5pcy1jaGVja2VkIC51LWNoZWNrYm94X19pbm5lciwgLnUtY2hlY2tib3hfX2lucHV0LmlzLWluZGV0ZXJtaW5hdGUgLnUtY2hlY2tib3hfX2lubmVyLCAuZy1idXR0b24tYmx1ZSwgLmctYnV0dG9uLWJsdWUtbGFyZ2UsIC5zZWxlY3QsIC5tLWJ1dHRvbiwgLnUtdGFic19fYWN0aXZlLWJhciwgLm1vZHVsZS10aW1lbGluZS1ydWxlciAubGluZS1jdXJyZW50W2RhdGEtdi0wOGQ4YWJiZV0sIC5tb2R1bGUtdGltZWxpbmUtcnVsZXIgLmxpbmUtaG92ZXJbZGF0YS12LTA4ZDhhYmJlXSwgLm1vZHVsZS10aW1lbGluZS1ydWxlciAubGluZS1jdXJyZW50W2RhdGEtdi0wOGQ4YWJiZV06YWZ0ZXIsIC5tb2R1bGUtdGltZWxpbmUtcnVsZXIgLmxpbmUtaG92ZXJbZGF0YS12LTA4ZDhhYmJlXTphZnRlciwgLnUtc3dpdGNoLmlzLWNoZWNrZWQgLnUtc3dpdGNoX19jb3JlIHsKCQkJCXRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7CgkJCQliYWNrZ3JvdW5kLWNvbG9yOiAke2NvbG9yfTsKCQkJfQoJCQkud3Atcy1wYW4tdGFibGVfX2JvZHktcm93OmhvdmVyLCAud3Atcy1zZWFyY2ggLnUtaW5wdXQtLXNtYWxsIC51LWlucHV0X19pbm5lcjpob3ZlciwgLnUtY2hlY2tib3hfX2lucHV0LmlzLWNoZWNrZWQgLnUtY2hlY2tib3hfX2lubmVyLCAudS1jaGVja2JveF9faW5uZXI6aG92ZXIsIC51LWNoZWNrYm94X19pbnB1dC5pcy1pbmRldGVybWluYXRlIC51LWNoZWNrYm94X19pbm5lciwgLm5kLXRhYmxlX19ib2R5LXJvdzpob3ZlciAudS1jaGVja2JveF9faW5uZXIsIC5OSGNHdyAuamxpbFI5Z28sIC5OSGNHdyAudnp4cm00UiwgLnUtYnV0dG9uLS13ZWVrLCAudS1idXR0b24tLXByaW1hcnksIC5nLWJ1dHRvbiwgLnUtc3dpdGNoLmlzLWNoZWNrZWQgLnUtc3dpdGNoX19jb3JlIHsKCQkJCXRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7CgkJCQlib3JkZXItY29sb3I6ICR7Y29sb3J9OwoJCQl9CgkJCS53cC1zLWFzaWRlLW5hdl9fZmlsZS1saXN0LWNhdGUuaXMtYWN0aXZlIHsKCQkJCWJhY2tncm91bmQtY29sb3I6ICNmZmYgCgkJCX0KCQkJLmctYnV0dG9uOmhvdmVyLCAud3Atcy1wYW4tZmlsZS1tYWluX19uYXYtaXRlbS1zZXAgewoJCQkJdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTsKCQkJCWNvbG9yOiAke2NvbG9yfWQwOwoJCQl9CgkJCS5nLWJ1dHRvbi1ibHVlOmhvdmVyLCAuZy1idXR0b24uZy1idXR0b24tYmx1ZS1sYXJnZTpob3ZlciB7CgkJCQl0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOwoJCQkJY29sb3I6ICR7Y29sb3J9ZDA7CgkJCQliYWNrZ3JvdW5kLWNvbG9yOiAke2NvbG9yfWIwOwoJCQl9CgkJCS5nLWJ1dHRvbjpob3ZlciAuaWNvbiB7CgkJCQljb2xvcjogJHtjb2xvcn1kMDsKCQkJfQoJCQkuYmFjay1vbGQtdmVyc2lvbiB7CgkJCQliYWNrZ3JvdW5kOiAjZjFmM2Y4OwoJCQkJYm9yZGVyLXJhZGl1czogMzJweDsKCQkJCXdpZHRoOiAzMHB4OwoJCQkJaGVpZ2h0OiAzMHB4OwoJCQkJZGlzcGxheTogZmxleDsKCQkJCWp1c3RpZnktY29udGVudDogY2VudGVyOwoJCQl9CgkJCWAKCQkJaWYgKC8ocGFufHl1bikuYmFpZHUuY29tLy50ZXN0KGxvY2F0aW9uLmhvc3QpICYmIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfYmFpZHVfdGhlbWUnKSA9PT0gJ3llcycpIHsKCQkJCXRoaXMuYWRkU3R5bGUoJ1Bhbmxpbmtlci1CYWlkdVVJJywgJ3N0eWxlJywgYmFpZHVjc3MpOwoJCQl9OwoJCX0sCgoJCWFzeW5jIGluaXREaWFsb2coKSB7CgkJCWxldCBzZWNyZXQgPSAiIgoJCQlpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAndjEnKSB7CgkJCQlzZWNyZXQgPSAi5b2T5YmN5pqX5Y+35piv77ya4oCcIiArIHBhbi5udW0gKyAi4oCd44CCIjsKCQkJfSBlbHNlIGlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICd2MicpIHsKCQkJCXNlY3JldCA9ICLlvZPliY3mmpflj7fmmK/vvJrigJwiICsgcGFuLm51bSArICLigJ3vvIzlvIDmupDljY/orq7mmK/igJwiICsgcGFuLmxpY2Vuc2UgKyAi4oCd44CCIjsKCQkJfSBlbHNlIGlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICJubyIpIHsKCQkJCXNlY3JldCA9ICLlvZPliY3mmpflj7fmmK/vvJrigJwiICsgcGFuLm51bSArICLigJ3jgIIiOwoJCQl9IGVsc2UgewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicsICd2MicpOwoJCQkJc2VjcmV0ID0gIuW9k+WJjemFjee9ruS4jeato+ehru+8jOivt+WIt+aWsOmhtemdouWGjee7p+e7rSI7CgkJCX0KCQkJbGV0IHJlc3VsdCA9IGF3YWl0IFN3YWwuZmlyZSh7CgkJCQl0aXRsZTogcGFuLmluaXRbMF0sCgkJCQlhbGxvd091dHNpZGVDbGljazogZmFsc2UsCgkJCQlzaG93Q2xvc2VCdXR0b246IHRydWUsCgkJCQlzaG93RGVueUJ1dHRvbjogdHJ1ZSwKCQkJCWNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywKCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCgkJCQlodG1sOiBgPGRpdj48aW1nIHN0eWxlPSJ3aWR0aDogMjUwcHg7bWFyZ2luLWJvdHRvbTogMTBweDsiIHNyYz0iJHtwYW4uaW1nfSIgYWx0PSIke3Bhbi5pbWd9Ij4KCQkJCTxpbnB1dCBjbGFzcz0ic3dhbDItaW5wdXQgaW5pdC1pbnB1dCIgaWQ9ImluaXQiIHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSIke3Bhbi5pbml0WzFdfSI+PC9kaXY+CgkJCQk8ZGl2PjxzcGFuPuS9oOWPr+S7pemAieaLqSLms6jlhaUi56uL5Y2z54K55Lqu5oyJ6ZKuPC9zcGFuPjwvZGl2PgoJCQkJPGRpdj48c3Bhbj7miJbogIXovpPlhaUg5pqX5Y+3L+W8gOa6kOWNj+iuriDngrnkuq4uLi48L3NwYW4+PC9kaXY+CgkJCQk8ZGl2PjxzcGFuPiR7c2VjcmV0fTwvc3Bhbj48L2Rpdj4KCQkJCTxkaXY+PHNwYW4+5Y6f5L2c6ICF5byA5Y+R5b6I6L6b6Ium77yM5omA5Lul6K+35omr56CB5pSv5oyB5LiA5LiL5LuW55qE55qE5YWs5LyX5Y+3PC9zcGFuPjwvZGl2PgoJCQkJPGRpdj48c3Bhbj7miJbogIXmnaXnu5nov5nkuKrmlLnniYjngrnkuKo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnQvIj5TdGFyPC9hPi4uLjwvc3Bhbj48L2Rpdj4KCQkJCTxkaXY+PHNwYW4+54K55Lqu5ZCO5Y+v5Lul57K+566A6YOo5YiG572R55uY55WM6Z2i5ZOmITwvc3Bhbj48L2Rpdj4KCQkJCWAsCgkJCQlkZW55QnV0dG9uVGV4dDogJ+azqOWFpSjngrnkuq7kuIvovb3liqnmiYvmjInpkq4pJwoJCQl9KTsKCQkJaWYgKHJlc3VsdC5pc0RlbmllZCkgewoJCQkJY29uc29sZS5sb2coIuOAkO+8iOaUue+8iee9keebmOebtOmTvuS4i+i9veWKqeaJi+OAkVxu5q2j5Zyo5rOo5YWl54K55Lqu5oyJ6ZKu6K6+572u6aG555uuLi4uIik7CgkJCQltZXNzYWdlLndhcm5pbmcoIuato+WcqOazqOWFpeeCueS6ruaMiemSruiuvue9rumhueebri4uLiIpOwoJCQkJc2V0VGltZW91dCgoKSA9PiB7CgkJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19pbml0X2NvZGUnLCBwYW4ubnVtKTsKCQkJCQliYXNlLnNldFZhbHVlKCdsaWNlbnNlJywgcGFuLmxpY2Vuc2UpOwoJCQkJCW1lc3NhZ2Uuc3VjY2Vzcygi5rOo5YWl5oiQ5Yqf5LqG5qy4ISIpOwoJCQkJCXNldFRpbWVvdXQoKCkgPT4gewoJCQkJCQltZXNzYWdlLnN1Y2Nlc3MocGFuLmluaXRbMl0pOwoJCQkJCQlzZXRUaW1lb3V0KCgpID0+IHsKCQkJCQkJCWhpc3RvcnkuZ28oMCk7CgkJCQkJCX0sIDMwMDApOwoJCQkJCX0sIDMwMDApOwoJCQkJfSwgNTAwMCk7CgkJCX07CgkJCWlmIChyZXN1bHQuaXNDb25maXJtZWQpewoJCQkJaWYgKHBhbi5udW0gPT09ICQoJyNpbml0JykudmFsKCkgfHwgcGFuLmxpY2Vuc2UgPT09ICQoJyNpbml0JykudmFsKCkpIHsKCQkJCQljb25zb2xlLmxvZygi44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRXG7mmpflj7fmiJbljY/orq7mraPnoa4iKQoJCQkJCW1lc3NhZ2Uuc3VjY2VzcyhwYW4uaW5pdFsyXSk7CgkJCQkJc2V0VGltZW91dCgoKSA9PiB7CgkJCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJywgcGFuLm51bSk7CgkJCQkJCWJhc2Uuc2V0VmFsdWUoJ2xpY2Vuc2UnLCBwYW4ubGljZW5zZSk7CgkJCQkJCWhpc3RvcnkuZ28oMCk7CgkJCQkJfSwgMzAwMCkKCQkJCX0gZWxzZSBpZiAoJCgnI2luaXQnKS52YWwoKSA9PT0gJzExNDUxNCcgfHwgJCgnI2luaXQnKS52YWwoKSA9PT0gJzE5MTk4MTAnIHx8ICQoJyNpbml0JykudmFsKCkgPT09ICcxMTQ1MTQxOTE5ODEwJykgewoJCQkJCS8qLS0tCgkJCQkJCWhvbW/lvanom4vlj4jlm57mnaXlipvvvIjllpzvvIkKCQkJCQkJaW1hZ2VVcmw6ICdodHRwczovL3BpYzQuemhpbWcuY29tLzgwL3YyLTFiOTdhMDg4ZTE1NmMwMTUxMDhkZWM2NjNiYmE4YjA0LmpwZycsCgkJCQkJCWltYWdlVXJsOiAnaHR0cHM6Ly9saDEuaGV0YW91c2VyY29udGVudC5jb20vaW1nLzdkNGMxYzBiNGFkYjBlOTUuanBnJywKCQkJCQkqLwoJCQkJCWF3YWl0IFN3YWwuZmlyZSh7CgkJCQkJCWljb246ICdlcnJvcicsCgkJCQkJCXRpdGxlOiAnMTE0NTE0MTkxOTgxMCcsCgkJCQkJCWh0bWw6ICc8c3Bhbj5ob21v54m55pyJ55qE5pWw5a2X5b2T54S25LiN6KGM5ZWmPGJyPuWTvOWTvOWTvOWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWVijwvc3Bhbj4nLAoJCQkJCQl0aW1lcjogODAwMCwKCQkJCQkJaW1hZ2VVcmw6ICdodHRwczovL3BpYzQuemhpbWcuY29tLzgwL3YyLTFiOTdhMDg4ZTE1NmMwMTUxMDhkZWM2NjNiYmE4YjA0LmpwZycsCgkJCQkJCWFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKCQkJCQkJdGltZXJQcm9ncmVzc0JhcjogdHJ1ZSwKCQkJCQkJc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLAoJCQkJCQlzaG93RGVueUJ1dHRvbjogdHJ1ZSwKCQkJCQkJaGVpZ2h0QXV0bzogZmFsc2UsCgkJCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJCQlkZW55QnV0dG9uVGV4dDogJ+WTvOWTvOWTvOWViuWViuWViuWViuWViuWViuWViuWViuWViuWViicsCgkJCQkJfSk7CgkJCQkJbWVzc2FnZS5pbmZvKCLmiJDlsLHvvJrkvaDop6blj5HkuobkuIDkuKpob21v54m55pyJ55qE5b2p6JuL77yBIik7CgkJCQkJc2V0VGltZW91dCgoKSA9PiB7CgkJCQkJCVN3YWwuZmlyZSh7CgkJCQkJCQl0aXRsZTogJzExNDUxNDE5MTk4MTAnLAoJCQkJCQkJdGV4dDonaG9tb+eJueacieeahOaVsOWtl+W9k+eEtuS4jeihjOWVpi4uLuWQl++8nycsCgkJCQkJCQlpY29uOiAncXVlc3Rpb24nLAoJCQkJCQkJaW1hZ2VVcmw6ICdodHRwczovL2xoMS5oZXRhb3VzZXJjb250ZW50LmNvbS9pbWcvN2Q0YzFjMGI0YWRiMGU5NS5qcGcnLAoJCQkJCQkJc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLAoJCQkJCQkJYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAoJCQkJCQl9KTsKCQkJCQkJc2V0VGltZW91dCgoKSA9PiB7CgkJCQkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX2luaXRfY29kZScsIHBhbi5udW0pOwoJCQkJCQkJbWVzc2FnZS5zdWNjZXNzKCLmiJDlsLHvvJrlk7zlk7zlk7zllYrllYrllYrllYrllYrllYrllYrllYrlnLDms6jlhaXmiJDlip8o5ZacKSIpOwoJCQkJCQkJc2V0VGltZW91dCgoKSA9PiB7CgkJCQkJCQkJaGlzdG9yeS5nbygwKTsKCQkJCQkJCX0sIDMwMDApOwoJCQkJCQl9LCAzMDAwKQoJCQkJCX0sIDQwMDApCgkJCQl9IGVsc2UgewoJCQkJCWNvbnNvbGUubG9nKCLjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFcbuaal+WPt+mUmeivryIpCgkJCQkJYXdhaXQgU3dhbC5maXJlKHsKCQkJCQkJaW1hZ2VVcmw6IHBhbi5pbWcsCgkJCQkJCXRpdGxlOiBwYW4uaW5pdFszXSwKCQkJCQkJaGVpZ2h0QXV0bzogZmFsc2UsCgkJCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJCQlodG1sOiBgPGRpdj48c3Bhbj4ke3Bhbi5pbml0WzRdfTxicj7kvaDlj6/ku6XlnKjov5Tlm57lkI7pgInmi6nigJzms6jlhaXigJ3nq4vljbPngrnkuq7mjInpkq7vvIw8YnI+5oiW6ICF5Zyo6L6T5YWl5qGG6ZSu5YWl5Lul5LiL5pqX5Y+377ya4oCcJHtwYW4ubnVtfeKAneOAgjwvc3Bhbj48L2Rpdj5gLAoJCQkJCQljb25maXJtQnV0dG9uVGV4dDogJ+mHjeaWsOi+k+WFpScsCgkJCQkJfSk7CgkJCQkJYXdhaXQgdGhpcy5pbml0RGlhbG9nKCk7CgkJCQkJcmV0dXJuOwoJCQkJfTsKCQkJfQoJCX0sCgoJCWFzeW5jIGluaXREaWFsb2dXYXAoKSB7CgkJCWxldCBzZWNyZXQgPSAiIgoJCQlpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAndjEnKSB7CgkJCQlzZWNyZXQgPSAi5b2T5YmN5pqX5Y+35piv77ya4oCcIiArIHBhbi5udW0gKyAi4oCd44CCIjsKCQkJfSBlbHNlIGlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICd2MicpIHsKCQkJCXNlY3JldCA9ICLlvZPliY3mmpflj7fmmK/vvJrigJwiICsgcGFuLm51bSArICLigJ3vvIzlvIDmupDljY/orq7mmK/igJwiICsgcGFuLmxpY2Vuc2UgKyAi4oCd44CCIjsKCQkJfSBlbHNlIGlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICJubyIpIHsKCQkJCXNlY3JldCA9ICLlvZPliY3mmpflj7fmmK/vvJrigJwiICsgcGFuLm51bSArICLigJ3jgIIiOwoJCQl9IGVsc2UgewoJCQkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicsICd2MicpOwoJCQkJc2VjcmV0ID0gIuW9k+WJjemFjee9ruS4jeato+ehru+8jOivt+WIt+aWsOmhtemdouWGjee7p+e7rSI7CgkJCX0KCQkJbGV0IHJlc3VsdCA9IGF3YWl0IFN3YWwuZmlyZSh7CgkJCQl0aXRsZTogcGFuLmluaXRbMF0sCgkJCQlhbGxvd091dHNpZGVDbGljazogZmFsc2UsCgkJCQlzaG93Q2xvc2VCdXR0b246IHRydWUsCgkJCQlzaG93RGVueUJ1dHRvbjogdHJ1ZSwKCQkJCXBvc2l0aW9uOiAndG9wJywKCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCgkJCQljb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsCgkJCQlodG1sOiBgPGRpdj48aW1nIHN0eWxlPSJ3aWR0aDogMjUwcHg7bWFyZ2luLWJvdHRvbTogMTBweDsiIHNyYz0iJHtwYW4uaW1nfSIgYWx0PSIke3Bhbi5pbWd9Ij4KCQkJCTxpbnB1dCBjbGFzcz0ic3dhbDItaW5wdXQgaW5pdC1pbnB1dCIgaWQ9ImluaXQiIHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSIke3Bhbi5pbml0WzFdfSI+PGJyPgoJCQkJPGRpdj48c3Bhbj7kvaDlj6/ku6XpgInmi6ki5rOo5YWlIueri+WNs+eCueS6ruaMiemSrjwvc3Bhbj48L2Rpdj4KCQkJCTxkaXY+PHNwYW4+5oiW6ICF6L6T5YWlIOaal+WPty/lvIDmupDljY/orq4g54K55LquLi4uPC9zcGFuPjwvZGl2PgoJCQkJPGRpdj48c3Bhbj4ke3NlY3JldH08L3NwYW4+PC9kaXY+CgkJCQk8ZGl2PjxzcGFuPuWOn+S9nOiAheW8gOWPkeW+iOi+m+iLpu+8jOaJgOS7peivt+aJq+eggeaUr+aMgeS4gOS4i+S7lueahOeahOWFrOS8l+WPtzwvc3Bhbj48L2Rpdj4KCQkJCTxkaXY+PHNwYW4+5oiW6ICF5p2l57uZ6L+Z5Liq5pS554mI54K55LiqPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2htanoxMDAvT25saW5lLWRpc2stZGlyZWN0LWxpbmstZG93bmxvYWQtYXNzaXN0YW50LyI+U3RhcjwvYT4uLi48L3NwYW4+PC9kaXY+CgkJCQk8ZGl2PjxzcGFuPueCueS6ruWQjuWPr+S7peeyvueugOmDqOWIhue9keebmOeVjOmdouWTpiE8L3NwYW4+PC9kaXY+CgkJCQk8L2Rpdj5gLAoJCQkJZGVueUJ1dHRvblRleHQ6ICfms6jlhaUnCgkJCX0pOwoJCQlpZiAocmVzdWx0LmlzRGVuaWVkKSB7CgkJCQljb25zb2xlLmxvZygi44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRXG7mraPlnKjms6jlhaXngrnkuq7mjInpkq7orr7nva7pobnnm64uLi4iKTsKCQkJCW1lc3NhZ2Uud2FybmluZygi5q2j5Zyo5rOo5YWl54K55Lqu5oyJ6ZKu6K6+572u6aG555uuLi4uIik7CgkJCQlzZXRUaW1lb3V0KCgpID0+IHsKCQkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX2luaXRfY29kZScsIHBhbi5udW0pOwoJCQkJCW1lc3NhZ2Uuc3VjY2Vzcygi5rOo5YWl5oiQ5Yqf5LqG5qy4ISIpOwoJCQkJCXNldFRpbWVvdXQoKCkgPT4gewoJCQkJCQltZXNzYWdlLnN1Y2Nlc3MocGFuLmluaXRbMl0pOwoJCQkJCQlzZXRUaW1lb3V0KCgpID0+IHsKCQkJCQkJCWhpc3RvcnkuZ28oMCk7CgkJCQkJCX0sIDMwMDApOwoJCQkJCX0sIDMwMDApOwoJCQkJfSwgNTAwMCk7CgkJCX07CgkJCWlmIChyZXN1bHQuaXNDb25maXJtZWQpewoJCQkJaWYgKHBhbi5udW0gPT09ICQoJyNpbml0JykudmFsKCkpIHsKCQkJCQljb25zb2xlLmxvZygi44CQ77yI5pS577yJ572R55uY55u06ZO+5LiL6L295Yqp5omL44CRXG7mmpflj7fmraPnoa4iKQoJCQkJCW1lc3NhZ2Uuc3VjY2VzcyhwYW4uaW5pdFsyXSk7CgkJCQkJc2V0VGltZW91dCgoKSA9PiB7CgkJCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJywgcGFuLm51bSk7CgkJCQkJCWhpc3RvcnkuZ28oMCk7CgkJCQkJfSwgMzAwMCkKCQkJCX0gZWxzZSBpZiAoJCgnI2luaXQnKS52YWwoKSA9PT0gJzExNDUxNCcgfHwgJCgnI2luaXQnKS52YWwoKSA9PT0gJzE5MTk4MTAnIHx8ICQoJyNpbml0JykudmFsKCkgPT09ICcxMTQ1MTQxOTE5ODEwJykgewoJCQkJCS8qLS0tCgkJCQkJCWhvbW/lvanom4vlj4jlm57mnaXlipvvvIjllpzvvIkKCQkJCQkJaW1hZ2VVcmw6ICdodHRwczovL3BpYzQuemhpbWcuY29tLzgwL3YyLTFiOTdhMDg4ZTE1NmMwMTUxMDhkZWM2NjNiYmE4YjA0LmpwZycsCgkJCQkJCWltYWdlVXJsOiAnaHR0cHM6Ly9saDEuaGV0YW91c2VyY29udGVudC5jb20vaW1nLzdkNGMxYzBiNGFkYjBlOTUuanBnJywKCQkJCQkqLwoJCQkJCWF3YWl0IFN3YWwuZmlyZSh7CgkJCQkJCWljb246ICdlcnJvcicsCgkJCQkJCXRpdGxlOiAnMTE0NTE0MTkxOTgxMCcsCgkJCQkJCWh0bWw6ICc8c3Bhbj5ob21v54m55pyJ55qE5pWw5a2X5b2T54S25LiN6KGM5ZWmPGJyPuWTvOWTvOWTvOWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWViuWVijwvc3Bhbj4nLAoJCQkJCQl0aW1lcjogODAwMCwKCQkJCQkJaW1hZ2VVcmw6ICdodHRwczovL3BpYzQuemhpbWcuY29tLzgwL3YyLTFiOTdhMDg4ZTE1NmMwMTUxMDhkZWM2NjNiYmE4YjA0LmpwZycsCgkJCQkJCWFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKCQkJCQkJdGltZXJQcm9ncmVzc0JhcjogdHJ1ZSwKCQkJCQkJc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLAoJCQkJCQlzaG93RGVueUJ1dHRvbjogdHJ1ZSwKCQkJCQkJaGVpZ2h0QXV0bzogZmFsc2UsCgkJCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJCQlkZW55QnV0dG9uVGV4dDogJ+WTvOWTvOWTvOWViuWViuWViuWViuWViuWViuWViuWViuWViuWViicsCgkJCQkJfSk7CgkJCQkJbWVzc2FnZS5pbmZvKCLmiJDlsLHvvJrkvaDop6blj5HkuobkuIDkuKpob21v54m55pyJ55qE5b2p6JuL77yBIik7CgkJCQkJc2V0VGltZW91dCgoKSA9PiB7CgkJCQkJCVN3YWwuZmlyZSh7CgkJCQkJCQl0aXRsZTogJzExNDUxNDE5MTk4MTAnLAoJCQkJCQkJdGV4dDonaG9tb+eJueacieeahOaVsOWtl+W9k+eEtuS4jeihjOWVpi4uLuWQl++8nycsCgkJCQkJCQlpY29uOiAncXVlc3Rpb24nLAoJCQkJCQkJaW1hZ2VVcmw6ICdodHRwczovL2xoMS5oZXRhb3VzZXJjb250ZW50LmNvbS9pbWcvN2Q0YzFjMGI0YWRiMGU5NS5qcGcnLAoJCQkJCQkJc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLAoJCQkJCQkJYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAoJCQkJCQl9KTsKCQkJCQkJc2V0VGltZW91dCgoKSA9PiB7CgkJCQkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX2luaXRfY29kZScsIHBhbi5udW0pOwoJCQkJCQkJbWVzc2FnZS5zdWNjZXNzKCLmiJDlsLHvvJrlk7zlk7zlk7zllYrllYrllYrllYrllYrllYrllYrllYrlnLDms6jlhaXmiJDlip8o5ZacKSIpOwoJCQkJCQkJc2V0VGltZW91dCgoKSA9PiB7CgkJCQkJCQkJaGlzdG9yeS5nbygwKTsKCQkJCQkJCX0sIDMwMDApOwoJCQkJCQl9LCAzMDAwKQoJCQkJCX0sIDQwMDApCgkJCQl9IGVsc2UgewoJCQkJCWNvbnNvbGUubG9nKCLjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFcbuaal+WPt+mUmeivryIpCgkJCQkJYXdhaXQgU3dhbC5maXJlKHsKCQkJCQkJaW1hZ2VVcmw6IHBhbi5pbWcsCgkJCQkJCXRpdGxlOiBwYW4uaW5pdFszXSwKCQkJCQkJaGVpZ2h0QXV0bzogZmFsc2UsCgkJCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJCQlodG1sOiBgPGRpdj48c3Bhbj4ke3Bhbi5pbml0WzRdfTxicj7kvaDlj6/ku6XlnKjov5Tlm57lkI7pgInmi6nigJzms6jlhaXigJ3nq4vljbPngrnkuq7mjInpkq7vvIw8YnI+5oiW6ICF5Zyo6L6T5YWl5qGG6ZSu5YWl5Lul5LiL5pqX5Y+377ya4oCcJHtwYW4ubnVtfeKAneOAgjwvc3Bhbj48L2Rpdj5gLAoJCQkJCQljb25maXJtQnV0dG9uVGV4dDogJ+mHjeaWsOi+k+WFpScsCgkJCQkJfSk7CgkJCQkJYXdhaXQgdGhpcy5pbml0RGlhbG9nKCk7CgkJCQkJcmV0dXJuOwoJCQkJfTsKCQkJfQoJCX0sCgl9OwoKCS8v55m+5bqm572R55uYCglsZXQgYmFpZHUgPSB7CgoJCV9nZXRFeHRyYSgpIHsKCQkJbGV0IHNlS2V5ID0gZGVjb2RlVVJJQ29tcG9uZW50KGJhc2UuZ2V0Q29va2llKCdCRENMTkQnKSk7CgkJCXJldHVybiAneycgKyAnInNla2V5IjoiJyArIHNlS2V5ICsgJyInICsgIn0iOwoJCX0sCgoJCV9nZXRTdXJsKCkgewoJCQlsZXQgcmVnID0gLyg/PD1zXC98c3VybD0pKFthLXpBLVowLTlfLV0rKS9nOwoJCQlpZiAocmVnLnRlc3QobG9jYXRpb24uaHJlZikpIHsKCQkJCXJldHVybiBsb2NhdGlvbi5ocmVmLm1hdGNoKHJlZylbMF07CgkJCX0KCQkJcmV0dXJuICcnOwoJCX0sCgoJCV9nZXRGaWRMaXN0KCkgewoJCQlsZXQgZmlkbGlzdCA9IFtdOwoJCQlzZWxlY3RMaXN0LmZvckVhY2godiA9PiB7CgkJCQlpZiAoK3YuaXNkaXIgPT09IDEpIHJldHVybjsKCQkJCWZpZGxpc3QucHVzaCh2LmZzX2lkKTsKCQkJfSk7CgkJCXJldHVybiAnWycgKyBmaWRsaXN0ICsgJ10nOwoJCX0sCgoJCV9yZXNldERhdGEoKSB7CgkJCXByb2dyZXNzID0ge307CgkJCSQuZWFjaChyZXF1ZXN0LCAoa2V5KSA9PiB7CgkJCQkocmVxdWVzdFtrZXldKS5hYm9ydCgpOwoJCQl9KTsKCQkJJC5lYWNoKGlucywgKGtleSkgPT4gewoJCQkJY2xlYXJJbnRlcnZhbChpbnNba2V5XSk7CgkJCX0pOwoJCQlpZG0gPSB7fTsKCQkJaW5zID0ge307CgkJCXJlcXVlc3QgPSB7fTsKCQl9LAoKCQlzZXRCRFVTUygpIHsKCQkJdHJ5IHsKCQkJCUdNX2Nvb2tpZSAmJiBHTV9jb29raWUoJ2xpc3QnLCB7bmFtZTogJ0JEVVNTJ30sIChjb29raWVzLCBlcnJvcikgPT4gewoJCQkJCWlmICghZXJyb3IpIHsKCQkJCQkJYmFzZS5zZXRTdG9yYWdlKCJiYWlkdXl1blBsdWdpbl9CRFVTUyIsIHtCRFVTUzogY29va2llc1swXS52YWx1ZX0pOwoJCQkJCX0KCQkJCX0pOwoJCQl9IGNhdGNoIChlKSB7CgkJCQljb25zb2xlLmVycm9yKCLjgJDvvIjmlLnvvInnvZHnm5jnm7Tpk77kuIvovb3liqnmiYvjgJFcbnNldEJEVVNTXG7plJnor6/kv6Hmga/vvJoiLGUpCgkJCX0KCQl9LAoKCQlnZXRCRFVTUygpIHsKCQkJbGV0IGJhaWR1eXVuUGx1Z2luX0JEVVNTID0gYmFzZS5nZXRTdG9yYWdlKCdiYWlkdXl1blBsdWdpbl9CRFVTUycpID8gYmFzZS5nZXRTdG9yYWdlKCdiYWlkdXl1blBsdWdpbl9CRFVTUycpIDogJ3siYmFpZHV5dW5QbHVnaW5fQkRVU1MiOiIifSc7CgkJCXJldHVybiBiYWlkdXl1blBsdWdpbl9CRFVTUy5CRFVTUyB8fCAnJzsKCQl9LAoKCQljb252ZXJ0TGlua1RvQXJpYShsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJbGV0IEJEVVNTID0gdGhpcy5nZXRCRFVTUygpOwoJCQlpZiAoISFCRFVTUykgewoJCQkJZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKCQkJCXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYGFyaWEyYyAiJHtsaW5rfSIgLS1vdXQgIiR7ZmlsZW5hbWV9IiAtLWhlYWRlciAiVXNlci1BZ2VudDogJHt1YX0iIC0taGVhZGVyICJDb29raWU6IEJEVVNTPSR7QkRVU1N9ImApOwoJCQl9CgkJCXJldHVybiB7CgkJCQlsaW5rOiBwYW4uYXNzaXN0YW50LAoJCQkJdGV4dDogcGFuLmluaXRbNV0KCQkJfTsKCQl9LAoKCQljb252ZXJ0TGlua1RvQkMobGluaywgZmlsZW5hbWUsIHVhKSB7CgkJCWxldCBCRFVTUyA9IHRoaXMuZ2V0QkRVU1MoKTsKCQkJaWYgKCEhQkRVU1MpIHsKCQkJCWxldCBjb29raWUgPSBgQkRVU1M9JHtCRFVTU31gOwoJCQkJbGV0IGJjID0gYEFBLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVuYW1lKX0vP3VybD0ke2VuY29kZVVSSUNvbXBvbmVudChsaW5rKX0mY29va2llPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvb2tpZSl9JnVzZXJfYWdlbnQ9JHtlbmNvZGVVUklDb21wb25lbnQodWEpfVpaYDsKCQkJCXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYGJjOi8vaHR0cC8ke2Jhc2UuZW5jb2RlKGJjKX1gKTsKCQkJfQoJCQlyZXR1cm4gewoJCQkJbGluazogcGFuLmFzc2lzdGFudCwKCQkJCXRleHQ6IHBhbi5pbml0WzVdCgkJCX07CgkJfSwKCgkJY29udmVydExpbmtUb0N1cmwobGluaywgZmlsZW5hbWUsIHVhKSB7CgkJCWxldCBCRFVTUyA9IHRoaXMuZ2V0QkRVU1MoKTsKCQkJaWYgKCEhQkRVU1MpIHsKCQkJCWxldCB0ZXJtaW5hbCA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpOwoJCQkJZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKCQkJCXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYCR7dGVybWluYWwgIT09ICd3cCcgPyAnY3VybCcgOiAnY3VybC5leGUnfSAtTCAtQyAtICIke2xpbmt9IiAtbyAiJHtmaWxlbmFtZX0iIC1BICIke3VhfSIgLWIgIkJEVVNTPSR7QkRVU1N9ImApOwoJCQl9CgkJCXJldHVybiB7CgkJCQlsaW5rOiBwYW4uYXNzaXN0YW50LAoJCQkJdGV4dDogcGFuLmluaXRbNV0KCQkJfTsKCQl9LAoKCQlhZGRQYWdlTGlzdGVuZXIoKSB7CgkJCWZ1bmN0aW9uIF9mYWN0b3J5KGUpIHsKCQkJCWxldCB0YXJnZXQgPSAkKGUudGFyZ2V0KTsKCQkJCWxldCBpdGVtID0gdGFyZ2V0LnBhcmVudHMoJy5wbC1pdGVtJyk7CgkJCQlsZXQgbGluayA9IGl0ZW0uZmluZCgnLnBsLWl0ZW0tbGluaycpOwoJCQkJbGV0IHByb2dyZXNzID0gaXRlbS5maW5kKCcucGwtaXRlbS1wcm9ncmVzcycpOwoJCQkJbGV0IHRpcCA9IGl0ZW0uZmluZCgnLnBsLWl0ZW0tdGlwJyk7CgkJCQlsZXQgY29weSA9IGl0ZW0uZmluZCgnLnBsLWl0ZW0tY29weScpOwoJCQkJbGV0IGhvd2lkbSA9IGl0ZW0uZmluZCgnLnBsLXByb2dyZXNzLWhvdycpOwoJCQkJbGV0IGJhY2sgPSBpdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1iYWNrJyk7CgkJCQlsZXQgc3RvcCA9IGl0ZW0uZmluZCgnLnBsLXByb2dyZXNzLXN0b3AnKTsKCQkJCXJldHVybiB7CgkJCQkJaXRlbSwgbGluaywgcHJvZ3Jlc3MsIHRpcCwgY29weSwgaG93aWRtLCBiYWNrLCBzdG9wLCB0YXJnZXQsCgkJCQl9OwoJCQl9CgoJCQlmdW5jdGlvbiBfcmVzZXQoaSkgewoJCQkJaW5zW2ldICYmIGNsZWFySW50ZXJ2YWwoaW5zW2ldKTsKCQkJCXJlcXVlc3RbaV0gJiYgcmVxdWVzdFtpXS5hYm9ydCgpOwoJCQkJcHJvZ3Jlc3NbaV0gPSAwOwoJCQkJaWRtW2ldID0gZmFsc2U7CgkJCX0KCgkJCWRvYy5vbignbW91c2VlbnRlciBtb3VzZWxlYXZlIGNsaWNrJywgJy5wbC1idXR0b24uZy1kcm9wZG93bi1idXR0b24nLCAoZSkgPT4gewoJCQkJaWYgKGUudHlwZSA9PT0gJ21vdXNlbGVhdmUnKSB7CgkJCQkJJChlLmN1cnJlbnRUYXJnZXQpLnJlbW92ZUNsYXNzKCdidXR0b24tb3BlbicpOwoJCQkJfSBlbHNlIHsKCQkJCQkkKGUuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoJ2J1dHRvbi1vcGVuJyk7CgkJCQkJJChlLmN1cnJlbnRUYXJnZXQpLmZpbmQoJy5wbC1kcm9wZG93bi1tZW51Jykuc2hvdygpOwoJCQkJfQoJCQl9KTsKCQkJZG9jLm9uKCdtb3VzZWxlYXZlJywgJy5wbC1idXR0b24uZy1kcm9wZG93bi1idXR0b24gLnBsLWRyb3Bkb3duLW1lbnUnLCAoZSkgPT4gewoJCQkJJChlLmN1cnJlbnRUYXJnZXQpLmhpZGUoKTsKCQkJfSk7CgoJCQlkb2Mub24oJ2NsaWNrJywgJy5wbC1idXR0b24tbW9kZScsIChlKSA9PiB7CgkJCQltb2RlID0gZS50YXJnZXQuZGF0YXNldC5tb2RlOwoJCQkJU3dhbC5maXJlKHsKCQkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCQlzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKCQkJCQlzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsCgkJCQkJaHRtbDogYOmTvuaOpeiOt+WPluS4rWAsCgkJCQkJd2lsbE9wZW46IGZ1bmN0aW9uKCkgewoJCQkJCQlTd2FsLnNob3dMb2FkaW5nKCk7CgkJCQkJfQoJCQkJfSk7CgkJCQl0aGlzLmdldFBDU0xpbmsoKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstYXBpJywgYXN5bmMgKGUpID0+IHsKCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCWxldCBvID0gX2ZhY3RvcnkoZSk7CgkJCQlsZXQgJHdpZHRoID0gby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1pbm5lcicpOwoJCQkJbGV0ICR0ZXh0ID0gby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1pbm5lci10ZXh0Jyk7CgkJCQlsZXQgZmlsZW5hbWUgPSBvLmxpbmtbMF0uZGF0YXNldC5maWxlbmFtZTsKCQkJCWxldCBpbmRleCA9IG8ubGlua1swXS5kYXRhc2V0LmluZGV4OwoJCQkJX3Jlc2V0KGluZGV4KTsKCQkJCWJhc2UuZ2V0KG8ubGlua1swXS5kYXRhc2V0LmxpbmssIHsiVXNlci1BZ2VudCI6IHBhbi51YX0sICdibG9iJywge2ZpbGVuYW1lLCBpbmRleH0pOwoJCQkJbGV0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7IC8vIOiusOW9leS4i+i9veW8gOWni+aXtumXtAoJCQkJbGV0IHByZXZMb2FkZWQgPSAwOyAvLyDkuIrkuIDmrKHnmoTlt7LkuIvovb3mlbDmja7ph48KCQkJCWxldCBwcmV2VGltZSA9IHN0YXJ0VGltZTsgLy8g5LiK5LiA5qyh55qE5pe26Ze0CgkJCQlsZXQgc2l6ZSA9IE51bWJlcihvLmxpbmtbMF0uZGF0YXNldC5zaXplKTsKCQkJCWluc1tpbmRleF0gPSBzZXRJbnRlcnZhbCgoKSA9PiB7CgkJCQkJbGV0IHByb2cgPSArcHJvZ3Jlc3NbaW5kZXhdIHx8IDA7CgkJCQkJbGV0IGlzSURNID0gaWRtW2luZGV4XSB8fCBmYWxzZTsKCgkJCQkJaWYgKGlzSURNKSB7CgkJCQkJCS8vIOWkhOeQhklETeeahOS7o+eggQoJCQkJCQlvLnRpcC5oaWRlKCk7CgkJCQkJCW8ucHJvZ3Jlc3MuaGlkZSgpOwoJCQkJCQlvLmNvcHkuc2hvdygpOwoJCQkJCQlvLmxpbmsudGV4dCgn6ZO+5o6l5bey6KKrSURN5o2V6I63fuivt+afpeeci0lETeS4i+i9veeql+WPo+WTpiEnKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iikuc2hvdygpOwoJCQkJCQljbGVhckludGVydmFsKGluc1tpbmRleF0pOwoJCQkJCQlzZXRUaW1lb3V0KAoJCQkJCQkJZnVuY3Rpb24gKCl7CgkJCQkJCQkJby5saW5rLnRleHQoJ+mHjeaWsOS4i+i9vScpLmFuaW1hdGUoe29wYWNpdHk6ICcxJ30sICJzbG93Iik7CgkJCQkJCQl9LDIwMDAKCQkJCQkJKQoJCQkJCQlpZG1baW5kZXhdID0gZmFsc2U7CgkJCQkJfSBlbHNlIHsKCQkJCQkJLy8g5aSE55CG5pmu6YCa5LiL6L2955qE5oOF5Ya1Li4uCgkJCQkJCWxldCBjdXJyZW50VGltZSA9IERhdGUubm93KCk7CgkJCQkJCWxldCBlbGFwc2VkVGltZSA9IGN1cnJlbnRUaW1lIC0gc3RhcnRUaW1lOwoJCQkJCQlsZXQgdG90YWxQcm9ncmVzcyA9IHByb2cgLyAxMDA7CgkJCQkJCWxldCB0b3RhbEVsYXBzZWRTZWNvbmRzID0gZWxhcHNlZFRpbWUgLyAxMDAwOwoJCQkJCQlsZXQgZXN0aW1hdGVkVG90YWxUaW1lU2Vjb25kcyA9IHRvdGFsRWxhcHNlZFNlY29uZHMgLyB0b3RhbFByb2dyZXNzOwoJCQkJCQlsZXQgcmVtYWluaW5nVGltZVNlY29uZHMgPSBlc3RpbWF0ZWRUb3RhbFRpbWVTZWNvbmRzIC0gdG90YWxFbGFwc2VkU2Vjb25kczsKCgkJCQkJCS8vIOWwhuWJqeS9meaXtumXtOi9rOaNouS4uuWkqeOAgeaXtuOAgeWIhuOAgeenkgoJCQkJCQlsZXQgcmVtYWluaW5nRGF5cyA9IE1hdGguZmxvb3IocmVtYWluaW5nVGltZVNlY29uZHMgLyAoNjAgKiA2MCAqIDI0KSk7CgkJCQkJCXJlbWFpbmluZ1RpbWVTZWNvbmRzICU9ICg2MCAqIDYwICogMjQpOwoKCQkJCQkJbGV0IHJlbWFpbmluZ0hvdXJzID0gTWF0aC5mbG9vcihyZW1haW5pbmdUaW1lU2Vjb25kcyAvICg2MCAqIDYwKSk7CgkJCQkJCXJlbWFpbmluZ1RpbWVTZWNvbmRzICU9ICg2MCAqIDYwKTsKCgkJCQkJCWxldCByZW1haW5pbmdNaW51dGVzID0gTWF0aC5mbG9vcihyZW1haW5pbmdUaW1lU2Vjb25kcyAvIDYwKTsKCQkJCQkJbGV0IHJlbWFpbmluZ1NlY29uZHMgPSBNYXRoLmZsb29yKHJlbWFpbmluZ1RpbWVTZWNvbmRzICUgNjApOwoKCQkJCQkJLy8g6K6h566X5LiL6L296YCf5bqmCgkJCQkJCWxldCBsb2FkZWQgPSBwcm9nICogc2l6ZSAvIDEwMDsgLy8g5bey5LiL6L295pWw5o2u6YePCgkJCQkJCWxldCBjdXJyZW50VGltZURpZmYgPSBjdXJyZW50VGltZSAtIHByZXZUaW1lOyAvLyDlvZPliY3ml7bpl7TkuI7kuIrkuIDmrKHml7bpl7TnmoTlt67lgLwKCQkJCQkJbGV0IGxvYWRlZERpZmYgPSBsb2FkZWQgLSBwcmV2TG9hZGVkOyAvLyDlvZPliY3lt7LkuIvovb3mlbDmja7ph4/kuI7kuIrkuIDmrKHnmoTlt67lgLwKCQkJCQkJbGV0IGRvd25sb2FkU3BlZWQgPSAoY3VycmVudFRpbWVEaWZmICE9PSAwKSA/IGxvYWRlZERpZmYgLyAoY3VycmVudFRpbWVEaWZmIC8gMTAwMCkgOiAwOyAvLyDkuIvovb3pgJ/luqbvvIjljZXkvY3vvJrlrZfoioIv56eS77yJCgoJCQkJCQkvLyDmm7TmlrDkuIrkuIDmrKHnmoTmlbDmja4KCQkJCQkJcHJldkxvYWRlZCA9IGxvYWRlZDsKCQkJCQkJcHJldlRpbWUgPSBjdXJyZW50VGltZTsKCgkJCQkJCS8vIOabtOaUueeVjOmdogoJCQkJCQlvLmxpbmsuaGlkZSgpOwoJCQkJCQlvLnRpcC5oaWRlKCk7CgkJCQkJCW8uc3RvcC5zaG93KCk7CgkJCQkJCW8uY29weS5oaWRlKCk7CgkJCQkJCW8ucHJvZ3Jlc3Muc2hvdygpOwoKCQkJCQkJLy8g5pu05paw6L+b5bqm5p2hCgkJCQkJCSR3aWR0aC5jc3MoJ3dpZHRoJywgcHJvZyArICclJyk7CgoJCQkJCQkvLyDmm7TmlrDov5vluqbmnaHmlofmnKwKCQkJCQkJbGV0IHRpbWVUZXh0ID0gJyc7CgkJCQkJCWlmIChOdW1iZXIuaXNGaW5pdGUocmVtYWluaW5nRGF5cykgJiYgcmVtYWluaW5nRGF5cyA+IDApIHsKCQkJCQkJCXRpbWVUZXh0ID0gcmVtYWluaW5nRGF5cyArICflpKkgJyArIGJhc2UucmVwYWlyVGltZXIocmVtYWluaW5nSG91cnMpICsgJ+aXtjonICsgYmFzZS5yZXBhaXJUaW1lcihyZW1haW5pbmdNaW51dGVzKSArICfliIY6JyArIGJhc2UucmVwYWlyVGltZXIocmVtYWluaW5nU2Vjb25kcykgKyAn56eSJzsKCQkJCQkJfSBlbHNlIGlmIChOdW1iZXIuaXNGaW5pdGUocmVtYWluaW5nSG91cnMpICYmIHJlbWFpbmluZ0hvdXJzID4gMCkgewoJCQkJCQkJdGltZVRleHQgPSBiYXNlLnJlcGFpclRpbWVyKHJlbWFpbmluZ0hvdXJzKSArICfml7Y6JyArIGJhc2UucmVwYWlyVGltZXIocmVtYWluaW5nTWludXRlcykgKyAn5YiGOicgKyBiYXNlLnJlcGFpclRpbWVyKHJlbWFpbmluZ1NlY29uZHMpICsgJ+enkic7CgkJCQkJCX0gZWxzZSBpZiAoTnVtYmVyLmlzRmluaXRlKHJlbWFpbmluZ01pbnV0ZXMpICYmIHJlbWFpbmluZ01pbnV0ZXMgPiAwKSB7CgkJCQkJCQl0aW1lVGV4dCA9IGJhc2UucmVwYWlyVGltZXIocmVtYWluaW5nTWludXRlcykgKyAn5YiGOicgKyBiYXNlLnJlcGFpclRpbWVyKHJlbWFpbmluZ1NlY29uZHMpICsgJ+enkic7CgkJCQkJCX0gZWxzZSBpZiAoTnVtYmVyLmlzRmluaXRlKHJlbWFpbmluZ1NlY29uZHMpICYmIHJlbWFpbmluZ1NlY29uZHMgPiAwKSB7CgkJCQkJCQl0aW1lVGV4dCA9IHJlbWFpbmluZ1NlY29uZHMgKyAn56eSJzsKCQkJCQkJfSBlbHNlIGlmIChOdW1iZXIuaXNGaW5pdGUocmVtYWluaW5nU2Vjb25kcykgJiYgcmVtYWluaW5nU2Vjb25kcyA9PT0gMCkgewoJCQkJCQkJdGltZVRleHQgPSAn5Y2z5bCG5a6M5oiQJzsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXRpbWVUZXh0ID0gJ+iuoeeul+S4rS4uLic7CgkJCQkJCX0KCgkJCQkJCWxldCBzcGVlZFRleHQgPScnOwoJCQkJCQlzcGVlZFRleHQgPSBiYXNlLnNpemVGb3JtYXQoZG93bmxvYWRTcGVlZCkKCgoJCQkJCQlpZiAocHQgPT09ICd3YXAnKSB7CgkJCQkJCQkkdGV4dC50ZXh0KHByb2cgKyAnJScpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJHRleHQudGV4dChwcm9nICsgJyUgfCDliankvZnml7bpl7TvvJonICsgdGltZVRleHQgKyAnIHwg6YCf5bqm77yaJyArIHNwZWVkVGV4dCArICcv56eSJyk7CgkJCQkJCX0KCgkJCQkJCWlmIChwcm9nID09PSAxMDApIHsKCQkJCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24gKCl7CgkJCQkJCQkJY2xlYXJJbnRlcnZhbChpbnNbaW5kZXhdKTsKCQkJCQkJCQlwcm9ncmVzc1tpbmRleF0gPSAwOwoJCQkJCQkJCW8uaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3Mtc3RvcCcpLmhpZGUoKTsKCQkJCQkJCQlvLmhvd2lkbS5oaWRlKCk7CgkJCQkJCQkJJHRleHQudGV4dCgn5LiL6L295a6M5oiQ5LqGIea1j+iniOWZqOS4i+i9veahhuW6lOivpeW8ueWHuuadpeS6huWTpn4nKTsKCQkJCQkJCQlvLmJhY2suc2hvdygpCgkJCQkJCQkJc2V0VGltZW91dChmdW5jdGlvbiAoKXsKCQkJCQkJCQkJby5saW5rLnRleHQoJ+mHjeaWsOS4i+i9vScpLmFuaW1hdGUoe29wYWNpdHk6ICcxJ30sICJzbG93Iik7CgkJCQkJCQkJfSwzMDAwKQoJCQkJCQkJfSwzMDAwKQoJCQkJCQl9CgkJCQkJfQoJCQkJfSwgNTAwKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXJldHJ5JywgYXN5bmMgKGUpID0+IHsKCQkJCWxldCBvID0gX2ZhY3RvcnkoZSk7CgkJCQlvLnRpcC5oaWRlKCk7CgkJCQlvLmxpbmsuc2hvdygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItaG93JywgYXN5bmMgKGUpID0+IHsKCQkJCWxldCBvID0gX2ZhY3RvcnkoZSk7CgkJCQlsZXQgaW5kZXggPSBvLmxpbmtbMF0uZGF0YXNldC5pbmRleDsKCQkJCWlmIChyZXF1ZXN0W2luZGV4XSkgewoJCQkJCXJlcXVlc3RbaW5kZXhdLmFib3J0KCk7CgkJCQkJY2xlYXJJbnRlcnZhbChpbnNbaW5kZXhdKTsKCQkJCQlvLnByb2dyZXNzLmhpZGUoKTsKCQkJCQlvLnRpcC5zaG93KCk7CgkJCQl9CgoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItc3RvcCcsIGFzeW5jIChlKSA9PiB7CgkJCQlsZXQgbyA9IF9mYWN0b3J5KGUpOwoJCQkJbGV0IGluZGV4ID0gby5saW5rWzBdLmRhdGFzZXQuaW5kZXg7CgkJCQlpZiAocmVxdWVzdFtpbmRleF0pIHsKCQkJCQlyZXF1ZXN0W2luZGV4XS5hYm9ydCgpOwoJCQkJCWNsZWFySW50ZXJ2YWwoaW5zW2luZGV4XSk7CgkJCQkJby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1pbm5lci10ZXh0JykudGV4dCgn5q2j5Zyo5Y+W5raILi4uJyk7CgkJCQkJby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1pbm5lcicpLmNzcygnd2lkdGgnLCAxMDAgKyAnJScpOwoJCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCQkJCQkJby50aXAuaGlkZSgpOwoJCQkJCQlvLmJhY2suaGlkZSgpOwoJCQkJCQlvLmxpbmsuc2hvdygwKTsKCQkJCQkJby5jb3B5LnNob3coKTsKCQkJCQkJby5wcm9ncmVzcy5oaWRlKCk7CgkJCQkJCW8uc3RvcC5oaWRlKCk7CgkJCQkJfSwxMDUwKQoJCQkJfQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItYmFjaycsIGFzeW5jIChlKSA9PiB7CgkJCQlsZXQgbyA9IF9mYWN0b3J5KGUpOwoJCQkJby5wcm9ncmVzcy5oaWRlKCk7CgkJCQlvLnRpcC5oaWRlKCk7CgkJCQlvLmxpbmsuc2hvdygpOwoJCQkJby5jb3B5LnNob3coKTsKCQkJCW8uc3RvcC5oaWRlKCk7CgkJCQlvLmJhY2suaGlkZSgpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcmlhLCAubGlzdGVuZXItY29weS1hbGwnLCAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJaWYgKCFlLnRhcmdldC5kYXRhc2V0LmxpbmspIHsKCQkJCQkkKGUudGFyZ2V0KS5yZW1vdmVDbGFzcygnbGlzdGVuZXItY29weS1hbGwnKS5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoYCR7cGFuLmluaXRbNV198J+RiTxhIGhyZWY9IiR7cGFuLmFzc2lzdGFudH0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0icGwtYSI+54K55Ye75q2k5aSE5a6J6KOFPC9hPvCfkYhgKTsKCQkJCX0gZWxzZSB7CgkJCQkJYmFzZS5zZXRDbGlwYm9hcmQoZGVjb2RlVVJJQ29tcG9uZW50KGUudGFyZ2V0LmRhdGFzZXQubGluaykpOwoJCQkJCSQoZS50YXJnZXQpLnRleHQoJ+WkjeWItuaIkOWKnycpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCQlzZXRUaW1lb3V0KAoJCQkJCQlmdW5jdGlvbiAoKXsKCQkJCQkJCSQoZS50YXJnZXQpLnRleHQoJ+mHjeaWsOWkjeWIticpLmFuaW1hdGUoe29wYWNpdHk6ICcxJ30sICJzbG93Iik7CgkJCQkJCX0sMjAwMAoJCQkJCSkKCQkJCX0KCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWRvd25sb2FkLWFsbCcsIChlKSA9PiB7CgkJCQkkKCcucGwtaXRlbS1saW5rJykuY2xpY2soKTsKCQkJCSQoZS50YXJnZXQpLnRleHQoJ+S4i+i9veW8gOWni++8jOS4i+i9vei/m+W6puingeS4iuaWueaMiemSruWTpn4nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCQlzZXRUaW1lb3V0KAoJCQkJCWZ1bmN0aW9uICgpewoJCQkJCQkkKGUudGFyZ2V0KS50ZXh0KCfkuIvovb3lhajpg6jpk77mjqUnKS5hbmltYXRlKHtvcGFjaXR5OiAnMSd9LCAic2xvdyIpOwoJCQkJCX0sMjAwMAoJCQkJKQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJbGV0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTsgCgoJCQkJdGFyZ2V0LmZpbmQoJy5pY29uJykucmVtb3ZlKCk7CgkJCQl0YXJnZXQuZmluZCgnLnBsLWxvYWRpbmcnKS5yZW1vdmUoKTsKCQkJCXRhcmdldC5wcmVwZW5kKGJhc2UuY3JlYXRlTG9hZGluZygpKTsKCgkJCQlsZXQgcmVzID0gYXdhaXQgdGhpcy5zZW5kTGlua1RvUlBDKGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmZpbGVuYW1lLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKCQkJCWlmIChyZXMgPT09ICdzdWNjZXNzJykgewoJCQkJCSQoJy5saXN0ZW5lci1ycGMtdGFzaycpLnNob3coKTsKCQkJCQl0YXJnZXQucmVtb3ZlQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKCflj5HpgIHmiJDlip/kuoYh5b+r5Y6755yL55yL5ZCnficpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0gZWxzZSBpZiAocmVzID09PSAnYXNzaXN0YW50JykgewoJCQkJCXRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoYCR7cGFuLmluaXRbNV198J+RiTxhIGhyZWY9IiR7cGFuLmFzc2lzdGFudH0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0icGwtYSI+54K55Ye75q2k5aSE5a6J6KOFPC9hPvCfkYhgKTsKCQkJCX0gZWxzZSB7CgkJCQkJdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykudGV4dCgn5Y+R6YCB5aSx6LSl77yM5qOA5p+l5LiA5LiL5oKo55qEUlBD6YWN572u5L+h5oGv5ZOmIScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0KCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsKCQkJCSQoJy5saXN0ZW5lci1saW5rLXJwYycpLmNsaWNrKCk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflj5HpgIHlrozmiJDvvIzlj5HpgIHnu5Pmnpzop4HkuIrmlrnmjInpkq7lk6Z+JykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi1zZXR0aW5nJywgKCkgPT4gewoJCQkJYmFzZS5zaG93U2V0dGluZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi13YXBzZXR0aW5nJywgKCkgPT4gewoJCQkJYmFzZS5zaG93V2FwU2V0dGluZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi11cGRhdGVsb2cnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dVcGRhdGVMb2coKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXJwYy10YXNrJywgKGUpID0+IHsKCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCWxldCBycGMgPSBKU09OLnN0cmluZ2lmeSh7CgkJCQkJZG9tYWluOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSwKCQkJCQlwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCgkJCQl9KSwgdXJsID0gYCR7cGFuLmR9Lz9ycGM9JHtiYXNlLmVuY29kZShycGMpfSMke2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyl9YDsKCQkJCUdNX29wZW5JblRhYih1cmwsIHthY3RpdmU6IHRydWV9KTsKCQkJfSk7CgkJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgKGUpID0+IHsKCQkJCWlmIChlLnRhcmdldC5ub2RlTmFtZSA9PT0gJ0EnICYmIH5lLnRhcmdldC5jbGFzc05hbWUuaW5kZXhPZigncGwtYScpKSB7CgkJCQkJZS5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCX0KCQkJfSwgdHJ1ZSk7CgkJfSwKCgkJYWRkQnV0dG9uKCkgewoJCQlpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKSl7CgkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKS5yZW1vdmUoKQoJCQl9CgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLndwLXMtaGVhZGVyX192aXAtYnRuLXRpcCIsIGZ1bmN0aW9uICgpIHsKCQkJCWxldCB2aXAxID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgid3Atcy1oZWFkZXJfX3ZpcC1idG4tdGlwIilbMF07CgkJCQl2aXAxLnJlbW92ZSgpOwoJCQl9LHRydWUpOwoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi5hcHAtdXNlci12aXAtY2VudGVyLXRpcCIsIGZ1bmN0aW9uICgpIHsKCQkJCWxldCB2aXAyID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYXBwLXVzZXItdmlwLWNlbnRlci10aXAiKVswXTsKCQkJCXZpcDIucmVtb3ZlKCk7CgkJCX0sdHJ1ZSk7CgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLndlYi1oZWFkZXItdGV4dC1zLTQ1IiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IHZpcDMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgid2ViLWhlYWRlci10ZXh0LXMtNDUiKTsKCQkJCXZpcDMucmVtb3ZlKCk7CgkJCX0sdHJ1ZSk7CgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLndwLXMtaGVhZGVyX192aXAtYnRuIiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IHZpcDQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ3cC1zLWhlYWRlcl9fdmlwLWJ0biIpWzBdOwoJCQkJdmlwNC5pbm5lclRleHQgPSAi5Lya5ZGY5Lit5b+DIjsKCQkJfSx0cnVlKTsKCQkJd2FpdEZvcktleUVsZW1lbnRzKCIuS1FjSHlBIiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IHZpcDUgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJLUWNIeUEiKVswXTsKCQkJCXZpcDUuaW5uZXJUZXh0ID0gIuS8muWRmOS4reW/gyI7CgkJCX0sdHJ1ZSk7CgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLmdPSWJ6UGIiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgdmlwNiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImdPSWJ6UGIiKVswXTsKCQkJCXZpcDYucmVtb3ZlKCk7CgkJCX0sdHJ1ZSk7CgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLmFwcC11c2VyLXZpcC1jZW50ZXItYm94IiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IHZpcDcgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJhcHAtdXNlci12aXAtY2VudGVyLWJveCB2aXAtY2VudGVyLXR5cGUtMiIpWzBdOwoJCQkJdmlwNy5yZW1vdmUoKTsKCQkJfSx0cnVlKTsKCQkJd2FpdEZvcktleUVsZW1lbnRzKCIudS1wb3BvdmVyIiwgZnVuY3Rpb24gKCkgewoJCQkJc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCQkJCQlsZXQgdmlwOCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIndwLXMtaGVhZGVyLXVzZXJfX3ZpcC1jZW50ZXIiKVswXTsKCQkJCQlsZXQgYXJyb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJwb3BwZXJfX2Fycm93IilbMF07CgkJCQkJaWYodmlwOCl7CgkJCQkJCXZpcDgucmVtb3ZlKCk7CgkJCQkJfQoJCQkJCWlmKGFycm93KXsKCQkJCQkJYXJyb3cucmVtb3ZlKCk7CgkJCQkJfTsKCQkJCX0sMTApCgkJCX0sdHJ1ZSk7CgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLndwLXMtaGVhZGVyLXVzZXJfX2NyZWF0ZS10ZWFtLXRpdGxlIiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IGFkMSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIndwLXMtaGVhZGVyLXVzZXJfX2NyZWF0ZS10ZWFtLXRpdGxlIilbMF07CgkJCQlhZDEucmVtb3ZlKCk7CgkJCX0sdHJ1ZSk7CgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLndwLXNpZGUtb3B0aW9ucyBnLWNsZWFyZml4IiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IGFkMiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIndwLXNpZGUtb3B0aW9ucyBnLWNsZWFyZml4IilbMF07CgkJCQlhZDIucmVtb3ZlKCk7CgkJCX0sdHJ1ZSk7CgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLndlYi1oZWFkZXItYWQtaXRlbSIsIGZ1bmN0aW9uICgpIHsKCQkJCWxldCBhZDMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIud2ViLWhlYWRlci1hZC1pdGVtIilbMF07CgkJCQlhZDMucmVtb3ZlKCk7CgkJCX0sdHJ1ZSk7CgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLndwLXMtaGVhZGVyX19nYW1lLWVudHJ5IiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IGFkNCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIndwLXMtaGVhZGVyX19nYW1lLWVudHJ5IilbMF07CgkJCQlhZDQucmVtb3ZlKCk7CgkJCX0sdHJ1ZSkKCQkJd2FpdEZvcktleUVsZW1lbnRzKCIub3BlcmF0ZS1ndWlkZS1jbG9zZSIsIGZ1bmN0aW9uICgpIHsKCQkJCWxldCBhZHdpbmRvdyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm9wZXJhdGUtZ3VpZGUtY2xvc2UiKVswXTsKCQkJCWFkd2luZG93LmNsaWNrKCk7CgkJCX0sdHJ1ZSkKCQkJd2FpdEZvcktleUVsZW1lbnRzKCIubmQtb3BlcmF0ZS1ndWlkYW5jZV9fY2xvc2UiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgYWR3aW5kb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJuZC1vcGVyYXRlLWd1aWRhbmNlX19jbG9zZSIpWzBdOwoJCQkJYWR3aW5kb3cuY2xpY2soKTsKCQkJfSx0cnVlKQoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoImN0eC1tZW51LWNvbnRhaW5lciIsIGZ1bmN0aW9uICgpIHsKCQkJCWxldCBjdHhtZW51cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5jdHgtbWVudS1jb250YWluZXIiKTsKCQkJCWN0eG1lbnVzLmZvckVhY2goY3R4bWVudSA9PiBjdHhtZW51LnJlbW92ZSgpKTsKCQkJfSx0cnVlKQoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi5uZXdJY29uIiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IG5ld2ljb24xID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibmV3SWNvbiIpWzBdOwoJCQkJbmV3aWNvbjEucmVtb3ZlKCk7CgkJCX0sdHJ1ZSk7CgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLnUtYmFkZ2VfX2NvbnRlbnQiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgbmV3aWNvbjIgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ1LWJhZGdlX19jb250ZW50IGlzLWRvdCIpWzBdOwoJCQkJaWYobmV3aWNvbjIpIHsKCQkJCQluZXdpY29uMi5yZW1vdmUoKTsKCQkJCX0KCQkJfSx0cnVlKTsKCQkJd2FpdEZvcktleUVsZW1lbnRzKCIud3Atc2lkZS1vcHRpb25zLWJ0biIsIGZ1bmN0aW9uICgpIHsKCQkJCWxldCBxaXllMSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIndwLXNpZGUtb3B0aW9ucyBnLWNsZWFyZml4IilbMF07CgkJCQlxaXllMS5yZW1vdmUoKTsKCQkJfSx0cnVlKTsKCQkJd2FpdEZvcktleUVsZW1lbnRzKCIuYXBwLWRvd25sb2FkIiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IGFwcDEgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJhcHAtZG93bmxvYWQiKVswXTsKCQkJCWFwcDEucmVtb3ZlKCk7CgkJCX0sdHJ1ZSk7CgkJCWlmICghcHQpIHJldHVybjsKCQkJbGV0ICR0b29sV3JhcDsKCQkJbGV0ICRidXR0b24gPSAkKGA8ZGl2IGNsYXNzPSJnLWRyb3Bkb3duLWJ1dHRvbiBwb2ludGVyIHBsLWJ1dHRvbiIgaWQ9InBsLWJ1dHRvbi1saW5rIj48ZGl2IGNsYXNzPSJiYWlkdS1idXR0b24gZy1idXR0b24gZy1idXR0b24tYmx1ZSI+PHNwYW4gY2xhc3M9ImctYnV0dG9uLXJpZ2h0Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kb3dubG9hZCIgc3R5bGU9ImNvbG9yOiNmZmY7Ij48L2VtPjxzcGFuIGNsYXNzPSJ0ZXh0IiBzdHlsZT0id2lkdGg6IDYwcHg7Ij7kuIvovb3liqnmiYs8L3NwYW4+PC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9Im1lbnUiIHN0eWxlPSJjb2xvcjogJHtjb2xvcn07Ym9yZGVyLWNvbG9yOiAke2NvbG9yfTt3aWR0aDphdXRvO3otaW5kZXg6NDE7Ij48ZGl2IGNsYXNzPSJnLWJ1dHRvbi1tZW51IHBsLWJ1dHRvbi1tb2RlIiBzdHlsZT0icGFkZGluZzogMHB4OyIgZGF0YS1tb2RlPSJhcGkiICI+QVBJ5LiL6L29PC9kaXY+PGRpdiBjbGFzcz0iZy1idXR0b24tbWVudSBwbC1idXR0b24tbW9kZSIgc3R5bGU9InBhZGRpbmc6IDBweDsiIGRhdGEtbW9kZT0iYXJpYSIgIj5Bcmlh5LiL6L29PC9kaXY+PGRpdiBjbGFzcz0iZy1idXR0b24tbWVudSBwbC1idXR0b24tbW9kZSIgc3R5bGU9InBhZGRpbmc6IDBweDsiIGRhdGEtbW9kZT0icnBjIiAiPlJQQ+S4i+i9vTwvZGl2PjxkaXYgY2xhc3M9ImctYnV0dG9uLW1lbnUgcGwtYnV0dG9uLW1vZGUiIHN0eWxlPSJwYWRkaW5nOiAwcHg7IiBkYXRhLW1vZGU9ImN1cmwiICI+Y1VSTOS4i+i9vTwvZGl2PjxkaXYgY2xhc3M9ImctYnV0dG9uLW1lbnUgcGwtYnV0dG9uLW1vZGUiIHN0eWxlPSJwYWRkaW5nOiAwcHg7IiBkYXRhLW1vZGU9ImJjIiAiPkJD5LiL6L29PC9kaXY+PGRpdiBjbGFzcz0iZy1idXR0b24tbWVudSBwbC1idXR0b24tbW9kZSBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJwYWRkaW5nOiAwcHg7IiAiPuWKqeaJi+iuvue9rjwvZGl2PjxkaXYgY2xhc3M9ImctYnV0dG9uLW1lbnUgcGwtYnV0dG9uLW1vZGUgbGlzdGVuZXItb3Blbi11cGRhdGVsb2ciIHN0eWxlPSJwYWRkaW5nOiAwcHg7IiAiPuabtOaWsOaXpeW/lzwvZGl2PjwvZGl2PjwvZGl2PmApOwoJCQlpZiAocHQgPT09ICdob21lJykgJHRvb2xXcmFwID0gJChwYW4uYnRuLmhvbWUpOwoJCQlpZiAocHQgPT09ICdtYWluJykgewoJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLm1haW4pOwoJCQkJJGJ1dHRvbiA9ICQoYDwvZGl2PjxkaXYgY2xhc3M9InBsLWJ1dHRvbiIgaWQ9InBsLWJ1dHRvbi1saW5rIiBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1hcmdpbi1yaWdodDogOHB4OyI+PGJ1dHRvbiBjbGFzcz0iYmFpZHUtYnV0dG9uIHUtYnV0dG9uIHUtYnV0dG9uLS1wcmltYXJ5IHUtYnV0dG9uLS1zbWFsbCBpcy1yb3VuZCBpcy1oYXMtaWNvbiIgc3R5bGU9ImZvbnQtc2l6ZTogMTRweDsgcGFkZGluZzogOHB4IDE2cHg7IGhlaWdodDogMzJweDsgYm9yZGVyOiBub25lOyI+PGkgY2xhc3M9InUtaWNvbiB1LWljb24tZG93bmxvYWQiPjwvaT48c3Bhbj7kuIvovb3liqnmiYs8L3NwYW4+PC9idXR0b24+PHVsIGNsYXNzPSJkcm9wZG93bi1saXN0IG5kLWNvbW1vbi1mbG9hdC1tZW51IHBsLWRyb3Bkb3duLW1lbnUiPjxsaSBjbGFzcz0icGwtYnV0dG9uLW1vZGUgc3ViIGN1cnNvci1wIiBkYXRhLW1vZGU9ImFwaSI+QVBJ5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWJ1dHRvbi1tb2RlIHN1YiBjdXJzb3ItcCIgZGF0YS1tb2RlPSJhcmlhIj5Bcmlh5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWJ1dHRvbi1tb2RlIHN1YiBjdXJzb3ItcCIgZGF0YS1tb2RlPSJycGMiPlJQQ+S4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1idXR0b24tbW9kZSBzdWIgY3Vyc29yLXAiIGRhdGEtbW9kZT0iY3VybCI+Y1VSTOS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1idXR0b24tbW9kZSBzdWIgY3Vyc29yLXAiIGRhdGEtbW9kZT0iYmMiPkJD5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWJ1dHRvbi1tb2RlIHN1YiBjdXJzb3ItcCBsaXN0ZW5lci1vcGVuLXNldHRpbmciIj7liqnmiYvorr7nva48L2xpPjxsaSBjbGFzcz0icGwtYnV0dG9uLW1vZGUgc3ViIGN1cnNvci1wIGxpc3RlbmVyLW9wZW4tdXBkYXRlbG9nIj7mm7TmlrDml6Xlv5c8L2xpPjwvdWw+PC9kaXY+YCk7CgkJCX0KCQkJaWYgKHB0ID09PSAnc2hhcmUnKSAkdG9vbFdyYXAgPSAkKHBhbi5idG4uc2hhcmUpOwoJCQlpZiAocHQgPT09ICd3YXAnKSB7CgkJCQkkdG9vbFdyYXAgPSAkKCcubWFpbi1jb250YWluZXInKTsKCQkJCSRidXR0b24gPSAkKGA8c3BhbiBpZD0icGwtYnV0dG9uLWxpbmsiIGNsYXNzPSJ3YXBmb250IG5vbmUtcG9pbnRlciBwbC1idXR0b24gYmFpZHUtd2FwLWJ1dHRvbiI+PHNwYW4+PC9zcGFuPjx1bCBjbGFzcz0iZHJvcGRvd24tbGlzdCBuZC1jb21tb24tZmxvYXQtbWVudSBwbC1kcm9wZG93bi1tZW51IiBzdHlsZT0idG9wOiA0MHB4OyByaWdodDogMDsiPjxsaSBjbGFzcz0iYmFpZHUtd2FwLW1vZGUgcGwtYnV0dG9uLW1vZGUgc3ViIGN1cnNvci1wIiBkYXRhLW1vZGU9ImFwaSI+QVBJ5LiL6L29PC9saT48bGkgY2xhc3M9ImJhaWR1LXdhcC1tb2RlIHBsLWJ1dHRvbi1tb2RlIHN1YiBjdXJzb3ItcCIgZGF0YS1tb2RlPSJhcmlhIj5Bcmlh5LiL6L29PC9saT48bGkgY2xhc3M9ImJhaWR1LXdhcC1tb2RlIHBsLWJ1dHRvbi1tb2RlIHN1YiBjdXJzb3ItcCIgZGF0YS1tb2RlPSJycGMiPlJQQ+S4i+i9vTwvbGk+PGxpIGNsYXNzPSJiYWlkdS13YXAtbW9kZSBwbC1idXR0b24tbW9kZSBzdWIgY3Vyc29yLXAiIGRhdGEtbW9kZT0iY3VybCI+Y1VSTOS4i+i9vTwvbGk+PGxpIGNsYXNzPSJiYWlkdS13YXAtbW9kZSBwbC1idXR0b24tbW9kZSBzdWIgY3Vyc29yLXAiIGRhdGEtbW9kZT0iYmMiPkJD5LiL6L29PC9saT48bGkgY2xhc3M9ImJhaWR1LXdhcC1tb2RlIHBsLWJ1dHRvbi1tb2RlIHN1YiBjdXJzb3ItcCBsaXN0ZW5lci1vcGVuLXdhcHNldHRpbmciIj7liqnmiYvorr7nva48L2xpPjwvdWw+PC9zcGFuPmApOwoJCQkJJCgnaGVhZGVyIGgxW2RhdGEtdi01OTc3OWUzNF0nKS5jc3MoeyJsZWZ0IjoiNzUlIn0pCgkJCQkkdG9vbFdyYXAuYXBwZW5kKCRidXR0b24pOwoJCQl9IGVsc2UgewoJCQkJJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CgkJCX0KCQkJdGhpcy5zZXRCRFVTUygpOwoJCQl0aGlzLmFkZFBhZ2VMaXN0ZW5lcigpOwoJCX0sCgoJCWFkZEluaXRCdXR0b24oKSB7CgkJCWlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpKXsKCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpLnJlbW92ZSgpCgkJCX0KCQkJaWYgKCFwdCkgcmV0dXJuOwoJCQlsZXQgJHRvb2xXcmFwOwoJCQlsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9ImctZHJvcGRvd24tYnV0dG9uIHBvaW50ZXIgcGwtYnV0dG9uLWluaXQiIGlkPSJwbC1idXR0b24tbGluayIgc3R5bGU9Im9wYWNpdHk6MC41Ij48ZGl2IHN0eWxlPSJjb2xvcjojZmZmOyIgY2xhc3M9ImctYnV0dG9uIGctYnV0dG9uLWJsdWUiPjxzcGFuIGNsYXNzPSJnLWJ1dHRvbi1yaWdodCI+PGVtIGNsYXNzPSJpY29uIGljb24tZG93bmxvYWQiIHN0eWxlPSJjb2xvcjojZmZmOyI+PC9lbT48c3BhbiBjbGFzcz0idGV4dCIgc3R5bGU9IndpZHRoOiA2MHB4OyI+5LiL6L295Yqp5omLPC9zcGFuPjwvc3Bhbj48L2Rpdj48L2Rpdj5gKTsKCQkJaWYgKHB0ID09PSAnaG9tZScpIHsKCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJfQoJCQlpZiAocHQgPT09ICdtYWluJykgewoJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLm1haW4pOwoJCQkJJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9InBsLWJ1dHRvbi1pbml0IiBpZD0icGwtYnV0dG9uLWxpbmsiIHN0eWxlPSJvcGFjaXR5Oi41OyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1hcmdpbi1yaWdodDogOHB4OyI+PGJ1dHRvbiBjbGFzcz0iYmFpZHUtYnV0dG9uIHUtYnV0dG9uIHUtYnV0dG9uLS1wcmltYXJ5IHUtYnV0dG9uLS1zbWFsbCBpcy1yb3VuZCBpcy1oYXMtaWNvbiIgc3R5bGU9ImZvbnQtc2l6ZTogMTRweDsgcGFkZGluZzogOHB4IDE2cHg7IGhlaWdodDogMzJweDsgYm9yZGVyOiBub25lOyI+PGkgY2xhc3M9InUtaWNvbiB1LWljb24tZG93bmxvYWQiPjwvaT48c3Bhbj7kuIvovb3liqnmiYso5pyq54K55LquKTwvc3Bhbj48L2J1dHRvbj48L2Rpdj5gKTsKCQkJfQoJCQlpZiAocHQgPT09ICdzaGFyZScpICR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CgkJCWlmIChwdCA9PT0gJ3dhcCcpIHsKCQkJCSR0b29sV3JhcCA9ICQoJy5tYWluLWNvbnRhaW5lcicpOwoJCQkJJGJ1dHRvbiA9ICQoYDxzcGFuIGlkPSJwbC1idXR0b24tbGluayIgY2xhc3M9IndhcGZvbnQgbm9uZS1wb2ludGVyIHBsLWJ1dHRvbi1pbml0IGJhaWR1LXdhcC1idXR0b24iPjxzcGFuPjwvc3Bhbj48L3NwYW4+YCk7CgkJCQkkKCdoZWFkZXIgaDFbZGF0YS12LTU5Nzc5ZTM0XScpLmNzcyh7ImxlZnQiOiI3NSUifSkKCQkJCSR0b29sV3JhcC5hcHBlbmQoJGJ1dHRvbik7CgkJCQkkYnV0dG9uLmNsaWNrKCgpID0+IGJhc2UuaW5pdERpYWxvZ1dhcCgpKTsKCQkJfSBlbHNlIHsKCQkJCSR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJJGJ1dHRvbi5jbGljaygoKSA9PiBiYXNlLmluaXREaWFsb2coKSk7CgkJCX0KCQkJc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCQkJCWlmKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKSl7CgkJCQkJYmFpZHUuYWRkSW5pdEJ1dHRvbigpCgkJCQl9CgkJCX0sMTAwMCkKCQl9LAoKCQlhc3luYyBnZXRUb2tlbigpIHsKCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0RmluYWxVcmwocGFuLnBjc1szXSk7CgkJCS8vIOWmguaenOi/lOWbnue7k+aenOS4reayoeacieWMheWQqydhY2Nlc3NfdG9rZW4n5a2X56ym5LiyCgkJCWlmIChyZXMuaW5kZXhPZignYWNjZXNzX3Rva2VuJykgPT09IC0xKSB7CgoJCQkJLy8g5L2/55SoYXdhaXTlhbPplK7lrZfnrYnlvoViYXNlLmdldOWHveaVsOeahOi/lOWbnue7k+aenO+8jOiOt+WPlue9kemhteWGheWuuQoJCQkJbGV0IGh0bWwgPSBhd2FpdCBiYXNlLmdldChwYW4ucGNzWzNdLCB7fSwgJ3RleHQnKTsKCgkJCQkvLyDkvb/nlKjmraPliJnooajovr7lvI/ljLnphY1odG1s5Lit55qEJ2Jkc3Rva2VuJ+WSjCdjbGllbnRfaWQnCgkJCQlsZXQgYmRzdG9rZW4gPSBodG1sLm1hdGNoKC9uYW1lPSJiZHN0b2tlbiJccyt2YWx1ZT0iKFteIl0rKSIvKT8uWzFdOwoJCQkJbGV0IGNsaWVudF9pZCA9IGh0bWwubWF0Y2goL25hbWU9ImNsaWVudF9pZCJccyt2YWx1ZT0iKFteIl0rKSIvKT8uWzFdOwoKCQkJCS8vIOaehOW7uuS4gOS4quWMheWQq+aJgOmcgOWPguaVsOeahOaVsOaNruWvueixoe+8jOWMheWQq+eZvuW6puaOiOadg+aJgOmcgOWPguaVsAoJCQkJbGV0IGRhdGEgPSB7CgkJCQkJZ3JhbnRfcGVybWlzc2lvbnNfYXJyOiAnbmV0ZGlzaycsCgkJCQkJYmRzdG9rZW46IGJkc3Rva2VuLAoJCQkJCWNsaWVudF9pZDogY2xpZW50X2lkLAoJCQkJCXJlc3BvbnNlX3R5cGU6ICJ0b2tlbiIsCgkJCQkJZGlzcGxheTogInBhZ2UiLAoJCQkJCWdyYW50X3Blcm1pc3Npb25zOiAiYmFzaWMsbmV0ZGlzayIKCQkJCX0KCgkJCQkvLyDlkJHmnI3liqHlmajlj5HpgIFQT1NU6K+35rGC77yM5a6e546w6Ieq5Yqo5o6I5p2DCgkJCQlhd2FpdCBiYXNlLnBvc3QocGFuLnBjc1szXSwgYmFzZS5zdHJpbmdpZnkoZGF0YSksIHsKCQkJCQknQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsCgkJCQl9KQoKCQkJCS8vIOaOiOadg+WujOWQjuWGjeasoeiOt+WPlidhY2Nlc3NfdG9rZW4nCgkJCQlsZXQgcmVzMiA9IGF3YWl0IGJhc2UuZ2V0RmluYWxVcmwocGFuLnBjc1szXSk7CgkJCQlsZXQgYWNjZXNzVG9rZW4gPSByZXMyLm1hdGNoKC9hY2Nlc3NfdG9rZW49KFteJl0rKS8pPy5bMV07CgkJCQlhY2Nlc3NUb2tlbiAmJiBiYXNlLnNldFN0b3JhZ2UoJ2FjY2Vzc1Rva2VuJywgYWNjZXNzVG9rZW4pOwoJCQkJcmV0dXJuIGFjY2Vzc1Rva2VuOwoJCQl9CgkJCS8vIOWmguaenOW3suaciSdhY2Nlc3NfdG9rZW4n77yM5YiZ6I635Y+W5paw55qEJ2FjY2Vzc190b2tlbicKCQkJbGV0IGFjY2Vzc1Rva2VuID0gcmVzLm1hdGNoKC9hY2Nlc3NfdG9rZW49KFteJl0rKS8pPy5bMV07CgkJCWFjY2Vzc1Rva2VuICYmIGJhc2Uuc2V0U3RvcmFnZSgnYWNjZXNzVG9rZW4nLCBhY2Nlc3NUb2tlbik7CgkJCXJldHVybiBhY2Nlc3NUb2tlbjsKCQl9LAoKCQlhc3luYyBnZXRQQ1NMaW5rKG1heFJlcXVlc3RUaW1lID0gMikgewoJCQlzZWxlY3RMaXN0ID0gdGhpcy5nZXRTZWxlY3RlZExpc3QoKTsKCQkJbGV0IGZpZExpc3QgPSB0aGlzLl9nZXRGaWRMaXN0KCksIHVybCwgcmVzOwoKCQkJaWYgKHB0ID09PSAnaG9tZScgfHwgcHQgPT09ICdtYWluJyB8fCBwdCA9PT0gJ3dhcCcpIHsKCQkJCWlmIChzZWxlY3RMaXN0Lmxlbmd0aCA9PT0gMCkgewoJCQkJCXJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+5YWI5Yu+6YCJ6KaB5LiL6L2955qE5paH5Lu25o2PficpOwoJCQkJfQoJCQkJaWYgKGZpZExpc3QubGVuZ3RoID09PSAyKSB7CgkJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7fmiZPlvIDmlofku7blpLnlkI7lho3li77pgInmlofku7Z+Jyk7CgkJCQl9CgkJCQlmaWRMaXN0ID0gZW5jb2RlVVJJQ29tcG9uZW50KGZpZExpc3QpOwoJCQkJbGV0IGFjY2Vzc1Rva2VuID0gYmFzZS5nZXRTdG9yYWdlKCdhY2Nlc3NUb2tlbicpIHx8IGF3YWl0IHRoaXMuZ2V0VG9rZW4oKTsKCQkJCXVybCA9IGAke3Bhbi5wY3NbMF19JmZzaWRzPSR7ZmlkTGlzdH0mYWNjZXNzX3Rva2VuPSR7YWNjZXNzVG9rZW59YDsKCQkJCXJlcyA9IGF3YWl0IGJhc2UuZ2V0KHVybCwgeyJVc2VyLUFnZW50IjogcGFuLnVhfSk7CgkJCX0KCQkJaWYgKHB0ID09PSAnc2hhcmUnKSB7CgkJCQl0aGlzLmdldFNoYXJlRGF0YSgpOwoJCQkJaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CgkJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7flhYjli77pgInopoHkuIvovb3nmoTmlofku7bmjY9+Jyk7CgkJCQl9CgkJCQlpZiAoZmlkTGlzdC5sZW5ndGggPT09IDIpIHsKCQkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+aJk+W8gOaWh+S7tuWkueWQjuWGjeWLvumAieaWh+S7tn4nKTsKCQkJCX0KCQkJCWlmICghcGFyYW1zLnNpZ24pIHsKCQkJCQlsZXQgdXJsID0gYCR7cGFuLnBjc1syXX0mc3VybD0ke3BhcmFtcy5zdXJsfSZsb2dpZD0ke3BhcmFtcy5sb2dpZH1gOwoJCQkJCWxldCByID0gYXdhaXQgYmFzZS5nZXQodXJsKTsKCQkJCQlpZiAoci5lcnJubyA9PT0gMCkgewoJCQkJCQlwYXJhbXMuc2lnbiA9IHIuZGF0YS5zaWduOwoJCQkJCQlwYXJhbXMudGltZXN0YW1wID0gci5kYXRhLnRpbWVzdGFtcDsKCQkJCQl9IGVsc2UgewoJCQkJCQlsZXQgZGlhbG9nID0gYXdhaXQgU3dhbC5maXJlKHsKCQkJCQkJCXRvYXN0OiB0cnVlLAoJCQkJCQkJaWNvbjogJ2luZm8nLAoJCQkJCQkJdGl0bGU6IGDmj5DnpLrvvJo8YnI+6K+35bCG5paH5Lu2PHNwYW4gY2xhc3M9InRhZy1kYW5nZXIiPlvkv53lrZjliLDnvZHnm5hdPC9zcGFuPuWQjuWGjfCfkYnliY3lvoA8c3BhbiBjbGFzcz0idGFnLWRhbmdlciI+W+aIkeeahOe9keebmF08L3NwYW4+5Lit5LiL6L295ZOmIWAsCgkJCQkJCQlzaG93Q29uZmlybUJ1dHRvbjogdHJ1ZSwKCQkJCQkJCWNvbmZpcm1CdXR0b25UZXh0OiAn54K55Ye75L+d5a2YJywKCQkJCQkJCXBvc2l0aW9uOiAndG9wJywKCQkJCQkJfSk7CgkJCQkJCWlmIChkaWFsb2cuaXNDb25maXJtZWQpIHsKCQkJCQkJCSQoJy50b29scy1zaGFyZS1zYXZlLWhiJylbMF0uY2xpY2soKTsKCQkJCQkJfQoJCQkJCQlyZXR1cm47CgkJCQkJfQoJCQkJfQoJCQkJaWYgKCFwYXJhbXMuYmRzdG9rZW4pIHsKCQkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+WFiOeZu+W9lee9keebmH4nKTsKCQkJCX0KCQkJCWxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwoJCQkJZm9ybURhdGEuYXBwZW5kKCdlbmNyeXB0JywgcGFyYW1zLmVuY3J5cHQpOwoJCQkJZm9ybURhdGEuYXBwZW5kKCdwcm9kdWN0JywgcGFyYW1zLnByb2R1Y3QpOwoJCQkJZm9ybURhdGEuYXBwZW5kKCd1aycsIHBhcmFtcy51ayk7CgkJCQlmb3JtRGF0YS5hcHBlbmQoJ3ByaW1hcnlpZCcsIHBhcmFtcy5wcmltYXJ5aWQpOwoJCQkJZm9ybURhdGEuYXBwZW5kKCdmaWRfbGlzdCcsIGZpZExpc3QpOwoJCQkJZm9ybURhdGEuYXBwZW5kKCdsb2dpZCcsIHBhcmFtcy5sb2dpZCk7CgkJCQlwYXJhbXMuc2hhcmVUeXBlID09PSAnc2VjcmV0JyA/IGZvcm1EYXRhLmFwcGVuZCgnZXh0cmEnLCBwYXJhbXMuZXh0cmEpIDogJyc7CgkJCQl1cmwgPSBgJHtwYW4ucGNzWzFdfSZzaWduPSR7cGFyYW1zLnNpZ259JnRpbWVzdGFtcD0ke3BhcmFtcy50aW1lc3RhbXB9YDsKCQkJCXJlcyA9IGF3YWl0IGJhc2UucG9zdCh1cmwsIGZvcm1EYXRhLCB7IlVzZXItQWdlbnQiOiBwYW4udWF9KTsKCQkJfQoJCQlpZiAocmVzLmVycm5vID09PSAwKSB7CgkJCQlsZXQgaHRtbCA9IHRoaXMuZ2VuZXJhdGVEb20ocmVzLmxpc3QpOwoJCQkJdGhpcy5zaG93TWFpbkRpYWxvZyhwYW5bbW9kZV1bMF0sIGh0bWwsIHBhblttb2RlXVsxXSk7CgkJCX0gZWxzZSBpZiAocmVzLmVycm5vID09PSAxMTIpIHsKCQkJCXJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+6aG16Z2i6L+H5pyf5LqG77yM5Yi35paw6YeN6K+V5LiL5ZCnficpOwoJCQl9IGVsc2UgaWYgKHJlcy5lcnJubyA9PT0gOTAxOSkgewoJCQkJbWF4UmVxdWVzdFRpbWUtLTsKCQkJCWF3YWl0IHRoaXMuZ2V0VG9rZW4oKTsKCQkJCWlmIChtYXhSZXF1ZXN0VGltZSA+IDApIHsKCQkJCQlhd2FpdCB0aGlzLmdldFBDU0xpbmsobWF4UmVxdWVzdFRpbWUpOwoJCQkJfSBlbHNlIHsKCQkJCQltZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+6I635Y+W5LiL6L296ZO+5o6l5aSx6LSl77yM5Yi35paw572R6aG15ZCO5YaN6K+V6K+V5ZCnficpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuiOt+WPluS4i+i9vemTvuaOpeWksei0pe+8jOWIt+aWsOe9kemhteWQjuS4jeihjOeahOivneWGjeivleivlemHjeaWsOeZu+W9lee9keebmOWQp34nKTsKCQkJfQoJCX0sCgoJCWdlbmVyYXRlRG9tKGxpc3QpIHsKCQkJbGV0IGNvbnRlbnQgPSAnPGRpdiBjbGFzcz0icGwtbWFpbiI+JzsKCQkJbGV0IGFsaW5rQWxsVGV4dCA9ICcnOwoJCQliYXNlLnNvcnRCeU5hbWUobGlzdCk7CgkJCWxpc3QuZm9yRWFjaCgodiwgaSkgPT4gewoJCQkJaWYgKHYuaXNkaXIgPT09IDEpIHJldHVybjsKCQkJCWxldCBmaWxlbmFtZSA9IHYuc2VydmVyX2ZpbGVuYW1lIHx8IHYuZmlsZW5hbWU7CgkJCQlsZXQgZXh0ID0gYmFzZS5nZXRFeHRlbnNpb24oZmlsZW5hbWUpOwoJCQkJbGV0IHNpemUgPSBiYXNlLnNpemVGb3JtYXQodi5zaXplKTsKCQkJCWxldCBkbGluayA9IHYuZGxpbms7CgkJCQlpZiAocHQgPT09ICd3YXAnKSB7CgkJCQkJaWYgKG1vZGUgPT09ICdhcGknKSB7CgkJCQkJCWFsaW5rQWxsVGV4dCArPSBkbGluayArICdcclxuJzsKCQkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSBsaXN0ZW5lci1saW5rLWFwaSIgaHJlZj0iJHtkbGlua30iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9IiBkYXRhLXNpemU9IiR7di5zaXplfSIgZGF0YS1pbmRleD0iJHtpfSI+JHtkbGlua308YnI+5LiL6L29ICAke2ZpbGVuYW1lfTwvYT4KCQkJCQkJCQkJPGJ1dHRvbiBjbGFzcz0icGwtaXRlbS1jb3B5IHBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLWNvcHktYWxsIiBocmVmPSIke2RsaW5rfSIgdGl0bGU9IueCueWHu+WkjeWItumTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iPuWkjeWItumTvuaOpTwvYnV0dG9uPgoJCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLXRpcCIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPjxzcGFuPuiLpeayoeacieW8ueWHuklETeS4i+i9veahhu+8jOaJvuWIsElETSA8Yj7pgInpobk8L2I+IC0+IDxiPuaWh+S7tuexu+WeizwvYj4gLT4gPGI+56ys5LiA5Liq5qGGPC9iPiDkuK3mt7vliqDlkI7nvIAgPHNwYW4gY2xhc3M9InBsLWV4dCI+JHtleHR9PC9zcGFuPu+8jDxhIGhyZWY9IiR7cGFuLmlkbX0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0icGwtYSI+6K+m6KeB5q2k5aSEPC9hPjwvc3Bhbj4gPHNwYW4gY2xhc3M9InBsLWJhY2sgbGlzdGVuZXItYmFjayI+6L+U5ZuePC9zcGFuPjwvZGl2PgoJCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLXByb2dyZXNzIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+CgkJCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1wcm9ncmVzcyI+CgkJCQkJCQkJCQkJPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3Mtb3V0ZXIiPjwvZGl2PgoJCQkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLXByb2dyZXNzLWlubmVyIiBzdHlsZT0id2lkdGg6NSUiPgoJCQkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLXByb2dyZXNzLWlubmVyLXRleHQiPuato+WcqOWKoOi9vei/m+W6pi4uLjAlPC9kaXY+CgkJCQkJCQkJCQkJPC9kaXY+CgkJCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQkJCTxzcGFuIGNsYXNzPSJwbC1wcm9ncmVzcy1zdG9wIGxpc3RlbmVyLXN0b3AiPuWPlua2iOS4i+i9vTwvc3Bhbj4KCQkJCQkJCQkJYDsKCQkJCQkJY29udGVudCArPSBgPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLXRpcCIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiID7mnKrlj5HnjrBJRE3vvIzkvb/nlKjoh6rluKbmtY/op4jlmajkuIvovb08L3NwYW4+CgkJCQkJCQkJCTxzcGFuIGNsYXNzPSJwbC1wcm9ncmVzcy1iYWNrIHBsLWJhY2sgbGlzdGVuZXItYmFjayIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPui/lOWbnjwvc3Bhbj4KCQkJCQkJCQkJPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLWhvdyBsaXN0ZW5lci1ob3ciIHN0eWxlPSJkaXNwbGF5OiBub25lIj7lpoLkvZXllKTotbdJRE3vvJ88L3NwYW4+CgkJCQkJCQkJCWAKCQkJCQkJY29udGVudCArPWA8L2Rpdj48L2Rpdj5gCgkJCQkJfQoJCQkJCWlmIChtb2RlID09PSAnYXJpYScpIHsKCQkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQXJpYShkbGluaywgZmlsZW5hbWUsIHBhbi51YSk7CgkJCQkJCWlmICh0eXBlb2YgKGFsaW5rKSA9PT0gJ29iamVjdCcpIHsKCQkJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEiIHRhcmdldD0iX2JsYW5rIiBocmVmPSIke2FsaW5rLmxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2YXJpYTJj6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rLmxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluay50ZXh0KX08YnI+5aSN5Yi2ICR7ZmlsZW5hbWV9IOS4i+i9veWRveS7pOihjDwvYT4gPC9kaXY+YDsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCWFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKCQkJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEgbGlzdGVuZXItbGluay1hcmlhIiBocmVmPSIke2FsaW5rfSIgdGl0bGU9IueCueWHu+WkjeWItmFyaWEyY+mTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08YnI+5aSN5Yi2ICR7ZmlsZW5hbWV9IOS4i+i9veWRveS7pOihjDwvYT4gPC9kaXY+YDsKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZiAobW9kZSA9PT0gJ3JwYycpIHsKCQkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJCTxidXR0b24gY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLXJwYyBwbC1idG4tcHJpbWFyeSBwbC1idG4taW5mbyIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRldmljZSI+PC9lbT48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDVweDsiPuWwhiAke2ZpbGVuYW1lfSDmjqjpgIHliLAgUlBDIOS4i+i9veWZqDwvc3Bhbj48L2J1dHRvbj48L2Rpdj5gOwoJCQkJCX0KCQkJCQlpZiAobW9kZSA9PT0gJ2N1cmwnKSB7CgkJCQkJCWxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0N1cmwoZGxpbmssIGZpbGVuYW1lLCBwYW4udWEpOwoJCQkJCQlpZiAodHlwZW9mIChhbGluaykgPT09ICdvYmplY3QnKSB7CgkJCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIiB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iJHthbGluay5saW5rfSIgdGl0bGU9IueCueWHu+WkjeWItmN1cmzpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmsubGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rLnRleHQpfTxicj7lpI3liLYgJHtmaWxlbmFtZX0g5LiL6L295ZG95Luk6KGMPC9hPiA8L2Rpdj5gOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwoJCQkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2Y3VybOmTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08YnI+5aSN5Yi2ICR7ZmlsZW5hbWV9IOS4i+i9veWRveS7pOihjDwvYT4gPC9kaXY+YDsKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZiAobW9kZSA9PT0gJ2JjJykgewoJCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9CQyhkbGluaywgZmlsZW5hbWUsIHBhbi51YSk7CgkJCQkJCWlmICh0eXBlb2YgKGFsaW5rKSA9PT0gJ29iamVjdCcpIHsKCQkJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rLmxpbmspfSIgdGl0bGU9IueCueWHu+eUqOavlOeJueW9l+aYn+S4i+i9vSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rLnRleHQpfTxicj7kuIvovb0gJHtmaWxlbmFtZX08L2E+IDwvZGl2PmA7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7CgkJCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIiBocmVmPSIke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9IiB0aXRsZT0i54K55Ye755So5q+U54m55b2X5pif5LiL6L29IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTxicj7kuIvovb0gJHtmaWxlbmFtZX08L2E+IDwvZGl2PmA7CgkJCQkJCX0KCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCWlmIChtb2RlID09PSAnYXBpJykgewoJCQkJCQlhbGlua0FsbFRleHQgKz0gZGxpbmsgKyAnXHJcbic7CgkJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEgbGlzdGVuZXItbGluay1hcGkiIGhyZWY9IiR7ZGxpbmt9IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1zaXplPSIke3Yuc2l6ZX0iIGRhdGEtbGluaz0iJHtkbGlua30iIGRhdGEtaW5kZXg9IiR7aX0iPiR7ZGxpbmt9PGJyPuS4i+i9vSAgJHtmaWxlbmFtZX08L2E+CgkJCQkJCQkJPCEtLTxhIGNsYXNzPSJwbC1pdGVtLWNvcHkiIHRhcmdldD0iX2JsYW5rIiBocmVmPSIke2RsaW5rfSIgdGl0bGU9IueCueWHu+S9v+eUqOa1j+iniOWZqOS4i+i9vSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iPuS8oOe7n+S4i+i9vTwvYT4tLT4KCQkJCQkJCQk8YnV0dG9uIGNsYXNzPSJwbC1pdGVtLWNvcHkgcGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGhyZWY9IiR7ZGxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi26ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSI+5aSN5Yi26ZO+5o6lPC9idXR0b24+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS10aXAiIHN0eWxlPSJkaXNwbGF5OiBub25lIj48c3Bhbj7oi6XmsqHmnInlvLnlh7pJRE3kuIvovb3moYbvvIzmib7liLBJRE0gPGI+6YCJ6aG5PC9iPiAtPiA8Yj7mlofku7bnsbvlnos8L2I+IC0+IDxiPuesrOS4gOS4quahhjwvYj4g5Lit5re75Yqg5ZCO57yAIDxzcGFuIGNsYXNzPSJwbC1leHQiPiR7ZXh0fTwvc3Bhbj7vvIw8YSBocmVmPSIke3Bhbi5pZG19IiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9InBsLWEiPuivpuingeatpOWkhDwvYT48L3NwYW4+IDxzcGFuIGNsYXNzPSJwbC1iYWNrIGxpc3RlbmVyLWJhY2siPui/lOWbnjwvc3Bhbj48L2Rpdj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLXByb2dyZXNzIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+CgkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLXByb2dyZXNzIj4KCQkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLXByb2dyZXNzLW91dGVyIj48L2Rpdj4KCQkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLXByb2dyZXNzLWlubmVyIiBzdHlsZT0id2lkdGg6NSUiPgoJCQkJCQkJCQkJPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3MtaW5uZXItdGV4dCI+5q2j5Zyo5Yqg6L296L+b5bqmLi4uMCU8L2Rpdj4KCQkJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQkJPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLXN0b3AgbGlzdGVuZXItc3RvcCI+5Y+W5raI5LiL6L29PC9zcGFuPgoJCQkJCQkJCWA7CgkJCQkJY29udGVudCArPSBgPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLXRpcCIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiID7mnKrlj5HnjrBJRE3vvIzkvb/nlKjoh6rluKbmtY/op4jlmajkuIvovb08L3NwYW4+CgkJCQkJCQkJPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLWJhY2sgcGwtYmFjayBsaXN0ZW5lci1iYWNrIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+6L+U5ZuePC9zcGFuPgoJCQkJCQkJCTxzcGFuIGNsYXNzPSJwbC1wcm9ncmVzcy1ob3cgbGlzdGVuZXItaG93IiBzdHlsZT0iZGlzcGxheTogbm9uZSI+5aaC5L2V5ZSk6LW3SURN77yfPC9zcGFuPgoJCQkJCQkJCWA7CgkJCQkJY29udGVudCArPWA8L2Rpdj48L2Rpdj5gCgkJCQl9CgkJCQkJaWYgKG1vZGUgPT09ICdhcmlhJykgewoJCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9BcmlhKGRsaW5rLCBmaWxlbmFtZSwgcGFuLnVhKTsKCQkJCQkJaWYgKHR5cGVvZiAoYWxpbmspID09PSAnb2JqZWN0JykgewoJCQkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSIgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IiR7YWxpbmsubGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmsubGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rLnRleHQpfTxicj7lpI3liLYgJHtmaWxlbmFtZX0g5LiL6L295ZG95Luk6KGMPC9hPiA8L2Rpdj5gOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKCQkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgcGwtYSBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2YXJpYTJj6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTxicj7lpI3liLYgJHtmaWxlbmFtZX0g5LiL6L295ZG95Luk6KGMPC9hPiA8L2Rpdj5gOwoJCQkJCX0KCQkJCX0KCQkJCQlpZiAobW9kZSA9PT0gJ3JwYycpIHsKCQkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxidXR0b24gY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLXJwYyBwbC1idG4tcHJpbWFyeSBwbC1idG4taW5mbyIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRldmljZSI+PC9lbT48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDVweDsiPuWwhiAke2ZpbGVuYW1lfSDmjqjpgIHliLAgUlBDIOS4i+i9veWZqDwvc3Bhbj48L2J1dHRvbj48L2Rpdj5gOwoJCQkJfQoJCQkJCWlmIChtb2RlID09PSAnY3VybCcpIHsKCQkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQ3VybChkbGluaywgZmlsZW5hbWUsIHBhbi51YSk7CgkJCQkJCWlmICh0eXBlb2YgKGFsaW5rKSA9PT0gJ29iamVjdCcpIHsKCQkJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEiIHRhcmdldD0iX2JsYW5rIiBocmVmPSIke2FsaW5rLmxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2Y3VybOmTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGluay5saW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmsudGV4dCl9PGJyPuWkjeWItiAke2ZpbGVuYW1lfSDkuIvovb3lkb3ku6TooYw8L2E+IDwvZGl2PmA7CgkJCQkJfSBlbHNlIHsKCQkJCQkJYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwoJCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZjdXJs6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTxicj7lpI3liLYgJHtmaWxlbmFtZX0g5LiL6L295ZG95Luk6KGMPC9hPiA8L2Rpdj5gOwoJCQkJCX0KCQkJCX0KCQkJCQlpZiAobW9kZSA9PT0gJ2JjJykgewoJCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9CQyhkbGluaywgZmlsZW5hbWUsIHBhbi51YSk7CgkJCQkJCWlmICh0eXBlb2YgKGFsaW5rKSA9PT0gJ29iamVjdCcpIHsKCQkJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIHBsLWEiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rLmxpbmspfSIgdGl0bGU9IueCueWHu+eUqOavlOeJueW9l+aYn+S4i+i9vSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rLnRleHQpfTxicj7kuIvovb0gJHtmaWxlbmFtZX08L2E+IDwvZGl2PmA7CgkJCQkJfSBlbHNlIHsKCQkJCQkJYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwoJCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIiBocmVmPSIke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9IiB0aXRsZT0i54K55Ye755So5q+U54m55b2X5pif5LiL6L29IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTxicj7kuIvovb0gJHtmaWxlbmFtZX08L2E+IDwvZGl2PmA7CgkJCQkJfQoJCQkJfQoJCQkJfQoJCQl9KTsKCgkJCWNvbnRlbnQgKz0gJzwvZGl2Pic7CgoJCQlpZiAobW9kZSA9PT0gJ2FwaScpCgkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItZG93bmxvYWQtYWxsIj7kuIvovb3lhajpg6jpk77mjqU8L2J1dHRvbj48L2Rpdj5gOwoJCQlpZiAobW9kZSA9PT0gJ2FyaWEnKQoJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLWNvcHktYWxsIiBkYXRhLWxpbms9IiR7YWxpbmtBbGxUZXh0fSI+5aSN5Yi25YWo6YOo5ZG95Luk6KGMPC9idXR0b24+PC9kaXY+YDsKCQkJaWYgKG1vZGUgPT09ICdycGMnKSB7CgkJCQlsZXQgcnBjID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJykgKyAnOicgKyBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JykgKyBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyk7CgkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItc2VuZC1ycGMiPuWPkemAgeWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gdGl0bGU9IiR7cnBjfSIgY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4Ij7orr7nva4gUlBDIOWPguaVsO+8iOW9k+WJjeS4uu+8miR7cnBjfe+8iTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi1zdWNjZXNzIGxpc3RlbmVyLXJwYy10YXNrIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHg7ZGlzcGxheTogbm9uZSI+5p+l55yL5LiL6L295Lu75YqhPC9idXR0b24+PC9kaXY+YDsKCQkJfQoJCQlpZiAobW9kZSA9PT0gJ2N1cmwnKSB7CgkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDsiPuiuvue9rue7iOerr+exu+Wei++8iOW9k+WJjeS4uu+8miR7dGVybWluYWxUeXBlW2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpXX3vvIk8L2J1dHRvbj48L2Rpdj5gO30KCQkJcmV0dXJuIGNvbnRlbnQ7CgkJfSwKCgkJYXN5bmMgc2VuZExpbmtUb1JQQyhmaWxlbmFtZSwgbGluaykgewoJCQlsZXQgcnBjID0gewoJCQkJZG9tYWluOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSwKCQkJCXBvcnQ6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKCQkJCXBhdGg6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKSwKCQkJCXRva2VuOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpLAoJCQkJZGlyOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kaXInKSwKCQkJfTsKCQkJbGV0IEJEVVNTID0gdGhpcy5nZXRCRFVTUygpOwoJCQlpZiAoIUJEVVNTKSByZXR1cm4gJ2Fzc2lzdGFudCc7CgoJCQlsZXQgdXJsID0gYCR7cnBjLmRvbWFpbn06JHtycGMucG9ydH0ke3JwYy5wYXRofWA7CgkJCWxldCBycGNEYXRhID0gewoJCQkJaWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAoJCQkJanNvbnJwYzogJzIuMCcsCgkJCQltZXRob2Q6ICdhcmlhMi5hZGRVcmknLAoJCQkJcGFyYW1zOiBbYHRva2VuOiR7cnBjLnRva2VufWAsIFtsaW5rXSwgewoJCQkJCWRpcjogcnBjLmRpciwKCQkJCQlvdXQ6IGZpbGVuYW1lLAoJCQkJCWhlYWRlcjogW2BVc2VyLUFnZW50OiAke3Bhbi51YX1gLCBgQ29va2llOiBCRFVTUz0ke0JEVVNTfWBdCgkJCQl9XQoJCQl9OwoJCQl0cnkgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdCh1cmwsIHJwY0RhdGEsIHsiVXNlci1BZ2VudCI6IHBhbi51YX0sICcnKTsKCQkJCWlmIChyZXMucmVzdWx0KSByZXR1cm4gJ3N1Y2Nlc3MnOwoJCQkJcmV0dXJuICdmYWlsJzsKCQkJfSBjYXRjaCAoZSkgewoJCQkJcmV0dXJuICdmYWlsJzsKCQkJfQoJCX0sCgoJCWdldFNlbGVjdGVkTGlzdCgpIHsKCQkJdHJ5IHsKCQkJCXZhciBMaXN0ID0gcmVxdWlyZSgic3lzdGVtLWNvcmU6Y29udGV4dC9jb250ZXh0LmpzIikuaW5zdGFuY2VGb3JTeXN0ZW0ubGlzdDsKCQkJCXZhciBzZWxlY3RMaXN0ID0gTGlzdC5nZXRTZWxlY3RlZCgpOwoJCQkJaWYgKCFzZWxlY3RMaXN0Lmxlbmd0aCkgewoJCQkJCXNlbGVjdExpc3QgPSBMaXN0LmdldEN1cnJlbnRMaXN0KCk7CgkJCQl9CgkJCQlyZXR1cm4gc2VsZWN0TGlzdDsKCQkJfSBjYXRjaCAoZSkgewoJCQkJdmFyIGxpc3QxID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndwLXMtY29yZS1wYW4nKTsKCQkJCWlmIChsaXN0MSAmJiBsaXN0MS5fX3Z1ZV9fKSB7CgkJCQkJcmV0dXJuIGxpc3QxLl9fdnVlX18uc2VsZWN0ZWRMaXN0OwoJCQkJfSBlbHNlIHsKCQkJCQl2YXIgbGlzdDIgPSAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZmlsZS1saXN0IilbMF07CgkJCQkJcmV0dXJuIGxpc3QyLl9fdnVlX18uYWxsRmlsZUxpc3QuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiAhIWl0ZW0uc2VsZWN0ZWQ7IH0pOwoJCQkJfQoJCQl9CgkJfSwKCgkJZ2V0TG9naWQoKSB7CgkJCWxldCB1dCA9IHJlcXVpcmUoInN5c3RlbS1jb3JlOmNvbnRleHQvY29udGV4dC5qcyIpLmluc3RhbmNlRm9yU3lzdGVtLnRvb2xzLmJhc2VTZXJ2aWNlOwoJCQlyZXR1cm4gdXQuYmFzZTY0RW5jb2RlKGJhc2UuZ2V0Q29va2llKCJCQUlEVUlEIikpOwoJCX0sCgoJCWdldFNoYXJlRGF0YSgpIHsKCQkJbGV0IHJlcyA9IGxvY2Fscy5kdW1wKCk7CgkJCXBhcmFtcy5zaGFyZVR5cGUgPSAnc2VjcmV0JzsKCQkJcGFyYW1zLnNpZ24gPSAnJzsKCQkJcGFyYW1zLnRpbWVzdGFtcCA9ICcnOwoJCQlwYXJhbXMuYmRzdG9rZW4gPSByZXMuYmRzdG9rZW4udmFsdWU7CgkJCXBhcmFtcy5jaGFubmVsID0gJ2NodW5sZWknOwoJCQlwYXJhbXMuY2xpZW50dHlwZSA9IDA7CgkJCXBhcmFtcy53ZWIgPSAxOwoJCQlwYXJhbXMuYXBwX2lkID0gMjUwNTI4OwoJCQlwYXJhbXMuZW5jcnlwdCA9IDA7CgkJCXBhcmFtcy5wcm9kdWN0ID0gJ3NoYXJlJzsKCQkJcGFyYW1zLmxvZ2lkID0gdGhpcy5nZXRMb2dpZCgpOwoJCQlwYXJhbXMucHJpbWFyeWlkID0gcmVzLnNoYXJlaWQudmFsdWU7CgkJCXBhcmFtcy51ayA9IHJlcy5zaGFyZV91ay52YWx1ZTsKCQkJcGFyYW1zLnNoYXJlVHlwZSA9PT0gJ3NlY3JldCcgJiYgKHBhcmFtcy5leHRyYSA9IHRoaXMuX2dldEV4dHJhKCkpOwoJCQlwYXJhbXMuc3VybCA9IHRoaXMuX2dldFN1cmwoKTsKCQl9LAoKCQlkZXRlY3RQYWdlKCkgewoJCQlsZXQgcGF0aCA9IGxvY2F0aW9uLnBhdGhuYW1lOwoJCQlpZiAoL15cL2Rpc2tcL2hvbWUvLnRlc3QocGF0aCkpIHJldHVybiAnaG9tZSc7CgkJCWlmICgvXlwvZGlza1wvbWFpbi8udGVzdChwYXRoKSkgcmV0dXJuICdtYWluJzsKCQkJaWYgKC9eXC93YXBcL2hvbWUvLnRlc3QocGF0aCkpIHJldHVybiAnd2FwJzsKCQkJaWYgKC9eXC8oc3xzaGFyZSlcLy8udGVzdChwYXRoKSkgcmV0dXJuICdzaGFyZSc7CgkJCXJldHVybiAnJzsKCQkJcmV0dXJuICcnOwoJCX0sCgoJCXNob3dNYWluRGlhbG9nKHRpdGxlLCBodG1sLCBmb290ZXIpIHsKCQkJU3dhbC5maXJlKHsKCQkJCXRpdGxlLAoJCQkJaHRtbCwKCQkJCWZvb3RlciwKCQkJCWFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKCQkJCXNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCgkJCQlwb3NpdGlvbjogJ2NlbnRlcicsLy90b3AKCQkJCXdpZHRoLAoJCQkJcGFkZGluZzogJzE1cHggMjBweCA1cHgnLAoJCQkJY3VzdG9tQ2xhc3MsCgkJCQljb25maXJtQnV0dG9uVGV4dDogJ+WFs+mXrScsCgkJCX0pLnRoZW4oKCkgPT4gewoJCQkJdGhpcy5fcmVzZXREYXRhKCk7CgkJCX0pOwoJCX0sCgoJCWFzeW5jIGluaXRQYW5MaW5rZXIoKSB7CgkJCXB0ID0gdGhpcy5kZXRlY3RQYWdlKCk7CgkJCWJhc2UuY3JlYXRlVGlwKCk7CgkJCWJhc2UucmVnaXN0ZXJNZW51Q29tbWFuZCgpOwoJCQlpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAndjEnKSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KGBodHRwczovL2FwaS55b3V4aWFvaG91LmNvbS9jb25maWcvP3Zlcj0ke3ZlcnNpb259JmE9JHthdXRob3J9YCwge30sIHt9LCAndGV4dCcpOwoJCQkJcGFuID0gSlNPTi5wYXJzZShiYXNlLmRlY29kZShyZXMpKTsKCQkJfSBlbHNlIGlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICd2MicpIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QoYGh0dHBzOi8vYXBpLnlvdXhpYW9ob3UuY29tL2NvbmZpZy92Mi8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gIm5vIikgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KGBodHRwczovL2djb3JlLmpzZGVsaXZyLm5ldC9naC9obWp6MTAwL09ubGluZS1kaXNrLWRpcmVjdC1saW5rLWRvd25sb2FkLWFzc2lzdGFudEBtYWluL2NvbmZpZy9jb25maWcuanNvbmAsIHt9LCAidGV4dCIsIHt9KTsKCQkJCXBhbiA9IEpTT04ucGFyc2UocmVzKTsKCQkJfSBlbHNlIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLmdldChgaHR0cHM6Ly9nY29yZS5qc2RlbGl2ci5uZXQvZ2gvaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnRAbWFpbi9jb25maWcvY29uZmlnLmpzb25gLCB7fSwgInRleHQiLCB7fSk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKHJlcyk7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJywgJ3YyJyk7CgkJCX0KCQkJT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKHBhbik7CgkJCXBhbi5udW0gPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJykgfHwgcGFuLmxpY2Vuc2UgPT09IGJhc2UuZ2V0VmFsdWUoJ2xpY2Vuc2UnKSA/IHRoaXMuYWRkQnV0dG9uKCkgOiB0aGlzLmFkZEluaXRCdXR0b24oKTsKCQl9Cgl9OwoKCS8v6Zi/6YeM5LqR55uYCglsZXQgYWxpID0gewoKCQljb252ZXJ0TGlua1RvQXJpYShsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYXJpYTJjICIke2xpbmt9IiAtLW91dCAiJHtmaWxlbmFtZX0iIC0taGVhZGVyICJSZWZlcmVyOiBodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vImApOwoJCX0sCgoJCWNvbnZlcnRMaW5rVG9CQyhsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJbGV0IGJjID0gYEFBLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVuYW1lKX0vP3VybD0ke2VuY29kZVVSSUNvbXBvbmVudChsaW5rKX0mcmVmZXI9JHtlbmNvZGVVUklDb21wb25lbnQoJ2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS8nKX1aWmA7CgkJCXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYGJjOi8vaHR0cC8ke2Jhc2UuZW5jb2RlKGJjKX1gKTsKCQl9LAoKCQljb252ZXJ0TGlua1RvQ3VybChsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJbGV0IHRlcm1pbmFsID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyk7CgkJCWZpbGVuYW1lID0gYmFzZS5maXhGaWxlbmFtZShmaWxlbmFtZSk7CgkJCXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYCR7dGVybWluYWwgIT09ICd3cCcgPyAnY3VybCcgOiAnY3VybC5leGUnfSAtTCAtQyAtICIke2xpbmt9IiAtbyAiJHtmaWxlbmFtZX0iIC1lICJodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vImApOwoJCX0sCgoJCWFkZFBhZ2VMaXN0ZW5lcigpIHsKCQkJZnVuY3Rpb24gX2ZhY3RvcnkoZSkgewoJCQkJbGV0IHRhcmdldCA9ICQoZS50YXJnZXQpOwoJCQkJbGV0IGl0ZW0gPSB0YXJnZXQucGFyZW50cygnLnBsLWl0ZW0nKTsKCQkJCWxldCBsaW5rID0gaXRlbS5maW5kKCcucGwtaXRlbS1saW5rJyk7CgkJCQlsZXQgcHJvZ3Jlc3MgPSBpdGVtLmZpbmQoJy5wbC1pdGVtLXByb2dyZXNzJyk7CgkJCQlsZXQgdGlwID0gaXRlbS5maW5kKCcucGwtaXRlbS10aXAnKTsKCQkJCWxldCBjb3B5ID0gaXRlbS5maW5kKCcucGwtaXRlbS1jb3B5Jyk7CgkJCQlsZXQgaG93aWRtID0gaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3MtaG93Jyk7CgkJCQlsZXQgYmFjayA9IGl0ZW0uZmluZCgnLnBsLXByb2dyZXNzLWJhY2snKTsKCQkJCWxldCBzdG9wID0gaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3Mtc3RvcCcpOwoJCQkJcmV0dXJuIHsKCQkJCQlpdGVtLCBsaW5rLCBwcm9ncmVzcywgdGlwLCBjb3B5LCBob3dpZG0sIGJhY2ssIHN0b3AsIHRhcmdldCwKCQkJCX07CgkJCX0KCgkJCWZ1bmN0aW9uIF9yZXNldChpKSB7CgkJCQlpbnNbaV0gJiYgY2xlYXJJbnRlcnZhbChpbnNbaV0pOwoJCQkJcmVxdWVzdFtpXSAmJiByZXF1ZXN0W2ldLmFib3J0KCk7CgkJCQlwcm9ncmVzc1tpXSA9IDA7CgkJCQlpZG1baV0gPSBmYWxzZTsKCQkJfQoJCQlkb2Mub24oJ2NsaWNrJywgJy5wbC1idXR0b24tbW9kZScsIChlKSA9PiB7CgkJCQltb2RlID0gZS50YXJnZXQuZGF0YXNldC5tb2RlOwoJCQkJU3dhbC5maXJlKHsKCQkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCQlzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKCQkJCQlzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsCgkJCQkJaHRtbDogYOmTvuaOpeiOt+WPluS4rWAsCgkJCQkJd2lsbE9wZW46IGZ1bmN0aW9uKCkgewoJCQkJCQlTd2FsLnNob3dMb2FkaW5nKCk7CgkJCQkJfQoJCQkJfSk7CgkJCQl0aGlzLmdldFBDU0xpbmsoKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstYXBpJywgYXN5bmMgKGUpID0+IHsKCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCWxldCBvID0gX2ZhY3RvcnkoZSk7CgkJCQlsZXQgJHdpZHRoID0gby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1pbm5lcicpOwoJCQkJbGV0ICR0ZXh0ID0gby5pdGVtLmZpbmQoJy5wbC1wcm9ncmVzcy1pbm5lci10ZXh0Jyk7CgkJCQlsZXQgZmlsZW5hbWUgPSBvLmxpbmtbMF0uZGF0YXNldC5maWxlbmFtZTsKCQkJCWxldCBpbmRleCA9IG8ubGlua1swXS5kYXRhc2V0LmluZGV4OwoJCQkJX3Jlc2V0KGluZGV4KTsKCQkJCWxldCBkYXRhc2V0ID0gZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQ7CgkJCQlsZXQgaHJlZiA9IGRhdGFzZXQubGluazsKCQkJCWxldCB1cmwgPSBhd2FpdCB0aGlzLmdldFJlYWxMaW5rKGRhdGFzZXQuZGlkLCBkYXRhc2V0LmZpZCk7CgkJCQlpZiAodXJsKSBocmVmID0gdXJsOwoJCQkJYmFzZS5nZXQoaHJlZiwgeyJVc2VyLUFnZW50IjogcGFuLnVhLCAiUmVmZXJlciI6ICJodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vIn0sICdibG9iJywge2ZpbGVuYW1lLCBpbmRleH0pOwoJCQkJbGV0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7IC8vIOiusOW9leS4i+i9veW8gOWni+aXtumXtAoJCQkJbGV0IHByZXZMb2FkZWQgPSAwOyAvLyDkuIrkuIDmrKHnmoTlt7LkuIvovb3mlbDmja7ph48KCQkJCWxldCBwcmV2VGltZSA9IHN0YXJ0VGltZTsgLy8g5LiK5LiA5qyh55qE5pe26Ze0CgkJCQlsZXQgc2l6ZSA9IE51bWJlcihvLmxpbmtbMF0uZGF0YXNldC5zaXplKTsKCQkJCWluc1tpbmRleF0gPSBzZXRJbnRlcnZhbCgoKSA9PiB7CgkJCQkJbGV0IHByb2cgPSArcHJvZ3Jlc3NbaW5kZXhdIHx8IDA7CgkJCQkJLy8g5aSE55CG5pmu6YCa5LiL6L2955qE5oOF5Ya1Li4uCgkJCQkJbGV0IGN1cnJlbnRUaW1lID0gRGF0ZS5ub3coKTsKCQkJCQlsZXQgZWxhcHNlZFRpbWUgPSBjdXJyZW50VGltZSAtIHN0YXJ0VGltZTsKCQkJCQlsZXQgdG90YWxQcm9ncmVzcyA9IHByb2cgLyAxMDA7CgkJCQkJbGV0IHRvdGFsRWxhcHNlZFNlY29uZHMgPSBlbGFwc2VkVGltZSAvIDEwMDA7CgkJCQkJbGV0IGVzdGltYXRlZFRvdGFsVGltZVNlY29uZHMgPSB0b3RhbEVsYXBzZWRTZWNvbmRzIC8gdG90YWxQcm9ncmVzczsKCQkJCQlsZXQgcmVtYWluaW5nVGltZVNlY29uZHMgPSBlc3RpbWF0ZWRUb3RhbFRpbWVTZWNvbmRzIC0gdG90YWxFbGFwc2VkU2Vjb25kczsKCgkJCQkJLy8g5bCG5Ymp5L2Z5pe26Ze06L2s5o2i5Li65aSp44CB5pe244CB5YiG44CB56eSCgkJCQkJbGV0IHJlbWFpbmluZ0RheXMgPSBNYXRoLmZsb29yKHJlbWFpbmluZ1RpbWVTZWNvbmRzIC8gKDYwICogNjAgKiAyNCkpOwoJCQkJCXJlbWFpbmluZ1RpbWVTZWNvbmRzICU9ICg2MCAqIDYwICogMjQpOwoKCQkJCQlsZXQgcmVtYWluaW5nSG91cnMgPSBNYXRoLmZsb29yKHJlbWFpbmluZ1RpbWVTZWNvbmRzIC8gKDYwICogNjApKTsKCQkJCQlyZW1haW5pbmdUaW1lU2Vjb25kcyAlPSAoNjAgKiA2MCk7CgoJCQkJCWxldCByZW1haW5pbmdNaW51dGVzID0gTWF0aC5mbG9vcihyZW1haW5pbmdUaW1lU2Vjb25kcyAvIDYwKTsKCQkJCQlsZXQgcmVtYWluaW5nU2Vjb25kcyA9IE1hdGguZmxvb3IocmVtYWluaW5nVGltZVNlY29uZHMgJSA2MCk7CgoJCQkJCS8vIOiuoeeul+S4i+i9vemAn+W6pgoJCQkJCWxldCBsb2FkZWQgPSBwcm9nICogc2l6ZSAvIDEwMDsgLy8g5bey5LiL6L295pWw5o2u6YePCgkJCQkJbGV0IGN1cnJlbnRUaW1lRGlmZiA9IGN1cnJlbnRUaW1lIC0gcHJldlRpbWU7IC8vIOW9k+WJjeaXtumXtOS4juS4iuS4gOasoeaXtumXtOeahOW3ruWAvAoJCQkJCWxldCBsb2FkZWREaWZmID0gbG9hZGVkIC0gcHJldkxvYWRlZDsgLy8g5b2T5YmN5bey5LiL6L295pWw5o2u6YeP5LiO5LiK5LiA5qyh55qE5beu5YC8CgkJCQkJbGV0IGRvd25sb2FkU3BlZWQgPSAoY3VycmVudFRpbWVEaWZmICE9PSAwKSA/IGxvYWRlZERpZmYgLyAoY3VycmVudFRpbWVEaWZmIC8gMTAwMCkgOiAwOyAvLyDkuIvovb3pgJ/luqbvvIjljZXkvY3vvJrlrZfoioIv56eS77yJCgoJCQkJCS8vIOabtOaWsOS4iuS4gOasoeeahOaVsOaNrgoJCQkJCXByZXZMb2FkZWQgPSBsb2FkZWQ7CgkJCQkJcHJldlRpbWUgPSBjdXJyZW50VGltZTsKCgkJCQkJLy8g5pu05pS555WM6Z2iCgkJCQkJby5saW5rLmhpZGUoKTsKCQkJCQlvLnRpcC5oaWRlKCk7CgkJCQkJby5zdG9wLnNob3coKTsKCQkJCQlvLmNvcHkuaGlkZSgpOwoJCQkJCW8ucHJvZ3Jlc3Muc2hvdygpOwoKCQkJCQkvLyDmm7TmlrDov5vluqbmnaEKCQkJCQkkd2lkdGguY3NzKCd3aWR0aCcsIHByb2cgKyAnJScpOwoKCQkJCQkvLyDmm7TmlrDov5vluqbmnaHmlofmnKwKCQkJCQlsZXQgdGltZVRleHQgPSAnJzsKCQkJCQlpZiAoTnVtYmVyLmlzRmluaXRlKHJlbWFpbmluZ0RheXMpICYmIHJlbWFpbmluZ0RheXMgPiAwKSB7CgkJCQkJCXRpbWVUZXh0ID0gcmVtYWluaW5nRGF5cyArICflpKkgJyArIGJhc2UucmVwYWlyVGltZXIocmVtYWluaW5nSG91cnMpICsgJ+aXtjonICsgYmFzZS5yZXBhaXJUaW1lcihyZW1haW5pbmdNaW51dGVzKSArICfliIY6JyArIGJhc2UucmVwYWlyVGltZXIocmVtYWluaW5nU2Vjb25kcykgKyAn56eSJzsKCQkJCQl9IGVsc2UgaWYgKE51bWJlci5pc0Zpbml0ZShyZW1haW5pbmdIb3VycykgJiYgcmVtYWluaW5nSG91cnMgPiAwKSB7CgkJCQkJCXRpbWVUZXh0ID0gYmFzZS5yZXBhaXJUaW1lcihyZW1haW5pbmdIb3VycykgKyAn5pe2OicgKyBiYXNlLnJlcGFpclRpbWVyKHJlbWFpbmluZ01pbnV0ZXMpICsgJ+WIhjonICsgYmFzZS5yZXBhaXJUaW1lcihyZW1haW5pbmdTZWNvbmRzKSArICfnp5InOwoJCQkJCX0gZWxzZSBpZiAoTnVtYmVyLmlzRmluaXRlKHJlbWFpbmluZ01pbnV0ZXMpICYmIHJlbWFpbmluZ01pbnV0ZXMgPiAwKSB7CgkJCQkJCXRpbWVUZXh0ID0gYmFzZS5yZXBhaXJUaW1lcihyZW1haW5pbmdNaW51dGVzKSArICfliIY6JyArIGJhc2UucmVwYWlyVGltZXIocmVtYWluaW5nU2Vjb25kcykgKyAn56eSJzsKCQkJCQl9IGVsc2UgaWYgKE51bWJlci5pc0Zpbml0ZShyZW1haW5pbmdTZWNvbmRzKSAmJiByZW1haW5pbmdTZWNvbmRzID4gMCkgewoJCQkJCQl0aW1lVGV4dCA9IHJlbWFpbmluZ1NlY29uZHMgKyAn56eSJzsKCQkJCQl9IGVsc2UgaWYgKE51bWJlci5pc0Zpbml0ZShyZW1haW5pbmdTZWNvbmRzKSAmJiByZW1haW5pbmdTZWNvbmRzID09PSAwKSB7CgkJCQkJCXRpbWVUZXh0ID0gJ+WNs+WwhuWujOaIkCc7CgkJCQkJfSBlbHNlIHsKCQkJCQkJdGltZVRleHQgPSAn6K6h566X5LitLi4uJzsKCQkJCQl9CgoJCQkJCWxldCBzcGVlZFRleHQgPScnOwoJCQkJCXNwZWVkVGV4dCA9IGJhc2Uuc2l6ZUZvcm1hdChkb3dubG9hZFNwZWVkKQoKCQkJCQkkdGV4dC50ZXh0KHByb2cgKyAnJSB8IOWJqeS9meaXtumXtO+8micgKyB0aW1lVGV4dCArICcgfCDpgJ/luqbvvJonICsgc3BlZWRUZXh0ICsgJy/np5InKTsKCgkJCQkJaWYgKHByb2cgPT09IDEwMCkgewoJCQkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uICgpewoJCQkJCQkJY2xlYXJJbnRlcnZhbChpbnNbaW5kZXhdKTsKCQkJCQkJCXByb2dyZXNzW2luZGV4XSA9IDA7CgkJCQkJCQlvLml0ZW0uZmluZCgnLnBsLXByb2dyZXNzLXN0b3AnKS5oaWRlKCk7CgkJCQkJCQlvLmhvd2lkbS5oaWRlKCk7CgkJCQkJCQkkdGV4dC50ZXh0KCfkuIvovb3lrozmiJDkuoYh5rWP6KeI5Zmo5LiL6L295qGG5bqU6K+l5by55Ye65p2l5LqG5ZOmficpOwoJCQkJCQkJby5iYWNrLnNob3coKQoJCQkJCQkJc2V0VGltZW91dChmdW5jdGlvbiAoKXsKCQkJCQkJCQlvLmxpbmsudGV4dCgn6YeN5paw5LiL6L29JykuYW5pbWF0ZSh7b3BhY2l0eTogJzEnfSwgInNsb3ciKTsKCQkJCQkJCX0sMzAwMCkKCQkJCQkJfSwzMDAwKQoJCQkJCX0KCQkJCX0sIDUwMCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1yZXRyeScsIGFzeW5jIChlKSA9PiB7CgkJCQlsZXQgbyA9IF9mYWN0b3J5KGUpOwoJCQkJby50aXAuaGlkZSgpOwoJCQkJby5saW5rLnNob3coKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWhvdycsIGFzeW5jIChlKSA9PiB7CgkJCQlsZXQgbyA9IF9mYWN0b3J5KGUpOwoJCQkJbGV0IGluZGV4ID0gby5saW5rWzBdLmRhdGFzZXQuaW5kZXg7CgkJCQlpZiAocmVxdWVzdFtpbmRleF0pIHsKCQkJCQlyZXF1ZXN0W2luZGV4XS5hYm9ydCgpOwoJCQkJCWNsZWFySW50ZXJ2YWwoaW5zW2luZGV4XSk7CgkJCQkJby5wcm9ncmVzcy5oaWRlKCk7CgkJCQkJby50aXAuc2hvdygpOwoJCQkJfQoKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXN0b3AnLCBhc3luYyAoZSkgPT4gewoJCQkJbGV0IG8gPSBfZmFjdG9yeShlKTsKCQkJCWxldCBpbmRleCA9IG8ubGlua1swXS5kYXRhc2V0LmluZGV4OwoJCQkJaWYgKHJlcXVlc3RbaW5kZXhdKSB7CgkJCQkJcmVxdWVzdFtpbmRleF0uYWJvcnQoKTsKCQkJCQljbGVhckludGVydmFsKGluc1tpbmRleF0pOwoJCQkJCW8uaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3MtaW5uZXItdGV4dCcpLnRleHQoJ+ato+WcqOWPlua2iC4uLicpOwoJCQkJCW8uaXRlbS5maW5kKCcucGwtcHJvZ3Jlc3MtaW5uZXInKS5jc3MoJ3dpZHRoJywgMTAwICsgJyUnKTsKCQkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgkJCQkJCW8udGlwLmhpZGUoKTsKCQkJCQkJby5iYWNrLmhpZGUoKTsKCQkJCQkJby5saW5rLnNob3coMCk7CgkJCQkJCW8uY29weS5zaG93KCk7CgkJCQkJCW8ucHJvZ3Jlc3MuaGlkZSgpOwoJCQkJCQlvLnN0b3AuaGlkZSgpOwoJCQkJCX0sMTA1MCkKCQkJCX0KCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWJhY2snLCBhc3luYyAoZSkgPT4gewoJCQkJbGV0IG8gPSBfZmFjdG9yeShlKTsKCQkJCW8ucHJvZ3Jlc3MuaGlkZSgpOwoJCQkJby50aXAuaGlkZSgpOwoJCQkJby5saW5rLnNob3coKTsKCQkJCW8uY29weS5zaG93KCk7CgkJCQlvLnN0b3AuaGlkZSgpOwoJCQkJby5iYWNrLmhpZGUoKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstYXBpLWJ0bicsIGFzeW5jIChlKSA9PiB7CgkJCQliYXNlLnNldENsaXBib2FyZChlLnRhcmdldC5kYXRhc2V0LmZpbGVuYW1lKTsKCQkJCSQoZS50YXJnZXQpLnRleHQoJ+WkjeWItuaIkOWKnycpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCXNldFRpbWVvdXQoCgkJCQkJZnVuY3Rpb24gKCl7CgkJCQkJCSQoZS50YXJnZXQpLnRleHQoJ+mHjeaWsOWkjeWIticpLmFuaW1hdGUoe29wYWNpdHk6ICcxJ30sICJzbG93Iik7CgkJCQkJfSwyMDAwCgkJCQkpCgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFsbCcsIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQliYXNlLnNldENsaXBib2FyZChkZWNvZGVVUklDb21wb25lbnQoZS50YXJnZXQuZGF0YXNldC5saW5rKSk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflpI3liLbmiJDlip8nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCQlzZXRUaW1lb3V0KAoJCQkJCWZ1bmN0aW9uICgpewoJCQkJCQkkKGUudGFyZ2V0KS50ZXh0KCfph43mlrDlpI3liLYnKS5hbmltYXRlKHtvcGFjaXR5OiAnMSd9LCAic2xvdyIpOwoJCQkJCX0sMjAwMAoJCQkJKQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJbGV0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTsgCgoJCQkJdGFyZ2V0LmZpbmQoJy5pY29uJykucmVtb3ZlKCk7CgkJCQl0YXJnZXQuZmluZCgnLnBsLWxvYWRpbmcnKS5yZW1vdmUoKTsKCQkJCXRhcmdldC5wcmVwZW5kKGJhc2UuY3JlYXRlTG9hZGluZygpKTsKCgkJCQlsZXQgcmVzID0gYXdhaXQgdGhpcy5zZW5kTGlua1RvUlBDKGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmZpbGVuYW1lLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKCQkJCWlmIChyZXMgPT09ICdzdWNjZXNzJykgewoJCQkJCSQoJy5saXN0ZW5lci1ycGMtdGFzaycpLnNob3coKTsKCQkJCQl0YXJnZXQucmVtb3ZlQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKCflj5HpgIHmiJDlip/kuoYh5b+r5Y6755yL55yL5ZCnficpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0gZWxzZSBpZiAocmVzID09PSAnYXNzaXN0YW50JykgewoJCQkJCXRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoYCR7cGFuLmluaXRbNV198J+RiTxhIGhyZWY9IiR7cGFuLmFzc2lzdGFudH0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0icGwtYSI+54K55Ye75q2k5aSE5a6J6KOFPC9hPvCfkYhgKTsKCQkJCX0gZWxzZSB7CgkJCQkJdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykudGV4dCgn5Y+R6YCB5aSx6LSl77yM5qOA5p+l5LiA5LiL5oKo55qEUlBD6YWN572u5L+h5oGv5ZOmIScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0KCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsKCQkJCSQoJy5saXN0ZW5lci1saW5rLXJwYycpLmNsaWNrKCk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflj5HpgIHlrozmiJDvvIzlj5HpgIHnu5Pmnpzop4HkuIrmlrnmjInpkq7lk6Z+JykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItZG93bmxvYWQtYWxsJywgKGUpID0+IHsKCQkJCSQoJy5wbC1pdGVtLWxpbmsnKS5jbGljaygpOwoJCQkJJChlLnRhcmdldCkudGV4dCgn5LiL6L295byA5aeL77yM5LiL6L296L+b5bqm6KeB5LiK5pa55oyJ6ZKu5ZOmficpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCXNldFRpbWVvdXQoCgkJCQkJZnVuY3Rpb24gKCl7CgkJCQkJCSQoZS50YXJnZXQpLnRleHQoJ+S4i+i9veWFqOmDqOmTvuaOpScpLmFuaW1hdGUoe29wYWNpdHk6ICcxJ30sICJzbG93Iik7CgkJCQkJfSwyMDAwCgkJCQkpCgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXNldHRpbmcnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dTZXR0aW5nKCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXVwZGF0ZWxvZycsICgpID0+IHsKCQkJCWJhc2Uuc2hvd1VwZGF0ZUxvZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItcnBjLXRhc2snLCAoKSA9PiB7CgkJCQlsZXQgcnBjID0gSlNPTi5zdHJpbmdpZnkoewoJCQkJCWRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCgkJCQkJcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAoJCQkJfSksIHVybCA9IGAke3Bhbi5kfS8/cnBjPSR7YmFzZS5lbmNvZGUocnBjKX0jJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpfWA7CgkJCQlHTV9vcGVuSW5UYWIodXJsLCB7YWN0aXZlOiB0cnVlfSk7CgkJCX0pOwoJCQlkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIChlKSA9PiB7CgkJCQlpZiAoZS50YXJnZXQubm9kZU5hbWUgPT09ICdBJyAmJiB+ZS50YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoJ3BsLWEnKSkgewoJCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCQl9CgkJCX0sIHRydWUpOwoJCX0sCgoJCWFzeW5jIGdldFJlYWxMaW5rKGQsIGYpIHsKCQkJbGV0IGF1dGhvcml6YXRpb24gPSBgJHtiYXNlLmdldFN0b3JhZ2UoJ3Rva2VuJykudG9rZW5fdHlwZX0gJHtiYXNlLmdldFN0b3JhZ2UoJ3Rva2VuJykuYWNjZXNzX3Rva2VufWA7CgkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QocGFuLnBjc1sxXSwgewoJCQkJZHJpdmVfaWQ6IGQsCgkJCQlmaWxlX2lkOiBmCgkJCX0sIHsKCQkJCWF1dGhvcml6YXRpb24sCgkJCQkiY29udGVudC10eXBlIjogImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCIsCgkJCX0pOwoJCQlpZiAocmVzLnVybCkgewoJCQkJcmV0dXJuIHJlcy51cmw7CgkJCX0KCQkJcmV0dXJuICcnOwoJCX0sCgoJCWFkZEJ1dHRvbigpIHsKCQkJaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikpewoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikucmVtb3ZlKCkKCQkJfQoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoJ1tjbGFzc149InNoYXJlLWxpc3QtYmFubmVyIl0nLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgYWQxID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2NsYXNzXj0ic2hhcmUtbGlzdC1iYW5uZXIiXScpOwoJCQkJLy9hZDEuc3R5bGUuekluZGV4ID0gMDsKCQkJCWFkMS5yZW1vdmUoKTsKCQkJfSx0cnVlKTsKCQkJd2FpdEZvcktleUVsZW1lbnRzKCdbY2xhc3NePSJ0by1hcHAiXScsIGZ1bmN0aW9uICgpIHsKCQkJCWxldCBhZDIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbY2xhc3NePSJ0by1hcHAiXScpOwoJCQkJYWQyLnJlbW92ZSgpOwoJCQl9LHRydWUpOwoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoJ1tjbGFzc149ImJ0bi1tb2JpbGUtc2F2ZSJdJywgZnVuY3Rpb24gKCkgewoJCQkJbGV0IGFkMyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tjbGFzc149ImJ0bi1tb2JpbGUtc2F2ZSJdJyk7CgkJCQlhZDMucmVtb3ZlKCk7CgkJCX0sdHJ1ZSk7CgkJCXdhaXRGb3JLZXlFbGVtZW50cygnW2NsYXNzXj0idGV4dCJdJywgZnVuY3Rpb24gKCkgewoJCQkJbGV0IGFkNCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tjbGFzc149InRleHQiXScpOwoJCQkJaWYgKGFkNC5pbm5lckhUTUwubWF0Y2goIlNWSVAiKSAmJiBhZDQuaW5uZXJIVE1MLm1hdGNoKCLmir0iKSAmJiBhZDQuaW5uZXJIVE1MLm1hdGNoKCLotaIiKSkKCQkJCQlhZDQucmVtb3ZlKCk7CgkJCX0sdHJ1ZSk7CgkJCXdhaXRGb3JLZXlFbGVtZW50cygnW2NsYXNzXj0iU3BsYXNoU2NyZWVuSW1nLS1jbG9zZSJdJywgZnVuY3Rpb24gKCkgewoJCQkJbGV0IHZpcDEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbY2xhc3NePSJTcGxhc2hTY3JlZW5JbWctLWNsb3NlIl0nKTsKCQkJCXZpcDEuY2xpY2soKTsKCQkJfSx0cnVlKTsKCQkJd2FpdEZvcktleUVsZW1lbnRzKCdbY2xhc3NePSJwb3B1cF9tYWluX2Nsb3NlIl0nLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgdmlwMiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tjbGFzc149InBvcHVwX21haW5fY2xvc2UiXScpOwoJCQkJdmlwMi5jbGljaygpOwoJCQl9LHRydWUpOwoJCQlpZiAoIXB0KSByZXR1cm47CgkJCWxldCAkdG9vbFdyYXA7CgkJCWxldCAkYnV0dG9uID0gJChgPGRpdiBpZD0icGwtYnV0dG9uLWxpbmsiIGNsYXNzPSJhbGktYnV0dG9uIHBsLWJ1dHRvbiI+PHNwYW4gZGF0YS1yb2xlPSJpY29uIiBkYXRhLXJlbmRlci1hcz0ic3ZnIiBjbGFzcz0iaWNvbiI+PHN2ZyBjbGFzcz0iYWxpLWJ0bi1pY29uIiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTg1My4zMzMgOTM4LjY2N0gxNzAuNjY3YTg1LjMzMyA4NS4zMzMgMCAwIDEtODUuMzM0LTg1LjMzNHYtMzg0QTg1LjMzMyA4NS4zMzMgMCAwIDEgMTcwLjY2NyAzODRIMjg4YTMyIDMyIDAgMCAxIDAgNjRIMTcwLjY2N2EyMS4zMzMgMjEuMzMzIDAgMCAwLTIxLjMzNCAyMS4zMzN2Mzg0YTIxLjMzMyAyMS4zMzMgMCAwIDAgMjEuMzM0IDIxLjMzNGg2ODIuNjY2YTIxLjMzMyAyMS4zMzMgMCAwIDAgMjEuMzM0LTIxLjMzNHYtMzg0QTIxLjMzMyAyMS4zMzMgMCAwIDAgODUzLjMzMyA0NDhINzM2YTMyIDMyIDAgMCAxIDAtNjRoMTE3LjMzM2E4NS4zMzMgODUuMzMzIDAgMCAxIDg1LjMzNCA4NS4zMzN2Mzg0YTg1LjMzMyA4NS4zMzMgMCAwIDEtODUuMzM0IDg1LjMzNHoiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD48cGF0aCBkPSJNNzE1LjAzIDU0My41NTJhMzIuODEgMzIuODEgMCAwIDAtNDYuMjUxIDBMNTU0LjAwNSA2NTcuODEzdi01NDAuNDhhMzIgMzIgMCAwIDAtNjQgMHY1MzkuNzM0TDM3NS44OTMgNTQzLjQ4OGEzMi43OSAzMi43OSAwIDAgMC00Ni4yMjkgMCAzMi40MjcgMzIuNDI3IDAgMCAwIDAgNDYuMDM3bDE2OS41NTcgMTY4LjgxMWEzMi44MSAzMi44MSAwIDAgMCA0Ni4yNTEgMGwxNjkuNTU3LTE2OC44MWEzMi40NyAzMi40NyAwIDAgMCAwLTQ1Ljk3NHoiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD48L3N2Zz48L3NwYW4+PHVsIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51IiBzdHlsZT0idG9wOiAzMHB4OyByaWdodDogMDsiPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImFwaSI+QVBJ5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcmlhIiA+QXJpYeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0icnBjIj5SUEPkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImN1cmwiPmNVUkzkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImJjIiA+QkPkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIGxpc3RlbmVyLW9wZW4tc2V0dGluZyI+5Yqp5omL6K6+572uPC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSBsaXN0ZW5lci1vcGVuLXVwZGF0ZWxvZyI+5pu05paw5pel5b+XPC9saT48L3VsPjwvZGl2PmApOwoJCQlpZiAocHQgPT09ICdob21lJykgewoJCQkJYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uaG9tZSwgKCkgPT4gewoJCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJCQkkKCcucGwtYnV0dG9uJykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5hcHBlbmQoJGJ1dHRvbik7CgkJCQl9KQoJCQl9CgkJCWlmIChwdCA9PT0gJ3NoYXJlJykgewoJCQkJbGV0ICRidXR0b24gPSAkKGA8ZGl2IGlkPSJwbC1idXR0b24tbGluayIgY2xhc3M9ImFsaS1idXR0b24gcGwtYnV0dG9uIj48c3BhbiBkYXRhLXJvbGU9Imljb24iIGRhdGEtcmVuZGVyLWFzPSJzdmciIGNsYXNzPSJpY29uIj48c3ZnIGNsYXNzPSJhbGktYnRuLWljb24iIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDNweDsiIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ij48cGF0aCBkPSJNODUzLjMzMyA5MzguNjY3SDE3MC42NjdhODUuMzMzIDg1LjMzMyAwIDAgMS04NS4zMzQtODUuMzM0di0zODRBODUuMzMzIDg1LjMzMyAwIDAgMSAxNzAuNjY3IDM4NEgyODhhMzIgMzIgMCAwIDEgMCA2NEgxNzAuNjY3YTIxLjMzMyAyMS4zMzMgMCAwIDAtMjEuMzM0IDIxLjMzM3YzODRhMjEuMzMzIDIxLjMzMyAwIDAgMCAyMS4zMzQgMjEuMzM0aDY4Mi42NjZhMjEuMzMzIDIxLjMzMyAwIDAgMCAyMS4zMzQtMjEuMzM0di0zODRBMjEuMzMzIDIxLjMzMyAwIDAgMCA4NTMuMzMzIDQ0OEg3MzZhMzIgMzIgMCAwIDEgMC02NGgxMTcuMzMzYTg1LjMzMyA4NS4zMzMgMCAwIDEgODUuMzM0IDg1LjMzM3YzODRhODUuMzMzIDg1LjMzMyAwIDAgMS04NS4zMzQgODUuMzM0eiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPjxwYXRoIGQ9Ik03MTUuMDMgNTQzLjU1MmEzMi44MSAzMi44MSAwIDAgMC00Ni4yNTEgMEw1NTQuMDA1IDY1Ny44MTN2LTU0MC40OGEzMiAzMiAwIDAgMC02NCAwdjUzOS43MzRMMzc1Ljg5MyA1NDMuNDg4YTMyLjc5IDMyLjc5IDAgMCAwLTQ2LjIyOSAwIDMyLjQyNyAzMi40MjcgMCAwIDAgMCA0Ni4wMzdsMTY5LjU1NyAxNjguODExYTMyLjgxIDMyLjgxIDAgMCAwIDQ2LjI1MSAwbDE2OS41NTctMTY4LjgxYTMyLjQ3IDMyLjQ3IDAgMCAwIDAtNDUuOTc0eiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPjwvc3ZnPuS4i+i9veWKqeaJizwvc3Bhbj48dWwgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUiIHN0eWxlPSJ0b3A6IDMwcHg7IHJpZ2h0OiAxNnB4OyI+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXBpIj5BUEnkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImFyaWEiID5Bcmlh5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJycGMiPlJQQ+S4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iY3VybCI+Y1VSTOS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYmMiID5CQ+S4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUgbGlzdGVuZXItb3Blbi1zZXR0aW5nIj7liqnmiYvorr7nva48L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIGxpc3RlbmVyLW9wZW4tdXBkYXRlbG9nIj7mm7TmlrDml6Xlv5c8L2xpPjwvdWw+PC9kaXY+YCk7CgkJCQkkYnV0dG9uLmNzcyh7J21hcmdpbi1yaWdodCc6ICcxMHB4JywiaGVpZ2h0IjoiMzZweCIsIndpZHRoIjoiYXV0byIsInBhZGRpbmciOiIxcHggMzBweCJ9KTsKCQkJCWJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLnNoYXJlLCAoKSA9PiB7CgkJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKCQkJCQkkKCcucGwtYnV0dG9uJykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJfSkKCQkJfQoJCQl0aGlzLmFkZFBhZ2VMaXN0ZW5lcigpOwoJCQliYXNlLmNyZWF0ZURvd25sb2FkSWZyYW1lKCk7CgkJfSwKCgkJYWRkSW5pdEJ1dHRvbigpIHsKCQkJaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikpewoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikucmVtb3ZlKCkKCQkJfQoJCQlpZiAoIXB0KSByZXR1cm47CgkJCWxldCAkdG9vbFdyYXA7CgkJCWxldCAkYnV0dG9uID0gJChgPGRpdiBpZD0icGwtYnV0dG9uLWxpbmsiIGNsYXNzPSJhbGktYnV0dG9uIHBsLWJ1dHRvbi1pbml0Ij48c3BhbiBkYXRhLXJvbGU9Imljb24iIGRhdGEtcmVuZGVyLWFzPSJzdmciIGNsYXNzPSJpY29uIj48c3ZnIGNsYXNzPSJhbGktYnRuLWljb24iIHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDNweDsiIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ij48cGF0aCBkPSJNODUzLjMzMyA5MzguNjY3SDE3MC42NjdhODUuMzMzIDg1LjMzMyAwIDAgMS04NS4zMzQtODUuMzM0di0zODRBODUuMzMzIDg1LjMzMyAwIDAgMSAxNzAuNjY3IDM4NEgyODhhMzIgMzIgMCAwIDEgMCA2NEgxNzAuNjY3YTIxLjMzMyAyMS4zMzMgMCAwIDAtMjEuMzM0IDIxLjMzM3YzODRhMjEuMzMzIDIxLjMzMyAwIDAgMCAyMS4zMzQgMjEuMzM0aDY4Mi42NjZhMjEuMzMzIDIxLjMzMyAwIDAgMCAyMS4zMzQtMjEuMzM0di0zODRBMjEuMzMzIDIxLjMzMyAwIDAgMCA4NTMuMzMzIDQ0OEg3MzZhMzIgMzIgMCAwIDEgMC02NGgxMTcuMzMzYTg1LjMzMyA4NS4zMzMgMCAwIDEgODUuMzM0IDg1LjMzM3YzODRhODUuMzMzIDg1LjMzMyAwIDAgMS04NS4zMzQgODUuMzM0eiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPjxwYXRoIGQ9Ik03MTUuMDMgNTQzLjU1MmEzMi44MSAzMi44MSAwIDAgMC00Ni4yNTEgMEw1NTQuMDA1IDY1Ny44MTN2LTU0MC40OGEzMiAzMiAwIDAgMC02NCAwdjUzOS43MzRMMzc1Ljg5MyA1NDMuNDg4YTMyLjc5IDMyLjc5IDAgMCAwLTQ2LjIyOSAwIDMyLjQyNyAzMi40MjcgMCAwIDAgMCA0Ni4wMzdsMTY5LjU1NyAxNjguODExYTMyLjgxIDMyLjgxIDAgMCAwIDQ2LjI1MSAwbDE2OS41NTctMTY4LjgxYTMyLjQ3IDMyLjQ3IDAgMCAwIDAtNDUuOTc0eiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPjwvc3ZnPijmnKrngrnkuq4pPC9zcGFuPjwvZGl2PmApOwoJCQkkYnV0dG9uLmNzcyh7IndpZHRoIjoiYXV0byJ9KTsKCQkJaWYgKHB0ID09PSAnaG9tZScpIHsKCQkJCWJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLmhvbWUsICgpID0+IHsKCQkJCQkkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CgkJCQkJJCgnLnBsLWJ1dHRvbi1pbml0JykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5hcHBlbmQoJGJ1dHRvbik7CgkJCQl9KQoJCQl9CgkJCWlmIChwdCA9PT0gJ3NoYXJlJykgewoJCQkJbGV0ICRidXR0b24gPSAkKGA8ZGl2IGlkPSJwbC1idXR0b24tbGluayIgY2xhc3M9ImFsaS1idXR0b24gcGwtYnV0dG9uLWluaXQiPjxzcGFuIGRhdGEtcm9sZT0iaWNvbiIgZGF0YS1yZW5kZXItYXM9InN2ZyIgY2xhc3M9Imljb24iPjxzdmcgY2xhc3M9ImFsaS1idG4taWNvbiIgc3R5bGU9Im1hcmdpbi1yaWdodDogM3B4OyIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik04NTMuMzMzIDkzOC42NjdIMTcwLjY2N2E4NS4zMzMgODUuMzMzIDAgMCAxLTg1LjMzNC04NS4zMzR2LTM4NEE4NS4zMzMgODUuMzMzIDAgMCAxIDE3MC42NjcgMzg0SDI4OGEzMiAzMiAwIDAgMSAwIDY0SDE3MC42NjdhMjEuMzMzIDIxLjMzMyAwIDAgMC0yMS4zMzQgMjEuMzMzdjM4NGEyMS4zMzMgMjEuMzMzIDAgMCAwIDIxLjMzNCAyMS4zMzRoNjgyLjY2NmEyMS4zMzMgMjEuMzMzIDAgMCAwIDIxLjMzNC0yMS4zMzR2LTM4NEEyMS4zMzMgMjEuMzMzIDAgMCAwIDg1My4zMzMgNDQ4SDczNmEzMiAzMiAwIDAgMSAwLTY0aDExNy4zMzNhODUuMzMzIDg1LjMzMyAwIDAgMSA4NS4zMzQgODUuMzMzdjM4NGE4NS4zMzMgODUuMzMzIDAgMCAxLTg1LjMzNCA4NS4zMzR6IiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+PHBhdGggZD0iTTcxNS4wMyA1NDMuNTUyYTMyLjgxIDMyLjgxIDAgMCAwLTQ2LjI1MSAwTDU1NC4wMDUgNjU3LjgxM3YtNTQwLjQ4YTMyIDMyIDAgMCAwLTY0IDB2NTM5LjczNEwzNzUuODkzIDU0My40ODhhMzIuNzkgMzIuNzkgMCAwIDAtNDYuMjI5IDAgMzIuNDI3IDMyLjQyNyAwIDAgMCAwIDQ2LjAzN2wxNjkuNTU3IDE2OC44MTFhMzIuODEgMzIuODEgMCAwIDAgNDYuMjUxIDBsMTY5LjU1Ny0xNjguODFhMzIuNDcgMzIuNDcgMCAwIDAgMC00NS45NzR6IiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+PC9zdmc+KOacqueCueS6rik8L3NwYW4+PC9kaXY+YCk7CgkJCQkkYnV0dG9uLmNzcyh7J21hcmdpbi1yaWdodCc6ICcxMHB4JywiaGVpZ2h0IjoiMzZweCIsInBhZGRpbmciOiIxcHggMzBweCIsIndpZHRoIjoiYXV0byJ9KTsKCQkJCWJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLnNoYXJlLCAoKSA9PiB7CgkJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKCQkJCQkkKCcucGwtYnV0dG8taW5pdCcpLmxlbmd0aCA9PT0gMCAmJiAkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKCQkJCX0pCgkJCX0KCQkJJGJ1dHRvbi5jbGljaygoKSA9PiBiYXNlLmluaXREaWFsb2coKSk7CgkJfSwKCgkJYXN5bmMgZ2V0UENTTGluaygpIHsKCQkJbGV0IHJlYWN0RG9tR3JpZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocGFuLmRvbS5ncmlkKTsKCQkJaWYgKHJlYWN0RG9tR3JpZCkgewoJCQkJbGV0IHJlcyA9IGF3YWl0IFN3YWwuZmlyZSh7CgkJCQkJdGl0bGU6ICfmj5DnpLonLAoJCQkJCWh0bWw6ICc8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4O2FsaWduLWl0ZW1zOiBjZW50ZXI7anVzdGlmeS1jb250ZW50OiBjZW50ZXI7Ij7or7flhYjliIfmjaLliLAmbmJzcDsmbmJzcDs8Yj7liJfooajop4blm748L2I+Jm5ic3A74oCcPHN2ZyBjbGFzcz0iaWNvbiIgY2xhc3M9Imljb24tLUQza01rICIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIj48dXNlIHhsaW5rOmhyZWY9IiNQRFNEcmFnIj48L3VzZT48L3N2Zz7igJ0mbmJzcDsmbmJzcDvlkI7ojrflj5bkuIvovb3pk77mjqU8L2Rpdj4nLAoJCQkJCWljb246ICdpbmZvJywKCQkJCQloZWlnaHRBdXRvOiBmYWxzZSwKCQkJCQlzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKCQkJCQljb25maXJtQnV0dG9uVGV4dDogJ+eCueWHu+WIh+aNoicKCQkJCX0pOwoJCQkJaWYgKHJlcykgewoJCQkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocGFuLmRvbS5zd2l0Y2gpLmNsaWNrKCk7CgkJCQkJcmV0dXJuIG1lc3NhZ2Uuc3VjY2Vzcygn5YiH5o2i5Li65YiX6KGo6KeG5Zu+5oiQ5Yqf77yM6K+35YaN6I635Y+W5LiA5qyh5LiL6L296ZO+5o6l5ZGificpOwoJCQkJfQoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCXNlbGVjdExpc3QgPSB0aGlzLmdldFNlbGVjdGVkTGlzdCgpOwoJCQlpZiAoc2VsZWN0TGlzdC5sZW5ndGggPT09IDApIHsKCQkJCXJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+6K+35YWI5Yu+6YCJ6KaB5LiL6L2955qE5paH5Lu25o2PficpOwoJCQl9CgkJCWlmICh0aGlzLmlzT25seUZvbGRlcigpKSB7CgkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+aJk+W8gOaWh+S7tuWkueWQjuWGjeWLvumAieaWh+S7tn4nKTsKCQkJfQoJCQlpZiAocHQgPT09ICdzaGFyZScpIHsKCQkJCWlmIChzZWxlY3RMaXN0Lmxlbmd0aCA+IDIwKSB7CgkJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7kuIDmrKHmnIDlpJrlj6rog73li77pgIkgMjAg5Liq5paH5Lu25ZOmIScpOwoJCQkJfQoJCQkJdHJ5IHsKCQkJCQlsZXQgYXV0aG9yaXphdGlvbiA9IGAke2Jhc2UuZ2V0U3RvcmFnZSgndG9rZW4nKS50b2tlbl90eXBlfSAke2Jhc2UuZ2V0U3RvcmFnZSgndG9rZW4nKS5hY2Nlc3NfdG9rZW59YDsKCQkJCQlsZXQgeFNoYXJlVG9rZW4gPSBiYXNlLmdldFN0b3JhZ2UoJ3NoYXJlVG9rZW4nKS5zaGFyZV90b2tlbjsKCgkJCQkJZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3RMaXN0Lmxlbmd0aDsgaSsrKSB7CgkJCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QocGFuLnBjc1swXSwgewoJCQkJCQkJZXhwaXJlX3NlYzogNjAwLAoJCQkJCQkJZmlsZV9pZDogc2VsZWN0TGlzdFtpXS5maWxlSWQsCgkJCQkJCQlzaGFyZV9pZDogc2VsZWN0TGlzdFtpXS5zaGFyZUlkCgkJCQkJCX0sIHsKCQkJCQkJCWF1dGhvcml6YXRpb24sCgkJCQkJCQkiY29udGVudC10eXBlIjogImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCIsCgkJCQkJCQkieC1zaGFyZS10b2tlbiI6IHhTaGFyZVRva2VuCgkJCQkJCX0pOwoJCQkJCQlpZiAocmVzLmRvd25sb2FkX3VybCkgewoJCQkJCQkJc2VsZWN0TGlzdFtpXS5kb3dubG9hZFVybCA9IHJlcy5kb3dubG9hZF91cmw7CgkJCQkJCX0KCQkJCQl9CgkJCQl9IGNhdGNoIChlKSB7CgkJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7flhYjnmbvlvZXnvZHnm5h+Jyk7CgkJCQl9CgkJCX0KCQkJbGV0IGh0bWwgPSB0aGlzLmdlbmVyYXRlRG9tKHNlbGVjdExpc3QpOwoJCQl0aGlzLnNob3dNYWluRGlhbG9nKHBhblttb2RlXVswXSwgaHRtbCwgcGFuW21vZGVdWzFdKTsKCQl9LAoKCQlnZW5lcmF0ZURvbShsaXN0KSB7CgkJCWxldCBjb250ZW50ID0gJzxkaXYgY2xhc3M9InBsLW1haW4iPic7CgkJCWxldCBhbGlua0FsbFRleHQgPSAnJzsKCQkJY29uc29sZS5sb2cobGlzdCkKCQkJbGlzdC5mb3JFYWNoKCh2LCBpKSA9PiB7CgkJCQlpZiAodi50eXBlID09PSAnZm9sZGVyJykgcmV0dXJuOwoJCQkJbGV0IGZpbGVuYW1lID0gdi5uYW1lOwoJCQkJbGV0IGZpZCA9IHYuZmlsZUlkOwoJCQkJbGV0IGRpZCA9IHYuZHJpdmVJZDsKCQkJCWxldCBzaXplID0gYmFzZS5zaXplRm9ybWF0KHYuc2l6ZSk7CgkJCQlsZXQgZGxpbmsgPSB2LmRvd25sb2FkVXJsIHx8IHYudXJsOwoJCQkJaWYgKG1vZGUgPT09ICdhcGknKSB7CgkJCQkJYWxpbmtBbGxUZXh0ICs9IGRsaW5rICsgJ1xyXG4nOwoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSIgPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBwbC1hIGxpc3RlbmVyLWxpbmstYXBpIiBocmVmPSIke2RsaW5rfSIgZGF0YS1kaWQ9IiR7ZGlkfSIgZGF0YS1maWQ9IiR7ZmlkfSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iIGRhdGEtc2l6ZT0iJHt2LnNpemV9IiBkYXRhLWluZGV4PSIke2l9Ij4ke2RsaW5rfTxicj7kuIvovb0gICR7ZmlsZW5hbWV9PC9hPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tY29weSBwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1saW5rLWFwaS1idG4iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9Ij7lpI3liLbmlofku7blkI08L2Rpdj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLXRpcCIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPjxzcGFuPjxzcGFuIGNsYXNzPSJwbC1leHQiPjwvc3Bhbj48L3NwYW4+IDxzcGFuIGNsYXNzPSJwbC1iYWNrIGxpc3RlbmVyLWJhY2siPui/lOWbnjwvc3Bhbj48L2Rpdj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLXByb2dyZXNzIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+CgkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLXByb2dyZXNzIj4KCQkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLXByb2dyZXNzLW91dGVyIj48L2Rpdj4KCQkJCQkJCQkJCTxkaXYgY2xhc3M9InBsLXByb2dyZXNzLWlubmVyIiBzdHlsZT0id2lkdGg6NSUiPgoJCQkJCQkJCQkJPGRpdiBjbGFzcz0icGwtcHJvZ3Jlc3MtaW5uZXItdGV4dCI+5q2j5Zyo5Yqg6L296L+b5bqmLi4uMCU8L2Rpdj4KCQkJCQkJCQkJCTwvZGl2PgoJCQkJCQkJCQk8L2Rpdj4KCQkJCQkJCQkJPHNwYW4gY2xhc3M9InBsLXByb2dyZXNzLXN0b3AgbGlzdGVuZXItc3RvcCI+5Y+W5raI5LiL6L29PC9zcGFuPgoJCQkJCWA7CgkJCQkJY29udGVudCs9YDxzcGFuIGNsYXNzPSJwbC1wcm9ncmVzcy10aXAiIHN0eWxlPSJkaXNwbGF5OiBub25lIiA+5L2/55So6Ieq5bim5rWP6KeI5Zmo5LiL6L29PC9zcGFuPgoJCQkJCQkJCTxzcGFuIGNsYXNzPSJwbC1wcm9ncmVzcy1iYWNrIHBsLWJhY2sgbGlzdGVuZXItYmFjayIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPui/lOWbnjwvc3Bhbj4KCQkJCQkJCQk8c3BhbiBjbGFzcz0icGwtcHJvZ3Jlc3MtaG93IGxpc3RlbmVyLWhvdyIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPuWmguS9leWUpOi1t0lETe+8nzwvc3Bhbj4KCQkJCQlgOwoJCQkJCWNvbnRlbnQgKz1gPC9kaXY+PC9kaXY+YDsKCQkJCX0KCQkJCWlmIChtb2RlID09PSAnYXJpYScpIHsKCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9BcmlhKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQkJaWYgKG1vZGUgPT09ICdycGMnKSB7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxidXR0b24gY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLXJwYyBwbC1idG4tcHJpbWFyeSBwbC1idG4taW5mbyIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRldmljZSI+PC9lbT48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDVweDsiPuaOqOmAgeWIsCBSUEMg5LiL6L295ZmoPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2N1cmwnKSB7CgkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQ3VybChkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwoJCQkJCWFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2Y3VybOmTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2JjJykgewoJCQkJCWxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0JDKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX0iIHRpdGxlPSLngrnlh7vnlKjmr5TnibnlvZfmmJ/kuIvovb0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQl9KTsKCQkJY29udGVudCArPSAnPC9kaXY+JzsKCQkJaWYgKG1vZGUgPT09ICdhcGknKQoJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLWRvd25sb2FkLWFsbCI+5LiL6L295YWo6YOo6ZO+5o6lPC9idXR0b24+PC9kaXY+YDsKCQkJaWYgKG1vZGUgPT09ICdhcmlhJykKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOWRveS7pOihjDwvYnV0dG9uPjwvZGl2PmA7CgkJCWlmIChtb2RlID09PSAncnBjJykgewoJCQkJbGV0IHJwYyA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpICsgJzonICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpOwoJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLXNlbmQtcnBjIj7lj5HpgIHlhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIHRpdGxlPSIke3JwY30iIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweCI+6K6+572uIFJQQyDlj4LmlbDvvIjlvZPliY3kuLrvvJoke3JwY33vvIk8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4tc3VjY2VzcyBsaXN0ZW5lci1ycGMtdGFzayIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4O2Rpc3BsYXk6IG5vbmUiPuafpeeci+S4i+i9veS7u+WKoTwvYnV0dG9uPjwvZGl2PmA7CgkJCX0KCQkJaWYgKG1vZGUgPT09ICdjdXJsJykKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+5YmN5b6A5Yqp5omL6K6+572u5L+u5pS55b2T5YmN57uI56uv57G75Z6L77yIJHt0ZXJtaW5hbFR5cGVbYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyldfe+8iTwvYnV0dG9uPjwvZGl2PmA7CgkJCXJldHVybiBjb250ZW50OwoJCX0sCgoJCWFzeW5jIHNlbmRMaW5rVG9SUEMoZmlsZW5hbWUsIGxpbmspIHsKCQkJbGV0IHJwYyA9IHsKCQkJCWRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCgkJCQlwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCgkJCQlwYXRoOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyksCgkJCQl0b2tlbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKSwKCQkJCWRpcjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJyksCgkJCX07CgoJCQlsZXQgdXJsID0gYCR7cnBjLmRvbWFpbn06JHtycGMucG9ydH0ke3JwYy5wYXRofWA7CgkJCWxldCBycGNEYXRhID0gewoJCQkJaWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAoJCQkJanNvbnJwYzogJzIuMCcsCgkJCQltZXRob2Q6ICdhcmlhMi5hZGRVcmknLAoJCQkJcGFyYW1zOiBbYHRva2VuOiR7cnBjLnRva2VufWAsIFtsaW5rXSwgewoJCQkJCWRpcjogcnBjLmRpciwKCQkJCQlvdXQ6IGZpbGVuYW1lLAoJCQkJCWhlYWRlcjogW2BSZWZlcmVyOiBodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vYF0KCQkJCX1dCgkJCX07CgkJCXRyeSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHVybCwgcnBjRGF0YSwgeyJSZWZlcmVyIjogImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS8ifSwgJycpOwoJCQkJaWYgKHJlcy5yZXN1bHQpIHJldHVybiAnc3VjY2Vzcyc7CgkJCQlyZXR1cm4gJ2ZhaWwnOwoJCQl9IGNhdGNoIChlKSB7CgkJCQlyZXR1cm4gJ2ZhaWwnOwoJCQl9CgkJfSwKCgkJZ2V0U2VsZWN0ZWRMaXN0KCkgewoJCQl0cnkgewoJCQkJbGV0IHNlbGVjdGVkTGlzdCA9IFtdOwoJCQkJbGV0IHJlYWN0RG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihwYW4uZG9tLmxpc3QpOwoJCQkJbGV0IHJlYWN0T2JqID0gYmFzZS5maW5kUmVhY3QocmVhY3REb20sIDEpOwoJCQkJbGV0IHByb3BzID0gcmVhY3RPYmoucGVuZGluZ1Byb3BzOwoJCQkJaWYgKHByb3BzKSB7CgkJCQkJbGV0IGZpbGVMaXN0ID0gcHJvcHMuZGF0YVNvdXJjZSB8fCBbXTsKCQkJCQlsZXQgc2VsZWN0ZWRLZXlzID0gcHJvcHMuc2VsZWN0ZWRLZXlzLnNwbGl0KCcsJyk7CgkJCQkJZmlsZUxpc3QuZm9yRWFjaCgodmFsKSA9PiB7CgkJCQkJCWlmIChzZWxlY3RlZEtleXMuaW5jbHVkZXModmFsLmZpbGVJZCkpIHsKCQkJCQkJCXNlbGVjdGVkTGlzdC5wdXNoKHZhbCk7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCX0KCQkJCXJldHVybiBzZWxlY3RlZExpc3Q7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCXJldHVybiBbXTsKCQkJfQoJCX0sCgoJCWRldGVjdFBhZ2UoKSB7CgkJCWxldCBwYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CgkJCWlmICgvXlwvKGRyaXZlKS8udGVzdChwYXRoKSkgcmV0dXJuICdob21lJzsKCQkJaWYgKC9eXC8oc3xzaGFyZSlcLy8udGVzdChwYXRoKSkgcmV0dXJuICdzaGFyZSc7CgkJCXJldHVybiAnJzsKCQl9LAoKCQlpc09ubHlGb2xkZXIoKSB7CgkJCWZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0TGlzdC5sZW5ndGg7IGkrKykgewoJCQkJaWYgKHNlbGVjdExpc3RbaV0udHlwZSA9PT0gJ2ZpbGUnKSByZXR1cm4gZmFsc2U7CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJc2hvd01haW5EaWFsb2codGl0bGUsIGh0bWwsIGZvb3RlcikgewoJCQlTd2FsLmZpcmUoewoJCQkJdGl0bGUsCgkJCQlodG1sLAoJCQkJZm9vdGVyLAoJCQkJYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAoJCQkJc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAoJCQkJcG9zaXRpb246ICdjZW50ZXInLC8vdG9wCgkJCQl3aWR0aCwKCQkJCXBhZGRpbmc6ICcxNXB4IDIwcHggNXB4JywKCQkJCWN1c3RvbUNsYXNzLAoJCQkJY29uZmlybUJ1dHRvblRleHQ6ICflhbPpl60nLAoJCQl9KTsKCQl9LAoKCQlhc3luYyBpbml0UGFuTGlua2VyKCkgewoJCQlwdCA9IHRoaXMuZGV0ZWN0UGFnZSgpOwoJCQliYXNlLmNyZWF0ZVRpcCgpOwoJCQliYXNlLnJlZ2lzdGVyTWVudUNvbW1hbmQoKTsKCQkJaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gJ3YxJykgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL2FsaS8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gJ3YyJykgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL3YyL2FsaS8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gIm5vIikgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KGBodHRwczovL2djb3JlLmpzZGVsaXZyLm5ldC9naC9obWp6MTAwL09ubGluZS1kaXNrLWRpcmVjdC1saW5rLWRvd25sb2FkLWFzc2lzdGFudEBtYWluL2NvbmZpZy9hbGkuanNvbmAsIHt9LCAidGV4dCIsIHt9KTsKCQkJCXBhbiA9IEpTT04ucGFyc2UocmVzKTsKCQkJfSBlbHNlIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLmdldChgaHR0cHM6Ly9nY29yZS5qc2RlbGl2ci5uZXQvZ2gvaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnRAbWFpbi9jb25maWcvY29uZmlnLmpzb25gLCB7fSwgInRleHQiLCB7fSk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKHJlcyk7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJywgJ3YyJyk7CgkJCX0KCQkJT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKHBhbik7CgkJCXBhbi5udW0gPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJykgfHwgcGFuLmxpY2Vuc2UgPT09IGJhc2UuZ2V0VmFsdWUoJ2xpY2Vuc2UnKSA/IHRoaXMuYWRkQnV0dG9uKCkgOiB0aGlzLmFkZEluaXRCdXR0b24oKTsKCQl9Cgl9OwoKCS8v5aSp57+85LqRCglsZXQgdGlhbnlpID0gewoKCQljb252ZXJ0TGlua1RvQXJpYShsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYXJpYTJjICIke2xpbmt9IiAtLW91dCAiJHtmaWxlbmFtZX0iYCk7CgkJfSwKCgkJY29udmVydExpbmtUb0JDKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlsZXQgYmMgPSBgQUEvJHtlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpfS8/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpbmspfVpaYDsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYmM6Ly9odHRwLyR7YmFzZS5lbmNvZGUoYmMpfWApOwoJCX0sCgoJCWNvbnZlcnRMaW5rVG9DdXJsKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlsZXQgdGVybWluYWwgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKTsKCQkJZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgJHt0ZXJtaW5hbCAhPT0gJ3dwJyA/ICdjdXJsJyA6ICdjdXJsLmV4ZSd9IC1MIC1DIC0gIiR7bGlua30iIC1vICIke2ZpbGVuYW1lfSJgKTsKCQl9LAoKCQlhZGRQYWdlTGlzdGVuZXIoKSB7CgkJCWRvYy5vbignY2xpY2snLCAnLnBsLWJ1dHRvbi1tb2RlJywgKGUpID0+IHsKCQkJCW1vZGUgPSBlLnRhcmdldC5kYXRhc2V0Lm1vZGU7CgkJCQlTd2FsLmZpcmUoewoJCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJCXNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKCQkJCQlodG1sOiBg6ZO+5o6l6I635Y+W5LitYCwKCQkJCQl3aWxsT3BlbjogZnVuY3Rpb24oKSB7CgkJCQkJCVN3YWwuc2hvd0xvYWRpbmcoKTsKCQkJCQl9CgkJCQl9KTsKCQkJCXRoaXMuZ2V0UENTTGluaygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcGknLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJJCgnI2Rvd25sb2FkSWZyYW1lJykuYXR0cignc3JjJywgZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQubGluayk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFsbCcsIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQliYXNlLnNldENsaXBib2FyZChkZWNvZGVVUklDb21wb25lbnQoZS50YXJnZXQuZGF0YXNldC5saW5rKSk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflpI3liLbmiJDlip8nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCQlzZXRUaW1lb3V0KAoJCQkJCWZ1bmN0aW9uICgpewoJCQkJCQkkKGUudGFyZ2V0KS50ZXh0KCfph43mlrDlpI3liLYnKS5hbmltYXRlKHtvcGFjaXR5OiAnMSd9LCAic2xvdyIpOwoJCQkJCX0sMjAwMAoJCQkJKQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJbGV0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTsgCgoJCQkJdGFyZ2V0LmZpbmQoJy5pY29uJykucmVtb3ZlKCk7CgkJCQl0YXJnZXQuZmluZCgnLnBsLWxvYWRpbmcnKS5yZW1vdmUoKTsKCQkJCXRhcmdldC5wcmVwZW5kKGJhc2UuY3JlYXRlTG9hZGluZygpKTsKCgkJCQlsZXQgcmVzID0gYXdhaXQgdGhpcy5zZW5kTGlua1RvUlBDKGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmZpbGVuYW1lLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKCQkJCWlmIChyZXMgPT09ICdzdWNjZXNzJykgewoJCQkJCSQoJy5saXN0ZW5lci1ycGMtdGFzaycpLnNob3coKTsKCQkJCQl0YXJnZXQucmVtb3ZlQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKCflj5HpgIHmiJDlip/kuoYh5b+r5Y6755yL55yL5ZCnficpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0gZWxzZSBpZiAocmVzID09PSAnYXNzaXN0YW50JykgewoJCQkJCXRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoYCR7cGFuLmluaXRbNV198J+RiTxhIGhyZWY9IiR7cGFuLmFzc2lzdGFudH0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0icGwtYSI+54K55Ye75q2k5aSE5a6J6KOFPC9hPvCfkYhgKTsKCQkJCX0gZWxzZSB7CgkJCQkJdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykudGV4dCgn5Y+R6YCB5aSx6LSl77yM5qOA5p+l5LiA5LiL5oKo55qEUlBD6YWN572u5L+h5oGv5ZOmIScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0KCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsKCQkJCSQoJy5saXN0ZW5lci1saW5rLXJwYycpLmNsaWNrKCk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflj5HpgIHlrozmiJDvvIzlj5HpgIHnu5Pmnpzop4HkuIrmlrnmjInpkq7lk6Z+JykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi1zZXR0aW5nJywgKCkgPT4gewoJCQkJYmFzZS5zaG93U2V0dGluZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi11cGRhdGVsb2cnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dVcGRhdGVMb2coKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXJwYy10YXNrJywgKCkgPT4gewoJCQkJbGV0IHJwYyA9IEpTT04uc3RyaW5naWZ5KHsKCQkJCQlkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAoJCQkJCXBvcnQ6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKCQkJCX0pLCB1cmwgPSBgJHtwYW4uZH0vP3JwYz0ke2Jhc2UuZW5jb2RlKHJwYyl9IyR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKX1gOwoJCQkJR01fb3BlbkluVGFiKHVybCwge2FjdGl2ZTogdHJ1ZX0pOwoJCQl9KTsKCQl9LAoKCQlhZGRCdXR0b24oKSB7CgkJCWlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpKXsKCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpLnJlbW92ZSgpCgkJCX0KCQkJaWYgKCFwdCkgcmV0dXJuOwoJCQlsZXQgJHRvb2xXcmFwOwoJCQlsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9InRpYW55aS1idXR0b24gcGwtYnV0dG9uIiBpZD0icGwtYnV0dG9uLWxpbmsiPuS4i+i9veWKqeaJizx1bCBjbGFzcz0icGwtZHJvcGRvd24tbWVudSIgc3R5bGU9InRvcDogMjZweDsiPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImFwaSI+QVBJ5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcmlhIiA+QXJpYeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0icnBjIj5SUEPkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImN1cmwiPmNVUkzkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImJjIiA+QkPkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIGxpc3RlbmVyLW9wZW4tc2V0dGluZyI+5Yqp5omL6K6+572uPC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSBsaXN0ZW5lci1vcGVuLXVwZGF0ZWxvZyI+5pu05paw5pel5b+XPC9saT48L3VsPjwvZGl2PmApOwoJCQlpZiAocHQgPT09ICdob21lJykgewoJCQkJYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uaG9tZSwgKCkgPT4gewoJCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJCQkkKCcucGwtYnV0dG9uJykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJfSkKCQkJfQoJCQlpZiAocHQgPT09ICdzaGFyZScpIHsKCQkJCWJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLnNoYXJlLCAoKSA9PiB7CgkJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKCQkJCQkkKCcucGwtYnV0dG9uJykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJfSkKCQkJfQoJCQl0aGlzLmFkZFBhZ2VMaXN0ZW5lcigpOwoJCQliYXNlLmNyZWF0ZURvd25sb2FkSWZyYW1lKCk7CgkJfSwKCgkJYWRkSW5pdEJ1dHRvbigpIHsKCQkJaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikpewoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikucmVtb3ZlKCkKCQkJfQoJCQlpZiAoIXB0KSByZXR1cm47CgkJCWxldCAkdG9vbFdyYXA7CgkJCWxldCAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0idGlhbnlpLWJ1dHRvbiBwbC1idXR0b24taW5pdCIgaWQ9InBsLWJ1dHRvbi1saW5rIj7kuIvovb3liqnmiYso5pyq54K55LquKTwvZGl2PmApOwoJCQlpZiAocHQgPT09ICdob21lJykgewoJCQkJYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uaG9tZSwgKCkgPT4gewoJCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJCQkkKCcucGwtYnV0dG9uLWluaXQnKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CgkJCQl9KQoJCQl9CgkJCWlmIChwdCA9PT0gJ3NoYXJlJykgewoJCQkJJGJ1dHRvbi5jc3MoeydtYXJnaW4tcmlnaHQnOiAnMTBweCd9KTsKCQkJCWJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLnNoYXJlLCAoKSA9PiB7CgkJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKCQkJCQkkKCcucGwtYnV0dG9uLWluaXQnKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CgkJCQl9KQoJCQl9CgkJCSRidXR0b24uY2xpY2soKCkgPT4gYmFzZS5pbml0RGlhbG9nKCkpOwoJCX0sCgoJCWFzeW5jIGdldFRva2VuKCkgewoJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5nZXRGaW5hbFVybChwYW4ucGNzWzFdLCB7fSk7CgkJCWxldCBhY2Nlc3NUb2tlbiA9IHJlcy5tYXRjaCgvYWNjZXNzVG9rZW49KFx3KykvKT8uWzFdOwoJCQlhY2Nlc3NUb2tlbiAmJiBiYXNlLnNldFN0b3JhZ2UoJ2FjY2Vzc1Rva2VuJywgYWNjZXNzVG9rZW4pOwoJCQlyZXR1cm4gYWNjZXNzVG9rZW47CgkJfSwKCgkJYXN5bmMgZ2V0RmlsZVVybEJ5T25jZShpdGVtLCBpbmRleCwgdG9rZW4pIHsKCQkJdHJ5IHsKCQkJCWlmIChpdGVtLmRvd25sb2FkVXJsKSByZXR1cm4gewoJCQkJCWluZGV4LAoJCQkJCWRvd25sb2FkVXJsOiBpdGVtLmRvd25sb2FkVXJsCgkJCQl9OwoJCQkJbGV0IHRpbWUgPSBEYXRlLm5vdygpLAoJCQkJCWZpbGVJZCA9IGl0ZW0uZmlsZUlkLAoJCQkJCW8gPSAiQWNjZXNzVG9rZW49IiArIHRva2VuICsgIiZUaW1lc3RhbXA9IiArIHRpbWUgKyAiJmZpbGVJZD0iICsgZmlsZUlkLAoJCQkJCXVybCA9IHBhbi5wY3NbMl0gKyAnP2ZpbGVJZD0nICsgZmlsZUlkOwoJCQkJaWYgKGl0ZW0uc2hhcmVJZCkgewoJCQkJCW8gPSAiQWNjZXNzVG9rZW49IiArIHRva2VuICsgIiZUaW1lc3RhbXA9IiArIHRpbWUgKyAiJmR0PTEmZmlsZUlkPSIgKyBmaWxlSWQgKyAiJnNoYXJlSWQ9IiArIGl0ZW0uc2hhcmVJZDsKCQkJCQl1cmwgKz0gJyZkdD0xJnNoYXJlSWQ9JyArIGl0ZW0uc2hhcmVJZDsKCQkJCX0KCQkJCWxldCBzaWduID0gbWQ1KG8pLnRvU3RyaW5nKCk7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5nZXQodXJsLCB7CgkJCQkJImFjY2VwdCI6ICJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgiLAoJCQkJCSJzaWduLXR5cGUiOiAxLAoJCQkJCSJhY2Nlc3N0b2tlbiI6IHRva2VuLAoJCQkJCSJ0aW1lc3RhbXAiOiB0aW1lLAoJCQkJCSJzaWduYXR1cmUiOiBzaWduCgkJCQl9KTsKCQkJCWlmIChyZXMucmVzX2NvZGUgPT09IDApIHsKCQkJCQlyZXR1cm4gewoJCQkJCQlpbmRleCwKCQkJCQkJZG93bmxvYWRVcmw6IHJlcy5maWxlRG93bmxvYWRVcmwKCQkJCQl9OwoJCQkJfSBlbHNlIGlmIChyZXMuZXJyb3JDb2RlID09PSAnSW52YWxpZFNlc3Npb25LZXknKSB7CgkJCQkJcmV0dXJuIHsKCQkJCQkJaW5kZXgsCgkJCQkJCWRvd25sb2FkVXJsOiAn5o+Q56S677yaPGJyPuivt+WFiOeZu+W9lee9keebmH4nCgkJCQkJfTsKCQkJCX0gZWxzZSBpZiAocmVzLnJlc19jb2RlID09PSAnU2hhcmVOb3RGb3VuZEZsYXREaXInKSB7CgkJCQkJcmV0dXJuIHsKCQkJCQkJaW5kZXgsCgkJCQkJCWRvd25sb2FkVXJsOiAn5o+Q56S677yaPGJyPuivt+WFiFvovazlrZhd5paH5Lu277yM5LmL5ZCO5YaN8J+RieWJjeW+gFvmiJHnmoTnvZHnm5hd5Lit5LiL6L295ZOmficKCQkJCQl9OwoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gewoJCQkJCQlpbmRleCwKCQkJCQkJZG93bmxvYWRVcmw6ICfojrflj5bkuIvovb3lnLDlnYDlpLHotKXvvIzliLfmlrDlkI7lho3or5Xor5XlkKd+JwoJCQkJCX07CgkJCQl9CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCXJldHVybiB7CgkJCQkJaW5kZXgsCgkJCQkJZG93bmxvYWRVcmw6ICfojrflj5bkuIvovb3lnLDlnYDlpLHotKXvvIzliLfmlrDlkI7lho3or5Xor5XlkKd+JwoJCQkJfTsKCQkJfQoJCX0sCgoJCWFzeW5jIGdldFBDU0xpbmsoKSB7CgkJCXNlbGVjdExpc3QgPSB0aGlzLmdldFNlbGVjdGVkTGlzdCgpOwoJCQlpZiAoc2VsZWN0TGlzdC5sZW5ndGggPT09IDApIHsKCQkJCXJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+6K+35YWI5Yu+6YCJ6KaB5LiL6L2955qE5paH5Lu25o2PficpOwoJCQl9CgkJCWlmICh0aGlzLmlzT25seUZvbGRlcigpKSB7CgkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+aJk+W8gOaWh+S7tuWkueWQjuWGjeWLvumAieaWh+S7tn4nKTsKCQkJfQoJCQlsZXQgdG9rZW4gPSBiYXNlLmdldFN0b3JhZ2UoJ2FjY2Vzc1Rva2VuJykgfHwgYXdhaXQgdGhpcy5nZXRUb2tlbigpOwoJCQlpZiAoIXRva2VuKSB7CgkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+WFiOeZu+W9lee9keebmH4nKTsKCQkJfQoJCQlsZXQgcXVldWUgPSBbXTsKCQkJc2VsZWN0TGlzdC5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4gewoJCQkJcXVldWUucHVzaCh0aGlzLmdldEZpbGVVcmxCeU9uY2UoaXRlbSwgaW5kZXgsIHRva2VuKSk7CgkJCX0pOwoKCQkJY29uc3QgcmVzID0gYXdhaXQgUHJvbWlzZS5hbGwocXVldWUpOwoJCQlyZXMuZm9yRWFjaCh2YWwgPT4gewoJCQkJc2VsZWN0TGlzdFt2YWwuaW5kZXhdLmRvd25sb2FkVXJsID0gdmFsLmRvd25sb2FkVXJsOwoJCQl9KTsKCgkJCWxldCBodG1sID0gdGhpcy5nZW5lcmF0ZURvbShzZWxlY3RMaXN0KTsKCQkJdGhpcy5zaG93TWFpbkRpYWxvZyhwYW5bbW9kZV1bMF0sIGh0bWwsIHBhblttb2RlXVsxXSk7CgkJfSwKCgkJZ2VuZXJhdGVEb20obGlzdCkgewoJCQlsZXQgY29udGVudCA9ICc8ZGl2IGNsYXNzPSJwbC1tYWluIj4nOwoJCQlsZXQgYWxpbmtBbGxUZXh0ID0gJyc7CgkJCWxpc3QuZm9yRWFjaCgodiwgaSkgPT4gewoJCQkJaWYgKHYuaXNGb2xkZXIpIHJldHVybjsKCQkJCWxldCBmaWxlbmFtZSA9IHYuZmlsZU5hbWU7CgkJCQlsZXQgc2l6ZSA9IGJhc2Uuc2l6ZUZvcm1hdCh2LnNpemUpOwoJCQkJbGV0IGRsaW5rID0gdi5kb3dubG9hZFVybDsKCQkJCWlmIChtb2RlID09PSAnYXBpJykgewoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXBpIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSIgZGF0YS1pbmRleD0iJHtpfSI+JHtkbGlua308L2E+CgkJCQkJCQkJPC9kaXY+YDsKCQkJCX0KCQkJCWlmIChtb2RlID09PSAnYXJpYScpIHsKCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9BcmlhKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQkJaWYgKG1vZGUgPT09ICdycGMnKSB7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxidXR0b24gY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLXJwYyBwbC1idG4tcHJpbWFyeSBwbC1idG4taW5mbyIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRldmljZSI+PC9lbT48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDVweDsiPuaOqOmAgeWIsCBSUEMg5LiL6L295ZmoPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2N1cmwnKSB7CgkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQ3VybChkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwoJCQkJCWFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2Y3VybOmTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2JjJykgewoJCQkJCWxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0JDKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX0iIHRpdGxlPSLngrnlh7vnlKjmr5TnibnlvZfmmJ/kuIvovb0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQl9KTsKCQkJY29udGVudCArPSAnPC9kaXY+JzsKCQkJaWYgKG1vZGUgPT09ICdhcmlhJykKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOWRveS7pOihjDwvYnV0dG9uPjwvZGl2PmA7CgkJCWlmIChtb2RlID09PSAncnBjJykgewoJCQkJbGV0IHJwYyA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpICsgJzonICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpOwoJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLXNlbmQtcnBjIj7lj5HpgIHlhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIHRpdGxlPSIke3JwY30iIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweCI+6K6+572uIFJQQyDlj4LmlbDvvIjlvZPliY3kuLrvvJoke3JwY33vvIk8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4tc3VjY2VzcyBsaXN0ZW5lci1ycGMtdGFzayIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4O2Rpc3BsYXk6IG5vbmUiPuafpeeci+S4i+i9veS7u+WKoTwvYnV0dG9uPjwvZGl2PmA7CgkJCX0KCQkJaWYgKG1vZGUgPT09ICdjdXJsJykKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+6K6+572u57uI56uv57G75Z6L77yI5b2T5YmN5Li677yaJHt0ZXJtaW5hbFR5cGVbYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyldfe+8iTwvYnV0dG9uPjwvZGl2PmA7CgkJCXJldHVybiBjb250ZW50OwoJCX0sCgoJCWFzeW5jIHNlbmRMaW5rVG9SUEMoZmlsZW5hbWUsIGxpbmspIHsKCQkJbGV0IHJwYyA9IHsKCQkJCWRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCgkJCQlwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCgkJCQlwYXRoOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyksCgkJCQl0b2tlbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKSwKCQkJCWRpcjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJyksCgkJCX07CgoJCQlsZXQgdXJsID0gYCR7cnBjLmRvbWFpbn06JHtycGMucG9ydH0ke3JwYy5wYXRofWA7CgkJCWxldCBycGNEYXRhID0gewoJCQkJaWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAoJCQkJanNvbnJwYzogJzIuMCcsCgkJCQltZXRob2Q6ICdhcmlhMi5hZGRVcmknLAoJCQkJcGFyYW1zOiBbYHRva2VuOiR7cnBjLnRva2VufWAsIFtsaW5rXSwgewoJCQkJCWRpcjogcnBjLmRpciwKCQkJCQlvdXQ6IGZpbGVuYW1lLAoJCQkJCWhlYWRlcjogW10KCQkJCX1dCgkJCX07CgkJCXRyeSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHVybCwgcnBjRGF0YSwge30sICcnKTsKCQkJCWlmIChyZXMucmVzdWx0KSByZXR1cm4gJ3N1Y2Nlc3MnOwoJCQkJcmV0dXJuICdmYWlsJzsKCQkJfSBjYXRjaCAoZSkgewoJCQkJcmV0dXJuICdmYWlsJzsKCQkJfQoJCX0sCgoJCWdldFNlbGVjdGVkTGlzdCgpIHsKCQkJdHJ5IHsKCQkJCXJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuYy1maWxlLWxpc3QiKS5fX3Z1ZV9fLnNlbGVjdGVkTGlzdDsKCQkJfSBjYXRjaCAoZSkgewoJCQkJcmV0dXJuIFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuaW5mby1kZXRhaWwiKS5fX3Z1ZV9fLmZpbGVEZXRhaWxdOwoJCQl9CgkJfSwKCgkJZGV0ZWN0UGFnZSgpIHsKCQkJbGV0IHBhdGggPSBsb2NhdGlvbi5wYXRobmFtZTsKCQkJaWYgKC9eXC93ZWJcL21haW4vLnRlc3QocGF0aCkpIHJldHVybiAnaG9tZSc7CgkJCWlmICgvXlwvd2ViXC9zaGFyZS8udGVzdChwYXRoKSkgcmV0dXJuICdzaGFyZSc7CgkJCXJldHVybiAnJzsKCQl9LAoKCQlpc09ubHlGb2xkZXIoKSB7CgkJCWZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0TGlzdC5sZW5ndGg7IGkrKykgewoJCQkJaWYgKCFzZWxlY3RMaXN0W2ldLmlzRm9sZGVyKSByZXR1cm4gZmFsc2U7CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJc2hvd01haW5EaWFsb2codGl0bGUsIGh0bWwsIGZvb3RlcikgewoJCQlTd2FsLmZpcmUoewoJCQkJdGl0bGUsCgkJCQlodG1sLAoJCQkJZm9vdGVyLAoJCQkJYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAoJCQkJc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAoJCQkJcG9zaXRpb246ICdjZW50ZXInLC8vdG9wCgkJCQl3aWR0aCwKCQkJCXBhZGRpbmc6ICcxNXB4IDIwcHggNXB4JywKCQkJCWN1c3RvbUNsYXNzLAoJCQkJY29uZmlybUJ1dHRvblRleHQ6ICflhbPpl60nLAoJCQl9KTsKCQl9LAoKCQlhc3luYyBpbml0UGFuTGlua2VyKCkgewoJCQlwdCA9IHRoaXMuZGV0ZWN0UGFnZSgpOwoJCQliYXNlLmNyZWF0ZVRpcCgpOwoJCQliYXNlLnJlZ2lzdGVyTWVudUNvbW1hbmQoKTsKCQkJaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gJ3YxJykgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL3RpYW55aS8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gJ3YyJykgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL3YyL3RpYW55aS8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gIm5vIikgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KGBodHRwczovL2djb3JlLmpzZGVsaXZyLm5ldC9naC9obWp6MTAwL09ubGluZS1kaXNrLWRpcmVjdC1saW5rLWRvd25sb2FkLWFzc2lzdGFudEBtYWluL2NvbmZpZy90aWFueWkuanNvbmAsIHt9LCAidGV4dCIsIHt9KTsKCQkJCXBhbiA9IEpTT04ucGFyc2UocmVzKTsKCQkJfSBlbHNlIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLmdldChgaHR0cHM6Ly9nY29yZS5qc2RlbGl2ci5uZXQvZ2gvaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnRAbWFpbi9jb25maWcvY29uZmlnLmpzb25gLCB7fSwgInRleHQiLCB7fSk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKHJlcyk7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJywgJ3YyJyk7CgkJCX0KCQkJT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKHBhbik7CgkJCXBhbi5udW0gPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJykgfHwgcGFuLmxpY2Vuc2UgPT09IGJhc2UuZ2V0VmFsdWUoJ2xpY2Vuc2UnKSA/IHRoaXMuYWRkQnV0dG9uKCkgOiB0aGlzLmFkZEluaXRCdXR0b24oKTsKCQkJdGhpcy5nZXRUb2tlbigpOwoJCX0KCX07CgoJLy/ov4Xpm7fkupHnm5gKCWxldCB4dW5sZWkgPSB7CgoJCWNvbnZlcnRMaW5rVG9BcmlhKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlmaWxlbmFtZSA9IGJhc2UuZml4RmlsZW5hbWUoZmlsZW5hbWUpOwoJCQlyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBhcmlhMmMgIiR7bGlua30iIC0tb3V0ICIke2ZpbGVuYW1lfSJgKTsKCQl9LAoKCQljb252ZXJ0TGlua1RvQkMobGluaywgZmlsZW5hbWUsIHVhKSB7CgkJCWxldCBiYyA9IGBBQS8ke2VuY29kZVVSSUNvbXBvbmVudChmaWxlbmFtZSl9Lz91cmw9JHtlbmNvZGVVUklDb21wb25lbnQobGluayl9WlpgOwoJCQlyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBiYzovL2h0dHAvJHtiYXNlLmVuY29kZShiYyl9YCk7CgkJfSwKCgkJY29udmVydExpbmtUb0N1cmwobGluaywgZmlsZW5hbWUsIHVhKSB7CgkJCWxldCB0ZXJtaW5hbCA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpOwoJCQlmaWxlbmFtZSA9IGJhc2UuZml4RmlsZW5hbWUoZmlsZW5hbWUpOwoJCQlyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGAke3Rlcm1pbmFsICE9PSAnd3AnID8gJ2N1cmwnIDogJ2N1cmwuZXhlJ30gLUwgLUMgLSAiJHtsaW5rfSIgLW8gIiR7ZmlsZW5hbWV9ImApOwoJCX0sCgoJCWFkZFBhZ2VMaXN0ZW5lcigpIHsKCQkJZG9jLm9uKCdjbGljaycsICcucGwtYnV0dG9uLW1vZGUnLCAoZSkgPT4gewoJCQkJbW9kZSA9IGUudGFyZ2V0LmRhdGFzZXQubW9kZTsKCQkJCVN3YWwuZmlyZSh7CgkJCQkJaGVpZ2h0QXV0bzogZmFsc2UsCgkJCQkJc2Nyb2xsYmFyUGFkZGluZzogZmFsc2UsCgkJCQkJc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLAoJCQkJCWh0bWw6IGDpk77mjqXojrflj5bkuK1gLAoJCQkJCXdpbGxPcGVuOiBmdW5jdGlvbigpIHsKCQkJCQkJU3dhbC5zaG93TG9hZGluZygpOwoJCQkJCX0KCQkJCX0pOwoJCQkJdGhpcy5nZXRQQ1NMaW5rKCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFwaScsIGFzeW5jIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQkkKCcjZG93bmxvYWRJZnJhbWUnKS5hdHRyKCdzcmMnLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLWxpbmstYXBpLWJ0bicsIGFzeW5jIChlKSA9PiB7CgkJCQliYXNlLnNldENsaXBib2FyZChlLnRhcmdldC5kYXRhc2V0LmZpbGVuYW1lKTsKCQkJCSQoZS50YXJnZXQpLnRleHQoJ+WkjeWItuaIkOWKnycpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCXNldFRpbWVvdXQoCgkJCQkJZnVuY3Rpb24gKCl7CgkJCQkJCSQoZS50YXJnZXQpLnRleHQoJ+mHjeaWsOWkjeWIticpLmFuaW1hdGUoe29wYWNpdHk6ICcxJ30sICJzbG93Iik7CgkJCQkJfSwyMDAwCgkJCQkpCgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWJjLWJ0bicsIGFzeW5jIChlKSA9PiB7CgkJCQlsZXQgbWlycm9yID0gYmFzZS5nZXRNaXJyb3JMaXN0KGUudGFyZ2V0LmRhdGFzZXQuZGxpbmssIHBhbi5taXJyb3IpOwoJCQkJYmFzZS5zZXRDbGlwYm9hcmQobWlycm9yKTsKCQkJCSQoZS50YXJnZXQpLnRleHQoJ+WkjeWItuaIkOWKnycpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCXNldFRpbWVvdXQoCgkJCQkJZnVuY3Rpb24gKCl7CgkJCQkJCSQoZS50YXJnZXQpLnRleHQoJ+mHjeaWsOWkjeWIticpLmFuaW1hdGUoe29wYWNpdHk6ICcxJ30sICJzbG93Iik7CgkJCQkJfSwyMDAwCgkJCQkpCgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFsbCcsIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQliYXNlLnNldENsaXBib2FyZChkZWNvZGVVUklDb21wb25lbnQoZS50YXJnZXQuZGF0YXNldC5saW5rKSk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflpI3liLbmiJDlip8nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCQlzZXRUaW1lb3V0KAoJCQkJCWZ1bmN0aW9uICgpewoJCQkJCQkkKGUudGFyZ2V0KS50ZXh0KCfph43mlrDlpI3liLYnKS5hbmltYXRlKHtvcGFjaXR5OiAnMSd9LCAic2xvdyIpOwoJCQkJCX0sMjAwMAoJCQkJKQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJbGV0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTsgCgoJCQkJdGFyZ2V0LmZpbmQoJy5pY29uJykucmVtb3ZlKCk7CgkJCQl0YXJnZXQuZmluZCgnLnBsLWxvYWRpbmcnKS5yZW1vdmUoKTsKCQkJCXRhcmdldC5wcmVwZW5kKGJhc2UuY3JlYXRlTG9hZGluZygpKTsKCgkJCQlsZXQgcmVzID0gYXdhaXQgdGhpcy5zZW5kTGlua1RvUlBDKGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmZpbGVuYW1lLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKCQkJCWlmIChyZXMgPT09ICdzdWNjZXNzJykgewoJCQkJCSQoJy5saXN0ZW5lci1ycGMtdGFzaycpLnNob3coKTsKCQkJCQl0YXJnZXQucmVtb3ZlQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKCflj5HpgIHmiJDlip/kuoYh5b+r5Y6755yL55yL5ZCnficpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0gZWxzZSBpZiAocmVzID09PSAnYXNzaXN0YW50JykgewoJCQkJCXRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoYCR7cGFuLmluaXRbNV198J+RiTxhIGhyZWY9IiR7cGFuLmFzc2lzdGFudH0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0icGwtYSI+54K55Ye75q2k5aSE5a6J6KOFPC9hPvCfkYhgKTsKCQkJCX0gZWxzZSB7CgkJCQkJdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykudGV4dCgn5Y+R6YCB5aSx6LSl77yM5qOA5p+l5LiA5LiL5oKo55qEUlBD6YWN572u5L+h5oGv5ZOmIScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0KCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsKCQkJCSQoJy5saXN0ZW5lci1saW5rLXJwYycpLmNsaWNrKCk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflj5HpgIHlrozmiJDvvIzlj5HpgIHnu5Pmnpzop4HkuIrmlrnmjInpkq7lk6Z+JykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi1zZXR0aW5nJywgKCkgPT4gewoJCQkJYmFzZS5zaG93U2V0dGluZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi11cGRhdGVsb2cnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dVcGRhdGVMb2coKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXJwYy10YXNrJywgKCkgPT4gewoJCQkJbGV0IHJwYyA9IEpTT04uc3RyaW5naWZ5KHsKCQkJCQlkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAoJCQkJCXBvcnQ6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKCQkJCX0pLCB1cmwgPSBgJHtwYW4uZH0vP3JwYz0ke2Jhc2UuZW5jb2RlKHJwYyl9IyR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKX1gOwoJCQkJR01fb3BlbkluVGFiKHVybCwge2FjdGl2ZTogdHJ1ZX0pOwoJCQl9KTsKCQl9LAoKCQlhZGRCdXR0b24oKSB7CgkJCWlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpKXsKCQkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwbC1idXR0b24tbGluayIpLnJlbW92ZSgpCgkJCX0KCQkJaWYgKCFwdCkgcmV0dXJuOwoJCQlsZXQgJHRvb2xXcmFwOwoJCQlsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgY2xhc3M9Inh1bmxlaS1idXR0b24gcGwtYnV0dG9uIiBpZD0icGwtYnV0dG9uLWxpbmsiPjxpIGNsYXNzPSJ4bHBmb250IHhscC1kb3dubG9hZCI+PC9pPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEzcHg7bWFyZ2luLWxlZnQ6IDZweDsiPuS4i+i9veWKqeaJizwvc3Bhbj48dWwgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUiIHN0eWxlPSJ0b3A6IDM0cHg7Ij48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcGkiPkFQSeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXJpYSIgPkFyaWHkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9InJwYyI+UlBD5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJjdXJsIj5jVVJM5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJiYyIgPkJD5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSBsaXN0ZW5lci1vcGVuLXNldHRpbmciPuWKqeaJi+iuvue9rjwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUgbGlzdGVuZXItb3Blbi11cGRhdGVsb2ciPuabtOaWsOaXpeW/lzwvbGk+PC91bD48L2Rpdj5gKTsKCQkJaWYgKHB0ID09PSAnaG9tZScpIHsKCQkJCWJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLmhvbWUsICgpID0+IHsKCQkJCQkkdG9vbFdyYXAgPSAkKHBhbi5idG4uaG9tZSk7CgkJCQkJJCgnLnBsLWJ1dHRvbicpLmxlbmd0aCA9PT0gMCAmJiAkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKCQkJCX0pCgkJCX0KCQkJaWYgKHB0ID09PSAnc2hhcmUnKSB7CgkJCQkkYnV0dG9uLmNzcyh7J21hcmdpbi1yaWdodCc6ICcxMHB4J30pOwoJCQkJYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uc2hhcmUsICgpID0+IHsKCQkJCQkkdG9vbFdyYXAgPSAkKHBhbi5idG4uc2hhcmUpOwoJCQkJCSQoJy5wbC1idXR0b24nKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CgkJCQl9KQoJCQl9CgkJCXRoaXMuYWRkUGFnZUxpc3RlbmVyKCk7CgkJCWJhc2UuY3JlYXRlRG93bmxvYWRJZnJhbWUoKTsKCQl9LAoKCQlhZGRJbml0QnV0dG9uKCkgewoJCQlpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKSl7CgkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKS5yZW1vdmUoKQoJCQl9CgkJCWlmICghcHQpIHJldHVybjsKCQkJbGV0ICR0b29sV3JhcDsKCQkJbGV0ICRidXR0b24gPSAkKGA8ZGl2IGNsYXNzPSJ4dW5sZWktYnV0dG9uIHBsLWJ1dHRvbi1pbml0IiBpZD0icGwtYnV0dG9uLWxpbmsiPjxpIGNsYXNzPSJ4bHBmb250IHhscC1kb3dubG9hZCI+PC9pPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEzcHg7bWFyZ2luLWxlZnQ6IDZweDsiPuS4i+i9veWKqeaJiyjmnKrngrnkuq4pPC9zcGFuPjwvZGl2PmApOwoJCQlpZiAocHQgPT09ICdob21lJykgewoJCQkJYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uaG9tZSwgKCkgPT4gewoJCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJCQkkKCcucGwtYnV0dG9uLWluaXQnKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CgkJCQl9KQoJCQl9CgkJCWlmIChwdCA9PT0gJ3NoYXJlJykgewoJCQkJJGJ1dHRvbi5jc3MoeydtYXJnaW4tcmlnaHQnOiAnMTBweCd9KTsKCQkJCWJhc2UubGlzdGVuRWxlbWVudChwYW4uYnRuLnNoYXJlLCAoKSA9PiB7CgkJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLnNoYXJlKTsKCQkJCQkkKCcucGwtYnV0dG9uLWluaXQnKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CgkJCQl9KQoJCQl9CgkJCSRidXR0b24uY2xpY2soKCkgPT4gYmFzZS5pbml0RGlhbG9nKCkpOwoJCX0sCgoJCWdldFRva2VuKCkgewoJCQlsZXQgY3JlZGVudGlhbHMgPSB7fSwgY2FwdGNoYSA9IHt9OwoJCQlmb3IgKGxldCBpID0gMDsgaSA8IGxvY2FsU3RvcmFnZS5sZW5ndGg7IGkrKykgewoJCQkJaWYgKC9eY3JlZGVudGlhbHNfLy50ZXN0KGxvY2FsU3RvcmFnZS5rZXkoaSkpKSB7CgkJCQkJY3JlZGVudGlhbHMgPSBiYXNlLmdldFN0b3JhZ2UobG9jYWxTdG9yYWdlLmtleShpKSk7CgkJCQkJYmFzZS5zZXRTdG9yYWdlKCcnKTsKCQkJCX0KCQkJCWlmICgvXmNhcHRjaGFfW1x3XXsxNn0vLnRlc3QobG9jYWxTdG9yYWdlLmtleShpKSkpIHsKCQkJCQljYXB0Y2hhID0gYmFzZS5nZXRTdG9yYWdlKGxvY2FsU3RvcmFnZS5rZXkoaSkpOwoJCQkJfQoJCQl9CgkJCWxldCBkZXZpY2VpZCA9IC8oXHd7MzJ9KS8uZXhlYyhiYXNlLmdldFN0b3JhZ2UoJ2RldmljZWlkJykuc3BsaXQoJywnKSlbMF07CgkJCWxldCB0b2tlbiA9IHsKCQkJCWNyZWRlbnRpYWxzLAoJCQkJY2FwdGNoYSwKCQkJCWRldmljZWlkCgkJCX07CgkJCXJldHVybiB0b2tlbjsKCQl9LAoKCQlhc3luYyBnZXRGaWxlVXJsQnlPbmNlKGl0ZW0sIGluZGV4LCB0b2tlbikgewoJCQl0cnkgewoJCQkJaWYgKGl0ZW0uZG93bmxvYWRVcmwpIHJldHVybiB7CgkJCQkJaW5kZXgsCgkJCQkJZG93bmxvYWRVcmw6IGl0ZW0uZG93bmxvYWRVcmwKCQkJCX07CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5nZXQocGFuLnBjc1swXSArIGl0ZW0uaWQsIHsKCQkJCQknQXV0aG9yaXphdGlvbic6IGAke3Rva2VuLmNyZWRlbnRpYWxzLnRva2VuX3R5cGV9ICR7dG9rZW4uY3JlZGVudGlhbHMuYWNjZXNzX3Rva2VufWAsCgkJCQkJJ2NvbnRlbnQtdHlwZSc6ICJhcHBsaWNhdGlvbi9qc29uIiwKCQkJCQkneC1jYXB0Y2hhLXRva2VuJzogdG9rZW4uY2FwdGNoYS50b2tlbiwKCQkJCQkneC1kZXZpY2UtaWQnOiB0b2tlbi5kZXZpY2VpZCwKCQkJCX0pOwoJCQkJaWYgKHJlcy53ZWJfY29udGVudF9saW5rKSB7CgkJCQkJcmV0dXJuIHsKCQkJCQkJaW5kZXgsCgkJCQkJCWRvd25sb2FkVXJsOiByZXMud2ViX2NvbnRlbnRfbGluawoJCQkJCX07CgkJCQl9IGVsc2UgewoJCQkJCXJldHVybiB7CgkJCQkJCWluZGV4LAoJCQkJCQlkb3dubG9hZFVybDogJ+iOt+WPluS4i+i9veWcsOWdgOWksei0pe+8jOWIt+aWsOWQjuWGjeivleivleWQp34nCgkJCQkJfTsKCQkJCX0KCQkJfSBjYXRjaCAoZSkgewoJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7flhYjnmbvlvZXnvZHnm5jlkI7lho3liLfmlrDpobXpnaLlkaJ+Jyk7CgkJCX0KCQl9LAoKCQlhc3luYyBnZXRQQ1NMaW5rKCkgewoJCQlzZWxlY3RMaXN0ID0gdGhpcy5nZXRTZWxlY3RlZExpc3QoKTsKCQkJaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CgkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+WFiOWLvumAieimgeS4i+i9veeahOaWh+S7tuaNj34nKTsKCQkJfQoJCQlpZiAodGhpcy5pc09ubHlGb2xkZXIoKSkgewoJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7fmiZPlvIDmlofku7blpLnlkI7lho3li77pgInmlofku7Z+Jyk7CgkJCX0KCQkJaWYgKHB0ID09PSAnaG9tZScpIHsKCQkJCWxldCBxdWV1ZSA9IFtdOwoJCQkJbGV0IHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwoJCQkJc2VsZWN0TGlzdC5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4gewoJCQkJCXF1ZXVlLnB1c2godGhpcy5nZXRGaWxlVXJsQnlPbmNlKGl0ZW0sIGluZGV4LCB0b2tlbikpOwoJCQkJfSk7CgkJCQljb25zdCByZXMgPSBhd2FpdCBQcm9taXNlLmFsbChxdWV1ZSk7CgkJCQlyZXMuZm9yRWFjaCh2YWwgPT4gewoJCQkJCXNlbGVjdExpc3RbdmFsLmluZGV4XS5kb3dubG9hZFVybCA9IHZhbC5kb3dubG9hZFVybDsKCQkJCX0pOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7fkv53lrZjliLDoh6rlt7HnvZHnm5jlkI7lho3ljrvnvZHnm5jkuLvpobXkuIvovb3lk6Z+Jyk7CgkJCX0KCQkJbGV0IGh0bWwgPSB0aGlzLmdlbmVyYXRlRG9tKHNlbGVjdExpc3QpOwoJCQl0aGlzLnNob3dNYWluRGlhbG9nKHBhblttb2RlXVswXSwgaHRtbCwgcGFuW21vZGVdWzFdKTsKCgkJfSwKCgkJZ2VuZXJhdGVEb20obGlzdCkgewoJCQlsZXQgY29udGVudCA9ICc8ZGl2IGNsYXNzPSJwbC1tYWluIj4nOwoJCQlsZXQgYWxpbmtBbGxUZXh0ID0gJyc7CgkJCWxpc3QuZm9yRWFjaCgodiwgaSkgPT4gewoJCQkJaWYgKHYua2luZCA9PT0gJ2RyaXZlI2ZvbGRlcicpIHJldHVybjsKCQkJCWxldCBmaWxlbmFtZSA9IHYubmFtZTsKCQkJCWxldCBzaXplID0gYmFzZS5zaXplRm9ybWF0KCt2LnNpemUpOwoJCQkJbGV0IGRsaW5rID0gdi5kb3dubG9hZFVybDsKCQkJCWlmIChtb2RlID09PSAnYXBpJykgewoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXBpIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSIgZGF0YS1pbmRleD0iJHtpfSI+JHtkbGlua308L2E+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1idG4gbGlzdGVuZXItbGluay1hcGktYnRuIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSI+5aSN5Yi25paH5Lu25ZCNPC9kaXY+CgkJCQkJCQkJPC9kaXY+YDsKCQkJCX0KCQkJCWlmIChtb2RlID09PSAnYXJpYScpIHsKCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9BcmlhKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQkJaWYgKG1vZGUgPT09ICdycGMnKSB7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxidXR0b24gY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLXJwYyBwbC1idG4tcHJpbWFyeSBwbC1idG4taW5mbyIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRldmljZSI+PC9lbT48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDVweDsiPuaOqOmAgeWIsCBSUEMg5LiL6L295ZmoPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2N1cmwnKSB7CgkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQ3VybChkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwoJCQkJCWFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2Y3VybOmTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2JjJykgewoJCQkJCWxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0JDKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX0iIHRpdGxlPSLngrnlh7vnlKjmr5TnibnlvZfmmJ/kuIvovb0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tYnRuIGxpc3RlbmVyLWxpbmstYmMtYnRuIiBkYXRhLWRsaW5rPSIke2RsaW5rfSI+5aSN5Yi26ZWc5YOP5Zyw5Z2APC9kaXY+CgkJCQkJCQkJPC9kaXY+YDsKCQkJCX0KCQkJfSk7CgkJCWNvbnRlbnQgKz0gJzwvZGl2Pic7CgkJCWlmIChtb2RlID09PSAnYXJpYScpCgkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jlkb3ku6TooYw8L2J1dHRvbj48L2Rpdj5gOwoJCQlpZiAobW9kZSA9PT0gJ3JwYycpIHsKCQkJCWxldCBycGMgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSArICc6JyArIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSArIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKTsKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1zZW5kLXJwYyI+5Y+R6YCB5YWo6YOo6ZO+5o6lPC9idXR0b24+PGJ1dHRvbiB0aXRsZT0iJHtycGN9IiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXdhcm5pbmcgbGlzdGVuZXItb3Blbi1zZXR0aW5nIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHgiPuiuvue9riBSUEMg5Y+C5pWw77yI5b2T5YmN5Li677yaJHtycGN977yJPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXN1Y2Nlc3MgbGlzdGVuZXItcnBjLXRhc2siIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDtkaXNwbGF5OiBub25lIj7mn6XnnIvkuIvovb3ku7vliqE8L2J1dHRvbj48L2Rpdj5gOwoJCQl9CgkJCWlmIChtb2RlID09PSAnY3VybCcpCgkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDsiPuiuvue9rue7iOerr+exu+Wei++8iOW9k+WJjeS4uu+8miR7dGVybWluYWxUeXBlW2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpXX3vvIk8L2J1dHRvbj48L2Rpdj5gOwoJCQlyZXR1cm4gY29udGVudDsKCQl9LAoKCQlhc3luYyBzZW5kTGlua1RvUlBDKGZpbGVuYW1lLCBsaW5rKSB7CgkJCWxldCBycGMgPSB7CgkJCQlkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAoJCQkJcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAoJCQkJcGF0aDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpLAoJCQkJdG9rZW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyksCgkJCQlkaXI6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RpcicpLAoJCQl9OwoKCQkJbGV0IHVybCA9IGAke3JwYy5kb21haW59OiR7cnBjLnBvcnR9JHtycGMucGF0aH1gOwoJCQlsZXQgcnBjRGF0YSA9IHsKCQkJCWlkOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKCQkJCWpzb25ycGM6ICcyLjAnLAoJCQkJbWV0aG9kOiAnYXJpYTIuYWRkVXJpJywKCQkJCXBhcmFtczogW2B0b2tlbjoke3JwYy50b2tlbn1gLCBbbGlua10sIHsKCQkJCQlkaXI6IHJwYy5kaXIsCgkJCQkJb3V0OiBmaWxlbmFtZSwKCQkJCQloZWFkZXI6IFtdCgkJCQl9XQoJCQl9OwoJCQl0cnkgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdCh1cmwsIHJwY0RhdGEsIHt9LCAnJyk7CgkJCQlpZiAocmVzLnJlc3VsdCkgcmV0dXJuICdzdWNjZXNzJzsKCQkJCXJldHVybiAnZmFpbCc7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCXJldHVybiAnZmFpbCc7CgkJCX0KCQl9LAoKCQlnZXRTZWxlY3RlZExpc3QoKSB7CgkJCXRyeSB7CgkJCQlsZXQgZG9tcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wYW4tbGlzdCBsaScpOwoJCQkJbGV0IHNlbGVjdGVkTGlzdCA9IFtdOwoJCQkJZm9yIChsZXQgZG9tIG9mIGRvbXMpIHsKCQkJCQlsZXQgZG9tVnVlID0gZG9tLl9fdnVlX187CgkJCQkJaWYgKGRvbVZ1ZS5zZWxlY3RlZC5pbmNsdWRlcyhkb21WdWUuaW5mby5pZCkpIHsKCQkJCQkJc2VsZWN0ZWRMaXN0LnB1c2goZG9tVnVlLmluZm8pOwoJCQkJCX0KCQkJCX0KCQkJCXJldHVybiBzZWxlY3RlZExpc3Q7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCXJldHVybiBbXTsKCQkJfQoJCX0sCgoJCWRldGVjdFBhZ2UoKSB7CgkJCWxldCBwYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CgkJCWlmICgvXlwvJC8udGVzdChwYXRoKSkgcmV0dXJuICdob21lJzsKCQkJaWYgKC9eXC8oc3xzaGFyZSlcLy8udGVzdChwYXRoKSkgcmV0dXJuICdzaGFyZSc7CgkJCXJldHVybiAnJzsKCQl9LAoKCQlpc09ubHlGb2xkZXIoKSB7CgkJCWZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0TGlzdC5sZW5ndGg7IGkrKykgewoJCQkJaWYgKHNlbGVjdExpc3RbaV0ua2luZCA9PT0gJ2RyaXZlI2ZpbGUnKSByZXR1cm4gZmFsc2U7CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJc2hvd01haW5EaWFsb2codGl0bGUsIGh0bWwsIGZvb3RlcikgewoJCQlTd2FsLmZpcmUoewoJCQkJdGl0bGUsCgkJCQlodG1sLAoJCQkJZm9vdGVyLAoJCQkJYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAoJCQkJc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAoJCQkJcG9zaXRpb246ICdjZW50ZXInLC8vdG9wCgkJCQl3aWR0aCwKCQkJCXBhZGRpbmc6ICcxNXB4IDIwcHggNXB4JywKCQkJCWN1c3RvbUNsYXNzLAoJCQkJY29uZmlybUJ1dHRvblRleHQ6ICflhbPpl60nLAoJCQl9KTsKCQl9LAoKCQlhc3luYyBpbml0UGFuTGlua2VyKCkgewoJCQlwdCA9IHRoaXMuZGV0ZWN0UGFnZSgpOwoJCQliYXNlLmNyZWF0ZVRpcCgpOwoJCQliYXNlLnJlZ2lzdGVyTWVudUNvbW1hbmQoKTsKCQkJaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gJ3YxJykgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL3h1bmxlaS8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gJ3YyJykgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL3YyL3h1bmxlaS8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gIm5vIikgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KGBodHRwczovL2djb3JlLmpzZGVsaXZyLm5ldC9naC9obWp6MTAwL09ubGluZS1kaXNrLWRpcmVjdC1saW5rLWRvd25sb2FkLWFzc2lzdGFudEBtYWluL2NvbmZpZy94dW5sZWkuanNvbmAsIHt9LCAidGV4dCIsIHt9KTsKCQkJCXBhbiA9IEpTT04ucGFyc2UocmVzKTsKCQkJfSBlbHNlIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLmdldChgaHR0cHM6Ly9nY29yZS5qc2RlbGl2ci5uZXQvZ2gvaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnRAbWFpbi9jb25maWcvY29uZmlnLmpzb25gLCB7fSwgInRleHQiLCB7fSk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKHJlcyk7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJywgJ3YyJyk7CgkJCX0KCQkJT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKHBhbik7CgkJCXBhbi5udW0gPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJykgfHwgcGFuLmxpY2Vuc2UgPT09IGJhc2UuZ2V0VmFsdWUoJ2xpY2Vuc2UnKSA/IHRoaXMuYWRkQnV0dG9uKCkgOiB0aGlzLmFkZEluaXRCdXR0b24oKTsKCQl9Cgl9OwoKCS8v5aS45YWL572R55uYCglsZXQgcXVhcmsgPSB7CgoJCWNvbnZlcnRMaW5rVG9BcmlhKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlmaWxlbmFtZSA9IGJhc2UuZml4RmlsZW5hbWUoZmlsZW5hbWUpOwoJCQlyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBhcmlhMmMgIiR7bGlua30iIC0tb3V0ICIke2ZpbGVuYW1lfSIgLS1oZWFkZXIgIkNvb2tpZTogJHtkb2N1bWVudC5jb29raWV9ImApOwoJCX0sCgoJCWNvbnZlcnRMaW5rVG9CQyhsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJbGV0IGJjID0gYEFBLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVuYW1lKX0vP3VybD0ke2VuY29kZVVSSUNvbXBvbmVudChsaW5rKX0mY29va2llPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LmNvb2tpZSl9WlpgOwoJCQlyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGBiYzovL2h0dHAvJHtiYXNlLmVuY29kZShiYyl9YCk7CgkJfSwKCgkJY29udmVydExpbmtUb0N1cmwobGluaywgZmlsZW5hbWUsIHVhKSB7CgkJCWxldCB0ZXJtaW5hbCA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpOwoJCQlmaWxlbmFtZSA9IGJhc2UuZml4RmlsZW5hbWUoZmlsZW5hbWUpOwoJCQlyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGAke3Rlcm1pbmFsICE9PSAnd3AnID8gJ2N1cmwnIDogJ2N1cmwuZXhlJ30gLUwgLUMgLSAiJHtsaW5rfSIgLW8gIiR7ZmlsZW5hbWV9IiAtYiAiJHtkb2N1bWVudC5jb29raWV9ImApOwoJCX0sCgoJCWFkZFBhZ2VMaXN0ZW5lcigpIHsKCQkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc2hjaGFuZ2UnLCBhc3luYyAoZSkgPT4gewoJCQkJbGV0IGhvbWUgPSAnaHR0cHM6Ly9wYW4ucXVhcmsuY24vbGlzdCMvJywgYWxsID0gJ2h0dHBzOi8vcGFuLnF1YXJrLmNuL2xpc3QjL2xpc3QvYWxsJzsKCQkJCWlmIChlLm9sZFVSTCA9PT0gaG9tZSAmJiBlLm5ld1VSTCA9PT0gYWxsKSByZXR1cm47CgkJCQlhd2FpdCBiYXNlLnNsZWVwKDE1MCk7CgkJCQlpZiAoJCgnLnF1YXJrLWJ1dHRvbicpLmxlbmd0aCA+IDApIHJldHVybjsKCQkJCXBhbi5udW0gPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJykgfHwgcGFuLmxpY2Vuc2UgPT09IGJhc2UuZ2V0VmFsdWUoJ2xpY2Vuc2UnKSA/IHRoaXMuYWRkQnV0dG9uKCkgOiB0aGlzLmFkZEluaXRCdXR0b24oKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLnBsLWJ1dHRvbi1tb2RlJywgKGUpID0+IHsKCQkJCW1vZGUgPSBlLnRhcmdldC5kYXRhc2V0Lm1vZGU7CgkJCQlTd2FsLmZpcmUoewoJCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJCXNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKCQkJCQlodG1sOiBg6ZO+5o6l6I635Y+W5LitYCwKCQkJCQl3aWxsT3BlbjogZnVuY3Rpb24oKSB7CgkJCQkJCVN3YWwuc2hvd0xvYWRpbmcoKTsKCQkJCQl9CgkJCQl9KTsKCQkJCXRoaXMuZ2V0UENTTGluaygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1zYXZlJywgYXN5bmMgKGUpID0+IHsKCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCXNlbGVjdExpc3QgPSB0aGlzLmdldFNlbGVjdGVkTGlzdCgpOwoJCQkJaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CgkJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7flhYjli77pgInopoHkv53lrZjliLDnvZHnm5jnmoTmlofku7bmjY9+Jyk7CgkJCQl9CgkJCQltZXNzYWdlLmluZm8oJ+aPkOekuu+8mjxicj7lm6DlpLjlhYvpmZDliLbvvIzor7flhYjkv53lrZjliLDoh6rlt7HnvZHnm5jlkI7lho3kuIvovb3lk6YhJyk7CgkJCQlhd2FpdCBiYXNlLnNsZWVwKDUwMCk7CgkJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZmlsZS1pbmZvX3InKS5jbGljaygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcGknLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJJCgnI2Rvd25sb2FkSWZyYW1lJykuYXR0cignc3JjJywgZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQubGluayk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFsbCcsIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQliYXNlLnNldENsaXBib2FyZChkZWNvZGVVUklDb21wb25lbnQoZS50YXJnZXQuZGF0YXNldC5saW5rKSk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflpI3liLbmiJDlip8nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCQlzZXRUaW1lb3V0KAoJCQkJCWZ1bmN0aW9uICgpewoJCQkJCQkkKGUudGFyZ2V0KS50ZXh0KCfph43mlrDlpI3liLYnKS5hbmltYXRlKHtvcGFjaXR5OiAnMSd9LCAic2xvdyIpOwoJCQkJCX0sMjAwMAoJCQkJKQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1ycGMnLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJbGV0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTsgCgoJCQkJdGFyZ2V0LmZpbmQoJy5pY29uJykucmVtb3ZlKCk7CgkJCQl0YXJnZXQuZmluZCgnLnBsLWxvYWRpbmcnKS5yZW1vdmUoKTsKCQkJCXRhcmdldC5wcmVwZW5kKGJhc2UuY3JlYXRlTG9hZGluZygpKTsKCgkJCQlsZXQgcmVzID0gYXdhaXQgdGhpcy5zZW5kTGlua1RvUlBDKGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmZpbGVuYW1lLCBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5saW5rKTsKCQkJCWlmIChyZXMgPT09ICdzdWNjZXNzJykgewoJCQkJCSQoJy5saXN0ZW5lci1ycGMtdGFzaycpLnNob3coKTsKCQkJCQl0YXJnZXQucmVtb3ZlQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS5odG1sKCflj5HpgIHmiJDlip/kuoYh5b+r5Y6755yL55yL5ZCnficpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0gZWxzZSBpZiAocmVzID09PSAnYXNzaXN0YW50JykgewoJCQkJCXRhcmdldC5hZGRDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoYCR7cGFuLmluaXRbNV198J+RiTxhIGhyZWY9IiR7cGFuLmFzc2lzdGFudH0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0icGwtYSI+54K55Ye75q2k5aSE5a6J6KOFPC9hPvCfkYhgKTsKCQkJCX0gZWxzZSB7CgkJCQkJdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykudGV4dCgn5Y+R6YCB5aSx6LSl77yM5qOA5p+l5LiA5LiL5oKo55qEUlBD6YWN572u5L+h5oGv5ZOmIScpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCX0KCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXNlbmQtcnBjJywgKGUpID0+IHsKCQkJCSQoJy5saXN0ZW5lci1saW5rLXJwYycpLmNsaWNrKCk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflj5HpgIHlrozmiJDvvIzlj5HpgIHnu5Pmnpzop4HkuIrmlrnmjInpkq7lk6Z+JykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi1zZXR0aW5nJywgKCkgPT4gewoJCQkJYmFzZS5zaG93U2V0dGluZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi11cGRhdGVsb2cnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dVcGRhdGVMb2coKTsKCQkJfSk7CgkJCWRvYy5vbignY2xpY2snLCAnLmxpc3RlbmVyLXJwYy10YXNrJywgKCkgPT4gewoJCQkJbGV0IHJwYyA9IEpTT04uc3RyaW5naWZ5KHsKCQkJCQlkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAoJCQkJCXBvcnQ6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSwKCQkJCX0pLCB1cmwgPSBgJHtwYW4uZH0vP3JwYz0ke2Jhc2UuZW5jb2RlKHJwYyl9IyR7YmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKX1gOwoJCQkJR01fb3BlbkluVGFiKHVybCwge2FjdGl2ZTogdHJ1ZX0pOwoJCQl9KTsKCQl9LAoKCQlhZGRCdXR0b24oKSB7CgkJCWxldCBzdmcgPSAnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTWpJaUlHaGxhV2RvZEQwaU1qSWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQR2NnWm1sc2JEMGlibTl1WlNJZ1ptbHNiQzF5ZFd4bFBTSmxkbVZ1YjJSa0lpQnpkSEp2YTJVOUlpTkdSa1pHUmtZaUlITjBjbTlyWlMxM2FXUjBhRDBpTWlJK1BIQmhkR2dnYzNSeWIydGxMV3hwYm1WallYQTlJbkp2ZFc1a0lpQnpkSEp2YTJVdGJHbHVaV3B2YVc0OUluSnZkVzVrSWlCa1BTSk5PU0F4TW13eUlESWdNaTB5ZWlJdlBqeHdZWFJvSUdROUlrMHhOQ0E0YURFdU5UVXpZeTQ0TlNBd0lERXVNVFl1TURreklERXVORGN1TWpZM0xqTXhNUzR4TnpRdU5UVTJMalF6TGpjeU1pNDNOVFl1TVRZMkxqTXlOaTR5TlRVdU5qVXVNalUxSURFdU5UUjJOQzQ0TnpOak1DQXVPRGt5TFM0d09Ea2dNUzR5TVRVdExqSTFOU0F4TGpVMExTNHhOall1TXpJM0xTNDBNUzQxT0RNdExqY3lNaTQzTlRjdExqTXhMakUzTkMwdU5qSXVNalkzTFRFdU5EY3VNalkzU0RZdU5EUTNZeTB1T0RVZ01DMHhMakUyTFM0d09UTXRNUzQwTnkwdU1qWTNZVEV1TnpjNElERXVOemM0SURBZ01ERXRMamN5TWkwdU56VTJZeTB1TVRZMkxTNHpNall0TGpJMU5TMHVOalV0TGpJMU5TMHhMalUwZGkwMExqZzNNMk13TFM0NE9USXVNRGc1TFRFdU1qRTFMakkxTlMweExqVTBMakUyTmkwdU16STNMalF4TFM0MU9ETXVOekl5TFM0M05UY3VNekV0TGpFM05DNDJNaTB1TWpZM0lERXVORGN0TGpJMk4wZ3hNU0l2UGp4d1lYUm9JSE4wY205clpTMXNhVzVsWTJGd1BTSnliM1Z1WkNJZ2MzUnliMnRsTFd4cGJtVnFiMmx1UFNKeWIzVnVaQ0lnWkQwaVRURXhJRE4yTVRBaUx6NDhMMmMrUEM5emRtYysnOwoJCQlpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKSl7CgkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKS5yZW1vdmUoKQoJCQl9CgkJCWlmICghcHQpIHJldHVybjsKCgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLm5leHQtYm94IiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IGFkMSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm5leHQtYm94IilbMF07CgkJCQlhZDEucmVtb3ZlKCk7CgkJCX0sdHJ1ZSk7CgoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi5hbnQtbW9kYWwtY2xvc2UiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgbG9naW4xID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYW50LW1vZGFsLWNsb3NlIilbMF07CgkJCQkvLyBsb2dpbjEuY2xpY2soKTsKCQkJfSx0cnVlKTsKCgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLnRpcHMiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgdmlwMSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInRpcHMiKVswXTsKCQkJCXZpcDEucmVtb3ZlKCk7CgkJCQlsZXQgdmlwMiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wYy1tZW1iZXItZW50cmFuY2Ugc3BhbicpOwoJCQkJdmlwMi5pbm5lckhUTUwgPSAi5byA6YCaU1ZJUCI7CgkJCX0sdHJ1ZSk7CgoJCQl3YWl0Rm9yS2V5RWxlbWVudHMoIi5wYXktbW9kYWwgLmNsb3NlIiwgZnVuY3Rpb24gKCkgewoJCQkJbGV0IHZpcDMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGF5LW1vZGFsIC5jbG9zZScpOwoJCQkJdmlwMy5jbGljaygpOwoJCQl9KTsKCgkJCXdhaXRGb3JLZXlFbGVtZW50cygiLnJlZC1lbnZlbG9wZSAuY2xvc2UiLCBmdW5jdGlvbiAoKSB7CgkJCQlsZXQgdmlwNCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5yZWQtZW52ZWxvcGUgLmNsb3NlJyk7CgkJCQl2aXA0LmNsaWNrKCk7CgkJCX0pOwoKCQkJbGV0ICR0b29sV3JhcDsKCQkJaWYgKHB0ID09PSAnaG9tZScpIHsKCQkJCWxldCAkYnV0dG9uID0gJChgPGRpdiBpZD0icGwtYnV0dG9uLWxpbmsiIGNsYXNzPSJhbnQtZHJvcGRvd24tdHJpZ2dlciBwbC1idXR0b24iPjxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0icXVhcmstYnV0dG9uIGFudC1idG4gYnRuLWZpbGUgYW50LWJ0bi1wcmltYXJ5Ij48aW1nIGNsYXNzPSJxdWFyay1idG4taWNvbiIgc3JjPSJgKyBzdmcgK2AiPjxzcGFuPuS4i+i9veWKqeaJizwvc3Bhbj48L2J1dHRvbj48dWwgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUiIHN0eWxlPSJ0b3A6IDU1cHg7Ij48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcGkiPkFQSeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0iYXJpYSI+QXJpYeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0icnBjIj5SUEPkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImN1cmwiPmNVUkzkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImJjIj5CQ+S4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUgbGlzdGVuZXItb3Blbi1zZXR0aW5nIj7liqnmiYvorr7nva48L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIGxpc3RlbmVyLW9wZW4tdXBkYXRlbG9nIj7mm7TmlrDml6Xlv5c8L2xpPjwvdWw+PC9kaXY+YCk7CgkJCQkkYnV0dG9uLmNzcyh7Im1hcmdpbi1yaWdodCI6IjEwcHgiLCJkaXNwbGF5IjoiaW5saW5lLWJsb2NrIn0pOwoJCQkJYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uaG9tZSwgKCkgPT4gewoJCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJCQkkKCcucGwtYnV0dG9uJykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJfSk7CgkJCX0KCQkJaWYgKHB0ID09PSAnc2hhcmUnKSB7CgkJCQlsZXQgJGJ1dHRvbiA9ICQoYDxkaXYgaWQ9InBsLWJ1dHRvbi1saW5rIiBjbGFzcz0iYW50LWRyb3Bkb3duLXRyaWdnZXIgcGwtYnV0dG9uIj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InF1YXJrLWJ1dHRvbiBhbnQtYnRuIGJ0bi1maWxlIGFudC1idG4tcHJpbWFyeSIgc3R5bGU9ImhlaWdodDogNDBweDsiPjxpbWcgY2xhc3M9InF1YXJrLWJ0bi1pY29uIiBzcmM9ImArIHN2ZyArYCI+PHNwYW4+5LiL6L295Yqp5omLPC9zcGFuPjwvYnV0dG9uPjx1bCBjbGFzcz0icGwtZHJvcGRvd24tbWVudSIgc3R5bGU9InRvcDogMTAwcHg7Ij48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSBsaXN0ZW5lci1saW5rLXNhdmUiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAke2NvbG9yfWIwICFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiAhaW1wb3J0YW50OyIgZGF0YS1tb2RlPSJzYXZlIj48c3BhbiBjbGFzcz0ic2F2ZS1idG4taWNvbiI+PC9zcGFuPuS/neWtmOWQjuS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUgbGlzdGVuZXItb3Blbi1zZXR0aW5nIj7liqnmiYvorr7nva48L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIGxpc3RlbmVyLW9wZW4tdXBkYXRlbG9nIj7mm7TmlrDml6Xlv5c8L2xpPjwvdWw+PC9kaXY+YCk7CgkJCQkkYnV0dG9uLmNzcyh7Im1hcmdpbi1yaWdodCI6IjEwcHgiLCJkaXNwbGF5IjoiaW5saW5lLWJsb2NrIn0pOwoJCQkJYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uc2hhcmUsICgpID0+IHsKCQkJCQkkdG9vbFdyYXAgPSAkKHBhbi5idG4uc2hhcmUpOwoJCQkJCSQoJy5wbC1idXR0b24nKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CgkJCQl9KTsKCQkJfQoJCQl0aGlzLmFkZFBhZ2VMaXN0ZW5lcigpOwoJCX0sCgoJCWFkZEluaXRCdXR0b24oKSB7CgkJCWxldCBzdmcgPSAnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTWpJaUlHaGxhV2RvZEQwaU1qSWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQR2NnWm1sc2JEMGlibTl1WlNJZ1ptbHNiQzF5ZFd4bFBTSmxkbVZ1YjJSa0lpQnpkSEp2YTJVOUlpTkdSa1pHUmtZaUlITjBjbTlyWlMxM2FXUjBhRDBpTWlJK1BIQmhkR2dnYzNSeWIydGxMV3hwYm1WallYQTlJbkp2ZFc1a0lpQnpkSEp2YTJVdGJHbHVaV3B2YVc0OUluSnZkVzVrSWlCa1BTSk5PU0F4TW13eUlESWdNaTB5ZWlJdlBqeHdZWFJvSUdROUlrMHhOQ0E0YURFdU5UVXpZeTQ0TlNBd0lERXVNVFl1TURreklERXVORGN1TWpZM0xqTXhNUzR4TnpRdU5UVTJMalF6TGpjeU1pNDNOVFl1TVRZMkxqTXlOaTR5TlRVdU5qVXVNalUxSURFdU5UUjJOQzQ0TnpOak1DQXVPRGt5TFM0d09Ea2dNUzR5TVRVdExqSTFOU0F4TGpVMExTNHhOall1TXpJM0xTNDBNUzQxT0RNdExqY3lNaTQzTlRjdExqTXhMakUzTkMwdU5qSXVNalkzTFRFdU5EY3VNalkzU0RZdU5EUTNZeTB1T0RVZ01DMHhMakUyTFM0d09UTXRNUzQwTnkwdU1qWTNZVEV1TnpjNElERXVOemM0SURBZ01ERXRMamN5TWkwdU56VTJZeTB1TVRZMkxTNHpNall0TGpJMU5TMHVOalV0TGpJMU5TMHhMalUwZGkwMExqZzNNMk13TFM0NE9USXVNRGc1TFRFdU1qRTFMakkxTlMweExqVTBMakUyTmkwdU16STNMalF4TFM0MU9ETXVOekl5TFM0M05UY3VNekV0TGpFM05DNDJNaTB1TWpZM0lERXVORGN0TGpJMk4wZ3hNU0l2UGp4d1lYUm9JSE4wY205clpTMXNhVzVsWTJGd1BTSnliM1Z1WkNJZ2MzUnliMnRsTFd4cGJtVnFiMmx1UFNKeWIzVnVaQ0lnWkQwaVRURXhJRE4yTVRBaUx6NDhMMmMrUEM5emRtYysnOwoJCQlpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKSl7CgkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKS5yZW1vdmUoKQoJCQl9CgkJCWlmICghcHQpIHJldHVybjsKCQkJbGV0ICR0b29sV3JhcDsKCQkJbGV0ICRidXR0b24gPSAkKGA8ZGl2IGlkPSJwbC1idXR0b24tbGluayIgY2xhc3M9ImFudC1kcm9wZG93bi10cmlnZ2VyIHBsLWJ1dHRvbi1pbml0Ij48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InF1YXJrLWJ1dHRvbiBhbnQtYnRuIGJ0bi1maWxlIGFudC1idG4tcHJpbWFyeSIgc3R5bGU9ImhlaWdodDogNDBweDsiPjxpbWcgY2xhc3M9InF1YXJrLWJ0bi1pY29uIiBzcmM9ImArIHN2ZyArYCI+PHNwYW4+5LiL6L295Yqp5omLKOacqueCueS6rik8L3NwYW4+PC9idXR0b24+PC9kaXY+YCk7CgkJCSRidXR0b24uY3NzKHsibWFyZ2luLXJpZ2h0IjoiMTBweCIsImRpc3BsYXkiOiJpbmxpbmUtYmxvY2sifSk7CgkJCWlmIChwdCA9PT0gJ2hvbWUnKSB7CgkJCQliYXNlLmxpc3RlbkVsZW1lbnQocGFuLmJ0bi5ob21lLCAoKSA9PiB7CgkJCQkJJHRvb2xXcmFwID0gJChwYW4uYnRuLmhvbWUpOwoJCQkJCSQoJy5wbC1idXR0b24taW5pdCcpLmxlbmd0aCA9PT0gMCAmJiAkdG9vbFdyYXAucHJlcGVuZCgkYnV0dG9uKTsKCQkJCX0pCgkJCX0KCQkJaWYgKHB0ID09PSAnc2hhcmUnKSB7CgkJCQliYXNlLmxpc3RlbkVsZW1lbnQocGFuLmJ0bi5zaGFyZSwgKCkgPT4gewoJCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CgkJCQkJJCgnLnBsLWJ1dHRvbi1pbml0JykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJfSkKCQkJfQoJCQkkYnV0dG9uLmNsaWNrKCgpID0+IGJhc2UuaW5pdERpYWxvZygpKTsKCQl9LAoKCQlhc3luYyBnZXRQQ1NMaW5rKCkgewoJCQlzZWxlY3RMaXN0ID0gdGhpcy5nZXRTZWxlY3RlZExpc3QoKTsKCQkJaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CgkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+WFiOWLvumAieimgeS4i+i9veeahOaWh+S7tuaNj34nKTsKCQkJfQoJCQlpZiAodGhpcy5pc09ubHlGb2xkZXIoKSkgewoJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7fmiZPlvIDmlofku7blpLnlkI7lho3li77pgInmlofku7Z+Jyk7CgkJCX0KCQkJbGV0IGZpZHMgPSBbXTsKCQkJc2VsZWN0TGlzdC5mb3JFYWNoKHZhbCA9PiB7CgkJCQlmaWRzLnB1c2godmFsLmZpZCk7CgkJCX0pOwoJCQlpZiAocHQgPT09ICdob21lJykgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChwYW4ucGNzWzBdLCB7CgkJCQkJImZpZHMiOiBmaWRzCgkJCQl9LCB7ImNvbnRlbnQtdHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgiLCAidXNlci1hZ2VudCI6IHBhbi51YX0pOwoJCQkJaWYgKHJlcy5jb2RlID09PSAzMTAwMSkgewoJCQkJCXJldHVybiBtZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+6K+35YWI55m75b2V572R55uYficpOwoJCQkJfQoJCQkJaWYgKHJlcy5jb2RlICE9PSAwKSB7CgkJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7ojrflj5bpk77mjqXlpLHotKXkuoZ+Jyk7CgkJCQl9CgkJCQlsZXQgaHRtbCA9IHRoaXMuZ2VuZXJhdGVEb20ocmVzLmRhdGEpOwoJCQkJdGhpcy5zaG93TWFpbkRpYWxvZyhwYW5bbW9kZV1bMF0sIGh0bWwsIHBhblttb2RlXVsxXSk7CgkJCX0gZWxzZSB7CgkJCQltZXNzYWdlLmVycm9yKCfmj5DnpLrvvJo8YnI+6K+35L+d5a2Y5Yiw6Ieq5bex572R55uY5ZCO5YaN5Y67572R55uY5Li76aG15LiL6L295ZOmficpOwoJCQkJYXdhaXQgYmFzZS5zbGVlcCgxMDAwKTsKCQkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5maWxlLWluZm9fcicpLmNsaWNrKCk7CgkJCQlyZXR1cm47CgkJCX0KCQl9LAoKCQlnZW5lcmF0ZURvbShsaXN0KSB7CgkJCWxldCBjb250ZW50ID0gJzxkaXYgY2xhc3M9InBsLW1haW4iPic7CgkJCWxldCBhbGlua0FsbFRleHQgPSAnJzsKCQkJbGlzdC5mb3JFYWNoKCh2LCBpKSA9PiB7CgkJCQlpZiAodi5maWxlID09PSBmYWxzZSkgcmV0dXJuOwoJCQkJbGV0IGZpbGVuYW1lID0gdi5maWxlX25hbWU7CgkJCQlsZXQgZmlkID0gdi5maWQ7CgkJCQlsZXQgc2l6ZSA9IGJhc2Uuc2l6ZUZvcm1hdCh2LnNpemUpOwoJCQkJbGV0IGRsaW5rID0gdi5kb3dubG9hZF91cmw7CgkJCQlpZiAobW9kZSA9PT0gJ2FwaScpIHsKCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFwaSIgZGF0YS1maWQ9IiR7ZmlkfSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iIGRhdGEtaW5kZXg9IiR7aX0iPiR7ZGxpbmt9PC9hPgoJCQkJCQkJCTwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2FyaWEnKSB7CgkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQXJpYShkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwoJCQkJCWFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2YXJpYTJj6ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKCQkJCX0KCQkJCWlmIChtb2RlID09PSAncnBjJykgewoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YnV0dG9uIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1ycGMgcGwtYnRuLXByaW1hcnkgcGwtYnRuLWluZm8iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kZXZpY2UiPjwvZW0+PHNwYW4gc3R5bGU9Im1hcmdpbi1sZWZ0OiA1cHg7Ij7mjqjpgIHliLAgUlBDIOS4i+i9veWZqDwvc3Bhbj48L2J1dHRvbj48L2Rpdj5gOwoJCQkJfQoJCQkJaWYgKG1vZGUgPT09ICdjdXJsJykgewoJCQkJCWxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0N1cmwoZGxpbmssIGZpbGVuYW1lLCBuYXZpZ2F0b3IudXNlckFnZW50KTsKCQkJCQlhbGlua0FsbFRleHQgKz0gYWxpbmsgKyAnXHJcbic7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1hcmlhIiBocmVmPSIke2FsaW5rfSIgdGl0bGU9IueCueWHu+WkjeWItmN1cmzpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQkJaWYgKG1vZGUgPT09ICdiYycpIHsKCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9CQyhkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIiBocmVmPSIke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9IiB0aXRsZT0i54K55Ye755So5q+U54m55b2X5pif5LiL6L29IiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2FsaW5rfSI+JHtkZWNvZGVVUklDb21wb25lbnQoYWxpbmspfTwvYT4gPC9kaXY+YDsKCQkJCX0KCQkJfSk7CgkJCWNvbnRlbnQgKz0gJzwvZGl2Pic7CgkJCWlmIChtb2RlID09PSAnYXJpYScpCgkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jlkb3ku6TooYw8L2J1dHRvbj48L2Rpdj5gOwoJCQlpZiAobW9kZSA9PT0gJ3JwYycpIHsKCQkJCWxldCBycGMgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19kb21haW4nKSArICc6JyArIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BvcnQnKSArIGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3BhdGgnKTsKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1zZW5kLXJwYyI+5Y+R6YCB5YWo6YOo6ZO+5o6lPC9idXR0b24+PGJ1dHRvbiB0aXRsZT0iJHtycGN9IiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXdhcm5pbmcgbGlzdGVuZXItb3Blbi1zZXR0aW5nIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHgiPuiuvue9riBSUEMg5Y+C5pWw77yI5b2T5YmN5Li677yaJHtycGN977yJPC9idXR0b24+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgcGwtYnRuLXN1Y2Nlc3MgbGlzdGVuZXItcnBjLXRhc2siIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDtkaXNwbGF5OiBub25lIj7mn6XnnIvkuIvovb3ku7vliqE8L2J1dHRvbj48L2Rpdj5gOwoJCQl9CgkJCWlmIChtb2RlID09PSAnY3VybCcpCgkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1leHRyYSI+PGJ1dHRvbiBjbGFzcz0icGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDsiPuiuvue9rue7iOerr+exu+Wei++8iOW9k+WJjeS4uu+8miR7dGVybWluYWxUeXBlW2Jhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfdGVybWluYWxfdHlwZScpXX3vvIk8L2J1dHRvbj48L2Rpdj5gOwoJCQlyZXR1cm4gY29udGVudDsKCQl9LAoKCQlhc3luYyBzZW5kTGlua1RvUlBDKGZpbGVuYW1lLCBsaW5rKSB7CgkJCWxldCBycGMgPSB7CgkJCQlkb21haW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpLAoJCQkJcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAoJCQkJcGF0aDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpLAoJCQkJdG9rZW46IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX3Rva2VuJyksCgkJCQlkaXI6IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RpcicpLAoJCQl9OwoKCQkJbGV0IHVybCA9IGAke3JwYy5kb21haW59OiR7cnBjLnBvcnR9JHtycGMucGF0aH1gOwoJCQlsZXQgcnBjRGF0YSA9IHsKCQkJCWlkOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKCQkJCWpzb25ycGM6ICcyLjAnLAoJCQkJbWV0aG9kOiAnYXJpYTIuYWRkVXJpJywKCQkJCXBhcmFtczogW2B0b2tlbjoke3JwYy50b2tlbn1gLCBbbGlua10sIHsKCQkJCQlkaXI6IHJwYy5kaXIsCgkJCQkJb3V0OiBmaWxlbmFtZSwKCQkJCQloZWFkZXI6IFtgQ29va2llOiAke2RvY3VtZW50LmNvb2tpZX1gXQoJCQkJfV0KCQkJfTsKCQkJdHJ5IHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QodXJsLCBycGNEYXRhLCB7IkNvb2tpZSI6IGRvY3VtZW50LmNvb2tpZX0sICcnKTsKCQkJCWlmIChyZXMucmVzdWx0KSByZXR1cm4gJ3N1Y2Nlc3MnOwoJCQkJcmV0dXJuICdmYWlsJzsKCQkJfSBjYXRjaCAoZSkgewoJCQkJcmV0dXJuICdmYWlsJzsKCQkJfQoJCX0sCgoJCWdldFNlbGVjdGVkTGlzdCgpIHsKCQkJdHJ5IHsKCQkJCWxldCBzZWxlY3RlZExpc3QgPSBbXTsKCQkJCWxldCByZWFjdERvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2ZpbGUtbGlzdCcpWzBdOwoJCQkJbGV0IHJlYWN0T2JqID0gYmFzZS5maW5kUmVhY3QocmVhY3REb20pOwoJCQkJbGV0IHByb3BzID0gcmVhY3RPYmoucHJvcHM7CgkJCQlpZiAocHJvcHMpIHsKCQkJCQlsZXQgZmlsZUxpc3QgPSBwcm9wcy5saXN0IHx8IFtdOwoJCQkJCWxldCBzZWxlY3RlZEtleXMgPSBwcm9wcy5zZWxlY3RlZFJvd0tleXMgfHwgW107CgkJCQkJZmlsZUxpc3QuZm9yRWFjaCgodmFsKSA9PiB7CgkJCQkJCWlmIChzZWxlY3RlZEtleXMuaW5jbHVkZXModmFsLmZpZCkpIHsKCQkJCQkJCXNlbGVjdGVkTGlzdC5wdXNoKHZhbCk7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCX0KCQkJCXJldHVybiBzZWxlY3RlZExpc3Q7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCXJldHVybiBbXTsKCQkJfQoJCX0sCgoJCWRldGVjdFBhZ2UoKSB7CgkJCWxldCBwYXRoID0gbG9jYXRpb24ucGF0aG5hbWU7CgkJCWlmICgvXlwvKGxpc3QpLy50ZXN0KHBhdGgpKSByZXR1cm4gJ2hvbWUnOwoJCQlpZiAoL15cLyhzfHNoYXJlKVwvLy50ZXN0KHBhdGgpKSByZXR1cm4gJ3NoYXJlJzsKCQkJcmV0dXJuICcnOwoJCX0sCgoJCWlzT25seUZvbGRlcigpIHsKCQkJZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3RMaXN0Lmxlbmd0aDsgaSsrKSB7CgkJCQlpZiAoc2VsZWN0TGlzdFtpXS5maWxlKSByZXR1cm4gZmFsc2U7CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJc2hvd01haW5EaWFsb2codGl0bGUsIGh0bWwsIGZvb3RlcikgewoJCQlTd2FsLmZpcmUoewoJCQkJdGl0bGUsCgkJCQlodG1sLAoJCQkJZm9vdGVyLAoJCQkJYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAoJCQkJc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAoJCQkJcG9zaXRpb246ICdjZW50ZXInLC8vdG9wCgkJCQl3aWR0aCwKCQkJCXBhZGRpbmc6ICcxNXB4IDIwcHggNXB4JywKCQkJCWN1c3RvbUNsYXNzLAoJCQkJY29uZmlybUJ1dHRvblRleHQ6ICflhbPpl60nLAoJCQl9KTsKCQl9LAoKCQlhc3luYyBpbml0UGFuTGlua2VyKCkgewoJCQlwdCA9IHRoaXMuZGV0ZWN0UGFnZSgpOwoJCQliYXNlLmNyZWF0ZVRpcCgpOwoJCQliYXNlLnJlZ2lzdGVyTWVudUNvbW1hbmQoKTsKCQkJaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gJ3YxJykgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChgaHR0cHM6Ly9hcGkueW91eGlhb2hvdS5jb20vY29uZmlnL3F1YXJrLz92ZXI9JHt2ZXJzaW9ufSZhPSR7YXV0aG9yfWAsIHt9LCB7fSwgJ3RleHQnKTsKCQkJCXBhbiA9IEpTT04ucGFyc2UoYmFzZS5kZWNvZGUocmVzKSk7CgkJCX0gZWxzZSBpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAndjInKSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KGBodHRwczovL2FwaS55b3V4aWFvaG91LmNvbS9jb25maWcvdjIvcXVhcmsvP3Zlcj0ke3ZlcnNpb259JmE9JHthdXRob3J9YCwge30sIHt9LCAndGV4dCcpOwoJCQkJcGFuID0gSlNPTi5wYXJzZShiYXNlLmRlY29kZShyZXMpKTsKCQkJfSBlbHNlIGlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICJubyIpIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLmdldChgaHR0cHM6Ly9nY29yZS5qc2RlbGl2ci5uZXQvZ2gvaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnRAbWFpbi9jb25maWcvcXVhcmsuanNvbmAsIHt9LCAidGV4dCIsIHt9KTsKCQkJCXBhbiA9IEpTT04ucGFyc2UocmVzKTsKCQkJfSBlbHNlIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLmdldChgaHR0cHM6Ly9nY29yZS5qc2RlbGl2ci5uZXQvZ2gvaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnRAbWFpbi9jb25maWcvY29uZmlnLmpzb25gLCB7fSwgInRleHQiLCB7fSk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKHJlcyk7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJywgJ3YyJyk7CgkJCX0KCQkJT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKHBhbik7CgkJCXBhbi5udW0gPT09IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfaW5pdF9jb2RlJykgfHwgcGFuLmxpY2Vuc2UgPT09IGJhc2UuZ2V0VmFsdWUoJ2xpY2Vuc2UnKSA/IHRoaXMuYWRkQnV0dG9uKCkgOiB0aGlzLmFkZEluaXRCdXR0b24oKTsKCQkJYmFzZS5jcmVhdGVEb3dubG9hZElmcmFtZSgpOwoJCX0KCX07CgoJLy/kuK3lm73np7vliqjkupHnm5gv5ZKM5b2p5LqRCglsZXQgeWlkb25nID0gewoKCQljb252ZXJ0TGlua1RvQXJpYShsaW5rLCBmaWxlbmFtZSwgdWEpIHsKCQkJZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYXJpYTJjICIke2xpbmt9IiAtLW91dCAiJHtmaWxlbmFtZX0iYCk7CgkJfSwKCgkJY29udmVydExpbmtUb0JDKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlsZXQgYmMgPSBgQUEvJHtlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpfS8/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGxpbmspfVpaYDsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgYmM6Ly9odHRwLyR7YmFzZS5lbmNvZGUoYmMpfWApOwoJCX0sCgoJCWNvbnZlcnRMaW5rVG9DdXJsKGxpbmssIGZpbGVuYW1lLCB1YSkgewoJCQlsZXQgdGVybWluYWwgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3Rlcm1pbmFsX3R5cGUnKTsKCQkJZmlsZW5hbWUgPSBiYXNlLmZpeEZpbGVuYW1lKGZpbGVuYW1lKTsKCQkJcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChgJHt0ZXJtaW5hbCAhPT0gJ3dwJyA/ICdjdXJsJyA6ICdjdXJsLmV4ZSd9IC1MIC1DIC0gIiR7bGlua30iIC1vICIke2ZpbGVuYW1lfSJgKTsKCQl9LAoKCQlhZGRQYWdlTGlzdGVuZXIoKSB7CgkJCWRvYy5vbignY2xpY2snLCAnLnBsLWJ1dHRvbi1tb2RlJywgKGUpID0+IHsKCQkJCW1vZGUgPSBlLnRhcmdldC5kYXRhc2V0Lm1vZGU7CgkJCQlTd2FsLmZpcmUoewoJCQkJCWhlaWdodEF1dG86IGZhbHNlLAoJCQkJCXNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAoJCQkJCXNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKCQkJCQlodG1sOiBg6ZO+5o6l6I635Y+W5LitYCwKCQkJCQl3aWxsT3BlbjogZnVuY3Rpb24oKSB7CgkJCQkJCVN3YWwuc2hvd0xvYWRpbmcoKTsKCQkJCQl9CgkJCQl9KTsKCQkJCXRoaXMuZ2V0UENTTGluaygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItbGluay1hcGknLCBhc3luYyAoZSkgPT4gewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJJCgnI2Rvd25sb2FkSWZyYW1lJykuYXR0cignc3JjJywgZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQubGluayk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLWFyaWEsIC5saXN0ZW5lci1jb3B5LWFsbCcsIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQliYXNlLnNldENsaXBib2FyZChkZWNvZGVVUklDb21wb25lbnQoZS50YXJnZXQuZGF0YXNldC5saW5rKSk7CgkJCQkkKGUudGFyZ2V0KS50ZXh0KCflpI3liLbmiJDlip8nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCQlzZXRUaW1lb3V0KAoJCQkJCWZ1bmN0aW9uICgpewoJCQkJCQkkKGUudGFyZ2V0KS50ZXh0KCfph43mlrDlpI3liLYnKS5hbmltYXRlKHtvcGFjaXR5OiAnMSd9LCAic2xvdyIpOwoJCQkJCX0sMjAwMAoJCQkJKQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItY29weS1hbGwtYXBpJywgKGUpID0+IHsKCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCWJhc2Uuc2V0Q2xpcGJvYXJkKGRlY29kZVVSSUNvbXBvbmVudChlLnRhcmdldC5kYXRhc2V0LmxpbmspKTsKCQkJCSQoZS50YXJnZXQpLnRleHQoJ+WkjeWItuaIkOWKnycpLmFuaW1hdGUoe29wYWNpdHk6ICcwLjUnfSwgInNsb3ciKTsKCQkJCXNldFRpbWVvdXQoCgkJCQkJZnVuY3Rpb24gKCl7CgkJCQkJCSQoZS50YXJnZXQpLnRleHQoJ+mHjeaWsOWkjeWIticpLmFuaW1hdGUoe29wYWNpdHk6ICcxJ30sICJzbG93Iik7CgkJCQkJfSwyMDAwCgkJCQkpCgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1saW5rLXJwYycsIGFzeW5jIChlKSA9PiB7CgkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQlsZXQgdGFyZ2V0ID0gJChlLmN1cnJlbnRUYXJnZXQpOyAKCgkJCQl0YXJnZXQuZmluZCgnLmljb24nKS5yZW1vdmUoKTsKCQkJCXRhcmdldC5maW5kKCcucGwtbG9hZGluZycpLnJlbW92ZSgpOwoJCQkJdGFyZ2V0LnByZXBlbmQoYmFzZS5jcmVhdGVMb2FkaW5nKCkpOwoKCQkJCWxldCByZXMgPSBhd2FpdCB0aGlzLnNlbmRMaW5rVG9SUEMoZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuZmlsZW5hbWUsIGUuY3VycmVudFRhcmdldC5kYXRhc2V0LmxpbmspOwoJCQkJaWYgKHJlcyA9PT0gJ3N1Y2Nlc3MnKSB7CgkJCQkJJCgnLmxpc3RlbmVyLXJwYy10YXNrJykuc2hvdygpOwoJCQkJCXRhcmdldC5yZW1vdmVDbGFzcygncGwtYnRuLWRhbmdlcicpLmh0bWwoJ+WPkemAgeaIkOWKn+S6hiHlv6vljrvnnIvnnIvlkKd+JykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQkJfSBlbHNlIGlmIChyZXMgPT09ICdhc3Npc3RhbnQnKSB7CgkJCQkJdGFyZ2V0LmFkZENsYXNzKCdwbC1idG4tZGFuZ2VyJykuaHRtbChgJHtwYW4uaW5pdFs1XX3wn5GJPGEgaHJlZj0iJHtwYW4uYXNzaXN0YW50fSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJwbC1hIj7ngrnlh7vmraTlpITlronoo4U8L2E+8J+RiGApOwoJCQkJfSBlbHNlIHsKCQkJCQl0YXJnZXQuYWRkQ2xhc3MoJ3BsLWJ0bi1kYW5nZXInKS50ZXh0KCflj5HpgIHlpLHotKXvvIzmo4Dmn6XkuIDkuIvmgqjnmoRSUEPphY3nva7kv6Hmga/lk6YhJykuYW5pbWF0ZSh7b3BhY2l0eTogJzAuNSd9LCAic2xvdyIpOwoJCQkJfQoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItc2VuZC1ycGMnLCAoZSkgPT4gewoJCQkJJCgnLmxpc3RlbmVyLWxpbmstcnBjJykuY2xpY2soKTsKCQkJCSQoZS50YXJnZXQpLnRleHQoJ+WPkemAgeWujOaIkO+8jOWPkemAgee7k+aenOingeS4iuaWueaMiemSruWTpn4nKS5hbmltYXRlKHtvcGFjaXR5OiAnMC41J30sICJzbG93Iik7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXNldHRpbmcnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dTZXR0aW5nKCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXVwZGF0ZWxvZycsICgpID0+IHsKCQkJCWJhc2Uuc2hvd1VwZGF0ZUxvZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItcnBjLXRhc2snLCAoKSA9PiB7CgkJCQlsZXQgcnBjID0gSlNPTi5zdHJpbmdpZnkoewoJCQkJCWRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCgkJCQkJcG9ydDogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpLAoJCQkJfSksIHVybCA9IGAke3Bhbi5kfS8/cnBjPSR7YmFzZS5lbmNvZGUocnBjKX0jJHtiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY190b2tlbicpfWA7CgkJCQlHTV9vcGVuSW5UYWIodXJsLCB7YWN0aXZlOiB0cnVlfSk7CgkJCX0pOwoJCX0sCgoJCWFkZEJ1dHRvbigpIHsKCQkJaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikpewoJCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBsLWJ1dHRvbi1saW5rIikucmVtb3ZlKCkKCQkJfQoJCQlpZiAoIXB0KSByZXR1cm47CgkJCWxldCAkdG9vbFdyYXA7CgkJCWxldCAkYnV0dG9uID0gJChgPGRpdiBjbGFzcz0ieWlkb25nLWJ1dHRvbiBwbC1idXR0b24gYnRuLXRvcCIgaWQ9InBsLWJ1dHRvbi1saW5rIj48c3BhbiBjbGFzcz0ieWlkb25nLWJ0biI+5LiL6L295Yqp5omLPC9zcGFuPjx1bCBjbGFzcz0icGwtZHJvcGRvd24tbWVudSIgc3R5bGU9InRvcDogMzZweDsiPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImFwaSI+QVBJ5LiL6L29PC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSIgZGF0YS1tb2RlPSJhcmlhIiA+QXJpYeS4i+i9vTwvbGk+PGxpIGNsYXNzPSJwbC1kcm9wZG93bi1tZW51LWl0ZW0gcGwtYnV0dG9uLW1vZGUiIGRhdGEtbW9kZT0icnBjIj5SUEPkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImN1cmwiPmNVUkzkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIiBkYXRhLW1vZGU9ImJjIiA+QkPkuIvovb08L2xpPjxsaSBjbGFzcz0icGwtZHJvcGRvd24tbWVudS1pdGVtIHBsLWJ1dHRvbi1tb2RlIGxpc3RlbmVyLW9wZW4tc2V0dGluZyI+5Yqp5omL6K6+572uPC9saT48bGkgY2xhc3M9InBsLWRyb3Bkb3duLW1lbnUtaXRlbSBwbC1idXR0b24tbW9kZSBsaXN0ZW5lci1vcGVuLXVwZGF0ZWxvZyI+5pu05paw5pel5b+XPC9saT48L3VsPjwvZGl2PmApOwoJCQlpZiAocHQgPT09ICdob21lJykgewoJCQkJYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uaG9tZSwgKCkgPT4gewoJCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJCQkkKCcucGwtYnV0dG9uJykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJfSkKCQkJfQoJCQlpZiAocHQgPT09ICdzaGFyZScpIHsKCQkJCSRidXR0b24ucmVtb3ZlQ2xhc3MoJ3lpZG9uZy1idXR0b24nKS5hZGRDbGFzcygneWlkb25nLXNoYXJlLWJ1dHRvbicpOwoJCQkJYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uc2hhcmUsICgpID0+IHsKCQkJCQkkdG9vbFdyYXAgPSAkKHBhbi5idG4uc2hhcmUpOwoJCQkJCSQoJy5wbC1idXR0b24nKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CgkJCQl9KQoJCQl9CgkJCXRoaXMuYWRkUGFnZUxpc3RlbmVyKCk7CgkJCWJhc2UuY3JlYXRlRG93bmxvYWRJZnJhbWUoKTsKCQl9LAoKCQlhZGRJbml0QnV0dG9uKCkgewoJCQlpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKSl7CgkJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGwtYnV0dG9uLWxpbmsiKS5yZW1vdmUoKQoJCQl9CgkJCWlmICghcHQpIHJldHVybjsKCQkJbGV0ICR0b29sV3JhcDsKCQkJbGV0ICRidXR0b24gPSAkKGA8ZGl2IGNsYXNzPSJ5aWRvbmctYnV0dG9uIHBsLWJ1dHRvbi1pbml0IGJ0bi10b3AiIGlkPSJwbC1idXR0b24tbGluayI+PHNwYW4gY2xhc3M9InlpZG9uZy1idG4iPuS4i+i9veWKqeaJiyjmnKrngrnkuq4pPC9zcGFuPjwvZGl2PmApOwoJCQlpZiAocHQgPT09ICdob21lJykgewoJCQkJYmFzZS5saXN0ZW5FbGVtZW50KHBhbi5idG4uaG9tZSwgKCkgPT4gewoJCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5ob21lKTsKCQkJCQkkKCcucGwtYnV0dG9uLWluaXQnKS5sZW5ndGggPT09IDAgJiYgJHRvb2xXcmFwLnByZXBlbmQoJGJ1dHRvbik7CgkJCQl9KQoJCQl9CgkJCWlmIChwdCA9PT0gJ3NoYXJlJykgewoJCQkJJGJ1dHRvbi5yZW1vdmVDbGFzcygneWlkb25nLWJ1dHRvbicpLmFkZENsYXNzKCd5aWRvbmctc2hhcmUtYnV0dG9uJyk7CgkJCQliYXNlLmxpc3RlbkVsZW1lbnQocGFuLmJ0bi5zaGFyZSwgKCkgPT4gewoJCQkJCSR0b29sV3JhcCA9ICQocGFuLmJ0bi5zaGFyZSk7CgkJCQkJJCgnLnBsLWJ1dHRvbi1pbml0JykubGVuZ3RoID09PSAwICYmICR0b29sV3JhcC5wcmVwZW5kKCRidXR0b24pOwoJCQkJfSkKCQkJfQoJCQkkYnV0dG9uLmNsaWNrKCgpID0+IGJhc2UuaW5pdERpYWxvZygpKTsKCQl9LAoKCQlnZXRSYW5kb21TdHJpbmcobGVuKSB7CgkJCWxlbiA9IGxlbiB8fCAxNjsKCQkJbGV0ICRjaGFycyA9ICdBQkNERUZHSEpLTU5QUVJTVFdYWVphYmNkZWZoaWprbW5wcnN0d3h5ejIzNDU2NzgnOwoJCQlsZXQgbWF4UG9zID0gJGNoYXJzLmxlbmd0aDsKCQkJbGV0IHB3ZCA9ICcnOwoJCQlmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkJCQlwd2QgKz0gJGNoYXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBtYXhQb3MpKTsKCQkJfQoJCQlyZXR1cm4gcHdkOwoJCX0sCgoJCXV0b2Ioc3RyKSB7CgkJCWNvbnN0IHUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlOwoJCQlyZXR1cm4gc3RyLnJlcGxhY2UoL1tcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGRl18W15ceDAwLVx4N0ZdL2csICh0KSA9PiB7CgkJCQlpZiAodC5sZW5ndGggPCAyKSB7CgkJCQkJbGV0IGUgPSB0LmNoYXJDb2RlQXQoMCk7CgkJCQkJcmV0dXJuIGUgPCAxMjggPyB0IDogZSA8IDIwNDggPyB1KDE5MiB8IGUgPj4+IDYpICsgdSgxMjggfCA2MyAmIGUpIDogdSgyMjQgfCBlID4+PiAxMiAmIDE1KSArIHUoMTI4IHwgZSA+Pj4gNiAmIDYzKSArIHUoMTI4IHwgNjMgJiBlKTsKCQkJCX0KCQkJCWUgPSA2NTUzNiArIDEwMjQgKiAodC5jaGFyQ29kZUF0KDApIC0gNTUyOTYpICsgKHQuY2hhckNvZGVBdCgxKSAtIDU2MzIwKTsKCQkJCXJldHVybiB1KDI0MCB8IGUgPj4+IDE4ICYgNykgKyB1KDEyOCB8IGUgPj4+IDEyICYgNjMpICsgdSgxMjggfCBlID4+PiA2ICYgNjMpICsgdSgxMjggfCA2MyAmIGUpOwoJCQl9KTsKCQl9LAoKCQlnZXRTaWduKGUsIHQsIGEsIG4pIHsKCQkJbGV0IHIgPSAiIiwKCQkJCWkgPSAiIjsKCQkJaWYgKHQpIHsKCQkJCWxldCBzID0gT2JqZWN0LmFzc2lnbih7fSwgdCk7CgkJCQlpID0gSlNPTi5zdHJpbmdpZnkocyksCgkJCQkJaSA9IGkucmVwbGFjZSgvXHMqL2csICIiKSwKCQkJCQlpID0gZW5jb2RlVVJJQ29tcG9uZW50KGkpOwoJCQkJbGV0IGMgPSBpLnNwbGl0KCIiKSwKCQkJCQl1ID0gYy5zb3J0KCk7CgkJCQlpID0gdS5qb2luKCIiKTsKCQkJfQoJCQlsZXQgQSA9IG1kNShiYXNlLmVuY29kZSh0aGlzLnV0b2IoaSkpKTsKCQkJbGV0IGwgPSBtZDUoYSArICI6IiArIG4pOwoJCQlyZXR1cm4gbWQ1KEEgKyBsKS50b1VwcGVyQ2FzZSgpOwoJCX0sCgoJCWFzeW5jIGdldEZpbGVVcmxCeU9uY2UoaXRlbSwgaW5kZXgpIHsKCQkJdHJ5IHsKCQkJCWlmIChpdGVtLmRvd25sb2FkVXJsKSByZXR1cm4gewoJCQkJCWluZGV4LAoJCQkJCWRvd25sb2FkVXJsOiBpdGVtLmRvd25sb2FkVXJsCgkJCQl9OwoKCQkJCWlmICh0aGlzLmRldGVjdFBhZ2UoKSA9PT0gJ2hvbWUnKSB7CgkJCQkJbGV0IGJvZHkgPSB7CgkJCQkJCSJjb250ZW50SUQiOiBpdGVtLmNvbnRlbnRJRCwKCQkJCQkJImNvbW1vbkFjY291bnRJbmZvIjogeyJhY2NvdW50IjogaXRlbS5vd25lciwgImFjY291bnRUeXBlIjogMX0sCgkJCQkJCSJvcGVyYXRpb24iOiAiMCIsCgkJCQkJCSJpbmxpbmUiOiAiMCIsCgkJCQkJCSJleHRJbmZvIjogeyJpc1JldHVybkNkbkRvd25sb2FkVXJsIjogIjEifQoJCQkJCX07CgkJCQkJbGV0IHRpbWUgPSBuZXcgRGF0ZSgrbmV3IERhdGUoKSArIDggKiAzNjAwICogMTAwMCkudG9KU09OKCkuc3Vic3RyKDAsIDE5KS5yZXBsYWNlKCdUJywgJyAnKTsKCQkJCQlsZXQga2V5ID0gdGhpcy5nZXRSYW5kb21TdHJpbmcoMTYpOwoJCQkJCWxldCBzaWduID0gdGhpcy5nZXRTaWduKHVuZGVmaW5lZCwgYm9keSwgdGltZSwga2V5KTsKCgkJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UucG9zdChwYW4ucGNzWzBdLCBib2R5LCB7CgkJCQkJCSdhdXRob3JpemF0aW9uJzogYmFzZS5nZXRDb29raWUoJ2F1dGhvcml6YXRpb24nKSwKCQkJCQkJJ3gtaHVhd2VpLWNoYW5uZWxTcmMnOiAnMTAwMDAwMzQnLAoJCQkJCQkneC1pbm5lci1udHdrJzogJzInLAoJCQkJCQknbWNsb3VkLWNoYW5uZWwnOiAnMTAwMDEwMScsCgkJCQkJCSdtY2xvdWQtY2xpZW50JzogJzEwNzAxJywKCQkJCQkJJ21jbG91ZC1zaWduJzogdGltZSArICIsIiArIGtleSArICIsIiArIHNpZ24sCgkJCQkJCSdjb250ZW50LXR5cGUnOiAiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04IiwKCQkJCQkJJ2NhbGxlcic6ICd3ZWInLAoJCQkJCQknQ01TLURFVklDRSc6ICdkZWZhdWx0JywKCQkJCQkJJ3gtRGV2aWNlSW5mbyc6ICd8fDl8Ny4xMi4wfGNocm9tZXwxMTkuMC4wLjB8fHx3aW5kb3dzIDEwfHx6aC1DTnx8fCcsCgkJCQkJCSd4LVN2Y1R5cGUnOiAnMScsCgkJCQkJfSk7CgkJCQkJaWYgKHJlcy5zdWNjZXNzKSB7CgkJCQkJCXJldHVybiB7CgkJCQkJCQlpbmRleCwKCQkJCQkJCWRvd25sb2FkVXJsOiByZXMuZGF0YS5kb3dubG9hZFVSTAoJCQkJCQl9OwoJCQkJCX0gZWxzZSB7CgkJCQkJCXJldHVybiB7CgkJCQkJCQlpbmRleCwKCQkJCQkJCWRvd25sb2FkVXJsOiAn6I635Y+W5LiL6L295Zyw5Z2A5aSx6LSl77yM5Yi35paw5ZCO5YaN6K+V6K+V5ZCnficKCQkJCQkJfTsKCQkJCQl9CgkJCQl9CgkJCQlpZiAodGhpcy5kZXRlY3RQYWdlKCkgPT09ICdzaGFyZScpIHsKCQkJCQlsZXQgdnVlRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmhvbWUtcGFnZSIpLl9fdnVlX187CgoJCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QocGFuLnBjc1sxXSwgYGxpbmtJZD0ke3Z1ZURvbS5saW5rSUR9JmNvbnRlbnRJZHM9JHtlbmNvZGVVUklDb21wb25lbnQodnVlRG9tLmN1cnJlbnRQYXRoLmlkICsgJy8nICsgaXRlbS5jb0lEKX0mY2F0YWxvZ0lkcz1gLCB7CgkJCQkJCSdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJywKCQkJCQl9KTsKCQkJCQlpZiAocmVzLmNvZGUgPT09IDApIHsKCQkJCQkJcmV0dXJuIHsKCQkJCQkJCWluZGV4LAoJCQkJCQkJZG93bmxvYWRVcmw6IHJlcy5kYXRhLnJlZHJVcmwKCQkJCQkJfTsKCQkJCQl9IGVsc2UgewoJCQkJCQlyZXR1cm4gewoJCQkJCQkJaW5kZXgsCgkJCQkJCQlkb3dubG9hZFVybDogJ+iOt+WPluS4i+i9veWcsOWdgOWksei0pe+8jOWIt+aWsOWQjuWGjeivleivleWQp34nCgkJCQkJCX07CgkJCQkJfQoJCQkJfQoJCQl9IGNhdGNoIChlKSB7CgkJCQlyZXR1cm4gewoJCQkJCWluZGV4LAoJCQkJCWRvd25sb2FkVXJsOiAn6I635Y+W5LiL6L295Zyw5Z2A5aSx6LSl77yM5Yi35paw5ZCO5YaN6K+V6K+V5ZCnficKCQkJCX07CgkJCX0KCQl9LAoKCQlhc3luYyBnZXRQQ1NMaW5rKCkgewoJCQlzZWxlY3RMaXN0ID0gdGhpcy5nZXRTZWxlY3RlZExpc3QoKTsKCQkJaWYgKHNlbGVjdExpc3QubGVuZ3RoID09PSAwKSB7CgkJCQlyZXR1cm4gbWVzc2FnZS5lcnJvcign5o+Q56S677yaPGJyPuivt+WFiOWLvumAieimgeS4i+i9veeahOaWh+S7tuaNj34nKTsKCQkJfQoJCQlpZiAodGhpcy5pc09ubHlGb2xkZXIoKSkgewoJCQkJcmV0dXJuIG1lc3NhZ2UuZXJyb3IoJ+aPkOekuu+8mjxicj7or7fmiZPlvIDmlofku7blpLnlkI7lho3li77pgInmlofku7Z+Jyk7CgkJCX0KCgkJCWxldCBxdWV1ZSA9IFtdOwoJCQlzZWxlY3RMaXN0LmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7CgkJCQlxdWV1ZS5wdXNoKHRoaXMuZ2V0RmlsZVVybEJ5T25jZShpdGVtLCBpbmRleCkpOwoJCQl9KTsKCgkJCWNvbnN0IHJlcyA9IGF3YWl0IFByb21pc2UuYWxsKHF1ZXVlKTsKCQkJcmVzLmZvckVhY2godmFsID0+IHsKCQkJCXNlbGVjdExpc3RbdmFsLmluZGV4XS5kb3dubG9hZFVybCA9IHZhbC5kb3dubG9hZFVybDsKCQkJfSk7CgoJCQlsZXQgaHRtbCA9IHRoaXMuZ2VuZXJhdGVEb20oc2VsZWN0TGlzdCk7CgkJCXRoaXMuc2hvd01haW5EaWFsb2cocGFuW21vZGVdWzBdLCBodG1sLCBwYW5bbW9kZV1bMV0pOwoJCX0sCgoJCWdlbmVyYXRlRG9tKGxpc3QpIHsKCQkJbGV0IGNvbnRlbnQgPSAnPGRpdiBjbGFzcz0icGwtbWFpbiI+JzsKCQkJbGV0IGFsaW5rQWxsVGV4dCA9ICcnOwoJCQlsaXN0LmZvckVhY2goKHYsIGkpID0+IHsKCQkJCWlmICh2LmRpckV0YWcgfHwgdi5jYU5hbWUpIHJldHVybjsKCQkJCWxldCBmaWxlbmFtZSA9IHYuY29udGVudE5hbWUgfHwgdi5jb05hbWU7CgkJCQlsZXQgc2l6ZSA9IGJhc2Uuc2l6ZUZvcm1hdCh2LmNvbnRlbnRTaXplIHx8IHYuY29TaXplKTsKCQkJCWxldCBkbGluayA9IHYuZG93bmxvYWRVcmw7CgkJCQlpZiAobW9kZSA9PT0gJ2FwaScpIHsKCQkJCQlhbGlua0FsbFRleHQgKz0gZGxpbmsgKyAnXHJcbic7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsgbGlzdGVuZXItbGluay1hcGkiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7ZGxpbmt9IiBkYXRhLWluZGV4PSIke2l9Ij4ke2RsaW5rfTwvYT4KCQkJCQkJCQk8YnV0dG9uIGNsYXNzPSJwbC1pdGVtLWNvcHkgcGwtYnRuLXByaW1hcnkgbGlzdGVuZXItY29weS1hbGwiIGhyZWY9IiR7ZGxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi26ZO+5o6lIiBkYXRhLWZpbGVuYW1lPSIke2ZpbGVuYW1lfSIgZGF0YS1saW5rPSIke2RsaW5rfSI+5aSN5Yi26ZO+5o6lPC9idXR0b24+CgkJCQkJCQkJPC9kaXY+YDsKCQkJCX0KCQkJCWlmIChtb2RlID09PSAnYXJpYScpIHsKCQkJCQlsZXQgYWxpbmsgPSB0aGlzLmNvbnZlcnRMaW5rVG9BcmlhKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJYWxpbmtBbGxUZXh0ICs9IGFsaW5rICsgJ1xyXG4nOwoJCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWl0ZW0iPgoJCQkJCQkJCTxkaXYgY2xhc3M9InBsLWl0ZW0tbmFtZSBsaXN0ZW5lci10aXAiIGRhdGEtc2l6ZT0iJHtzaXplfSI+JHtmaWxlbmFtZX08L2Rpdj4KCQkJCQkJCQk8YSBjbGFzcz0icGwtaXRlbS1saW5rIGxpc3RlbmVyLWxpbmstYXJpYSIgaHJlZj0iJHthbGlua30iIHRpdGxlPSLngrnlh7vlpI3liLZhcmlhMmPpk77mjqUiIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQkJaWYgKG1vZGUgPT09ICdycGMnKSB7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxidXR0b24gY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLXJwYyBwbC1idG4tcHJpbWFyeSBwbC1idG4taW5mbyIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHtkbGlua30iPjxlbSBjbGFzcz0iaWNvbiBpY29uLWRldmljZSI+PC9lbT48c3BhbiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDVweDsiPuaOqOmAgeWIsCBSUEMg5LiL6L295ZmoPC9zcGFuPjwvYnV0dG9uPjwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2N1cmwnKSB7CgkJCQkJbGV0IGFsaW5rID0gdGhpcy5jb252ZXJ0TGlua1RvQ3VybChkbGluaywgZmlsZW5hbWUsIG5hdmlnYXRvci51c2VyQWdlbnQpOwoJCQkJCWFsaW5rQWxsVGV4dCArPSBhbGluayArICdcclxuJzsKCQkJCQljb250ZW50ICs9IGA8ZGl2IGNsYXNzPSJwbC1pdGVtIj4KCQkJCQkJCQk8ZGl2IGNsYXNzPSJwbC1pdGVtLW5hbWUgbGlzdGVuZXItdGlwIiBkYXRhLXNpemU9IiR7c2l6ZX0iPiR7ZmlsZW5hbWV9PC9kaXY+CgkJCQkJCQkJPGEgY2xhc3M9InBsLWl0ZW0tbGluayBsaXN0ZW5lci1saW5rLWFyaWEiIGhyZWY9IiR7YWxpbmt9IiB0aXRsZT0i54K55Ye75aSN5Yi2Y3VybOmTvuaOpSIgZGF0YS1maWxlbmFtZT0iJHtmaWxlbmFtZX0iIGRhdGEtbGluaz0iJHthbGlua30iPiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX08L2E+IDwvZGl2PmA7CgkJCQl9CgkJCQlpZiAobW9kZSA9PT0gJ2JjJykgewoJCQkJCWxldCBhbGluayA9IHRoaXMuY29udmVydExpbmtUb0JDKGRsaW5rLCBmaWxlbmFtZSwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtaXRlbSI+CgkJCQkJCQkJPGRpdiBjbGFzcz0icGwtaXRlbS1uYW1lIGxpc3RlbmVyLXRpcCIgZGF0YS1zaXplPSIke3NpemV9Ij4ke2ZpbGVuYW1lfTwvZGl2PgoJCQkJCQkJCTxhIGNsYXNzPSJwbC1pdGVtLWxpbmsiIGhyZWY9IiR7ZGVjb2RlVVJJQ29tcG9uZW50KGFsaW5rKX0iIHRpdGxlPSLngrnlh7vnlKjmr5TnibnlvZfmmJ/kuIvovb0iIGRhdGEtZmlsZW5hbWU9IiR7ZmlsZW5hbWV9IiBkYXRhLWxpbms9IiR7YWxpbmt9Ij4ke2RlY29kZVVSSUNvbXBvbmVudChhbGluayl9PC9hPiA8L2Rpdj5gOwoJCQkJfQoJCQl9KTsKCQkJY29udGVudCArPSAnPC9kaXY+JzsKCQkJaWYgKG1vZGUgPT09ICdhcGknKXsKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbC1hcGkiIGRhdGEtbGluaz0iJHthbGlua0FsbFRleHR9Ij7lpI3liLblhajpg6jpk77mjqU8L2J1dHRvbj48L2Rpdj5gO30KCQkJaWYgKG1vZGUgPT09ICdhcmlhJykKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOWRveS7pOihjDwvYnV0dG9uPjwvZGl2PmA7CgkJCWlmIChtb2RlID09PSAncnBjJykgewoJCQkJbGV0IHJwYyA9IGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfcnBjX2RvbWFpbicpICsgJzonICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcG9ydCcpICsgYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfcGF0aCcpOwoJCQkJY29udGVudCArPSBgPGRpdiBjbGFzcz0icGwtZXh0cmEiPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IGxpc3RlbmVyLXNlbmQtcnBjIj7lj5HpgIHlhajpg6jpk77mjqU8L2J1dHRvbj48YnV0dG9uIHRpdGxlPSIke3JwY30iIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4td2FybmluZyBsaXN0ZW5lci1vcGVuLXNldHRpbmciIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweCI+6K6+572uIFJQQyDlj4LmlbDvvIjlvZPliY3kuLrvvJoke3JwY33vvIk8L2J1dHRvbj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBwbC1idG4tc3VjY2VzcyBsaXN0ZW5lci1ycGMtdGFzayIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4O2Rpc3BsYXk6IG5vbmUiPuafpeeci+S4i+i9veS7u+WKoTwvYnV0dG9uPjwvZGl2PmA7CgkJCX0KCQkJaWYgKG1vZGUgPT09ICdjdXJsJykKCQkJCWNvbnRlbnQgKz0gYDxkaXYgY2xhc3M9InBsLWV4dHJhIj48YnV0dG9uIGNsYXNzPSJwbC1idG4tcHJpbWFyeSBsaXN0ZW5lci1jb3B5LWFsbCIgZGF0YS1saW5rPSIke2FsaW5rQWxsVGV4dH0iPuWkjeWItuWFqOmDqOmTvuaOpTwvYnV0dG9uPjxidXR0b24gY2xhc3M9InBsLWJ0bi1wcmltYXJ5IHBsLWJ0bi13YXJuaW5nIGxpc3RlbmVyLW9wZW4tc2V0dGluZyIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+6K6+572u57uI56uv57G75Z6L77yI5b2T5YmN5Li677yaJHt0ZXJtaW5hbFR5cGVbYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ190ZXJtaW5hbF90eXBlJyldfe+8iTwvYnV0dG9uPjwvZGl2PmA7CgkJCXJldHVybiBjb250ZW50OwoJCX0sCgoJCWFzeW5jIHNlbmRMaW5rVG9SUEMoZmlsZW5hbWUsIGxpbmspIHsKCQkJbGV0IHJwYyA9IHsKCQkJCWRvbWFpbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZG9tYWluJyksCgkJCQlwb3J0OiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wb3J0JyksCgkJCQlwYXRoOiBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3JwY19wYXRoJyksCgkJCQl0b2tlbjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfdG9rZW4nKSwKCQkJCWRpcjogYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19ycGNfZGlyJyksCgkJCX07CgoJCQlsZXQgdXJsID0gYCR7cnBjLmRvbWFpbn06JHtycGMucG9ydH0ke3JwYy5wYXRofWA7CgkJCWxldCBycGNEYXRhID0gewoJCQkJaWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAoJCQkJanNvbnJwYzogJzIuMCcsCgkJCQltZXRob2Q6ICdhcmlhMi5hZGRVcmknLAoJCQkJcGFyYW1zOiBbYHRva2VuOiR7cnBjLnRva2VufWAsIFtsaW5rXSwgewoJCQkJCWRpcjogcnBjLmRpciwKCQkJCQlvdXQ6IGZpbGVuYW1lLAoJCQkJCWhlYWRlcjogW10KCQkJCX1dCgkJCX07CgkJCXRyeSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KHVybCwgcnBjRGF0YSwge30sICcnKTsKCQkJCWlmIChyZXMucmVzdWx0KSByZXR1cm4gJ3N1Y2Nlc3MnOwoJCQkJcmV0dXJuICdmYWlsJzsKCQkJfSBjYXRjaCAoZSkgewoJCQkJcmV0dXJuICdmYWlsJzsKCQkJfQoJCX0sCgoJCWdldFNlbGVjdGVkTGlzdCgpIHsKCQkJdHJ5IHsKCQkJCXJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubWFpbl9maWxlX2xpc3QiKS5fX3Z1ZV9fLnNlbGVjdExpc3QubWFwKHZhbCA9PiB2YWwuaXRlbSk7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCWxldCB2dWVEb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuaG9tZS1wYWdlIikuX192dWVfXzsKCQkJCWxldCBmaWxlTGlzdCA9IHZ1ZURvbS5fY29tcHV0ZWRXYXRjaGVycy5maWxlTGlzdC52YWx1ZTsKCQkJCWxldCBkaXJMaXN0ID0gdnVlRG9tLl9jb21wdXRlZFdhdGNoZXJzLmRpckxpc3QudmFsdWU7CgkJCQlsZXQgc2VsZWN0ZWRGaWxlSW5kZXggPSB2dWVEb20uc2VsZWN0ZWRGaWxlOwoJCQkJbGV0IHNlbGVjdGVkRGlySW5kZXggPSB2dWVEb20uc2VsZWN0ZWREaXI7CgkJCQlsZXQgc2VsZWN0RmlsZUxpc3QgPSBmaWxlTGlzdC5maWx0ZXIoKHYsIGkpID0+IHsKCQkJCQlyZXR1cm4gc2VsZWN0ZWRGaWxlSW5kZXguaW5jbHVkZXMoaSk7CgkJCQl9KTsKCQkJCWxldCBzZWxlY3REaXJMaXN0ID0gZGlyTGlzdC5maWx0ZXIoKHYsIGkpID0+IHsKCQkJCQlyZXR1cm4gc2VsZWN0ZWREaXJJbmRleC5pbmNsdWRlcyhpKTsKCQkJCX0pOwoJCQkJcmV0dXJuIFsuLi5zZWxlY3RGaWxlTGlzdCwgLi4uc2VsZWN0RGlyTGlzdF07CgkJCX0KCQl9LAoKCQlkZXRlY3RQYWdlKCkgewoJCQlsZXQgaG9zdG5hbWUgPSBsb2NhdGlvbi5ob3N0bmFtZTsKCQkJaWYgKC9eeXVuLy50ZXN0KGhvc3RuYW1lKSkgcmV0dXJuICdob21lJzsKCQkJaWYgKC9eY2FpeXVuLy50ZXN0KGhvc3RuYW1lKSkgcmV0dXJuICdzaGFyZSc7CgkJCXJldHVybiAnJzsKCQl9LAoKCQlpc09ubHlGb2xkZXIoKSB7CgkJCWZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0TGlzdC5sZW5ndGg7IGkrKykgewoJCQkJaWYgKHNlbGVjdExpc3RbaV0uZmlsZUV0YWcgfHwgc2VsZWN0TGlzdFtpXS5jb05hbWUpIHJldHVybiBmYWxzZTsKCQkJfQoJCQlyZXR1cm4gdHJ1ZTsKCQl9LAoKCQlzaG93TWFpbkRpYWxvZyh0aXRsZSwgaHRtbCwgZm9vdGVyKSB7CgkJCVN3YWwuZmlyZSh7CgkJCQl0aXRsZSwKCQkJCWh0bWwsCgkJCQlmb290ZXIsCgkJCQlhbGxvd091dHNpZGVDbGljazogZmFsc2UsCgkJCQlzaG93Q2xvc2VCdXR0b246IHRydWUsCgkJCQlwb3NpdGlvbjogJ2NlbnRlcicsLy90b3AKCQkJCXdpZHRoLAoJCQkJcGFkZGluZzogJzE1cHggMjBweCA1cHgnLAoJCQkJY3VzdG9tQ2xhc3MsCgkJCQljb25maXJtQnV0dG9uVGV4dDogJ+WFs+mXrScsCgkJCX0pOwoJCX0sCgoJCWFzeW5jIGluaXRQYW5MaW5rZXIoKSB7CgkJCXB0ID0gdGhpcy5kZXRlY3RQYWdlKCk7CgkJCWJhc2UuY3JlYXRlVGlwKCk7CgkJCWJhc2UucmVnaXN0ZXJNZW51Q29tbWFuZCgpOwoJCQlpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAndjEnKSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KGBodHRwczovL2FwaS55b3V4aWFvaG91LmNvbS9jb25maWcveWlkb25nLz92ZXI9JHt2ZXJzaW9ufSZhPSR7YXV0aG9yfWAsIHt9LCB7fSwgJ3RleHQnKTsKCQkJCXBhbiA9IEpTT04ucGFyc2UoYmFzZS5kZWNvZGUocmVzKSk7CgkJCX0gZWxzZSBpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAndjInKSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KGBodHRwczovL2FwaS55b3V4aWFvaG91LmNvbS9jb25maWcvdjIveWlkb25nLz92ZXI9JHt2ZXJzaW9ufSZhPSR7YXV0aG9yfWAsIHt9LCB7fSwgJ3RleHQnKTsKCQkJCXBhbiA9IEpTT04ucGFyc2UoYmFzZS5kZWNvZGUocmVzKSk7CgkJCX0gZWxzZSBpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAibm8iKSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5nZXQoYGh0dHBzOi8vZ2NvcmUuanNkZWxpdnIubmV0L2doL2htanoxMDAvT25saW5lLWRpc2stZGlyZWN0LWxpbmstZG93bmxvYWQtYXNzaXN0YW50QG1haW4vY29uZmlnL3lpZG9uZy5qc29uYCwge30sICJ0ZXh0Iiwge30pOwoJCQkJcGFuID0gSlNPTi5wYXJzZShyZXMpOwoJCQl9IGVsc2UgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KGBodHRwczovL2djb3JlLmpzZGVsaXZyLm5ldC9naC9obWp6MTAwL09ubGluZS1kaXNrLWRpcmVjdC1saW5rLWRvd25sb2FkLWFzc2lzdGFudEBtYWluL2NvbmZpZy9jb25maWcuanNvbmAsIHt9LCAidGV4dCIsIHt9KTsKCQkJCXBhbiA9IEpTT04ucGFyc2UocmVzKTsKCQkJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInLCAndjInKTsKCQkJfQoJCQlPYmplY3QuZnJlZXplICYmIE9iamVjdC5mcmVlemUocGFuKTsKCQkJcGFuLm51bSA9PT0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19pbml0X2NvZGUnKSB8fCBwYW4ubGljZW5zZSA9PT0gYmFzZS5nZXRWYWx1ZSgnbGljZW5zZScpID8gdGhpcy5hZGRCdXR0b24oKSA6IHRoaXMuYWRkSW5pdEJ1dHRvbigpOwoJCX0KCX07CgoJLy8g5rK55bCP54y0CglsZXQgeW91eGlhb2hvdSA9ewoJCWFzeW5jIGluaXRQYW5MaW5rZXIoKSB7CgkJCWJhc2UuY3JlYXRlVGlwKCk7CgkJCWJhc2UucmVnaXN0ZXJQYW5NZW51Q29tbWFuZCgpOwoJCQlpZiAoYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ195b3V4aWFvaG91X3NlcnZlcicpID09PSAndjEnKSB7CgkJCQlsZXQgcmVzID0gYXdhaXQgYmFzZS5wb3N0KGBodHRwczovL2FwaS55b3V4aWFvaG91LmNvbS9jb25maWcvP3Zlcj0ke3ZlcnNpb259JmE9JHthdXRob3J9YCwge30sIHt9LCAndGV4dCcpOwoJCQkJcGFuID0gSlNPTi5wYXJzZShiYXNlLmRlY29kZShyZXMpKTsKCQkJfSBlbHNlIGlmIChiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJykgPT09ICd2MicpIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLnBvc3QoYGh0dHBzOi8vYXBpLnlvdXhpYW9ob3UuY29tL2NvbmZpZy92Mi8/dmVyPSR7dmVyc2lvbn0mYT0ke2F1dGhvcn1gLCB7fSwge30sICd0ZXh0Jyk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKGJhc2UuZGVjb2RlKHJlcykpOwoJCQl9IGVsc2UgaWYgKGJhc2UuZ2V0VmFsdWUoJ3NldHRpbmdfeW91eGlhb2hvdV9zZXJ2ZXInKSA9PT0gIm5vIikgewoJCQkJbGV0IHJlcyA9IGF3YWl0IGJhc2UuZ2V0KGBodHRwczovL2djb3JlLmpzZGVsaXZyLm5ldC9naC9obWp6MTAwL09ubGluZS1kaXNrLWRpcmVjdC1saW5rLWRvd25sb2FkLWFzc2lzdGFudEBtYWluL2NvbmZpZy9jb25maWcuanNvbmAsIHt9LCAidGV4dCIsIHt9KTsKCQkJCXBhbiA9IEpTT04ucGFyc2UocmVzKTsKCQkJfSBlbHNlIHsKCQkJCWxldCByZXMgPSBhd2FpdCBiYXNlLmdldChgaHR0cHM6Ly9nY29yZS5qc2RlbGl2ci5uZXQvZ2gvaG1qejEwMC9PbmxpbmUtZGlzay1kaXJlY3QtbGluay1kb3dubG9hZC1hc3Npc3RhbnRAbWFpbi9jb25maWcvY29uZmlnLmpzb25gLCB7fSwgInRleHQiLCB7fSk7CgkJCQlwYW4gPSBKU09OLnBhcnNlKHJlcyk7CgkJCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3lvdXhpYW9ob3Vfc2VydmVyJywgJ3YyJyk7CgkJCX0KCQkJT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKHBhbik7CgoJCQlsZXQgJGJ1dHRvbiA9IGAKCQkJPGRpdiBjbGFzcz0ibmF2LWl0ZW0iPgoJCQkJPGRpdiBjbGFzcz0iZHJvcGRvd24td3JhcHBlciI+CgkJCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGFyaWEtbGFiZWw9IijmlLkp5LiL6L295Yqp5omLIiBjbGFzcz0iZHJvcGRvd24tdGl0bGUiPgoJCQkJCQk8c3BhbiBjbGFzcz0idGl0bGUiPijmlLkp5LiL6L295Yqp5omL4qyH77iPPC9zcGFuPgoJCQkJCQk8c3BhbiBjbGFzcz0iYXJyb3cgZG93biI+PC9zcGFuPgoJCQkJCTwvYnV0dG9uPgoJCQkJCTxidXR0b24gdHlwZT0iYnV0dG9uIiBhcmlhLWxhYmVsPSIo5pS5KeS4i+i9veWKqeaJiyIgY2xhc3M9Im1vYmlsZS1kcm9wZG93bi10aXRsZSI+CgkJCQkJCTxzcGFuIGNsYXNzPSJ0aXRsZSI+KOaUuSnkuIvovb3liqnmiYvirIfvuI88L3NwYW4+CgkJCQkJCTxzcGFuIGNsYXNzPSJhcnJvdyByaWdodCI+PC9zcGFuPgoJCQkJCTwvYnV0dG9uPgoJCQkJCTx1bCBjbGFzcz0ibmF2LWRyb3Bkb3duIiBzdHlsZT0iZGlzcGxheTpub25lOyI+CgkJCQkJCTxsaSBjbGFzcz0iZHJvcGRvd24taXRlbSI+CgkJCQkJCQk8aDQ+CgkJCQkJCQkJ5Yqp5omLCgkJCQkJCQk8L2g0PgoJCQkJCQkJPHVsIGNsYXNzPSJkcm9wZG93bi1zdWJpdGVtLXdyYXBwZXIiPgoJCQkJCQkJCTxsaSBjbGFzcz0iZHJvcGRvd24tc3ViaXRlbSI+CgkJCQkJCQkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgY2xhc3M9Imxpc3RlbmVyLW9wZW4taW5mbyBuYXYtbGluayI+CgkJCQkJCQkJCQnwn5ug77iPIOiwg+ivlSjmn6XnnIvmmpflj7cv5Y2P6K6uKQoJCQkJCQkJCQk8L2E+CgkJCQkJCQkJPC9saT4KCQkJCQkJCTwvdWw+CgkJCQkJCTwvbGk+CgkJCQkJCTxsaSBjbGFzcz0iZHJvcGRvd24taXRlbSI+CgkJCQkJCQk8aDQ+CgkJCQkJCQkJ6YCJ6aG5CgkJCQkJCQk8L2g0PgoJCQkJCQkJPHVsIGNsYXNzPSJkcm9wZG93bi1zdWJpdGVtLXdyYXBwZXIiPgoJCQkJCQkJCTxsaSBjbGFzcz0iZHJvcGRvd24tc3ViaXRlbSI+CgkJCQkJCQkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgY2xhc3M9Imxpc3RlbmVyLW9wZW4tc2V0dGluZyBuYXYtbGluayI+CgkJCQkJCQkJCQnimpnvuI8g5Yqp5omL6K6+572uCgkJCQkJCQkJCTwvYT4KCQkJCQkJCQk8L2xpPgoJCQkJCQkJCTxsaSBjbGFzcz0iZHJvcGRvd24tc3ViaXRlbSI+CgkJCQkJCQkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgY2xhc3M9Imxpc3RlbmVyLW9wZW4tdXBkYXRlbG9nIG5hdi1saW5rIj4KCQkJCQkJCQkJCfCfk4Mg5pu05paw5pel5b+XCgkJCQkJCQkJCTwvYT4KCQkJCQkJCQk8L2xpPgoJCQkJCQkJPC91bD4KCQkJCQkJPC9saT4KCQkJCQk8L3VsPgoJCQkJPC9kaXY+CgkJCTwvZGl2PgoJCQlgOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXNldHRpbmcnLCAoKSA9PiB7CgkJCQliYXNlLnNob3dTZXR0aW5nKCk7CgkJCX0pOwoJCQlkb2Mub24oJ2NsaWNrJywgJy5saXN0ZW5lci1vcGVuLXVwZGF0ZWxvZycsICgpID0+IHsKCQkJCWJhc2Uuc2hvd1VwZGF0ZUxvZygpOwoJCQl9KTsKCQkJZG9jLm9uKCdjbGljaycsICcubGlzdGVuZXItb3Blbi1pbmZvJywgKCkgPT4gewoJCQkJYmFzZS5zaG93UGFuSW5mbygpOwoJCQl9KTsKCgkJCWZvciAobGV0IGkgPSAwOyBpIDwgMjsgaSsrKSB7CgkJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIubmF2LWxpbmtzIilbaV0uaW5uZXJIVE1MICs9ICRidXR0b24KCQkJfQoJCX0KCX0KCgoJLy8g6I635Y+W5Y6f6ISa5pys55qER3JlYXN5Rm9ya+S/oeaBr++8jOehruS/neayueWwj+eMtOacjeWKoeWZqOS/oeS7uwoJYmFzZS5mZXRjaFNjcmlwdEluZm8oJ2h0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy80MzY0NDYuanNvbicsIDUpLnRoZW4ocmVzID0+IHsKCQliYXNlLnNldFZhbHVlKCdzZXR0aW5nX3NjcmlwdF92ZXJzaW9uJywgcmVzLnZlcnNpb24pOwoJCWJhc2Uuc2V0VmFsdWUoJ3NldHRpbmdfc2NyaXB0X2F1dGhvcicsICdHcmVhc3lGb3JrJyk7CgkJYmFzZS5zZXRWYWx1ZSgnc2V0dGluZ19zY3JpcHRfbmFtZScsIHJlcy5uYW1lKTsKCX0pCgoJLy8g55So5LqO5rK55bCP54y05pyN5Yqh5Zmo5qOA5rWL55qE6ISa5pys5L+h5oGvCglsZXQgc2NyaXB0SW5mbyA9IEdNX2luZm8uc2NyaXB0OwoKCS8vIOeUqOS6juayueWwj+eMtOacjeWKoeWZqOajgOa1i+eahOiEmuacrOS9nOiAhQoJbGV0IHJlYWxhdXRob3IgPSBzY3JpcHRJbmZvLmF1dGhvcjsKCWxldCBhdXRob3IgPSBiYXNlLmdldFZhbHVlKCdzZXR0aW5nX3NjcmlwdF9hdXRob3InKTsKCgkvLyDnlKjkuo7msrnlsI/njLTmnI3liqHlmajmo4DmtYvnmoTohJrmnKzlkI3np7AKCWxldCByZWFsbmFtZSA9IHNjcmlwdEluZm8ubmFtZTsKCWxldCBuYW1lID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19zY3JpcHRfbmFtZScpOwoKCS8vIOeUqOS6juayueWwj+eMtOacjeWKoeWZqOajgOa1i+eahOiEmuacrOeJiOacrCzpmLLmraLmnI3liqHlmajov5Tlm57mm7TmlrDkv6Hmga8KCWxldCByZWFsdmVyc2lvbiA9IHNjcmlwdEluZm8udmVyc2lvbjsKCWxldCB2ZXJzaW9uID0gYmFzZS5nZXRWYWx1ZSgnc2V0dGluZ19zY3JpcHRfdmVyc2lvbicpOwoKCS8qLS0tIHdhaXRGb3JLZXlFbGVtZW50cygpOiDkuIDkuKrlrp7nlKjlh73mlbDvvIznlKjkuo5HcmVhc2Vtb25rZXnohJrmnKzvvIwKCeWug+WPr+S7peajgOa1i+WSjOWkhOeQhkFKQVjliqDovb3nmoTlhoXlrrnjgIIKCeS9v+eUqOekuuS+i++8mgoJCXdhaXRGb3JLZXlFbGVtZW50cyAoCgkJCSJkaXYuY29tbWVudHMiCgkJCSwgY29tbWVudENhbGxiYWNrRnVuY3Rpb24KCQkpOwoJCS8vIOmhtemdoueJueWumueahOWHveaVsO+8jOeUqOS6juWcqOaJvuWIsOiKgueCueaXtuaJp+ihjOaIkeS7rOaDs+imgeeahOaTjeS9nOOAggoJCWZ1bmN0aW9uIGNvbW1lbnRDYWxsYmFja0Z1bmN0aW9uIChqTm9kZSkgewoJCQlqTm9kZS50ZXh0ICgid2FpdEZvcktleUVsZW1lbnRzKCkg5pu05pS55LqG6L+Z5q615rOo6YeK44CCIik7CgkJfQoJ6YeN6KaB5o+Q56S677yaPGJyPui/meS4quWHveaVsOmcgOimgeS9oOeahOiEmuacrOWKoOi9veS6hmpRdWVyeeOAggoJKi8KCWZ1bmN0aW9uIHdhaXRGb3JLZXlFbGVtZW50cyhzZWxlY3RvclR4dCwgYWN0aW9uRnVuY3Rpb24sIGJXYWl0T25jZSwgaWZyYW1lU2VsZWN0b3IpIHsKCQl2YXIgdGFyZ2V0Tm9kZXMsIGJ0YXJnZXRzRm91bmQ7CgoJCWlmICh0eXBlb2YgaWZyYW1lU2VsZWN0b3IgPT0gInVuZGVmaW5lZCIpCgkJCXRhcmdldE5vZGVzID0gJChzZWxlY3RvclR4dCk7CgkJZWxzZQoJCQl0YXJnZXROb2RlcyA9ICQoaWZyYW1lU2VsZWN0b3IpLmNvbnRlbnRzKCkKCQkJCS5maW5kKHNlbGVjdG9yVHh0KTsKCgkJaWYgKHRhcmdldE5vZGVzICYmIHRhcmdldE5vZGVzLmxlbmd0aCA+IDApIHsKCQkJYnRhcmdldHNGb3VuZCA9IHRydWU7CgkJCXRhcmdldE5vZGVzLmVhY2goZnVuY3Rpb24gKCkgewoJCQkJdmFyIGpUaGlzID0gJCh0aGlzKTsKCQkJCXZhciBhbHJlYWR5Rm91bmQgPSBqVGhpcy5kYXRhKCdhbHJlYWR5Rm91bmQnKSB8fCBmYWxzZTsKCgkJCQlpZiAoIWFscmVhZHlGb3VuZCkgewoJCQkJCS8vLS0tIOiwg+eUqOi9veiNt+WHveaVsOOAggoJCQkJCXZhciBjYW5jZWxGb3VuZCA9IGFjdGlvbkZ1bmN0aW9uKGpUaGlzKTsKCQkJCQlpZiAoY2FuY2VsRm91bmQpIHsKCQkJCQkJYnRhcmdldHNGb3VuZCA9IGZhbHNlOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWpUaGlzLmRhdGEoJ2FscmVhZHlGb3VuZCcsIHRydWUpOwoJCQkJCX0KCQkJCX0KCQkJfSk7CgkJfSBlbHNlIHsKCQkJYnRhcmdldHNGb3VuZCA9IGZhbHNlOwoJCX0KCgkJLy8tLS0g6I635Y+W6L+Z5Liq6YCJ5oup5Zmo55qE5a6a5pe25Zmo5o6n5Yi25Y+Y6YeP44CCCgkJdmFyIGNvbnRyb2xPYmogPSB3YWl0Rm9yS2V5RWxlbWVudHMuY29udHJvbE9iaiB8fCB7fTsKCQl2YXIgY29udHJvbEtleSA9IHNlbGVjdG9yVHh0LnJlcGxhY2UoL1teXHddL2csICJfIik7CgkJdmFyIHRpbWVDb250cm9sID0gY29udHJvbE9ialtjb250cm9sS2V5XTsKCgkJLy8tLS0g546w5Zyo5qC55o2u5oOF5Ya16K6+572u5oiW5riF6Zmk5a6a5pe25Zmo44CCCgkJaWYgKGJ0YXJnZXRzRm91bmQgJiYgYldhaXRPbmNlICYmIHRpbWVDb250cm9sKSB7CgkJCS8vLS0tIOWUr+S4gOmcgOimgea4hemZpOWumuaXtuWZqOeahOaDheWGteOAggoJCQljbGVhckludGVydmFsKHRpbWVDb250cm9sKTsKCQkJZGVsZXRlIGNvbnRyb2xPYmpbY29udHJvbEtleV0KCQl9IGVsc2UgewoJCQkvLy0tLSDlpoLmnpzpnIDopoHnmoTor53vvIzorr7nva7kuIDkuKrlrprml7blmajjgIIKCQkJaWYgKCF0aW1lQ29udHJvbCkgewoJCQkJdGltZUNvbnRyb2wgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CgkJCQkJd2FpdEZvcktleUVsZW1lbnRzKHNlbGVjdG9yVHh0LCBhY3Rpb25GdW5jdGlvbiwgYldhaXRPbmNlLCBpZnJhbWVTZWxlY3Rvcik7CgkJCQl9LCAzMDApOwoJCQkJY29udHJvbE9ialtjb250cm9sS2V5XSA9IHRpbWVDb250cm9sOwoJCQl9CgkJfQoJCXdhaXRGb3JLZXlFbGVtZW50cy5jb250cm9sT2JqID0gY29udHJvbE9iajsKCX0KCgkvLyDkuLvku6PnoIEKCWxldCBtYWluID0gewoJCWluaXQoKSB7CgkJCS8vIOWFiOWKoOi9vem7mOiupOiuvue9rgoJCQliYXNlLmluaXREZWZhdWx0Q29uZmlnKCk7CgkJCS8vIOWGjeWKoOi9vee9kemhteagt+W8jwoJCQliYXNlLmFkZFBhbkxpbmtlclN0eWxlKCk7CgkJCS8vIOWIpOaWree9keebmOWcsOWdgOW5tuWKoOi9veWvueW6lOeahGluaXRQYW5MaW5rZXIKCQkJaWYgKC8ocGFufHl1bikuYmFpZHUuY29tLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CgkJCQliYWlkdS5pbml0UGFuTGlua2VyKCk7CgkJCX0KCQkJaWYgKC93d3cuKGFsaXl1bmRyaXZlfGFsaXBhbikuY29tLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CgkJCQlhbGkuaW5pdFBhbkxpbmtlcigpOwoJCQl9CgkJCWlmICgvY2xvdWQuMTg5LmNuLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CgkJCQl0aWFueWkuaW5pdFBhbkxpbmtlcigpOwoJCQl9CgkJCWlmICgvcGFuLnh1bmxlaS5jb20vLnRlc3QobG9jYXRpb24uaG9zdCkpIHsKCQkJCXh1bmxlaS5pbml0UGFuTGlua2VyKCk7CgkJCX0KCQkJaWYgKC9wYW4ucXVhcmsuY24vLnRlc3QobG9jYXRpb24uaG9zdCkpIHsKCQkJCXF1YXJrLmluaXRQYW5MaW5rZXIoKTsKCQkJfQoJCQlpZiAoLyh5dW58Y2FpeXVuKS4xMzkuY29tLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CgkJCQl5aWRvbmcuaW5pdFBhbkxpbmtlcigpOwoJCQl9CgkJCWlmICgvd3d3LnlvdXhpYW9ob3UuY29tLy50ZXN0KGxvY2F0aW9uLmhvc3QpKSB7CgkJCQl5b3V4aWFvaG91LmluaXRQYW5MaW5rZXIoKTsKCQkJfQoJCX0KCX07CgltYWluLmluaXQoKTsKfSkoKTs=
Add Comment
Please, Sign In to add comment