3.5 sec in total
72 ms
3.1 sec
413 ms
Visit midwestdesignhomes.com now to see the best up-to-date Midwest Design Homes content and also check out these interesting facts you probably never knew about midwestdesignhomes.com
Midwest Design Homes for more than 30 years has been providing our clients with semi custom and custom home designs. We strive to be the builder of choice in Northeast Wisconsin (Appleton, Green Bay, ...
Visit midwestdesignhomes.comWe analyzed Midwestdesignhomes.com page load time and found that the first response time was 72 ms and then it took 3.5 sec to load all DOM resources and completely render a web page. This is a poor result, as 60% of websites can load faster.
midwestdesignhomes.com performance score
name
value
score
weighting
Value2.7 s
59/100
10%
Value11.9 s
0/100
25%
Value12.7 s
3/100
10%
Value4,670 ms
0/100
30%
Value0.416
23/100
15%
Value27.0 s
0/100
10%
72 ms
1843 ms
16 ms
21 ms
40 ms
Our browser made a total of 89 requests to load all elements on the main page. We found that 38% of them (34 requests) were addressed to the original Midwestdesignhomes.com, 28% (25 requests) were made to Buildertrend.net and 10% (9 requests) were made to . The less responsive or slowest element that took the longest time to load (1.8 sec) belongs to the original domain Midwestdesignhomes.com.
Page size can be reduced by 172.4 kB (5%)
3.8 MB
3.7 MB
In fact, the total size of Midwestdesignhomes.com main page is 3.8 MB. This result falls beyond the top 1M of websites and identifies a large and not optimized web page that may take ages to load. Only a small number of websites need less resources to load. Images take 2.4 MB which makes up the majority of the site volume.
Potential reduce by 108.4 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. HTML code on this page is well minified. It is highly recommended that content of this web page should be compressed using GZIP, as it can save up to 108.4 kB or 79% of the original size.
Potential reduce by 47.7 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. Midwest Design Homes images are well optimized though.
Potential reduce by 12.4 kB
It’s better to minify JavaScript in order to improve website performance. The diagram shows the current total size of all JavaScript files against the prospective JavaScript size after its minification and compression. This website has mostly compressed JavaScripts.
Potential reduce by 4.0 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. Midwestdesignhomes.com has all CSS files already compressed.
Number of requests can be reduced by 51 (71%)
72
21
The browser has sent 72 CSS, Javascripts, AJAX and image requests in order to completely render the main page of Midwest Design Homes. We recommend that multiple CSS and JavaScript files should be merged into one by each type, as it can help reduce assets requests from 32 to 1 for JavaScripts and from 21 to 1 for CSS and as a result speed up the page load time.
midwestdesignhomes.com
72 ms
midwestdesignhomes.com
1843 ms
dmVyPTYuNi4xIn19OwovKiEgVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkICovCiFmdW5jdGlvbihpLG4pe3ZhciBvLHMsZTtmdW5jdGlvbiBjKGUpe3RyeXt2YXIgdD17c3VwcG9ydFRlc3RzOmUsdGltZXN0YW1wOihuZXcgRGF0ZSkudmFsdWVPZigpfTtzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKG8sSlNPTi5zdHJpbmdpZnkodCkpfWNhdGNoKGUpe319ZnVuY3Rpb24gcChlLHQsbil7ZS5jbGVhclJlY3QoMCwwLGUuY2FudmFzLndpZHRoLGUuY2FudmFzLmhlaWdodCksZS5maWxsVGV4dCh0LDAsMCk7dmFyIHQ9bmV3IFVpbnQzMkFycmF5KGUuZ2V0SW1hZ2VEYXRhKDAsMCxlLmNhbnZhcy53aWR0aCxlLmNhbnZhcy5oZWlnaHQpLmRhdGEpLHI9KGUuY2xlYXJSZWN0KDAsMCxlLmNhbnZhcy53aWR0aCxlLmNhbnZhcy5oZWlnaHQpLGUuZmlsbFRleHQobiwwLDApLG5ldyBVaW50MzJBcnJheShlLmdldEltYWdlRGF0YSgwLDAsZS5jYW52YXMud2lkdGgsZS5jYW52YXMuaGVpZ2h0KS5kYXRhKSk7cmV0dXJuIHQuZXZlcnkoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXJbdF19KX1mdW5jdGlvbiB1KGUsdCxuKXtzd2l0Y2godCl7Y2FzZSJmbGFnIjpyZXR1cm4gbihlLCJcdWQ4M2NcdWRmZjNcdWZlMGZcdTIwMGRcdTI2YTdcdWZlMGYiLCJcdWQ4M2NcdWRmZjNcdWZlMGZcdTIwMGJcdTI2YTdcdWZlMGYiKT8hMTohbihlLCJcdWQ4M2NcdWRkZmFcdWQ4M2NcdWRkZjMiLCJcdWQ4M2NcdWRkZmFcdTIwMGJcdWQ4M2NcdWRkZjMiKSYmIW4oZSwiXHVkODNjXHVkZmY0XHVkYjQwXHVkYzY3XHVkYjQwXHVkYzYyXHVkYjQwXHVkYzY1XHVkYjQwXHVkYzZlXHVkYjQwXHVkYzY3XHVkYjQwXHVkYzdmIiwiXHVkODNjXHVkZmY0XHUyMDBiXHVkYjQwXHVkYzY3XHUyMDBiXHVkYjQwXHVkYzYyXHUyMDBiXHVkYjQwXHVkYzY1XHUyMDBiXHVkYjQwXHVkYzZlXHUyMDBiXHVkYjQwXHVkYzY3XHUyMDBiXHVkYjQwXHVkYzdmIik7Y2FzZSJlbW9qaSI6cmV0dXJuIW4oZSwiXHVkODNkXHVkYzI2XHUyMDBkXHUyYjFiIiwiXHVkODNkXHVkYzI2XHUyMDBiXHUyYjFiIil9cmV0dXJuITF9ZnVuY3Rpb24gZihlLHQsbil7dmFyIHI9InVuZGVmaW5lZCIhPXR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlP25ldyBPZmZzY3JlZW5DYW52YXMoMzAwLDE1MCk6aS5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxhPXIuZ2V0Q29udGV4dCgiMmQiLHt3aWxsUmVhZEZyZXF1ZW50bHk6ITB9KSxvPShhLnRleHRCYXNlbGluZT0idG9wIixhLmZvbnQ9IjYwMCAzMnB4IEFyaWFsIix7fSk7cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbihlKXtvW2VdPXQoYSxlLG4pfSksb31mdW5jdGlvbiB0KGUpe3ZhciB0PWkuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7dC5zcmM9ZSx0LmRlZmVyPSEwLGkuaGVhZC5hcHBlbmRDaGlsZCh0KX0idW5kZWZpbmVkIiE9dHlwZW9mIFByb21pc2UmJihvPSJ3cEVtb2ppU2V0dGluZ3NTdXBwb3J0cyIscz1bImZsYWciLCJlbW9qaSJdLG4uc3VwcG9ydHM9e2V2ZXJ5dGhpbmc6ITAsZXZlcnl0aGluZ0V4Y2VwdEZsYWc6ITB9LGU9bmV3IFByb21pc2UoZnVuY3Rpb24oZSl7aS5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixlLHtvbmNlOiEwfSl9KSxuZXcgUHJvbWlzZShmdW5jdGlvbih0KXt2YXIgbj1mdW5jdGlvbigpe3RyeXt2YXIgZT1KU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0obykpO2lmKCJvYmplY3QiPT10eXBlb2YgZSYmIm51bWJlciI9PXR5cGVvZiBlLnRpbWVzdGFtcCYmKG5ldyBEYXRlKS52YWx1ZU9mKCk8ZS50aW1lc3RhbXArNjA0ODAwJiYib2JqZWN0Ij09dHlwZW9mIGUuc3VwcG9ydFRlc3RzKXJldHVybiBlLnN1cHBvcnRUZXN0c31jYXRjaChlKXt9cmV0dXJuIG51bGx9KCk7aWYoIW4pe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgV29ya2VyJiYidW5kZWZpbmVkIiE9dHlwZW9mIE9mZnNjcmVlbkNhbnZhcyYmInVuZGVmaW5lZCIhPXR5cGVvZiBVUkwmJlVSTC5jcmVhdGVPYmplY3RVUkwmJiJ1bmRlZmluZWQiIT10eXBlb2YgQmxvYil0cnl7dmFyIGU9InBvc3RNZXNzYWdlKCIrZi50b1N0cmluZygpKyIoIitbSlNPTi5zdHJpbmdpZnkocyksdS50b1N0cmluZygpLHAudG9TdHJpbmcoKV0uam9pbigiLCIpKyIpKTsiLHI9bmV3IEJsb2IoW2VdLHt0eXBlOiJ0ZXh0L2phdmFzY3JpcHQifSksYT1uZXcgV29ya2VyKFVSTC5jcmVhdGVPYmplY3RVUkwocikse25hbWU6IndwVGVzdEVtb2ppU3VwcG9ydHMifSk7cmV0dXJuIHZvaWQoYS5vbm1lc3NhZ2U9ZnVuY3Rpb24oZSl7YyhuPWUuZGF0YSksYS50ZXJtaW5hdGUoKSx0KG4pfSl9Y2F0Y2goZSl7fWMobj1mKHMsdSxwKSl9dChuKX0pLnRoZW4oZnVuY3Rpb24oZSl7Zm9yKHZhciB0IGluIGUpbi5zdXBwb3J0c1t0XT1lW3RdLG4uc3VwcG9ydHMuZXZlcnl0aGluZz1uLnN1cHBvcnRzLmV2ZXJ5dGhpbmcmJm4uc3VwcG9ydHNbdF0sImZsYWciIT09dCYmKG4uc3VwcG9ydHMuZXZlcnl0aGluZ0V4Y2VwdEZsYWc9bi5zdXBwb3J0cy5ldmVyeXRoaW5nRXhjZXB0RmxhZyYmbi5zdXBwb3J0c1t0XSk7bi5zdXBwb3J0cy5ldmVyeXRoaW5nRXhjZXB0RmxhZz1uLnN1cHBvcnRzLmV2ZXJ5dGhpbmdFeGNlcHRGbGFnJiYhbi5zdXBwb3J0cy5mbGFnLG4uRE9NUmVhZHk9ITEsbi5yZWFkeUNhbGxiYWNrPWZ1bmN0aW9uKCl7bi5ET01SZWFkeT0hMH19KS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGV9KS50aGVuKGZ1bmN0aW9uKCl7dmFyIGU7bi5zdXBwb3J0cy5ldmVyeXRoaW5nfHwobi5yZWFkeUNhbGxiYWNrKCksKGU9bi5zb3VyY2V8fHt9KS5jb25jYXRlbW9qaT90KGUuY29uY2F0ZW1vamkpOmUud3BlbW9qaSYmZS50d2Vtb2ppJiYodChlLnR3ZW1vamkpLHQoZS53cGVtb2ppKSkpfSkpfSgod2luZG93LGRvY3VtZW50KSx3aW5kb3cuX3dwZW1vamlTZXR0aW5ncyk7Ci8qIF1dPiAqLwo=
16 ms
style.min.css
21 ms
autoptimize_single_37e40fb2401e9d466c5588da228b2394.php
40 ms
autoptimize_single_3fd2afa98866679439097f4ab102fe0a.php
38 ms
autoptimize_single_a0b823f7ab1f0a3a563fb10c3664d2a6.php
37 ms
font-awesome.min.css
83 ms
autoptimize_single_5cbdf8d16febadd80f4be837347d19cf.php
40 ms
autoptimize_single_2381daf20b8486b3e3601ae68ec94bbe.php
46 ms
jquery.min.js
58 ms
jquery-migrate.min.js
58 ms
javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwp2YXIgcGJMb2NhbGl6ZU9iaiA9IHsiYWpheCI6Imh0dHBzOlwvXC9taWR3ZXN0ZGVzaWduaG9tZXMuY29tXC93cC1hZG1pblwvYWRtaW4tYWpheC5waHAiLCJzZWNvbmRzIjoic2Vjb25kcyIsInRoaXNXaWxsQ2xvc2UiOiJUaGlzIHdpbGwgY2xvc2UgaW4iLCJpY29ucyI6eyJjbG9zZV9pY29uIjoiPHN2ZyBjbGFzcz1cImF5c19wYl9tYXRlcmlhbF9jbG9zZV9pY29uXCIgeG1sbnM9XCJodHRwczpcL1wvd3d3LnczLm9yZ1wvMjAwMFwvc3ZnXCIgaGVpZ2h0PVwiMzZweFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjM2cHhcIiBmaWxsPVwiIzAwMDAwMFwiIGFsdD1cIlBvcC11cCBDbG9zZVwiPjxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIlwvPjxwYXRoIGQ9XCJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyelwiXC8+PFwvc3ZnPiIsImNsb3NlX2NpcmNsZV9pY29uIjoiPHN2ZyBjbGFzcz1cImF5c19wYl9tYXRlcmlhbF9jbG9zZV9jaXJjbGVfaWNvblwiIHhtbG5zPVwiaHR0cHM6XC9cL3d3dy53My5vcmdcLzIwMDBcL3N2Z1wiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMzZcIiBhbHQ9XCJQb3AtdXAgQ2xvc2VcIj48cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCJcLz48cGF0aCBkPVwiTTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJ6bTUgMTMuNTlMMTUuNTkgMTcgMTIgMTMuNDEgOC40MSAxNyA3IDE1LjU5IDEwLjU5IDEyIDcgOC40MSA4LjQxIDcgMTIgMTAuNTkgMTUuNTkgNyAxNyA4LjQxIDEzLjQxIDEyIDE3IDE1LjU5elwiXC8+PFwvc3ZnPiIsInZvbHVtZV91cF9pY29uIjoiPHN2ZyBjbGFzcz1cImF5c19wYl9mYV92b2x1bWVcIiB4bWxucz1cImh0dHBzOlwvXC93d3cudzMub3JnXC8yMDAwXC9zdmdcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjM2XCI+PHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiXC8+PHBhdGggZD1cIk0zIDl2Nmg0bDUgNVY0TDcgOUgzem0xMy41IDNjMC0xLjc3LTEuMDItMy4yOS0yLjUtNC4wM3Y4LjA1YzEuNDgtLjczIDIuNS0yLjI1IDIuNS00LjAyek0xNCAzLjIzdjIuMDZjMi44OS44NiA1IDMuNTQgNSA2Ljcxcy0yLjExIDUuODUtNSA2LjcxdjIuMDZjNC4wMS0uOTEgNy00LjQ5IDctOC43N3MtMi45OS03Ljg2LTctOC43N3pcIlwvPjxcL3N2Zz4iLCJ2b2x1bWVfbXV0ZV9pY29uIjoiPHN2ZyB4bWxucz1cImh0dHBzOlwvXC93d3cudzMub3JnXC8yMDAwXC9zdmdcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCI+PHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiXC8+PHBhdGggZD1cIk03IDl2Nmg0bDUgNVY0bC01IDVIN3pcIlwvPjxcL3N2Zz4ifX07Ci8qIF1dPiAqLwo=
12 ms
autoptimize_single_f3d5fe90ca6738715e756f29a7026721.php
57 ms
autoptimize_single_764880373e12b5154d0cce8781509448.php
56 ms
css
78 ms
css
90 ms
btClientContactForm.js
178 ms
javascript;base64,CgkJCQkJCQkJZnVuY3Rpb24gaW5pdE1hcCgpIHsKCQkJCQkJCQkJdmFyIG1hcCA9IG5ldyBnb29nbGUubWFwcy5NYXAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hcCcpLCB7CgkJCQkJCQkJCQl6b29tOiAxNSwKCQkJCQkJCQkJCXNjcm9sbHdoZWVsOiBmYWxzZQoJCQkJCQkJCQl9KTsKCQkJCQkJCQkJdmFyIGdlb2NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7CgkJCQkJCQkJCWdlb2NvZGVBZGRyZXNzKGdlb2NvZGVyLCBtYXApOwoJCQkJCQkJCX0KCQkJCQkJCQlmdW5jdGlvbiBnZW9jb2RlQWRkcmVzcyhnZW9jb2RlciwgcmVzdWx0c01hcCkgewoJCQkJCQkJCQl2YXIgYWRkcmVzcyA9ICJOMjMzNSBXZXN0IEZyb250YWdlIFJvYWQsIEthdWthdW5hLCBXSSA1NDEzMCI7CgkJCQkJCQkJCWdlb2NvZGVyLmdlb2NvZGUoeydhZGRyZXNzJzogYWRkcmVzc30sIGZ1bmN0aW9uKHJlc3VsdHMsIHN0YXR1cykgewoJCQkJCQkJCQkJaWYgKHN0YXR1cyA9PT0gJ09LJykgewoJCQkJCQkJCQkJCXJlc3VsdHNNYXAuc2V0Q2VudGVyKHJlc3VsdHNbMF0uZ2VvbWV0cnkubG9jYXRpb24pOwoJCQkJCQkJCQkJCXZhciBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHsKCQkJCQkJCQkJCQkJbWFwOiByZXN1bHRzTWFwLAoJCQkJCQkJCQkJCQlwb3NpdGlvbjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbiwKCQkJCQkJCQkJCQkJYW5pbWF0aW9uOiBnb29nbGUubWFwcy5BbmltYXRpb24uRFJPUAoJCQkJCQkJCQkJCX0pOwoJCQkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJCQlhbGVydCgnR2VvY29kZSB3YXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmb2xsb3dpbmcgcmVhc29uOiAnICsgc3RhdHVzKTsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJfSk7CgkJCQkJCQkJfQoJCQkJCQkJCWdvb2dsZS5tYXBzLmV2ZW50LmFkZERvbUxpc3RlbmVyKHdpbmRvdywgImxvYWQiLCBpbml0TWFwKTsKCQkJCQkJCQ==
9 ms
javascript;base64,aWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgNzY4KSB7IGpRdWVyeShkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbF8xJykuY3NzKHsndG9wJzogJzAnLCAncmlnaHQnOiAnMCcsICdib3R0b20nOiAnMCcsICdsZWZ0JzogJzAnfSk7IH0gZWxzZSB7IGpRdWVyeShkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbF8xJykuY3NzKHsndG9wJzogJzAnLCAncmlnaHQnOiAnMCcsICdib3R0b20nOiAnMCcsICdsZWZ0JzogJzAnfSk7IH0=
9 ms
javascript;base64,CiAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uKCAkICkgewoJICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGJWaWV3c0ZsYWdfMSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2RlZmF1bHQnID09ICdub3RpZmljYXRpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbHMnKS5wcmVwZW5kVG8oJChkb2N1bWVudC5ib2R5KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWxzOm5vdCguYXlzLXBiLW1vZGFscy5heXMtcGItbm90aWZpY2F0aW9uLW1vZGFsKScpLmFwcGVuZFRvKCQoZG9jdW1lbnQuYm9keSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlzTW9iaWxlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2xvc2VQb3B1cE92ZXJsYXkgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlzUGFnZVNjcm9sbERpc2FibGVkID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGVja0FuaW1TcGVlZCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXlzX3BiX2FuaW1hdGlvbl9jbG9zZV9zcGVlZCA9ICQoZG9jdW1lbnQpLmZpbmQoJyNheXNfcGJfYW5pbWF0aW9uX2Nsb3NlX3NwZWVkXzEnKS52YWwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBheXNfcGJfZWZmZWN0SW5fMSA9ICQoZG9jdW1lbnQpLmZpbmQoJyNheXNfcGJfbW9kYWxfYW5pbWF0ZV9pbl8xJykudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXlzX3BiX2VmZmVjdE91dF8xID0gJChkb2N1bWVudCkuZmluZCgnI2F5c19wYl9tb2RhbF9hbmltYXRlX291dF8xJykudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPCA3NjgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01vYmlsZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VQb3B1cE92ZXJsYXkgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGFnZVNjcm9sbERpc2FibGVkID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0FuaW1TcGVlZCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXlzX3BiX2FuaW1hdGlvbl9jbG9zZV9zcGVlZCA9ICQoZG9jdW1lbnQpLmZpbmQoJyNheXNfcGJfYW5pbWF0aW9uX2Nsb3NlX3NwZWVkX21vYmlsZV8xJykudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXlzX3BiX2VmZmVjdEluXzEgPSAkKGRvY3VtZW50KS5maW5kKCcjYXlzX3BiX21vZGFsX2FuaW1hdGVfaW5fbW9iaWxlXzEnKS52YWwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheXNfcGJfZWZmZWN0T3V0XzEgPSAkKGRvY3VtZW50KS5maW5kKCcjYXlzX3BiX21vZGFsX2FuaW1hdGVfb3V0X21vYmlsZV8xJykudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXlzX3BiX2RlbGF5T3Blbl8xID0gcGFyc2VJbnQoJChkb2N1bWVudCkuZmluZCgnLmF5c19wYl9kZWxheV8xJykudmFsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF5c19wYl9zY3JvbGxUb3BfMSA9IHBhcnNlSW50KCQoZG9jdW1lbnQpLmZpbmQoJy5heXNfcGJfc2Nyb2xsXzEnKS52YWwoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNNb2JpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheXNfcGJfc2Nyb2xsVG9wXzE9IHBhcnNlSW50KCQoZG9jdW1lbnQpLmZpbmQoJy5heXNfcGJfc2Nyb2xsX21vYmlsZV8xJykudmFsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXlzX3BiX2RlbGF5T3Blbl8xID0gcGFyc2VJbnQoJChkb2N1bWVudCkuZmluZCgnLmF5c19wYl9kZWxheV9tb2JpbGVfMScpLnZhbCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGltZV9wYl8xID0gJChkb2N1bWVudCkuZmluZCgnLmF5c19wYl90aW1lcl8xIHNwYW4nKS5kYXRhKCdzZWNvbmRzJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXlzX3BiX2FuaW1hdGlvbl9jbG9zZV9zZWNvbmRzID0gKGF5c19wYl9hbmltYXRpb25fY2xvc2Vfc3BlZWQgLyAxMDAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBheXNfcGJfZGVsYXlPcGVuXzEgPT0gMCAmJiAgYXlzX3BiX3Njcm9sbFRvcF8xID09IDApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5hdl9wb3BfbW9kYWxzXzEnKS5jc3MoJ2Rpc3BsYXknLCdibG9jaycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8IDc2OCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2JpbGVUaW1lciA9ICskKGRvY3VtZW50KS5maW5kKCcuYXlzX3BiX3RpbWVyXzEgc3BhbicpLmF0dHIoJ2RhdGEtYXlzLW1vYmlsZS1zZWNvbmRzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5c19wYl90aW1lcl8xIHNwYW4nKS5odG1sKG1vYmlsZVRpbWVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3BiXzEgPSBtb2JpbGVUaW1lcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheXNfcGJfYW5pbWF0aW9uX2Nsb3NlX3NwZWVkID0gcGFyc2VGbG9hdChheXNfcGJfYW5pbWF0aW9uX2Nsb3NlX3NwZWVkKSAtIDUwOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXNfcGJfbXVzaWNfc291bmQnKS5jc3MoeydkaXNwbGF5Jzonbm9uZSd9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRpbWVfcGJfMSAhPT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0aW1lX3BiXzEgIT09IDApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcjYXlzLXBiLW1vZGFsLWNoZWNrYm94XzEnKS50cmlnZ2VyKCdjbGljaycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihheXNfcGJfc2Nyb2xsVG9wXzEgPT0gMCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXlzX3BiX2ZsYWcgPSAgdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWxfMScpLmNzcyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FuaW1hdGlvbi1kdXJhdGlvbic6IGF5c19wYl9hbmltYXRpb25fY2xvc2Vfc2Vjb25kcyArICdzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGltZXJfcGJfMSA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1RpbWVfcGJfMSA9IHRpbWVfcGJfMS0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXNfcGJfdGltZXJfMSBzcGFuJykudGV4dChuZXdUaW1lX3BiXzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5ld1RpbWVfcGJfMSA8PSAwKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbC1jbG9zZV8xJykudHJpZ2dlcignY2xpY2snKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbF8xJykuYXR0cignY2xhc3MnLCAnYXlzLXBiLW1vZGFsIGF5cy1wYi1tb2RhbF8xICBheXMtcGItYm9yZGVyLW1vYmlsZV8xICcrYXlzX3BiX2VmZmVjdE91dF8xKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXlzX3BiX2VmZmVjdE91dF8xICE9ICdub25lJyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWxfMScpLmNzcygnZGlzcGxheScsICdub25lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbF8xJykuYXR0cignZGF0YS1heXMtZmxhZycsJ3RydWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGF5c19wYl9hbmltYXRpb25fY2xvc2Vfc3BlZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWxfMScpLmNzcygnZGlzcGxheScsICdub25lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFsXzEnKS5hdHRyKCdkYXRhLWF5cy1mbGFnJywndHJ1ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyX3BiXzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFsLWNsb3NlXzEnKS5vbmUoJ2NsaWNrJywgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBiVmlld3NGbGFnXzEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYl9pZCA9IDE7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHBiTG9jYWxpemVPYmouYWpheCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ3RleHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHBiX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdheXNfaW5jcmVtZW50X3BiX3ZpZXdzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJWaWV3c0ZsYWdfMSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5hdl9wb3BfbW9kYWxzXzEnKS5jc3MoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbF8xJykuYXR0cignY2xhc3MnLCAnYXlzLXBiLW1vZGFsICBheXMtcGItbW9kYWxfMSAgYXlzLXBiLWJvcmRlci1tb2JpbGVfMSAnK2F5c19wYl9lZmZlY3RPdXRfMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucGFyZW50cygnLmF5cy1wYi1tb2RhbHMnKS5maW5kKCdpZnJhbWUnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gL2h0dHBzOlwvXC93d3cueW91dHViZS5jb20vOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNyYyA9ICQodGhpcykuYXR0cignc3JjJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmF0dHIoJ3NyYycsICQodGhpcykuYXR0cignc3JjJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wYXJlbnRzKCcuYXlzLXBiLW1vZGFscycpLmZpbmQoJ3ZpZGVvLndwLXZpZGVvLXNob3J0Y29kZScpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiAkKHRoaXMpLmdldCgwKSAhPSAndW5kZWZpbmVkJyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhICQodGhpcykuZ2V0KDApLnBhdXNlZCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5nZXQoMCkucGF1c2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnBhcmVudHMoJy5heXMtcGItbW9kYWxzJykuZmluZCgnYXVkaW8ud3AtYXVkaW8tc2hvcnRjb2RlJykuZWFjaChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mICQodGhpcykuZ2V0KDApICE9ICd1bmRlZmluZWQnKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgJCh0aGlzKS5nZXQoMCkucGF1c2VkICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmdldCgwKS5wYXVzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9zZV9zb3VuZF9zcmMgPSAkKGRvY3VtZW50KS5maW5kKCcjYXlzX3BiX2Nsb3NlX3NvdW5kXzEnKS5hdHRyKCdzcmMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2hlY2tBbmltU3BlZWQgJiYgdHlwZW9mIGNsb3NlX3NvdW5kX3NyYyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ29mZicgPT09ICdvbicpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2hlY2tBbmltU3BlZWQgIT09IDApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwbGF5UHJvbWlzZSA9ICQoZG9jdW1lbnQpLmZpbmQoJyNheXNfcGJfY2xvc2Vfc291bmRfMScpLmdldCgwKS5wbGF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXlQcm9taXNlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheVByb21pc2UudGhlbihmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvLnBhdXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF5c19wYl9lZmZlY3RPdXRfMSAhPSAnbm9uZScpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWxfMScpLmNzcygnZGlzcGxheScsICdub25lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF2X3BvcF9tb2RhbHNfMScpLmNzcygnZGlzcGxheScsICdub25lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbF8xJykuYXR0cignZGF0YS1heXMtZmxhZycsJ3RydWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkKCcjYXlzX3BiX2Nsb3NlX3NvdW5kXzEnKS5nZXQoMCkgIT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISQoJyNheXNfcGJfY2xvc2Vfc291bmRfMScpLmdldCgwKS5wYXVzZWQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbF8xJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhdWRpbyA9ICQoJyNheXNfcGJfY2xvc2Vfc291bmRfMScpLmdldCgwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvLnBhdXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpby5jdXJyZW50VGltZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYXlzX3BiX2FuaW1hdGlvbl9jbG9zZV9zcGVlZCk7ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFsXzEnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF2X3BvcF9tb2RhbHNfMScpLmNzcygnZGlzcGxheScsICdub25lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFsXzEnKS5hdHRyKCdkYXRhLWF5cy1mbGFnJywndHJ1ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJCgnI2F5c19wYl9jbG9zZV9zb3VuZF8xJykuZ2V0KDApICE9IHVuZGVmaW5lZCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISQoJyNheXNfcGJfY2xvc2Vfc291bmRfMScpLmdldCgwKS5wYXVzZWQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFsXzEnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXVkaW8gPSAkKCcjYXlzX3BiX2Nsb3NlX3NvdW5kXzEnKS5nZXQoMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvLnBhdXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvLmN1cnJlbnRUaW1lID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcjYXlzLXBiLXNjcmVlbi1zaGFkZV8xJykuY3NzKHsnb3BhY2l0eSc6ICcwJywgJ2Rpc3BsYXknOiAnbm9uZSd9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcl9wYl8xKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vbigna2V5ZG93bicsIGZ1bmN0aW9uKGV2ZW50KSB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZignMScgJiYgYXlzX3BiX2ZsYWcpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVzY0Nsb3NpbmdQb3B1cHMgPSAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLWNsb3NlLXBvcHVwLXdpdGgtZXNjOnZpc2libGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09IDI3KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvcG1vc3RQb3B1cCA9IGVzY0Nsb3NpbmdQb3B1cHMubGFzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcG1vc3RQb3B1cC5maW5kKCcuYXlzLXBiLW1vZGFsLWNsb3NlXzEnKS50cmlnZ2VyKCdjbGljaycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF5c19wYl9mbGFnID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheXNfcGJfZmxhZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDAwKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjbG9zZVBvcHVwT3ZlcmxheSAmJiAnT24nID09ICdPbicpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5hdl9wb3BfbW9kYWxzXzEnKS5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYl9wYXJlbnQgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGJfZGl2ID0gJCh0aGlzKS5maW5kKCcuYXlzLXBiLW1vZGFsXzEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYl9kaXYuaXMoZS50YXJnZXQpICYmIHBiX2Rpdi5oYXMoZS50YXJnZXQpLmxlbmd0aCA9PT0gMCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFsLWNsb3NlXzEnKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5c19wYl90aW1lcl8xJykuY3NzKCdkaXNwbGF5Jywnbm9uZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbF8xJykuY3NzKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbmltYXRpb24tZHVyYXRpb24nOiBheXNfcGJfYW5pbWF0aW9uX2Nsb3NlX3NlY29uZHMgKyAncycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWwtY2xvc2VfMScpLm9uZSgnY2xpY2snLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBiVmlld3NGbGFnXzEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGJfaWQgPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmFqYXgoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHBiTG9jYWxpemVPYmouYWpheCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAndGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBwYl9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F5c19pbmNyZW1lbnRfcGJfdmlld3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYlZpZXdzRmxhZ18xID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXZfcG9wX21vZGFsc18xJykuY3NzKCdwb2ludGVyLWV2ZW50cycsICdub25lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFsXzEnKS5hdHRyKCdjbGFzcycsICdheXMtcGItbW9kYWwgICBheXMtcGItbW9kYWxfMSAgYXlzLXBiLWJvcmRlci1tb2JpbGVfMSAnK2F5c19wYl9lZmZlY3RPdXRfMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnBhcmVudHMoJy5heXMtcGItbW9kYWxzJykuZmluZCgnaWZyYW1lJykuZWFjaChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSAvaHR0cHM6XC9cL3d3dy55b3V0dWJlLmNvbS87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNyYyA9ICQodGhpcykuYXR0cignc3JjJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCdzcmMnLCAkKHRoaXMpLmF0dHIoJ3NyYycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wYXJlbnRzKCcuYXlzLXBiLW1vZGFscycpLmZpbmQoJ3ZpZGVvLndwLXZpZGVvLXNob3J0Y29kZScpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgJCh0aGlzKS5nZXQoMCkgIT0gJ3VuZGVmaW5lZCcpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgJCh0aGlzKS5nZXQoMCkucGF1c2VkICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5nZXQoMCkucGF1c2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wYXJlbnRzKCcuYXlzLXBiLW1vZGFscycpLmZpbmQoJ2F1ZGlvLndwLWF1ZGlvLXNob3J0Y29kZScpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgJCh0aGlzKS5nZXQoMCkgIT0gJ3VuZGVmaW5lZCcpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgJCh0aGlzKS5nZXQoMCkucGF1c2VkICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5nZXQoMCkucGF1c2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXlzX3BiX2VmZmVjdE91dF8xICE9ICdub25lJyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFsXzEnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXZfcG9wX21vZGFsc18xJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbF8xJykuYXR0cignZGF0YS1heXMtZmxhZycsJ3RydWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJCgnI2F5c19wYl9jbG9zZV9zb3VuZF8xJykuZ2V0KDApICE9IHVuZGVmaW5lZCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighJCgnI2F5c19wYl9jbG9zZV9zb3VuZF8xJykuZ2V0KDApLnBhdXNlZCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbF8xJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXVkaW8gPSAkKCcjYXlzX3BiX2Nsb3NlX3NvdW5kXzEnKS5nZXQoMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8ucGF1c2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpby5jdXJyZW50VGltZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBheXNfcGJfYW5pbWF0aW9uX2Nsb3NlX3NwZWVkKTsgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbF8xJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXZfcG9wX21vZGFsc18xJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFsXzEnKS5hdHRyKCdkYXRhLWF5cy1mbGFnJywndHJ1ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCQoJyNheXNfcGJfY2xvc2Vfc291bmRfMScpLmdldCgwKSAhPSB1bmRlZmluZWQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighJCgnI2F5c19wYl9jbG9zZV9zb3VuZF8xJykuZ2V0KDApLnBhdXNlZCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFsXzEnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF1ZGlvID0gJCgnI2F5c19wYl9jbG9zZV9zb3VuZF8xJykuZ2V0KDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8ucGF1c2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvLmN1cnJlbnRUaW1lID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnI2F5cy1wYi1zY3JlZW4tc2hhZGVfMScpLmNzcyh7J29wYWNpdHknOiAnMCcsICdkaXNwbGF5JzogJ25vbmUnfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGF5c19wYl9zY3JvbGxUb3BfMSAhPT0gMCApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod2luZG93KS5zY3JvbGwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgkKHRoaXMpLnNjcm9sbFRvcCgpID49IGF5c19wYl9zY3JvbGxUb3BfMSkgJiYgKGNvdW50ID09PSAwKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBheXNfcGJfZGVsYXlPcGVuXzEgIT09IDAgKXsgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFsXzEnKS5jc3MoJ2FuaW1hdGlvbi1kZWxheScsIGF5c19wYl9kZWxheU9wZW5fMS8xMDAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5hdl9wb3BfbW9kYWxzXzEnKS5jc3MoJ2Rpc3BsYXknLCdibG9jaycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFsXzEnKS5hZGRDbGFzcyhheXNfcGJfZWZmZWN0SW5fMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWxfMScpLmNzcygnZGlzcGxheScsICdibG9jaycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPCA3NjggJiYgJChkb2N1bWVudCkuZmluZCgnI2F5cy1wYi1zY3JlZW4tc2hhZGVfMScpLmF0dHIoJ2RhdGEtbW9iaWxlLW92ZXJsYXknKSA9PSAndHJ1ZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJyNheXMtcGItc2NyZWVuLXNoYWRlXzEnKS5jc3MoeydvcGFjaXR5JzogJzAuNSd9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnI2F5cy1wYi1zY3JlZW4tc2hhZGVfMScpLmNzcyh7J29wYWNpdHknOiAnMC41MDAwMDAnfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWwtY2hlY2tfMScpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBheXNfcGJfZGVsYXlPcGVuXzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF2X3BvcF9tb2RhbHNfMScpLmNzcygnZGlzcGxheScsJ2Jsb2NrJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbF8xJykuYWRkQ2xhc3MoYXlzX3BiX2VmZmVjdEluXzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWxfMScpLmNzcygnZGlzcGxheScsICdibG9jaycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8IDc2OCAmJiAkKGRvY3VtZW50KS5maW5kKCcjYXlzLXBiLXNjcmVlbi1zaGFkZV8xJykuYXR0cignZGF0YS1tb2JpbGUtb3ZlcmxheScpID09ICd0cnVlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcjYXlzLXBiLXNjcmVlbi1zaGFkZV8xJykuY3NzKHsnb3BhY2l0eSc6ICcwLjUnfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJyNheXMtcGItc2NyZWVuLXNoYWRlXzEnKS5jc3MoeydvcGFjaXR5JzogJzAuNTAwMDAwJ30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbC1jaGVja18xJykucHJvcCgnY2hlY2tlZCcsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJ2ZhbHNlJyA9PSAndHJ1ZScgJiYgd2luZG93LmlubmVyV2lkdGggPCA3NjgpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKDAgIT0gMCAmJiAnb2ZmJyAhPSAnb24nKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsb3NlX2J1dHRvbl9kZWxheV9mb3JfbW9iaWxlID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF5c19wYl9kZWxheU9wZW5fMSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZV9idXR0b25fZGVsYXlfZm9yX21vYmlsZSArPSBNYXRoLmZsb29yKGF5c19wYl9kZWxheU9wZW5fMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbC1jbG9zZV8xJykuY3NzKHsnZGlzcGxheSc6ICdub25lJ30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbC1jbG9zZV8xJykuY3NzKHsnZGlzcGxheSc6ICdibG9jayd9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgY2xvc2VfYnV0dG9uX2RlbGF5X2Zvcl9tb2JpbGUgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoMCAhPSAwICYmICdvZmYnICE9ICdvbicpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2xvc2VfYnV0dG9uX2RlbGF5ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF5c19wYl9kZWxheU9wZW5fMSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlX2J1dHRvbl9kZWxheSArPSBNYXRoLmZsb29yKGF5c19wYl9kZWxheU9wZW5fMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbC1jbG9zZV8xJykuY3NzKHsnZGlzcGxheSc6ICdub25lJ30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbC1jbG9zZV8xJykuY3NzKHsnZGlzcGxheSc6ICdibG9jayd9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgY2xvc2VfYnV0dG9uX2RlbGF5ICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigyMCAhPSAwKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFsXzEnKS5jc3MoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5pbWF0aW9uLWR1cmF0aW9uJzogYXlzX3BiX2FuaW1hdGlvbl9jbG9zZV9zZWNvbmRzICsgJ3MnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVyX3BiXzEgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3VGltZV9wYl8xID0gdGltZV9wYl8xLS07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXNfcGJfdGltZXJfMSBzcGFuJykudGV4dChuZXdUaW1lX3BiXzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihuZXdUaW1lX3BiXzEgPD0gMCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFsLWNsb3NlXzEnKS50cmlnZ2VyKCdjbGljaycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbF8xJykuYXR0cignY2xhc3MnLCAnYXlzLXBiLW1vZGFsIGF5cy1wYi1tb2RhbF8xICAgJytheXNfcGJfZWZmZWN0T3V0XzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXlzX3BiX2VmZmVjdE91dF8xICE9ICdub25lJyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFsXzEnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFsXzEnKS5hdHRyKCdkYXRhLWF5cy1mbGFnJywndHJ1ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGF5c19wYl9hbmltYXRpb25fY2xvc2Vfc3BlZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbF8xJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFsXzEnKS5hdHRyKCdkYXRhLWF5cy1mbGFnJywndHJ1ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyX3BiXzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWwtY2xvc2VfMScpLm9uZSgnY2xpY2snLCBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBiVmlld3NGbGFnXzEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGJfaWQgPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmFqYXgoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHBiTG9jYWxpemVPYmouYWpheCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAndGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBwYl9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F5c19pbmNyZW1lbnRfcGJfdmlld3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYlZpZXdzRmxhZ18xID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXZfcG9wX21vZGFsc18xJykuY3NzKCdwb2ludGVyLWV2ZW50cycsICdub25lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFsXzEnKS5hdHRyKCdjbGFzcycsICdheXMtcGItbW9kYWwgIGF5cy1wYi1tb2RhbF8xICAgYXlzLXBiLWJvcmRlci1tb2JpbGVfMSAnK2F5c19wYl9lZmZlY3RPdXRfMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnBhcmVudHMoJy5heXMtcGItbW9kYWxzJykuZmluZCgnaWZyYW1lJykuZWFjaChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSAvaHR0cHM6XC9cL3d3dy55b3V0dWJlLmNvbS87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNyYyA9ICQodGhpcykuYXR0cignc3JjJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCdzcmMnLCAkKHRoaXMpLmF0dHIoJ3NyYycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wYXJlbnRzKCcuYXlzLXBiLW1vZGFscycpLmZpbmQoJ3ZpZGVvLndwLXZpZGVvLXNob3J0Y29kZScpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgJCh0aGlzKS5nZXQoMCkgIT0gJ3VuZGVmaW5lZCcpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgJCh0aGlzKS5nZXQoMCkucGF1c2VkICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5nZXQoMCkucGF1c2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wYXJlbnRzKCcuYXlzLXBiLW1vZGFscycpLmZpbmQoJ2F1ZGlvLndwLWF1ZGlvLXNob3J0Y29kZScpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgJCh0aGlzKS5nZXQoMCkgIT0gJ3VuZGVmaW5lZCcpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgJCh0aGlzKS5nZXQoMCkucGF1c2VkICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5nZXQoMCkucGF1c2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXlzX3BiX2VmZmVjdE91dF8xICE9ICdub25lJyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFsXzEnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXZfcG9wX21vZGFsc18xJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbF8xJykuYXR0cignZGF0YS1heXMtZmxhZycsJ3RydWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJCgnI2F5c19wYl9jbG9zZV9zb3VuZF8xJykuZ2V0KDApICE9IHVuZGVmaW5lZCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighJCgnI2F5c19wYl9jbG9zZV9zb3VuZF8xJykuZ2V0KDApLnBhdXNlZCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbF8xJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXVkaW8gPSAkKCcjYXlzX3BiX2Nsb3NlX3NvdW5kXzEnKS5nZXQoMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8ucGF1c2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpby5jdXJyZW50VGltZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBheXNfcGJfYW5pbWF0aW9uX2Nsb3NlX3NwZWVkKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFsXzEnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5hdl9wb3BfbW9kYWxzXzEnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWxfMScpLmF0dHIoJ2RhdGEtYXlzLWZsYWcnLCd0cnVlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJCgnI2F5c19wYl9jbG9zZV9zb3VuZF8xJykuZ2V0KDApICE9IHVuZGVmaW5lZCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEkKCcjYXlzX3BiX2Nsb3NlX3NvdW5kXzEnKS5nZXQoMCkucGF1c2VkKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWxfMScpLmNzcygnZGlzcGxheScsICdub25lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXVkaW8gPSAkKCcjYXlzX3BiX2Nsb3NlX3NvdW5kXzEnKS5nZXQoMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpby5wYXVzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8uY3VycmVudFRpbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcjYXlzLXBiLXNjcmVlbi1zaGFkZV8xJykuY3NzKHsnb3BhY2l0eSc6ICcwJywgJ2Rpc3BsYXknOiAnbm9uZSd9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXJfcGJfMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXlzX3BiX2ZsYWcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vbigna2V5ZG93bicsIGZ1bmN0aW9uKGV2ZW50KSB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJzEnICYmIGF5c19wYl9mbGFnKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXNjQ2xvc2luZ1BvcHVwcyA9ICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItY2xvc2UtcG9wdXAtd2l0aC1lc2M6dmlzaWJsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09IDI3KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b3Btb3N0UG9wdXAgPSBlc2NDbG9zaW5nUG9wdXBzLmxhc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wbW9zdFBvcHVwLmZpbmQoJy5heXMtcGItbW9kYWwtY2xvc2VfMScpLnRyaWdnZXIoJ2NsaWNrJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF5c19wYl9mbGFnID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXlzX3BiX2ZsYWcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDEwMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggYXlzX3BiX2RlbGF5T3Blbl8xICE9PSAwICl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWxfMScpLmNzcygnYW5pbWF0aW9uLWRlbGF5JywgYXlzX3BiX2RlbGF5T3Blbl8xLzEwMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXZfcG9wX21vZGFsc18xJykuY3NzKCdkaXNwbGF5JywnYmxvY2snKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWxfMScpLmFkZENsYXNzKGF5c19wYl9lZmZlY3RJbl8xKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWxfMScpLmNzcygnZGlzcGxheScsICdibG9jaycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgNzY4ICYmICQoZG9jdW1lbnQpLmZpbmQoJyNheXMtcGItc2NyZWVuLXNoYWRlXzEnKS5hdHRyKCdkYXRhLW1vYmlsZS1vdmVybGF5JykgPT0gJ3RydWUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnI2F5cy1wYi1zY3JlZW4tc2hhZGVfMScpLmNzcyh7J29wYWNpdHknOiAnMC41J30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcjYXlzLXBiLXNjcmVlbi1zaGFkZV8xJykuY3NzKHsnb3BhY2l0eSc6ICcwLjUwMDAwMCd9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWwtY2hlY2tfMScpLmF0dHIoJ2NoZWNrZWQnLCAnY2hlY2tlZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzUGFnZVNjcm9sbERpc2FibGVkKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCdib2R5JykuYWRkQ2xhc3MoJ3BiX2Rpc2FibGVfc2Nyb2xsXzEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCdodG1sJykucmVtb3ZlQ2xhc3MoJ3BiX2VuYWJsZV9zY3JvbGwnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGF5c19wYl9kZWxheU9wZW5fMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJChkb2N1bWVudCkuZmluZCgnLmF5c19wYl9hYnRfMScpLnZhbCgpICE9ICdjbGlja1NlbGVjdG9yJyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXZfcG9wX21vZGFsc18xJykuY3NzKCdkaXNwbGF5JywnYmxvY2snKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWxfMScpLmFkZENsYXNzKGF5c19wYl9lZmZlY3RJbl8xKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWxfMScpLmNzcygnZGlzcGxheScsICdibG9jaycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgNzY4ICYmICQoZG9jdW1lbnQpLmZpbmQoJyNheXMtcGItc2NyZWVuLXNoYWRlXzEnKS5hdHRyKCdkYXRhLW1vYmlsZS1vdmVybGF5JykgPT0gJ3RydWUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnI2F5cy1wYi1zY3JlZW4tc2hhZGVfMScpLmNzcyh7J29wYWNpdHknOiAnMC41J30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcjYXlzLXBiLXNjcmVlbi1zaGFkZV8xJykuY3NzKHsnb3BhY2l0eSc6ICcwLjUwMDAwMCd9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWwtY2hlY2tfMScpLmF0dHIoJ2NoZWNrZWQnLCAnY2hlY2tlZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzUGFnZVNjcm9sbERpc2FibGVkKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCdib2R5JykuYWRkQ2xhc3MoJ3BiX2Rpc2FibGVfc2Nyb2xsXzEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCdodG1sJykuYWRkQ2xhc3MoJ3BiX2Rpc2FibGVfc2Nyb2xsXzEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnT24nICE9ICdPbicpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJyNheXMtcGItc2NyZWVuLXNoYWRlXzEnKS5jc3MoeydvcGFjaXR5JzogJzAnLCAnZGlzcGxheSc6ICdub25lICFpbXBvcnRhbnQnLCAncG9pbnRlci1ldmVudHMnOiAnbm9uZScsICdiYWNrZ3JvdW5kJzogJ25vbmUnfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbF8xJykuY3NzKCdwb2ludGVyLWV2ZW50cycsICdhdXRvJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF2X3BvcF9tb2RhbHNfMScpLmNzcygncG9pbnRlci1ldmVudHMnLCdub25lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbHMgdmlkZW8nKS5oYXNDbGFzcygnd3AtdmlkZW8tc2hvcnRjb2RlJykpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWRlb1dpZHRoICA9ICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWxzIHZpZGVvLndwLXZpZGVvLXNob3J0Y29kZScpLmF0dHIoJ3dpZHRoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZGVvSGVpZ2h0ID0gJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbHMgdmlkZW8ud3AtdmlkZW8tc2hvcnRjb2RlJykuYXR0cignaGVpZ2h0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFscyAud3AtdmlkZW8nKS5yZW1vdmVBdHRyKCdzdHlsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFscyAubWVqcy1jb250YWluZXInKS5yZW1vdmVBdHRyKCdzdHlsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFscyB2aWRlby53cC12aWRlby1zaG9ydGNvZGUnKS5yZW1vdmVBdHRyKCdzdHlsZScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbHMgLndwLXZpZGVvJykuY3NzKHsnd2lkdGgnOiAnMTAwJSd9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbHMgLm1lanMtY29udGFpbmVyJykuY3NzKHsnd2lkdGgnOiAnMTAwJScsJ2hlaWdodCc6IHZpZGVvSGVpZ2h0ICsgJ3B4J30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXlzLXBiLW1vZGFscyB2aWRlby53cC12aWRlby1zaG9ydGNvZGUnKS5jc3Moeyd3aWR0aCc6ICcxMDAlJywnaGVpZ2h0JzogdmlkZW9IZWlnaHQgKyAncHgnfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWxzIGlmcmFtZScpLmF0dHIoJ3N0eWxlJykgIT0gJycpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkuZmluZCgnLmF5cy1wYi1tb2RhbHMgaWZyYW1lJykucmVtb3ZlQXR0cignc3R5bGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDUwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZigyMCA9PSAwKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjbG9zZVBvcHVwT3ZlcmxheSAmJiAnT24nID09ICdPbicpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5maW5kKCcuYXZfcG9wX21vZGFsc18xJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBiX3BhcmVudCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGJfZGl2ID0gJCh0aGlzKS5maW5kKCcuYXlzLXBiLW1vZGFsXzEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGJfZGl2LmlzKGUudGFyZ2V0KSAmJiBwYl9kaXYuaGFzKGUudGFyZ2V0KS5sZW5ndGggPT09IDApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItbW9kYWwtY2xvc2VfMScpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXlzX3BiX2ZsYWcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCdrZXlkb3duJywgZnVuY3Rpb24oZXZlbnQpIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCcxJyAmJiBheXNfcGJfZmxhZyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXNjQ2xvc2luZ1BvcHVwcyA9ICQoZG9jdW1lbnQpLmZpbmQoJy5heXMtcGItY2xvc2UtcG9wdXAtd2l0aC1lc2M6dmlzaWJsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gMjcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9wbW9zdFBvcHVwID0gZXNjQ2xvc2luZ1BvcHVwcy5sYXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wbW9zdFBvcHVwLmZpbmQoJy5heXMtcGItbW9kYWwtY2xvc2VfMScpLnRyaWdnZXIoJ2NsaWNrJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXlzX3BiX2ZsYWcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXlzX3BiX2ZsYWcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZignb2ZmJyA9PSAnb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZGVvID0gJChkb2N1bWVudCkuZmluZCgndmlkZW8ud3AtdmlkZW8tc2hvcnRjb2RlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aWRlby5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb1tpXS5hZGRFdmVudExpc3RlbmVyKCdlbmRlZCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQodGhpcykubmV4dCgpLnZhbCgpID09PSAnb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wYXJlbnRzKCcuYXlzX3ZpZGVvX3dpbmRvdycpLmZpbmQoJy5jbG9zZS1pbWFnZS1idG4nKS50cmlnZ2VyKCdjbGljaycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeShkb2N1bWVudCkub24oJ2NsaWNrJywgJy5heXMtcGItbW9kYWwtY2xvc2VfMScsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJ2JvZHknKS5yZW1vdmVDbGFzcygncGJfZGlzYWJsZV9zY3JvbGxfMScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLmZpbmQoJ2h0bWwnKS5yZW1vdmVDbGFzcygncGJfZGlzYWJsZV9zY3JvbGxfMScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KSggalF1ZXJ5ICk7CiAgICAgICAgICAgICAgICA=
7 ms
javascript;base64,CiAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIGF5c1BvcHVwT3B0aW9ucyA9PT0gInVuZGVmaW5lZCIpewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXlzUG9wdXBPcHRpb25zID0gW107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGF5c1BvcHVwT3B0aW9uc1siMSJdICA9ICJleUp3YjNCMWNHSnZlQ0k2ZXlKcFpDSTZJakVpTENKMGFYUnNaU0k2SWxObGJHWXRSM1ZwWkdWa0lGUnZkWEp6SWl3aWNHOXdkWEJmYm1GdFpTSTZJaUlzSW1SbGMyTnlhWEIwYVc5dUlqb2lJaXdpWTJGMFpXZHZjbmxmYVdRaU9pSXhJaXdpWVhWMGIyTnNiM05sSWpvaU1qQWlMQ0pqYjI5cmFXVWlPaUl6TUNJc0luZHBaSFJvSWpvMU1EQXNJbWhsYVdkb2RDSTZOREF3TENKaVoyTnZiRzl5SWpvaUl6bGlPV0k1WWlJc0luUmxlSFJqYjJ4dmNpSTZJaU13TURBd01EQWlMQ0ppYjNKa1pYSnphWHBsSWpvaU1TSXNJbUp2Y21SbGNtTnZiRzl5SWpvaUkyWm1abVptWmlJc0ltSnZjbVJsY2w5eVlXUnBkWE1pT2lJM0lpd2ljMmh2Y25SamIyUmxJam9pSWl3aWRYTmxjbk5mY205c1pTSTZJbHRkSWl3aVkzVnpkRzl0WDJOc1lYTnpJam9pSWl3aVkzVnpkRzl0WDJOemN5STZJaUlzSW1OMWMzUnZiVjlvZEcxc0lqb2lQR0VnYUhKbFpqMWNJbWgwZEhCek9sd3ZYQzl0YVdSM1pYTjBaR1Z6YVdkdWFHOXRaWE11WTI5dFhDOTBiM1Z5WENJZ2NtVnNQVndpWVhSMFlXTm9iV1Z1ZENCM2NDMWhkSFF0TnpVeU0xd2lQanhwYldjZ1kyeGhjM005WENKaGJHbG5ibU5sYm5SbGNpQjNjQzFwYldGblpTMDNOekUzSUZ3aUlITnlZejFjSW1oMGRIQnpPbHd2WEM5dGFXUjNaWE4wWkdWemFXZHVhRzl0WlhNdVkyOXRYQzkzY0MxamIyNTBaVzUwWEM5MWNHeHZZV1J6WEM4eU1ESTBYQzh3T1Z3dlZHOTFjaTFQZFhJdFNHOXRaWE10VUc5d2RYQXRNVEF5TkhnM05qZ3VjRzVuWENJZ1lXeDBQVndpWENJZ2QybGtkR2c5WENJM09UZGNJaUJvWldsbmFIUTlYQ0kxT1RoY0lpQmNMejQ4WEM5aFBqd2hMUzF0YjNKbExTMCtJaXdpYjI1dlptWnpkMmwwWTJnaU9pSlBiaUlzSW5Ob2IzZGZiMjVzZVY5bWIzSmZZWFYwYUc5eUlqb2liMlptSWl3aWMyaHZkMTloYkd3aU9pSnpaV3hsWTNSbFpDSXNJbVJsYkdGNUlqb2lNQ0lzSW5OamNtOXNiRjkwYjNBaU9pSXdJaXdpWVc1cGJXRjBaVjlwYmlJNkltWmhaR1ZKYmlJc0ltRnVhVzFoZEdWZmIzVjBJam9pWm1Ga1pVOTFkRlZ3UW1sbklpd2lZV04wYVc5dVgySjFkSFJ2YmlJNklpSXNJblpwWlhkZmNHeGhZMlVpT2lJaUxDSmhZM1JwYjI1ZlluVjBkRzl1WDNSNWNHVWlPaUp3WVdkbFRHOWhaR1ZrSWl3aWJXOWtZV3hmWTI5dWRHVnVkQ0k2SW1OMWMzUnZiVjlvZEcxc0lpd2lkbWxsZDE5MGVYQmxJam9pWkdWbVlYVnNkQ0lzSW05dWIyWm1iM1psY214aGVTSTZJazl1SWl3aWIzWmxjbXhoZVY5dmNHRmphWFI1SWpvaU1DNDFNREF3TURBaUxDSnphRzkzWDNCdmNIVndYM1JwZEd4bElqb2lUMlptSWl3aWMyaHZkMTl3YjNCMWNGOWtaWE5qSWpvaVQyWm1JaXdpWTJ4dmMyVmZZblYwZEc5dUlqb2liMlptSWl3aWFHVmhaR1Z5WDJKblkyOXNiM0lpT2lJalptWm1abVptSWl3aVltZGZhVzFoWjJVaU9pSWlMQ0pzYjJkZmRYTmxjaUk2SWs5dUlpd2laM1ZsYzNRaU9pSlBiaUlzSW1GamRHbDJaVjlrWVhSbFgyTm9aV05ySWpvaWIyWm1JaXdpWVdOMGFYWmxTVzUwWlhKMllXd2lPaUl5TURJMExUQTVMVEEwSURFeE9qUTVPak13SWl3aVpHVmhZM1JwZG1WSmJuUmxjblpoYkNJNklqSXdNalF0TURrdE1EUWdNVEU2TkRrNk16QWlMQ0p3WWw5d2IzTnBkR2x2YmlJNkltTmxiblJsY2kxalpXNTBaWElpTENKd1lsOXRZWEpuYVc0aU9pSXdJaXdpZG1sbGQzTWlPaUl4TkRFNUlpd2lZMjl1ZG1WeWMybHZibk1pT2lJd0lpd2liM0IwYVc5dWN5STZJbnRjSW1WdVlXSnNaVjlpWVdOclozSnZkVzVrWDJkeVlXUnBaVzUwWENJNlhDSnZabVpjSWl4Y0ltSmhZMnRuY205MWJtUmZaM0poWkdsbGJuUmZZMjlzYjNKZk1Wd2lPbHdpSXpBd01Gd2lMRndpWW1GamEyZHliM1Z1WkY5bmNtRmthV1Z1ZEY5amIyeHZjbDh5WENJNlhDSWpabVptWENJc1hDSndZbDluY21Ga2FXVnVkRjlrYVhKbFkzUnBiMjVjSWpwY0luWmxjblJwWTJGc1hDSXNYQ0psYm1GaWJHVmZZbUZqYTJkeWIzVnVaRjluY21Ga2FXVnVkRjl0YjJKcGJHVmNJanBjSW05bVpsd2lMRndpWW1GamEyZHliM1Z1WkY5bmNtRmthV1Z1ZEY5amIyeHZjbDh4WDIxdlltbHNaVndpT2x3aUl6QXdNRndpTEZ3aVltRmphMmR5YjNWdVpGOW5jbUZrYVdWdWRGOWpiMnh2Y2w4eVgyMXZZbWxzWlZ3aU9sd2lJMlptWmx3aUxGd2ljR0pmWjNKaFpHbGxiblJmWkdseVpXTjBhVzl1WDIxdlltbHNaVndpT2x3aWRtVnlkR2xqWVd4Y0lpeGNJbVY0WTJWd2RGOXdiM04wWDNSNWNHVnpYQ0k2VzEwc1hDSmxlR05sY0hSZmNHOXpkSE5jSWpwYlhTeGNJbUZzYkY5d2IzTjBjMXdpT2x3aVhDSXNYQ0pqYkc5elpWOWlkWFIwYjI1ZlpHVnNZWGxjSWpvd0xGd2lZMnh2YzJWZlluVjBkRzl1WDJSbGJHRjVYMlp2Y2w5dGIySnBiR1ZjSWpvd0xGd2laVzVoWW14bFgyTnNiM05sWDJKMWRIUnZibDlrWld4aGVWOW1iM0pmYlc5aWFXeGxYQ0k2WENKdlptWmNJaXhjSW1WdVlXSnNaVjl3WWw5emIzVnVaRndpT2x3aWIyWm1YQ0lzWENKdmRtVnliR0Y1WDJOdmJHOXlYQ0k2WENJak1EQXdNREF3WENJc1hDSmxibUZpYkdWZmIzWmxjbXhoZVY5amIyeHZjbDl0YjJKcGJHVmNJanBjSW05bVpsd2lMRndpYjNabGNteGhlVjlqYjJ4dmNsOXRiMkpwYkdWY0lqcGNJaU13TURCY0lpeGNJbUZ1YVcxaGRHbHZibDl6Y0dWbFpGd2lPakVzWENKbGJtRmliR1ZmWVc1cGJXRjBhVzl1WDNOd1pXVmtYMjF2WW1sc1pWd2lPbHdpYjJabVhDSXNYQ0poYm1sdFlYUnBiMjVmYzNCbFpXUmZiVzlpYVd4bFhDSTZNU3hjSW1Oc2IzTmxYMkZ1YVcxaGRHbHZibDl6Y0dWbFpGd2lPakVzWENKbGJtRmliR1ZmWTJ4dmMyVmZZVzVwYldGMGFXOXVYM053WldWa1gyMXZZbWxzWlZ3aU9sd2liMlptWENJc1hDSmpiRzl6WlY5aGJtbHRZWFJwYjI1ZmMzQmxaV1JmYlc5aWFXeGxYQ0k2TVN4Y0luQmlYMjF2WW1sc1pWd2lPbHdpYjJabVhDSXNYQ0pqYkc5elpWOWlkWFIwYjI1ZmRHVjRkRndpT2x3aVhGeDFNamN4TlZ3aUxGd2laVzVoWW14bFgyTnNiM05sWDJKMWRIUnZibDkwWlhoMFgyMXZZbWxzWlZ3aU9sd2liMjVjSWl4Y0ltTnNiM05sWDJKMWRIUnZibDkwWlhoMFgyMXZZbWxzWlZ3aU9sd2lYRngxTWpjeE5Wd2lMRndpWTJ4dmMyVmZZblYwZEc5dVgyaHZkbVZ5WDNSbGVIUmNJanBjSWx3aUxGd2liVzlpYVd4bFgzZHBaSFJvWENJNlhDSmNJaXhjSW0xdlltbHNaVjl0WVhoZmQybGtkR2hjSWpwY0lsd2lMRndpYlc5aWFXeGxYMmhsYVdkb2RGd2lPbHdpWENJc1hDSmpiRzl6WlY5aWRYUjBiMjVmY0c5emFYUnBiMjVjSWpwY0luSnBaMmgwTFhSdmNGd2lMRndpWlc1aFlteGxYMk5zYjNObFgySjFkSFJ2Ymw5d2IzTnBkR2x2Ymw5dGIySnBiR1ZjSWpwY0ltOW1abHdpTEZ3aVkyeHZjMlZmWW5WMGRHOXVYM0J2YzJsMGFXOXVYMjF2WW1sc1pWd2lPbHdpY21sbmFIUXRkRzl3WENJc1hDSnphRzkzWDI5dWJIbGZiMjVqWlZ3aU9sd2liMjVjSWl4Y0luTm9iM2RmYjI1ZmFHOXRaVjl3WVdkbFhDSTZYQ0p2Ymx3aUxGd2lZMnh2YzJWZmNHOXdkWEJmWlhOalhDSTZYQ0p2Ymx3aUxGd2ljRzl3ZFhCZmQybGtkR2hmWW5sZmNHVnlZMlZ1ZEdGblpWOXdlRndpT2x3aWNHbDRaV3h6WENJc1hDSndiM0IxY0Y5M2FXUjBhRjlpZVY5d1pYSmpaVzUwWVdkbFgzQjRYMjF2WW1sc1pWd2lPbHdpY0dWeVkyVnVkR0ZuWlZ3aUxGd2ljRzl3ZFhCZlkyOXVkR1Z1ZEY5d1lXUmthVzVuWENJNk1qQXNYQ0p3YjNCMWNGOXdZV1JrYVc1blgySjVYM0JsY21ObGJuUmhaMlZmY0hoY0lqcGNJbkJwZUdWc2Mxd2lMRndpY0dKZlptOXVkRjltWVcxcGJIbGNJanBjSW1sdWFHVnlhWFJjSWl4Y0ltTnNiM05sWDNCdmNIVndYMjkyWlhKc1lYbGNJanBjSW05dVhDSXNYQ0pqYkc5elpWOXdiM0IxY0Y5dmRtVnliR0Y1WDIxdlltbHNaVndpT2x3aWIyNWNJaXhjSW1WdVlXSnNaVjl3WWw5bWRXeHNjMk55WldWdVhDSTZYQ0p2Wm1aY0lpeGNJbVZ1WVdKc1pWOW9hV1JsWDNScGJXVnlYQ0k2WENKdmJsd2lMRndpWlc1aFlteGxYMmhwWkdWZmRHbHRaWEpmYlc5aWFXeGxYQ0k2WENKdmJsd2lMRndpWlc1aFlteGxYMkYxZEc5amJHOXpaVjl2Ymw5amIyMXdiR1YwYVc5dVhDSTZYQ0p2Wm1aY0lpeGNJbVZ1WVdKc1pWOXpiMk5wWVd4ZmJHbHVhM05jSWpwY0ltOW1abHdpTEZ3aWMyOWphV0ZzWDJ4cGJtdHpYQ0k2ZTF3aWJHbHVhMlZrYVc1ZmJHbHVhMXdpT2x3aVhDSXNYQ0ptWVdObFltOXZhMTlzYVc1clhDSTZYQ0pjSWl4Y0luUjNhWFIwWlhKZmJHbHVhMXdpT2x3aVhDSXNYQ0oyYTI5dWRHRnJkR1ZmYkdsdWExd2lPbHdpWENJc1hDSjViM1YwZFdKbFgyeHBibXRjSWpwY0lsd2lMRndpYVc1emRHRm5jbUZ0WDJ4cGJtdGNJanBjSWx3aUxGd2lZbVZvWVc1alpWOXNhVzVyWENJNlhDSmNJbjBzWENKemIyTnBZV3hmWW5WMGRHOXVjMTlvWldGa2FXNW5YQ0k2WENKY0lpeGNJbU5zYjNObFgySjFkSFJ2Ymw5emFYcGxYQ0k2TVN4Y0ltTnNiM05sWDJKMWRIUnZibDlwYldGblpWd2lPbHdpWENJc1hDSmliM0prWlhKZmMzUjViR1ZjSWpwY0luTnZiR2xrWENJc1hDSmxibUZpYkdWZlltOXlaR1Z5WDNOMGVXeGxYMjF2WW1sc1pWd2lPbHdpYjJabVhDSXNYQ0ppYjNKa1pYSmZjM1I1YkdWZmJXOWlhV3hsWENJNlhDSnpiMnhwWkZ3aUxGd2lZWGx6WDNCaVgyaHZkbVZ5WDNOb2IzZGZZMnh2YzJWZlluUnVYQ0k2WENKdlptWmNJaXhjSW1ScGMyRmliR1ZmYzJOeWIyeHNYQ0k2WENKdlptWmNJaXhjSW1ScGMyRmliR1ZmYzJOeWIyeHNYMjF2WW1sc1pWd2lPbHdpYjJabVhDSXNYQ0psYm1GaWJHVmZiM0JsYmw5a1pXeGhlVjl0YjJKcGJHVmNJanBjSW05bVpsd2lMRndpYjNCbGJsOWtaV3hoZVY5dGIySnBiR1ZjSWpwY0lqQmNJaXhjSW1WdVlXSnNaVjl6WTNKdmJHeGZkRzl3WDIxdlltbHNaVndpT2x3aWIyWm1YQ0lzWENKelkzSnZiR3hmZEc5d1gyMXZZbWxzWlZ3aU9sd2lNRndpTEZ3aVpXNWhZbXhsWDNCaVgzQnZjMmwwYVc5dVgyMXZZbWxzWlZ3aU9sd2liMlptWENJc1hDSndZbDl3YjNOcGRHbHZibDl0YjJKcGJHVmNJanBjSW1ObGJuUmxjaTFqWlc1MFpYSmNJaXhjSW5CaVgySm5YMmx0WVdkbFgzQnZjMmwwYVc5dVhDSTZYQ0pqWlc1MFpYSXRZMlZ1ZEdWeVhDSXNYQ0psYm1GaWJHVmZjR0pmWW1kZmFXMWhaMlZmY0c5emFYUnBiMjVmYlc5aWFXeGxYQ0k2WENKdlptWmNJaXhjSW5CaVgySm5YMmx0WVdkbFgzQnZjMmwwYVc5dVgyMXZZbWxzWlZ3aU9sd2lZMlZ1ZEdWeUxXTmxiblJsY2x3aUxGd2ljR0pmWW1kZmFXMWhaMlZmYzJsNmFXNW5YQ0k2WENKamIzWmxjbHdpTEZ3aVpXNWhZbXhsWDNCaVgySm5YMmx0WVdkbFgzTnBlbWx1WjE5dGIySnBiR1ZjSWpwY0ltOW1abHdpTEZ3aWNHSmZZbWRmYVcxaFoyVmZjMmw2YVc1blgyMXZZbWxzWlZ3aU9sd2lZMjkyWlhKY0lpeGNJblpwWkdWdlgzUm9aVzFsWDNWeWJGd2lPbHdpWENJc1hDSnBiV0ZuWlY5MGVYQmxYMmx0WjE5emNtTmNJanBjSWx3aUxGd2lhVzFoWjJWZmRIbHdaVjlwYldkZmNtVmthWEpsWTNSZmRYSnNYQ0k2WENKY0lpeGNJbWx0WVdkbFgzUjVjR1ZmYVcxblgzSmxaR2x5WldOMFgzUnZYMjVsZDE5MFlXSmNJanBjSW05bVpsd2lMRndpWm1GalpXSnZiMnRmY0dGblpWOTFjbXhjSWpwY0lsd2lMRndpYUdsa1pWOW1ZbDl3WVdkbFgyTnZkbVZ5WDNCb2IzUnZYQ0k2WENKdlptWmNJaXhjSW5WelpWOXpiV0ZzYkY5bVlsOW9aV0ZrWlhKY0lqcGNJbTl1WENJc1hDSnViM1JwWm1sallYUnBiMjVmZEhsd1pWOWpiMjF3YjI1bGJuUnpYQ0k2VzEwc1hDSnViM1JwWm1sallYUnBiMjVmZEhsd1pWOWpiMjF3YjI1bGJuUnpYMjl5WkdWeVhDSTZlMXdpYldGcGJsOWpiMjUwWlc1MFhDSTZYQ0p0WVdsdVgyTnZiblJsYm5SY0lpeGNJbUoxZEhSdmJsOHhYQ0k2WENKaWRYUjBiMjVmTVZ3aWZTeGNJbTV2ZEdsbWFXTmhkR2x2Ymw5dFlXbHVYMk52Ym5SbGJuUmNJanBjSWxkeWFYUmxJSFJvWlNCamRYTjBiMjBnYm05MGFXWnBZMkYwYVc5dUlHSmhibTVsY2lCMFpYaDBJR2hsY21VdVhDSXNYQ0p1YjNScFptbGpZWFJwYjI1ZlluVjBkRzl1WHpGZmRHVjRkRndpT2x3aVEyeHBZMnNoWENJc1hDSnViM1JwWm1sallYUnBiMjVmWW5WMGRHOXVYekZmY21Wa2FYSmxZM1JmZFhKc1hDSTZYQ0pjSWl4Y0ltNXZkR2xtYVdOaGRHbHZibDlpZFhSMGIyNWZNVjl5WldScGNtVmpkRjkwYjE5dVpYZGZkR0ZpWENJNlhDSnZabVpjSWl4Y0ltNXZkR2xtYVdOaGRHbHZibDlpZFhSMGIyNWZNVjlpWjE5amIyeHZjbHdpT2x3aUkwWTJOakV5TTF3aUxGd2libTkwYVdacFkyRjBhVzl1WDJKMWRIUnZibDh4WDJKblgyaHZkbVZ5WDJOdmJHOXlYQ0k2WENJalJqWTJNVEl6WENJc1hDSnViM1JwWm1sallYUnBiMjVmWW5WMGRHOXVYekZmZEdWNGRGOWpiMnh2Y2x3aU9sd2lJMFpHUmtaR1Jsd2lMRndpYm05MGFXWnBZMkYwYVc5dVgySjFkSFJ2Ymw4eFgzUmxlSFJmYUc5MlpYSmZZMjlzYjNKY0lqcGNJaU5HUmtaR1JrWmNJaXhjSW01dmRHbG1hV05oZEdsdmJsOWlkWFIwYjI1Zk1WOXNaWFIwWlhKZmMzQmhZMmx1WjF3aU9qQXNYQ0p1YjNScFptbGpZWFJwYjI1ZlluVjBkRzl1WHpGZlptOXVkRjl6YVhwbFhDSTZNVFVzWENKdWIzUnBabWxqWVhScGIyNWZZblYwZEc5dVh6RmZZbTl5WkdWeVgzSmhaR2wxYzF3aU9qWXNYQ0p1YjNScFptbGpZWFJwYjI1ZlluVjBkRzl1WHpGZlltOXlaR1Z5WDNkcFpIUm9YQ0k2TUN4Y0ltNXZkR2xtYVdOaGRHbHZibDlpZFhSMGIyNWZNVjlpYjNKa1pYSmZZMjlzYjNKY0lqcGNJaU5HUmtaR1JrWmNJaXhjSW01dmRHbG1hV05oZEdsdmJsOWlkWFIwYjI1Zk1WOWliM0prWlhKZmMzUjViR1ZjSWpwY0luTnZiR2xrWENJc1hDSnViM1JwWm1sallYUnBiMjVmWW5WMGRHOXVYekZmY0dGa1pHbHVaMTlzWldaMFgzSnBaMmgwWENJNk16SXNYQ0p1YjNScFptbGpZWFJwYjI1ZlluVjBkRzl1WHpGZmNHRmtaR2x1WjE5MGIzQmZZbTkwZEc5dFhDSTZNVFlzWENKdWIzUnBabWxqWVhScGIyNWZZblYwZEc5dVh6RmZaVzVoWW14bFgySnZlRjl6YUdGa2IzZGNJanBjSW05bVpsd2lMRndpYm05MGFXWnBZMkYwYVc5dVgySjFkSFJ2Ymw4eFgySnZlRjl6YUdGa2IzZGZZMjlzYjNKY0lqcGNJaU5HUmpnek1UbGNJaXhjSW01dmRHbG1hV05oZEdsdmJsOWlkWFIwYjI1Zk1WOWliM2hmYzJoaFpHOTNYM2hmYjJabWMyVjBYQ0k2TUN4Y0ltNXZkR2xtYVdOaGRHbHZibDlpZFhSMGIyNWZNVjlpYjNoZmMyaGhaRzkzWDNsZmIyWm1jMlYwWENJNk1DeGNJbTV2ZEdsbWFXTmhkR2x2Ymw5aWRYUjBiMjVmTVY5aWIzaGZjMmhoWkc5M1gzcGZiMlptYzJWMFhDSTZNVEFzWENKd1lsOXRZWGhmYUdWcFoyaDBYQ0k2WENKY0lpeGNJbkJ2Y0hWd1gyMWhlRjlvWldsbmFIUmZZbmxmY0dWeVkyVnVkR0ZuWlY5d2VGd2lPbHdpY0dsNFpXeHpYQ0lzWENKd1lsOXRZWGhmYUdWcFoyaDBYMjF2WW1sc1pWd2lPbHdpWENJc1hDSndiM0IxY0Y5dFlYaGZhR1ZwWjJoMFgySjVYM0JsY21ObGJuUmhaMlZmY0hoZmJXOWlhV3hsWENJNlhDSndhWGhsYkhOY0lpeGNJbkJpWDIxcGJsOW9aV2xuYUhSY0lqcGNJbHdpTEZ3aWNHSmZabTl1ZEY5emFYcGxYQ0k2TVRNc1hDSndZbDltYjI1MFgzTnBlbVZmWm05eVgyMXZZbWxzWlZ3aU9qRXpMRndpY0dKZmRHbDBiR1ZmZEdWNGRGOXphR0ZrYjNkY0lqcGNJbkpuWW1Fb01qVTFMREkxTlN3eU5UVXNNQ2xjSWl4Y0ltVnVZV0pzWlY5d1lsOTBhWFJzWlY5MFpYaDBYM05vWVdSdmQxd2lPbHdpYjJabVhDSXNYQ0p3WWw5MGFYUnNaVjkwWlhoMFgzTm9ZV1J2ZDE5NFgyOW1abk5sZEZ3aU9qSXNYQ0p3WWw5MGFYUnNaVjkwWlhoMFgzTm9ZV1J2ZDE5NVgyOW1abk5sZEZ3aU9qSXNYQ0p3WWw5MGFYUnNaVjkwWlhoMFgzTm9ZV1J2ZDE5NlgyOW1abk5sZEZ3aU9qQXNYQ0p3WWw5MGFYUnNaVjkwWlhoMFgzTm9ZV1J2ZDE5dGIySnBiR1ZjSWpwY0luSm5ZbUVvTWpVMUxESTFOU3d5TlRVc01DbGNJaXhjSW1WdVlXSnNaVjl3WWw5MGFYUnNaVjkwWlhoMFgzTm9ZV1J2ZDE5dGIySnBiR1ZjSWpwY0ltOW1abHdpTEZ3aWNHSmZkR2wwYkdWZmRHVjRkRjl6YUdGa2IzZGZlRjl2Wm1aelpYUmZiVzlpYVd4bFhDSTZNaXhjSW5CaVgzUnBkR3hsWDNSbGVIUmZjMmhoWkc5M1gzbGZiMlptYzJWMFgyMXZZbWxzWlZ3aU9qSXNYQ0p3WWw5MGFYUnNaVjkwWlhoMFgzTm9ZV1J2ZDE5NlgyOW1abk5sZEY5dGIySnBiR1ZjSWpvd0xGd2lZM0psWVhSbFgyUmhkR1ZjSWpwY0lqSXdNalF0TURZdE1UY2dNVEE2TkRBNk5UTmNJaXhjSW1OeVpXRjBaVjloZFhSb2IzSmNJam81TEZ3aVlYVjBhRzl5WENJNlhDSjdYRnhjSW1sa1hGeGNJanBjWEZ3aU9WeGNYQ0lzWEZ4Y0ltNWhiV1ZjWEZ3aU9seGNYQ0pDY21saGJpQk5kWEp5WVhsY1hGd2lmVndpTEZ3aVpXNWhZbXhsWDJScGMyMXBjM05jSWpwY0ltOW1abHdpTEZ3aVpXNWhZbXhsWDJScGMyMXBjM05mZEdWNGRGd2lPbHdpUkdsemJXbHpjeUJoWkZ3aUxGd2laVzVoWW14bFgyUnBjMjFwYzNOZmJXOWlhV3hsWENJNlhDSnZabVpjSWl4Y0ltVnVZV0pzWlY5a2FYTnRhWE56WDNSbGVIUmZiVzlpYVd4bFhDSTZYQ0pFYVhOdGFYTnpJR0ZrWENJc1hDSmxibUZpYkdWZlltOTRYM05vWVdSdmQxd2lPbHdpYjJabVhDSXNYQ0psYm1GaWJHVmZZbTk0WDNOb1lXUnZkMTl0YjJKcGJHVmNJanBjSW05bVpsd2lMRndpWW05NFgzTm9ZV1J2ZDE5amIyeHZjbHdpT2x3aUl6QXdNRndpTEZ3aVltOTRYM05vWVdSdmQxOWpiMnh2Y2w5dGIySnBiR1ZjSWpwY0lpTXdNREJjSWl4Y0luQmlYMkp2ZUY5emFHRmtiM2RmZUY5dlptWnpaWFJjSWpvd0xGd2ljR0pmWW05NFgzTm9ZV1J2ZDE5NFgyOW1abk5sZEY5dGIySnBiR1ZjSWpvd0xGd2ljR0pmWW05NFgzTm9ZV1J2ZDE5NVgyOW1abk5sZEZ3aU9qQXNYQ0p3WWw5aWIzaGZjMmhoWkc5M1gzbGZiMlptYzJWMFgyMXZZbWxzWlZ3aU9qQXNYQ0p3WWw5aWIzaGZjMmhoWkc5M1gzcGZiMlptYzJWMFhDSTZNVFVzWENKd1lsOWliM2hmYzJoaFpHOTNYM3BmYjJabWMyVjBYMjF2WW1sc1pWd2lPakUxTEZ3aVpHbHpZV0pzWlY5elkzSnZiR3hmYjI1ZmNHOXdkWEJjSWpwY0ltOW1abHdpTEZ3aVpHbHpZV0pzWlY5elkzSnZiR3hmYjI1ZmNHOXdkWEJmYlc5aWFXeGxYQ0k2WENKdlptWmNJaXhjSW5Ob2IzZGZjMk55YjJ4c1ltRnlYQ0k2WENKdlptWmNJaXhjSW1ocFpHVmZiMjVmY0dOY0lqcGNJbTltWmx3aUxGd2lhR2xrWlY5dmJsOTBZV0pzWlhSelhDSTZYQ0p2Wm1aY0lpeGNJbkJpWDJKblgybHRZV2RsWDJScGNtVmpkR2x2Ymw5dmJsOXRiMkpwYkdWY0lqcGNJbTl1WENJc1hDSmpiRzl6WlY5aWRYUjBiMjVmWTI5c2IzSmNJanBjSWlNd01EQXdNREJjSWl4Y0ltTnNiM05sWDJKMWRIUnZibDlvYjNabGNsOWpiMnh2Y2x3aU9sd2lJekF3TURBd01Gd2lMRndpWW14MWNtVmtYMjkyWlhKc1lYbGNJanBjSW05bVpsd2lMRndpWW14MWNtVmtYMjkyWlhKc1lYbGZiVzlpYVd4bFhDSTZYQ0p2Wm1aY0lpeGNJbkJpWDJGMWRHOWpiRzl6WlY5dGIySnBiR1ZjSWpwY0lqSXdYQ0lzWENKbGJtRmliR1ZmWVhWMGIyTnNiM05sWDJSbGJHRjVYM1JsZUhSZmJXOWlhV3hsWENJNlhDSnZabVpjSWl4Y0ltVnVZV0pzWlY5dmRtVnliR0Y1WDNSbGVIUmZiVzlpYVd4bFhDSTZYQ0p2Wm1aY0lpeGNJbTkyWlhKc1lYbGZiVzlpYVd4bFgyOXdZV05wZEhsY0lqcGNJakF1TlZ3aUxGd2ljMmh2ZDE5d2IzQjFjRjkwYVhSc1pWOXRiMkpwYkdWY0lqcGNJazltWmx3aUxGd2ljMmh2ZDE5d2IzQjFjRjlrWlhOalgyMXZZbWxzWlZ3aU9sd2lUMlptWENJc1hDSmxibUZpYkdWZllXNXBiV0YwWlY5cGJsOXRiMkpwYkdWY0lqcGNJbTltWmx3aUxGd2lZVzVwYldGMFpWOXBibDl0YjJKcGJHVmNJanBjSW1aaFpHVkpibHdpTEZ3aVpXNWhZbXhsWDJGdWFXMWhkR1ZmYjNWMFgyMXZZbWxzWlZ3aU9sd2liMlptWENJc1hDSmhibWx0WVhSbFgyOTFkRjl0YjJKcGJHVmNJanBjSW1aaFpHVlBkWFJWY0VKcFoxd2lMRndpWlc1aFlteGxYMlJwYzNCc1lYbGZZMjl1ZEdWdWRGOXRiMkpwYkdWY0lqcGNJbTltWmx3aUxGd2laVzVoWW14bFgySm5ZMjlzYjNKZmJXOWlhV3hsWENJNlhDSnZabVpjSWl4Y0ltSm5ZMjlzYjNKZmJXOWlhV3hsWENJNlhDSWpabVptWm1abVhDSXNYQ0psYm1GaWJHVmZZbWRmYVcxaFoyVmZiVzlpYVd4bFhDSTZYQ0p2Wm1aY0lpeGNJbUpuWDJsdFlXZGxYMjF2WW1sc1pWd2lPbHdpWENJc1hDSmxibUZpYkdWZlltOXlaR1Z5WTI5c2IzSmZiVzlpYVd4bFhDSTZYQ0p2Wm1aY0lpeGNJbUp2Y21SbGNtTnZiRzl5WDIxdlltbHNaVndpT2x3aUkyWm1abVptWmx3aUxGd2laVzVoWW14bFgySnZjbVJsY25OcGVtVmZiVzlpYVd4bFhDSTZYQ0p2Wm1aY0lpeGNJbUp2Y21SbGNuTnBlbVZmYlc5aWFXeGxYQ0k2WENJeFhDSXNYQ0psYm1GaWJHVmZZbTl5WkdWeVgzSmhaR2wxYzE5dGIySnBiR1ZjSWpwY0ltOW1abHdpTEZ3aVltOXlaR1Z5WDNKaFpHbDFjMTl0YjJKcGJHVmNJanBjSWpkY0luMGlMQ0p6YUc5M1gzQnZjSFZ3WDNScGRHeGxYMjF2WW1sc1pTSTZJazltWmlJc0luTm9iM2RmY0c5d2RYQmZaR1Z6WTE5dGIySnBiR1VpT2lKUFptWWlmWDA9IjsKICAgICAgICAgICAgICAgIA==
6 ms
ays-pb-public-min.css
48 ms
hooks.min.js
48 ms
i18n.min.js
62 ms
javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwp3cC5pMThuLnNldExvY2FsZURhdGEoIHsgJ3RleHQgZGlyZWN0aW9uXHUwMDA0bHRyJzogWyAnbHRyJyBdIH0gKTsKLyogXV0+ICovCg==
5 ms
autoptimize_single_efc27e253fae1b7b891fb5a40e687768.php
62 ms
javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwp2YXIgd3BjZjcgPSB7ImFwaSI6eyJyb290IjoiaHR0cHM6XC9cL21pZHdlc3RkZXNpZ25ob21lcy5jb21cL3dwLWpzb25cLyIsIm5hbWVzcGFjZSI6ImNvbnRhY3QtZm9ybS03XC92MSJ9fTsKLyogXV0+ICovCg==
5 ms
autoptimize_single_0b1719adf5fa7231cb1a1b54cf11a50e.php
62 ms
autoptimize_single_a814e25df935e17c09b8fb765308c70a.php
62 ms
javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwp3cGFfZmllbGRfaW5mbyA9IHsid3BhX2ZpZWxkX25hbWUiOiJ6aGtleXAxODEyIiwid3BhX2ZpZWxkX3ZhbHVlIjo5MjU1NTYsIndwYV9hZGRfdGVzdCI6Im5vIn0KLyogXV0+ICovCg==
4 ms
bootstrap.min.js
61 ms
scripts.min.js
62 ms
css
53 ms
MDH_logo_new-scaled-e1611177306112.png
181 ms
ContactFormFrame.aspx
197 ms
SPgEt61L_Vs
262 ms
IMG_3543.jpeg
176 ms
IMG_3538.jpeg
183 ms
IMG_3534.jpeg
183 ms
IMG_3533-1.jpeg
175 ms
IMG_3539.jpeg
179 ms
brown-co-home-color.png
142 ms
nahb-color.png
156 ms
focus-color.png
182 ms
hba.png
188 ms
wisconsin-builders-color.png
188 ms
landfill-reduction.png
188 ms
blue-seal-120-70-midwest-design-homes-inc-15023466.png
194 ms
Tour-Our-Homes-Popup-1024x768.png
241 ms
kmKnZrc3Hgbbcjq75U4uslyuy4kn0qNZaxU.woff
64 ms
fontawesome-webfont.woff
31 ms
EvONzA1M1Iw_CBd2hsQyEFge.woff
118 ms
webpackruntime.chunk.3b16168172f0c0d87e43.js
42 ms
btConstants.chunk.c043c1cd2252400fc9ed.js
63 ms
vendor.chunk.c7f068f7ef55e7dc70d5.css
99 ms
vendor.chunk.5445734f4050073467cf.js
111 ms
commons.chunk.ed915f5165482249f040.css
49 ms
commons.chunk.4a298b5ddae40bf0b095.js
74 ms
rootMasterWebforms.chunk.f347f3678442973103df.css
74 ms
rootMasterWebforms.chunk.06d2dc14f4be992e9fba.js
103 ms
TabSpecificCssIncludes_BuildertrendFontIcons
110 ms
css
40 ms
TabSpecificCssIncludes_NewBuilderWebsiteLoginFrame
273 ms
UserControlIncludes_MultiSelect
275 ms
leadGeneratorCss
437 ms
css
39 ms
TabSpecificJsIncludes_ExternalFormIframe
438 ms
TabSpecificCssIncludes_NewLeadGenerator
440 ms
jquery.placeholder.min.js
438 ms
api.js
100 ms
WebResource.axd
434 ms
ScriptResource.axd
436 ms
ScriptResource.axd
440 ms
ScriptResource.axd
440 ms
MicrosoftAjaxPolyfillFix.js
439 ms
btLeadsContactForm.js
440 ms
www-player.css
35 ms
www-embed-player.js
199 ms
base.js
235 ms
NewLoginFrame.aspx
443 ms
ad_status.js
250 ms
new-ajax-loader.gif
192 ms
hkwQPN6l4_SNpHVtjw8vAhWItmV3wkCVMuKaKCsfQ0c.js
119 ms
embed.js
70 ms
id
30 ms
KFOmCnqEu92Fr1Mu4mxM.woff
17 ms
KFOlCnqEu92Fr1MmEU9fBBc-.woff
17 ms
KFOmCnqEu92Fr1Mu4mxM.woff
7 ms
midwestdesignhomes.com accessibility score
Contrast
These are opportunities to improve the legibility of your content.
Impact
Issue
Background and foreground colors do not have a sufficient contrast ratio.
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
<frame> or <iframe> elements do not have a title
Image elements do not have [alt] attributes
Links do not have a discernible name
Navigation
These are opportunities to improve keyboard navigation in your application.
Impact
Issue
Heading elements are not in a sequentially-descending order
midwestdesignhomes.com best practices score
Trust and Safety
Impact
Issue
Does not use HTTPS
Ensure CSP is effective against XSS attacks
General
Impact
Issue
Detected JavaScript libraries
Browser errors were logged to the console
Missing source maps for large first-party JavaScript
Issues were logged in the Issues panel in Chrome Devtools
midwestdesignhomes.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
EN
EN
UTF-8
Language claimed in HTML meta tag should match the language actually used on the web page. Otherwise Midwestdesignhomes.com can be misinterpreted by Google and other search engines. Our service has detected that English is used on the page, and it matches the claimed language. Our system also found out that Midwestdesignhomes.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.
midwestdesignhomes.com
Open Graph data is detected on the main page of Midwest Design Homes. This is the best way to make the web page social media friendly. Here is how it looks like on Facebook: