UNPKG

xgplayer-mp4

Version:

xgplayer plugin for mp4 transform to fmp4

1 lines 146 kB
var encodedJs = "IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGUoZSx0KXt2YXIgcj1PYmplY3Qua2V5cyhlKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgYT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO3QmJihhPWEuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpLmVudW1lcmFibGV9KSkpLHIucHVzaC5hcHBseShyLGEpfXJldHVybiByfWZ1bmN0aW9uIHQodCl7Zm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyl7dmFyIGE9bnVsbCE9YXJndW1lbnRzW3JdP2FyZ3VtZW50c1tyXTp7fTtyJTI/ZShPYmplY3QoYSksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe2kodCxlLGFbZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoYSkpOmUoT2JqZWN0KGEpKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYSxlKSl9KSl9cmV0dXJuIHR9ZnVuY3Rpb24gcihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGEoZSx0KXtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIGE9dFtyXTthLmVudW1lcmFibGU9YS5lbnVtZXJhYmxlfHwhMSxhLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gYSYmKGEud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLGsoYS5rZXkpLGEpfX1mdW5jdGlvbiBuKGUsdCxyKXtyZXR1cm4gdCYmYShlLnByb3RvdHlwZSx0KSxyJiZhKGUsciksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksZX1mdW5jdGlvbiBpKGUsdCxyKXtyZXR1cm4odD1rKHQpKWluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6cixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09cixlfWZ1bmN0aW9uIHMoZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksdCYmdShlLHQpfWZ1bmN0aW9uIG8oZSl7cmV0dXJuKG89T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCk6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSl9KShlKX1mdW5jdGlvbiB1KGUsdCl7cmV0dXJuKHU9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5fX3Byb3RvX189dCxlfSkoZSx0KX1mdW5jdGlvbiBjKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbixbXSwoZnVuY3Rpb24oKXt9KSkpLCEwfWNhdGNoKGUpe3JldHVybiExfX1mdW5jdGlvbiBsKGUsdCxyKXtyZXR1cm4obD1jKCk/UmVmbGVjdC5jb25zdHJ1Y3QuYmluZCgpOmZ1bmN0aW9uKGUsdCxyKXt2YXIgYT1bbnVsbF07YS5wdXNoLmFwcGx5KGEsdCk7dmFyIG49bmV3KEZ1bmN0aW9uLmJpbmQuYXBwbHkoZSxhKSk7cmV0dXJuIHImJnUobixyLnByb3RvdHlwZSksbn0pLmFwcGx5KG51bGwsYXJndW1lbnRzKX1mdW5jdGlvbiBmKGUsdCl7aWYodCYmKCJvYmplY3QiPT10eXBlb2YgdHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQpKXJldHVybiB0O2lmKHZvaWQgMCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWQiKTtyZXR1cm4gZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiBlfShlKX1mdW5jdGlvbiBkKGUpe3ZhciB0PWMoKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcixhPW8oZSk7aWYodCl7dmFyIG49byh0aGlzKS5jb25zdHJ1Y3RvcjtyPVJlZmxlY3QuY29uc3RydWN0KGEsYXJndW1lbnRzLG4pfWVsc2Ugcj1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZih0aGlzLHIpfX1mdW5jdGlvbiBoKGUsdCl7Zm9yKDshT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCkmJm51bGwhPT0oZT1vKGUpKTspO3JldHVybiBlfWZ1bmN0aW9uIHAoKXtyZXR1cm4gcD0idW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJlJlZmxlY3QuZ2V0P1JlZmxlY3QuZ2V0LmJpbmQoKTpmdW5jdGlvbihlLHQscil7dmFyIGE9aChlLHQpO2lmKGEpe3ZhciBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYSx0KTtyZXR1cm4gbi5nZXQ/bi5nZXQuY2FsbChhcmd1bWVudHMubGVuZ3RoPDM/ZTpyKTpuLnZhbHVlfX0scC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gdihlLHQpe3JldHVybiBmdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlfShlKXx8ZnVuY3Rpb24oZSx0KXt2YXIgcj1udWxsPT1lP251bGw6InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJmVbU3ltYm9sLml0ZXJhdG9yXXx8ZVsiQEBpdGVyYXRvciJdO2lmKG51bGwhPXIpe3ZhciBhLG4saSxzLG89W10sdT0hMCxjPSExO3RyeXtpZihpPShyPXIuY2FsbChlKSkubmV4dCwwPT09dCl7aWYoT2JqZWN0KHIpIT09cilyZXR1cm47dT0hMX1lbHNlIGZvcig7ISh1PShhPWkuY2FsbChyKSkuZG9uZSkmJihvLnB1c2goYS52YWx1ZSksby5sZW5ndGghPT10KTt1PSEwKTt9Y2F0Y2gobCl7Yz0hMCxuPWx9ZmluYWxseXt0cnl7aWYoIXUmJm51bGwhPXIucmV0dXJuJiYocz1yLnJldHVybigpLE9iamVjdChzKSE9PXMpKXJldHVybn1maW5hbGx5e2lmKGMpdGhyb3cgbn19cmV0dXJuIG99fShlLHQpfHxtKGUsdCl8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX0oKX1mdW5jdGlvbiB5KGUpe3JldHVybiBmdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBnKGUpfShlKXx8ZnVuY3Rpb24oZSl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJm51bGwhPWVbU3ltYm9sLml0ZXJhdG9yXXx8bnVsbCE9ZVsiQEBpdGVyYXRvciJdKXJldHVybiBBcnJheS5mcm9tKGUpfShlKXx8bShlKXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX0oKX1mdW5jdGlvbiBtKGUsdCl7aWYoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJldHVybiBnKGUsdCk7dmFyIHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsLTEpO3JldHVybiJPYmplY3QiPT09ciYmZS5jb25zdHJ1Y3RvciYmKHI9ZS5jb25zdHJ1Y3Rvci5uYW1lKSwiTWFwIj09PXJ8fCJTZXQiPT09cj9BcnJheS5mcm9tKGUpOiJBcmd1bWVudHMiPT09cnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qocik/ZyhlLHQpOnZvaWQgMH19ZnVuY3Rpb24gZyhlLHQpeyhudWxsPT10fHx0PmUubGVuZ3RoKSYmKHQ9ZS5sZW5ndGgpO2Zvcih2YXIgcj0wLGE9bmV3IEFycmF5KHQpO3I8dDtyKyspYVtyXT1lW3JdO3JldHVybiBhfWZ1bmN0aW9uIGsoZSl7dmFyIHQ9ZnVuY3Rpb24oZSx0KXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiBlO3ZhciByPWVbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZih2b2lkIDAhPT1yKXt2YXIgYT1yLmNhbGwoZSx0fHwiZGVmYXVsdCIpO2lmKCJvYmplY3QiIT10eXBlb2YgYSlyZXR1cm4gYTt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PXQ/U3RyaW5nOk51bWJlcikoZSl9KGUsInN0cmluZyIpO3JldHVybiJzeW1ib2wiPT10eXBlb2YgdD90OlN0cmluZyh0KX12YXIgYj0idmlkZW8iLF89ImF1ZGlvIix3PSJtZXRhZGF0YSIseD0iYXYxIixTPSJhdmMiLEQ9ImhldmMiLEE9ImFhYyIsVD0iZzcxMTBhIixCPSJnNzExMG0iLEU9Im9wdXMiLFU9Im1wMyIsQz0iTEFSR0VfQVZfU0hJRlQiLFA9IkxBUkdFX1ZJREVPX0dBUCIsST0iTEFSR0VfVklERU9fR0FQX0JFVFdFRU5fQ0hVTksiLE09IkxBUkdFX0FVRElPX0dBUCIsej0iQVVESU9fRklMTEVEIixPPSJBVURJT19EUk9QUEVEIixSPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3IodGhpcyxlKSxpKHRoaXMsImlkIiwxKSxpKHRoaXMsInR5cGUiLGIpLGkodGhpcywiY29kZWNUeXBlIixTKSxpKHRoaXMsInBpZCIsLTEpLGkodGhpcywiaHZjQyIsdm9pZCAwKSxpKHRoaXMsImNvZGVjIiwiIiksaSh0aGlzLCJ0aW1lc2NhbGUiLDApLGkodGhpcywiZm9ybWF0VGltZXNjYWxlIiwwKSxpKHRoaXMsInNlcXVlbmNlTnVtYmVyIiwwKSxpKHRoaXMsImJhc2VNZWRpYURlY29kZVRpbWUiLDApLGkodGhpcywiYmFzZUR0cyIsMCksaSh0aGlzLCJkdXJhdGlvbiIsMCksaSh0aGlzLCJ3YXJuaW5ncyIsW10pLGkodGhpcywic2FtcGxlcyIsW10pLGkodGhpcywicHBzIixbXSksaSh0aGlzLCJzcHMiLFtdKSxpKHRoaXMsInZwcyIsW10pLGkodGhpcywiZnBzTnVtIiwwKSxpKHRoaXMsImZwc0RlbiIsMCksaSh0aGlzLCJzYXJSYXRpbyIsW10pLGkodGhpcywid2lkdGgiLDApLGkodGhpcywiaGVpZ2h0IiwwKSxpKHRoaXMsIm5hbFVuaXRTaXplIiw0KSxpKHRoaXMsInByZXNlbnQiLCExKSxpKHRoaXMsImlzVmlkZW9FbmNyeXB0aW9uIiwhMSksaSh0aGlzLCJpc0F1ZGlvRW5jcnlwdGlvbiIsITEpLGkodGhpcywiaXNWaWRlbyIsITApLGkodGhpcywibGFzdEtleUZyYW1lRHRzIiwwKSxpKHRoaXMsImtpZCIsbnVsbCksaSh0aGlzLCJwc3NoIixudWxsKSxpKHRoaXMsImV4dCIsdm9pZCAwKX1yZXR1cm4gbihlLFt7a2V5OiJyZXNldCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnNlcXVlbmNlTnVtYmVyPXRoaXMud2lkdGg9dGhpcy5oZWlnaHQ9dGhpcy5mcHNEZW49dGhpcy5mcHNOdW09dGhpcy5kdXJhdGlvbj10aGlzLmJhc2VNZWRpYURlY29kZVRpbWU9dGhpcy50aW1lc2NhbGU9MCx0aGlzLmNvZGVjPSIiLHRoaXMucHJlc2VudD0hMSx0aGlzLnBpZD0tMSx0aGlzLnBwcz1bXSx0aGlzLnNwcz1bXSx0aGlzLnZwcz1bXSx0aGlzLnNhclJhdGlvPVtdLHRoaXMuc2FtcGxlcz1bXSx0aGlzLndhcm5pbmdzPVtdLHRoaXMuaHZjQz1udWxsfX0se2tleToiZmlyc3REdHMiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNhbXBsZXMubGVuZ3RoP3RoaXMuc2FtcGxlc1swXS5kdHM6bnVsbH19LHtrZXk6ImZpcnN0UHRzIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zYW1wbGVzLmxlbmd0aD90aGlzLnNhbXBsZXNbMF0ucHRzOm51bGx9fSx7a2V5OiJzYW1wbGVzRHVyYXRpb24iLGdldDpmdW5jdGlvbigpe2lmKHRoaXMuc2FtcGxlcy5sZW5ndGg+MCl7dmFyIGU9dGhpcy5zYW1wbGVzWzBdLHQ9dGhpcy5zYW1wbGVzW3RoaXMuc2FtcGxlcy5sZW5ndGgtMV07cmV0dXJuIHQuZHRzLWUuZHRzK3QuZHVyYXRpb259cmV0dXJuIDB9fSx7a2V5OiJleGlzdCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4hIS9hdjAxLy50ZXN0KHRoaXMuY29kZWMpfHwhISh0aGlzLnBwcy5sZW5ndGgmJnRoaXMuc3BzLmxlbmd0aCYmdGhpcy5jb2RlYyl9fSx7a2V5OiJoYXNTYW1wbGUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLnNhbXBsZXMubGVuZ3RofX0se2tleToiaXNFbmNyeXB0aW9uIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc1ZpZGVvRW5jcnlwdGlvbn19XSksZX0oKSxMPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3IodGhpcyxlKSxpKHRoaXMsImlkIiwyKSxpKHRoaXMsInR5cGUiLF8pLGkodGhpcywiY29kZWNUeXBlIixBKSxpKHRoaXMsInBpZCIsLTEpLGkodGhpcywiY29kZWMiLCIiKSxpKHRoaXMsImNvbnRhaW5lciIsIiIpLGkodGhpcywic2VxdWVuY2VOdW1iZXIiLDApLGkodGhpcywic2FtcGxlRHVyYXRpb24iLDApLGkodGhpcywidGltZXNjYWxlIiwwKSxpKHRoaXMsImZvcm1hdFRpbWVzY2FsZSIsMCksaSh0aGlzLCJiYXNlTWVkaWFEZWNvZGVUaW1lIiwwKSxpKHRoaXMsImR1cmF0aW9uIiwwKSxpKHRoaXMsIndhcm5pbmdzIixbXSksaSh0aGlzLCJzYW1wbGVzIixbXSksaSh0aGlzLCJiYXNlRHRzIiwwKSxpKHRoaXMsInNhbXBsZVNpemUiLDE2KSxpKHRoaXMsInNhbXBsZVJhdGUiLDApLGkodGhpcywiY2hhbm5lbENvdW50IiwwKSxpKHRoaXMsIm9iamVjdFR5cGUiLDApLGkodGhpcywic2FtcGxlUmF0ZUluZGV4IiwwKSxpKHRoaXMsImNvbmZpZyIsW10pLGkodGhpcywicHJlc2VudCIsITEpLGkodGhpcywiaXNWaWRlb0VuY3J5cHRpb24iLCExKSxpKHRoaXMsImlzQXVkaW9FbmNyeXB0aW9uIiwhMSksaSh0aGlzLCJraWQiLG51bGwpLGkodGhpcywiZXh0Iix2b2lkIDApfXJldHVybiBuKGUsW3trZXk6InJlc2V0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuc2VxdWVuY2VOdW1iZXI9MCx0aGlzLnRpbWVzY2FsZT0wLHRoaXMuc2FtcGxlRHVyYXRpb249MCx0aGlzLnNhbXBsZVJhdGU9MCx0aGlzLmNoYW5uZWxDb3VudD0wLHRoaXMuYmFzZU1lZGlhRGVjb2RlVGltZT0wLHRoaXMucHJlc2VudD0hMSx0aGlzLnBpZD0tMSx0aGlzLmNvZGVjPSIiLHRoaXMuc2FtcGxlcz1bXSx0aGlzLmNvbmZpZz1bXSx0aGlzLndhcm5pbmdzPVtdfX0se2tleToiZXhpc3QiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuISghdGhpcy5zYW1wbGVSYXRlfHwhdGhpcy5jaGFubmVsQ291bnR8fCF0aGlzLmNvZGVjJiYhdGhpcy5jb250YWluZXJ8fHRoaXMuY29kZWNUeXBlIT09QSYmdGhpcy5jb2RlY1R5cGUhPT1UJiZ0aGlzLmNvZGVjVHlwZSE9PUImJnRoaXMuY29kZWNUeXBlIT09RSYmdGhpcy5jb2RlY1R5cGUhPT1VKX19LHtrZXk6Imhhc1NhbXBsZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuc2FtcGxlcy5sZW5ndGh9fSx7a2V5OiJpc0VuY3J5cHRpb24iLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlzQXVkaW9FbmNyeXB0aW9ufX0se2tleToiZmlyc3REdHMiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNhbXBsZXMubGVuZ3RoP3RoaXMuc2FtcGxlc1swXS5kdHM6bnVsbH19LHtrZXk6ImZpcnN0UHRzIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zYW1wbGVzLmxlbmd0aD90aGlzLnNhbXBsZXNbMF0ucHRzOm51bGx9fSx7a2V5OiJzYW1wbGVzRHVyYXRpb24iLGdldDpmdW5jdGlvbigpe2lmKHRoaXMuc2FtcGxlcy5sZW5ndGg+MCl7dmFyIGU9dGhpcy5zYW1wbGVzWzBdLHQ9dGhpcy5zYW1wbGVzW3RoaXMuc2FtcGxlcy5sZW5ndGgtMV07cmV0dXJuIHQuZHRzLWUuZHRzK3QuZHVyYXRpb259cmV0dXJuIDB9fV0pLGV9KCksVj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxhLG4pe3IodGhpcyxlKSxpKHRoaXMsImZsYWciLHt9KSxpKHRoaXMsImtleWZyYW1lIiwhMSksaSh0aGlzLCJnb3BJZCIsMCksaSh0aGlzLCJkdXJhdGlvbiIsMCksaSh0aGlzLCJzaXplIiwwKSxpKHRoaXMsInVuaXRzIixbXSksaSh0aGlzLCJjaHJvbWFGb3JtYXQiLDQyMCksdGhpcy5vcmlnaW5QdHM9dGhpcy5wdHM9dCx0aGlzLm9yaWdpbkR0cz10aGlzLmR0cz1hLG4mJih0aGlzLnVuaXRzPW4pfXJldHVybiBuKGUsW3trZXk6ImN0cyIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHRzLXRoaXMuZHRzfX0se2tleToic2V0VG9LZXlmcmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmtleWZyYW1lPSEwLHRoaXMuZmxhZy5kZXBlbmRzT249Mix0aGlzLmZsYWcuaXNOb25TeW5jU2FtcGxlPTB9fV0pLGV9KCksRj1uKChmdW5jdGlvbiBlKHQsYSxuLHMpe3IodGhpcyxlKSxpKHRoaXMsImR1cmF0aW9uIiwxMDI0KSxpKHRoaXMsImZsYWciLHtkZXBlbmRzT246Mixpc05vblN5bmNTYW1wbGU6MH0pLGkodGhpcywia2V5ZnJhbWUiLCEwKSx0aGlzLm9yaWdpblB0cz10aGlzLnB0cz10aGlzLmR0cz10LHRoaXMuZGF0YT1hLHRoaXMuc2l6ZT1hLmJ5dGVMZW5ndGgsdGhpcy5zYW1wbGVPZmZzZXQ9cyxuJiYodGhpcy5kdXJhdGlvbj1uKX0pKSxOPW4oKGZ1bmN0aW9uIGUodCxhKXtyKHRoaXMsZSksaSh0aGlzLCJ0aW1lIiwwKSx0aGlzLmRhdGE9dCx0aGlzLm9yaWdpblB0cz10aGlzLnB0cz1hfSkpLGo9ZnVuY3Rpb24oZSl7cyhhLGUpO3ZhciB0PWQoYSk7ZnVuY3Rpb24gYSgpe3JldHVybiByKHRoaXMsYSksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIG4oYSl9KE4pLEc9ZnVuY3Rpb24oZSl7cyhhLGUpO3ZhciB0PWQoYSk7ZnVuY3Rpb24gYSgpe3JldHVybiByKHRoaXMsYSksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIG4oYSl9KE4pLEg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7cih0aGlzLGUpLGkodGhpcywiaWQiLDMpLGkodGhpcywidHlwZSIsdyksaSh0aGlzLCJ0aW1lc2NhbGUiLDApLGkodGhpcywiZmx2U2NyaXB0U2FtcGxlcyIsW10pLGkodGhpcywic2VpU2FtcGxlcyIsW10pfXJldHVybiBuKGUsW3trZXk6ImV4aXN0Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiEoIXRoaXMuZmx2U2NyaXB0U2FtcGxlcy5sZW5ndGgmJiF0aGlzLnNlaVNhbXBsZXMubGVuZ3RofHwhdGhpcy50aW1lc2NhbGUpfX0se2tleToicmVzZXQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy50aW1lc2NhbGU9MCx0aGlzLmZsdlNjcmlwdFNhbXBsZXM9W10sdGhpcy5zZWlTYW1wbGVzPVtdfX0se2tleToiaGFzU2FtcGxlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiEoIXRoaXMuZmx2U2NyaXB0U2FtcGxlcy5sZW5ndGgmJiF0aGlzLnNlaVNhbXBsZXMubGVuZ3RoKX19XSksZX0oKSxLPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtpZihyKHRoaXMsZSksaSh0aGlzLCJfYnl0ZXNBdmFpbGFibGUiLHZvaWQgMCksaSh0aGlzLCJfYml0c0F2YWlsYWJsZSIsMCksaSh0aGlzLCJfd29yZCIsMCksIXQpdGhyb3cgbmV3IEVycm9yKCJFeHBHb2xvbWIgZGF0YSBwYXJhbXMgaXMgcmVxdWlyZWQiKTt0aGlzLl9kYXRhPXQsdGhpcy5fYnl0ZXNBdmFpbGFibGU9dC5ieXRlTGVuZ3RoLHRoaXMuX2J5dGVzQXZhaWxhYmxlJiZ0aGlzLl9sb2FkV29yZCgpfXJldHVybiBuKGUsW3trZXk6ImJpdHNBdmFpbGFibGUiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9iaXRzQXZhaWxhYmxlfX0se2tleToiX2xvYWRXb3JkIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2RhdGEuYnl0ZUxlbmd0aC10aGlzLl9ieXRlc0F2YWlsYWJsZSx0PU1hdGgubWluKDQsdGhpcy5fYnl0ZXNBdmFpbGFibGUpO2lmKDA9PT10KXRocm93IG5ldyBFcnJvcigiTm8gYnl0ZXMgYXZhaWxhYmxlIik7dmFyIHI9bmV3IFVpbnQ4QXJyYXkoNCk7ci5zZXQodGhpcy5fZGF0YS5zdWJhcnJheShlLGUrdCkpLHRoaXMuX3dvcmQ9bmV3IERhdGFWaWV3KHIuYnVmZmVyKS5nZXRVaW50MzIoMCksdGhpcy5fYml0c0F2YWlsYWJsZT04KnQsdGhpcy5fYnl0ZXNBdmFpbGFibGUtPXR9fSx7a2V5OiJza2lwQml0cyIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYodGhpcy5fYml0c0F2YWlsYWJsZT5lKXRoaXMuX3dvcmQ8PD1lLHRoaXMuX2JpdHNBdmFpbGFibGUtPWU7ZWxzZXtlLT10aGlzLl9iaXRzQXZhaWxhYmxlO3ZhciB0PU1hdGguZmxvb3IoZS84KTtlLT04KnQsdGhpcy5fYnl0ZXNBdmFpbGFibGUtPXQsdGhpcy5fbG9hZFdvcmQoKSx0aGlzLl93b3JkPDw9ZSx0aGlzLl9iaXRzQXZhaWxhYmxlLT1lfX19LHtrZXk6InJlYWRCaXRzIix2YWx1ZTpmdW5jdGlvbihlKXtpZihlPjMyKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHJlYWQgbW9yZSB0aGFuIDMyIGJpdHMiKTt2YXIgdD1NYXRoLm1pbih0aGlzLl9iaXRzQXZhaWxhYmxlLGUpLHI9dGhpcy5fd29yZD4+PjMyLXQ7cmV0dXJuIHRoaXMuX2JpdHNBdmFpbGFibGUtPXQsdGhpcy5fYml0c0F2YWlsYWJsZT4wP3RoaXMuX3dvcmQ8PD10OnRoaXMuX2J5dGVzQXZhaWxhYmxlPjAmJnRoaXMuX2xvYWRXb3JkKCksKHQ9ZS10KT4wJiZ0aGlzLl9iaXRzQXZhaWxhYmxlP3I8PHR8dGhpcy5yZWFkQml0cyh0KTpyfX0se2tleToic2tpcExaIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlO2ZvcihlPTA7ZTx0aGlzLl9iaXRzQXZhaWxhYmxlOysrZSlpZigwIT0odGhpcy5fd29yZCYyMTQ3NDgzNjQ4Pj4+ZSkpcmV0dXJuIHRoaXMuX3dvcmQ8PD1lLHRoaXMuX2JpdHNBdmFpbGFibGUtPWUsZTtyZXR1cm4gdGhpcy5fbG9hZFdvcmQoKSxlK3RoaXMuc2tpcExaKCl9fSx7a2V5OiJza2lwVUVHIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuc2tpcEJpdHMoMSt0aGlzLnNraXBMWigpKX19LHtrZXk6InJlYWRVRUciLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5za2lwTFooKTtyZXR1cm4gdGhpcy5yZWFkQml0cyhlKzEpLTF9fSx7a2V5OiJyZWFkRUciLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yZWFkVUVHKCk7cmV0dXJuIDEmZT8xK2U+Pj4xOi0xKihlPj4+MSl9fSx7a2V5OiJyZWFkQm9vbCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gMT09PXRoaXMucmVhZEJpdHMoMSl9fSx7a2V5OiJyZWFkVUJ5dGUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZEJpdHMoOCl9fSx7a2V5OiJza2lwU2NhbGluZ0xpc3QiLHZhbHVlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD04LHI9OCxhPTA7YTxlO2ErKykwIT09ciYmKHI9KHQrdGhpcy5yZWFkRUcoKSsyNTYpJTI1NiksdD0wPT09cj90OnJ9fV0pLGV9KCkscT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7cih0aGlzLGUpLHRoaXMubmFtZT10fHwiIix0aGlzLl9wcmVmaXg9IlsiLmNvbmNhdCh0aGlzLm5hbWUsIl0iKX1yZXR1cm4gbihlLFt7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0O2lmKCFlLmRpc2FibGVkKXtmb3IodmFyIHI9YXJndW1lbnRzLmxlbmd0aCxhPW5ldyBBcnJheShyKSxuPTA7bjxyO24rKylhW25dPWFyZ3VtZW50c1tuXTsodD1jb25zb2xlKS53YXJuLmFwcGx5KHQsW3RoaXMuX3ByZWZpeF0uY29uY2F0KGEpKX19fV0sW3trZXk6ImVuYWJsZSIsdmFsdWU6ZnVuY3Rpb24oKXtlLmRpc2FibGVkPSExfX0se2tleToiZGlzYWJsZSIsdmFsdWU6ZnVuY3Rpb24oKXtlLmRpc2FibGVkPSEwfX1dKSxlfSgpO2kocSwiZGlzYWJsZWQiLCEwKTt2YXIgVz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtyKHRoaXMsZSl9cmV0dXJuIG4oZSxudWxsLFt7a2V5OiJkZWNvZGUiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgcj1bXSxhPXQsbj0wLGk9dC5sZW5ndGg7bjxpOylpZihhW25dPDEyOClyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShhW25dKSksKytuO2Vsc2V7aWYoYVtuXTwxOTIpO2Vsc2UgaWYoYVtuXTwyMjQpe2lmKGUuX2NoZWNrQ29udGludWF0aW9uKGEsbiwxKSl7dmFyIHM9KDMxJmFbbl0pPDw2fDYzJmFbbisxXTtpZihzPj0xMjgpe3IucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDY1NTM1JnMpKSxuKz0yO2NvbnRpbnVlfX19ZWxzZSBpZihhW25dPDI0MCl7aWYoZS5fY2hlY2tDb250aW51YXRpb24oYSxuLDIpKXt2YXIgbz0oMTUmYVtuXSk8PDEyfCg2MyZhW24rMV0pPDw2fDYzJmFbbisyXTtpZihvPj0yMDQ4JiY1NTI5NiE9KDYzNDg4Jm8pKXtyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSg2NTUzNSZvKSksbis9Mztjb250aW51ZX19fWVsc2UgaWYoYVtuXTwyNDgmJmUuX2NoZWNrQ29udGludWF0aW9uKGEsbiwzKSl7dmFyIHU9KDcmYVtuXSk8PDE4fCg2MyZhW24rMV0pPDwxMnwoNjMmYVtuKzJdKTw8Nnw2MyZhW24rM107aWYodT42NTUzNiYmdTwxMTE0MTEyKXt1LT02NTUzNixyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh1Pj4+MTB8NTUyOTYpKSxyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgxMDIzJnV8NTYzMjApKSxuKz00O2NvbnRpbnVlfX1yLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSg2NTUzMykpLCsrbn1yZXR1cm4gci5qb2luKCIiKX19LHtrZXk6Il9jaGVja0NvbnRpbnVhdGlvbiIsdmFsdWU6ZnVuY3Rpb24oZSx0LHIpe3ZhciBhPWU7aWYodCtyPGEubGVuZ3RoKXtmb3IoO3ItLTspaWYoMTI4IT0oMTkyJmFbKyt0XSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9fV0pLGV9KCksWD0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyxZPVgmJm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb2NhbGVMb3dlckNhc2UoKSxaPVgmJi9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS8udGVzdChZKSxRPVgmJlkuaW5jbHVkZXMoImZpcmVmb3giKSxKPVgmJlkuaW5jbHVkZXMoImFuZHJvaWQiKTtmdW5jdGlvbiAkKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSkscj0wO3I8ZTtyKyspdFtyXT1hcmd1bWVudHNbcl07dD10LmZpbHRlcihCb29sZWFuKTt2YXIgYT1uZXcgVWludDhBcnJheSh0LnJlZHVjZSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSt0LmJ5dGVMZW5ndGh9KSwwKSksbj0wO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKGUpe2Euc2V0KGUsbiksbis9ZS5ieXRlTGVuZ3RofSkpLGF9dmFyIGVlPU1hdGgucG93KDIsMzIpO2Z1bmN0aW9uIHRlKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3JldHVybihlW3RdPDw4KSsoZVt0KzFdfHwwKX1mdW5jdGlvbiByZShlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtyZXR1cm4oZVt0XTw8MjQ+Pj4wKSsoZVt0KzFdPDwxNikrKGVbdCsyXTw8OCkrKGVbdCszXXx8MCl9ZnVuY3Rpb24gYWUoZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjA7cmV0dXJuIHJlKGUsdCkqZWUrcmUoZSx0KzQpfWZ1bmN0aW9uIG5lKGUpe2Zvcih2YXIgdCxyPSJhdmMxLiIsYT0wO2E8MzthKyspKHQ9ZVthXS50b1N0cmluZygxNikpLmxlbmd0aDwyJiYodD0iMCIuY29uY2F0KHQpKSxyKz10O3JldHVybiByfWZ1bmN0aW9uIGllKGUpe3ZhciB0PSIiO2lmKGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dCs9ZnVuY3Rpb24oZSl7cmV0dXJuKCIwIitOdW1iZXIoZSkudG9TdHJpbmcoMTYpKS5zbGljZSgtMikudG9VcHBlckNhc2UoKX0oZSl9KSksdC5sZW5ndGg8PTMyKWZvcih2YXIgcj0zMi10Lmxlbmd0aCxhPTA7YTxyO2ErKyl0Kz0iMCI7cmV0dXJuIHR9ZnVuY3Rpb24gc2UoZSl7aWYoIUFycmF5LmlzQXJyYXkoZSkpe2Zvcih2YXIgdD1bXSxyPSIiLGE9MDthPGUubGVuZ3RoO2ErKylhJTImJihyPWVbYS0xXStlW2FdLHQucHVzaChwYXJzZUludChyLDE2KSkscj0iIik7cmV0dXJuIHR9cmV0dXJuIGUubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gcGFyc2VJbnQoZSwxNil9KSl9ZnVuY3Rpb24gb2UoZSx0KXtyZXR1cm4gTnVtYmVyKGUrIi4iK3QpfXZhciB1ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtyKHRoaXMsZSl9cmV0dXJuIG4oZSxudWxsLFt7a2V5OiJnZXRSYXRlSW5kZXhCeVJhdGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBlLkZSRVEuaW5kZXhPZih0KX19LHtrZXk6InBhcnNlQURUUyIsdmFsdWU6ZnVuY3Rpb24odCxyKXtmb3IodmFyIGE9dC5sZW5ndGgsbj0wO24rMjxhJiYoMjU1IT09dFtuXXx8MjQwIT0oMjQ2JnRbbisxXSkpOyluKys7aWYoIShuPj1hKSl7dmFyIGk9bixzPVtdLG89KDYwJnRbbisyXSk+Pj4yLHU9ZS5GUkVRW29dO2lmKCF1KXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzYW1wbGluZyBpbmRleDogIi5jb25jYXQobykpO2Zvcih2YXIgYyxsLGY9MSsoKDE5MiZ0W24rMl0pPj4+NiksZD0oMSZ0W24rMl0pPDwyfCgxOTImdFtuKzNdKT4+PjYsaD1lLl9nZXRDb25maWcobyxkLGYpLHA9aC5jb25maWcsdj1oLmNvZGVjLHk9MCxtPWUuZ2V0RnJhbWVEdXJhdGlvbih1KTtuKzc8YTspaWYoMjU1PT09dFtuXSYmMjQwPT0oMjQ2JnRbbisxXSkpe2lmKCEobD0oMyZ0W24rM10pPDwxMXx0W24rNF08PDN8KDIyNCZ0W24rNV0pPj41KXx8YS1uPGwpYnJlYWs7Yz0yKigxJn50W24rMV0pLHMucHVzaCh7cHRzOnIreSptLGRhdGE6dC5zdWJhcnJheShuKzcrYyxuK2wpfSkseSsrLG4rPWx9ZWxzZSBuKys7cmV0dXJue3NraXA6aSxyZW1haW5pbmc6bj49YT92b2lkIDA6dC5zdWJhcnJheShuKSxmcmFtZXM6cyxzYW1wbGluZ0ZyZXF1ZW5jeUluZGV4Om8sc2FtcGxlUmF0ZTp1LG9iamVjdFR5cGU6ZixjaGFubmVsQ291bnQ6ZCxjb2RlYzp2LGNvbmZpZzpwLG9yaWdpbkNvZGVjOiJtcDRhLjQwLiIuY29uY2F0KGYpfX19fSx7a2V5OiJwYXJzZUF1ZGlvU3BlY2lmaWNDb25maWciLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHQubGVuZ3RoKXt2YXIgcj10WzBdPj4+MyxhPSg3JnRbMF0pPDwxfHRbMV0+Pj43LG49KDEyMCZ0WzFdKT4+PjMsaT1lLkZSRVFbYV07aWYoaSl7dmFyIHM9ZS5fZ2V0Q29uZmlnKGEsbixyKTtyZXR1cm57c2FtcGxpbmdGcmVxdWVuY3lJbmRleDphLHNhbXBsZVJhdGU6aSxvYmplY3RUeXBlOnIsY2hhbm5lbENvdW50Om4sY29uZmlnOnMuY29uZmlnLGNvZGVjOnMuY29kZWMsb3JpZ2luQ29kZWM6Im1wNGEuNDAuIi5jb25jYXQocil9fX19fSx7a2V5OiJnZXRGcmFtZUR1cmF0aW9uIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06OWU0O3JldHVybiAxMDI0KnQvZX19LHtrZXk6Il9nZXRDb25maWciLHZhbHVlOmZ1bmN0aW9uKGUsdCxyKXt2YXIgYSxuLGk9W107cmV0dXJuIFE/ZT49Nj8oYT01LG49ZS0zKTooYT0yLG49ZSk6Sj8oYT0yLG49ZSk6KGE9NSxuPWUsZT49Nj9uPWUtMzoxPT09dCYmKGE9MixuPWUpKSxpWzBdPWE8PDMsaVswXXw9KDE0JmUpPj4xLGlbMV09KDEmZSk8PDcsaVsxXXw9dDw8Myw1PT09YSYmKGlbMV18PSgxNCZuKT4+MSxpWzJdPSgxJm4pPDw3LGlbMl18PTgsaVszXT0wKSx7Y29uZmlnOmksY29kZWM6Im1wNGEuNDAuIi5jb25jYXQoYSl9fX0se2tleToiZ2V0U2lsZW50RnJhbWUiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7aWYoIm1wNGEuNDAuMiI9PT1lKXtpZigxPT09dClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzAsMjAwLDAsMTI4LDM1LDEyOF0pO2lmKDI9PT10KXJldHVybiBuZXcgVWludDhBcnJheShbMzMsMCw3MywxNDQsMiwyNSwwLDM1LDEyOF0pO2lmKDM9PT10KXJldHVybiBuZXcgVWludDhBcnJheShbMCwyMDAsMCwxMjgsMzIsMTMyLDEsMzgsNjQsOCwxMDAsMCwxNDJdKTtpZig0PT09dClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzAsMjAwLDAsMTI4LDMyLDEzMiwxLDM4LDY0LDgsMTAwLDAsMTI4LDQ0LDEyOCw4LDIsNTZdKTtpZig1PT09dClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzAsMjAwLDAsMTI4LDMyLDEzMiwxLDM4LDY0LDgsMTAwLDAsMTMwLDQ4LDQsMTUzLDAsMzMsMTQ0LDIsNTZdKTtpZig2PT09dClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzAsMjAwLDAsMTI4LDMyLDEzMiwxLDM4LDY0LDgsMTAwLDAsMTMwLDQ4LDQsMTUzLDAsMzMsMTQ0LDIsMCwxNzgsMCwzMiw4LDIyNF0pfWVsc2V7aWYoMT09PXQpcmV0dXJuIG5ldyBVaW50OEFycmF5KFsxLDY0LDM0LDEyOCwxNjMsNzgsMjMwLDEyOCwxODYsOCwwLDAsMCwyOCw2LDI0MSwxOTMsMTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTAsOTRdKTtpZigyPT09dClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzEsNjQsMzQsMTI4LDE2Myw5NCwyMzAsMTI4LDE4Niw4LDAsMCwwLDAsMTQ5LDAsNiwyNDEsMTYxLDEwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDkwLDk0XSk7aWYoMz09PXQpcmV0dXJuIG5ldyBVaW50OEFycmF5KFsxLDY0LDM0LDEyOCwxNjMsOTQsMjMwLDEyOCwxODYsOCwwLDAsMCwwLDE0OSwwLDYsMjQxLDE2MSwxMCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5MCw5NF0pfX19XSksZX0oKTtpKHVlLCJGUkVRIixbOTZlMyw4ODIwMCw2NGUzLDQ4ZTMsNDQxMDAsMzJlMywyNGUzLDIyMDUwLDE2ZTMsMTJlMywxMTAyNSw4ZTMsNzM1MF0pO3ZhciBjZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtyKHRoaXMsZSl9cmV0dXJuIG4oZSxudWxsLFt7a2V5OiJwYXJzZUFubmV4QiIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ieXRlTGVuZ3RoLTEscj0wO2Rve2lmKDAhPT1lW3RdKWJyZWFrO3IrKyx0LS19d2hpbGUodD4wKTtyPj0zJiYoZT1lLnN1YmFycmF5KDAsdCsxKSk7Zm9yKHZhciBhPWUubGVuZ3RoLG49MixpPTA7bnVsbCE9PWVbbl0mJnZvaWQgMCE9PWVbbl0mJjEhPT1lW25dOyluKys7aWYoKGk9KytuKzIpPj1hKXJldHVybltdO2Zvcih2YXIgcz1bXTtpPGE7KXN3aXRjaChlW2ldKXtjYXNlIDA6aWYoMCE9PWVbaS0xXSl7aSs9MjticmVha31pZigwIT09ZVtpLTJdKXtpKys7YnJlYWt9aWYoaTxhLTEmJjEhPT1lW2krMV0pe2krKzticmVha31uIT09aS0yJiZzLnB1c2goZS5zdWJhcnJheShuLGktMikpO2Rve2krK313aGlsZSgxIT09ZVtpXSYmaTxhKTtpPShuPWkrMSkrMjticmVhaztjYXNlIDE6aWYoMCE9PWVbaS0xXXx8MCE9PWVbaS0yXSl7aSs9MzticmVha31uIT09aS0yJiZzLnB1c2goZS5zdWJhcnJheShuLGktMikpLGk9KG49aSsxKSsyO2JyZWFrO2RlZmF1bHQ6aSs9M31yZXR1cm4gbjxhJiZzLnB1c2goZS5zdWJhcnJheShuKSksc319LHtrZXk6InBhcnNlQXZjQyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjQ7aWYoIShlLmxlbmd0aDw0KSl7Zm9yKHZhciByLGE9ZS5sZW5ndGgsbj1bXSxpPTA7aSt0PGE7KWlmKHI9cmUoZSxpKSwzPT09dCYmKHI+Pj49OCksaSs9dCxyKXtpZihpK3I+YSlicmVhaztuLnB1c2goZS5zdWJhcnJheShpLGkrcikpLGkrPXJ9cmV0dXJuIG59fX0se2tleToicGFyc2VTRUkiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPWUubGVuZ3RoLGE9dD8yOjEsbj0wLGk9MCxzPSIiOzI1NT09PWVbYV07KW4rPTI1NSxhKys7Zm9yKG4rPWVbYSsrXTsyNTU9PT1lW2FdOylpKz0yNTUsYSsrO2lmKGkrPWVbYSsrXSw1PT09biYmcj5hKzE2KWZvcih2YXIgbz0wO288MTY7bysrKXMrPWVbYV0udG9TdHJpbmcoMTYpLGErKztyZXR1cm57cGF5bG9hZDplLnN1YmFycmF5KGEsYStpKSx0eXBlOm4sc2l6ZTppLHV1aWQ6c319fSx7a2V5OiJyZW1vdmVFUEIiLHZhbHVlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmJ5dGVMZW5ndGgscj1bXSxhPTE7YTx0LTI7KTA9PT1lW2FdJiYwPT09ZVthKzFdJiYzPT09ZVthKzJdPyhyLnB1c2goYSsyKSxhKz0yKTphKys7aWYoIXIubGVuZ3RoKXJldHVybiBlO3ZhciBuPXQtci5sZW5ndGgsaT1uZXcgVWludDhBcnJheShuKSxzPTA7Zm9yKGE9MDthPG47cysrLGErKylzPT09clswXSYmKHMrKyxyLnNoaWZ0KCkpLGlbYV09ZVtzXTtyZXR1cm4gaX19XSksZX0oKSxsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtyKHRoaXMsZSl9cmV0dXJuIG4oZSxudWxsLFt7a2V5OiJwYXJzZUFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkIix2YWx1ZTpmdW5jdGlvbih0KXtpZighKHQubGVuZ3RoPDcpKXtmb3IodmFyIHIsYSxuPTErKDMmdFs0XSksaT1bXSxzPVtdLG89Nix1PTMxJnRbNV0sYz0wO2M8dTtjKyspaWYoYT10W29dPDw4fHRbbysxXSxvKz0yLGEpe3ZhciBsPXQuc3ViYXJyYXkobyxvK2EpO28rPWEsaS5wdXNoKGwpLHJ8fChyPWUucGFyc2VTUFMoY2UucmVtb3ZlRVBCKGwpKSl9dmFyIGYsZD10W29dO28rKztmb3IodmFyIGg9MDtoPGQ7aCsrKWY9dFtvXTw8OHx0W28rMV0sbys9MixmJiYocy5wdXNoKHQuc3ViYXJyYXkobyxvK2YpKSxvKz1mKTtyZXR1cm57c3BzOnIsc3BzQXJyOmkscHBzQXJyOnMsbmFsVW5pdFNpemU6bn19fX0se2tleToicGFyc2VTUFMiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBLKGUpO3QucmVhZFVCeXRlKCk7dmFyIHI9dC5yZWFkVUJ5dGUoKSxhPXQucmVhZFVCeXRlKCksbj10LnJlYWRVQnl0ZSgpO3Quc2tpcFVFRygpO3ZhciBpPTQyMDtpZigxMDA9PT1yfHwxMTA9PT1yfHwxMjI9PT1yfHwyNDQ9PT1yfHw0ND09PXJ8fDgzPT09cnx8ODY9PT1yfHwxMTg9PT1yfHwxMjg9PT1yfHwxMzg9PT1yfHwxNDQ9PT1yKXt2YXIgcz10LnJlYWRVRUcoKTtpZihzPD0zJiYoaT1bMCw0MjAsNDIyLDQ0NF1bc10pLDM9PT1zJiZ0LnNraXBCaXRzKDEpLHQuc2tpcFVFRygpLHQuc2tpcFVFRygpLHQuc2tpcEJpdHMoMSksdC5yZWFkQm9vbCgpKWZvcih2YXIgbz0zIT09cz84OjEyLHU9MDt1PG87dSsrKXQucmVhZEJvb2woKSYmKHU8Nj90LnNraXBTY2FsaW5nTGlzdCgxNik6dC5za2lwU2NhbGluZ0xpc3QoNjQpKX10LnNraXBVRUcoKTt2YXIgYz10LnJlYWRVRUcoKTtpZigwPT09Yyl0LnJlYWRVRUcoKTtlbHNlIGlmKDE9PT1jKXt0LnNraXBCaXRzKDEpLHQuc2tpcFVFRygpLHQuc2tpcFVFRygpO2Zvcih2YXIgbD10LnJlYWRVRUcoKSxmPTA7ZjxsO2YrKyl0LnNraXBVRUcoKX10LnNraXBVRUcoKSx0LnNraXBCaXRzKDEpO3ZhciBkPXQucmVhZFVFRygpLGg9dC5yZWFkVUVHKCkscD10LnJlYWRCaXRzKDEpOzA9PT1wJiZ0LnNraXBCaXRzKDEpLHQuc2tpcEJpdHMoMSk7dmFyIHYseSxtLGcsayxiPTAsXz0wLHc9MCx4PTA7aWYodC5yZWFkQm9vbCgpJiYoYj10LnJlYWRVRUcoKSxfPXQucmVhZFVFRygpLHc9dC5yZWFkVUVHKCkseD10LnJlYWRVRUcoKSksdC5yZWFkQm9vbCgpKXtpZih0LnJlYWRCb29sKCkpc3dpdGNoKHQucmVhZFVCeXRlKCkpe2Nhc2UgMTp2PVsxLDFdO2JyZWFrO2Nhc2UgMjp2PVsxMiwxMV07YnJlYWs7Y2FzZSAzOnY9WzEwLDExXTticmVhaztjYXNlIDQ6dj1bMTYsMTFdO2JyZWFrO2Nhc2UgNTp2PVs0MCwzM107YnJlYWs7Y2FzZSA2OnY9WzI0LDExXTticmVhaztjYXNlIDc6dj1bMjAsMTFdO2JyZWFrO2Nhc2UgODp2PVszMiwxMV07YnJlYWs7Y2FzZSA5OnY9WzgwLDMzXTticmVhaztjYXNlIDEwOnY9WzE4LDExXTticmVhaztjYXNlIDExOnY9WzE1LDExXTticmVhaztjYXNlIDEyOnY9WzY0LDMzXTticmVhaztjYXNlIDEzOnY9WzE2MCw5OV07YnJlYWs7Y2FzZSAxNDp2PVs0LDNdO2JyZWFrO2Nhc2UgMTU6dj1bMywyXTticmVhaztjYXNlIDE2OnY9WzIsMV07YnJlYWs7Y2FzZSAyNTU6dj1bdC5yZWFkVUJ5dGUoKTw8OHx0LnJlYWRVQnl0ZSgpLHQucmVhZFVCeXRlKCk8PDh8dC5yZWFkVUJ5dGUoKV19aWYodC5yZWFkQm9vbCgpJiZ0LnJlYWRCb29sKCksdC5yZWFkQm9vbCgpJiYodC5yZWFkQml0cyg0KSx0LnJlYWRCb29sKCkmJnQucmVhZEJpdHMoMjQpKSx0LnJlYWRCb29sKCkmJih0LnJlYWRVRUcoKSx0LnJlYWRVRUcoKSksdC5yZWFkQm9vbCgpKXt2YXIgUz10LnJlYWRCaXRzKDMyKSxEPXQucmVhZEJpdHMoMzIpO3k9dC5yZWFkQm9vbCgpLGs9KG09RCkvKGc9MipTKX19cmV0dXJue2NvZGVjOm5lKGUuc3ViYXJyYXkoMSw0KSkscHJvZmlsZUlkYzpyLHByb2ZpbGVDb21wYXRpYmlsaXR5OmEsbGV2ZWxJZGM6bixjaHJvbWFGb3JtYXQ6aSx3aWR0aDpNYXRoLmNlaWwoMTYqKGQrMSktMiooYitfKSksaGVpZ2h0OigyLXApKihoKzEpKjE2LShwPzI6NCkqKHcreCksc2FyUmF0aW86dixmcHNOdW06bSxmcHNEZW46ZyxmcHM6ayxmaXhlZEZyYW1lOnl9fX1dKSxlfSgpLGZlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3IodGhpcyxlKX1yZXR1cm4gbihlLG51bGwsW3trZXk6InBhcnNlSEVWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoISh0Lmxlbmd0aDwyMykpe3I9cnx8e307Zm9yKHZhciBhLG4saSxzLG8sdT0xKygzJnRbMjFdKSxjPVtdLGw9W10sZj1bXSxkPTIzLGg9dFsyMl0scD0wO3A8aDtwKyspe2k9NjMmdFtkXSxzPXRbZCsxXTw8OHx0W2QrMl0sZCs9Mztmb3IodmFyIHY9MDt2PHM7disrKWlmKG89dFtkXTw8OHx0W2QrMV0sZCs9MixvKXtzd2l0Y2goaSl7Y2FzZSAzMjp2YXIgeT10LnN1YmFycmF5KGQsZCtvKTthfHwoYT1lLnBhcnNlVlBTKGNlLnJlbW92ZUVQQih5KSxyKSksZi5wdXNoKHkpO2JyZWFrO2Nhc2UgMzM6dmFyIG09dC5zdWJhcnJheShkLGQrbyk7bnx8KG49ZS5wYXJzZVNQUyhjZS5yZW1vdmVFUEIobSkscikpLGMucHVzaChtKTticmVhaztjYXNlIDM0OmwucHVzaCh0LnN1YmFycmF5KGQsZCtvKSl9ZCs9b319cmV0dXJue2h2Y0M6cixzcHM6bixzcHNBcnI6YyxwcHNBcnI6bCx2cHNBcnI6ZixuYWxVbml0U2l6ZTp1fX19fSx7a2V5OiJwYXJzZVZQUyIsdmFsdWU6ZnVuY3Rpb24odCxyKXtyPXJ8fHt9O3ZhciBhPW5ldyBLKHQpO2EucmVhZFVCeXRlKCksYS5yZWFkVUJ5dGUoKSxhLnJlYWRCaXRzKDEyKTt2YXIgbj1hLnJlYWRCaXRzKDMpO3JldHVybiByLm51bVRlbXBvcmFsTGF5ZXJzPU1hdGgubWF4KHIubnVtVGVtcG9yYWxMYXllcnN8fDAsbisxKSxhLnJlYWRCaXRzKDE3KSxlLl9wYXJzZVByb2ZpbGVUaWVyTGV2ZWwoYSxuLHIpLHJ9fSx7a2V5OiJwYXJzZVNQUyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O3I9cnx8e307dmFyIGE9bmV3IEsodCk7YS5yZWFkVUJ5dGUoKSxhLnJlYWRVQnl0ZSgpLGEucmVhZEJpdHMoNCk7dmFyIG49YS5yZWFkQml0cygzKTtyLm51bVRlbXBvcmFsTGF5ZXJzPU1hdGgubWF4KG4rMSxyLm51bVRlbXBvcmFsTGF5ZXJzfHwwKSxyLnRlbXBvcmFsSWROZXN0ZWQ9YS5yZWFkQml0cygxKSxlLl9wYXJzZVByb2ZpbGVUaWVyTGV2ZWwoYSxuLHIpLGEucmVhZFVFRygpO3ZhciBpPXIuY2hyb21hRm9ybWF0SWRjPWEucmVhZFVFRygpLHM9NDIwO2k8PTMmJihzPVswLDQyMCw0MjIsNDQ0XVtpXSk7dmFyIG89MDszPT09aSYmKG89YS5yZWFkQml0cygxKSk7dmFyIHUsYyxsLGYsZD1hLnJlYWRVRUcoKSxoPWEucmVhZFVFRygpLHA9YS5yZWFkQml0cygxKTtpZigxPT09cCYmKHU9YS5yZWFkVUVHKCksYz1hLnJlYWRVRUcoKSxsPWEucmVhZFVFRygpLGY9YS5yZWFkVUVHKCkpLHIuYml0RGVwdGhMdW1hTWludXM4PWEucmVhZFVFRygpLHIuYml0RGVwdGhDaHJvbWFNaW51czg9YS5yZWFkVUVHKCksMT09PXApe3ZhciB2PTEhPT1pJiYyIT09aXx8MCE9PW8/MToyLHk9MT09PWkmJjA9PT1vPzI6MTtkLT12KihjK3UpLGgtPXkqKGYrbCl9cmV0dXJue2NvZGVjOiJoZXYxLjEuNi5MOTMuQjAiLHdpZHRoOmQsaGVpZ2h0OmgsY2hyb21hRm9ybWF0OnMsaHZjQzpyfX19LHtrZXk6Il9wYXJzZVByb2ZpbGVUaWVyTGV2ZWwiLHZhbHVlOmZ1bmN0aW9uKGUsdCxyKXt2YXIgYT1yLmdlbmVyYWxUaWVyRmxhZ3x8MDtyLmdlbmVyYWxQcm9maWxlU3BhY2U9ZS5yZWFkQml0cygyKSxyLmdlbmVyYWxUaWVyRmxhZz1NYXRoLm1heChlLnJlYWRCaXRzKDEpLGEpLHIuZ2VuZXJhbFByb2ZpbGVJZGM9TWF0aC5tYXgoZS5yZWFkQml0cyg1KSxyLmdlbmVyYWxQcm9maWxlSWRjfHwwKSxyLmdlbmVyYWxQcm9maWxlQ29tcGF0aWJpbGl0eUZsYWdzPWUucmVhZEJpdHMoMzIpLHIuZ2VuZXJhbENvbnN0cmFpbnRJbmRpY2F0b3JGbGFncz1bZS5yZWFkQml0cyg4KSxlLnJlYWRCaXRzKDgpLGUucmVhZEJpdHMoOCksZS5yZWFkQml0cyg4KSxlLnJlYWRCaXRzKDgpLGUucmVhZEJpdHMoOCldO3ZhciBuPWUucmVhZEJpdHMoOCk7YTxyLmdlbmVyYWxUaWVyRmxhZz9yLmdlbmVyYWxMZXZlbElkYz1uOnIuZ2VuZXJhbExldmVsSWRjPU1hdGgubWF4KG4sci5nZW5lcmFsTGV2ZWxJZGN8fDApO3ZhciBpPVtdLHM9W107aWYodD5lLmJpdHNBdmFpbGFibGUpdGhyb3cgbmV3IEVycm9yKCJtYXhTdWJMYXllcnNNaW51cyBpbmF2bGlkIHNpemUgIi5jb25jYXQodCkpO2Zvcih2YXIgbz0wO288dDtvKyspaVtvXT1lLnJlYWRCaXRzKDEpLHNbb109ZS5yZWFkQml0cygxKTt0PjAmJmUucmVhZEJpdHMoMiooOC10KSk7Zm9yKHZhciB1PTA7dTx0O3UrKykwIT09aVt1XSYmKGUucmVhZEJpdHMoMiksZS5yZWFkQml0cygxKSxlLnJlYWRCaXRzKDUpLGUucmVhZEJpdHMoMTYpLGUucmVhZEJpdHMoMTYpLGUucmVhZEJpdHMoNCksZS5yZWFkQml0cygxNiksZS5yZWFkQml0cygxNiksZS5yZWFkQml0cygxMikpLDAhPT1zW3VdJiZlLnJlYWRCaXRzKDgpfX1dKSxlfSgpLGRlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3IodGhpcyxlKX1yZXR1cm4gbihlLG51bGwsW3trZXk6ImdldEZyYW1lRHVyYXRpb24iLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiAyMH19LHtrZXk6InBhcnNlSGVhZGVyUGFja2V0cyIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYoZS5sZW5ndGgpe2Zvcih2YXIgdD1uZXcgRGF0YVZpZXcoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCkscj0iIixhPTA7YTw4O2ErKylyKz1TdHJpbmcuZnJvbUNvZGVQb2ludChlW2FdKTtpZigiT3B1c0hlYWQiIT09cil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgT3B1cyBNYWdpY1NpZ25hdHVyZSIpO3ZhciBuPWVbOV07Y29uc29sZS5sb2coIlByZS1za2lwIixlWzEwXSxlWzExXSk7dmFyIGk9dC5nZXRVaW50MzIoMTIsITApLHM9dC5nZXRJbnQxNigxNiwhMCk7aWYoaSl7cmV0dXJue291dHB1dEdhaW46cyxzYW1wbGVSYXRlOmksY2hhbm5lbENvdW50Om4sY29uZmlnOm5ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCs4LGUuYnl0ZUxlbmd0aC04KSxjb2RlYzoib3B1cyIsb3JpZ2luQ29kZWM6Im9wdXMifX19fX1dKSxlfSgpLGhlPTFlMyxwZT01ZTMsdmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsYSxuKXtyKHRoaXMsZSksdGhpcy52aWRlb1RyYWNrPXQsdGhpcy5hdWRpb1RyYWNrPWEsdGhpcy5tZXRhZGF0YVRyYWNrPW4sdGhpcy5fYmFzZUR0cz0tMSx0aGlzLl9iYXNlRHRzSW5pdGVkPSExLHRoaXMuX2F1ZGlvTmV4dFB0cz12b2lkIDAsdGhpcy5fdmlkZW9OZXh0RHRzPXZvaWQgMCx0aGlzLl9hdWRpb1RpbWVzdGFtcEJyZWFrPTAsdGhpcy5fdmlkZW9UaW1lc3RhbXBCcmVhaz0wLHRoaXMuX2xhc3RWaWRlb0R1cmF0aW9uPTAsdGhpcy5fa2V5RnJhbWVJbk5leHRDaHVuaz0hMSx0aGlzLl9sYXN0QXVkaW9FeGNlcHRpb25HYXBEb3Q9LTEvMCx0aGlzLl9sYXN0QXVkaW9FeGNlcHRpb25PdmVybGFwRG90PS0xLzAsdGhpcy5fbGFzdEF1ZGlvRXhjZXB0aW9uTGFyZ2VHYXBEb3Q9LTEvMCx0aGlzLl9sYXN0VmlkZW9FeGNlcHRpb25MYXJnZUdhcERvdD0tMS8wLHRoaXMuX2xhc3RWaWRlb0V4Y2VwdGlvbkNodW5rRmlyc3REdHNEb3Q9LTEvMH1yZXR1cm4gbihlLFt7a2V5OiJmaXgiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTowLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxhPSEoYXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0pfHxhcmd1bWVudHNbMl07dD1NYXRoLnJvdW5kKDFlMyp0KTt2YXIgbj10aGlzLnZpZGVvVHJhY2ssaT10aGlzLmF1ZGlvVHJhY2s7IXImJmF8fCh0aGlzLl92aWRlb0xhc3RTYW1wbGU9bnVsbCx0aGlzLl9hdWRpb05leHRQdHM9dm9pZCAwLHRoaXMuX3ZpZGVvTmV4dER0cz12b2lkIDAsdGhpcy5fYXVkaW9UaW1lc3RhbXBCcmVhaz0wLHRoaXMuX3ZpZGVvVGltZXN0YW1wQnJlYWs9MCx0aGlzLl9sYXN0QXVkaW9FeGNlcHRpb25HYXBEb3Q9LTEvMCx0aGlzLl9sYXN0QXVkaW9FeGNlcHRpb25PdmVybGFwRG90PS0xLzAsdGhpcy5fbGFzdEF1ZGlvRXhjZXB0aW9uTGFyZ2VHYXBEb3Q9LTEvMCx0aGlzLl9sYXN0VmlkZW9FeGNlcHRpb25MYXJnZUdhcERvdD0tMS8wLHRoaXMuX2xhc3RWaWRlb0V4Y2VwdGlvbkNodW5rRmlyc3REdHNEb3Q9LTEvMCksciYmIWEmJih0aGlzLl9iYXNlRHRzSW5pdGVkPSExKSx0aGlzLl9iYXNlRHRzSW5pdGVkfHx0aGlzLl9jYWxjdWxhdGVCYXNlRHRzKGksbiksIWEmJnQmJih0aGlzLl9hdWRpb05leHRQdHM9dGhpcy5fdmlkZW9OZXh0RHRzPXQpO3ZhciBzPXRoaXMuX2Jhc2VEdHNJbml0ZWQmJih0aGlzLl92aWRlb1RpbWVzdGFtcEJyZWFrfHwhdGhpcy52aWRlb1RyYWNrLmV4aXN0KCkpJiYodGhpcy5fYXVkaW9UaW1lc3RhbXBCcmVha3x8IXRoaXMuYXVkaW9UcmFjay5leGlzdCgpKTtpZihzJiZ0aGlzLl9yZXNldEJhc2VEdHNXaGVuU3RyZWFtQnJlYWtlZCgpLHRoaXMuX2ZpeEF1ZGlvKGkpLHRoaXMuX2tleUZyYW1lSW5OZXh0Q2h1bms9ITEsdGhpcy5fZml4VmlkZW8obiksdGhpcy5tZXRhZGF0YVRyYWNrLmV4aXN0KCkpe3ZhciBvPXRoaXMubWV0YWRhdGFUcmFjay50aW1lc2NhbGU7dGhpcy5tZXRhZGF0YVRyYWNrLnNlaVNhbXBsZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5wdHM9dC5vcmlnaW5QdHMtZS5fYmFzZUR0cyx0LnRpbWU9TWF0aC5tYXgoMCx0LnB0cykvb30pKSx0aGlzLm1ldGFkYXRhVHJhY2suZmx2U2NyaXB0U2FtcGxlcy5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnB0cz10Lm9yaWdpblB0cy1lLl9iYXNlRHRzLHQudGltZT1NYXRoLm1heCgwLHQucHRzKS9vfSkpfW4uc2FtcGxlcy5sZW5ndGgmJihuLmJhc2VNZWRpYURlY29kZVRpbWU9bi5zYW1wbGVzWzBdLmR0cyksaS5zYW1wbGVzLmxlbmd0aCYmKGkuYmFzZU1lZGlhRGVjb2RlVGltZT1pLnNhbXBsZXNbMF0ucHRzKmkudGltZXNjYWxlLzFlMyl9fSx7a2V5OiJfZml4VmlkZW8iLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMscj1lLnNhbXBsZXM7aWYoci5sZW5ndGgpe3ZhciBhO2lmKHIuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5kdHMtPXQuX2Jhc2VEdHMsZS5wdHMtPXQuX2Jhc2VEdHMsZS5rZXlmcmFtZSYmKHQuX2tleUZyYW1lSW5OZXh0Q2h1bms9ITApfSkpLGUuZnBzTnVtJiZlLmZwc0RlbilhPWUudGltZXNjYWxlKihlLmZwc0Rlbi9lLmZwc051bSk7ZWxzZSBpZihlLmxlbmd0aD4xKXt2YXIgbj1lLnNhbXBsZXNbMF0saT1lLnNhbXBsZXNbci5sZW5ndGgtMV07YT1NYXRoLmZsb29yKChpLmR0cy1uLmR0cykvKHIubGVuZ3RoLTEpKX1lbHNlIGE9dGhpcy5fbGFzdFZpZGVvRHVyYXRpb258fDQwO3ZhciBzPXIucG9wKCk7aWYodGhpcy5fdmlkZW9MYXN0U2FtcGxlJiZyLnVuc2hpZnQodGhpcy5fdmlkZW9MYXN0U2FtcGxlKSx0aGlzLl92aWRlb0xhc3RTYW1wbGU9cyxyLmxlbmd0aCl7aWYodm9pZCAwPT09dGhpcy5fdmlkZW9OZXh0RHRzKXt2YXIgbz1yWzBdO3RoaXMuX3ZpZGVvTmV4dER0cz1vLmR0c312YXIgdT1yLmxlbmd0aCxjPTAsbD1yWzBdLGY9dGhpcy5fdmlkZW9OZXh0RHRzLWwuZHRzO2lmKE1hdGguYWJzKGYpPjIwMCl7dmFyIGQ7aWYoTWF0aC5hYnMobC5kdHMtdGhpcy5fbGFzdFZpZGVvRXhjZXB0aW9uQ2h1bmtGaXJzdER0c0RvdCk+NWUzKXRoaXMuX2xhc3RWaWRlb0V4Y2VwdGlvbkNodW5rRmlyc3REdHNEb3Q9bC5kdHMsZS53YXJuaW5ncy5wdXNoKHt0eXBlOkksbmV4dER0czp0aGlzLl92aWRlb05leHREdHMsZmlyc3RTYW1wbGVEdHM6bC5kdHMsbmV4dFNhbXBsZUR0czpudWxsPT09KGQ9clsxXSl8fHZvaWQgMD09PWQ/dm9pZCAwOmQuZHRzLHNhbXBsZUR1cmF0aW9uOmZ9KTt0aGlzLl92aWRlb1RpbWVzdGFtcEJyZWFrPj01Pyh0aGlzLl92aWRlb05leHREdHM9bC5kdHMsdGhpcy5fdmlkZW9UaW1lc3RhbXBCcmVhaz0wKToobC5kdHMrPWYsbC5wdHMrPWYsdGhpcy5hdWRpb1RyYWNrLmV4aXN0KCl8fCh0aGlzLl92aWRlb1RpbWVzdGFtcEJyZWFrPTEpKX1mb3IodmFyIGg9MDtoPHU7aCsrKXt2YXIgcD1yW2hdLmR0cyx2PXJbaCsxXTsoKGM9aDx1LTE/di5kdHMtcDpzP3MuZHRzLXA6YSk+MWUzfHxjPDApJiYodGhpcy5fdmlkZW9UaW1lc3RhbXBCcmVhaysrLE1hdGguYWJzKHAtdGhpcy5fbGFzdFZpZGVvRXhjZXB0aW9uTGFyZ2VHYXBEb3QpPjVlMyYmKHRoaXMuX2xhc3RWaWRlb0V4Y2VwdGlvbkxhcmdlR2FwRG90PXAsZS53YXJuaW5ncy5wdXNoKHt0eXBlOlAsdGltZTpwL2UudGltZXNjYWxlLGR0czpwLG9yaWdpbkR0czpyW2hdLm9yaWdpbkR0cyxuZXh0RHRzOnRoaXMuX3ZpZGVvTmV4dER0cyxzYW1wbGVEdXJhdGlvbjpjLHJlZlNhbXBsZUR1cmF0aW9uOmF9KSksYz1hKSxyW2hdLmR1cmF0aW9uPWMsdGhpcy5fdmlkZW9OZXh0RHRzKz1jLHRoaXMuX2xhc3RWaWRlb0R1cmF0aW9uPWN9fX19fSx7a2V5OiJfZml4QXVkaW8iLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMscj1lLnNhbXBsZXM7ci5sZW5ndGgmJihyLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuZHRzPWUucHRzLT10Ll9iYXNlRHRzfSkpLHRoaXMuX2RvRml4QXVkaW9JbnRlcm5hbChlLHIsMWUzKSl9fSx7a2V5OiJfY2FsY3VsYXRlQmFzZUR0cyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgcj1lLnNhbXBsZXMsYT10LnNhbXBsZXM7aWYoIXIubGVuZ3RoJiYhYS5sZW5ndGgpcmV0dXJuITE7dmFyIG49MS8wLGk9MS8wO3IubGVuZ3RoJiYoZS5iYXNlRHRzPW49clswXS5wdHMpLGEubGVuZ3RoJiYodC5iYXNlRHRzPWk9YVswXS5kdHMpLHRoaXMuX2Jhc2VEdHM9TWF0aC5taW4obixpKTt2YXIgcz1pLW47cmV0dXJuIE51bWJlci5pc0Zpbml0ZShzKSYmTWF0aC5hYnMocyk+NTAwJiZ0Lndhcm5pbmdzLnB1c2goe3R5cGU6Qyx2aWRlb0Jhc2VEdHM6aSxhdWRpb0Jhc2VQdHM6bixiYXNlRHRzOnRoaXMuX2Jhc2VEdHMsZGVsdGE6c30pLHRoaXMuX2Jhc2VEdHNJbml0ZWQ9ITAsITB9fSx7a2V5OiJfcmVzZXRCYXNlRHRzV2hlblN0cmVhbUJyZWFrZWQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5fY2FsY3VsYXRlQmFzZUR0cyh0aGlzLmF1ZGlvVHJhY2ssdGhpcy52aWRlb1RyYWNrKSYmKHRoaXMuYXVkaW9UcmFjay5leGlzdCgpP3RoaXMudmlkZW9UcmFjay5leGlzdCgpP3RoaXMuX2Jhc2VEdHMtPU1hdGgubWluKHRoaXMuX2F1ZGlvTmV4dFB0cyx0aGlzLl92aWRlb05leHREdHMpOnRoaXMuX2Jhc2VEdHMtPXRoaXMuX2F1ZGlvTmV4dFB0czp0aGlzLl9iYXNlRHRzLT10aGlzLl92aWRlb05leHREdHMsdGhpcy5fdmlkZW9UaW1lc3RhbXBCcmVhaz0wLHRoaXMuX2F1ZGlvVGltZXN0YW1wQnJlYWs9MCl9fSx7a2V5OiJfZG9GaXhBdWRpb0ludGVybmFsIix2YWx1ZTpmdW5jdGlvbihlLHQscil7aWYoIWUuc2FtcGxlRHVyYXRpb24pc3dpdGNoKGUuY29kZWNUeXBlKXtjYXNlIEE6ZS5zYW1wbGVEdXJhdGlvbj11ZS5nZXRGcmFtZUR1cmF0aW9uKGUudGltZXNjYWxlLHIpO2JyZWFrO2Nhc2UgRTplLnNhbXBsZUR1cmF0aW9uPWRlLmdldEZyYW1lRHVyYXRpb24oZS5zYW1wbGVzLHIpO2JyZWFrO2Nhc2UgVDpjYXNlIEI6ZS5zYW1wbGVEdXJhdGlvbj10aGlzLl9nZXRHNzExRHVyYXRpb24oZSk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmVycm9yKCJjYW4ndCBmaXggYXVkaW8gY29kZWNUeXBlOiIsZS5jb2RlY1R5cGUpfXZhciBhPWUuc2FtcGxlRHVyYXRpb24sbj1lLmNvZGVjVHlwZT09PUU/MjA6ZS5jb2RlY1R5cGU9PT1BPzEwMjQ6YSplLnRpbWVzY2FsZS8xZTM7aWYodm9pZCAwPT09dGhpcy5fYXVkaW9OZXh0UHRzKXt2YXIgaT10WzBdO3RoaXMuX2F1ZGlvTmV4dFB0cz1pLnB0c31mb3IodmFyIHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIG89dGhpcy5fYXVkaW9OZXh0UHRzLHU9dFtzXSxjPXUucHRzLW87aWYoMD09PXMmJnRoaXMuX2F1ZGlvVGltZXN0YW1wQnJlYWs+PTUmJnRoaXMuX2tleUZyYW1lSW5OZXh0Q2h1bmsmJihvPXRoaXMuX2F1ZGlvTmV4dFB0cz11LmR0cyxjPTAsdGhpcy5fYXVkaW9UaW1lc3RhbXBCcmVhaz0wKSwhdGhpcy5fYXVkaW9UaW1lc3RhbXBCcmVhayYmYz49MyphJiZjPD1oZSYmIVope3ZhciBsPXRoaXMuX2dldFNpbGVudEZyYW1lKGUpfHx0WzBdLmRhdGEuc3ViYXJyYXkoKSxmPU1hdGguZmxvb3IoYy9hKTtNYXRoLmFicyh1LnB0cy10aGlzLl9sYXN0QXVkaW9FeGNlcHRpb25HYXBEb3QpPnBlJiYodGhpcy5fbGFzdEF1ZGlvRXhjZXB0aW9uR2FwRG90PXUucHRzLGUud2FybmluZ3MucHVzaCh7dHlwZTp6LHB0czp1LnB0cyxvcmlnaW5QdHM6dS5vcmlnaW5QdHMsY291bnQ6ZixuZXh0UHRzOm8scmVmU2FtcGxlRHVyYXRpb246YX0pKTtmb3IodmFyIGQ9MDtkPGY7ZCsrKXt2YXIgaD1uZXcgRihNYXRoLmZsb29yKHRoaXMuX2F1ZGlvTmV4dFB0cythKS1NYXRoLmZsb29yKHRoaXMuX2F1ZGlvTmV4dFB0cyksbCxuKTtoLm9yaWdpblB0cz1NYXRoLmZsb29yKHRoaXMuX2Jhc2VEdHMrbyksdC5zcGxpY2UocywwLGgpLHRoaXMuX2F1ZGlvTmV4dFB0cys9YSxzKyt9cy0tfWVsc2UgaWYoYzw9LTMqYSYmYz49LTFlMylNYXRoLmFicyh1LnB0cy10aGlzLl9sYXN0QXVkaW9FeGNlcHRpb25PdmVybGFwRG90KT5wZSYmKHRoaXMuX2xhc3RBdWRpb0V4Y2VwdGlvbk92ZXJsYXBEb3Q9dS5wdHMsZS53YXJuaW5ncy5wdXNoKHt0eXBlOk8scHRzOnUucHRzLG9yaWdpblB0czp1Lm9yaWdpblB0cyxuZXh0UHRzOm8scmVmU2FtcGxlRHVyYXRpb246YX0pKSx0LnNwbGljZShzLDEpLHMtLTtlbHNle2lmKE1hdGguYWJzKGMpPmhlJiYodGhpcy5fYXVkaW9UaW1lc3RhbXBCcmVhaysrLE1hdGguYWJzKHUucHRzLXRoaXMuX2xhc3RBdWRpb0V4Y2VwdGlvbkxhcmdlR2FwRG90KT5wZSYmKHRoaXMuX2xhc3RBdWRpb0V4Y2VwdGlvbkxhcmdlR2FwRG90PXUucHRzLGUud2FybmluZ3MucHVzaCh7dHlwZTpNLHRpbWU6dS5wdHMvMWUzLHB0czp1LnB0cyxvcmlnaW5QdHM6dS5vcmlnaW5QdHMsbmV4dFB0czpvLHNhbXBsZUR1cmF0aW9uOmMscmVmU2FtcGxlRHVyYXRpb246YX0pKSksZS5jb2RlY1R5cGU9PT1FKXt2YXIgcD10W3QubGVuZ3RoLTFdO3AmJihwLmR1cmF0aW9uPXUucHRzLXAucHRzKX1lbHNlIHUuZHRzPXUucHRzPW8sdS5kdXJhdGlvbj1uO3RoaXMuX2F1ZGlvTmV4dFB0cys9YX19fX0se2tleToiX2dldEc3MTFEdXJhdGlvbiIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zYW1wbGVTaXplLHI9ZS5jaGFubmVsQ291bnQsYT1lLnNhbXBsZVJhdGUsbj1lLnNhbXBsZXNbMF07aWYobilyZXR1cm4gMipuLmRhdGEuYnl0ZUxlbmd0aC9yLyh0LzgpL2EqMWUzfX0se2tleToiX2dldFNpbGVudEZyYW1lIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5jb2RlY1R5cGU9PT1BP3VlLmdldFNpbGVudEZyYW1lKGUuY29kZWMsZS5jaGFubmVsQ291bnQpOm5ldyBVaW50OEFycmF5KDgqZS5zYW1wbGVEdXJhdGlvbiplLmNoYW5uZWxDb3VudCl9fV0pLGV9KCkseWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7cih0aGlzLGUpfXJldHVybiBuKGUsbnVsbCxbe2tleToicGFyc2UiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCEodC5sZW5ndGg8Mykpe3ZhciByPXt9LGE9ZS5fcGFyc2VWYWx1ZShuZXcgRGF0YVZpZXcodC5idWZmZXIsdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCkpLG49ZS5fcGFyc2VWYWx1ZShuZXcgRGF0YVZpZXcodC5idWZmZXIsdC5ieXRlT2Zmc2V0K2Euc2l6ZSx0LmJ5dGVMZW5ndGgtYS5zaXplKSk7cmV0dXJuIHJbYS5kYXRhXT1uLmRhdGEscn19fSx7a2V5OiJfcGFyc2VWYWx1ZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIHIsYT10LmJ5dGVMZW5ndGgsbj0xLGk9ITE7c3dpdGNoKHQuZ2V0VWludDgoMCkpe2Nhc2UgMDpyPXQuZ2V0RmxvYXQ2NCgxKSxuKz04O2JyZWFrO2Nhc2UgMTpyPSEhdC5nZXRVaW50OCgxKSxuKz0xO2JyZWFrO2Nhc2UgMjp2YXIgcz1lLl9wYXJzZVN0cmluZyhuZXcgRGF0YVZpZXcodC5idWZmZXIsdC5ieXRlT2Zmc2V0K24sdC5ieXRlTGVuZ3RoLW4pKTtyPXMuZGF0YSxuKz1zLnNpemU7YnJlYWs7Y2FzZSAzOnI9e307dmFyIG89MDtmb3IoOT09KDE2Nzc3MjE1JnQuZ2V0VWludDMyKGEtNCkpJiYobz0zKTtuPGEtNDspe3ZhciB1PWUuX3BhcnNlT2JqZWN0KG5ldyBEYXRhVmlldyh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQrbix0LmJ5dGVMZW5ndGgtbi1vKSksYz11LnNpemUsbD11LmRhdGE7aWYodS5pc0VuZClicmVhaztyW2wubmFtZV09bC52YWx1ZSxuKz1jfWlmKG48PWEtMyk5PT09KDE2Nzc3MjE1JnQuZ2V0VWludDMyKG4tMSkpJiYobis9Myk7YnJlYWs7Y2FzZSA4OnI9e30sbis9NDt2YXIgZj0wO2Zvcig5PT0oMTY3NzcyMTUmdC5nZXRVaW50MzIoYS00KSkmJihmPTMpO248YS04Oyl7dmFyIGQ9ZS5fcGFyc2VPYmplY3QobmV3IERhdGFWaWV3KHQuYnVmZmVyLHQuYnl0ZU9mZnNldCtuLHQuYnl0ZUxlbmd0aC1uLWYpKSxoPWQuc2l6ZSxwPWQuZGF0YTtpZihkLmlzRW5kKWJyZWFrO3JbcC5uYW1lXT1wLnZhbHVlLG4rPWh9aWYobjw9YS0zKTk9PT0oMTY3NzcyMTUmdC5nZXRVaW50MzIobi0xKSkmJihuKz0zKTticmVhaztjYXNlIDk6cj12b2lkIDAsbj0xLGk9ITA7YnJlYWs7Y2FzZSAxMDpyPVtdO3ZhciB2PXQuZ2V0VWludDMyKDEpO24rPTQ7Zm9yKHZhciB5PTA7eTx2O3krKyl7dmFyIG09ZS5fcGFyc2VWYWx1ZShuZXcgRGF0YVZpZXcodC5idWZmZXIsdC5ieXRlT2Zmc2V0K24sdC5ieXRlTGVuZ3RoLW4pKSxnPW0uZGF0YSxrPW0uc2l6ZTtyLnB1c2goZyksbis9a31icmVhaztjYXNlIDExOnZhciBiPXQuZ2V0RmxvYXQ2NChuKSs2ZTQqdC5nZXRJbnQxNihuKzgpO3I9bmV3IERhdGUoYiksbis9MTA7YnJlYWs7Y2FzZSAxMjp2YXIgXz10LmdldFVpbnQzMigxKTtuKz00LHI9IiIsXz4wJiYocj1XLmRlY29kZShuZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQrbixfKSkpLG4rPV87YnJlYWs7ZGVmYXVsdDpuPWF9cmV0dXJue2RhdGE6cixzaXplOm4saXNFbmQ6aX19fSx7a2V5OiJfcGFyc2VTdHJpbmciLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0VWludDE2KDApLHI9IiI7cmV0dXJuIHQ+MCYmKHI9Vy5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0KzIsdCkpKSx7ZGF0YTpyLHNpemU6Mit0fX19LHtrZXk6Il9wYXJzZU9iamVjdCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoISh0LmJ5dGVMZW5ndGg8Mykpe3ZhciByPWUuX3BhcnNlU3RyaW5nKHQpLGE9ZS5fcGFyc2VWYWx1ZShuZXcgRGF0YVZpZXcodC5idWZmZXIsdC5ieXRlT2Zmc2V0K3Iuc2l6ZSx0LmJ5dGVMZW5ndGgtci5zaXplKSk7cmV0dXJue2RhdGE6e25hbWU6ci5kYXRhLHZhbHVlOmEuZGF0YX0sc2l6ZTpyLnNpemUrYS5zaXplLGlzRW5kOmEuaXNFbmR9fX19XSksZX0oKSxtZT03LGdlPTgsa2U9MTAsYmU9MTMsX2U9bmV3IHEoIkZsdkRlbXV4ZXIiKSx3ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxhLG4pe3IodGhpcyxlKSxpKHRoaXMsIl9oZWFkZXJQYXJzZWQiLCExKSxpKHRoaXMsIl9yZW1haW5pbmdEYXRhIixudWxsKSxpKHRoaXMsIl9nb3BJZCIsMCksaSh0aGlzLCJfbmVlZEFkZE1ldGFCZWZvcmVLZXlGcmFtZU5hbCIsITApLHRoaXMudmlkZW9UcmFjaz10fHxuZXcgUix0aGlzLmF1ZGlvVHJhY2s9YXx8bmV3IEwsdGhpcy5tZXRhZGF0YVRyYWNrPW58fG5ldyBILHRoaXMuX2ZpeGVyPW5ldyB2ZSh0aGlzLnZpZGVvVHJhY2ssdGhpcy5hdWRpb1RyYWNrLHRoaXMubWV0YWRhdGFUcmFjayl9cmV0dXJuIG4oZSxbe2tleToiZGVtdXgiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciByLGE9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxuPSEoYXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0pfHxhcmd1bWVudHNbMl0saT1hcmd1bWVudHMubGVuZ3RoPjM/YXJndW1lbnRzWzNdOnZvaWQgMCxzPXRoaXMuYXVkaW9UcmFjayxvPXRoaXMudmlkZW9UcmFjayx1PXRoaXMubWV0YWRhdGFUcmFjaztpZighYSYmbnx8KHRoaXMuX3JlbWFpbmluZ0RhdGE9bnVsbCksYSYmKHRoaXMuX2hlYWRlclBhcnNlZD0hMSksYT8oby5yZXNldCgpLHMucmVzZXQoKSx1LnJlc2V0KCkpOihvLnNhbXBsZXM9W10scy5zYW1wbGVzPVtdLHUuc2VpU2FtcGxlcz1bXSx1LmZsdlNjcmlwdFNhbXBsZXM9W10sby53YXJuaW5ncz1bXSxzLndhcm5pbmdzPVtdLHRoaXMuX3JlbWFpbmluZ0RhdGEmJih0PSQodGhpcy5fcmVtYWluaW5nRGF0YSx0KSx0aGlzLl9yZW1haW5pbmdEYXRhPW51bGwpKSwhdC5sZW5ndGgpcmV0dXJue3ZpZGVvVHJhY2s6byxhdWRpb1RyYWNrOnMsbWV0YWRhdGFUcmFjazp1fTt2YXIgYz0wO2lmKCF0aGlzLl9oZWFkZXJQYXJzZWQpe2lmKCFlLnByb2JlKHQpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBmbHYgZmlsZSIpO3MucHJlc2VudD0oNCZ0WzRdKT4+PjIhPTAsby5wcmVzZW50PTAhPSgxJnRbNF0pLHRoaXMuX2hlYWRlclBhcnNlZD0hMCxjPXJlKHQsNSkrNH1mb3IodmFyIGwsZixkLGgscCx2PXQubGVuZ3RoO2MrMTU8diYmKGw9dFtjXSwhKGMrMTUrKGY9dFtjKzFdPDwxNnx0W2MrMl08PDh8dFtjKzNdKT52KSk7KWQ9KHRbYys3XTw8MjQ+Pj4wKSsodFtjKzRdPDwxNikrKHRbYys1XTw8OCkrdFtjKzZdLGMrPTExLGg9dC5zdWJhcnJheShjLGMrZiksOD09PWw/dGhpcy5fcGFyc2VBdWRpbyhoLGQpOjk9PT1sPyhpJiYodGhpcy5zZWFtbGVzc0xvYWRpbmdTd2l0Y2hpbmc9ITApLHRoaXMuX3BhcnNlVmlkZW8oaCxkKSk6MTg9PT1sP3RoaXMuX3BhcnNlU2NyaXB0KGgsZCk6X2Uud2FybigiSW52YWxpZCB0YWcgdHlwZTogIi5jb25jYXQobCkpLChwPXJlKHQsYys9ZikpIT09MTErZiYmX2Uud2FybigiSW52YWxpZCBQcmV2VGFnU2l6ZSAiLmNvbmNhdChwLCIgKCIpLmNvbmNhdCgxMStmLCIpIikpLGMrPTQ7Yzx2JiYodGhpcy5fcmVtYWluaW5nRGF0YT10LnN1YmFycmF5KGMpKSxzLmZvcm1hdFRpbWVzY2FsZT1vLmZvcm1hdFRpbWVzY2FsZT1vLnRpbWVzY2FsZT11LnRpbWVzY2FsZT0xZTMscy50aW1lc2NhbGU9cy5jb2RlY1R5cGU9PT1FPzFlMzpzLnNhbXBsZVJhdGV8fDAsIXMuZXhpc3QoKSYmcy5oYXNTYW1wbGUoKSYmcy5yZXNldCgpLCFvLmV4aXN0KCkmJm8uaGFzU2FtcGxlKCkmJm8ucmVzZXQoKTt2YXIgeT11LmZsdlNjcmlwdFNhbXBsZXNbdS5mbHZTY3JpcHRTYW1wbGVzLmxlbmd0aC0xXSxtPW51bGw9PXl8fG51bGw9PT0ocj15LmRhdGEpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLm9uTWV0YURhdGE7cmV0dXJuIG0mJihudWxsIT1vJiZvLmV4aXN0KCkmJihtLmhhc093blByb3BlcnR5KCJkdXJhdGlvbiIpJiYoby5kdXJhdGlvbj0xZTMqbS5kdXJhdGlvbiksbS5oYXNPd25Qcm9wZXJ0eSgid2lkdGgiKSYmbS5oYXNPd25Qcm9wZXJ0eSgiaGVpZ2h0IikmJihvLndpZHRoPW0ud2lkdGgsby5oZWlnaHQ9bS5oZWlnaHQpKSxudWxsIT1zJiZzLmV4aXN0KCkmJm0uaGFzT3duUHJvcGVydHkoImR1cmF0aW9uIikmJihzLmR1cmF0aW9uPTFlMyptLmR1cmF0aW9uKSkse3ZpZGVvVHJhY2s6byxhdWRpb1RyYWNrOnMsbWV0YWRhdGFUcmFjazp1fX19LHtrZXk6ImZpeCIsdmFsdWU6ZnVuY3Rpb24oZSx0LHIpe3JldHVybiB0aGlzLl9maXhlci5maXgoZSx0LHIpLHt2aWRlb1RyYWNrOnRoaXMudmlkZW9UcmFjayxhdWRpb1RyYWNrOnRoaXMuYXVkaW9UcmFjayxtZXRhZGF0YVRyYWNrOnRoaXMubWV0YWRhdGFUcmFja319fSx7a2V5OiJkZW11eEFuZEZpeCIsdmFsdWU6ZnVuY3Rpb24oZSx0LHIsYSxuKXtyZXR1cm4gdGhpcy5kZW11eChlLHQscixuKSx0aGlzLmZpeChhLHQscil9fSx7a2V5OiJfcGFyc2VBdWRpbyIsdmFsdWU6ZnVuY3Rpb24odCxyKXtpZih0Lmxlbmd0aCl7dmFyIGE9KDI0MCZ0WzBdKT4+PjQsbj10aGlzLmF1ZGlvVHJhY2s7aWYoYSE9PWtlJiZhIT09bWUmJmEhPT1nZSYmYSE9PWJlKXJldHVybiBfZS53YXJuKCJVbnN1cHBvcnRlZCBzb3VuZCBmb3JtYXQ6ICIuY29uY2F0KGEpKSx2b2lkIG4ucmVzZXQoKTtpZihhIT09a2UmJmEhPT1iZSl7dmFyIGk9KDEyJnRbMF0pPj4yLHM9KDImdFswXSk+PjEsbz0xJnRbMF07bi5zYW1wbGVSYXRlPWUuQVVESU9fUkFURVtpXSxuLnNhbXBsZVNpemU9cz8xNjo4LG4uY2hhbm5lbENvdW50PW8rMX1zd2l0Y2goYSl7Y2FzZSBtZTpjYXNlIGdlOnRoaXMuX3BhcnNlRzcxMSh0LHIsYSk7YnJlYWs7Y2FzZSBrZTp0aGlzLl9wYXJzZUFhYyh0LHIpO2JyZWFrO2Nhc2UgYmU6dGhpcy5fcGFyc2VPcHVzKHQscil9fX19LHtrZXk6Il9wYXJzZU9wdXMiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcy5hdWRpb1RyYWNrLGE9ZVsxXTtzd2l0Y2goci5jb2RlY1R5cGU9RSxhKXtjYXNlIDA6dmFyIG49ZGUucGFyc2VIZWFkZXJQYWNrZXRzKGUuc3ViYXJyYXkoMikpO24/KHIuY29kZWM9bi5jb2RlYyxyLmNoYW5uZWxDb3VudD1uLmNoYW5uZWxDb3VudCxyLnNhbXBsZVJhdGU9bi5zYW1wbGVSYXRlLHIuY29uZmlnPW4uY29uZmlnLHIuc2FtcGxlRHVyYXRpb249ZGUuZ2V0RnJhbWVEdXJhdGlvbihbXSxyLnRpbWVzY2FsZSkpOihyLnJlc2V0KCksX2Uud2FybigiQ2Fubm90IHBhcnNlIEF1ZGlvU3BlY2lmaWNDb25maWciLGUpKTticmVhaztjYXNlIDE6aWYobnVsbD09dClyZXR1cm47dmFyIGk9bmV3IEYodCxlLnN1YmFycmF5KDIpLHIuc2FtcGxlRHVyYXRpb24pO3Iuc2FtcGxlcy5wdXNoKGkpO2JyZWFrO2RlZmF1bHQ6X2Uud2FybigiVW5rbm93biBPcHVzUGFja2V0VHlwZTogIi5jb25jYXQoYSkpfX19LHtrZXk6Il9wYXJzZUc3MTEiLHZhbHVlOmZ1bmN0aW9uKGUsdCxyKXt2YXIgYT10aGlzLmF1ZGlvVHJhY2ssbj1lLnN1YmFycmF5KDEpO2lmKCEobi5ieXRlTGVuZ3RoPDEpKXt2YXIgaT1uZXcgRih0LG4pO2EuY29kZWNUeXBlPTc9PT1yP1Q6QixhLnNhbXBsZVJhdGU9OGUzLGEuY29kZWM9YS5jb2RlY1R5cGUsYS5zYW1wbGVzLnB1c2goaSl9fX0se2tleToiX3BhcnNlQWFjIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciByPXRoaXMuYXVkaW9UcmFjaztpZihyLmNvZGVjVHlwZT1BLDA9PT1lWzFdKXt2YXIgYT11ZS5wYXJzZUF1ZGlvU3BlY2lmaWNDb25maWcoZS5zdWJhcnJheSgyKSk7YT8oci5jb2RlYz1hLmNvZGVjLHIuY2hhbm5lbENvdW50PWEuY2hhbm5lbENvdW50LHIuc2FtcGxlUmF0ZT1hLnNhbXBsZVJhdGUsci5jb25maWc9YS5jb25maWcsci5vYmplY3RUeXBlPWEub2JqZWN0VHlwZSxyLnNhbXBsZVJhdGVJbmRleD1hLnNhbXBsaW5nRnJlcXVlbmN5SW5kZXgpOihyLnJlc2V0KCksX2Uud2FybigiQ2Fubm90IHBhcnNlIEF1ZGlvU3BlY2lmaWNDb25maWciLGUpKX1lbHNlIGlmKDE9PT1lWzFdKXtpZihudWxsPT10KXJldHVybjtyLnNhbXBsZXMucHVzaChuZXcgRih0LGUuc3ViYXJyYXkoMikpKX1lbHNlIF9lLndhcm4oIlVua25vd24gQUFDUGFja2V0VHlwZTogIi5jb25jYXQoZVsxXSkpfX0se2tleToiX3BhcnNlVmlkZW8iLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcztpZighKGUubGVuZ3RoPDYpKXt2YXIgYT0oMjQwJmVbMF0pPj4+NCxuPTE1JmVbMF0saT10aGlzLnZpZGVvVHJhY2s7aWYoNyE9PW4mJjEyIT09bilyZXR1cm4gaS5yZXNldCgpLHZvaWQgX2Uud2FybigiVW5zdXBwb3J0ZWQgY29kZWNJZDogIi5jb25jYXQobikpO3ZhciBzPTEyPT09bjtpLmNvZGVjVHlwZT1zP0Q6Uzt2YXIgbz1lWzFdLHU9KGVbMl08PDE2fGVbM108PDh8ZVs0XSk8PDg+Pjg7aWYoMD09PW8pe3ZhciBjPWUuc3ViYXJyYXkoNSksbD1zP2ZlLnBhcnNlSEVWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkKGMpOmxlLnBhcnNlQVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQoYyk7aWYobCl7dmFyIGY9bC5odmNDLGQ9bC5zcHMsaD1sLnBwc0FycixwPWwuc3BzQXJyLHY9bC52cHNBcnIseT1sLm5hbFVuaXRTaXplO2YmJihpLmh2Y0M9aS5odmNDfHxmKSxkJiYoaS5jb2RlYz1kLmNvZGVjLGkud2lkdGg9ZC53aWR0aCxpLmhlaWdodD1kLmhlaWdodCxpLnNhclJhdGlvPWQuc2FyUmF0aW8saS5mcHNOdW09ZC5mcHNOdW0saS5mcHNEZW49ZC5mcHNEZW4pLHAubGVuZ3RoJiYoaS5zcHM9cCksaC5sZW5ndGgmJihpLnBwcz1oKSx2JiZ2Lmxlbmd0aCYmKGkudnBzPXYpLHkmJihpLm5hbFVuaXRTaXplPXkpfWVsc2UgX2Uud2FybigiQ2Fubm90IHBhcnNlICIuY29uY2F0KHM/IkhFVkMiOiJBVkMiLCJEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZCIpLGUpfWVsc2UgaWYoMT09PW8pe3ZhciBtPWNlLnBhcnNlQXZjQyhlLnN1YmFycmF5KDUpLGkubmFsVW5pdFNpemUpO2lmKChtPXRoaXMuX2NoZWNrQWRkTWV0YU5hbFRvVW5pdHMocyxtLGkpKSYmbS5sZW5ndGgpe3ZhciBnPW5ldyBWKHQrdSx0LG0pO2lmKHRoaXMuc2VhbWxlc3NMb2FkaW5nU3dpdGNoaW5nJiZ0PGkubGFzdEtleUZyYW1lRHRzKXJldHVybjt0aGlzLnNlYW1sZXNzTG9hZGluZ1N3aXRjaGluZz0hMSwxPT09YSYmKGcuc2V0VG9LZXlmcmFtZSgpLGkubGFzdEtleUZyYW1lRHRzPXQpLGkuc2FtcGxlcy5wdXNoKGcpLG0uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIGE9cz9lWzBdPj4+MSY2MzozMSZlWzBdO3N3aXRjaChhKXtjYXNlIDU6Y2FzZSAxNjpjYXNlIDE3OmNhc2UgMTg6Y2FzZSAxOTpjYXNlIDIwOmNhc2UgMjE6Y2FzZSAyMjpjYXNlIDIzOmlmKCFzJiY1IT09YXx8cyYmNT09PWEpYnJlYWs7Zy5zZXRUb0tleWZyYW1lKCk7YnJlYWs7Y2FzZSA2OmNhc2UgMzk6Y2FzZSA0MDppZighcyYmNiE9PWF8fHMmJjY9PT1hKWJyZWFrO3IubWV0YWRhdGFUcmFjay5zZWlTYW1wbGVzLnB1c2gobmV3IEcoY2UucGFyc2VTRUkoY2UucmVtb3ZlRVBCKGUpLHMpLHQrdSkpfX0pKSxnLmtleWZyYW1lJiZ0aGlzLl9nb3BJZCsrLGcuZ29wSWQ9dGhpcy5fZ29wSWR9ZWxzZSBfZS53YXJuKCJDYW5ub3QgcGFyc2UgTkFMVXMiLGUpfWVsc2UgMj09PW98fF9