svga-web2
Version:
A SVGA player for modern Web.
1 lines • 219 kB
JavaScript
(function(R,V){typeof exports=="object"&&typeof module<"u"?V(exports):typeof define=="function"&&define.amd?define(["exports"],V):(R=typeof globalThis<"u"?globalThis:R||self,V(R.SVGA={}))})(this,function(exports){"use strict";var P=Object.defineProperty;var K=(R,V,c)=>V in R?P(R,V,{enumerable:!0,configurable:!0,writable:!0,value:c}):R[V]=c;var G=(R,V,c)=>(K(R,typeof V!="symbol"?V+"":V,c),c);class Downloader{constructor(){G(this,"request");this.request=null}get(l){if(!l)throw new Error("download link undefined");return new Promise((t,a)=>{const s=new XMLHttpRequest;s.open("GET",l,!0),s.responseType="arraybuffer",s.onloadend=()=>{s.response&&(s.status===200||s.status===304)?t(s.response):a(s)},s.onerror=()=>a(s.response),s.send(),this.request=s})}cancel(){this.request&&this.request.abort()}destroy(){this.request&&this.request.abort()}}const encodedJs="dmFyIE09T2JqZWN0LmRlZmluZVByb3BlcnR5O3ZhciBMPSh4LGUsaSk9PmUgaW4geD9NKHgsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aX0pOnhbZV09aTt2YXIgaz0oeCxlLGkpPT4oTCh4LHR5cGVvZiBlIT0ic3ltYm9sIj9lKyIiOmUsaSksaSk7KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiOy8qISBwYWtvIDIuMS4wIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrbyBAbGljZW5zZSAoTUlUIEFORCBabGliKSAqL2NvbnN0IFpfRklYRUQkMT00LFpfQklOQVJZPTAsWl9URVhUPTEsWl9VTktOT1dOJDE9MjtmdW5jdGlvbiB6ZXJvJDEoZSl7bGV0IGk9ZS5sZW5ndGg7Zm9yKDstLWk+PTA7KWVbaV09MH1jb25zdCBTVE9SRURfQkxPQ0s9MCxTVEFUSUNfVFJFRVM9MSxEWU5fVFJFRVM9MixNSU5fTUFUQ0gkMT0zLE1BWF9NQVRDSCQxPTI1OCxMRU5HVEhfQ09ERVMkMT0yOSxMSVRFUkFMUyQxPTI1NixMX0NPREVTJDE9TElURVJBTFMkMSsxK0xFTkdUSF9DT0RFUyQxLERfQ09ERVMkMT0zMCxCTF9DT0RFUyQxPTE5LEhFQVBfU0laRSQxPTIqTF9DT0RFUyQxKzEsTUFYX0JJVFMkMT0xNSxCdWZfc2l6ZT0xNixNQVhfQkxfQklUUz03LEVORF9CTE9DSz0yNTYsUkVQXzNfNj0xNixSRVBaXzNfMTA9MTcsUkVQWl8xMV8xMzg9MTgsZXh0cmFfbGJpdHM9bmV3IFVpbnQ4QXJyYXkoWzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMF0pLGV4dHJhX2RiaXRzPW5ldyBVaW50OEFycmF5KFswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzXSksZXh0cmFfYmxiaXRzPW5ldyBVaW50OEFycmF5KFswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3XSksYmxfb3JkZXI9bmV3IFVpbnQ4QXJyYXkoWzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdKSxESVNUX0NPREVfTEVOPTUxMixzdGF0aWNfbHRyZWU9bmV3IEFycmF5KChMX0NPREVTJDErMikqMik7emVybyQxKHN0YXRpY19sdHJlZSk7Y29uc3Qgc3RhdGljX2R0cmVlPW5ldyBBcnJheShEX0NPREVTJDEqMik7emVybyQxKHN0YXRpY19kdHJlZSk7Y29uc3QgX2Rpc3RfY29kZT1uZXcgQXJyYXkoRElTVF9DT0RFX0xFTik7emVybyQxKF9kaXN0X2NvZGUpO2NvbnN0IF9sZW5ndGhfY29kZT1uZXcgQXJyYXkoTUFYX01BVENIJDEtTUlOX01BVENIJDErMSk7emVybyQxKF9sZW5ndGhfY29kZSk7Y29uc3QgYmFzZV9sZW5ndGg9bmV3IEFycmF5KExFTkdUSF9DT0RFUyQxKTt6ZXJvJDEoYmFzZV9sZW5ndGgpO2NvbnN0IGJhc2VfZGlzdD1uZXcgQXJyYXkoRF9DT0RFUyQxKTt6ZXJvJDEoYmFzZV9kaXN0KTtmdW5jdGlvbiBTdGF0aWNUcmVlRGVzYyhlLGksdCxyLGEpe3RoaXMuc3RhdGljX3RyZWU9ZSx0aGlzLmV4dHJhX2JpdHM9aSx0aGlzLmV4dHJhX2Jhc2U9dCx0aGlzLmVsZW1zPXIsdGhpcy5tYXhfbGVuZ3RoPWEsdGhpcy5oYXNfc3RyZWU9ZSYmZS5sZW5ndGh9bGV0IHN0YXRpY19sX2Rlc2Msc3RhdGljX2RfZGVzYyxzdGF0aWNfYmxfZGVzYztmdW5jdGlvbiBUcmVlRGVzYyhlLGkpe3RoaXMuZHluX3RyZWU9ZSx0aGlzLm1heF9jb2RlPTAsdGhpcy5zdGF0X2Rlc2M9aX1jb25zdCBkX2NvZGU9ZT0+ZTwyNTY/X2Rpc3RfY29kZVtlXTpfZGlzdF9jb2RlWzI1NisoZT4+PjcpXSxwdXRfc2hvcnQ9KGUsaSk9PntlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT1pJjI1NSxlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT1pPj4+OCYyNTV9LHNlbmRfYml0cz0oZSxpLHQpPT57ZS5iaV92YWxpZD5CdWZfc2l6ZS10PyhlLmJpX2J1Znw9aTw8ZS5iaV92YWxpZCY2NTUzNSxwdXRfc2hvcnQoZSxlLmJpX2J1ZiksZS5iaV9idWY9aT4+QnVmX3NpemUtZS5iaV92YWxpZCxlLmJpX3ZhbGlkKz10LUJ1Zl9zaXplKTooZS5iaV9idWZ8PWk8PGUuYmlfdmFsaWQmNjU1MzUsZS5iaV92YWxpZCs9dCl9LHNlbmRfY29kZT0oZSxpLHQpPT57c2VuZF9iaXRzKGUsdFtpKjJdLHRbaSoyKzFdKX0sYmlfcmV2ZXJzZT0oZSxpKT0+e2xldCB0PTA7ZG8gdHw9ZSYxLGU+Pj49MSx0PDw9MTt3aGlsZSgtLWk+MCk7cmV0dXJuIHQ+Pj4xfSxiaV9mbHVzaD1lPT57ZS5iaV92YWxpZD09PTE2PyhwdXRfc2hvcnQoZSxlLmJpX2J1ZiksZS5iaV9idWY9MCxlLmJpX3ZhbGlkPTApOmUuYmlfdmFsaWQ+PTgmJihlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT1lLmJpX2J1ZiYyNTUsZS5iaV9idWY+Pj04LGUuYmlfdmFsaWQtPTgpfSxnZW5fYml0bGVuPShlLGkpPT57Y29uc3QgdD1pLmR5bl90cmVlLHI9aS5tYXhfY29kZSxhPWkuc3RhdF9kZXNjLnN0YXRpY190cmVlLG49aS5zdGF0X2Rlc2MuaGFzX3N0cmVlLG89aS5zdGF0X2Rlc2MuZXh0cmFfYml0cyxsPWkuc3RhdF9kZXNjLmV4dHJhX2Jhc2UsZj1pLnN0YXRfZGVzYy5tYXhfbGVuZ3RoO2xldCBzLF8saCx1LGMsZCx3PTA7Zm9yKHU9MDt1PD1NQVhfQklUUyQxO3UrKyllLmJsX2NvdW50W3VdPTA7Zm9yKHRbZS5oZWFwW2UuaGVhcF9tYXhdKjIrMV09MCxzPWUuaGVhcF9tYXgrMTtzPEhFQVBfU0laRSQxO3MrKylfPWUuaGVhcFtzXSx1PXRbdFtfKjIrMV0qMisxXSsxLHU+ZiYmKHU9Zix3KyspLHRbXyoyKzFdPXUsIShfPnIpJiYoZS5ibF9jb3VudFt1XSsrLGM9MCxfPj1sJiYoYz1vW18tbF0pLGQ9dFtfKjJdLGUub3B0X2xlbis9ZCoodStjKSxuJiYoZS5zdGF0aWNfbGVuKz1kKihhW18qMisxXStjKSkpO2lmKHchPT0wKXtkb3tmb3IodT1mLTE7ZS5ibF9jb3VudFt1XT09PTA7KXUtLTtlLmJsX2NvdW50W3VdLS0sZS5ibF9jb3VudFt1KzFdKz0yLGUuYmxfY291bnRbZl0tLSx3LT0yfXdoaWxlKHc+MCk7Zm9yKHU9Zjt1IT09MDt1LS0pZm9yKF89ZS5ibF9jb3VudFt1XTtfIT09MDspaD1lLmhlYXBbLS1zXSwhKGg+cikmJih0W2gqMisxXSE9PXUmJihlLm9wdF9sZW4rPSh1LXRbaCoyKzFdKSp0W2gqMl0sdFtoKjIrMV09dSksXy0tKX19LGdlbl9jb2Rlcz0oZSxpLHQpPT57Y29uc3Qgcj1uZXcgQXJyYXkoTUFYX0JJVFMkMSsxKTtsZXQgYT0wLG4sbztmb3Iobj0xO248PU1BWF9CSVRTJDE7bisrKWE9YSt0W24tMV08PDEscltuXT1hO2ZvcihvPTA7bzw9aTtvKyspe2xldCBsPWVbbyoyKzFdO2whPT0wJiYoZVtvKjJdPWJpX3JldmVyc2UocltsXSsrLGwpKX19LHRyX3N0YXRpY19pbml0PSgpPT57bGV0IGUsaSx0LHIsYTtjb25zdCBuPW5ldyBBcnJheShNQVhfQklUUyQxKzEpO2Zvcih0PTAscj0wO3I8TEVOR1RIX0NPREVTJDEtMTtyKyspZm9yKGJhc2VfbGVuZ3RoW3JdPXQsZT0wO2U8MTw8ZXh0cmFfbGJpdHNbcl07ZSsrKV9sZW5ndGhfY29kZVt0KytdPXI7Zm9yKF9sZW5ndGhfY29kZVt0LTFdPXIsYT0wLHI9MDtyPDE2O3IrKylmb3IoYmFzZV9kaXN0W3JdPWEsZT0wO2U8MTw8ZXh0cmFfZGJpdHNbcl07ZSsrKV9kaXN0X2NvZGVbYSsrXT1yO2ZvcihhPj49NztyPERfQ09ERVMkMTtyKyspZm9yKGJhc2VfZGlzdFtyXT1hPDw3LGU9MDtlPDE8PGV4dHJhX2RiaXRzW3JdLTc7ZSsrKV9kaXN0X2NvZGVbMjU2K2ErK109cjtmb3IoaT0wO2k8PU1BWF9CSVRTJDE7aSsrKW5baV09MDtmb3IoZT0wO2U8PTE0Mzspc3RhdGljX2x0cmVlW2UqMisxXT04LGUrKyxuWzhdKys7Zm9yKDtlPD0yNTU7KXN0YXRpY19sdHJlZVtlKjIrMV09OSxlKyssbls5XSsrO2Zvcig7ZTw9Mjc5OylzdGF0aWNfbHRyZWVbZSoyKzFdPTcsZSsrLG5bN10rKztmb3IoO2U8PTI4Nzspc3RhdGljX2x0cmVlW2UqMisxXT04LGUrKyxuWzhdKys7Zm9yKGdlbl9jb2RlcyhzdGF0aWNfbHRyZWUsTF9DT0RFUyQxKzEsbiksZT0wO2U8RF9DT0RFUyQxO2UrKylzdGF0aWNfZHRyZWVbZSoyKzFdPTUsc3RhdGljX2R0cmVlW2UqMl09YmlfcmV2ZXJzZShlLDUpO3N0YXRpY19sX2Rlc2M9bmV3IFN0YXRpY1RyZWVEZXNjKHN0YXRpY19sdHJlZSxleHRyYV9sYml0cyxMSVRFUkFMUyQxKzEsTF9DT0RFUyQxLE1BWF9CSVRTJDEpLHN0YXRpY19kX2Rlc2M9bmV3IFN0YXRpY1RyZWVEZXNjKHN0YXRpY19kdHJlZSxleHRyYV9kYml0cywwLERfQ09ERVMkMSxNQVhfQklUUyQxKSxzdGF0aWNfYmxfZGVzYz1uZXcgU3RhdGljVHJlZURlc2MobmV3IEFycmF5KDApLGV4dHJhX2JsYml0cywwLEJMX0NPREVTJDEsTUFYX0JMX0JJVFMpfSxpbml0X2Jsb2NrPWU9PntsZXQgaTtmb3IoaT0wO2k8TF9DT0RFUyQxO2krKyllLmR5bl9sdHJlZVtpKjJdPTA7Zm9yKGk9MDtpPERfQ09ERVMkMTtpKyspZS5keW5fZHRyZWVbaSoyXT0wO2ZvcihpPTA7aTxCTF9DT0RFUyQxO2krKyllLmJsX3RyZWVbaSoyXT0wO2UuZHluX2x0cmVlW0VORF9CTE9DSyoyXT0xLGUub3B0X2xlbj1lLnN0YXRpY19sZW49MCxlLnN5bV9uZXh0PWUubWF0Y2hlcz0wfSxiaV93aW5kdXA9ZT0+e2UuYmlfdmFsaWQ+OD9wdXRfc2hvcnQoZSxlLmJpX2J1Zik6ZS5iaV92YWxpZD4wJiYoZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109ZS5iaV9idWYpLGUuYmlfYnVmPTAsZS5iaV92YWxpZD0wfSxzbWFsbGVyPShlLGksdCxyKT0+e2NvbnN0IGE9aSoyLG49dCoyO3JldHVybiBlW2FdPGVbbl18fGVbYV09PT1lW25dJiZyW2ldPD1yW3RdfSxwcWRvd25oZWFwPShlLGksdCk9Pntjb25zdCByPWUuaGVhcFt0XTtsZXQgYT10PDwxO2Zvcig7YTw9ZS5oZWFwX2xlbiYmKGE8ZS5oZWFwX2xlbiYmc21hbGxlcihpLGUuaGVhcFthKzFdLGUuaGVhcFthXSxlLmRlcHRoKSYmYSsrLCFzbWFsbGVyKGkscixlLmhlYXBbYV0sZS5kZXB0aCkpOyllLmhlYXBbdF09ZS5oZWFwW2FdLHQ9YSxhPDw9MTtlLmhlYXBbdF09cn0sY29tcHJlc3NfYmxvY2s9KGUsaSx0KT0+e2xldCByLGEsbj0wLG8sbDtpZihlLnN5bV9uZXh0IT09MClkbyByPWUucGVuZGluZ19idWZbZS5zeW1fYnVmK24rK10mMjU1LHIrPShlLnBlbmRpbmdfYnVmW2Uuc3ltX2J1ZituKytdJjI1NSk8PDgsYT1lLnBlbmRpbmdfYnVmW2Uuc3ltX2J1ZituKytdLHI9PT0wP3NlbmRfY29kZShlLGEsaSk6KG89X2xlbmd0aF9jb2RlW2FdLHNlbmRfY29kZShlLG8rTElURVJBTFMkMSsxLGkpLGw9ZXh0cmFfbGJpdHNbb10sbCE9PTAmJihhLT1iYXNlX2xlbmd0aFtvXSxzZW5kX2JpdHMoZSxhLGwpKSxyLS0sbz1kX2NvZGUociksc2VuZF9jb2RlKGUsbyx0KSxsPWV4dHJhX2RiaXRzW29dLGwhPT0wJiYoci09YmFzZV9kaXN0W29dLHNlbmRfYml0cyhlLHIsbCkpKTt3aGlsZShuPGUuc3ltX25leHQpO3NlbmRfY29kZShlLEVORF9CTE9DSyxpKX0sYnVpbGRfdHJlZT0oZSxpKT0+e2NvbnN0IHQ9aS5keW5fdHJlZSxyPWkuc3RhdF9kZXNjLnN0YXRpY190cmVlLGE9aS5zdGF0X2Rlc2MuaGFzX3N0cmVlLG49aS5zdGF0X2Rlc2MuZWxlbXM7bGV0IG8sbCxmPS0xLHM7Zm9yKGUuaGVhcF9sZW49MCxlLmhlYXBfbWF4PUhFQVBfU0laRSQxLG89MDtvPG47bysrKXRbbyoyXSE9PTA/KGUuaGVhcFsrK2UuaGVhcF9sZW5dPWY9byxlLmRlcHRoW29dPTApOnRbbyoyKzFdPTA7Zm9yKDtlLmhlYXBfbGVuPDI7KXM9ZS5oZWFwWysrZS5oZWFwX2xlbl09ZjwyPysrZjowLHRbcyoyXT0xLGUuZGVwdGhbc109MCxlLm9wdF9sZW4tLSxhJiYoZS5zdGF0aWNfbGVuLT1yW3MqMisxXSk7Zm9yKGkubWF4X2NvZGU9ZixvPWUuaGVhcF9sZW4+PjE7bz49MTtvLS0pcHFkb3duaGVhcChlLHQsbyk7cz1uO2RvIG89ZS5oZWFwWzFdLGUuaGVhcFsxXT1lLmhlYXBbZS5oZWFwX2xlbi0tXSxwcWRvd25oZWFwKGUsdCwxKSxsPWUuaGVhcFsxXSxlLmhlYXBbLS1lLmhlYXBfbWF4XT1vLGUuaGVhcFstLWUuaGVhcF9tYXhdPWwsdFtzKjJdPXRbbyoyXSt0W2wqMl0sZS5kZXB0aFtzXT0oZS5kZXB0aFtvXT49ZS5kZXB0aFtsXT9lLmRlcHRoW29dOmUuZGVwdGhbbF0pKzEsdFtvKjIrMV09dFtsKjIrMV09cyxlLmhlYXBbMV09cysrLHBxZG93bmhlYXAoZSx0LDEpO3doaWxlKGUuaGVhcF9sZW4+PTIpO2UuaGVhcFstLWUuaGVhcF9tYXhdPWUuaGVhcFsxXSxnZW5fYml0bGVuKGUsaSksZ2VuX2NvZGVzKHQsZixlLmJsX2NvdW50KX0sc2Nhbl90cmVlPShlLGksdCk9PntsZXQgcixhPS0xLG4sbz1pWzAqMisxXSxsPTAsZj03LHM9NDtmb3Iobz09PTAmJihmPTEzOCxzPTMpLGlbKHQrMSkqMisxXT02NTUzNSxyPTA7cjw9dDtyKyspbj1vLG89aVsocisxKSoyKzFdLCEoKytsPGYmJm49PT1vKSYmKGw8cz9lLmJsX3RyZWVbbioyXSs9bDpuIT09MD8obiE9PWEmJmUuYmxfdHJlZVtuKjJdKyssZS5ibF90cmVlW1JFUF8zXzYqMl0rKyk6bDw9MTA/ZS5ibF90cmVlW1JFUFpfM18xMCoyXSsrOmUuYmxfdHJlZVtSRVBaXzExXzEzOCoyXSsrLGw9MCxhPW4sbz09PTA/KGY9MTM4LHM9Myk6bj09PW8/KGY9NixzPTMpOihmPTcscz00KSl9LHNlbmRfdHJlZT0oZSxpLHQpPT57bGV0IHIsYT0tMSxuLG89aVswKjIrMV0sbD0wLGY9NyxzPTQ7Zm9yKG89PT0wJiYoZj0xMzgscz0zKSxyPTA7cjw9dDtyKyspaWYobj1vLG89aVsocisxKSoyKzFdLCEoKytsPGYmJm49PT1vKSl7aWYobDxzKWRvIHNlbmRfY29kZShlLG4sZS5ibF90cmVlKTt3aGlsZSgtLWwhPT0wKTtlbHNlIG4hPT0wPyhuIT09YSYmKHNlbmRfY29kZShlLG4sZS5ibF90cmVlKSxsLS0pLHNlbmRfY29kZShlLFJFUF8zXzYsZS5ibF90cmVlKSxzZW5kX2JpdHMoZSxsLTMsMikpOmw8PTEwPyhzZW5kX2NvZGUoZSxSRVBaXzNfMTAsZS5ibF90cmVlKSxzZW5kX2JpdHMoZSxsLTMsMykpOihzZW5kX2NvZGUoZSxSRVBaXzExXzEzOCxlLmJsX3RyZWUpLHNlbmRfYml0cyhlLGwtMTEsNykpO2w9MCxhPW4sbz09PTA/KGY9MTM4LHM9Myk6bj09PW8/KGY9NixzPTMpOihmPTcscz00KX19LGJ1aWxkX2JsX3RyZWU9ZT0+e2xldCBpO2ZvcihzY2FuX3RyZWUoZSxlLmR5bl9sdHJlZSxlLmxfZGVzYy5tYXhfY29kZSksc2Nhbl90cmVlKGUsZS5keW5fZHRyZWUsZS5kX2Rlc2MubWF4X2NvZGUpLGJ1aWxkX3RyZWUoZSxlLmJsX2Rlc2MpLGk9QkxfQ09ERVMkMS0xO2k+PTMmJmUuYmxfdHJlZVtibF9vcmRlcltpXSoyKzFdPT09MDtpLS0pO3JldHVybiBlLm9wdF9sZW4rPTMqKGkrMSkrNSs1KzQsaX0sc2VuZF9hbGxfdHJlZXM9KGUsaSx0LHIpPT57bGV0IGE7Zm9yKHNlbmRfYml0cyhlLGktMjU3LDUpLHNlbmRfYml0cyhlLHQtMSw1KSxzZW5kX2JpdHMoZSxyLTQsNCksYT0wO2E8cjthKyspc2VuZF9iaXRzKGUsZS5ibF90cmVlW2JsX29yZGVyW2FdKjIrMV0sMyk7c2VuZF90cmVlKGUsZS5keW5fbHRyZWUsaS0xKSxzZW5kX3RyZWUoZSxlLmR5bl9kdHJlZSx0LTEpfSxkZXRlY3RfZGF0YV90eXBlPWU9PntsZXQgaT00MDkzNjI0NDQ3LHQ7Zm9yKHQ9MDt0PD0zMTt0KyssaT4+Pj0xKWlmKGkmMSYmZS5keW5fbHRyZWVbdCoyXSE9PTApcmV0dXJuIDA7aWYoZS5keW5fbHRyZWVbOSoyXSE9PTB8fGUuZHluX2x0cmVlWzEwKjJdIT09MHx8ZS5keW5fbHRyZWVbMTMqMl0hPT0wKXJldHVybiAxO2Zvcih0PTMyO3Q8TElURVJBTFMkMTt0KyspaWYoZS5keW5fbHRyZWVbdCoyXSE9PTApcmV0dXJuIDE7cmV0dXJuIDB9O2xldCBzdGF0aWNfaW5pdF9kb25lPSExO2NvbnN0IF90cl9pbml0JDE9ZT0+e3N0YXRpY19pbml0X2RvbmV8fCh0cl9zdGF0aWNfaW5pdCgpLHN0YXRpY19pbml0X2RvbmU9ITApLGUubF9kZXNjPW5ldyBUcmVlRGVzYyhlLmR5bl9sdHJlZSxzdGF0aWNfbF9kZXNjKSxlLmRfZGVzYz1uZXcgVHJlZURlc2MoZS5keW5fZHRyZWUsc3RhdGljX2RfZGVzYyksZS5ibF9kZXNjPW5ldyBUcmVlRGVzYyhlLmJsX3RyZWUsc3RhdGljX2JsX2Rlc2MpLGUuYmlfYnVmPTAsZS5iaV92YWxpZD0wLGluaXRfYmxvY2soZSl9LF90cl9zdG9yZWRfYmxvY2skMT0oZSxpLHQscik9PntzZW5kX2JpdHMoZSwoU1RPUkVEX0JMT0NLPDwxKSsocj8xOjApLDMpLGJpX3dpbmR1cChlKSxwdXRfc2hvcnQoZSx0KSxwdXRfc2hvcnQoZSx+dCksdCYmZS5wZW5kaW5nX2J1Zi5zZXQoZS53aW5kb3cuc3ViYXJyYXkoaSxpK3QpLGUucGVuZGluZyksZS5wZW5kaW5nKz10fSxfdHJfYWxpZ24kMT1lPT57c2VuZF9iaXRzKGUsU1RBVElDX1RSRUVTPDwxLDMpLHNlbmRfY29kZShlLEVORF9CTE9DSyxzdGF0aWNfbHRyZWUpLGJpX2ZsdXNoKGUpfSxfdHJfZmx1c2hfYmxvY2skMT0oZSxpLHQscik9PntsZXQgYSxuLG89MDtlLmxldmVsPjA/KGUuc3RybS5kYXRhX3R5cGU9PT0yJiYoZS5zdHJtLmRhdGFfdHlwZT1kZXRlY3RfZGF0YV90eXBlKGUpKSxidWlsZF90cmVlKGUsZS5sX2Rlc2MpLGJ1aWxkX3RyZWUoZSxlLmRfZGVzYyksbz1idWlsZF9ibF90cmVlKGUpLGE9ZS5vcHRfbGVuKzMrNz4+PjMsbj1lLnN0YXRpY19sZW4rMys3Pj4+MyxuPD1hJiYoYT1uKSk6YT1uPXQrNSx0KzQ8PWEmJmkhPT0tMT9fdHJfc3RvcmVkX2Jsb2NrJDEoZSxpLHQscik6ZS5zdHJhdGVneT09PTR8fG49PT1hPyhzZW5kX2JpdHMoZSwoU1RBVElDX1RSRUVTPDwxKSsocj8xOjApLDMpLGNvbXByZXNzX2Jsb2NrKGUsc3RhdGljX2x0cmVlLHN0YXRpY19kdHJlZSkpOihzZW5kX2JpdHMoZSwoRFlOX1RSRUVTPDwxKSsocj8xOjApLDMpLHNlbmRfYWxsX3RyZWVzKGUsZS5sX2Rlc2MubWF4X2NvZGUrMSxlLmRfZGVzYy5tYXhfY29kZSsxLG8rMSksY29tcHJlc3NfYmxvY2soZSxlLmR5bl9sdHJlZSxlLmR5bl9kdHJlZSkpLGluaXRfYmxvY2soZSksciYmYmlfd2luZHVwKGUpfSxfdHJfdGFsbHkkMT0oZSxpLHQpPT4oZS5wZW5kaW5nX2J1ZltlLnN5bV9idWYrZS5zeW1fbmV4dCsrXT1pLGUucGVuZGluZ19idWZbZS5zeW1fYnVmK2Uuc3ltX25leHQrK109aT4+OCxlLnBlbmRpbmdfYnVmW2Uuc3ltX2J1ZitlLnN5bV9uZXh0KytdPXQsaT09PTA/ZS5keW5fbHRyZWVbdCoyXSsrOihlLm1hdGNoZXMrKyxpLS0sZS5keW5fbHRyZWVbKF9sZW5ndGhfY29kZVt0XStMSVRFUkFMUyQxKzEpKjJdKyssZS5keW5fZHRyZWVbZF9jb2RlKGkpKjJdKyspLGUuc3ltX25leHQ9PT1lLnN5bV9lbmQpO3ZhciBfdHJfaW5pdF8xPV90cl9pbml0JDEsX3RyX3N0b3JlZF9ibG9ja18xPV90cl9zdG9yZWRfYmxvY2skMSxfdHJfZmx1c2hfYmxvY2tfMT1fdHJfZmx1c2hfYmxvY2skMSxfdHJfdGFsbHlfMT1fdHJfdGFsbHkkMSxfdHJfYWxpZ25fMT1fdHJfYWxpZ24kMSx0cmVlcz17X3RyX2luaXQ6X3RyX2luaXRfMSxfdHJfc3RvcmVkX2Jsb2NrOl90cl9zdG9yZWRfYmxvY2tfMSxfdHJfZmx1c2hfYmxvY2s6X3RyX2ZsdXNoX2Jsb2NrXzEsX3RyX3RhbGx5Ol90cl90YWxseV8xLF90cl9hbGlnbjpfdHJfYWxpZ25fMX07Y29uc3QgYWRsZXIzMj0oZSxpLHQscik9PntsZXQgYT1lJjY1NTM1fDAsbj1lPj4+MTYmNjU1MzV8MCxvPTA7Zm9yKDt0IT09MDspe289dD4yZTM/MmUzOnQsdC09bztkbyBhPWEraVtyKytdfDAsbj1uK2F8MDt3aGlsZSgtLW8pO2ElPTY1NTIxLG4lPTY1NTIxfXJldHVybiBhfG48PDE2fDB9O3ZhciBhZGxlcjMyXzE9YWRsZXIzMjtjb25zdCBtYWtlVGFibGU9KCk9PntsZXQgZSxpPVtdO2Zvcih2YXIgdD0wO3Q8MjU2O3QrKyl7ZT10O2Zvcih2YXIgcj0wO3I8ODtyKyspZT1lJjE/Mzk4ODI5MjM4NF5lPj4+MTplPj4+MTtpW3RdPWV9cmV0dXJuIGl9LGNyY1RhYmxlPW5ldyBVaW50MzJBcnJheShtYWtlVGFibGUoKSksY3JjMzI9KGUsaSx0LHIpPT57Y29uc3QgYT1jcmNUYWJsZSxuPXIrdDtlXj0tMTtmb3IobGV0IG89cjtvPG47bysrKWU9ZT4+PjheYVsoZV5pW29dKSYyNTVdO3JldHVybiBlXi0xfTt2YXIgY3JjMzJfMT1jcmMzMixtZXNzYWdlcz17MjoibmVlZCBkaWN0aW9uYXJ5IiwxOiJzdHJlYW0gZW5kIiwwOiIiLCItMSI6ImZpbGUgZXJyb3IiLCItMiI6InN0cmVhbSBlcnJvciIsIi0zIjoiZGF0YSBlcnJvciIsIi00IjoiaW5zdWZmaWNpZW50IG1lbW9yeSIsIi01IjoiYnVmZmVyIGVycm9yIiwiLTYiOiJpbmNvbXBhdGlibGUgdmVyc2lvbiJ9LGNvbnN0YW50cyQyPXtaX05PX0ZMVVNIOjAsWl9QQVJUSUFMX0ZMVVNIOjEsWl9TWU5DX0ZMVVNIOjIsWl9GVUxMX0ZMVVNIOjMsWl9GSU5JU0g6NCxaX0JMT0NLOjUsWl9UUkVFUzo2LFpfT0s6MCxaX1NUUkVBTV9FTkQ6MSxaX05FRURfRElDVDoyLFpfRVJSTk86LTEsWl9TVFJFQU1fRVJST1I6LTIsWl9EQVRBX0VSUk9SOi0zLFpfTUVNX0VSUk9SOi00LFpfQlVGX0VSUk9SOi01LFpfTk9fQ09NUFJFU1NJT046MCxaX0JFU1RfU1BFRUQ6MSxaX0JFU1RfQ09NUFJFU1NJT046OSxaX0RFRkFVTFRfQ09NUFJFU1NJT046LTEsWl9GSUxURVJFRDoxLFpfSFVGRk1BTl9PTkxZOjIsWl9STEU6MyxaX0ZJWEVEOjQsWl9ERUZBVUxUX1NUUkFURUdZOjAsWl9CSU5BUlk6MCxaX1RFWFQ6MSxaX1VOS05PV046MixaX0RFRkxBVEVEOjh9O2NvbnN0e190cl9pbml0LF90cl9zdG9yZWRfYmxvY2ssX3RyX2ZsdXNoX2Jsb2NrLF90cl90YWxseSxfdHJfYWxpZ259PXRyZWVzLHtaX05PX0ZMVVNIOlpfTk9fRkxVU0gkMixaX1BBUlRJQUxfRkxVU0gsWl9GVUxMX0ZMVVNIOlpfRlVMTF9GTFVTSCQxLFpfRklOSVNIOlpfRklOSVNIJDMsWl9CTE9DSzpaX0JMT0NLJDEsWl9PSzpaX09LJDMsWl9TVFJFQU1fRU5EOlpfU1RSRUFNX0VORCQzLFpfU1RSRUFNX0VSUk9SOlpfU1RSRUFNX0VSUk9SJDIsWl9EQVRBX0VSUk9SOlpfREFUQV9FUlJPUiQyLFpfQlVGX0VSUk9SOlpfQlVGX0VSUk9SJDEsWl9ERUZBVUxUX0NPTVBSRVNTSU9OOlpfREVGQVVMVF9DT01QUkVTU0lPTiQxLFpfRklMVEVSRUQsWl9IVUZGTUFOX09OTFksWl9STEUsWl9GSVhFRCxaX0RFRkFVTFRfU1RSQVRFR1k6Wl9ERUZBVUxUX1NUUkFURUdZJDEsWl9VTktOT1dOLFpfREVGTEFURUQ6Wl9ERUZMQVRFRCQyfT1jb25zdGFudHMkMixNQVhfTUVNX0xFVkVMPTksTUFYX1dCSVRTJDE9MTUsREVGX01FTV9MRVZFTD04LExFTkdUSF9DT0RFUz0yOSxMSVRFUkFMUz0yNTYsTF9DT0RFUz1MSVRFUkFMUysxK0xFTkdUSF9DT0RFUyxEX0NPREVTPTMwLEJMX0NPREVTPTE5LEhFQVBfU0laRT0yKkxfQ09ERVMrMSxNQVhfQklUUz0xNSxNSU5fTUFUQ0g9MyxNQVhfTUFUQ0g9MjU4LE1JTl9MT09LQUhFQUQ9TUFYX01BVENIK01JTl9NQVRDSCsxLFBSRVNFVF9ESUNUPTMyLElOSVRfU1RBVEU9NDIsR1pJUF9TVEFURT01NyxFWFRSQV9TVEFURT02OSxOQU1FX1NUQVRFPTczLENPTU1FTlRfU1RBVEU9OTEsSENSQ19TVEFURT0xMDMsQlVTWV9TVEFURT0xMTMsRklOSVNIX1NUQVRFPTY2NixCU19ORUVEX01PUkU9MSxCU19CTE9DS19ET05FPTIsQlNfRklOSVNIX1NUQVJURUQ9MyxCU19GSU5JU0hfRE9ORT00LE9TX0NPREU9MyxlcnI9KGUsaSk9PihlLm1zZz1tZXNzYWdlc1tpXSxpKSxyYW5rPWU9PmUqMi0oZT40Pzk6MCksemVybz1lPT57bGV0IGk9ZS5sZW5ndGg7Zm9yKDstLWk+PTA7KWVbaV09MH0sc2xpZGVfaGFzaD1lPT57bGV0IGksdCxyLGE9ZS53X3NpemU7aT1lLmhhc2hfc2l6ZSxyPWk7ZG8gdD1lLmhlYWRbLS1yXSxlLmhlYWRbcl09dD49YT90LWE6MDt3aGlsZSgtLWkpO2k9YSxyPWk7ZG8gdD1lLnByZXZbLS1yXSxlLnByZXZbcl09dD49YT90LWE6MDt3aGlsZSgtLWkpfTtsZXQgSEFTSF9aTElCPShlLGksdCk9PihpPDxlLmhhc2hfc2hpZnRedCkmZS5oYXNoX21hc2ssSEFTSD1IQVNIX1pMSUI7Y29uc3QgZmx1c2hfcGVuZGluZz1lPT57Y29uc3QgaT1lLnN0YXRlO2xldCB0PWkucGVuZGluZzt0PmUuYXZhaWxfb3V0JiYodD1lLmF2YWlsX291dCksdCE9PTAmJihlLm91dHB1dC5zZXQoaS5wZW5kaW5nX2J1Zi5zdWJhcnJheShpLnBlbmRpbmdfb3V0LGkucGVuZGluZ19vdXQrdCksZS5uZXh0X291dCksZS5uZXh0X291dCs9dCxpLnBlbmRpbmdfb3V0Kz10LGUudG90YWxfb3V0Kz10LGUuYXZhaWxfb3V0LT10LGkucGVuZGluZy09dCxpLnBlbmRpbmc9PT0wJiYoaS5wZW5kaW5nX291dD0wKSl9LGZsdXNoX2Jsb2NrX29ubHk9KGUsaSk9PntfdHJfZmx1c2hfYmxvY2soZSxlLmJsb2NrX3N0YXJ0Pj0wP2UuYmxvY2tfc3RhcnQ6LTEsZS5zdHJzdGFydC1lLmJsb2NrX3N0YXJ0LGkpLGUuYmxvY2tfc3RhcnQ9ZS5zdHJzdGFydCxmbHVzaF9wZW5kaW5nKGUuc3RybSl9LHB1dF9ieXRlPShlLGkpPT57ZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109aX0scHV0U2hvcnRNU0I9KGUsaSk9PntlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT1pPj4+OCYyNTUsZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109aSYyNTV9LHJlYWRfYnVmPShlLGksdCxyKT0+e2xldCBhPWUuYXZhaWxfaW47cmV0dXJuIGE+ciYmKGE9ciksYT09PTA/MDooZS5hdmFpbF9pbi09YSxpLnNldChlLmlucHV0LnN1YmFycmF5KGUubmV4dF9pbixlLm5leHRfaW4rYSksdCksZS5zdGF0ZS53cmFwPT09MT9lLmFkbGVyPWFkbGVyMzJfMShlLmFkbGVyLGksYSx0KTplLnN0YXRlLndyYXA9PT0yJiYoZS5hZGxlcj1jcmMzMl8xKGUuYWRsZXIsaSxhLHQpKSxlLm5leHRfaW4rPWEsZS50b3RhbF9pbis9YSxhKX0sbG9uZ2VzdF9tYXRjaD0oZSxpKT0+e2xldCB0PWUubWF4X2NoYWluX2xlbmd0aCxyPWUuc3Ryc3RhcnQsYSxuLG89ZS5wcmV2X2xlbmd0aCxsPWUubmljZV9tYXRjaDtjb25zdCBmPWUuc3Ryc3RhcnQ+ZS53X3NpemUtTUlOX0xPT0tBSEVBRD9lLnN0cnN0YXJ0LShlLndfc2l6ZS1NSU5fTE9PS0FIRUFEKTowLHM9ZS53aW5kb3csXz1lLndfbWFzayxoPWUucHJldix1PWUuc3Ryc3RhcnQrTUFYX01BVENIO2xldCBjPXNbcitvLTFdLGQ9c1tyK29dO2UucHJldl9sZW5ndGg+PWUuZ29vZF9tYXRjaCYmKHQ+Pj0yKSxsPmUubG9va2FoZWFkJiYobD1lLmxvb2thaGVhZCk7ZG8gaWYoYT1pLCEoc1thK29dIT09ZHx8c1thK28tMV0hPT1jfHxzW2FdIT09c1tyXXx8c1srK2FdIT09c1tyKzFdKSl7cis9MixhKys7ZG87d2hpbGUoc1srK3JdPT09c1srK2FdJiZzWysrcl09PT1zWysrYV0mJnNbKytyXT09PXNbKythXSYmc1srK3JdPT09c1srK2FdJiZzWysrcl09PT1zWysrYV0mJnNbKytyXT09PXNbKythXSYmc1srK3JdPT09c1srK2FdJiZzWysrcl09PT1zWysrYV0mJnI8dSk7aWYobj1NQVhfTUFUQ0gtKHUtcikscj11LU1BWF9NQVRDSCxuPm8pe2lmKGUubWF0Y2hfc3RhcnQ9aSxvPW4sbj49bClicmVhaztjPXNbcitvLTFdLGQ9c1tyK29dfX13aGlsZSgoaT1oW2kmX10pPmYmJi0tdCE9PTApO3JldHVybiBvPD1lLmxvb2thaGVhZD9vOmUubG9va2FoZWFkfSxmaWxsX3dpbmRvdz1lPT57Y29uc3QgaT1lLndfc2l6ZTtsZXQgdCxyLGE7ZG97aWYocj1lLndpbmRvd19zaXplLWUubG9va2FoZWFkLWUuc3Ryc3RhcnQsZS5zdHJzdGFydD49aSsoaS1NSU5fTE9PS0FIRUFEKSYmKGUud2luZG93LnNldChlLndpbmRvdy5zdWJhcnJheShpLGkraS1yKSwwKSxlLm1hdGNoX3N0YXJ0LT1pLGUuc3Ryc3RhcnQtPWksZS5ibG9ja19zdGFydC09aSxlLmluc2VydD5lLnN0cnN0YXJ0JiYoZS5pbnNlcnQ9ZS5zdHJzdGFydCksc2xpZGVfaGFzaChlKSxyKz1pKSxlLnN0cm0uYXZhaWxfaW49PT0wKWJyZWFrO2lmKHQ9cmVhZF9idWYoZS5zdHJtLGUud2luZG93LGUuc3Ryc3RhcnQrZS5sb29rYWhlYWQsciksZS5sb29rYWhlYWQrPXQsZS5sb29rYWhlYWQrZS5pbnNlcnQ+PU1JTl9NQVRDSClmb3IoYT1lLnN0cnN0YXJ0LWUuaW5zZXJ0LGUuaW5zX2g9ZS53aW5kb3dbYV0sZS5pbnNfaD1IQVNIKGUsZS5pbnNfaCxlLndpbmRvd1thKzFdKTtlLmluc2VydCYmKGUuaW5zX2g9SEFTSChlLGUuaW5zX2gsZS53aW5kb3dbYStNSU5fTUFUQ0gtMV0pLGUucHJldlthJmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWEsYSsrLGUuaW5zZXJ0LS0sIShlLmxvb2thaGVhZCtlLmluc2VydDxNSU5fTUFUQ0gpKTspO313aGlsZShlLmxvb2thaGVhZDxNSU5fTE9PS0FIRUFEJiZlLnN0cm0uYXZhaWxfaW4hPT0wKX0sZGVmbGF0ZV9zdG9yZWQ9KGUsaSk9PntsZXQgdD1lLnBlbmRpbmdfYnVmX3NpemUtNT5lLndfc2l6ZT9lLndfc2l6ZTplLnBlbmRpbmdfYnVmX3NpemUtNSxyLGEsbixvPTAsbD1lLnN0cm0uYXZhaWxfaW47ZG97aWYocj02NTUzNSxuPWUuYmlfdmFsaWQrNDI+PjMsZS5zdHJtLmF2YWlsX291dDxufHwobj1lLnN0cm0uYXZhaWxfb3V0LW4sYT1lLnN0cnN0YXJ0LWUuYmxvY2tfc3RhcnQscj5hK2Uuc3RybS5hdmFpbF9pbiYmKHI9YStlLnN0cm0uYXZhaWxfaW4pLHI+biYmKHI9bikscjx0JiYocj09PTAmJmkhPT1aX0ZJTklTSCQzfHxpPT09Wl9OT19GTFVTSCQyfHxyIT09YStlLnN0cm0uYXZhaWxfaW4pKSlicmVhaztvPWk9PT1aX0ZJTklTSCQzJiZyPT09YStlLnN0cm0uYXZhaWxfaW4/MTowLF90cl9zdG9yZWRfYmxvY2soZSwwLDAsbyksZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmctNF09cixlLnBlbmRpbmdfYnVmW2UucGVuZGluZy0zXT1yPj44LGUucGVuZGluZ19idWZbZS5wZW5kaW5nLTJdPX5yLGUucGVuZGluZ19idWZbZS5wZW5kaW5nLTFdPX5yPj44LGZsdXNoX3BlbmRpbmcoZS5zdHJtKSxhJiYoYT5yJiYoYT1yKSxlLnN0cm0ub3V0cHV0LnNldChlLndpbmRvdy5zdWJhcnJheShlLmJsb2NrX3N0YXJ0LGUuYmxvY2tfc3RhcnQrYSksZS5zdHJtLm5leHRfb3V0KSxlLnN0cm0ubmV4dF9vdXQrPWEsZS5zdHJtLmF2YWlsX291dC09YSxlLnN0cm0udG90YWxfb3V0Kz1hLGUuYmxvY2tfc3RhcnQrPWEsci09YSksciYmKHJlYWRfYnVmKGUuc3RybSxlLnN0cm0ub3V0cHV0LGUuc3RybS5uZXh0X291dCxyKSxlLnN0cm0ubmV4dF9vdXQrPXIsZS5zdHJtLmF2YWlsX291dC09cixlLnN0cm0udG90YWxfb3V0Kz1yKX13aGlsZShvPT09MCk7cmV0dXJuIGwtPWUuc3RybS5hdmFpbF9pbixsJiYobD49ZS53X3NpemU/KGUubWF0Y2hlcz0yLGUud2luZG93LnNldChlLnN0cm0uaW5wdXQuc3ViYXJyYXkoZS5zdHJtLm5leHRfaW4tZS53X3NpemUsZS5zdHJtLm5leHRfaW4pLDApLGUuc3Ryc3RhcnQ9ZS53X3NpemUsZS5pbnNlcnQ9ZS5zdHJzdGFydCk6KGUud2luZG93X3NpemUtZS5zdHJzdGFydDw9bCYmKGUuc3Ryc3RhcnQtPWUud19zaXplLGUud2luZG93LnNldChlLndpbmRvdy5zdWJhcnJheShlLndfc2l6ZSxlLndfc2l6ZStlLnN0cnN0YXJ0KSwwKSxlLm1hdGNoZXM8MiYmZS5tYXRjaGVzKyssZS5pbnNlcnQ+ZS5zdHJzdGFydCYmKGUuaW5zZXJ0PWUuc3Ryc3RhcnQpKSxlLndpbmRvdy5zZXQoZS5zdHJtLmlucHV0LnN1YmFycmF5KGUuc3RybS5uZXh0X2luLWwsZS5zdHJtLm5leHRfaW4pLGUuc3Ryc3RhcnQpLGUuc3Ryc3RhcnQrPWwsZS5pbnNlcnQrPWw+ZS53X3NpemUtZS5pbnNlcnQ/ZS53X3NpemUtZS5pbnNlcnQ6bCksZS5ibG9ja19zdGFydD1lLnN0cnN0YXJ0KSxlLmhpZ2hfd2F0ZXI8ZS5zdHJzdGFydCYmKGUuaGlnaF93YXRlcj1lLnN0cnN0YXJ0KSxvP0JTX0ZJTklTSF9ET05FOmkhPT1aX05PX0ZMVVNIJDImJmkhPT1aX0ZJTklTSCQzJiZlLnN0cm0uYXZhaWxfaW49PT0wJiZlLnN0cnN0YXJ0PT09ZS5ibG9ja19zdGFydD9CU19CTE9DS19ET05FOihuPWUud2luZG93X3NpemUtZS5zdHJzdGFydCxlLnN0cm0uYXZhaWxfaW4+biYmZS5ibG9ja19zdGFydD49ZS53X3NpemUmJihlLmJsb2NrX3N0YXJ0LT1lLndfc2l6ZSxlLnN0cnN0YXJ0LT1lLndfc2l6ZSxlLndpbmRvdy5zZXQoZS53aW5kb3cuc3ViYXJyYXkoZS53X3NpemUsZS53X3NpemUrZS5zdHJzdGFydCksMCksZS5tYXRjaGVzPDImJmUubWF0Y2hlcysrLG4rPWUud19zaXplLGUuaW5zZXJ0PmUuc3Ryc3RhcnQmJihlLmluc2VydD1lLnN0cnN0YXJ0KSksbj5lLnN0cm0uYXZhaWxfaW4mJihuPWUuc3RybS5hdmFpbF9pbiksbiYmKHJlYWRfYnVmKGUuc3RybSxlLndpbmRvdyxlLnN0cnN0YXJ0LG4pLGUuc3Ryc3RhcnQrPW4sZS5pbnNlcnQrPW4+ZS53X3NpemUtZS5pbnNlcnQ/ZS53X3NpemUtZS5pbnNlcnQ6biksZS5oaWdoX3dhdGVyPGUuc3Ryc3RhcnQmJihlLmhpZ2hfd2F0ZXI9ZS5zdHJzdGFydCksbj1lLmJpX3ZhbGlkKzQyPj4zLG49ZS5wZW5kaW5nX2J1Zl9zaXplLW4+NjU1MzU/NjU1MzU6ZS5wZW5kaW5nX2J1Zl9zaXplLW4sdD1uPmUud19zaXplP2Uud19zaXplOm4sYT1lLnN0cnN0YXJ0LWUuYmxvY2tfc3RhcnQsKGE+PXR8fChhfHxpPT09Wl9GSU5JU0gkMykmJmkhPT1aX05PX0ZMVVNIJDImJmUuc3RybS5hdmFpbF9pbj09PTAmJmE8PW4pJiYocj1hPm4/bjphLG89aT09PVpfRklOSVNIJDMmJmUuc3RybS5hdmFpbF9pbj09PTAmJnI9PT1hPzE6MCxfdHJfc3RvcmVkX2Jsb2NrKGUsZS5ibG9ja19zdGFydCxyLG8pLGUuYmxvY2tfc3RhcnQrPXIsZmx1c2hfcGVuZGluZyhlLnN0cm0pKSxvP0JTX0ZJTklTSF9TVEFSVEVEOkJTX05FRURfTU9SRSl9LGRlZmxhdGVfZmFzdD0oZSxpKT0+e2xldCB0LHI7Zm9yKDs7KXtpZihlLmxvb2thaGVhZDxNSU5fTE9PS0FIRUFEKXtpZihmaWxsX3dpbmRvdyhlKSxlLmxvb2thaGVhZDxNSU5fTE9PS0FIRUFEJiZpPT09Wl9OT19GTFVTSCQyKXJldHVybiBCU19ORUVEX01PUkU7aWYoZS5sb29rYWhlYWQ9PT0wKWJyZWFrfWlmKHQ9MCxlLmxvb2thaGVhZD49TUlOX01BVENIJiYoZS5pbnNfaD1IQVNIKGUsZS5pbnNfaCxlLndpbmRvd1tlLnN0cnN0YXJ0K01JTl9NQVRDSC0xXSksdD1lLnByZXZbZS5zdHJzdGFydCZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1lLnN0cnN0YXJ0KSx0IT09MCYmZS5zdHJzdGFydC10PD1lLndfc2l6ZS1NSU5fTE9PS0FIRUFEJiYoZS5tYXRjaF9sZW5ndGg9bG9uZ2VzdF9tYXRjaChlLHQpKSxlLm1hdGNoX2xlbmd0aD49TUlOX01BVENIKWlmKHI9X3RyX3RhbGx5KGUsZS5zdHJzdGFydC1lLm1hdGNoX3N0YXJ0LGUubWF0Y2hfbGVuZ3RoLU1JTl9NQVRDSCksZS5sb29rYWhlYWQtPWUubWF0Y2hfbGVuZ3RoLGUubWF0Y2hfbGVuZ3RoPD1lLm1heF9sYXp5X21hdGNoJiZlLmxvb2thaGVhZD49TUlOX01BVENIKXtlLm1hdGNoX2xlbmd0aC0tO2RvIGUuc3Ryc3RhcnQrKyxlLmluc19oPUhBU0goZSxlLmluc19oLGUud2luZG93W2Uuc3Ryc3RhcnQrTUlOX01BVENILTFdKSx0PWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQ7d2hpbGUoLS1lLm1hdGNoX2xlbmd0aCE9PTApO2Uuc3Ryc3RhcnQrK31lbHNlIGUuc3Ryc3RhcnQrPWUubWF0Y2hfbGVuZ3RoLGUubWF0Y2hfbGVuZ3RoPTAsZS5pbnNfaD1lLndpbmRvd1tlLnN0cnN0YXJ0XSxlLmluc19oPUhBU0goZSxlLmluc19oLGUud2luZG93W2Uuc3Ryc3RhcnQrMV0pO2Vsc2Ugcj1fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnRdKSxlLmxvb2thaGVhZC0tLGUuc3Ryc3RhcnQrKztpZihyJiYoZmx1c2hfYmxvY2tfb25seShlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCkpcmV0dXJuIEJTX05FRURfTU9SRX1yZXR1cm4gZS5pbnNlcnQ9ZS5zdHJzdGFydDxNSU5fTUFUQ0gtMT9lLnN0cnN0YXJ0Ok1JTl9NQVRDSC0xLGk9PT1aX0ZJTklTSCQzPyhmbHVzaF9ibG9ja19vbmx5KGUsITApLGUuc3RybS5hdmFpbF9vdXQ9PT0wP0JTX0ZJTklTSF9TVEFSVEVEOkJTX0ZJTklTSF9ET05FKTplLnN5bV9uZXh0JiYoZmx1c2hfYmxvY2tfb25seShlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCk/QlNfTkVFRF9NT1JFOkJTX0JMT0NLX0RPTkV9LGRlZmxhdGVfc2xvdz0oZSxpKT0+e2xldCB0LHIsYTtmb3IoOzspe2lmKGUubG9va2FoZWFkPE1JTl9MT09LQUhFQUQpe2lmKGZpbGxfd2luZG93KGUpLGUubG9va2FoZWFkPE1JTl9MT09LQUhFQUQmJmk9PT1aX05PX0ZMVVNIJDIpcmV0dXJuIEJTX05FRURfTU9SRTtpZihlLmxvb2thaGVhZD09PTApYnJlYWt9aWYodD0wLGUubG9va2FoZWFkPj1NSU5fTUFUQ0gmJihlLmluc19oPUhBU0goZSxlLmluc19oLGUud2luZG93W2Uuc3Ryc3RhcnQrTUlOX01BVENILTFdKSx0PWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpLGUucHJldl9sZW5ndGg9ZS5tYXRjaF9sZW5ndGgsZS5wcmV2X21hdGNoPWUubWF0Y2hfc3RhcnQsZS5tYXRjaF9sZW5ndGg9TUlOX01BVENILTEsdCE9PTAmJmUucHJldl9sZW5ndGg8ZS5tYXhfbGF6eV9tYXRjaCYmZS5zdHJzdGFydC10PD1lLndfc2l6ZS1NSU5fTE9PS0FIRUFEJiYoZS5tYXRjaF9sZW5ndGg9bG9uZ2VzdF9tYXRjaChlLHQpLGUubWF0Y2hfbGVuZ3RoPD01JiYoZS5zdHJhdGVneT09PVpfRklMVEVSRUR8fGUubWF0Y2hfbGVuZ3RoPT09TUlOX01BVENIJiZlLnN0cnN0YXJ0LWUubWF0Y2hfc3RhcnQ+NDA5NikmJihlLm1hdGNoX2xlbmd0aD1NSU5fTUFUQ0gtMSkpLGUucHJldl9sZW5ndGg+PU1JTl9NQVRDSCYmZS5tYXRjaF9sZW5ndGg8PWUucHJldl9sZW5ndGgpe2E9ZS5zdHJzdGFydCtlLmxvb2thaGVhZC1NSU5fTUFUQ0gscj1fdHJfdGFsbHkoZSxlLnN0cnN0YXJ0LTEtZS5wcmV2X21hdGNoLGUucHJldl9sZW5ndGgtTUlOX01BVENIKSxlLmxvb2thaGVhZC09ZS5wcmV2X2xlbmd0aC0xLGUucHJldl9sZW5ndGgtPTI7ZG8rK2Uuc3Ryc3RhcnQ8PWEmJihlLmluc19oPUhBU0goZSxlLmluc19oLGUud2luZG93W2Uuc3Ryc3RhcnQrTUlOX01BVENILTFdKSx0PWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpO3doaWxlKC0tZS5wcmV2X2xlbmd0aCE9PTApO2lmKGUubWF0Y2hfYXZhaWxhYmxlPTAsZS5tYXRjaF9sZW5ndGg9TUlOX01BVENILTEsZS5zdHJzdGFydCsrLHImJihmbHVzaF9ibG9ja19vbmx5KGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gQlNfTkVFRF9NT1JFfWVsc2UgaWYoZS5tYXRjaF9hdmFpbGFibGUpe2lmKHI9X3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0LTFdKSxyJiZmbHVzaF9ibG9ja19vbmx5KGUsITEpLGUuc3Ryc3RhcnQrKyxlLmxvb2thaGVhZC0tLGUuc3RybS5hdmFpbF9vdXQ9PT0wKXJldHVybiBCU19ORUVEX01PUkV9ZWxzZSBlLm1hdGNoX2F2YWlsYWJsZT0xLGUuc3Ryc3RhcnQrKyxlLmxvb2thaGVhZC0tfXJldHVybiBlLm1hdGNoX2F2YWlsYWJsZSYmKHI9X3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0LTFdKSxlLm1hdGNoX2F2YWlsYWJsZT0wKSxlLmluc2VydD1lLnN0cnN0YXJ0PE1JTl9NQVRDSC0xP2Uuc3Ryc3RhcnQ6TUlOX01BVENILTEsaT09PVpfRklOSVNIJDM/KGZsdXNoX2Jsb2NrX29ubHkoZSwhMCksZS5zdHJtLmF2YWlsX291dD09PTA/QlNfRklOSVNIX1NUQVJURUQ6QlNfRklOSVNIX0RPTkUpOmUuc3ltX25leHQmJihmbHVzaF9ibG9ja19vbmx5KGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKT9CU19ORUVEX01PUkU6QlNfQkxPQ0tfRE9ORX0sZGVmbGF0ZV9ybGU9KGUsaSk9PntsZXQgdCxyLGEsbjtjb25zdCBvPWUud2luZG93O2Zvcig7Oyl7aWYoZS5sb29rYWhlYWQ8PU1BWF9NQVRDSCl7aWYoZmlsbF93aW5kb3coZSksZS5sb29rYWhlYWQ8PU1BWF9NQVRDSCYmaT09PVpfTk9fRkxVU0gkMilyZXR1cm4gQlNfTkVFRF9NT1JFO2lmKGUubG9va2FoZWFkPT09MClicmVha31pZihlLm1hdGNoX2xlbmd0aD0wLGUubG9va2FoZWFkPj1NSU5fTUFUQ0gmJmUuc3Ryc3RhcnQ+MCYmKGE9ZS5zdHJzdGFydC0xLHI9b1thXSxyPT09b1srK2FdJiZyPT09b1srK2FdJiZyPT09b1srK2FdKSl7bj1lLnN0cnN0YXJ0K01BWF9NQVRDSDtkbzt3aGlsZShyPT09b1srK2FdJiZyPT09b1srK2FdJiZyPT09b1srK2FdJiZyPT09b1srK2FdJiZyPT09b1srK2FdJiZyPT09b1srK2FdJiZyPT09b1srK2FdJiZyPT09b1srK2FdJiZhPG4pO2UubWF0Y2hfbGVuZ3RoPU1BWF9NQVRDSC0obi1hKSxlLm1hdGNoX2xlbmd0aD5lLmxvb2thaGVhZCYmKGUubWF0Y2hfbGVuZ3RoPWUubG9va2FoZWFkKX1pZihlLm1hdGNoX2xlbmd0aD49TUlOX01BVENIPyh0PV90cl90YWxseShlLDEsZS5tYXRjaF9sZW5ndGgtTUlOX01BVENIKSxlLmxvb2thaGVhZC09ZS5tYXRjaF9sZW5ndGgsZS5zdHJzdGFydCs9ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg9MCk6KHQ9X3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0XSksZS5sb29rYWhlYWQtLSxlLnN0cnN0YXJ0KyspLHQmJihmbHVzaF9ibG9ja19vbmx5KGUsITEpLGUuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gQlNfTkVFRF9NT1JFfXJldHVybiBlLmluc2VydD0wLGk9PT1aX0ZJTklTSCQzPyhmbHVzaF9ibG9ja19vbmx5KGUsITApLGUuc3RybS5hdmFpbF9vdXQ9PT0wP0JTX0ZJTklTSF9TVEFSVEVEOkJTX0ZJTklTSF9ET05FKTplLnN5bV9uZXh0JiYoZmx1c2hfYmxvY2tfb25seShlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCk/QlNfTkVFRF9NT1JFOkJTX0JMT0NLX0RPTkV9LGRlZmxhdGVfaHVmZj0oZSxpKT0+e2xldCB0O2Zvcig7Oyl7aWYoZS5sb29rYWhlYWQ9PT0wJiYoZmlsbF93aW5kb3coZSksZS5sb29rYWhlYWQ9PT0wKSl7aWYoaT09PVpfTk9fRkxVU0gkMilyZXR1cm4gQlNfTkVFRF9NT1JFO2JyZWFrfWlmKGUubWF0Y2hfbGVuZ3RoPTAsdD1fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnRdKSxlLmxvb2thaGVhZC0tLGUuc3Ryc3RhcnQrKyx0JiYoZmx1c2hfYmxvY2tfb25seShlLCExKSxlLnN0cm0uYXZhaWxfb3V0PT09MCkpcmV0dXJuIEJTX05FRURfTU9SRX1yZXR1cm4gZS5pbnNlcnQ9MCxpPT09Wl9GSU5JU0gkMz8oZmx1c2hfYmxvY2tfb25seShlLCEwKSxlLnN0cm0uYXZhaWxfb3V0PT09MD9CU19GSU5JU0hfU1RBUlRFRDpCU19GSU5JU0hfRE9ORSk6ZS5zeW1fbmV4dCYmKGZsdXNoX2Jsb2NrX29ubHkoZSwhMSksZS5zdHJtLmF2YWlsX291dD09PTApP0JTX05FRURfTU9SRTpCU19CTE9DS19ET05FfTtmdW5jdGlvbiBDb25maWcoZSxpLHQscixhKXt0aGlzLmdvb2RfbGVuZ3RoPWUsdGhpcy5tYXhfbGF6eT1pLHRoaXMubmljZV9sZW5ndGg9dCx0aGlzLm1heF9jaGFpbj1yLHRoaXMuZnVuYz1hfWNvbnN0IGNvbmZpZ3VyYXRpb25fdGFibGU9W25ldyBDb25maWcoMCwwLDAsMCxkZWZsYXRlX3N0b3JlZCksbmV3IENvbmZpZyg0LDQsOCw0LGRlZmxhdGVfZmFzdCksbmV3IENvbmZpZyg0LDUsMTYsOCxkZWZsYXRlX2Zhc3QpLG5ldyBDb25maWcoNCw2LDMyLDMyLGRlZmxhdGVfZmFzdCksbmV3IENvbmZpZyg0LDQsMTYsMTYsZGVmbGF0ZV9zbG93KSxuZXcgQ29uZmlnKDgsMTYsMzIsMzIsZGVmbGF0ZV9zbG93KSxuZXcgQ29uZmlnKDgsMTYsMTI4LDEyOCxkZWZsYXRlX3Nsb3cpLG5ldyBDb25maWcoOCwzMiwxMjgsMjU2LGRlZmxhdGVfc2xvdyksbmV3IENvbmZpZygzMiwxMjgsMjU4LDEwMjQsZGVmbGF0ZV9zbG93KSxuZXcgQ29uZmlnKDMyLDI1OCwyNTgsNDA5NixkZWZsYXRlX3Nsb3cpXSxsbV9pbml0PWU9PntlLndpbmRvd19zaXplPTIqZS53X3NpemUsemVybyhlLmhlYWQpLGUubWF4X2xhenlfbWF0Y2g9Y29uZmlndXJhdGlvbl90YWJsZVtlLmxldmVsXS5tYXhfbGF6eSxlLmdvb2RfbWF0Y2g9Y29uZmlndXJhdGlvbl90YWJsZVtlLmxldmVsXS5nb29kX2xlbmd0aCxlLm5pY2VfbWF0Y2g9Y29uZmlndXJhdGlvbl90YWJsZVtlLmxldmVsXS5uaWNlX2xlbmd0aCxlLm1heF9jaGFpbl9sZW5ndGg9Y29uZmlndXJhdGlvbl90YWJsZVtlLmxldmVsXS5tYXhfY2hhaW4sZS5zdHJzdGFydD0wLGUuYmxvY2tfc3RhcnQ9MCxlLmxvb2thaGVhZD0wLGUuaW5zZXJ0PTAsZS5tYXRjaF9sZW5ndGg9ZS5wcmV2X2xlbmd0aD1NSU5fTUFUQ0gtMSxlLm1hdGNoX2F2YWlsYWJsZT0wLGUuaW5zX2g9MH07ZnVuY3Rpb24gRGVmbGF0ZVN0YXRlKCl7dGhpcy5zdHJtPW51bGwsdGhpcy5zdGF0dXM9MCx0aGlzLnBlbmRpbmdfYnVmPW51bGwsdGhpcy5wZW5kaW5nX2J1Zl9zaXplPTAsdGhpcy5wZW5kaW5nX291dD0wLHRoaXMucGVuZGluZz0wLHRoaXMud3JhcD0wLHRoaXMuZ3poZWFkPW51bGwsdGhpcy5nemluZGV4PTAsdGhpcy5tZXRob2Q9Wl9ERUZMQVRFRCQyLHRoaXMubGFzdF9mbHVzaD0tMSx0aGlzLndfc2l6ZT0wLHRoaXMud19iaXRzPTAsdGhpcy53X21hc2s9MCx0aGlzLndpbmRvdz1udWxsLHRoaXMud2luZG93X3NpemU9MCx0aGlzLnByZXY9bnVsbCx0aGlzLmhlYWQ9bnVsbCx0aGlzLmluc19oPTAsdGhpcy5oYXNoX3NpemU9MCx0aGlzLmhhc2hfYml0cz0wLHRoaXMuaGFzaF9tYXNrPTAsdGhpcy5oYXNoX3NoaWZ0PTAsdGhpcy5ibG9ja19zdGFydD0wLHRoaXMubWF0Y2hfbGVuZ3RoPTAsdGhpcy5wcmV2X21hdGNoPTAsdGhpcy5tYXRjaF9hdmFpbGFibGU9MCx0aGlzLnN0cnN0YXJ0PTAsdGhpcy5tYXRjaF9zdGFydD0wLHRoaXMubG9va2FoZWFkPTAsdGhpcy5wcmV2X2xlbmd0aD0wLHRoaXMubWF4X2NoYWluX2xlbmd0aD0wLHRoaXMubWF4X2xhenlfbWF0Y2g9MCx0aGlzLmxldmVsPTAsdGhpcy5zdHJhdGVneT0wLHRoaXMuZ29vZF9tYXRjaD0wLHRoaXMubmljZV9tYXRjaD0wLHRoaXMuZHluX2x0cmVlPW5ldyBVaW50MTZBcnJheShIRUFQX1NJWkUqMiksdGhpcy5keW5fZHRyZWU9bmV3IFVpbnQxNkFycmF5KCgyKkRfQ09ERVMrMSkqMiksdGhpcy5ibF90cmVlPW5ldyBVaW50MTZBcnJheSgoMipCTF9DT0RFUysxKSoyKSx6ZXJvKHRoaXMuZHluX2x0cmVlKSx6ZXJvKHRoaXMuZHluX2R0cmVlKSx6ZXJvKHRoaXMuYmxfdHJlZSksdGhpcy5sX2Rlc2M9bnVsbCx0aGlzLmRfZGVzYz1udWxsLHRoaXMuYmxfZGVzYz1udWxsLHRoaXMuYmxfY291bnQ9bmV3IFVpbnQxNkFycmF5KE1BWF9CSVRTKzEpLHRoaXMuaGVhcD1uZXcgVWludDE2QXJyYXkoMipMX0NPREVTKzEpLHplcm8odGhpcy5oZWFwKSx0aGlzLmhlYXBfbGVuPTAsdGhpcy5oZWFwX21heD0wLHRoaXMuZGVwdGg9bmV3IFVpbnQxNkFycmF5KDIqTF9DT0RFUysxKSx6ZXJvKHRoaXMuZGVwdGgpLHRoaXMuc3ltX2J1Zj0wLHRoaXMubGl0X2J1ZnNpemU9MCx0aGlzLnN5bV9uZXh0PTAsdGhpcy5zeW1fZW5kPTAsdGhpcy5vcHRfbGVuPTAsdGhpcy5zdGF0aWNfbGVuPTAsdGhpcy5tYXRjaGVzPTAsdGhpcy5pbnNlcnQ9MCx0aGlzLmJpX2J1Zj0wLHRoaXMuYmlfdmFsaWQ9MH1jb25zdCBkZWZsYXRlU3RhdGVDaGVjaz1lPT57aWYoIWUpcmV0dXJuIDE7Y29uc3QgaT1lLnN0YXRlO3JldHVybiFpfHxpLnN0cm0hPT1lfHxpLnN0YXR1cyE9PUlOSVRfU1RBVEUmJmkuc3RhdHVzIT09R1pJUF9TVEFURSYmaS5zdGF0dXMhPT1FWFRSQV9TVEFURSYmaS5zdGF0dXMhPT1OQU1FX1NUQVRFJiZpLnN0YXR1cyE9PUNPTU1FTlRfU1RBVEUmJmkuc3RhdHVzIT09SENSQ19TVEFURSYmaS5zdGF0dXMhPT1CVVNZX1NUQVRFJiZpLnN0YXR1cyE9PUZJTklTSF9TVEFURT8xOjB9LGRlZmxhdGVSZXNldEtlZXA9ZT0+e2lmKGRlZmxhdGVTdGF0ZUNoZWNrKGUpKXJldHVybiBlcnIoZSxaX1NUUkVBTV9FUlJPUiQyKTtlLnRvdGFsX2luPWUudG90YWxfb3V0PTAsZS5kYXRhX3R5cGU9Wl9VTktOT1dOO2NvbnN0IGk9ZS5zdGF0ZTtyZXR1cm4gaS5wZW5kaW5nPTAsaS5wZW5kaW5nX291dD0wLGkud3JhcDwwJiYoaS53cmFwPS1pLndyYXApLGkuc3RhdHVzPWkud3JhcD09PTI/R1pJUF9TVEFURTppLndyYXA/SU5JVF9TVEFURTpCVVNZX1NUQVRFLGUuYWRsZXI9aS53cmFwPT09Mj8wOjEsaS5sYXN0X2ZsdXNoPS0yLF90cl9pbml0KGkpLFpfT0skM30sZGVmbGF0ZVJlc2V0PWU9Pntjb25zdCBpPWRlZmxhdGVSZXNldEtlZXAoZSk7cmV0dXJuIGk9PT1aX09LJDMmJmxtX2luaXQoZS5zdGF0ZSksaX0sZGVmbGF0ZVNldEhlYWRlcj0oZSxpKT0+ZGVmbGF0ZVN0YXRlQ2hlY2soZSl8fGUuc3RhdGUud3JhcCE9PTI/Wl9TVFJFQU1fRVJST1IkMjooZS5zdGF0ZS5nemhlYWQ9aSxaX09LJDMpLGRlZmxhdGVJbml0Mj0oZSxpLHQscixhLG4pPT57aWYoIWUpcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDI7bGV0IG89MTtpZihpPT09Wl9ERUZBVUxUX0NPTVBSRVNTSU9OJDEmJihpPTYpLHI8MD8obz0wLHI9LXIpOnI+MTUmJihvPTIsci09MTYpLGE8MXx8YT5NQVhfTUVNX0xFVkVMfHx0IT09Wl9ERUZMQVRFRCQyfHxyPDh8fHI+MTV8fGk8MHx8aT45fHxuPDB8fG4+Wl9GSVhFRHx8cj09PTgmJm8hPT0xKXJldHVybiBlcnIoZSxaX1NUUkVBTV9FUlJPUiQyKTtyPT09OCYmKHI9OSk7Y29uc3QgbD1uZXcgRGVmbGF0ZVN0YXRlO3JldHVybiBlLnN0YXRlPWwsbC5zdHJtPWUsbC5zdGF0dXM9SU5JVF9TVEFURSxsLndyYXA9byxsLmd6aGVhZD1udWxsLGwud19iaXRzPXIsbC53X3NpemU9MTw8bC53X2JpdHMsbC53X21hc2s9bC53X3NpemUtMSxsLmhhc2hfYml0cz1hKzcsbC5oYXNoX3NpemU9MTw8bC5oYXNoX2JpdHMsbC5oYXNoX21hc2s9bC5oYXNoX3NpemUtMSxsLmhhc2hfc2hpZnQ9fn4oKGwuaGFzaF9iaXRzK01JTl9NQVRDSC0xKS9NSU5fTUFUQ0gpLGwud2luZG93PW5ldyBVaW50OEFycmF5KGwud19zaXplKjIpLGwuaGVhZD1uZXcgVWludDE2QXJyYXkobC5oYXNoX3NpemUpLGwucHJldj1uZXcgVWludDE2QXJyYXkobC53X3NpemUpLGwubGl0X2J1ZnNpemU9MTw8YSs2LGwucGVuZGluZ19idWZfc2l6ZT1sLmxpdF9idWZzaXplKjQsbC5wZW5kaW5nX2J1Zj1uZXcgVWludDhBcnJheShsLnBlbmRpbmdfYnVmX3NpemUpLGwuc3ltX2J1Zj1sLmxpdF9idWZzaXplLGwuc3ltX2VuZD0obC5saXRfYnVmc2l6ZS0xKSozLGwubGV2ZWw9aSxsLnN0cmF0ZWd5PW4sbC5tZXRob2Q9dCxkZWZsYXRlUmVzZXQoZSl9LGRlZmxhdGVJbml0PShlLGkpPT5kZWZsYXRlSW5pdDIoZSxpLFpfREVGTEFURUQkMixNQVhfV0JJVFMkMSxERUZfTUVNX0xFVkVMLFpfREVGQVVMVF9TVFJBVEVHWSQxKSxkZWZsYXRlJDI9KGUsaSk9PntpZihkZWZsYXRlU3RhdGVDaGVjayhlKXx8aT5aX0JMT0NLJDF8fGk8MClyZXR1cm4gZT9lcnIoZSxaX1NUUkVBTV9FUlJPUiQyKTpaX1NUUkVBTV9FUlJPUiQyO2NvbnN0IHQ9ZS5zdGF0ZTtpZighZS5vdXRwdXR8fGUuYXZhaWxfaW4hPT0wJiYhZS5pbnB1dHx8dC5zdGF0dXM9PT1GSU5JU0hfU1RBVEUmJmkhPT1aX0ZJTklTSCQzKXJldHVybiBlcnIoZSxlLmF2YWlsX291dD09PTA/Wl9CVUZfRVJST1IkMTpaX1NUUkVBTV9FUlJPUiQyKTtjb25zdCByPXQubGFzdF9mbHVzaDtpZih0Lmxhc3RfZmx1c2g9aSx0LnBlbmRpbmchPT0wKXtpZihmbHVzaF9wZW5kaW5nKGUpLGUuYXZhaWxfb3V0PT09MClyZXR1cm4gdC5sYXN0X2ZsdXNoPS0xLFpfT0skM31lbHNlIGlmKGUuYXZhaWxfaW49PT0wJiZyYW5rKGkpPD1yYW5rKHIpJiZpIT09Wl9GSU5JU0gkMylyZXR1cm4gZXJyKGUsWl9CVUZfRVJST1IkMSk7aWYodC5zdGF0dXM9PT1GSU5JU0hfU1RBVEUmJmUuYXZhaWxfaW4hPT0wKXJldHVybiBlcnIoZSxaX0JVRl9FUlJPUiQxKTtpZih0LnN0YXR1cz09PUlOSVRfU1RBVEUmJnQud3JhcD09PTAmJih0LnN0YXR1cz1CVVNZX1NUQVRFKSx0LnN0YXR1cz09PUlOSVRfU1RBVEUpe2xldCBhPVpfREVGTEFURUQkMisodC53X2JpdHMtODw8NCk8PDgsbj0tMTtpZih0LnN0cmF0ZWd5Pj1aX0hVRkZNQU5fT05MWXx8dC5sZXZlbDwyP249MDp0LmxldmVsPDY/bj0xOnQubGV2ZWw9PT02P249MjpuPTMsYXw9bjw8Nix0LnN0cnN0YXJ0IT09MCYmKGF8PVBSRVNFVF9ESUNUKSxhKz0zMS1hJTMxLHB1dFNob3J0TVNCKHQsYSksdC5zdHJzdGFydCE9PTAmJihwdXRTaG9ydE1TQih0LGUuYWRsZXI+Pj4xNikscHV0U2hvcnRNU0IodCxlLmFkbGVyJjY1NTM1KSksZS5hZGxlcj0xLHQuc3RhdHVzPUJVU1lfU1RBVEUsZmx1c2hfcGVuZGluZyhlKSx0LnBlbmRpbmchPT0wKXJldHVybiB0Lmxhc3RfZmx1c2g9LTEsWl9PSyQzfWlmKHQuc3RhdHVzPT09R1pJUF9TVEFURSl7aWYoZS5hZGxlcj0wLHB1dF9ieXRlKHQsMzEpLHB1dF9ieXRlKHQsMTM5KSxwdXRfYnl0ZSh0LDgpLHQuZ3poZWFkKXB1dF9ieXRlKHQsKHQuZ3poZWFkLnRleHQ/MTowKSsodC5nemhlYWQuaGNyYz8yOjApKyh0Lmd6aGVhZC5leHRyYT80OjApKyh0Lmd6aGVhZC5uYW1lPzg6MCkrKHQuZ3poZWFkLmNvbW1lbnQ/MTY6MCkpLHB1dF9ieXRlKHQsdC5nemhlYWQudGltZSYyNTUpLHB1dF9ieXRlKHQsdC5nemhlYWQudGltZT4+OCYyNTUpLHB1dF9ieXRlKHQsdC5nemhlYWQudGltZT4+MTYmMjU1KSxwdXRfYnl0ZSh0LHQuZ3poZWFkLnRpbWU+PjI0JjI1NSkscHV0X2J5dGUodCx0LmxldmVsPT09OT8yOnQuc3RyYXRlZ3k+PVpfSFVGRk1BTl9PTkxZfHx0LmxldmVsPDI/NDowKSxwdXRfYnl0ZSh0LHQuZ3poZWFkLm9zJjI1NSksdC5nemhlYWQuZXh0cmEmJnQuZ3poZWFkLmV4dHJhLmxlbmd0aCYmKHB1dF9ieXRlKHQsdC5nemhlYWQuZXh0cmEubGVuZ3RoJjI1NSkscHV0X2J5dGUodCx0Lmd6aGVhZC5leHRyYS5sZW5ndGg+PjgmMjU1KSksdC5nemhlYWQuaGNyYyYmKGUuYWRsZXI9Y3JjMzJfMShlLmFkbGVyLHQucGVuZGluZ19idWYsdC5wZW5kaW5nLDApKSx0Lmd6aW5kZXg9MCx0LnN0YXR1cz1FWFRSQV9TVEFURTtlbHNlIGlmKHB1dF9ieXRlKHQsMCkscHV0X2J5dGUodCwwKSxwdXRfYnl0ZSh0LDApLHB1dF9ieXRlKHQsMCkscHV0X2J5dGUodCwwKSxwdXRfYnl0ZSh0LHQubGV2ZWw9PT05PzI6dC5zdHJhdGVneT49Wl9IVUZGTUFOX09OTFl8fHQubGV2ZWw8Mj80OjApLHB1dF9ieXRlKHQsT1NfQ09ERSksdC5zdGF0dXM9QlVTWV9TVEFURSxmbHVzaF9wZW5kaW5nKGUpLHQucGVuZGluZyE9PTApcmV0dXJuIHQubGFzdF9mbHVzaD0tMSxaX09LJDN9aWYodC5zdGF0dXM9PT1FWFRSQV9TVEFURSl7aWYodC5nemhlYWQuZXh0cmEpe2xldCBhPXQucGVuZGluZyxuPSh0Lmd6aGVhZC5leHRyYS5sZW5ndGgmNjU1MzUpLXQuZ3ppbmRleDtmb3IoO3QucGVuZGluZytuPnQucGVuZGluZ19idWZfc2l6ZTspe2xldCBsPXQucGVuZGluZ19idWZfc2l6ZS10LnBlbmRpbmc7aWYodC5wZW5kaW5nX2J1Zi5zZXQodC5nemhlYWQuZXh0cmEuc3ViYXJyYXkodC5nemluZGV4LHQuZ3ppbmRleCtsKSx0LnBlbmRpbmcpLHQucGVuZGluZz10LnBlbmRpbmdfYnVmX3NpemUsdC5nemhlYWQuaGNyYyYmdC5wZW5kaW5nPmEmJihlLmFkbGVyPWNyYzMyXzEoZS5hZGxlcix0LnBlbmRpbmdfYnVmLHQucGVuZGluZy1hLGEpKSx0Lmd6aW5kZXgrPWwsZmx1c2hfcGVuZGluZyhlKSx0LnBlbmRpbmchPT0wKXJldHVybiB0Lmxhc3RfZmx1c2g9LTEsWl9PSyQzO2E9MCxuLT1sfWxldCBvPW5ldyBVaW50OEFycmF5KHQuZ3poZWFkLmV4dHJhKTt0LnBlbmRpbmdfYnVmLnNldChvLnN1YmFycmF5KHQuZ3ppbmRleCx0Lmd6aW5kZXgrbiksdC5wZW5kaW5nKSx0LnBlbmRpbmcrPW4sdC5nemhlYWQuaGNyYyYmdC5wZW5kaW5nPmEmJihlLmFkbGVyPWNyYzMyXzEoZS5hZGxlcix0LnBlbmRpbmdfYnVmLHQucGVuZGluZy1hLGEpKSx0Lmd6aW5kZXg9MH10LnN0YXR1cz1OQU1FX1NUQVRFfWlmKHQuc3RhdHVzPT09TkFNRV9TVEFURSl7aWYodC5nemhlYWQubmFtZSl7bGV0IGE9dC5wZW5kaW5nLG47ZG97aWYodC5wZW5kaW5nPT09dC5wZW5kaW5nX2J1Zl9zaXplKXtpZih0Lmd6aGVhZC5oY3JjJiZ0LnBlbmRpbmc+YSYmKGUuYWRsZXI9Y3JjMzJfMShlLmFkbGVyLHQucGVuZGluZ19idWYsdC5wZW5kaW5nLWEsYSkpLGZsdXNoX3BlbmRpbmcoZSksdC5wZW5kaW5nIT09MClyZXR1cm4gdC5sYXN0X2ZsdXNoPS0xLFpfT0skMzthPTB9dC5nemluZGV4PHQuZ3poZWFkLm5hbWUubGVuZ3RoP249dC5nemhlYWQubmFtZS5jaGFyQ29kZUF0KHQuZ3ppbmRleCsrKSYyNTU6bj0wLHB1dF9ieXRlKHQsbil9d2hpbGUobiE9PTApO3QuZ3poZWFkLmhjcmMmJnQucGVuZGluZz5hJiYoZS5hZGxlcj1jcmMzMl8xKGUuYWRsZXIsdC5wZW5kaW5nX2J1Zix0LnBlbmRpbmctYSxhKSksdC5nemluZGV4PTB9dC5zdGF0dXM9Q09NTUVOVF9TVEFURX1pZih0LnN0YXR1cz09PUNPTU1FTlRfU1RBVEUpe2lmKHQuZ3poZWFkLmNvbW1lbnQpe2xldCBhPXQucGVuZGluZyxuO2Rve2lmKHQucGVuZGluZz09PXQucGVuZGluZ19idWZfc2l6ZSl7aWYodC5nemhlYWQuaGNyYyYmdC5wZW5kaW5nPmEmJihlLmFkbGVyPWNyYzMyXzEoZS5hZGxlcix0LnBlbmRpbmdfYnVmLHQucGVuZGluZy1hLGEpKSxmbHVzaF9wZW5kaW5nKGUpLHQucGVuZGluZyE9PTApcmV0dXJuIHQubGFzdF9mbHVzaD0tMSxaX09LJDM7YT0wfXQuZ3ppbmRleDx0Lmd6aGVhZC5jb21tZW50Lmxlbmd0aD9uPXQuZ3poZWFkLmNvbW1lbnQuY2hhckNvZGVBdCh0Lmd6aW5kZXgrKykmMjU1Om49MCxwdXRfYnl0ZSh0LG4pfXdoaWxlKG4hPT0wKTt0Lmd6aGVhZC5oY3JjJiZ0LnBlbmRpbmc+YSYmKGUuYWRsZXI9Y3JjMzJfMShlLmFkbGVyLHQucGVuZGluZ19idWYsdC5wZW5kaW5nLWEsYSkpfXQuc3RhdHVzPUhDUkNfU1RBVEV9aWYodC5zdGF0dXM9PT1IQ1JDX1NUQVRFKXtpZih0Lmd6aGVhZC5oY3JjKXtpZih0LnBlbmRpbmcrMj50LnBlbmRpbmdfYnVmX3NpemUmJihmbHVzaF9wZW5kaW5nKGUpLHQucGVuZGluZyE9PTApKXJldHVybiB0Lmxhc3RfZmx1c2g9LTEsWl9PSyQzO3B1dF9ieXRlKHQsZS5hZGxlciYyNTUpLHB1dF9ieXRlKHQsZS5hZGxlcj4+OCYyNTUpLGUuYWRsZXI9MH1pZih0LnN0YXR1cz1CVVNZX1NUQVRFLGZsdXNoX3BlbmRpbmcoZSksdC5wZW5kaW5nIT09MClyZXR1cm4gdC5sYXN0X2ZsdXNoPS0xLFpfT0skM31pZihlLmF2YWlsX2luIT09MHx8dC5sb29rYWhlYWQhPT0wfHxpIT09Wl9OT19GTFVTSCQyJiZ0LnN0YXR1cyE9PUZJTklTSF9TVEFURSl7bGV0IGE9dC5sZXZlbD09PTA/ZGVmbGF0ZV9zdG9yZWQodCxpKTp0LnN0cmF0ZWd5PT09Wl9IVUZGTUFOX09OTFk/ZGVmbGF0ZV9odWZmKHQsaSk6dC5zdHJhdGVneT09PVpfUkxFP2RlZmxhdGVfcmxlKHQsaSk6Y29uZmlndXJhdGlvbl90YWJsZVt0LmxldmVsXS5mdW5jKHQsaSk7aWYoKGE9PT1CU19GSU5JU0hfU1RBUlRFRHx8YT09PUJTX0ZJTklTSF9ET05FKSYmKHQuc3RhdHVzPUZJTklTSF9TVEFURSksYT09PUJTX05FRURfTU9SRXx8YT09PUJTX0ZJTklTSF9TVEFSVEVEKXJldHVybiBlLmF2YWlsX291dD09PTAmJih0Lmxhc3RfZmx1c2g9LTEpLFpfT0skMztpZihhPT09QlNfQkxPQ0tfRE9ORSYmKGk9PT1aX1BBUlRJQUxfRkxVU0g/X3RyX2FsaWduKHQpOmkhPT1aX0JMT0NLJDEmJihfdHJfc3RvcmVkX2Jsb2NrKHQsMCwwLCExKSxpPT09Wl9GVUxMX0ZMVVNIJDEmJih6ZXJvKHQuaGVhZCksdC5sb29rYWhlYWQ9PT0wJiYodC5zdHJzdGFydD0wLHQuYmxvY2tfc3RhcnQ9MCx0Lmluc2VydD0wKSkpLGZsdXNoX3BlbmRpbmcoZSksZS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gdC5sYXN0X2ZsdXNoPS0xLFpfT0skM31yZXR1cm4gaSE9PVpfRklOSVNIJDM/Wl9PSyQzOnQud3JhcDw9MD9aX1NUUkVBTV9FTkQkMzoodC53cmFwPT09Mj8ocHV0X2J5dGUodCxlLmFkbGVyJjI1NSkscHV0X2J5dGUodCxlLmFkbGVyPj44JjI1NSkscHV0X2J5dGUodCxlLmFkbGVyPj4xNiYyNTUpLHB1dF9ieXRlKHQsZS5hZGxlcj4+MjQmMjU1KSxwdXRfYnl0ZSh0LGUudG90YWxfaW4mMjU1KSxwdXRfYnl0ZSh0LGUudG90YWxfaW4+PjgmMjU1KSxwdXRfYnl0ZSh0LGUudG90YWxfaW4+PjE2JjI1NSkscHV0X2J5dGUodCxlLnRvdGFsX2luPj4yNCYyNTUpKToocHV0U2hvcnRNU0IodCxlLmFkbGVyPj4+MTYpLHB1dFNob3J0TVNCKHQsZS5hZGxlciY2NTUzNSkpLGZsdXNoX3BlbmRpbmcoZSksdC53cmFwPjAmJih0LndyYXA9LXQud3JhcCksdC5wZW5kaW5nIT09MD9aX09LJDM6Wl9TVFJFQU1fRU5EJDMpfSxkZWZsYXRlRW5kPWU9PntpZihkZWZsYXRlU3RhdGVDaGVjayhlKSlyZXR1cm4gWl9TVFJFQU1fRVJST1IkMjtjb25zdCBpPWUuc3RhdGUuc3RhdHVzO3JldHVybiBlLnN0YXRlPW51bGwsaT09PUJVU1lfU1RBVEU/ZXJyKGUsWl9EQVRBX0VSUk9SJDIpOlpfT0skM30sZGVmbGF0ZVNldERpY3Rpb25hcnk9KGUsaSk9PntsZXQgdD1pLmxlbmd0aDtpZihkZWZsYXRlU3RhdGVDaGVjayhlKSlyZXR1cm4gWl9TVFJFQU1fRVJST1IkMjtjb25zdCByPWUuc3RhdGUsYT1yLndyYXA7aWYoYT09PTJ8fGE9PT0xJiZyLnN0YXR1cyE9PUlOSVRfU1RBVEV8fHIubG9va2FoZWFkKXJldHVybiBaX1NUUkVBTV9FUlJPUiQyO2lmKGE9PT0xJiYoZS5hZGxlcj1hZGxlcjMyXzEoZS5hZGxlcixpLHQsMCkpLHIud3JhcD0wLHQ+PXIud19zaXplKXthPT09MCYmKHplcm8oci5oZWFkKSxyLnN0cnN0YXJ0PTAsci5ibG9ja19zdGFydD0wLHIuaW5zZXJ0PTApO2xldCBmPW5ldyBVaW50OEFycmF5KHIud19zaXplKTtmLnNldChpLnN1YmFycmF5KHQtci53X3NpemUsdCksMCksaT1mLHQ9ci53X3NpemV9Y29uc3Qgbj1lLmF2YWlsX2luLG89ZS5uZXh0X2luLGw9ZS5pbnB1dDtmb3IoZS5hdmFpbF9pbj10LGUubmV4dF9pbj0wLGUuaW5wdXQ9aSxmaWxsX3dpbmRvdyhyKTtyLmxvb2thaGVhZD49TUlOX01BVENIOyl7bGV0IGY9ci5zdHJzdGFydCxzPXIubG9va2FoZWFkLShNSU5fTUFUQ0gtMSk7ZG8gci5pbnNfaD1IQVNIKHIsci5pbnNfaCxyLndpbmRvd1tmK01JTl9NQVRDSC0xXSksci5wcmV2W2Ymci53X21hc2tdPXIuaGVhZFtyLmluc19oXSxyLmhlYWRbci5pbnNfaF09ZixmKys7d2hpbGUoLS1zKTtyLnN0cnN0YXJ0PWYsci5sb29rYWhlYWQ9TUlOX01BVENILTEsZmlsbF93aW5kb3cocil9cmV0dXJuIHIuc3Ryc3RhcnQrPXIubG9va2FoZWFkLHIuYmxvY2tfc3RhcnQ9ci5zdHJzdGFydCxyLmluc2VydD1yLmxvb2thaGVhZCxyLmxvb2thaGVhZD0wLHIubWF0Y2hfbGVuZ3RoPXIucHJldl9sZW5ndGg9TUlOX01BVENILTEsci5tYXRjaF9hdmFpbGFibGU9MCxlLm5leHRfaW49byxlLmlucHV0PWwsZS5hdmFpbF9pbj1uLHIud3JhcD1hLFpfT0skM307dmFyIGRlZmxhdGVJbml0XzE9ZGVmbGF0ZUluaXQsZGVmbGF0ZUluaXQyXzE9ZGVmbGF0ZUluaXQyLGRlZmxhdGVSZXNldF8xPWRlZmxhdGVSZXNldCxkZWZsYXRlUmVzZXRLZWVwXzE9ZGVmbGF0ZVJlc2V0S2VlcCxkZWZsYXRlU2V0SGVhZGVyXzE9ZGVmbGF0ZVNldEhlYWRlcixkZWZsYXRlXzIkMT1kZWZsYXRlJDIsZGVmbGF0ZUVuZF8xPWRlZmxhdGVFbmQsZGVmbGF0ZVNldERpY3Rpb25hcnlfMT1kZWZsYXRlU2V0RGljdGlvbmFyeSxkZWZsYXRlSW5mbz0icGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSIsZGVmbGF0ZV8xJDI9e2RlZmxhdGVJbml0OmRlZmxhdGVJbml0XzEsZGVmbGF0ZUluaXQyOmRlZmxhdGVJbml0Ml8xLGRlZmxhdGVSZXNldDpkZWZsYXRlUmVzZXRfMSxkZWZsYXRlUmVzZXRLZWVwOmRlZmxhdGVSZXNldEtlZXBfMSxkZWZsYXRlU2V0SGVhZGVyOmRlZmxhdGVTZXRIZWFkZXJfMSxkZWZsYXRlOmRlZmxhdGVfMiQxLGRlZmxhdGVFbmQ6ZGVmbGF0ZUVuZF8xLGRlZmxhdGVTZXREaWN0aW9uYXJ5OmRlZmxhdGVTZXREaWN0aW9uYXJ5XzEsZGVmbGF0ZUluZm99O2NvbnN0IF9oYXM9KGUsaSk9Pk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLGkpO3ZhciBhc3NpZ249ZnVuY3Rpb24oZSl7Y29uc3QgaT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7Zm9yKDtpLmxlbmd0aDspe2NvbnN0IHQ9aS5zaGlmdCgpO2lmKCEhdCl7aWYodHlwZW9mIHQhPSJvYmplY3QiKXRocm93IG5ldyBUeXBlRXJyb3IodCsibXVzdCBiZSBub24tb2JqZWN0Iik7Zm9yKGNvbnN0IHIgaW4gdClfaGFzKHQscikmJihlW3JdPXRbcl0pfX1yZXR1cm4gZX0sZmxhdHRlbkNodW5rcz1lPT57bGV0IGk9MDtmb3IobGV0IHI9MCxhPWUubGVuZ3RoO3I8YTtyKyspaSs9ZVtyXS5sZW5ndGg7Y29uc3QgdD1uZXcgVWludDhBcnJheShpKTtmb3IobGV0IHI9MCxhPTAsbj1lLmxlbmd0aDtyPG47cisrKXtsZXQgbz1lW3JdO3Quc2V0KG8sYSksYSs9by5sZW5ndGh9cmV0dXJuIHR9LGNvbW1vbj17YXNzaWduLGZsYXR0ZW5DaHVua3N9O2xldCBTVFJfQVBQTFlfVUlBX09LPSEwO3RyeXtTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsbmV3IFVpbnQ4QXJyYXkoMSkpfWNhdGNoKGUpe1NUUl9BUFBMWV9VSUFfT0s9ITF9Y29uc3QgX3V0ZjhsZW49bmV3IFVpbnQ4QXJyYXkoMjU2KTtmb3IobGV0IGU9MDtlPDI1NjtlKyspX3V0ZjhsZW5bZV09ZT49MjUyPzY6ZT49MjQ4PzU6ZT49MjQwPzQ6ZT49MjI0PzM6ZT49MTkyPzI6MTtfdXRmOGxlblsyNTRdPV91dGY4bGVuWzI1NF09MTt2YXIgc3RyaW5nMmJ1Zj1lPT57aWYodHlwZW9mIFRleHRFbmNvZGVyPT0iZnVuY3Rpb24iJiZUZXh0RW5jb2Rlci5wcm90b3R5cGUuZW5jb2RlKXJldHVybiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZSk7bGV0IGksdCxyLGEsbixvPWUubGVuZ3RoLGw9MDtmb3IoYT0wO2E8bzthKyspdD1lLmNoYXJDb2RlQXQoYSksKHQmNjQ1MTIpPT09NTUyOTYmJmErMTxvJiYocj1lLmNoYXJDb2RlQXQoYSsxKSwociY2NDUxMik9PT01NjMyMCYmKHQ9NjU1MzYrKHQtNTUyOTY8PDEwKSsoci01NjMyMCksYSsrKSksbCs9dDwxMjg/MTp0PDIwNDg/Mjp0PDY1NTM2PzM6NDtmb3IoaT1uZXcgVWludDhBcnJheShsKSxuPTAsYT0wO248bDthKyspdD1lLmNoYXJDb2RlQXQoYSksKHQmNjQ1MTIpPT09NTUyOTYmJmErMTxvJiYocj1lLmNoYXJDb2RlQXQoYSsxKSwociY2NDUxMik9PT01NjMyMCYmKHQ9NjU1MzYrKHQtNTUyOTY8PDEwKSsoci01NjMyMCksYSsrKSksdDwxMjg/aVtuKytdPXQ6dDwyMDQ4PyhpW24rK109MTkyfHQ+Pj42LGlbbisrXT0xMjh8dCY2Myk6dDw2NTUzNj8oaVtuKytdPTIyNHx0Pj4+MTIsaVtuKytdPTEyOHx0Pj4+NiY2MyxpW24rK109MTI4fHQmNjMpOihpW24rK109MjQwfHQ+Pj4xOCxpW24rK109MTI4fHQ+Pj4xMiY2MyxpW24rK109MTI4fHQ+Pj42JjYzLGlbbisrXT0xMjh8dCY2Myk7cmV0dXJuIGl9O2NvbnN0IGJ1ZjJiaW5zdHJpbmc9KGUsaSk9PntpZihpPDY1NTM0JiZlLnN1YmFycmF5JiZTVFJfQVBQTFlfVUlBX09LKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsZS5sZW5ndGg9PT1pP2U6ZS5zdWJhcnJheSgwLGkpKTtsZXQgdD0iIjtmb3IobGV0IHI9MDtyPGk7cisrKXQrPVN0cmluZy5mcm9tQ2hhckNvZGUoZVtyXSk7cmV0dXJuIHR9O3ZhciBidWYyc3RyaW5nPShlLGkpPT57Y29uc3QgdD1pfHxlLmxlbmd0aDtpZih0eXBlb2YgVGV4dERlY29kZXI9PSJmdW5jdGlvbiImJlRleHREZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUpcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShlLnN1YmFycmF5KDAsaSkpO2xldCByLGE7Y29uc3Qgbj1uZXcgQXJyYXkodCoyKTtmb3IoYT0wLHI9MDtyPHQ7KXtsZXQgbz1lW3IrK107aWYobzwxMjgpe25bYSsrXT1vO2NvbnRpbnVlfWxldCBsPV91dGY4bGVuW29dO2lmKGw+NCl7blthKytdPTY1NTMzLHIrPWwtMTtjb250aW51ZX1mb3IobyY9bD09PTI/MzE6bD09PTM/MTU6NztsPjEmJnI8dDspbz1vPDw2fGVbcisrXSY2MyxsLS07aWYobD4xKXtuW2ErK109NjU1MzM7Y29udGludWV9bzw2NTUzNj9uW2ErK109bzooby09NjU1MzYsblthKytdPTU1Mjk2fG8+PjEwJjEwMjMsblthKytdPTU2MzIwfG8mMTAyMyl9cmV0dXJuIGJ1ZjJiaW5zdHJpbmcobixhKX0sdXRmOGJvcmRlcj0oZSxpKT0+e2k9aXx8ZS5sZW5ndGgsaT5lLmxlbmd0aCYmKGk9ZS5sZW5ndGgpO2xldCB0PWktMTtmb3IoO3Q+PTAmJihlW3RdJjE5Mik9PT0xMjg7KXQtLTtyZXR1cm4gdDwwfHx0PT09MD9pOnQrX3V0ZjhsZW5bZVt0XV0+aT90Oml9LHN0cmluZ3M9e3N0cmluZzJidWYsYnVmMnN0cmluZyx1dGY4Ym9yZGVyfTtmdW5jdGlvbiBaU3RyZWFtKCl7dGhpcy5pbnB1dD1udWxsLHRoaXMubmV4dF9pbj0wLHRoaXMuYXZhaWxfaW49MCx0aGlzLnRvdGFsX2luPTAsdGhpcy5vdXRwdXQ9bnVsbCx0aGlzLm5leHRfb3V0PTAsdGhpcy5hdmFpbF9vdXQ9MCx0aGlzLnRvdGFsX291dD0wLHRoaXMubXNnPSIiLHRoaXMuc3RhdGU9bnVsbCx0aGlzLmRhdGFfdHlwZT0yLHRoaXMuYWRsZXI9MH12YXIgenN0cmVhbT1aU3RyZWFtO2NvbnN0IHRvU3RyaW5nJDE9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyx7Wl9OT19GTFVTSDpaX05PX0ZMVVNIJDEsWl9TWU5DX0ZMVVNILFpfRlVMTF9GTFVTSCxaX0ZJTklTSDpaX0ZJTklTSCQyLFpfT0s6Wl9PSyQyLFpfU1RSRUFNX0VORDpaX1NUUkVBTV9FTkQkMixaX0RFRkFVTFRfQ09NUFJFU1NJT04sWl9ERUZBVUxUX1NUUkFURUdZLFpfREVGTEFURUQ6Wl9ERUZMQVRFRCQxfT1jb25zdGFudHMkMjtmdW5jdGlvbiBEZWZsYXRlJDEoZSl7dGhpcy5vcHRpb25zPWNvbW1vbi5hc3NpZ24oe2xldmVsOlpfREVGQVVMVF9DT01QUkVTU0lPTixtZXRob2Q6Wl9ERUZMQVRFRCQxLGNodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjE1LG1lbUxldmVsOjgsc3RyYXRlZ3k6Wl9ERUZBVUxUX1NUUkFURUdZfSxlfHx7fSk7bGV0IGk9dGhpcy5vcHRpb25zO2kucmF3JiZpLndpbmRvd0JpdHM+MD9pLndpbmRvd0JpdHM9LWkud2luZG93Qml0czppLmd6aXAmJmkud2luZG93Qml0cz4wJiZpLndpbmRvd0JpdHM8MTYmJihpLndpbmRvd0JpdHMrPTE2KSx0aGlzLmVycj0wLHRoaXMubXNnPSIiLHRoaXMuZW5kZWQ9ITEsdGhpcy5jaHVua3M9W10sdGhpcy5zdHJtPW5ldyB6c3RyZWFtLHRoaXMuc3RybS5hdmFpbF9vdXQ9MDtsZXQgdD1kZWZsYXRlXzEkMi5kZWZsYXRlSW5pdDIodGhpcy5zdHJtLGkubGV2ZWwsaS5tZXRob2QsaS53aW5kb3dCaXRzLGkubWVtTGV2ZWwsaS5zdHJhdGVneSk7aWYodCE9PVpfT0skMil0aHJvdyBuZXcgRXJyb3IobWVzc2FnZXNbdF0pO2lmKGkuaGVhZGVyJiZkZWZsYXRlXzEkMi5kZWZsYXRlU2V0SGVhZGVyKHRoaXMuc3RybSxpLmhlYWRlciksaS5kaWN0aW9uYXJ5KXtsZXQgcjtpZih0eXBlb2YgaS5kaWN0aW9uYXJ5PT0ic3RyaW5nIj9yPXN0cmluZ3Muc3RyaW5nMmJ1ZihpLmRpY3Rpb25hcnkpOnRvU3RyaW5nJDEuY2FsbChpLmRpY3Rpb25hcnkpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIj9yPW5ldyBVaW50OEFycmF5KGkuZGljdGlvbmFyeSk6cj1pLmRpY3Rpb25hcnksdD1kZWZsYXRlXzEkMi5kZWZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sciksdCE9PVpfT0skMil0aHJvdyBuZXcgRXJyb3IobWVzc2FnZXNbdF0pO3RoaXMuX2RpY3Rfc2V0PSEwfX1EZWZsYXRlJDEucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oZSxpKXtjb25zdCB0PXRoaXMuc3RybSxyPXRoaXMub3B0aW9ucy5jaHVua1NpemU7bGV0IGEsbjtpZih0aGlzLmVuZGVkKXJldHVybiExO2ZvcihpPT09fn5pP249aTpuPWk9PT0hMD9aX0ZJTklTSCQyOlpfTk9fRkxVU0gkMSx0eXBlb2YgZT09InN0cmluZyI/dC5pbnB1dD1zdHJpbmdzLnN0cmluZzJidWYoZSk6dG9TdHJpbmckMS5jYWxsKGUpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIj90LmlucHV0PW5ldyBVaW50OEFycmF5KGUpOnQuaW5wdXQ9ZSx0Lm5leHRfaW49MCx0LmF2YWlsX2luPXQuaW5wdXQubGVuZ3RoOzspe2lmKHQuYXZhaWxfb3V0PT09MCYmKHQub3V0cHV0PW5ldyBVaW50OEFycmF5KHIpLHQubmV4dF9vdXQ9MCx0LmF2YWlsX291dD1yKSwobj09PVpfU1lOQ19GTFVTSHx8bj09PVpfRlVMTF9GTFVTSCkmJnQuYXZhaWxfb3V0PD02KXt0aGlzLm9uRGF0YSh0Lm91dHB1dC5zdWJhcnJheSgwLHQubmV4dF9vdXQpKSx0LmF2YWlsX291dD0wO2NvbnRpbnVlfWlmKGE9ZGVmbGF0ZV8xJDIuZGVmbGF0ZSh0LG4pLGE9PT1aX1NUUkVBTV9FTkQkMilyZXR1cm4gdC5uZXh0X291dD4wJiZ0aGlzLm9uRGF0YSh0Lm91dHB1dC5zdWJhcnJheSgwLHQubmV4dF9vdXQpKSxhPWRlZmxhdGVfMSQyLmRlZmxhdGVFbmQodGhpcy5zdHJtKSx0aGlzLm9uRW5kKGEpLHRoaXMuZW5kZWQ9ITAsYT09PVpfT0skMjtpZih0LmF2YWlsX291dD09PTApe3RoaXMub25EYXRhKHQub3V0cHV0KTtjb250aW51ZX1pZihuPjAmJnQubmV4dF9vdXQ+MCl7dGhpcy5vbkRhdGEodC5vdXRwdXQuc3ViYXJyYXkoMCx0Lm5leHRfb3V0KSksdC5hdmFpbF9vdXQ9MDtjb250aW51ZX1pZih0LmF2YWlsX2luPT09MClicmVha31yZXR1cm4hMH0sRGVmbGF0ZSQxLnByb3RvdHlwZS5vbkRhdGE9ZnVuY3Rpb24oZSl7dGhpcy5jaHVua3MucHVzaChlKX0sRGVmbGF0ZSQxLnByb3RvdHlwZS5vbkVuZD1mdW5jdGlvbihlKXtlPT09Wl9PSyQyJiYodGhpcy5yZXN1bHQ9Y29tbW9uLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpKSx0aGlzLmNodW5rcz1bXSx0aGlzLmVycj1lLHRoaXMubXNnPXRoaXMuc3RybS5tc2d9O2NvbnN0IEJBRCQxPTE2MjA5LFRZUEUkMT0xNjE5MTt2YXIgaW5mZmFzdD1mdW5jdGlvbihpLHQpe2xldCByLGEsbixvLGwsZixzLF8saCx1LGMsZCx3LHksYiwkLFMscCxULFIsZyx2LEEsRTtjb25zdCBtPWkuc3RhdGU7cj1pLm5leHRfaW4sQT1pLmlucHV0LGE9cisoaS5hdmFpbF9pbi01KSxuPWkubmV4dF9vdXQsRT1pLm91dHB1dCxvPW4tKHQtaS5hdmFpbF9vdXQpLGw9bisoaS5hdmFpbF9vdXQtMjU3KSxmPW0uZG1heCxzPW0ud3NpemUsXz1tLndoYXZlLGg9bS53bmV4dCx1PW0ud2luZG93LGM9bS5ob2xkLGQ9bS5iaXRzLHc9bS5sZW5jb2RlLHk9bS5kaXN0Y29kZSxiPSgxPDxtLmxlbmJpdHMpLTEsJD0oMTw8bS5kaXN0Yml0cyktMTtlOmRve2Q8MTUmJihjKz1BW3IrK108PGQsZCs9OCxjKz1BW3IrK108PGQsZCs9OCksUz13W2MmYl07dDpmb3IoOzspe2lmKHA9Uz4+PjI0LGM+Pj49cCxkLT1wLHA9Uz4+PjE2JjI1NSxwPT09MClFW24rK109UyY2NTUzNTtlbHNlIGlmKHAmMTYpe1Q9UyY2NTUzNSxwJj0xNSxwJiYoZDxwJiYoYys9QVtyKytdPDxkLGQrPTgpLFQrPWMmKDE8PHApLTEsYz4+Pj1wLGQtPXApLGQ8MTUmJihjKz1BW3IrK108PGQsZCs9OCxjKz1BW3IrK108PGQsZCs9OCksUz15W2MmJF07aTpmb3IoOzspe2lmKHA9Uz4+PjI0LGM+Pj49cCxkLT1wLHA9Uz4+PjE2JjI1NSxwJjE2KXtpZihSPVMmNjU1MzUscCY9MTUsZDxwJiYoYys9QVtyKytdPDxkLGQrPTgsZDxwJiYoYys9QVtyKytdPDxkLGQrPTgpKSxSKz1jJigxPDxwKS0xLFI+Zil7aS5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixtLm1vZGU9QkFEJDE7YnJlYWsgZX1pZihjPj4+PXAsZC09cCxwPW4tbyxSPnApe2lmKHA9Ui1wLHA+XyYmbS5zYW5lKXtpLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b2