2.7 sec in total
137 ms
1.9 sec
721 ms
Click here to check amazing Star Wind Software content for United States. Otherwise, check out these important facts you probably never knew about starwindsoftware.com
StarWind delivers Software-Defined Storage solutions, HyperConverged and Storage Appliances designed to build highly resilient IT infrastructures.
Visit starwindsoftware.comWe analyzed Starwindsoftware.com page load time and found that the first response time was 137 ms and then it took 2.6 sec to load all DOM resources and completely render a web page. This is quite a good result, as only 45% of websites can load faster.
starwindsoftware.com performance score
name
value
score
weighting
Value3.4 s
36/100
10%
Value5.7 s
16/100
25%
Value6.9 s
34/100
10%
Value1,790 ms
10/100
30%
Value0.138
79/100
15%
Value12.0 s
16/100
10%
137 ms
149 ms
640 ms
90 ms
172 ms
Our browser made a total of 57 requests to load all elements on the main page. We found that 67% of them (38 requests) were addressed to the original Starwindsoftware.com, 9% (5 requests) were made to and 7% (4 requests) were made to Cdnjs.cloudflare.com. The less responsive or slowest element that took the longest time to load (935 ms) relates to the external source Polyfill.io.
Page size can be reduced by 370.9 kB (26%)
1.4 MB
1.0 MB
In fact, the total size of Starwindsoftware.com main page is 1.4 MB. This result falls beyond the top 1M of websites and identifies a large and not optimized web page that may take ages to load. 45% of websites need less resources to load. Images take 837.7 kB which makes up the majority of the site volume.
Potential reduce by 322.1 kB
HTML content can be minified and compressed by a website’s server. The most efficient way is to compress content using GZIP which reduces data amount travelling through the network between server and browser. This page needs HTML code to be minified as it can gain 55.2 kB, which is 14% of the original size. It is highly recommended that content of this web page should be compressed using GZIP, as it can save up to 322.1 kB or 84% of the original size.
Potential reduce by 41.8 kB
Image size optimization can help to speed up a website loading time. The chart above shows the difference between the size before and after optimization. Star Wind Software images are well optimized though.
Potential reduce by 2.4 kB
It’s better to minify JavaScript in order to improve website performance. The diagram shows the current total size of all JavaScript files against the prospective JavaScript size after its minification and compression. This website has mostly compressed JavaScripts.
Potential reduce by 4.6 kB
CSS files minification is very important to reduce a web page rendering time. The faster CSS files can load, the earlier a page can be rendered. Starwindsoftware.com needs all CSS files to be minified and compressed as it can save up to 4.6 kB or 16% of the original size.
Number of requests can be reduced by 20 (44%)
45
25
The browser has sent 45 CSS, Javascripts, AJAX and image requests in order to completely render the main page of Star Wind Software. We recommend that multiple CSS and JavaScript files should be merged into one by each type, as it can help reduce assets requests from 18 to 1 for JavaScripts and from 4 to 1 for CSS and as a result speed up the page load time.
starwindsoftware.com
137 ms
www.starwindsoftware.com
149 ms
www.starwindsoftware.com
640 ms
gtm.js
90 ms
menu.css
172 ms
libs.min.css
176 ms
main.css
180 ms
intlTelInput.min.css
452 ms
logo_blue.svg
184 ms
logo-blue.svg
216 ms
choices.min.js
173 ms
main-server-x2.png
181 ms
logo-gartner.svg
588 ms
logo-g2.svg
348 ms
logo-spiceworks.svg
314 ms
logo-peerspot.svg
316 ms
logo-storage-review.svg
628 ms
logo-thq.svg
500 ms
logo-siemens2.svg
498 ms
logo-sears3.svg
502 ms
logo-auchan2.svg
631 ms
logo-rank-group3.png
498 ms
logo-bosch3.png
499 ms
logo-cygnus.webp
627 ms
logo-kellstrom.webp
632 ms
logo-oxford3.png
507 ms
logo-eccos3.png
524 ms
logo-midway.webp
665 ms
logo-visma5.svg
725 ms
logo-cantey4.png
639 ms
libs.min.js
764 ms
main.js
759 ms
menu.js
793 ms
socialintents.1.3.js
305 ms
javascript;base64,Ly8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjcKKGZ1bmN0aW9uKCkgewogIHdpbmRvdy5ldXJvcGVfem9uZV9jb3VudHJ5ID0gWydHZXJtYW55JywgJ1VuaXRlZCBLaW5nZG9tJywgJ0ZyYW5jZScsICdJdGFseScsICdTcGFpbicsICdVa3JhaW5lJywgJ1BvbGFuZCcsICdSb21hbmlhJywgJ05ldGhlcmxhbmRzJywgJ0JlbGdpdW0nLCAnQ3plY2ggUmVwdWJsaWMnLCAnR3JlZWNlJywgJ1BvcnR1Z2FsJywgJ1N3ZWRlbicsICdIdW5nYXJ5JywgJ0JlbGFydXMnLCAnQXVzdHJpYScsICdTZXJiaWEnLCAnU3dpdHplcmxhbmQnLCAnQnVsZ2FyaWEnLCAnRGVubWFyaycsICdGaW5sYW5kJywgJ1Nsb3Zha2lhJywgJ05vcndheScsICdJcmVsYW5kJywgJ0Nyb2F0aWEnLCAnTW9sZG92YScsICdCb3NuaWEgYW5kIEhlcnplZ292aW5hJywgJ0FsYmFuaWEnLCAnTGl0aHVhbmlhJywgJ05vcnRoIE1hY2Vkb25pYScsICdTbG92ZW5pYScsICdMYXR2aWEnLCAnRXN0b25pYScsICdNb250ZW5lZ3JvJywgJ0x1eGVtYm91cmcnLCAnTWFsdGEnLCAnSWNlbGFuZCcsICdBbmRvcnJhJywgJ01vbmFjbycsICdMaWVjaHRlbnN0ZWluJywgJ1NhbiBNYXJpbm8nLCAnSG9seSBTZWUnLCAnQ2hhbm5lbCBJc2xhbmRzJywgJ0lzbGUgb2YgTWFuJywgJ0ZhZXJvZSBJc2xhbmRzJywgJ0dpYnJhbHRhciddOwoKfSkuY2FsbCh0aGlzKTsKCi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV1cm9wZV96b25lLmpzLm1hcAo=
6 ms
IGV2ZW50LmRldGFpbC5mb3JtVHlwZSAgOiAnJwoKICAgICAgICAgICAgICAgICAgICBjb25zdCBoaXN0b3J5T2JqID0gewogICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4rd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogdGltZVJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG1lLnNhdmVIaXN0b3J5KGhpc3RvcnlPYmopCgogICAgICAgICAgICAgICAgICAgIGxldCBMZWFkSWQgPSAnJwogICAgICAgICAgICAgICAgICAgIExlYWRJZCA9IG1lLmdldENvb2tpZSgnTGVhZElkJykKICAgICAgICAgICAgICAgICAgICBpZihMZWFkSWQgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICBMZWFkSWQgPSAnJwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlzdG9yeSA9IG1lLnJlYWRIaXN0b3J5KCkKICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbmRIaXN0b3J5MihMZWFkSWQsIGhpc3RvcnkpCgogICAgICAgICAgICAgICAgICAgIGdsb2JhbEZvcm1BY3Rpb25TdGF0dXMgPSBmYWxzZQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pCiAgICB9CgogICAgcmVzZXRIaXN0b3J5KCkgewogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMua2V5SGlzdG9yeSwgSlNPTi5zdHJpbmdpZnkoW10pKQogICAgfQoKICAgIHNhdmVIaXN0b3J5KGRhdGEpIHsKCiAgICAgICAgbGV0IGhpc3RvcnkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmtleUhpc3RvcnkpCgogICAgICAgIGlmKGhpc3RvcnkgPT09IG51bGwpIHsKICAgICAgICAgICAgaGlzdG9yeSA9IFtdCiAgICAgICAgfSBlbHNlewogICAgICAgICAgICBoaXN0b3J5ID0gSlNPTi5wYXJzZShoaXN0b3J5KQogICAgICAgICAgICBoaXN0b3J5LnB1c2goZGF0YSkKICAgICAgICB9CgogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMua2V5SGlzdG9yeSwgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeSkpCiAgICB9CgoKICAgIHJlYWRIaXN0b3J5KCkgewoKICAgICAgICBjb25zdCBoaXN0b3J5ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5rZXlIaXN0b3J5KQoKICAgICAgICBpZihoaXN0b3J5ID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoaGlzdG9yeSkKCiAgICB9CgogICAgZ2V0VG9rZW4oKSB7CgogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewoKICAgICAgICAgICAgY29uc3QgcmVhZFRva2VuID0gdGhpcy5nZXRDb29raWUodGhpcy50b2tlbk5hbWUpCgogICAgICAgICAgICAvLyBpZihyZWFkVG9rZW4gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAvLyAgICAgcmVzb2x2ZShyZWFkVG9rZW4pCiAgICAgICAgICAgIC8vICAgICByZXR1cm4KICAgICAgICAgICAgLy8gfQoKICAgICAgICAgICAgLy9pZiB0b2tlbiB1bmRlZmluZWQgdGFrZSBpdCBmcm9tIHNlcnZlcgogICAgICAgICAgICB0aGlzLmZldGNoVG9rZW4odGhpcy51cmwpLnRoZW4oIChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgICBpZihkYXRhLnN0YXR1cykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q29va2llKHRoaXMudG9rZW5OYW1lLCBkYXRhLnRva2VuLCAzMCoxMikKICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEudG9rZW4pCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCgogICAgICAgIH0pCgogICAgfQoKICAgIGdldENvb2tpZShuYW1lKSB7CiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGAoXnwgKSR7bmFtZX09KFteO10rKWApCiAgICAgICAgY29uc3QgbWF0Y2ggPSBkb2N1bWVudC5jb29raWUubWF0Y2gocmVnZXgpCiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHJldHVybiBtYXRjaFsyXQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZAogICAgfQoKICAgIHNldENvb2tpZShjbmFtZSwgY3ZhbHVlLCBleGRheXMpIHsKICAgICAgICBjb25zdCBkID0gbmV3IERhdGUoKTsKICAgICAgICBkLnNldFRpbWUoZC5nZXRUaW1lKCkgKyAoZXhkYXlzKjI0KjYwKjYwKjEwMDApKTsKICAgICAgICBjb25zdCBleHBpcmVzID0gImV4cGlyZXM9IisgZC50b1VUQ1N0cmluZygpOwogICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNuYW1lICsgIj0iICsgY3ZhbHVlICsgIjsiICsgZXhwaXJlcyArICI7cGF0aD0vIjsKICAgIH0KCiAgICBkZWxldGVDb29raWUoY25hbWUpIHsKICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgJHtjbmFtZX09OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDOyBwYXRoPS87IGRvbWFpbj0uc3RhcndpbmRzb2Z0d2FyZS5jb21gOwogICAgfQoKICAgIGZldGNoVG9rZW4odXJsKSB7CgogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgICAgICAgICBmZXRjaCh1cmwsIHsgbWV0aG9kOiAnR0VUJywgfSkuCiAgICAgICAgICAgIHRoZW4oKGRhdGEpID0+IGRhdGEuanNvbigpKS50aGVuKCAoZGF0YSkgPT4geyByZXNvbHZlKGRhdGEpIH0pCiAgICAgICAgfSkKCiAgICB9CgogICAgc2V0VW5sb2FkRXZlbnQoKSB7CgogICAgICAgIC8vZXZlbnQgZm9yIHNhdmluZyBoaXN0b3J5IHRvIGxvY2FsU3RvcmFnZQogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCAoZXZlbnQpID0+IHsKCiAgICAgICAgICAgIGNvbnN0IHRpbWUyID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCApCgogICAgICAgICAgICBjb25zdCB0aW1lUmVzdWx0ID0gdGltZTIgLSB0aGlzLnRpbWUxCgogICAgICAgICAgICBjb25zdCBoaXN0b3J5T2JqID0gdGhpcy5nZXRIaXN0b3J5T2JqKHRpbWVSZXN1bHQpCgogICAgICAgICAgICB0aGlzLnNhdmVIaXN0b3J5KGhpc3RvcnlPYmopCgogICAgICAgICAgICAvL2lmIHVzZXIgaW1tZWRpYXRlbHkgZXhpdCBmcm9tIHBhZ2UsIHdlIG5lZWQgdG8gc2F2ZSBhY3Rpb24KICAgICAgICAgICAgaWYgKCFnbG9iYWxGb3JtQWN0aW9uU3RhdHVzKSB7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnZ2xvYmFsRm9ybUFjdGlvblN0b3JhZ2UnLCBnbG9iYWxGb3JtQWN0aW9uU3RvcmFnZSkKICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbCA9IGNodW5rSGlzdG9yeUFjdGlvbiguLi5nbG9iYWxGb3JtQWN0aW9uU3RvcmFnZSkKICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCJMZWFkSGlzdG9yeSIsIHsgZGV0YWlsOiBkZXRhaWwgfSk7CiAgICAgICAgICAgICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChldmVudCkKICAgICAgICAgICAgICAgIGdsb2JhbEZvcm1BY3Rpb25TdGF0dXMgPSB0cnVlCiAgICAgICAgICAgIH0KCgogICAgICAgIH0pCgogICAgfQoKICAgIHRyYW5zZm9ybVRvQXNzb2NBcnJheSggcHJtc3RyICkgewogICAgICAgIGNvbnN0IHBhcmFtcyA9IHt9OwogICAgICAgIGNvbnN0IHBybWFyciA9IHBybXN0ci5zcGxpdCgiJiIpOwogICAgICAgIGZvciAoIGxldCBpID0gMDsgaSA8IHBybWFyci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBjb25zdCB0bXBhcnIgPSBwcm1hcnJbaV0uc3BsaXQoIj0iKTsKICAgICAgICAgICAgcGFyYW1zW3RtcGFyclswXV0gPSB0bXBhcnJbMV07CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJhbXM7CiAgICB9CgoKICAgIHNlbmRIaXN0b3J5MihMZWFkSWQsIGRhdGEpIHsKCiAgICAgICAgaWYgKExlYWRJZCA9PT0gJycpIHJldHVybgoKICAgICAgICBpZiAoIEFycmF5LmlzQXJyYXkoZGF0YSkgJiYgIWRhdGEubGVuZ3RoICkgcmV0dXJuCgogICAgICAgIGNvbnN0IHJhd0RhdGEgPSBkYXRhCiAgICAgICAgY29uc3Qgc2VuZERhdGEgPSBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgIGRhdGE6IGRhdGEsCiAgICAgICAgICAgIGxlYWRJZDogTGVhZElkCiAgICAgICAgfSkKCiAgICAgICAgY29uc3QgbWUgPSB0aGlzCgogICAgICAgIGZldGNoKHRoaXMudXJsMiwgewogICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJywKICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgICAgICAgICAnWC1YU1JGLVRPS0VOJzogZGVjb2RlVVJJQ29tcG9uZW50KHRoaXMuZ2V0Q29va2llKCdYU1JGLVRPS0VOJykpLAogICAgICAgICAgICB9LAogICAgICAgICAgICBib2R5OiBzZW5kRGF0YSwKICAgICAgICB9KS50aGVuKChkYXRhKSA9PiBkYXRhLmpzb24oKSkudGhlbihkYXRhID0+IHsKCiAgICAgICAgICAgIGNvbnN0IGxhc3RBY3QgPSByYXdEYXRhW3Jhd0RhdGEubGVuZ3RoIC0gMV0KICAgICAgICAgICAgaWYgKGxhc3RBY3QuYWN0aW9uICE9PSAndmlzaXQnKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUNvb2tpZSgndXRtX2NhbXBhaWduJykKICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlQ29va2llKCd1dG1fY29udGVudCcpCiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUNvb2tpZSgndXRtX21lZGl1bScpCiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUNvb2tpZSgndXRtX3NvdXJjZScpCiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUNvb2tpZSgndXRtX3Rlcm0nKQogICAgICAgICAgICB9CgogICAgICAgICAgICBtZS5yZXNldEhpc3RvcnkoKQogICAgICAgIH0pCgogICAgfQoKfQoKICAgIGNvbnN0IGxoID0gbmV3IExlYWRIaXN0b3J5KCkKCgoKCn0oKSk=
5 ms
intlTelInput.min.js
802 ms
axios.min.js
37 ms
vue.min.js
32 ms
IHN3X2Nob2ljZXMuc2V0Q2hvaWNlQnlWYWx1ZSgnVmlydHVhbCBIQ0kgQXBwbGlhbmNlICh2SENJKScpIDogdm9pZCAwOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHBhdGhuYW1lID09PSAnL3ZzYW4tZnJlZS12cy1wYWlkJykgewogICAgICAgICAgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbWFpbl93aGl0ZV9oY2EnKTsKICAgICAgICAgIG1lID0gdGhpczsKICAgICAgICAgIGlmIChlbCAhPSBudWxsKSB7CiAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgbWUucHJvZHVjdCA9ICd2c2FuX2ZyZWVfb2N0MTgnOwogICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3dfY2hvaWNlcyAhPT0gInVuZGVmaW5lZCIgJiYgc3dfY2hvaWNlcyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgc3dfY2hvaWNlcy5zZXRDaG9pY2VCeVZhbHVlKCd2c2FuX2ZyZWVfb2N0MTgnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoKHBhdGhuYW1lID09PSAnL3Rlc3Qtc3RhcndpbmQtdmlydHVhbC1zYW4nKSB8fCAocGF0aG5hbWUgPT09ICcvc3RhcndpbmQtdmlydHVhbC1zYW4nKSkgewogICAgICAgICAgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYnRuX3NlbGVjdF92c2FuX2ZyZWUnKTsKICAgICAgICAgIGlmIChlbCAhPSBudWxsKSB7CiAgICAgICAgICAgIG1lID0gdGhpczsKICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBtZS5wcm9kdWN0ID0gJ3ZzYW5fZnJlZV9vY3QxOCc7CiAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBzd19jaG9pY2VzICE9PSAidW5kZWZpbmVkIiAmJiBzd19jaG9pY2VzICE9PSBudWxsID8gc3dfY2hvaWNlcy5zZXRDaG9pY2VCeVZhbHVlKCd2c2FuX2ZyZWVfb2N0MTgnKSA6IHZvaWQgMDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBlbF92c2FuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJ0bl9zZWxlY3RfdnNhbicpOwogICAgICAgICAgaWYgKGVsX3ZzYW4gIT0gbnVsbCkgewogICAgICAgICAgICBtZSA9IHRoaXM7CiAgICAgICAgICAgIGVsX3ZzYW4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBtZS5wcm9kdWN0ID0gJ3ZpcnR1YWxfc2FuJzsKICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHN3X2Nob2ljZXMgIT09ICJ1bmRlZmluZWQiICYmIHN3X2Nob2ljZXMgIT09IG51bGwgPyBzd19jaG9pY2VzLnNldENob2ljZUJ5VmFsdWUoJ3ZpcnR1YWxfc2FuJykgOiB2b2lkIDA7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGF0aG5hbWUgPT09ICcvc3RhcndpbmQtaHlwZXJjb252ZXJnZWQtYXBwbGlhbmNlJykgewogICAgICAgICAgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuR2V0X0hDSV9FdmFsdWF0aW9uX0tpdCcpOwogICAgICAgICAgaWYgKGVsICE9IG51bGwpIHsKICAgICAgICAgICAgbWUgPSB0aGlzOwogICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIG1lLnByb2R1Y3QgPSAnU3RhcldpbmQgSENJIEV2YWx1YXRpb24gS2l0JzsKICAgICAgICAgICAgICBpZiAodHlwZW9mIHN3X2Nob2ljZXMgIT09ICJ1bmRlZmluZWQiICYmIHN3X2Nob2ljZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHN3X2Nob2ljZXMuc2V0Q2hvaWNlQnlWYWx1ZSgnU3RhcldpbmQgSENJIEV2YWx1YXRpb24gS2l0Jyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHBhdGhuYW1lID09PSAnL2h5cGVyY29udmVyZ2VkLWluZnJhc3RydWN0dXJlJykgewogICAgICAgICAgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGVtb19wcm9kdWN0X192c2FuJyk7CiAgICAgICAgICBpZiAoZWwgIT0gbnVsbCkgewogICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3dfY2hvaWNlczMgIT09ICJ1bmRlZmluZWQiICYmIHN3X2Nob2ljZXMzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBzd19jaG9pY2VzMy5zZXRDaG9pY2VCeVZhbHVlKCdTdGFyV2luZCB2SENJIEFwcGxpYW5jZScpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodHlwZW9mIHN3X2Nob2ljZXM1ICE9PSAidW5kZWZpbmVkIiAmJiBzd19jaG9pY2VzNSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgc3dfY2hvaWNlczUuc2V0Q2hvaWNlQnlWYWx1ZSgnU3RhcldpbmQgdkhDSSBBcHBsaWFuY2UnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGVtb19wcm9kdWN0X19oY2EnKTsKICAgICAgICAgIGlmIChlbCAhPSBudWxsKSB7CiAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzd19jaG9pY2VzMyAhPT0gInVuZGVmaW5lZCIgJiYgc3dfY2hvaWNlczMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHN3X2Nob2ljZXMzLnNldENob2ljZUJ5VmFsdWUoJ1N0YXJXaW5kIEh5cGVyQ29udmVyZ2VkIEFwcGxpYW5jZScpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodHlwZW9mIHN3X2Nob2ljZXM1ICE9PSAidW5kZWZpbmVkIiAmJiBzd19jaG9pY2VzNSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgc3dfY2hvaWNlczUuc2V0Q2hvaWNlQnlWYWx1ZSgnU3RhcldpbmQgSHlwZXJDb252ZXJnZWQgQXBwbGlhbmNlJyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYWxsb3cgPSBmYWxzZTsKICAgICAgICBzd2l0Y2ggKHVybCkgewogICAgICAgICAgY2FzZSAnaHR0cHM6Ly93d3cuc3RhcndpbmRzb2Z0d2FyZS5jb20vaG9tZS0yMic6CiAgICAgICAgICBjYXNlICdodHRwczovL3d3dy5zdGFyd2luZHNvZnR3YXJlLmNvbS9ob21lLTIyI3F1b3RlJzoKICAgICAgICAgICAgYWxsb3cgPSB0cnVlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ2h0dHBzOi8vd3d3LnN0YXJ3aW5kc29mdHdhcmUuY29tL3N0YXJ3aW5kLW52bWUtb2YtaW5pdGlhdG9yI2ZyZWUnOgogICAgICAgICAgICBtZS5wcm9kdWN0ID0gJ1N0YXJXaW5kIE5WTWUtb0YgSW5pdGlhdG9yJzsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzd19jaG9pY2VzICE9PSAidW5kZWZpbmVkIiAmJiBzd19jaG9pY2VzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgc3dfY2hvaWNlcy5zZXRDaG9pY2VCeVZhbHVlKCdTdGFyV2luZCBOVk1lLW9GIEluaXRpYXRvcicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnaHR0cHM6Ly93d3cuc3RhcndpbmRzb2Z0d2FyZS5jb20vc3RhcndpbmQtdjJ2LWNvbnZlcnRlcj91dG1fc291cmNlPXN0YXJ3aW5kJnV0bV9tZWRpdW09bGlua19tZW51JzoKICAgICAgICAgICAgaWYgKHR5cGVvZiBzd19jaG9pY2VzICE9PSAidW5kZWZpbmVkIiAmJiBzd19jaG9pY2VzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgc3dfY2hvaWNlcy5zZXRDaG9pY2VCeVZhbHVlKCdTdGFyV2luZCBWMlYgQ29udmVydGVyJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICghYWxsb3cpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZnVuYyA9IGZ1bmN0aW9uKGxhYmVsKSB7CiAgICAgICAgICB2YXIgcmVmOwogICAgICAgICAgaWYgKChyZWYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiX3F1b3RlJykpICE9IG51bGwpIHsKICAgICAgICAgICAgcmVmLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJjbGljayIpKTsKICAgICAgICAgIH0KICAgICAgICAgIHN3aXRjaCAobGFiZWwpIHsKICAgICAgICAgICAgY2FzZSAnVmlydHVhbCBTQU4gKHZTQU4pJzoKICAgICAgICAgICAgICBpZiAodHlwZW9mIHN3X2Nob2ljZXMzICE9PSAidW5kZWZpbmVkIiAmJiBzd19jaG9pY2VzMyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgc3dfY2hvaWNlczMuc2V0Q2hvaWNlQnlWYWx1ZSgnU3RhcldpbmQgVmlydHVhbCBTQU4nKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ1NBTiAmYW1wOyBOQVMnOgogICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3dfY2hvaWNlczMgIT09ICJ1bmRlZmluZWQiICYmIHN3X2Nob2ljZXMzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBzd19jaG9pY2VzMy5zZXRDaG9pY2VCeVZhbHVlKCdTdGFyV2luZCBTQU4gJiBOQVMnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ1ZpcnR1YWwgVGFwZSBMaWJyYXJ5IChWVEwpJzoKICAgICAgICAgICAgICBpZiAodHlwZW9mIHN3X2Nob2ljZXMzICE9PSAidW5kZWZpbmVkIiAmJiBzd19jaG9pY2VzMyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgc3dfY2hvaWNlczMuc2V0Q2hvaWNlQnlWYWx1ZSgnU3RhcldpbmQgVmlydHVhbCBUYXBlIExpYnJhcnknKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ1ZpcnR1YWwgSENJIEFwcGxpYW5jZSAodkhDSSknOgogICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3dfY2hvaWNlczMgIT09ICJ1bmRlZmluZWQiICYmIHN3X2Nob2ljZXMzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBzd19jaG9pY2VzMy5zZXRDaG9pY2VCeVZhbHVlKCdTdGFyV2luZCB2SENJIEFwcGxpYW5jZScpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnTlZNZS1vRiBJbml0aWF0b3InOgogICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3dfY2hvaWNlczMgIT09ICJ1bmRlZmluZWQiICYmIHN3X2Nob2ljZXMzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBzd19jaG9pY2VzMy5zZXRDaG9pY2VCeVZhbHVlKCdTdGFyV2luZCBOVk1lLW9GIEluaXRpYXRvcicpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnSENJIEFwcGxpYW5jZSAoSENBKSc6CiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzd19jaG9pY2VzMyAhPT0gInVuZGVmaW5lZCIgJiYgc3dfY2hvaWNlczMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHN3X2Nob2ljZXMzLnNldENob2ljZUJ5VmFsdWUoJ1N0YXJXaW5kIEh5cGVyQ29udmVyZ2VkIEFwcGxpYW5jZScpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnSENBIGZvciBWaWRlbyBTdXJ2ZWlsbGFuY2UnOgogICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3dfY2hvaWNlczMgIT09ICJ1bmRlZmluZWQiICYmIHN3X2Nob2ljZXMzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBzd19jaG9pY2VzMy5zZXRDaG9pY2VCeVZhbHVlKCdTdGFyV2luZCBIeXBlckNvbnZlcmdlZCBBcHBsaWFuY2UnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ1ZUTCBBcHBsaWFuY2UnOgogICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3dfY2hvaWNlczMgIT09ICJ1bmRlZmluZWQiICYmIHN3X2Nob2ljZXMzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBzd19jaG9pY2VzMy5zZXRDaG9pY2VCeVZhbHVlKCdTdGFyV2luZCBWaXJ0dWFsIFRhcGUgTGlicmFyeSBBcHBsaWFuY2UnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ0JhY2t1cCBBcHBsaWFuY2UnOgogICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3dfY2hvaWNlczMgIT09ICJ1bmRlZmluZWQiICYmIHN3X2Nob2ljZXMzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBzd19jaG9pY2VzMy5zZXRDaG9pY2VCeVZhbHVlKCdTdGFyV2luZCBCYWNrdXAgQXBwbGlhbmNlJyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdTdG9yYWdlIEFwcGxpYW5jZSc6CiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzd19jaG9pY2VzMyAhPT0gInVuZGVmaW5lZCIgJiYgc3dfY2hvaWNlczMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHN3X2Nob2ljZXMzLnNldENob2ljZUJ5VmFsdWUoJ1N0YXJXaW5kIFN0b3JhZ2UgQXBwbGlhbmNlJyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgY2FsbFF1b3RlRm9ybUVsZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNhbGwtcXVvdGUtZm9ybScpOwogICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IGNhbGxRdW90ZUZvcm1FbGVtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgaXRlbSA9IGNhbGxRdW90ZUZvcm1FbGVtc1tpXTsKICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHZhciBsYWJlbCwgcmVmOwogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIGlmICgocmVmID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYl9xdW90ZScpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgcmVmLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJjbGljayIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsYWJlbCA9IGUudGFyZ2V0LmlubmVySFRNTDsKICAgICAgICAgICAgZnVuYyhsYWJlbCk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHBob25lQ2hhbmdlOiBmdW5jdGlvbihlKSB7CiAgICAgICAgaWYgKC9eW14tXCswLTlcKFwpI10kLy50ZXN0KGUua2V5KSkgewogICAgICAgICAgcmV0dXJuIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHZhbGlkRW1haWw6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICBpZiAod2luZG93LnN1Y2Nlc3NGb3JtU3VibWl0ID09IG51bGwpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJC5hamF4KHsKICAgICAgICAgIHVybDogJy92YWxpZGVtYWlsLmpzJywKICAgICAgICAgIHR5cGU6ICJQT1NUIiwKICAgICAgICAgIGRhdGE6IHsKICAgICAgICAgICAgZW1haWw6IG9wdGlvbnMuZW1haWwKICAgICAgICAgIH0sCiAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICB2YXIgb2JqOwogICAgICAgICAgICBvYmogPSB7fTsKICAgICAgICAgICAgb3B0aW9ucy52YWxpZCA9IHJlc3BvbnNlLmVtYWlsU3RhdHVzOwogICAgICAgICAgICBvcHRpb25zLnVzZXIgPSByZXNwb25zZS5jaWQ7CiAgICAgICAgICAgIHdpbmRvdy5zdWNjZXNzRm9ybVN1Ym1pdChvcHRpb25zKTsKICAgICAgICAgIH0sCiAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nCiAgICAgICAgfSk7CiAgICAgIH0sCiAgICAgIGZ1bmNfbm9fdmFsaWQ6IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICB2YXIgZDsKICAgICAgICBkID0gZGF0YTsKICAgICAgICBkWydmcm9tX3VybCddID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZjsKICAgICAgICBpZiAoIWpRdWVyeSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkLnBvc3QoIi9ub3QtdmFsaWQtZGF0YS12MjAuanMiLCBkKTsKICAgICAgfSwKICAgICAgc2V0TW9kZWw6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBsaWNlbnNlLCBvYmosIHN3X2VsZW1lbnRfc3ViX3Byb2R1Y3RfdmhjaTsKICAgICAgICB0aGlzLmlzVmFsaWRQaG9uZSgpOwogICAgICAgIG9iaiA9IHRoaXMuZ2V0TGljZW5zZTsKICAgICAgICBsaWNlbnNlID0gb2JqLmxpY2Vuc2U7CiAgICAgICAgdGhpcy5tb2RlbCA9IHsKICAgICAgICAgIHN1Yl9wcm9kdWN0X3Nhbl9uYXM6IHRoaXMuc3ViX3Byb2R1Y3Rfc2FuX25hcywKICAgICAgICAgIGxpY2Vuc2U6IGxpY2Vuc2UsCiAgICAgICAgICBwcm9kdWN0OiB0aGlzLnByb2R1Y3QsCiAgICAgICAgICBmaXJzdG5hbWU6IHRoaXMuZmlyc3RuYW1lLAogICAgICAgICAgbGFzdG5hbWU6IHRoaXMubGFzdG5hbWUsCiAgICAgICAgICBjb21wYW55OiB0aGlzLmNvbXBhbnksCiAgICAgICAgICBlbWFpbDogdGhpcy5lbWFpbCwKICAgICAgICAgIGNvdW50cnk6IHRoaXMuY291bnRyeSwKICAgICAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLAogICAgICAgICAgcGhvbmUyOiB0aGlzLnBob25lLAogICAgICAgICAgbnZtZV9ob3N0czogdGhpcy5udm1lX2hvc3RzLAogICAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZiwKICAgICAgICAgIHBob25lRXh0OiB0aGlzLnBob25lRXh0LAogICAgICAgICAgcGhvbmVTdGFuZGFydDogdGhpcy5wbm9uZVN0YW5kYXJ0LAogICAgICAgICAgcGhvbmVWZXJzaW9uOiB0aGlzLnBob25lVmVyc2lvbiwKICAgICAgICAgIHZhbGlkUGhvbmU6IHRoaXMudmFsaWRQaG9uZSwKICAgICAgICAgIGZvcm1UeXBlOiB0aGlzLmZvcm1UeXBlLAogICAgICAgICAgdmFsaWRWU0FOU3ViUHJvZHVjdDogdGhpcy52YWxpZFZTQU5TdWJQcm9kdWN0LAogICAgICAgICAgdmFsaWRWU0FORnJlZVN1YlByb2R1Y3Q6IHRoaXMudmFsaWRWU0FORnJlZVN1YlByb2R1Y3QsCiAgICAgICAgICB2YWxpZFNBTk5BU1N1YlByb2R1Y3Q6IHRoaXMudmFsaWRTQU5OQVNTdWJQcm9kdWN0LAogICAgICAgICAgdmFsaWRfdkhDSV9zdWJQcm9kdWN0OiB0aGlzLnZhbGlkX3ZIQ0lfc3ViUHJvZHVjdCwKICAgICAgICAgIHBob25lQ291bnRyeTogdGhpcy5waG9uZUNvdW50cnksCiAgICAgICAgICBTY2VuYXJpb18yMDIzMDY6IHRoaXMuU2NlbmFyaW9fMjAyMzA2CiAgICAgICAgfTsKICAgICAgICBpZiAodGhpcy5wcm9kdWN0ID09PSAnU3RhcldpbmQgSENJIEV2YWx1YXRpb24gS2l0JykgewogICAgICAgICAgdGhpcy5tb2RlbFsnZG93bmxvYWRfc3ViX3Byb2R1Y3QnXSA9ICdIQ0kgRXZhbHVhdGlvbiBLaXQnOwogICAgICAgIH0KICAgICAgICBzd19lbGVtZW50X3N1Yl9wcm9kdWN0X3ZoY2kgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG93bmxvYWRfc3ViX3Byb2R1Y3RfdmhjaScpOwogICAgICAgIGlmICgoc3dfZWxlbWVudF9zdWJfcHJvZHVjdF92aGNpICE9IG51bGwpICYmICh0aGlzLnByb2R1Y3QgPT09ICdWaXJ0dWFsIEhDSSBBcHBsaWFuY2UgKHZIQ0kpJykpIHsKICAgICAgICAgIHRoaXMubW9kZWxbJ3N1Yl9wcm9kdWN0X3ZoY2knXSA9IHRoaXMuc3ViX3Byb2R1Y3RfdmhjaTsKICAgICAgICAgIHRoaXMubW9kZWxbJ1NjZW5hcmlvXzIwMjMwNiddID0gdGhpcy5zdWJfcHJvZHVjdF92aGNpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgc3VibWl0Rm9ybTogZnVuY3Rpb24oZSkgewogICAgICAgIHZhciBEb3dubG9hZFByaXZhY3lQb2xpY3lFcnJvckVsLCBjaGVja19tZSwgY2hlY2tfbWVfbGFiZWwsIGZhaWx1cmVDYWxsYmFjaywgbWUsIHN1Y2Nlc3NDYWxsYmFjazsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgY2hlY2tfbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG93bmxvYWRfY2hlY2tfbWUnKTsKICAgICAgICBjaGVja19tZV9sYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb3dubG9hZF9jaGVja21hcmsnKTsKICAgICAgICBpZiAodGhpcy5pc0V1cm9ab25lKSB7CiAgICAgICAgICBEb3dubG9hZFByaXZhY3lQb2xpY3lFcnJvckVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Rvd25sb2FkX2NoZWNrX21lJyk7CiAgICAgICAgICBpZiAoKERvd25sb2FkUHJpdmFjeVBvbGljeUVycm9yRWwgIT0gbnVsbCkgJiYgRG93bmxvYWRQcml2YWN5UG9saWN5RXJyb3JFbC5jbGFzc0xpc3QuY29udGFpbnMoJ3doaXRlLXZlcnNpb24nKSkgewogICAgICAgICAgICB0aGlzLnByaXZhY3lQb2xpY3lFcnJvciA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIWNoZWNrX21lLmNoZWNrZWQpIHsKICAgICAgICAgICAgICB0aGlzLnByaXZhY3lQb2xpY3lFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLml0aUluc3RhbmNlKCcjZG93bmxvYWRfcGhvbmUnKSAhPSBudWxsKSB7CiAgICAgICAgICB0aGlzLmlzSXRpVmFsaWRQaG9uZSgnI2Rvd25sb2FkX3Bob25lJyk7CiAgICAgICAgfQogICAgICAgIG1lID0gdGhpczsKICAgICAgICB0aGlzLnNldE1vZGVsKCk7CiAgICAgICAgc3VjY2Vzc0NhbGxiYWNrID0gZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgdmFyIGNhdGVnb3J5LCBkb3dubG9hZFRoYW5rWW91RWwsIG9iaiwgb3B0aW9ucywgcHJvZHVjdF9uYW1lXzIwMjQ7CiAgICAgICAgICBtZS5jaGVja1JlcXVlc3QoZGF0YSk7CiAgICAgICAgICBvYmogPSBtZS5nZXRMaWNlbnNlOwogICAgICAgICAgY2F0ZWdvcnkgPSBvYmouY2F0ZWdvcnk7CiAgICAgICAgICAkKCIjZG93bmxvYWRfZm9ybSIpLmhpZGUoKTsKICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICAgIG9wdGlvbnMuYWN0aW9uID0gJ0Rvd25sb2FkJzsKICAgICAgICAgIG9wdGlvbnMubG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKICAgICAgICAgIG9wdGlvbnMuZW1haWwgPSBtZS5lbWFpbDsKICAgICAgICAgIG9wdGlvbnMubGljZW5zZSA9IG1lLm1vZGVsWydsaWNlbnNlJ107CiAgICAgICAgICBvcHRpb25zLmNhdGVnb3J5ID0gY2F0ZWdvcnk7CiAgICAgICAgICBtZS52YWxpZEVtYWlsKG9wdGlvbnMpOwogICAgICAgICAgcHJvZHVjdF9uYW1lXzIwMjQgPSAiIjsKICAgICAgICAgIHN3aXRjaCAobWUucHJvZHVjdCkgewogICAgICAgICAgICBjYXNlICJ2aXJ0dWFsX3NhbiI6CiAgICAgICAgICAgICAgcHJvZHVjdF9uYW1lXzIwMjQgPSAiVmlydHVhbCBTQU4gKFZTQU4pIjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAidnNhbl9mcmVlX29jdDE4IjoKICAgICAgICAgICAgICBwcm9kdWN0X25hbWVfMjAyNCA9ICJWU0FOIEZyZWUiOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJWaXJ0dWFsIEhDSSBBcHBsaWFuY2UgKHZIQ0kpIjoKICAgICAgICAgICAgICBwcm9kdWN0X25hbWVfMjAyNCA9ICJWaXJ0dWFsIEhDSSBBcHBsaWFuY2UgKFZIQ0EpIjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAidnRsX29jdDE4IjoKICAgICAgICAgICAgICBwcm9kdWN0X25hbWVfMjAyNCA9ICJWaXJ0dWFsIFRhcGUgTGlicmFyeSAoVlRMKSI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgInZ0bF9mcmVlX29jdDE4IjoKICAgICAgICAgICAgICBwcm9kdWN0X25hbWVfMjAyNCA9ICJWVEwgRnJlZSI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgInRhcGVfcmVkaXJlY3Rvcl9vY3QxOCI6CiAgICAgICAgICAgICAgcHJvZHVjdF9uYW1lXzIwMjQgPSAiVGFwZSBSZWRpcmVjdG9yIjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiU3RhcldpbmQgTlZNZS1vRiBJbml0aWF0b3IgVHJpYWwiOgogICAgICAgICAgICAgIHByb2R1Y3RfbmFtZV8yMDI0ID0gIk5WTWUtb0YgSW5pdGlhdG9yIjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiU3RhcldpbmQgTlZNZS1vRiBJbml0aWF0b3IiOgogICAgICAgICAgICAgIHByb2R1Y3RfbmFtZV8yMDI0ID0gIk5WTWUtb0YgSW5pdGlhdG9yIEZyZWUiOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJ2MnYiOgogICAgICAgICAgICAgIHByb2R1Y3RfbmFtZV8yMDI0ID0gIlYyViBDb252ZXJ0ZXIiOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJTdGFyV2luZCBWMlYgQ29udmVydGVyIjoKICAgICAgICAgICAgICBwcm9kdWN0X25hbWVfMjAyNCA9ICJQMlYgTWlncmF0b3JyIjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiU3RhcldpbmQgSENJIEV2YWx1YXRpb24gS2l0IjoKICAgICAgICAgICAgICBwcm9kdWN0X25hbWVfMjAyNCA9ICJTdGFyV2luZCBIQ0kgRXZhbHVhdGlvbiBLaXQiOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJkZWR1cGxpY2F0aW9uX2FuYWx5emVyIjoKICAgICAgICAgICAgICBwcm9kdWN0X25hbWVfMjAyNCA9ICJEZWR1cGxpY2F0aW9uIEFuYWx5emVyIjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiU3RhcldpbmQgclBlcmYiOgogICAgICAgICAgICAgIHByb2R1Y3RfbmFtZV8yMDI0ID0gIlJETUEgUGVyZm9ybWFuY2UgQmVuY2htYXJrIChyUGVyZikiOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJzYW4tbmFzLXRyaWFsIjoKICAgICAgICAgICAgICBwcm9kdWN0X25hbWVfMjAyNCA9ICJTQU4gJiBOQVMiOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJzYW4tbmFzLWZyZWUiOgogICAgICAgICAgICAgIHByb2R1Y3RfbmFtZV8yMDI0ID0gIlNBTiAmIE5BUyBGcmVlIjsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAicmFtX2Rpc2siOgogICAgICAgICAgICAgIHByb2R1Y3RfbmFtZV8yMDI0ID0gIlJBTSBEaXNrIjsKICAgICAgICAgIH0KICAgICAgICAgIGRvd25sb2FkVGhhbmtZb3VFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkb3dubG9hZC10aGFuay15b3UiKTsKICAgICAgICAgIGlmICgoZG93bmxvYWRUaGFua1lvdUVsICE9IG51bGwpICYmIGRvd25sb2FkVGhhbmtZb3VFbC5jbGFzc0xpc3QuY29udGFpbnMoInRlc3QtMjAyNDA0IikpIHsKICAgICAgICAgICAgZG93bmxvYWRUaGFua1lvdUVsLnF1ZXJ5U2VsZWN0b3IoJy50aXRsZScpLmlubmVyVGV4dCA9ICJUaGFuayB5b3UhIjsKICAgICAgICAgICAgaWYgKHByb2R1Y3RfbmFtZV8yMDI0ICE9PSAnJykgewogICAgICAgICAgICAgIGRvd25sb2FkVGhhbmtZb3VFbC5xdWVyeVNlbGVjdG9yKCcudGV4dCcpLmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPVwidGV4dFwiPlRoZSBsaWNlbnNlIGtleSBmb3IgIiArIHByb2R1Y3RfbmFtZV8yMDI0ICsgIjxicj4gaGFzIGJlZW4gYWxyZWFkeSBzZW50IHRvIGVtYWlsOjxicj4gPGI+IiArIG1lLmVtYWlsICsgIjwvYj5cbjxicj48YnI+IElmIHlvdSBkbyBub3QgZmluZCB0aGUgZW1haWwgaW4geW91ciBpbmJveCwgcGxlYXNlIGNoZWNrIHlvdXIgc3BhbS9qdW5rIGZvbGRlci5cbjwvZGl2PiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZG93bmxvYWRUaGFua1lvdUVsLnF1ZXJ5U2VsZWN0b3IoJy50ZXh0JykuaW5uZXJIVE1MID0gIjxkaXYgY2xhc3M9XCJ0ZXh0XCI+VGhlIGxpY2Vuc2Uga2V5IGFuZCB0aGUgZG93bmxvYWQgbGluayBoYXMgYmVlbiBzZW50IHRvIGVtYWlsOjxicj4gPGI+IiArIG1lLmVtYWlsICsgIjwvYj5cbjxicj48YnI+IElmIHlvdSBkbyBub3QgZmluZCB0aGUgZW1haWwgaW4geW91ciBpbmJveCwgcGxlYXNlIGNoZWNrIHlvdXIgc3BhbS9qdW5rIGZvbGRlci5cbjwvZGl2PiI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgICQoJyNkb3dubG9hZC10aGFuay15b3UuZG93bmxvYWQtdGhhbmsteW91Jykuc2hvdygpOwogICAgICAgICAgJCgiaHRtbCIpLmFuaW1hdGUoewogICAgICAgICAgICBzY3JvbGxUb3A6ICQoIiNmb3JtLXNlY3Rpb24iKS5vZmZzZXQoKS50b3AKICAgICAgICAgIH0sIDQwMCk7CiAgICAgICAgfTsKICAgICAgICBmYWlsdXJlQ2FsbGJhY2sgPSBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICBtZS5jaGVja1JlcXVlc3QoZGF0YSk7CiAgICAgICAgfTsKICAgICAgICB0aGlzLnBvaW50Rm9ybVZhbGlkYXRpb24odGhpcy5tb2RlbCwgc3VjY2Vzc0NhbGxiYWNrLCBmYWlsdXJlQ2FsbGJhY2spOwogICAgICB9LAogICAgICBlcnJvclByaW9yaXR5OiBmdW5jdGlvbihlcnJvcikgewogICAgICAgIHZhciByZXM7CiAgICAgICAgcmVzID0gMDsKICAgICAgICBzd2l0Y2ggKGVycm9yKSB7CiAgICAgICAgICBjYXNlICd2YWxpZGF0ZV9yZXF1aXJlZCc6CiAgICAgICAgICAgIHJlcyA9IDA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnZmFrZV93b3Jkcyc6CiAgICAgICAgICAgIHJlcyA9IDQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnbGF0aW5fYW5kX3doaXRlc3BhY2UnOgogICAgICAgICAgICByZXMgPSA1OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJlcyA9IDEwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzOwogICAgICB9LAogICAgICBzb3J0RXJyb3JzOiBmdW5jdGlvbihlcnJvcnMpIHsKICAgICAgICB2YXIga2V5LCBtZSwgb2JqLCByZXNPYmosIHNvcnRGdW5jOwogICAgICAgIG9iaiA9IHt9OwogICAgICAgIG1lID0gdGhpczsKICAgICAgICBmb3IgKGtleSBpbiBlcnJvcnMpIHsKICAgICAgICAgIGlmIChrZXkgPT09ICdsZW5ndGgnKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXJyb3JzW2tleV0pKSB7CiAgICAgICAgICAgIGVycm9yc1trZXldLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkgewogICAgICAgICAgICAgIHZhciBwcmlvcml0eTsKICAgICAgICAgICAgICBwcmlvcml0eSA9IG1lLmVycm9yUHJpb3JpdHkoZWxlbWVudCk7CiAgICAgICAgICAgICAgaWYgKG9ialtrZXldICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmpba2V5XS5wdXNoKHsKICAgICAgICAgICAgICAgICAgJ3J1bGUnOiBlbGVtZW50LAogICAgICAgICAgICAgICAgICAncHJpb3JpdHknOiBwcmlvcml0eQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmpba2V5XSA9IFsKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICdydWxlJzogZWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAncHJpb3JpdHknOiBwcmlvcml0eQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNvcnRGdW5jID0gZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgdmFyIHJlczsKICAgICAgICAgIHJlcyA9ICgrYS5wcmlvcml0eSkgLSAoK2IucHJpb3JpdHkpOwogICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICB9OwogICAgICAgIGZvciAoa2V5IGluIG9iaikgewogICAgICAgICAgb2JqW2tleV0uc29ydChzb3J0RnVuYyk7CiAgICAgICAgfQogICAgICAgIHJlc09iaiA9IHsKICAgICAgICAgIGxlbmd0aDogMAogICAgICAgIH07CiAgICAgICAgZm9yIChrZXkgaW4gb2JqKSB7CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlcnJvcnNba2V5XSkpIHsKICAgICAgICAgICAgb2JqW2tleV0uZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KSB7CiAgICAgICAgICAgICAgaWYgKHJlc09ialtrZXldICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHJlc09ialtrZXldLnB1c2goZWxlbWVudC5ydWxlKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmVzT2JqW2tleV0gPSBbZWxlbWVudC5ydWxlXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHJlc09iai5sZW5ndGggKz0gMTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXNPYmo7CiAgICAgIH0sCiAgICAgIGNoZWNrRXJyb3JzOiBmdW5jdGlvbihyZXMpIHsKICAgICAgICB2YXIgZXJyb3JzLCBrZXk7CiAgICAgICAgZXJyb3JzID0gewogICAgICAgICAgbGVuZ3RoOiAwCiAgICAgICAgfTsKICAgICAgICBmb3IgKGtleSBpbiByZXMuZGF0YSkgewogICAgICAgICAgaWYgKChlcnJvcnNbcmVzLmRhdGFba2V5XVsnZmllbGQnXV0gIT0gbnVsbCkpIHsKICAgICAgICAgICAgZXJyb3JzW3Jlcy5kYXRhW2tleV1bJ2ZpZWxkJ11dLnB1c2gocmVzLmRhdGFba2V5XVsncnVsZSddKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVycm9yc1tyZXMuZGF0YVtrZXldWydmaWVsZCddXSA9IFtyZXMuZGF0YVtrZXldWydydWxlJ11dOwogICAgICAgICAgfQogICAgICAgICAgZXJyb3JzLmxlbmd0aCArPSAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5zb3J0RXJyb3JzKGVycm9ycyk7CiAgICAgIH0sCiAgICAgIGZpbHRlckVycm9yczogZnVuY3Rpb24oZXJyb3JzKSB7CiAgICAgICAgdmFyIGtleSwgb2JqOwogICAgICAgIG9iaiA9IHsKICAgICAgICAgIGxlbmd0aDogMAogICAgICAgIH07CiAgICAgICAgZm9yIChrZXkgaW4gZXJyb3JzKSB7CiAgICAgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIG9ialtrZXldID0gW2Vycm9yc1trZXldWzBdXTsKICAgICAgICAgIG9iai5sZW5ndGggKz0gMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG9iajsKICAgICAgfSwKICAgICAgY2hlY2tSZXF1ZXN0OiBmdW5jdGlvbihyZXMpIHsKICAgICAgICB2YXIgZXJyb3JzLCBrLCBrZXksIG15Q2hlY2ssIHBob25lX2Vycm9yX2NvdW50OwogICAgICAgIG15Q2hlY2sgPSB0aGlzLmNoZWNrRXJyb3JzKHJlcyk7CiAgICAgICAgZXJyb3JzID0gewogICAgICAgICAgbGVuZ3RoOiAwCiAgICAgICAgfTsKICAgICAgICBteUNoZWNrID0gdGhpcy5maWx0ZXJFcnJvcnMobXlDaGVjayk7CiAgICAgICAgZXJyb3JzID0gbXlDaGVjazsKICAgICAgICB0aGlzLmVycm9yczIgPSBlcnJvcnM7CiAgICAgICAgJCgnI2Rvd25sb2FkX2Zvcm0gc3Bhbi5lcnJvcicpLnJlbW92ZSgpOwogICAgICAgIGlmICgoZXJyb3JzLmxlbmd0aCAhPSBudWxsKSAmJiBlcnJvcnMubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICBwaG9uZV9lcnJvcl9jb3VudCA9IDA7CiAgICAgICAgICBmb3IgKGtleSBpbiBlcnJvcnMpIHsKICAgICAgICAgICAgaWYgKGtleSAhPT0gJ2xlbmd0aCcpIHsKICAgICAgICAgICAgICBzd2l0Y2ggKGtleSkgewogICAgICAgICAgICAgICAgY2FzZSAnbGljZW5zZSc6CiAgICAgICAgICAgICAgICBjYXNlICd1c2Vfd2l0aCc6CiAgICAgICAgICAgICAgICBjYXNlICdjb3VudHJ5JzoKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICBmb3IgKGsgaW4gZXJyb3JzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSAnbnZtZV9ob3N0cycpIHsKICAgICAgICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZF9mb3JtICNkb3dubG9hZF8nICsga2V5ICsgJyArIHNwYW4uYmFyJykuYWZ0ZXIoIjxzcGFuIGNsYXNzPVwiZXJyb3JcIiBpZD1cImRvd25sb2FkX252bWVfaG9zdHNfZXJyb3JcIj4jIG9mIEluaXRpYXRvciBob3N0cyBpcyByZXF1aXJlZDwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJCgnI2Rvd25sb2FkXycgKyBrZXkpLmFkZENsYXNzKCd2YWxpZC1lcnJvcicpOwogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZXJyb3JzW2tleV1ba10pIHsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZhbGlkYXRlX3JlcXVpcmVkJzoKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChrZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmaXJzdG5hbWUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2Rvd25sb2FkX2Zvcm0gI2Rvd25sb2FkXycgKyBrZXkpLmFmdGVyKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+Rmlyc3QgbmFtZSBpcyByZXF1aXJlZDwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xhc3RuYW1lJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZF9mb3JtICNkb3dubG9hZF8nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPkxhc3QgbmFtZSBpcyByZXF1aXJlZDwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VtYWlsJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZF9mb3JtICNkb3dubG9hZF8nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPkNvcnBvcmF0ZSBlbWFpbCBpcyByZXF1aXJlZDwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbXBhbnknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2Rvd25sb2FkX2Zvcm0gI2Rvd25sb2FkXycgKyBrZXkpLmFmdGVyKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+Q29tcGFueSBpcyByZXF1aXJlZDwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RpdGxlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZF9mb3JtICNkb3dubG9hZF8nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPkpvYiB0aXRsZSBpcyByZXF1aXJlZDwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Bob25lMic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncGhvbmUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2Rvd25sb2FkX2Zvcm0gI2Rvd25sb2FkXycgKyBrZXkpLmFmdGVyKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+UGhvbmUgbnVtYmVyIGlzIHJlcXVpcmVkPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY291bnRyeSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZG93bmxvYWRfZm9ybSAjZG93bmxvYWRfJyArIGtleSkuYWZ0ZXIoIjxzcGFuIGNsYXNzPVwiZXJyb3JcIj5Db3VudHJ5IGlzIHJlcXVpcmVkPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdudm1lX2hvc3RzJzoKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2Rvd25sb2FkX2Zvcm0gI2Rvd25sb2FkX252bWVfaG9zdHNfd3JhcHBlciBzcGFuLmVycm9yJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZF9mb3JtICNkb3dubG9hZF9udm1lX2hvc3RzX3dyYXBwZXIgLmJhcicpLmJlZm9yZSgiPHNwYW4gY2xhc3M9XCJlcnJvclwiPlNlbGVjdCBudW1iZXIgb2YgSW5pdGlhdG9yIGhvc3RzPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ25vX3ZzYW5fc3ViX3Byb2R1Y3QnOgogICAgICAgICAgICAgICAgICAgICAgICAkKCcjZG93bmxvYWRfZm9ybSAjZG93bmxvYWRfc3ViX3Byb2R1Y3Rfd3JhcHBlciBzcGFuLmVycm9yJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZF9mb3JtICNkb3dubG9hZF9zdWJfcHJvZHVjdF93cmFwcGVyIC5iYXInKS5iZWZvcmUoIjxzcGFuIGNsYXNzPVwiZXJyb3JcIj5TZWxlY3QgdXNlIGNhc2U8L3NwYW4+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbm9fdnNhbl9mcmVlX3N1Yl9wcm9kdWN0JzoKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2Rvd25sb2FkX2Zvcm0gI2Rvd25sb2FkX3N1Yl9wcm9kdWN0X3Nhbl9mcmVlX3dyYXBwZXIgc3Bhbi5lcnJvcicpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkKCcjZG93bmxvYWRfZm9ybSAjZG93bmxvYWRfc3ViX3Byb2R1Y3Rfc2FuX2ZyZWVfd3JhcHBlciAuYmFyJykuYmVmb3JlKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+U2VsZWN0IHVzZSBjYXNlPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ25vX3ZoY2lfc3ViX3Byb2R1Y3QnOgogICAgICAgICAgICAgICAgICAgICAgICAkKCcjZG93bmxvYWRfZm9ybSAjZG93bmxvYWRfdmhjaV9zdWJfcHJvZHVjdF93cmFwcGVyIHNwYW4uZXJyb3InKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2Rvd25sb2FkX2Zvcm0gI2Rvd25sb2FkX3ZoY2lfc3ViX3Byb2R1Y3Rfd3JhcHBlciAuYmFyJykuYmVmb3JlKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+U2VsZWN0IHVzZSBjYXNlPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ25vX3Nhbl9uYXNfc3ViX3Byb2R1Y3QnOgogICAgICAgICAgICAgICAgICAgICAgICAkKCcjZG93bmxvYWRfZm9ybSAjZG93bmxvYWRfc3ViX3Byb2R1Y3Rfc2FuX25hc193cmFwcGVyIHNwYW4uZXJyb3InKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2Rvd25sb2FkX2Zvcm0gI2Rvd25sb2FkX3N1Yl9wcm9kdWN0X3Nhbl9uYXNfd3JhcHBlciAuYmFyJykuYmVmb3JlKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+U2VsZWN0IHVzZSBjYXNlPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3R3b19sYXRpbl9hbmRfd2hpdGVzcGFjZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZF9mb3JtICNkb3dubG9hZF8nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPk9ubHkgTGF0aW4gY2hhcmFjdGVycyBhcmUgYWxsb3dlZDwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsYXRpbl9hbmRfd2hpdGVzcGFjZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZF9mb3JtICNkb3dubG9hZF8nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPk9ubHkgTGF0aW4gY2hhcmFjdGVycyBhcmUgYWxsb3dlZDwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmaXJzdG5hbWVfbGFzdG5hbWVfbWF0Y2gnOgogICAgICAgICAgICAgICAgICAgICAgICAkKCcjZG93bmxvYWRfZm9ybSAjZG93bmxvYWRfJyArIGtleSkuYWZ0ZXIoIjxzcGFuIGNsYXNzPVwiZXJyb3JcIj5GaXJzdCBuYW1lIGFuZCBMYXN0IG5hbWUgY2Fubm90IGJlIGlkZW50aWNhbDwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2YWxpZGF0ZV92YWxpZF9lbWFpbCc6CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZF9mb3JtICNkb3dubG9hZF8nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPkludmFsaWQgZW1haWwgZm9ybWF0PC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Zha2Vfd29yZHMnOgogICAgICAgICAgICAgICAgICAgICAgICAkKCcjZG93bmxvYWRfZm9ybSAjZG93bmxvYWRfJyArIGtleSkuYWZ0ZXIoIjxzcGFuIGNsYXNzPVwiZXJyb3JcIj5QbGVhc2UgZW50ZXIgdmFsaWQgZGF0YTwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyZXBlYXRfc3ltYm9scyc6CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZF9mb3JtICNkb3dubG9hZF8nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPkludmFsaWQgbmFtZSBmb3JtYXQ8L3NwYW4+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgY2FzZSAncHVibGljX2VtYWlsJzoKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2Rvd25sb2FkX2Zvcm0gI2Rvd25sb2FkXycgKyBrZXkpLmFmdGVyKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+0KFvbXBhbnktYWZmaWxpYXRlZCBlbWFpbCBhZGRyZXNzIGlzIHJlcXVpcmVkLiBJZiB5b3UgZG8gbm90IGhhdmUgb25lLCByZWFjaCBvdXQgdG8gPGEgaHJlZj1cIm1haWx0bzpzYWxlc0BzdGFyd2luZC5jb21cIj5zYWxlc0BzdGFyd2luZC5jb208L2E+IGZvciBoZWxwPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ25vdF92YWxpZF9waG9uZV9mb3JtYXQnOgogICAgICAgICAgICAgICAgICAgICAgY2FzZSAncGhvbmVfbnVtYmVyJzoKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2Rvd25sb2FkX2Zvcm0gI2Rvd25sb2FkXycgKyBrZXkpLmFmdGVyKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+SW52YWxpZCBwaG9uZSBudW1iZXIgZm9ybWF0PC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZF9mb3JtICNkb3dubG9hZF8nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPlVua25vd24gZXJyb3IgZm9yICIgKyBrZXkgKyAiPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIHBvaW50Rm9ybVZhbGlkYXRpb246IGZ1bmN0aW9uKGRhdGEsIHN1Y2Nlc3NDYWxsYmFjaywgZmFpbHVyZUNhbGxiYWNrKSB7CiAgICAgICAgdmFyIGtleSwgcGFyYW1zLCB1cmw7CiAgICAgICAgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpOwogICAgICAgIGZvciAoa2V5IGluIGRhdGEpIHsKICAgICAgICAgIHBhcmFtcy5hcHBlbmQoa2V5LCBkYXRhW2tleV0pOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIGF4aW9zID09PSAidW5kZWZpbmVkIiB8fCBheGlvcyA9PT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuY2xhc3NMaXN0LmFkZCgncHJlbG9hZGVyJyk7CiAgICAgICAgdXJsID0gJy9wb2ludC1mb3JtLXZhbGlkYXRpb24uanMnOwogICAgICAgIGF4aW9zLnBvc3QodXJsLCBwYXJhbXMpLnRoZW4oZnVuY3Rpb24oYXJnKSB7CiAgICAgICAgICB2YXIgZGF0YTsKICAgICAgICAgIGRhdGEgPSBhcmcuZGF0YTsKICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5jbGFzc0xpc3QucmVtb3ZlKCdwcmVsb2FkZXInKTsKICAgICAgICAgIGlmICgoZGF0YS5zdWNjZXNzICE9IG51bGwpICYmIGRhdGEuc3VjY2VzcykgewogICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soJ29rJyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmYWlsdXJlQ2FsbGJhY2soZGF0YSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICB9KTsKCn0pLmNhbGwodGhpcyk7CgovLyMgc291cmNlTWFwcGluZ1VSTD1kb3dubG9hZC5qcy5tYXAK
3 ms
underscore-min.js
37 ms
backbone-min.js
52 ms
backbone-validation-min.js
52 ms
Backbone.ModelBinder.js
54 ms
axios.min.js
15 ms
DscOmxZMgLictXSokL2k7CiAgICAgICAgICB0aGlzLm1vZGVsLmZpcnN0bmFtZV9mciA9IHZhbGlkQ2hhcmFjdGVyc1JlZ2V4cC50ZXN0KHRoaXMuZmlyc3RuYW1lKTsKICAgICAgICAgIHRoaXMubW9kZWwubGFzdG5hbWVfZnIgPSB2YWxpZENoYXJhY3RlcnNSZWdleHAudGVzdCh0aGlzLmxhc3RuYW1lKTsKICAgICAgICAgIHRoaXMubW9kZWwudGl0bGVfZnIgPSB2YWxpZENoYXJhY3RlcnNSZWdleHAudGVzdCh0aGlzLnRpdGxlKTsKICAgICAgICAgIHJldHVybiB0aGlzLm1vZGVsLmNvbXBhbnlfZnIgPSB2YWxpZENoYXJhY3RlcnNSZWdleHAudGVzdCh0aGlzLmNvbXBhbnkpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgaXRpUGhvbmVFcnJvcjogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGVsOwogICAgICAgIGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Bob25lXzIwMjNfcXVvdGUnKTsKICAgICAgICBpZiAoZWwgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdmaWVsZC1lcnJvcicpOwogICAgICAgIGlmICghdGhpcy5pdGlOdW1iZXJFcnJvcikgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSwKICAgICAgZXJyb3JQcmlvcml0eTogZnVuY3Rpb24oZXJyb3IpIHsKICAgICAgICB2YXIgcmVzOwogICAgICAgIHJlcyA9IDA7CiAgICAgICAgc3dpdGNoIChlcnJvcikgewogICAgICAgICAgY2FzZSAndmFsaWRhdGVfcmVxdWlyZWQnOgogICAgICAgICAgICByZXMgPSAwOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ2Zha2Vfd29yZHMnOgogICAgICAgICAgICByZXMgPSA0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ2xhdGluX2FuZF93aGl0ZXNwYWNlJzoKICAgICAgICAgICAgcmVzID0gNTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXMgPSAxMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKICAgICAgfSwKICAgICAgc29ydEVycm9yczogZnVuY3Rpb24oZXJyb3JzKSB7CiAgICAgICAgdmFyIGtleSwgbWUsIG9iaiwgcmVzT2JqLCBzb3J0RnVuYzsKICAgICAgICBvYmogPSB7fTsKICAgICAgICBtZSA9IHRoaXM7CiAgICAgICAgZm9yIChrZXkgaW4gZXJyb3JzKSB7CiAgICAgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGVycm9yc1trZXldKSkgewogICAgICAgICAgICBlcnJvcnNba2V5XS5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgICAgICAgICAgICB2YXIgcHJpb3JpdHk7CiAgICAgICAgICAgICAgcHJpb3JpdHkgPSBtZS5lcnJvclByaW9yaXR5KGVsZW1lbnQpOwogICAgICAgICAgICAgIGlmIChvYmpba2V5XSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqW2tleV0ucHVzaCh7CiAgICAgICAgICAgICAgICAgICdydWxlJzogZWxlbWVudCwKICAgICAgICAgICAgICAgICAgJ3ByaW9yaXR5JzogcHJpb3JpdHkKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqW2tleV0gPSBbCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAncnVsZSc6IGVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgJ3ByaW9yaXR5JzogcHJpb3JpdHkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzb3J0RnVuYyA9IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgIHZhciByZXM7CiAgICAgICAgICByZXMgPSAoK2EucHJpb3JpdHkpIC0gKCtiLnByaW9yaXR5KTsKICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfTsKICAgICAgICBmb3IgKGtleSBpbiBvYmopIHsKICAgICAgICAgIG9ialtrZXldLnNvcnQoc29ydEZ1bmMpOwogICAgICAgIH0KICAgICAgICByZXNPYmogPSB7CiAgICAgICAgICBsZW5ndGg6IDAKICAgICAgICB9OwogICAgICAgIGZvciAoa2V5IGluIG9iaikgewogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXJyb3JzW2tleV0pKSB7CiAgICAgICAgICAgIG9ialtrZXldLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkgewogICAgICAgICAgICAgIGlmIChyZXNPYmpba2V5XSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXNPYmpba2V5XS5wdXNoKGVsZW1lbnQucnVsZSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJlc09ialtrZXldID0gW2VsZW1lbnQucnVsZV07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiByZXNPYmoubGVuZ3RoICs9IDE7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzT2JqOwogICAgICB9LAogICAgICBmaWx0ZXJFcnJvcnM6IGZ1bmN0aW9uKGVycm9ycykgewogICAgICAgIHZhciBrZXksIG9iajsKICAgICAgICBvYmogPSB7CiAgICAgICAgICBsZW5ndGg6IDAKICAgICAgICB9OwogICAgICAgIGZvciAoa2V5IGluIGVycm9ycykgewogICAgICAgICAgaWYgKGtleSA9PT0gJ2xlbmd0aCcpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBvYmpba2V5XSA9IFtlcnJvcnNba2V5XVswXV07CiAgICAgICAgICBvYmoubGVuZ3RoICs9IDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvYmo7CiAgICAgIH0sCiAgICAgIGNoZWNrRXJyb3JzOiBmdW5jdGlvbihyZXMpIHsKICAgICAgICB2YXIgZXJyb3JzLCBrZXk7CiAgICAgICAgZXJyb3JzID0gewogICAgICAgICAgbGVuZ3RoOiAwCiAgICAgICAgfTsKICAgICAgICBmb3IgKGtleSBpbiByZXMuZGF0YSkgewogICAgICAgICAgaWYgKChlcnJvcnNbcmVzLmRhdGFba2V5XVsnZmllbGQnXV0gIT0gbnVsbCkpIHsKICAgICAgICAgICAgZXJyb3JzW3Jlcy5kYXRhW2tleV1bJ2ZpZWxkJ11dLnB1c2gocmVzLmRhdGFba2V5XVsncnVsZSddKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVycm9yc1tyZXMuZGF0YVtrZXldWydmaWVsZCddXSA9IFtyZXMuZGF0YVtrZXldWydydWxlJ11dOwogICAgICAgICAgfQogICAgICAgICAgZXJyb3JzLmxlbmd0aCArPSAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZXJyb3JzOwogICAgICB9LAogICAgICBjaGVja1JlcXVlc3Q6IGZ1bmN0aW9uKHJlcykgewogICAgICAgIHZhciBlcnJvcnMsIGssIGtleSwgbXlDaGVjaywgcGhvbmVfbnVtYmVyX2ZsYWcsIHZhbGlkZV9tZXNzYWdlOwogICAgICAgIG15Q2hlY2sgPSB0aGlzLmNoZWNrRXJyb3JzKHJlcyk7CiAgICAgICAgbXlDaGVjayA9IHRoaXMuc29ydEVycm9ycyhteUNoZWNrKTsKICAgICAgICBteUNoZWNrID0gdGhpcy5maWx0ZXJFcnJvcnMobXlDaGVjayk7CiAgICAgICAgZXJyb3JzID0gewogICAgICAgICAgbGVuZ3RoOiAwCiAgICAgICAgfTsKICAgICAgICBlcnJvcnMgPSBteUNoZWNrOwogICAgICAgIHRoaXMuZXJyb3JzMiA9IGVycm9yczsKICAgICAgICAkKCcjZ2V0X3F1b3RlX2Zvcm0gc3Bhbi5lcnJvcicpLnJlbW92ZSgpOwogICAgICAgIGlmICgoZXJyb3JzLmxlbmd0aCAhPSBudWxsKSAmJiBlcnJvcnMubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICBwaG9uZV9udW1iZXJfZmxhZyA9IDA7CiAgICAgICAgICB2YWxpZGVfbWVzc2FnZSA9IHt9OwogICAgICAgICAgdmFsaWRlX21lc3NhZ2VbJ2VuJ10gPSB7CiAgICAgICAgICAgICd2YWxpZGF0ZV9yZXF1aXJlZCc6IHsKICAgICAgICAgICAgICAnZmlyc3RuYW1lJzogJ0ZpcnN0IG5hbWUgaXMgcmVxdWlyZWQnLAogICAgICAgICAgICAgICdsYXN0bmFtZSc6ICdMYXN0IG5hbWUgaXMgcmVxdWlyZWQnLAogICAgICAgICAgICAgICdlbWFpbCc6ICdDb3Jwb3JhdGUgZW1haWwgaXMgcmVxdWlyZWQnLAogICAgICAgICAgICAgICdjb21wYW55JzogJ0NvbXBhbnkgbmFtZSBpcyByZXF1aXJlZCcsCiAgICAgICAgICAgICAgJ3RpdGxlJzogJ0pvYiB0aXRsZSBpcyByZXF1aXJlZCcsCiAgICAgICAgICAgICAgJ3Bob25lJzogJ1Bob25lIG51bWJlciBpcyByZXF1aXJlZCcsCiAgICAgICAgICAgICAgJ2NvdW50cnknOiAnQ291bnRyeSBuYW1lIGlzIHJlcXVpcmVkJwogICAgICAgICAgICB9LAogICAgICAgICAgICAndHdvX2xhdGluX2FuZF93aGl0ZXNwYWNlJzogJ09ubHkgTGF0aW4gY2hhcmFjdGVycyBhcmUgYWxsb3dlZCcsCiAgICAgICAgICAgICdmaXJzdG5hbWVfbGFzdG5hbWVfbWF0Y2gnOiAnRmlyc3QgbmFtZSBhbmQgTGFzdCBuYW1lIGNhbm5vdCBiZSBpZGVudGljYWwnLAogICAgICAgICAgICAnbGF0aW5fYW5kX3doaXRlc3BhY2UnOiAnT25seSBMYXRpbiBjaGFyYWN0ZXJzIGFyZSBhbGxvd2VkJywKICAgICAgICAgICAgJ3B1YmxpY19lbWFpbCc6ICfQoW9tcGFueS1hZmZpbGlhdGVkIGVtYWlsIGFkZHJlc3MgaXMgcmVxdWlyZWQuIElmIHlvdSBkbyBub3QgaGF2ZSBvbmUsIHJlYWNoIG91dCB0byA8YSBocmVmPSJtYWlsdG86c2FsZXNAc3RhcndpbmQuY29tIj5zYWxlc0BzdGFyd2luZC5jb208L2E+IGZvciBoZWxwLicsCiAgICAgICAgICAgICdjaG9vc2VfbGljZW5zZV92YWx1ZSc6ICdQbGVhc2UsIGNob29zZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zJywKICAgICAgICAgICAgJ3JlcGVhdF9zeW1ib2xzJzogJ0ludmFsaWQgbmFtZSBmb3JtYXQnLAogICAgICAgICAgICAnbm90X3ZhbGlkX3Bob25lX2Zvcm1hdCc6ICdJbnZhbGlkIHBob25lIG51bWJlciBmb3JtYXQnLAogICAgICAgICAgICAndmFsaWRhdGVfdmFsaWRfZW1haWwnOiAnSW52YWxpZCBlbWFpbCBmb3JtYXQnLAogICAgICAgICAgICAnZmFrZV93b3Jkcyc6IHsKICAgICAgICAgICAgICAnZmlyc3RuYW1lJzogJ0ludmFsaWQgbmFtZSBmb3JtYXQnLAogICAgICAgICAgICAgICdsYXN0bmFtZSc6ICdJbnZhbGlkIG5hbWUgZm9ybWF0JywKICAgICAgICAgICAgICAndGl0bGUnOiAnSW52YWxpZCBqb2IgdGl0bGUgZm9ybWF0JwogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgdmFsaWRlX21lc3NhZ2VbJ2ZyJ10gPSB7CiAgICAgICAgICAgICd2YWxpZGF0ZV9yZXF1aXJlZCc6IHsKICAgICAgICAgICAgICAnZmlyc3RuYW1lJzogJ0xlIHByw6lub20gZXN0IHJlcXVpcycsCiAgICAgICAgICAgICAgJ2xhc3RuYW1lJzogJ0xlIG5vbSBlc3QgcmVxdWlzJywKICAgICAgICAgICAgICAnZW1haWwnOiAnVW5lIGFkcmVzc2UgZS1tYWlsIGRcJ2VudHJlcHJpc2UgZXN0IHJlcXVpc2UnLAogICAgICAgICAgICAgICdjb21wYW55JzogJ0xlIG5vbSBkZSBsXCdlbnRyZXByaXNlIGVzdCByZXF1aXMnLAogICAgICAgICAgICAgICd0aXRsZSc6ICdMZSB0aXRyZSBkZSBwb3N0ZSBlc3QgcmVxdWlzJywKICAgICAgICAgICAgICAncGhvbmUnOiAnTGUgbnVtw6lybyBkZSB0w6lsw6lwaG9uZSBlc3QgcmVxdWlzJywKICAgICAgICAgICAgICAnY291bnRyeSc6ICdMZSBub20gZHUgcGF5cyBlc3QgcmVxdWlzJwogICAgICAgICAgICB9LAogICAgICAgICAgICAndHdvX2xhdGluX2FuZF93aGl0ZXNwYWNlJzogJ1NldWxzIGxlcyBjYXJhY3TDqHJlcyBsYXRpbnMgc29udCBhdXRvcmlzw6lzJywKICAgICAgICAgICAgJ2ZpcnN0bmFtZV9sYXN0bmFtZV9tYXRjaCc6ICdMZSBwcsOpbm9tIGV0IGxlIG5vbSBkZSBmYW1pbGxlIG5lIHBldXZlbnQgcGFzIMOqdHJlIGlkZW50aXF1ZXMnLAogICAgICAgICAgICAnbGF0aW5fYW5kX3doaXRlc3BhY2UnOiAnU2V1bHMgbGVzIGNhcmFjdMOocmVzIGxhdGlucyBzb250IGF1dG9yaXPDqXMnLAogICAgICAgICAgICAncHVibGljX2VtYWlsJzogJ1NpIHVuZSBhZHJlc3NlIGUtbWFpbCBncmF0dWl0ZSBvdSBwdWJsaXF1ZSBlc3QgZm91cm5pZTogVW5lIGFkcmVzc2UgZS1tYWlsIGFmZmlsacOpZSDDoCBsXCdlbnRyZXByaXNlIGVzdCByZXF1aXNlLiBTaSB2b3VzIG5cJ2VuIGF2ZXogcGFzLCBjb250YWN0ZXogPGEgaHJlZj0ibWFpbHRvOnNhbGVzQHN0YXJ3aW5kLmNvbSI+c2FsZXNAc3RhcndpbmQuY29tPC9hPiBwb3VyIG9idGVuaXIgZGUgbFwnYWlkZScsCiAgICAgICAgICAgICdjaG9vc2VfbGljZW5zZV92YWx1ZSc6ICdTw6lsZWN0aW9ubmV6IHVuIGNhcyBkXCd1dGlsaXNhdGlvbicsCiAgICAgICAgICAgICdyZXBlYXRfc3ltYm9scyc6ICdGb3JtYXQgZGUgbm9tIGludmFsaWRlJywKICAgICAgICAgICAgJ25vdF92YWxpZF9waG9uZV9mb3JtYXQnOiAnRm9ybWF0IGRlIG51bcOpcm8gZGUgdMOpbMOpcGhvbmUgaW52YWxpZGUnLAogICAgICAgICAgICAndmFsaWRhdGVfdmFsaWRfZW1haWwnOiAnVW5lIGFkcmVzc2UgZS1tYWlsIGRcJ2VudHJlcHJpc2UgZXN0IHJlcXVpc2UnLAogICAgICAgICAgICAnZmFrZV93b3Jkcyc6IHsKICAgICAgICAgICAgICAnZmlyc3RuYW1lJzogJ0Zvcm1hdCBkZSBub20gaW52YWxpZGUnLAogICAgICAgICAgICAgICdsYXN0bmFtZSc6ICdGb3JtYXQgZGUgbm9tIGludmFsaWRlJywKICAgICAgICAgICAgICAndGl0bGUnOiAnRm9ybWF0IGRlIG5vbSBkXCdlbnRyZXByaXNlIGludmFsaWRlJwogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgZm9yIChrZXkgaW4gZXJyb3JzKSB7CiAgICAgICAgICAgIGlmIChrZXkgIT09ICdsZW5ndGgnKSB7CiAgICAgICAgICAgICAgc3dpdGNoIChrZXkpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ3Byb2R1Y3QnOgogICAgICAgICAgICAgICAgY2FzZSAnY291bnRyeSc6CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgZm9yIChrIGluIGVycm9yc1trZXldKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlcnJvcnNba2V5XVtrXSkgewogICAgICAgICAgICAgICAgICAgICAgY2FzZSAndmFsaWRhdGVfcmVxdWlyZWQnOgogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2ZpcnN0bmFtZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUVycm9yKCcjZ2V0X3F1b3RlX2Zvcm0gI3F1b3RlXycgKyBrZXksIHZhbGlkZV9tZXNzYWdlW3RoaXMubGFuZ3VhZ2VdWyd2YWxpZGF0ZV9yZXF1aXJlZCddWydmaXJzdG5hbWUnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsYXN0bmFtZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUVycm9yKCcjZ2V0X3F1b3RlX2Zvcm0gI3F1b3RlXycgKyBrZXksIHZhbGlkZV9tZXNzYWdlW3RoaXMubGFuZ3VhZ2VdWyd2YWxpZGF0ZV9yZXF1aXJlZCddWydsYXN0bmFtZSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VtYWlsJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRXJyb3IoJyNnZXRfcXVvdGVfZm9ybSAjcXVvdGVfJyArIGtleSwgdmFsaWRlX21lc3NhZ2VbdGhpcy5sYW5ndWFnZV1bJ3ZhbGlkYXRlX3JlcXVpcmVkJ11bJ2VtYWlsJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29tcGFueSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUVycm9yKCcjZ2V0X3F1b3RlX2Zvcm0gI3F1b3RlXycgKyBrZXksIHZhbGlkZV9tZXNzYWdlW3RoaXMubGFuZ3VhZ2VdWyd2YWxpZGF0ZV9yZXF1aXJlZCddWydjb21wYW55J10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndGl0bGUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVFcnJvcignI2dldF9xdW90ZV9mb3JtICNxdW90ZV8nICsga2V5LCB2YWxpZGVfbWVzc2FnZVt0aGlzLmxhbmd1YWdlXVsndmFsaWRhdGVfcmVxdWlyZWQnXVsndGl0bGUnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwaG9uZTInOgogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Bob25lJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRXJyb3IoJyNnZXRfcXVvdGVfZm9ybSAjcXVvdGVfcGhvbmUyJywgdmFsaWRlX21lc3NhZ2VbdGhpcy5sYW5ndWFnZV1bJ3ZhbGlkYXRlX3JlcXVpcmVkJ11bJ3Bob25lJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY291bnRyeSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUVycm9yKCcjZ2V0X3F1b3RlX2Zvcm0gI3F1b3RlXycgKyBrZXksIHZhbGlkZV9tZXNzYWdlW3RoaXMubGFuZ3VhZ2VdWyd2YWxpZGF0ZV9yZXF1aXJlZCddWydjb3VudHJ5J10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0d29fbGF0aW5fYW5kX3doaXRlc3BhY2UnOgogICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUVycm9yKCcjZ2V0X3F1b3RlX2Zvcm0gI3F1b3RlXycgKyBrZXksIHZhbGlkZV9tZXNzYWdlW3RoaXMubGFuZ3VhZ2VdWyd0d29fbGF0aW5fYW5kX3doaXRlc3BhY2UnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZmlyc3RuYW1lX2xhc3RuYW1lX21hdGNoJzoKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVFcnJvcignI2dldF9xdW90ZV9mb3JtICNxdW90ZV8nICsga2V5LCB2YWxpZGVfbWVzc2FnZVt0aGlzLmxhbmd1YWdlXVsnZmlyc3RuYW1lX2xhc3RuYW1lX21hdGNoJ10pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xhdGluX2FuZF93aGl0ZXNwYWNlJzoKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVFcnJvcignI2dldF9xdW90ZV9mb3JtICNxdW90ZV8nICsga2V5LCB2YWxpZGVfbWVzc2FnZVt0aGlzLmxhbmd1YWdlXVsnbGF0aW5fYW5kX3doaXRlc3BhY2UnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgY2FzZSAncHVibGljX2VtYWlsJzoKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVFcnJvcignI2dldF9xdW90ZV9mb3JtICNxdW90ZV8nICsga2V5LCB2YWxpZGVfbWVzc2FnZVt0aGlzLmxhbmd1YWdlXVsncHVibGljX2VtYWlsJ10pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Zha2Vfd29yZHMnOgogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2ZpcnN0bmFtZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGFzdG5hbWUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVFcnJvcignI2dldF9xdW90ZV9mb3JtICNxdW90ZV8nICsga2V5LCB2YWxpZGVfbWVzc2FnZVt0aGlzLmxhbmd1YWdlXVsnZmFrZV93b3JkcyddWydmaXJzdG5hbWUnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0aXRsZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUVycm9yKCcjZ2V0X3F1b3RlX2Zvcm0gI3F1b3RlXycgKyBrZXksIHZhbGlkZV9tZXNzYWdlW3RoaXMubGFuZ3VhZ2VdWydmYWtlX3dvcmRzJ11bJ3RpdGxlJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjaG9vc2VfbGljZW5zZV92YWx1ZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRXJyb3IoJyNnZXRfcXVvdGVfZm9ybSAjcXVvdGVfJyArIGtleSwgdmFsaWRlX21lc3NhZ2VbdGhpcy5sYW5ndWFnZV1bJ2Nob29zZV9saWNlbnNlX3ZhbHVlJ10pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JlcGVhdF9zeW1ib2xzJzoKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVFcnJvcignI2dldF9xdW90ZV9mb3JtICNxdW90ZV8nICsga2V5LCB2YWxpZGVfbWVzc2FnZVt0aGlzLmxhbmd1YWdlXVsncmVwZWF0X3N5bWJvbHMnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbm90X3ZhbGlkX3Bob25lX2Zvcm1hdCc6CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwaG9uZV9udW1iZXInOgogICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUVycm9yKCcjZ2V0X3F1b3RlX2Zvcm0gI3F1b3RlXycgKyBrZXksIHZhbGlkZV9tZXNzYWdlW3RoaXMubGFuZ3VhZ2VdWydub3RfdmFsaWRfcGhvbmVfZm9ybWF0J10pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZhbGlkYXRlX3ZhbGlkX2VtYWlsJzoKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVFcnJvcignI2dldF9xdW90ZV9mb3JtICNxdW90ZV8nICsga2V5LCB2YWxpZGVfbWVzc2FnZVt0aGlzLmxhbmd1YWdlXVsndmFsaWRhdGVfdmFsaWRfZW1haWwnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmxhbmd1YWdlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZnInOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVFcnJvcignI2dldF9xdW90ZV9mb3JtICNxdW90ZV8nICsga2V5LCAiQXV0cmVzIGNhcyBwb3VyICIgKyBrZXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRXJyb3IoJyNnZXRfcXVvdGVfZm9ybSAjcXVvdGVfJyArIGtleSwgIlVua25vd24gZXJyb3IgZm9yICIgKyBrZXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgc3VibWl0Rm9ybTogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB2YXIgY2hlY2tfbWUsIGNoZWNrX21lX2xhYmVsLCBmYWlsdXJlQ2FsbGJhY2ssIG1lLCBzdWNjZXNzQ2FsbGJhY2s7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICBjaGVja19tZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdW90ZV9jaGVja19tZScpOwogICAgICAgIGNoZWNrX21lX2xhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1b3RlX2NoZWNrbWFyaycpOwogICAgICAgIGlmICh0aGlzLmlzRXVyb1pvbmUpIHsKICAgICAgICAgIGlmICghY2hlY2tfbWUuY2hlY2tlZCkgewogICAgICAgICAgICB0aGlzLnByaXZhY3lQb2xpY3lFcnJvciA9IHRydWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLnByaXZhY3lQb2xpY3lFcnJvciA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFjaGVja19tZS5jaGVja2VkKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5pdGlOdW1iZXJFcnJvciA9IGZhbHNlOwogICAgICAgIGlmICh0aGlzLml0aUluc3RhbmNlKCcjcXVvdGVfcGhvbmUyJykgIT0gbnVsbCkgewogICAgICAgICAgdGhpcy5pc0l0aVZhbGlkUGhvbmUoJyNxdW90ZV9waG9uZTInKTsKICAgICAgICB9CiAgICAgICAgbWUgPSB0aGlzOwogICAgICAgIHRoaXMuc2V0TW9kZWwoKTsKICAgICAgICBzdWNjZXNzQ2FsbGJhY2sgPSBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICB2YXIgb3B0aW9uczsKICAgICAgICAgIG1lLmNoZWNrUmVxdWVzdChkYXRhKTsKICAgICAgICAgICQoIiNnZXRfcXVvdGVfZm9ybSIpLmhpZGUoKTsKICAgICAgICAgICQoJyNxdW90ZS10aGFuay15b3UucXVvdGUtdGhhbmsteW91Jykuc2hvdygpOwogICAgICAgICAgY2hlY2tfbWVfbGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVvdGVfY2hlY2ttYXJrJyk7CiAgICAgICAgICBjaGVja19tZV9sYWJlbC5jbGFzc0xpc3QucmVtb3ZlKCdlcnJvcicpOwogICAgICAgICAgY2hlY2tfbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVvdGVfY2hlY2tfbWUnKTsKICAgICAgICAgIGNoZWNrX21lLmNoZWNrZWQgPSBmYWxzZTsKICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICAgIG9wdGlvbnMuYWN0aW9uID0gJ0dldCBQcmljaW5nJzsKICAgICAgICAgIG9wdGlvbnMubG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKICAgICAgICAgIG9wdGlvbnMuZW1haWwgPSBtZS5lbWFpbDsKICAgICAgICAgIG9wdGlvbnMubGljZW5zZSA9IG1lLnByb2R1Y3Q7CiAgICAgICAgICBtZS52YWxpZEVtYWlsX3F1b3RlKG9wdGlvbnMpOwogICAgICAgICAgJCgiaHRtbCIpLmFuaW1hdGUoewogICAgICAgICAgICBzY3JvbGxUb3A6ICQoIiNmb3JtLXNlY3Rpb24iKS5vZmZzZXQoKS50b3AKICAgICAgICAgIH0sIDQwMCk7CiAgICAgICAgfTsKICAgICAgICBmYWlsdXJlQ2FsbGJhY2sgPSBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICBtZS5jaGVja1JlcXVlc3QoZGF0YSk7CiAgICAgICAgfTsKICAgICAgICB0aGlzLnBvaW50Rm9ybVZhbGlkYXRpb24odGhpcy5tb2RlbCwgc3VjY2Vzc0NhbGxiYWNrLCBmYWlsdXJlQ2FsbGJhY2spOwogICAgICB9LAogICAgICBpdGlQaG9uZUluaXQ6IGZ1bmN0aW9uKHNlbGVjdG9yLCB1dGlsc1NjcmlwdCkgewogICAgICAgIHZhciBtZSwgcGhvbmVFbDsKICAgICAgICBpZiAodXRpbHNTY3JpcHQgPT0gbnVsbCkgewogICAgICAgICAgdXRpbHNTY3JpcHQgPSAiaHR0cHM6Ly93d3cuc3RhcndpbmRzb2Z0d2FyZS5jb20vYXNzZXRzL2xpYnJhcmllcy9pbnRsLXRlbC1pbnB1dC0xNy4wLjE5L2J1aWxkL2pzL3V0aWxzLmpzIjsKICAgICAgICB9CiAgICAgICAgbWUgPSB0aGlzOwogICAgICAgIGlmICh3aW5kb3cuaW50bFRlbElucHV0ICE9IG51bGwpIHsKICAgICAgICAgIHBob25lRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICAgICAgIGlmIChwaG9uZUVsICE9IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5waG9uZVZlcnNpb24gPSAndjIwMjMnOwogICAgICAgICAgICByZXR1cm4gd2luZG93LmludGxUZWxJbnB1dChwaG9uZUVsLCB7CiAgICAgICAgICAgICAgdXRpbHNTY3JpcHQ6IHV0aWxzU2NyaXB0LAogICAgICAgICAgICAgIHNlcGFyYXRlRGlhbENvZGU6IHRydWUKICAgICAgICAgICAgfSkucHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIG1lLnNldENsZWFuUGhvbmVNb2RlbCgncXVvdGUnKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBpdGlJbnN0YW5jZTogZnVuY3Rpb24oc2VsZWN0b3IpIHsKICAgICAgICB2YXIgaXRpLCBwaG9uZUVsOwogICAgICAgIGlmICh3aW5kb3cuaW50bFRlbElucHV0ID09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBwaG9uZUVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgICAgICAgaWYgKHBob25lRWwgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGl0aSA9IHdpbmRvdy5pbnRsVGVsSW5wdXRHbG9iYWxzLmdldEluc3RhbmNlKHBob25lRWwpOwogICAgICAgIGlmIChpdGkgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpdGk7CiAgICAgIH0sCiAgICAgIGdldElTTzogZnVuY3Rpb24obmV3Q291bnRyeSkgewogICAgICAgIHZhciBtZSwgdXJsOwogICAgICAgIGlmICh3aW5kb3cuaW50bFRlbElucHV0ID09IG51bGwpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdXJsID0gJ2h0dHBzOi8vd3d3LnN0YXJ3aW5kc29mdHdhcmUuY29tL2dlb2lwLWRldGFpbC5qcyc7CiAgICAgICAgbWUgPSB0aGlzOwogICAgICAgICQuYWpheCh7CiAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgIHR5cGU6ICJQT1NUIiwKICAgICAgICAgIGRhdGE6IHsKICAgICAgICAgICAgY291bnRyeTogbmV3Q291bnRyeQogICAgICAgICAgfSwKICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsCiAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICB2YXIgaXRpLCBwaG9uZUNvdW50cnk7CiAgICAgICAgICAgIGlmICgocmVzcG9uc2Uuc3RhdHVzICE9IG51bGwpICYmIHJlc3BvbnNlLnN0YXR1cyA9PT0gdHJ1ZSAmJiAocmVzcG9uc2UudHlwZSAhPSBudWxsKSAmJiAocmVzcG9uc2UudHlwZSA9PT0gJ2NvdW50cnktZGV0YWlsJykpIHsKICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuaXNvQ29kZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBtZS5pc29Db2RlID0gcmVzcG9uc2UuaXNvQ29kZTsKICAgICAgICAgICAgICAgIGl0aSA9IG1lLml0aUluc3RhbmNlKCcjcXVvdGVfcGhvbmUyJyk7CiAgICAgICAgICAgICAgICBpZiAoaXRpID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGhvbmVDb3VudHJ5ID0gbWUuZ2V0Q29va2llVmFsdWUoJ3Bob25lQ291bnRyeScpOwogICAgICAgICAgICAgICAgaWYgKChwaG9uZUNvdW50cnkgIT0gbnVsbCkgJiYgcGhvbmVDb3VudHJ5ICE9PSAnJykgewogICAgICAgICAgICAgICAgICBpdGkuc2V0Q291bnRyeShwaG9uZUNvdW50cnkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaXRpLnNldENvdW50cnkobWUuaXNvQ29kZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0sCiAgICAgIGlzSXRpVmFsaWRQaG9uZTogZnVuY3Rpb24oc2VsZWN0b3IpIHsKICAgICAgICB2YXIgaXRpLCByZXM7CiAgICAgICAgaWYgKHdpbmRvdy5pbnRsVGVsSW5wdXQgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXMgPSBmYWxzZTsKICAgICAgICBpdGkgPSB0aGlzLml0aUluc3RhbmNlKHNlbGVjdG9yKTsKICAgICAgICBpZiAoaXRpID09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKGl0aS5pc1ZhbGlkTnVtYmVyKCkpIHsKICAgICAgICAgIHJlcyA9IHRydWU7CiAgICAgICAgICB0aGlzLnZhbGlkUGhvbmUgPSB0cnVlOwogICAgICAgICAgdGhpcy5waG9uZVN0YW5kYXJ0ID0gaXRpLmdldE51bWJlcihpbnRsVGVsSW5wdXRVdGlscy5udW1iZXJGb3JtYXQuRTE2NCk7CiAgICAgICAgICB0aGlzLnBob25lRXh0ID0gaXRpLmdldEV4dGVuc2lvbigpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnZhbGlkUGhvbmUgPSBmYWxzZTsKICAgICAgICAgIHRoaXMucGhvbmVTdGFuZGFydCA9ICcnOwogICAgICAgICAgdGhpcy5waG9uZUV4dCA9ICcnOwogICAgICAgIH0KICAgICAgICB0aGlzLnBob25lQ291bnRyeSA9IGl0aS5nZXRTZWxlY3RlZENvdW50cnlEYXRhKCkuaXNvMjsKICAgICAgICByZXR1cm4gcmVzOwogICAgICB9LAogICAgICBwb2ludEZvcm1WYWxpZGF0aW9uOiBmdW5jdGlvbihkYXRhLCBzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaykgewogICAgICAgIHZhciBrZXksIHBhcmFtcywgdXJsOwogICAgICAgIHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTsKICAgICAgICBmb3IgKGtleSBpbiBkYXRhKSB7CiAgICAgICAgICBwYXJhbXMuYXBwZW5kKGtleSwgZGF0YVtrZXldKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBheGlvcyA9PT0gInVuZGVmaW5lZCIgfHwgYXhpb3MgPT09IG51bGwpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpLmNsYXNzTGlzdC5hZGQoJ3ByZWxvYWRlcicpOwogICAgICAgIHVybCA9ICcvcG9pbnQtZm9ybS12YWxpZGF0aW9uLmpzJzsKICAgICAgICBheGlvcy5wb3N0KHVybCwgcGFyYW1zKS50aGVuKGZ1bmN0aW9uKGFyZykgewogICAgICAgICAgdmFyIGRhdGE7CiAgICAgICAgICBkYXRhID0gYXJnLmRhdGE7CiAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuY2xhc3NMaXN0LnJlbW92ZSgncHJlbG9hZGVyJyk7CiAgICAgICAgICBpZiAoKGRhdGEuc3VjY2VzcyAhPSBudWxsKSAmJiBkYXRhLnN1Y2Nlc3MpIHsKICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCdvaycpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZmFpbHVyZUNhbGxiYWNrKGRhdGEpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgfSk7Cgp9KS5jYWxsKHRoaXMpOwoKLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVvdGUuanMubWFwCg==
3 ms
javascript;base64,Ly8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjcKKGZ1bmN0aW9uKCkgewogIHZhciBzdHJpcCwgd3JpdGVFcnJvciwKICAgIGluZGV4T2YgPSBbXS5pbmRleE9mIHx8IGZ1bmN0aW9uKGl0ZW0pIHsgZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKykgeyBpZiAoaSBpbiB0aGlzICYmIHRoaXNbaV0gPT09IGl0ZW0pIHJldHVybiBpOyB9IHJldHVybiAtMTsgfTsKCiAgc3RyaXAgPSBmdW5jdGlvbihzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvXHMrL2csICcgJykudHJpbSgpOwogIH07CgogIHdyaXRlRXJyb3IgPSBmdW5jdGlvbihlbCwgbWVzc2FnZSkgewogICAgdmFyIHBhcmVudCwgc3BhbjsKICAgIGlmIChlbCA9PSBudWxsKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHBhcmVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWwpOwogICAgaWYgKHBhcmVudCA9PSBudWxsKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICBzcGFuLmNsYXNzTGlzdC5hZGQoJ2Vycm9yJyk7CiAgICBzcGFuLmlubmVySFRNTCA9IG1lc3NhZ2U7CiAgICBwYXJlbnQuYWZ0ZXIoc3Bhbik7CiAgfTsKCiAgbmV3IFZ1ZSh7CiAgICBlbDogJyNyZXF1ZXN0X2xpdmVfZGVtb19mb3JtJywKICAgIGRhdGE6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gewogICAgICAgIG1vZGVsOiB7fSwKICAgICAgICBmaXJzdG5hbWU6ICcnLAogICAgICAgIGxhc3RuYW1lOiAnJywKICAgICAgICBlbWFpbDogJycsCiAgICAgICAgdGl0bGU6ICcnLAogICAgICAgIGNvbXBhbnk6ICcnLAogICAgICAgIGNvdW50cnk6ICcnLAogICAgICAgIHBob25lMjogJycsCiAgICAgICAgcHJvZHVjdDogJycsCiAgICAgICAgY29tbWVudHM6ICcnLAogICAgICAgIGNoZWNrOiBmYWxzZSwKICAgICAgICBwbm9uZVN0YW5kYXJ0OiAnJywKICAgICAgICBwaG9uZUV4dDogJycsCiAgICAgICAgaXNvQ29kZTogJycsCiAgICAgICAgcGhvbmVWZXJzaW9uOiAnJywKICAgICAgICB2YWxpZFBob25lOiBmYWxzZSwKICAgICAgICBmb3JtVHlwZTogJ2RlbW8nLAogICAgICAgIHBob25lQ291bnRyeTogJycsCiAgICAgICAgbGFuZ3VhZ2U6ICdlbicsCiAgICAgICAgZXJyb3JzOiB7CiAgICAgICAgICBmaXJzdG5hbWU6IFtdLAogICAgICAgICAgbGFzdG5hbWU6IFtdLAogICAgICAgICAgY29tcGFueTogW10sCiAgICAgICAgICBlbWFpbDogW10sCiAgICAgICAgICB0aXRsZTogW10sCiAgICAgICAgICBwaG9uZTogW10sCiAgICAgICAgICBjb3VudHJ5OiBbXQogICAgICAgIH0sCiAgICAgICAgZXJyb3JzMjoge30sCiAgICAgICAgaXRpTnVtYmVyRXJyb3I6IGZhbHNlLAogICAgICAgIHByaXZhY3lQb2xpY3lFcnJvcjogZmFsc2UsCiAgICAgICAgYmVmb3JlVXBkYXRlQ291bnRlcjogMAogICAgICB9OwogICAgfSwKICAgIGNvbXB1dGVkOiB7CiAgICAgIGlzRXVyb1pvbmU6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciByZWY7CiAgICAgICAgaWYgKHdpbmRvdy5ldXJvcGVfem9uZV9jb3VudHJ5ID09IG51bGwpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoKHJlZiA9IHRoaXMuY291bnRyeSwgaW5kZXhPZi5jYWxsKHdpbmRvdy5ldXJvcGVfem9uZV9jb3VudHJ5LCByZWYpID49IDApKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSwKICAgICAgRmlyc3RuYW1lRXJyb3JDbGFzczogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHJlczsKICAgICAgICByZXMgPSBmYWxzZTsKICAgICAgICBpZiAoKHRoaXMuZXJyb3JzMi5maXJzdG5hbWUgIT0gbnVsbCkgfHwgKCh0aGlzLmVycm9yczIubGFzdG5hbWUgIT0gbnVsbCkgJiYgKHRoaXMuZXJyb3JzMi5sYXN0bmFtZVswXSA9PT0gJ2ZpcnN0bmFtZV9sYXN0bmFtZV9tYXRjaCcpKSkgewogICAgICAgICAgcmVzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuZXJyb3JzMi5maXJzdG5hbWUgIT0gbnVsbCkgewogICAgICAgICAgcmVzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKICAgICAgfSwKICAgICAgTGFzdG5hbWVFcnJvckNsYXNzOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgcmVzOwogICAgICAgIHJlcyA9IGZhbHNlOwogICAgICAgIGlmICh0aGlzLmVycm9yczIubGFzdG5hbWUgIT0gbnVsbCkgewogICAgICAgICAgcmVzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKICAgICAgfSwKICAgICAgRW1haWxFcnJvckNsYXNzOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgcmVzOwogICAgICAgIHJlcyA9IGZhbHNlOwogICAgICAgIGlmICh0aGlzLmVycm9yczIuZW1haWwgIT0gbnVsbCkgewogICAgICAgICAgcmVzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKICAgICAgfSwKICAgICAgVGl0bGVFcnJvckNsYXNzOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgcmVzOwogICAgICAgIHJlcyA9IGZhbHNlOwogICAgICAgIGlmICh0aGlzLmVycm9yczIudGl0bGUgIT0gbnVsbCkgewogICAgICAgICAgcmVzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKICAgICAgfSwKICAgICAgQ29tcGFueUVycm9yQ2xhc3M6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciByZXM7CiAgICAgICAgcmVzID0gZmFsc2U7CiAgICAgICAgaWYgKHRoaXMuZXJyb3JzMi5jb21wYW55ICE9IG51bGwpIHsKICAgICAgICAgIHJlcyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXM7CiAgICAgIH0sCiAgICAgIFBob25lRXJyb3JDbGFzczogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHJlczsKICAgICAgICByZXMgPSBmYWxzZTsKICAgICAgICBpZiAodGhpcy5pdGlOdW1iZXJFcnJvcikgewogICAgICAgICAgcmVzID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmVycm9yczIucGhvbmUgIT0gbnVsbCkgewogICAgICAgICAgcmVzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKICAgICAgfQogICAgfSwKICAgIGNyZWF0ZWQ6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgZWxfY29tcGFueSwgZWxfY291bnRyeSwgZWxfZW1haWwsIGVsX2ZpcnN0bmFtZSwgZWxfbGFuZ3VhZ2UsIGVsX2xhc3RuYW1lLCBlbF9waG9uZSwgZWxfcHJvZHVjdCwgZWxfdGl0bGU7CiAgICAgIGVsX3Byb2R1Y3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGl2ZWRlbW9fbGljZW5zZScpOwogICAgICBpZiAoZWxfcHJvZHVjdCAhPSBudWxsKSB7CiAgICAgICAgdGhpcy5wcm9kdWN0ID0gZWxfcHJvZHVjdC52YWx1ZTsKICAgICAgfQogICAgICBlbF9maXJzdG5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGl2ZWRlbW9fZmlyc3RuYW1lJyk7CiAgICAgIGlmIChlbF9maXJzdG5hbWUgIT0gbnVsbCkgewogICAgICAgIHRoaXMuZmlyc3RuYW1lID0gZWxfZmlyc3RuYW1lLnZhbHVlOwogICAgICB9CiAgICAgIGVsX2xhc3RuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpdmVkZW1vX2xhc3RuYW1lJyk7CiAgICAgIGlmIChlbF9sYXN0bmFtZSAhPSBudWxsKSB7CiAgICAgICAgdGhpcy5sYXN0bmFtZSA9IGVsX2xhc3RuYW1lLnZhbHVlOwogICAgICB9CiAgICAgIGVsX2VtYWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpdmVkZW1vX2VtYWlsJyk7CiAgICAgIGlmIChlbF9lbWFpbCAhPSBudWxsKSB7CiAgICAgICAgdGhpcy5lbWFpbCA9IGVsX2VtYWlsLnZhbHVlOwogICAgICB9CiAgICAgIGVsX3RpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpdmVkZW1vX3RpdGxlJyk7CiAgICAgIGlmIChlbF90aXRsZSAhPSBudWxsKSB7CiAgICAgICAgdGhpcy50aXRsZSA9IGVsX3RpdGxlLnZhbHVlOwogICAgICB9CiAgICAgIGVsX2NvbXBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGl2ZWRlbW9fY29tcGFueScpOwogICAgICBpZiAoZWxfY29tcGFueSAhPSBudWxsKSB7CiAgICAgICAgdGhpcy5jb21wYW55ID0gZWxfY29tcGFueS52YWx1ZTsKICAgICAgfQogICAgICBlbF9jb3VudHJ5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpdmVkZW1vX2NvdW50cnknKTsKICAgICAgaWYgKGVsX2NvdW50cnkgIT0gbnVsbCkgewogICAgICAgIHRoaXMuY291bnRyeSA9IGVsX2NvdW50cnkudmFsdWU7CiAgICAgIH0KICAgICAgZWxfcGhvbmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGl2ZWRlbW9fcGhvbmUyJyk7CiAgICAgIGlmIChlbF9waG9uZSAhPSBudWxsKSB7CiAgICAgICAgdGhpcy5waG9uZTIgPSBlbF9waG9uZS52YWx1ZTsKICAgICAgfQogICAgICBlbF9sYW5ndWFnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkZW1vX2xhbmd1YWdlIik7CiAgICAgIGlmIChlbF9sYW5ndWFnZSAhPSBudWxsKSB7CiAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGVsX2xhbmd1YWdlLnZhbHVlOwogICAgICB9CiAgICB9LAogICAgbW91bnRlZDogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBjb3VudHJ5X2VsZW1lbnQsIHByb2R1Y3RfZWxlbWVudDsKICAgICAgcHJvZHVjdF9lbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpdmVkZW1vX2xpY2Vuc2UnKTsKICAgICAgaWYgKHByb2R1Y3RfZWxlbWVudCAhPSBudWxsKSB7CiAgICAgICAgaWYgKHByb2R1Y3RfZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3Z1ZS0yMDIzJykgfHwgcHJvZHVjdF9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygndnVlJykpIHsKICAgICAgICAgIHN3X2Nob2ljZXM1ID0gbmV3IENob2ljZXMocHJvZHVjdF9lbGVtZW50LCB7CiAgICAgICAgICAgIC8vIHNob3VsZFNvcnQ6IGZhbHNlLAogICAgICAgICAgICBzZWFyY2hFbmFibGVkOiBmYWxzZSwKICAgICAgICAgICAgc2VhcmNoQ2hvaWNlczogZmFsc2UsCiAgICAgICAgICAgIHNob3VsZFNvcnQ6IGZhbHNlLAogICAgICAgICAgICBpdGVtU2VsZWN0VGV4dDogJycKICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY291bnRyeV9lbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpdmVkZW1vX2NvdW50cnknKTsKICAgICAgaWYgKGNvdW50cnlfZWxlbWVudCAhPSBudWxsKSB7CiAgICAgICAgaWYgKGNvdW50cnlfZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3Z1ZS0yMDIzJykgfHwgY291bnRyeV9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygndnVlJykpIHsKICAgICAgICAgIHN3X2Nob2ljZXM2ID0gbmV3IENob2ljZXMoY291bnRyeV9lbGVtZW50LCB7CiAgICAgICAgICAgIC8vIHNob3VsZFNvcnQ6IGZhbHNlLAogICAgICAgICAgICBzZWFyY2hFbmFibGVkOiBmYWxzZSwKICAgICAgICAgICAgc2VhcmNoQ2hvaWNlczogZmFsc2UsCiAgICAgICAgICAgIHNob3VsZFNvcnQ6IGZhbHNlLAogICAgICAgICAgICBpdGVtU2VsZWN0VGV4dDogJycKICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5pdGlQaG9uZUluaXQoJyNsaXZlZGVtb19waG9uZTInKTsKICAgIH0sCiAgICBiZWZvcmVVcGRhdGU6IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnNldENsZWFuUGhvbmVNb2RlbCgpOwogICAgfSwKICAgIHdhdGNoOiB7CiAgICAgIGNvdW50cnk6IGZ1bmN0aW9uKG5ld0NvdW50cnksIG9sZENvdW50cnkpIHsKICAgICAgICB0aGlzLmdldElTTyhuZXdDb3VudHJ5LCBvbGRDb3VudHJ5KTsKICAgICAgfQogICAgfSwKICAgIG1ldGhvZHM6IHsKICAgICAgc2V0Q2xlYW5QaG9uZU1vZGVsOiBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgdmFyIGNvdW50cnlEYXRhLCBpdGksIG51bWJlciwgbnVtYmVySSwgcGhvbmVFbDsKICAgICAgICBpZiAoKGludGxUZWxJbnB1dFV0aWxzLm51bWJlckZvcm1hdCAhPSBudWxsKSAmJiAodGhpcy5iZWZvcmVVcGRhdGVDb3VudGVyID09PSAwKSkgewogICAgICAgICAgcGhvbmVFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNsaXZlZGVtb19waG9uZTInKTsKICAgICAgICAgIGl0aSA9IHdpbmRvdy5pbnRsVGVsSW5wdXRHbG9iYWxzLmdldEluc3RhbmNlKHBob25lRWwpOwogICAgICAgICAgbnVtYmVyID0gaXRpLmdldE51bWJlcihpbnRsVGVsSW5wdXRVdGlscy5udW1iZXJGb3JtYXQuTkFUSU9OQUwpOwogICAgICAgICAgY291bnRyeURhdGEgPSBpdGkuZ2V0U2VsZWN0ZWRDb3VudHJ5RGF0YSgpOwogICAgICAgICAgbnVtYmVySSA9IGl0aS5nZXROdW1iZXIoaW50bFRlbElucHV0VXRpbHMubnVtYmVyRm9ybWF0LklOVEVSTkFUSU9OQUwpOwogICAgICAgICAgbnVtYmVySSA9IG51bWJlckkucmVwbGFjZSgnKycsICcnKTsKICAgICAgICAgIGlmICgoY291bnRyeURhdGEgIT0gbnVsbCkgJiYgKHR5cGVvZiBjb3VudHJ5RGF0YSA9PT0gJ29iamVjdCcpICYmIChjb3VudHJ5RGF0YS5kaWFsQ29kZSAhPSBudWxsKSkgewogICAgICAgICAgICBudW1iZXJJID0gbnVtYmVySS5yZXBsYWNlKGNvdW50cnlEYXRhLmRpYWxDb2RlLCAnJyk7CiAgICAgICAgICAgIHRoaXMucGhvbmUyID0gbnVtYmVySTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMucGhvbmUyID0gbnVtYmVyOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5iZWZvcmVVcGRhdGVDb3VudGVyICs9IDE7CiAgICAgICAgfQogICAgICB9LAogICAgICBnZXRDb29raWVWYWx1ZTogZnVuY3Rpb24obmFtZSkgewogICAgICAgIHZhciByZWY7CiAgICAgICAgcmV0dXJuICgocmVmID0gZG9jdW1lbnQuY29va2llLm1hdGNoKCcoXnw7KVxccyonICsgbmFtZSArICdcXHMqPVxccyooW147XSspJykpICE9IG51bGwgPyByZWYucG9wKCkgOiB2b2lkIDApIHx8ICcnOwogICAgICB9LAogICAgICBmdW5jX25vX3ZhbGlkOiBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgdmFyIGQ7CiAgICAgICAgZCA9IGRhdGE7CiAgICAgICAgZC5mcm9tX3VybCA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7CiAgICAgICAgaWYgKCFqUXVlcnkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJC5wb3N0KCIvbm90LXZhbGlkLWRhdGEtdjIwLmpzIiwgZCk7CiAgICAgIH0sCiAgICAgIHZhbGlkRW1haWxfZGVtbzogZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIGlmICh3aW5kb3cuc3VjY2Vzc0Zvcm1TdWJtaXQgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkLmFqYXgoewogICAgICAgICAgdXJsOiAnL3ZhbGlkZW1haWwuanMnLAogICAgICAgICAgdHlwZTogIlBPU1QiLAogICAgICAgICAgZGF0YTogewogICAgICAgICAgICBlbWFpbDogb3B0aW9ucy5lbWFpbAogICAgICAgICAgfSwKICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgIHZhciBvYmo7CiAgICAgICAgICAgIG9iaiA9IHt9OwogICAgICAgICAgICBvYmouY2F0ZWdvcnkgPSAnJzsKICAgICAgICAgICAgb2JqLmNhdGVnb3J5ID0gb3B0aW9ucy5saWNlbnNlOwogICAgICAgICAgICBvcHRpb25zLnZhbGlkID0gcmVzcG9uc2UuZW1haWxTdGF0dXM7CiAgICAgICAgICAgIG9wdGlvbnMudXNlciA9IHJlc3BvbnNlLmNpZDsKICAgICAgICAgICAgb3B0aW9ucy5jYXRlZ29yeSA9IG9iai5jYXRlZ29yeTsKICAgICAgICAgICAgd2luZG93LnN1Y2Nlc3NGb3JtU3VibWl0KG9wdGlvbnMpOwogICAgICAgICAgfSwKICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicKICAgICAgICB9KTsKICAgICAgfSwKICAgICAgc2V0TW9kZWw6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2YWxpZENoYXJhY3RlcnNSZWdleHA7CiAgICAgICAgdGhpcy5tb2RlbCA9IHsKICAgICAgICAgIGZpcnN0bmFtZTogdGhpcy5maXJzdG5hbWUsCiAgICAgICAgICBsYXN0bmFtZTogdGhpcy5sYXN0bmFtZSwKICAgICAgICAgIGNvbXBhbnk6IHRoaXMuY29tcGFueSwKICAgICAgICAgIGVtYWlsOiB0aGlzLmVtYWlsLAogICAgICAgICAgY291bnRyeTogdGhpcy5jb3VudHJ5LAogICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsCiAgICAgICAgICBwaG9uZTI6IHRoaXMucGhvbmUyLAogICAgICAgICAgcHJvZHVjdDogdGhpcy5wcm9kdWN0LAogICAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZiwKICAgICAgICAgIHBob25lRXh0OiB0aGlzLnBob25lRXh0LAogICAgICAgICAgcGhvbmVTdGFuZGFydDogdGhpcy5waG9uZVN0YW5kYXJ0LAogICAgICAgICAgcGhvbmVWZXJzaW9uOiB0aGlzLnBob25lVmVyc2lvbiwKICAgICAgICAgIHZhbGlkUGhvbmU6IHRoaXMudmFsaWRQaG9uZSwKICAgICAgICAgIGZvcm1UeXBlOiB0aGlzLmZvcm1UeXBlLAogICAgICAgICAgcGhvbmVDb3VudHJ5OiB0aGlzLnBob25lQ291bnRyeSwKICAgICAgICAgIGNvbW1lbnRzOiB0aGlzLmNvbW1lbnRzLAogICAgICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ3VhZ2UKICAgICAgICB9OwogICAgICAgIGlmICh0aGlzLm1vZGVsLnByb2R1Y3QgPT09ICdIQ0EgZm9yIFZpZGVvIFN1cnZlaWxsYW5jZScpIHsKICAgICAgICAgIHRoaXMubW9kZWwucHJvZHVjdCA9ICdTdGFyV2luZCBIeXBlckNvbnZlcmdlZCBBcHBsaWFuY2UnOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5sYW5ndWFnZSA9PT0gJ2ZyJykgewogICAgICAgICAgdmFsaWRDaGFyYWN0ZXJzUmVnZXhwID0gL15bYS16w6DDosOnw6nDqMOqw6vDrsOvw7TDu8O5w7zDv8Oxw6bFkyAuJy1dKiQvaTsKICAgICAgICAgIHRoaXMubW9kZWwuZmlyc3RuYW1lX2ZyID0gdmFsaWRDaGFyYWN0ZXJzUmVnZXhwLnRlc3QodGhpcy5maXJzdG5hbWUpOwogICAgICAgICAgdGhpcy5tb2RlbC5sYXN0bmFtZV9mciA9IHZhbGlkQ2hhcmFjdGVyc1JlZ2V4cC50ZXN0KHRoaXMubGFzdG5hbWUpOwogICAgICAgICAgdGhpcy5tb2RlbC50aXRsZV9mciA9IHZhbGlkQ2hhcmFjdGVyc1JlZ2V4cC50ZXN0KHRoaXMudGl0bGUpOwogICAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuY29tcGFueV9mciA9IHZhbGlkQ2hhcmFjdGVyc1JlZ2V4cC50ZXN0KHRoaXMuY29tcGFueSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBpdGlQaG9uZUVycm9yOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZWw7CiAgICAgICAgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGhvbmVfMjAyM19xdW90ZScpOwogICAgICAgIGlmIChlbCA9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2ZpZWxkLWVycm9yJyk7CiAgICAgICAgaWYgKCF0aGlzLml0aU51bWJlckVycm9yKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9LAogICAgICBlcnJvclByaW9yaXR5OiBmdW5jdGlvbihlcnJvcikgewogICAgICAgIHZhciByZXM7CiAgICAgICAgcmVzID0gMDsKICAgICAgICBzd2l0Y2ggKGVycm9yKSB7CiAgICAgICAgICBjYXNlICd2YWxpZGF0ZV9yZXF1aXJlZCc6CiAgICAgICAgICAgIHJlcyA9IDA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnZmFrZV93b3Jkcyc6CiAgICAgICAgICAgIHJlcyA9IDQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnbGF0aW5fYW5kX3doaXRlc3BhY2UnOgogICAgICAgICAgICByZXMgPSA1OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJlcyA9IDEwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzOwogICAgICB9LAogICAgICBzb3J0RXJyb3JzOiBmdW5jdGlvbihlcnJvcnMpIHsKICAgICAgICB2YXIga2V5LCBtZSwgb2JqLCByZXNPYmosIHNvcnRGdW5jOwogICAgICAgIG9iaiA9IHt9OwogICAgICAgIG1lID0gdGhpczsKICAgICAgICBmb3IgKGtleSBpbiBlcnJvcnMpIHsKICAgICAgICAgIGlmIChrZXkgPT09ICdsZW5ndGgnKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXJyb3JzW2tleV0pKSB7CiAgICAgICAgICAgIGVycm9yc1trZXldLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkgewogICAgICAgICAgICAgIHZhciBwcmlvcml0eTsKICAgICAgICAgICAgICBwcmlvcml0eSA9IG1lLmVycm9yUHJpb3JpdHkoZWxlbWVudCk7CiAgICAgICAgICAgICAgaWYgKG9ialtrZXldICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmpba2V5XS5wdXNoKHsKICAgICAgICAgICAgICAgICAgJ3J1bGUnOiBlbGVtZW50LAogICAgICAgICAgICAgICAgICAncHJpb3JpdHknOiBwcmlvcml0eQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmpba2V5XSA9IFsKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICdydWxlJzogZWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAncHJpb3JpdHknOiBwcmlvcml0eQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNvcnRGdW5jID0gZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgdmFyIHJlczsKICAgICAgICAgIHJlcyA9ICgrYS5wcmlvcml0eSkgLSAoK2IucHJpb3JpdHkpOwogICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICB9OwogICAgICAgIGZvciAoa2V5IGluIG9iaikgewogICAgICAgICAgb2JqW2tleV0uc29ydChzb3J0RnVuYyk7CiAgICAgICAgfQogICAgICAgIHJlc09iaiA9IHsKICAgICAgICAgIGxlbmd0aDogMAogICAgICAgIH07CiAgICAgICAgZm9yIChrZXkgaW4gb2JqKSB7CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlcnJvcnNba2V5XSkpIHsKICAgICAgICAgICAgb2JqW2tleV0uZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KSB7CiAgICAgICAgICAgICAgaWYgKHJlc09ialtrZXldICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHJlc09ialtrZXldLnB1c2goZWxlbWVudC5ydWxlKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmVzT2JqW2tleV0gPSBbZWxlbWVudC5ydWxlXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHJlc09iai5sZW5ndGggKz0gMTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXNPYmo7CiAgICAgIH0sCiAgICAgIGZpbHRlckVycm9yczogZnVuY3Rpb24oZXJyb3JzKSB7CiAgICAgICAgdmFyIGtleSwgb2JqOwogICAgICAgIG9iaiA9IHsKICAgICAgICAgIGxlbmd0aDogMAogICAgICAgIH07CiAgICAgICAgZm9yIChrZXkgaW4gZXJyb3JzKSB7CiAgICAgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIG9ialtrZXldID0gW2Vycm9yc1trZXldWzBdXTsKICAgICAgICAgIG9iai5sZW5ndGggKz0gMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG9iajsKICAgICAgfSwKICAgICAgY2hlY2tFcnJvcnM6IGZ1bmN0aW9uKHJlcykgewogICAgICAgIHZhciBlcnJvcnMsIGtleTsKICAgICAgICBlcnJvcnMgPSB7CiAgICAgICAgICBsZW5ndGg6IDAKICAgICAgICB9OwogICAgICAgIGZvciAoa2V5IGluIHJlcy5kYXRhKSB7CiAgICAgICAgICBpZiAoKGVycm9yc1tyZXMuZGF0YVtrZXldWydmaWVsZCddXSAhPSBudWxsKSkgewogICAgICAgICAgICBlcnJvcnNbcmVzLmRhdGFba2V5XVsnZmllbGQnXV0ucHVzaChyZXMuZGF0YVtrZXldWydydWxlJ10pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZXJyb3JzW3Jlcy5kYXRhW2tleV1bJ2ZpZWxkJ11dID0gW3Jlcy5kYXRhW2tleV1bJ3J1bGUnXV07CiAgICAgICAgICB9CiAgICAgICAgICBlcnJvcnMubGVuZ3RoICs9IDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiBlcnJvcnM7CiAgICAgIH0sCiAgICAgIGNoZWNrUmVxdWVzdDogZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgdmFyIGVsLCBlcnJvcnMsIGssIGtleSwgbXlDaGVjaywgcGhvbmVfbnVtYmVyX2ZsYWcsIHByZWZpeCwgdmFsaWRlX21lc3NhZ2U7CiAgICAgICAgbXlDaGVjayA9IHRoaXMuY2hlY2tFcnJvcnMocmVzKTsKICAgICAgICBteUNoZWNrID0gdGhpcy5zb3J0RXJyb3JzKG15Q2hlY2spOwogICAgICAgIG15Q2hlY2sgPSB0aGlzLmZpbHRlckVycm9ycyhteUNoZWNrKTsKICAgICAgICBlcnJvcnMgPSB7CiAgICAgICAgICBsZW5ndGg6IDAKICAgICAgICB9OwogICAgICAgIGVycm9ycyA9IG15Q2hlY2s7CiAgICAgICAgdGhpcy5lcnJvcnMyID0gZXJyb3JzOwogICAgICAgICQoJyNyZXF1ZXN0X2xpdmVfZGVtb19mb3JtIHNwYW4uZXJyb3InKS5yZW1vdmUoKTsKICAgICAgICBlbCA9ICcjcmVxdWVzdF9saXZlX2RlbW9fZm9ybSc7CiAgICAgICAgcHJlZml4ID0gJyNsaXZlZGVtb18nOwogICAgICAgIHZhbGlkZV9tZXNzYWdlID0ge307CiAgICAgICAgdmFsaWRlX21lc3NhZ2VbJ2VuJ10gPSB7CiAgICAgICAgICAndmFsaWRhdGVfcmVxdWlyZWQnOiB7CiAgICAgICAgICAgICdmaXJzdG5hbWUnOiAnRmlyc3QgbmFtZSBpcyByZXF1aXJlZCcsCiAgICAgICAgICAgICdsYXN0bmFtZSc6ICdMYXN0IG5hbWUgaXMgcmVxdWlyZWQnLAogICAgICAgICAgICAnZW1haWwnOiAnQ29ycG9yYXRlIGVtYWlsIGlzIHJlcXVpcmVkJywKICAgICAgICAgICAgJ2NvbXBhbnknOiAnQ29tcGFueSBuYW1lIGlzIHJlcXVpcmVkJywKICAgICAgICAgICAgJ3RpdGxlJzogJ0pvYiB0aXRsZSBpcyByZXF1aXJlZCcsCiAgICAgICAgICAgICdwaG9uZSc6ICdQaG9uZSBudW1iZXIgaXMgcmVxdWlyZWQnLAogICAgICAgICAgICAnY291bnRyeSc6ICdDb3VudHJ5IG5hbWUgaXMgcmVxdWlyZWQnCiAgICAgICAgICB9LAogICAgICAgICAgJ3R3b19sYXRpbl9hbmRfd2hpdGVzcGFjZSc6ICdPbmx5IExhdGluIGNoYXJhY3RlcnMgYXJlIGFsbG93ZWQnLAogICAgICAgICAgJ2ZpcnN0bmFtZV9sYXN0bmFtZV9tYXRjaCc6ICdGaXJzdCBuYW1lIGFuZCBMYXN0IG5hbWUgY2Fubm90IGJlIGlkZW50aWNhbCcsCiAgICAgICAgICAnbGF0aW5fYW5kX3doaXRlc3BhY2UnOiAnT25seSBMYXRpbiBjaGFyYWN0ZXJzIGFyZSBhbGxvd2VkJywKICAgICAgICAgICdwdWJsaWNfZW1haWwnOiAn0KFvbXBhbnktYWZmaWxpYXRlZCBlbWFpbCBhZGRyZXNzIGlzIHJlcXVpcmVkLiBJZiB5b3UgZG8gbm90IGhhdmUgb25lLCByZWFjaCBvdXQgdG8gPGEgaHJlZj0ibWFpbHRvOnNhbGVzQHN0YXJ3aW5kLmNvbSI+c2FsZXNAc3RhcndpbmQuY29tPC9hPiBmb3IgaGVscC4nLAogICAgICAgICAgJ2Nob29zZV9saWNlbnNlX3ZhbHVlJzogJ1BsZWFzZSwgY2hvb3NlIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnMnLAogICAgICAgICAgJ3JlcGVhdF9zeW1ib2xzJzogJ0ludmFsaWQgbmFtZSBmb3JtYXQnLAogICAgICAgICAgJ25vdF92YWxpZF9waG9uZV9mb3JtYXQnOiAnSW52YWxpZCBwaG9uZSBudW1iZXIgZm9ybWF0JywKICAgICAgICAgICd2YWxpZGF0ZV92YWxpZF9lbWFpbCc6ICdJbnZhbGlkIGVtYWlsIGZvcm1hdCcsCiAgICAgICAgICAnZmFrZV93b3Jkcyc6IHsKICAgICAgICAgICAgJ2ZpcnN0bmFtZSc6ICdJbnZhbGlkIG5hbWUgZm9ybWF0JywKICAgICAgICAgICAgJ2xhc3RuYW1lJzogJ0ludmFsaWQgbmFtZSBmb3JtYXQnLAogICAgICAgICAgICAndGl0bGUnOiAnSW52YWxpZCBqb2IgdGl0bGUgZm9ybWF0JwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFsaWRlX21lc3NhZ2VbJ2ZyJ10gPSB7CiAgICAgICAgICAndmFsaWRhdGVfcmVxdWlyZWQnOiB7CiAgICAgICAgICAgICdmaXJzdG5hbWUnOiAnTGUgcHLDqW5vbSBlc3QgcmVxdWlzJywKICAgICAgICAgICAgJ2xhc3RuYW1lJzogJ0xlIG5vbSBlc3QgcmVxdWlzJywKICAgICAgICAgICAgJ2VtYWlsJzogJ1VuZSBhZHJlc3NlIGUtbWFpbCBkXCdlbnRyZXByaXNlIGVzdCByZXF1aXNlJywKICAgICAgICAgICAgJ2NvbXBhbnknOiAnTGUgbm9tIGRlIGxcJ2VudHJlcHJpc2UgZXN0IHJlcXVpcycsCiAgICAgICAgICAgICd0aXRsZSc6ICdMZSB0aXRyZSBkZSBwb3N0ZSBlc3QgcmVxdWlzJywKICAgICAgICAgICAgJ3Bob25lJzogJ0xlIG51bcOpcm8gZGUgdMOpbMOpcGhvbmUgZXN0IHJlcXVpcycsCiAgICAgICAgICAgICdjb3VudHJ5JzogJ0xlIG5vbSBkdSBwYXlzIGVzdCByZXF1aXMnCiAgICAgICAgICB9LAogICAgICAgICAgJ3R3b19sYXRpbl9hbmRfd2hpdGVzcGFjZSc6ICdTZXVscyBsZXMgY2FyYWN0w6hyZXMgbGF0aW5zIHNvbnQgYXV0b3Jpc8OpcycsCiAgICAgICAgICAnZmlyc3RuYW1lX2xhc3RuYW1lX21hdGNoJzogJ0xlIHByw6lub20gZXQgbGUgbm9tIGRlIGZhbWlsbGUgbmUgcGV1dmVudCBwYXMgw6p0cmUgaWRlbnRpcXVlcycsCiAgICAgICAgICAnbGF0aW5fYW5kX3doaXRlc3BhY2UnOiAnU2V1bHMgbGVzIGNhcmFjdMOocmVzIGxhdGlucyBzb250IGF1dG9yaXPDqXMnLAogICAgICAgICAgJ3B1YmxpY19lbWFpbCc6ICdTaSB1bmUgYWRyZXNzZSBlLW1haWwgZ3JhdHVpdGUgb3UgcHVibGlxdWUgZXN0IGZvdXJuaWU6IFVuZSBhZHJlc3NlIGUtbWFpbCBhZmZpbGnDqWUgw6AgbFwnZW50cmVwcmlzZSBlc3QgcmVxdWlzZS4gU2kgdm91cyBuXCdlbiBhdmV6IHBhcywgY29udGFjdGV6IDxhIGhyZWY9Im1haWx0bzpzYWxlc0BzdGFyd2luZC5jb20iPnNhbGVzQHN0YXJ3aW5kLmNvbTwvYT4gcG91ciBvYnRlbmlyIGRlIGxcJ2FpZGUnLAogICAgICAgICAgJ2Nob29zZV9saWNlbnNlX3ZhbHVlJzogJ1PDqWxlY3Rpb25uZXogdW4gY2FzIGRcJ3V0aWxpc2F0aW9uJywKICAgICAgICAgICdyZXBlYXRfc3ltYm9scyc6ICdGb3JtYXQgZGUgbm9tIGludmFsaWRlJywKICAgICAgICAgICdub3RfdmFsaWRfcGhvbmVfZm9ybWF0JzogJ0Zvcm1hdCBkZSBudW3DqXJvIGRlIHTDqWzDqXBob25lIGludmFsaWRlJywKICAgICAgICAgICd2YWxpZGF0ZV92YWxpZF9lbWFpbCc6ICdVbmUgYWRyZXNzZSBlLW1haWwgZFwnZW50cmVwcmlzZSBlc3QgcmVxdWlzZScsCiAgICAgICAgICAnZmFrZV93b3Jkcyc6IHsKICAgICAgICAgICAgJ2ZpcnN0bmFtZSc6ICdGb3JtYXQgZGUgbm9tIGludmFsaWRlJywKICAgICAgICAgICAgJ2xhc3RuYW1lJzogJ0Zvcm1hdCBkZSBub20gaW52YWxpZGUnLAogICAgICAgICAgICAndGl0bGUnOiAnRm9ybWF0IGRlIG5vbSBkXCdlbnRyZXByaXNlIGludmFsaWRlJwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgaWYgKChlcnJvcnMubGVuZ3RoICE9IG51bGwpICYmIGVycm9ycy5sZW5ndGggIT09IDApIHsKICAgICAgICAgIHBob25lX251bWJlcl9mbGFnID0gMDsKICAgICAgICAgIGZvciAoa2V5IGluIGVycm9ycykgewogICAgICAgICAgICBpZiAoa2V5ICE9PSAnbGVuZ3RoJykgewogICAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7CiAgICAgICAgICAgICAgICBjYXNlICdwcm9kdWN0JzoKICAgICAgICAgICAgICAgIGNhc2UgJ2NvdW50cnknOgogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgIGZvciAoayBpbiBlcnJvcnNba2V5XSkgewogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZXJyb3JzW2tleV1ba10pIHsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZhbGlkYXRlX3JlcXVpcmVkJzoKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2tleScsIGtleSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZmlyc3RuYW1lJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRXJyb3IoKGVsICsgIiAiICsgcHJlZml4KSArIGtleSwgdmFsaWRlX21lc3NhZ2VbdGhpcy5sYW5ndWFnZV1bJ3ZhbGlkYXRlX3JlcXVpcmVkJ11bJ2ZpcnN0bmFtZSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xhc3RuYW1lJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRXJyb3IoKGVsICsgIiAiICsgcHJlZml4KSArIGtleSwgdmFsaWRlX21lc3NhZ2VbdGhpcy5sYW5ndWFnZV1bJ3ZhbGlkYXRlX3JlcXVpcmVkJ11bJ2xhc3RuYW1lJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW1haWwnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVFcnJvcigoZWwgKyAiICIgKyBwcmVmaXgpICsga2V5LCB2YWxpZGVfbWVzc2FnZVt0aGlzLmxhbmd1YWdlXVsndmFsaWRhdGVfcmVxdWlyZWQnXVsnZW1haWwnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21wYW55JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRXJyb3IoKGVsICsgIiAiICsgcHJlZml4KSArIGtleSwgdmFsaWRlX21lc3NhZ2VbdGhpcy5sYW5ndWFnZV1bJ3ZhbGlkYXRlX3JlcXVpcmVkJ11bJ2NvbXBhbnknXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0aXRsZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUVycm9yKChlbCArICIgIiArIHByZWZpeCkgKyBrZXksIHZhbGlkZV9tZXNzYWdlW3RoaXMubGFuZ3VhZ2VdWyd2YWxpZGF0ZV9yZXF1aXJlZCddWyd0aXRsZSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Bob25lMic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncGhvbmUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVFcnJvcihlbCArICIgI2xpdmVkZW1vX3Bob25lMiIsIHZhbGlkZV9tZXNzYWdlW3RoaXMubGFuZ3VhZ2VdWyd2YWxpZGF0ZV9yZXF1aXJlZCddWydwaG9uZSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvdW50cnknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVFcnJvcigoZWwgKyAiICIgKyBwcmVmaXgpICsga2V5LCB2YWxpZGVfbWVzc2FnZVt0aGlzLmxhbmd1YWdlXVsndmFsaWRhdGVfcmVxdWlyZWQnXVsnY291bnRyeSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgY2FzZSAndHdvX2xhdGluX2FuZF93aGl0ZXNwYWNlJzoKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVFcnJvcigoZWwgKyAiICIgKyBwcmVmaXgpICsga2V5LCB2YWxpZGVfbWVzc2FnZVt0aGlzLmxhbmd1YWdlXVsndHdvX2xhdGluX2FuZF93aGl0ZXNwYWNlJ10pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2ZpcnN0bmFtZV9sYXN0bmFtZV9tYXRjaCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRXJyb3IoKGVsICsgIiAiICsgcHJlZml4KSArIGtleSwgdmFsaWRlX21lc3NhZ2VbdGhpcy5sYW5ndWFnZV1bJ2ZpcnN0bmFtZV9sYXN0bmFtZV9tYXRjaCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsYXRpbl9hbmRfd2hpdGVzcGFjZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRXJyb3IoKGVsICsgIiAiICsgcHJlZml4KSArIGtleSwgdmFsaWRlX21lc3NhZ2VbdGhpcy5sYW5ndWFnZV1bJ2xhdGluX2FuZF93aGl0ZXNwYWNlJ10pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3B1YmxpY19lbWFpbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRXJyb3IoKGVsICsgIiAiICsgcHJlZml4KSArIGtleSwgdmFsaWRlX21lc3NhZ2VbdGhpcy5sYW5ndWFnZV1bJ3B1YmxpY19lbWFpbCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmYWtlX3dvcmRzJzoKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChrZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmaXJzdG5hbWUnOgogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xhc3RuYW1lJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRXJyb3IoKGVsICsgIiAiICsgcHJlZml4KSArIGtleSwgdmFsaWRlX21lc3NhZ2VbdGhpcy5sYW5ndWFnZV1bJ2Zha2Vfd29yZHMnXVsnZmlyc3RuYW1lJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndGl0bGUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVFcnJvcigoZWwgKyAiICIgKyBwcmVmaXgpICsga2V5LCB2YWxpZGVfbWVzc2FnZVt0aGlzLmxhbmd1YWdlXVsnZmFrZV93b3JkcyddWyd0aXRsZSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2hvb3NlX2xpY2Vuc2VfdmFsdWUnOgogICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUVycm9yKChlbCArICIgIiArIHByZWZpeCkgKyBrZXksIHZhbGlkZV9tZXNzYWdlW3RoaXMubGFuZ3VhZ2VdWydjaG9vc2VfbGljZW5zZV92YWx1ZSddKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyZXBlYXRfc3ltYm9scyc6CiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRXJyb3IoKGVsICsgIiAiICsgcHJlZml4KSArIGtleSwgdmFsaWRlX21lc3NhZ2VbdGhpcy5sYW5ndWFnZV1bJ3JlcGVhdF9zeW1ib2xzJ10pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ25vdF92YWxpZF9waG9uZV9mb3JtYXQnOgogICAgICAgICAgICAgICAgICAgICAgY2FzZSAncGhvbmVfbnVtYmVyJzoKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVFcnJvcihlbCArICIgI2xpdmVkZW1vX3Bob25lMiIsIHZhbGlkZV9tZXNzYWdlW3RoaXMubGFuZ3VhZ2VdWydub3RfdmFsaWRfcGhvbmVfZm9ybWF0J10pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZhbGlkYXRlX3ZhbGlkX2VtYWlsJzoKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVFcnJvcigoZWwgKyAiICIgKyBwcmVmaXgpICsga2V5LCB2YWxpZGVfbWVzc2FnZVt0aGlzLmxhbmd1YWdlXVsndmFsaWRhdGVfdmFsaWRfZW1haWwnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmxhbmd1YWdlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZnInOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVFcnJvcigoZWwgKyAiICIgKyBwcmVmaXgpICsga2V5LCAiQXV0cmVzIGNhcyBwb3VyICIgKyBrZXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRXJyb3IoKGVsICsgIiAiICsgcHJlZml4KSArIGtleSwgIlVua25vd24gZXJyb3IgZm9yICIgKyBrZXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgc3VibWl0Rm9ybTogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB2YXIgY2hlY2tfbWUsIGNoZWNrX21lX2xhYmVsLCBmYWlsdXJlQ2FsbGJhY2ssIG1lLCBzdWNjZXNzQ2FsbGJhY2ssIHVybDsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNoZWNrX21lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpdmVkZW1vX2NoZWNrX21lJyk7CiAgICAgICAgY2hlY2tfbWVfbGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGl2ZWRlbW9fY2hlY2ttYXJrJyk7CiAgICAgICAgaWYgKHRoaXMuaXNFdXJvWm9uZSkgewogICAgICAgICAgaWYgKCFjaGVja19tZS5jaGVja2VkKSB7CiAgICAgICAgICAgIHRoaXMucHJpdmFjeVBvbGljeUVycm9yID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMucHJpdmFjeVBvbGljeUVycm9yID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIWNoZWNrX21lLmNoZWNrZWQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLml0aU51bWJlckVycm9yID0gZmFsc2U7CiAgICAgICAgaWYgKHRoaXMuaXRpSW5zdGFuY2UoJyNsaXZlZGVtb19waG9uZTInKSAhPSBudWxsKSB7CiAgICAgICAgICB0aGlzLmlzSXRpVmFsaWRQaG9uZSgnI2xpdmVkZW1vX3Bob25lMicpOwogICAgICAgIH0KICAgICAgICBtZSA9IHRoaXM7CiAgICAgICAgdGhpcy5zZXRNb2RlbCgpOwogICAgICAgIHN1Y2Nlc3NDYWxsYmFjayA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgIHZhciBvcHRpb25zOwogICAgICAgICAgbWUuY2hlY2tSZXF1ZXN0KGRhdGEpOwogICAgICAgICAgJCgiI3JlcXVlc3RfbGl2ZV9kZW1vX2Zvcm0iKS5oaWRlKCk7CiAgICAgICAgICAkKCcjZGVtby10aGFuay15b3UuZGVtby10aGFuay15b3UnKS5zaG93KCk7CiAgICAgICAgICBjaGVja19tZV9sYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXF1ZXN0X2NoZWNrbWFyaycpOwogICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgb3B0aW9ucy5hY3Rpb24gPSAnUmVxdWVzdCBEZW1vJzsKICAgICAgICAgIG9wdGlvbnMubG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKICAgICAgICAgIG9wdGlvbnMuZW1haWwgPSBtZS5lbWFpbDsKICAgICAgICAgIG9wdGlvbnMubGljZW5zZSA9IG1lLnByb2R1Y3Q7CiAgICAgICAgICBtZS52YWxpZEVtYWlsX2RlbW8ob3B0aW9ucyk7CiAgICAgICAgICAkKCJodG1sIikuYW5pbWF0ZSh7CiAgICAgICAgICAgIHNjcm9sbFRvcDogJCgiI2Zvcm0tc2VjdGlvbiIpLm9mZnNldCgpLnRvcAogICAgICAgICAgfSwgNDAwKTsKICAgICAgICB9OwogICAgICAgIGZhaWx1cmVDYWxsYmFjayA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgIG1lLmNoZWNrUmVxdWVzdChkYXRhKTsKICAgICAgICB9OwogICAgICAgIHRoaXMucG9pbnRGb3JtVmFsaWRhdGlvbih0aGlzLm1vZGVsLCBzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjayk7CiAgICAgICAgcmV0dXJuOwogICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5jbGFzc0xpc3QuYWRkKCdwcmVsb2FkZXInKTsKICAgICAgICB1cmwgPSAnL2Zvcm0tMjg4LXYxNy5qcyc7CiAgICAgICAgJC5hamF4KHsKICAgICAgICAgIHR5cGU6ICdQT1NUJywKICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcKICAgICAgICAgIH0sCiAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAogICAgICAgICAgZGF0YTogdGhpcy5tb2RlbCwKICAgICAgICAgIGNhY2hlOiBmYWxzZSwKICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zOwogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuY2xhc3NMaXN0LnJlbW92ZSgncHJlbG9hZGVyJyk7CiAgICAgICAgICAgIGlmICgocmVzcG9uc2Uuc3VjY2VzcyAhPSBudWxsKSAmJiByZXNwb25zZS5zdWNjZXNzID09PSBmYWxzZSkgewogICAgICAgICAgICAgIG1lLmNoZWNrUmVxdWVzdChyZXNwb25zZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgJCgiI3JlcXVlc3RfbGl2ZV9kZW1vX2Zvcm0iKS5oaWRlKCk7CiAgICAgICAgICAgICAgJCgnI2RlbW8tdGhhbmsteW91LmRlbW8tdGhhbmsteW91Jykuc2hvdygpOwogICAgICAgICAgICAgIGNoZWNrX21lX2xhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlcXVlc3RfY2hlY2ttYXJrJyk7CiAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgIG9wdGlvbnMuYWN0aW9uID0gJ1JlcXVlc3QgRGVtbyc7CiAgICAgICAgICAgICAgb3B0aW9ucy5sb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwogICAgICAgICAgICAgIG9wdGlvbnMuZW1haWwgPSBtZS5lbWFpbDsKICAgICAgICAgICAgICBvcHRpb25zLmxpY2Vuc2UgPSBtZS5wcm9kdWN0OwogICAgICAgICAgICAgIG1lLnZhbGlkRW1haWxfZGVtbyhvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9LAogICAgICBpdGlQaG9uZUluaXQ6IGZ1bmN0aW9uKHNlbGVjdG9yLCB1dGlsc1NjcmlwdCkgewogICAgICAgIHZhciBtZSwgcGhvbmVFbDsKICAgICAgICBpZiAodXRpbHNTY3JpcHQgPT0gbnVsbCkgewogICAgICAgICAgdXRpbHNTY3JpcHQgPSAiaHR0cHM6Ly93d3cuc3RhcndpbmRzb2Z0d2FyZS5jb20vYXNzZXRzL2xpYnJhcmllcy9pbnRsLXRlbC1pbnB1dC0xNy4wLjE5L2J1aWxkL2pzL3V0aWxzLmpzIjsKICAgICAgICB9CiAgICAgICAgbWUgPSB0aGlzOwogICAgICAgIGlmICh3aW5kb3cuaW50bFRlbElucHV0ICE9IG51bGwpIHsKICAgICAgICAgIHBob25lRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICAgICAgIGlmIChwaG9uZUVsICE9IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5waG9uZVZlcnNpb24gPSAndjIwMjMnOwogICAgICAgICAgICByZXR1cm4gd2luZG93LmludGxUZWxJbnB1dChwaG9uZUVsLCB7CiAgICAgICAgICAgICAgdXRpbHNTY3JpcHQ6IHV0aWxzU2NyaXB0LAogICAgICAgICAgICAgIHNlcGFyYXRlRGlhbENvZGU6IHRydWUKICAgICAgICAgICAgfSkucHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHJldHVybiBtZS5zZXRDbGVhblBob25lTW9kZWwoJ2RlbW8gbW91bnRlZCcpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIGl0aUluc3RhbmNlOiBmdW5jdGlvbihzZWxlY3RvcikgewogICAgICAgIHZhciBpdGksIHBob25lRWw7CiAgICAgICAgaWYgKHdpbmRvdy5pbnRsVGVsSW5wdXQgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHBob25lRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICAgICBpZiAocGhvbmVFbCA9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgaXRpID0gd2luZG93LmludGxUZWxJbnB1dEdsb2JhbHMuZ2V0SW5zdGFuY2UocGhvbmVFbCk7CiAgICAgICAgaWYgKGl0aSA9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGl0aTsKICAgICAgfSwKICAgICAgZ2V0SVNPOiBmdW5jdGlvbihuZXdDb3VudHJ5KSB7CiAgICAgICAgdmFyIG1lLCB1cmw7CiAgICAgICAgaWYgKHdpbmRvdy5pbnRsVGVsSW5wdXQgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB1cmwgPSAnaHR0cHM6Ly93d3cuc3RhcndpbmRzb2Z0d2FyZS5jb20vZ2VvaXAtZGV0YWlsLmpzJzsKICAgICAgICBtZSA9IHRoaXM7CiAgICAgICAgJC5hamF4KHsKICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgdHlwZTogIlBPU1QiLAogICAgICAgICAgZGF0YTogewogICAgICAgICAgICBjb3VudHJ5OiBuZXdDb3VudHJ5CiAgICAgICAgICB9LAogICAgICAgICAgZGF0YVR5cGU6ICdqc29uJywKICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgIHZhciBpdGksIHBob25lQ291bnRyeTsKICAgICAgICAgICAgaWYgKChyZXNwb25zZS5zdGF0dXMgIT0gbnVsbCkgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSB0cnVlICYmIChyZXNwb25zZS50eXBlICE9IG51bGwpICYmIChyZXNwb25zZS50eXBlID09PSAnY291bnRyeS1kZXRhaWwnKSkgewogICAgICAgICAgICAgIGlmIChyZXNwb25zZS5pc29Db2RlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIG1lLmlzb0NvZGUgPSByZXNwb25zZS5pc29Db2RlOwogICAgICAgICAgICAgICAgaXRpID0gbWUuaXRpSW5zdGFuY2UoJyNsaXZlZGVtb19waG9uZTInKTsKICAgICAgICAgICAgICAgIGlmIChpdGkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwaG9uZUNvdW50cnkgPSBtZS5nZXRDb29raWVWYWx1ZSgncGhvbmVDb3VudHJ5Jyk7CiAgICAgICAgICAgICAgICBpZiAoKHBob25lQ291bnRyeSAhPSBudWxsKSAmJiBwaG9uZUNvdW50cnkgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgIGl0aS5zZXRDb3VudHJ5KHBob25lQ291bnRyeSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpdGkuc2V0Q291bnRyeShtZS5pc29Db2RlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSwKICAgICAgaXNJdGlWYWxpZFBob25lOiBmdW5jdGlvbihzZWxlY3RvcikgewogICAgICAgIHZhciBpdGksIHJlczsKICAgICAgICBpZiAod2luZG93LmludGxUZWxJbnB1dCA9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJlcyA9IGZhbHNlOwogICAgICAgIGl0aSA9IHRoaXMuaXRpSW5zdGFuY2Uoc2VsZWN0b3IpOwogICAgICAgIGlmIChpdGkgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAoaXRpLmlzVmFsaWROdW1iZXIoKSkgewogICAgICAgICAgcmVzID0gdHJ1ZTsKICAgICAgICAgIHRoaXMudmFsaWRQaG9uZSA9IHRydWU7CiAgICAgICAgICB0aGlzLnBob25lU3RhbmRhcnQgPSBpdGkuZ2V0TnVtYmVyKGludGxUZWxJbnB1dFV0aWxzLm51bWJlckZvcm1hdC5FMTY0KTsKICAgICAgICAgIHRoaXMucGhvbmVFeHQgPSBpdGkuZ2V0RXh0ZW5zaW9uKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMudmFsaWRQaG9uZSA9IGZhbHNlOwogICAgICAgICAgdGhpcy5waG9uZVN0YW5kYXJ0ID0gJyc7CiAgICAgICAgICB0aGlzLnBob25lRXh0ID0gJyc7CiAgICAgICAgfQogICAgICAgIHRoaXMucGhvbmVDb3VudHJ5ID0gaXRpLmdldFNlbGVjdGVkQ291bnRyeURhdGEoKS5pc28yOwogICAgICAgIHJldHVybiByZXM7CiAgICAgIH0sCiAgICAgIHBvaW50Rm9ybVZhbGlkYXRpb246IGZ1bmN0aW9uKGRhdGEsIHN1Y2Nlc3NDYWxsYmFjaywgZmFpbHVyZUNhbGxiYWNrKSB7CiAgICAgICAgdmFyIGtleSwgcGFyYW1zLCB1cmw7CiAgICAgICAgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpOwogICAgICAgIGZvciAoa2V5IGluIGRhdGEpIHsKICAgICAgICAgIHBhcmFtcy5hcHBlbmQoa2V5LCBkYXRhW2tleV0pOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIGF4aW9zID09PSAidW5kZWZpbmVkIiB8fCBheGlvcyA9PT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuY2xhc3NMaXN0LmFkZCgncHJlbG9hZGVyJyk7CiAgICAgICAgdXJsID0gJy9wb2ludC1mb3JtLXZhbGlkYXRpb24uanMnOwogICAgICAgIGF4aW9zLnBvc3QodXJsLCBwYXJhbXMpLnRoZW4oZnVuY3Rpb24oYXJnKSB7CiAgICAgICAgICB2YXIgZGF0YTsKICAgICAgICAgIGRhdGEgPSBhcmcuZGF0YTsKICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5jbGFzc0xpc3QucmVtb3ZlKCdwcmVsb2FkZXInKTsKICAgICAgICAgIGlmICgoZGF0YS5zdWNjZXNzICE9IG51bGwpICYmIGRhdGEuc3VjY2VzcykgewogICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soJ29rJyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmYWlsdXJlQ2FsbGJhY2soZGF0YSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICB9KTsKCn0pLmNhbGwodGhpcyk7CgovLyMgc291cmNlTWFwcGluZ1VSTD1kZW1vLmpzLm1hcAo=
2 ms
polyfill.min.js
935 ms
lozad.min.js
3 ms
otSDKStub.js
35 ms
icon-search.svg
495 ms
star.svg
496 ms
checkmark.svg
495 ms
mp.png
496 ms
vm.png
487 ms
jquery.min.js
164 ms
otSDKStub.js
29 ms
starwindsoftware.com accessibility score
ARIA
These are opportunities to improve the usage of ARIA in your application which may enhance the experience for users of assistive technology, like a screen reader.
Impact
Issue
[aria-*] attributes do not match their roles
ARIA input fields do not have accessible names
Elements with an ARIA [role] that require children to contain a specific [role] are missing some or all of those required children.
[aria-*] attributes do not have valid values
ARIA IDs are not unique
Contrast
These are opportunities to improve the legibility of your content.
Impact
Issue
Background and foreground colors do not have a sufficient contrast ratio.
Navigation
These are opportunities to improve keyboard navigation in your application.
Impact
Issue
[id] attributes on active, focusable elements are not unique
Internationalization and localization
These are opportunities to improve the interpretation of your content by users in different locales.
Impact
Issue
<html> element does not have a [lang] attribute
Names and labels
These are opportunities to improve the semantics of the controls in your application. This may enhance the experience for users of assistive technology, like a screen reader.
Impact
Issue
Links do not have a discernible name
Tables and lists
These are opportunities to improve the experience of reading tabular or list data using assistive technology, like a screen reader.
Impact
Issue
Lists do not contain only <li> elements and script supporting elements (<script> and <template>).
starwindsoftware.com best practices score
Trust and Safety
Impact
Issue
Does not use HTTPS
Ensure CSP is effective against XSS attacks
General
Impact
Issue
Detected JavaScript libraries
Page has valid source maps
starwindsoftware.com SEO score
Content Best Practices
Format your HTML in a way that enables crawlers to better understand your app’s content.
Impact
Issue
Links do not have descriptive text
Crawling and Indexing
To appear in search results, crawlers need access to your app.
Impact
Issue
Links are not crawlable
Mobile Friendly
Make sure your pages are mobile friendly so users don’t have to pinch or zoom in order to read the content pages. [Learn more](https://developers.google.com/search/mobile-sites/).
Impact
Issue
Document uses legible font sizes
Tap targets are not sized appropriately
EN
N/A
UTF-8
Language claimed in HTML meta tag should match the language actually used on the web page. Otherwise Starwindsoftware.com can be misinterpreted by Google and other search engines. Our service has detected that English is used on the page, and neither this language nor any other was claimed in <html> or <meta> tags. Our system also found out that Starwindsoftware.com main page’s claimed encoding is utf-8. Use of this encoding format is the best practice as the main page visitors from all over the world won’t have any issues with symbol transcription.
starwindsoftware.com
Open Graph data is detected on the main page of Star Wind Software. This is the best way to make the web page social media friendly. Here is how it looks like on Facebook: