6.1 sec in total
264 ms
2.7 sec
3.1 sec
Visit starwind.com now to see the best up-to-date Star Wind content for Ukraine and also check out these interesting facts you probably never knew about starwind.com
StarWind delivers Software-Defined Storage solutions, HyperConverged and Storage Appliances designed to build highly resilient IT infrastructures.
Visit starwind.comWe analyzed Starwind.com page load time and found that the first response time was 264 ms and then it took 5.8 sec to load all DOM resources and completely render a web page. This is a poor result, as 75% of websites can load faster.
starwind.com performance score
name
value
score
weighting
Value2.6 s
63/100
10%
Value10.0 s
0/100
25%
Value5.9 s
48/100
10%
Value970 ms
28/100
30%
Value0.091
92/100
15%
Value11.0 s
21/100
10%
264 ms
719 ms
236 ms
419 ms
606 ms
Our browser made a total of 61 requests to load all elements on the main page. We found that 2% of them (1 request) were addressed to the original Starwind.com, 74% (45 requests) were made to Starwindsoftware.com and 7% (4 requests) were made to . The less responsive or slowest element that took the longest time to load (1.2 sec) relates to the external source Starwindsoftware.com.
Page size can be reduced by 466.6 kB (47%)
988.2 kB
521.6 kB
In fact, the total size of Starwind.com main page is 988.2 kB. This result falls beyond the top 1M of websites and identifies a large and not optimized web page that may take ages to load. 75% of websites need less resources to load and that’s why Accessify’s recommendations for optimization and resource minification can be helpful for this project. HTML takes 474.1 kB which makes up the majority of the site volume.
Potential reduce by 386.5 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 67.8 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 386.5 kB or 82% of the original size.
Potential reduce by 73.0 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. Obviously, Star Wind needs image optimization as it can save up to 73.0 kB or 16% of the original volume. The most popular and efficient tools for JPEG and PNG image optimization are Jpegoptim and PNG Crush.
Potential reduce by 1.8 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. It is highly recommended that all JavaScript files should be compressed and minified as it can save up to 1.8 kB or 34% of the original size.
Potential reduce by 5.3 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. Starwind.com has all CSS files already compressed.
Number of requests can be reduced by 23 (50%)
46
23
The browser has sent 46 CSS, Javascripts, AJAX and image requests in order to completely render the main page of Star Wind. We recommend that multiple CSS and JavaScript files should be merged into one by each type, as it can help reduce assets requests from 13 to 1 for JavaScripts and as a result speed up the page load time.
starwind.com
264 ms
www.starwindsoftware.com
719 ms
gtm.js
236 ms
main-full.min.css
419 ms
hpoua-dove.svg
606 ms
logo-with-slogan-white-sw.svg
304 ms
1110x330_Gartner_2021_.svg
917 ms
1110x330_Gartner-stars_2022.svg
574 ms
1110x330_Spiceworks-stars-white.svg
895 ms
1110x330_TrustRadius-stars-white.svg
904 ms
1110x330_quote-Auchan-white.svg
1032 ms
1110x330_quote-Siemens-white.svg
1048 ms
N1.svg
1001 ms
swipe-arrow.svg
886 ms
macbook_vsan2.png
927 ms
hca-front-view2.png
931 ms
logo-gartner.svg
1088 ms
logo_Auchan.webp
1086 ms
logo_Cygnus.webp
937 ms
logo_Siemens.webp
985 ms
logo_Kellstom%20Defense.webp
986 ms
logo_Doublefine.webp
1157 ms
logo_Oxford.webp
986 ms
logo_Eccos.webp
990 ms
logo_UssMidway.webp
1001 ms
libs2.min.js
1000 ms
main-full.js
999 ms
choices.min.js
997 ms
choices.min.css
866 ms
javascript;base64,Ly8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjcKKGZ1bmN0aW9uKCkgewogIHdpbmRvdy5ldXJvcGVfem9uZV9jb3VudHJ5ID0gWydHZXJtYW55JywgJ1VuaXRlZCBLaW5nZG9tJywgJ0ZyYW5jZScsICdJdGFseScsICdTcGFpbicsICdVa3JhaW5lJywgJ1BvbGFuZCcsICdSb21hbmlhJywgJ05ldGhlcmxhbmRzJywgJ0JlbGdpdW0nLCAnQ3plY2ggUmVwdWJsaWMnLCAnR3JlZWNlJywgJ1BvcnR1Z2FsJywgJ1N3ZWRlbicsICdIdW5nYXJ5JywgJ0JlbGFydXMnLCAnQXVzdHJpYScsICdTZXJiaWEnLCAnU3dpdHplcmxhbmQnLCAnQnVsZ2FyaWEnLCAnRGVubWFyaycsICdGaW5sYW5kJywgJ1Nsb3Zha2lhJywgJ05vcndheScsICdJcmVsYW5kJywgJ0Nyb2F0aWEnLCAnTW9sZG92YScsICdCb3NuaWEgYW5kIEhlcnplZ292aW5hJywgJ0FsYmFuaWEnLCAnTGl0aHVhbmlhJywgJ05vcnRoIE1hY2Vkb25pYScsICdTbG92ZW5pYScsICdMYXR2aWEnLCAnRXN0b25pYScsICdNb250ZW5lZ3JvJywgJ0x1eGVtYm91cmcnLCAnTWFsdGEnLCAnSWNlbGFuZCcsICdBbmRvcnJhJywgJ01vbmFjbycsICdMaWVjaHRlbnN0ZWluJywgJ1NhbiBNYXJpbm8nLCAnSG9seSBTZWUnLCAnQ2hhbm5lbCBJc2xhbmRzJywgJ0lzbGUgb2YgTWFuJywgJ0ZhZXJvZSBJc2xhbmRzJywgJ0dpYnJhbHRhciddOwoKfSkuY2FsbCh0aGlzKTsKCi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV1cm9wZV96b25lLmpzLm1hcAo=
11 ms
main-page.js
1207 ms
axios.min.js
863 ms
vue.min.js
914 ms
javascript;base64,Ly8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjcKKGZ1bmN0aW9uKCkgewogIHZhciBzdHJpcDsKCiAgc3RyaXAgPSBmdW5jdGlvbihzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvXHMrL2csICcgJykudHJpbSgpOwogIH07CgogIG5ldyBWdWUoewogICAgZWw6ICcjZG93bmxvYWRfZm9ybScsCiAgICBkYXRhOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBtb2RlbDoge30sCiAgICAgICAgdXJsOiAnJywKICAgICAgICBsaWNlbnNlOiAnJywKICAgICAgICBwcm9kdWN0OiAnJywKICAgICAgICBzdWJfcHJvZHVjdDogJycsCiAgICAgICAgc3ViX3Byb2R1Y3Rfc2FuX25hczogJycsCiAgICAgICAgZmlyc3RuYW1lOiAnJywKICAgICAgICBsYXN0bmFtZTogJycsCiAgICAgICAgY29tcGFueTogJycsCiAgICAgICAgZW1haWw6ICcnLAogICAgICAgIGNvdW50cnk6ICcnLAogICAgICAgIHRpdGxlOiAnJywKICAgICAgICBwaG9uZTogJycsCiAgICAgICAgbnZtZV9ob3N0czogJycsCiAgICAgICAgY2hlY2s6IGZhbHNlLAogICAgICAgIGVycm9yczogewogICAgICAgICAgZmlyc3RuYW1lOiBbXSwKICAgICAgICAgIGxhc3RuYW1lOiBbXSwKICAgICAgICAgIGNvbXBhbnk6IFtdLAogICAgICAgICAgZW1haWw6IFtdLAogICAgICAgICAgdGl0bGU6IFtdLAogICAgICAgICAgcGhvbmU6IFtdLAogICAgICAgICAgY291bnRyeTogW10KICAgICAgICB9LAogICAgICAgIHZhbGlkOiB7CiAgICAgICAgICBjaGVjazogdHJ1ZQogICAgICAgIH0KICAgICAgfTsKICAgIH0sCiAgICBtb3VudGVkOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIG1lLCByZWYsIHJlZjEsIHJlZjEwLCByZWYxMSwgcmVmMTIsIHJlZjIsIHJlZjMsIHJlZjQsIHJlZjUsIHJlZjYsIHJlZjcsIHJlZjgsIHJlZjksIHN3X2Nob2ljZXM3MSwgc3dfY2hvaWNlczcyLCBzd19jaG9pY2VzX3Nhbl9uYXMsIHN3X2VsZW1lbnQ3MCwgc3dfZWxlbWVudDcxLCBzd19lbGVtZW50NzIsIHN3X2VsZW1lbnRfc2FuX25hczsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rvd25sb2FkX2Zvcm0nKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgbWUgPSB0aGlzOwogICAgICBzd19lbGVtZW50NzAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG93bmxvYWRfbGljZW5zZScpOwogICAgICBpZiAoc3dfZWxlbWVudDcwICE9PSBudWxsKSB7CiAgICAgICAgaWYgKHN3X2VsZW1lbnQ3MC5jbGFzc0xpc3QuY29udGFpbnMoJ3Z1ZScpKSB7CiAgICAgICAgICBzd19jaG9pY2VzID0gbmV3IENob2ljZXMoc3dfZWxlbWVudDcwLCB7CiAgICAgICAgICBzaG91bGRTb3J0OiBmYWxzZSwKICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3dfZWxlbWVudDcxID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rvd25sb2FkX3N1Yl9wcm9kdWN0Jyk7CiAgICAgIHN3X2Nob2ljZXM3MSA9IG51bGw7CiAgICAgIGlmIChzd19lbGVtZW50NzEgIT09IG51bGwpIHsKICAgICAgICBzd19jaG9pY2VzNzEgPSBuZXcgQ2hvaWNlcyhzd19lbGVtZW50NzEsIHsKICAgICAgICAgIHNob3VsZFNvcnQ6IGZhbHNlCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgc3dfZWxlbWVudF9zYW5fbmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rvd25sb2FkX3N1Yl9wcm9kdWN0X3Nhbl9uYXMnKTsKICAgICAgc3dfY2hvaWNlc19zYW5fbmFzID0gbnVsbDsKICAgICAgaWYgKHN3X2VsZW1lbnRfc2FuX25hcyAhPT0gbnVsbCkgewogICAgICAgIHN3X2Nob2ljZXNfc2FuX25hcyA9IG5ldyBDaG9pY2VzKHN3X2VsZW1lbnRfc2FuX25hcywgewogICAgICAgICAgc2hvdWxkU29ydDogZmFsc2UKICAgICAgICB9KTsKICAgICAgfQogICAgICBzd19lbGVtZW50NzIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG93bmxvYWRfY291bnRyeScpOwogICAgICBzd19jaG9pY2VzNzIgPSBudWxsOwogICAgICBpZiAoc3dfZWxlbWVudDcyICE9PSBudWxsKSB7CiAgICAgICAgaWYgKHN3X2VsZW1lbnQ3Mi5jbGFzc0xpc3QuY29udGFpbnMoJ3Z1ZScpKSB7CiAgICAgICAgICBzd19jaG9pY2VzMiA9IG5ldyBDaG9pY2VzKHN3X2VsZW1lbnQ3MiwgewogICAgICAgICAgc2hvdWxkU29ydDogZmFsc2UKICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKChyZWYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG93bmxvYWRfcHJvZHVjdF9fc2FuJykpICE9IG51bGwpIHsKICAgICAgICByZWYuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBpZiAobWUucHJvZHVjdCAhPT0gJ3ZpcnR1YWxfc2FuJykgewogICAgICAgICAgICBtZS5wcm9kdWN0ID0gJ3ZpcnR1YWxfc2FuJzsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzd19jaG9pY2VzICE9PSAidW5kZWZpbmVkIiAmJiBzd19jaG9pY2VzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgc3dfY2hvaWNlcy5zZXRDaG9pY2VCeVZhbHVlKCd2aXJ0dWFsX3NhbicpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobWUuc3ViX3Byb2R1Y3QgIT09ICdIeXBlci1WJykgewogICAgICAgICAgICBtZS5zdWJfcHJvZHVjdCA9ICdIeXBlci1WJzsKICAgICAgICAgICAgcmV0dXJuIHN3X2Nob2ljZXM3MSAhPSBudWxsID8gc3dfY2hvaWNlczcxLnNldENob2ljZUJ5VmFsdWUoJ0h5cGVyLVYnKSA6IHZvaWQgMDsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICBpZiAoKHJlZjEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG93bmxvYWRfcHJvZHVjdF9fdnNwaGVyZScpKSAhPSBudWxsKSB7CiAgICAgICAgcmVmMS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGlmIChtZS5wcm9kdWN0ICE9PSAndmlydHVhbF9zYW4nKSB7CiAgICAgICAgICAgIG1lLnByb2R1Y3QgPSAndmlydHVhbF9zYW4nOwogICAgICAgICAgICBpZiAodHlwZW9mIHN3X2Nob2ljZXMgIT09ICJ1bmRlZmluZWQiICYmIHN3X2Nob2ljZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgICBzd19jaG9pY2VzLnNldENob2ljZUJ5VmFsdWUoJ3ZpcnR1YWxfc2FuJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChtZS5zdWJfcHJvZHVjdCAhPT0gJ3ZTcGhlcmUnKSB7CiAgICAgICAgICAgIG1lLnN1Yl9wcm9kdWN0ID0gJ3ZTcGhlcmUnOwogICAgICAgICAgICByZXR1cm4gc3dfY2hvaWNlczcxICE9IG51bGwgPyBzd19jaG9pY2VzNzEuc2V0Q2hvaWNlQnlWYWx1ZSgndlNwaGVyZScpIDogdm9pZCAwOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIGlmICgocmVmMiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb3dubG9hZF9wcm9kdWN0X19udm1lJykpICE9IG51bGwpIHsKICAgICAgICByZWYyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgaWYgKHR5cGVvZiBzd19jaG9pY2VzICE9PSAidW5kZWZpbmVkIiAmJiBzd19jaG9pY2VzICE9PSBudWxsKSB7CiAgICAgICAgICAgIHN3X2Nob2ljZXMuc2V0Q2hvaWNlQnlWYWx1ZSgnU3RhcldpbmQgTlZNZS1vRiBJbml0aWF0b3InKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBtZS5wcm9kdWN0ID0gJ1N0YXJXaW5kIE5WTWUtb0YgSW5pdGlhdG9yJzsKICAgICAgICB9KTsKICAgICAgfQogICAgICBpZiAoKHJlZjMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG93bmxvYWRfcHJvZHVjdF9fc2FuLWFuZC1uYXMnKSkgIT0gbnVsbCkgewogICAgICAgIHJlZjMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBpZiAodHlwZW9mIHN3X2Nob2ljZXMgIT09ICJ1bmRlZmluZWQiICYmIHN3X2Nob2ljZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgc3dfY2hvaWNlcy5zZXRDaG9pY2VCeVZhbHVlKCdzYW4tbmFzLXRyaWFsJyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbWUucHJvZHVjdCA9ICdzYW4tbmFzLXRyaWFsJzsKICAgICAgICB9KTsKICAgICAgfQogICAgICBpZiAoKHJlZjQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG93bmxvYWRfcHJvZHVjdF9fdnRsJykpICE9IG51bGwpIHsKICAgICAgICByZWY0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgaWYgKHR5cGVvZiBzd19jaG9pY2VzICE9PSAidW5kZWZpbmVkIiAmJiBzd19jaG9pY2VzICE9PSBudWxsKSB7CiAgICAgICAgICAgIHN3X2Nob2ljZXMuc2V0Q2hvaWNlQnlWYWx1ZSgndnRsX29jdDE4Jyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbWUucHJvZHVjdCA9ICd2dGxfb2N0MTgnOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGlmICgocmVmNSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb3dubG9hZF9wcm9kdWN0X19zdW5mcmVlJykpICE9IG51bGwpIHsKICAgICAgICByZWY1LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgaWYgKHR5cGVvZiBzd19jaG9pY2VzICE9PSAidW5kZWZpbmVkIiAmJiBzd19jaG9pY2VzICE9PSBudWxsKSB7CiAgICAgICAgICAgIHN3X2Nob2ljZXMuc2V0Q2hvaWNlQnlWYWx1ZSgndnNhbl9mcmVlX29jdDE4Jyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbWUucHJvZHVjdCA9ICd2c2FuX2ZyZWVfb2N0MTgnOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGlmICgocmVmNiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb3dubG9hZF9wcm9kdWN0X192dGxmcmVlJykpICE9IG51bGwpIHsKICAgICAgICByZWY2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgaWYgKHR5cGVvZiBzd19jaG9pY2VzICE9PSAidW5kZWZpbmVkIiAmJiBzd19jaG9pY2VzICE9PSBudWxsKSB7CiAgICAgICAgICAgIHN3X2Nob2ljZXMuc2V0Q2hvaWNlQnlWYWx1ZSgndnRsX2ZyZWVfb2N0MTgnKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBtZS5wcm9kdWN0ID0gJ3Z0bF9mcmVlX29jdDE4JzsKICAgICAgICB9KTsKICAgICAgfQogICAgICBpZiAoKHJlZjcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG93bmxvYWRfcHJvZHVjdF9fdjJ2JykpICE9IG51bGwpIHsKICAgICAgICByZWY3LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgaWYgKHR5cGVvZiBzd19jaG9pY2VzICE9PSAidW5kZWZpbmVkIiAmJiBzd19jaG9pY2VzICE9PSBudWxsKSB7CiAgICAgICAgICAgIHN3X2Nob2ljZXMuc2V0Q2hvaWNlQnlWYWx1ZSgndjJ2Jyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbWUucHJvZHVjdCA9ICd2MnYnOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGlmICgocmVmOCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb3dubG9hZF9wcm9kdWN0X19kZWR1cGxpY2F0aW9uJykpICE9IG51bGwpIHsKICAgICAgICByZWY4LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgaWYgKHR5cGVvZiBzd19jaG9pY2VzICE9PSAidW5kZWZpbmVkIiAmJiBzd19jaG9pY2VzICE9PSBudWxsKSB7CiAgICAgICAgICAgIHN3X2Nob2ljZXMuc2V0Q2hvaWNlQnlWYWx1ZSgnZGVkdXBsaWNhdGlvbl9hbmFseXplcicpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG1lLnByb2R1Y3QgPSAnZGVkdXBsaWNhdGlvbl9hbmFseXplcic7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKChyZWY5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rvd25sb2FkX3Byb2R1Y3RfX3JlZGlyZWN0b3InKSkgIT0gbnVsbCkgewogICAgICAgIHJlZjkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBpZiAodHlwZW9mIHN3X2Nob2ljZXMgIT09ICJ1bmRlZmluZWQiICYmIHN3X2Nob2ljZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgc3dfY2hvaWNlcy5zZXRDaG9pY2VCeVZhbHVlKCd0YXBlX3JlZGlyZWN0b3Jfb2N0MTgnKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBtZS5wcm9kdWN0ID0gJ3RhcGVfcmVkaXJlY3Rvcl9vY3QxOCc7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKChyZWYxMCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb3dubG9hZF9wcm9kdWN0X19yYW1kaXNrJykpICE9IG51bGwpIHsKICAgICAgICByZWYxMC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGlmICh0eXBlb2Ygc3dfY2hvaWNlcyAhPT0gInVuZGVmaW5lZCIgJiYgc3dfY2hvaWNlcyAhPT0gbnVsbCkgewogICAgICAgICAgICBzd19jaG9pY2VzLnNldENob2ljZUJ5VmFsdWUoJ3JhbV9kaXNrJyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbWUucHJvZHVjdCA9ICdyYW1fZGlzayc7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKChyZWYxMSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb3dubG9hZF9wcm9kdWN0X19ycGVyZicpKSAhPSBudWxsKSB7CiAgICAgICAgcmVmMTEuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBpZiAodHlwZW9mIHN3X2Nob2ljZXMgIT09ICJ1bmRlZmluZWQiICYmIHN3X2Nob2ljZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgc3dfY2hvaWNlcy5zZXRDaG9pY2VCeVZhbHVlKCdzdGFyd2luZF9yUGVyZicpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG1lLnByb2R1Y3QgPSAnc3RhcndpbmRfclBlcmYnOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGlmICgocmVmMTIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG93bmxvYWRfcHJvZHVjdF9faXNjc2knKSkgIT0gbnVsbCkgewogICAgICAgIHJlZjEyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgaWYgKHR5cGVvZiBzd19jaG9pY2VzICE9PSAidW5kZWZpbmVkIiAmJiBzd19jaG9pY2VzICE9PSBudWxsKSB7CiAgICAgICAgICAgIHN3X2Nob2ljZXMuc2V0Q2hvaWNlQnlWYWx1ZSgnaVNDU0lfQWNjZWxlcmF0b3InKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBtZS5wcm9kdWN0ID0gJ2lTQ1NJX0FjY2VsZXJhdG9yJzsKICAgICAgICB9KTsKICAgICAgfQogICAgfSwKICAgIHVwZGF0ZWQ6IGZ1bmN0aW9uKCkge30sCiAgICBjcmVhdGVkOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGVsXzEsIGVsXzIsIGVsXzMsIGVsXzQsIGVsXzUsIGVsXzYsIGVsXzcsIGVsXzgsIGVsXzk7CiAgICAgIGVsXzEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG93bmxvYWRfbGljZW5zZScpOwogICAgICBpZiAoZWxfMSAhPT0gbnVsbCkgewogICAgICAgIHRoaXMucHJvZHVjdCA9IGVsXzEudmFsdWU7CiAgICAgIH0KICAgICAgZWxfMiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb3dubG9hZF9zdWJfcHJvZHVjdCcpOwogICAgICBpZiAoZWxfMiAhPT0gbnVsbCkgewogICAgICAgIHRoaXMuc3ViX3Byb2R1Y3QgPSBlbF8yLnZhbHVlOwogICAgICB9CiAgICAgIGVsXzMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG93bmxvYWRfZmlyc3RuYW1lJyk7CiAgICAgIGlmIChlbF8zICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy5maXJzdG5hbWUgPSBlbF8zLnZhbHVlOwogICAgICB9CiAgICAgIGVsXzQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG93bmxvYWRfbGFzdG5hbWUnKTsKICAgICAgaWYgKGVsXzQgIT09IG51bGwpIHsKICAgICAgICB0aGlzLmxhc3RuYW1lID0gZWxfNC52YWx1ZTsKICAgICAgfQogICAgICBlbF81ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rvd25sb2FkX3RpdGxlJyk7CiAgICAgIGlmIChlbF81ICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy50aXRsZSA9IGVsXzUudmFsdWU7CiAgICAgIH0KICAgICAgZWxfNiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb3dubG9hZF9lbWFpbCcpOwogICAgICBpZiAoZWxfNiAhPT0gbnVsbCkgewogICAgICAgIHRoaXMuZW1haWwgPSBlbF82LnZhbHVlOwogICAgICB9CiAgICAgIGVsXzcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG93bmxvYWRfY29tcGFueScpOwogICAgICBpZiAoZWxfNyAhPT0gbnVsbCkgewogICAgICAgIHRoaXMuY29tcGFueSA9IGVsXzcudmFsdWU7CiAgICAgIH0KICAgICAgZWxfOCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb3dubG9hZF9jb3VudHJ5Jyk7CiAgICAgIGlmIChlbF84ICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy5jb3VudHJ5ID0gZWxfOC52YWx1ZTsKICAgICAgfQogICAgICBlbF85ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rvd25sb2FkX3Bob25lJyk7CiAgICAgIGlmIChlbF85ICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy5waG9uZSA9IGVsXzkudmFsdWU7CiAgICAgIH0KICAgIH0sCiAgICBjb21wdXRlZDogewogICAgICBpc0V1cm9ab25lOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSwKICAgICAgaXNOVk1FOiBmdW5jdGlvbigpIHsKICAgICAgICBzd2l0Y2ggKHRoaXMucHJvZHVjdCkgewogICAgICAgICAgY2FzZSAnU3RhcldpbmQgTlZNZS1vRiBJbml0aWF0b3InOgogICAgICAgICAgY2FzZSAnU3RhcldpbmQgTlZNZS1vRiBJbml0aWF0b3IgVHJpYWwnOgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9LAogICAgICBuZWVkUGhvbmU6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBsaWNlbnNlOwogICAgICAgIGxpY2Vuc2UgPSB0aGlzLmdldExpY2Vuc2VbJ2xpY2Vuc2UnXTsKICAgICAgICBzd2l0Y2ggKGxpY2Vuc2UpIHsKICAgICAgICAgIGNhc2UgJ3Yydic6CiAgICAgICAgICBjYXNlICdyYW1fZGlzayc6CiAgICAgICAgICBjYXNlICdpc2NzaV9pbml0aWF0b3InOgogICAgICAgICAgY2FzZSAnU3RhcldpbmQgUkFNIERpc2snOgogICAgICAgICAgY2FzZSAnU3RhcldpbmQgVjJWIENvbnZlcnRlcic6CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfSwKICAgICAgQ29ycG9yYXRlRW1haWxMYWJlbDogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGxpY2Vuc2U7CiAgICAgICAgbGljZW5zZSA9IHRoaXMuZ2V0TGljZW5zZVsnbGljZW5zZSddOwogICAgICAgIHN3aXRjaCAobGljZW5zZSkgewogICAgICAgICAgY2FzZSAndjJ2JzoKICAgICAgICAgIGNhc2UgJ1N0YXJXaW5kIFYyViBDb252ZXJ0ZXInOgogICAgICAgICAgICByZXR1cm4gJ0VtYWlsJzsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiAnQ29ycG9yYXRlIEVtYWlsJzsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGlzU0FOX05BUzogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGVsOwogICAgICAgIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rvd25sb2FkX3N1Yl9wcm9kdWN0X3Nhbl9uYXMnKTsKICAgICAgICBpZiAoZWwgPT09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgc3dpdGNoICh0aGlzLnByb2R1Y3QpIHsKICAgICAgICAgIGNhc2UgJ3Nhbi1uYXMtdHJpYWwnOgogICAgICAgICAgY2FzZSAnc2FuLW5hcy1mcmVlJzoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSwKICAgICAgaXNWaXJ0dWFsU2FuOiBmdW5jdGlvbigpIHsKICAgICAgICBzd2l0Y2ggKHRoaXMucHJvZHVjdCkgewogICAgICAgICAgY2FzZSAndmlydHVhbF9zYW4nOgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9LAogICAgICBnZXRMaWNlbnNlOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgY2F0ZWdvcnksIGxpY2Vuc2UsIHVybDsKICAgICAgICB1cmwgPSAnJzsKICAgICAgICBsaWNlbnNlID0gJyc7CiAgICAgICAgY2F0ZWdvcnkgPSAnJzsKICAgICAgICBpZiAodGhpcy5wcm9kdWN0ID09PSAnJykgewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdXJsOiAnJywKICAgICAgICAgICAgbGljZW5zZTogJycsCiAgICAgICAgICAgIGNhdGVnb3J5OiAnJwogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgc3dpdGNoICh0aGlzLnByb2R1Y3QpIHsKICAgICAgICAgIGNhc2UgJ3ZpcnR1YWxfc2FuJzoKICAgICAgICAgICAgdXJsID0gJy9mb3JtLTExNDktbm8taHlwZXJ2aXNvci12MTcuanMnOwogICAgICAgICAgICBjYXRlZ29yeSA9ICdTdGFyV2luZCBWU0FOIDMwLWRheSBUcmlhbCc7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zdWJfcHJvZHVjdCkgewogICAgICAgICAgICAgIGNhc2UgJ0h5cGVyLVYnOgogICAgICAgICAgICAgICAgbGljZW5zZSA9ICd2c2FuX3RyaWFsX2h5cGVyLXZfb2N0MTgnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAndlNwaGVyZSc6CiAgICAgICAgICAgICAgICBsaWNlbnNlID0gJ3ZzYW5fdHJpYWxfdnNwaGVyZV9vY3QxOCc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICd4ZW5fYXVnMjEnOgogICAgICAgICAgICAgICAgbGljZW5zZSA9ICd4ZW5fYXVnMjEnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdTdGFyV2luZCBOVk1lLW9GIEluaXRpYXRvcic6CiAgICAgICAgICAgIHVybCA9ICcvZm9ybS1udm1lLW9mLWluaXRpYXRvci12MTkuanMnOwogICAgICAgICAgICBjYXRlZ29yeSA9ICdTdGFyV2luZCBOVk1lLW9GIEluaXRpYXRvcic7CiAgICAgICAgICAgIGxpY2Vuc2UgPSAnU3RhcldpbmQgTlZNZS1vRiBJbml0aWF0b3InOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1N0YXJXaW5kIE5WTWUtb0YgSW5pdGlhdG9yIFRyaWFsJzoKICAgICAgICAgICAgdXJsID0gJy9mb3JtLW52bWUtb2YtaW5pdGlhdG9yLXYxOS5qcyc7CiAgICAgICAgICAgIGNhdGVnb3J5ID0gJ1N0YXJXaW5kIE5WTWUtb0YgSW5pdGlhdG9yIFRyaWFsJzsKICAgICAgICAgICAgbGljZW5zZSA9ICdTdGFyV2luZCBOVk1lLW9GIEluaXRpYXRvciBUcmlhbCc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAndnNhbl9mcmVlJzoKICAgICAgICAgIGNhc2UgJ3ZzYW5fdHJpYWwnOgogICAgICAgICAgY2FzZSAndnNhbl90cmlhbF9oeXBlci12JzoKICAgICAgICAgIGNhc2UgJ3ZzYW5fdHJpYWxfaHlwZXItdl9vY3QxOCc6CiAgICAgICAgICBjYXNlICd2c2FuX2ZyZWVfb2N0MTgnOgogICAgICAgICAgICB1cmwgPSAnL2Zvcm0tMTE0OS1uby1oeXBlcnZpc29yLXYxNy5qcyc7CiAgICAgICAgICAgIGNhdGVnb3J5ID0gJ1N0YXJXaW5kIFZTQU4gRnJlZSc7CiAgICAgICAgICAgIGxpY2Vuc2UgPSAndnNhbl9mcmVlX29jdDE4JzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICd2dGwnOgogICAgICAgICAgY2FzZSAndnRsX29jdDE4JzoKICAgICAgICAgICAgdXJsID0gJy9mb3JtLTE5MjItdjE3LmpzJzsKICAgICAgICAgICAgY2F0ZWdvcnkgPSAnU3RhcldpbmQgVmlydHVhbCBUYXBlIExpYnJhcnknOwogICAgICAgICAgICBsaWNlbnNlID0gJ3Z0bF9vY3QxOCc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAndnRsX2ZyZWUnOgogICAgICAgICAgY2FzZSAndnRsX2ZyZWVfb2N0MTgnOgogICAgICAgICAgICB1cmwgPSAnL2Zvcm0tdnRsLWZyZWUtdjE4LmpzJzsKICAgICAgICAgICAgY2F0ZWdvcnkgPSAnU3RhcldpbmQgVmlydHVhbCBUYXBlIExpYnJhcnkgRnJlZSc7CiAgICAgICAgICAgIGxpY2Vuc2UgPSAndnRsX2ZyZWVfb2N0MTgnOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ21hbmFnZXInOgogICAgICAgICAgICB1cmwgPSAnL2Zvcm0tMjA0MS12MTcuanMnOwogICAgICAgICAgICBjYXRlZ29yeSA9ICdtYW5hZ2VyJzsKICAgICAgICAgICAgbGljZW5zZSA9ICdtYW5hZ2VyJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICd3ZWJfYmFzZWRfbWFuYWdlbWVudCc6CiAgICAgICAgICAgIHVybCA9ICcvZm9ybS0yMDgzLXYxNy5qcyc7CiAgICAgICAgICAgIGNhdGVnb3J5ID0gJ1N0YXJXaW5kIFdlYi1iYXNlZCBNYW5hZ2VtZW50JzsKICAgICAgICAgICAgbGljZW5zZSA9ICd3ZWJfYmFzZWRfbWFuYWdlbWVudCc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAndjJ2JzoKICAgICAgICAgIGNhc2UgJ1N0YXJXaW5kIFYyViBDb252ZXJ0ZXInOgogICAgICAgICAgICB1cmwgPSAnL2Zvcm0tMTE2Ni12MTcuanMnOwogICAgICAgICAgICBjYXRlZ29yeSA9ICdWMlYgQ29udmVydGVyJzsKICAgICAgICAgICAgbGljZW5zZSA9ICd2MnYnOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ3ZzYSc6CiAgICAgICAgICAgIHVybCA9ICcvZm9ybS0xOTQ3LXJlZ2lzdGVyLXYxNy5qcyc7CiAgICAgICAgICAgIGNhdGVnb3J5ID0gJ3ZzYSc7CiAgICAgICAgICAgIGxpY2Vuc2UgPSAndnNhJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdkZWR1cGxpY2F0aW9uX2FuYWx5emVyJzoKICAgICAgICAgIGNhc2UgJ1N0YXJXaW5kIERlZHVwbGljYXRpb24gQW5hbHl6ZXInOgogICAgICAgICAgICB1cmwgPSAnL2Zvcm0tMzAtdjE3LmpzJzsKICAgICAgICAgICAgY2F0ZWdvcnkgPSAnU3RhcldpbmQgRGVkdXBlIEFuYWx5emVyJzsKICAgICAgICAgICAgbGljZW5zZSA9ICdkZWR1cGxpY2F0aW9uX2FuYWx5emVyJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICd0YXBlX3JlZGlyZWN0b3InOgogICAgICAgICAgY2FzZSAndGFwZV9yZWRpcmVjdG9yX29jdDE4JzoKICAgICAgICAgIGNhc2UgJ1N0YXJXaW5kIFRhcGUgUmVkaXJlY3Rvcic6CiAgICAgICAgICAgIHVybCA9ICcvZm9ybS0zOS12MTcuanMnOwogICAgICAgICAgICBjYXRlZ29yeSA9ICdUYXBlIFJlZGlyZWN0b3InOwogICAgICAgICAgICBsaWNlbnNlID0gJ3RhcGVfcmVkaXJlY3Rvcl9vY3QxOCc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnZnJlZS1uYXMtc2FuJzoKICAgICAgICAgIGNhc2UgJ3Nhbi1uYXMtdHJpYWwnOgogICAgICAgICAgICB1cmwgPSAnL2Zvcm0tZnJlZS1uYXMtc2FuLmpzJzsKICAgICAgICAgICAgY2F0ZWdvcnkgPSAnU0FOIE5BUyc7CiAgICAgICAgICAgIGxpY2Vuc2UgPSAnc2FuLW5hcy10cmlhbCc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnc2FuLW5hcy1mcmVlJzoKICAgICAgICAgICAgdXJsID0gJy9mb3JtLWZyZWUtbmFzLXNhbi5qcyc7CiAgICAgICAgICAgIGNhdGVnb3J5ID0gJ1NBTiBOQVMnOwogICAgICAgICAgICBsaWNlbnNlID0gJ3Nhbi1uYXMtZnJlZSc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAndnRsX2Nsb3VkJzoKICAgICAgICAgIGNhc2UgJ3RyaWFsLXZ0bC10by1jbG91ZF9vY3QxOCc6CiAgICAgICAgICBjYXNlICdTdGFyV2luZCBDbG91ZCBWVEwgZm9yIEFXUyBhbmQgVmVlYW0nOgogICAgICAgICAgICB1cmwgPSAnL2Zvcm0tMTk5OC12MTcuanMnOwogICAgICAgICAgICBjYXRlZ29yeSA9ICdWVEwgQ2xvdWQnOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ3JhbV9kaXNrJzoKICAgICAgICAgIGNhc2UgJ1N0YXJXaW5kIFJBTSBEaXNrJzoKICAgICAgICAgICAgdXJsID0gJy9mb3JtLXJhbWRpc2stdjE3LmpzJzsKICAgICAgICAgICAgY2F0ZWdvcnkgPSAnUkFNIERpc2snOwogICAgICAgICAgICBsaWNlbnNlID0gJ3JhbV9kaXNrJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdpc2NzaV9pbml0aWF0b3InOgogICAgICAgICAgICB1cmwgPSAnL2Zvcm0taXNjc2ktaW5pdGlhdG9yLXYxNy5qcyc7CiAgICAgICAgICAgIGNhdGVnb3J5ID0gJ1N0YXJXaW5kIGlTQ1NJIEluaXRpYXRvcic7CiAgICAgICAgICAgIGxpY2Vuc2UgPSAnaXNjc2lfaW5pdGlhdG9yJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdiYWNrYmxhemUnOgogICAgICAgICAgY2FzZSAnYmFja2JsYXplX29jdDE4JzoKICAgICAgICAgIGNhc2UgJ1N0YXJXaW5kIFN0b3JhZ2UgR2F0ZXdheSBmb3IgQmFja2JsYXplJzoKICAgICAgICAgICAgdXJsID0gJy9mb3JtLWJhY2tibGF6ZS12MTcuanMnOwogICAgICAgICAgICBjYXRlZ29yeSA9ICdTdGFyV2luZCBTdG9yYWdlIEdhdGV3YXkgZm9yIEJhY2tibGF6ZSc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnd2FzYWJpJzoKICAgICAgICAgIGNhc2UgJ3dhc2FiaV9vY3QxOCc6CiAgICAgICAgICBjYXNlICdTdGFyV2luZCBTdG9yYWdlIEdhdGV3YXkgZm9yIFdhc2FiaSc6CiAgICAgICAgICAgIHVybCA9ICcvZm9ybS13YXNhYmktdjE4LmpzJzsKICAgICAgICAgICAgY2F0ZWdvcnkgPSAnU3RhcldpbmQgU3RvcmFnZSBHYXRld2F5IGZvciBXYXNhYmknOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ3N0YXJ3aW5kX3JQZXJmJzoKICAgICAgICAgIGNhc2UgJ1N0YXJXaW5kIHJQZXJmJzoKICAgICAgICAgICAgdXJsID0gJy9mb3JtLXJwZXJmLXYxOC5qcyc7CiAgICAgICAgICAgIGNhdGVnb3J5ID0gJ1N0YXJXaW5kIHJQZXJmJzsKICAgICAgICAgICAgbGljZW5zZSA9ICdzdGFyd2luZF9yUGVyZic7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnTnV0YW5peCB2cy4gU3RhcldpbmQgQmF0dGxlY2FyZCc6CiAgICAgICAgICAgIHVybCA9ICcvZm9ybS1udXRhbml4LWJhdHRsZWNhcmQtdjIyLmpzJzsKICAgICAgICAgICAgY2F0ZWdvcnkgPSAnTnV0YW5peCB2cy4gU3RhcldpbmQgQmF0dGxlY2FyZCc7CiAgICAgICAgICAgIGxpY2Vuc2UgPSAnTnV0YW5peCB2cy4gU3RhcldpbmQgQmF0dGxlY2FyZCc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnaVNDU0lfQWNjZWxlcmF0b3InOgogICAgICAgICAgY2FzZSAnU3RhcldpbmQgaVNDU0kgQWNjZWxlcmF0b3InOgogICAgICAgICAgICB1cmwgPSAnL2Zvcm0taXNjc2ktYWNjZWxlcmF0b3ItdjE4LmpzJzsKICAgICAgICAgICAgY2F0ZWdvcnkgPSAnU3RhcldpbmQgaVNDU0kgQWNjZWxlcmF0b3InOwogICAgICAgICAgICBsaWNlbnNlID0gJ2lTQ1NJX0FjY2VsZXJhdG9yJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB1cmwgPSAndW5rbm93biBsaWNlbnNlJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgIGxpY2Vuc2U6IGxpY2Vuc2UsCiAgICAgICAgICBjYXRlZ29yeTogY2F0ZWdvcnkKICAgICAgICB9OwogICAgICB9CiAgICB9LAogICAgbWV0aG9kczogewogICAgICB2YWxpZEVtYWlsOiBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgaWYgKHdpbmRvdy5zdWNjZXNzRm9ybVN1Ym1pdCA9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICQuYWpheCh7CiAgICAgICAgICB1cmw6ICcvdmFsaWRlbWFpbC5qcycsCiAgICAgICAgICB0eXBlOiAiUE9TVCIsCiAgICAgICAgICBkYXRhOiB7CiAgICAgICAgICAgIGVtYWlsOiBvcHRpb25zLmVtYWlsCiAgICAgICAgICB9LAogICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgICAgdmFyIG9iajsKICAgICAgICAgICAgb2JqID0ge307CiAgICAgICAgICAgIG9wdGlvbnMudmFsaWQgPSByZXNwb25zZS5lbWFpbFN0YXR1czsKICAgICAgICAgICAgb3B0aW9ucy51c2VyID0gcmVzcG9uc2UuY2lkOwogICAgICAgICAgICB3aW5kb3cuc3VjY2Vzc0Zvcm1TdWJtaXQob3B0aW9ucyk7CiAgICAgICAgICB9LAogICAgICAgICAgZGF0YVR5cGU6ICdqc29uJwogICAgICAgIH0pOwogICAgICB9LAogICAgICBmdW5jX25vX3ZhbGlkOiBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgdmFyIGQ7CiAgICAgICAgZCA9IGRhdGE7CiAgICAgICAgZFsnZnJvbV91cmwnXSA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7CiAgICAgICAgaWYgKCFqUXVlcnkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJC5wb3N0KCIvbm90LXZhbGlkLWRhdGEtdjIwLmpzIiwgZCk7CiAgICAgIH0sCiAgICAgIHNldE1vZGVsOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLm1vZGVsID0gewogICAgICAgICAgc3ViX3Byb2R1Y3Rfc2FuX25hczogdGhpcy5zdWJfcHJvZHVjdF9zYW5fbmFzLAogICAgICAgICAgZmlyc3RuYW1lOiB0aGlzLmZpcnN0bmFtZSwKICAgICAgICAgIGxhc3RuYW1lOiB0aGlzLmxhc3RuYW1lLAogICAgICAgICAgY29tcGFueTogdGhpcy5jb21wYW55LAogICAgICAgICAgZW1haWw6IHRoaXMuZW1haWwsCiAgICAgICAgICBjb3VudHJ5OiB0aGlzLmNvdW50cnksCiAgICAgICAgICB0aXRsZTogdGhpcy50aXRsZSwKICAgICAgICAgIHBob25lMjogdGhpcy5waG9uZSwKICAgICAgICAgIG52bWVfaG9zdHM6IHRoaXMubnZtZV9ob3N0cywKICAgICAgICAgIHVybDogd2luZG93LmxvY2F0aW9uLmhyZWYKICAgICAgICB9OwogICAgICB9LAogICAgICBzdWJtaXRGb3JtOiBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIGNoZWNrX21lLCBjaGVja19tZV9sYWJlbCwgZWxfc2FuX25hcywgbGljZW5zZSwgbWUsIG9iaiwgdXJsOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICB0aGlzLnNldE1vZGVsKCk7CiAgICAgICAgY2hlY2tfbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG93bmxvYWRfY2hlY2tfbWUnKTsKICAgICAgICBjaGVja19tZV9sYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb3dubG9hZF9jaGVja21hcmsnKTsKICAgICAgICBpZiAodGhpcy5pc0V1cm9ab25lKSB7CiAgICAgICAgICBpZiAoIWNoZWNrX21lLmNoZWNrZWQpIHsKICAgICAgICAgICAgJChjaGVja19tZV9sYWJlbCkuYWRkQ2xhc3MoJ2Vycm9yJyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkKGNoZWNrX21lX2xhYmVsKS5yZW1vdmVDbGFzcygnZXJyb3InKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghY2hlY2tfbWUuY2hlY2tlZCkgewogICAgICAgICAgICAkKCcjZG93bmxvYWRfZm9ybSBzcGFuLmVycm9yJykucmVtb3ZlKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbWUgPSB0aGlzOwogICAgICAgIG9iaiA9IHRoaXMuZ2V0TGljZW5zZTsKICAgICAgICB1cmwgPSBvYmoudXJsOwogICAgICAgIGxpY2Vuc2UgPSBvYmoubGljZW5zZTsKICAgICAgICB0aGlzLm1vZGVsWydsaWNlbnNlJ10gPSBsaWNlbnNlOwogICAgICAgIGlmICh0aGlzLnByb2R1Y3QgPT09ICd2aXJ0dWFsX3NhbicgJiYgbGljZW5zZSA9PT0gJycpIHsKICAgICAgICAgICQoJyNkb3dubG9hZF9mb3JtICNkb3dubG9hZF9zdWJfcHJvZHVjdF93cmFwcGVyIHNwYW4uZXJyb3InKS5yZW1vdmUoKTsKICAgICAgICAgICQoJyNkb3dubG9hZF9mb3JtICNkb3dubG9hZF9zdWJfcHJvZHVjdF93cmFwcGVyIC5iYXInKS5iZWZvcmUoIjxzcGFuIGNsYXNzPVwiZXJyb3JcIj5UaGlzIGZpZWxkIGlzIHJlcXVpcmVkLjwvc3Bhbj4iKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJCgnI2Rvd25sb2FkX2Zvcm0gI2Rvd25sb2FkX3N1Yl9wcm9kdWN0X3dyYXBwZXIgc3Bhbi5lcnJvcicpLnJlbW92ZSgpOwogICAgICAgIHN3aXRjaCAodGhpcy5wcm9kdWN0KSB7CiAgICAgICAgICBjYXNlICdzYW4tbmFzLXRyaWFsJzoKICAgICAgICAgIGNhc2UgJ3Nhbi1uYXMtZnJlZSc6CiAgICAgICAgICAgIGVsX3Nhbl9uYXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG93bmxvYWRfc3ViX3Byb2R1Y3Rfc2FuX25hcycpOwogICAgICAgICAgICBpZiAoZWxfc2FuX25hcyA9PT0gbnVsbCkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdAc3ViX3Byb2R1Y3Rfc2FuX25hcycsIHRoaXMuc3ViX3Byb2R1Y3Rfc2FuX25hcyk7CiAgICAgICAgICAgIGlmICh0aGlzLnN1Yl9wcm9kdWN0X3Nhbl9uYXMgPT09ICcnKSB7CiAgICAgICAgICAgICAgJCgnI2Rvd25sb2FkX2Zvcm0gI2Rvd25sb2FkX3N1Yl9wcm9kdWN0X3Nhbl9uYXNfd3JhcHBlciBzcGFuLmVycm9yJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgJCgnI2Rvd25sb2FkX2Zvcm0gI2Rvd25sb2FkX3N1Yl9wcm9kdWN0X3Nhbl9uYXNfd3JhcHBlciAuYmFyJykuYmVmb3JlKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+VGhpcyBmaWVsZCBpcyByZXF1aXJlZC48L3NwYW4+Iik7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAkKCcjZG93bmxvYWRfZm9ybSAjZG93bmxvYWRfc3ViX3Byb2R1Y3Rfc2FuX25hc193cmFwcGVyIHNwYW4uZXJyb3InKS5yZW1vdmUoKTsKICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuY2xhc3NMaXN0LmFkZCgncHJlbG9hZGVyJyk7CiAgICAgICAgJC5hamF4KHsKICAgICAgICAgIHR5cGU6ICdQT1NUJywKICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcKICAgICAgICAgIH0sCiAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAogICAgICAgICAgZGF0YTogdGhpcy5tb2RlbCwKICAgICAgICAgIGNhY2hlOiBmYWxzZSwKICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zOwogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuY2xhc3NMaXN0LnJlbW92ZSgncHJlbG9hZGVyJyk7CiAgICAgICAgICAgIGlmICgocmVzcG9uc2Uuc3VjY2VzcyAhPSBudWxsKSAmJiByZXNwb25zZS5zdWNjZXNzID09PSBmYWxzZSkgewogICAgICAgICAgICAgIG1lLmZ1bmNfbm9fdmFsaWQobWUubW9kZWwpOwogICAgICAgICAgICAgIG1lLmNoZWNrUmVxdWVzdChyZXNwb25zZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgJCgiI2Rvd25sb2FkX2Zvcm0iKS5oaWRlKCk7CiAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgIG9wdGlvbnMuYWN0aW9uID0gJ0Rvd25sb2FkJzsKICAgICAgICAgICAgICBvcHRpb25zLmxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgICAgb3B0aW9ucy5lbWFpbCA9IG1lLmVtYWlsOwogICAgICAgICAgICAgIG9wdGlvbnMubGljZW5zZSA9IG1lLm1vZGVsWydsaWNlbnNlJ107CiAgICAgICAgICAgICAgb3B0aW9ucy5jYXRlZ29yeSA9IG9ialsnY2F0ZWdvcnknXTsKICAgICAgICAgICAgICBtZS52YWxpZEVtYWlsKG9wdGlvbnMpOwogICAgICAgICAgICAgIGNoZWNrX21lX2xhYmVsLmNsYXNzTGlzdC5yZW1vdmUoJ2Vycm9yJyk7CiAgICAgICAgICAgICAgY2hlY2tfbWUuY2hlY2tlZCA9IGZhbHNlOwogICAgICAgICAgICAgICQoJyNkb3dubG9hZC10aGFuay15b3UuZG93bmxvYWQtdGhhbmsteW91Jykuc2hvdygpOwogICAgICAgICAgICAgICQoIiNkb3dubG9hZC10aGFuay15b3UgLnRpdGxlIikuaHRtbChyZXNwb25zZS5oZWFkZXJfbWVzc2FnZSk7CiAgICAgICAgICAgICAgJCgiI2Rvd25sb2FkLXRoYW5rLXlvdSAudGV4dCIpLmh0bWwocmVzcG9uc2UuYm9keV9tZXNzYWdlKTsKICAgICAgICAgICAgICBzd2l0Y2ggKHVybCkgewogICAgICAgICAgICAgICAgY2FzZSAnL2Zvcm0tMTE0OS1uby1oeXBlcnZpc29yLXYxNy5qcyc6CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgJCgnLnRoYW5rLXlvdS1mb3JtJykuY3NzKCd0ZXh0LWFsaWduJywgJ2NlbnRlcicpOwogICAgICAgICAgICAgICAgICAkKCcudGhhbmsteW91LWZvcm0nKS5jc3MoJ2xpbmUtaGVpZ2h0JywgJzMwcHgnKTsKICAgICAgICAgICAgICAgICAgJCgnLnRoYW5rLXlvdS1mb3JtJykuY3NzKCdmb250LXNpemUnLCAnMTVweCcpOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSwKICAgICAgY2hlY2tSZXF1ZXN0OiBmdW5jdGlvbihyZXMpIHsKICAgICAgICB2YXIgZXJyb3JzLCBrLCBrZXksIHBob25lMl90ZXN0LCBwaG9uZV9lcnJvcl9jb3VudDsKICAgICAgICBlcnJvcnMgPSB7CiAgICAgICAgICBsZW5ndGg6IDAKICAgICAgICB9OwogICAgICAgIGZvciAoa2V5IGluIHJlcy5kYXRhKSB7CiAgICAgICAgICBpZiAoKGVycm9yc1tyZXMuZGF0YVtrZXldWydmaWVsZCddXSAhPSBudWxsKSkgewogICAgICAgICAgICBlcnJvcnNbcmVzLmRhdGFba2V5XVsnZmllbGQnXV0ucHVzaChyZXMuZGF0YVtrZXldWydydWxlJ10pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZXJyb3JzW3Jlcy5kYXRhW2tleV1bJ2ZpZWxkJ11dID0gW3Jlcy5kYXRhW2tleV1bJ3J1bGUnXV07CiAgICAgICAgICB9CiAgICAgICAgICBlcnJvcnMubGVuZ3RoICs9IDE7CiAgICAgICAgfQogICAgICAgICQoJyNkb3dubG9hZF9mb3JtIHNwYW4uZXJyb3InKS5yZW1vdmUoKTsKICAgICAgICBpZiAoKGVycm9ycy5sZW5ndGggIT0gbnVsbCkgJiYgZXJyb3JzLmxlbmd0aCAhPT0gMCkgewogICAgICAgICAgcGhvbmVfZXJyb3JfY291bnQgPSAwOwogICAgICAgICAgZm9yIChrZXkgaW4gZXJyb3JzKSB7CiAgICAgICAgICAgIGlmIChrZXkgIT09ICdsZW5ndGgnKSB7CiAgICAgICAgICAgICAgc3dpdGNoIChrZXkpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2xpY2Vuc2UnOgogICAgICAgICAgICAgICAgY2FzZSAndXNlX3dpdGgnOgogICAgICAgICAgICAgICAgY2FzZSAnY291bnRyeSc6CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgZm9yIChrIGluIGVycm9yc1trZXldKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gJ252bWVfaG9zdHMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAkKCcjZG93bmxvYWRfZm9ybSAjZG93bmxvYWRfJyArIGtleSArICcgKyBzcGFuLmJhcicpLmFmdGVyKCI8c3BhbiBjbGFzcz1cImVycm9yXCIgaWQ9XCJkb3dubG9hZF9udm1lX2hvc3RzX2Vycm9yXCI+IyBvZiBJbml0aWF0b3IgaG9zdHMgaXMgcmVxdWlyZWQ8L3NwYW4+Iik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZF8nICsga2V5KS5hZGRDbGFzcygndmFsaWQtZXJyb3InKTsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGVycm9yc1trZXldW2tdKSB7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2YWxpZGF0ZV9yZXF1aXJlZCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW1haWwnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2Rvd25sb2FkX2Zvcm0gI2Rvd25sb2FkXycgKyBrZXkpLmFmdGVyKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+RW1haWwgaXMgcmVxdWlyZWQ8L3NwYW4+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21wYW55JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZF9mb3JtICNkb3dubG9hZF8nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPkNvbXBhbnkgaXMgcmVxdWlyZWQ8L3NwYW4+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0aXRsZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZG93bmxvYWRfZm9ybSAjZG93bmxvYWRfJyArIGtleSkuYWZ0ZXIoIjxzcGFuIGNsYXNzPVwiZXJyb3JcIj5Kb2IgVGl0bGUgaXMgcmVxdWlyZWQuPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncGhvbmUyJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZF9mb3JtICNkb3dubG9hZF8nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPlBob25lIE51bWJlciBpcyByZXF1aXJlZC48L3NwYW4+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb3VudHJ5JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZF9mb3JtICNkb3dubG9hZF8nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPkNvdW50cnkgaXMgcmVxdWlyZWQuPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0d29fbGF0aW5fYW5kX3doaXRlc3BhY2UnOgogICAgICAgICAgICAgICAgICAgICAgICAkKCcjZG93bmxvYWRfZm9ybSAjZG93bmxvYWRfJyArIGtleSkuYWZ0ZXIoIjxzcGFuIGNsYXNzPVwiZXJyb3JcIj5Pbmx5IExhdGluIGFscGhhYmV0IG1heSBiZSB1c2VkIGluIHRoZSBmb3JtLjwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsYXRpbl9hbmRfd2hpdGVzcGFjZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZF9mb3JtICNkb3dubG9hZF8nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPk9ubHkgTGF0aW4gYWxwaGFiZXQgbWF5IGJlIHVzZWQgaW4gdGhlIGZvcm0uPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZhbGlkYXRlX3ZhbGlkX2VtYWlsJzoKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2Rvd25sb2FkX2Zvcm0gI2Rvd25sb2FkXycgKyBrZXkpLmFmdGVyKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+UGxlYXNlIHByb3ZpZGUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLjwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmYWtlX3dvcmRzJzoKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2Rvd25sb2FkX2Zvcm0gI2Rvd25sb2FkXycgKyBrZXkpLmFmdGVyKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+UGxlYXNlIGVudGVyIHZhbGlkIGRhdGEuPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JlcGVhdF9zeW1ib2xzJzoKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2Rvd25sb2FkX2Zvcm0gI2Rvd25sb2FkXycgKyBrZXkpLmFmdGVyKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+VG9vIG11Y2ggcmVwZWF0IHN5bWJvbHMuPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3B1YmxpY19lbWFpbCc6CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZF9mb3JtICNkb3dubG9hZF8nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPidQdWJsaWMgb3IgZnJlZSBlbWFpbCBpcyBlbnRlcmVkIGluIFwiQ29ycG9yYXRlIEVtYWlsXCIgZmllbGQuIEFuIGVtYWlsIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHlvdXIgY29tcGFueSBpcyByZXF1aXJlZC4gQ29udGFjdCA8YSBocmVmPVwibWFpbHRvOnNhbGVzQHN0YXJ3aW5kLmNvbVwiPnNhbGVzQHN0YXJ3aW5kLmNvbTwvYT4gaW4gY2FzZSB5b3UgZG9uXCd0IGhhdmUgaXQuJzwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwaG9uZV9udW1iZXInOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBob25lX2Vycm9yX2NvdW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmVfZXJyb3JfY291bnQgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgIHBob25lMl90ZXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rvd25sb2FkX3Bob25lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwaG9uZTJfdGVzdCAhPSBudWxsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2Rvd25sb2FkX2Zvcm0gI2Rvd25sb2FkX3Bob25lJykuYWZ0ZXIoIjxzcGFuIGNsYXNzPVwiZXJyb3JcIj5QbGVhc2UsIGVudGVyIGNvcnJlY3QgUGhvbmUgTnVtYmVyLjwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNkb3dubG9hZF9mb3JtICNkb3dubG9hZF8nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPkVycm9yPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9KTsKCgogIC8qCiAgICAgIGdldExpY2Vuc2U6IChwcm9kdWN0LCBzdWJfcHJvZHVjdCkgLT4KICAKICAgICAgICB1cmwgICAgID0gJycKICAgICAgICBsaWNlbnNlID0gJycKICAgICAgICBjYXRlZ29yeSA9ICcnCiAgCiAgICAgICAgc3dpdGNoIHByb2R1Y3QKICAKICAgICAgICAgIHdoZW4gJ3ZpcnR1YWxfc2FuJwogIAogICAgICAgICAgICB1cmwgPSAnL2Zvcm0tMTE0OS1uby1oeXBlcnZpc29yLXYxNy5qcycKICAgICAgICAgICAgY2F0ZWdvcnkgPSAnU3RhcldpbmQgVlNBTiAzMC1kYXkgVHJpYWwnCiAgCiAgICAgICAgICAgIHN3aXRjaCAoc3ViX3Byb2R1Y3QpCiAgICAgICAgICAgICAgd2hlbiAnSHlwZXItVicKICAgICAgICAgICAgICAgIGxpY2Vuc2UgPSAndnNhbl90cmlhbF9oeXBlci12X29jdDE4JwogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICB3aGVuICd2U3BoZXJlJwogICAgICAgICAgICAgICAgbGljZW5zZSA9ICd2c2FuX3RyaWFsX3ZzcGhlcmVfb2N0MTgnCiAgICAgICAgICAgICAgICBicmVhawogIAogICAgICAgICAgICBicmVhawogIAogICAgICAgICAgd2hlbiAnU3RhcldpbmQgTlZNZS1vRiBJbml0aWF0b3InLCAnU3RhcldpbmQgTlZNZS1vRiBJbml0aWF0b3IgVHJpYWwnCiAgICAgICAgICAgIHVybCA9ICcvZm9ybS1udm1lLW9mLWluaXRpYXRvci12MTkuanMnCiAgICAgICAgICAgIGNhdGVnb3J5ID0gJ1N0YXJXaW5kIE5WTWUtb0YgSW5pdGlhdG9yJwogICAgICAgICAgICBsaWNlbnNlID0gJ1N0YXJXaW5kIE5WTWUtb0YgSW5pdGlhdG9yJwogICAgICAgICAgICBicmVhawogIAogICAgICAgICAgd2hlbiAndnNhbl9mcmVlJywgJ3ZzYW5fdHJpYWwnLCAndnNhbl90cmlhbF9oeXBlci12JywgJ3ZzYW5fdHJpYWxfaHlwZXItdl9vY3QxOCcsICd2c2FuX2ZyZWVfb2N0MTgnCiAgICAgICAgICAgIHVybCA9ICcvZm9ybS0xMTQ5LW5vLWh5cGVydmlzb3ItdjE3LmpzJwogICAgICAgICAgICBjYXRlZ29yeSA9ICdTdGFyV2luZCBWU0FOIEZyZWUnCiAgICAgICAgICAgIGxpY2Vuc2UgPSAndnNhbl9mcmVlX29jdDE4JwogICAqICAgICAgICAgICQoJy5kb3dubG9hZF9fdGV4dCcpLmhpZGUoKQogICAqICAgICAgICAgICQoJyNkb3dubG9hZF9fdGV4dF92c2FuJykuc2hvdygpCiAgICAgICAgICAgIGJyZWFrOwogIAogICAqICAgICAgICB3aGVuICd2c2FuX3RyaWFsX3ZzcGhlcmUnLCAndnNhbl90cmlhbF92c3BoZXJlX29jdDE4JywgJ1N0YXJXaW5kIFZpcnR1YWwgU0FOIGZvciB2U3BoZXJlJwogICAqICAgICAgICAgIHVybCA9ICcvZm9ybS0xMTQ5LW5vLWh5cGVydmlzb3ItdjE3LmpzJwogICMjICAgICAgICAgICQoJy5kb3dubG9hZF9fdGV4dCcpLmhpZGUoKQogICMjICAgICAgICAgICQoJyNkb3dubG9hZF9fdGV4dF92c2FuX3ZTcGhlcmUnKS5zaG93KCkKICAgKiAgICAgICAgICBicmVhazsKICAKICAgICAgICAgIHdoZW4gJ3Z0bCcsICd2dGxfb2N0MTgnCiAgICAgICAgICAgIHVybCA9ICcvZm9ybS0xOTIyLXYxNy5qcycKICAgICAgICAgICAgY2F0ZWdvcnkgPSAnU3RhcldpbmQgVlRMIFRyaWFsJwogICAgICAgICAgICBsaWNlbnNlID0gJ3Z0bF9vY3QxOCcKICAgKiAgICAgICAgICAkKCcuZG93bmxvYWRfX3RleHQnKS5oaWRlKCkKICAgKiAgICAgICAgICAkKCcjZG93bmxvYWRfX3RleHRfdnRsJykuc2hvdygpCiAgICAgICAgICAgIGJyZWFrOwogIAogICAgICAgICAgd2hlbiAndnRsX2ZyZWUnLCAndnRsX2ZyZWVfb2N0MTgnCiAgICAgICAgICAgIHVybCA9ICcvZm9ybS12dGwtZnJlZS12MTguanMnCiAgICAgICAgICAgIGNhdGVnb3J5ID0gJ1ZUTCBGcmVlJwogICAgICAgICAgICBsaWNlbnNlID0gJ3Z0bF9mcmVlX29jdDE4JwogICAqICAgICAgICAgICQoJy5kb3dubG9hZF9fdGV4dCcpLmhpZGUoKQogICAqICAgICAgICAgICQoJyNkb3dubG9hZF9fdGV4dF92dGwnKS5zaG93KCkKICAgICAgICAgICAgYnJlYWs7CiAgCiAgICAgICAgICB3aGVuICdtYW5hZ2VyJwogICAgICAgICAgICB1cmwgPSAnL2Zvcm0tMjA0MS12MTcuanMnCiAgICAgICAgICAgIGNhdGVnb3J5ID0gJ21hbmFnZXInCiAgICAgICAgICAgIGxpY2Vuc2UgPSAnbWFuYWdlcicKICAKICAgKiAgICAgICAgICAkKCcuZG93bmxvYWRfX3RleHQnKS5oaWRlKCkKICAgKiAgICAgICAgICAkKCcjZG93bmxvYWRfX3RleHRfbWFuYWdlcicpLnNob3coKQogICAgICAgICAgICBicmVhazsKICAKICAgICAgICAgIHdoZW4gJ3dlYl9iYXNlZF9tYW5hZ2VtZW50JwogICAgICAgICAgICB1cmwgPSAnL2Zvcm0tMjA4My12MTcuanMnCiAgICAgICAgICAgIGNhdGVnb3J5ID0gJ1N0YXJXaW5kIFdlYi1iYXNlZCBNYW5hZ2VtZW50JwogICAgICAgICAgICBsaWNlbnNlID0gJ3dlYl9iYXNlZF9tYW5hZ2VtZW50JwogICAqICAgICAgICAgICQoJy5kb3dubG9hZF9fdGV4dCcpLmhpZGUoKQogICAqICAgICAgICAgICQoJyNkb3dubG9hZF9fdGV4dF93ZWItYmFzZWRfbWFuYWdlbWVudCcpLnNob3coKQogICAgICAgICAgICBicmVhazsKICAKICAgICAgICAgIHdoZW4gJ3YydicsICdTdGFyV2luZCBWMlYgQ29udmVydGVyJwogICAgICAgICAgICB1cmwgPSAnL2Zvcm0tMTE2Ni12MTcuanMnCiAgICAgICAgICAgIGNhdGVnb3J5ID0gJ1YyViBDb252ZXJ0ZXInCiAgICAgICAgICAgIGxpY2Vuc2UgPSAndjJ2JwogICAqICAgICAgICAgICQoJy5kb3dubG9hZF9fdGV4dCcpLmhpZGUoKQogICAqICAgICAgICAgICQoJyNkb3dubG9hZF9fdGV4dF92MnYnKS5zaG93KCkKICAgICAgICAgICAgYnJlYWs7CiAgCiAgICAgICAgICB3aGVuICd2c2EnCiAgICAgICAgICAgIHVybCA9ICcvZm9ybS0xOTQ3LXJlZ2lzdGVyLXYxNy5qcycKICAgICAgICAgICAgY2F0ZWdvcnkgPSAndnNhJwogICAgICAgICAgICBsaWNlbnNlID0gJ3ZzYScKICAgKiAgICAgICAgICAkKCcuZG93bmxvYWRfX3RleHQnKS5oaWRlKCkKICAgKiAgICAgICAgICAkKCcjZG93bmxvYWRfX3RleHRfdnNhJykuc2hvdygpCiAgICAgICAgICAgIGJyZWFrOwogIAogICAgICAgICAgd2hlbiAnZGVkdXBsaWNhdGlvbl9hbmFseXplcicsICdTdGFyV2luZCBEZWR1cGxpY2F0aW9uIEFuYWx5emVyJwogICAgICAgICAgICB1cmwgPSAnL2Zvcm0tMzAtdjE3LmpzJwogICAgICAgICAgICBjYXRlZ29yeSA9ICdTdGFyV2luZCBEZWR1cGUgQW5hbHl6ZXInCiAgICAgICAgICAgIGxpY2Vuc2UgPSAnZGVkdXBsaWNhdGlvbl9hbmFseXplcicKICAgKiAgICAgICAgICAkKCcuZG93bmxvYWRfX3RleHQnKS5oaWRlKCkKICAgKiAgICAgICAgICAkKCcjZG93bmxvYWRfX3RleHRfZGVkdXBsaWNhdGlvbl9hbmFseXplcicpLnNob3coKQogICAgICAgICAgICBicmVhazsKICAKICAgICAgICAgIHdoZW4gJ3RhcGVfcmVkaXJlY3RvcicsICd0YXBlX3JlZGlyZWN0b3Jfb2N0MTgnLCAnU3RhcldpbmQgVGFwZSBSZWRpcmVjdG9yJwogICAgICAgICAgICB1cmwgPSAnL2Zvcm0tMzktdjE3LmpzJwogICAgICAgICAgICBjYXRlZ29yeSA9ICdUYXBlIFJlZGlyZWN0b3InCiAgICAgICAgICAgIGxpY2Vuc2UgPSAndGFwZV9yZWRpcmVjdG9yX29jdDE4JwogICAqICAgICAgICAgICQoJy5kb3dubG9hZF9fdGV4dCcpLmhpZGUoKQogICAqICAgICAgICAgICQoJyNkb3dubG9hZF9fdGV4dF90YXBlX3JlZGlyZWN0b3InKS5zaG93KCkKICAgICAgICAgICAgYnJlYWs7CiAgCiAgICAgICAgICB3aGVuICdmcmVlLW5hcy1zYW4nLCAnc2FuLW5hcy1mcmVlJywgJ3Nhbi1uYXMtdHJpYWwnCiAgICAgICAgICAgIHVybCA9ICcvZm9ybS1mcmVlLW5hcy1zYW4uanMnCiAgICAgICAgICAgIGNhdGVnb3J5ID0gJ1NBTiBOQVMnCiAgICAgICAgICAgIGxpY2Vuc2UgPSAnc2FuLW5hcy10cmlhbCcKICAgKiAgICAgICAgICAkKCcuZG93bmxvYWRfX3RleHQnKS5oaWRlKCkKICAgKiAgICAgICAgICAkKCcjZG93bmxvYWRfX3RleHRfdGFwZV9yZWRpcmVjdG9yJykuc2hvdygpCiAgICAgICAgICAgIGJyZWFrOwogIAogICAgICAgICAgd2hlbiAndnRsX2Nsb3VkJywgJ3RyaWFsLXZ0bC10by1jbG91ZF9vY3QxOCcsICdTdGFyV2luZCBDbG91ZCBWVEwgZm9yIEFXUyBhbmQgVmVlYW0nCiAgICAgICAgICAgIHVybCA9ICcvZm9ybS0xOTk4LXYxNy5qcycKICAgICAgICAgICAgY2F0ZWdvcnkgPSAnVlRMIENsb3VkJwogICAqICAgICAgICAgICQoJy5kb3dubG9hZF9fdGV4dCcpLmhpZGUoKQogICAqICAgICAgICAgICQoJyNkb3dubG9hZF9fdGV4dF92dGxfY2xvdWQnKS5zaG93KCkKICAgICAgICAgICAgYnJlYWs7CiAgCiAgICAgICAgICB3aGVuICdyYW1fZGlzaycsICdTdGFyV2luZCBSQU0gRGlzaycKICAgICAgICAgICAgdXJsID0gJy9mb3JtLXJhbWRpc2stdjE3LmpzJwogICAgICAgICAgICBjYXRlZ29yeSA9ICdSQU0gRGlzaycKICAgICAgICAgICAgbGljZW5zZSA9ICdyYW1fZGlzaycKICAgKiAgICAgICAgICAkKCcuZG93bmxvYWRfX3RleHQnKS5oaWRlKCkKICAgKiAgICAgICAgICAkKCcjZG93bmxvYWRfX3RleHRfcmFtX2Rpc2snKS5zaG93KCkKICAgICAgICAgICAgYnJlYWs7CiAgCiAgICAgICAgICB3aGVuICdpc2NzaV9pbml0aWF0b3InCiAgICAgICAgICAgIHVybCA9ICcvZm9ybS1pc2NzaS1pbml0aWF0b3ItdjE3LmpzJwogICAgICAgICAgICBjYXRlZ29yeSA9ICdTdGFyV2luZCBpU0NTSSBJbml0aWF0b3InCiAgICAgICAgICAgIGxpY2Vuc2UgPSAnaXNjc2lfaW5pdGlhdG9yJwogICAqICAgICAgICAgICQoJy5kb3dubG9hZF9fdGV4dCcpLmhpZGUoKQogICAqICAgICAgICAgICQoJyNkb3dubG9hZF9fdGV4dF9pc2NzaV9pbml0aWF0b3InKS5zaG93KCkKICAgICAgICAgICAgYnJlYWs7CiAgCiAgICAgICAgICB3aGVuICdiYWNrYmxhemUnLCAnYmFja2JsYXplX29jdDE4JywgJ1N0YXJXaW5kIFN0b3JhZ2UgR2F0ZXdheSBmb3IgQmFja2JsYXplJwogICAgICAgICAgICB1cmwgPSAnL2Zvcm0tYmFja2JsYXplLXYxNy5qcycKICAgICAgICAgICAgY2F0ZWdvcnkgPSAnU3RhcldpbmQgU3RvcmFnZSBHYXRld2F5IGZvciBCYWNrYmxhemUnCiAgICogICAgICAgICAgJCgnLmRvd25sb2FkX190ZXh0JykuaGlkZSgpCiAgICogICAgICAgICAgJCgnI2Rvd25sb2FkX190ZXh0X2JhY2tibGF6ZScpLnNob3coKQogICAgICAgICAgICBicmVhazsKICAKICAgICAgICAgIHdoZW4gJ3dhc2FiaScsICd3YXNhYmlfb2N0MTgnLCAnU3RhcldpbmQgU3RvcmFnZSBHYXRld2F5IGZvciBXYXNhYmknCiAgICAgICAgICAgIHVybCA9ICcvZm9ybS13YXNhYmktdjE4LmpzJwogICAgICAgICAgICBjYXRlZ29yeSA9ICdTdGFyV2luZCBTdG9yYWdlIEdhdGV3YXkgZm9yIFdhc2FiaScKICAgKiAgICAgICAgICAkKCcuZG93bmxvYWRfX3RleHQnKS5oaWRlKCkKICAgKiAgICAgICAgICAkKCcjZG93bmxvYWRfX3RleHRfd2FzYWJpJykuc2hvdygpCiAgICAgICAgICAgIGJyZWFrOwogIAogICAgICAgICAgd2hlbiAnc3RhcndpbmRfclBlcmYnLCAnU3RhcldpbmQgclBlcmYnCiAgICAgICAgICAgIHVybCA9ICcvZm9ybS1ycGVyZi12MTguanMnCiAgICAgICAgICAgIGNhdGVnb3J5ID0gJ1N0YXJXaW5kIHJQZXJmJwogICAgICAgICAgICBsaWNlbnNlID0gJ3N0YXJ3aW5kX3JQZXJmJwogICAqICAgICAgICAgICQoJy5kb3dubG9hZF9fdGV4dCcpLmhpZGUoKQogICAqICAgICAgICAgICQoJyNkb3dubG9hZF9fdGV4dF9TdGFyV2luZF9yUGVyZicpLnNob3coKQogICAgICAgICAgICBicmVhazsKICAKICAgICAgICAgIHdoZW4gJ2lTQ1NJX0FjY2VsZXJhdG9yJywgJ1N0YXJXaW5kIGlTQ1NJIEFjY2VsZXJhdG9yJwogICAgICAgICAgICB1cmwgPSAnL2Zvcm0taXNjc2ktYWNjZWxlcmF0b3ItdjE4LmpzJwogICAgICAgICAgICBjYXRlZ29yeSA9ICdTdGFyV2luZCBpU0NTSSBBY2NlbGVyYXRvcicKICAgICAgICAgICAgbGljZW5zZSA9ICdpU0NTSV9BY2NlbGVyYXRvcicKICAgKiAgICAgICAgICAkKCcuZG93bmxvYWRfX3RleHQnKS5oaWRlKCkKICAgICAgICAgICAgYnJlYWs7CiAgCiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHVybCA9ICd1bmtub3duIGxpY2Vuc2UnCiAgICogICAgICAgICAgJCgnLmRvd25sb2FkX190ZXh0JykuaGlkZSgpCiAgICogICAgICAgICAgJCgnI2Rvd25sb2FkX190ZXh0X3ZzYW4nKS5zaG93KCkKICAgICAgICAgICAgYnJlYWs7CiAgCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHVybDogdXJsCiAgICAgICAgICBsaWNlbnNlOiBsaWNlbnNlCiAgICAgICAgICBjYXRlZ29yeTogY2F0ZWdvcnkKICAgICAgICB9CiAgICovCgp9KS5jYWxsKHRoaXMpOwoKLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZG93bmxvYWQuanMubWFwCg==
8 ms
underscore-min.js
910 ms
backbone-min.js
923 ms
backbone-validation-min.js
1190 ms
Backbone.ModelBinder.js
940 ms
javascript;base64,Ly8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjcKKGZ1bmN0aW9uKCkgewogIHZhciBmdW5jX25vX3ZhbGlkLAogICAgZXh0ZW5kID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChoYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LAogICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5OwoKICB0aGlzLkFwcCB8fCAodGhpcy5BcHAgPSB7CiAgICBNb2RlbHM6IHt9LAogICAgVmlld3M6IHt9LAogICAgQ29sbGVjdGlvbnM6IHt9LAogICAgQXBwOiB7fSwKICAgIFZhcnM6IHt9CiAgfSk7CgogIHRoaXMudGVtcGxhdGUgPSBmdW5jdGlvbihpZCkgewogICAgcmV0dXJuIF8udGVtcGxhdGUoJCgnIycgKyBpZCkuaHRtbCgpKTsKICB9OwoKICBmdW5jX25vX3ZhbGlkID0gZnVuY3Rpb24oZGF0YSkgewogICAgdmFyIGQ7CiAgICBkID0gZGF0YTsKICAgIGQuZnJvbV91cmwgPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmOwogICAgaWYgKCFqUXVlcnkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgJC5wb3N0KCIvbm90LXZhbGlkLWRhdGEtdjIwLmpzIiwgZCk7CiAgfTsKCiAgalF1ZXJ5KGZ1bmN0aW9uKCkgewogICAgdmFyIGV1cm96b25lX2NoZWNrYm94LCBldXJvem9uZV9zdGF0dXMsIGV1em9uZV9mdW5jOwogICAgZXVyb3pvbmVfc3RhdHVzID0gZmFsc2U7CiAgICBldXpvbmVfZnVuYyA9IGZ1bmN0aW9uKGNvdW50cnkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9OwogICAgZXVyb3pvbmVfY2hlY2tib3ggPSBmdW5jdGlvbihzdGF0dXMpIHsKICAgICAgaWYgKHN0YXR1cykgewogICAgICAgIGV1cm96b25lX3N0YXR1cyA9IHRydWU7CiAgICAgICAgJCgnI3F1b3RlLXpvbmUtY2hla2JveC0xJykuc2hvdygpOwogICAgICAgICQoJyNxdW90ZS16b25lLWNoZWtib3gtMicpLmhpZGUoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBldXJvem9uZV9zdGF0dXMgPSBmYWxzZTsKICAgICAgICAkKCcjcXVvdGUtem9uZS1jaGVrYm94LTEnKS5oaWRlKCk7CiAgICAgICAgJCgnI3F1b3RlLXpvbmUtY2hla2JveC0yJykuc2hvdygpOwogICAgICB9CiAgICB9OwogICAgaWYgKCh0eXBlb2Ygc3dfZWxlbWVudDQgIT09ICJ1bmRlZmluZWQiICYmIHN3X2VsZW1lbnQ0ICE9PSBudWxsKSkgewogICAgICBzd19lbGVtZW50NC5hZGRFdmVudExpc3RlbmVyKCdjaG9pY2UnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgIHJldHVybiBldXJvem9uZV9jaGVja2JveChldXpvbmVfZnVuYyhldmVudC5kZXRhaWwuY2hvaWNlLnZhbHVlKSk7CiAgICAgIH0pOwogICAgfQogICAgQXBwLlZhcnMudmFsaWRFbWFpbF9xdW90ZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgaWYgKHdpbmRvdy5zdWNjZXNzRm9ybVN1Ym1pdCA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgICQuYWpheCh7CiAgICAgICAgdXJsOiAnL3ZhbGlkZW1haWwuanMnLAogICAgICAgIHR5cGU6ICJQT1NUIiwKICAgICAgICBkYXRhOiB7CiAgICAgICAgICBlbWFpbDogb3B0aW9ucy5lbWFpbAogICAgICAgIH0sCiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgIHZhciBvYmo7CiAgICAgICAgICBvYmogPSB7fTsKICAgICAgICAgIG9iai5jYXRlZ29yeSA9ICcnOwogICAgICAgICAgb2JqLmNhdGVnb3J5ID0gb3B0aW9ucy5saWNlbnNlOwogICAgICAgICAgb3B0aW9ucy52YWxpZCA9IHJlc3BvbnNlLmVtYWlsU3RhdHVzOwogICAgICAgICAgb3B0aW9ucy51c2VyID0gcmVzcG9uc2UuY2lkOwogICAgICAgICAgb3B0aW9ucy5jYXRlZ29yeSA9IG9iai5jYXRlZ29yeTsKICAgICAgICAgIHdpbmRvdy5zdWNjZXNzRm9ybVN1Ym1pdChvcHRpb25zKTsKICAgICAgICB9LAogICAgICAgIGRhdGFUeXBlOiAnanNvbicKICAgICAgfSk7CiAgICB9OwogICAgQXBwLlZhcnMudXJsXzMgPSAnL2Zvcm0tMjAzNi12MTcuanMnOwogICAgQXBwLlZhcnMuc2VuZEFqYXhPcHRpb25zXzMgPSB7CiAgICAgIGRhdGE6IG51bGwsCiAgICAgIG1ldGhvZDogJ3Bvc3QnLAogICAgICBkYXRhVHlwZTogJ2pzb24nLAogICAgICBwcm9jZXNzRGF0YTogdHJ1ZSwKICAgICAgdXJsOiBBcHAuVmFycy51cmxfMywKICAgICAgY2FjaGU6IGZhbHNlCiAgICB9OwogICAgQXBwLlZhcnMuVmFsaWRhdGVNZXNzYWdlID0gewogICAgICAnZmlyc3RuYW1lX2xhc3RuYW1lX21hdGNoJzogJyJGaXJzdCBOYW1lIiBhbmQgIkxhc3QgTmFtZSIgY2FuXCd0IGJlIGlkZW50aWNhbCcsCiAgICAgICdsYXRpbl9hbmRfd2hpdGVzcGFjZSc6ICdPbmx5IExhdGluIGFscGhhYmV0IG1heSBiZSB1c2VkIGluIHRoZSBmb3JtLicsCiAgICAgICd2YWxpZGF0ZV9yZXF1aXJlZCc6ICcnLAogICAgICAndmFsaWRhdGVfbWluX2xlbic6ICcnLAogICAgICAncmVwZWF0X3N5bWJvbHMnOiAnVG9vIG11Y2ggcmVwZWF0IHN5bWJvbHMuJywKICAgICAgJ3ZhbGlkYXRlX2FscGhhJzogJ09ubHkgTGF0aW4gYWxwaGFiZXQgbWF5IGJlIHVzZWQgaW4gdGhlIGZvcm0uJywKICAgICAgJ2Zha2Vfd29yZHMnOiAnRmFrZSBpbmZvcm1hdGlvbiBpcyBwcm9oaWJpdGVkLicsCiAgICAgICdwdWJsaWNfZW1haWwnOiAnUHVibGljIG9yIGZyZWUgZW1haWwgaXMgZW50ZXJlZCBpbiAiQ29ycG9yYXRlIEVtYWlsIiBmaWVsZC4gQW4gZW1haWwgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggeW91ciBjb21wYW55IGlzIHJlcXVpcmVkLiBDb250YWN0IDxhIGhyZWY9Im1haWx0bzpzYWxlc0BzdGFyd2luZC5jb20iPnNhbGVzQHN0YXJ3aW5kLmNvbTwvYT4gaW4gY2FzZSB5b3UgZG9uXCd0IGhhdmUgaXQuJywKICAgICAgJ3Bob25lX251bWJlcic6ICdQbGVhc2UgZW50ZXIgdmFsaWQgcGhvbmUgbnVtYmVyJwogICAgfTsKICAgIF8uZXh0ZW5kKEJhY2tib25lLlZhbGlkYXRpb24udmFsaWRhdG9ycywgewogICAgICBGaXJzdExhc3ROYW1lQ29tcGFyZTogZnVuY3Rpb24odmFsdWUsIGF0dHIsIGN1c3RvbVZhbHVlLCBtb2RlbCkgewogICAgICAgIGlmICgkKCcjZmlyc3RuYW1lJykudmFsKCkgPT09ICQoJyNsYXN0bmFtZScpLnZhbCgpKSB7CiAgICAgICAgICByZXR1cm4gJyJGaXJzdCBOYW1lIiBhbmQgIkxhc3QgTmFtZSIgY2FuXCd0IGJlIGlkZW50aWNhbCc7CiAgICAgICAgfQogICAgICB9LAogICAgICBMYXRpblN5bWJvbHM6IGZ1bmN0aW9uKHZhbHVlLCBhdHRyLCBjdXN0b21WYWx1ZSwgbW9kZWwpIHsKICAgICAgICB2YXIgcmVzOwogICAgICAgIHJlcyA9IHZhbHVlLm1hdGNoKC9eW0EtWmEtel17MiwzMH0kL2kpOwogICAgICAgIGlmIChyZXMgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuICdPbmx5IExhdGluIGFscGhhYmV0IG1heSBiZSB1c2VkIGluIHRoZSBmb3JtLic7CiAgICAgICAgfQogICAgICB9LAogICAgICBMYXRpblN5bWJvbHNXaGl0ZXNwYWNlOiBmdW5jdGlvbih2YWx1ZSwgYXR0ciwgY3VzdG9tVmFsdWUsIG1vZGVsKSB7CiAgICAgICAgdmFyIHJlczsKICAgICAgICByZXMgPSB2YWx1ZS5tYXRjaCgvXltBLVphLXpcc117MiwzMH0kL2kpOwogICAgICAgIGlmIChyZXMgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuICdPbmx5IExhdGluIGFscGhhYmV0IG1heSBiZSB1c2VkIGluIHRoZSBmb3JtLic7CiAgICAgICAgfQogICAgICB9LAogICAgICBQbGFjZWhvbGRlclZhbHVlOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIGlmICh2YWx1ZSA9PT0gJ3BsYWNlaG9sZGVyJykgewogICAgICAgICAgcmV0dXJuICdFcnJvcic7CiAgICAgICAgfQogICAgICB9LAogICAgICBDb3Jwb3JhdGVFbWFpbDogZnVuY3Rpb24odmFsdWUsIGF0dHIsIGN1c3RvbVZhbHVlLCBtb2RlbCkgewogICAgICAgIHZhciBvcHRpb25zLCBvdXQ7CiAgICAgICAgaWYgKHZhbHVlID09PSAnJykgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBvdXQgPSAnJzsKICAgICAgICBtb2RlbCA9IG5ldyBCYWNrYm9uZS5Nb2RlbCgpOwogICAgICAgIG1vZGVsLnNldCgnZW1haWwnLCB2YWx1ZSk7CiAgICAgICAgb3B0aW9ucyA9IEFwcC5WYXJzLnNlbmRBamF4T3B0aW9uc18zOwogICAgICAgIG9wdGlvbnMuYXN5bmMgPSBmYWxzZTsKICAgICAgICBvcHRpb25zLmRhdGEgPSBtb2RlbC50b0pTT04oKTsKICAgICAgICBvcHRpb25zLmRhdGEuZW50aXR5ID0gJ2VtYWlsJzsKICAgICAgICBvcHRpb25zLmRhdGEubWV0aG9kID0gJ2lzX2NvcnBvcmF0ZSc7CiAgICAgICAgb3B0aW9ucy5zdWNjZXNzID0gZnVuY3Rpb24obW9kZWwsIHJlc3BvbnNlLCBvcHRpb25zKSB7CiAgICAgICAgICBpZiAoKHJlc3BvbnNlLmlzX2NvcnBvcmF0ZSAhPSBudWxsKSAmJiByZXNwb25zZS5pc19jb3Jwb3JhdGUpIHsKICAgICAgICAgICAgcmV0dXJuIG91dCA9ICcnOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG91dCA9ICdQdWJsaWMgb3IgZnJlZSBlbWFpbCBpcyBlbnRlcmVkIGluICJDb3Jwb3JhdGUgRW1haWwiIGZpZWxkLiBBbiBlbWFpbCBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB5b3VyIGNvbXBhbnkgaXMgcmVxdWlyZWQuIENvbnRhY3Qgc2FsZXNAc3RhcndpbmQuY29tIGluIGNhc2UgeW91IGRvblwndCBoYXZlIGl0Lic7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBtb2RlbC5zYXZlKG51bGwsIG9wdGlvbnMpOwogICAgICAgIGlmIChvdXQgIT09ICcnKSB7CiAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBBcHAuTW9kZWxzLk1vZGVsID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHsKICAgICAgZXh0ZW5kKE1vZGVsLCBzdXBlckNsYXNzKTsKCiAgICAgIGZ1bmN0aW9uIE1vZGVsKCkgewogICAgICAgIHJldHVybiBNb2RlbC5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgfQoKICAgICAgTW9kZWwucHJvdG90eXBlLmRlZmF1bHRzID0gewogICAgICAgIGZpcnN0bmFtZTogJycsCiAgICAgICAgbGFzdG5hbWU6ICcnLAogICAgICAgIGVtYWlsOiAnJywKICAgICAgICB0aXRsZTogJycsCiAgICAgICAgY29tcGFueTogJycsCiAgICAgICAgY291bnRyeTogJycsCiAgICAgICAgcGhvbmUyOiAnJywKICAgICAgICBwcm9kdWN0OiAnJwogICAgICB9OwoKICAgICAgTW9kZWwucHJvdG90eXBlLnZhbGlkYXRpb24gPSB7CiAgICAgICAgdXNlX3dpdGg6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICAgIG1zZzogJ1VzZSB3aXRoIGlzIHJlcXVpcmVkJwogICAgICAgICAgfSwgewogICAgICAgICAgICBQbGFjZWhvbGRlclZhbHVlOiAxCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICBsaWNlbnNlOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgICBtc2c6ICdMaWNlbnNlIGlzIHJlcXVpcmVkJwogICAgICAgICAgfSwgewogICAgICAgICAgICBQbGFjZWhvbGRlclZhbHVlOiAxCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICBjb3VudHJ5OiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgICBtc2c6ICdDb3VudHJ5IGlzIHJlcXVpcmVkJwogICAgICAgICAgfSwgewogICAgICAgICAgICBQbGFjZWhvbGRlclZhbHVlOiAxCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICBwcm9kdWN0OiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgICBtc2c6ICdQcm9kdWN0IGlzIHJlcXVpcmVkJwogICAgICAgICAgfSwgewogICAgICAgICAgICBQbGFjZWhvbGRlclZhbHVlOiAxCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICBmaXJzdG5hbWU6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICAgIG1zZzogJ0ZpcnN0IE5hbWUgaXMgcmVxdWlyZWQnCiAgICAgICAgICB9LCB7CiAgICAgICAgICAgIFJlcGVhdFN5bWJvbHM6IDEKICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgIGxhc3RuYW1lOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgICBtc2c6ICdMYXN0IE5hbWUgaXMgcmVxdWlyZWQnCiAgICAgICAgICB9LCB7CiAgICAgICAgICAgIFJlcGVhdFN5bWJvbHM6IDEKICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgIGVtYWlsOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgICBtc2c6ICdFbWFpbCBpcyByZXF1aXJlZCcKICAgICAgICAgIH0sIHsKICAgICAgICAgICAgcGF0dGVybjogJ2VtYWlsJywKICAgICAgICAgICAgbXNnOiAnUGxlYXNlIHByb3ZpZGUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzJwogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgdGl0bGU6IHsKICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgbXNnOiAnVGl0bGUgaXMgcmVxdWlyZWQnCiAgICAgICAgfSwKICAgICAgICBjb21wYW55OiB7CiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKICAgICAgICAgIG1zZzogJ0NvbXBhbnkgaXMgcmVxdWlyZWQnCiAgICAgICAgfSwKICAgICAgICBwaG9uZTogewogICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICBtc2c6ICdQaG9uZSBpcyByZXF1aXJlZCcKICAgICAgICB9CiAgICAgIH07CgogICAgICByZXR1cm4gTW9kZWw7CgogICAgfSkoQmFja2JvbmUuTW9kZWwpOwogICAgQXBwLlZhcnMubWFpbk1vZGVsID0gbmV3IEFwcC5Nb2RlbHMuTW9kZWwoKTsKICAgIGlmICghJCgiI2dldF9xdW90ZV9mb3JtIikubGVuZ3RoKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIEFwcC5WaWV3cy5Gb3JtID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHsKICAgICAgZXh0ZW5kKEZvcm0sIHN1cGVyQ2xhc3MpOwoKICAgICAgZnVuY3Rpb24gRm9ybSgpIHsKICAgICAgICByZXR1cm4gRm9ybS5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgfQoKICAgICAgRm9ybS5wcm90b3R5cGUuZWwgPSAnI2dldF9xdW90ZV9mb3JtJzsKCiAgICAgIEZvcm0ucHJvdG90eXBlLmV2ZW50cyA9IHsKICAgICAgICAnY2xpY2sgLnF1b3RlX19mb3JtLXN1Ym1pdCc6ICdzdWJtaXRGb3JtJwogICAgICB9OwoKICAgICAgRm9ybS5wcm90b3R5cGUuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBjb3VudHJ5OwogICAgICAgIGNvdW50cnkgPSAkKCcjcXVvdGVfY291bnRyeScpLnZhbCgpOwogICAgICAgIHRoaXMubW9kZWwuc2V0KCdjb3VudHJ5JywgY291bnRyeSk7CiAgICAgICAgZXVyb3pvbmVfY2hlY2tib3goZXV6b25lX2Z1bmMoY291bnRyeSkpOwogICAgICAgIHRoaXMubW9kZWwuc2V0KCdwcm9kdWN0JywgJCgnI3F1b3RlX2xpY2Vuc2UnKS52YWwoKSk7CiAgICAgICAgdGhpcy5tb2RlbC5zZXQoJ2ZpcnN0bmFtZScsICQoJyNxdW90ZV9maXJzdG5hbWUnKS52YWwoKSk7CiAgICAgICAgdGhpcy5tb2RlbC5zZXQoJ2xhc3RuYW1lJywgJCgnI3F1b3RlX2xhc3RuYW1lJykudmFsKCkpOwogICAgICAgIHRoaXMubW9kZWwuc2V0KCdjb21wYW55JywgJCgnI3F1b3RlX2NvbXBhbnknKS52YWwoKSk7CiAgICAgICAgdGhpcy5tb2RlbC5zZXQoJ3RpdGxlJywgJCgnI3F1b3RlX3RpdGxlJykudmFsKCkpOwogICAgICAgIHRoaXMubW9kZWwuc2V0KCdlbWFpbCcsICQoJyNxdW90ZV9lbWFpbCcpLnZhbCgpKTsKICAgICAgICB0aGlzLm1vZGVsLnNldCgndXJsJywgIlNpdGU6ICIgKyB3aW5kb3cubG9jYXRpb24uaHJlZik7CiAgICAgICAgdGhpcy5tb2RlbC5zZXQoJ3NvdXJjZV91cmwnLCAiIiArIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsKICAgICAgICB0aGlzLm1vZGVsLnNldCgncGhvbmUyJywgJCgnI3F1b3RlX3Bob25lMicpLmF0dHIoJ3ZhbHVlJykpOwogICAgICAgIHN3aXRjaCAodGhpcy5tb2RlbC5nZXQoJ3Byb2R1Y3QnKSkgewogICAgICAgICAgY2FzZSAnU3RhcldpbmQgU3RvcmFnZSBHYXRld2F5IGZvciBCYWNrYmxhemUnOgogICAgICAgICAgICAkKCcucmVxdWVzdF9xdW90ZV9fdGV4dCcpLmhpZGUoKTsKICAgICAgICAgICAgJCgnI3JlcXVlc3RfcXVvdGVfX3RleHRfYmFja2JsYXplJykuc2hvdygpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ0Nsb3VkIFZUTCBmb3IgQVdTIGFuZCBWZWVhbSc6CiAgICAgICAgICAgICQoJy5yZXF1ZXN0X3F1b3RlX190ZXh0JykuaGlkZSgpOwogICAgICAgICAgICAkKCcjcmVxdWVzdF9xdW90ZV9fdGV4dF9jbG91ZHZ0bCcpLnNob3coKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAkKCcucmVxdWVzdF9xdW90ZV9fdGV4dCcpLmhpZGUoKTsKICAgICAgICAgICAgJCgnI3JlcXVlc3RfcXVvdGVfX3RleHRfZGVmYXVsdCcpLnNob3coKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHRoaXMubW9kZWxCaW5kZXIgPSBuZXcgQmFja2JvbmUuTW9kZWxCaW5kZXIoKTsKICAgICAgICB0aGlzLm1vZGVsQmluZGVyLmJpbmQodGhpcy5tb2RlbCwgdGhpcy5lbCk7CiAgICAgICAgdGhpcy5tb2RlbC5iaW5kKCd2YWxpZGF0ZWQnLCB0aGlzLnZhbGlkYXRlZEhvb2ssIHRoaXMpOwogICAgICAgIEJhY2tib25lLlZhbGlkYXRpb24uYmluZCh0aGlzKTsKICAgICAgfTsKCiAgICAgIEZvcm0ucHJvdG90eXBlLnZhbGlkYXRlZEhvb2sgPSBmdW5jdGlvbihpc1ZhbGlkLCBtb2RlbCwgZXJyb3JzKSB7CiAgICAgICAgdmFyIGtleTsKICAgICAgICBmb3IgKGtleSBpbiBtb2RlbC50b0pTT04oKSkgewogICAgICAgICAgJCgnLmZvcm1TZWdXcmFwXycgKyBrZXkgKyAnIC5lcnJvckNvbnRhaW5lcicpLmVtcHR5KCk7CiAgICAgICAgICBpZiAoKGVycm9yc1trZXldICE9IG51bGwpKSB7CiAgICAgICAgICAgICQoJyNnZXRfcXVvdGVfZm9ybSAjcXVvdGVfJyArIGtleSkubmV4dCgnLmVycm9yJykucmVtb3ZlKCk7CiAgICAgICAgICAgICQoJyNnZXRfcXVvdGVfZm9ybSAjcXVvdGVfJyArIGtleSkuYWZ0ZXIoIjxzcGFuIGNsYXNzPVwiZXJyb3JcIiBmb3I9XCIiICsga2V5ICsgIlwiPiIgKyBlcnJvcnNba2V5XSArICI8L3NwYW4+Iik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkKCcjZ2V0X3F1b3RlX2Zvcm0gI3F1b3RlXycgKyBrZXkpLm5leHQoJy5lcnJvcicpLnJlbW92ZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKCiAgICAgIEZvcm0ucHJvdG90eXBlLnN1Ym1pdEZvcm0gPSBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIGNoZWNrX21lLCBjaGVja19tZV9sYWJlbCwgbW9kZWwsIG9wdGlvbnM7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNoZWNrX21lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1b3RlX2NoZWNrX21lJyk7CiAgICAgICAgY2hlY2tfbWVfbGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVvdGVfY2hlY2ttYXJrJyk7CiAgICAgICAgaWYgKGV1cm96b25lX3N0YXR1cykgewogICAgICAgICAgaWYgKGNoZWNrX21lLmNoZWNrZWQpIHsKICAgICAgICAgICAgJChjaGVja19tZV9sYWJlbCkucmVtb3ZlQ2xhc3MoJ2Vycm9yJyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkKGNoZWNrX21lX2xhYmVsKS5hZGRDbGFzcygnZXJyb3InKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghY2hlY2tfbWUuY2hlY2tlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMubW9kZWwuc2V0KCdmaXJzdG5hbWUnLCAkKCcjcXVvdGVfZmlyc3RuYW1lJykudmFsKCkpOwogICAgICAgIHRoaXMubW9kZWwuc2V0KCdsYXN0bmFtZScsICQoJyNxdW90ZV9sYXN0bmFtZScpLnZhbCgpKTsKICAgICAgICB0aGlzLm1vZGVsLnNldCgndGl0bGUnLCAkKCcjcXVvdGVfdGl0bGUnKS52YWwoKSk7CiAgICAgICAgdGhpcy5tb2RlbC5zZXQoJ2VtYWlsJywgJCgnI3F1b3RlX2VtYWlsJykudmFsKCkpOwogICAgICAgIHRoaXMubW9kZWwuc2V0KCdjb21wYW55JywgJCgnI3F1b3RlX2NvbXBhbnknKS52YWwoKSk7CiAgICAgICAgdGhpcy5tb2RlbC5zZXQoJ2NvdW50cnknLCAkKCcjcXVvdGVfY291bnRyeScpLnZhbCgpKTsKICAgICAgICB0aGlzLm1vZGVsLnNldCgncHJvZHVjdCcsICQoJyNxdW90ZV9saWNlbnNlJykudmFsKCkpOwogICAgICAgIHRoaXMubW9kZWwuc2V0KCdwaG9uZTInLCAkKCcjcXVvdGVfcGhvbmUyJykudmFsKCkpOwogICAgICAgIHRoaXMubW9kZWwuc2V0KCdjb21tZW50cycsICQoJyNxdW90ZV9jb21tZW50cycpLnZhbCgpKTsKICAgICAgICAkKCdib2R5JykuYWRkQ2xhc3MoJ3ByZWxvYWRlcicpOwogICAgICAgIG1vZGVsID0gbmV3IEJhY2tib25lLk1vZGVsKHRoaXMubW9kZWwudG9KU09OKCkpOwogICAgICAgIG9wdGlvbnMgPSBBcHAuVmFycy5zZW5kQWpheE9wdGlvbnNfMzsKICAgICAgICBvcHRpb25zLmRhdGEgPSBtb2RlbC50b0pTT04oKTsKICAgICAgICBvcHRpb25zLmRhdGFbJ3VuaXFfcGFyYW0nXSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CiAgICAgICAgb3B0aW9ucy5zdWNjZXNzID0gKGZ1bmN0aW9uKF90aGlzKSB7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24obW9kZWwsIHJlc3BvbnNlLCBvcHRpb25zKSB7CiAgICAgICAgICAgICQoJ2JvZHknKS5yZW1vdmVDbGFzcygncHJlbG9hZGVyJyk7CiAgICAgICAgICAgIGlmICgocmVzcG9uc2Uuc3VjY2VzcyAhPSBudWxsKSAmJiByZXNwb25zZS5zdWNjZXNzID09PSBmYWxzZSkgewogICAgICAgICAgICAgIGZ1bmNfbm9fdmFsaWQob3B0aW9ucy5kYXRhKTsKICAgICAgICAgICAgICBfdGhpcy5jaGVja1JlcXVlc3QocmVzcG9uc2UpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICQoIiNnZXRfcXVvdGVfZm9ybSIpLmhpZGUoKTsKICAgICAgICAgICAgICAkKCcjcXVvdGUtdGhhbmsteW91LnF1b3RlLXRoYW5rLXlvdScpLnNob3coKTsKICAgICAgICAgICAgICBjaGVja19tZV9sYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdW90ZV9jaGVja21hcmsnKTsKICAgICAgICAgICAgICBjaGVja19tZV9sYWJlbC5jbGFzc0xpc3QucmVtb3ZlKCdlcnJvcicpOwogICAgICAgICAgICAgIGNoZWNrX21lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1b3RlX2NoZWNrX21lJyk7CiAgICAgICAgICAgICAgY2hlY2tfbWUuY2hlY2tlZCA9IGZhbHNlOwogICAgICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICAgICAgICBvcHRpb25zLmFjdGlvbiA9ICdHZXQgUHJpY2luZyc7CiAgICAgICAgICAgICAgb3B0aW9ucy5sb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwogICAgICAgICAgICAgIG9wdGlvbnMuZW1haWwgPSBtb2RlbC5nZXQoJ2VtYWlsJyk7CiAgICAgICAgICAgICAgb3B0aW9ucy5saWNlbnNlID0gbW9kZWwuZ2V0KCdwcm9kdWN0Jyk7CiAgICAgICAgICAgICAgQXBwLlZhcnMudmFsaWRFbWFpbF9xdW90ZShvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICB9KSh0aGlzKTsKICAgICAgICBtb2RlbC5zYXZlKG51bGwsIG9wdGlvbnMpOwogICAgICB9OwoKICAgICAgRm9ybS5wcm90b3R5cGUuY2hlY2tSZXF1ZXN0ID0gZnVuY3Rpb24ocmVzKSB7CiAgICAgICAgdmFyIGVycm9ycywgaywga2V5LCBwaG9uZTJfdGVzdCwgcGhvbmVfbnVtYmVyX2ZsYWc7CiAgICAgICAgZXJyb3JzID0gewogICAgICAgICAgbGVuZ3RoOiAwCiAgICAgICAgfTsKICAgICAgICBmb3IgKGtleSBpbiByZXMuZGF0YSkgewogICAgICAgICAgaWYgKChlcnJvcnNbcmVzLmRhdGFba2V5XVsnZmllbGQnXV0gIT0gbnVsbCkpIHsKICAgICAgICAgICAgZXJyb3JzW3Jlcy5kYXRhW2tleV1bJ2ZpZWxkJ11dLnB1c2gocmVzLmRhdGFba2V5XVsncnVsZSddKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVycm9yc1tyZXMuZGF0YVtrZXldWydmaWVsZCddXSA9IFtyZXMuZGF0YVtrZXldWydydWxlJ11dOwogICAgICAgICAgfQogICAgICAgICAgZXJyb3JzLmxlbmd0aCArPSAxOwogICAgICAgIH0KICAgICAgICAkKCcjZ2V0X3F1b3RlX2Zvcm0gc3Bhbi5lcnJvcicpLnJlbW92ZSgpOwogICAgICAgIGlmICgoZXJyb3JzLmxlbmd0aCAhPSBudWxsKSAmJiBlcnJvcnMubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICBwaG9uZV9udW1iZXJfZmxhZyA9IDA7CiAgICAgICAgICBmb3IgKGtleSBpbiBlcnJvcnMpIHsKICAgICAgICAgICAgaWYgKGtleSAhPT0gJ2xlbmd0aCcpIHsKICAgICAgICAgICAgICBzd2l0Y2ggKGtleSkgewogICAgICAgICAgICAgICAgY2FzZSAncHJvZHVjdCc6CiAgICAgICAgICAgICAgICBjYXNlICdjb3VudHJ5JzoKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICBmb3IgKGsgaW4gZXJyb3JzW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGVycm9yc1trZXldW2tdKSB7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2YWxpZGF0ZV9yZXF1aXJlZCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW1haWwnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2dldF9xdW90ZV9mb3JtICNxdW90ZV8nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPkVtYWlsIGlzIHJlcXVpcmVkPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29tcGFueSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2V0X3F1b3RlX2Zvcm0gI3F1b3RlXycgKyBrZXkpLmFmdGVyKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+Q29tcGFueSBpcyByZXF1aXJlZDwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RpdGxlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNnZXRfcXVvdGVfZm9ybSAjcXVvdGVfJyArIGtleSkuYWZ0ZXIoIjxzcGFuIGNsYXNzPVwiZXJyb3JcIj5Kb2IgVGl0bGUgaXMgcmVxdWlyZWQuPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncGhvbmUyJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNnZXRfcXVvdGVfZm9ybSAjcXVvdGVfJyArIGtleSkuYWZ0ZXIoIjxzcGFuIGNsYXNzPVwiZXJyb3JcIj5QaG9uZSBOdW1iZXIgaXMgcmVxdWlyZWQuPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY291bnRyeSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2V0X3F1b3RlX2Zvcm0gI3F1b3RlXycgKyBrZXkpLmFmdGVyKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+Q291bnRyeSBpcyByZXF1aXJlZC48L3NwYW4+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3R3b19sYXRpbl9hbmRfd2hpdGVzcGFjZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNnZXRfcXVvdGVfZm9ybSAjcXVvdGVfJyArIGtleSkuYWZ0ZXIoIjxzcGFuIGNsYXNzPVwiZXJyb3JcIj5Pbmx5IExhdGluIGFscGhhYmV0IG1heSBiZSB1c2VkIGluIHRoZSBmb3JtLjwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsYXRpbl9hbmRfd2hpdGVzcGFjZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNnZXRfcXVvdGVfZm9ybSAjcXVvdGVfJyArIGtleSkuYWZ0ZXIoIjxzcGFuIGNsYXNzPVwiZXJyb3JcIj5Pbmx5IExhdGluIGFscGhhYmV0IG1heSBiZSB1c2VkIGluIHRoZSBmb3JtLjwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmYWtlX3dvcmRzJzoKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2dldF9xdW90ZV9mb3JtICNxdW90ZV8nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPlBsZWFzZSBlbnRlciB2YWxpZCBkYXRhLjwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjaG9vc2VfbGljZW5zZV92YWx1ZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNnZXRfcXVvdGVfZm9ybSAjcXVvdGVfY2hvb3NlX2xpY2Vuc2UnKS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPlBsZWFzZSwgY2hvb3NlIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnMuPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JlcGVhdF9zeW1ib2xzJzoKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2dldF9xdW90ZV9mb3JtICNxdW90ZV8nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPlRvbyBtdWNoIHJlcGVhdCBzeW1ib2xzLjwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwaG9uZV9udW1iZXInOgogICAgICAgICAgICAgICAgICAgICAgICBwaG9uZTJfdGVzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdW90ZV9waG9uZTInKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwaG9uZTJfdGVzdCAhPSBudWxsKSAmJiBwaG9uZV9udW1iZXJfZmxhZyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHBob25lX251bWJlcl9mbGFnID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2V0X3F1b3RlX2Zvcm0gI3F1b3RlX3Bob25lMicpLmFmdGVyKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+UGxlYXNlLCBlbnRlciBjb3JyZWN0IFBob25lIE51bWJlci48L3NwYW4+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2YWxpZGF0ZV92YWxpZF9lbWFpbCc6CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNnZXRfcXVvdGVfZm9ybSAjcXVvdGVfJyArIGtleSkuYWZ0ZXIoIjxzcGFuIGNsYXNzPVwiZXJyb3JcIj5QbGVhc2UgcHJvdmlkZSBhIHZhbGlkIGVtYWlsIGFkZHJlc3MuPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNnZXRfcXVvdGVfZm9ybSAjcXVvdGVfJyArIGtleSkuYWZ0ZXIoIjxzcGFuIGNsYXNzPVwiZXJyb3JcIj4iICsgQXBwLlZhcnMuVmFsaWRhdGVNZXNzYWdlW2Vycm9yc1trZXldW2tdXSArICI8L3NwYW4+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH07CgogICAgICByZXR1cm4gRm9ybTsKCiAgICB9KShCYWNrYm9uZS5WaWV3KTsKICAgIEFwcC5WYXJzLmZvcm0gPSBuZXcgQXBwLlZpZXdzLkZvcm0oewogICAgICBtb2RlbDogQXBwLlZhcnMubWFpbk1vZGVsCiAgICB9KS5yZW5kZXIoKTsKICB9KTsKCn0pLmNhbGwodGhpcyk7CgovLyMgc291cmNlTWFwcGluZ1VSTD1yZXF1ZXN0X3F1b3RlLmpzLm1hcAo=
6 ms
javascript;base64,Ly8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjcKKGZ1bmN0aW9uKCkgewogIHZhciBmdW5jX25vX3ZhbGlkLAogICAgZXh0ZW5kID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChoYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LAogICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5OwoKICB0aGlzLkFwcCB8fCAodGhpcy5BcHAgPSB7CiAgICBNb2RlbHM6IHt9LAogICAgVmlld3M6IHt9LAogICAgQ29sbGVjdGlvbnM6IHt9LAogICAgQXBwOiB7fSwKICAgIFZhcnM6IHt9CiAgfSk7CgogIHRoaXMudGVtcGxhdGUgPSBmdW5jdGlvbihpZCkgewogICAgcmV0dXJuIF8udGVtcGxhdGUoJCgnIycgKyBpZCkuaHRtbCgpKTsKICB9OwoKICBmdW5jX25vX3ZhbGlkID0gZnVuY3Rpb24oZGF0YSkgewogICAgdmFyIGQ7CiAgICBkID0gZGF0YTsKICAgIGQuZnJvbV91cmwgPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmOwogICAgaWYgKCFqUXVlcnkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgJC5wb3N0KCIvbm90LXZhbGlkLWRhdGEtdjIwLmpzIiwgZCk7CiAgfTsKCiAgalF1ZXJ5KGZ1bmN0aW9uKCkgewogICAgdmFyIGV1cm96b25lX2NoZWNrYm94LCBldXJvem9uZV9zdGF0dXMsIGV1em9uZV9mdW5jLCBsaXZlZGVtb19zZWxlY3RvcjsKICAgIGV1cm96b25lX3N0YXR1cyA9IGZhbHNlOwogICAgZXV6b25lX2Z1bmMgPSBmdW5jdGlvbihjb3VudHJ5KSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfTsKICAgIGV1cm96b25lX2NoZWNrYm94ID0gZnVuY3Rpb24oc3RhdHVzKSB7CiAgICAgIGlmIChzdGF0dXMpIHsKICAgICAgICBldXJvem9uZV9zdGF0dXMgPSB0cnVlOwogICAgICAgICQoJyNkZW1vLXpvbmUtY2hla2JveC0xJykuc2hvdygpOwogICAgICAgICQoJyNkZW1vLXpvbmUtY2hla2JveC0yJykuaGlkZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIGV1cm96b25lX3N0YXR1cyA9IGZhbHNlOwogICAgICAgICQoJyNkZW1vLXpvbmUtY2hla2JveC0xJykuaGlkZSgpOwogICAgICAgICQoJyNkZW1vLXpvbmUtY2hla2JveC0yJykuc2hvdygpOwogICAgICB9CiAgICB9OwogICAgaWYgKHR5cGVvZiBzd19lbGVtZW50NiAhPT0gInVuZGVmaW5lZCIgJiYgc3dfZWxlbWVudDYgIT09IG51bGwpIHsKICAgICAgc3dfZWxlbWVudDYuYWRkRXZlbnRMaXN0ZW5lcignY2hvaWNlJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICByZXR1cm4gZXVyb3pvbmVfY2hlY2tib3goZXV6b25lX2Z1bmMoZXZlbnQuZGV0YWlsLmNob2ljZS52YWx1ZSkpOwogICAgICB9KTsKICAgIH0KICAgIEFwcC5WYXJzLnZhbGlkRW1haWxfZGVtbyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgaWYgKHdpbmRvdy5zdWNjZXNzRm9ybVN1Ym1pdCA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgICQuYWpheCh7CiAgICAgICAgdXJsOiAnL3ZhbGlkZW1haWwuanMnLAogICAgICAgIHR5cGU6ICJQT1NUIiwKICAgICAgICBkYXRhOiB7CiAgICAgICAgICBlbWFpbDogb3B0aW9ucy5lbWFpbAogICAgICAgIH0sCiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgIHZhciBvYmo7CiAgICAgICAgICBvYmogPSB7fTsKICAgICAgICAgIG9iai5jYXRlZ29yeSA9ICcnOwogICAgICAgICAgb2JqLmNhdGVnb3J5ID0gb3B0aW9ucy5saWNlbnNlOwogICAgICAgICAgb3B0aW9ucy52YWxpZCA9IHJlc3BvbnNlLmVtYWlsU3RhdHVzOwogICAgICAgICAgb3B0aW9ucy51c2VyID0gcmVzcG9uc2UuY2lkOwogICAgICAgICAgb3B0aW9ucy5jYXRlZ29yeSA9IG9iai5jYXRlZ29yeTsKICAgICAgICAgIHdpbmRvdy5zdWNjZXNzRm9ybVN1Ym1pdChvcHRpb25zKTsKICAgICAgICB9LAogICAgICAgIGRhdGFUeXBlOiAnanNvbicKICAgICAgfSk7CiAgICB9OwogICAgQXBwLlZhcnMudXJsXzIgPSAnL2Zvcm0tMjg4LXYxNy5qcyc7CiAgICBsaXZlZGVtb19zZWxlY3RvciA9ICQoJyNsaXZlZGVtb19saWNlbnNlJykudmFsKCk7CiAgICBBcHAuVmFycy5zZW5kQWpheE9wdGlvbnNfMiA9IHsKICAgICAgZGF0YTogbnVsbCwKICAgICAgbWV0aG9kOiAncG9zdCcsCiAgICAgIGRhdGFUeXBlOiAnanNvbicsCiAgICAgIHByb2Nlc3NEYXRhOiB0cnVlLAogICAgICB1cmw6IEFwcC5WYXJzLnVybF8yLAogICAgICBjYWNoZTogZmFsc2UKICAgIH07CiAgICBBcHAuVmFycy5WYWxpZGF0ZU1lc3NhZ2UgPSB7CiAgICAgICdmaXJzdG5hbWVfbGFzdG5hbWVfbWF0Y2gnOiAnIkZpcnN0IE5hbWUiIGFuZCAiTGFzdCBOYW1lIiBjYW5cJ3QgYmUgaWRlbnRpY2FsJywKICAgICAgJ2xhdGluX2FuZF93aGl0ZXNwYWNlJzogJ09ubHkgTGF0aW4gYWxwaGFiZXQgbWF5IGJlIHVzZWQgaW4gdGhlIGZvcm0uJywKICAgICAgJ3ZhbGlkYXRlX3JlcXVpcmVkJzogJycsCiAgICAgICd2YWxpZGF0ZV9taW5fbGVuJzogJycsCiAgICAgICdyZXBlYXRfc3ltYm9scyc6ICdUb28gbXVjaCByZXBlYXQgc3ltYm9scy4nLAogICAgICAndmFsaWRhdGVfYWxwaGEnOiAnT25seSBMYXRpbiBhbHBoYWJldCBtYXkgYmUgdXNlZCBpbiB0aGUgZm9ybS4nLAogICAgICAnZmFrZV93b3Jkcyc6ICdGYWtlIGluZm9ybWF0aW9uIGlzIHByb2hpYml0ZWQuJywKICAgICAgJ3B1YmxpY19lbWFpbCc6ICdQdWJsaWMgb3IgZnJlZSBlbWFpbCBpcyBlbnRlcmVkIGluICJDb3Jwb3JhdGUgRW1haWwiIGZpZWxkLiBBbiBlbWFpbCBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB5b3VyIGNvbXBhbnkgaXMgcmVxdWlyZWQuIENvbnRhY3QgPGEgaHJlZj0ibWFpbHRvOnNhbGVzQHN0YXJ3aW5kLmNvbSI+c2FsZXNAc3RhcndpbmQuY29tPC9hPiBpbiBjYXNlIHlvdSBkb25cJ3QgaGF2ZSBpdC4nLAogICAgICAncGhvbmVfbnVtYmVyJzogJ1BsZWFzZSBlbnRlciB2YWxpZCBwaG9uZSBudW1iZXInCiAgICB9OwogICAgXy5leHRlbmQoQmFja2JvbmUuVmFsaWRhdGlvbi52YWxpZGF0b3JzLCB7CiAgICAgIEZpcnN0TGFzdE5hbWVDb21wYXJlOiBmdW5jdGlvbih2YWx1ZSwgYXR0ciwgY3VzdG9tVmFsdWUsIG1vZGVsKSB7CiAgICAgICAgaWYgKCQoJyNmaXJzdG5hbWUnKS52YWwoKSA9PT0gJCgnI2xhc3RuYW1lJykudmFsKCkpIHsKICAgICAgICAgIHJldHVybiAnIkZpcnN0IE5hbWUiIGFuZCAiTGFzdCBOYW1lIiBjYW5cJ3QgYmUgaWRlbnRpY2FsJzsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIExhdGluU3ltYm9sczogZnVuY3Rpb24odmFsdWUsIGF0dHIsIGN1c3RvbVZhbHVlLCBtb2RlbCkgewogICAgICAgIHZhciByZXM7CiAgICAgICAgcmVzID0gdmFsdWUubWF0Y2goL15bQS1aYS16XXsyLDMwfSQvaSk7CiAgICAgICAgaWYgKHJlcyA9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gJ09ubHkgTGF0aW4gYWxwaGFiZXQgbWF5IGJlIHVzZWQgaW4gdGhlIGZvcm0uJzsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIExhdGluU3ltYm9sc1doaXRlc3BhY2U6IGZ1bmN0aW9uKHZhbHVlLCBhdHRyLCBjdXN0b21WYWx1ZSwgbW9kZWwpIHsKICAgICAgICB2YXIgcmVzOwogICAgICAgIHJlcyA9IHZhbHVlLm1hdGNoKC9eW0EtWmEtelxzXXsyLDMwfSQvaSk7CiAgICAgICAgaWYgKHJlcyA9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gJ09ubHkgTGF0aW4gYWxwaGFiZXQgbWF5IGJlIHVzZWQgaW4gdGhlIGZvcm0uJzsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIFJlcGVhdFN5bWJvbHM6IGZ1bmN0aW9uKHZhbHVlLCBhdHRyLCBjdXN0b21WYWx1ZSwgbW9kZWwpIHsKICAgICAgICB2YXIgcmVzOwogICAgICAgIHJlcyA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgcmVzID0gcmVzLm1hdGNoKC8oLikoXDEpezIsfS9pKTsKICAgICAgICBpZiAoKHJlcyAhPSBudWxsKSkgewogICAgICAgICAgcmV0dXJuICdUb28gbXVjaCByZXBlYXQgc3ltYm9scy4nOwogICAgICAgIH0KICAgICAgfSwKICAgICAgUGxhY2Vob2xkZXJWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICBpZiAodmFsdWUgPT09ICdwbGFjZWhvbGRlcicpIHsKICAgICAgICAgIHJldHVybiAnRXJyb3InOwogICAgICAgIH0KICAgICAgfSwKICAgICAgQ29ycG9yYXRlRW1haWw6IGZ1bmN0aW9uKHZhbHVlLCBhdHRyLCBjdXN0b21WYWx1ZSwgbW9kZWwpIHsKICAgICAgICB2YXIgb3B0aW9ucywgb3V0OwogICAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgb3V0ID0gJyc7CiAgICAgICAgbW9kZWwgPSBuZXcgQmFja2JvbmUuTW9kZWwoKTsKICAgICAgICBtb2RlbC5zZXQoJ2VtYWlsJywgdmFsdWUpOwogICAgICAgIG9wdGlvbnMgPSBBcHAuVmFycy5zZW5kQWpheE9wdGlvbnNfMjsKICAgICAgICBvcHRpb25zLmFzeW5jID0gZmFsc2U7CiAgICAgICAgb3B0aW9ucy5kYXRhID0gbW9kZWwudG9KU09OKCk7CiAgICAgICAgb3B0aW9ucy5kYXRhLmVudGl0eSA9ICdlbWFpbCc7CiAgICAgICAgb3B0aW9ucy5kYXRhLm1ldGhvZCA9ICdpc19jb3Jwb3JhdGUnOwogICAgICAgIG9wdGlvbnMuc3VjY2VzcyA9IGZ1bmN0aW9uKG1vZGVsLCByZXNwb25zZSwgb3B0aW9ucykgewogICAgICAgICAgaWYgKChyZXNwb25zZS5pc19jb3Jwb3JhdGUgIT0gbnVsbCkgJiYgcmVzcG9uc2UuaXNfY29ycG9yYXRlKSB7CiAgICAgICAgICAgIHJldHVybiBvdXQgPSAnJzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBvdXQgPSAnUHVibGljIG9yIGZyZWUgZW1haWwgaXMgZW50ZXJlZCBpbiAiQ29ycG9yYXRlIEVtYWlsIiBmaWVsZC4gQW4gZW1haWwgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggeW91ciBjb21wYW55IGlzIHJlcXVpcmVkLiBDb250YWN0IHNhbGVzQHN0YXJ3aW5kLmNvbSBpbiBjYXNlIHlvdSBkb25cJ3QgaGF2ZSBpdC4nOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgbW9kZWwuc2F2ZShudWxsLCBvcHRpb25zKTsKICAgICAgICBpZiAob3V0ICE9PSAnJykgewogICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgQXBwLk1vZGVscy5Nb2RlbCA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgICAgIGV4dGVuZChNb2RlbCwgc3VwZXJDbGFzcyk7CgogICAgICBmdW5jdGlvbiBNb2RlbCgpIHsKICAgICAgICByZXR1cm4gTW9kZWwuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIH0KCiAgICAgIE1vZGVsLnByb3RvdHlwZS5kZWZhdWx0cyA9IHsKICAgICAgICBmaXJzdG5hbWU6ICcnLAogICAgICAgIGxhc3RuYW1lOiAnJywKICAgICAgICBlbWFpbDogJycsCiAgICAgICAgdGl0bGU6ICcnLAogICAgICAgIGNvbXBhbnk6ICcnLAogICAgICAgIGNvdW50cnk6ICcnLAogICAgICAgIHBob25lMjogJycsCiAgICAgICAgcHJvZHVjdDogJycKICAgICAgfTsKCiAgICAgIE1vZGVsLnByb3RvdHlwZS52YWxpZGF0aW9uID0gewogICAgICAgIHVzZV93aXRoOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgICBtc2c6ICdVc2Ugd2l0aCBpcyByZXF1aXJlZCcKICAgICAgICAgIH0sIHsKICAgICAgICAgICAgUGxhY2Vob2xkZXJWYWx1ZTogMQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgbGljZW5zZTogWwogICAgICAgICAgewogICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKICAgICAgICAgICAgbXNnOiAnTGljZW5zZSBpcyByZXF1aXJlZCcKICAgICAgICAgIH0sIHsKICAgICAgICAgICAgUGxhY2Vob2xkZXJWYWx1ZTogMQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgY291bnRyeTogWwogICAgICAgICAgewogICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKICAgICAgICAgICAgbXNnOiAnQ291bnRyeSBpcyByZXF1aXJlZCcKICAgICAgICAgIH0sIHsKICAgICAgICAgICAgUGxhY2Vob2xkZXJWYWx1ZTogMQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgcHJvZHVjdDogWwogICAgICAgICAgewogICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKICAgICAgICAgICAgbXNnOiAnUHJvZHVjdCBpcyByZXF1aXJlZCcKICAgICAgICAgIH0sIHsKICAgICAgICAgICAgUGxhY2Vob2xkZXJWYWx1ZTogMQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgZmlyc3RuYW1lOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgICBtc2c6ICdGaXJzdCBOYW1lIGlzIHJlcXVpcmVkJwogICAgICAgICAgfSwgewogICAgICAgICAgICBSZXBlYXRTeW1ib2xzOiAxCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICBsYXN0bmFtZTogWwogICAgICAgICAgewogICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKICAgICAgICAgICAgbXNnOiAnTGFzdCBOYW1lIGlzIHJlcXVpcmVkJwogICAgICAgICAgfSwgewogICAgICAgICAgICBSZXBlYXRTeW1ib2xzOiAxCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICBlbWFpbDogWwogICAgICAgICAgewogICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKICAgICAgICAgICAgbXNnOiAnRW1haWwgaXMgcmVxdWlyZWQnCiAgICAgICAgICB9LCB7CiAgICAgICAgICAgIHBhdHRlcm46ICdlbWFpbCcsCiAgICAgICAgICAgIG1zZzogJ1BsZWFzZSBwcm92aWRlIGEgdmFsaWQgZW1haWwgYWRkcmVzcycKICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgIHRpdGxlOiB7CiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKICAgICAgICAgIG1zZzogJ1RpdGxlIGlzIHJlcXVpcmVkJwogICAgICAgIH0sCiAgICAgICAgY29tcGFueTogewogICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICBtc2c6ICdDb21wYW55IGlzIHJlcXVpcmVkJwogICAgICAgIH0sCiAgICAgICAgcGhvbmU6IHsKICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgbXNnOiAnUGhvbmUgaXMgcmVxdWlyZWQnCiAgICAgICAgfQogICAgICB9OwoKICAgICAgcmV0dXJuIE1vZGVsOwoKICAgIH0pKEJhY2tib25lLk1vZGVsKTsKICAgIEFwcC5WYXJzLm1haW5Nb2RlbCA9IG5ldyBBcHAuTW9kZWxzLk1vZGVsKCk7CiAgICBpZiAoISQoIiNyZXF1ZXN0X2xpdmVfZGVtb19mb3JtIikubGVuZ3RoKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIEFwcC5WaWV3cy5Gb3JtID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHsKICAgICAgZXh0ZW5kKEZvcm0sIHN1cGVyQ2xhc3MpOwoKICAgICAgZnVuY3Rpb24gRm9ybSgpIHsKICAgICAgICByZXR1cm4gRm9ybS5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgfQoKICAgICAgRm9ybS5wcm90b3R5cGUuZWwgPSAnI3JlcXVlc3RfbGl2ZV9kZW1vX2Zvcm0nOwoKICAgICAgRm9ybS5wcm90b3R5cGUuZXZlbnRzID0gewogICAgICAgICdjbGljayAubGl2ZWRlbW9fX2Zvcm0tc3VibWl0JzogJ3N1Ym1pdEZvcm0nCiAgICAgIH07CgogICAgICBGb3JtLnByb3RvdHlwZS5pbml0aWFsaXplID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGNvdW50cnlfdmFsOwogICAgICAgIHRoaXMubW9kZWwuc2V0KCdwcm9kdWN0JywgJCgnI2xpdmVkZW1vX2xpY2Vuc2UnKS52YWwoKSk7CiAgICAgICAgdGhpcy5tb2RlbC5zZXQoJ2ZpcnN0bmFtZScsICQoJyNsaXZlZGVtb19maXJzdG5hbWUnKS52YWwoKSk7CiAgICAgICAgdGhpcy5tb2RlbC5zZXQoJ2xhc3RuYW1lJywgJCgnI2xpdmVkZW1vX2xhc3RuYW1lJykudmFsKCkpOwogICAgICAgIHRoaXMubW9kZWwuc2V0KCd0aXRsZScsICQoJyNsaXZlZGVtb190aXRsZScpLnZhbCgpKTsKICAgICAgICB0aGlzLm1vZGVsLnNldCgnZW1haWwnLCAkKCcjbGl2ZWRlbW9fZW1haWwnKS52YWwoKSk7CiAgICAgICAgY291bnRyeV92YWwgPSAkKCcjbGl2ZWRlbW9fY291bnRyeScpLnZhbCgpOwogICAgICAgIHRoaXMubW9kZWwuc2V0KCdjb3VudHJ5JywgY291bnRyeV92YWwpOwogICAgICAgIGV1cm96b25lX2NoZWNrYm94KGV1em9uZV9mdW5jKGNvdW50cnlfdmFsKSk7CiAgICAgICAgdGhpcy5tb2RlbC5zZXQoJ2NvbXBhbnknLCAkKCcjbGl2ZWRlbW9fY29tcGFueScpLnZhbCgpKTsKICAgICAgICB0aGlzLm1vZGVsLnNldCgncGhvbmUyJywgJCgnI2xpdmVkZW1vX3Bob25lMicpLmF0dHIoJ3ZhbHVlJykpOwogICAgICAgIHRoaXMubW9kZWwuc2V0KCd1cmwnLCAiU2l0ZTogIiArIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsKICAgICAgICB0aGlzLm1vZGVsQmluZGVyID0gbmV3IEJhY2tib25lLk1vZGVsQmluZGVyKCk7CiAgICAgICAgdGhpcy5tb2RlbEJpbmRlci5iaW5kKHRoaXMubW9kZWwsIHRoaXMuZWwpOwogICAgICAgIHRoaXMubW9kZWwuYmluZCgndmFsaWRhdGVkJywgdGhpcy52YWxpZGF0ZWRIb29rLCB0aGlzKTsKICAgICAgICBCYWNrYm9uZS5WYWxpZGF0aW9uLmJpbmQodGhpcyk7CiAgICAgIH07CgogICAgICBGb3JtLnByb3RvdHlwZS52YWxpZGF0ZWRIb29rID0gZnVuY3Rpb24oaXNWYWxpZCwgbW9kZWwsIGVycm9ycykgewogICAgICAgIHZhciBrZXk7CiAgICAgICAgZm9yIChrZXkgaW4gbW9kZWwudG9KU09OKCkpIHsKICAgICAgICAgICQoJy5mb3JtU2VnV3JhcF8nICsga2V5ICsgJyAuZXJyb3JDb250YWluZXInKS5lbXB0eSgpOwogICAgICAgICAgaWYgKChlcnJvcnNba2V5XSAhPSBudWxsKSkgewogICAgICAgICAgICAkKCcjcmVxdWVzdF9saXZlX2RlbW9fZm9ybSAjbGl2ZWRlbW9fJyArIGtleSkubmV4dCgnLmVycm9yJykucmVtb3ZlKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkKCcjcmVxdWVzdF9saXZlX2RlbW9fZm9ybSAjbGl2ZWRlbW9fJyArIGtleSkubmV4dCgnLmVycm9yJykucmVtb3ZlKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwoKICAgICAgRm9ybS5wcm90b3R5cGUuc3VibWl0Rm9ybSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgY2hlY2tfbWUsIGNoZWNrX21lX2xhYmVsLCBtb2RlbCwgb3B0aW9uczsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgY2hlY2tfbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGl2ZWRlbW9fY2hlY2tfbWUnKTsKICAgICAgICBjaGVja19tZV9sYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaXZlZGVtb19jaGVja21hcmsnKTsKICAgICAgICBjb25zb2xlLmxvZyhjaGVja19tZS5jaGVja2VkKTsKICAgICAgICBpZiAoY2hlY2tfbWUuY2hlY2tlZCkgewogICAgICAgICAgJChjaGVja19tZV9sYWJlbCkucmVtb3ZlQ2xhc3MoJ2Vycm9yJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICQoY2hlY2tfbWVfbGFiZWwpLmFkZENsYXNzKCdlcnJvcicpOwogICAgICAgIH0KICAgICAgICBpZiAoIWNoZWNrX21lLmNoZWNrZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5tb2RlbC5zZXQoJ3Byb2R1Y3QnLCAkKCcjbGl2ZWRlbW9fbGljZW5zZScpLnZhbCgpKTsKICAgICAgICB0aGlzLm1vZGVsLnNldCgnZmlyc3RuYW1lJywgJCgnI2xpdmVkZW1vX2ZpcnN0bmFtZScpLnZhbCgpKTsKICAgICAgICB0aGlzLm1vZGVsLnNldCgnbGFzdG5hbWUnLCAkKCcjbGl2ZWRlbW9fbGFzdG5hbWUnKS52YWwoKSk7CiAgICAgICAgdGhpcy5tb2RlbC5zZXQoJ3RpdGxlJywgJCgnI2xpdmVkZW1vX3RpdGxlJykudmFsKCkpOwogICAgICAgIHRoaXMubW9kZWwuc2V0KCdlbWFpbCcsICQoJyNsaXZlZGVtb19lbWFpbCcpLnZhbCgpKTsKICAgICAgICB0aGlzLm1vZGVsLnNldCgnY291bnRyeScsICQoJyNsaXZlZGVtb19jb3VudHJ5JykudmFsKCkpOwogICAgICAgIHRoaXMubW9kZWwuc2V0KCdjb21wYW55JywgJCgnI2xpdmVkZW1vX2NvbXBhbnknKS52YWwoKSk7CiAgICAgICAgdGhpcy5tb2RlbC5zZXQoJ3Bob25lMicsICQoJyNsaXZlZGVtb19waG9uZTInKS52YWwoKSk7CiAgICAgICAgdGhpcy5tb2RlbC5zZXQoJ2NvbW1lbnRzJywgJCgnI2xpdmVkZW1vX2NvbW1lbnRzJykudmFsKCkpOwogICAgICAgIHRoaXMubW9kZWwuc2V0KCd1cmwnLCAiU2l0ZTogIiArIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsKICAgICAgICB0aGlzLm1vZGVsLnNldCgnZnJvbV91cmwnLCB3aW5kb3cubG9jYXRpb24uaHJlZik7CiAgICAgICAgdGhpcy5tb2RlbC52YWxpZGF0ZSgpOwogICAgICAgIGlmICghdGhpcy5tb2RlbC5pc1ZhbGlkKCkpIHsKCiAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgfQogICAgICAgICQoJ2JvZHknKS5hZGRDbGFzcygncHJlbG9hZGVyJyk7CiAgICAgICAgbW9kZWwgPSBuZXcgQmFja2JvbmUuTW9kZWwodGhpcy5tb2RlbC50b0pTT04oKSk7CiAgICAgICAgb3B0aW9ucyA9IEFwcC5WYXJzLnNlbmRBamF4T3B0aW9uc18yOwogICAgICAgIG9wdGlvbnMuZGF0YSA9IG1vZGVsLnRvSlNPTigpOwogICAgICAgIG9wdGlvbnMuZGF0YVsndW5pcV9wYXJhbSddID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKICAgICAgICBvcHRpb25zLnN1Y2Nlc3MgPSAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbihtb2RlbCwgcmVzcG9uc2UsIG9wdGlvbnMpIHsKICAgICAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCdwcmVsb2FkZXInKTsKICAgICAgICAgICAgaWYgKChyZXNwb25zZS5zdWNjZXNzICE9IG51bGwpICYmIHJlc3BvbnNlLnN1Y2Nlc3MgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgZnVuY19ub192YWxpZChvcHRpb25zLmRhdGEpOwogICAgICAgICAgICAgIF90aGlzLmNoZWNrUmVxdWVzdChyZXNwb25zZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgJCgiI3JlcXVlc3RfbGl2ZV9kZW1vX2Zvcm0iKS5oaWRlKCk7CiAgICAgICAgICAgICAgJCgnI2RlbW8tdGhhbmsteW91LmRlbW8tdGhhbmsteW91Jykuc2hvdygpOwogICAgICAgICAgICAgICQoJ2JvZHknKS5hZGRDbGFzcygnZm9ybS1kb25lJyk7CiAgICAgICAgICAgICAgY2hlY2tfbWVfbGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVxdWVzdF9jaGVja21hcmsnKTsKICAgICAgICAgICAgICBvcHRpb25zID0ge307CiAgICAgICAgICAgICAgb3B0aW9ucy5hY3Rpb24gPSAnUmVxdWVzdCBEZW1vJzsKICAgICAgICAgICAgICBvcHRpb25zLmxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgICAgb3B0aW9ucy5lbWFpbCA9IG1vZGVsLmdldCgnZW1haWwnKTsKICAgICAgICAgICAgICBvcHRpb25zLmxpY2Vuc2UgPSBtb2RlbC5nZXQoJ3Byb2R1Y3QnKTsKICAgICAgICAgICAgICBBcHAuVmFycy52YWxpZEVtYWlsX2RlbW8ob3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgfSkodGhpcyk7CiAgICAgICAgbW9kZWwuc2F2ZShudWxsLCBvcHRpb25zKTsKICAgICAgfTsKCiAgICAgIEZvcm0ucHJvdG90eXBlLmNoZWNrUmVxdWVzdCA9IGZ1bmN0aW9uKHJlcykgewogICAgICAgIHZhciBlcnJvcnMsIGssIGtleSwgcGhvbmVfbnVtYmVyX2NvdW50OwogICAgICAgIGVycm9ycyA9IHsKICAgICAgICAgIGxlbmd0aDogMAogICAgICAgIH07CiAgICAgICAgZm9yIChrZXkgaW4gcmVzLmRhdGEpIHsKICAgICAgICAgIGlmICgoZXJyb3JzW3Jlcy5kYXRhW2tleV1bJ2ZpZWxkJ11dICE9IG51bGwpKSB7CiAgICAgICAgICAgIGVycm9yc1tyZXMuZGF0YVtrZXldWydmaWVsZCddXS5wdXNoKHJlcy5kYXRhW2tleV1bJ3J1bGUnXSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlcnJvcnNbcmVzLmRhdGFba2V5XVsnZmllbGQnXV0gPSBbcmVzLmRhdGFba2V5XVsncnVsZSddXTsKICAgICAgICAgIH0KICAgICAgICAgIGVycm9ycy5sZW5ndGggKz0gMTsKICAgICAgICB9CiAgICAgICAgJCgnI3JlcXVlc3RfbGl2ZV9kZW1vX2Zvcm0gc3Bhbi5lcnJvcicpLnJlbW92ZSgpOwogICAgICAgIGlmICgoZXJyb3JzLmxlbmd0aCAhPSBudWxsKSAmJiBlcnJvcnMubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICBwaG9uZV9udW1iZXJfY291bnQgPSB0cnVlOwogICAgICAgICAgZm9yIChrZXkgaW4gZXJyb3JzKSB7CiAgICAgICAgICAgIGlmIChrZXkgIT09ICdsZW5ndGgnKSB7CiAgICAgICAgICAgICAgc3dpdGNoIChrZXkpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ3Byb2R1Y3QnOgogICAgICAgICAgICAgICAgY2FzZSAnY291bnRyeSc6CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgZm9yIChrIGluIGVycm9yc1trZXldKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlcnJvcnNba2V5XVtrXSkgewogICAgICAgICAgICAgICAgICAgICAgY2FzZSAndHdvX2xhdGluX2FuZF93aGl0ZXNwYWNlJzoKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3JlcXVlc3RfbGl2ZV9kZW1vX2Zvcm0gI2xpdmVkZW1vXycgKyBrZXkpLmFmdGVyKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+T25seSBMYXRpbiBhbHBoYWJldCBtYXkgYmUgdXNlZCBpbiB0aGUgZm9ybS48L3NwYW4+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgY2FzZSAndmFsaWRhdGVfdmFsaWRfZW1haWwnOgogICAgICAgICAgICAgICAgICAgICAgICAkKCcjcmVxdWVzdF9saXZlX2RlbW9fZm9ybSAjbGl2ZWRlbW9fJyArIGtleSkuYWZ0ZXIoIjxzcGFuIGNsYXNzPVwiZXJyb3JcIj5QbGVhc2UgcHJvdmlkZSBhIHZhbGlkIGVtYWlsIGFkZHJlc3MuPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xhdGluX2FuZF93aGl0ZXNwYWNlJzoKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3JlcXVlc3RfbGl2ZV9kZW1vX2Zvcm0gI2xpdmVkZW1vXycgKyBrZXkpLmFmdGVyKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+T25seSBMYXRpbiBhbHBoYWJldCBtYXkgYmUgdXNlZCBpbiB0aGUgZm9ybS48L3NwYW4+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZmFrZV93b3Jkcyc6CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNyZXF1ZXN0X2xpdmVfZGVtb19mb3JtICNsaXZlZGVtb18nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPlBsZWFzZSBlbnRlciB2YWxpZCBkYXRhLjwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyZXBlYXRfc3ltYm9scyc6CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNyZXF1ZXN0X2xpdmVfZGVtb19mb3JtICNsaXZlZGVtb18nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPlRvbyBtdWNoIHJlcGVhdCBzeW1ib2xzLjwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwaG9uZV9udW1iZXInOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGhvbmVfbnVtYmVyX2NvdW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3JlcXVlc3RfbGl2ZV9kZW1vX2Zvcm0gI2xpdmVkZW1vXycgKyBrZXkpLmFmdGVyKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+UGxlYXNlLCBlbnRlciBjb3JyZWN0IFBob25lIE51bWJlci48L3NwYW4+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmVfbnVtYmVyX2NvdW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgY2FzZSAndmFsaWRhdGVfcmVxdWlyZWQnOgogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VtYWlsJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNyZXF1ZXN0X2xpdmVfZGVtb19mb3JtICNsaXZlZGVtb18nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPkVtYWlsIGlzIHJlcXVpcmVkPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29tcGFueSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjcmVxdWVzdF9saXZlX2RlbW9fZm9ybSAjbGl2ZWRlbW9fJyArIGtleSkuYWZ0ZXIoIjxzcGFuIGNsYXNzPVwiZXJyb3JcIj5Db21wYW55IGlzIHJlcXVpcmVkPC9zcGFuPiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndGl0bGUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3JlcXVlc3RfbGl2ZV9kZW1vX2Zvcm0gI2xpdmVkZW1vXycgKyBrZXkpLmFmdGVyKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+Sm9iIFRpdGxlIGlzIHJlcXVpcmVkLjwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvdW50cnknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3JlcXVlc3RfbGl2ZV9kZW1vX2Zvcm0gI2xpdmVkZW1vXycgKyBrZXkpLmFmdGVyKCI8c3BhbiBjbGFzcz1cImVycm9yXCI+Q291bnRyeSBpcyByZXF1aXJlZC48L3NwYW4+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNyZXF1ZXN0X2xpdmVfZGVtb19mb3JtICNsaXZlZGVtb18nICsga2V5KS5hZnRlcigiPHNwYW4gY2xhc3M9XCJlcnJvclwiPiIgKyBBcHAuVmFycy5WYWxpZGF0ZU1lc3NhZ2VbZXJyb3JzW2tleV1ba11dICsgIjwvc3Bhbj4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKCiAgICAgIHJldHVybiBGb3JtOwoKICAgIH0pKEJhY2tib25lLlZpZXcpOwogICAgQXBwLlZhcnMuZm9ybSA9IG5ldyBBcHAuVmlld3MuRm9ybSh7CiAgICAgIG1vZGVsOiBBcHAuVmFycy5tYWluTW9kZWwKICAgIH0pLnJlbmRlcigpOwogIH0pOwoKfSkuY2FsbCh0aGlzKTsKCi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlcXVlc3RfbGl2ZV9kZW1vLmpzLm1hcAo=
5 ms
polyfill.min.js
909 ms
lozad.min.js
919 ms
financing_w_1.svg
1191 ms
icon-search2.svg
714 ms
icon-phone2.svg
719 ms
icon-download.svg
600 ms
icon-forum.svg
602 ms
icon-blog.svg
606 ms
icon-lang.svg
654 ms
icon-login.svg
655 ms
icon-circle-arrow.svg
658 ms
list-triangle-green.svg
660 ms
arrow-in-line.svg
1001 ms
icon-quote-blue.svg
970 ms
swipe-arrow.svg
970 ms
icon-quote.svg
829 ms
axios.min.js
112 ms
icon-star.svg
682 ms
icon-thumb.svg
646 ms
star-vote.svg
648 ms
bird_logo_green_2.svg
612 ms
starwind.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
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
Image elements do not have [alt] attributes
Links do not have a discernible name
starwind.com best practices score
Trust and Safety
Impact
Issue
Does not use HTTPS
Includes front-end JavaScript libraries with known security vulnerabilities
Ensure CSP is effective against XSS attacks
General
Impact
Issue
Detected JavaScript libraries
Page has valid source maps
starwind.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
Image elements do not have [alt] attributes
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 Starwind.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 Starwind.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.
starwind.com
Open Graph data is detected on the main page of Star Wind. This is the best way to make the web page social media friendly. Here is how it looks like on Facebook: