xiaomianao666

插件名:global_HTML5视频播放工具

Apr 30th, 2024
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_HTML5视频播放工具@base64://LyogZ2xvYmFscyBqUXVlcnksICQsIFZ1ZSAqLwovLyA9PVVzZXJTY3JpcHQ9PQovLyBAbmFtZSAgICAgICBIVE1MNeinhumikeaSreaUvuW3peWFtwovLyBAbmFtZTplbgkgICBIVE1MNSBWaWRlbyBQbGF5aW5nIFRvb2xzCi8vIEBuYW1lOml0ICAgIFN0cnVtZW50aSBkaSByaXByb2R1emlvbmUgdmlkZW8gSFRNTDUKLy8gQGRlc2NyaXB0aW9uIOinhumikeaIquWbvu+8m+WIh+aNoueUu+S4reeUu++8m+e8k+WtmOinhumike+8m+S4h+iDvee9kemhteWFqOWxj++8m+a3u+WKoOW/q+aNt+mUru+8muW/q+i/m+OAgeW/q+mAgOOAgeaaguWBnC/mkq3mlL7jgIHpn7Pph4/jgIHkuIvkuIDpm4bjgIHliIfmjaIo572R6aG1KeWFqOWxj+OAgeS4iuS4i+W4p+OAgeaSreaUvumAn+W6puOAguaUr+aMgeinhumikeermeeCue+8muayueeuoeOAgVRFROOAgeS8mC7lnJ/jgIFRUeOAgULnq5njgIHopb/nk5zop4bpopHjgIHniLHlpYfoibrjgIFB56uZ44CBUFBUVuOAgeiKkuaenFRW44CB5ZKq5ZKV6KeG6aKR44CB5paw5rWq44CB5b6u5Y2a44CB572R5piTW+WoseS5kOOAgeS6keivvuWgguOAgeaWsOmXu13jgIHmkJzni5DjgIHpo47ooYzjgIHnmb7luqbkupHop4bpopHnrYnvvJvnm7Tmkq3vvJp0d2l0Y2jjgIHmlpfpsbzjgIFZWeOAgeiZjueJmeOAgem+meePoOOAgeaImOaXl+OAguWPr+WinuWKoOiHquWumuS5ieermeeCuQovLyBAZGVzY3JpcHRpb246ZW4gRW5hYmxlIGhvdGtleXMgZm9yIEhUTUw1IHBsYXliYWNrOiB2aWRlbyBzY3JlZW5zaG90OyBlbmFibGUvZGlzYWJsZSBwaWN0dXJlLWluLXBpY3R1cmU7IGNvcHkgY2FjaGVkIHZpZGVvOyBzZW5kIGFueSB2aWRlbyB0byBmdWxsIHNjcmVlbiBvciBicm93c2VyIHdpbmRvdyBzaXplOyBmYXN0IGZvcndhcmQsIHJld2luZCwgcGF1c2UvcGxheSwgdm9sdW1lLCBza2lwIHRvIG5leHQgdmlkZW8sIHNraXAgdG8gcHJldmlvdXMgb3IgbmV4dCBmcmFtZSwgc2V0IHBsYXliYWNrIHNwZWVkLiBWaWRlbyBzaXRlcyBzdXBwb3J0ZWQ6IFlvdVR1YmUsIFRFRCwgWW91a3UsIFFRLmNvbSwgYmlsaWJpbGksIGl4aWd1YSwgaVFpeWksIHN1cHBvcnQgbWFpbnN0cmVhbSB2aWRlbyBzaXRlcyBpbiBtYWlubGFuZCBDaGluYTsgTGl2ZSBicm9hZGNhc3RzOiBUd2l0Y2gsIERvdXl1LmNvbSwgWVkuY29tLCBIdXlhLmNvbS4gQ3VzdG9tIHNpdGVzIGNhbiBiZSBhZGRlZAovLyBAZGVzY3JpcHRpb246aXQgQWJpbGl0YSB0YXN0aSBkaSBzY2VsdGEgcmFwaWRhIHBlciByaXByb2R1emlvbmUgSFRNTDU6IHNjcmVlbnNob3QgZGVsIHZpZGVvOyBhYmlsaXRhL2Rpc2FiaWxpdGEgcGljdHVyZS1pbi1waWN0dXJlOyBjb3BpYSBpbCB2aWRlbyBuZWxsYSBjYWNoZTsgbWFuZGEgcXVhbHNpYXNpIHZpZGVvIGEgc2NoZXJtbyBpbnRlcm8gbyBhIGRpbWVuc2lvbmUgZmluZXN0cmEgZGVsIGJyb3dzZXI7IGF2YW56YW1lbnRvIHZlbG9jZSwgcmlhdnZvbGdpbWVudG8sIHBhdXNhL3JpcHJvZHV6aW9uZSwgaW1wb3N0YSB2ZWxvY2l0w6AgZGkgcmlwcm9kdXppb25lLiBTaXRpIHZpZGVvIHN1cHBvcnRhdGk6IFlvdVR1YmUsIFRFRCwgU3VwcG9ydG8gZGVpIHNpdGkgdmlkZW8gbWFpbnN0cmVhbSBuZWxsYSBDaW5hIGNvbnRpbmVudGFsZS4gw4ggcG9zc2liaWxlIGFnZ2l1bmdlcmUgc2l0aSBwZXJzb25hbGl6emF0aQovLyBAaG9tZXBhZ2UgaHR0cHM6Ly9iYnMua2FmYW4uY24vdGhyZWFkLTIwOTMwMTQtMS0xLmh0bWwKLy8gQG1hdGNoICAgIGh0dHBzOi8vKi5xcS5jb20vKgovLyBAZXhjbHVkZSAgaHR0cHM6Ly91c2VyLnF6b25lLnFxLmNvbS8qCi8vIEBtYXRjaCAgICBodHRwczovL3d3dy53ZWl5dW4uY29tL3ZpZGVvXyoKLy8gQG1hdGNoICAgIGh0dHBzOi8vdi55b3VrdS5jb20vdl9wbGF5LyoKLy8gQG1hdGNoICAgIGh0dHBzOi8vdi55b3VrdS5jb20vdl9zaG93L2lkXyoKLy8gQG1hdGNoICAgIGh0dHBzOi8vdmt1LnlvdWt1LmNvbS9saXZlLyoKLy8gQG1hdGNoICAgIGh0dHBzOi8vdmlkZW8udHVkb3UuY29tL3YvKgovLyBAbWF0Y2ggICAgaHR0cHM6Ly93d3cuaXFpeWkuY29tLyoKLy8gQG1hdGNoICAgIGh0dHBzOi8vbGl2ZS5iaWxpYmlsaS5jb20vKgovLyBAbWF0Y2ggICAgaHR0cHM6Ly93d3cuYmlsaWJpbGkuY29tLyoKLy8gQG1hdGNoICAgIGh0dHBzOi8vd3d3Lml4aWd1YS5jb20vKgovLyBAbWF0Y2ggICAgaHR0cHM6Ly93d3cudG91dGlhby5jb20vdmlkZW8vKgovLyBAbWF0Y2ggICAgaHR0cHM6Ly93d3cuYWNmdW4uY24vKgovLyBAbWF0Y2ggICAgaHR0cHM6Ly9saXZlLmFjZnVuLmNuL2xpdmUvKgovLyBAbWF0Y2ggICAgaHR0cDovL3YucHB0di5jb20vc2hvdy8qCi8vIEBtYXRjaCAgICBodHRwczovL3YucHB0di5jb20vc2hvdy8qCi8vIEBtYXRjaCAgICBodHRwczovL3d3dy5taWd1dmlkZW8uY29tLyoKLy8gQG1hdGNoICAgIGh0dHBzOi8vdHYuc29odS5jb20vKgovLyBAbWF0Y2ggICAgaHR0cHM6Ly9maWxtLnNvaHUuY29tL2FsYnVtLyoKLy8gQG1hdGNoICAgIGh0dHBzOi8vd3d3Lm1ndHYuY29tLyoKLy8gQHZlcnNpb24gICAgMS45LjkKLy8gQG1hdGNoICAgIGh0dHBzOi8vcGFuLmJhaWR1LmNvbS8qCi8vIEBtYXRjaCAgICBodHRwczovL3l1bi5iYWlkdS5jb20vKgovLyBAbWF0Y2ggICAgaHR0cHM6Ly8qLjE2My5jb20vKgovLyBAbWF0Y2ggICAgaHR0cHM6Ly8qLmljb3Vyc2UxNjMub3JnLyoKLy8gQG1hdGNoICAgIGh0dHA6Ly92aWRlby5zaW5hLiovKgovLyBAbWF0Y2ggICAgaHR0cHM6Ly92aWRlby5zaW5hLiovKgovLyBAbWF0Y2ggICAgaHR0cDovL2suc2luYS4qLyoKLy8gQG1hdGNoICAgIGh0dHBzOi8vay5zaW5hLiovKgovLyBAbWF0Y2ggICAgaHR0cHM6Ly93ZWliby5jb20vKgovLyBAbWF0Y2ggICAgaHR0cHM6Ly8qLndlaWJvLmNvbS8qCi8vIEBtYXRjaCAgICBodHRwczovL3Bhbi5iYWlkdS5jb20vKgovLyBAbWF0Y2ggICAgaHR0cHM6Ly95dW4uYmFpZHUuY29tLyoKLy8gQG1hdGNoICAgIGh0dHA6Ly92LmlmZW5nLmNvbS8qCi8vIEBtYXRjaCAgICBodHRwczovL3YuaWZlbmcuY29tLyoKLy8gQG1hdGNoICAgIGh0dHA6Ly9uZXdzLm10aW1lLmNvbS8qCi8vIEBtYXRjaCAgICBodHRwOi8vdmlkZW8ubXRpbWUuY29tLyoKLy8gQEdNX2luZm8KLy8gQG1hdGNoICAgIGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tLyoKLy8gQG1hdGNoICAgIGh0dHBzOi8vd3d3LnRlZC5jb20vdGFsa3MvKgovLyBAbWF0Y2ggICAgaHR0cHM6Ly93d3cudHdpdGNoLnR2LyoKCi8vIEBtYXRjaCAgICBodHRwczovL3d3dy55eS5jb20vKgovLyBAbWF0Y2ggICAgaHR0cHM6Ly93d3cuaHV5YS5jb20vKgovLyBAbWF0Y2ggICAgaHR0cHM6Ly92LmRvdXl1LmNvbS8qCi8vIEBtYXRjaCAgICBodHRwczovL3d3dy5kb3V5dS5jb20vKgovLyBAbWF0Y2ggICAgaHR0cHM6Ly9saXZlLmRvdXlpbi5jb20vKgovLyBAbWF0Y2ggICAgaHR0cHM6Ly93d3cuZG91eWluLmNvbS8qCgovLyBAbWF0Y2ggICAgaHR0cHM6Ly93d3cubG9uZ3podS5jb20vKgovLyBAbWF0Y2ggICAgaHR0cHM6Ly93d3cuemhhbnFpLnR2LyoKLy8gQHJ1bi1hdCAgICAgZG9jdW1lbnQtc3RhcnQKLy8gQHJlcXVpcmUgICAgaHR0cHM6Ly9jZG4uc3RhdGljZmlsZS5vcmcvdnVlLzIuNi4xMS92dWUubWluLmpzCi8vIEByZXF1aXJlICAgIGh0dHBzOi8vY2RuLnN0YXRpY2ZpbGUub3JnL2pxdWVyeS8zLjYuMC9qcXVlcnkubWluLmpzCi8vIEBncmFudCAgICAgIEdNX2FkZFN0eWxlCi8vIEBpbmNsdWRlICAgICovcGxheSoKLy8gQGluY2x1ZGUgICAgKnBsYXkvKgovLyBAZ3JhbnQgICAgICB3aW5kb3cub251cmxjaGFuZ2UKLy8gQGdyYW50ICAgICAgdW5zYWZlV2luZG93Ci8vIEBncmFudCAgICAgIEdNX2Rvd25sb2FkCi8vIEBncmFudCAgICAgIEdNX29wZW5JblRhYgovLyBAZ3JhbnQgICAgICBHTV9ub3RpZmljYXRpb24KLy8gQGdyYW50ICAgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZAovLyBAZ3JhbnQgICAgICBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICBHTV9nZXRWYWx1ZQovLyBAbmFtZXNwYWNlICBodHRwczovL2dyZWFzeWZvcmsub3JnL3VzZXJzLzcwMzYKLy8gQGxpY2Vuc2UgICAgTUlUCi8vIEBkb3dubG9hZFVSTCBodHRwczovL3VwZGF0ZS5ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzMwNTQ1L0hUTUw1JUU4JUE3JTg2JUU5JUEyJTkxJUU2JTkyJUFEJUU2JTk0JUJFJUU1JUI3JUE1JUU1JTg1JUI3LnVzZXIuanMKLy8gQHVwZGF0ZVVSTCBodHRwczovL3VwZGF0ZS5ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzMwNTQ1L0hUTUw1JUU4JUE3JTg2JUU5JUEyJTkxJUU2JTkyJUFEJUU2JTk0JUJFJUU1JUI3JUE1JUU1JTg1JUI3Lm1ldGEuanMKLy8gPT0vVXNlclNjcmlwdD09CgondXNlIHN0cmljdCc7Cgpjb25zdCBjdXJMYW5nID0gbmF2aWdhdG9yLmxhbmd1YWdlLnNsaWNlKDAsIDIpOwovL+aEn+iwoiBEYXJpbyBDb3N0YSDmj5DkvpvnmoToi7Hor63lkozmhI/lpKfliKnor63nv7vor5EKY29uc3QgaTE4biA9IHsKCSd6aCc6IHsKCQknY29uc29sZSc6ICclY+iEmuacrFslc10g5Y+N6aaI77yaJXNcbiVzJywKCQknY2FjaGVTdG9yaW5nRXJyb3InOiAn55u05o6l5aqS5L2T57G75Z6L77yI5aaCTVA05qC85byP77yJ57yT5a2Y5peg5pWI5p6c77yBJywKCQknY2FjaGVTdG9yaW5nQ29uZmlybSc6ICfop4bpopHliIfniYfmlbDmja7og73lkKbnvJPlrZjvvJ/mo4DmtYvmlrnms5XvvJrliLfmlrDpobXpnaLvvIzlt7Lop4LnnIvop4bpopHniYfmrrXkuI3kuqfnlJ/nvZHnu5zmtYHph4/liJnlj6/nvJPlrZjjgILlpoLmnpzog73nvJPlrZjop4bpopHliIfniYfvvIzpgInmi6nnoa7orqTnm7TmjqXnvJPlrZjlhajpg6jop4bpopHml7bmrrXvvJvngrnlj5bmtojliJnmjInpu5jorqTnvJPlhrLljLrlpKflsI/ov5vooYznvJPlhrLjgIInLAoJCSdjYW50T3BlblBJUCc6ICfml6Dms5Xov5vlhaXnlLvkuK3nlLvmqKHlvI8h6ZSZ6K+vOlxuJywKCQknY2FudEV4aXRQSVAnOiAn5peg5rOV6YCA5Ye655S75Lit55S75qih5byPIemUmeivr++8mlxuJywKCQkncmVtZW1iZXJSYXRlTWVudU9wdGlvbic6ICforrDlv4bmkq3mlL7pgJ/luqYnLAoJCSdzcGVlZFJhdGUnOiAn5pKt5pS+6YCf5bqmICcsCgkJJ3JlYWR5JzogJ+WHhuWkh+Wwsee7qu+8gSDlvoXlkb3kuK0uJywKCQknbWFpblBhZ2VPbmx5JzogJ+WPquWkhOeQhuS4u+mhtemdoicsCgkJJ2Rvd25sb2FkJzogJ+S4i+i9vTogJywKCQkndmlkZW9MYWcnOiAn6KeG6aKR5Y2h6aG/JywKCQknZnVsbFNjcmVlbic6ICflhajlsY8nLAoJCSdoZWxwTWVudU9wdGlvbic6ICfohJrmnKzlip/og73lv6vmjbfplK7ooagnLAoJCSdoZWxwQm9keSc6IGDlj4zlh7vvvJrliIfmjaLvvIjnvZHpobXvvInlhajlsY8gICAgICAgICDpvKDmoIfkuK3plK7vvJrlv6vov5s156eSCgpQ77ya6KeG6aKR5oiq5Zu+ICAgIGnvvJrliIfmjaLnlLvkuK3nlLsgICBN77yaKOWBnOatoinnvJPlrZjop4bpopEoaGxzLmpzKQrihpAg4oaS5pa55ZCR6ZSu77ya5b+r6YCA44CB5b+r6L+bNeenkjsgICDmlrnlkJHplK4gKyBzaGlmdDogMjDnp5IK4oaRIOKGk+aWueWQkemUru+8mumfs+mHj+iwg+iKgiAgIEVTQ++8mumAgOWHuu+8iOe9kemhte+8ieWFqOWxjwrnqbrmoLzplK7vvJrmmoLlgZwv5pKt5pS+ICAgICAgTu+8muaSreaUvuS4i+S4gOmbhgrlm57ovabplK7vvJrliIfmjaLlhajlsY87ICAgICAg5Zue6L2m6ZSuICsgc2hpZnQ6IOWIh+aNoue9kemhteWFqOWxjwpDKOaKlumfs1Yp77ya5Yqg6YCfMC4x5YCNICBYKOaKlumfs1Mp77ya5YeP6YCfMC4x5YCNICBaKOaKlumfs0Ep77ya5YiH5o2i5Yqg6YCf54q25oCBCkTvvJrkuIrkuIDluKcgICAgIEbvvJrkuIvkuIDluKcoeW91dHViZS5jb23nlKhF6ZSuKWAKCX0sCgknZW4nOiB7CgkJJ2NvbnNvbGUnOiAnJWNTY3JpcHRbJXNdIEZlZWRiYWNr77yaJXNcbiVzJywKCQknY2FjaGVTdG9yaW5nRXJyb3InOiAnVHJ5aW5nIHRvIGNhY2hlIGRpcmVjdCBtZWRpYSB0eXBlcyAoc3VjaCBhcyBNUDQgZm9ybWF0KSBoYXMgbm8gZWZmZWN0IScsCgkJJ2NhY2hlU3RvcmluZ0NvbmZpcm0nOiAnRG8geW91IHdhbnQgYWxsIHNlZ21lbnRzIG9mIHRoZSB2aWRlbyB0byBiZSBjYWNoZWQ/IFRoZSBkZXRlY3Rpb24gbWV0aG9kIHVzZWQgaXMgYXMgZm9sbG93czogd2hlbiB0aGUgcGFnZSBpcyByZWZyZXNoZWQsIHRoZSB3YXRjaGVkIHZpZGVvIGNsaXBzIHdpbGwgYmUgY2FjaGVkIHNvIHRoYXQgbm8gYWRkaXRpb25hbCBuZXR3b3JrIHRyYWZmaWMgaXMgZ2VuZXJhdGVkLiBJZiB5b3Ugd2FudCBhbGwgc2VnbWVudHMgb2YgdGhlIHZpZGVvcyB0byBiZSBjYWNoZWQsIHNlbGVjdCBPSzsgb3Igc2VsZWN0IENhbmNlbCB0byBidWZmZXIgYSBwb3J0aW9uIG9mIHRoZSB2aWRlbyBiYXNlZCBvbiB0aGUgZGVmYXVsdCBidWZmZXIgc2l6ZSAod2hpY2ggaXMgdGhlIGRlZmF1bHQgYnJvd3NlciBiZWhhdmlvcikuJywKCQknY2FudE9wZW5QSVAnOiAnVW5hYmxlIHRvIGFjY2VzcyBwaWN0dXJlLWluLXBpY3R1cmUgbW9kZSEgRXJyb3LvvJpcbicsCgkJJ2NhbnRFeGl0UElQJzogJ1VuYWJsZSB0byBleGl0IHBpY3R1cmUtaW4tcGljdHVyZSBtb2RlISBFcnJvcu+8mlxuJywKCQkncmVtZW1iZXJSYXRlTWVudU9wdGlvbic6ICdSZW1lbWJlciB2aWRlbyBwbGF5YmFjayBzcGVlZCcsCgkJJ3NwZWVkUmF0ZSc6ICdTcGVlZCByYXRlICcsCgkJJ3JlYWR5JzogJyByZWFkee+8gSBXYWl0aW5nIGZvciB5b3UgY29tbWFuZHMuJywKCQknbWFpblBhZ2VPbmx5JzogJ1Byb2Nlc3MgdGhlIG1haW4gcGFnZSBvbmx5JywKCQknZG93bmxvYWQnOiAnRG93bmxvYWQ6ICcsCgkJJ3ZpZGVvTGFnJzogJ1ZpZGVvIGxhZycsCgkJJ2Z1bGxTY3JlZW4nOiAnRnVsbCBzY3JlZW4nLAoJCSdoZWxwTWVudU9wdGlvbic6ICdIb3RrZXlzIGxpc3Q6JywKCQknaGVscEJvZHknOiBgRG91YmxlLWNsaWNrOiBhY3RpdmF0ZSBmdWxsIHNjcmVlbi4KTWlkZGxlIG1vdXNlIGJ1dHRvbjogZmFzdCBmb3J3YXJkIDUgc2Vjb25kcwoKUCBrZXnvvJogVGFrZSBhIHNjcmVlbnNob3QKSSBrZXnvvJogRW50ZXIvRXhpdCBwaWN0dXJlLWluLXBpY3R1cmUgbW9kZQpNIGtlee+8miBFbmFibGUvZGlzYWJsZSBjYWNoaW5nIG9mIHZpZGVvKGhscy5qcykKCkFycm93IGtleXMg4oaQIGFuZCDihpLvvJogRmFzdCBmb3J3YXJkIG9yIHJld2luZCBieSA1IHNlY29uZHMKU2hpZnQgKyBBcnJvdyBrZXlzIOKGkCBhbmQg4oaS77yaIEZhc3QgZm9yd2FyZCBvciByZXdpbmQgMjAgc2Vjb25kcwpBcnJvdyBrZXlzIOKGkSBhbmQg4oaT77yaIFJhaXNlIG9yIGxvd2VyIHRoZSB2b2x1bWUKCkVTQ++8miBFeGl0IGZ1bGwgc2NyZWVuIChvciBleGl0IHZpZGVvIGVubGFyZ2VkIHRvIHdpbmRvdyBzaXplKQpTcGFjZWJhcu+8miBTdG9wL1BsYXkKRW50ZXLvvJogRW5hYmxlL2Rpc2FibGUgZnVsbCBzY3JlZW4gdmlkZW8KU2hpZnQgKyBFbnRlcjogU2V0L3Vuc2V0IHZpZGVvIGVubGFyZ2VkIHRvIHdpbmRvdyBzaXplCgpOIGtlee+8miBQbGF5IHRoZSBuZXh0IHZpZGVvIChpZiBhbnkpCkMga2V577yaIFNwZWVkIHVwIHZpZGVvIHBsYXliYWNrIGJ5IDAuMQpYIGtleTogU2xvdyBkb3duIHZpZGVvIHBsYXliYWNrIGJ5IDAuMQpaIGtleSwgU2V0IHZpZGVvIHBsYXliYWNrIHNwZWVkOiAxLjAg4oaQ4oaSIFgKRCBrZXk6IFByZXZpb3VzIGZyYW1lCkYga2V5OiBOZXh0IGZyYW1lIChleGNlcHQgb24gWW91VHViZSkKRSBrZXk6IE5leHQgZnJhbWUgKFlvdVR1YmUgb25seSlgCgl9LAoJJ2l0JzogewoJCSdjb25zb2xlJzogJyVjU2NyaXB0WyVzXSBGZWVkYmFja++8miVzXG4lcycsCgkJJ2NhY2hlU3RvcmluZ0Vycm9yJzogJ0NlcmNhcmUgZGkgbWVtb3JpenphemlvbmUgbmVsbGEgY2FjaGUgdGlwaSBkaSBtZWRpYSBkaXJldHRpIChjb21lIGFkIGVzZW1waW8gaWwgZm9ybWF0byBNUDQpIG5vbiBoYSBhbGN1bmEgZWZmaWNhY2lhIScsCgkJJ2NhY2hlU3RvcmluZ0NvbmZpcm0nOiAnVnVvaSBjaGUgdHV0dGkgaSBzZWdtZW50aSBkZWwgdmlkZW8gc2lhbm8gbWVtb3JpenphdGkgbmVsbGEgY2FjaGU/IElsIG1ldG9kbyBkaSByaWxldmFtZW50byB1dGlsaXp6YXRvIMOoIGlsIHNlZ3VlbnRlOiBhbGxcJ2FnZ2lvcm5hbWVudG8gZGVsbGEgcGFnaW5hLCBpIHZpZGVvIGNsaXAgZ3VhcmRhdGkgc2FyYW5ubyBtZW1vcml6emF0aSBuZWxsYSBjYWNoZSBpbiBtb2RvIGRhIG5vbiBnZW5lcmFyZSB1bHRlcmlvcmUgdHJhZmZpY28gZGkgcmV0ZS4gU2UgdnVvaSBjaGUgdHV0dGkgaSBzZWdtZW50aSBkZWkgdmlkZW8gc2lhbm8gbWVtb3JpenphdGkgbmVsbGEgY2FjaGUsIHNlbGV6aW9uYSBPSzsgc2VsZXppb25hIGludmVjZSBBbm51bGxhIHBlciBidWZmZXJpenphcmUgdW5hIHBhcnRlIGRlbCB2aWRlbyBpbiBiYXNlIGFsbGEgZGltZW5zaW9uZSBwcmVkZWZpbml0YSBkZWwgYnVmZmVyIChjb21lIGRhIGNvbXBvcnRhbWVudG8gcHJlZGVmaW5pdG8gZGVsIGJyb3dzZXIpLicsCgkJJ2NhbnRPcGVuUElQJzogJ0ltcG9zc2liaWxlIGFjY2VkZXJlIGFsbGEgbW9kYWxpdMOgIHBpY3R1cmUtaW4tcGljdHVyZSEgRXJyb3Jl77yaXG4nLAoJCSdjYW50RXhpdFBJUCc6ICdJbXBvc3NpYmlsZSB1c2NpcmUgZGFsbGEgbW9kYWxpdMOgIHBpY3R1cmUtaW4tcGljdHVyZSEgRXJyb3Jl77yaXG4nLAoJCSdyZW1lbWJlclJhdGVNZW51T3B0aW9uJzogJ01lbW9yaXp6YSBsYSB2ZWxvY2l0w6AgZGkgcmlwcm9kdXppb25lIGRlaSB2aWRlbycsCgkJJ3NwZWVkUmF0ZSc6ICdWZWxvY2l0w6AgZGkgcmlwcm9kdXppb25lICcsCgkJJ3JlYWR5JzogIlByb250b++8gSBJbiBhdHRlc2EgZGVpIGNvbWFuZGkgZGVsbCd1dGVudGUuIiwKCQknbWFpblBhZ2VPbmx5JzogJ0VsYWJvcmF6aW9uZSBkZWxsYSBzb2xhIHBhZ2luYSBwcmluY2lwYWxlJywKCQknZG93bmxvYWQnOiAnU2NhcmljYTogJywKCQkndmlkZW9MYWcnOiAnUml0YXJkbyBkZWwgdmlkZW8nLAoJCSdmdWxsU2NyZWVuJzogJ1NjaGVybW8gaW50ZXJvJywKCQknaGVscE1lbnVPcHRpb24nOiAnRWxlbmNvIGRlaSB0YXN0aSBkaSBzY2VsdGEgcmFwaWRhJywKCQknaGVscEJvZHknOiBgRG9wcGlvIGNsaWM6IGF0dGl2YSBsbyBzY2hlcm1vIGludGVybwpQdWxzYW50ZSBjZW50cmFsZSBkZWwgbW91c2U6IGF2YW56YW1lbnRvIHJhcGlkbyBkaSA1IHNlY29uZGkKClRhc3RvIFA6IEVzZWd1aSB1bm8gc2NyZWVuc2hvdApUYXN0byBJ77yaIEF0dGl2YSBtb2RhbGl0w6AgcGljdHVyZS1pbi1waWN0dXJlClRhc3RvIE3vvJogQXR0aXZhL2Rpc2F0dGl2YSBtZW1vcml6emF6aW9uZSBkZWwgdmlkZW8gbmVsbGEgY2FjaGUoaGxzLmpzKQoKVGFzdGkgZnJlY2NpYSDihpAgZSDihpLvvJogQXZhbnphIG8gcmlhdnZvbGdpIGRpIDUgc2Vjb25kaQpTaGlmdCArIFRhc3RpIGZyZWNjaWEg4oaQIGUg4oaSOiBBdmFuemEgbyByaWF2dm9sZ2kgZGkgMjAgc2Vjb25kaQpUYXN0aSBmcmVjY2lhIOKGkSBlIOKGk++8miBBbHphIG8gYWJiYXNzYSBpbCB2b2x1bWUKRVND77yaIEVzY2kgZGEgc2NoZXJtbyBpbnRlcm8KQmFycmEgc3BhemlhdHJpY2U6IEZlcm1hL1JpcHJvZHVjaQpJbnZpb++8miBBdHRpdmEvZGlzYXR0aXZhIGluZ3JhbmRpbWVudG8gZGVsIHZpZGVvIGEgc2NoZXJtbyBpbnRlcm8KU2hpZnQgKyBJbnZpbzogQXR0aXZhL2Rpc2F0dGl2YSBpbmdyYW5kaW1lbnRvIGRlbCB2aWRlbyBhIGRpbWVuc2lvbmUgZGVsbGEgZmluZXN0cmEKClRhc3RvIE7vvJogUmlwcm9kdXppb25lIGRlbCB2aWRlbyBzdWNjZXNzaXZvIChzZSBwcmVzZW50ZSkKVGFzdG8gQzogVmVsb2NpenphIHJpcHJvZHV6aW9uZSB2aWRlbyBkaSAwLDEKVGFzdG8gWDogUmFsbGVudGEgcmlwcm9kdXppb25lIHZpZGVvIGRpIDAsMQpUYXN0byBaLCBJbXBvc3RhcmUgbGEgdmVsb2NpdMOgIGRpIHJpcHJvZHV6aW9uZSB2aWRlbzogMSwwIOKGkOKGkiBYClRhc3RvIEQ6IFZhaSBhbCBmcmFtZSBwcmVjZWRlbnRlClRhc3RvIEY6IFZhaSBhbCBmcmFtZSBzdWNjZXNzaXZvIChlc2NsdXNvIFlvdVR1YmUpClRhc3RvIEU6IFZhaSBhbCBmcmFtZSBzdWNjZXNzaXZvIChzb2xvIHN1IFlvdVR1YmUpYAoJfQp9Owpjb25zdCBNU0cgPSBpMThuW2N1ckxhbmddIHx8IGkxOG4uZW47Cgpjb25zdCB3ID0gdW5zYWZlV2luZG93IHx8IHdpbmRvdzsKY29uc3QgeyBob3N0LCBwYXRobmFtZTogcGF0aCB9ID0gbG9jYXRpb247CmNvbnN0IGQgPSBkb2N1bWVudCwgZmluZCA9IFtdLmZpbmQ7CmxldCAkbXNnLCB2LCBfZnAsIF9mcywgYnk7IC8vIGRvY3VtZW50LmJvZHkKY29uc3Qgb2JzZXJ2ZU9wdCA9IHtjaGlsZExpc3QgOiB0cnVlLCBzdWJ0cmVlIDogdHJ1ZX07CmNvbnN0IG5vb3BGbiA9IGZ1bmN0aW9uKCl7fTsKY29uc3QgdmFsaWRFbCA9IGUgPT4gZSAmJiBlLm9mZnNldFdpZHRoID4gMTsKY29uc3QgcSA9IChjc3MsIHAgPSBkKSA9PiBwLnF1ZXJ5U2VsZWN0b3IoY3NzKTsKY29uc3QgcjEgPSAocmVncCwgcykgPT4gcmVncC50ZXN0KHMpICYmIFJlZ0V4cC4kMTsKY29uc3QgbG9nID0gY29uc29sZS5sb2cuYmluZCgKCWNvbnNvbGUsCglNU0cuY29uc29sZSwKCSdjb2xvcjojYzNjO2ZvbnQtc2l6ZToxLjJlbScsCglHTV9pbmZvLnNjcmlwdC5uYW1lLAoJR01faW5mby5zY3JpcHQuaG9tZXBhZ2UKKTsKY29uc3QgZ21GdW5jT2ZDaGVja01lbnUgPSAodGl0bGUsIHNhdmVOYW1lLCBkZWZhdWx0VmFsID0gdHJ1ZSkgPT4gewoJY29uc3QgciA9IEdNX2dldFZhbHVlKHNhdmVOYW1lLCBkZWZhdWx0VmFsKTsKCWlmIChyKSB0aXRsZSA9ICfiiJogICcrIHRpdGxlOwoJR01fcmVnaXN0ZXJNZW51Q29tbWFuZCh0aXRsZSwgKCkgPT4gewoJCUdNX3NldFZhbHVlKHNhdmVOYW1lLCAhcik7CgkJbG9jYXRpb24ucmVsb2FkKCk7Cgl9KTsKCXJldHVybiByOwp9Owpjb25zdCBzbGVlcCA9IG1zID0+IG5ldyBQcm9taXNlKHJlc29sdmUgPT4geyBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSB9KTsKLyog55S75Lit55S7Cjxzdmcgdmlld0JveD0iMCAwIDIyIDIyIj48ZyBmaWxsPSIjRTZFNkU2IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0xNyA0YTIgMiAwIDAxMiAydjZoLTJWNi44YS44LjggMCAwMC0uOC0uOEg0LjhhLjguOCAwIDAwLS43OTQuN0w0IDYuOHY4LjRhLjguOCAwIDAwLjcuNzk0bC4xLjAwNkgxMXYySDRhMiAyIDAgMDEtMi0yVjZhMiAyIDAgMDEyLTJoMTN6Ij48L3BhdGg+PHJlY3QgeD0iMTMiIHk9IjE0IiB3aWR0aD0iOCIgaGVpZ2h0PSI2IiByeD0iMSI+PC9yZWN0PjwvZz48L3N2Zz4K6K6+572uCjxzdmcgdmlld0JveD0iMCAwIDIyIDIyIj4KPGNpcmNsZSBjeD0iMTEiIGN5PSIxMSIgcj0iMiI+PC9jaXJjbGU+CjxwYXRoIGQ9Ik0xOS4xNjQgOC44NjFMMTcuNiA4LjZhNi45NzggNi45NzggMCAwMC0xLjE4Ni0yLjA5OWwuNTc0LTEuNTMzYTEgMSAwIDAwLS40MzYtMS4yMTdsLTEuOTk3LTEuMTUzYTEuMDAxIDEuMDAxIDAgMDAtMS4yNzIuMjNsLTEuMDA4IDEuMjI1YTcuMDQgNy4wNCAwIDAwLTIuNTUuMDAxTDguNzE2IDIuODI5YTEgMSAwIDAwLTEuMjcyLS4yM0w1LjQ0NyAzLjc1MWExIDEgMCAwMC0uNDM2IDEuMjE3bC41NzQgMS41MzNBNi45OTcgNi45OTcgMCAwMDQuNCA4LjZsLTEuNTY0LjI2MUEuOTk5Ljk5OSAwIDAwMiA5Ljg0N3YyLjMwNmMwIC40ODkuMzUzLjkwNi44MzYuOTg2bDEuNjEzLjI2OWE3IDcgMCAwMDEuMjI4IDIuMDc1bC0uNTU4IDEuNDg3YTEgMSAwIDAwLjQzNiAxLjIxN2wxLjk5NyAxLjE1M2MuNDIzLjI0NC45NjEuMTQ3IDEuMjcyLS4yM2wxLjA0LTEuMjYzYTcuMDg5IDcuMDg5IDAgMDAyLjI3MiAwbDEuMDQgMS4yNjNhMSAxIDAgMDAxLjI3Mi4yM2wxLjk5Ny0xLjE1M2ExIDEgMCAwMC40MzYtMS4yMTdsLS41NTctMS40ODdjLjUyMS0uNjEuOTQtMS4zMSAxLjIyOC0yLjA3NWwxLjYxMy0uMjY5YS45OTkuOTk5IDAgMDAuODM1LS45ODZWOS44NDdhLjk5OS45OTkgMCAwMC0uODM2LS45ODZ6TTExIDE1YTQgNCAwIDExMC04IDQgNCAwIDAxMCA4eiI+PC9wYXRoPgo8L3N2Zz4KbmV4dAo8c3ZnIHZpZXdCb3g9IjAgMCAyMiAyMiI+PHBhdGggZD0iTTE2IDVhMSAxIDAgMDAtMSAxdjQuNjE1YTEuNDMxIDEuNDMxIDAgMDAtLjYxNS0uODI5TDcuMjEgNS4yM0ExLjQzOSAxLjQzOSAwIDAwNSA2LjQ0NXY5LjExYTEuNDQgMS40NCAwIDAwMi4yMSAxLjIxNWw3LjE3NS00LjU1NWExLjQzNiAxLjQzNiAwIDAwLjYxNi0uODI4VjE2YTEgMSAwIDAwMiAwVjZDMTcgNS40NDggMTYuNTUyIDUgMTYgNXoiPjwvcGF0aD48L3N2Zz4K5oiq5Zu+CjxzdmcgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMzIgMzIiPjxwYXRoIGQ9Ik0xNiAyM2MtMy4zMDkgMC02LTIuNjkxLTYtNnMyLjY5MS02IDYtNiA2IDIuNjkxIDYgNi0yLjY5MSA2LTYgNnpNMTYgMTNjLTIuMjA2IDAtNCAxLjc5NC00IDRzMS43OTQgNCA0IDRjMi4yMDYgMCA0LTEuNzk0IDQtNHMtMS43OTQtNC00LTR6TTI3IDI4aC0yMmMtMS42NTQgMC0zLTEuMzQ2LTMtM3YtMTZjMC0xLjY1NCAxLjM0Ni0zIDMtM2gzYzAuNTUyIDAgMSAwLjQ0OCAxIDFzLTAuNDQ4IDEtMSAxaC0zYy0wLjU1MSAwLTEgMC40NDktMSAxdjE2YzAgMC41NTIgMC40NDkgMSAxIDFoMjJjMC41NTIgMCAxLTAuNDQ4IDEtMXYtMTZjMC0wLjU1MS0wLjQ0OC0xLTEtMWgtMTFjLTAuNTUyIDAtMS0wLjQ0OC0xLTFzMC40NDgtMSAxLTFoMTFjMS42NTQgMCAzIDEuMzQ2IDMgM3YxNmMwIDEuNjU0LTEuMzQ2IDMtMyAzek0yNCAxMC41YzAgMC44MjggMC42NzIgMS41IDEuNSAxLjVzMS41LTAuNjcyIDEuNS0xLjVjMC0wLjgyOC0wLjY3Mi0xLjUtMS41LTEuNXMtMS41IDAuNjcyLTEuNSAxLjV6TTE1IDRjMCAwLjU1Mi0wLjQ0OCAxLTEgMWgtNGMtMC41NTIgMC0xLTAuNDQ4LTEtMXYwYzAtMC41NTIgMC40NDgtMSAxLTFoNGMwLjU1MiAwIDEgMC40NDggMSAxdjB6Ij48L3BhdGg+PC9zdmc+CmNvbnN0IGNvb2tpZSA9IG5ldyBQcm94eShub29wRm4sIHsKCWFwcGx5KHRhcmdldCwgY3R4LCBhcmdzKSB7IC8v5riF55CGY29va2llCgkJY29uc3Qga2V5cyA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaCgvW14gPTtdKyg/PVw9KS9nKTsKCQlpZiAoa2V5cykgewoJCQljb25zdCB2YWwgPSAnPTsgZXhwaXJlcz0nICsgbmV3IERhdGUoMCkudG9VVENTdHJpbmcoKSArJzsgZG9tYWluPS47IHBhdGg9Lyc7CgkJCWZvciAoY29uc3QgayBvZiBrZXlzKSBkb2N1bWVudC5jb29raWUgPSBrICsgdmFsOwoJCX0KCQkvLyByZXR1cm4gUmVmbGVjdC5hcHBseSh0YXJnZXQsIGN0eCwgYXJncyk7Cgl9LAoJZ2V0KHRhcmdldCwgbmFtZSkgeyAvLyDor7vlj5Zjb29raWUKCQljb25zdCByID0gcjEobmV3IFJlZ0V4cChuYW1lICsnPShbXjtdKiknKSwgZG9jdW1lbnQuY29va2llKTsKCQlpZiAocikgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChyKTsKCX0sCglzZXQodGFyZ2V0LCBuYW1lLCB2YWx1ZSwgcmVjZWl2ZXIpIHsgLy8g5YaZ5YWlY29va2llCgkJbGV0IHMsIHYsIGV4cGlyZXMsCgkJb25lUGFyYW0gPSB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZyc7CgkJaWYgKG9uZVBhcmFtKSB7CgkJCWV4cGlyZXMgPSA2OwoJCQl2ID0gdmFsdWU7CgkJfSBlbHNlIHsKCQkJdiA9IHZhbHVlLnZhbDsKCQkJZXhwaXJlcyA9IHZhbHVlLmV4cGlyZXMgfHwgNjsKCQkJZGVsZXRlIHZhbHVlLmV4cGlyZXM7CgkJfQoJCXMgPSBuYW1lICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHYpOwoKCQlpZiAoZXhwaXJlcyAmJiAodHlwZW9mIGV4cGlyZXMgPT0gJ251bWJlcicgfHwgZXhwaXJlcy50b1VUQ1N0cmluZykpIHsKCQkJbGV0IGRhdGU7CgkJCWlmICh0eXBlb2YgZXhwaXJlcyA9PSAnbnVtYmVyJykgewoJCQkJZGF0ZSA9IG5ldyBEYXRlKCk7CgkJCQlkYXRlLnNldFRpbWUoZXhwaXJlcyAqIDI0ICogMzYwMDAwMCArIGRhdGUuZ2V0VGltZSgpKTsKCQkJfSBlbHNlIHsKCQkJCWRhdGUgPSBleHBpcmVzOwoJCQl9CgkJCXMgKz0gJzsgZXhwaXJlcz0nICsgZGF0ZS50b1VUQ1N0cmluZygpOwoJCX0KCQlpZiAoIW9uZVBhcmFtKSBmb3IgKGNvbnN0IGsgaW4gdmFsdWUpIHMgKz0gJzsgJyArIGsgKyAnPScgKyB2YWx1ZVtrXTsKCQlkb2N1bWVudC5jb29raWUgPSBzOwoJCXJldHVybiB0cnVlOwoJfSwKCWRlbGV0ZVByb3BlcnR5KHRhcmdldCwgbmFtZSwgZGVzY3JpcHRvcikgey8vIOWIoOmZpGNvb2tpZQoJCWRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyAnPTsgcGF0aD0vOyBleHBpcmVzPScrIG5ldyBEYXRlKDApLnRvVVRDU3RyaW5nKCk7CgkJcmV0dXJuIHRydWU7Cgl9Cn0pOwpjb25zdCBvbmNlRXZlbnQgPSAoY3R4LCBlTmFtZSkgPT4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBjdHguYWRkRXZlbnRMaXN0ZW5lcihlTmFtZSwgcmVzb2x2ZSkpOwpjb25zdCBwcm9taXNpZnkgPSAoZm4pID0+ICguLi5hcmdzKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICBhcmdzLnB1c2gocmVzb2x2ZSk7Cglmbi5hcHBseSh0aGlzLCBhcmdzKTsKfSk7ICovCmNvbnN0IGhvb2tBdHRhY2hTaGFkb3cgPSAoY2IpID0+IHsKCXRyeSB7CgkJY29uc3QgX2F0dGFjaFNoYWRvdyA9IEVsZW1lbnQucHJvdG90eXBlLmF0dGFjaFNoYWRvdzsKCQlFbGVtZW50LnByb3RvdHlwZS5hdHRhY2hTaGFkb3cgPSBmdW5jdGlvbihvcHQpIHsKCQkJb3B0Lm1vZGUgPSAnb3Blbic7CgkJCWNvbnN0IHNoYWRvd1Jvb3QgPSBfYXR0YWNoU2hhZG93LmNhbGwodGhpcywgb3B0KTsKCQkJY2Ioc2hhZG93Um9vdCk7CgkJCXJldHVybiBzaGFkb3dSb290OwoJCX07Cgl9IGNhdGNoIChlKSB7CgkJY29uc29sZS5lcnJvcignSGFjayBhdHRhY2hTaGFkb3cgZXJyb3InLCBlKTsKCX0KfTsKY29uc3QgZ2V0U3R5bGUgPSAobywgcykgPT4gewoJaWYgKG8uc3R5bGVbc10pIHJldHVybiBvLnN0eWxlW3NdOwoJaWYgKGdldENvbXB1dGVkU3R5bGUpIHsKCQljb25zdCB4ID0gZ2V0Q29tcHV0ZWRTdHlsZShvLCAnJyk7CgkJcyA9IHMucmVwbGFjZSgvKFtBLVpdKS9nLCctJDEnKS50b0xvd2VyQ2FzZSgpOwoJCXJldHVybiB4ICYmIHguZ2V0UHJvcGVydHlWYWx1ZShzKTsKCX0KfTsKY29uc3QgZG9DbGljayA9IGUgPT4gewoJaWYgKHR5cGVvZiBlID09PSAnc3RyaW5nJykgZSA9IHEoZSk7CglpZiAoZSkgeyBlLmNsaWNrID8gZS5jbGljaygpIDogZS5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdjbGljaycpKSB9Owp9Owpjb25zdCBjbGlja0R1YWxCdXR0b24gPSBidG4gPT4geyAvLyAy5ZCIMSDmjInpkq4gRWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nCgkhYnRuLm5leHRTaWJsaW5nIHx8IGdldFN0eWxlKGJ0biwgJ2Rpc3BsYXknKSAhPT0gJ25vbmUnID8gZG9DbGljayhidG4pIDogZG9DbGljayhidG4ubmV4dFNpYmxpbmcpOwp9Owpjb25zdCBwb2xsaW5nID0gKGNiLCBjb25kaXRpb24sIHN0b3AgPSB0cnVlKSA9PiB7Cgljb25zdCBmbiA9IHR5cGVvZiBjb25kaXRpb24gPT09ICdzdHJpbmcnID8gcS5iaW5kKG51bGwsIGNvbmRpdGlvbikgOiBjb25kaXRpb247Cgljb25zdCB0ID0gc2V0SW50ZXJ2YWwoKCkgPT4gewoJCWNvbnN0IHIgPSBmbigpOwoJCWlmIChyKSB7CgkJCXN0b3AgJiYgY2xlYXJJbnRlcnZhbCh0KTsKCQkJY2Iocik7CgkJfQoJfSwgMzAwKTsKCXJldHVybiB0Owp9Owpjb25zdCBnb05leHRNViA9ICgpID0+IHsKCWNvbnN0IHMgPSBsb2NhdGlvbi5wYXRobmFtZTsKCWNvbnN0IG0gPSBzLm1hdGNoKC8oXGQrKShcRCopJC8pOwoJY29uc3QgZCA9ICttWzFdICsgMTsKCWxvY2F0aW9uLmFzc2lnbihzLnNsaWNlKDAsIG0uaW5kZXgpICsgZCArIG1bMl0pOwp9Owpjb25zdCBmaXJlZm94VmVyID0gcjEoL0ZpcmVmb3hcLyhcZCspLywgbmF2aWdhdG9yLnVzZXJBZ2VudCk7CmNvbnN0IGlzRWRnZSA9IC8gRWRnZT9cLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKY29uc3QgZmFrZVVBID0gdWEgPT4gT2JqZWN0LmRlZmluZVByb3BlcnR5KG5hdmlnYXRvciwgJ3VzZXJBZ2VudCcsIHsKCXZhbHVlOiB1YSwKCXdyaXRhYmxlOiBmYWxzZSwKCWNvbmZpZ3VyYWJsZTogZmFsc2UsCgllbnVtZXJhYmxlOiB0cnVlCn0pOwpjb25zdCBnZXRNYWluRG9tYWluID0gaG9zdCA9PiB7Cgljb25zdCBhID0gaG9zdC5zcGxpdCgnLicpOwoJbGV0IGkgPSBhLmxlbmd0aCAtIDI7CglpZiAoL14oY29tP3xjY3x0dnxuZXR8b3JnfGdvdnxlZHUpJC8udGVzdChhW2ldKSkgaS0tOwoJcmV0dXJuIGFbaV07Cn07CmNvbnN0IGluUmFuZ2UgPSAobiwgbWluLCBtYXgpID0+IE1hdGgubWF4KG1pbiwgbikgPT0gTWF0aC5taW4obiwgbWF4KTsKY29uc3QgYWRqdXN0UmF0ZSA9IG4gPT4gewoJbiArPSB2LnBsYXliYWNrUmF0ZTsKCWlmIChuIDwgMC4xKSB2LnBsYXliYWNrUmF0ZSA9IC4xOwoJZWxzZSBpZiAobiA+IDE2KSB2LnBsYXliYWNrUmF0ZSA9IDE2OwoJZWxzZSB2LnBsYXliYWNrUmF0ZSA9ICtuLnRvRml4ZWQoMik7Cn07CmNvbnN0IGFkanVzdFZvbHVtZSA9IG4gPT4gewoJbiArPSB2LnZvbHVtZTsKCWlmIChpblJhbmdlKG4sIDAsIDEpKSB2LnZvbHVtZSA9ICtuLnRvRml4ZWQoMik7Cn07CmNvbnN0IHRpcCA9IChtc2cpID0+IHsKCWlmICghJG1zZz8uZ2V0KDApPy5vZmZzZXRIZWlnaHQpICRtc2cgPSAkKCc8ZGl2IHN0eWxlPSJtYXgtd2lkdGg6NDU1cHg7bWluLXdpZHRoOjMzM3B4O2JhY2tncm91bmQ6I0VFRTtjb2xvcjojMTExO2hlaWdodDoyMnB4O3RvcDotMzBweDtsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsIDApOyBib3JkZXItcmFkaXVzOjhweDtib3JkZXI6MXB4IHNvbGlkIG9yYW5nZTt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MTVweDtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjIxNDc0ODM2NDciPjwvZGl2PicpLmFwcGVuZFRvKGJ5KTsKICAgIGlmICghbXNnPy5sZW5ndGgpIHJldHVybjsKCWNvbnN0IGxlbiA9IG1zZy5sZW5ndGggKiAxNTsKCSRtc2cuc3RvcCh0cnVlLCB0cnVlKS50ZXh0KG1zZykKCQkuY3NzKHt3aWR0aDpgJHtsZW59cHhgfSkKCQkuYW5pbWF0ZSh7dG9wOicxOTBweCd9KQoJCS5hbmltYXRlKHt0b3A6Jys9OXB4J30sMTkwMCkKCQkuYW5pbWF0ZSh7dG9wOictMzBweCd9KTsKfTsKY29uc3QgdWFfY2hyb21lID0gJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMTsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzk5LjAuMzYyNi4xMjEgU2FmYXJpLzUzNy4zNic7CmNvbnN0IHUgPSBnZXRNYWluRG9tYWluKGhvc3QpOwpjb25zdCBjZmcgPSB7Cglpc0xpdmU6ICExLAoJZGlzYWJsZURCTENsaWNrOiAhMSwKCWlzQ2xpY2tPblZpZGVvOiAhMSwKCW11bHRpcGxlVjogITEsIC8v5aSa6KeG6aKR6aG16Z2iCglpc051bVVSTDogITEgLy/nvZHlnYDmlbDlrZfliIbpm4YKfTsKY29uc3QgYnVzID0gbmV3IFZ1ZSgpOwppZiAod2luZG93Lm9udXJsY2hhbmdlID09PSB2b2lkIDApIHsKCWhpc3RvcnkucHVzaFN0YXRlID0gKCBmID0+IGZ1bmN0aW9uIHB1c2hTdGF0ZSgpewoJCWNvbnN0IHJldCA9IGYuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCQl3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3B1c2hzdGF0ZScpKTsKCQl3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3VybGNoYW5nZScpKTsKCQlyZXR1cm4gcmV0OwoJfSkoaGlzdG9yeS5wdXNoU3RhdGUpOwoKCWhpc3RvcnkucmVwbGFjZVN0YXRlID0gKCBmID0+IGZ1bmN0aW9uIHJlcGxhY2VTdGF0ZSgpewoJCWNvbnN0IHJldCA9IGYuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCQl3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3JlcGxhY2VzdGF0ZScpKTsKCQl3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3VybGNoYW5nZScpKTsKCQlyZXR1cm4gcmV0OwoJfSkoaGlzdG9yeS5yZXBsYWNlU3RhdGUpOwoKCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsKCk9PnsKCQl3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3VybGNoYW5nZScpKQoJfSk7Cn07CgpjbGFzcyBGdWxsU2NyZWVuIHsKCWNvbnN0cnVjdG9yKGUpIHsKCQlsZXQgZm4gPSBkLmV4aXRGdWxsc2NyZWVuIHx8IGQud2Via2l0RXhpdEZ1bGxzY3JlZW4gfHwgZC5tb3pDYW5jZWxGdWxsU2NyZWVuIHx8IGQubXNFeGl0RnVsbHNjcmVlbiB8fCBub29wRm47CgkJdGhpcy5leGl0ID0gZm4uYmluZChkKTsKCQlmbiA9IGUucmVxdWVzdEZ1bGxzY3JlZW4gfHwgZS53ZWJraXRSZXF1ZXN0RnVsbFNjcmVlbiB8fCBlLm1velJlcXVlc3RGdWxsU2NyZWVuIHx8IGUubXNSZXF1ZXN0RnVsbFNjcmVlbiB8fCBub29wRm47CgkJdGhpcy5lbnRlciA9IGZuLmJpbmQoZSk7Cgl9CglzdGF0aWMgaXNGdWxsKCkgewoJCXJldHVybiAhIShkLmZ1bGxzY3JlZW4gfHwgZC53ZWJraXRJc0Z1bGxTY3JlZW4gfHwgZC5tb3pGdWxsU2NyZWVuIHx8CgkJZC5mdWxsc2NyZWVuRWxlbWVudCB8fCBkLndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IHx8IGQubW96RnVsbFNjcmVlbkVsZW1lbnQpOwoJfQoJdG9nZ2xlKCkgewoJCUZ1bGxTY3JlZW4uaXNGdWxsKCkgPyB0aGlzLmV4aXQoKSA6IHRoaXMuZW50ZXIoKTsKCX0KfQoKLy/kuIfog73nvZHpobXlhajlsY8sIOWPguiAg+S6hu+8mmh0dHBzOi8vZ2l0aHViLmNvbS9nb295aWUveWtoNXAKY2xhc3MgRnVsbFBhZ2UgewoJY29uc3RydWN0b3IoY29udGFpbmVyKSB7CgkJdGhpcy5faXNGdWxsID0gITE7CgkJdGhpcy5jb250YWluZXIgPSBjb250YWluZXIgfHwgRnVsbFBhZ2UuZ2V0UGxheWVyQ29udGFpbmVyKHYpOwoJCUdNX2FkZFN0eWxlKAoJCQlgLmdtLWZwLWJvZHkgLmdtLWZwLXpUb3AgewoJCQkJcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7CgkJCQl6LWluZGV4OiAyMTQ3NDgzNjQ2ICFpbXBvcnRhbnQ7CgkJCX0KCQkJLmdtLWZwLXdyYXBwZXIsIC5nbS1mcC1ib2R5eyBvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudDsgfQoJCQkuZ20tZnAtd3JhcHBlciAuZ20tZnAtaW5uZXJCb3ggewoJCQkJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKCQkJCWhlaWdodDogMTAwJSAhaW1wb3J0YW50OwoJCQl9CgkJCS5nbS1mcC13cmFwcGVyIHsKCQkJCWRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CgkJCQlwb3NpdGlvbjogZml4ZWQgIWltcG9ydGFudDsKCQkJCXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CgkJCQloZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKCQkJCXBhZGRpbmc6IDAgIWltcG9ydGFudDsKCQkJCW1hcmdpbjogMCAhaW1wb3J0YW50OwoJCQkJdG9wOiAwICFpbXBvcnRhbnQ7CgkJCQlsZWZ0OiAwICFpbXBvcnRhbnQ7CgkJCQliYWNrZ3JvdW5kOiAjMDAwICFpbXBvcnRhbnQ7CgkJCQl6LWluZGV4OiAyMTQ3NDgzNjQ2ICFpbXBvcnRhbnQ7CgkJCX1gCgkJKTsKCX0KCXN0YXRpYyBnZXRQbGF5ZXJDb250YWluZXIodmlkZW8pIHsKCQlsZXQgZSA9IHZpZGVvLCBwID0gZS5wYXJlbnROb2RlOwoJCWNvbnN0IHsgY2xpZW50V2lkdGg6IHdpZCwgY2xpZW50SGVpZ2h0OiBoIH0gPSBlOwoJCWRvIHsKCQkJZSA9IHA7CgkJCXAgPSBlLnBhcmVudE5vZGU7CgkJfSB3aGlsZSAocCAmJiBwICE9PSBieSAmJiBwLmNsaWVudFdpZHRoLXdpZCA8IDUgJiYgcC5jbGllbnRIZWlnaHQtaCA8IDUpOwoJCS8vZSDkuLrov5Tlm57lgLzvvIzlnKjmraTkuYvlkI7kuI3og73lj5jkuoYKCQkvLyB3aGlsZSAocCAhPT0gYnkpIHAgPSBwLnBhcmVudE5vZGUgfHwgcC5ob3N0OwoJCXJldHVybiBlOwoJfQoJc3RhdGljIGlzRnVsbChlKSB7CgkJcmV0dXJuIHcuaW5uZXJXaWR0aCAtIGUuY2xpZW50V2lkdGggPCA1ICYmIHcuaW5uZXJIZWlnaHQgLSBlLmNsaWVudEhlaWdodCA8IDU7Cgl9Cgl0b2dnbGUoKSB7CgkJLy8gYXNzZXJ0KHRoaXMuY29udGFpbmVyKTsKCQlpZiAoIXRoaXMuY29udGFpbmVyLmNvbnRhaW5zKHYpKSB0aGlzLmNvbnRhaW5lciA9IEZ1bGxQYWdlLmdldFBsYXllckNvbnRhaW5lcih2KTsKCQlidXMuJGVtaXQoJ3N3aXRjaEZQJywgIXRoaXMuX2lzRnVsbCk7CgkJYnkuY2xhc3NMaXN0LnRvZ2dsZSgnZ20tZnAtYm9keScpOwoJCWxldCBlID0gdjsKCQl3aGlsZSAoZSAhPSB0aGlzLmNvbnRhaW5lcikgewoJCQllLmNsYXNzTGlzdC50b2dnbGUoJ2dtLWZwLWlubmVyQm94Jyk7CgkJCWUgPSBlLnBhcmVudE5vZGU7CgkJfQoJCWUuY2xhc3NMaXN0LnRvZ2dsZSgnZ20tZnAtd3JhcHBlcicpOwoJCWUgPSBlLnBhcmVudE5vZGU7CgkJd2hpbGUgKGUgIT0gYnkpIHsKCQkJZS5jbGFzc0xpc3QudG9nZ2xlKCdnbS1mcC16VG9wJyk7CgkJCWUgPSBlLnBhcmVudE5vZGU7CgkJfQoJCXRoaXMuX2lzRnVsbCA9ICF0aGlzLl9pc0Z1bGw7Cgl9Cn0KCmNvbnN0IGNhY2hlTVYgPSB7CgljaGVjaygpIHsKCQljb25zdCBidWYgPSB2LmJ1ZmZlcmVkOwoJCWNvbnN0IGkgPSBidWYubGVuZ3RoIC0gMTsKCQl0aGlzLmlFbmQgPSBidWYuZW5kKGkpOwoJCXJldHVybiB0aGlzLm1vZGUgPyB0aGlzLmlFbmQgPiB2LmR1cmF0aW9uIC01NSA6IGJ1Zi5zdGFydCgwKSA+PSB0aGlzLnBsYXlQb3MgfHwgdGhpcy5pRW5kID4gdi5kdXJhdGlvbiAtNTU7Cgl9LAoJZmluaXNoKCkgewoJCXYucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2FucGxheXRocm91Z2gnLCB0aGlzLm9uQ2hhY2hlKTsKCQl2LmN1cnJlbnRUaW1lID0gdGhpcy5wbGF5UG9zOwoJCXRoaXMuY2hhY2hlZCA9ICExOwoJCXNldFRpbWVvdXQoXyA9PiB2LnBhdXNlKCksIDk5KTsKCQlIVE1MTWVkaWFFbGVtZW50LnByb3RvdHlwZS5wbGF5ID0gdGhpcy5yYXdQbGF5OwoJfSwKCW9uQ2hhY2hlKCkgewoJCWlmICh0aGlzLmNoZWNrKCkpIHRoaXMuZmluaXNoKCk7CgkJZWxzZSB2LmN1cnJlbnRUaW1lID0gdGhpcy5pRW5kOwoJfSwKCWV4ZWMoKSB7CgkJaWYgKGNmZy5pc0xpdmUgfHwgIXYpIHJldHVybjsKCQlpZiAodi5zcmMuc3RhcnRzV2l0aCgnaHR0cCcpKSB7CgkJCWFsZXJ0KE1TRy5jYWNoZVN0b3JpbmdFcnJvcik7CgkJCXJldHVybjsKCQl9CgkJdGhpcy5tb2RlID0gY29uZmlybShNU0cuY2FjaGVTdG9yaW5nQ29uZmlybSk7CgkJdGhpcy5jaGFjaGVkID0gdHJ1ZTsgLy/mraPlnKjnvJPlrZgKCQl2LnBhdXNlKCk7CgkJdGhpcy5yYXdQbGF5ID0gSFRNTE1lZGlhRWxlbWVudC5wcm90b3R5cGUucGxheTsKCQlIVE1MTWVkaWFFbGVtZW50LnByb3RvdHlwZS5wbGF5ID0gKCkgPT4gbmV3IFByb21pc2Uobm9vcEZuKTsKCQl0aGlzLnBsYXlQb3MgPSB2LmN1cnJlbnRUaW1lOwoJCXYuYWRkRXZlbnRMaXN0ZW5lcignY2FucGxheXRocm91Z2gnLCB0aGlzLm9uQ2hhY2hlKTsKCQl0aGlzLmNoZWNrKCk7CgkJdi5jdXJyZW50VGltZSA9IHRoaXMuaUVuZDsKCX0KfTsKY2FjaGVNVi5vbkNoYWNoZSA9IGNhY2hlTVYub25DaGFjaGUuYmluZChjYWNoZU1WKTsKCmNvbnN0IGFjdExpc3QgPSBuZXcgTWFwKCk7CmFjdExpc3Quc2V0KDkwLCBfID0+IHsgLy/mjInplK5aOiDliIfmjaLliqDpgJ/nirbmgIEKCWlmICh2LnBsYXliYWNrUmF0ZSA9PSAxIHx8IHYucGxheWJhY2tSYXRlID09IDApIHsKCQl2LnBsYXliYWNrUmF0ZSA9ICtsb2NhbFN0b3JhZ2UubXZQbGF5UmF0ZSB8fCAxLjM7Cgl9IGVsc2UgewoJCS8vIGxvY2FsU3RvcmFnZS5tdlBsYXlSYXRlID0gdi5wbGF5YmFja1JhdGU7CgkJdi5wbGF5YmFja1JhdGUgPSAxOwoJfQp9KQouc2V0KDg4LCBhZGp1c3RSYXRlLmJpbmQobnVsbCwgLTAuMSkpIC8v5oyJ6ZSuWAouc2V0KDY3LCBhZGp1c3RSYXRlLmJpbmQobnVsbCwgMC4xKSkgLy/mjInplK5DCi5zZXQoNDAsIGFkanVzdFZvbHVtZS5iaW5kKG51bGwsIC0wLjEpKSAvL+KGk+OAgOmZjemfs+mHjwouc2V0KDM4LCBhZGp1c3RWb2x1bWUuYmluZChudWxsLCAwLjEpKSAvL+KGkeOAgOWKoOmfs+mHjwouc2V0KDM3LCBfID0+IHt2LmN1cnJlbnRUaW1lIC09IDV9KSAvL+aMiemUruKGkAouc2V0KDM3KzEwMjQsIF8gPT4ge3YuY3VycmVudFRpbWUgLT0gMjB9KSAvL+aMiemUrnNoaWZ0K+KGkAouc2V0KDM5LCBfID0+IHt2LmN1cnJlbnRUaW1lICs9IDV9KSAvL+aMiemUruKGkgouc2V0KDM5KzEwMjQsIF8gPT4ge3YuY3VycmVudFRpbWUgKz0gMjB9KSAvL+aMiemUrnNoaWZ0K+KGkgouc2V0KDY4LCBfID0+IHt2LmN1cnJlbnRUaW1lIC09IDAuMDM7di5wYXVzZSgpfSkgLy/mjInplK5E77ya5LiK5LiA5binCi5zZXQoNzAsIF8gPT4ge3YuY3VycmVudFRpbWUgKz0gMC4wMzt2LnBhdXNlKCl9KSAvL+aMiemUrkbvvJrkuIvkuIDluKcKLnNldCgzMiwgXyA9PiB7CS8v5oyJ6ZSuc3BhY2UKCWlmIChjZmcuYnRuUGxheSkgY2xpY2tEdWFsQnV0dG9uKGNmZy5idG5QbGF5KTsKCWVsc2Ugdi5wYXVzZWQgPyB2LnBsYXkoKSA6IHYucGF1c2UoKTsKfSkKLnNldCgxMywgXyA9PiB7CS8v5Zue6L2m6ZSu44CCIOWFqOWxjwoJX2ZzID8gX2ZzLnRvZ2dsZSgpIDogY2xpY2tEdWFsQnV0dG9uKGNmZy5idG5GUyk7Cn0pCi5zZXQoMTMrMTAyNCwgXyA9PiB7Ly93ZWLlhajlsY8KCXNlbGYgIT0gdG9wID8gdG9wLnBvc3RNZXNzYWdlKHtpZDogJ2dtLWg1LXRvZ2dsZS1pZnJhbWVXZWJGdWxsJ30sICcqJykKCTogX2ZwID8gX2ZwLnRvZ2dsZSgpIDogY2xpY2tEdWFsQnV0dG9uKGNmZy5idG5GUCk7Cn0pCi5zZXQoMjcrMTAyNCwgbm9vcEZuKQkvL+W/veeVpeaMiemUrnNoaWZ0ICsgZXNjCi5zZXQoMjcsIGV2ID0+IHsJLy/mjInplK5lc2MKCWlmIChGdWxsU2NyZWVuLmlzRnVsbCgpKSB7CgkJX2ZzID8gX2ZzLmV4aXQoKSA6IGNsaWNrRHVhbEJ1dHRvbihjZmcuYnRuRlMpOwoJfSBlbHNlIGlmIChzZWxmICE9IHRvcCkgewoJCXRvcC5wb3N0TWVzc2FnZSh7aWQ6ICdnbS1oNS1pcy1pZnJhbWVXZWJGdWxsJ30sICcqJyk7Cgl9IGVsc2UgaWYgKEZ1bGxQYWdlLmlzRnVsbCh2KSkgewoJCV9mcCA/IF9mcC50b2dnbGUoKSA6IGNsaWNrRHVhbEJ1dHRvbihjZmcuYnRuRlApOwoJfQp9KQouc2V0KDczLCBfID0+IHsgLy/mjInplK5J77ya55S75Lit55S75qih5byPCglpZiAoIWQucGljdHVyZUluUGljdHVyZUVsZW1lbnQpIHsKCQl2LnJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlKCkuY2F0Y2goZXJyID0+IHsKCQkJYWxlcnQoTVNHLmNhbnRPcGVuUElQICsgZXJyKQoJCX0pOwoJfSBlbHNlIHsKCQlkLmV4aXRQaWN0dXJlSW5QaWN0dXJlKCkuY2F0Y2goZXJyID0+IHsKCQkJYWxlcnQoTVNHLmNhbnRFeGl0UElQICsgZXJyKQoJCX0pOwoJfQp9KQouc2V0KDgwLCBfID0+IHsgLy/mjInplK5Q77ya5oiq5Zu+Cgljb25zdCBjYW52YXMgPSBkLmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOwoJY2FudmFzLndpZHRoID0gdi52aWRlb1dpZHRoOwoJY2FudmFzLmhlaWdodCA9IHYudmlkZW9IZWlnaHQ7CgljYW52YXMuZ2V0Q29udGV4dCgnMmQnKS5kcmF3SW1hZ2UodiwgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTsKCgljYW52YXMudG9CbG9iKChibG9iKSA9PiB7CgkJY29uc3QgZGF0YVVSTCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CgkJR01fZG93bmxvYWQoewoJCQl1cmw6IGRhdGFVUkwsCgkJCW5hbWU6IERhdGUubm93KCkudG9TdHJpbmcoMzYpICsnLnBuZycsCgkJCW9ubG9hZGVuZDogXyA9PiB7VVJMLnJldm9rZU9iamVjdFVSTChkYXRhVVJMKTt9CgkJfSk7CgkJLyoKCQljb25zdCBsaW5rID0gZC5jcmVhdGVFbGVtZW50KCdhJyk7CgkJbGluay5ocmVmID0gZGF0YVVSTDsKCQlsaW5rLmRvd25sb2FkID0gRGF0ZS5ub3coKS50b1N0cmluZygzNikgKycucG5nJzsKCQlsaW5rLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CgkJZC5ib2R5LmFwcGVuZENoaWxkKGxpbmspOwoJCWxpbmsuY2xpY2soKTsKCQlsaW5rLnJlbW92ZSgpOyAqLwoJfSk7Cn0pCi5zZXQoNzcsIF8gPT4gey8vIE0g57yT5a2Y6KeG6aKRCgljYWNoZU1WLmNoYWNoZWQgPyBjYWNoZU1WLmZpbmlzaCgpIDogY2FjaGVNVi5leGVjKCk7Cn0pCi5zZXQoNzgsIF8gPT4gey8vIE4g5LiL5LiA6ZuGCglpZiAoc2VsZiAhPSB0b3ApIHRvcC5wb3N0TWVzc2FnZSh7aWQ6ICdnbS1oNS1wbGF5LW5leHQnfSwgJyonKTsKCWVsc2UgaWYgKGNmZy5idG5OZXh0KSBkb0NsaWNrKGNmZy5idG5OZXh0KTsKCWVsc2UgaWYgKGNmZy5pc051bVVSTCkgZ29OZXh0TVYoKTsKfSk7Cgpjb25zdCBhcHAgPSB7CglyYXdQcm9wczogbmV3IE1hcCgpLAoJc2hlbGxFdmVudCgpIHsKCQljb25zdCBmbiA9IGV2ID0+IHsKCQkJaWYgKGV2LnRhcmdldC5jbG9zZXN0KCdzdmcsaW1nLGJ1dHRvbicpKSByZXR1cm47CgkJCWV2LnN0b3BQcm9wYWdhdGlvbigpOyAvLyBwcmV2ZW50RGVmYXVsdAoJCQlldi5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKCQkJdGhpcy5jaGVja1VJKCk7CgkJCWFjdExpc3QuZ2V0KDEwMzcpKCk7IC8vd2Vi5YWo5bGPCgkJfTsKCQljb25zdCBlID0gY2ZnLmlzQ2xpY2tPblZpZGVvID8gdiA6IGNmZy5tdlNoZWxsOwoJCWUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZXYgPT4gewoJCQlpZiAoMSA9PSBldi5idXR0b24pIHsKCQkJCWV2LnByZXZlbnREZWZhdWx0KCk7CgkJCQlldi5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCWV2LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwoJCQkJaWYgKCFjZmcuaXNMaXZlKSB7CgkJCQkJYWN0TGlzdC5oYXMoMzkpID8gYWN0TGlzdC5nZXQoMzkpKCkgOiB2LmN1cnJlbnRUaW1lICs9IDU7CgkJCQl9CgkJCX0KCQl9KTsKCQkhY2ZnLmRpc2FibGVEQkxDbGljayAmJiBlLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgZm4pOwoJfSwKCXNldFNoZWxsKCkgewoJCWNvbnN0IGUgPSB0aGlzLmdldERQbGF5ZXIoKSB8fCB0aGlzLmdldEFydHBsYXllcigpIHx8IHRoaXMuZ2V0VmpzUGxheWVyKCkgfHwKCQkJKGNmZy5zaGVsbENTUyAmJiBxKGNmZy5zaGVsbENTUykpIHx8CgkJCSh0b3AgIT0gc2VsZiA/IGJ5IDogRnVsbFBhZ2UuZ2V0UGxheWVyQ29udGFpbmVyKHYpKTsKCQlpZiAoZSAmJiBjZmcubXZTaGVsbCAhPT0gZSkgewoJCQljZmcubXZTaGVsbCA9IGU7CgkJCXRoaXMuc2hlbGxFdmVudCgpOwoJCX0KCX0sCgljaGVja01WKCkgewoJCWlmICh0aGlzLnZMaXN0KSB7CgkJCWNvbnN0IGUgPSB0aGlzLmZpbmRNVigpOwoJCQlpZiAoZSAmJiBlICE9IHYpIHsKCQkJCXYgPSBlOwoJCQkJY2ZnLmJ0blBsYXkgPSBjZmcuYnRuTmV4dCA9IGNmZy5idG5GUCA9IGNmZy5idG5GUyA9IF9mcyA9IF9mcCA9IG51bGw7CgkJCQlpZiAoIWNmZy5pc0xpdmUgJiYgR01fZ2V0VmFsdWUoJ3JlbWJlclJhdGUnLCB0cnVlKSkgewoJCQkJCXYucGxheWJhY2tSYXRlID0gK2xvY2FsU3RvcmFnZS5tdlBsYXlSYXRlIHx8IDE7CgkJCQkJdi5hZGRFdmVudExpc3RlbmVyKCdyYXRlY2hhbmdlJywgZXYgPT4gewoJCQkJCQlpZiAodi5wbGF5YmFja1JhdGUgJiYgdi5wbGF5YmFja1JhdGUgIT0gMSkgbG9jYWxTdG9yYWdlLm12UGxheVJhdGUgPSB2LnBsYXliYWNrUmF0ZTsKCQkJCQl9KTsKCQkJCX0KCQkJCXRoaXMuc2V0U2hlbGwoKTsKCQkJfQoJCX0KCQlpZiAoIXZhbGlkRWwoY2ZnLm12U2hlbGwpKSB7CgkJCWNmZy5tdlNoZWxsID0gbnVsbDsKCQkJdGhpcy5zZXRTaGVsbCgpOwoJCX0KCQl0aGlzLmNoZWNrVUkoKTsKCQlyZXR1cm4gdjsKCX0sCglnZXRBcnRwbGF5ZXIoKSB7CgkJY29uc3QgZSA9IHYucGFyZW50Tm9kZTsKCQlpZiAoIXYubWF0Y2hlcygnLmFydC12aWRlbycpIHx8ICFlLm1hdGNoZXMoJy5hcnQtdmlkZW8tcGxheWVyJykpIHJldHVybiAhMTsKCQljZmcuYnRuRlAgPSBxKCcuYXJ0LWNvbnRyb2wtZnVsbHNjcmVlbldlYicsIGUpOwoJCWNmZy5idG5GUyA9IHEoJy5hcnQtY29udHJvbC1mdWxsc2NyZWVuJywgZSk7CgkJZS5jbG9zZXN0KCdib2R5ID4gKicpPy5jbGFzc0xpc3QuYWRkKCdnbS1kcC16VG9wJyk7CgkJcmV0dXJuIGU7Cgl9LAoJZ2V0RFBsYXllcigpIHsKCQlpZiAoIXYubWF0Y2hlcygnLmRwbGF5ZXItdmlkZW8nKSkgcmV0dXJuICExOwoJCWNvbnN0IGUgPSB2LmNsb3Nlc3QoJy5kcGxheWVyJyk7CgkJaWYgKGUpIHsKCQkJY2ZnLmJ0bkZQID0gcSgnLmRwbGF5ZXItZnVsbC1pbi1pY29uID4gc3BhbicsIGUpOwoJCQljZmcuYnRuRlMgPSBxKCcuZHBsYXllci1mdWxsLWljb24nLCBlKTsKCQkJZS5jbG9zZXN0KCdib2R5ID4gKicpLmNsYXNzTGlzdC5hZGQoJ2dtLWRwLXpUb3AnKTsKCQl9CgkJcmV0dXJuIGU7Cgl9LAoJZ2V0VmpzUGxheWVyKCkgewoJCWNvbnN0IGUgPSB2LmNsb3Nlc3QoJy52aWRlby1qcycpOwoJCWlmIChlKSB7CgkJCWNmZy5idG5GUyA9IHEoJy52anMtY29udHJvbC1iYXIgPiBidXR0b24udmpzLWJ1dHRvbjpudGgtbGFzdC1vZi10eXBlKDEpJyk7CgkJCWNmZy53ZWJmdWxsQ1NTID0gJy52anMtY29udHJvbC1iYXIgPiBidXR0b24udmpzLWJ1dHRvblt0aXRsZSQ9IuWFqOWxjyJdOm50aC1sYXN0LW9mLXR5cGUoMiknOwoJCX0KCQlyZXR1cm4gZTsKCX0sCglob3RLZXkoZSkgewoJCWNvbnN0IHQgPSBlLnRhcmdldDsKCQlpZiAoZS5jdHJsS2V5IHx8IGUubWV0YUtleSB8fCBlLmFsdEtleSB8fCB0LmNvbnRlbnRFZGl0YWJsZT09J3RydWUnIHx8IC8vIGUuaXNDb21wb3NpbmcKCQkJL0lOUFVUfFRFWFRBUkVBfFNFTEVDVC8udGVzdCh0Lm5vZGVOYW1lKSkgcmV0dXJuOwoJCWlmIChlLnNoaWZ0S2V5ICYmICFbMTMsMzcsMzldLmluY2x1ZGVzKGUua2V5Q29kZSkpIHJldHVybjsKCQlpZiAoZS5zaGlmdEtleSAmJiBlLmtleUNvZGUgPT0gMjcpIHJldHVybjsKCQlpZiAoY2ZnLmlzTGl2ZSAmJiBbMzcsMzksNzgsNzcsODgsNjcsOTBdLmluY2x1ZGVzKGUua2V5Q29kZSkpIHJldHVybjsKCQlpZiAoIXRoaXMuY2hlY2tNVigpKSByZXR1cm47CgkJaWYgKCFlLnNoaWZ0S2V5ICYmIGNmZy5tdlNoZWxsICYmIGNmZy5tdlNoZWxsLmNvbnRhaW5zKHQpICYmIFszMiwzNywzOV0uaW5jbHVkZXMoZS5rZXlDb2RlKSkgcmV0dXJuOwoJCWNvbnN0IGtleSA9IGUuc2hpZnRLZXkgPyBlLmtleUNvZGUgKyAxMDI0IDogZS5rZXlDb2RlOwoJCWlmIChhY3RMaXN0LmhhcyhrZXkpKSB7CgkJCWUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CgkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJYWN0TGlzdC5nZXQoa2V5KShlKTsKCQkJaWYgKFs2Nyw4OCw5MF0uaW5jbHVkZXMoZS5rZXlDb2RlKSkgdGlwKE1TRy5zcGVlZFJhdGUgKyB2LnBsYXliYWNrUmF0ZSk7CgkJfQoJfSwKCWNoZWNrVUkoKSB7CgkJaWYgKGNmZy53ZWJmdWxsQ1NTICYmICF2YWxpZEVsKGNmZy5idG5GUCkpIGNmZy5idG5GUCA9IHEoY2ZnLndlYmZ1bGxDU1MpOwoJCWlmIChjZmcuYnRuRlApIF9mcCA9IG51bGw7CgkJZWxzZSBpZiAoIV9mcCAmJiBzZWxmID09IHRvcCkgX2ZwID0gbmV3IEZ1bGxQYWdlKGNmZy5tdlNoZWxsKTsKCgkJaWYgKGNmZy5mdWxsQ1NTICYmICF2YWxpZEVsKGNmZy5idG5GUykpIGNmZy5idG5GUyA9IHEoY2ZnLmZ1bGxDU1MpOwoJCWlmIChjZmcuYnRuRlMpIF9mcyA9IG51bGw7CgkJZWxzZSBpZiAoIV9mcykgX2ZzID0gbmV3IEZ1bGxTY3JlZW4odik7CgoJCWlmIChjZmcubmV4dENTUyAmJiAoIXZhbGlkRWwoY2ZnLmJ0bk5leHQpIHx8ICFjZmcuYnRuTmV4dC5tYXRjaGVzKGNmZy5uZXh0Q1NTKSkpIGNmZy5idG5OZXh0ID0gcShjZmcubmV4dENTUyk7CgkJaWYgKGNmZy5wbGF5Q1NTICYmICF2YWxpZEVsKGNmZy5idG5QbGF5KSkgY2ZnLmJ0blBsYXkgPSBxKGNmZy5wbGF5Q1NTKTsKCX0sCglvbkdyb3dWTGlzdCgpIHsKCQlpZiAodGhpcy52TGlzdC5sZW5ndGggPT0gdGhpcy52Q291bnQpIHJldHVybjsKCQlpZiAodGhpcy52aWV3T2JzZXJ2ZXIpIHsKCQkJZm9yIChsZXQgZSBvZiB0aGlzLnZMaXN0KSB7CgkJCQlpZiAoIXRoaXMudlNldC5oYXMoZSkpIHRoaXMudmlld09ic2VydmVyLm9ic2VydmUoZSk7CgkJCX0KCQl9IGVsc2UgewoJCQljb25zdCBjb25maWcgPSB7CgkJCQlyb290TWFyZ2luOiAnMHB4JywKCQkJCXRocmVzaG9sZDogMC45CgkJCX07CgkJCXRoaXMudmlld09ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKHRoaXMub25JbnRlcnNlY3Rpb24uYmluZCh0aGlzKSwgY29uZmlnKTsKCQkJZm9yIChsZXQgZSBvZiB0aGlzLnZMaXN0KSB0aGlzLnZpZXdPYnNlcnZlci5vYnNlcnZlKGUpOwoJCX0KCQl0aGlzLnZTZXQgPSBuZXcgU2V0KHRoaXMudkxpc3QpOwoJCXRoaXMudkNvdW50ID0gdGhpcy52TGlzdC5sZW5ndGg7Cgl9LAoJb25JbnRlcnNlY3Rpb24oZW50cmllcykgewoJCWlmICh0aGlzLnZMaXN0Lmxlbmd0aCA8IDIpIHJldHVybjsKCQljb25zdCBlbnRyeSA9IGZpbmQuY2FsbChlbnRyaWVzLCBrID0+IGsuaXNJbnRlcnNlY3RpbmcpOwoJCWlmICghZW50cnkgfHwgdiA9PSBlbnRyeS50YXJnZXQpIHJldHVybjsKCQl2ID0gZW50cnkudGFyZ2V0OwoJCV9mcyA9IG5ldyBGdWxsU2NyZWVuKHYpOwoJCV9mcCA9IG5ldyBGdWxsUGFnZSh2KTsKCQlidXMuJG9uKCdzd2l0Y2hGUCcsIGFzeW5jICh0b0Z1bGwpID0+IHsKCQkJLy8gY29uc3QgYyA9IHRvRnVsbCA/IHRoaXMudlNldCA6IHRoaXMudkxpc3Q7CgkJCS8vIGZvciAoY29uc3QgZSBvZiBjKSB0aGlzLnZpZXdPYnNlcnZlci51bm9ic2VydmUoZSk7CgkJCXNsZWVwKDIwMCk7CgkJCWlmICghdG9GdWxsKSB2LnNjcm9sbEludG9WaWV3KCk7CgkJfSk7CgkJYnVzLiRlbWl0KCdzd2l0Y2hNVicpOwoJfSwKCWJpbmRFdmVudCgpIHsKCQljbGVhckludGVydmFsKHRoaXMudGltZXIpOwoJCWZvciAoY29uc3QgW2ksa10gb2YgdGhpcy5yYXdQcm9wcykgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MVmlkZW9FbGVtZW50LnByb3RvdHlwZSwgaSwgayk7CgkJdGhpcy5yYXdQcm9wcy5jbGVhcigpOwoJCXRoaXMucmF3UHJvcHMgPSBudWxsOwoJCSQoY2ZnLmFkc0NTUykucmVtb3ZlKCk7CgkJYnkgPSBkLmJvZHk7CgkJbG9nKCdiaW5kIGV2ZW50XG4nLCB2KTsKCQlidXMuJGVtaXQoJ2ZvdW5kTVYnKTsKCQljb25zdCBiUmF0ZSA9IGdtRnVuY09mQ2hlY2tNZW51KE1TRy5yZW1lbWJlclJhdGVNZW51T3B0aW9uLCdyZW1iZXJSYXRlJyk7CgkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3VybGNoYW5nZScsIGFzeW5jIChpbmZvKSA9PiB7IC8vVE0gZXZlbnQ6IGluZm8udXJsCgkJCWF3YWl0IHNsZWVwKDE5OTApOwoJCQl0aGlzLmNoZWNrTVYoKTsKCQkJaWYgKGJSYXRlKSB2LnBsYXliYWNrUmF0ZSA9ICtsb2NhbFN0b3JhZ2UubXZQbGF5UmF0ZSB8fCAxOwoJCQlidXMuJGVtaXQoJ3VybGNoYW5nZScpOwoJCX0pOwoJCWlmICh0b3AgIT0gc2VsZikgewoJCQl0b3AucG9zdE1lc3NhZ2Uoe2lkOiAnZ20taDUtaW5pdC1NVmZyYW1lJ30sICcqJyk7CgkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgZXYgPT4gewoJCQkJaWYgKCFldi5zb3VyY2UgfHwgIWV2LmRhdGEgfHwgIWV2LmRhdGEuaWQpIHJldHVybjsKCQkJCXN3aXRjaCAoZXYuZGF0YS5pZCkgewoJCQkJY2FzZSAnZ20taDUtdG9nZ2xlLWZ1bGxTY3JlZW4nOgoJCQkJCV9mcyA/IF9mcy50b2dnbGUoKSA6IGNsaWNrRHVhbEJ1dHRvbihjZmcuYnRuRlMpOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9LCBmYWxzZSk7CgkJfQoJCSQodikub25lKCdjYW5wbGF5dGhyb3VnaCcsIGV2ID0+IHsKCQkJaWYgKCFjZmcuaXNMaXZlKSB7CgkJCQlpZiAoYlJhdGUpIHYucGxheWJhY2tSYXRlID0gK2xvY2FsU3RvcmFnZS5tdlBsYXlSYXRlIHx8IDE7CgkJCQl2LmFkZEV2ZW50TGlzdGVuZXIoJ3JhdGVjaGFuZ2UnLCBldiA9PiB7CgkJCQkJaWYgKGJSYXRlICYmIHYucGxheWJhY2tSYXRlICYmIHYucGxheWJhY2tSYXRlICE9IDEpIGxvY2FsU3RvcmFnZS5tdlBsYXlSYXRlID0gdi5wbGF5YmFja1JhdGU7CgkJCQl9KTsKCQkJfQoJCQl0aGlzLmNoZWNrTVYoKTsKCQkJYnVzLiRlbWl0KCdjYW5wbGF5Jyk7CgkJfSk7CgkJJChieSkua2V5ZG93bih0aGlzLmhvdEtleS5iaW5kKHRoaXMpKTsKCgkJY2ZnLm12U2hlbGwgPyB0aGlzLnNoZWxsRXZlbnQoKSA6IHRoaXMuc2V0U2hlbGwoKTsKCQl0aGlzLmNoZWNrVUkoKTsKCQlpZiAoY2ZnLm11bHRpcGxlVikgewoJCQluZXcgTXV0YXRpb25PYnNlcnZlcih0aGlzLm9uR3Jvd1ZMaXN0LmJpbmQodGhpcykpLm9ic2VydmUoYnksIG9ic2VydmVPcHQpOwoJCQl0aGlzLnZDb3VudCA9IDA7CgkJCXRoaXMub25Hcm93Vkxpc3QoKTsKCQl9CgkJLy8gdGlwKChHTV9pbmZvLnNjcmlwdC5uYW1lX2kxOG4/LltjdXJMYW5nXSB8fCBHTV9pbmZvLnNjcmlwdC5uYW1lKSArIE1TRy5yZWFkeSk7Cgl9LAoJaW5pdCgpIHsKCQljb25zdCByYXdBZWwgPSBFdmVudFRhcmdldC5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lcjsKCQlFdmVudFRhcmdldC5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKC4uLmFyZ3MpIHsKCQkJY29uc3QgYmxvY2sgPSAoYXJnc1swXSA9PSAnZGJsY2xpY2snICYmICFhcmdzWzFdLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ2FjdExpc3QuZ2V0KDEwMzcpJykpCgkJCQl8fCAoYXJnc1swXSA9PSAncmF0ZWNoYW5nZScgJiYgJ2JhaWR1Jz09IHUgJiYgIWFyZ3NbMV0udG9TdHJpbmcoKS5pbmNsdWRlcygnbG9jYWxTdG9yYWdlLm12UGxheVJhdGUnKSk7CgkJCWlmICghYmxvY2spIHJldHVybiByYXdBZWwuYXBwbHkodGhpcywgYXJncyk7CgkJfTsKCQlmb3IgKGNvbnN0IGkgb2YgdGhpcy5yYXdQcm9wcy5rZXlzKCkpIHRoaXMucmF3UHJvcHMuc2V0KGksCgkJCVJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxNZWRpYUVsZW1lbnQucHJvdG90eXBlLCBpKSk7CgkJdGhpcy52TGlzdCA9IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3ZpZGVvJyk7CgkJY29uc3QgZm4gPSBlID0+IGNmZy5jc3NNViA/IGUubWF0Y2hlcyhjZmcuY3NzTVYpIDogZS5vZmZzZXRXaWR0aCA+IDk7CgkJdGhpcy5maW5kTVYgPSBmaW5kLmJpbmQodGhpcy52TGlzdCwgZm4pOwoJCXRoaXMudGltZXIgPSBwb2xsaW5nKGUgPT4gewoJCQl2ID0gZTsKCQkJdGhpcy5iaW5kRXZlbnQoKTsKCQl9LCB0aGlzLmZpbmRNVik7CgoJCWhvb2tBdHRhY2hTaGFkb3coYXN5bmMgc2hhZG93Um9vdCA9PiB7CgkJCWJ1cy4kZW1pdCgnYWRkU2hhZG93Um9vdCcsIHNoYWRvd1Jvb3QpOwoJCQlhd2FpdCBzbGVlcCg2MDApOwoJCQlpZiAodikgcmV0dXJuOwoJCQlpZiAodiA9IHEoJ3ZpZGVvJywgc2hhZG93Um9vdCkpIHsgLy8gdi5nZXRSb290Tm9kZSgpID09IHNoYWRvd1Jvb3QKCQkJCWxvZygnRm91bmQgTVYgaW4gU2hhZG93Um9vdFxuJywgdiwgc2hhZG93Um9vdCk7CgkJCQlpZiAoIWNmZy5zaGVsbENTUykgY2ZnLm12U2hlbGwgPSBzaGFkb3dSb290Lmhvc3Q7CgkJCQl0aGlzLmJpbmRFdmVudCgpOwoKCQkJCXRoaXMudkxpc3QgPSBzaGFkb3dSb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2aWRlbycpOwoJCQkJdGhpcy5maW5kTVYgPSBmaW5kLmJpbmQodGhpcy52TGlzdCwgZm4pOwoJCQl9CgkJfSk7Cgl9Cn07CgpsZXQgcm91dGVyID0gewoJdGVkKCkgewoJCWNmZy5mdWxsQ1NTID0gJ2J1dHRvblt0aXRsZT1GdWxsc2NyZWVuXSc7Cgl9LAoJeW91dHViZSgpIHsKCQlHTV9hZGRTdHlsZSgKCQkJYC5nbS1mcC1ib2R5ICNwbGF5ZXItY29udGFpbmVyLWlubmVye3BhZGRpbmctdG9wOjAhaW1wb3J0YW50fQoJCQkuZ20tZnAtYm9keSAjcGxheWVyLWNvbnRhaW5lci1vdXRlcnsKCQkJCW1heC13aWR0aDoxMDAlIWltcG9ydGFudDsKCQkJCW1hcmdpbjowIWltcG9ydGFudDsKCQkJfWAKCQkpOwoJCWNmZy5zaGVsbENTUyA9ICcjcGxheWVyJzsKCQljZmcucGxheUNTUyA9ICdidXR0b24ueXRwLXBsYXktYnV0dG9uJzsKCQljZmcubmV4dENTUyA9ICdhLnl0cC1uZXh0LWJ1dHRvbic7CgkJY2ZnLmZ1bGxDU1MgPSAnYnV0dG9uLnl0cC1mdWxsc2NyZWVuLWJ1dHRvbic7CgkJY2ZnLmlzQ2xpY2tPblZpZGVvID0gdHJ1ZTsKCQlhY3RMaXN0LmRlbGV0ZSgzMik7CgkJYWN0TGlzdC5zZXQoNjksIGFjdExpc3QuZ2V0KDcwKSkuZGVsZXRlKDcwKTsgLy9G6ZSuID4+IEXplK4KCX0sCglkb3V5aW4oKSB7CgkJY2ZnLmlzTGl2ZSA9IGhvc3Quc3RhcnRzV2l0aCgnbGl2ZS4nKTsKCQljZmcuZnVsbENTUyA9ICcueGdwbGF5ZXItZnVsbHNjcmVlbic7CgkJLy8gY2ZnLndlYmZ1bGxDU1MgPSBjZmcuaXNMaXZlID8gJy54Z3BsYXllci1mdWxsc2NyZWVuICsgeGctaWNvbicgOiAnLnhncGxheWVyLXBhZ2UtZnVsbC1zY3JlZW4nOwoJCWlmICghY2ZnLmlzTGl2ZSkgewoJCQlHTV9hZGRTdHlsZSgnLnhncGxheWVyLXByb2dyZXNzLWNhY2hle2JhY2tncm91bmQtY29sb3I6Z3JlZW4haW1wb3J0YW50fScpOwoJCQlhY3RMaXN0LnNldCg2NSwgYWN0TGlzdC5nZXQoOTApKS5kZWxldGUoOTApOyAvL1rplK4gPj4gQemUrgoJCQlhY3RMaXN0LnNldCg4MywgYWN0TGlzdC5nZXQoODgpKS5kZWxldGUoODgpOyAvL1jplK4gPj4gU+mUrgoJCQlhY3RMaXN0LnNldCg4NiwgYWN0TGlzdC5nZXQoNjcpKS5kZWxldGUoNjcpOyAvL0PplK4gPj4gVumUrgoJCX0KCX0sCglxcSgpIHsKCQlpZiAoc2VsZiAhPSB0b3AgJiYoaG9zdCA9PSAndi5xcS5jb20nIHx8IGhvc3QgPT0gJ3ZpZGVvLnFxLmNvbScpICkgdGhyb3cgTVNHLm1haW5QYWdlT25seTsKCQlhY3RMaXN0LmRlbGV0ZSgzMik7CgkJY2ZnLnNoZWxsQ1NTID0gJyNwbGF5ZXInOwoJCWNmZy5uZXh0Q1NTID0gJy50eHBfYnRuX25leHRfdSc7CgkJY2ZnLndlYmZ1bGxDU1MgPSAnLnR4cF9idG5fZmFrZSc7CgkJY2ZnLmZ1bGxDU1MgPSAnLnR4cF9idG5fZnVsbHNjcmVlbic7CgkJLy8gdy5fX1BMQVlFUl9fIHx8IHcuUExBWUVSCgkJYXBwLnJhd1Byb3BzLnNldCgncGxheWJhY2tSYXRlJywgMSk7Cgl9LAoJeW91a3UoKSB7CgkJYWN0TGlzdC5kZWxldGUoMzcpOwoJCWFjdExpc3QuZGVsZXRlKDM5KTsKCQlpZiAoaG9zdC5zdGFydHNXaXRoKCd2a3UuJykpIHsKCQkJYnVzLiRvbignY2FucGxheScsICgpID0+IHsKCQkJCWNmZy5pc0xpdmUgPSAhcSgnLnNwdl9wcm9ncmVzcycpOwoJCQl9KTsKCQkJY2ZnLmZ1bGxDU1MgPSAnLmxpdmVfaWNvbl9mdWxsJzsKCQl9IGVsc2UgewoJCQlidXMuJG9uKCdmb3VuZE1WJywoKSA9PiB7ICQoZG9jdW1lbnQpLnVuYmluZCgna2V5dXAnKSB9KTsKCQkJY2ZnLnNoZWxsQ1NTID0gJyN5a1BsYXllcic7CgkJCWNmZy53ZWJmdWxsQ1NTID0gJy5rdWktd2ViZnVsbHNjcmVlbi1pY29uLTAnOwoJCQljZmcuZnVsbENTUyA9ICcua3VpLWZ1bGxzY3JlZW4taWNvbi0wJzsKCQkJY2ZnLm5leHRDU1MgPSAnLmt1aS1uZXh0LWljb24tMCc7CgkJfQoJfSwKCWJpbGliaWxpKCkgewoJCWNmZy5pc0xpdmUgPSBob3N0LnN0YXJ0c1dpdGgoJ2xpdmUuJyk7CgkJaWYgKGNmZy5pc0xpdmUpIHJldHVybjsKCQlhY3RMaXN0LmRlbGV0ZSgzMik7CgoJCWJ1cy4kb24oJ2FkZFNoYWRvd1Jvb3QnLCByID0+IHsKCQkJaWYgKHIuaG9zdC5ub2RlTmFtZSA9PT0gJ0JXUC1WSURFTycpIHsKCQkJCWFwcC52TGlzdCA9IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J3cC12aWRlbycpOwoJCQkJYXBwLmZpbmRNViA9IGZpbmQuYmluZChhcHAudkxpc3QsIGUgPT4gZS5vZmZzZXRXaWR0aCA+IDkpOwoJCQkJdiA9IHIuaG9zdDsKCQkJCWFwcC5iaW5kRXZlbnQoKTsKCQkJfQoJCX0pOwoJCWNmZy5zaGVsbENTUyA9ICdkaXZbYXJpYS1sYWJlbD0i5ZOU5ZOp5ZOU5ZOp5pKt5pS+5ZmoIl0nOwoJCWNmZy5uZXh0Q1NTID0gJy5icHgtcGxheWVyLWN0cmwtbmV4dCc7CgkJY2ZnLndlYmZ1bGxDU1MgPSAnLmJweC1wbGF5ZXItY3RybC13ZWInOwoJCWNmZy5mdWxsQ1NTID0gJy5icHgtcGxheWVyLWN0cmwtZnVsbCc7CgkJLyoKCQljb25zdCBzZWVrID0gZnVuY3Rpb24oc3RlcCkgewoJCQljb25zdCBwID0gdGhpcy5wbGF5ZXI7CgkJCXAuc2VlayhwLmdldEN1cnJlbnRUaW1lKCkrIHN0ZXAsIHAuZ2V0U3RhdGUoKSA9PT0gIlBBVVNFRCIpOwoJCX07CgkJYWN0TGlzdC5zZXQoMzgsIF8gPT4gdy5wbGF5ZXIudm9sdW1lKHcucGxheWVyLnZvbHVtZSgpKzAuMSkpIC8v5Yqg6Z+z6YePCgkJLnNldCg0MCwgXyA9PiB3LnBsYXllci52b2x1bWUody5wbGF5ZXIudm9sdW1lKCktMC4xKSkKCQkuc2V0KDM3LCBzZWVrLmJpbmQodywgLTUpKQoJCS5zZXQoMzcrMTAyNCwgc2Vlay5iaW5kKHcsIC0yMCkpIC8vc2hpZnQrbGVmdCAg5b+r6YCAMjDnp5IKCQkuc2V0KDM5LCBzZWVrLmJpbmQodywgNSkpCgkJLnNldCgzOSsxMDI0LCBzZWVrLmJpbmQodywgMjApKSAvL3NoaWZ0K+KGkiAg5b+r6L+bMjDnp5IKCQkuc2V0KDcwLCBzZWVrLmJpbmQodywgMC4wMykpIC8v5oyJ6ZSuRu+8muS4i+S4gOW4pwoJCS5zZXQoNjgsIHNlZWsuYmluZCh3LCAtMC4wMykpOyAvL+aMiemUrkTvvJrkuIrkuIDluKcKCQkqLwoJfSwKCWlxaXlpKCkgewoJCWNmZy5mdWxsQ1NTID0gJy5pcXAtYnRuLWZ1bGxzY3JlZW46bm90KC5mYWtlX19jbGljayknOwoJCWNmZy5uZXh0Q1NTID0gJy5pcXAtYnRuLW5leHQnOwoJfSwKCXBwdHYoKSB7CgkJY2ZnLmZ1bGxDU1MgPSAnLnctem9vbS1jb250YWluZXIgPiBkaXYnOwoJCWNmZy53ZWJmdWxsQ1NTID0gJy53LWV4cGFuZC1jb250YWluZXIgPiBkaXYnOwoJCWNmZy5uZXh0Q1NTID0gJy53LW5leHQnOwoJfSwKCW1ndHYoKSB7CgkJY2ZnLmZ1bGxDU1MgPSAnbWFuZ28tc2NyZWVuJzsKCQljZmcud2ViZnVsbENTUyA9ICdtYW5nby13ZWJzY3JlZW4gPiBhJzsKCQljZmcubmV4dENTUyA9ICdtYW5nby1jb250cm9sLXBsYXluZXh0LWJ0bic7Cgl9LAoJaXhpZ3VhKCkgewoJCWNmZy5mdWxsQ1NTID0gJ2RpdlthcmlhLWxhYmVsPSLlhajlsY8iXSc7CgkJY2ZnLm5leHRDU1MgPSAnLnhncGxheWVyLWNvbnRyb2wtaXRlbS5jb250cm9sX3BsYXluZXh0JzsKCQlHTV9hZGRTdHlsZSgnLmdtLWZwLWJvZHkgLnhncGxheWVye3BhZGRpbmctdG9wOjAhaW1wb3J0YW50fSAuZ20tZnAtd3JhcHBlciAjcGxheWVyX2RlZmF1bHR7bWF4LWhlaWdodDogMTAwJSFpbXBvcnRhbnR9IGgxLnRpdGxlfmEsIC52aWRlb1RpdGxlIGgxfmF7IHBhZGRpbmctbGVmdDoxMnB4OyBjb2xvcjpibHVlOyB9Jyk7CgoJCWJ1cy4kb24oJ2ZvdW5kTVYnLCgpID0+IHsKCQkJY29uc3QgZGF0YSA9IHcuX1NTUl9IWURSQVRFRF9EQVRBLmFueVZpZGVvLmdpZEluZm9ybWF0aW9uLnBhY2tlckRhdGE7CgkJCWNvbnN0IGMgPSAoZGF0YS52aWRlbyB8fCBkYXRhKS52aWRlb1Jlc291cmNlLm5vcm1hbC52aWRlb19saXN0OwoJCQljb25zdCB0aXRsZSA9IGRvY3VtZW50LnRpdGxlLnNwbGl0KCcgLSAnKVswXTsKCQkJY29uc3QgcyA9IE9iamVjdC5rZXlzKGMpLm1hcChrID0+CgkJCQlgPGEgaHJlZj0iJHtjW2tdLm1haW5fdXJsfSIgZG93bmxvYWQ9IiR7dGl0bGV9XyR7Y1trXS5kZWZpbml0aW9ufS5tcDQiIHRhcmdldD0iX2JsYW5rIj4ke2Nba10uZGVmaW5pdGlvbn08L2E+YAoJCQkpLmpvaW4oJ+OAgOOAgOOAgCcpOwoJCQkkKCcudmlkZW9UaXRsZSBoMSwgaDEudGl0bGUnKS50ZXh0KE1TRy5kb3dubG9hZCkuYWZ0ZXIocyk7CgkJfSk7Cgl9LAoJbWlndXZpZGVvKCkgewoJCWNmZy5uZXh0Q1NTID0gJy5uZXh0LWJ0bic7CgkJY2ZnLmZ1bGxDU1MgPSAnLnpvb20tYnRuJzsKCQljZmcuc2hlbGxDU1MgPSAnLm1vZC1wbGF5ZXInOwoJfSwKCWJhaWR1KCkgewoJCWFwcC5yYXdQcm9wcy5zZXQoJ3BsYXliYWNrUmF0ZScsIDEpOwoJfSwKCXdlaWJvKCkgewoJCWNmZy5tdWx0aXBsZVYgPSBwYXRoLnN0YXJ0c1dpdGgoJy91LycpOwoJfSwKCWFjZnVuKCkgewoJCWNmZy5uZXh0Q1NTID0gJy5idG4tbmV4dC1wYXJ0IC5jb250cm9sLWJ0bic7CgkJY2ZnLndlYmZ1bGxDU1MgPSAnLmZ1bGxzY3JlZW4td2ViJzsKCQljZmcuZnVsbENTUyA9ICcuZnVsbHNjcmVlbi1zY3JlZW4nOwoJfSwKCVsnMTYzJ10oKSB7CgkJY2ZnLm11bHRpcGxlViA9IGhvc3Quc3RhcnRzV2l0aCgnbmV3cy4nKTsKCQlHTV9hZGRTdHlsZSgnZGl2LnZpZGVvLHZpZGVve21heC1oZWlnaHQ6IDEwMCUgIWltcG9ydGFudDt9Jyk7CgkJcmV0dXJuIGhvc3Quc3BsaXQoJy4nKS5sZW5ndGggPiAzOwoJfSwKCXNvaHUoKSB7CgkJY2ZnLm5leHRDU1MgPSAnbGkub25bZGF0YS12aWRdK2xpIGEnOwoJCWNmZy5mdWxsQ1NTID0gJy54LWZ1bGxzY3JlZW4tYnRuJzsKCQljZmcud2ViZnVsbENTUyA9ICcueC1wYWdlZnMtYnRuJzsKCX0sCglmdW4oKSB7CgkJY2ZnLm5leHRDU1MgPSAnLmJ0bi1pdGVtLmJ0bi1uZXh0JzsKCX0sCglsZSgpIHsKCQlHTV9hZGRTdHlsZSgnLmdtLWZwLWJvZHkgLmxlX2hlYWR7ZGlzcGxheTpub25lIWltcG9ydGFudH0nKTsKCQljZmcuY3NzTVYgPSAnI3ZpZGVvIHZpZGVvJzsKCQljZmcuc2hlbGxDU1MgPSAnI3ZpZGVvJzsKCQljZmcubmV4dENTUyA9ICcuaHZfaWNvX25leHQnOwoJCWNvbnN0IGRlbEhpZGRlblByb3AgPSBfID0+IHsKCQkJaWYgKCF2Lm9mZnNldFdpZHRoKSBPYmplY3QudmFsdWVzKHYuYXR0cmlidXRlcykucmV2ZXJzZSgpLnNvbWUoayA9PiB7CgkJCQlpZiAodi5nZXRBdHRyaWJ1dGUoay5uYW1lKSA9PSAnJykgewoJCQkJCXYucmVtb3ZlQXR0cmlidXRlKGsubmFtZSk7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0pOwoJCX07CgkJYnVzLiRvbigndXJsY2hhbmdlJyxkZWxIaWRkZW5Qcm9wKTsKCQlidXMuJG9uY2UoJ2NhbnBsYXknLGRlbEhpZGRlblByb3ApOwoJfSwKCWFnZWRtKCkgewoJCWFjdExpc3Quc2V0KDc4LCBfID0+IHsgbG9jYXRpb24uaHJlZiA9IGxvY2F0aW9uLmhyZWYucmVwbGFjZSgvXGQrJC8sIHMgPT4gKytzKSB9KTsKCX0sCglubnl5KCkgewoJCUdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoTVNHLnZpZGVvTGFnLCAoKSA9PiB7CgkJCSd1c2Ugc3RyaWN0JzsKCQkJdi5wYXVzZSgpOwoJCQljb25zdCBwb3MgPSB2LmN1cnJlbnRUaW1lOwoJCQljb25zdCBidWYgPSB2LmJ1ZmZlcmVkOwoJCQl2LmN1cnJlbnRUaW1lID0gYnVmLmVuZChidWYubGVuZ3RoIC0gMSkgKyAxOwoJCQkkKHYpLm9uZSgncHJvZ3Jlc3MnLCBldiA9PiB7CgkJCQl2LmN1cnJlbnRUaW1lID0gcG9zOwoJCQkJdi5wbGF5KCk7CgkJCX0pOwoJCX0pOwoJCWNmZy5uZXh0Q1NTID0gJy5wbGF5bGlzdCAub24gKyBsaSBhJzsKCX0sCglkb3ViYW4oKSB7CgkJY2ZnLm5leHRDU1MgPSAnYS5uZXh0LXNlcmllcyc7Cgl9LAoJaGFubWlkeSgpIHsKCQljZmcubmV4dENTUyA9IGBhW2hyZWY9IiR7cGF0aH0iXSthYDsKCX0KfTsKCmlmICghcm91dGVyW3VdKSB7IC8v55u05pKt56uZ54K5Cglyb3V0ZXIgPSB7CgkJZG91eXUoKSB7CgkJCWNmZy5hZHNDU1MgPSAnYVtocmVmKj0id2FuLmRvdXl1LmNvbSJdJzsKCQkJY2ZnLmlzTGl2ZSA9ICFob3N0LnN0YXJ0c1dpdGgoJ3YuJyk7CgkJCWlmIChjZmcuaXNMaXZlKSB7CgkJCQljZmcuY3NzTVYgPSAnLmxheW91dC1QbGF5ZXIgdmlkZW8nOwoJCQkJY2ZnLnNoZWxsQ1NTID0gJyNqcy1wbGF5ZXItdmlkZW8nOwoJCQkJY2ZnLndlYmZ1bGxDU1MgPSAnLndmcy0yYThlODMnOwoJCQkJY2ZnLmZ1bGxDU1MgPSAnLmZzLTc4MTE1Myc7CgkJCQljZmcucGxheUNTUyA9ICdkaXZbY2xhc3N8PXBsYXldJzsKCQkJCXBhdGggIT0gJy8nICYmICQoZXYgPT4gewoJCQkJCXEoJy51LXNwZWNpYWxTdGF0ZUlucHV0JykuY2hlY2tlZCA9IHRydWU7CgkJCQl9KTsKCQkJfSBlbHNlIGJ1cy4kb24oJ2FkZFNoYWRvd1Jvb3QnLCBhc3luYyBmdW5jdGlvbihyKSB7CgkJCQlpZiAoci5ob3N0Lm1hdGNoZXMoJyNkZW1hbmRjb250cm9sbGVyLWJhcicpKSB7CgkJCQkJYXdhaXQgc2xlZXAoNjAwKTsKCQkJCQljZmcuc2hlbGxDU1MgPSAnZGl2W2Z1bGxzY3JlZW5dLnZpZGVvJzsKCQkJCQljZmcuYnRuRlAgPSBxKCcuQ29udHJvbGxlckJhci1QYWdlRnVsbCcsIHIpOwoJCQkJCWNmZy5idG5GUyA9IHEoJy5Db250cm9sbGVyQmFyLVdpbmRvd0Z1bGwnLCByKTsKCQkJCX0KCQkJfSk7CgkJfSwKCQl5eSgpIHsKCQkJY2ZnLmlzTGl2ZSA9ICFwYXRoLnN0YXJ0c1dpdGgoJy94LycpOwoJCQlpZiAoY2ZnLmlzTGl2ZSkgewoJCQkJY2ZnLmZ1bGxDU1MgPSAnLnljX19mdWxsc2NyZWVuLWJ0bic7CgkJCQljZmcud2ViZnVsbENTUyA9ICcueWNfX2NpbmVtYS1tb2RlLWJ0bic7CgkJCQljZmcucGxheUNTUyA9ICcueWNfX3BsYXktYnRuJzsKCQkJfQoJCX0sCgkJaHV5YSgpIHsKCQkJaWYgKGZpcmVmb3hWZXIgJiYgZmlyZWZveFZlciA8IDU3KSByZXR1cm4gdHJ1ZTsKCQkJY2ZnLmRpc2FibGVEQkxDbGljayA9ICEwOwoJCQljZmcud2ViZnVsbENTUyA9ICcucGxheWVyLWZ1bGxwYWdlLWJ0bic7CgkJCWNmZy5mdWxsQ1NTID0gJy5wbGF5ZXItZnVsbHNjcmVlbi1idG4nOwoJCQljZmcucGxheUNTUyA9ICcjcGxheWVyLWJ0bic7CgkJCWNmZy5hZHNDU1MgPSAnI3BsYXllci1zdWJzY3JpYmUtd2FwLCN3cmFwLWluY29tZSc7CgkJCXBvbGxpbmcoZG9DbGljaywgJy5sb2dpbi10aXBzLWNsb3NlJyk7CgkJCWxvY2FsU3RvcmFnZVsnc2lkZWJhci9hZHMnXSA9ICd7fSc7CgkJCWxvY2FsU3RvcmFnZVsnc2lkZWJhci9zdGF0ZSddID0gMDsKCQkJLy8gbG9jYWxTdG9yYWdlLlRUX1JPT01fU0hJRUxEX0NGR18wXyA9ICd7IjEwMDAwIjoxLCIyMDAwMSI6MSwiMjAwMDIiOjEsIjIwMDAzIjoxLCIzMDAwMCI6MX0nOwoJCX0sCgkJdHdpdGNoKCkgewoJCQljZmcuaXNMaXZlID0gIXBhdGguc3RhcnRzV2l0aCgnL3ZpZGVvcy8nKTsKCQkJY2ZnLmZ1bGxDU1MgPSAnYnV0dG9uW2RhdGEtYS10YXJnZXQ9cGxheWVyLWZ1bGxzY3JlZW4tYnV0dG9uXSc7CgkJCWNmZy53ZWJmdWxsQ1NTID0gJ2J1dHRvbltkYXRhLWEtdGFyZ2V0PXBsYXllci10aGVhdHJlLW1vZGUtYnV0dG9uXSc7CgkJCWNmZy5wbGF5Q1NTID0gJ2J1dHRvbltkYXRhLWEtdGFyZ2V0PXBsYXllci1wbGF5LXBhdXNlLWJ1dHRvbl0nOwoJCX0sCgkJbG9uZ3podSgpIHsKCQkJY2ZnLmZ1bGxDU1MgPSAnYS55YS1zY3JlZW4tYnRuJzsKCQl9LAoJCXpoYW5xaSgpIHsKCQkJbG9jYWxTdG9yYWdlLmxhc3RQbGF5ZXIgPSAnaDUnOwoJCQljZmcuZnVsbENTUyA9ICcudmlkZW8tZnVsbHNjcmVlbic7CgkJfQoJfTsKCWlmIChyb3V0ZXJbdV0pIHsKCQljZmcuaXNMaXZlID0gY2ZnLmlzTGl2ZSB8fCAhaG9zdC5zdGFydHNXaXRoKCd2LicpOwoJCSghdy5jaHJvbWUgfHwgaXNFZGdlKSAmJiBmYWtlVUEodWFfY2hyb21lKTsKCX0KfQoKY2ZnLmlzTGl2ZSA9IGNmZy5pc0xpdmUgfHwgaG9zdC5zdGFydHNXaXRoKCdsaXZlLicpOwpSZWZsZWN0LmRlZmluZVByb3BlcnR5KG5hdmlnYXRvciwgJ3BsdWdpbnMnLCB7CglnZXQoKSB7IHJldHVybiB7IGxlbmd0aDogMCB9IH0KfSk7CkdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoTVNHLmhlbHBNZW51T3B0aW9uLCBhbGVydC5iaW5kKHcsIE1TRy5oZWxwQm9keSkpOwppZiAoIXJvdXRlclt1XSB8fCAhcm91dGVyW3VdKCkpIGFwcC5pbml0KCk7CmlmICghcm91dGVyW3VdICYmICFjZmcuaXNOdW1VUkwpIGNmZy5pc051bVVSTCA9IC9bX1xXXVxkKyhcL3xcLlthLXpdezMsOH0pPyQvLnRlc3QocGF0aCk7
Add Comment
Please, Sign In to add comment