gl-draw 0.16.0-beta.6 → 0.16.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/plugins/index.js +1 -1
- package/dist/plugins/index.module.js +29 -29
- package/package.json +8 -8
package/dist/plugins/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var C=Object.defineProperty;var y=Object.getOwnPropertySymbols;var x=Object.prototype.hasOwnProperty,S=Object.prototype.propertyIsEnumerable;var Y=(l,b,d)=>b in l?C(l,b,{enumerable:!0,configurable:!0,writable:!0,value:d}):l[b]=d,W=(l,b)=>{for(var d in b||(b={}))x.call(b,d)&&Y(l,d,b[d]);if(y)for(var d of y(b))S.call(b,d)&&Y(l,d,b[d]);return l};var R=(l,b)=>{var d={};for(var G in l)x.call(l,G)&&b.indexOf(G)<0&&(d[G]=l[G]);if(l!=null&&y)for(var G of y(l))b.indexOf(G)<0&&S.call(l,G)&&(d[G]=l[G]);return d};var V=(l,b,d)=>new Promise((G,X)=>{var p=Z=>{try{m(d.next(Z))}catch(c){X(c)}},L=Z=>{try{m(d.throw(Z))}catch(c){X(c)}},m=Z=>Z.done?G(Z.value):Promise.resolve(Z.value).then(p,L);m((d=d.apply(l,b)).next())});Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("idb-keyval"),K=require("three"),M=require("esus-lite"),H="dmFyIGtnPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxOZz1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgUmc9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIHRvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIEp1PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksWXU9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgd2M9KEosUSk9PihRPVN5bWJvbFtKXSk/UTpTeW1ib2wuZm9yKCJTeW1ib2wuIitKKSxMZz1KPT57dGhyb3cgVHlwZUVycm9yKEopfSxnaT1NYXRoLnBvdyxadT0oSixRLG10KT0+USBpbiBKP2tnKEosUSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bXR9KTpKW1FdPW10LEZ0PShKLFEpPT57Zm9yKHZhciBtdCBpbiBRfHwoUT17fSkpSnUuY2FsbChRLG10KSYmWnUoSixtdCxRW210XSk7aWYodG8pZm9yKHZhciBtdCBvZiB0byhRKSlZdS5jYWxsKFEsbXQpJiZadShKLG10LFFbbXRdKTtyZXR1cm4gSn0sV2U9KEosUSk9Pk5nKEosUmcoUSkpO3ZhciBqdT0oSixRKT0+e3ZhciBtdD17fTtmb3IodmFyIE10IGluIEopSnUuY2FsbChKLE10KSYmUS5pbmRleE9mKE10KTwwJiYobXRbTXRdPUpbTXRdKTtpZihKIT1udWxsJiZ0bylmb3IodmFyIE10IG9mIHRvKEopKVEuaW5kZXhPZihNdCk8MCYmWXUuY2FsbChKLE10KSYmKG10W010XT1KW010XSk7cmV0dXJuIG10fTt2YXIgT2c9ZnVuY3Rpb24oSixRKXt0aGlzWzBdPUosdGhpc1sxXT1RfTt2YXIgUXU9Sj0+e3ZhciBRPUpbd2MoImFzeW5jSXRlcmF0b3IiKV0sbXQ9ITEsTXQsY249e307cmV0dXJuIFE9PW51bGw/KFE9Slt3YygiaXRlcmF0b3IiKV0oKSxNdD1TZT0+Y25bU2VdPUJuPT5RW1NlXShCbikpOihRPVEuY2FsbChKKSxNdD1TZT0+Y25bU2VdPUJuPT57aWYobXQpe2lmKG10PSExLFNlPT09InRocm93Iil0aHJvdyBCbjtyZXR1cm4gQm59cmV0dXJuIG10PSEwLHtkb25lOiExLHZhbHVlOm5ldyBPZyhuZXcgUHJvbWlzZShiYz0+e3ZhciBlbz1RW1NlXShCbik7ZW8gaW5zdGFuY2VvZiBPYmplY3R8fExnKCJPYmplY3QgZXhwZWN0ZWQiKSxiYyhlbyl9KSwxKX19KSxjblt3YygiaXRlcmF0b3IiKV09KCk9PmNuLE10KCJuZXh0IiksInRocm93ImluIFE/TXQoInRocm93Iik6Y24udGhyb3c9U2U9Pnt0aHJvdyBTZX0sInJldHVybiJpbiBRJiZNdCgicmV0dXJuIiksY259OyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjsvKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IDIwMTAtMjAyNSBUaHJlZS5qcyBBdXRob3JzCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICovY29uc3QgSj0iMTc5IixNYz0iIixvZT0ic3JnYiIsQWM9InNyZ2ItbGluZWFyIixTYz0ibGluZWFyIixubz0ic3JnYiI7Y2xhc3MgY3N7YWRkRXZlbnRMaXN0ZW5lcih0LGUpe3RoaXMuX2xpc3RlbmVycz09PXZvaWQgMCYmKHRoaXMuX2xpc3RlbmVycz17fSk7Y29uc3Qgbj10aGlzLl9saXN0ZW5lcnM7blt0XT09PXZvaWQgMCYmKG5bdF09W10pLG5bdF0uaW5kZXhPZihlKT09PS0xJiZuW3RdLnB1c2goZSl9aGFzRXZlbnRMaXN0ZW5lcih0LGUpe2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO3JldHVybiBuPT09dm9pZCAwPyExOm5bdF0hPT12b2lkIDAmJm5bdF0uaW5kZXhPZihlKSE9PS0xfXJlbW92ZUV2ZW50TGlzdGVuZXIodCxlKXtjb25zdCBuPXRoaXMuX2xpc3RlbmVycztpZihuPT09dm9pZCAwKXJldHVybjtjb25zdCBzPW5bdF07aWYocyE9PXZvaWQgMCl7Y29uc3Qgcj1zLmluZGV4T2YoZSk7ciE9PS0xJiZzLnNwbGljZShyLDEpfX1kaXNwYXRjaEV2ZW50KHQpe2NvbnN0IGU9dGhpcy5fbGlzdGVuZXJzO2lmKGU9PT12b2lkIDApcmV0dXJuO2NvbnN0IG49ZVt0LnR5cGVdO2lmKG4hPT12b2lkIDApe3QudGFyZ2V0PXRoaXM7Y29uc3Qgcz1uLnNsaWNlKDApO2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKylzW3JdLmNhbGwodGhpcyx0KTt0LnRhcmdldD1udWxsfX19Y29uc3QgQXQ9WyIwMCIsIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjBhIiwiMGIiLCIwYyIsIjBkIiwiMGUiLCIwZiIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMWEiLCIxYiIsIjFjIiwiMWQiLCIxZSIsIjFmIiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIyYSIsIjJiIiwiMmMiLCIyZCIsIjJlIiwiMmYiLCIzMCIsIjMxIiwiMzIiLCIzMyIsIjM0IiwiMzUiLCIzNiIsIjM3IiwiMzgiLCIzOSIsIjNhIiwiM2IiLCIzYyIsIjNkIiwiM2UiLCIzZiIsIjQwIiwiNDEiLCI0MiIsIjQzIiwiNDQiLCI0NSIsIjQ2IiwiNDciLCI0OCIsIjQ5IiwiNGEiLCI0YiIsIjRjIiwiNGQiLCI0ZSIsIjRmIiwiNTAiLCI1MSIsIjUyIiwiNTMiLCI1NCIsIjU1IiwiNTYiLCI1NyIsIjU4IiwiNTkiLCI1YSIsIjViIiwiNWMiLCI1ZCIsIjVlIiwiNWYiLCI2MCIsIjYxIiwiNjIiLCI2MyIsIjY0IiwiNjUiLCI2NiIsIjY3IiwiNjgiLCI2OSIsIjZhIiwiNmIiLCI2YyIsIjZkIiwiNmUiLCI2ZiIsIjcwIiwiNzEiLCI3MiIsIjczIiwiNzQiLCI3NSIsIjc2IiwiNzciLCI3OCIsIjc5IiwiN2EiLCI3YiIsIjdjIiwiN2QiLCI3ZSIsIjdmIiwiODAiLCI4MSIsIjgyIiwiODMiLCI4NCIsIjg1IiwiODYiLCI4NyIsIjg4IiwiODkiLCI4YSIsIjhiIiwiOGMiLCI4ZCIsIjhlIiwiOGYiLCI5MCIsIjkxIiwiOTIiLCI5MyIsIjk0IiwiOTUiLCI5NiIsIjk3IiwiOTgiLCI5OSIsIjlhIiwiOWIiLCI5YyIsIjlkIiwiOWUiLCI5ZiIsImEwIiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsImE2IiwiYTciLCJhOCIsImE5IiwiYWEiLCJhYiIsImFjIiwiYWQiLCJhZSIsImFmIiwiYjAiLCJiMSIsImIyIiwiYjMiLCJiNCIsImI1IiwiYjYiLCJiNyIsImI4IiwiYjkiLCJiYSIsImJiIiwiYmMiLCJiZCIsImJlIiwiYmYiLCJjMCIsImMxIiwiYzIiLCJjMyIsImM0IiwiYzUiLCJjNiIsImM3IiwiYzgiLCJjOSIsImNhIiwiY2IiLCJjYyIsImNkIiwiY2UiLCJjZiIsImQwIiwiZDEiLCJkMiIsImQzIiwiZDQiLCJkNSIsImQ2IiwiZDciLCJkOCIsImQ5IiwiZGEiLCJkYiIsImRjIiwiZGQiLCJkZSIsImRmIiwiZTAiLCJlMSIsImUyIiwiZTMiLCJlNCIsImU1IiwiZTYiLCJlNyIsImU4IiwiZTkiLCJlYSIsImViIiwiZWMiLCJlZCIsImVlIiwiZWYiLCJmMCIsImYxIiwiZjIiLCJmMyIsImY0IiwiZjUiLCJmNiIsImY3IiwiZjgiLCJmOSIsImZhIiwiZmIiLCJmYyIsImZkIiwiZmUiLCJmZiJdO2Z1bmN0aW9uIEZuKCl7Y29uc3QgaT1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MCx0PU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwLGU9TWF0aC5yYW5kb20oKSo0Mjk0OTY3Mjk1fDAsbj1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MDtyZXR1cm4oQXRbaSYyNTVdK0F0W2k+PjgmMjU1XStBdFtpPj4xNiYyNTVdK0F0W2k+PjI0JjI1NV0rIi0iK0F0W3QmMjU1XStBdFt0Pj44JjI1NV0rIi0iK0F0W3Q+PjE2JjE1fDY0XStBdFt0Pj4yNCYyNTVdKyItIitBdFtlJjYzfDEyOF0rQXRbZT4+OCYyNTVdKyItIitBdFtlPj4xNiYyNTVdK0F0W2U+PjI0JjI1NV0rQXRbbiYyNTVdK0F0W24+PjgmMjU1XStBdFtuPj4xNiYyNTVdK0F0W24+PjI0JjI1NV0pLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gRyhpLHQsZSl7cmV0dXJuIE1hdGgubWF4KHQsTWF0aC5taW4oZSxpKSl9ZnVuY3Rpb24gS3UoaSx0KXtyZXR1cm4oaSV0K3QpJXR9ZnVuY3Rpb24gaW8oaSx0LGUpe3JldHVybigxLWUpKmkrZSp0fWZ1bmN0aW9uIHhpKGksdCl7c3dpdGNoKHQuY29uc3RydWN0b3Ipe2Nhc2UgRmxvYXQzMkFycmF5OnJldHVybiBpO2Nhc2UgVWludDMyQXJyYXk6cmV0dXJuIGkvNDI5NDk2NzI5NTtjYXNlIFVpbnQxNkFycmF5OnJldHVybiBpLzY1NTM1O2Nhc2UgVWludDhBcnJheTpyZXR1cm4gaS8yNTU7Y2FzZSBJbnQzMkFycmF5OnJldHVybiBNYXRoLm1heChpLzIxNDc0ODM2NDcsLTEpO2Nhc2UgSW50MTZBcnJheTpyZXR1cm4gTWF0aC5tYXgoaS8zMjc2NywtMSk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgubWF4KGkvMTI3LC0xKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb21wb25lbnQgdHlwZS4iKX19ZnVuY3Rpb24gSXQoaSx0KXtzd2l0Y2godC5jb25zdHJ1Y3Rvcil7Y2FzZSBGbG9hdDMyQXJyYXk6cmV0dXJuIGk7Y2FzZSBVaW50MzJBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChpKjQyOTQ5NjcyOTUpO2Nhc2UgVWludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSo2NTUzNSk7Y2FzZSBVaW50OEFycmF5OnJldHVybiBNYXRoLnJvdW5kKGkqMjU1KTtjYXNlIEludDMyQXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSoyMTQ3NDgzNjQ3KTtjYXNlIEludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSozMjc2Nyk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSoxMjcpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCB0eXBlLiIpfX1jbGFzcyBSe2NvbnN0cnVjdG9yKHQ9MCxlPTApe1IucHJvdG90eXBlLmlzVmVjdG9yMj0hMCx0aGlzLng9dCx0aGlzLnk9ZX1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy54fXNldCB3aWR0aCh0KXt0aGlzLng9dH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMueX1zZXQgaGVpZ2h0KHQpe3RoaXMueT10fXNldCh0LGUpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnkpfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpc31kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHM9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PXNbMF0qZStzWzNdKm4rc1s2XSx0aGlzLnk9c1sxXSplK3NbNF0qbitzWzddLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PUcodGhpcy54LHQueCxlLngpLHRoaXMueT1HKHRoaXMueSx0LnksZS55KSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1HKHRoaXMueCx0LGUpLHRoaXMueT1HKHRoaXMueSx0LGUpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKEcobix0LGUpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9TWF0aC50cnVuYyh0aGlzLngpLHRoaXMueT1NYXRoLnRydW5jKHRoaXMueSksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueX1jcm9zcyh0KXtyZXR1cm4gdGhpcy54KnQueS10aGlzLnkqdC54fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueX1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9YW5nbGUoKXtyZXR1cm4gTWF0aC5hdGFuMigtdGhpcy55LC10aGlzLngpK01hdGguUEl9YW5nbGVUbyh0KXtjb25zdCBlPU1hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqdC5sZW5ndGhTcSgpKTtpZihlPT09MClyZXR1cm4gTWF0aC5QSS8yO2NvbnN0IG49dGhpcy5kb3QodCkvZTtyZXR1cm4gTWF0aC5hY29zKEcobiwtMSwxKSl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnk7cmV0dXJuIGUqZStuKm59bWFuaGF0dGFuRGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5hYnModGhpcy54LXQueCkrTWF0aC5hYnModGhpcy55LXQueSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXN9cm90YXRlQXJvdW5kKHQsZSl7Y29uc3Qgbj1NYXRoLmNvcyhlKSxzPU1hdGguc2luKGUpLHI9dGhpcy54LXQueCxvPXRoaXMueS10Lnk7cmV0dXJuIHRoaXMueD1yKm4tbypzK3QueCx0aGlzLnk9cipzK28qbit0LnksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55fX1jbGFzcyB3aXtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxzPTEpe3RoaXMuaXNRdWF0ZXJuaW9uPSEwLHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX3c9c31zdGF0aWMgc2xlcnBGbGF0KHQsZSxuLHMscixvLGEpe2xldCBjPW5bcyswXSxsPW5bcysxXSxoPW5bcysyXSx1PW5bcyszXTtjb25zdCBmPXJbbyswXSxkPXJbbysxXSxwPXJbbysyXSx5PXJbbyszXTtpZihhPT09MCl7dFtlKzBdPWMsdFtlKzFdPWwsdFtlKzJdPWgsdFtlKzNdPXU7cmV0dXJufWlmKGE9PT0xKXt0W2UrMF09Zix0W2UrMV09ZCx0W2UrMl09cCx0W2UrM109eTtyZXR1cm59aWYodSE9PXl8fGMhPT1mfHxsIT09ZHx8aCE9PXApe2xldCBtPTEtYTtjb25zdCBnPWMqZitsKmQraCpwK3UqeSxiPWc+PTA/MTotMSx3PTEtZypnO2lmKHc+TnVtYmVyLkVQU0lMT04pe2NvbnN0IE09TWF0aC5zcXJ0KHcpLEE9TWF0aC5hdGFuMihNLGcqYik7bT1NYXRoLnNpbihtKkEpL00sYT1NYXRoLnNpbihhKkEpL019Y29uc3QgeD1hKmI7aWYoYz1jKm0rZip4LGw9bCptK2QqeCxoPWgqbStwKngsdT11Km0reSp4LG09PT0xLWEpe2NvbnN0IE09MS9NYXRoLnNxcnQoYypjK2wqbCtoKmgrdSp1KTtjKj1NLGwqPU0saCo9TSx1Kj1NfX10W2VdPWMsdFtlKzFdPWwsdFtlKzJdPWgsdFtlKzNdPXV9c3RhdGljIG11bHRpcGx5UXVhdGVybmlvbnNGbGF0KHQsZSxuLHMscixvKXtjb25zdCBhPW5bc10sYz1uW3MrMV0sbD1uW3MrMl0saD1uW3MrM10sdT1yW29dLGY9cltvKzFdLGQ9cltvKzJdLHA9cltvKzNdO3JldHVybiB0W2VdPWEqcCtoKnUrYypkLWwqZix0W2UrMV09YypwK2gqZitsKnUtYSpkLHRbZSsyXT1sKnAraCpkK2EqZi1jKnUsdFtlKzNdPWgqcC1hKnUtYypmLWwqZCx0fWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB3KCl7cmV0dXJuIHRoaXMuX3d9c2V0IHcodCl7dGhpcy5fdz10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1zZXQodCxlLG4scyl7cmV0dXJuIHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX3c9cyx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl93KX1jb3B5KHQpe3JldHVybiB0aGlzLl94PXQueCx0aGlzLl95PXQueSx0aGlzLl96PXQueix0aGlzLl93PXQudyx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tRXVsZXIodCxlPSEwKXtjb25zdCBuPXQuX3gscz10Ll95LHI9dC5feixvPXQuX29yZGVyLGE9TWF0aC5jb3MsYz1NYXRoLnNpbixsPWEobi8yKSxoPWEocy8yKSx1PWEoci8yKSxmPWMobi8yKSxkPWMocy8yKSxwPWMoci8yKTtzd2l0Y2gobyl7Y2FzZSJYWVoiOnRoaXMuX3g9ZipoKnUrbCpkKnAsdGhpcy5feT1sKmQqdS1mKmgqcCx0aGlzLl96PWwqaCpwK2YqZCp1LHRoaXMuX3c9bCpoKnUtZipkKnA7YnJlYWs7Y2FzZSJZWFoiOnRoaXMuX3g9ZipoKnUrbCpkKnAsdGhpcy5feT1sKmQqdS1mKmgqcCx0aGlzLl96PWwqaCpwLWYqZCp1LHRoaXMuX3c9bCpoKnUrZipkKnA7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9ZipoKnUtbCpkKnAsdGhpcy5feT1sKmQqdStmKmgqcCx0aGlzLl96PWwqaCpwK2YqZCp1LHRoaXMuX3c9bCpoKnUtZipkKnA7YnJlYWs7Y2FzZSJaWVgiOnRoaXMuX3g9ZipoKnUtbCpkKnAsdGhpcy5feT1sKmQqdStmKmgqcCx0aGlzLl96PWwqaCpwLWYqZCp1LHRoaXMuX3c9bCpoKnUrZipkKnA7YnJlYWs7Y2FzZSJZWlgiOnRoaXMuX3g9ZipoKnUrbCpkKnAsdGhpcy5feT1sKmQqdStmKmgqcCx0aGlzLl96PWwqaCpwLWYqZCp1LHRoaXMuX3c9bCpoKnUtZipkKnA7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3g9ZipoKnUtbCpkKnAsdGhpcy5feT1sKmQqdS1mKmgqcCx0aGlzLl96PWwqaCpwK2YqZCp1LHRoaXMuX3c9bCpoKnUrZipkKnA7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAiK28pfXJldHVybiBlPT09ITAmJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21BeGlzQW5nbGUodCxlKXtjb25zdCBuPWUvMixzPU1hdGguc2luKG4pO3JldHVybiB0aGlzLl94PXQueCpzLHRoaXMuX3k9dC55KnMsdGhpcy5fej10Lnoqcyx0aGlzLl93PU1hdGguY29zKG4pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Sb3RhdGlvbk1hdHJpeCh0KXtjb25zdCBlPXQuZWxlbWVudHMsbj1lWzBdLHM9ZVs0XSxyPWVbOF0sbz1lWzFdLGE9ZVs1XSxjPWVbOV0sbD1lWzJdLGg9ZVs2XSx1PWVbMTBdLGY9bithK3U7aWYoZj4wKXtjb25zdCBkPS41L01hdGguc3FydChmKzEpO3RoaXMuX3c9LjI1L2QsdGhpcy5feD0oaC1jKSpkLHRoaXMuX3k9KHItbCkqZCx0aGlzLl96PShvLXMpKmR9ZWxzZSBpZihuPmEmJm4+dSl7Y29uc3QgZD0yKk1hdGguc3FydCgxK24tYS11KTt0aGlzLl93PShoLWMpL2QsdGhpcy5feD0uMjUqZCx0aGlzLl95PShzK28pL2QsdGhpcy5fej0ocitsKS9kfWVsc2UgaWYoYT51KXtjb25zdCBkPTIqTWF0aC5zcXJ0KDErYS1uLXUpO3RoaXMuX3c9KHItbCkvZCx0aGlzLl94PShzK28pL2QsdGhpcy5feT0uMjUqZCx0aGlzLl96PShjK2gpL2R9ZWxzZXtjb25zdCBkPTIqTWF0aC5zcXJ0KDErdS1uLWEpO3RoaXMuX3c9KG8tcykvZCx0aGlzLl94PShyK2wpL2QsdGhpcy5feT0oYytoKS9kLHRoaXMuX3o9LjI1KmR9cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Vbml0VmVjdG9ycyh0LGUpe2xldCBuPXQuZG90KGUpKzE7cmV0dXJuIG48MWUtOD8obj0wLE1hdGguYWJzKHQueCk+TWF0aC5hYnModC56KT8odGhpcy5feD0tdC55LHRoaXMuX3k9dC54LHRoaXMuX3o9MCx0aGlzLl93PW4pOih0aGlzLl94PTAsdGhpcy5feT0tdC56LHRoaXMuX3o9dC55LHRoaXMuX3c9bikpOih0aGlzLl94PXQueSplLnotdC56KmUueSx0aGlzLl95PXQueiplLngtdC54KmUueix0aGlzLl96PXQueCplLnktdC55KmUueCx0aGlzLl93PW4pLHRoaXMubm9ybWFsaXplKCl9YW5nbGVUbyh0KXtyZXR1cm4gMipNYXRoLmFjb3MoTWF0aC5hYnMoRyh0aGlzLmRvdCh0KSwtMSwxKSkpfXJvdGF0ZVRvd2FyZHModCxlKXtjb25zdCBuPXRoaXMuYW5nbGVUbyh0KTtpZihuPT09MClyZXR1cm4gdGhpcztjb25zdCBzPU1hdGgubWluKDEsZS9uKTtyZXR1cm4gdGhpcy5zbGVycCh0LHMpLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMSl9aW52ZXJ0KCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9Y29uanVnYXRlKCl7cmV0dXJuIHRoaXMuX3gqPS0xLHRoaXMuX3kqPS0xLHRoaXMuX3oqPS0xLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy5feCp0Ll94K3RoaXMuX3kqdC5feSt0aGlzLl96KnQuX3ordGhpcy5fdyp0Ll93fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fd31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fdyl9bm9ybWFsaXplKCl7bGV0IHQ9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdD09PTA/KHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fej0wLHRoaXMuX3c9MSk6KHQ9MS90LHRoaXMuX3g9dGhpcy5feCp0LHRoaXMuX3k9dGhpcy5feSp0LHRoaXMuX3o9dGhpcy5feip0LHRoaXMuX3c9dGhpcy5fdyp0KSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0LHRoaXMpfW11bHRpcGx5UXVhdGVybmlvbnModCxlKXtjb25zdCBuPXQuX3gscz10Ll95LHI9dC5feixvPXQuX3csYT1lLl94LGM9ZS5feSxsPWUuX3osaD1lLl93O3JldHVybiB0aGlzLl94PW4qaCtvKmErcypsLXIqYyx0aGlzLl95PXMqaCtvKmMrciphLW4qbCx0aGlzLl96PXIqaCtvKmwrbipjLXMqYSx0aGlzLl93PW8qaC1uKmEtcypjLXIqbCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycCh0LGUpe2lmKGU9PT0wKXJldHVybiB0aGlzO2lmKGU9PT0xKXJldHVybiB0aGlzLmNvcHkodCk7Y29uc3Qgbj10aGlzLl94LHM9dGhpcy5feSxyPXRoaXMuX3osbz10aGlzLl93O2xldCBhPW8qdC5fdytuKnQuX3grcyp0Ll95K3IqdC5fejtpZihhPDA/KHRoaXMuX3c9LXQuX3csdGhpcy5feD0tdC5feCx0aGlzLl95PS10Ll95LHRoaXMuX3o9LXQuX3osYT0tYSk6dGhpcy5jb3B5KHQpLGE+PTEpcmV0dXJuIHRoaXMuX3c9byx0aGlzLl94PW4sdGhpcy5feT1zLHRoaXMuX3o9cix0aGlzO2NvbnN0IGM9MS1hKmE7aWYoYzw9TnVtYmVyLkVQU0lMT04pe2NvbnN0IGQ9MS1lO3JldHVybiB0aGlzLl93PWQqbytlKnRoaXMuX3csdGhpcy5feD1kKm4rZSp0aGlzLl94LHRoaXMuX3k9ZCpzK2UqdGhpcy5feSx0aGlzLl96PWQqcitlKnRoaXMuX3osdGhpcy5ub3JtYWxpemUoKSx0aGlzfWNvbnN0IGw9TWF0aC5zcXJ0KGMpLGg9TWF0aC5hdGFuMihsLGEpLHU9TWF0aC5zaW4oKDEtZSkqaCkvbCxmPU1hdGguc2luKGUqaCkvbDtyZXR1cm4gdGhpcy5fdz1vKnUrdGhpcy5fdypmLHRoaXMuX3g9bip1K3RoaXMuX3gqZix0aGlzLl95PXMqdSt0aGlzLl95KmYsdGhpcy5fej1yKnUrdGhpcy5feipmLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwUXVhdGVybmlvbnModCxlLG4pe3JldHVybiB0aGlzLmNvcHkodCkuc2xlcnAoZSxuKX1yYW5kb20oKXtjb25zdCB0PTIqTWF0aC5QSSpNYXRoLnJhbmRvbSgpLGU9MipNYXRoLlBJKk1hdGgucmFuZG9tKCksbj1NYXRoLnJhbmRvbSgpLHM9TWF0aC5zcXJ0KDEtbikscj1NYXRoLnNxcnQobik7cmV0dXJuIHRoaXMuc2V0KHMqTWF0aC5zaW4odCkscypNYXRoLmNvcyh0KSxyKk1hdGguc2luKGUpLHIqTWF0aC5jb3MoZSkpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fdz09PXRoaXMuX3d9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5feD10W2VdLHRoaXMuX3k9dFtlKzFdLHRoaXMuX3o9dFtlKzJdLHRoaXMuX3c9dFtlKzNdLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX3csdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuX3g9dC5nZXRYKGUpLHRoaXMuX3k9dC5nZXRZKGUpLHRoaXMuX3o9dC5nZXRaKGUpLHRoaXMuX3c9dC5nZXRXKGUpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvSlNPTigpe3JldHVybiB0aGlzLnRvQXJyYXkoKX1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMuX3gseWllbGQgdGhpcy5feSx5aWVsZCB0aGlzLl96LHlpZWxkIHRoaXMuX3d9fWNsYXNzIFR7Y29uc3RydWN0b3IodD0wLGU9MCxuPTApe1QucHJvdG90eXBlLmlzVmVjdG9yMz0hMCx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bn1zZXQodCxlLG4pe3JldHVybiBuPT09dm9pZCAwJiYobj10aGlzLnopLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnopfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzLnorPXQueix0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXMuej10LnorZS56LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzLnorPXQueiplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzLnotPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXMuej10LnotZS56LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXMueio9dC56LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpcy56Kj10LHRoaXN9bXVsdGlwbHlWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngqZS54LHRoaXMueT10LnkqZS55LHRoaXMuej10LnoqZS56LHRoaXN9YXBwbHlFdWxlcih0KXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oX2Muc2V0RnJvbUV1bGVyKHQpKX1hcHBseUF4aXNBbmdsZSh0LGUpe3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihfYy5zZXRGcm9tQXhpc0FuZ2xlKHQsZSkpfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1yWzBdKmUrclszXSpuK3JbNl0qcyx0aGlzLnk9clsxXSplK3JbNF0qbityWzddKnMsdGhpcy56PXJbMl0qZStyWzVdKm4rcls4XSpzLHRoaXN9YXBwbHlOb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXgzKHQpLm5vcm1hbGl6ZSgpfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHMsbz0xLyhyWzNdKmUrcls3XSpuK3JbMTFdKnMrclsxNV0pO3JldHVybiB0aGlzLng9KHJbMF0qZStyWzRdKm4rcls4XSpzK3JbMTJdKSpvLHRoaXMueT0oclsxXSplK3JbNV0qbityWzldKnMrclsxM10pKm8sdGhpcy56PShyWzJdKmUrcls2XSpuK3JbMTBdKnMrclsxNF0pKm8sdGhpc31hcHBseVF1YXRlcm5pb24odCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscz10aGlzLnoscj10Lngsbz10LnksYT10LnosYz10LncsbD0yKihvKnMtYSpuKSxoPTIqKGEqZS1yKnMpLHU9MioocipuLW8qZSk7cmV0dXJuIHRoaXMueD1lK2MqbCtvKnUtYSpoLHRoaXMueT1uK2MqaCthKmwtcip1LHRoaXMuej1zK2MqdStyKmgtbypsLHRoaXN9cHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZEludmVyc2UpLmFwcGx5TWF0cml4NCh0LnByb2plY3Rpb25NYXRyaXgpfXVucHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpfXRyYW5zZm9ybURpcmVjdGlvbih0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1yWzBdKmUrcls0XSpuK3JbOF0qcyx0aGlzLnk9clsxXSplK3JbNV0qbityWzldKnMsdGhpcy56PXJbMl0qZStyWzZdKm4rclsxMF0qcyx0aGlzLm5vcm1hbGl6ZSgpfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpcy56Lz10LnosdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpcy56PU1hdGgubWluKHRoaXMueix0LnopLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1HKHRoaXMueCx0LngsZS54KSx0aGlzLnk9Ryh0aGlzLnksdC55LGUueSksdGhpcy56PUcodGhpcy56LHQueixlLnopLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PUcodGhpcy54LHQsZSksdGhpcy55PUcodGhpcy55LHQsZSksdGhpcy56PUcodGhpcy56LHQsZSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoRyhuLHQsZSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzLno9dC56KyhlLnotdC56KSpuLHRoaXN9Y3Jvc3ModCl7cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKHRoaXMsdCl9Y3Jvc3NWZWN0b3JzKHQsZSl7Y29uc3Qgbj10Lngscz10Lnkscj10Lnosbz1lLngsYT1lLnksYz1lLno7cmV0dXJuIHRoaXMueD1zKmMtciphLHRoaXMueT1yKm8tbipjLHRoaXMuej1uKmEtcypvLHRoaXN9cHJvamVjdE9uVmVjdG9yKHQpe2NvbnN0IGU9dC5sZW5ndGhTcSgpO2lmKGU9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCk7Y29uc3Qgbj10LmRvdCh0aGlzKS9lO3JldHVybiB0aGlzLmNvcHkodCkubXVsdGlwbHlTY2FsYXIobil9cHJvamVjdE9uUGxhbmUodCl7cmV0dXJuIHNvLmNvcHkodGhpcykucHJvamVjdE9uVmVjdG9yKHQpLHRoaXMuc3ViKHNvKX1yZWZsZWN0KHQpe3JldHVybiB0aGlzLnN1Yihzby5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QodCkpKX1hbmdsZVRvKHQpe2NvbnN0IGU9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSp0Lmxlbmd0aFNxKCkpO2lmKGU9PT0wKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgbj10aGlzLmRvdCh0KS9lO3JldHVybiBNYXRoLmFjb3MoRyhuLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LG49dGhpcy55LXQueSxzPXRoaXMuei10Lno7cmV0dXJuIGUqZStuKm4rcypzfW1hbmhhdHRhbkRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC10LngpK01hdGguYWJzKHRoaXMueS10LnkpK01hdGguYWJzKHRoaXMuei10LnopfXNldEZyb21TcGhlcmljYWwodCl7cmV0dXJuIHRoaXMuc2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnBoaSx0LnRoZXRhKX1zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKHQsZSxuKXtjb25zdCBzPU1hdGguc2luKGUpKnQ7cmV0dXJuIHRoaXMueD1zKk1hdGguc2luKG4pLHRoaXMueT1NYXRoLmNvcyhlKSp0LHRoaXMuej1zKk1hdGguY29zKG4pLHRoaXN9c2V0RnJvbUN5bGluZHJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnRoZXRhLHQueSl9c2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQqTWF0aC5zaW4oZSksdGhpcy55PW4sdGhpcy56PXQqTWF0aC5jb3MoZSksdGhpc31zZXRGcm9tTWF0cml4UG9zaXRpb24odCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9ZVsxMl0sdGhpcy55PWVbMTNdLHRoaXMuej1lWzE0XSx0aGlzfXNldEZyb21NYXRyaXhTY2FsZSh0KXtjb25zdCBlPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLG49dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCkscz10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gdGhpcy54PWUsdGhpcy55PW4sdGhpcy56PXMsdGhpc31zZXRGcm9tTWF0cml4Q29sdW1uKHQsZSl7cmV0dXJuIHRoaXMuZnJvbUFycmF5KHQuZWxlbWVudHMsZSo0KX1zZXRGcm9tTWF0cml4M0NvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLGUqMyl9c2V0RnJvbUV1bGVyKHQpe3JldHVybiB0aGlzLng9dC5feCx0aGlzLnk9dC5feSx0aGlzLno9dC5feix0aGlzfXNldEZyb21Db2xvcih0KXtyZXR1cm4gdGhpcy54PXQucix0aGlzLnk9dC5nLHRoaXMuej10LmIsdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnp9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdFtlKzJdPXRoaXMueix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpc31yYW5kb21EaXJlY3Rpb24oKXtjb25zdCB0PU1hdGgucmFuZG9tKCkqTWF0aC5QSSoyLGU9TWF0aC5yYW5kb20oKSoyLTEsbj1NYXRoLnNxcnQoMS1lKmUpO3JldHVybiB0aGlzLng9bipNYXRoLmNvcyh0KSx0aGlzLnk9ZSx0aGlzLno9bipNYXRoLnNpbih0KSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnkseWllbGQgdGhpcy56fX1jb25zdCBzbz1uZXcgVCxfYz1uZXcgd2k7Y2xhc3MgbWV7Y29uc3RydWN0b3IodCxlLG4scyxyLG8sYSxjLGwpe21lLnByb3RvdHlwZS5pc01hdHJpeDM9ITAsdGhpcy5lbGVtZW50cz1bMSwwLDAsMCwxLDAsMCwwLDFdLHQhPT12b2lkIDAmJnRoaXMuc2V0KHQsZSxuLHMscixvLGEsYyxsKX1zZXQodCxlLG4scyxyLG8sYSxjLGwpe2NvbnN0IGg9dGhpcy5lbGVtZW50cztyZXR1cm4gaFswXT10LGhbMV09cyxoWzJdPWEsaFszXT1lLGhbNF09cixoWzVdPWMsaFs2XT1uLGhbN109byxoWzhdPWwsdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDEsMCwwLDAsMSksdGhpc31jb3B5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMF09blswXSxlWzFdPW5bMV0sZVsyXT1uWzJdLGVbM109blszXSxlWzRdPW5bNF0sZVs1XT1uWzVdLGVbNl09bls2XSxlWzddPW5bN10sZVs4XT1uWzhdLHRoaXN9ZXh0cmFjdEJhc2lzKHQsZSxuKXtyZXR1cm4gdC5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywxKSxuLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMiksdGhpc31zZXRGcm9tTWF0cml4NCh0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KGVbMF0sZVs0XSxlWzhdLGVbMV0sZVs1XSxlWzldLGVbMl0sZVs2XSxlWzEwXSksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBuPXQuZWxlbWVudHMscz1lLmVsZW1lbnRzLHI9dGhpcy5lbGVtZW50cyxvPW5bMF0sYT1uWzNdLGM9bls2XSxsPW5bMV0saD1uWzRdLHU9bls3XSxmPW5bMl0sZD1uWzVdLHA9bls4XSx5PXNbMF0sbT1zWzNdLGc9c1s2XSxiPXNbMV0sdz1zWzRdLHg9c1s3XSxNPXNbMl0sQT1zWzVdLFM9c1s4XTtyZXR1cm4gclswXT1vKnkrYSpiK2MqTSxyWzNdPW8qbSthKncrYypBLHJbNl09bypnK2EqeCtjKlMsclsxXT1sKnkraCpiK3UqTSxyWzRdPWwqbStoKncrdSpBLHJbN109bCpnK2gqeCt1KlMsclsyXT1mKnkrZCpiK3AqTSxyWzVdPWYqbStkKncrcCpBLHJbOF09ZipnK2QqeCtwKlMsdGhpc31tdWx0aXBseVNjYWxhcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIGVbMF0qPXQsZVszXSo9dCxlWzZdKj10LGVbMV0qPXQsZVs0XSo9dCxlWzddKj10LGVbMl0qPXQsZVs1XSo9dCxlWzhdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxzPXRbMl0scj10WzNdLG89dFs0XSxhPXRbNV0sYz10WzZdLGw9dFs3XSxoPXRbOF07cmV0dXJuIGUqbypoLWUqYSpsLW4qcipoK24qYSpjK3MqcipsLXMqbypjfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLHM9dFsyXSxyPXRbM10sbz10WzRdLGE9dFs1XSxjPXRbNl0sbD10WzddLGg9dFs4XSx1PWgqby1hKmwsZj1hKmMtaCpyLGQ9bCpyLW8qYyxwPWUqdStuKmYrcypkO2lmKHA9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgeT0xL3A7cmV0dXJuIHRbMF09dSp5LHRbMV09KHMqbC1oKm4pKnksdFsyXT0oYSpuLXMqbykqeSx0WzNdPWYqeSx0WzRdPShoKmUtcypjKSp5LHRbNV09KHMqci1hKmUpKnksdFs2XT1kKnksdFs3XT0obipjLWwqZSkqeSx0WzhdPShvKmUtbipyKSp5LHRoaXN9dHJhbnNwb3NlKCl7bGV0IHQ7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiB0PWVbMV0sZVsxXT1lWzNdLGVbM109dCx0PWVbMl0sZVsyXT1lWzZdLGVbNl09dCx0PWVbNV0sZVs1XT1lWzddLGVbN109dCx0aGlzfWdldE5vcm1hbE1hdHJpeCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NCh0KS5pbnZlcnQoKS50cmFuc3Bvc2UoKX10cmFuc3Bvc2VJbnRvQXJyYXkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzNdLHRbMl09ZVs2XSx0WzNdPWVbMV0sdFs0XT1lWzRdLHRbNV09ZVs3XSx0WzZdPWVbMl0sdFs3XT1lWzVdLHRbOF09ZVs4XSx0aGlzfXNldFV2VHJhbnNmb3JtKHQsZSxuLHMscixvLGEpe2NvbnN0IGM9TWF0aC5jb3MociksbD1NYXRoLnNpbihyKTtyZXR1cm4gdGhpcy5zZXQobipjLG4qbCwtbiooYypvK2wqYSkrbyt0LC1zKmwscypjLC1zKigtbCpvK2MqYSkrYStlLDAsMCwxKSx0aGlzfXNjYWxlKHQsZSl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkocm8ubWFrZVNjYWxlKHQsZSkpLHRoaXN9cm90YXRlKHQpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KHJvLm1ha2VSb3RhdGlvbigtdCkpLHRoaXN9dHJhbnNsYXRlKHQsZSl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkocm8ubWFrZVRyYW5zbGF0aW9uKHQsZSkpLHRoaXN9bWFrZVRyYW5zbGF0aW9uKHQsZSl7cmV0dXJuIHQuaXNWZWN0b3IyP3RoaXMuc2V0KDEsMCx0LngsMCwxLHQueSwwLDAsMSk6dGhpcy5zZXQoMSwwLHQsMCwxLGUsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwtbiwwLG4sZSwwLDAsMCwxKSx0aGlzfW1ha2VTY2FsZSh0LGUpe3JldHVybiB0aGlzLnNldCh0LDAsMCwwLGUsMCwwLDAsMSksdGhpc31lcXVhbHModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztmb3IobGV0IHM9MDtzPDk7cysrKWlmKGVbc10hPT1uW3NdKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBuPTA7bjw5O24rKyl0aGlzLmVsZW1lbnRzW25dPXRbbitlXTtyZXR1cm4gdGhpc310b0FycmF5KHQ9W10sZT0wKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbZV09blswXSx0W2UrMV09blsxXSx0W2UrMl09blsyXSx0W2UrM109blszXSx0W2UrNF09bls0XSx0W2UrNV09bls1XSx0W2UrNl09bls2XSx0W2UrN109bls3XSx0W2UrOF09bls4XSx0fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfX1jb25zdCBybz1uZXcgbWU7ZnVuY3Rpb24gdGYoaSl7Zm9yKGxldCB0PWkubGVuZ3RoLTE7dD49MDstLXQpaWYoaVt0XT49NjU1MzUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gdmMoaSl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsaSl9Y29uc3QgemM9e307ZnVuY3Rpb24gVGMoaSl7aSBpbiB6Y3x8KHpjW2ldPSEwLGNvbnNvbGUud2FybihpKSl9Y29uc3QgRWM9bmV3IG1lKCkuc2V0KC40MTIzOTA4LC4zNTc1ODQzLC4xODA0ODA4LC4yMTI2MzksLjcxNTE2ODcsLjA3MjE5MjMsLjAxOTMzMDgsLjExOTE5NDgsLjk1MDUzMjIpLFBjPW5ldyBtZSgpLnNldCgzLjI0MDk2OTksLTEuNTM3MzgzMiwtLjQ5ODYxMDgsLS45NjkyNDM2LDEuODc1OTY3NSwuMDQxNTU1MSwuMDU1NjMwMSwtLjIwMzk3NywxLjA1Njk3MTUpO2Z1bmN0aW9uIGVmKCl7Y29uc3QgaT17ZW5hYmxlZDohMCx3b3JraW5nQ29sb3JTcGFjZTpBYyxzcGFjZXM6e30sY29udmVydDpmdW5jdGlvbihzLHIsbyl7cmV0dXJuIHRoaXMuZW5hYmxlZD09PSExfHxyPT09b3x8IXJ8fCFvfHwodGhpcy5zcGFjZXNbcl0udHJhbnNmZXI9PT1ubyYmKHMucj1fZShzLnIpLHMuZz1fZShzLmcpLHMuYj1fZShzLmIpKSx0aGlzLnNwYWNlc1tyXS5wcmltYXJpZXMhPT10aGlzLnNwYWNlc1tvXS5wcmltYXJpZXMmJihzLmFwcGx5TWF0cml4Myh0aGlzLnNwYWNlc1tyXS50b1hZWikscy5hcHBseU1hdHJpeDModGhpcy5zcGFjZXNbb10uZnJvbVhZWikpLHRoaXMuc3BhY2VzW29dLnRyYW5zZmVyPT09bm8mJihzLnI9SW4ocy5yKSxzLmc9SW4ocy5nKSxzLmI9SW4ocy5iKSkpLHN9LHdvcmtpbmdUb0NvbG9yU3BhY2U6ZnVuY3Rpb24ocyxyKXtyZXR1cm4gdGhpcy5jb252ZXJ0KHMsdGhpcy53b3JraW5nQ29sb3JTcGFjZSxyKX0sY29sb3JTcGFjZVRvV29ya2luZzpmdW5jdGlvbihzLHIpe3JldHVybiB0aGlzLmNvbnZlcnQocyxyLHRoaXMud29ya2luZ0NvbG9yU3BhY2UpfSxnZXRQcmltYXJpZXM6ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMuc3BhY2VzW3NdLnByaW1hcmllc30sZ2V0VHJhbnNmZXI6ZnVuY3Rpb24ocyl7cmV0dXJuIHM9PT1NYz9TYzp0aGlzLnNwYWNlc1tzXS50cmFuc2Zlcn0sZ2V0THVtaW5hbmNlQ29lZmZpY2llbnRzOmZ1bmN0aW9uKHMscj10aGlzLndvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gcy5mcm9tQXJyYXkodGhpcy5zcGFjZXNbcl0ubHVtaW5hbmNlQ29lZmZpY2llbnRzKX0sZGVmaW5lOmZ1bmN0aW9uKHMpe09iamVjdC5hc3NpZ24odGhpcy5zcGFjZXMscyl9LF9nZXRNYXRyaXg6ZnVuY3Rpb24ocyxyLG8pe3JldHVybiBzLmNvcHkodGhpcy5zcGFjZXNbcl0udG9YWVopLm11bHRpcGx5KHRoaXMuc3BhY2VzW29dLmZyb21YWVopfSxfZ2V0RHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMuc3BhY2VzW3NdLm91dHB1dENvbG9yU3BhY2VDb25maWcuZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2V9LF9nZXRVbnBhY2tDb2xvclNwYWNlOmZ1bmN0aW9uKHM9dGhpcy53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHRoaXMuc3BhY2VzW3NdLndvcmtpbmdDb2xvclNwYWNlQ29uZmlnLnVucGFja0NvbG9yU3BhY2V9LGZyb21Xb3JraW5nQ29sb3JTcGFjZTpmdW5jdGlvbihzLHIpe3JldHVybiBUYygiVEhSRUUuQ29sb3JNYW5hZ2VtZW50OiAuZnJvbVdvcmtpbmdDb2xvclNwYWNlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAud29ya2luZ1RvQ29sb3JTcGFjZSgpLiIpLGkud29ya2luZ1RvQ29sb3JTcGFjZShzLHIpfSx0b1dvcmtpbmdDb2xvclNwYWNlOmZ1bmN0aW9uKHMscil7cmV0dXJuIFRjKCJUSFJFRS5Db2xvck1hbmFnZW1lbnQ6IC50b1dvcmtpbmdDb2xvclNwYWNlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY29sb3JTcGFjZVRvV29ya2luZygpLiIpLGkuY29sb3JTcGFjZVRvV29ya2luZyhzLHIpfX0sdD1bLjY0LC4zMywuMywuNiwuMTUsLjA2XSxlPVsuMjEyNiwuNzE1MiwuMDcyMl0sbj1bLjMxMjcsLjMyOV07cmV0dXJuIGkuZGVmaW5lKHtbQWNdOntwcmltYXJpZXM6dCx3aGl0ZVBvaW50Om4sdHJhbnNmZXI6U2MsdG9YWVo6RWMsZnJvbVhZWjpQYyxsdW1pbmFuY2VDb2VmZmljaWVudHM6ZSx3b3JraW5nQ29sb3JTcGFjZUNvbmZpZzp7dW5wYWNrQ29sb3JTcGFjZTpvZX0sb3V0cHV0Q29sb3JTcGFjZUNvbmZpZzp7ZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6b2V9fSxbb2VdOntwcmltYXJpZXM6dCx3aGl0ZVBvaW50Om4sdHJhbnNmZXI6bm8sdG9YWVo6RWMsZnJvbVhZWjpQYyxsdW1pbmFuY2VDb2VmZmljaWVudHM6ZSxvdXRwdXRDb2xvclNwYWNlQ29uZmlnOntkcmF3aW5nQnVmZmVyQ29sb3JTcGFjZTpvZX19fSksaX1jb25zdCBhZT1lZigpO2Z1bmN0aW9uIF9lKGkpe3JldHVybiBpPC4wNDA0NT9pKi4wNzczOTkzODA4Ok1hdGgucG93KGkqLjk0Nzg2NzI5ODYrLjA1MjEzMjcwMTQsMi40KX1mdW5jdGlvbiBJbihpKXtyZXR1cm4gaTwuMDAzMTMwOD9pKjEyLjkyOjEuMDU1Kk1hdGgucG93KGksLjQxNjY2KS0uMDU1fWxldCBrbjtjbGFzcyBuZntzdGF0aWMgZ2V0RGF0YVVSTCh0LGU9ImltYWdlL3BuZyIpe2lmKC9eZGF0YTovaS50ZXN0KHQuc3JjKXx8dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50PT0idW5kZWZpbmVkIilyZXR1cm4gdC5zcmM7bGV0IG47aWYodCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KW49dDtlbHNle2tuPT09dm9pZCAwJiYoa249dmMoImNhbnZhcyIpKSxrbi53aWR0aD10LndpZHRoLGtuLmhlaWdodD10LmhlaWdodDtjb25zdCBzPWtuLmdldENvbnRleHQoIjJkIik7dCBpbnN0YW5jZW9mIEltYWdlRGF0YT9zLnB1dEltYWdlRGF0YSh0LDAsMCk6cy5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCksbj1rbn1yZXR1cm4gbi50b0RhdGFVUkwoZSl9c3RhdGljIHNSR0JUb0xpbmVhcih0KXtpZih0eXBlb2YgSFRNTEltYWdlRWxlbWVudCE9InVuZGVmaW5lZCImJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHx0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQhPSJ1bmRlZmluZWQiJiZ0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fHR5cGVvZiBJbWFnZUJpdG1hcCE9InVuZGVmaW5lZCImJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7Y29uc3QgZT12YygiY2FudmFzIik7ZS53aWR0aD10LndpZHRoLGUuaGVpZ2h0PXQuaGVpZ2h0O2NvbnN0IG49ZS5nZXRDb250ZXh0KCIyZCIpO24uZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpO2NvbnN0IHM9bi5nZXRJbWFnZURhdGEoMCwwLHQud2lkdGgsdC5oZWlnaHQpLHI9cy5kYXRhO2ZvcihsZXQgbz0wO288ci5sZW5ndGg7bysrKXJbb109X2UocltvXS8yNTUpKjI1NTtyZXR1cm4gbi5wdXRJbWFnZURhdGEocywwLDApLGV9ZWxzZSBpZih0LmRhdGEpe2NvbnN0IGU9dC5kYXRhLnNsaWNlKDApO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxlIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXk/ZVtuXT1NYXRoLmZsb29yKF9lKGVbbl0vMjU1KSoyNTUpOmVbbl09X2UoZVtuXSk7cmV0dXJue2RhdGE6ZSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH19ZWxzZSByZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLnNSR0JUb0xpbmVhcigpOiBVbnN1cHBvcnRlZCBpbWFnZSB0eXBlLiBObyBjb2xvciBzcGFjZSBjb252ZXJzaW9uIGFwcGxpZWQuIiksdH19bGV0IHNmPTA7Y2xhc3MgcmZ7Y29uc3RydWN0b3IodD1udWxsKXt0aGlzLmlzU291cmNlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOnNmKyt9KSx0aGlzLnV1aWQ9Rm4oKSx0aGlzLmRhdGE9dCx0aGlzLmRhdGFSZWFkeT0hMCx0aGlzLnZlcnNpb249MH1nZXRTaXplKHQpe2NvbnN0IGU9dGhpcy5kYXRhO3JldHVybiBlIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudD90LnNldChlLnZpZGVvV2lkdGgsZS52aWRlb0hlaWdodCwwKTplIGluc3RhbmNlb2YgVmlkZW9GcmFtZT90LnNldChlLmRpc3BsYXlIZWlnaHQsZS5kaXNwbGF5V2lkdGgsMCk6ZSE9PW51bGw/dC5zZXQoZS53aWR0aCxlLmhlaWdodCxlLmRlcHRofHwwKTp0LnNldCgwLDAsMCksdH1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK310b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyI7aWYoIWUmJnQuaW1hZ2VzW3RoaXMudXVpZF0hPT12b2lkIDApcmV0dXJuIHQuaW1hZ2VzW3RoaXMudXVpZF07Y29uc3Qgbj17dXVpZDp0aGlzLnV1aWQsdXJsOiIifSxzPXRoaXMuZGF0YTtpZihzIT09bnVsbCl7bGV0IHI7aWYoQXJyYXkuaXNBcnJheShzKSl7cj1bXTtmb3IobGV0IG89MCxhPXMubGVuZ3RoO288YTtvKyspc1tvXS5pc0RhdGFUZXh0dXJlP3IucHVzaChvbyhzW29dLmltYWdlKSk6ci5wdXNoKG9vKHNbb10pKX1lbHNlIHI9b28ocyk7bi51cmw9cn1yZXR1cm4gZXx8KHQuaW1hZ2VzW3RoaXMudXVpZF09biksbn19ZnVuY3Rpb24gb28oaSl7cmV0dXJuIHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50IT0idW5kZWZpbmVkIiYmaSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCE9InVuZGVmaW5lZCImJmkgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8dHlwZW9mIEltYWdlQml0bWFwIT0idW5kZWZpbmVkIiYmaSBpbnN0YW5jZW9mIEltYWdlQml0bWFwP25mLmdldERhdGFVUkwoaSk6aS5kYXRhP3tkYXRhOkFycmF5LmZyb20oaS5kYXRhKSx3aWR0aDppLndpZHRoLGhlaWdodDppLmhlaWdodCx0eXBlOmkuZGF0YS5jb25zdHJ1Y3Rvci5uYW1lfTooY29uc29sZS53YXJuKCJUSFJFRS5UZXh0dXJlOiBVbmFibGUgdG8gc2VyaWFsaXplIFRleHR1cmUuIikse30pfWxldCBvZj0wO2NvbnN0IGFvPW5ldyBUO2NsYXNzIGxuIGV4dGVuZHMgY3N7Y29uc3RydWN0b3IodD1sbi5ERUZBVUxUX0lNQUdFLGU9bG4uREVGQVVMVF9NQVBQSU5HLG49MTAwMSxzPTEwMDEscj0xMDA2LG89MTAwOCxhPTEwMjMsYz0xMDA5LGw9bG4uREVGQVVMVF9BTklTT1RST1BZLGg9TWMpe3N1cGVyKCksdGhpcy5pc1RleHR1cmU9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6b2YrK30pLHRoaXMudXVpZD1GbigpLHRoaXMubmFtZT0iIix0aGlzLnNvdXJjZT1uZXcgcmYodCksdGhpcy5taXBtYXBzPVtdLHRoaXMubWFwcGluZz1lLHRoaXMuY2hhbm5lbD0wLHRoaXMud3JhcFM9bix0aGlzLndyYXBUPXMsdGhpcy5tYWdGaWx0ZXI9cix0aGlzLm1pbkZpbHRlcj1vLHRoaXMuYW5pc290cm9weT1sLHRoaXMuZm9ybWF0PWEsdGhpcy5pbnRlcm5hbEZvcm1hdD1udWxsLHRoaXMudHlwZT1jLHRoaXMub2Zmc2V0PW5ldyBSKDAsMCksdGhpcy5yZXBlYXQ9bmV3IFIoMSwxKSx0aGlzLmNlbnRlcj1uZXcgUigwLDApLHRoaXMucm90YXRpb249MCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITAsdGhpcy5tYXRyaXg9bmV3IG1lLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSEwLHRoaXMucHJlbXVsdGlwbHlBbHBoYT0hMSx0aGlzLmZsaXBZPSEwLHRoaXMudW5wYWNrQWxpZ25tZW50PTQsdGhpcy5jb2xvclNwYWNlPWgsdGhpcy51c2VyRGF0YT17fSx0aGlzLnVwZGF0ZVJhbmdlcz1bXSx0aGlzLnZlcnNpb249MCx0aGlzLm9uVXBkYXRlPW51bGwsdGhpcy5yZW5kZXJUYXJnZXQ9bnVsbCx0aGlzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMSx0aGlzLmlzQXJyYXlUZXh0dXJlPSEhKHQmJnQuZGVwdGgmJnQuZGVwdGg+MSksdGhpcy5wbXJlbVZlcnNpb249MH1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy5zb3VyY2UuZ2V0U2l6ZShhbykueH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMuc291cmNlLmdldFNpemUoYW8pLnl9Z2V0IGRlcHRoKCl7cmV0dXJuIHRoaXMuc291cmNlLmdldFNpemUoYW8pLnp9Z2V0IGltYWdlKCl7cmV0dXJuIHRoaXMuc291cmNlLmRhdGF9c2V0IGltYWdlKHQ9bnVsbCl7dGhpcy5zb3VyY2UuZGF0YT10fXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKHRoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueSx0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnksdGhpcy5yb3RhdGlvbix0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnkpfWFkZFVwZGF0ZVJhbmdlKHQsZSl7dGhpcy51cGRhdGVSYW5nZXMucHVzaCh7c3RhcnQ6dCxjb3VudDplfSl9Y2xlYXJVcGRhdGVSYW5nZXMoKXt0aGlzLnVwZGF0ZVJhbmdlcy5sZW5ndGg9MH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5uYW1lPXQubmFtZSx0aGlzLnNvdXJjZT10LnNvdXJjZSx0aGlzLm1pcG1hcHM9dC5taXBtYXBzLnNsaWNlKDApLHRoaXMubWFwcGluZz10Lm1hcHBpbmcsdGhpcy5jaGFubmVsPXQuY2hhbm5lbCx0aGlzLndyYXBTPXQud3JhcFMsdGhpcy53cmFwVD10LndyYXBULHRoaXMubWFnRmlsdGVyPXQubWFnRmlsdGVyLHRoaXMubWluRmlsdGVyPXQubWluRmlsdGVyLHRoaXMuYW5pc290cm9weT10LmFuaXNvdHJvcHksdGhpcy5mb3JtYXQ9dC5mb3JtYXQsdGhpcy5pbnRlcm5hbEZvcm1hdD10LmludGVybmFsRm9ybWF0LHRoaXMudHlwZT10LnR5cGUsdGhpcy5vZmZzZXQuY29weSh0Lm9mZnNldCksdGhpcy5yZXBlYXQuY29weSh0LnJlcGVhdCksdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5yb3RhdGlvbj10LnJvdGF0aW9uLHRoaXMubWF0cml4QXV0b1VwZGF0ZT10Lm1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5nZW5lcmF0ZU1pcG1hcHM9dC5nZW5lcmF0ZU1pcG1hcHMsdGhpcy5wcmVtdWx0aXBseUFscGhhPXQucHJlbXVsdGlwbHlBbHBoYSx0aGlzLmZsaXBZPXQuZmxpcFksdGhpcy51bnBhY2tBbGlnbm1lbnQ9dC51bnBhY2tBbGlnbm1lbnQsdGhpcy5jb2xvclNwYWNlPXQuY29sb3JTcGFjZSx0aGlzLnJlbmRlclRhcmdldD10LnJlbmRlclRhcmdldCx0aGlzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT10LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSx0aGlzLmlzQXJyYXlUZXh0dXJlPXQuaXNBcnJheVRleHR1cmUsdGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQudXNlckRhdGEpKSx0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXN9c2V0VmFsdWVzKHQpe2Zvcihjb25zdCBlIGluIHQpe2NvbnN0IG49dFtlXTtpZihuPT09dm9pZCAwKXtjb25zb2xlLndhcm4oYFRIUkVFLlRleHR1cmUuc2V0VmFsdWVzKCk6IHBhcmFtZXRlciAnJHtlfScgaGFzIHZhbHVlIG9mIHVuZGVmaW5lZC5gKTtjb250aW51ZX1jb25zdCBzPXRoaXNbZV07aWYocz09PXZvaWQgMCl7Y29uc29sZS53YXJuKGBUSFJFRS5UZXh0dXJlLnNldFZhbHVlcygpOiBwcm9wZXJ0eSAnJHtlfScgZG9lcyBub3QgZXhpc3QuYCk7Y29udGludWV9cyYmbiYmcy5pc1ZlY3RvcjImJm4uaXNWZWN0b3IyfHxzJiZuJiZzLmlzVmVjdG9yMyYmbi5pc1ZlY3RvcjN8fHMmJm4mJnMuaXNNYXRyaXgzJiZuLmlzTWF0cml4Mz9zLmNvcHkobik6dGhpc1tlXT1ufX10b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyI7aWYoIWUmJnQudGV4dHVyZXNbdGhpcy51dWlkXSE9PXZvaWQgMClyZXR1cm4gdC50ZXh0dXJlc1t0aGlzLnV1aWRdO2NvbnN0IG49e21ldGFkYXRhOnt2ZXJzaW9uOjQuNyx0eXBlOiJUZXh0dXJlIixnZW5lcmF0b3I6IlRleHR1cmUudG9KU09OIn0sdXVpZDp0aGlzLnV1aWQsbmFtZTp0aGlzLm5hbWUsaW1hZ2U6dGhpcy5zb3VyY2UudG9KU09OKHQpLnV1aWQsbWFwcGluZzp0aGlzLm1hcHBpbmcsY2hhbm5lbDp0aGlzLmNoYW5uZWwscmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCxpbnRlcm5hbEZvcm1hdDp0aGlzLmludGVybmFsRm9ybWF0LHR5cGU6dGhpcy50eXBlLGNvbG9yU3BhY2U6dGhpcy5jb2xvclNwYWNlLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxnZW5lcmF0ZU1pcG1hcHM6dGhpcy5nZW5lcmF0ZU1pcG1hcHMscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtyZXR1cm4gT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihuLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGV8fCh0LnRleHR1cmVzW3RoaXMudXVpZF09biksbn1kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXRyYW5zZm9ybVV2KHQpe2lmKHRoaXMubWFwcGluZyE9PTMwMClyZXR1cm4gdDtpZih0LmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCksdC54PDB8fHQueD4xKXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIDFlMzp0Lng9dC54LU1hdGguZmxvb3IodC54KTticmVhaztjYXNlIDEwMDE6dC54PXQueDwwPzA6MTticmVhaztjYXNlIDEwMDI6TWF0aC5hYnMoTWF0aC5mbG9vcih0LngpJTIpPT09MT90Lng9TWF0aC5jZWlsKHQueCktdC54OnQueD10LngtTWF0aC5mbG9vcih0LngpO2JyZWFrfWlmKHQueTwwfHx0Lnk+MSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSAxZTM6dC55PXQueS1NYXRoLmZsb29yKHQueSk7YnJlYWs7Y2FzZSAxMDAxOnQueT10Lnk8MD8wOjE7YnJlYWs7Y2FzZSAxMDAyOk1hdGguYWJzKE1hdGguZmxvb3IodC55KSUyKT09PTE/dC55PU1hdGguY2VpbCh0LnkpLXQueTp0Lnk9dC55LU1hdGguZmxvb3IodC55KTticmVha31yZXR1cm4gdGhpcy5mbGlwWSYmKHQueT0xLXQueSksdH1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiYodGhpcy52ZXJzaW9uKyssdGhpcy5zb3VyY2UubmVlZHNVcGRhdGU9ITApfXNldCBuZWVkc1BNUkVNVXBkYXRlKHQpe3Q9PT0hMCYmdGhpcy5wbXJlbVZlcnNpb24rK319bG4uREVGQVVMVF9JTUFHRT1udWxsLGxuLkRFRkFVTFRfTUFQUElORz0zMDAsbG4uREVGQVVMVF9BTklTT1RST1BZPTE7Y2xhc3MgWXR7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAscz0xKXtZdC5wcm90b3R5cGUuaXNWZWN0b3I0PSEwLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXMudz1zfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnp9c2V0IHdpZHRoKHQpe3RoaXMuej10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy53fXNldCBoZWlnaHQodCl7dGhpcy53PXR9c2V0KHQsZSxuLHMpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzLnc9cyx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpcy53PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRXKHQpe3JldHVybiB0aGlzLnc9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztjYXNlIDM6dGhpcy53PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2Nhc2UgMzpyZXR1cm4gdGhpcy53O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56LHRoaXMudyl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXMuej10LnosdGhpcy53PXQudyE9PXZvaWQgMD90Lnc6MSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpcy53Kz10LncsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXMudys9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpcy53PXQudytlLncsdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpcy53Kz10LncqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpcy53LT10LncsdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXMudy09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpcy56PXQuei1lLnosdGhpcy53PXQudy1lLncsdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpcy56Kj10LnosdGhpcy53Kj10LncsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzLnoqPXQsdGhpcy53Kj10LHRoaXN9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHM9dGhpcy56LHI9dGhpcy53LG89dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PW9bMF0qZStvWzRdKm4rb1s4XSpzK29bMTJdKnIsdGhpcy55PW9bMV0qZStvWzVdKm4rb1s5XSpzK29bMTNdKnIsdGhpcy56PW9bMl0qZStvWzZdKm4rb1sxMF0qcytvWzE0XSpyLHRoaXMudz1vWzNdKmUrb1s3XSpuK29bMTFdKnMrb1sxNV0qcix0aGlzfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpcy56Lz10LnosdGhpcy53Lz10LncsdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1zZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbih0KXt0aGlzLnc9MipNYXRoLmFjb3ModC53KTtjb25zdCBlPU1hdGguc3FydCgxLXQudyp0LncpO3JldHVybiBlPDFlLTQ/KHRoaXMueD0xLHRoaXMueT0wLHRoaXMuej0wKToodGhpcy54PXQueC9lLHRoaXMueT10LnkvZSx0aGlzLno9dC56L2UpLHRoaXN9c2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4KHQpe2xldCBlLG4scyxyO2NvbnN0IGM9dC5lbGVtZW50cyxsPWNbMF0saD1jWzRdLHU9Y1s4XSxmPWNbMV0sZD1jWzVdLHA9Y1s5XSx5PWNbMl0sbT1jWzZdLGc9Y1sxMF07aWYoTWF0aC5hYnMoaC1mKTwuMDEmJk1hdGguYWJzKHUteSk8LjAxJiZNYXRoLmFicyhwLW0pPC4wMSl7aWYoTWF0aC5hYnMoaCtmKTwuMSYmTWF0aC5hYnModSt5KTwuMSYmTWF0aC5hYnMocCttKTwuMSYmTWF0aC5hYnMobCtkK2ctMyk8LjEpcmV0dXJuIHRoaXMuc2V0KDEsMCwwLDApLHRoaXM7ZT1NYXRoLlBJO2NvbnN0IHc9KGwrMSkvMix4PShkKzEpLzIsTT0oZysxKS8yLEE9KGgrZikvNCxTPSh1K3kpLzQsXz0ocCttKS80O3JldHVybiB3PngmJnc+TT93PC4wMT8obj0wLHM9LjcwNzEwNjc4MSxyPS43MDcxMDY3ODEpOihuPU1hdGguc3FydCh3KSxzPUEvbixyPVMvbik6eD5NP3g8LjAxPyhuPS43MDcxMDY3ODEscz0wLHI9LjcwNzEwNjc4MSk6KHM9TWF0aC5zcXJ0KHgpLG49QS9zLHI9Xy9zKTpNPC4wMT8obj0uNzA3MTA2NzgxLHM9LjcwNzEwNjc4MSxyPTApOihyPU1hdGguc3FydChNKSxuPVMvcixzPV8vciksdGhpcy5zZXQobixzLHIsZSksdGhpc31sZXQgYj1NYXRoLnNxcnQoKG0tcCkqKG0tcCkrKHUteSkqKHUteSkrKGYtaCkqKGYtaCkpO3JldHVybiBNYXRoLmFicyhiKTwuMDAxJiYoYj0xKSx0aGlzLng9KG0tcCkvYix0aGlzLnk9KHUteSkvYix0aGlzLno9KGYtaCkvYix0aGlzLnc9TWF0aC5hY29zKChsK2QrZy0xKS8yKSx0aGlzfXNldEZyb21NYXRyaXhQb3NpdGlvbih0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1lWzEyXSx0aGlzLnk9ZVsxM10sdGhpcy56PWVbMTRdLHRoaXMudz1lWzE1XSx0aGlzfW1pbih0KXtyZXR1cm4gdGhpcy54PU1hdGgubWluKHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdC55KSx0aGlzLno9TWF0aC5taW4odGhpcy56LHQueiksdGhpcy53PU1hdGgubWluKHRoaXMudyx0LncpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5tYXgodGhpcy53LHQudyksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9Ryh0aGlzLngsdC54LGUueCksdGhpcy55PUcodGhpcy55LHQueSxlLnkpLHRoaXMuej1HKHRoaXMueix0LnosZS56KSx0aGlzLnc9Ryh0aGlzLncsdC53LGUudyksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9Ryh0aGlzLngsdCxlKSx0aGlzLnk9Ryh0aGlzLnksdCxlKSx0aGlzLno9Ryh0aGlzLnosdCxlKSx0aGlzLnc9Ryh0aGlzLncsdCxlKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihHKG4sdCxlKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej1NYXRoLmZsb29yKHRoaXMueiksdGhpcy53PU1hdGguZmxvb3IodGhpcy53KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzLno9TWF0aC5jZWlsKHRoaXMueiksdGhpcy53PU1hdGguY2VpbCh0aGlzLncpLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXMuej1NYXRoLnJvdW5kKHRoaXMueiksdGhpcy53PU1hdGgucm91bmQodGhpcy53KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD1NYXRoLnRydW5jKHRoaXMueCksdGhpcy55PU1hdGgudHJ1bmModGhpcy55KSx0aGlzLno9TWF0aC50cnVuYyh0aGlzLnopLHRoaXMudz1NYXRoLnRydW5jKHRoaXMudyksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpcy53PS10aGlzLncsdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56K3RoaXMudyp0Lnd9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMud31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLncpfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KStNYXRoLmFicyh0aGlzLncpfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpcy56Kz0odC56LXRoaXMueikqZSx0aGlzLncrPSh0LnctdGhpcy53KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpcy56PXQueisoZS56LXQueikqbix0aGlzLnc9dC53KyhlLnctdC53KSpuLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56JiZ0Lnc9PT10aGlzLnd9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXMudz10W2UrM10sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0W2UrMl09dGhpcy56LHRbZSszXT10aGlzLncsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXMudz10LmdldFcoZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpcy53PU1hdGgucmFuZG9tKCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55LHlpZWxkIHRoaXMueix5aWVsZCB0aGlzLnd9fWNsYXNzIGd0e2NvbnN0cnVjdG9yKHQ9bmV3IFQoMS8wLDEvMCwxLzApLGU9bmV3IFQoLTEvMCwtMS8wLC0xLzApKXt0aGlzLmlzQm94Mz0hMCx0aGlzLm1pbj10LHRoaXMubWF4PWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMubWluLmNvcHkodCksdGhpcy5tYXguY29weShlKSx0aGlzfXNldEZyb21BcnJheSh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrPTMpdGhpcy5leHBhbmRCeVBvaW50KGNlLmZyb21BcnJheSh0LGUpKTtyZXR1cm4gdGhpc31zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10LmNvdW50O2U8bjtlKyspdGhpcy5leHBhbmRCeVBvaW50KGNlLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSk7cmV0dXJuIHRoaXN9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQodFtlXSk7cmV0dXJuIHRoaXN9c2V0RnJvbUNlbnRlckFuZFNpemUodCxlKXtjb25zdCBuPWNlLmNvcHkoZSkubXVsdGlwbHlTY2FsYXIoLjUpO3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLnN1YihuKSx0aGlzLm1heC5jb3B5KHQpLmFkZChuKSx0aGlzfXNldEZyb21PYmplY3QodCxlPSExKXtyZXR1cm4gdGhpcy5tYWtlRW1wdHkoKSx0aGlzLmV4cGFuZEJ5T2JqZWN0KHQsZSl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMubWluLmNvcHkodC5taW4pLHRoaXMubWF4LmNvcHkodC5tYXgpLHRoaXN9bWFrZUVtcHR5KCl7cmV0dXJuIHRoaXMubWluLng9dGhpcy5taW4ueT10aGlzLm1pbi56PTEvMCx0aGlzLm1heC54PXRoaXMubWF4Lnk9dGhpcy5tYXguej0tMS8wLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueXx8dGhpcy5tYXguejx0aGlzLm1pbi56fWdldENlbnRlcih0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuYWRkVmVjdG9ycyh0aGlzLm1pbix0aGlzLm1heCkubXVsdGlwbHlTY2FsYXIoLjUpfWdldFNpemUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCwwKTp0LnN1YlZlY3RvcnModGhpcy5tYXgsdGhpcy5taW4pfWV4cGFuZEJ5UG9pbnQodCl7cmV0dXJuIHRoaXMubWluLm1pbih0KSx0aGlzLm1heC5tYXgodCksdGhpc31leHBhbmRCeVZlY3Rvcih0KXtyZXR1cm4gdGhpcy5taW4uc3ViKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWV4cGFuZEJ5U2NhbGFyKHQpe3JldHVybiB0aGlzLm1pbi5hZGRTY2FsYXIoLXQpLHRoaXMubWF4LmFkZFNjYWxhcih0KSx0aGlzfWV4cGFuZEJ5T2JqZWN0KHQsZT0hMSl7dC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMSk7Y29uc3Qgbj10Lmdlb21ldHJ5O2lmKG4hPT12b2lkIDApe2NvbnN0IHI9bi5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aWYoZT09PSEwJiZyIT09dm9pZCAwJiZ0LmlzSW5zdGFuY2VkTWVzaCE9PSEwKWZvcihsZXQgbz0wLGE9ci5jb3VudDtvPGE7bysrKXQuaXNNZXNoPT09ITA/dC5nZXRWZXJ0ZXhQb3NpdGlvbihvLGNlKTpjZS5mcm9tQnVmZmVyQXR0cmlidXRlKHIsbyksY2UuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMuZXhwYW5kQnlQb2ludChjZSk7ZWxzZSB0LmJvdW5kaW5nQm94IT09dm9pZCAwPyh0LmJvdW5kaW5nQm94PT09bnVsbCYmdC5jb21wdXRlQm91bmRpbmdCb3goKSxscy5jb3B5KHQuYm91bmRpbmdCb3gpKToobi5ib3VuZGluZ0JveD09PW51bGwmJm4uY29tcHV0ZUJvdW5kaW5nQm94KCksbHMuY29weShuLmJvdW5kaW5nQm94KSksbHMuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMudW5pb24obHMpfWNvbnN0IHM9dC5jaGlsZHJlbjtmb3IobGV0IHI9MCxvPXMubGVuZ3RoO3I8bztyKyspdGhpcy5leHBhbmRCeU9iamVjdChzW3JdLGUpO3JldHVybiB0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIHQueD49dGhpcy5taW4ueCYmdC54PD10aGlzLm1heC54JiZ0Lnk+PXRoaXMubWluLnkmJnQueTw9dGhpcy5tYXgueSYmdC56Pj10aGlzLm1pbi56JiZ0Lno8PXRoaXMubWF4Lnp9Y29udGFpbnNCb3godCl7cmV0dXJuIHRoaXMubWluLng8PXQubWluLngmJnQubWF4Lng8PXRoaXMubWF4LngmJnRoaXMubWluLnk8PXQubWluLnkmJnQubWF4Lnk8PXRoaXMubWF4LnkmJnRoaXMubWluLno8PXQubWluLnomJnQubWF4Lno8PXRoaXMubWF4Lnp9Z2V0UGFyYW1ldGVyKHQsZSl7cmV0dXJuIGUuc2V0KCh0LngtdGhpcy5taW4ueCkvKHRoaXMubWF4LngtdGhpcy5taW4ueCksKHQueS10aGlzLm1pbi55KS8odGhpcy5tYXgueS10aGlzLm1pbi55KSwodC56LXRoaXMubWluLnopLyh0aGlzLm1heC56LXRoaXMubWluLnopKX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0Lm1heC54Pj10aGlzLm1pbi54JiZ0Lm1pbi54PD10aGlzLm1heC54JiZ0Lm1heC55Pj10aGlzLm1pbi55JiZ0Lm1pbi55PD10aGlzLm1heC55JiZ0Lm1heC56Pj10aGlzLm1pbi56JiZ0Lm1pbi56PD10aGlzLm1heC56fWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuY2xhbXBQb2ludCh0LmNlbnRlcixjZSksY2UuZGlzdGFuY2VUb1NxdWFyZWQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31pbnRlcnNlY3RzUGxhbmUodCl7bGV0IGUsbjtyZXR1cm4gdC5ub3JtYWwueD4wPyhlPXQubm9ybWFsLngqdGhpcy5taW4ueCxuPXQubm9ybWFsLngqdGhpcy5tYXgueCk6KGU9dC5ub3JtYWwueCp0aGlzLm1heC54LG49dC5ub3JtYWwueCp0aGlzLm1pbi54KSx0Lm5vcm1hbC55PjA/KGUrPXQubm9ybWFsLnkqdGhpcy5taW4ueSxuKz10Lm5vcm1hbC55KnRoaXMubWF4LnkpOihlKz10Lm5vcm1hbC55KnRoaXMubWF4Lnksbis9dC5ub3JtYWwueSp0aGlzLm1pbi55KSx0Lm5vcm1hbC56PjA/KGUrPXQubm9ybWFsLnoqdGhpcy5taW4ueixuKz10Lm5vcm1hbC56KnRoaXMubWF4LnopOihlKz10Lm5vcm1hbC56KnRoaXMubWF4Lnosbis9dC5ub3JtYWwueip0aGlzLm1pbi56KSxlPD0tdC5jb25zdGFudCYmbj49LXQuY29uc3RhbnR9aW50ZXJzZWN0c1RyaWFuZ2xlKHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO3RoaXMuZ2V0Q2VudGVyKGJpKSxocy5zdWJWZWN0b3JzKHRoaXMubWF4LGJpKSxObi5zdWJWZWN0b3JzKHQuYSxiaSksUm4uc3ViVmVjdG9ycyh0LmIsYmkpLExuLnN1YlZlY3RvcnModC5jLGJpKSxaZS5zdWJWZWN0b3JzKFJuLE5uKSxKZS5zdWJWZWN0b3JzKExuLFJuKSxobi5zdWJWZWN0b3JzKE5uLExuKTtsZXQgZT1bMCwtWmUueixaZS55LDAsLUplLnosSmUueSwwLC1obi56LGhuLnksWmUueiwwLC1aZS54LEplLnosMCwtSmUueCxobi56LDAsLWhuLngsLVplLnksWmUueCwwLC1KZS55LEplLngsMCwtaG4ueSxobi54LDBdO3JldHVybiFjbyhlLE5uLFJuLExuLGhzKXx8KGU9WzEsMCwwLDAsMSwwLDAsMCwxXSwhY28oZSxObixSbixMbixocykpPyExOih1cy5jcm9zc1ZlY3RvcnMoWmUsSmUpLGU9W3VzLngsdXMueSx1cy56XSxjbyhlLE5uLFJuLExuLGhzKSl9Y2xhbXBQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQsY2UpLmRpc3RhbmNlVG8odCl9Z2V0Qm91bmRpbmdTcGhlcmUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3QubWFrZUVtcHR5KCk6KHRoaXMuZ2V0Q2VudGVyKHQuY2VudGVyKSx0LnJhZGl1cz10aGlzLmdldFNpemUoY2UpLmxlbmd0aCgpKi41KSx0fWludGVyc2VjdCh0KXtyZXR1cm4gdGhpcy5taW4ubWF4KHQubWluKSx0aGlzLm1heC5taW4odC5tYXgpLHRoaXMuaXNFbXB0eSgpJiZ0aGlzLm1ha2VFbXB0eSgpLHRoaXN9dW5pb24odCl7cmV0dXJuIHRoaXMubWluLm1pbih0Lm1pbiksdGhpcy5tYXgubWF4KHQubWF4KSx0aGlzfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dGhpczoodmVbMF0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksdmVbMV0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksdmVbMl0uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksdmVbM10uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksdmVbNF0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksdmVbNV0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksdmVbNl0uc2V0KHRoaXMubWF4LngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksdmVbN10uc2V0KHRoaXMubWF4LngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksdGhpcy5zZXRGcm9tUG9pbnRzKHZlKSx0aGlzKX10cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMubWluLmFkZCh0KSx0aGlzLm1heC5hZGQodCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQubWluLmVxdWFscyh0aGlzLm1pbikmJnQubWF4LmVxdWFscyh0aGlzLm1heCl9dG9KU09OKCl7cmV0dXJue21pbjp0aGlzLm1pbi50b0FycmF5KCksbWF4OnRoaXMubWF4LnRvQXJyYXkoKX19ZnJvbUpTT04odCl7cmV0dXJuIHRoaXMubWluLmZyb21BcnJheSh0Lm1pbiksdGhpcy5tYXguZnJvbUFycmF5KHQubWF4KSx0aGlzfX1jb25zdCB2ZT1bbmV3IFQsbmV3IFQsbmV3IFQsbmV3IFQsbmV3IFQsbmV3IFQsbmV3IFQsbmV3IFRdLGNlPW5ldyBULGxzPW5ldyBndCxObj1uZXcgVCxSbj1uZXcgVCxMbj1uZXcgVCxaZT1uZXcgVCxKZT1uZXcgVCxobj1uZXcgVCxiaT1uZXcgVCxocz1uZXcgVCx1cz1uZXcgVCx1bj1uZXcgVDtmdW5jdGlvbiBjbyhpLHQsZSxuLHMpe2ZvcihsZXQgcj0wLG89aS5sZW5ndGgtMztyPD1vO3IrPTMpe3VuLmZyb21BcnJheShpLHIpO2NvbnN0IGE9cy54Kk1hdGguYWJzKHVuLngpK3MueSpNYXRoLmFicyh1bi55KStzLnoqTWF0aC5hYnModW4ueiksYz10LmRvdCh1biksbD1lLmRvdCh1biksaD1uLmRvdCh1bik7aWYoTWF0aC5tYXgoLU1hdGgubWF4KGMsbCxoKSxNYXRoLm1pbihjLGwsaCkpPmEpcmV0dXJuITF9cmV0dXJuITB9Y29uc3QgYWY9bmV3IGd0LE1pPW5ldyBULGxvPW5ldyBUO2NsYXNzIGhve2NvbnN0cnVjdG9yKHQ9bmV3IFQsZT0tMSl7dGhpcy5pc1NwaGVyZT0hMCx0aGlzLmNlbnRlcj10LHRoaXMucmFkaXVzPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodCksdGhpcy5yYWRpdXM9ZSx0aGlzfXNldEZyb21Qb2ludHModCxlKXtjb25zdCBuPXRoaXMuY2VudGVyO2UhPT12b2lkIDA/bi5jb3B5KGUpOmFmLnNldEZyb21Qb2ludHModCkuZ2V0Q2VudGVyKG4pO2xldCBzPTA7Zm9yKGxldCByPTAsbz10Lmxlbmd0aDtyPG87cisrKXM9TWF0aC5tYXgocyxuLmRpc3RhbmNlVG9TcXVhcmVkKHRbcl0pKTtyZXR1cm4gdGhpcy5yYWRpdXM9TWF0aC5zcXJ0KHMpLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMucmFkaXVzPDB9bWFrZUVtcHR5KCl7cmV0dXJuIHRoaXMuY2VudGVyLnNldCgwLDAsMCksdGhpcy5yYWRpdXM9LTEsdGhpc31jb250YWluc1BvaW50KHQpe3JldHVybiB0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXN9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiB0LmRpc3RhbmNlVG8odGhpcy5jZW50ZXIpLXRoaXMucmFkaXVzfWludGVyc2VjdHNTcGhlcmUodCl7Y29uc3QgZT10aGlzLnJhZGl1cyt0LnJhZGl1cztyZXR1cm4gdC5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD1lKmV9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzU3BoZXJlKHRoaXMpfWludGVyc2VjdHNQbGFuZSh0KXtyZXR1cm4gTWF0aC5hYnModC5kaXN0YW5jZVRvUG9pbnQodGhpcy5jZW50ZXIpKTw9dGhpcy5yYWRpdXN9Y2xhbXBQb2ludCh0LGUpe2NvbnN0IG49dGhpcy5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodCk7cmV0dXJuIGUuY29weSh0KSxuPnRoaXMucmFkaXVzKnRoaXMucmFkaXVzJiYoZS5zdWIodGhpcy5jZW50ZXIpLm5vcm1hbGl6ZSgpLGUubXVsdGlwbHlTY2FsYXIodGhpcy5yYWRpdXMpLmFkZCh0aGlzLmNlbnRlcikpLGV9Z2V0Qm91bmRpbmdCb3godCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpPyh0Lm1ha2VFbXB0eSgpLHQpOih0LnNldCh0aGlzLmNlbnRlcix0aGlzLmNlbnRlciksdC5leHBhbmRCeVNjYWxhcih0aGlzLnJhZGl1cyksdCl9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLmNlbnRlci5hcHBseU1hdHJpeDQodCksdGhpcy5yYWRpdXM9dGhpcy5yYWRpdXMqdC5nZXRNYXhTY2FsZU9uQXhpcygpLHRoaXN9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLmNlbnRlci5hZGQodCksdGhpc31leHBhbmRCeVBvaW50KHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiB0aGlzLmNlbnRlci5jb3B5KHQpLHRoaXMucmFkaXVzPTAsdGhpcztNaS5zdWJWZWN0b3JzKHQsdGhpcy5jZW50ZXIpO2NvbnN0IGU9TWkubGVuZ3RoU3EoKTtpZihlPnRoaXMucmFkaXVzKnRoaXMucmFkaXVzKXtjb25zdCBuPU1hdGguc3FydChlKSxzPShuLXRoaXMucmFkaXVzKSouNTt0aGlzLmNlbnRlci5hZGRTY2FsZWRWZWN0b3IoTWkscy9uKSx0aGlzLnJhZGl1cys9c31yZXR1cm4gdGhpc311bmlvbih0KXtyZXR1cm4gdC5pc0VtcHR5KCk/dGhpczp0aGlzLmlzRW1wdHkoKT8odGhpcy5jb3B5KHQpLHRoaXMpOih0aGlzLmNlbnRlci5lcXVhbHModC5jZW50ZXIpPT09ITA/dGhpcy5yYWRpdXM9TWF0aC5tYXgodGhpcy5yYWRpdXMsdC5yYWRpdXMpOihsby5zdWJWZWN0b3JzKHQuY2VudGVyLHRoaXMuY2VudGVyKS5zZXRMZW5ndGgodC5yYWRpdXMpLHRoaXMuZXhwYW5kQnlQb2ludChNaS5jb3B5KHQuY2VudGVyKS5hZGQobG8pKSx0aGlzLmV4cGFuZEJ5UG9pbnQoTWkuY29weSh0LmNlbnRlcikuc3ViKGxvKSkpLHRoaXMpfWVxdWFscyh0KXtyZXR1cm4gdC5jZW50ZXIuZXF1YWxzKHRoaXMuY2VudGVyKSYmdC5yYWRpdXM9PT10aGlzLnJhZGl1c31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9dG9KU09OKCl7cmV0dXJue3JhZGl1czp0aGlzLnJhZGl1cyxjZW50ZXI6dGhpcy5jZW50ZXIudG9BcnJheSgpfX1mcm9tSlNPTih0KXtyZXR1cm4gdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpcy5jZW50ZXIuZnJvbUFycmF5KHQuY2VudGVyKSx0aGlzfX1jb25zdCB6ZT1uZXcgVCx1bz1uZXcgVCxmcz1uZXcgVCxZZT1uZXcgVCxmbz1uZXcgVCxkcz1uZXcgVCxwbz1uZXcgVDtjbGFzcyB5b3tjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQoMCwwLC0xKSl7dGhpcy5vcmlnaW49dCx0aGlzLmRpcmVjdGlvbj1lfXNldCh0LGUpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQpLHRoaXMuZGlyZWN0aW9uLmNvcHkoZSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQub3JpZ2luKSx0aGlzLmRpcmVjdGlvbi5jb3B5KHQuZGlyZWN0aW9uKSx0aGlzfWF0KHQsZSl7cmV0dXJuIGUuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLHQpfWxvb2tBdCh0KXtyZXR1cm4gdGhpcy5kaXJlY3Rpb24uY29weSh0KS5zdWIodGhpcy5vcmlnaW4pLm5vcm1hbGl6ZSgpLHRoaXN9cmVjYXN0KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHRoaXMuYXQodCx6ZSkpLHRoaXN9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2Uuc3ViVmVjdG9ycyh0LHRoaXMub3JpZ2luKTtjb25zdCBuPWUuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gbjwwP2UuY29weSh0aGlzLm9yaWdpbik6ZS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sbil9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVNxVG9Qb2ludCh0KSl9ZGlzdGFuY2VTcVRvUG9pbnQodCl7Y29uc3QgZT16ZS5zdWJWZWN0b3JzKHQsdGhpcy5vcmlnaW4pLmRvdCh0aGlzLmRpcmVjdGlvbik7cmV0dXJuIGU8MD90aGlzLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZCh0KTooemUuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLGUpLHplLmRpc3RhbmNlVG9TcXVhcmVkKHQpKX1kaXN0YW5jZVNxVG9TZWdtZW50KHQsZSxuLHMpe3VvLmNvcHkodCkuYWRkKGUpLm11bHRpcGx5U2NhbGFyKC41KSxmcy5jb3B5KGUpLnN1Yih0KS5ub3JtYWxpemUoKSxZZS5jb3B5KHRoaXMub3JpZ2luKS5zdWIodW8pO2NvbnN0IHI9dC5kaXN0YW5jZVRvKGUpKi41LG89LXRoaXMuZGlyZWN0aW9uLmRvdChmcyksYT1ZZS5kb3QodGhpcy5kaXJlY3Rpb24pLGM9LVllLmRvdChmcyksbD1ZZS5sZW5ndGhTcSgpLGg9TWF0aC5hYnMoMS1vKm8pO2xldCB1LGYsZCxwO2lmKGg+MClpZih1PW8qYy1hLGY9byphLWMscD1yKmgsdT49MClpZihmPj0tcClpZihmPD1wKXtjb25zdCB5PTEvaDt1Kj15LGYqPXksZD11Kih1K28qZisyKmEpK2YqKG8qdStmKzIqYykrbH1lbHNlIGY9cix1PU1hdGgubWF4KDAsLShvKmYrYSkpLGQ9LXUqdStmKihmKzIqYykrbDtlbHNlIGY9LXIsdT1NYXRoLm1heCgwLC0obypmK2EpKSxkPS11KnUrZiooZisyKmMpK2w7ZWxzZSBmPD0tcD8odT1NYXRoLm1heCgwLC0oLW8qcithKSksZj11PjA/LXI6TWF0aC5taW4oTWF0aC5tYXgoLXIsLWMpLHIpLGQ9LXUqdStmKihmKzIqYykrbCk6Zjw9cD8odT0wLGY9TWF0aC5taW4oTWF0aC5tYXgoLXIsLWMpLHIpLGQ9ZiooZisyKmMpK2wpOih1PU1hdGgubWF4KDAsLShvKnIrYSkpLGY9dT4wP3I6TWF0aC5taW4oTWF0aC5tYXgoLXIsLWMpLHIpLGQ9LXUqdStmKihmKzIqYykrbCk7ZWxzZSBmPW8+MD8tcjpyLHU9TWF0aC5tYXgoMCwtKG8qZithKSksZD0tdSp1K2YqKGYrMipjKStsO3JldHVybiBuJiZuLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbix1KSxzJiZzLmNvcHkodW8pLmFkZFNjYWxlZFZlY3RvcihmcyxmKSxkfWludGVyc2VjdFNwaGVyZSh0LGUpe3plLnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5vcmlnaW4pO2NvbnN0IG49emUuZG90KHRoaXMuZGlyZWN0aW9uKSxzPXplLmRvdCh6ZSktbipuLHI9dC5yYWRpdXMqdC5yYWRpdXM7aWYocz5yKXJldHVybiBudWxsO2NvbnN0IG89TWF0aC5zcXJ0KHItcyksYT1uLW8sYz1uK287cmV0dXJuIGM8MD9udWxsOmE8MD90aGlzLmF0KGMsZSk6dGhpcy5hdChhLGUpfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHQucmFkaXVzPDA/ITE6dGhpcy5kaXN0YW5jZVNxVG9Qb2ludCh0LmNlbnRlcik8PXQucmFkaXVzKnQucmFkaXVzfWRpc3RhbmNlVG9QbGFuZSh0KXtjb25zdCBlPXQubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbik7aWYoZT09PTApcmV0dXJuIHQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKT09PTA/MDpudWxsO2NvbnN0IG49LSh0aGlzLm9yaWdpbi5kb3QodC5ub3JtYWwpK3QuY29uc3RhbnQpL2U7cmV0dXJuIG4+PTA/bjpudWxsfWludGVyc2VjdFBsYW5lKHQsZSl7Y29uc3Qgbj10aGlzLmRpc3RhbmNlVG9QbGFuZSh0KTtyZXR1cm4gbj09PW51bGw/bnVsbDp0aGlzLmF0KG4sZSl9aW50ZXJzZWN0c1BsYW5lKHQpe2NvbnN0IGU9dC5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pO3JldHVybiBlPT09MHx8dC5ub3JtYWwuZG90KHRoaXMuZGlyZWN0aW9uKSplPDB9aW50ZXJzZWN0Qm94KHQsZSl7bGV0IG4scyxyLG8sYSxjO2NvbnN0IGw9MS90aGlzLmRpcmVjdGlvbi54LGg9MS90aGlzLmRpcmVjdGlvbi55LHU9MS90aGlzLmRpcmVjdGlvbi56LGY9dGhpcy5vcmlnaW47cmV0dXJuIGw+PTA/KG49KHQubWluLngtZi54KSpsLHM9KHQubWF4LngtZi54KSpsKToobj0odC5tYXgueC1mLngpKmwscz0odC5taW4ueC1mLngpKmwpLGg+PTA/KHI9KHQubWluLnktZi55KSpoLG89KHQubWF4LnktZi55KSpoKToocj0odC5tYXgueS1mLnkpKmgsbz0odC5taW4ueS1mLnkpKmgpLG4+b3x8cj5zfHwoKHI+bnx8aXNOYU4obikpJiYobj1yKSwobzxzfHxpc05hTihzKSkmJihzPW8pLHU+PTA/KGE9KHQubWluLnotZi56KSp1LGM9KHQubWF4LnotZi56KSp1KTooYT0odC5tYXguei1mLnopKnUsYz0odC5taW4uei1mLnopKnUpLG4+Y3x8YT5zKXx8KChhPm58fG4hPT1uKSYmKG49YSksKGM8c3x8cyE9PXMpJiYocz1jKSxzPDApP251bGw6dGhpcy5hdChuPj0wP246cyxlKX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0aGlzLmludGVyc2VjdEJveCh0LHplKSE9PW51bGx9aW50ZXJzZWN0VHJpYW5nbGUodCxlLG4scyxyKXtmby5zdWJWZWN0b3JzKGUsdCksZHMuc3ViVmVjdG9ycyhuLHQpLHBvLmNyb3NzVmVjdG9ycyhmbyxkcyk7bGV0IG89dGhpcy5kaXJlY3Rpb24uZG90KHBvKSxhO2lmKG8+MCl7aWYocylyZXR1cm4gbnVsbDthPTF9ZWxzZSBpZihvPDApYT0tMSxvPS1vO2Vsc2UgcmV0dXJuIG51bGw7WWUuc3ViVmVjdG9ycyh0aGlzLm9yaWdpbix0KTtjb25zdCBjPWEqdGhpcy5kaXJlY3Rpb24uZG90KGRzLmNyb3NzVmVjdG9ycyhZZSxkcykpO2lmKGM8MClyZXR1cm4gbnVsbDtjb25zdCBsPWEqdGhpcy5kaXJlY3Rpb24uZG90KGZvLmNyb3NzKFllKSk7aWYobDwwfHxjK2w+bylyZXR1cm4gbnVsbDtjb25zdCBoPS1hKlllLmRvdChwbyk7cmV0dXJuIGg8MD9udWxsOnRoaXMuYXQoaC9vLHIpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uYXBwbHlNYXRyaXg0KHQpLHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5vcmlnaW4uZXF1YWxzKHRoaXMub3JpZ2luKSYmdC5kaXJlY3Rpb24uZXF1YWxzKHRoaXMuZGlyZWN0aW9uKX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNsYXNzIHN0e2NvbnN0cnVjdG9yKHQsZSxuLHMscixvLGEsYyxsLGgsdSxmLGQscCx5LG0pe3N0LnByb3RvdHlwZS5pc01hdHJpeDQ9ITAsdGhpcy5lbGVtZW50cz1bMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV0sdCE9PXZvaWQgMCYmdGhpcy5zZXQodCxlLG4scyxyLG8sYSxjLGwsaCx1LGYsZCxwLHksbSl9c2V0KHQsZSxuLHMscixvLGEsYyxsLGgsdSxmLGQscCx5LG0pe2NvbnN0IGc9dGhpcy5lbGVtZW50cztyZXR1cm4gZ1swXT10LGdbNF09ZSxnWzhdPW4sZ1sxMl09cyxnWzFdPXIsZ1s1XT1vLGdbOV09YSxnWzEzXT1jLGdbMl09bCxnWzZdPWgsZ1sxMF09dSxnWzE0XT1mLGdbM109ZCxnWzddPXAsZ1sxMV09eSxnWzE1XT1tLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgc3QoKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9Y29weSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO3JldHVybiBlWzBdPW5bMF0sZVsxXT1uWzFdLGVbMl09blsyXSxlWzNdPW5bM10sZVs0XT1uWzRdLGVbNV09bls1XSxlWzZdPW5bNl0sZVs3XT1uWzddLGVbOF09bls4XSxlWzldPW5bOV0sZVsxMF09blsxMF0sZVsxMV09blsxMV0sZVsxMl09blsxMl0sZVsxM109blsxM10sZVsxNF09blsxNF0sZVsxNV09blsxNV0sdGhpc31jb3B5UG9zaXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVsxMl09blsxMl0sZVsxM109blsxM10sZVsxNF09blsxNF0sdGhpc31zZXRGcm9tTWF0cml4Myh0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KGVbMF0sZVszXSxlWzZdLDAsZVsxXSxlWzRdLGVbN10sMCxlWzJdLGVbNV0sZVs4XSwwLDAsMCwwLDEpLHRoaXN9ZXh0cmFjdEJhc2lzKHQsZSxuKXtyZXR1cm4gdC5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMCksZS5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMSksbi5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMiksdGhpc31tYWtlQmFzaXModCxlLG4pe3JldHVybiB0aGlzLnNldCh0LngsZS54LG4ueCwwLHQueSxlLnksbi55LDAsdC56LGUueixuLnosMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RSb3RhdGlvbih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzLHM9MS9Pbi5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMCkubGVuZ3RoKCkscj0xL09uLnNldEZyb21NYXRyaXhDb2x1bW4odCwxKS5sZW5ndGgoKSxvPTEvT24uc2V0RnJvbU1hdHJpeENvbHVtbih0LDIpLmxlbmd0aCgpO3JldHVybiBlWzBdPW5bMF0qcyxlWzFdPW5bMV0qcyxlWzJdPW5bMl0qcyxlWzNdPTAsZVs0XT1uWzRdKnIsZVs1XT1uWzVdKnIsZVs2XT1uWzZdKnIsZVs3XT0wLGVbOF09bls4XSpvLGVbOV09bls5XSpvLGVbMTBdPW5bMTBdKm8sZVsxMV09MCxlWzEyXT0wLGVbMTNdPTAsZVsxNF09MCxlWzE1XT0xLHRoaXN9bWFrZVJvdGF0aW9uRnJvbUV1bGVyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQueCxzPXQueSxyPXQueixvPU1hdGguY29zKG4pLGE9TWF0aC5zaW4obiksYz1NYXRoLmNvcyhzKSxsPU1hdGguc2luKHMpLGg9TWF0aC5jb3MociksdT1NYXRoLnNpbihyKTtpZih0Lm9yZGVyPT09IlhZWiIpe2NvbnN0IGY9bypoLGQ9byp1LHA9YSpoLHk9YSp1O2VbMF09YypoLGVbNF09LWMqdSxlWzhdPWwsZVsxXT1kK3AqbCxlWzVdPWYteSpsLGVbOV09LWEqYyxlWzJdPXktZipsLGVbNl09cCtkKmwsZVsxMF09bypjfWVsc2UgaWYodC5vcmRlcj09PSJZWFoiKXtjb25zdCBmPWMqaCxkPWMqdSxwPWwqaCx5PWwqdTtlWzBdPWYreSphLGVbNF09cCphLWQsZVs4XT1vKmwsZVsxXT1vKnUsZVs1XT1vKmgsZVs5XT0tYSxlWzJdPWQqYS1wLGVbNl09eStmKmEsZVsxMF09bypjfWVsc2UgaWYodC5vcmRlcj09PSJaWFkiKXtjb25zdCBmPWMqaCxkPWMqdSxwPWwqaCx5PWwqdTtlWzBdPWYteSphLGVbNF09LW8qdSxlWzhdPXArZCphLGVbMV09ZCtwKmEsZVs1XT1vKmgsZVs5XT15LWYqYSxlWzJdPS1vKmwsZVs2XT1hLGVbMTBdPW8qY31lbHNlIGlmKHQub3JkZXI9PT0iWllYIil7Y29uc3QgZj1vKmgsZD1vKnUscD1hKmgseT1hKnU7ZVswXT1jKmgsZVs0XT1wKmwtZCxlWzhdPWYqbCt5LGVbMV09Yyp1LGVbNV09eSpsK2YsZVs5XT1kKmwtcCxlWzJdPS1sLGVbNl09YSpjLGVbMTBdPW8qY31lbHNlIGlmKHQub3JkZXI9PT0iWVpYIil7Y29uc3QgZj1vKmMsZD1vKmwscD1hKmMseT1hKmw7ZVswXT1jKmgsZVs0XT15LWYqdSxlWzhdPXAqdStkLGVbMV09dSxlWzVdPW8qaCxlWzldPS1hKmgsZVsyXT0tbCpoLGVbNl09ZCp1K3AsZVsxMF09Zi15KnV9ZWxzZSBpZih0Lm9yZGVyPT09IlhaWSIpe2NvbnN0IGY9bypjLGQ9bypsLHA9YSpjLHk9YSpsO2VbMF09YypoLGVbNF09LXUsZVs4XT1sKmgsZVsxXT1mKnUreSxlWzVdPW8qaCxlWzldPWQqdS1wLGVbMl09cCp1LWQsZVs2XT1hKmgsZVsxMF09eSp1K2Z9cmV0dXJuIGVbM109MCxlWzddPTAsZVsxMV09MCxlWzEyXT0wLGVbMTNdPTAsZVsxNF09MCxlWzE1XT0xLHRoaXN9bWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMuY29tcG9zZShjZix0LGxmKX1sb29rQXQodCxlLG4pe2NvbnN0IHM9dGhpcy5lbGVtZW50cztyZXR1cm4gJHQuc3ViVmVjdG9ycyh0LGUpLCR0Lmxlbmd0aFNxKCk9PT0wJiYoJHQuej0xKSwkdC5ub3JtYWxpemUoKSxqZS5jcm9zc1ZlY3RvcnMobiwkdCksamUubGVuZ3RoU3EoKT09PTAmJihNYXRoLmFicyhuLnopPT09MT8kdC54Kz0xZS00OiR0LnorPTFlLTQsJHQubm9ybWFsaXplKCksamUuY3Jvc3NWZWN0b3JzKG4sJHQpKSxqZS5ub3JtYWxpemUoKSxwcy5jcm9zc1ZlY3RvcnMoJHQsamUpLHNbMF09amUueCxzWzRdPXBzLngsc1s4XT0kdC54LHNbMV09amUueSxzWzVdPXBzLnksc1s5XT0kdC55LHNbMl09amUueixzWzZdPXBzLnosc1sxMF09JHQueix0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHQsdGhpcyl9bXVsdGlwbHlNYXRyaWNlcyh0LGUpe2NvbnN0IG49dC5lbGVtZW50cyxzPWUuZWxlbWVudHMscj10aGlzLmVsZW1lbnRzLG89blswXSxhPW5bNF0sYz1uWzhdLGw9blsxMl0saD1uWzFdLHU9bls1XSxmPW5bOV0sZD1uWzEzXSxwPW5bMl0seT1uWzZdLG09blsxMF0sZz1uWzE0XSxiPW5bM10sdz1uWzddLHg9blsxMV0sTT1uWzE1XSxBPXNbMF0sUz1zWzRdLF89c1s4XSxFPXNbMTJdLHo9c1sxXSx2PXNbNV0sQz1zWzldLFA9c1sxM10sRj1zWzJdLEI9c1s2XSxJPXNbMTBdLGs9c1sxNF0sRD1zWzNdLFU9c1s3XSxqPXNbMTFdLGR0PXNbMTVdO3JldHVybiByWzBdPW8qQSthKnorYypGK2wqRCxyWzRdPW8qUythKnYrYypCK2wqVSxyWzhdPW8qXythKkMrYypJK2wqaixyWzEyXT1vKkUrYSpQK2MqaytsKmR0LHJbMV09aCpBK3UqeitmKkYrZCpELHJbNV09aCpTK3UqditmKkIrZCpVLHJbOV09aCpfK3UqQytmKkkrZCpqLHJbMTNdPWgqRSt1KlArZiprK2QqZHQsclsyXT1wKkEreSp6K20qRitnKkQscls2XT1wKlMreSp2K20qQitnKlUsclsxMF09cCpfK3kqQyttKkkrZypqLHJbMTRdPXAqRSt5KlArbSprK2cqZHQsclszXT1iKkErdyp6K3gqRitNKkQscls3XT1iKlMrdyp2K3gqQitNKlUsclsxMV09YipfK3cqQyt4KkkrTSpqLHJbMTVdPWIqRSt3KlAreCprK00qZHQsdGhpc31tdWx0aXBseVNjYWxhcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIGVbMF0qPXQsZVs0XSo9dCxlWzhdKj10LGVbMTJdKj10LGVbMV0qPXQsZVs1XSo9dCxlWzldKj10LGVbMTNdKj10LGVbMl0qPXQsZVs2XSo9dCxlWzEwXSo9dCxlWzE0XSo9dCxlWzNdKj10LGVbN10qPXQsZVsxMV0qPXQsZVsxNV0qPXQsdGhpc31kZXRlcm1pbmFudCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzRdLHM9dFs4XSxyPXRbMTJdLG89dFsxXSxhPXRbNV0sYz10WzldLGw9dFsxM10saD10WzJdLHU9dFs2XSxmPXRbMTBdLGQ9dFsxNF0scD10WzNdLHk9dFs3XSxtPXRbMTFdLGc9dFsxNV07cmV0dXJuIHAqKCtyKmMqdS1zKmwqdS1yKmEqZituKmwqZitzKmEqZC1uKmMqZCkreSooK2UqYypkLWUqbCpmK3IqbypmLXMqbypkK3MqbCpoLXIqYypoKSttKigrZSpsKnUtZSphKmQtcipvKnUrbipvKmQrciphKmgtbipsKmgpK2cqKC1zKmEqaC1lKmMqdStlKmEqZitzKm8qdS1uKm8qZituKmMqaCl9dHJhbnNwb3NlKCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzO2xldCBlO3JldHVybiBlPXRbMV0sdFsxXT10WzRdLHRbNF09ZSxlPXRbMl0sdFsyXT10WzhdLHRbOF09ZSxlPXRbNl0sdFs2XT10WzldLHRbOV09ZSxlPXRbM10sdFszXT10WzEyXSx0WzEyXT1lLGU9dFs3XSx0WzddPXRbMTNdLHRbMTNdPWUsZT10WzExXSx0WzExXT10WzE0XSx0WzE0XT1lLHRoaXN9c2V0UG9zaXRpb24odCxlLG4pe2NvbnN0IHM9dGhpcy5lbGVtZW50cztyZXR1cm4gdC5pc1ZlY3RvcjM/KHNbMTJdPXQueCxzWzEzXT10Lnksc1sxNF09dC56KTooc1sxMl09dCxzWzEzXT1lLHNbMTRdPW4pLHRoaXN9aW52ZXJ0KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbMV0scz10WzJdLHI9dFszXSxvPXRbNF0sYT10WzVdLGM9dFs2XSxsPXRbN10saD10WzhdLHU9dFs5XSxmPXRbMTBdLGQ9dFsxMV0scD10WzEyXSx5PXRbMTNdLG09dFsxNF0sZz10WzE1XSxiPXUqbSpsLXkqZipsK3kqYypkLWEqbSpkLXUqYypnK2EqZipnLHc9cCpmKmwtaCptKmwtcCpjKmQrbyptKmQraCpjKmctbypmKmcseD1oKnkqbC1wKnUqbCtwKmEqZC1vKnkqZC1oKmEqZytvKnUqZyxNPXAqdSpjLWgqeSpjLXAqYSpmK28qeSpmK2gqYSptLW8qdSptLEE9ZSpiK24qdytzKngrcipNO2lmKEE9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwKTtjb25zdCBTPTEvQTtyZXR1cm4gdFswXT1iKlMsdFsxXT0oeSpmKnItdSptKnIteSpzKmQrbiptKmQrdSpzKmctbipmKmcpKlMsdFsyXT0oYSptKnIteSpjKnIreSpzKmwtbiptKmwtYSpzKmcrbipjKmcpKlMsdFszXT0odSpjKnItYSpmKnItdSpzKmwrbipmKmwrYSpzKmQtbipjKmQpKlMsdFs0XT13KlMsdFs1XT0oaCptKnItcCpmKnIrcCpzKmQtZSptKmQtaCpzKmcrZSpmKmcpKlMsdFs2XT0ocCpjKnItbyptKnItcCpzKmwrZSptKmwrbypzKmctZSpjKmcpKlMsdFs3XT0obypmKnItaCpjKnIraCpzKmwtZSpmKmwtbypzKmQrZSpjKmQpKlMsdFs4XT14KlMsdFs5XT0ocCp1KnItaCp5KnItcCpuKmQrZSp5KmQraCpuKmctZSp1KmcpKlMsdFsxMF09KG8qeSpyLXAqYSpyK3AqbipsLWUqeSpsLW8qbipnK2UqYSpnKSpTLHRbMTFdPShoKmEqci1vKnUqci1oKm4qbCtlKnUqbCtvKm4qZC1lKmEqZCkqUyx0WzEyXT1NKlMsdFsxM109KGgqeSpzLXAqdSpzK3AqbipmLWUqeSpmLWgqbiptK2UqdSptKSpTLHRbMTRdPShwKmEqcy1vKnkqcy1wKm4qYytlKnkqYytvKm4qbS1lKmEqbSkqUyx0WzE1XT0obyp1KnMtaCphKnMraCpuKmMtZSp1KmMtbypuKmYrZSphKmYpKlMsdGhpc31zY2FsZSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10Lngscz10Lnkscj10Lno7cmV0dXJuIGVbMF0qPW4sZVs0XSo9cyxlWzhdKj1yLGVbMV0qPW4sZVs1XSo9cyxlWzldKj1yLGVbMl0qPW4sZVs2XSo9cyxlWzEwXSo9cixlWzNdKj1uLGVbN10qPXMsZVsxMV0qPXIsdGhpc31nZXRNYXhTY2FsZU9uQXhpcygpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdLG49dFs0XSp0WzRdK3RbNV0qdFs1XSt0WzZdKnRbNl0scz10WzhdKnRbOF0rdFs5XSp0WzldK3RbMTBdKnRbMTBdO3JldHVybiBNYXRoLnNxcnQoTWF0aC5tYXgoZSxuLHMpKX1tYWtlVHJhbnNsYXRpb24odCxlLG4pe3JldHVybiB0LmlzVmVjdG9yMz90aGlzLnNldCgxLDAsMCx0LngsMCwxLDAsdC55LDAsMCwxLHQueiwwLDAsMCwxKTp0aGlzLnNldCgxLDAsMCx0LDAsMSwwLGUsMCwwLDEsbiwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvblgodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDAsZSwtbiwwLDAsbixlLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25ZKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwwLG4sMCwwLDEsMCwwLC1uLDAsZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWih0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsLW4sMCwwLG4sZSwwLDAsMCwwLDEsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbkF4aXModCxlKXtjb25zdCBuPU1hdGguY29zKGUpLHM9TWF0aC5zaW4oZSkscj0xLW4sbz10LngsYT10LnksYz10LnosbD1yKm8saD1yKmE7cmV0dXJuIHRoaXMuc2V0KGwqbytuLGwqYS1zKmMsbCpjK3MqYSwwLGwqYStzKmMsaCphK24saCpjLXMqbywwLGwqYy1zKmEsaCpjK3MqbyxyKmMqYytuLDAsMCwwLDAsMSksdGhpc31tYWtlU2NhbGUodCxlLG4pe3JldHVybiB0aGlzLnNldCh0LDAsMCwwLDAsZSwwLDAsMCwwLG4sMCwwLDAsMCwxKSx0aGlzfW1ha2VTaGVhcih0LGUsbixzLHIsbyl7cmV0dXJuIHRoaXMuc2V0KDEsbixyLDAsdCwxLG8sMCxlLHMsMSwwLDAsMCwwLDEpLHRoaXN9Y29tcG9zZSh0LGUsbil7Y29uc3Qgcz10aGlzLmVsZW1lbnRzLHI9ZS5feCxvPWUuX3ksYT1lLl96LGM9ZS5fdyxsPXIrcixoPW8rbyx1PWErYSxmPXIqbCxkPXIqaCxwPXIqdSx5PW8qaCxtPW8qdSxnPWEqdSxiPWMqbCx3PWMqaCx4PWMqdSxNPW4ueCxBPW4ueSxTPW4uejtyZXR1cm4gc1swXT0oMS0oeStnKSkqTSxzWzFdPShkK3gpKk0sc1syXT0ocC13KSpNLHNbM109MCxzWzRdPShkLXgpKkEsc1s1XT0oMS0oZitnKSkqQSxzWzZdPShtK2IpKkEsc1s3XT0wLHNbOF09KHArdykqUyxzWzldPShtLWIpKlMsc1sxMF09KDEtKGYreSkpKlMsc1sxMV09MCxzWzEyXT10Lngsc1sxM109dC55LHNbMTRdPXQueixzWzE1XT0xLHRoaXN9ZGVjb21wb3NlKHQsZSxuKXtjb25zdCBzPXRoaXMuZWxlbWVudHM7bGV0IHI9T24uc2V0KHNbMF0sc1sxXSxzWzJdKS5sZW5ndGgoKTtjb25zdCBvPU9uLnNldChzWzRdLHNbNV0sc1s2XSkubGVuZ3RoKCksYT1Pbi5zZXQoc1s4XSxzWzldLHNbMTBdKS5sZW5ndGgoKTt0aGlzLmRldGVybWluYW50KCk8MCYmKHI9LXIpLHQueD1zWzEyXSx0Lnk9c1sxM10sdC56PXNbMTRdLGxlLmNvcHkodGhpcyk7Y29uc3QgbD0xL3IsaD0xL28sdT0xL2E7cmV0dXJuIGxlLmVsZW1lbnRzWzBdKj1sLGxlLmVsZW1lbnRzWzFdKj1sLGxlLmVsZW1lbnRzWzJdKj1sLGxlLmVsZW1lbnRzWzRdKj1oLGxlLmVsZW1lbnRzWzVdKj1oLGxlLmVsZW1lbnRzWzZdKj1oLGxlLmVsZW1lbnRzWzhdKj11LGxlLmVsZW1lbnRzWzldKj11LGxlLmVsZW1lbnRzWzEwXSo9dSxlLnNldEZyb21Sb3RhdGlvbk1hdHJpeChsZSksbi54PXIsbi55PW8sbi56PWEsdGhpc31tYWtlUGVyc3BlY3RpdmUodCxlLG4scyxyLG8sYT0yZTMsYz0hMSl7Y29uc3QgbD10aGlzLmVsZW1lbnRzLGg9MipyLyhlLXQpLHU9MipyLyhuLXMpLGY9KGUrdCkvKGUtdCksZD0obitzKS8obi1zKTtsZXQgcCx5O2lmKGMpcD1yLyhvLXIpLHk9bypyLyhvLXIpO2Vsc2UgaWYoYT09PTJlMylwPS0obytyKS8oby1yKSx5PS0yKm8qci8oby1yKTtlbHNlIGlmKGE9PT0yMDAxKXA9LW8vKG8tcikseT0tbypyLyhvLXIpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5NYXRyaXg0Lm1ha2VQZXJzcGVjdGl2ZSgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK2EpO3JldHVybiBsWzBdPWgsbFs0XT0wLGxbOF09ZixsWzEyXT0wLGxbMV09MCxsWzVdPXUsbFs5XT1kLGxbMTNdPTAsbFsyXT0wLGxbNl09MCxsWzEwXT1wLGxbMTRdPXksbFszXT0wLGxbN109MCxsWzExXT0tMSxsWzE1XT0wLHRoaXN9bWFrZU9ydGhvZ3JhcGhpYyh0LGUsbixzLHIsbyxhPTJlMyxjPSExKXtjb25zdCBsPXRoaXMuZWxlbWVudHMsaD0yLyhlLXQpLHU9Mi8obi1zKSxmPS0oZSt0KS8oZS10KSxkPS0obitzKS8obi1zKTtsZXQgcCx5O2lmKGMpcD0xLyhvLXIpLHk9by8oby1yKTtlbHNlIGlmKGE9PT0yZTMpcD0tMi8oby1yKSx5PS0obytyKS8oby1yKTtlbHNlIGlmKGE9PT0yMDAxKXA9LTEvKG8tcikseT0tci8oby1yKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuTWF0cml4NC5tYWtlT3J0aG9ncmFwaGljKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrYSk7cmV0dXJuIGxbMF09aCxsWzRdPTAsbFs4XT0wLGxbMTJdPWYsbFsxXT0wLGxbNV09dSxsWzldPTAsbFsxM109ZCxsWzJdPTAsbFs2XT0wLGxbMTBdPXAsbFsxNF09eSxsWzNdPTAsbFs3XT0wLGxbMTFdPTAsbFsxNV09MSx0aGlzfWVxdWFscyh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO2ZvcihsZXQgcz0wO3M8MTY7cysrKWlmKGVbc10hPT1uW3NdKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBuPTA7bjwxNjtuKyspdGhpcy5lbGVtZW50c1tuXT10W24rZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPW5bMF0sdFtlKzFdPW5bMV0sdFtlKzJdPW5bMl0sdFtlKzNdPW5bM10sdFtlKzRdPW5bNF0sdFtlKzVdPW5bNV0sdFtlKzZdPW5bNl0sdFtlKzddPW5bN10sdFtlKzhdPW5bOF0sdFtlKzldPW5bOV0sdFtlKzEwXT1uWzEwXSx0W2UrMTFdPW5bMTFdLHRbZSsxMl09blsxMl0sdFtlKzEzXT1uWzEzXSx0W2UrMTRdPW5bMTRdLHRbZSsxNV09blsxNV0sdH19Y29uc3QgT249bmV3IFQsbGU9bmV3IHN0LGNmPW5ldyBUKDAsMCwwKSxsZj1uZXcgVCgxLDEsMSksamU9bmV3IFQscHM9bmV3IFQsJHQ9bmV3IFQsQ2M9bmV3IHN0LEJjPW5ldyB3aTtjbGFzcyBBaXtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxzPUFpLkRFRkFVTFRfT1JERVIpe3RoaXMuaXNFdWxlcj0hMCx0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl9vcmRlcj1zfWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCBvcmRlcigpe3JldHVybiB0aGlzLl9vcmRlcn1zZXQgb3JkZXIodCl7dGhpcy5fb3JkZXI9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9c2V0KHQsZSxuLHM9dGhpcy5fb3JkZXIpe3JldHVybiB0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl9vcmRlcj1zLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX29yZGVyKX1jb3B5KHQpe3JldHVybiB0aGlzLl94PXQuX3gsdGhpcy5feT10Ll95LHRoaXMuX3o9dC5feix0aGlzLl9vcmRlcj10Ll9vcmRlcix0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUm90YXRpb25NYXRyaXgodCxlPXRoaXMuX29yZGVyLG49ITApe2NvbnN0IHM9dC5lbGVtZW50cyxyPXNbMF0sbz1zWzRdLGE9c1s4XSxjPXNbMV0sbD1zWzVdLGg9c1s5XSx1PXNbMl0sZj1zWzZdLGQ9c1sxMF07c3dpdGNoKGUpe2Nhc2UiWFlaIjp0aGlzLl95PU1hdGguYXNpbihHKGEsLTEsMSkpLE1hdGguYWJzKGEpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoLWgsZCksdGhpcy5fej1NYXRoLmF0YW4yKC1vLHIpKToodGhpcy5feD1NYXRoLmF0YW4yKGYsbCksdGhpcy5fej0wKTticmVhaztjYXNlIllYWiI6dGhpcy5feD1NYXRoLmFzaW4oLUcoaCwtMSwxKSksTWF0aC5hYnMoaCk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMihhLGQpLHRoaXMuX3o9TWF0aC5hdGFuMihjLGwpKToodGhpcy5feT1NYXRoLmF0YW4yKC11LHIpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9TWF0aC5hc2luKEcoZiwtMSwxKSksTWF0aC5hYnMoZik8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMigtdSxkKSx0aGlzLl96PU1hdGguYXRhbjIoLW8sbCkpOih0aGlzLl95PTAsdGhpcy5fej1NYXRoLmF0YW4yKGMscikpO2JyZWFrO2Nhc2UiWllYIjp0aGlzLl95PU1hdGguYXNpbigtRyh1LC0xLDEpKSxNYXRoLmFicyh1KTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKGYsZCksdGhpcy5fej1NYXRoLmF0YW4yKGMscikpOih0aGlzLl94PTAsdGhpcy5fej1NYXRoLmF0YW4yKC1vLGwpKTticmVhaztjYXNlIllaWCI6dGhpcy5fej1NYXRoLmFzaW4oRyhjLC0xLDEpKSxNYXRoLmFicyhjKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1oLGwpLHRoaXMuX3k9TWF0aC5hdGFuMigtdSxyKSk6KHRoaXMuX3g9MCx0aGlzLl95PU1hdGguYXRhbjIoYSxkKSk7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3o9TWF0aC5hc2luKC1HKG8sLTEsMSkpLE1hdGguYWJzKG8pPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoZixsKSx0aGlzLl95PU1hdGguYXRhbjIoYSxyKSk6KHRoaXMuX3g9TWF0aC5hdGFuMigtaCxkKSx0aGlzLl95PTApO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrZSl9cmV0dXJuIHRoaXMuX29yZGVyPWUsbj09PSEwJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUXVhdGVybmlvbih0LGUsbil7cmV0dXJuIENjLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KENjLGUsbil9c2V0RnJvbVZlY3RvcjModCxlPXRoaXMuX29yZGVyKXtyZXR1cm4gdGhpcy5zZXQodC54LHQueSx0LnosZSl9cmVvcmRlcih0KXtyZXR1cm4gQmMuc2V0RnJvbUV1bGVyKHRoaXMpLHRoaXMuc2V0RnJvbVF1YXRlcm5pb24oQmMsdCl9ZXF1YWxzKHQpe3JldHVybiB0Ll94PT09dGhpcy5feCYmdC5feT09PXRoaXMuX3kmJnQuX3o9PT10aGlzLl96JiZ0Ll9vcmRlcj09PXRoaXMuX29yZGVyfWZyb21BcnJheSh0KXtyZXR1cm4gdGhpcy5feD10WzBdLHRoaXMuX3k9dFsxXSx0aGlzLl96PXRbMl0sdFszXSE9PXZvaWQgMCYmKHRoaXMuX29yZGVyPXRbM10pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX29yZGVyLHR9X29uQ2hhbmdlKHQpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPXQsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLl94LHlpZWxkIHRoaXMuX3kseWllbGQgdGhpcy5feix5aWVsZCB0aGlzLl9vcmRlcn19QWkuREVGQVVMVF9PUkRFUj0iWFlaIjtjbGFzcyBoZntjb25zdHJ1Y3Rvcigpe3RoaXMubWFzaz0xfXNldCh0KXt0aGlzLm1hc2s9KDE8PHR8MCk+Pj4wfWVuYWJsZSh0KXt0aGlzLm1hc2t8PTE8PHR8MH1lbmFibGVBbGwoKXt0aGlzLm1hc2s9LTF9dG9nZ2xlKHQpe3RoaXMubWFza149MTw8dHwwfWRpc2FibGUodCl7dGhpcy5tYXNrJj1+KDE8PHR8MCl9ZGlzYWJsZUFsbCgpe3RoaXMubWFzaz0wfXRlc3QodCl7cmV0dXJuKHRoaXMubWFzayZ0Lm1hc2spIT09MH1pc0VuYWJsZWQodCl7cmV0dXJuKHRoaXMubWFzayYoMTw8dHwwKSkhPT0wfX1sZXQgdWY9MDtjb25zdCBGYz1uZXcgVCxEbj1uZXcgd2ksVGU9bmV3IHN0LHlzPW5ldyBULFNpPW5ldyBULGZmPW5ldyBULGRmPW5ldyB3aSxJYz1uZXcgVCgxLDAsMCksa2M9bmV3IFQoMCwxLDApLE5jPW5ldyBUKDAsMCwxKSxSYz17dHlwZToiYWRkZWQifSxwZj17dHlwZToicmVtb3ZlZCJ9LCRuPXt0eXBlOiJjaGlsZGFkZGVkIixjaGlsZDpudWxsfSxtbz17dHlwZToiY2hpbGRyZW1vdmVkIixjaGlsZDpudWxsfTtjbGFzcyBFZSBleHRlbmRzIGNze2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzT2JqZWN0M0Q9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6dWYrK30pLHRoaXMudXVpZD1GbigpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9Ik9iamVjdDNEIix0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49W10sdGhpcy51cD1FZS5ERUZBVUxUX1VQLmNsb25lKCk7Y29uc3QgdD1uZXcgVCxlPW5ldyBBaSxuPW5ldyB3aSxzPW5ldyBUKDEsMSwxKTtmdW5jdGlvbiByKCl7bi5zZXRGcm9tRXVsZXIoZSwhMSl9ZnVuY3Rpb24gbygpe2Uuc2V0RnJvbVF1YXRlcm5pb24obix2b2lkIDAsITEpfWUuX29uQ2hhbmdlKHIpLG4uX29uQ2hhbmdlKG8pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3Bvc2l0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp0fSxyb3RhdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZX0scXVhdGVybmlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bn0sc2NhbGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnN9LG1vZGVsVmlld01hdHJpeDp7dmFsdWU6bmV3IHN0fSxub3JtYWxNYXRyaXg6e3ZhbHVlOm5ldyBtZX19KSx0aGlzLm1hdHJpeD1uZXcgc3QsdGhpcy5tYXRyaXhXb3JsZD1uZXcgc3QsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPUVlLkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPUVlLkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSx0aGlzLmxheWVycz1uZXcgaGYsdGhpcy52aXNpYmxlPSEwLHRoaXMuY2FzdFNoYWRvdz0hMSx0aGlzLnJlY2VpdmVTaGFkb3c9ITEsdGhpcy5mcnVzdHVtQ3VsbGVkPSEwLHRoaXMucmVuZGVyT3JkZXI9MCx0aGlzLmFuaW1hdGlvbnM9W10sdGhpcy5jdXN0b21EZXB0aE1hdGVyaWFsPXZvaWQgMCx0aGlzLmN1c3RvbURpc3RhbmNlTWF0ZXJpYWw9dm9pZCAwLHRoaXMudXNlckRhdGE9e319b25CZWZvcmVTaGFkb3coKXt9b25BZnRlclNoYWRvdygpe31vbkJlZm9yZVJlbmRlcigpe31vbkFmdGVyUmVuZGVyKCl7fWFwcGx5TWF0cml4NCh0KXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5tYXRyaXgucHJlbXVsdGlwbHkodCksdGhpcy5tYXRyaXguZGVjb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpfWFwcGx5UXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KHQpLHRoaXN9c2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlKHQsZSl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUodCxlKX1zZXRSb3RhdGlvbkZyb21FdWxlcih0KXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKHQsITApfXNldFJvdGF0aW9uRnJvbU1hdHJpeCh0KXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpfXNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCl7dGhpcy5xdWF0ZXJuaW9uLmNvcHkodCl9cm90YXRlT25BeGlzKHQsZSl7cmV0dXJuIERuLnNldEZyb21BeGlzQW5nbGUodCxlKSx0aGlzLnF1YXRlcm5pb24ubXVsdGlwbHkoRG4pLHRoaXN9cm90YXRlT25Xb3JsZEF4aXModCxlKXtyZXR1cm4gRG4uc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShEbiksdGhpc31yb3RhdGVYKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhJYyx0KX1yb3RhdGVZKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhrYyx0KX1yb3RhdGVaKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhOYyx0KX10cmFuc2xhdGVPbkF4aXModCxlKXtyZXR1cm4gRmMuY29weSh0KS5hcHBseVF1YXRlcm5pb24odGhpcy5xdWF0ZXJuaW9uKSx0aGlzLnBvc2l0aW9uLmFkZChGYy5tdWx0aXBseVNjYWxhcihlKSksdGhpc310cmFuc2xhdGVYKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhJYyx0KX10cmFuc2xhdGVZKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhrYyx0KX10cmFuc2xhdGVaKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhOYyx0KX1sb2NhbFRvV29ybGQodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpfXdvcmxkVG9Mb2NhbCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5hcHBseU1hdHJpeDQoVGUuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSl9bG9va0F0KHQsZSxuKXt0LmlzVmVjdG9yMz95cy5jb3B5KHQpOnlzLnNldCh0LGUsbik7Y29uc3Qgcz10aGlzLnBhcmVudDt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxTaS5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCksdGhpcy5pc0NhbWVyYXx8dGhpcy5pc0xpZ2h0P1RlLmxvb2tBdChTaSx5cyx0aGlzLnVwKTpUZS5sb29rQXQoeXMsU2ksdGhpcy51cCksdGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeChUZSkscyYmKFRlLmV4dHJhY3RSb3RhdGlvbihzLm1hdHJpeFdvcmxkKSxEbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoVGUpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShEbi5pbnZlcnQoKSkpfWFkZCh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2ZvcihsZXQgZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdGhpcy5hZGQoYXJndW1lbnRzW2VdKTtyZXR1cm4gdGhpc31yZXR1cm4gdD09PXRoaXM/KGNvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IGNhbid0IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgaXRzZWxmLiIsdCksdGhpcyk6KHQmJnQuaXNPYmplY3QzRD8odC5yZW1vdmVGcm9tUGFyZW50KCksdC5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2godCksdC5kaXNwYXRjaEV2ZW50KFJjKSwkbi5jaGlsZD10LHRoaXMuZGlzcGF0Y2hFdmVudCgkbiksJG4uY2hpbGQ9bnVsbCk6Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3Qgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLk9iamVjdDNELiIsdCksdGhpcyl9cmVtb3ZlKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7Zm9yKGxldCBuPTA7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0aGlzLnJlbW92ZShhcmd1bWVudHNbbl0pO3JldHVybiB0aGlzfWNvbnN0IGU9dGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpO3JldHVybiBlIT09LTEmJih0LnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW4uc3BsaWNlKGUsMSksdC5kaXNwYXRjaEV2ZW50KHBmKSxtby5jaGlsZD10LHRoaXMuZGlzcGF0Y2hFdmVudChtbyksbW8uY2hpbGQ9bnVsbCksdGhpc31yZW1vdmVGcm9tUGFyZW50KCl7Y29uc3QgdD10aGlzLnBhcmVudDtyZXR1cm4gdCE9PW51bGwmJnQucmVtb3ZlKHRoaXMpLHRoaXN9Y2xlYXIoKXtyZXR1cm4gdGhpcy5yZW1vdmUoLi4udGhpcy5jaGlsZHJlbil9YXR0YWNoKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxUZS5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpLHQucGFyZW50IT09bnVsbCYmKHQucGFyZW50LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxUZS5tdWx0aXBseSh0LnBhcmVudC5tYXRyaXhXb3JsZCkpLHQuYXBwbHlNYXRyaXg0KFRlKSx0LnJlbW92ZUZyb21QYXJlbnQoKSx0LnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4ucHVzaCh0KSx0LnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKSx0LmRpc3BhdGNoRXZlbnQoUmMpLCRuLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KCRuKSwkbi5jaGlsZD1udWxsLHRoaXN9Z2V0T2JqZWN0QnlJZCh0KXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJpZCIsdCl9Z2V0T2JqZWN0QnlOYW1lKHQpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoIm5hbWUiLHQpfWdldE9iamVjdEJ5UHJvcGVydHkodCxlKXtpZih0aGlzW3RdPT09ZSlyZXR1cm4gdGhpcztmb3IobGV0IG49MCxzPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO248cztuKyspe2NvbnN0IG89dGhpcy5jaGlsZHJlbltuXS5nZXRPYmplY3RCeVByb3BlcnR5KHQsZSk7aWYobyE9PXZvaWQgMClyZXR1cm4gb319Z2V0T2JqZWN0c0J5UHJvcGVydHkodCxlLG49W10pe3RoaXNbdF09PT1lJiZuLnB1c2godGhpcyk7Y29uc3Qgcz10aGlzLmNoaWxkcmVuO2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKylzW3JdLmdldE9iamVjdHNCeVByb3BlcnR5KHQsZSxuKTtyZXR1cm4gbn1nZXRXb3JsZFBvc2l0aW9uKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKX1nZXRXb3JsZFF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKFNpLHQsZmYpLHR9Z2V0V29ybGRTY2FsZSh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoU2ksZGYsdCksdH1nZXRXb3JsZERpcmVjdGlvbih0KXt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTtjb25zdCBlPXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIHQuc2V0KGVbOF0sZVs5XSxlWzEwXSkubm9ybWFsaXplKCl9cmF5Y2FzdCgpe310cmF2ZXJzZSh0KXt0KHRoaXMpO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxzPWUubGVuZ3RoO248cztuKyspZVtuXS50cmF2ZXJzZSh0KX10cmF2ZXJzZVZpc2libGUodCl7aWYodGhpcy52aXNpYmxlPT09ITEpcmV0dXJuO3QodGhpcyk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLHM9ZS5sZW5ndGg7bjxzO24rKyllW25dLnRyYXZlcnNlVmlzaWJsZSh0KX10cmF2ZXJzZUFuY2VzdG9ycyh0KXtjb25zdCBlPXRoaXMucGFyZW50O2UhPT1udWxsJiYodChlKSxlLnRyYXZlcnNlQW5jZXN0b3JzKHQpKX11cGRhdGVNYXRyaXgoKXt0aGlzLm1hdHJpeC5jb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH11cGRhdGVNYXRyaXhXb3JsZCh0KXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksKHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZXx8dCkmJih0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT09PSEwJiYodGhpcy5wYXJlbnQ9PT1udWxsP3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLHQ9ITApO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxzPWUubGVuZ3RoO248cztuKyspZVtuXS51cGRhdGVNYXRyaXhXb3JsZCh0KX11cGRhdGVXb3JsZE1hdHJpeCh0LGUpe2NvbnN0IG49dGhpcy5wYXJlbnQ7aWYodD09PSEwJiZuIT09bnVsbCYmbi51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPT09ITAmJih0aGlzLnBhcmVudD09PW51bGw/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpKSxlPT09ITApe2NvbnN0IHM9dGhpcy5jaGlsZHJlbjtmb3IobGV0IHI9MCxvPXMubGVuZ3RoO3I8bztyKyspc1tyXS51cGRhdGVXb3JsZE1hdHJpeCghMSwhMCl9fXRvSlNPTih0KXtjb25zdCBlPXQ9PT12b2lkIDB8fHR5cGVvZiB0PT0ic3RyaW5nIixuPXt9O2UmJih0PXtnZW9tZXRyaWVzOnt9LG1hdGVyaWFsczp7fSx0ZXh0dXJlczp7fSxpbWFnZXM6e30sc2hhcGVzOnt9LHNrZWxldG9uczp7fSxhbmltYXRpb25zOnt9LG5vZGVzOnt9fSxuLm1ldGFkYXRhPXt2ZXJzaW9uOjQuNyx0eXBlOiJPYmplY3QiLGdlbmVyYXRvcjoiT2JqZWN0M0QudG9KU09OIn0pO2NvbnN0IHM9e307cy51dWlkPXRoaXMudXVpZCxzLnR5cGU9dGhpcy50eXBlLHRoaXMubmFtZSE9PSIiJiYocy5uYW1lPXRoaXMubmFtZSksdGhpcy5jYXN0U2hhZG93PT09ITAmJihzLmNhc3RTaGFkb3c9ITApLHRoaXMucmVjZWl2ZVNoYWRvdz09PSEwJiYocy5yZWNlaXZlU2hhZG93PSEwKSx0aGlzLnZpc2libGU9PT0hMSYmKHMudmlzaWJsZT0hMSksdGhpcy5mcnVzdHVtQ3VsbGVkPT09ITEmJihzLmZydXN0dW1DdWxsZWQ9ITEpLHRoaXMucmVuZGVyT3JkZXIhPT0wJiYocy5yZW5kZXJPcmRlcj10aGlzLnJlbmRlck9yZGVyKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKHMudXNlckRhdGE9dGhpcy51c2VyRGF0YSkscy5sYXllcnM9dGhpcy5sYXllcnMubWFzayxzLm1hdHJpeD10aGlzLm1hdHJpeC50b0FycmF5KCkscy51cD10aGlzLnVwLnRvQXJyYXkoKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9PT0hMSYmKHMubWF0cml4QXV0b1VwZGF0ZT0hMSksdGhpcy5pc0luc3RhbmNlZE1lc2gmJihzLnR5cGU9Ikluc3RhbmNlZE1lc2giLHMuY291bnQ9dGhpcy5jb3VudCxzLmluc3RhbmNlTWF0cml4PXRoaXMuaW5zdGFuY2VNYXRyaXgudG9KU09OKCksdGhpcy5pbnN0YW5jZUNvbG9yIT09bnVsbCYmKHMuaW5zdGFuY2VDb2xvcj10aGlzLmluc3RhbmNlQ29sb3IudG9KU09OKCkpKSx0aGlzLmlzQmF0Y2hlZE1lc2gmJihzLnR5cGU9IkJhdGNoZWRNZXNoIixzLnBlck9iamVjdEZydXN0dW1DdWxsZWQ9dGhpcy5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkLHMuc29ydE9iamVjdHM9dGhpcy5zb3J0T2JqZWN0cyxzLmRyYXdSYW5nZXM9dGhpcy5fZHJhd1JhbmdlcyxzLnJlc2VydmVkUmFuZ2VzPXRoaXMuX3Jlc2VydmVkUmFuZ2VzLHMuZ2VvbWV0cnlJbmZvPXRoaXMuX2dlb21ldHJ5SW5mby5tYXAoYT0+V2UoRnQoe30sYSkse2JvdW5kaW5nQm94OmEuYm91bmRpbmdCb3g/YS5ib3VuZGluZ0JveC50b0pTT04oKTp2b2lkIDAsYm91bmRpbmdTcGhlcmU6YS5ib3VuZGluZ1NwaGVyZT9hLmJvdW5kaW5nU3BoZXJlLnRvSlNPTigpOnZvaWQgMH0pKSxzLmluc3RhbmNlSW5mbz10aGlzLl9pbnN0YW5jZUluZm8ubWFwKGE9PkZ0KHt9LGEpKSxzLmF2YWlsYWJsZUluc3RhbmNlSWRzPXRoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzLnNsaWNlKCkscy5hdmFpbGFibGVHZW9tZXRyeUlkcz10aGlzLl9hdmFpbGFibGVHZW9tZXRyeUlkcy5zbGljZSgpLHMubmV4dEluZGV4U3RhcnQ9dGhpcy5fbmV4dEluZGV4U3RhcnQscy5uZXh0VmVydGV4U3RhcnQ9dGhpcy5fbmV4dFZlcnRleFN0YXJ0LHMuZ2VvbWV0cnlDb3VudD10aGlzLl9nZW9tZXRyeUNvdW50LHMubWF4SW5zdGFuY2VDb3VudD10aGlzLl9tYXhJbnN0YW5jZUNvdW50LHMubWF4VmVydGV4Q291bnQ9dGhpcy5fbWF4VmVydGV4Q291bnQscy5tYXhJbmRleENvdW50PXRoaXMuX21heEluZGV4Q291bnQscy5nZW9tZXRyeUluaXRpYWxpemVkPXRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQscy5tYXRyaWNlc1RleHR1cmU9dGhpcy5fbWF0cmljZXNUZXh0dXJlLnRvSlNPTih0KSxzLmluZGlyZWN0VGV4dHVyZT10aGlzLl9pbmRpcmVjdFRleHR1cmUudG9KU09OKHQpLHRoaXMuX2NvbG9yc1RleHR1cmUhPT1udWxsJiYocy5jb2xvcnNUZXh0dXJlPXRoaXMuX2NvbG9yc1RleHR1cmUudG9KU09OKHQpKSx0aGlzLmJvdW5kaW5nU3BoZXJlIT09bnVsbCYmKHMuYm91bmRpbmdTcGhlcmU9dGhpcy5ib3VuZGluZ1NwaGVyZS50b0pTT04oKSksdGhpcy5ib3VuZGluZ0JveCE9PW51bGwmJihzLmJvdW5kaW5nQm94PXRoaXMuYm91bmRpbmdCb3gudG9KU09OKCkpKTtmdW5jdGlvbiByKGEsYyl7cmV0dXJuIGFbYy51dWlkXT09PXZvaWQgMCYmKGFbYy51dWlkXT1jLnRvSlNPTih0KSksYy51dWlkfWlmKHRoaXMuaXNTY2VuZSl0aGlzLmJhY2tncm91bmQmJih0aGlzLmJhY2tncm91bmQuaXNDb2xvcj9zLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTigpOnRoaXMuYmFja2dyb3VuZC5pc1RleHR1cmUmJihzLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTih0KS51dWlkKSksdGhpcy5lbnZpcm9ubWVudCYmdGhpcy5lbnZpcm9ubWVudC5pc1RleHR1cmUmJnRoaXMuZW52aXJvbm1lbnQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlIT09ITAmJihzLmVudmlyb25tZW50PXRoaXMuZW52aXJvbm1lbnQudG9KU09OKHQpLnV1aWQpO2Vsc2UgaWYodGhpcy5pc01lc2h8fHRoaXMuaXNMaW5lfHx0aGlzLmlzUG9pbnRzKXtzLmdlb21ldHJ5PXIodC5nZW9tZXRyaWVzLHRoaXMuZ2VvbWV0cnkpO2NvbnN0IGE9dGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzO2lmKGEhPT12b2lkIDAmJmEuc2hhcGVzIT09dm9pZCAwKXtjb25zdCBjPWEuc2hhcGVzO2lmKEFycmF5LmlzQXJyYXkoYykpZm9yKGxldCBsPTAsaD1jLmxlbmd0aDtsPGg7bCsrKXtjb25zdCB1PWNbbF07cih0LnNoYXBlcyx1KX1lbHNlIHIodC5zaGFwZXMsYyl9fWlmKHRoaXMuaXNTa2lubmVkTWVzaCYmKHMuYmluZE1vZGU9dGhpcy5iaW5kTW9kZSxzLmJpbmRNYXRyaXg9dGhpcy5iaW5kTWF0cml4LnRvQXJyYXkoKSx0aGlzLnNrZWxldG9uIT09dm9pZCAwJiYocih0LnNrZWxldG9ucyx0aGlzLnNrZWxldG9uKSxzLnNrZWxldG9uPXRoaXMuc2tlbGV0b24udXVpZCkpLHRoaXMubWF0ZXJpYWwhPT12b2lkIDApaWYoQXJyYXkuaXNBcnJheSh0aGlzLm1hdGVyaWFsKSl7Y29uc3QgYT1bXTtmb3IobGV0IGM9MCxsPXRoaXMubWF0ZXJpYWwubGVuZ3RoO2M8bDtjKyspYS5wdXNoKHIodC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbFtjXSkpO3MubWF0ZXJpYWw9YX1lbHNlIHMubWF0ZXJpYWw9cih0Lm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsKTtpZih0aGlzLmNoaWxkcmVuLmxlbmd0aD4wKXtzLmNoaWxkcmVuPVtdO2ZvcihsZXQgYT0wO2E8dGhpcy5jaGlsZHJlbi5sZW5ndGg7YSsrKXMuY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2FdLnRvSlNPTih0KS5vYmplY3QpfWlmKHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg+MCl7cy5hbmltYXRpb25zPVtdO2ZvcihsZXQgYT0wO2E8dGhpcy5hbmltYXRpb25zLmxlbmd0aDthKyspe2NvbnN0IGM9dGhpcy5hbmltYXRpb25zW2FdO3MuYW5pbWF0aW9ucy5wdXNoKHIodC5hbmltYXRpb25zLGMpKX19aWYoZSl7Y29uc3QgYT1vKHQuZ2VvbWV0cmllcyksYz1vKHQubWF0ZXJpYWxzKSxsPW8odC50ZXh0dXJlcyksaD1vKHQuaW1hZ2VzKSx1PW8odC5zaGFwZXMpLGY9byh0LnNrZWxldG9ucyksZD1vKHQuYW5pbWF0aW9ucykscD1vKHQubm9kZXMpO2EubGVuZ3RoPjAmJihuLmdlb21ldHJpZXM9YSksYy5sZW5ndGg+MCYmKG4ubWF0ZXJpYWxzPWMpLGwubGVuZ3RoPjAmJihuLnRleHR1cmVzPWwpLGgubGVuZ3RoPjAmJihuLmltYWdlcz1oKSx1Lmxlbmd0aD4wJiYobi5zaGFwZXM9dSksZi5sZW5ndGg+MCYmKG4uc2tlbGV0b25zPWYpLGQubGVuZ3RoPjAmJihuLmFuaW1hdGlvbnM9ZCkscC5sZW5ndGg+MCYmKG4ubm9kZXM9cCl9cmV0dXJuIG4ub2JqZWN0PXMsbjtmdW5jdGlvbiBvKGEpe2NvbnN0IGM9W107Zm9yKGNvbnN0IGwgaW4gYSl7Y29uc3QgaD1hW2xdO2RlbGV0ZSBoLm1ldGFkYXRhLGMucHVzaChoKX1yZXR1cm4gY319Y2xvbmUodCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzLHQpfWNvcHkodCxlPSEwKXtpZih0aGlzLm5hbWU9dC5uYW1lLHRoaXMudXAuY29weSh0LnVwKSx0aGlzLnBvc2l0aW9uLmNvcHkodC5wb3NpdGlvbiksdGhpcy5yb3RhdGlvbi5vcmRlcj10LnJvdGF0aW9uLm9yZGVyLHRoaXMucXVhdGVybmlvbi5jb3B5KHQucXVhdGVybmlvbiksdGhpcy5zY2FsZS5jb3B5KHQuc2NhbGUpLHRoaXMubWF0cml4LmNvcHkodC5tYXRyaXgpLHRoaXMubWF0cml4V29ybGQuY29weSh0Lm1hdHJpeFdvcmxkKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPXQubWF0cml4V29ybGRBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT10Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUsdGhpcy5sYXllcnMubWFzaz10LmxheWVycy5tYXNrLHRoaXMudmlzaWJsZT10LnZpc2libGUsdGhpcy5jYXN0U2hhZG93PXQuY2FzdFNoYWRvdyx0aGlzLnJlY2VpdmVTaGFkb3c9dC5yZWNlaXZlU2hhZG93LHRoaXMuZnJ1c3R1bUN1bGxlZD10LmZydXN0dW1DdWxsZWQsdGhpcy5yZW5kZXJPcmRlcj10LnJlbmRlck9yZGVyLHRoaXMuYW5pbWF0aW9ucz10LmFuaW1hdGlvbnMuc2xpY2UoKSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLGU9PT0hMClmb3IobGV0IG49MDtuPHQuY2hpbGRyZW4ubGVuZ3RoO24rKyl7Y29uc3Qgcz10LmNoaWxkcmVuW25dO3RoaXMuYWRkKHMuY2xvbmUoKSl9cmV0dXJuIHRoaXN9fUVlLkRFRkFVTFRfVVA9bmV3IFQoMCwxLDApLEVlLkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFPSEwLEVlLkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFPSEwO2NvbnN0IGhlPW5ldyBULFBlPW5ldyBULGdvPW5ldyBULENlPW5ldyBULFZuPW5ldyBULFVuPW5ldyBULExjPW5ldyBULHhvPW5ldyBULHdvPW5ldyBULGJvPW5ldyBULE1vPW5ldyBZdCxBbz1uZXcgWXQsU289bmV3IFl0O2NsYXNzIGV0e2NvbnN0cnVjdG9yKHQ9bmV3IFQsZT1uZXcgVCxuPW5ldyBUKXt0aGlzLmE9dCx0aGlzLmI9ZSx0aGlzLmM9bn1zdGF0aWMgZ2V0Tm9ybWFsKHQsZSxuLHMpe3Muc3ViVmVjdG9ycyhuLGUpLGhlLnN1YlZlY3RvcnModCxlKSxzLmNyb3NzKGhlKTtjb25zdCByPXMubGVuZ3RoU3EoKTtyZXR1cm4gcj4wP3MubXVsdGlwbHlTY2FsYXIoMS9NYXRoLnNxcnQocikpOnMuc2V0KDAsMCwwKX1zdGF0aWMgZ2V0QmFyeWNvb3JkKHQsZSxuLHMscil7aGUuc3ViVmVjdG9ycyhzLGUpLFBlLnN1YlZlY3RvcnMobixlKSxnby5zdWJWZWN0b3JzKHQsZSk7Y29uc3Qgbz1oZS5kb3QoaGUpLGE9aGUuZG90KFBlKSxjPWhlLmRvdChnbyksbD1QZS5kb3QoUGUpLGg9UGUuZG90KGdvKSx1PW8qbC1hKmE7aWYodT09PTApcmV0dXJuIHIuc2V0KDAsMCwwKSxudWxsO2NvbnN0IGY9MS91LGQ9KGwqYy1hKmgpKmYscD0obypoLWEqYykqZjtyZXR1cm4gci5zZXQoMS1kLXAscCxkKX1zdGF0aWMgY29udGFpbnNQb2ludCh0LGUsbixzKXtyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQodCxlLG4scyxDZSk9PT1udWxsPyExOkNlLng+PTAmJkNlLnk+PTAmJkNlLngrQ2UueTw9MX1zdGF0aWMgZ2V0SW50ZXJwb2xhdGlvbih0LGUsbixzLHIsbyxhLGMpe3JldHVybiB0aGlzLmdldEJhcnljb29yZCh0LGUsbixzLENlKT09PW51bGw/KGMueD0wLGMueT0wLCJ6ImluIGMmJihjLno9MCksInciaW4gYyYmKGMudz0wKSxudWxsKTooYy5zZXRTY2FsYXIoMCksYy5hZGRTY2FsZWRWZWN0b3IocixDZS54KSxjLmFkZFNjYWxlZFZlY3RvcihvLENlLnkpLGMuYWRkU2NhbGVkVmVjdG9yKGEsQ2UueiksYyl9c3RhdGljIGdldEludGVycG9sYXRlZEF0dHJpYnV0ZSh0LGUsbixzLHIsbyl7cmV0dXJuIE1vLnNldFNjYWxhcigwKSxBby5zZXRTY2FsYXIoMCksU28uc2V0U2NhbGFyKDApLE1vLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSxBby5mcm9tQnVmZmVyQXR0cmlidXRlKHQsbiksU28uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LHMpLG8uc2V0U2NhbGFyKDApLG8uYWRkU2NhbGVkVmVjdG9yKE1vLHIueCksby5hZGRTY2FsZWRWZWN0b3IoQW8sci55KSxvLmFkZFNjYWxlZFZlY3RvcihTbyxyLnopLG99c3RhdGljIGlzRnJvbnRGYWNpbmcodCxlLG4scyl7cmV0dXJuIGhlLnN1YlZlY3RvcnMobixlKSxQZS5zdWJWZWN0b3JzKHQsZSksaGUuY3Jvc3MoUGUpLmRvdChzKTwwfXNldCh0LGUsbil7cmV0dXJuIHRoaXMuYS5jb3B5KHQpLHRoaXMuYi5jb3B5KGUpLHRoaXMuYy5jb3B5KG4pLHRoaXN9c2V0RnJvbVBvaW50c0FuZEluZGljZXModCxlLG4scyl7cmV0dXJuIHRoaXMuYS5jb3B5KHRbZV0pLHRoaXMuYi5jb3B5KHRbbl0pLHRoaXMuYy5jb3B5KHRbc10pLHRoaXN9c2V0RnJvbUF0dHJpYnV0ZUFuZEluZGljZXModCxlLG4scyl7cmV0dXJuIHRoaXMuYS5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksdGhpcy5iLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxuKSx0aGlzLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LHMpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMuYS5jb3B5KHQuYSksdGhpcy5iLmNvcHkodC5iKSx0aGlzLmMuY29weSh0LmMpLHRoaXN9Z2V0QXJlYSgpe3JldHVybiBoZS5zdWJWZWN0b3JzKHRoaXMuYyx0aGlzLmIpLFBlLnN1YlZlY3RvcnModGhpcy5hLHRoaXMuYiksaGUuY3Jvc3MoUGUpLmxlbmd0aCgpKi41fWdldE1pZHBvaW50KHQpe3JldHVybiB0LmFkZFZlY3RvcnModGhpcy5hLHRoaXMuYikuYWRkKHRoaXMuYykubXVsdGlwbHlTY2FsYXIoMS8zKX1nZXROb3JtYWwodCl7cmV0dXJuIGV0LmdldE5vcm1hbCh0aGlzLmEsdGhpcy5iLHRoaXMuYyx0KX1nZXRQbGFuZSh0KXtyZXR1cm4gdC5zZXRGcm9tQ29wbGFuYXJQb2ludHModGhpcy5hLHRoaXMuYix0aGlzLmMpfWdldEJhcnljb29yZCh0LGUpe3JldHVybiBldC5nZXRCYXJ5Y29vcmQodCx0aGlzLmEsdGhpcy5iLHRoaXMuYyxlKX1nZXRJbnRlcnBvbGF0aW9uKHQsZSxuLHMscil7cmV0dXJuIGV0LmdldEludGVycG9sYXRpb24odCx0aGlzLmEsdGhpcy5iLHRoaXMuYyxlLG4scyxyKX1jb250YWluc1BvaW50KHQpe3JldHVybiBldC5jb250YWluc1BvaW50KHQsdGhpcy5hLHRoaXMuYix0aGlzLmMpfWlzRnJvbnRGYWNpbmcodCl7cmV0dXJuIGV0LmlzRnJvbnRGYWNpbmcodGhpcy5hLHRoaXMuYix0aGlzLmMsdCl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzVHJpYW5nbGUodGhpcyl9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2NvbnN0IG49dGhpcy5hLHM9dGhpcy5iLHI9dGhpcy5jO2xldCBvLGE7Vm4uc3ViVmVjdG9ycyhzLG4pLFVuLnN1YlZlY3RvcnMocixuKSx4by5zdWJWZWN0b3JzKHQsbik7Y29uc3QgYz1Wbi5kb3QoeG8pLGw9VW4uZG90KHhvKTtpZihjPD0wJiZsPD0wKXJldHVybiBlLmNvcHkobik7d28uc3ViVmVjdG9ycyh0LHMpO2NvbnN0IGg9Vm4uZG90KHdvKSx1PVVuLmRvdCh3byk7aWYoaD49MCYmdTw9aClyZXR1cm4gZS5jb3B5KHMpO2NvbnN0IGY9Yyp1LWgqbDtpZihmPD0wJiZjPj0wJiZoPD0wKXJldHVybiBvPWMvKGMtaCksZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3RvcihWbixvKTtiby5zdWJWZWN0b3JzKHQscik7Y29uc3QgZD1Wbi5kb3QoYm8pLHA9VW4uZG90KGJvKTtpZihwPj0wJiZkPD1wKXJldHVybiBlLmNvcHkocik7Y29uc3QgeT1kKmwtYypwO2lmKHk8PTAmJmw+PTAmJnA8PTApcmV0dXJuIGE9bC8obC1wKSxlLmNvcHkobikuYWRkU2NhbGVkVmVjdG9yKFVuLGEpO2NvbnN0IG09aCpwLWQqdTtpZihtPD0wJiZ1LWg+PTAmJmQtcD49MClyZXR1cm4gTGMuc3ViVmVjdG9ycyhyLHMpLGE9KHUtaCkvKHUtaCsoZC1wKSksZS5jb3B5KHMpLmFkZFNjYWxlZFZlY3RvcihMYyxhKTtjb25zdCBnPTEvKG0reStmKTtyZXR1cm4gbz15KmcsYT1mKmcsZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3RvcihWbixvKS5hZGRTY2FsZWRWZWN0b3IoVW4sYSl9ZXF1YWxzKHQpe3JldHVybiB0LmEuZXF1YWxzKHRoaXMuYSkmJnQuYi5lcXVhbHModGhpcy5iKSYmdC5jLmVxdWFscyh0aGlzLmMpfX1jb25zdCBPYz17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSxRZT17aDowLHM6MCxsOjB9LG1zPXtoOjAsczowLGw6MH07ZnVuY3Rpb24gX28oaSx0LGUpe3JldHVybiBlPDAmJihlKz0xKSxlPjEmJihlLT0xKSxlPDEvNj9pKyh0LWkpKjYqZTplPDEvMj90OmU8Mi8zP2krKHQtaSkqNiooMi8zLWUpOml9bGV0IGdzPWNsYXNze2NvbnN0cnVjdG9yKHQsZSxuKXtyZXR1cm4gdGhpcy5pc0NvbG9yPSEwLHRoaXMucj0xLHRoaXMuZz0xLHRoaXMuYj0xLHRoaXMuc2V0KHQsZSxuKX1zZXQodCxlLG4pe2lmKGU9PT12b2lkIDAmJm49PT12b2lkIDApe2NvbnN0IHM9dDtzJiZzLmlzQ29sb3I/dGhpcy5jb3B5KHMpOnR5cGVvZiBzPT0ibnVtYmVyIj90aGlzLnNldEhleChzKTp0eXBlb2Ygcz09InN0cmluZyImJnRoaXMuc2V0U3R5bGUocyl9ZWxzZSB0aGlzLnNldFJHQih0LGUsbik7cmV0dXJuIHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLnI9dCx0aGlzLmc9dCx0aGlzLmI9dCx0aGlzfXNldEhleCh0LGU9b2Upe3JldHVybiB0PU1hdGguZmxvb3IodCksdGhpcy5yPSh0Pj4xNiYyNTUpLzI1NSx0aGlzLmc9KHQ+PjgmMjU1KS8yNTUsdGhpcy5iPSh0JjI1NSkvMjU1LGFlLmNvbG9yU3BhY2VUb1dvcmtpbmcodGhpcyxlKSx0aGlzfXNldFJHQih0LGUsbixzPWFlLndvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPWUsdGhpcy5iPW4sYWUuY29sb3JTcGFjZVRvV29ya2luZyh0aGlzLHMpLHRoaXN9c2V0SFNMKHQsZSxuLHM9YWUud29ya2luZ0NvbG9yU3BhY2Upe2lmKHQ9S3UodCwxKSxlPUcoZSwwLDEpLG49RyhuLDAsMSksZT09PTApdGhpcy5yPXRoaXMuZz10aGlzLmI9bjtlbHNle2NvbnN0IHI9bjw9LjU/biooMStlKTpuK2UtbiplLG89MipuLXI7dGhpcy5yPV9vKG8scix0KzEvMyksdGhpcy5nPV9vKG8scix0KSx0aGlzLmI9X28obyxyLHQtMS8zKX1yZXR1cm4gYWUuY29sb3JTcGFjZVRvV29ya2luZyh0aGlzLHMpLHRoaXN9c2V0U3R5bGUodCxlPW9lKXtmdW5jdGlvbiBuKHIpe3IhPT12b2lkIDAmJnBhcnNlRmxvYXQocik8MSYmY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogQWxwaGEgY29tcG9uZW50IG9mICIrdCsiIHdpbGwgYmUgaWdub3JlZC4iKX1sZXQgcztpZihzPS9eKFx3KylcKChbXlwpXSopXCkvLmV4ZWModCkpe2xldCByO2NvbnN0IG89c1sxXSxhPXNbMl07c3dpdGNoKG8pe2Nhc2UicmdiIjpjYXNlInJnYmEiOmlmKHI9L15ccyooXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhhKSlyZXR1cm4gbihyWzRdKSx0aGlzLnNldFJHQihNYXRoLm1pbigyNTUscGFyc2VJbnQoclsxXSwxMCkpLzI1NSxNYXRoLm1pbigyNTUscGFyc2VJbnQoclsyXSwxMCkpLzI1NSxNYXRoLm1pbigyNTUscGFyc2VJbnQoclszXSwxMCkpLzI1NSxlKTtpZihyPS9eXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqLFxzKihcZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIG4ocls0XSksdGhpcy5zZXRSR0IoTWF0aC5taW4oMTAwLHBhcnNlSW50KHJbMV0sMTApKS8xMDAsTWF0aC5taW4oMTAwLHBhcnNlSW50KHJbMl0sMTApKS8xMDAsTWF0aC5taW4oMTAwLHBhcnNlSW50KHJbM10sMTApKS8xMDAsZSk7YnJlYWs7Y2FzZSJoc2wiOmNhc2UiaHNsYSI6aWYocj0vXlxzKihcZCpcLj9cZCspXHMqLFxzKihcZCpcLj9cZCspXCVccyosXHMqKFxkKlwuP1xkKylcJVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhhKSlyZXR1cm4gbihyWzRdKSx0aGlzLnNldEhTTChwYXJzZUZsb2F0KHJbMV0pLzM2MCxwYXJzZUZsb2F0KHJbMl0pLzEwMCxwYXJzZUZsb2F0KHJbM10pLzEwMCxlKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IFVua25vd24gY29sb3IgbW9kZWwgIit0KX19ZWxzZSBpZihzPS9eXCMoW0EtRmEtZlxkXSspJC8uZXhlYyh0KSl7Y29uc3Qgcj1zWzFdLG89ci5sZW5ndGg7aWYobz09PTMpcmV0dXJuIHRoaXMuc2V0UkdCKHBhcnNlSW50KHIuY2hhckF0KDApLDE2KS8xNSxwYXJzZUludChyLmNoYXJBdCgxKSwxNikvMTUscGFyc2VJbnQoci5jaGFyQXQoMiksMTYpLzE1LGUpO2lmKG89PT02KXJldHVybiB0aGlzLnNldEhleChwYXJzZUludChyLDE2KSxlKTtjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBJbnZhbGlkIGhleCBjb2xvciAiK3QpfWVsc2UgaWYodCYmdC5sZW5ndGg+MClyZXR1cm4gdGhpcy5zZXRDb2xvck5hbWUodCxlKTtyZXR1cm4gdGhpc31zZXRDb2xvck5hbWUodCxlPW9lKXtjb25zdCBuPU9jW3QudG9Mb3dlckNhc2UoKV07cmV0dXJuIG4hPT12b2lkIDA/dGhpcy5zZXRIZXgobixlKTpjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yICIrdCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnIsdGhpcy5nLHRoaXMuYil9Y29weSh0KXtyZXR1cm4gdGhpcy5yPXQucix0aGlzLmc9dC5nLHRoaXMuYj10LmIsdGhpc31jb3B5U1JHQlRvTGluZWFyKHQpe3JldHVybiB0aGlzLnI9X2UodC5yKSx0aGlzLmc9X2UodC5nKSx0aGlzLmI9X2UodC5iKSx0aGlzfWNvcHlMaW5lYXJUb1NSR0IodCl7cmV0dXJuIHRoaXMucj1Jbih0LnIpLHRoaXMuZz1Jbih0LmcpLHRoaXMuYj1Jbih0LmIpLHRoaXN9Y29udmVydFNSR0JUb0xpbmVhcigpe3JldHVybiB0aGlzLmNvcHlTUkdCVG9MaW5lYXIodGhpcyksdGhpc31jb252ZXJ0TGluZWFyVG9TUkdCKCl7cmV0dXJuIHRoaXMuY29weUxpbmVhclRvU1JHQih0aGlzKSx0aGlzfWdldEhleCh0PW9lKXtyZXR1cm4gYWUud29ya2luZ1RvQ29sb3JTcGFjZShTdC5jb3B5KHRoaXMpLHQpLE1hdGgucm91bmQoRyhTdC5yKjI1NSwwLDI1NSkpKjY1NTM2K01hdGgucm91bmQoRyhTdC5nKjI1NSwwLDI1NSkpKjI1NitNYXRoLnJvdW5kKEcoU3QuYioyNTUsMCwyNTUpKX1nZXRIZXhTdHJpbmcodD1vZSl7cmV0dXJuKCIwMDAwMDAiK3RoaXMuZ2V0SGV4KHQpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTYpfWdldEhTTCh0LGU9YWUud29ya2luZ0NvbG9yU3BhY2Upe2FlLndvcmtpbmdUb0NvbG9yU3BhY2UoU3QuY29weSh0aGlzKSxlKTtjb25zdCBuPVN0LnIscz1TdC5nLHI9U3QuYixvPU1hdGgubWF4KG4scyxyKSxhPU1hdGgubWluKG4scyxyKTtsZXQgYyxsO2NvbnN0IGg9KGErbykvMjtpZihhPT09byljPTAsbD0wO2Vsc2V7Y29uc3QgdT1vLWE7c3dpdGNoKGw9aDw9LjU/dS8obythKTp1LygyLW8tYSksbyl7Y2FzZSBuOmM9KHMtcikvdSsoczxyPzY6MCk7YnJlYWs7Y2FzZSBzOmM9KHItbikvdSsyO2JyZWFrO2Nhc2UgcjpjPShuLXMpL3UrNDticmVha31jLz02fXJldHVybiB0Lmg9Yyx0LnM9bCx0Lmw9aCx0fWdldFJHQih0LGU9YWUud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiBhZS53b3JraW5nVG9Db2xvclNwYWNlKFN0LmNvcHkodGhpcyksZSksdC5yPVN0LnIsdC5nPVN0LmcsdC5iPVN0LmIsdH1nZXRTdHlsZSh0PW9lKXthZS53b3JraW5nVG9Db2xvclNwYWNlKFN0LmNvcHkodGhpcyksdCk7Y29uc3QgZT1TdC5yLG49U3QuZyxzPVN0LmI7cmV0dXJuIHQhPT1vZT9gY29sb3IoJHt0fSAke2UudG9GaXhlZCgzKX0gJHtuLnRvRml4ZWQoMyl9ICR7cy50b0ZpeGVkKDMpfSlgOmByZ2IoJHtNYXRoLnJvdW5kKGUqMjU1KX0sJHtNYXRoLnJvdW5kKG4qMjU1KX0sJHtNYXRoLnJvdW5kKHMqMjU1KX0pYH1vZmZzZXRIU0wodCxlLG4pe3JldHVybiB0aGlzLmdldEhTTChRZSksdGhpcy5zZXRIU0woUWUuaCt0LFFlLnMrZSxRZS5sK24pfWFkZCh0KXtyZXR1cm4gdGhpcy5yKz10LnIsdGhpcy5nKz10LmcsdGhpcy5iKz10LmIsdGhpc31hZGRDb2xvcnModCxlKXtyZXR1cm4gdGhpcy5yPXQucitlLnIsdGhpcy5nPXQuZytlLmcsdGhpcy5iPXQuYitlLmIsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMucis9dCx0aGlzLmcrPXQsdGhpcy5iKz10LHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLnI9TWF0aC5tYXgoMCx0aGlzLnItdC5yKSx0aGlzLmc9TWF0aC5tYXgoMCx0aGlzLmctdC5nKSx0aGlzLmI9TWF0aC5tYXgoMCx0aGlzLmItdC5iKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLnIqPXQucix0aGlzLmcqPXQuZyx0aGlzLmIqPXQuYix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLnIqPXQsdGhpcy5nKj10LHRoaXMuYio9dCx0aGlzfWxlcnAodCxlKXtyZXR1cm4gdGhpcy5yKz0odC5yLXRoaXMucikqZSx0aGlzLmcrPSh0LmctdGhpcy5nKSplLHRoaXMuYis9KHQuYi10aGlzLmIpKmUsdGhpc31sZXJwQ29sb3JzKHQsZSxuKXtyZXR1cm4gdGhpcy5yPXQucisoZS5yLXQucikqbix0aGlzLmc9dC5nKyhlLmctdC5nKSpuLHRoaXMuYj10LmIrKGUuYi10LmIpKm4sdGhpc31sZXJwSFNMKHQsZSl7dGhpcy5nZXRIU0woUWUpLHQuZ2V0SFNMKG1zKTtjb25zdCBuPWlvKFFlLmgsbXMuaCxlKSxzPWlvKFFlLnMsbXMucyxlKSxyPWlvKFFlLmwsbXMubCxlKTtyZXR1cm4gdGhpcy5zZXRIU0wobixzLHIpLHRoaXN9c2V0RnJvbVZlY3RvcjModCl7cmV0dXJuIHRoaXMucj10LngsdGhpcy5nPXQueSx0aGlzLmI9dC56LHRoaXN9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy5yLG49dGhpcy5nLHM9dGhpcy5iLHI9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5yPXJbMF0qZStyWzNdKm4rcls2XSpzLHRoaXMuZz1yWzFdKmUrcls0XSpuK3JbN10qcyx0aGlzLmI9clsyXSplK3JbNV0qbityWzhdKnMsdGhpc31lcXVhbHModCl7cmV0dXJuIHQucj09PXRoaXMuciYmdC5nPT09dGhpcy5nJiZ0LmI9PT10aGlzLmJ9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5yPXRbZV0sdGhpcy5nPXRbZSsxXSx0aGlzLmI9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5yLHRbZSsxXT10aGlzLmcsdFtlKzJdPXRoaXMuYix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5yPXQuZ2V0WChlKSx0aGlzLmc9dC5nZXRZKGUpLHRoaXMuYj10LmdldFooZSksdGhpc310b0pTT04oKXtyZXR1cm4gdGhpcy5nZXRIZXgoKX0qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLnIseWllbGQgdGhpcy5nLHlpZWxkIHRoaXMuYn19O2NvbnN0IFN0PW5ldyBncztncy5OQU1FUz1PYztsZXQgeWY9MDtjbGFzcyBtZiBleHRlbmRzIGNze2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzTWF0ZXJpYWw9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6eWYrK30pLHRoaXMudXVpZD1GbigpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9Ik1hdGVyaWFsIix0aGlzLmJsZW5kaW5nPTEsdGhpcy5zaWRlPTAsdGhpcy52ZXJ0ZXhDb2xvcnM9ITEsdGhpcy5vcGFjaXR5PTEsdGhpcy50cmFuc3BhcmVudD0hMSx0aGlzLmFscGhhSGFzaD0hMSx0aGlzLmJsZW5kU3JjPTIwNCx0aGlzLmJsZW5kRHN0PTIwNSx0aGlzLmJsZW5kRXF1YXRpb249MTAwLHRoaXMuYmxlbmRTcmNBbHBoYT1udWxsLHRoaXMuYmxlbmREc3RBbHBoYT1udWxsLHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhPW51bGwsdGhpcy5ibGVuZENvbG9yPW5ldyBncygwLDAsMCksdGhpcy5ibGVuZEFscGhhPTAsdGhpcy5kZXB0aEZ1bmM9Myx0aGlzLmRlcHRoVGVzdD0hMCx0aGlzLmRlcHRoV3JpdGU9ITAsdGhpcy5zdGVuY2lsV3JpdGVNYXNrPTI1NSx0aGlzLnN0ZW5jaWxGdW5jPTUxOSx0aGlzLnN0ZW5jaWxSZWY9MCx0aGlzLnN0ZW5jaWxGdW5jTWFzaz0yNTUsdGhpcy5zdGVuY2lsRmFpbD03NjgwLHRoaXMuc3RlbmNpbFpGYWlsPTc2ODAsdGhpcy5zdGVuY2lsWlBhc3M9NzY4MCx0aGlzLnN0ZW5jaWxXcml0ZT0hMSx0aGlzLmNsaXBwaW5nUGxhbmVzPW51bGwsdGhpcy5jbGlwSW50ZXJzZWN0aW9uPSExLHRoaXMuY2xpcFNoYWRvd3M9ITEsdGhpcy5zaGFkb3dTaWRlPW51bGwsdGhpcy5jb2xvcldyaXRlPSEwLHRoaXMucHJlY2lzaW9uPW51bGwsdGhpcy5wb2x5Z29uT2Zmc2V0PSExLHRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj0wLHRoaXMucG9seWdvbk9mZnNldFVuaXRzPTAsdGhpcy5kaXRoZXJpbmc9ITEsdGhpcy5hbHBoYVRvQ292ZXJhZ2U9ITEsdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9ITEsdGhpcy5mb3JjZVNpbmdsZVBhc3M9ITEsdGhpcy5hbGxvd092ZXJyaWRlPSEwLHRoaXMudmlzaWJsZT0hMCx0aGlzLnRvbmVNYXBwZWQ9ITAsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MCx0aGlzLl9hbHBoYVRlc3Q9MH1nZXQgYWxwaGFUZXN0KCl7cmV0dXJuIHRoaXMuX2FscGhhVGVzdH1zZXQgYWxwaGFUZXN0KHQpe3RoaXMuX2FscGhhVGVzdD4wIT10PjAmJnRoaXMudmVyc2lvbisrLHRoaXMuX2FscGhhVGVzdD10fW9uQmVmb3JlUmVuZGVyKCl7fW9uQmVmb3JlQ29tcGlsZSgpe31jdXN0b21Qcm9ncmFtQ2FjaGVLZXkoKXtyZXR1cm4gdGhpcy5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKX1zZXRWYWx1ZXModCl7aWYodCE9PXZvaWQgMClmb3IoY29uc3QgZSBpbiB0KXtjb25zdCBuPXRbZV07aWYobj09PXZvaWQgMCl7Y29uc29sZS53YXJuKGBUSFJFRS5NYXRlcmlhbDogcGFyYW1ldGVyICcke2V9JyBoYXMgdmFsdWUgb2YgdW5kZWZpbmVkLmApO2NvbnRpbnVlfWNvbnN0IHM9dGhpc1tlXTtpZihzPT09dm9pZCAwKXtjb25zb2xlLndhcm4oYFRIUkVFLk1hdGVyaWFsOiAnJHtlfScgaXMgbm90IGEgcHJvcGVydHkgb2YgVEhSRUUuJHt0aGlzLnR5cGV9LmApO2NvbnRpbnVlfXMmJnMuaXNDb2xvcj9zLnNldChuKTpzJiZzLmlzVmVjdG9yMyYmbiYmbi5pc1ZlY3RvcjM/cy5jb3B5KG4pOnRoaXNbZV09bn19dG9KU09OKHQpe2NvbnN0IGU9dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciO2UmJih0PXt0ZXh0dXJlczp7fSxpbWFnZXM6e319KTtjb25zdCBuPXttZXRhZGF0YTp7dmVyc2lvbjo0LjcsdHlwZToiTWF0ZXJpYWwiLGdlbmVyYXRvcjoiTWF0ZXJpYWwudG9KU09OIn19O24udXVpZD10aGlzLnV1aWQsbi50eXBlPXRoaXMudHlwZSx0aGlzLm5hbWUhPT0iIiYmKG4ubmFtZT10aGlzLm5hbWUpLHRoaXMuY29sb3ImJnRoaXMuY29sb3IuaXNDb2xvciYmKG4uY29sb3I9dGhpcy5jb2xvci5nZXRIZXgoKSksdGhpcy5yb3VnaG5lc3MhPT12b2lkIDAmJihuLnJvdWdobmVzcz10aGlzLnJvdWdobmVzcyksdGhpcy5tZXRhbG5lc3MhPT12b2lkIDAmJihuLm1ldGFsbmVzcz10aGlzLm1ldGFsbmVzcyksdGhpcy5zaGVlbiE9PXZvaWQgMCYmKG4uc2hlZW49dGhpcy5zaGVlbiksdGhpcy5zaGVlbkNvbG9yJiZ0aGlzLnNoZWVuQ29sb3IuaXNDb2xvciYmKG4uc2hlZW5Db2xvcj10aGlzLnNoZWVuQ29sb3IuZ2V0SGV4KCkpLHRoaXMuc2hlZW5Sb3VnaG5lc3MhPT12b2lkIDAmJihuLnNoZWVuUm91Z2huZXNzPXRoaXMuc2hlZW5Sb3VnaG5lc3MpLHRoaXMuZW1pc3NpdmUmJnRoaXMuZW1pc3NpdmUuaXNDb2xvciYmKG4uZW1pc3NpdmU9dGhpcy5lbWlzc2l2ZS5nZXRIZXgoKSksdGhpcy5lbWlzc2l2ZUludGVuc2l0eSE9PXZvaWQgMCYmdGhpcy5lbWlzc2l2ZUludGVuc2l0eSE9PTEmJihuLmVtaXNzaXZlSW50ZW5zaXR5PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkpLHRoaXMuc3BlY3VsYXImJnRoaXMuc3BlY3VsYXIuaXNDb2xvciYmKG4uc3BlY3VsYXI9dGhpcy5zcGVjdWxhci5nZXRIZXgoKSksdGhpcy5zcGVjdWxhckludGVuc2l0eSE9PXZvaWQgMCYmKG4uc3BlY3VsYXJJbnRlbnNpdHk9dGhpcy5zcGVjdWxhckludGVuc2l0eSksdGhpcy5zcGVjdWxhckNvbG9yJiZ0aGlzLnNwZWN1bGFyQ29sb3IuaXNDb2xvciYmKG4uc3BlY3VsYXJDb2xvcj10aGlzLnNwZWN1bGFyQ29sb3IuZ2V0SGV4KCkpLHRoaXMuc2hpbmluZXNzIT09dm9pZCAwJiYobi5zaGluaW5lc3M9dGhpcy5zaGluaW5lc3MpLHRoaXMuY2xlYXJjb2F0IT09dm9pZCAwJiYobi5jbGVhcmNvYXQ9dGhpcy5jbGVhcmNvYXQpLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzIT09dm9pZCAwJiYobi5jbGVhcmNvYXRSb3VnaG5lc3M9dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MpLHRoaXMuY2xlYXJjb2F0TWFwJiZ0aGlzLmNsZWFyY29hdE1hcC5pc1RleHR1cmUmJihuLmNsZWFyY29hdE1hcD10aGlzLmNsZWFyY29hdE1hcC50b0pTT04odCkudXVpZCksdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAmJnRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLmlzVGV4dHVyZSYmKG4uY2xlYXJjb2F0Um91Z2huZXNzTWFwPXRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmNsZWFyY29hdE5vcm1hbE1hcCYmdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAuaXNUZXh0dXJlJiYobi5jbGVhcmNvYXROb3JtYWxNYXA9dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5jbGVhcmNvYXROb3JtYWxTY2FsZT10aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLnRvQXJyYXkoKSksdGhpcy5kaXNwZXJzaW9uIT09dm9pZCAwJiYobi5kaXNwZXJzaW9uPXRoaXMuZGlzcGVyc2lvbiksdGhpcy5pcmlkZXNjZW5jZSE9PXZvaWQgMCYmKG4uaXJpZGVzY2VuY2U9dGhpcy5pcmlkZXNjZW5jZSksdGhpcy5pcmlkZXNjZW5jZUlPUiE9PXZvaWQgMCYmKG4uaXJpZGVzY2VuY2VJT1I9dGhpcy5pcmlkZXNjZW5jZUlPUiksdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlIT09dm9pZCAwJiYobi5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlPXRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSksdGhpcy5pcmlkZXNjZW5jZU1hcCYmdGhpcy5pcmlkZXNjZW5jZU1hcC5pc1RleHR1cmUmJihuLmlyaWRlc2NlbmNlTWFwPXRoaXMuaXJpZGVzY2VuY2VNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAmJnRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAuaXNUZXh0dXJlJiYobi5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD10aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmFuaXNvdHJvcHkhPT12b2lkIDAmJihuLmFuaXNvdHJvcHk9dGhpcy5hbmlzb3Ryb3B5KSx0aGlzLmFuaXNvdHJvcHlSb3RhdGlvbiE9PXZvaWQgMCYmKG4uYW5pc290cm9weVJvdGF0aW9uPXRoaXMuYW5pc290cm9weVJvdGF0aW9uKSx0aGlzLmFuaXNvdHJvcHlNYXAmJnRoaXMuYW5pc290cm9weU1hcC5pc1RleHR1cmUmJihuLmFuaXNvdHJvcHlNYXA9dGhpcy5hbmlzb3Ryb3B5TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLm1hcCYmdGhpcy5tYXAuaXNUZXh0dXJlJiYobi5tYXA9dGhpcy5tYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubWF0Y2FwJiZ0aGlzLm1hdGNhcC5pc1RleHR1cmUmJihuLm1hdGNhcD10aGlzLm1hdGNhcC50b0pTT04odCkudXVpZCksdGhpcy5hbHBoYU1hcCYmdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUmJihuLmFscGhhTWFwPXRoaXMuYWxwaGFNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubGlnaHRNYXAmJnRoaXMubGlnaHRNYXAuaXNUZXh0dXJlJiYobi5saWdodE1hcD10aGlzLmxpZ2h0TWFwLnRvSlNPTih0KS51dWlkLG4ubGlnaHRNYXBJbnRlbnNpdHk9dGhpcy5saWdodE1hcEludGVuc2l0eSksdGhpcy5hb01hcCYmdGhpcy5hb01hcC5pc1RleHR1cmUmJihuLmFvTWFwPXRoaXMuYW9NYXAudG9KU09OKHQpLnV1aWQsbi5hb01hcEludGVuc2l0eT10aGlzLmFvTWFwSW50ZW5zaXR5KSx0aGlzLmJ1bXBNYXAmJnRoaXMuYnVtcE1hcC5pc1RleHR1cmUmJihuLmJ1bXBNYXA9dGhpcy5idW1wTWFwLnRvSlNPTih0KS51dWlkLG4uYnVtcFNjYWxlPXRoaXMuYnVtcFNjYWxlKSx0aGlzLm5vcm1hbE1hcCYmdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlJiYobi5ub3JtYWxNYXA9dGhpcy5ub3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5ub3JtYWxNYXBUeXBlPXRoaXMubm9ybWFsTWFwVHlwZSxuLm5vcm1hbFNjYWxlPXRoaXMubm9ybWFsU2NhbGUudG9BcnJheSgpKSx0aGlzLmRpc3BsYWNlbWVudE1hcCYmdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlJiYobi5kaXNwbGFjZW1lbnRNYXA9dGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKHQpLnV1aWQsbi5kaXNwbGFjZW1lbnRTY2FsZT10aGlzLmRpc3BsYWNlbWVudFNjYWxlLG4uZGlzcGxhY2VtZW50Qmlhcz10aGlzLmRpc3BsYWNlbWVudEJpYXMpLHRoaXMucm91Z2huZXNzTWFwJiZ0aGlzLnJvdWdobmVzc01hcC5pc1RleHR1cmUmJihuLnJvdWdobmVzc01hcD10aGlzLnJvdWdobmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5tZXRhbG5lc3NNYXAmJnRoaXMubWV0YWxuZXNzTWFwLmlzVGV4dHVyZSYmKG4ubWV0YWxuZXNzTWFwPXRoaXMubWV0YWxuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVtaXNzaXZlTWFwJiZ0aGlzLmVtaXNzaXZlTWFwLmlzVGV4dHVyZSYmKG4uZW1pc3NpdmVNYXA9dGhpcy5lbWlzc2l2ZU1hcC50b0pTT04odCkudXVpZCksdGhpcy5zcGVjdWxhck1hcCYmdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyTWFwPXRoaXMuc3BlY3VsYXJNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAmJnRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAuaXNUZXh0dXJlJiYobi5zcGVjdWxhckludGVuc2l0eU1hcD10aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnNwZWN1bGFyQ29sb3JNYXAmJnRoaXMuc3BlY3VsYXJDb2xvck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyQ29sb3JNYXA9dGhpcy5zcGVjdWxhckNvbG9yTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVudk1hcCYmdGhpcy5lbnZNYXAuaXNUZXh0dXJlJiYobi5lbnZNYXA9dGhpcy5lbnZNYXAudG9KU09OKHQpLnV1aWQsdGhpcy5jb21iaW5lIT09dm9pZCAwJiYobi5jb21iaW5lPXRoaXMuY29tYmluZSkpLHRoaXMuZW52TWFwUm90YXRpb24hPT12b2lkIDAmJihuLmVudk1hcFJvdGF0aW9uPXRoaXMuZW52TWFwUm90YXRpb24udG9BcnJheSgpKSx0aGlzLmVudk1hcEludGVuc2l0eSE9PXZvaWQgMCYmKG4uZW52TWFwSW50ZW5zaXR5PXRoaXMuZW52TWFwSW50ZW5zaXR5KSx0aGlzLnJlZmxlY3Rpdml0eSE9PXZvaWQgMCYmKG4ucmVmbGVjdGl2aXR5PXRoaXMucmVmbGVjdGl2aXR5KSx0aGlzLnJlZnJhY3Rpb25SYXRpbyE9PXZvaWQgMCYmKG4ucmVmcmFjdGlvblJhdGlvPXRoaXMucmVmcmFjdGlvblJhdGlvKSx0aGlzLmdyYWRpZW50TWFwJiZ0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSYmKG4uZ3JhZGllbnRNYXA9dGhpcy5ncmFkaWVudE1hcC50b0pTT04odCkudXVpZCksdGhpcy50cmFuc21pc3Npb24hPT12b2lkIDAmJihuLnRyYW5zbWlzc2lvbj10aGlzLnRyYW5zbWlzc2lvbiksdGhpcy50cmFuc21pc3Npb25NYXAmJnRoaXMudHJhbnNtaXNzaW9uTWFwLmlzVGV4dHVyZSYmKG4udHJhbnNtaXNzaW9uTWFwPXRoaXMudHJhbnNtaXNzaW9uTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnRoaWNrbmVzcyE9PXZvaWQgMCYmKG4udGhpY2tuZXNzPXRoaXMudGhpY2tuZXNzKSx0aGlzLnRoaWNrbmVzc01hcCYmdGhpcy50aGlja25lc3NNYXAuaXNUZXh0dXJlJiYobi50aGlja25lc3NNYXA9dGhpcy50aGlja25lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSE9PXZvaWQgMCYmdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlIT09MS8wJiYobi5hdHRlbnVhdGlvbkRpc3RhbmNlPXRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSksdGhpcy5hdHRlbnVhdGlvbkNvbG9yIT09dm9pZCAwJiYobi5hdHRlbnVhdGlvbkNvbG9yPXRoaXMuYXR0ZW51YXRpb25Db2xvci5nZXRIZXgoKSksdGhpcy5zaXplIT09dm9pZCAwJiYobi5zaXplPXRoaXMuc2l6ZSksdGhpcy5zaGFkb3dTaWRlIT09bnVsbCYmKG4uc2hhZG93U2lkZT10aGlzLnNoYWRvd1NpZGUpLHRoaXMuc2l6ZUF0dGVudWF0aW9uIT09dm9pZCAwJiYobi5zaXplQXR0ZW51YXRpb249dGhpcy5zaXplQXR0ZW51YXRpb24pLHRoaXMuYmxlbmRpbmchPT0xJiYobi5ibGVuZGluZz10aGlzLmJsZW5kaW5nKSx0aGlzLnNpZGUhPT0wJiYobi5zaWRlPXRoaXMuc2lkZSksdGhpcy52ZXJ0ZXhDb2xvcnM9PT0hMCYmKG4udmVydGV4Q29sb3JzPSEwKSx0aGlzLm9wYWNpdHk8MSYmKG4ub3BhY2l0eT10aGlzLm9wYWNpdHkpLHRoaXMudHJhbnNwYXJlbnQ9PT0hMCYmKG4udHJhbnNwYXJlbnQ9ITApLHRoaXMuYmxlbmRTcmMhPT0yMDQmJihuLmJsZW5kU3JjPXRoaXMuYmxlbmRTcmMpLHRoaXMuYmxlbmREc3QhPT0yMDUmJihuLmJsZW5kRHN0PXRoaXMuYmxlbmREc3QpLHRoaXMuYmxlbmRFcXVhdGlvbiE9PTEwMCYmKG4uYmxlbmRFcXVhdGlvbj10aGlzLmJsZW5kRXF1YXRpb24pLHRoaXMuYmxlbmRTcmNBbHBoYSE9PW51bGwmJihuLmJsZW5kU3JjQWxwaGE9dGhpcy5ibGVuZFNyY0FscGhhKSx0aGlzLmJsZW5kRHN0QWxwaGEhPT1udWxsJiYobi5ibGVuZERzdEFscGhhPXRoaXMuYmxlbmREc3RBbHBoYSksdGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEhPT1udWxsJiYobi5ibGVuZEVxdWF0aW9uQWxwaGE9dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEpLHRoaXMuYmxlbmRDb2xvciYmdGhpcy5ibGVuZENvbG9yLmlzQ29sb3ImJihuLmJsZW5kQ29sb3I9dGhpcy5ibGVuZENvbG9yLmdldEhleCgpKSx0aGlzLmJsZW5kQWxwaGEhPT0wJiYobi5ibGVuZEFscGhhPXRoaXMuYmxlbmRBbHBoYSksdGhpcy5kZXB0aEZ1bmMhPT0zJiYobi5kZXB0aEZ1bmM9dGhpcy5kZXB0aEZ1bmMpLHRoaXMuZGVwdGhUZXN0PT09ITEmJihuLmRlcHRoVGVzdD10aGlzLmRlcHRoVGVzdCksdGhpcy5kZXB0aFdyaXRlPT09ITEmJihuLmRlcHRoV3JpdGU9dGhpcy5kZXB0aFdyaXRlKSx0aGlzLmNvbG9yV3JpdGU9PT0hMSYmKG4uY29sb3JXcml0ZT10aGlzLmNvbG9yV3JpdGUpLHRoaXMuc3RlbmNpbFdyaXRlTWFzayE9PTI1NSYmKG4uc3RlbmNpbFdyaXRlTWFzaz10aGlzLnN0ZW5jaWxXcml0ZU1hc2spLHRoaXMuc3RlbmNpbEZ1bmMhPT01MTkmJihuLnN0ZW5jaWxGdW5jPXRoaXMuc3RlbmNpbEZ1bmMpLHRoaXMuc3RlbmNpbFJlZiE9PTAmJihuLnN0ZW5jaWxSZWY9dGhpcy5zdGVuY2lsUmVmKSx0aGlzLnN0ZW5jaWxGdW5jTWFzayE9PTI1NSYmKG4uc3RlbmNpbEZ1bmNNYXNrPXRoaXMuc3RlbmNpbEZ1bmNNYXNrKSx0aGlzLnN0ZW5jaWxGYWlsIT09NzY4MCYmKG4uc3RlbmNpbEZhaWw9dGhpcy5zdGVuY2lsRmFpbCksdGhpcy5zdGVuY2lsWkZhaWwhPT03NjgwJiYobi5zdGVuY2lsWkZhaWw9dGhpcy5zdGVuY2lsWkZhaWwpLHRoaXMuc3RlbmNpbFpQYXNzIT09NzY4MCYmKG4uc3RlbmNpbFpQYXNzPXRoaXMuc3RlbmNpbFpQYXNzKSx0aGlzLnN0ZW5jaWxXcml0ZT09PSEwJiYobi5zdGVuY2lsV3JpdGU9dGhpcy5zdGVuY2lsV3JpdGUpLHRoaXMucm90YXRpb24hPT12b2lkIDAmJnRoaXMucm90YXRpb24hPT0wJiYobi5yb3RhdGlvbj10aGlzLnJvdGF0aW9uKSx0aGlzLnBvbHlnb25PZmZzZXQ9PT0hMCYmKG4ucG9seWdvbk9mZnNldD0hMCksdGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yIT09MCYmKG4ucG9seWdvbk9mZnNldEZhY3Rvcj10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IpLHRoaXMucG9seWdvbk9mZnNldFVuaXRzIT09MCYmKG4ucG9seWdvbk9mZnNldFVuaXRzPXRoaXMucG9seWdvbk9mZnNldFVuaXRzKSx0aGlzLmxpbmV3aWR0aCE9PXZvaWQgMCYmdGhpcy5saW5ld2lkdGghPT0xJiYobi5saW5ld2lkdGg9dGhpcy5saW5ld2lkdGgpLHRoaXMuZGFzaFNpemUhPT12b2lkIDAmJihuLmRhc2hTaXplPXRoaXMuZGFzaFNpemUpLHRoaXMuZ2FwU2l6ZSE9PXZvaWQgMCYmKG4uZ2FwU2l6ZT10aGlzLmdhcFNpemUpLHRoaXMuc2NhbGUhPT12b2lkIDAmJihuLnNjYWxlPXRoaXMuc2NhbGUpLHRoaXMuZGl0aGVyaW5nPT09ITAmJihuLmRpdGhlcmluZz0hMCksdGhpcy5hbHBoYVRlc3Q+MCYmKG4uYWxwaGFUZXN0PXRoaXMuYWxwaGFUZXN0KSx0aGlzLmFscGhhSGFzaD09PSEwJiYobi5hbHBoYUhhc2g9ITApLHRoaXMuYWxwaGFUb0NvdmVyYWdlPT09ITAmJihuLmFscGhhVG9Db3ZlcmFnZT0hMCksdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9PT0hMCYmKG4ucHJlbXVsdGlwbGllZEFscGhhPSEwKSx0aGlzLmZvcmNlU2luZ2xlUGFzcz09PSEwJiYobi5mb3JjZVNpbmdsZVBhc3M9ITApLHRoaXMud2lyZWZyYW1lPT09ITAmJihuLndpcmVmcmFtZT0hMCksdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg+MSYmKG4ud2lyZWZyYW1lTGluZXdpZHRoPXRoaXMud2lyZWZyYW1lTGluZXdpZHRoKSx0aGlzLndpcmVmcmFtZUxpbmVjYXAhPT0icm91bmQiJiYobi53aXJlZnJhbWVMaW5lY2FwPXRoaXMud2lyZWZyYW1lTGluZWNhcCksdGhpcy53aXJlZnJhbWVMaW5lam9pbiE9PSJyb3VuZCImJihuLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWpvaW4pLHRoaXMuZmxhdFNoYWRpbmc9PT0hMCYmKG4uZmxhdFNoYWRpbmc9ITApLHRoaXMudmlzaWJsZT09PSExJiYobi52aXNpYmxlPSExKSx0aGlzLnRvbmVNYXBwZWQ9PT0hMSYmKG4udG9uZU1hcHBlZD0hMSksdGhpcy5mb2c9PT0hMSYmKG4uZm9nPSExKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKG4udXNlckRhdGE9dGhpcy51c2VyRGF0YSk7ZnVuY3Rpb24gcyhyKXtjb25zdCBvPVtdO2Zvcihjb25zdCBhIGluIHIpe2NvbnN0IGM9clthXTtkZWxldGUgYy5tZXRhZGF0YSxvLnB1c2goYyl9cmV0dXJuIG99aWYoZSl7Y29uc3Qgcj1zKHQudGV4dHVyZXMpLG89cyh0LmltYWdlcyk7ci5sZW5ndGg+MCYmKG4udGV4dHVyZXM9ciksby5sZW5ndGg+MCYmKG4uaW1hZ2VzPW8pfXJldHVybiBufWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMubmFtZT10Lm5hbWUsdGhpcy5ibGVuZGluZz10LmJsZW5kaW5nLHRoaXMuc2lkZT10LnNpZGUsdGhpcy52ZXJ0ZXhDb2xvcnM9dC52ZXJ0ZXhDb2xvcnMsdGhpcy5vcGFjaXR5PXQub3BhY2l0eSx0aGlzLnRyYW5zcGFyZW50PXQudHJhbnNwYXJlbnQsdGhpcy5ibGVuZFNyYz10LmJsZW5kU3JjLHRoaXMuYmxlbmREc3Q9dC5ibGVuZERzdCx0aGlzLmJsZW5kRXF1YXRpb249dC5ibGVuZEVxdWF0aW9uLHRoaXMuYmxlbmRTcmNBbHBoYT10LmJsZW5kU3JjQWxwaGEsdGhpcy5ibGVuZERzdEFscGhhPXQuYmxlbmREc3RBbHBoYSx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT10LmJsZW5kRXF1YXRpb25BbHBoYSx0aGlzLmJsZW5kQ29sb3IuY29weSh0LmJsZW5kQ29sb3IpLHRoaXMuYmxlbmRBbHBoYT10LmJsZW5kQWxwaGEsdGhpcy5kZXB0aEZ1bmM9dC5kZXB0aEZ1bmMsdGhpcy5kZXB0aFRlc3Q9dC5kZXB0aFRlc3QsdGhpcy5kZXB0aFdyaXRlPXQuZGVwdGhXcml0ZSx0aGlzLnN0ZW5jaWxXcml0ZU1hc2s9dC5zdGVuY2lsV3JpdGVNYXNrLHRoaXMuc3RlbmNpbEZ1bmM9dC5zdGVuY2lsRnVuYyx0aGlzLnN0ZW5jaWxSZWY9dC5zdGVuY2lsUmVmLHRoaXMuc3RlbmNpbEZ1bmNNYXNrPXQuc3RlbmNpbEZ1bmNNYXNrLHRoaXMuc3RlbmNpbEZhaWw9dC5zdGVuY2lsRmFpbCx0aGlzLnN0ZW5jaWxaRmFpbD10LnN0ZW5jaWxaRmFpbCx0aGlzLnN0ZW5jaWxaUGFzcz10LnN0ZW5jaWxaUGFzcyx0aGlzLnN0ZW5jaWxXcml0ZT10LnN0ZW5jaWxXcml0ZTtjb25zdCBlPXQuY2xpcHBpbmdQbGFuZXM7bGV0IG49bnVsbDtpZihlIT09bnVsbCl7Y29uc3Qgcz1lLmxlbmd0aDtuPW5ldyBBcnJheShzKTtmb3IobGV0IHI9MDtyIT09czsrK3IpbltyXT1lW3JdLmNsb25lKCl9cmV0dXJuIHRoaXMuY2xpcHBpbmdQbGFuZXM9bix0aGlzLmNsaXBJbnRlcnNlY3Rpb249dC5jbGlwSW50ZXJzZWN0aW9uLHRoaXMuY2xpcFNoYWRvd3M9dC5jbGlwU2hhZG93cyx0aGlzLnNoYWRvd1NpZGU9dC5zaGFkb3dTaWRlLHRoaXMuY29sb3JXcml0ZT10LmNvbG9yV3JpdGUsdGhpcy5wcmVjaXNpb249dC5wcmVjaXNpb24sdGhpcy5wb2x5Z29uT2Zmc2V0PXQucG9seWdvbk9mZnNldCx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9dC5wb2x5Z29uT2Zmc2V0RmFjdG9yLHRoaXMucG9seWdvbk9mZnNldFVuaXRzPXQucG9seWdvbk9mZnNldFVuaXRzLHRoaXMuZGl0aGVyaW5nPXQuZGl0aGVyaW5nLHRoaXMuYWxwaGFUZXN0PXQuYWxwaGFUZXN0LHRoaXMuYWxwaGFIYXNoPXQuYWxwaGFIYXNoLHRoaXMuYWxwaGFUb0NvdmVyYWdlPXQuYWxwaGFUb0NvdmVyYWdlLHRoaXMucHJlbXVsdGlwbGllZEFscGhhPXQucHJlbXVsdGlwbGllZEFscGhhLHRoaXMuZm9yY2VTaW5nbGVQYXNzPXQuZm9yY2VTaW5nbGVQYXNzLHRoaXMudmlzaWJsZT10LnZpc2libGUsdGhpcy50b25lTWFwcGVkPXQudG9uZU1hcHBlZCx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLHRoaXN9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK319Y2xhc3MgZ2YgZXh0ZW5kcyBtZntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoQmFzaWNNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hCYXNpY01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyBncygxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5zcGVjdWxhck1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmVudk1hcD1udWxsLHRoaXMuZW52TWFwUm90YXRpb249bmV3IEFpLHRoaXMuY29tYmluZT0wLHRoaXMucmVmbGVjdGl2aXR5PTEsdGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4LHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZm9nPSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubWFwPXQubWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLnNwZWN1bGFyTWFwPXQuc3BlY3VsYXJNYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMuZW52TWFwPXQuZW52TWFwLHRoaXMuZW52TWFwUm90YXRpb24uY29weSh0LmVudk1hcFJvdGF0aW9uKSx0aGlzLmNvbWJpbmU9dC5jb21iaW5lLHRoaXMucmVmbGVjdGl2aXR5PXQucmVmbGVjdGl2aXR5LHRoaXMucmVmcmFjdGlvblJhdGlvPXQucmVmcmFjdGlvblJhdGlvLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMud2lyZWZyYW1lTGluZWNhcD10LndpcmVmcmFtZUxpbmVjYXAsdGhpcy53aXJlZnJhbWVMaW5lam9pbj10LndpcmVmcmFtZUxpbmVqb2luLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNvbnN0IHB0PW5ldyBULHhzPW5ldyBSO2xldCB4Zj0wO2NsYXNzIHh0e2NvbnN0cnVjdG9yKHQsZSxuPSExKXtpZihBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuIik7dGhpcy5pc0J1ZmZlckF0dHJpYnV0ZT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTp4ZisrfSksdGhpcy5uYW1lPSIiLHRoaXMuYXJyYXk9dCx0aGlzLml0ZW1TaXplPWUsdGhpcy5jb3VudD10IT09dm9pZCAwP3QubGVuZ3RoL2U6MCx0aGlzLm5vcm1hbGl6ZWQ9bix0aGlzLnVzYWdlPTM1MDQ0LHRoaXMudXBkYXRlUmFuZ2VzPVtdLHRoaXMuZ3B1VHlwZT0xMDE1LHRoaXMudmVyc2lvbj0wfW9uVXBsb2FkQ2FsbGJhY2soKXt9c2V0IG5lZWRzVXBkYXRlKHQpe3Q9PT0hMCYmdGhpcy52ZXJzaW9uKyt9c2V0VXNhZ2UodCl7cmV0dXJuIHRoaXMudXNhZ2U9dCx0aGlzfWFkZFVwZGF0ZVJhbmdlKHQsZSl7dGhpcy51cGRhdGVSYW5nZXMucHVzaCh7c3RhcnQ6dCxjb3VudDplfSl9Y2xlYXJVcGRhdGVSYW5nZXMoKXt0aGlzLnVwZGF0ZVJhbmdlcy5sZW5ndGg9MH1jb3B5KHQpe3JldHVybiB0aGlzLm5hbWU9dC5uYW1lLHRoaXMuYXJyYXk9bmV3IHQuYXJyYXkuY29uc3RydWN0b3IodC5hcnJheSksdGhpcy5pdGVtU2l6ZT10Lml0ZW1TaXplLHRoaXMuY291bnQ9dC5jb3VudCx0aGlzLm5vcm1hbGl6ZWQ9dC5ub3JtYWxpemVkLHRoaXMudXNhZ2U9dC51c2FnZSx0aGlzLmdwdVR5cGU9dC5ncHVUeXBlLHRoaXN9Y29weUF0KHQsZSxuKXt0Kj10aGlzLml0ZW1TaXplLG4qPWUuaXRlbVNpemU7Zm9yKGxldCBzPTAscj10aGlzLml0ZW1TaXplO3M8cjtzKyspdGhpcy5hcnJheVt0K3NdPWUuYXJyYXlbbitzXTtyZXR1cm4gdGhpc31jb3B5QXJyYXkodCl7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQpLHRoaXN9YXBwbHlNYXRyaXgzKHQpe2lmKHRoaXMuaXRlbVNpemU9PT0yKWZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKXhzLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSx4cy5hcHBseU1hdHJpeDModCksdGhpcy5zZXRYWShlLHhzLngseHMueSk7ZWxzZSBpZih0aGlzLml0ZW1TaXplPT09Mylmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylwdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSkscHQuYXBwbHlNYXRyaXgzKHQpLHRoaXMuc2V0WFlaKGUscHQueCxwdC55LHB0LnopO3JldHVybiB0aGlzfWFwcGx5TWF0cml4NCh0KXtmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylwdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSkscHQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0WFlaKGUscHQueCxwdC55LHB0LnopO3JldHVybiB0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKXB0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxwdC5hcHBseU5vcm1hbE1hdHJpeCh0KSx0aGlzLnNldFhZWihlLHB0LngscHQueSxwdC56KTtyZXR1cm4gdGhpc310cmFuc2Zvcm1EaXJlY3Rpb24odCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspcHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLHB0LnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzLnNldFhZWihlLHB0LngscHQueSxwdC56KTtyZXR1cm4gdGhpc31zZXQodCxlPTApe3JldHVybiB0aGlzLmFycmF5LnNldCh0LGUpLHRoaXN9Z2V0Q29tcG9uZW50KHQsZSl7bGV0IG49dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrZV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKG49eGkobix0aGlzLmFycmF5KSksbn1zZXRDb21wb25lbnQodCxlLG4pe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihuPUl0KG4sdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplK2VdPW4sdGhpc31nZXRYKHQpe2xldCBlPXRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT14aShlLHRoaXMuYXJyYXkpKSxlfXNldFgodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1JdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZV09ZSx0aGlzfWdldFkodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9eGkoZSx0aGlzLmFycmF5KSksZX1zZXRZKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9SXQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV09ZSx0aGlzfWdldFoodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9eGkoZSx0aGlzLmFycmF5KSksZX1zZXRaKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9SXQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl09ZSx0aGlzfWdldFcodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrM107cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9eGkoZSx0aGlzLmFycmF5KSksZX1zZXRXKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9SXQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrM109ZSx0aGlzfXNldFhZKHQsZSxuKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPUl0KGUsdGhpcy5hcnJheSksbj1JdChuLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzfXNldFhZWih0LGUsbixzKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPUl0KGUsdGhpcy5hcnJheSksbj1JdChuLHRoaXMuYXJyYXkpLHM9SXQocyx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KzBdPWUsdGhpcy5hcnJheVt0KzFdPW4sdGhpcy5hcnJheVt0KzJdPXMsdGhpc31zZXRYWVpXKHQsZSxuLHMscil7cmV0dXJuIHQqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYoZT1JdChlLHRoaXMuYXJyYXkpLG49SXQobix0aGlzLmFycmF5KSxzPUl0KHMsdGhpcy5hcnJheSkscj1JdChyLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzLmFycmF5W3QrMl09cyx0aGlzLmFycmF5W3QrM109cix0aGlzfW9uVXBsb2FkKHQpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9dCx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXJyYXksdGhpcy5pdGVtU2l6ZSkuY29weSh0aGlzKX10b0pTT04oKXtjb25zdCB0PXtpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LmZyb20odGhpcy5hcnJheSksbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9O3JldHVybiB0aGlzLm5hbWUhPT0iIiYmKHQubmFtZT10aGlzLm5hbWUpLHRoaXMudXNhZ2UhPT0zNTA0NCYmKHQudXNhZ2U9dGhpcy51c2FnZSksdH19Y2xhc3Mgd2YgZXh0ZW5kcyB4dHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQxNkFycmF5KHQpLGUsbil9fWNsYXNzIGJmIGV4dGVuZHMgeHR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBVaW50MzJBcnJheSh0KSxlLG4pfX1jbGFzcyBCZSBleHRlbmRzIHh0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgRmxvYXQzMkFycmF5KHQpLGUsbil9fWxldCBNZj0wO2NvbnN0IGp0PW5ldyBzdCx2bz1uZXcgRWUscW49bmV3IFQsVnQ9bmV3IGd0LF9pPW5ldyBndCxidD1uZXcgVDtjbGFzcyBnZSBleHRlbmRzIGNze2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzQnVmZmVyR2VvbWV0cnk9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6TWYrK30pLHRoaXMudXVpZD1GbigpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9IkJ1ZmZlckdlb21ldHJ5Iix0aGlzLmluZGV4PW51bGwsdGhpcy5pbmRpcmVjdD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPSExLHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGwsdGhpcy5kcmF3UmFuZ2U9e3N0YXJ0OjAsY291bnQ6MS8wfSx0aGlzLnVzZXJEYXRhPXt9fWdldEluZGV4KCl7cmV0dXJuIHRoaXMuaW5kZXh9c2V0SW5kZXgodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dGhpcy5pbmRleD1uZXcodGYodCk/YmY6d2YpKHQsMSk6dGhpcy5pbmRleD10LHRoaXN9c2V0SW5kaXJlY3QodCl7cmV0dXJuIHRoaXMuaW5kaXJlY3Q9dCx0aGlzfWdldEluZGlyZWN0KCl7cmV0dXJuIHRoaXMuaW5kaXJlY3R9Z2V0QXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF19c2V0QXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XT1lLHRoaXN9ZGVsZXRlQXR0cmlidXRlKHQpe3JldHVybiBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW3RdLHRoaXN9aGFzQXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF0hPT12b2lkIDB9YWRkR3JvdXAodCxlLG49MCl7dGhpcy5ncm91cHMucHVzaCh7c3RhcnQ6dCxjb3VudDplLG1hdGVyaWFsSW5kZXg6bn0pfWNsZWFyR3JvdXBzKCl7dGhpcy5ncm91cHM9W119c2V0RHJhd1JhbmdlKHQsZSl7dGhpcy5kcmF3UmFuZ2Uuc3RhcnQ9dCx0aGlzLmRyYXdSYW5nZS5jb3VudD1lfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtlIT09dm9pZCAwJiYoZS5hcHBseU1hdHJpeDQodCksZS5uZWVkc1VwZGF0ZT0hMCk7Y29uc3Qgbj10aGlzLmF0dHJpYnV0ZXMubm9ybWFsO2lmKG4hPT12b2lkIDApe2NvbnN0IHI9bmV3IG1lKCkuZ2V0Tm9ybWFsTWF0cml4KHQpO24uYXBwbHlOb3JtYWxNYXRyaXgociksbi5uZWVkc1VwZGF0ZT0hMH1jb25zdCBzPXRoaXMuYXR0cmlidXRlcy50YW5nZW50O3JldHVybiBzIT09dm9pZCAwJiYocy50cmFuc2Zvcm1EaXJlY3Rpb24odCkscy5uZWVkc1VwZGF0ZT0hMCksdGhpcy5ib3VuZGluZ0JveCE9PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCksdGhpcy5ib3VuZGluZ1NwaGVyZSE9PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksdGhpc31hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIGp0Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuYXBwbHlNYXRyaXg0KGp0KSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIGp0Lm1ha2VSb3RhdGlvblgodCksdGhpcy5hcHBseU1hdHJpeDQoanQpLHRoaXN9cm90YXRlWSh0KXtyZXR1cm4ganQubWFrZVJvdGF0aW9uWSh0KSx0aGlzLmFwcGx5TWF0cml4NChqdCksdGhpc31yb3RhdGVaKHQpe3JldHVybiBqdC5tYWtlUm90YXRpb25aKHQpLHRoaXMuYXBwbHlNYXRyaXg0KGp0KSx0aGlzfXRyYW5zbGF0ZSh0LGUsbil7cmV0dXJuIGp0Lm1ha2VUcmFuc2xhdGlvbih0LGUsbiksdGhpcy5hcHBseU1hdHJpeDQoanQpLHRoaXN9c2NhbGUodCxlLG4pe3JldHVybiBqdC5tYWtlU2NhbGUodCxlLG4pLHRoaXMuYXBwbHlNYXRyaXg0KGp0KSx0aGlzfWxvb2tBdCh0KXtyZXR1cm4gdm8ubG9va0F0KHQpLHZvLnVwZGF0ZU1hdHJpeCgpLHRoaXMuYXBwbHlNYXRyaXg0KHZvLm1hdHJpeCksdGhpc31jZW50ZXIoKXtyZXR1cm4gdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcihxbikubmVnYXRlKCksdGhpcy50cmFuc2xhdGUocW4ueCxxbi55LHFuLnopLHRoaXN9c2V0RnJvbVBvaW50cyh0KXtjb25zdCBlPXRoaXMuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2lmKGU9PT12b2lkIDApe2NvbnN0IG49W107Zm9yKGxldCBzPTAscj10Lmxlbmd0aDtzPHI7cysrKXtjb25zdCBvPXRbc107bi5wdXNoKG8ueCxvLnksby56fHwwKX10aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBCZShuLDMpKX1lbHNle2NvbnN0IG49TWF0aC5taW4odC5sZW5ndGgsZS5jb3VudCk7Zm9yKGxldCBzPTA7czxuO3MrKyl7Y29uc3Qgcj10W3NdO2Uuc2V0WFlaKHMsci54LHIueSxyLnp8fDApfXQubGVuZ3RoPmUuY291bnQmJmNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IEJ1ZmZlciBzaXplIHRvbyBzbWFsbCBmb3IgcG9pbnRzIGRhdGEuIFVzZSAuZGlzcG9zZSgpIGFuZCBjcmVhdGUgYSBuZXcgZ2VvbWV0cnkuIiksZS5uZWVkc1VwZGF0ZT0hMH1yZXR1cm4gdGhpc31jb21wdXRlQm91bmRpbmdCb3goKXt0aGlzLmJvdW5kaW5nQm94PT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IGd0KTtjb25zdCB0PXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbixlPXRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKHQmJnQuaXNHTEJ1ZmZlckF0dHJpYnV0ZSl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IEdMQnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIGEgbWFudWFsIGJvdW5kaW5nIGJveC4iLHRoaXMpLHRoaXMuYm91bmRpbmdCb3guc2V0KG5ldyBUKC0xLzAsLTEvMCwtMS8wKSxuZXcgVCgxLzAsMS8wLDEvMCkpO3JldHVybn1pZih0IT09dm9pZCAwKXtpZih0aGlzLmJvdW5kaW5nQm94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCksZSlmb3IobGV0IG49MCxzPWUubGVuZ3RoO248cztuKyspe2NvbnN0IHI9ZVtuXTtWdC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHIpLHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU/KGJ0LmFkZFZlY3RvcnModGhpcy5ib3VuZGluZ0JveC5taW4sVnQubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoYnQpLGJ0LmFkZFZlY3RvcnModGhpcy5ib3VuZGluZ0JveC5tYXgsVnQubWF4KSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoYnQpKToodGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KFZ0Lm1pbiksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KFZ0Lm1heCkpfX1lbHNlIHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7KGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLngpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi55KXx8aXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueikpJiZjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTogQ29tcHV0ZWQgbWluL21heCBoYXZlIE5hTiB2YWx1ZXMuIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl7dGhpcy5ib3VuZGluZ1NwaGVyZT09PW51bGwmJih0aGlzLmJvdW5kaW5nU3BoZXJlPW5ldyBobyk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBzcGhlcmUuIix0aGlzKSx0aGlzLmJvdW5kaW5nU3BoZXJlLnNldChuZXcgVCwxLzApO3JldHVybn1pZih0KXtjb25zdCBuPXRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO2lmKFZ0LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCksZSlmb3IobGV0IHI9MCxvPWUubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9ZVtyXTtfaS5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGEpLHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU/KGJ0LmFkZFZlY3RvcnMoVnQubWluLF9pLm1pbiksVnQuZXhwYW5kQnlQb2ludChidCksYnQuYWRkVmVjdG9ycyhWdC5tYXgsX2kubWF4KSxWdC5leHBhbmRCeVBvaW50KGJ0KSk6KFZ0LmV4cGFuZEJ5UG9pbnQoX2kubWluKSxWdC5leHBhbmRCeVBvaW50KF9pLm1heCkpfVZ0LmdldENlbnRlcihuKTtsZXQgcz0wO2ZvcihsZXQgcj0wLG89dC5jb3VudDtyPG87cisrKWJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUodCxyKSxzPU1hdGgubWF4KHMsbi5kaXN0YW5jZVRvU3F1YXJlZChidCkpO2lmKGUpZm9yKGxldCByPTAsbz1lLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPWVbcl0sYz10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2ZvcihsZXQgbD0wLGg9YS5jb3VudDtsPGg7bCsrKWJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxsKSxjJiYocW4uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGwpLGJ0LmFkZChxbikpLHM9TWF0aC5tYXgocyxuLmRpc3RhbmNlVG9TcXVhcmVkKGJ0KSl9dGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXM9TWF0aC5zcXJ0KHMpLGlzTmFOKHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzKSYmY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9fWNvbXB1dGVUYW5nZW50cygpe2NvbnN0IHQ9dGhpcy5pbmRleCxlPXRoaXMuYXR0cmlidXRlcztpZih0PT09bnVsbHx8ZS5wb3NpdGlvbj09PXZvaWQgMHx8ZS5ub3JtYWw9PT12b2lkIDB8fGUudXY9PT12b2lkIDApe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgZmFpbGVkLiBNaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZXMgKGluZGV4LCBwb3NpdGlvbiwgbm9ybWFsIG9yIHV2KSIpO3JldHVybn1jb25zdCBuPWUucG9zaXRpb24scz1lLm5vcm1hbCxyPWUudXY7dGhpcy5oYXNBdHRyaWJ1dGUoInRhbmdlbnQiKT09PSExJiZ0aGlzLnNldEF0dHJpYnV0ZSgidGFuZ2VudCIsbmV3IHh0KG5ldyBGbG9hdDMyQXJyYXkoNCpuLmNvdW50KSw0KSk7Y29uc3Qgbz10aGlzLmdldEF0dHJpYnV0ZSgidGFuZ2VudCIpLGE9W10sYz1bXTtmb3IobGV0IF89MDtfPG4uY291bnQ7XysrKWFbX109bmV3IFQsY1tfXT1uZXcgVDtjb25zdCBsPW5ldyBULGg9bmV3IFQsdT1uZXcgVCxmPW5ldyBSLGQ9bmV3IFIscD1uZXcgUix5PW5ldyBULG09bmV3IFQ7ZnVuY3Rpb24gZyhfLEUseil7bC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sXyksaC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sRSksdS5mcm9tQnVmZmVyQXR0cmlidXRlKG4seiksZi5mcm9tQnVmZmVyQXR0cmlidXRlKHIsXyksZC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsRSkscC5mcm9tQnVmZmVyQXR0cmlidXRlKHIseiksaC5zdWIobCksdS5zdWIobCksZC5zdWIoZikscC5zdWIoZik7Y29uc3Qgdj0xLyhkLngqcC55LXAueCpkLnkpO2lzRmluaXRlKHYpJiYoeS5jb3B5KGgpLm11bHRpcGx5U2NhbGFyKHAueSkuYWRkU2NhbGVkVmVjdG9yKHUsLWQueSkubXVsdGlwbHlTY2FsYXIodiksbS5jb3B5KHUpLm11bHRpcGx5U2NhbGFyKGQueCkuYWRkU2NhbGVkVmVjdG9yKGgsLXAueCkubXVsdGlwbHlTY2FsYXIodiksYVtfXS5hZGQoeSksYVtFXS5hZGQoeSksYVt6XS5hZGQoeSksY1tfXS5hZGQobSksY1tFXS5hZGQobSksY1t6XS5hZGQobSkpfWxldCBiPXRoaXMuZ3JvdXBzO2IubGVuZ3RoPT09MCYmKGI9W3tzdGFydDowLGNvdW50OnQuY291bnR9XSk7Zm9yKGxldCBfPTAsRT1iLmxlbmd0aDtfPEU7KytfKXtjb25zdCB6PWJbX10sdj16LnN0YXJ0LEM9ei5jb3VudDtmb3IobGV0IFA9dixGPXYrQztQPEY7UCs9MylnKHQuZ2V0WChQKzApLHQuZ2V0WChQKzEpLHQuZ2V0WChQKzIpKX1jb25zdCB3PW5ldyBULHg9bmV3IFQsTT1uZXcgVCxBPW5ldyBUO2Z1bmN0aW9uIFMoXyl7TS5mcm9tQnVmZmVyQXR0cmlidXRlKHMsXyksQS5jb3B5KE0pO2NvbnN0IEU9YVtfXTt3LmNvcHkoRSksdy5zdWIoTS5tdWx0aXBseVNjYWxhcihNLmRvdChFKSkpLm5vcm1hbGl6ZSgpLHguY3Jvc3NWZWN0b3JzKEEsRSk7Y29uc3Qgdj14LmRvdChjW19dKTwwPy0xOjE7by5zZXRYWVpXKF8sdy54LHcueSx3Lnosdil9Zm9yKGxldCBfPTAsRT1iLmxlbmd0aDtfPEU7KytfKXtjb25zdCB6PWJbX10sdj16LnN0YXJ0LEM9ei5jb3VudDtmb3IobGV0IFA9dixGPXYrQztQPEY7UCs9MylTKHQuZ2V0WChQKzApKSxTKHQuZ2V0WChQKzEpKSxTKHQuZ2V0WChQKzIpKX19Y29tcHV0ZVZlcnRleE5vcm1hbHMoKXtjb25zdCB0PXRoaXMuaW5kZXgsZT10aGlzLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZihlIT09dm9pZCAwKXtsZXQgbj10aGlzLmdldEF0dHJpYnV0ZSgibm9ybWFsIik7aWYobj09PXZvaWQgMCluPW5ldyB4dChuZXcgRmxvYXQzMkFycmF5KGUuY291bnQqMyksMyksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbik7ZWxzZSBmb3IobGV0IGY9MCxkPW4uY291bnQ7ZjxkO2YrKyluLnNldFhZWihmLDAsMCwwKTtjb25zdCBzPW5ldyBULHI9bmV3IFQsbz1uZXcgVCxhPW5ldyBULGM9bmV3IFQsbD1uZXcgVCxoPW5ldyBULHU9bmV3IFQ7aWYodClmb3IobGV0IGY9MCxkPXQuY291bnQ7ZjxkO2YrPTMpe2NvbnN0IHA9dC5nZXRYKGYrMCkseT10LmdldFgoZisxKSxtPXQuZ2V0WChmKzIpO3MuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHApLHIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHkpLG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLG0pLGguc3ViVmVjdG9ycyhvLHIpLHUuc3ViVmVjdG9ycyhzLHIpLGguY3Jvc3ModSksYS5mcm9tQnVmZmVyQXR0cmlidXRlKG4scCksYy5mcm9tQnVmZmVyQXR0cmlidXRlKG4seSksbC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sbSksYS5hZGQoaCksYy5hZGQoaCksbC5hZGQoaCksbi5zZXRYWVoocCxhLngsYS55LGEueiksbi5zZXRYWVooeSxjLngsYy55LGMueiksbi5zZXRYWVoobSxsLngsbC55LGwueil9ZWxzZSBmb3IobGV0IGY9MCxkPWUuY291bnQ7ZjxkO2YrPTMpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZiswKSxyLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxmKzEpLG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGYrMiksaC5zdWJWZWN0b3JzKG8sciksdS5zdWJWZWN0b3JzKHMsciksaC5jcm9zcyh1KSxuLnNldFhZWihmKzAsaC54LGgueSxoLnopLG4uc2V0WFlaKGYrMSxoLngsaC55LGgueiksbi5zZXRYWVooZisyLGgueCxoLnksaC56KTt0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKSxuLm5lZWRzVXBkYXRlPSEwfX1ub3JtYWxpemVOb3JtYWxzKCl7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMubm9ybWFsO2ZvcihsZXQgZT0wLG49dC5jb3VudDtlPG47ZSsrKWJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSxidC5ub3JtYWxpemUoKSx0LnNldFhZWihlLGJ0LngsYnQueSxidC56KX10b05vbkluZGV4ZWQoKXtmdW5jdGlvbiB0KGEsYyl7Y29uc3QgbD1hLmFycmF5LGg9YS5pdGVtU2l6ZSx1PWEubm9ybWFsaXplZCxmPW5ldyBsLmNvbnN0cnVjdG9yKGMubGVuZ3RoKmgpO2xldCBkPTAscD0wO2ZvcihsZXQgeT0wLG09Yy5sZW5ndGg7eTxtO3krKyl7YS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlP2Q9Y1t5XSphLmRhdGEuc3RyaWRlK2Eub2Zmc2V0OmQ9Y1t5XSpoO2ZvcihsZXQgZz0wO2c8aDtnKyspZltwKytdPWxbZCsrXX1yZXR1cm4gbmV3IHh0KGYsaCx1KX1pZih0aGlzLmluZGV4PT09bnVsbClyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogQnVmZmVyR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4iKSx0aGlzO2NvbnN0IGU9bmV3IGdlLG49dGhpcy5pbmRleC5hcnJheSxzPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgYSBpbiBzKXtjb25zdCBjPXNbYV0sbD10KGMsbik7ZS5zZXRBdHRyaWJ1dGUoYSxsKX1jb25zdCByPXRoaXMubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCBhIGluIHIpe2NvbnN0IGM9W10sbD1yW2FdO2ZvcihsZXQgaD0wLHU9bC5sZW5ndGg7aDx1O2grKyl7Y29uc3QgZj1sW2hdLGQ9dChmLG4pO2MucHVzaChkKX1lLm1vcnBoQXR0cmlidXRlc1thXT1jfWUubW9ycGhUYXJnZXRzUmVsYXRpdmU9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtjb25zdCBvPXRoaXMuZ3JvdXBzO2ZvcihsZXQgYT0wLGM9by5sZW5ndGg7YTxjO2ErKyl7Y29uc3QgbD1vW2FdO2UuYWRkR3JvdXAobC5zdGFydCxsLmNvdW50LGwubWF0ZXJpYWxJbmRleCl9cmV0dXJuIGV9dG9KU09OKCl7Y29uc3QgdD17bWV0YWRhdGE6e3ZlcnNpb246NC43LHR5cGU6IkJ1ZmZlckdlb21ldHJ5IixnZW5lcmF0b3I6IkJ1ZmZlckdlb21ldHJ5LnRvSlNPTiJ9fTtpZih0LnV1aWQ9dGhpcy51dWlkLHQudHlwZT10aGlzLnR5cGUsdGhpcy5uYW1lIT09IiImJih0Lm5hbWU9dGhpcy5uYW1lKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKHQudXNlckRhdGE9dGhpcy51c2VyRGF0YSksdGhpcy5wYXJhbWV0ZXJzIT09dm9pZCAwKXtjb25zdCBjPXRoaXMucGFyYW1ldGVycztmb3IoY29uc3QgbCBpbiBjKWNbbF0hPT12b2lkIDAmJih0W2xdPWNbbF0pO3JldHVybiB0fXQuZGF0YT17YXR0cmlidXRlczp7fX07Y29uc3QgZT10aGlzLmluZGV4O2UhPT1udWxsJiYodC5kYXRhLmluZGV4PXt0eXBlOmUuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmFycmF5KX0pO2NvbnN0IG49dGhpcy5hdHRyaWJ1dGVzO2Zvcihjb25zdCBjIGluIG4pe2NvbnN0IGw9bltjXTt0LmRhdGEuYXR0cmlidXRlc1tjXT1sLnRvSlNPTih0LmRhdGEpfWNvbnN0IHM9e307bGV0IHI9ITE7Zm9yKGNvbnN0IGMgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpe2NvbnN0IGw9dGhpcy5tb3JwaEF0dHJpYnV0ZXNbY10saD1bXTtmb3IobGV0IHU9MCxmPWwubGVuZ3RoO3U8Zjt1Kyspe2NvbnN0IGQ9bFt1XTtoLnB1c2goZC50b0pTT04odC5kYXRhKSl9aC5sZW5ndGg+MCYmKHNbY109aCxyPSEwKX1yJiYodC5kYXRhLm1vcnBoQXR0cmlidXRlcz1zLHQuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlKTtjb25zdCBvPXRoaXMuZ3JvdXBzO28ubGVuZ3RoPjAmJih0LmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobykpKTtjb25zdCBhPXRoaXMuYm91bmRpbmdTcGhlcmU7cmV0dXJuIGEhPT1udWxsJiYodC5kYXRhLmJvdW5kaW5nU3BoZXJlPWEudG9KU09OKCkpLHR9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7dGhpcy5pbmRleD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLmdyb3Vwcz1bXSx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsO2NvbnN0IGU9e307dGhpcy5uYW1lPXQubmFtZTtjb25zdCBuPXQuaW5kZXg7biE9PW51bGwmJnRoaXMuc2V0SW5kZXgobi5jbG9uZSgpKTtjb25zdCBzPXQuYXR0cmlidXRlcztmb3IoY29uc3QgbCBpbiBzKXtjb25zdCBoPXNbbF07dGhpcy5zZXRBdHRyaWJ1dGUobCxoLmNsb25lKGUpKX1jb25zdCByPXQubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCBsIGluIHIpe2NvbnN0IGg9W10sdT1yW2xdO2ZvcihsZXQgZj0wLGQ9dS5sZW5ndGg7ZjxkO2YrKyloLnB1c2godVtmXS5jbG9uZShlKSk7dGhpcy5tb3JwaEF0dHJpYnV0ZXNbbF09aH10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXQubW9ycGhUYXJnZXRzUmVsYXRpdmU7Y29uc3Qgbz10Lmdyb3Vwcztmb3IobGV0IGw9MCxoPW8ubGVuZ3RoO2w8aDtsKyspe2NvbnN0IHU9b1tsXTt0aGlzLmFkZEdyb3VwKHUuc3RhcnQsdS5jb3VudCx1Lm1hdGVyaWFsSW5kZXgpfWNvbnN0IGE9dC5ib3VuZGluZ0JveDthIT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9YS5jbG9uZSgpKTtjb25zdCBjPXQuYm91bmRpbmdTcGhlcmU7cmV0dXJuIGMhPT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1jLmNsb25lKCkpLHRoaXMuZHJhd1JhbmdlLnN0YXJ0PXQuZHJhd1JhbmdlLnN0YXJ0LHRoaXMuZHJhd1JhbmdlLmNvdW50PXQuZHJhd1JhbmdlLmNvdW50LHRoaXMudXNlckRhdGE9dC51c2VyRGF0YSx0aGlzfWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fWNvbnN0IERjPW5ldyBzdCxmbj1uZXcgeW8sd3M9bmV3IGhvLCRjPW5ldyBULGJzPW5ldyBULE1zPW5ldyBULEFzPW5ldyBULHpvPW5ldyBULFNzPW5ldyBULFZjPW5ldyBULF9zPW5ldyBUO2NsYXNzIEFmIGV4dGVuZHMgRWV7Y29uc3RydWN0b3IodD1uZXcgZ2UsZT1uZXcgZ2Ype3N1cGVyKCksdGhpcy5pc01lc2g9ITAsdGhpcy50eXBlPSJNZXNoIix0aGlzLmdlb21ldHJ5PXQsdGhpcy5tYXRlcmlhbD1lLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXZvaWQgMCx0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz12b2lkIDAsdGhpcy5jb3VudD0xLHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdC5tb3JwaFRhcmdldEluZmx1ZW5jZXMhPT12b2lkIDAmJih0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz10Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5zbGljZSgpKSx0Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeSE9PXZvaWQgMCYmKHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PU9iamVjdC5hc3NpZ24oe30sdC5tb3JwaFRhcmdldERpY3Rpb25hcnkpKSx0aGlzLm1hdGVyaWFsPUFycmF5LmlzQXJyYXkodC5tYXRlcmlhbCk/dC5tYXRlcmlhbC5zbGljZSgpOnQubWF0ZXJpYWwsdGhpcy5nZW9tZXRyeT10Lmdlb21ldHJ5LHRoaXN9dXBkYXRlTW9ycGhUYXJnZXRzKCl7Y29uc3QgZT10aGlzLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcyxuPU9iamVjdC5rZXlzKGUpO2lmKG4ubGVuZ3RoPjApe2NvbnN0IHM9ZVtuWzBdXTtpZihzIT09dm9pZCAwKXt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1bXSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT17fTtmb3IobGV0IHI9MCxvPXMubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9c1tyXS5uYW1lfHxTdHJpbmcocik7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCgwKSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVthXT1yfX19fWdldFZlcnRleFBvc2l0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLmdlb21ldHJ5LHM9bi5hdHRyaWJ1dGVzLnBvc2l0aW9uLHI9bi5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24sbz1uLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2UuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLHQpO2NvbnN0IGE9dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM7aWYociYmYSl7U3Muc2V0KDAsMCwwKTtmb3IobGV0IGM9MCxsPXIubGVuZ3RoO2M8bDtjKyspe2NvbnN0IGg9YVtjXSx1PXJbY107aCE9PTAmJih6by5mcm9tQnVmZmVyQXR0cmlidXRlKHUsdCksbz9Tcy5hZGRTY2FsZWRWZWN0b3Ioem8saCk6U3MuYWRkU2NhbGVkVmVjdG9yKHpvLnN1YihlKSxoKSl9ZS5hZGQoU3MpfXJldHVybiBlfXJheWNhc3QodCxlKXtjb25zdCBuPXRoaXMuZ2VvbWV0cnkscz10aGlzLm1hdGVyaWFsLHI9dGhpcy5tYXRyaXhXb3JsZDtzIT09dm9pZCAwJiYobi5ib3VuZGluZ1NwaGVyZT09PW51bGwmJm4uY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksd3MuY29weShuLmJvdW5kaW5nU3BoZXJlKSx3cy5hcHBseU1hdHJpeDQociksZm4uY29weSh0LnJheSkucmVjYXN0KHQubmVhciksISh3cy5jb250YWluc1BvaW50KGZuLm9yaWdpbik9PT0hMSYmKGZuLmludGVyc2VjdFNwaGVyZSh3cywkYyk9PT1udWxsfHxmbi5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQoJGMpPmdpKHQuZmFyLXQubmVhciwyKSkpJiYoRGMuY29weShyKS5pbnZlcnQoKSxmbi5jb3B5KHQucmF5KS5hcHBseU1hdHJpeDQoRGMpLCEobi5ib3VuZGluZ0JveCE9PW51bGwmJmZuLmludGVyc2VjdHNCb3gobi5ib3VuZGluZ0JveCk9PT0hMSkmJnRoaXMuX2NvbXB1dGVJbnRlcnNlY3Rpb25zKHQsZSxmbikpKX1fY29tcHV0ZUludGVyc2VjdGlvbnModCxlLG4pe2xldCBzO2NvbnN0IHI9dGhpcy5nZW9tZXRyeSxvPXRoaXMubWF0ZXJpYWwsYT1yLmluZGV4LGM9ci5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9ci5hdHRyaWJ1dGVzLnV2LGg9ci5hdHRyaWJ1dGVzLnV2MSx1PXIuYXR0cmlidXRlcy5ub3JtYWwsZj1yLmdyb3VwcyxkPXIuZHJhd1JhbmdlO2lmKGEhPT1udWxsKWlmKEFycmF5LmlzQXJyYXkobykpZm9yKGxldCBwPTAseT1mLmxlbmd0aDtwPHk7cCsrKXtjb25zdCBtPWZbcF0sZz1vW20ubWF0ZXJpYWxJbmRleF0sYj1NYXRoLm1heChtLnN0YXJ0LGQuc3RhcnQpLHc9TWF0aC5taW4oYS5jb3VudCxNYXRoLm1pbihtLnN0YXJ0K20uY291bnQsZC5zdGFydCtkLmNvdW50KSk7Zm9yKGxldCB4PWIsTT13O3g8TTt4Kz0zKXtjb25zdCBBPWEuZ2V0WCh4KSxTPWEuZ2V0WCh4KzEpLF89YS5nZXRYKHgrMik7cz12cyh0aGlzLGcsdCxuLGwsaCx1LEEsUyxfKSxzJiYocy5mYWNlSW5kZXg9TWF0aC5mbG9vcih4LzMpLHMuZmFjZS5tYXRlcmlhbEluZGV4PW0ubWF0ZXJpYWxJbmRleCxlLnB1c2gocykpfX1lbHNle2NvbnN0IHA9TWF0aC5tYXgoMCxkLnN0YXJ0KSx5PU1hdGgubWluKGEuY291bnQsZC5zdGFydCtkLmNvdW50KTtmb3IobGV0IG09cCxnPXk7bTxnO20rPTMpe2NvbnN0IGI9YS5nZXRYKG0pLHc9YS5nZXRYKG0rMSkseD1hLmdldFgobSsyKTtzPXZzKHRoaXMsbyx0LG4sbCxoLHUsYix3LHgpLHMmJihzLmZhY2VJbmRleD1NYXRoLmZsb29yKG0vMyksZS5wdXNoKHMpKX19ZWxzZSBpZihjIT09dm9pZCAwKWlmKEFycmF5LmlzQXJyYXkobykpZm9yKGxldCBwPTAseT1mLmxlbmd0aDtwPHk7cCsrKXtjb25zdCBtPWZbcF0sZz1vW20ubWF0ZXJpYWxJbmRleF0sYj1NYXRoLm1heChtLnN0YXJ0LGQuc3RhcnQpLHc9TWF0aC5taW4oYy5jb3VudCxNYXRoLm1pbihtLnN0YXJ0K20uY291bnQsZC5zdGFydCtkLmNvdW50KSk7Zm9yKGxldCB4PWIsTT13O3g8TTt4Kz0zKXtjb25zdCBBPXgsUz14KzEsXz14KzI7cz12cyh0aGlzLGcsdCxuLGwsaCx1LEEsUyxfKSxzJiYocy5mYWNlSW5kZXg9TWF0aC5mbG9vcih4LzMpLHMuZmFjZS5tYXRlcmlhbEluZGV4PW0ubWF0ZXJpYWxJbmRleCxlLnB1c2gocykpfX1lbHNle2NvbnN0IHA9TWF0aC5tYXgoMCxkLnN0YXJ0KSx5PU1hdGgubWluKGMuY291bnQsZC5zdGFydCtkLmNvdW50KTtmb3IobGV0IG09cCxnPXk7bTxnO20rPTMpe2NvbnN0IGI9bSx3PW0rMSx4PW0rMjtzPXZzKHRoaXMsbyx0LG4sbCxoLHUsYix3LHgpLHMmJihzLmZhY2VJbmRleD1NYXRoLmZsb29yKG0vMyksZS5wdXNoKHMpKX19fX1mdW5jdGlvbiBTZihpLHQsZSxuLHMscixvLGEpe2xldCBjO2lmKHQuc2lkZT09PTE/Yz1uLmludGVyc2VjdFRyaWFuZ2xlKG8scixzLCEwLGEpOmM9bi5pbnRlcnNlY3RUcmlhbmdsZShzLHIsbyx0LnNpZGU9PT0wLGEpLGM9PT1udWxsKXJldHVybiBudWxsO19zLmNvcHkoYSksX3MuYXBwbHlNYXRyaXg0KGkubWF0cml4V29ybGQpO2NvbnN0IGw9ZS5yYXkub3JpZ2luLmRpc3RhbmNlVG8oX3MpO3JldHVybiBsPGUubmVhcnx8bD5lLmZhcj9udWxsOntkaXN0YW5jZTpsLHBvaW50Ol9zLmNsb25lKCksb2JqZWN0Oml9fWZ1bmN0aW9uIHZzKGksdCxlLG4scyxyLG8sYSxjLGwpe2kuZ2V0VmVydGV4UG9zaXRpb24oYSxicyksaS5nZXRWZXJ0ZXhQb3NpdGlvbihjLE1zKSxpLmdldFZlcnRleFBvc2l0aW9uKGwsQXMpO2NvbnN0IGg9U2YoaSx0LGUsbixicyxNcyxBcyxWYyk7aWYoaCl7Y29uc3QgdT1uZXcgVDtldC5nZXRCYXJ5Y29vcmQoVmMsYnMsTXMsQXMsdSkscyYmKGgudXY9ZXQuZ2V0SW50ZXJwb2xhdGVkQXR0cmlidXRlKHMsYSxjLGwsdSxuZXcgUikpLHImJihoLnV2MT1ldC5nZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUocixhLGMsbCx1LG5ldyBSKSksbyYmKGgubm9ybWFsPWV0LmdldEludGVycG9sYXRlZEF0dHJpYnV0ZShvLGEsYyxsLHUsbmV3IFQpLGgubm9ybWFsLmRvdChuLmRpcmVjdGlvbik+MCYmaC5ub3JtYWwubXVsdGlwbHlTY2FsYXIoLTEpKTtjb25zdCBmPXthLGI6YyxjOmwsbm9ybWFsOm5ldyBULG1hdGVyaWFsSW5kZXg6MH07ZXQuZ2V0Tm9ybWFsKGJzLE1zLEFzLGYubm9ybWFsKSxoLmZhY2U9ZixoLmJhcnljb29yZD11fXJldHVybiBofWNvbnN0IFRvPW5ldyBULF9mPW5ldyBULHZmPW5ldyBtZTtjbGFzcyBFb3tjb25zdHJ1Y3Rvcih0PW5ldyBUKDEsMCwwKSxlPTApe3RoaXMuaXNQbGFuZT0hMCx0aGlzLm5vcm1hbD10LHRoaXMuY29uc3RhbnQ9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weSh0KSx0aGlzLmNvbnN0YW50PWUsdGhpc31zZXRDb21wb25lbnRzKHQsZSxuLHMpe3JldHVybiB0aGlzLm5vcm1hbC5zZXQodCxlLG4pLHRoaXMuY29uc3RhbnQ9cyx0aGlzfXNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodCksdGhpcy5jb25zdGFudD0tZS5kb3QodGhpcy5ub3JtYWwpLHRoaXN9c2V0RnJvbUNvcGxhbmFyUG9pbnRzKHQsZSxuKXtjb25zdCBzPVRvLnN1YlZlY3RvcnMobixlKS5jcm9zcyhfZi5zdWJWZWN0b3JzKHQsZSkpLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KHMsdCksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQubm9ybWFsKSx0aGlzLmNvbnN0YW50PXQuY29uc3RhbnQsdGhpc31ub3JtYWxpemUoKXtjb25zdCB0PTEvdGhpcy5ub3JtYWwubGVuZ3RoKCk7cmV0dXJuIHRoaXMubm9ybWFsLm11bHRpcGx5U2NhbGFyKHQpLHRoaXMuY29uc3RhbnQqPXQsdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy5jb25zdGFudCo9LTEsdGhpcy5ub3JtYWwubmVnYXRlKCksdGhpc31kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHRoaXMubm9ybWFsLmRvdCh0KSt0aGlzLmNvbnN0YW50fWRpc3RhbmNlVG9TcGhlcmUodCl7cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuY2VudGVyKS10LnJhZGl1c31wcm9qZWN0UG9pbnQodCxlKXtyZXR1cm4gZS5jb3B5KHQpLmFkZFNjYWxlZFZlY3Rvcih0aGlzLm5vcm1hbCwtdGhpcy5kaXN0YW5jZVRvUG9pbnQodCkpfWludGVyc2VjdExpbmUodCxlKXtjb25zdCBuPXQuZGVsdGEoVG8pLHM9dGhpcy5ub3JtYWwuZG90KG4pO2lmKHM9PT0wKXJldHVybiB0aGlzLmRpc3RhbmNlVG9Qb2ludCh0LnN0YXJ0KT09PTA/ZS5jb3B5KHQuc3RhcnQpOm51bGw7Y29uc3Qgcj0tKHQuc3RhcnQuZG90KHRoaXMubm9ybWFsKSt0aGlzLmNvbnN0YW50KS9zO3JldHVybiByPDB8fHI+MT9udWxsOmUuY29weSh0LnN0YXJ0KS5hZGRTY2FsZWRWZWN0b3IobixyKX1pbnRlcnNlY3RzTGluZSh0KXtjb25zdCBlPXRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpLG49dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5lbmQpO3JldHVybiBlPDAmJm4+MHx8bjwwJiZlPjB9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzUGxhbmUodGhpcyl9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzUGxhbmUodGhpcyl9Y29wbGFuYXJQb2ludCh0KXtyZXR1cm4gdC5jb3B5KHRoaXMubm9ybWFsKS5tdWx0aXBseVNjYWxhcigtdGhpcy5jb25zdGFudCl9YXBwbHlNYXRyaXg0KHQsZSl7Y29uc3Qgbj1lfHx2Zi5nZXROb3JtYWxNYXRyaXgodCkscz10aGlzLmNvcGxhbmFyUG9pbnQoVG8pLmFwcGx5TWF0cml4NCh0KSxyPXRoaXMubm9ybWFsLmFwcGx5TWF0cml4MyhuKS5ub3JtYWxpemUoKTtyZXR1cm4gdGhpcy5jb25zdGFudD0tcy5kb3QociksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMuY29uc3RhbnQtPXQuZG90KHRoaXMubm9ybWFsKSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5ub3JtYWwuZXF1YWxzKHRoaXMubm9ybWFsKSYmdC5jb25zdGFudD09PXRoaXMuY29uc3RhbnR9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1sZXQgeGU9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLnR5cGU9IkN1cnZlIix0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz0yMDAsdGhpcy5uZWVkc1VwZGF0ZT0hMSx0aGlzLmNhY2hlQXJjTGVuZ3Rocz1udWxsfWdldFBvaW50KCl7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZTogLmdldFBvaW50KCkgbm90IGltcGxlbWVudGVkLiIpfWdldFBvaW50QXQodCxlKXtjb25zdCBuPXRoaXMuZ2V0VXRvVG1hcHBpbmcodCk7cmV0dXJuIHRoaXMuZ2V0UG9pbnQobixlKX1nZXRQb2ludHModD01KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248PXQ7bisrKWUucHVzaCh0aGlzLmdldFBvaW50KG4vdCkpO3JldHVybiBlfWdldFNwYWNlZFBvaW50cyh0PTUpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjw9dDtuKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnRBdChuL3QpKTtyZXR1cm4gZX1nZXRMZW5ndGgoKXtjb25zdCB0PXRoaXMuZ2V0TGVuZ3RocygpO3JldHVybiB0W3QubGVuZ3RoLTFdfWdldExlbmd0aHModD10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyl7aWYodGhpcy5jYWNoZUFyY0xlbmd0aHMmJnRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aD09PXQrMSYmIXRoaXMubmVlZHNVcGRhdGUpcmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzO3RoaXMubmVlZHNVcGRhdGU9ITE7Y29uc3QgZT1bXTtsZXQgbixzPXRoaXMuZ2V0UG9pbnQoMCkscj0wO2UucHVzaCgwKTtmb3IobGV0IG89MTtvPD10O28rKyluPXRoaXMuZ2V0UG9pbnQoby90KSxyKz1uLmRpc3RhbmNlVG8ocyksZS5wdXNoKHIpLHM9bjtyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM9ZSxlfXVwZGF0ZUFyY0xlbmd0aHMoKXt0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXMuZ2V0TGVuZ3RocygpfWdldFV0b1RtYXBwaW5nKHQsZT1udWxsKXtjb25zdCBuPXRoaXMuZ2V0TGVuZ3RocygpO2xldCBzPTA7Y29uc3Qgcj1uLmxlbmd0aDtsZXQgbztlP289ZTpvPXQqbltyLTFdO2xldCBhPTAsYz1yLTEsbDtmb3IoO2E8PWM7KWlmKHM9TWF0aC5mbG9vcihhKyhjLWEpLzIpLGw9bltzXS1vLGw8MClhPXMrMTtlbHNlIGlmKGw+MCljPXMtMTtlbHNle2M9czticmVha31pZihzPWMsbltzXT09PW8pcmV0dXJuIHMvKHItMSk7Y29uc3QgaD1uW3NdLGY9bltzKzFdLWgsZD0oby1oKS9mO3JldHVybihzK2QpLyhyLTEpfWdldFRhbmdlbnQodCxlKXtsZXQgcz10LTFlLTQscj10KzFlLTQ7czwwJiYocz0wKSxyPjEmJihyPTEpO2NvbnN0IG89dGhpcy5nZXRQb2ludChzKSxhPXRoaXMuZ2V0UG9pbnQociksYz1lfHwoby5pc1ZlY3RvcjI/bmV3IFI6bmV3IFQpO3JldHVybiBjLmNvcHkoYSkuc3ViKG8pLm5vcm1hbGl6ZSgpLGN9Z2V0VGFuZ2VudEF0KHQsZSl7Y29uc3Qgbj10aGlzLmdldFV0b1RtYXBwaW5nKHQpO3JldHVybiB0aGlzLmdldFRhbmdlbnQobixlKX1jb21wdXRlRnJlbmV0RnJhbWVzKHQsZT0hMSl7Y29uc3Qgbj1uZXcgVCxzPVtdLHI9W10sbz1bXSxhPW5ldyBULGM9bmV3IHN0O2ZvcihsZXQgZD0wO2Q8PXQ7ZCsrKXtjb25zdCBwPWQvdDtzW2RdPXRoaXMuZ2V0VGFuZ2VudEF0KHAsbmV3IFQpfXJbMF09bmV3IFQsb1swXT1uZXcgVDtsZXQgbD1OdW1iZXIuTUFYX1ZBTFVFO2NvbnN0IGg9TWF0aC5hYnMoc1swXS54KSx1PU1hdGguYWJzKHNbMF0ueSksZj1NYXRoLmFicyhzWzBdLnopO2g8PWwmJihsPWgsbi5zZXQoMSwwLDApKSx1PD1sJiYobD11LG4uc2V0KDAsMSwwKSksZjw9bCYmbi5zZXQoMCwwLDEpLGEuY3Jvc3NWZWN0b3JzKHNbMF0sbikubm9ybWFsaXplKCksclswXS5jcm9zc1ZlY3RvcnMoc1swXSxhKSxvWzBdLmNyb3NzVmVjdG9ycyhzWzBdLHJbMF0pO2ZvcihsZXQgZD0xO2Q8PXQ7ZCsrKXtpZihyW2RdPXJbZC0xXS5jbG9uZSgpLG9bZF09b1tkLTFdLmNsb25lKCksYS5jcm9zc1ZlY3RvcnMoc1tkLTFdLHNbZF0pLGEubGVuZ3RoKCk+TnVtYmVyLkVQU0lMT04pe2Eubm9ybWFsaXplKCk7Y29uc3QgcD1NYXRoLmFjb3MoRyhzW2QtMV0uZG90KHNbZF0pLC0xLDEpKTtyW2RdLmFwcGx5TWF0cml4NChjLm1ha2VSb3RhdGlvbkF4aXMoYSxwKSl9b1tkXS5jcm9zc1ZlY3RvcnMoc1tkXSxyW2RdKX1pZihlPT09ITApe2xldCBkPU1hdGguYWNvcyhHKHJbMF0uZG90KHJbdF0pLC0xLDEpKTtkLz10LHNbMF0uZG90KGEuY3Jvc3NWZWN0b3JzKHJbMF0sclt0XSkpPjAmJihkPS1kKTtmb3IobGV0IHA9MTtwPD10O3ArKylyW3BdLmFwcGx5TWF0cml4NChjLm1ha2VSb3RhdGlvbkF4aXMoc1twXSxkKnApKSxvW3BdLmNyb3NzVmVjdG9ycyhzW3BdLHJbcF0pfXJldHVybnt0YW5nZW50czpzLG5vcm1hbHM6cixiaW5vcm1hbHM6b319Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPXQuYXJjTGVuZ3RoRGl2aXNpb25zLHRoaXN9dG9KU09OKCl7Y29uc3QgdD17bWV0YWRhdGE6e3ZlcnNpb246NC43LHR5cGU6IkN1cnZlIixnZW5lcmF0b3I6IkN1cnZlLnRvSlNPTiJ9fTtyZXR1cm4gdC5hcmNMZW5ndGhEaXZpc2lvbnM9dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMsdC50eXBlPXRoaXMudHlwZSx0fWZyb21KU09OKHQpe3JldHVybiB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz10LmFyY0xlbmd0aERpdmlzaW9ucyx0aGlzfX07Y2xhc3MgenMgZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MSxzPTEscj0wLG89TWF0aC5QSSoyLGE9ITEsYz0wKXtzdXBlcigpLHRoaXMuaXNFbGxpcHNlQ3VydmU9ITAsdGhpcy50eXBlPSJFbGxpcHNlQ3VydmUiLHRoaXMuYVg9dCx0aGlzLmFZPWUsdGhpcy54UmFkaXVzPW4sdGhpcy55UmFkaXVzPXMsdGhpcy5hU3RhcnRBbmdsZT1yLHRoaXMuYUVuZEFuZ2xlPW8sdGhpcy5hQ2xvY2t3aXNlPWEsdGhpcy5hUm90YXRpb249Y31nZXRQb2ludCh0LGU9bmV3IFIpe2NvbnN0IG49ZSxzPU1hdGguUEkqMjtsZXQgcj10aGlzLmFFbmRBbmdsZS10aGlzLmFTdGFydEFuZ2xlO2NvbnN0IG89TWF0aC5hYnMocik8TnVtYmVyLkVQU0lMT047Zm9yKDtyPDA7KXIrPXM7Zm9yKDtyPnM7KXItPXM7cjxOdW1iZXIuRVBTSUxPTiYmKG8/cj0wOnI9cyksdGhpcy5hQ2xvY2t3aXNlPT09ITAmJiFvJiYocj09PXM/cj0tczpyPXItcyk7Y29uc3QgYT10aGlzLmFTdGFydEFuZ2xlK3QqcjtsZXQgYz10aGlzLmFYK3RoaXMueFJhZGl1cypNYXRoLmNvcyhhKSxsPXRoaXMuYVkrdGhpcy55UmFkaXVzKk1hdGguc2luKGEpO2lmKHRoaXMuYVJvdGF0aW9uIT09MCl7Y29uc3QgaD1NYXRoLmNvcyh0aGlzLmFSb3RhdGlvbiksdT1NYXRoLnNpbih0aGlzLmFSb3RhdGlvbiksZj1jLXRoaXMuYVgsZD1sLXRoaXMuYVk7Yz1mKmgtZCp1K3RoaXMuYVgsbD1mKnUrZCpoK3RoaXMuYVl9cmV0dXJuIG4uc2V0KGMsbCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmFYPXQuYVgsdGhpcy5hWT10LmFZLHRoaXMueFJhZGl1cz10LnhSYWRpdXMsdGhpcy55UmFkaXVzPXQueVJhZGl1cyx0aGlzLmFTdGFydEFuZ2xlPXQuYVN0YXJ0QW5nbGUsdGhpcy5hRW5kQW5nbGU9dC5hRW5kQW5nbGUsdGhpcy5hQ2xvY2t3aXNlPXQuYUNsb2Nrd2lzZSx0aGlzLmFSb3RhdGlvbj10LmFSb3RhdGlvbix0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQuYVg9dGhpcy5hWCx0LmFZPXRoaXMuYVksdC54UmFkaXVzPXRoaXMueFJhZGl1cyx0LnlSYWRpdXM9dGhpcy55UmFkaXVzLHQuYVN0YXJ0QW5nbGU9dGhpcy5hU3RhcnRBbmdsZSx0LmFFbmRBbmdsZT10aGlzLmFFbmRBbmdsZSx0LmFDbG9ja3dpc2U9dGhpcy5hQ2xvY2t3aXNlLHQuYVJvdGF0aW9uPXRoaXMuYVJvdGF0aW9uLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMuYVg9dC5hWCx0aGlzLmFZPXQuYVksdGhpcy54UmFkaXVzPXQueFJhZGl1cyx0aGlzLnlSYWRpdXM9dC55UmFkaXVzLHRoaXMuYVN0YXJ0QW5nbGU9dC5hU3RhcnRBbmdsZSx0aGlzLmFFbmRBbmdsZT10LmFFbmRBbmdsZSx0aGlzLmFDbG9ja3dpc2U9dC5hQ2xvY2t3aXNlLHRoaXMuYVJvdGF0aW9uPXQuYVJvdGF0aW9uLHRoaXN9fWNsYXNzIFVjIGV4dGVuZHMgenN7Y29uc3RydWN0b3IodCxlLG4scyxyLG8pe3N1cGVyKHQsZSxuLG4scyxyLG8pLHRoaXMuaXNBcmNDdXJ2ZT0hMCx0aGlzLnR5cGU9IkFyY0N1cnZlIn19ZnVuY3Rpb24gUG8oKXtsZXQgaT0wLHQ9MCxlPTAsbj0wO2Z1bmN0aW9uIHMocixvLGEsYyl7aT1yLHQ9YSxlPS0zKnIrMypvLTIqYS1jLG49MipyLTIqbythK2N9cmV0dXJue2luaXRDYXRtdWxsUm9tOmZ1bmN0aW9uKHIsbyxhLGMsbCl7cyhvLGEsbCooYS1yKSxsKihjLW8pKX0saW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tOmZ1bmN0aW9uKHIsbyxhLGMsbCxoLHUpe2xldCBmPShvLXIpL2wtKGEtcikvKGwraCkrKGEtbykvaCxkPShhLW8pL2gtKGMtbykvKGgrdSkrKGMtYSkvdTtmKj1oLGQqPWgscyhvLGEsZixkKX0sY2FsYzpmdW5jdGlvbihyKXtjb25zdCBvPXIqcixhPW8qcjtyZXR1cm4gaSt0KnIrZSpvK24qYX19fWNvbnN0IFRzPW5ldyBULENvPW5ldyBQbyxCbz1uZXcgUG8sRm89bmV3IFBvO2NsYXNzIHFjIGV4dGVuZHMgeGV7Y29uc3RydWN0b3IodD1bXSxlPSExLG49ImNlbnRyaXBldGFsIixzPS41KXtzdXBlcigpLHRoaXMuaXNDYXRtdWxsUm9tQ3VydmUzPSEwLHRoaXMudHlwZT0iQ2F0bXVsbFJvbUN1cnZlMyIsdGhpcy5wb2ludHM9dCx0aGlzLmNsb3NlZD1lLHRoaXMuY3VydmVUeXBlPW4sdGhpcy50ZW5zaW9uPXN9Z2V0UG9pbnQodCxlPW5ldyBUKXtjb25zdCBuPWUscz10aGlzLnBvaW50cyxyPXMubGVuZ3RoLG89KHItKHRoaXMuY2xvc2VkPzA6MSkpKnQ7bGV0IGE9TWF0aC5mbG9vcihvKSxjPW8tYTt0aGlzLmNsb3NlZD9hKz1hPjA/MDooTWF0aC5mbG9vcihNYXRoLmFicyhhKS9yKSsxKSpyOmM9PT0wJiZhPT09ci0xJiYoYT1yLTIsYz0xKTtsZXQgbCxoO3RoaXMuY2xvc2VkfHxhPjA/bD1zWyhhLTEpJXJdOihUcy5zdWJWZWN0b3JzKHNbMF0sc1sxXSkuYWRkKHNbMF0pLGw9VHMpO2NvbnN0IHU9c1thJXJdLGY9c1soYSsxKSVyXTtpZih0aGlzLmNsb3NlZHx8YSsyPHI/aD1zWyhhKzIpJXJdOihUcy5zdWJWZWN0b3JzKHNbci0xXSxzW3ItMl0pLmFkZChzW3ItMV0pLGg9VHMpLHRoaXMuY3VydmVUeXBlPT09ImNlbnRyaXBldGFsInx8dGhpcy5jdXJ2ZVR5cGU9PT0iY2hvcmRhbCIpe2NvbnN0IGQ9dGhpcy5jdXJ2ZVR5cGU9PT0iY2hvcmRhbCI/LjU6LjI1O2xldCBwPU1hdGgucG93KGwuZGlzdGFuY2VUb1NxdWFyZWQodSksZCkseT1NYXRoLnBvdyh1LmRpc3RhbmNlVG9TcXVhcmVkKGYpLGQpLG09TWF0aC5wb3coZi5kaXN0YW5jZVRvU3F1YXJlZChoKSxkKTt5PDFlLTQmJih5PTEpLHA8MWUtNCYmKHA9eSksbTwxZS00JiYobT15KSxDby5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20obC54LHUueCxmLngsaC54LHAseSxtKSxCby5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20obC55LHUueSxmLnksaC55LHAseSxtKSxGby5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20obC56LHUueixmLnosaC56LHAseSxtKX1lbHNlIHRoaXMuY3VydmVUeXBlPT09ImNhdG11bGxyb20iJiYoQ28uaW5pdENhdG11bGxSb20obC54LHUueCxmLngsaC54LHRoaXMudGVuc2lvbiksQm8uaW5pdENhdG11bGxSb20obC55LHUueSxmLnksaC55LHRoaXMudGVuc2lvbiksRm8uaW5pdENhdG11bGxSb20obC56LHUueixmLnosaC56LHRoaXMudGVuc2lvbikpO3JldHVybiBuLnNldChDby5jYWxjKGMpLEJvLmNhbGMoYyksRm8uY2FsYyhjKSksbn1jb3B5KHQpe3N1cGVyLmNvcHkodCksdGhpcy5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10LnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10LnBvaW50c1tlXTt0aGlzLnBvaW50cy5wdXNoKHMuY2xvbmUoKSl9cmV0dXJuIHRoaXMuY2xvc2VkPXQuY2xvc2VkLHRoaXMuY3VydmVUeXBlPXQuY3VydmVUeXBlLHRoaXMudGVuc2lvbj10LnRlbnNpb24sdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dGhpcy5wb2ludHNbZV07dC5wb2ludHMucHVzaChzLnRvQXJyYXkoKSl9cmV0dXJuIHQuY2xvc2VkPXRoaXMuY2xvc2VkLHQuY3VydmVUeXBlPXRoaXMuY3VydmVUeXBlLHQudGVuc2lvbj10aGlzLnRlbnNpb24sdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2gobmV3IFQoKS5mcm9tQXJyYXkocykpfXJldHVybiB0aGlzLmNsb3NlZD10LmNsb3NlZCx0aGlzLmN1cnZlVHlwZT10LmN1cnZlVHlwZSx0aGlzLnRlbnNpb249dC50ZW5zaW9uLHRoaXN9fWZ1bmN0aW9uIEhjKGksdCxlLG4scyl7Y29uc3Qgcj0obi10KSouNSxvPShzLWUpKi41LGE9aSppLGM9aSphO3JldHVybigyKmUtMipuK3IrbykqYysoLTMqZSszKm4tMipyLW8pKmErcippK2V9ZnVuY3Rpb24gemYoaSx0KXtjb25zdCBlPTEtaTtyZXR1cm4gZSplKnR9ZnVuY3Rpb24gVGYoaSx0KXtyZXR1cm4gMiooMS1pKSppKnR9ZnVuY3Rpb24gRWYoaSx0KXtyZXR1cm4gaSppKnR9ZnVuY3Rpb24gdmkoaSx0LGUsbil7cmV0dXJuIHpmKGksdCkrVGYoaSxlKStFZihpLG4pfWZ1bmN0aW9uIFBmKGksdCl7Y29uc3QgZT0xLWk7cmV0dXJuIGUqZSplKnR9ZnVuY3Rpb24gQ2YoaSx0KXtjb25zdCBlPTEtaTtyZXR1cm4gMyplKmUqaSp0fWZ1bmN0aW9uIEJmKGksdCl7cmV0dXJuIDMqKDEtaSkqaSppKnR9ZnVuY3Rpb24gRmYoaSx0KXtyZXR1cm4gaSppKmkqdH1mdW5jdGlvbiB6aShpLHQsZSxuLHMpe3JldHVybiBQZihpLHQpK0NmKGksZSkrQmYoaSxuKStGZihpLHMpfWNsYXNzIElvIGV4dGVuZHMgeGV7Y29uc3RydWN0b3IodD1uZXcgUixlPW5ldyBSLG49bmV3IFIscz1uZXcgUil7c3VwZXIoKSx0aGlzLmlzQ3ViaWNCZXppZXJDdXJ2ZT0hMCx0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1uLHRoaXMudjM9c31nZXRQb2ludCh0LGU9bmV3IFIpe2NvbnN0IG49ZSxzPXRoaXMudjAscj10aGlzLnYxLG89dGhpcy52MixhPXRoaXMudjM7cmV0dXJuIG4uc2V0KHppKHQscy54LHIueCxvLngsYS54KSx6aSh0LHMueSxyLnksby55LGEueSkpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYwLmNvcHkodC52MCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzLnYzLmNvcHkodC52MyksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0LnYzPXRoaXMudjMudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjAuZnJvbUFycmF5KHQudjApLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXMudjMuZnJvbUFycmF5KHQudjMpLHRoaXN9fWNsYXNzIFhjIGV4dGVuZHMgeGV7Y29uc3RydWN0b3IodD1uZXcgVCxlPW5ldyBULG49bmV3IFQscz1uZXcgVCl7c3VwZXIoKSx0aGlzLmlzQ3ViaWNCZXppZXJDdXJ2ZTM9ITAsdGhpcy50eXBlPSJDdWJpY0JlemllckN1cnZlMyIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW4sdGhpcy52Mz1zfWdldFBvaW50KHQsZT1uZXcgVCl7Y29uc3Qgbj1lLHM9dGhpcy52MCxyPXRoaXMudjEsbz10aGlzLnYyLGE9dGhpcy52MztyZXR1cm4gbi5zZXQoemkodCxzLngsci54LG8ueCxhLngpLHppKHQscy55LHIueSxvLnksYS55KSx6aSh0LHMueixyLnosby56LGEueikpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYwLmNvcHkodC52MCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzLnYzLmNvcHkodC52MyksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0LnYzPXRoaXMudjMudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjAuZnJvbUFycmF5KHQudjApLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXMudjMuZnJvbUFycmF5KHQudjMpLHRoaXN9fWNsYXNzIGtvIGV4dGVuZHMgeGV7Y29uc3RydWN0b3IodD1uZXcgUixlPW5ldyBSKXtzdXBlcigpLHRoaXMuaXNMaW5lQ3VydmU9ITAsdGhpcy50eXBlPSJMaW5lQ3VydmUiLHRoaXMudjE9dCx0aGlzLnYyPWV9Z2V0UG9pbnQodCxlPW5ldyBSKXtjb25zdCBuPWU7cmV0dXJuIHQ9PT0xP24uY29weSh0aGlzLnYyKToobi5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSxuLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnYxKSksbn1nZXRQb2ludEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQodCxlKX1nZXRUYW5nZW50KHQsZT1uZXcgUil7cmV0dXJuIGUuc3ViVmVjdG9ycyh0aGlzLnYyLHRoaXMudjEpLm5vcm1hbGl6ZSgpfWdldFRhbmdlbnRBdCh0LGUpe3JldHVybiB0aGlzLmdldFRhbmdlbnQodCxlKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgR2MgZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQpe3N1cGVyKCksdGhpcy5pc0xpbmVDdXJ2ZTM9ITAsdGhpcy50eXBlPSJMaW5lQ3VydmUzIix0aGlzLnYxPXQsdGhpcy52Mj1lfWdldFBvaW50KHQsZT1uZXcgVCl7Y29uc3Qgbj1lO3JldHVybiB0PT09MT9uLmNvcHkodGhpcy52Mik6KG4uY29weSh0aGlzLnYyKS5zdWIodGhpcy52MSksbi5tdWx0aXBseVNjYWxhcih0KS5hZGQodGhpcy52MSkpLG59Z2V0UG9pbnRBdCh0LGUpe3JldHVybiB0aGlzLmdldFBvaW50KHQsZSl9Z2V0VGFuZ2VudCh0LGU9bmV3IFQpe3JldHVybiBlLnN1YlZlY3RvcnModGhpcy52Mix0aGlzLnYxKS5ub3JtYWxpemUoKX1nZXRUYW5nZW50QXQodCxlKXtyZXR1cm4gdGhpcy5nZXRUYW5nZW50KHQsZSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fWNsYXNzIE5vIGV4dGVuZHMgeGV7Y29uc3RydWN0b3IodD1uZXcgUixlPW5ldyBSLG49bmV3IFIpe3N1cGVyKCksdGhpcy5pc1F1YWRyYXRpY0JlemllckN1cnZlPSEwLHRoaXMudHlwZT0iUXVhZHJhdGljQmV6aWVyQ3VydmUiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1ufWdldFBvaW50KHQsZT1uZXcgUil7Y29uc3Qgbj1lLHM9dGhpcy52MCxyPXRoaXMudjEsbz10aGlzLnYyO3JldHVybiBuLnNldCh2aSh0LHMueCxyLngsby54KSx2aSh0LHMueSxyLnksby55KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MD10aGlzLnYwLnRvQXJyYXkoKSx0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgV2MgZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQsbj1uZXcgVCl7c3VwZXIoKSx0aGlzLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzPSEwLHRoaXMudHlwZT0iUXVhZHJhdGljQmV6aWVyQ3VydmUzIix0aGlzLnYwPXQsdGhpcy52MT1lLHRoaXMudjI9bn1nZXRQb2ludCh0LGU9bmV3IFQpe2NvbnN0IG49ZSxzPXRoaXMudjAscj10aGlzLnYxLG89dGhpcy52MjtyZXR1cm4gbi5zZXQodmkodCxzLngsci54LG8ueCksdmkodCxzLnksci55LG8ueSksdmkodCxzLnosci56LG8ueikpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYwLmNvcHkodC52MCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjAuZnJvbUFycmF5KHQudjApLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fWNsYXNzIFJvIGV4dGVuZHMgeGV7Y29uc3RydWN0b3IodD1bXSl7c3VwZXIoKSx0aGlzLmlzU3BsaW5lQ3VydmU9ITAsdGhpcy50eXBlPSJTcGxpbmVDdXJ2ZSIsdGhpcy5wb2ludHM9dH1nZXRQb2ludCh0LGU9bmV3IFIpe2NvbnN0IG49ZSxzPXRoaXMucG9pbnRzLHI9KHMubGVuZ3RoLTEpKnQsbz1NYXRoLmZsb29yKHIpLGE9ci1vLGM9c1tvPT09MD9vOm8tMV0sbD1zW29dLGg9c1tvPnMubGVuZ3RoLTI/cy5sZW5ndGgtMTpvKzFdLHU9c1tvPnMubGVuZ3RoLTM/cy5sZW5ndGgtMTpvKzJdO3JldHVybiBuLnNldChIYyhhLGMueCxsLngsaC54LHUueCksSGMoYSxjLnksbC55LGgueSx1LnkpKSxufWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2gocy5jbG9uZSgpKX1yZXR1cm4gdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dGhpcy5wb2ludHNbZV07dC5wb2ludHMucHVzaChzLnRvQXJyYXkoKSl9cmV0dXJuIHR9ZnJvbUpTT04odCl7c3VwZXIuZnJvbUpTT04odCksdGhpcy5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10LnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10LnBvaW50c1tlXTt0aGlzLnBvaW50cy5wdXNoKG5ldyBSKCkuZnJvbUFycmF5KHMpKX1yZXR1cm4gdGhpc319dmFyIFpjPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEFyY0N1cnZlOlVjLENhdG11bGxSb21DdXJ2ZTM6cWMsQ3ViaWNCZXppZXJDdXJ2ZTpJbyxDdWJpY0JlemllckN1cnZlMzpYYyxFbGxpcHNlQ3VydmU6enMsTGluZUN1cnZlOmtvLExpbmVDdXJ2ZTM6R2MsUXVhZHJhdGljQmV6aWVyQ3VydmU6Tm8sUXVhZHJhdGljQmV6aWVyQ3VydmUzOldjLFNwbGluZUN1cnZlOlJvfSk7Y2xhc3MgSWYgZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy50eXBlPSJDdXJ2ZVBhdGgiLHRoaXMuY3VydmVzPVtdLHRoaXMuYXV0b0Nsb3NlPSExfWFkZCh0KXt0aGlzLmN1cnZlcy5wdXNoKHQpfWNsb3NlUGF0aCgpe2NvbnN0IHQ9dGhpcy5jdXJ2ZXNbMF0uZ2V0UG9pbnQoMCksZT10aGlzLmN1cnZlc1t0aGlzLmN1cnZlcy5sZW5ndGgtMV0uZ2V0UG9pbnQoMSk7aWYoIXQuZXF1YWxzKGUpKXtjb25zdCBuPXQuaXNWZWN0b3IyPT09ITA/IkxpbmVDdXJ2ZSI6IkxpbmVDdXJ2ZTMiO3RoaXMuY3VydmVzLnB1c2gobmV3IFpjW25dKGUsdCkpfXJldHVybiB0aGlzfWdldFBvaW50KHQsZSl7Y29uc3Qgbj10KnRoaXMuZ2V0TGVuZ3RoKCkscz10aGlzLmdldEN1cnZlTGVuZ3RocygpO2xldCByPTA7Zm9yKDtyPHMubGVuZ3RoOyl7aWYoc1tyXT49bil7Y29uc3Qgbz1zW3JdLW4sYT10aGlzLmN1cnZlc1tyXSxjPWEuZ2V0TGVuZ3RoKCksbD1jPT09MD8wOjEtby9jO3JldHVybiBhLmdldFBvaW50QXQobCxlKX1yKyt9cmV0dXJuIG51bGx9Z2V0TGVuZ3RoKCl7Y29uc3QgdD10aGlzLmdldEN1cnZlTGVuZ3RocygpO3JldHVybiB0W3QubGVuZ3RoLTFdfXVwZGF0ZUFyY0xlbmd0aHMoKXt0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXMuY2FjaGVMZW5ndGhzPW51bGwsdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKX1nZXRDdXJ2ZUxlbmd0aHMoKXtpZih0aGlzLmNhY2hlTGVuZ3RocyYmdGhpcy5jYWNoZUxlbmd0aHMubGVuZ3RoPT09dGhpcy5jdXJ2ZXMubGVuZ3RoKXJldHVybiB0aGlzLmNhY2hlTGVuZ3Rocztjb25zdCB0PVtdO2xldCBlPTA7Zm9yKGxldCBuPTAscz10aGlzLmN1cnZlcy5sZW5ndGg7bjxzO24rKyllKz10aGlzLmN1cnZlc1tuXS5nZXRMZW5ndGgoKSx0LnB1c2goZSk7cmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzPXQsdH1nZXRTcGFjZWRQb2ludHModD00MCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPD10O24rKyllLnB1c2godGhpcy5nZXRQb2ludChuL3QpKTtyZXR1cm4gdGhpcy5hdXRvQ2xvc2UmJmUucHVzaChlWzBdKSxlfWdldFBvaW50cyh0PTEyKXtjb25zdCBlPVtdO2xldCBuO2ZvcihsZXQgcz0wLHI9dGhpcy5jdXJ2ZXM7czxyLmxlbmd0aDtzKyspe2NvbnN0IG89cltzXSxhPW8uaXNFbGxpcHNlQ3VydmU/dCoyOm8uaXNMaW5lQ3VydmV8fG8uaXNMaW5lQ3VydmUzPzE6by5pc1NwbGluZUN1cnZlP3Qqby5wb2ludHMubGVuZ3RoOnQsYz1vLmdldFBvaW50cyhhKTtmb3IobGV0IGw9MDtsPGMubGVuZ3RoO2wrKyl7Y29uc3QgaD1jW2xdO24mJm4uZXF1YWxzKGgpfHwoZS5wdXNoKGgpLG49aCl9fXJldHVybiB0aGlzLmF1dG9DbG9zZSYmZS5sZW5ndGg+MSYmIWVbZS5sZW5ndGgtMV0uZXF1YWxzKGVbMF0pJiZlLnB1c2goZVswXSksZX1jb3B5KHQpe3N1cGVyLmNvcHkodCksdGhpcy5jdXJ2ZXM9W107Zm9yKGxldCBlPTAsbj10LmN1cnZlcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10LmN1cnZlc1tlXTt0aGlzLmN1cnZlcy5wdXNoKHMuY2xvbmUoKSl9cmV0dXJuIHRoaXMuYXV0b0Nsb3NlPXQuYXV0b0Nsb3NlLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTt0LmF1dG9DbG9zZT10aGlzLmF1dG9DbG9zZSx0LmN1cnZlcz1bXTtmb3IobGV0IGU9MCxuPXRoaXMuY3VydmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXRoaXMuY3VydmVzW2VdO3QuY3VydmVzLnB1c2gocy50b0pTT04oKSl9cmV0dXJuIHR9ZnJvbUpTT04odCl7c3VwZXIuZnJvbUpTT04odCksdGhpcy5hdXRvQ2xvc2U9dC5hdXRvQ2xvc2UsdGhpcy5jdXJ2ZXM9W107Zm9yKGxldCBlPTAsbj10LmN1cnZlcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10LmN1cnZlc1tlXTt0aGlzLmN1cnZlcy5wdXNoKG5ldyBaY1tzLnR5cGVdKCkuZnJvbUpTT04ocykpfXJldHVybiB0aGlzfX1sZXQgSmM9Y2xhc3MgZXh0ZW5kcyBJZntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iUGF0aCIsdGhpcy5jdXJyZW50UG9pbnQ9bmV3IFIsdCYmdGhpcy5zZXRGcm9tUG9pbnRzKHQpfXNldEZyb21Qb2ludHModCl7dGhpcy5tb3ZlVG8odFswXS54LHRbMF0ueSk7Zm9yKGxldCBlPTEsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMubGluZVRvKHRbZV0ueCx0W2VdLnkpO3JldHVybiB0aGlzfW1vdmVUbyh0LGUpe3JldHVybiB0aGlzLmN1cnJlbnRQb2ludC5zZXQodCxlKSx0aGlzfWxpbmVUbyh0LGUpe2NvbnN0IG49bmV3IGtvKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IFIodCxlKSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2gobiksdGhpcy5jdXJyZW50UG9pbnQuc2V0KHQsZSksdGhpc31xdWFkcmF0aWNDdXJ2ZVRvKHQsZSxuLHMpe2NvbnN0IHI9bmV3IE5vKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IFIodCxlKSxuZXcgUihuLHMpKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChyKSx0aGlzLmN1cnJlbnRQb2ludC5zZXQobixzKSx0aGlzfWJlemllckN1cnZlVG8odCxlLG4scyxyLG8pe2NvbnN0IGE9bmV3IElvKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IFIodCxlKSxuZXcgUihuLHMpLG5ldyBSKHIsbykpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKGEpLHRoaXMuY3VycmVudFBvaW50LnNldChyLG8pLHRoaXN9c3BsaW5lVGhydSh0KXtjb25zdCBlPVt0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpXS5jb25jYXQodCksbj1uZXcgUm8oZSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2gobiksdGhpcy5jdXJyZW50UG9pbnQuY29weSh0W3QubGVuZ3RoLTFdKSx0aGlzfWFyYyh0LGUsbixzLHIsbyl7Y29uc3QgYT10aGlzLmN1cnJlbnRQb2ludC54LGM9dGhpcy5jdXJyZW50UG9pbnQueTtyZXR1cm4gdGhpcy5hYnNhcmModCthLGUrYyxuLHMscixvKSx0aGlzfWFic2FyYyh0LGUsbixzLHIsbyl7cmV0dXJuIHRoaXMuYWJzZWxsaXBzZSh0LGUsbixuLHMscixvKSx0aGlzfWVsbGlwc2UodCxlLG4scyxyLG8sYSxjKXtjb25zdCBsPXRoaXMuY3VycmVudFBvaW50LngsaD10aGlzLmN1cnJlbnRQb2ludC55O3JldHVybiB0aGlzLmFic2VsbGlwc2UodCtsLGUraCxuLHMscixvLGEsYyksdGhpc31hYnNlbGxpcHNlKHQsZSxuLHMscixvLGEsYyl7Y29uc3QgbD1uZXcgenModCxlLG4scyxyLG8sYSxjKTtpZih0aGlzLmN1cnZlcy5sZW5ndGg+MCl7Y29uc3QgdT1sLmdldFBvaW50KDApO3UuZXF1YWxzKHRoaXMuY3VycmVudFBvaW50KXx8dGhpcy5saW5lVG8odS54LHUueSl9dGhpcy5jdXJ2ZXMucHVzaChsKTtjb25zdCBoPWwuZ2V0UG9pbnQoMSk7cmV0dXJuIHRoaXMuY3VycmVudFBvaW50LmNvcHkoaCksdGhpc31jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuY3VycmVudFBvaW50LmNvcHkodC5jdXJyZW50UG9pbnQpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5jdXJyZW50UG9pbnQ9dGhpcy5jdXJyZW50UG9pbnQudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMuY3VycmVudFBvaW50LmZyb21BcnJheSh0LmN1cnJlbnRQb2ludCksdGhpc319O2NsYXNzIFljIGV4dGVuZHMgSmN7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy51dWlkPUZuKCksdGhpcy50eXBlPSJTaGFwZSIsdGhpcy5ob2xlcz1bXX1nZXRQb2ludHNIb2xlcyh0KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wLHM9dGhpcy5ob2xlcy5sZW5ndGg7bjxzO24rKyllW25dPXRoaXMuaG9sZXNbbl0uZ2V0UG9pbnRzKHQpO3JldHVybiBlfWV4dHJhY3RQb2ludHModCl7cmV0dXJue3NoYXBlOnRoaXMuZ2V0UG9pbnRzKHQpLGhvbGVzOnRoaXMuZ2V0UG9pbnRzSG9sZXModCl9fWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLmhvbGVzPVtdO2ZvcihsZXQgZT0wLG49dC5ob2xlcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10LmhvbGVzW2VdO3RoaXMuaG9sZXMucHVzaChzLmNsb25lKCkpfXJldHVybiB0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC51dWlkPXRoaXMudXVpZCx0LmhvbGVzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5ob2xlcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10aGlzLmhvbGVzW2VdO3QuaG9sZXMucHVzaChzLnRvSlNPTigpKX1yZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLnV1aWQ9dC51dWlkLHRoaXMuaG9sZXM9W107Zm9yKGxldCBlPTAsbj10LmhvbGVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuaG9sZXNbZV07dGhpcy5ob2xlcy5wdXNoKG5ldyBKYygpLmZyb21KU09OKHMpKX1yZXR1cm4gdGhpc319ZnVuY3Rpb24ga2YoaSx0LGU9Mil7Y29uc3Qgbj10JiZ0Lmxlbmd0aCxzPW4/dFswXSplOmkubGVuZ3RoO2xldCByPWpjKGksMCxzLGUsITApO2NvbnN0IG89W107aWYoIXJ8fHIubmV4dD09PXIucHJldilyZXR1cm4gbztsZXQgYSxjLGw7aWYobiYmKHI9RGYoaSx0LHIsZSkpLGkubGVuZ3RoPjgwKmUpe2E9MS8wLGM9MS8wO2xldCBoPS0xLzAsdT0tMS8wO2ZvcihsZXQgZj1lO2Y8cztmKz1lKXtjb25zdCBkPWlbZl0scD1pW2YrMV07ZDxhJiYoYT1kKSxwPGMmJihjPXApLGQ+aCYmKGg9ZCkscD51JiYodT1wKX1sPU1hdGgubWF4KGgtYSx1LWMpLGw9bCE9PTA/MzI3NjcvbDowfXJldHVybiBUaShyLG8sZSxhLGMsbCwwKSxvfWZ1bmN0aW9uIGpjKGksdCxlLG4scyl7bGV0IHI7aWYocz09PVlmKGksdCxlLG4pPjApZm9yKGxldCBvPXQ7bzxlO28rPW4pcj1lbChvL258MCxpW29dLGlbbysxXSxyKTtlbHNlIGZvcihsZXQgbz1lLW47bz49dDtvLT1uKXI9ZWwoby9ufDAsaVtvXSxpW28rMV0scik7cmV0dXJuIHImJkhuKHIsci5uZXh0KSYmKENpKHIpLHI9ci5uZXh0KSxyfWZ1bmN0aW9uIGRuKGksdCl7aWYoIWkpcmV0dXJuIGk7dHx8KHQ9aSk7bGV0IGU9aSxuO2RvIGlmKG49ITEsIWUuc3RlaW5lciYmKEhuKGUsZS5uZXh0KXx8cnQoZS5wcmV2LGUsZS5uZXh0KT09PTApKXtpZihDaShlKSxlPXQ9ZS5wcmV2LGU9PT1lLm5leHQpYnJlYWs7bj0hMH1lbHNlIGU9ZS5uZXh0O3doaWxlKG58fGUhPT10KTtyZXR1cm4gdH1mdW5jdGlvbiBUaShpLHQsZSxuLHMscixvKXtpZighaSlyZXR1cm47IW8mJnImJkhmKGksbixzLHIpO2xldCBhPWk7Zm9yKDtpLnByZXYhPT1pLm5leHQ7KXtjb25zdCBjPWkucHJldixsPWkubmV4dDtpZihyP1JmKGksbixzLHIpOk5mKGkpKXt0LnB1c2goYy5pLGkuaSxsLmkpLENpKGkpLGk9bC5uZXh0LGE9bC5uZXh0O2NvbnRpbnVlfWlmKGk9bCxpPT09YSl7bz9vPT09MT8oaT1MZihkbihpKSx0KSxUaShpLHQsZSxuLHMsciwyKSk6bz09PTImJk9mKGksdCxlLG4scyxyKTpUaShkbihpKSx0LGUsbixzLHIsMSk7YnJlYWt9fX1mdW5jdGlvbiBOZihpKXtjb25zdCB0PWkucHJldixlPWksbj1pLm5leHQ7aWYocnQodCxlLG4pPj0wKXJldHVybiExO2NvbnN0IHM9dC54LHI9ZS54LG89bi54LGE9dC55LGM9ZS55LGw9bi55LGg9TWF0aC5taW4ocyxyLG8pLHU9TWF0aC5taW4oYSxjLGwpLGY9TWF0aC5tYXgocyxyLG8pLGQ9TWF0aC5tYXgoYSxjLGwpO2xldCBwPW4ubmV4dDtmb3IoO3AhPT10Oyl7aWYocC54Pj1oJiZwLng8PWYmJnAueT49dSYmcC55PD1kJiZFaShzLGEscixjLG8sbCxwLngscC55KSYmcnQocC5wcmV2LHAscC5uZXh0KT49MClyZXR1cm4hMTtwPXAubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBSZihpLHQsZSxuKXtjb25zdCBzPWkucHJldixyPWksbz1pLm5leHQ7aWYocnQocyxyLG8pPj0wKXJldHVybiExO2NvbnN0IGE9cy54LGM9ci54LGw9by54LGg9cy55LHU9ci55LGY9by55LGQ9TWF0aC5taW4oYSxjLGwpLHA9TWF0aC5taW4oaCx1LGYpLHk9TWF0aC5tYXgoYSxjLGwpLG09TWF0aC5tYXgoaCx1LGYpLGc9TG8oZCxwLHQsZSxuKSxiPUxvKHksbSx0LGUsbik7bGV0IHc9aS5wcmV2Wix4PWkubmV4dFo7Zm9yKDt3JiZ3Lno+PWcmJngmJnguejw9Yjspe2lmKHcueD49ZCYmdy54PD15JiZ3Lnk+PXAmJncueTw9bSYmdyE9PXMmJnchPT1vJiZFaShhLGgsYyx1LGwsZix3Lngsdy55KSYmcnQody5wcmV2LHcsdy5uZXh0KT49MHx8KHc9dy5wcmV2Wix4Lng+PWQmJngueDw9eSYmeC55Pj1wJiZ4Lnk8PW0mJnghPT1zJiZ4IT09byYmRWkoYSxoLGMsdSxsLGYseC54LHgueSkmJnJ0KHgucHJldix4LHgubmV4dCk+PTApKXJldHVybiExO3g9eC5uZXh0Wn1mb3IoO3cmJncuej49Zzspe2lmKHcueD49ZCYmdy54PD15JiZ3Lnk+PXAmJncueTw9bSYmdyE9PXMmJnchPT1vJiZFaShhLGgsYyx1LGwsZix3Lngsdy55KSYmcnQody5wcmV2LHcsdy5uZXh0KT49MClyZXR1cm4hMTt3PXcucHJldlp9Zm9yKDt4JiZ4Lno8PWI7KXtpZih4Lng+PWQmJngueDw9eSYmeC55Pj1wJiZ4Lnk8PW0mJnghPT1zJiZ4IT09byYmRWkoYSxoLGMsdSxsLGYseC54LHgueSkmJnJ0KHgucHJldix4LHgubmV4dCk+PTApcmV0dXJuITE7eD14Lm5leHRafXJldHVybiEwfWZ1bmN0aW9uIExmKGksdCl7bGV0IGU9aTtkb3tjb25zdCBuPWUucHJldixzPWUubmV4dC5uZXh0OyFIbihuLHMpJiZLYyhuLGUsZS5uZXh0LHMpJiZQaShuLHMpJiZQaShzLG4pJiYodC5wdXNoKG4uaSxlLmkscy5pKSxDaShlKSxDaShlLm5leHQpLGU9aT1zKSxlPWUubmV4dH13aGlsZShlIT09aSk7cmV0dXJuIGRuKGUpfWZ1bmN0aW9uIE9mKGksdCxlLG4scyxyKXtsZXQgbz1pO2Rve2xldCBhPW8ubmV4dC5uZXh0O2Zvcig7YSE9PW8ucHJldjspe2lmKG8uaSE9PWEuaSYmV2YobyxhKSl7bGV0IGM9dGwobyxhKTtvPWRuKG8sby5uZXh0KSxjPWRuKGMsYy5uZXh0KSxUaShvLHQsZSxuLHMsciwwKSxUaShjLHQsZSxuLHMsciwwKTtyZXR1cm59YT1hLm5leHR9bz1vLm5leHR9d2hpbGUobyE9PWkpfWZ1bmN0aW9uIERmKGksdCxlLG4pe2NvbnN0IHM9W107Zm9yKGxldCByPTAsbz10Lmxlbmd0aDtyPG87cisrKXtjb25zdCBhPXRbcl0qbixjPXI8by0xP3RbcisxXSpuOmkubGVuZ3RoLGw9amMoaSxhLGMsbiwhMSk7bD09PWwubmV4dCYmKGwuc3RlaW5lcj0hMCkscy5wdXNoKEdmKGwpKX1zLnNvcnQoJGYpO2ZvcihsZXQgcj0wO3I8cy5sZW5ndGg7cisrKWU9VmYoc1tyXSxlKTtyZXR1cm4gZX1mdW5jdGlvbiAkZihpLHQpe2xldCBlPWkueC10Lng7aWYoZT09PTAmJihlPWkueS10LnksZT09PTApKXtjb25zdCBuPShpLm5leHQueS1pLnkpLyhpLm5leHQueC1pLngpLHM9KHQubmV4dC55LXQueSkvKHQubmV4dC54LXQueCk7ZT1uLXN9cmV0dXJuIGV9ZnVuY3Rpb24gVmYoaSx0KXtjb25zdCBlPVVmKGksdCk7aWYoIWUpcmV0dXJuIHQ7Y29uc3Qgbj10bChlLGkpO3JldHVybiBkbihuLG4ubmV4dCksZG4oZSxlLm5leHQpfWZ1bmN0aW9uIFVmKGksdCl7bGV0IGU9dDtjb25zdCBuPWkueCxzPWkueTtsZXQgcj0tMS8wLG87aWYoSG4oaSxlKSlyZXR1cm4gZTtkb3tpZihIbihpLGUubmV4dCkpcmV0dXJuIGUubmV4dDtpZihzPD1lLnkmJnM+PWUubmV4dC55JiZlLm5leHQueSE9PWUueSl7Y29uc3QgdT1lLngrKHMtZS55KSooZS5uZXh0LngtZS54KS8oZS5uZXh0LnktZS55KTtpZih1PD1uJiZ1PnImJihyPXUsbz1lLng8ZS5uZXh0Lng/ZTplLm5leHQsdT09PW4pKXJldHVybiBvfWU9ZS5uZXh0fXdoaWxlKGUhPT10KTtpZighbylyZXR1cm4gbnVsbDtjb25zdCBhPW8sYz1vLngsbD1vLnk7bGV0IGg9MS8wO2U9bztkb3tpZihuPj1lLngmJmUueD49YyYmbiE9PWUueCYmUWMoczxsP246cixzLGMsbCxzPGw/cjpuLHMsZS54LGUueSkpe2NvbnN0IHU9TWF0aC5hYnMocy1lLnkpLyhuLWUueCk7UGkoZSxpKSYmKHU8aHx8dT09PWgmJihlLng+by54fHxlLng9PT1vLngmJnFmKG8sZSkpKSYmKG89ZSxoPXUpfWU9ZS5uZXh0fXdoaWxlKGUhPT1hKTtyZXR1cm4gb31mdW5jdGlvbiBxZihpLHQpe3JldHVybiBydChpLnByZXYsaSx0LnByZXYpPDAmJnJ0KHQubmV4dCxpLGkubmV4dCk8MH1mdW5jdGlvbiBIZihpLHQsZSxuKXtsZXQgcz1pO2RvIHMuej09PTAmJihzLno9TG8ocy54LHMueSx0LGUsbikpLHMucHJldlo9cy5wcmV2LHMubmV4dFo9cy5uZXh0LHM9cy5uZXh0O3doaWxlKHMhPT1pKTtzLnByZXZaLm5leHRaPW51bGwscy5wcmV2Wj1udWxsLFhmKHMpfWZ1bmN0aW9uIFhmKGkpe2xldCB0LGU9MTtkb3tsZXQgbj1pLHM7aT1udWxsO2xldCByPW51bGw7Zm9yKHQ9MDtuOyl7dCsrO2xldCBvPW4sYT0wO2ZvcihsZXQgbD0wO2w8ZSYmKGErKyxvPW8ubmV4dFosISFvKTtsKyspO2xldCBjPWU7Zm9yKDthPjB8fGM+MCYmbzspYSE9PTAmJihjPT09MHx8IW98fG4uejw9by56KT8ocz1uLG49bi5uZXh0WixhLS0pOihzPW8sbz1vLm5leHRaLGMtLSkscj9yLm5leHRaPXM6aT1zLHMucHJldlo9cixyPXM7bj1vfXIubmV4dFo9bnVsbCxlKj0yfXdoaWxlKHQ+MSk7cmV0dXJuIGl9ZnVuY3Rpb24gTG8oaSx0LGUsbixzKXtyZXR1cm4gaT0oaS1lKSpzfDAsdD0odC1uKSpzfDAsaT0oaXxpPDw4KSYxNjcxMTkzNSxpPShpfGk8PDQpJjI1MjY0NTEzNSxpPShpfGk8PDIpJjg1ODk5MzQ1OSxpPShpfGk8PDEpJjE0MzE2NTU3NjUsdD0odHx0PDw4KSYxNjcxMTkzNSx0PSh0fHQ8PDQpJjI1MjY0NTEzNSx0PSh0fHQ8PDIpJjg1ODk5MzQ1OSx0PSh0fHQ8PDEpJjE0MzE2NTU3NjUsaXx0PDwxfWZ1bmN0aW9uIEdmKGkpe2xldCB0PWksZT1pO2RvKHQueDxlLnh8fHQueD09PWUueCYmdC55PGUueSkmJihlPXQpLHQ9dC5uZXh0O3doaWxlKHQhPT1pKTtyZXR1cm4gZX1mdW5jdGlvbiBRYyhpLHQsZSxuLHMscixvLGEpe3JldHVybihzLW8pKih0LWEpPj0oaS1vKSooci1hKSYmKGktbykqKG4tYSk+PShlLW8pKih0LWEpJiYoZS1vKSooci1hKT49KHMtbykqKG4tYSl9ZnVuY3Rpb24gRWkoaSx0LGUsbixzLHIsbyxhKXtyZXR1cm4hKGk9PT1vJiZ0PT09YSkmJlFjKGksdCxlLG4scyxyLG8sYSl9ZnVuY3Rpb24gV2YoaSx0KXtyZXR1cm4gaS5uZXh0LmkhPT10LmkmJmkucHJldi5pIT09dC5pJiYhWmYoaSx0KSYmKFBpKGksdCkmJlBpKHQsaSkmJkpmKGksdCkmJihydChpLnByZXYsaSx0LnByZXYpfHxydChpLHQucHJldix0KSl8fEhuKGksdCkmJnJ0KGkucHJldixpLGkubmV4dCk+MCYmcnQodC5wcmV2LHQsdC5uZXh0KT4wKX1mdW5jdGlvbiBydChpLHQsZSl7cmV0dXJuKHQueS1pLnkpKihlLngtdC54KS0odC54LWkueCkqKGUueS10LnkpfWZ1bmN0aW9uIEhuKGksdCl7cmV0dXJuIGkueD09PXQueCYmaS55PT09dC55fWZ1bmN0aW9uIEtjKGksdCxlLG4pe2NvbnN0IHM9UHMocnQoaSx0LGUpKSxyPVBzKHJ0KGksdCxuKSksbz1QcyhydChlLG4saSkpLGE9UHMocnQoZSxuLHQpKTtyZXR1cm4hIShzIT09ciYmbyE9PWF8fHM9PT0wJiZFcyhpLGUsdCl8fHI9PT0wJiZFcyhpLG4sdCl8fG89PT0wJiZFcyhlLGksbil8fGE9PT0wJiZFcyhlLHQsbikpfWZ1bmN0aW9uIEVzKGksdCxlKXtyZXR1cm4gdC54PD1NYXRoLm1heChpLngsZS54KSYmdC54Pj1NYXRoLm1pbihpLngsZS54KSYmdC55PD1NYXRoLm1heChpLnksZS55KSYmdC55Pj1NYXRoLm1pbihpLnksZS55KX1mdW5jdGlvbiBQcyhpKXtyZXR1cm4gaT4wPzE6aTwwPy0xOjB9ZnVuY3Rpb24gWmYoaSx0KXtsZXQgZT1pO2Rve2lmKGUuaSE9PWkuaSYmZS5uZXh0LmkhPT1pLmkmJmUuaSE9PXQuaSYmZS5uZXh0LmkhPT10LmkmJktjKGUsZS5uZXh0LGksdCkpcmV0dXJuITA7ZT1lLm5leHR9d2hpbGUoZSE9PWkpO3JldHVybiExfWZ1bmN0aW9uIFBpKGksdCl7cmV0dXJuIHJ0KGkucHJldixpLGkubmV4dCk8MD9ydChpLHQsaS5uZXh0KT49MCYmcnQoaSxpLnByZXYsdCk+PTA6cnQoaSx0LGkucHJldik8MHx8cnQoaSxpLm5leHQsdCk8MH1mdW5jdGlvbiBKZihpLHQpe2xldCBlPWksbj0hMTtjb25zdCBzPShpLngrdC54KS8yLHI9KGkueSt0LnkpLzI7ZG8gZS55PnIhPWUubmV4dC55PnImJmUubmV4dC55IT09ZS55JiZzPChlLm5leHQueC1lLngpKihyLWUueSkvKGUubmV4dC55LWUueSkrZS54JiYobj0hbiksZT1lLm5leHQ7d2hpbGUoZSE9PWkpO3JldHVybiBufWZ1bmN0aW9uIHRsKGksdCl7Y29uc3QgZT1PbyhpLmksaS54LGkueSksbj1Pbyh0LmksdC54LHQueSkscz1pLm5leHQscj10LnByZXY7cmV0dXJuIGkubmV4dD10LHQucHJldj1pLGUubmV4dD1zLHMucHJldj1lLG4ubmV4dD1lLGUucHJldj1uLHIubmV4dD1uLG4ucHJldj1yLG59ZnVuY3Rpb24gZWwoaSx0LGUsbil7Y29uc3Qgcz1PbyhpLHQsZSk7cmV0dXJuIG4/KHMubmV4dD1uLm5leHQscy5wcmV2PW4sbi5uZXh0LnByZXY9cyxuLm5leHQ9cyk6KHMucHJldj1zLHMubmV4dD1zKSxzfWZ1bmN0aW9uIENpKGkpe2kubmV4dC5wcmV2PWkucHJldixpLnByZXYubmV4dD1pLm5leHQsaS5wcmV2WiYmKGkucHJldloubmV4dFo9aS5uZXh0WiksaS5uZXh0WiYmKGkubmV4dFoucHJldlo9aS5wcmV2Wil9ZnVuY3Rpb24gT28oaSx0LGUpe3JldHVybntpLHg6dCx5OmUscHJldjpudWxsLG5leHQ6bnVsbCx6OjAscHJldlo6bnVsbCxuZXh0WjpudWxsLHN0ZWluZXI6ITF9fWZ1bmN0aW9uIFlmKGksdCxlLG4pe2xldCBzPTA7Zm9yKGxldCByPXQsbz1lLW47cjxlO3IrPW4pcys9KGlbb10taVtyXSkqKGlbcisxXStpW28rMV0pLG89cjtyZXR1cm4gc31jbGFzcyBqZntzdGF0aWMgdHJpYW5ndWxhdGUodCxlLG49Mil7cmV0dXJuIGtmKHQsZSxuKX19Y2xhc3MgWG57c3RhdGljIGFyZWEodCl7Y29uc3QgZT10Lmxlbmd0aDtsZXQgbj0wO2ZvcihsZXQgcz1lLTEscj0wO3I8ZTtzPXIrKyluKz10W3NdLngqdFtyXS55LXRbcl0ueCp0W3NdLnk7cmV0dXJuIG4qLjV9c3RhdGljIGlzQ2xvY2tXaXNlKHQpe3JldHVybiBYbi5hcmVhKHQpPDB9c3RhdGljIHRyaWFuZ3VsYXRlU2hhcGUodCxlKXtjb25zdCBuPVtdLHM9W10scj1bXTtubCh0KSxpbChuLHQpO2xldCBvPXQubGVuZ3RoO2UuZm9yRWFjaChubCk7Zm9yKGxldCBjPTA7YzxlLmxlbmd0aDtjKyspcy5wdXNoKG8pLG8rPWVbY10ubGVuZ3RoLGlsKG4sZVtjXSk7Y29uc3QgYT1qZi50cmlhbmd1bGF0ZShuLHMpO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7Yys9MylyLnB1c2goYS5zbGljZShjLGMrMykpO3JldHVybiByfX1mdW5jdGlvbiBubChpKXtjb25zdCB0PWkubGVuZ3RoO3Q+MiYmaVt0LTFdLmVxdWFscyhpWzBdKSYmaS5wb3AoKX1mdW5jdGlvbiBpbChpLHQpe2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKWkucHVzaCh0W2VdLngpLGkucHVzaCh0W2VdLnkpfWNsYXNzIERvIGV4dGVuZHMgZ2V7Y29uc3RydWN0b3IodD0xLGU9MSxuPTEscz0xKXtzdXBlcigpLHRoaXMudHlwZT0iUGxhbmVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXt3aWR0aDp0LGhlaWdodDplLHdpZHRoU2VnbWVudHM6bixoZWlnaHRTZWdtZW50czpzfTtjb25zdCByPXQvMixvPWUvMixhPU1hdGguZmxvb3IobiksYz1NYXRoLmZsb29yKHMpLGw9YSsxLGg9YysxLHU9dC9hLGY9ZS9jLGQ9W10scD1bXSx5PVtdLG09W107Zm9yKGxldCBnPTA7ZzxoO2crKyl7Y29uc3QgYj1nKmYtbztmb3IobGV0IHc9MDt3PGw7dysrKXtjb25zdCB4PXcqdS1yO3AucHVzaCh4LC1iLDApLHkucHVzaCgwLDAsMSksbS5wdXNoKHcvYSksbS5wdXNoKDEtZy9jKX19Zm9yKGxldCBnPTA7ZzxjO2crKylmb3IobGV0IGI9MDtiPGE7YisrKXtjb25zdCB3PWIrbCpnLHg9YitsKihnKzEpLE09YisxK2wqKGcrMSksQT1iKzErbCpnO2QucHVzaCh3LHgsQSksZC5wdXNoKHgsTSxBKX10aGlzLnNldEluZGV4KGQpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IEJlKHAsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBCZSh5LDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBCZShtLDIpKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc31zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBEbyh0LndpZHRoLHQuaGVpZ2h0LHQud2lkdGhTZWdtZW50cyx0LmhlaWdodFNlZ21lbnRzKX19Y29uc3Qgc2w9bmV3IFQsQ3M9bmV3IFQsR249bmV3IFQsV249bmV3IFQsJG89bmV3IFQsUWY9bmV3IFQsS2Y9bmV3IFQ7Y2xhc3MgUXR7Y29uc3RydWN0b3IodD1uZXcgVCxlPW5ldyBUKXt0aGlzLnN0YXJ0PXQsdGhpcy5lbmQ9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5zdGFydC5jb3B5KHQpLHRoaXMuZW5kLmNvcHkoZSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLnN0YXJ0LmNvcHkodC5zdGFydCksdGhpcy5lbmQuY29weSh0LmVuZCksdGhpc31nZXRDZW50ZXIodCl7cmV0dXJuIHQuYWRkVmVjdG9ycyh0aGlzLnN0YXJ0LHRoaXMuZW5kKS5tdWx0aXBseVNjYWxhciguNSl9ZGVsdGEodCl7cmV0dXJuIHQuc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KX1kaXN0YW5jZVNxKCl7cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5lbmQpfWRpc3RhbmNlKCl7cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUbyh0aGlzLmVuZCl9YXQodCxlKXtyZXR1cm4gdGhpcy5kZWx0YShlKS5tdWx0aXBseVNjYWxhcih0KS5hZGQodGhpcy5zdGFydCl9Y2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcih0LGUpe3NsLnN1YlZlY3RvcnModCx0aGlzLnN0YXJ0KSxDcy5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpO2NvbnN0IG49Q3MuZG90KENzKTtsZXQgcj1Dcy5kb3Qoc2wpL247cmV0dXJuIGUmJihyPUcociwwLDEpKSxyfWNsb3Nlc3RQb2ludFRvUG9pbnQodCxlLG4pe2NvbnN0IHM9dGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKHQsZSk7cmV0dXJuIHRoaXMuZGVsdGEobikubXVsdGlwbHlTY2FsYXIocykuYWRkKHRoaXMuc3RhcnQpfWRpc3RhbmNlU3FUb0xpbmUzKHQsZT1RZixuPUtmKXtjb25zdCBzPTEwMDAwMDAwMDAwMDAwMDAxZS0zMjtsZXQgcixvO2NvbnN0IGE9dGhpcy5zdGFydCxjPXQuc3RhcnQsbD10aGlzLmVuZCxoPXQuZW5kO0duLnN1YlZlY3RvcnMobCxhKSxXbi5zdWJWZWN0b3JzKGgsYyksJG8uc3ViVmVjdG9ycyhhLGMpO2NvbnN0IHU9R24uZG90KEduKSxmPVduLmRvdChXbiksZD1Xbi5kb3QoJG8pO2lmKHU8PXMmJmY8PXMpcmV0dXJuIGUuY29weShhKSxuLmNvcHkoYyksZS5zdWIobiksZS5kb3QoZSk7aWYodTw9cylyPTAsbz1kL2Ysbz1HKG8sMCwxKTtlbHNle2NvbnN0IHA9R24uZG90KCRvKTtpZihmPD1zKW89MCxyPUcoLXAvdSwwLDEpO2Vsc2V7Y29uc3QgeT1Hbi5kb3QoV24pLG09dSpmLXkqeTttIT09MD9yPUcoKHkqZC1wKmYpL20sMCwxKTpyPTAsbz0oeSpyK2QpL2YsbzwwPyhvPTAscj1HKC1wL3UsMCwxKSk6bz4xJiYobz0xLHI9RygoeS1wKS91LDAsMSkpfX1yZXR1cm4gZS5jb3B5KGEpLmFkZChHbi5tdWx0aXBseVNjYWxhcihyKSksbi5jb3B5KGMpLmFkZChXbi5tdWx0aXBseVNjYWxhcihvKSksZS5zdWIobiksZS5kb3QoZSl9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLnN0YXJ0LmFwcGx5TWF0cml4NCh0KSx0aGlzLmVuZC5hcHBseU1hdHJpeDQodCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQuc3RhcnQuZXF1YWxzKHRoaXMuc3RhcnQpJiZ0LmVuZC5lcXVhbHModGhpcy5lbmQpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyE9InVuZGVmaW5lZCImJl9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgicmVnaXN0ZXIiLHtkZXRhaWw6e3JldmlzaW9uOkp9fSkpLHR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiYod2luZG93Ll9fVEhSRUVfXz9jb25zb2xlLndhcm4oIldBUk5JTkc6IE11bHRpcGxlIGluc3RhbmNlcyBvZiBUaHJlZS5qcyBiZWluZyBpbXBvcnRlZC4iKTp3aW5kb3cuX19USFJFRV9fPUopO2NvbnN0IHBuPW5ldyBNYXAsdGQ9KGk9e30pPT4oe2dlbmVyYXRlVG9wVVYodCxlLG4scyxyKXtjb25zdCBvPWVbbiozXSxhPWVbbiozKzFdLGM9ZVtzKjNdLGw9ZVtzKjMrMV0saD1lW3IqM10sdT1lW3IqMysxXTtsZXQgZjtpZihwbi5oYXModCkpZj1wbi5nZXQodCk7ZWxzZXtsZXQgbT1pLmJveDM7aWYoIW0pe209bmV3IGd0O2NvbnN0IHc9dC5wYXJhbWV0ZXJzLnNoYXBlcy5nZXRQb2ludHMoKS5tYXAoeD0+W3gueCx4LnksMF0pLmZsYXQoKTttLnNldEZyb21BcnJheSh3KX1jb25zdCBnPW0uZ2V0U2l6ZShuZXcgVCk7aS5zcGxpdCYmKGcueS89aS5zcGxpdCksZj17Ym94Om0sc2l6ZTpnfSxwbi5zZXQodCxmKX1jb25zdHtib3g6ZCxzaXplOnB9PWYseT1pLnNwbGl0PzEtaS5zcGxpdDowO3JldHVybltuZXcgUigoby1kLm1pbi54KS9wLngsKGEtZC5taW4ueSkvcC55K3kpLG5ldyBSKChjLWQubWluLngpL3AueCwobC1kLm1pbi55KS9wLnkreSksbmV3IFIoKGgtZC5taW4ueCkvcC54LCh1LWQubWluLnkpL3AueSt5KV19LGdlbmVyYXRlU2lkZVdhbGxVVih0LGUsbixzLHIsbyl7Y29uc3QgYT1lW24qM10sYz1lW24qMysxXSxsPWVbbiozKzJdLGg9ZVtzKjNdLHU9ZVtzKjMrMV0sZj1lW3MqMysyXSxkPWVbciozXSxwPWVbciozKzFdLHk9ZVtyKjMrMl0sbT1lW28qM10sZz1lW28qMysxXSxiPWVbbyozKzJdO2xldCB3O2lmKHBuLmhhcyhlKSl3PXBuLmdldChlKTtlbHNle2NvbnN0IEE9bmV3IGd0O0Euc2V0RnJvbUFycmF5KGUpO2NvbnN0IFM9QS5nZXRTaXplKG5ldyBUKTtpLnNwbGl0JiYoUy56Lz0xLWkuc3BsaXQpLGkuc2lkZVJlcGVhdCYmKFMuei89aS5zaWRlUmVwZWF0KSx3PXtib3g6QSxzaXplOlN9LHBuLnNldChlLHcpfWNvbnN0e2JveDp4LHNpemU6TX09dztyZXR1cm4gTWF0aC5hYnMoYy11KTxNYXRoLmFicyhhLWgpP1tuZXcgUigoYS14Lm1pbi54KS9NLngsKGwteC5taW4ueikvTS56KSxuZXcgUigoaC14Lm1pbi54KS9NLngsKGYteC5taW4ueikvTS56KSxuZXcgUigoZC14Lm1pbi54KS9NLngsKHkteC5taW4ueikvTS56KSxuZXcgUigobS14Lm1pbi54KS9NLngsKGIteC5taW4ueikvTS56KV06W25ldyBSKChjLXgubWluLnkpL00ueSwobC14Lm1pbi56KS9NLnopLG5ldyBSKCh1LXgubWluLnkpL00ueSwoZi14Lm1pbi56KS9NLnopLG5ldyBSKChwLXgubWluLnkpL00ueSwoeS14Lm1pbi56KS9NLnopLG5ldyBSKChnLXgubWluLnkpL00ueSwoYi14Lm1pbi56KS9NLnopXX19KSxlZD0oKT0+e3BuLmNsZWFyKCl9LG5kPXtBcmNDdXJ2ZTpVYyxDYXRtdWxsUm9tQ3VydmUzOnFjLEN1YmljQmV6aWVyQ3VydmU6SW8sQ3ViaWNCZXppZXJDdXJ2ZTM6WGMsRWxsaXBzZUN1cnZlOnpzLExpbmVDdXJ2ZTprbyxMaW5lQ3VydmUzOkdjLFF1YWRyYXRpY0JlemllckN1cnZlOk5vLFF1YWRyYXRpY0JlemllckN1cnZlMzpXYyxTcGxpbmVDdXJ2ZTpSb307Y2xhc3MgWm4gZXh0ZW5kcyBnZXtjb25zdHJ1Y3Rvcih0PW5ldyBZYyhbbmV3IFIoLjUsLjUpLG5ldyBSKC0uNSwuNSksbmV3IFIoLS41LC0uNSksbmV3IFIoLjUsLS41KV0pLGU9e30pe3N1cGVyKCksdGhpcy50eXBlPSJFeHRydWRlR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17c2hhcGVzOnQsb3B0aW9uczplfSx0PUFycmF5LmlzQXJyYXkodCk/dDpbdF07Y29uc3Qgbj10aGlzLHM9W10scj1bXTtmb3IobGV0IGE9MCxjPXQubGVuZ3RoO2E8YzthKyspe2NvbnN0IGw9dFthXTtvKGwpfXRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IEJlKHMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IEJlKHIsMikpLHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtmdW5jdGlvbiBvKGEpe3ZhciAkdSxWdSxVdTtjb25zdCBjPVtdLGw9ZS5jdXJ2ZVNlZ21lbnRzIT09dm9pZCAwP2UuY3VydmVTZWdtZW50czoxMixoPWUuc3RlcHMhPT12b2lkIDA/ZS5zdGVwczoxLHU9ZS5kZXB0aCE9PXZvaWQgMD9lLmRlcHRoOjE7bGV0IGY9ZS5iZXZlbEVuYWJsZWQhPT12b2lkIDA/ZS5iZXZlbEVuYWJsZWQ6ITAsZD1lLmJldmVsVGhpY2tuZXNzIT09dm9pZCAwP2UuYmV2ZWxUaGlja25lc3M6LjIscD1lLmJldmVsU2l6ZSE9PXZvaWQgMD9lLmJldmVsU2l6ZTpkLS4xLHk9ZS5iZXZlbE9mZnNldCE9PXZvaWQgMD9lLmJldmVsT2Zmc2V0OjAsbT1lLmJldmVsU2VnbWVudHMhPT12b2lkIDA/ZS5iZXZlbFNlZ21lbnRzOjM7Y29uc3QgZz1lLmV4dHJ1ZGVQYXRoLGI9ZS5VVkdlbmVyYXRvciE9PXZvaWQgMD9lLlVWR2VuZXJhdG9yOmlkLHc9KCR1PWUuaGFzVG9wKSE9bnVsbD8kdTohMCx4PShWdT1lLmhhc0JvdHRvbSkhPW51bGw/VnU6ITAsTT0oVXU9ZS5oYXNTaWRlKSE9bnVsbD9VdTohMDtsZXQgQSxTPSExLF8sRSx6LHY7ZyYmKEE9Zy5nZXRTcGFjZWRQb2ludHMoaCksUz0hMCxmPSExLF89Zy5jb21wdXRlRnJlbmV0RnJhbWVzKGgsITEpLEU9bmV3IFQsej1uZXcgVCx2PW5ldyBUKSxmfHwobT0wLGQ9MCxwPTAseT0wKTtjb25zdCBDPWEuZXh0cmFjdFBvaW50cyhsKTtsZXQgUD1DLnNoYXBlO2NvbnN0IEY9Qy5ob2xlcztpZighWG4uaXNDbG9ja1dpc2UoUCkpe1A9UC5yZXZlcnNlKCk7Zm9yKGxldCBOPTAsTD1GLmxlbmd0aDtOPEw7TisrKXtjb25zdCBPPUZbTl07WG4uaXNDbG9ja1dpc2UoTykmJihGW05dPU8ucmV2ZXJzZSgpKX19ZnVuY3Rpb24gSShOKXtjb25zdCBPPTEwMDAwMDAwMDAwMDAwMDAxZS0zNjtsZXQgVj1OWzBdO2ZvcihsZXQgJD0xOyQ8PU4ubGVuZ3RoOyQrKyl7Y29uc3QgWT0kJU4ubGVuZ3RoLFc9TltZXSxpdD1XLngtVi54LGN0PVcueS1WLnksd3Q9aXQqaXQrY3QqY3QsWnQ9TWF0aC5tYXgoTWF0aC5hYnMoVy54KSxNYXRoLmFicyhXLnkpLE1hdGguYWJzKFYueCksTWF0aC5hYnMoVi55KSksQ249TypadCpadDtpZih3dDw9Q24pe04uc3BsaWNlKFksMSksJC0tO2NvbnRpbnVlfVY9V319SShQKSxGLmZvckVhY2goSSk7Y29uc3Qgaz1GLmxlbmd0aCxEPVA7Zm9yKGxldCBOPTA7TjxrO04rKyl7Y29uc3QgTD1GW05dO1A9UC5jb25jYXQoTCl9ZnVuY3Rpb24gVShOLEwsTyl7cmV0dXJuIEx8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0IiksTi5jbG9uZSgpLmFkZFNjYWxlZFZlY3RvcihMLE8pfWNvbnN0IGo9UC5sZW5ndGg7ZnVuY3Rpb24gZHQoTixMLE8pe2xldCBWLCQsWTtjb25zdCBXPU4ueC1MLngsaXQ9Ti55LUwueSxjdD1PLngtTi54LHd0PU8ueS1OLnksWnQ9VypXK2l0Kml0LENuPVcqd3QtaXQqY3Q7aWYoTWF0aC5hYnMoQ24pPk51bWJlci5FUFNJTE9OKXtjb25zdCBKdD1NYXRoLnNxcnQoWnQpLHF1PU1hdGguc3FydChjdCpjdCt3dCp3dCksSHU9TC54LWl0L0p0LFh1PUwueStXL0p0LEZnPU8ueC13dC9xdSxJZz1PLnkrY3QvcXUsR3U9KChGZy1IdSkqd3QtKElnLVh1KSpjdCkvKFcqd3QtaXQqY3QpO1Y9SHUrVypHdS1OLngsJD1YdStpdCpHdS1OLnk7Y29uc3QgV3U9VipWKyQqJDtpZihXdTw9MilyZXR1cm4gbmV3IFIoViwkKTtZPU1hdGguc3FydChXdS8yKX1lbHNle2xldCBKdD0hMTtXPk51bWJlci5FUFNJTE9OP2N0Pk51bWJlci5FUFNJTE9OJiYoSnQ9ITApOlc8LU51bWJlci5FUFNJTE9OP2N0PC1OdW1iZXIuRVBTSUxPTiYmKEp0PSEwKTpNYXRoLnNpZ24oaXQpPT09TWF0aC5zaWduKHd0KSYmKEp0PSEwKSxKdD8oVj0taXQsJD1XLFk9TWF0aC5zcXJ0KFp0KSk6KFY9VywkPWl0LFk9TWF0aC5zcXJ0KFp0LzIpKX1yZXR1cm4gbmV3IFIoVi9ZLCQvWSl9Y29uc3QgRHQ9W107Zm9yKGxldCBOPTAsTD1ELmxlbmd0aCxPPUwtMSxWPU4rMTtOPEw7TisrLE8rKyxWKyspTz09PUwmJihPPTApLFY9PT1MJiYoVj0wKSxEdFtOXT1kdChEW05dLERbT10sRFtWXSk7Y29uc3QgR3Q9W107bGV0IFd0LHllPUR0LmNvbmNhdCgpO2ZvcihsZXQgTj0wLEw9aztOPEw7TisrKXtjb25zdCBPPUZbTl07V3Q9W107Zm9yKGxldCBWPTAsJD1PLmxlbmd0aCxZPSQtMSxXPVYrMTtWPCQ7VisrLFkrKyxXKyspWT09PSQmJihZPTApLFc9PT0kJiYoVz0wKSxXdFtWXT1kdChPW1ZdLE9bWV0sT1tXXSk7R3QucHVzaChXdCkseWU9eWUuY29uY2F0KFd0KX1sZXQgUG47aWYobT09PTApUG49WG4udHJpYW5ndWxhdGVTaGFwZShELEYpO2Vsc2V7Y29uc3QgTj1bXSxMPVtdO2ZvcihsZXQgTz0wO088bTtPKyspe2NvbnN0IFY9Ty9tLCQ9ZCpNYXRoLmNvcyhWKk1hdGguUEkvMiksWT1wKk1hdGguc2luKFYqTWF0aC5QSS8yKSt5O2ZvcihsZXQgVz0wLGl0PUQubGVuZ3RoO1c8aXQ7VysrKXtjb25zdCBjdD1VKERbV10sRHRbV10sWSk7SGUoY3QueCxjdC55LC0kKSxWPT09MCYmTi5wdXNoKGN0KX1mb3IobGV0IFc9MCxpdD1rO1c8aXQ7VysrKXtjb25zdCBjdD1GW1ddO1d0PUd0W1ddO2NvbnN0IHd0PVtdO2ZvcihsZXQgWnQ9MCxDbj1jdC5sZW5ndGg7WnQ8Q247WnQrKyl7Y29uc3QgSnQ9VShjdFtadF0sV3RbWnRdLFkpO0hlKEp0LngsSnQueSwtJCksVj09PTAmJnd0LnB1c2goSnQpfVY9PT0wJiZMLnB1c2god3QpfX1Qbj1Ybi50cmlhbmd1bGF0ZVNoYXBlKE4sTCl9Y29uc3QgUXI9UG4ubGVuZ3RoLE91PXAreTtmb3IobGV0IE49MDtOPGo7TisrKXtjb25zdCBMPWY/VShQW05dLHllW05dLE91KTpQW05dO1M/KHouY29weShfLm5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKEwueCksRS5jb3B5KF8uYmlub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihMLnkpLHYuY29weShBWzBdKS5hZGQoeikuYWRkKEUpLEhlKHYueCx2Lnksdi56KSk6SGUoTC54LEwueSwwKX1mb3IobGV0IE49MTtOPD1oO04rKylmb3IobGV0IEw9MDtMPGo7TCsrKXtjb25zdCBPPWY/VShQW0xdLHllW0xdLE91KTpQW0xdO1M/KHouY29weShfLm5vcm1hbHNbTl0pLm11bHRpcGx5U2NhbGFyKE8ueCksRS5jb3B5KF8uYmlub3JtYWxzW05dKS5tdWx0aXBseVNjYWxhcihPLnkpLHYuY29weShBW05dKS5hZGQoeikuYWRkKEUpLEhlKHYueCx2Lnksdi56KSk6SGUoTy54LE8ueSx1L2gqTil9Zm9yKGxldCBOPW0tMTtOPj0wO04tLSl7Y29uc3QgTD1OL20sTz1kKk1hdGguY29zKEwqTWF0aC5QSS8yKSxWPXAqTWF0aC5zaW4oTCpNYXRoLlBJLzIpK3k7Zm9yKGxldCAkPTAsWT1ELmxlbmd0aDskPFk7JCsrKXtjb25zdCBXPVUoRFskXSxEdFskXSxWKTtIZShXLngsVy55LHUrTyl9Zm9yKGxldCAkPTAsWT1GLmxlbmd0aDskPFk7JCsrKXtjb25zdCBXPUZbJF07V3Q9R3RbJF07Zm9yKGxldCBpdD0wLGN0PVcubGVuZ3RoO2l0PGN0O2l0Kyspe2NvbnN0IHd0PVUoV1tpdF0sV3RbaXRdLFYpO1M/SGUod3QueCx3dC55K0FbaC0xXS55LEFbaC0xXS54K08pOkhlKHd0Lngsd3QueSx1K08pfX19UGcoKSxNJiZDZygpO2Z1bmN0aW9uIFBnKCl7Y29uc3QgTj1zLmxlbmd0aC8zO2lmKGYpe2xldCBMPTAsTz1qKkw7aWYoeClmb3IobGV0IFY9MDtWPFFyO1YrKyl7Y29uc3QgJD1QbltWXTtLcigkWzJdK08sJFsxXStPLCRbMF0rTyl9aWYoTD1oK20qMixPPWoqTCx3KWZvcihsZXQgVj0wO1Y8UXI7VisrKXtjb25zdCAkPVBuW1ZdO0tyKCRbMF0rTywkWzFdK08sJFsyXStPKX19ZWxzZXtpZih4KWZvcihsZXQgTD0wO0w8UXI7TCsrKXtjb25zdCBPPVBuW0xdO0tyKE9bMl0sT1sxXSxPWzBdKX1pZih3KWZvcihsZXQgTD0wO0w8UXI7TCsrKXtjb25zdCBPPVBuW0xdO0tyKE9bMF0raipoLE9bMV0raipoLE9bMl0raipoKX19bi5hZGRHcm91cChOLHMubGVuZ3RoLzMtTiwwKX1mdW5jdGlvbiBDZygpe2NvbnN0IE49cy5sZW5ndGgvMztsZXQgTD0wO0R1KEQsTCksTCs9RC5sZW5ndGg7Zm9yKGxldCBPPTAsVj1GLmxlbmd0aDtPPFY7TysrKXtjb25zdCAkPUZbT107RHUoJCxMKSxMKz0kLmxlbmd0aH1uLmFkZEdyb3VwKE4scy5sZW5ndGgvMy1OLDEpfWZ1bmN0aW9uIER1KE4sTCl7bGV0IE89Ti5sZW5ndGg7Zm9yKDstLU8+PTA7KXtjb25zdCBWPU87bGV0ICQ9Ty0xOyQ8MCYmKCQ9Ti5sZW5ndGgtMSk7Zm9yKGxldCBZPTAsVz1oK20qMjtZPFc7WSsrKXtjb25zdCBpdD1qKlksY3Q9aiooWSsxKSx3dD1MK1YraXQsWnQ9TCskK2l0LENuPUwrJCtjdCxKdD1MK1YrY3Q7Qmcod3QsWnQsQ24sSnQpfX19ZnVuY3Rpb24gSGUoTixMLE8pe2MucHVzaChOKSxjLnB1c2goTCksYy5wdXNoKE8pfWZ1bmN0aW9uIEtyKE4sTCxPKXtYZShOKSxYZShMKSxYZShPKTtjb25zdCBWPXMubGVuZ3RoLzMsJD1iLmdlbmVyYXRlVG9wVVYobixzLFYtMyxWLTIsVi0xKTtHZSgkWzBdKSxHZSgkWzFdKSxHZSgkWzJdKX1mdW5jdGlvbiBCZyhOLEwsTyxWKXtYZShOKSxYZShMKSxYZShWKSxYZShMKSxYZShPKSxYZShWKTtjb25zdCAkPXMubGVuZ3RoLzMsWT1iLmdlbmVyYXRlU2lkZVdhbGxVVihuLHMsJC02LCQtMywkLTIsJC0xKTtHZShZWzBdKSxHZShZWzFdKSxHZShZWzNdKSxHZShZWzFdKSxHZShZWzJdKSxHZShZWzNdKX1mdW5jdGlvbiBYZShOKXtzLnB1c2goY1tOKjMrMF0pLHMucHVzaChjW04qMysxXSkscy5wdXNoKGNbTiozKzJdKX1mdW5jdGlvbiBHZShOKXtyLnB1c2goTi54KSxyLnB1c2goTi55KX19fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCksZT10aGlzLnBhcmFtZXRlcnMuc2hhcGVzLG49dGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnM7cmV0dXJuIHNkKGUsbix0KX1zdGF0aWMgZnJvbUpTT04odCxlKXtjb25zdCBuPVtdO2ZvcihsZXQgcj0wLG89dC5zaGFwZXMubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9ZVt0LnNoYXBlc1tyXV07bi5wdXNoKGEpfWNvbnN0IHM9dC5vcHRpb25zLmV4dHJ1ZGVQYXRoO3JldHVybiBzIT09dm9pZCAwJiYodC5vcHRpb25zLmV4dHJ1ZGVQYXRoPW5ldyBuZFtgJHtzLnR5cGV9YF0oKS5mcm9tSlNPTihzKSksbmV3IFpuKG4sdC5vcHRpb25zKX19Y29uc3QgaWQ9e2dlbmVyYXRlVG9wVVY6ZnVuY3Rpb24oaSx0LGUsbixzKXtjb25zdCByPXRbZSozXSxvPXRbZSozKzFdLGE9dFtuKjNdLGM9dFtuKjMrMV0sbD10W3MqM10saD10W3MqMysxXTtyZXR1cm5bbmV3IFIocixvKSxuZXcgUihhLGMpLG5ldyBSKGwsaCldfSxnZW5lcmF0ZVNpZGVXYWxsVVY6ZnVuY3Rpb24oaSx0LGUsbixzLHIpe2NvbnN0IG89dFtlKjNdLGE9dFtlKjMrMV0sYz10W2UqMysyXSxsPXRbbiozXSxoPXRbbiozKzFdLHU9dFtuKjMrMl0sZj10W3MqM10sZD10W3MqMysxXSxwPXRbcyozKzJdLHk9dFtyKjNdLG09dFtyKjMrMV0sZz10W3IqMysyXTtyZXR1cm4gTWF0aC5hYnMoYS1oKTxNYXRoLmFicyhvLWwpP1tuZXcgUihvLDEtYyksbmV3IFIobCwxLXUpLG5ldyBSKGYsMS1wKSxuZXcgUih5LDEtZyldOltuZXcgUihhLDEtYyksbmV3IFIoaCwxLXUpLG5ldyBSKGQsMS1wKSxuZXcgUihtLDEtZyldfX07ZnVuY3Rpb24gc2QoaSx0LGUpe2lmKGUuc2hhcGVzPVtdLEFycmF5LmlzQXJyYXkoaSkpZm9yKGxldCBuPTAscz1pLmxlbmd0aDtuPHM7bisrKXtjb25zdCByPWlbbl07ZS5zaGFwZXMucHVzaChyLnV1aWQpfWVsc2UgZS5zaGFwZXMucHVzaChpLnV1aWQpO3JldHVybiBlLm9wdGlvbnM9T2JqZWN0LmFzc2lnbih7fSx0KSx0LmV4dHJ1ZGVQYXRoIT09dm9pZCAwJiYoZS5vcHRpb25zLmV4dHJ1ZGVQYXRoPXQuZXh0cnVkZVBhdGgudG9KU09OKCkpLGV9Y29uc3Qgcmw9MCxyZD0xLG9kPTIsb2w9MixWbz0xLjI1LGFsPTEsQmk9Nio0KzQrNCxCcz02NTUzNSxhZD1NYXRoLnBvdygyLC0yNCksVW89U3ltYm9sKCJTS0lQX0dFTkVSQVRJT04iKTtmdW5jdGlvbiBjZChpKXtyZXR1cm4gaS5pbmRleD9pLmluZGV4LmNvdW50OmkuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudH1mdW5jdGlvbiBKbihpKXtyZXR1cm4gY2QoaSkvM31mdW5jdGlvbiBsZChpLHQ9QXJyYXlCdWZmZXIpe3JldHVybiBpPjY1NTM1P25ldyBVaW50MzJBcnJheShuZXcgdCg0KmkpKTpuZXcgVWludDE2QXJyYXkobmV3IHQoMippKSl9ZnVuY3Rpb24gaGQoaSx0KXtpZighaS5pbmRleCl7Y29uc3QgZT1pLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQsbj10LnVzZVNoYXJlZEFycmF5QnVmZmVyP1NoYXJlZEFycmF5QnVmZmVyOkFycmF5QnVmZmVyLHM9bGQoZSxuKTtpLnNldEluZGV4KG5ldyB4dChzLDEpKTtmb3IobGV0IHI9MDtyPGU7cisrKXNbcl09cn19ZnVuY3Rpb24gY2woaSx0KXtjb25zdCBlPUpuKGkpLG49dHx8aS5kcmF3UmFuZ2Uscz1uLnN0YXJ0LzMscj0obi5zdGFydCtuLmNvdW50KS8zLG89TWF0aC5tYXgoMCxzKSxhPU1hdGgubWluKGUsciktbztyZXR1cm5be29mZnNldDpNYXRoLmZsb29yKG8pLGNvdW50Ok1hdGguZmxvb3IoYSl9XX1mdW5jdGlvbiBsbChpLHQpe2lmKCFpLmdyb3Vwc3x8IWkuZ3JvdXBzLmxlbmd0aClyZXR1cm4gY2woaSx0KTtjb25zdCBlPVtdLG49bmV3IFNldCxzPXR8fGkuZHJhd1JhbmdlLHI9cy5zdGFydC8zLG89KHMuc3RhcnQrcy5jb3VudCkvMztmb3IoY29uc3QgYyBvZiBpLmdyb3Vwcyl7Y29uc3QgbD1jLnN0YXJ0LzMsaD0oYy5zdGFydCtjLmNvdW50KS8zO24uYWRkKE1hdGgubWF4KHIsbCkpLG4uYWRkKE1hdGgubWluKG8saCkpfWNvbnN0IGE9QXJyYXkuZnJvbShuLnZhbHVlcygpKS5zb3J0KChjLGwpPT5jLWwpO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGgtMTtjKyspe2NvbnN0IGw9YVtjXSxoPWFbYysxXTtlLnB1c2goe29mZnNldDpNYXRoLmZsb29yKGwpLGNvdW50Ok1hdGguZmxvb3IoaC1sKX0pfXJldHVybiBlfWZ1bmN0aW9uIHVkKGksdCl7Y29uc3QgZT1KbihpKSxuPWxsKGksdCkuc29ydCgobyxhKT0+by5vZmZzZXQtYS5vZmZzZXQpLHM9bltuLmxlbmd0aC0xXTtzLmNvdW50PU1hdGgubWluKGUtcy5vZmZzZXQscy5jb3VudCk7bGV0IHI9MDtyZXR1cm4gbi5mb3JFYWNoKCh7Y291bnQ6b30pPT5yKz1vKSxlIT09cn1mdW5jdGlvbiBxbyhpLHQsZSxuLHMpe2xldCByPTEvMCxvPTEvMCxhPTEvMCxjPS0xLzAsbD0tMS8wLGg9LTEvMCx1PTEvMCxmPTEvMCxkPTEvMCxwPS0xLzAseT0tMS8wLG09LTEvMDtmb3IobGV0IGc9dCo2LGI9KHQrZSkqNjtnPGI7Zys9Nil7Y29uc3Qgdz1pW2crMF0seD1pW2crMV0sTT13LXgsQT13K3g7TTxyJiYocj1NKSxBPmMmJihjPUEpLHc8dSYmKHU9dyksdz5wJiYocD13KTtjb25zdCBTPWlbZysyXSxfPWlbZyszXSxFPVMtXyx6PVMrXztFPG8mJihvPUUpLHo+bCYmKGw9eiksUzxmJiYoZj1TKSxTPnkmJih5PVMpO2NvbnN0IHY9aVtnKzRdLEM9aVtnKzVdLFA9di1DLEY9ditDO1A8YSYmKGE9UCksRj5oJiYoaD1GKSx2PGQmJihkPXYpLHY+bSYmKG09dil9blswXT1yLG5bMV09byxuWzJdPWEsblszXT1jLG5bNF09bCxuWzVdPWgsc1swXT11LHNbMV09ZixzWzJdPWQsc1szXT1wLHNbNF09eSxzWzVdPW19ZnVuY3Rpb24gZmQoaSx0PW51bGwsZT1udWxsLG49bnVsbCl7Y29uc3Qgcz1pLmF0dHJpYnV0ZXMucG9zaXRpb24scj1pLmluZGV4P2kuaW5kZXguYXJyYXk6bnVsbCxvPUpuKGkpLGE9cy5ub3JtYWxpemVkO2xldCBjO3Q9PT1udWxsPyhjPW5ldyBGbG9hdDMyQXJyYXkobyo2KSxlPTAsbj1vKTooYz10LGU9ZXx8MCxuPW58fG8pO2NvbnN0IGw9cy5hcnJheSxoPXMub2Zmc2V0fHwwO2xldCB1PTM7cy5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYodT1zLmRhdGEuc3RyaWRlKTtjb25zdCBmPVsiZ2V0WCIsImdldFkiLCJnZXRaIl07Zm9yKGxldCBkPWU7ZDxlK247ZCsrKXtjb25zdCBwPWQqMyx5PWQqNjtsZXQgbT1wKzAsZz1wKzEsYj1wKzI7ciYmKG09clttXSxnPXJbZ10sYj1yW2JdKSxhfHwobT1tKnUraCxnPWcqdStoLGI9Yip1K2gpO2ZvcihsZXQgdz0wO3c8Mzt3Kyspe2xldCB4LE0sQTthPyh4PXNbZlt3XV0obSksTT1zW2Zbd11dKGcpLEE9c1tmW3ddXShiKSk6KHg9bFttK3ddLE09bFtnK3ddLEE9bFtiK3ddKTtsZXQgUz14O008UyYmKFM9TSksQTxTJiYoUz1BKTtsZXQgXz14O00+XyYmKF89TSksQT5fJiYoXz1BKTtjb25zdCBFPShfLVMpLzIsej13KjI7Y1t5K3orMF09UytFLGNbeSt6KzFdPUUrKE1hdGguYWJzKFMpK0UpKmFkfX1yZXR1cm4gY31mdW5jdGlvbiBsdChpLHQsZSl7cmV0dXJuIGUubWluLng9dFtpXSxlLm1pbi55PXRbaSsxXSxlLm1pbi56PXRbaSsyXSxlLm1heC54PXRbaSszXSxlLm1heC55PXRbaSs0XSxlLm1heC56PXRbaSs1XSxlfWZ1bmN0aW9uIGhsKGkpe2xldCB0PS0xLGU9LTEvMDtmb3IobGV0IG49MDtuPDM7bisrKXtjb25zdCBzPWlbbiszXS1pW25dO3M+ZSYmKGU9cyx0PW4pfXJldHVybiB0fWZ1bmN0aW9uIHVsKGksdCl7dC5zZXQoaSl9ZnVuY3Rpb24gZmwoaSx0LGUpe2xldCBuLHM7Zm9yKGxldCByPTA7cjwzO3IrKyl7Y29uc3Qgbz1yKzM7bj1pW3JdLHM9dFtyXSxlW3JdPW48cz9uOnMsbj1pW29dLHM9dFtvXSxlW29dPW4+cz9uOnN9fWZ1bmN0aW9uIEZzKGksdCxlKXtmb3IobGV0IG49MDtuPDM7bisrKXtjb25zdCBzPXRbaSsyKm5dLHI9dFtpKzIqbisxXSxvPXMtcixhPXMrcjtvPGVbbl0mJihlW25dPW8pLGE+ZVtuKzNdJiYoZVtuKzNdPWEpfX1mdW5jdGlvbiBGaShpKXtjb25zdCB0PWlbM10taVswXSxlPWlbNF0taVsxXSxuPWlbNV0taVsyXTtyZXR1cm4gMioodCplK2UqbituKnQpfWNvbnN0IEZlPTMyLGRkPShpLHQpPT5pLmNhbmRpZGF0ZS10LmNhbmRpZGF0ZSxLZT1uZXcgQXJyYXkoRmUpLmZpbGwoKS5tYXAoKCk9Pih7Y291bnQ6MCxib3VuZHM6bmV3IEZsb2F0MzJBcnJheSg2KSxyaWdodENhY2hlQm91bmRzOm5ldyBGbG9hdDMyQXJyYXkoNiksbGVmdENhY2hlQm91bmRzOm5ldyBGbG9hdDMyQXJyYXkoNiksY2FuZGlkYXRlOjB9KSksSXM9bmV3IEZsb2F0MzJBcnJheSg2KTtmdW5jdGlvbiBwZChpLHQsZSxuLHMscil7bGV0IG89LTEsYT0wO2lmKHI9PT1ybClvPWhsKHQpLG8hPT0tMSYmKGE9KHRbb10rdFtvKzNdKS8yKTtlbHNlIGlmKHI9PT1yZClvPWhsKGkpLG8hPT0tMSYmKGE9eWQoZSxuLHMsbykpO2Vsc2UgaWYocj09PW9kKXtjb25zdCBjPUZpKGkpO2xldCBsPVZvKnM7Y29uc3QgaD1uKjYsdT0obitzKSo2O2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9dFtmXSxtPSh0W2YrM10tZCkvRmU7aWYoczxGZS80KXtjb25zdCBnPVsuLi5LZV07Zy5sZW5ndGg9cztsZXQgYj0wO2ZvcihsZXQgeD1oO3g8dTt4Kz02LGIrKyl7Y29uc3QgTT1nW2JdO00uY2FuZGlkYXRlPWVbeCsyKmZdLE0uY291bnQ9MDtjb25zdHtib3VuZHM6QSxsZWZ0Q2FjaGVCb3VuZHM6UyxyaWdodENhY2hlQm91bmRzOl99PU07Zm9yKGxldCBFPTA7RTwzO0UrKylfW0VdPTEvMCxfW0UrM109LTEvMCxTW0VdPTEvMCxTW0UrM109LTEvMCxBW0VdPTEvMCxBW0UrM109LTEvMDtGcyh4LGUsQSl9Zy5zb3J0KGRkKTtsZXQgdz1zO2ZvcihsZXQgeD0wO3g8dzt4Kyspe2NvbnN0IE09Z1t4XTtmb3IoO3grMTx3JiZnW3grMV0uY2FuZGlkYXRlPT09TS5jYW5kaWRhdGU7KWcuc3BsaWNlKHgrMSwxKSx3LS19Zm9yKGxldCB4PWg7eDx1O3grPTYpe2NvbnN0IE09ZVt4KzIqZl07Zm9yKGxldCBBPTA7QTx3O0ErKyl7Y29uc3QgUz1nW0FdO00+PVMuY2FuZGlkYXRlP0ZzKHgsZSxTLnJpZ2h0Q2FjaGVCb3VuZHMpOihGcyh4LGUsUy5sZWZ0Q2FjaGVCb3VuZHMpLFMuY291bnQrKyl9fWZvcihsZXQgeD0wO3g8dzt4Kyspe2NvbnN0IE09Z1t4XSxBPU0uY291bnQsUz1zLU0uY291bnQsXz1NLmxlZnRDYWNoZUJvdW5kcyxFPU0ucmlnaHRDYWNoZUJvdW5kcztsZXQgej0wO0EhPT0wJiYoej1GaShfKS9jKTtsZXQgdj0wO1MhPT0wJiYodj1GaShFKS9jKTtjb25zdCBDPWFsK1ZvKih6KkErdipTKTtDPGwmJihvPWYsbD1DLGE9TS5jYW5kaWRhdGUpfX1lbHNle2ZvcihsZXQgdz0wO3c8RmU7dysrKXtjb25zdCB4PUtlW3ddO3guY291bnQ9MCx4LmNhbmRpZGF0ZT1kK20rdyptO2NvbnN0IE09eC5ib3VuZHM7Zm9yKGxldCBBPTA7QTwzO0ErKylNW0FdPTEvMCxNW0ErM109LTEvMH1mb3IobGV0IHc9aDt3PHU7dys9Nil7bGV0IEE9fn4oKGVbdysyKmZdLWQpL20pO0E+PUZlJiYoQT1GZS0xKTtjb25zdCBTPUtlW0FdO1MuY291bnQrKyxGcyh3LGUsUy5ib3VuZHMpfWNvbnN0IGc9S2VbRmUtMV07dWwoZy5ib3VuZHMsZy5yaWdodENhY2hlQm91bmRzKTtmb3IobGV0IHc9RmUtMjt3Pj0wO3ctLSl7Y29uc3QgeD1LZVt3XSxNPUtlW3crMV07ZmwoeC5ib3VuZHMsTS5yaWdodENhY2hlQm91bmRzLHgucmlnaHRDYWNoZUJvdW5kcyl9bGV0IGI9MDtmb3IobGV0IHc9MDt3PEZlLTE7dysrKXtjb25zdCB4PUtlW3ddLE09eC5jb3VudCxBPXguYm91bmRzLF89S2VbdysxXS5yaWdodENhY2hlQm91bmRzO00hPT0wJiYoYj09PTA/dWwoQSxJcyk6ZmwoQSxJcyxJcykpLGIrPU07bGV0IEU9MCx6PTA7YiE9PTAmJihFPUZpKElzKS9jKTtjb25zdCB2PXMtYjt2IT09MCYmKHo9RmkoXykvYyk7Y29uc3QgQz1hbCtWbyooRSpiK3oqdik7QzxsJiYobz1mLGw9QyxhPXguY2FuZGlkYXRlKX19fX1lbHNlIGNvbnNvbGUud2FybihgTWVzaEJWSDogSW52YWxpZCBidWlsZCBzdHJhdGVneSB2YWx1ZSAke3J9IHVzZWQuYCk7cmV0dXJue2F4aXM6byxwb3M6YX19ZnVuY3Rpb24geWQoaSx0LGUsbil7bGV0IHM9MDtmb3IobGV0IHI9dCxvPXQrZTtyPG87cisrKXMrPWlbcio2K24qMl07cmV0dXJuIHMvZX1jbGFzcyBIb3tjb25zdHJ1Y3Rvcigpe3RoaXMuYm91bmRpbmdEYXRhPW5ldyBGbG9hdDMyQXJyYXkoNil9fWZ1bmN0aW9uIG1kKGksdCxlLG4scyxyKXtsZXQgbz1uLGE9bitzLTE7Y29uc3QgYz1yLnBvcyxsPXIuYXhpcyoyO2Zvcig7Oyl7Zm9yKDtvPD1hJiZlW28qNitsXTxjOylvKys7Zm9yKDtvPD1hJiZlW2EqNitsXT49YzspYS0tO2lmKG88YSl7Zm9yKGxldCBoPTA7aDwzO2grKyl7bGV0IHU9dFtvKjMraF07dFtvKjMraF09dFthKjMraF0sdFthKjMraF09dX1mb3IobGV0IGg9MDtoPDY7aCsrKXtsZXQgdT1lW28qNitoXTtlW28qNitoXT1lW2EqNitoXSxlW2EqNitoXT11fW8rKyxhLS19ZWxzZSByZXR1cm4gb319ZnVuY3Rpb24gZ2QoaSx0LGUsbixzLHIpe2xldCBvPW4sYT1uK3MtMTtjb25zdCBjPXIucG9zLGw9ci5heGlzKjI7Zm9yKDs7KXtmb3IoO288PWEmJmVbbyo2K2xdPGM7KW8rKztmb3IoO288PWEmJmVbYSo2K2xdPj1jOylhLS07aWYobzxhKXtsZXQgaD1pW29dO2lbb109aVthXSxpW2FdPWg7Zm9yKGxldCB1PTA7dTw2O3UrKyl7bGV0IGY9ZVtvKjYrdV07ZVtvKjYrdV09ZVthKjYrdV0sZVthKjYrdV09Zn1vKyssYS0tfWVsc2UgcmV0dXJuIG99fWZ1bmN0aW9uIGt0KGksdCl7cmV0dXJuIHRbaSsxNV09PT02NTUzNX1mdW5jdGlvbiBVdChpLHQpe3JldHVybiB0W2krNl19ZnVuY3Rpb24gS3QoaSx0KXtyZXR1cm4gdFtpKzE0XX1mdW5jdGlvbiB0ZShpKXtyZXR1cm4gaSs4fWZ1bmN0aW9uIGVlKGksdCl7cmV0dXJuIHRbaSs2XX1mdW5jdGlvbiBkbChpLHQpe3JldHVybiB0W2krN119ZnVuY3Rpb24gdHgoaSl7cmV0dXJuIGl9bGV0IHBsLElpLGtzLHlsO2NvbnN0IHhkPU1hdGgucG93KDIsMzIpO2Z1bmN0aW9uIFhvKGkpe3JldHVybiJjb3VudCJpbiBpPzE6MStYbyhpLmxlZnQpK1hvKGkucmlnaHQpfWZ1bmN0aW9uIHdkKGksdCxlKXtyZXR1cm4gcGw9bmV3IEZsb2F0MzJBcnJheShlKSxJaT1uZXcgVWludDMyQXJyYXkoZSksa3M9bmV3IFVpbnQxNkFycmF5KGUpLHlsPW5ldyBVaW50OEFycmF5KGUpLEdvKGksdCl9ZnVuY3Rpb24gR28oaSx0KXtjb25zdCBlPWkvNCxuPWkvMixzPSJjb3VudCJpbiB0LHI9dC5ib3VuZGluZ0RhdGE7Zm9yKGxldCBvPTA7bzw2O28rKylwbFtlK29dPXJbb107aWYocylpZih0LmJ1ZmZlcil7Y29uc3Qgbz10LmJ1ZmZlcjt5bC5zZXQobmV3IFVpbnQ4QXJyYXkobyksaSk7Zm9yKGxldCBhPWksYz1pK28uYnl0ZUxlbmd0aDthPGM7YSs9Qmkpe2NvbnN0IGw9YS8yO2t0KGwsa3MpfHwoSWlbYS80KzZdKz1lKX1yZXR1cm4gaStvLmJ5dGVMZW5ndGh9ZWxzZXtjb25zdCBvPXQub2Zmc2V0LGE9dC5jb3VudDtyZXR1cm4gSWlbZSs2XT1vLGtzW24rMTRdPWEsa3NbbisxNV09QnMsaStCaX1lbHNle2NvbnN0IG89dC5sZWZ0LGE9dC5yaWdodCxjPXQuc3BsaXRBeGlzO2xldCBsO2lmKGw9R28oaStCaSxvKSxsLzQ+eGQpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBDYW5ub3Qgc3RvcmUgY2hpbGQgcG9pbnRlciBncmVhdGVyIHRoYW4gMzIgYml0cy4iKTtyZXR1cm4gSWlbZSs2XT1sLzQsbD1HbyhsLGEpLElpW2UrN109YyxsfX1mdW5jdGlvbiBiZChpLHQpe2NvbnN0IGU9KGkuaW5kZXg/aS5pbmRleC5jb3VudDppLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQpLzMsbj1lPmdpKDIsMTYpLHM9bj80OjIscj10P25ldyBTaGFyZWRBcnJheUJ1ZmZlcihlKnMpOm5ldyBBcnJheUJ1ZmZlcihlKnMpLG89bj9uZXcgVWludDMyQXJyYXkocik6bmV3IFVpbnQxNkFycmF5KHIpO2ZvcihsZXQgYT0wLGM9by5sZW5ndGg7YTxjO2ErKylvW2FdPWE7cmV0dXJuIG99ZnVuY3Rpb24gTWQoaSx0LGUsbixzKXtjb25zdHttYXhEZXB0aDpyLHZlcmJvc2U6byxtYXhMZWFmVHJpczphLHN0cmF0ZWd5OmMsb25Qcm9ncmVzczpsLGluZGlyZWN0Omh9PXMsdT1pLl9pbmRpcmVjdEJ1ZmZlcixmPWkuZ2VvbWV0cnksZD1mLmluZGV4P2YuaW5kZXguYXJyYXk6bnVsbCxwPWg/Z2Q6bWQseT1KbihmKSxtPW5ldyBGbG9hdDMyQXJyYXkoNik7bGV0IGc9ITE7Y29uc3QgYj1uZXcgSG87cmV0dXJuIHFvKHQsZSxuLGIuYm91bmRpbmdEYXRhLG0pLHgoYixlLG4sbSksYjtmdW5jdGlvbiB3KE0pe2wmJmwoTS95KX1mdW5jdGlvbiB4KE0sQSxTLF89bnVsbCxFPTApe2lmKCFnJiZFPj1yJiYoZz0hMCxvJiYoY29uc29sZS53YXJuKGBNZXNoQlZIOiBNYXggZGVwdGggb2YgJHtyfSByZWFjaGVkIHdoZW4gZ2VuZXJhdGluZyBCVkguIENvbnNpZGVyIGluY3JlYXNpbmcgbWF4RGVwdGguYCksY29uc29sZS53YXJuKGYpKSksUzw9YXx8RT49cilyZXR1cm4gdyhBK1MpLE0ub2Zmc2V0PUEsTS5jb3VudD1TLE07Y29uc3Qgej1wZChNLmJvdW5kaW5nRGF0YSxfLHQsQSxTLGMpO2lmKHouYXhpcz09PS0xKXJldHVybiB3KEErUyksTS5vZmZzZXQ9QSxNLmNvdW50PVMsTTtjb25zdCB2PXAodSxkLHQsQSxTLHopO2lmKHY9PT1BfHx2PT09QStTKXcoQStTKSxNLm9mZnNldD1BLE0uY291bnQ9UztlbHNle00uc3BsaXRBeGlzPXouYXhpcztjb25zdCBDPW5ldyBIbyxQPUEsRj12LUE7TS5sZWZ0PUMscW8odCxQLEYsQy5ib3VuZGluZ0RhdGEsbSkseChDLFAsRixtLEUrMSk7Y29uc3QgQj1uZXcgSG8sST12LGs9Uy1GO00ucmlnaHQ9Qixxbyh0LEksayxCLmJvdW5kaW5nRGF0YSxtKSx4KEIsSSxrLG0sRSsxKX1yZXR1cm4gTX19ZnVuY3Rpb24gQWQoaSx0KXtjb25zdCBlPWkuZ2VvbWV0cnk7dC5pbmRpcmVjdCYmKGkuX2luZGlyZWN0QnVmZmVyPWJkKGUsdC51c2VTaGFyZWRBcnJheUJ1ZmZlciksdWQoZSx0LnJhbmdlKSYmIXQudmVyYm9zZSYmY29uc29sZS53YXJuKCdNZXNoQlZIOiBQcm92aWRlZCBnZW9tZXRyeSBjb250YWlucyBncm91cHMgb3IgYSByYW5nZSB0aGF0IGRvIG5vdCBmdWxseSBzcGFuIHRoZSB2ZXJ0ZXggY29udGVudHMgd2hpbGUgdXNpbmcgdGhlICJpbmRpcmVjdCIgb3B0aW9uLiBCVkggbWF5IGluY29ycmVjdGx5IHJlcG9ydCBpbnRlcnNlY3Rpb25zIG9uIHVucmVuZGVyZWQgcG9ydGlvbnMgb2YgdGhlIGdlb21ldHJ5LicpKSxpLl9pbmRpcmVjdEJ1ZmZlcnx8aGQoZSx0KTtjb25zdCBuPXQudXNlU2hhcmVkQXJyYXlCdWZmZXI/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXIscz1mZChlKSxyPXQuaW5kaXJlY3Q/Y2woZSx0LnJhbmdlKTpsbChlLHQucmFuZ2UpO2kuX3Jvb3RzPXIubWFwKG89Pntjb25zdCBhPU1kKGkscyxvLm9mZnNldCxvLmNvdW50LHQpLGM9WG8oYSksbD1uZXcgbihCaSpjKTtyZXR1cm4gd2QoMCxhLGwpLGx9KX1jbGFzcyBJZXtjb25zdHJ1Y3Rvcigpe3RoaXMubWluPTEvMCx0aGlzLm1heD0tMS8wfXNldEZyb21Qb2ludHNGaWVsZCh0LGUpe2xldCBuPTEvMCxzPS0xLzA7Zm9yKGxldCByPTAsbz10Lmxlbmd0aDtyPG87cisrKXtjb25zdCBjPXRbcl1bZV07bj1jPG4/YzpuLHM9Yz5zP2M6c310aGlzLm1pbj1uLHRoaXMubWF4PXN9c2V0RnJvbVBvaW50cyh0LGUpe2xldCBuPTEvMCxzPS0xLzA7Zm9yKGxldCByPTAsbz1lLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPWVbcl0sYz10LmRvdChhKTtuPWM8bj9jOm4scz1jPnM/YzpzfXRoaXMubWluPW4sdGhpcy5tYXg9c31pc1NlcGFyYXRlZCh0KXtyZXR1cm4gdGhpcy5taW4+dC5tYXh8fHQubWluPnRoaXMubWF4fX1JZS5wcm90b3R5cGUuc2V0RnJvbUJveD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKGUsbil7Y29uc3Qgcz1uLm1pbixyPW4ubWF4O2xldCBvPTEvMCxhPS0xLzA7Zm9yKGxldCBjPTA7Yzw9MTtjKyspZm9yKGxldCBsPTA7bDw9MTtsKyspZm9yKGxldCBoPTA7aDw9MTtoKyspe2kueD1zLngqYytyLngqKDEtYyksaS55PXMueSpsK3IueSooMS1sKSxpLno9cy56Kmgrci56KigxLWgpO2NvbnN0IHU9ZS5kb3QoaSk7bz1NYXRoLm1pbih1LG8pLGE9TWF0aC5tYXgodSxhKX10aGlzLm1pbj1vLHRoaXMubWF4PWF9fSgpO2NvbnN0IFNkPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgVCx0PW5ldyBULGU9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKHMscixvKXtjb25zdCBhPXMuc3RhcnQsYz1pLGw9ci5zdGFydCxoPXQ7ZS5zdWJWZWN0b3JzKGEsbCksaS5zdWJWZWN0b3JzKHMuZW5kLHMuc3RhcnQpLHQuc3ViVmVjdG9ycyhyLmVuZCxyLnN0YXJ0KTtjb25zdCB1PWUuZG90KGgpLGY9aC5kb3QoYyksZD1oLmRvdChoKSxwPWUuZG90KGMpLG09Yy5kb3QoYykqZC1mKmY7bGV0IGcsYjttIT09MD9nPSh1KmYtcCpkKS9tOmc9MCxiPSh1K2cqZikvZCxvLng9ZyxvLnk9Yn19KCksV289ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBSLHQ9bmV3IFQsZT1uZXcgVDtyZXR1cm4gZnVuY3Rpb24ocyxyLG8sYSl7U2QocyxyLGkpO2xldCBjPWkueCxsPWkueTtpZihjPj0wJiZjPD0xJiZsPj0wJiZsPD0xKXtzLmF0KGMsbyksci5hdChsLGEpO3JldHVybn1lbHNlIGlmKGM+PTAmJmM8PTEpe2w8MD9yLmF0KDAsYSk6ci5hdCgxLGEpLHMuY2xvc2VzdFBvaW50VG9Qb2ludChhLCEwLG8pO3JldHVybn1lbHNlIGlmKGw+PTAmJmw8PTEpe2M8MD9zLmF0KDAsbyk6cy5hdCgxLG8pLHIuY2xvc2VzdFBvaW50VG9Qb2ludChvLCEwLGEpO3JldHVybn1lbHNle2xldCBoO2M8MD9oPXMuc3RhcnQ6aD1zLmVuZDtsZXQgdTtsPDA/dT1yLnN0YXJ0OnU9ci5lbmQ7Y29uc3QgZj10LGQ9ZTtpZihzLmNsb3Nlc3RQb2ludFRvUG9pbnQodSwhMCx0KSxyLmNsb3Nlc3RQb2ludFRvUG9pbnQoaCwhMCxlKSxmLmRpc3RhbmNlVG9TcXVhcmVkKHUpPD1kLmRpc3RhbmNlVG9TcXVhcmVkKGgpKXtvLmNvcHkoZiksYS5jb3B5KHUpO3JldHVybn1lbHNle28uY29weShoKSxhLmNvcHkoZCk7cmV0dXJufX19fSgpLF9kPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgVCx0PW5ldyBULGU9bmV3IEVvLG49bmV3IFF0O3JldHVybiBmdW5jdGlvbihyLG8pe2NvbnN0e3JhZGl1czphLGNlbnRlcjpjfT1yLHthOmwsYjpoLGM6dX09bztpZihuLnN0YXJ0PWwsbi5lbmQ9aCxuLmNsb3Nlc3RQb2ludFRvUG9pbnQoYywhMCxpKS5kaXN0YW5jZVRvKGMpPD1hfHwobi5zdGFydD1sLG4uZW5kPXUsbi5jbG9zZXN0UG9pbnRUb1BvaW50KGMsITAsaSkuZGlzdGFuY2VUbyhjKTw9YSl8fChuLnN0YXJ0PWgsbi5lbmQ9dSxuLmNsb3Nlc3RQb2ludFRvUG9pbnQoYywhMCxpKS5kaXN0YW5jZVRvKGMpPD1hKSlyZXR1cm4hMDtjb25zdCB5PW8uZ2V0UGxhbmUoZSk7aWYoTWF0aC5hYnMoeS5kaXN0YW5jZVRvUG9pbnQoYykpPD1hKXtjb25zdCBnPXkucHJvamVjdFBvaW50KGMsdCk7aWYoby5jb250YWluc1BvaW50KGcpKXJldHVybiEwfXJldHVybiExfX0oKSx2ZD0xZS0xNTtmdW5jdGlvbiBabyhpKXtyZXR1cm4gTWF0aC5hYnMoaSk8dmR9Y2xhc3MgbmUgZXh0ZW5kcyBldHtjb25zdHJ1Y3RvciguLi50KXtzdXBlciguLi50KSx0aGlzLmlzRXh0ZW5kZWRUcmlhbmdsZT0hMCx0aGlzLnNhdEF4ZXM9bmV3IEFycmF5KDQpLmZpbGwoKS5tYXAoKCk9Pm5ldyBUKSx0aGlzLnNhdEJvdW5kcz1uZXcgQXJyYXkoNCkuZmlsbCgpLm1hcCgoKT0+bmV3IEllKSx0aGlzLnBvaW50cz1bdGhpcy5hLHRoaXMuYix0aGlzLmNdLHRoaXMuc3BoZXJlPW5ldyBobyx0aGlzLnBsYW5lPW5ldyBFbyx0aGlzLm5lZWRzVXBkYXRlPSEwfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIF9kKHQsdGhpcyl9dXBkYXRlKCl7Y29uc3QgdD10aGlzLmEsZT10aGlzLmIsbj10aGlzLmMscz10aGlzLnBvaW50cyxyPXRoaXMuc2F0QXhlcyxvPXRoaXMuc2F0Qm91bmRzLGE9clswXSxjPW9bMF07dGhpcy5nZXROb3JtYWwoYSksYy5zZXRGcm9tUG9pbnRzKGEscyk7Y29uc3QgbD1yWzFdLGg9b1sxXTtsLnN1YlZlY3RvcnModCxlKSxoLnNldEZyb21Qb2ludHMobCxzKTtjb25zdCB1PXJbMl0sZj1vWzJdO3Uuc3ViVmVjdG9ycyhlLG4pLGYuc2V0RnJvbVBvaW50cyh1LHMpO2NvbnN0IGQ9clszXSxwPW9bM107ZC5zdWJWZWN0b3JzKG4sdCkscC5zZXRGcm9tUG9pbnRzKGQscyksdGhpcy5zcGhlcmUuc2V0RnJvbVBvaW50cyh0aGlzLnBvaW50cyksdGhpcy5wbGFuZS5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludChhLHQpLHRoaXMubmVlZHNVcGRhdGU9ITF9fW5lLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb1NlZ21lbnQ9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBULHQ9bmV3IFQsZT1uZXcgUXQ7cmV0dXJuIGZ1bmN0aW9uKHMscj1udWxsLG89bnVsbCl7Y29uc3R7c3RhcnQ6YSxlbmQ6Y309cyxsPXRoaXMucG9pbnRzO2xldCBoLHU9MS8wO2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9KGYrMSklMztlLnN0YXJ0LmNvcHkobFtmXSksZS5lbmQuY29weShsW2RdKSxXbyhlLHMsaSx0KSxoPWkuZGlzdGFuY2VUb1NxdWFyZWQodCksaDx1JiYodT1oLHImJnIuY29weShpKSxvJiZvLmNvcHkodCkpfXJldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoYSxpKSxoPWEuZGlzdGFuY2VUb1NxdWFyZWQoaSksaDx1JiYodT1oLHImJnIuY29weShpKSxvJiZvLmNvcHkoYSkpLHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChjLGkpLGg9Yy5kaXN0YW5jZVRvU3F1YXJlZChpKSxoPHUmJih1PWgsciYmci5jb3B5KGkpLG8mJm8uY29weShjKSksTWF0aC5zcXJ0KHUpfX0oKSxuZS5wcm90b3R5cGUuaW50ZXJzZWN0c1RyaWFuZ2xlPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgbmUsdD1uZXcgQXJyYXkoMyksZT1uZXcgQXJyYXkoMyksbj1uZXcgSWUscz1uZXcgSWUscj1uZXcgVCxvPW5ldyBULGE9bmV3IFQsYz1uZXcgVCxsPW5ldyBULGg9bmV3IFF0LHU9bmV3IFF0LGY9bmV3IFF0LGQ9bmV3IFQ7ZnVuY3Rpb24gcCh5LG0sZyl7Y29uc3QgYj15LnBvaW50cztsZXQgdz0wLHg9LTE7Zm9yKGxldCBNPTA7TTwzO00rKyl7Y29uc3R7c3RhcnQ6QSxlbmQ6U309aDtBLmNvcHkoYltNXSksUy5jb3B5KGJbKE0rMSklM10pLGguZGVsdGEobyk7Y29uc3QgXz1abyhtLmRpc3RhbmNlVG9Qb2ludChBKSk7aWYoWm8obS5ub3JtYWwuZG90KG8pKSYmXyl7Zy5jb3B5KGgpLHc9MjticmVha31jb25zdCBFPW0uaW50ZXJzZWN0TGluZShoLGQpO2lmKCFFJiZfJiZkLmNvcHkoQSksKEV8fF8pJiYhWm8oZC5kaXN0YW5jZVRvKFMpKSl7aWYodzw9MSkodz09PTE/Zy5zdGFydDpnLmVuZCkuY29weShkKSxfJiYoeD13KTtlbHNlIGlmKHc+PTIpeyh4PT09MT9nLnN0YXJ0OmcuZW5kKS5jb3B5KGQpLHc9MjticmVha31pZih3Kyssdz09PTImJng9PT0tMSlicmVha319cmV0dXJuIHd9cmV0dXJuIGZ1bmN0aW9uKG0sZz1udWxsLGI9ITEpe3RoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksbS5pc0V4dGVuZGVkVHJpYW5nbGU/bS5uZWVkc1VwZGF0ZSYmbS51cGRhdGUoKTooaS5jb3B5KG0pLGkudXBkYXRlKCksbT1pKTtjb25zdCB3PXRoaXMucGxhbmUseD1tLnBsYW5lO2lmKE1hdGguYWJzKHcubm9ybWFsLmRvdCh4Lm5vcm1hbCkpPjEtMWUtMTApe2NvbnN0IE09dGhpcy5zYXRCb3VuZHMsQT10aGlzLnNhdEF4ZXM7ZVswXT1tLmEsZVsxXT1tLmIsZVsyXT1tLmM7Zm9yKGxldCBFPTA7RTw0O0UrKyl7Y29uc3Qgej1NW0VdLHY9QVtFXTtpZihuLnNldEZyb21Qb2ludHModixlKSx6LmlzU2VwYXJhdGVkKG4pKXJldHVybiExfWNvbnN0IFM9bS5zYXRCb3VuZHMsXz1tLnNhdEF4ZXM7dFswXT10aGlzLmEsdFsxXT10aGlzLmIsdFsyXT10aGlzLmM7Zm9yKGxldCBFPTA7RTw0O0UrKyl7Y29uc3Qgej1TW0VdLHY9X1tFXTtpZihuLnNldEZyb21Qb2ludHModix0KSx6LmlzU2VwYXJhdGVkKG4pKXJldHVybiExfWZvcihsZXQgRT0wO0U8NDtFKyspe2NvbnN0IHo9QVtFXTtmb3IobGV0IHY9MDt2PDQ7disrKXtjb25zdCBDPV9bdl07aWYoci5jcm9zc1ZlY3RvcnMoeixDKSxuLnNldEZyb21Qb2ludHMocix0KSxzLnNldEZyb21Qb2ludHMocixlKSxuLmlzU2VwYXJhdGVkKHMpKXJldHVybiExfX1yZXR1cm4gZyYmKGJ8fGNvbnNvbGUud2FybigiRXh0ZW5kZWRUcmlhbmdsZS5pbnRlcnNlY3RzVHJpYW5nbGU6IFRyaWFuZ2xlcyBhcmUgY29wbGFuYXIgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBhbiBvdXRwdXQgZWRnZS4gU2V0dGluZyBlZGdlIHRvIDAsIDAsIDAuIiksZy5zdGFydC5zZXQoMCwwLDApLGcuZW5kLnNldCgwLDAsMCkpLCEwfWVsc2V7Y29uc3QgTT1wKHRoaXMseCx1KTtpZihNPT09MSYmbS5jb250YWluc1BvaW50KHUuZW5kKSlyZXR1cm4gZyYmKGcuc3RhcnQuY29weSh1LmVuZCksZy5lbmQuY29weSh1LmVuZCkpLCEwO2lmKE0hPT0yKXJldHVybiExO2NvbnN0IEE9cChtLHcsZik7aWYoQT09PTEmJnRoaXMuY29udGFpbnNQb2ludChmLmVuZCkpcmV0dXJuIGcmJihnLnN0YXJ0LmNvcHkoZi5lbmQpLGcuZW5kLmNvcHkoZi5lbmQpKSwhMDtpZihBIT09MilyZXR1cm4hMTtpZih1LmRlbHRhKGEpLGYuZGVsdGEoYyksYS5kb3QoYyk8MCl7bGV0IFA9Zi5zdGFydDtmLnN0YXJ0PWYuZW5kLGYuZW5kPVB9Y29uc3QgUz11LnN0YXJ0LmRvdChhKSxfPXUuZW5kLmRvdChhKSxFPWYuc3RhcnQuZG90KGEpLHo9Zi5lbmQuZG90KGEpLHY9XzxFLEM9Uzx6O3JldHVybiBTIT09eiYmRSE9PV8mJnY9PT1DPyExOihnJiYobC5zdWJWZWN0b3JzKHUuc3RhcnQsZi5zdGFydCksbC5kb3QoYSk+MD9nLnN0YXJ0LmNvcHkodS5zdGFydCk6Zy5zdGFydC5jb3B5KGYuc3RhcnQpLGwuc3ViVmVjdG9ycyh1LmVuZCxmLmVuZCksbC5kb3QoYSk8MD9nLmVuZC5jb3B5KHUuZW5kKTpnLmVuZC5jb3B5KGYuZW5kKSksITApfX19KCksbmUucHJvdG90eXBlLmRpc3RhbmNlVG9Qb2ludD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoZSxpKSxlLmRpc3RhbmNlVG8oaSl9fSgpLG5lLnByb3RvdHlwZS5kaXN0YW5jZVRvVHJpYW5nbGU9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBULHQ9bmV3IFQsZT1bImEiLCJiIiwiYyJdLG49bmV3IFF0LHM9bmV3IFF0O3JldHVybiBmdW5jdGlvbihvLGE9bnVsbCxjPW51bGwpe2NvbnN0IGw9YXx8Yz9uOm51bGw7aWYodGhpcy5pbnRlcnNlY3RzVHJpYW5nbGUobyxsKSlyZXR1cm4oYXx8YykmJihhJiZsLmdldENlbnRlcihhKSxjJiZsLmdldENlbnRlcihjKSksMDtsZXQgaD0xLzA7Zm9yKGxldCB1PTA7dTwzO3UrKyl7bGV0IGY7Y29uc3QgZD1lW3VdLHA9b1tkXTt0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQocCxpKSxmPXAuZGlzdGFuY2VUb1NxdWFyZWQoaSksZjxoJiYoaD1mLGEmJmEuY29weShpKSxjJiZjLmNvcHkocCkpO2NvbnN0IHk9dGhpc1tkXTtvLmNsb3Nlc3RQb2ludFRvUG9pbnQoeSxpKSxmPXkuZGlzdGFuY2VUb1NxdWFyZWQoaSksZjxoJiYoaD1mLGEmJmEuY29weSh5KSxjJiZjLmNvcHkoaSkpfWZvcihsZXQgdT0wO3U8Mzt1Kyspe2NvbnN0IGY9ZVt1XSxkPWVbKHUrMSklM107bi5zZXQodGhpc1tmXSx0aGlzW2RdKTtmb3IobGV0IHA9MDtwPDM7cCsrKXtjb25zdCB5PWVbcF0sbT1lWyhwKzEpJTNdO3Muc2V0KG9beV0sb1ttXSksV28obixzLGksdCk7Y29uc3QgZz1pLmRpc3RhbmNlVG9TcXVhcmVkKHQpO2c8aCYmKGg9ZyxhJiZhLmNvcHkoaSksYyYmYy5jb3B5KHQpKX19cmV0dXJuIE1hdGguc3FydChoKX19KCk7Y2xhc3MgenR7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuaXNPcmllbnRlZEJveD0hMCx0aGlzLm1pbj1uZXcgVCx0aGlzLm1heD1uZXcgVCx0aGlzLm1hdHJpeD1uZXcgc3QsdGhpcy5pbnZNYXRyaXg9bmV3IHN0LHRoaXMucG9pbnRzPW5ldyBBcnJheSg4KS5maWxsKCkubWFwKCgpPT5uZXcgVCksdGhpcy5zYXRBeGVzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgpPT5uZXcgVCksdGhpcy5zYXRCb3VuZHM9bmV3IEFycmF5KDMpLmZpbGwoKS5tYXAoKCk9Pm5ldyBJZSksdGhpcy5hbGlnbmVkU2F0Qm91bmRzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgpPT5uZXcgSWUpLHRoaXMubmVlZHNVcGRhdGU9ITEsdCYmdGhpcy5taW4uY29weSh0KSxlJiZ0aGlzLm1heC5jb3B5KGUpLG4mJnRoaXMubWF0cml4LmNvcHkobil9c2V0KHQsZSxuKXt0aGlzLm1pbi5jb3B5KHQpLHRoaXMubWF4LmNvcHkoZSksdGhpcy5tYXRyaXguY29weShuKSx0aGlzLm5lZWRzVXBkYXRlPSEwfWNvcHkodCl7dGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5uZWVkc1VwZGF0ZT0hMH19enQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5tYXRyaXgsZT10aGlzLm1pbixuPXRoaXMubWF4LHM9dGhpcy5wb2ludHM7Zm9yKGxldCBsPTA7bDw9MTtsKyspZm9yKGxldCBoPTA7aDw9MTtoKyspZm9yKGxldCB1PTA7dTw9MTt1Kyspe2NvbnN0IGY9MSpsfDIqaHw0KnUsZD1zW2ZdO2QueD1sP24ueDplLngsZC55PWg/bi55OmUueSxkLno9dT9uLno6ZS56LGQuYXBwbHlNYXRyaXg0KHQpfWNvbnN0IHI9dGhpcy5zYXRCb3VuZHMsbz10aGlzLnNhdEF4ZXMsYT1zWzBdO2ZvcihsZXQgbD0wO2w8MztsKyspe2NvbnN0IGg9b1tsXSx1PXJbbF0sZj0xPDxsLGQ9c1tmXTtoLnN1YlZlY3RvcnMoYSxkKSx1LnNldEZyb21Qb2ludHMoaCxzKX1jb25zdCBjPXRoaXMuYWxpZ25lZFNhdEJvdW5kcztjWzBdLnNldEZyb21Qb2ludHNGaWVsZChzLCJ4IiksY1sxXS5zZXRGcm9tUG9pbnRzRmllbGQocywieSIpLGNbMl0uc2V0RnJvbVBvaW50c0ZpZWxkKHMsInoiKSx0aGlzLmludk1hdHJpeC5jb3B5KHRoaXMubWF0cml4KS5pbnZlcnQoKSx0aGlzLm5lZWRzVXBkYXRlPSExfX0oKSx6dC5wcm90b3R5cGUuaW50ZXJzZWN0c0JveD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IEllO3JldHVybiBmdW5jdGlvbihlKXt0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpO2NvbnN0IG49ZS5taW4scz1lLm1heCxyPXRoaXMuc2F0Qm91bmRzLG89dGhpcy5zYXRBeGVzLGE9dGhpcy5hbGlnbmVkU2F0Qm91bmRzO2lmKGkubWluPW4ueCxpLm1heD1zLngsYVswXS5pc1NlcGFyYXRlZChpKXx8KGkubWluPW4ueSxpLm1heD1zLnksYVsxXS5pc1NlcGFyYXRlZChpKSl8fChpLm1pbj1uLnosaS5tYXg9cy56LGFbMl0uaXNTZXBhcmF0ZWQoaSkpKXJldHVybiExO2ZvcihsZXQgYz0wO2M8MztjKyspe2NvbnN0IGw9b1tjXSxoPXJbY107aWYoaS5zZXRGcm9tQm94KGwsZSksaC5pc1NlcGFyYXRlZChpKSlyZXR1cm4hMX1yZXR1cm4hMH19KCksenQucHJvdG90eXBlLmludGVyc2VjdHNUcmlhbmdsZT1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IG5lLHQ9bmV3IEFycmF5KDMpLGU9bmV3IEllLG49bmV3IEllLHM9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKG8pe3RoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksby5pc0V4dGVuZGVkVHJpYW5nbGU/by5uZWVkc1VwZGF0ZSYmby51cGRhdGUoKTooaS5jb3B5KG8pLGkudXBkYXRlKCksbz1pKTtjb25zdCBhPXRoaXMuc2F0Qm91bmRzLGM9dGhpcy5zYXRBeGVzO3RbMF09by5hLHRbMV09by5iLHRbMl09by5jO2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9YVtmXSxwPWNbZl07aWYoZS5zZXRGcm9tUG9pbnRzKHAsdCksZC5pc1NlcGFyYXRlZChlKSlyZXR1cm4hMX1jb25zdCBsPW8uc2F0Qm91bmRzLGg9by5zYXRBeGVzLHU9dGhpcy5wb2ludHM7Zm9yKGxldCBmPTA7ZjwzO2YrKyl7Y29uc3QgZD1sW2ZdLHA9aFtmXTtpZihlLnNldEZyb21Qb2ludHMocCx1KSxkLmlzU2VwYXJhdGVkKGUpKXJldHVybiExfWZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9Y1tmXTtmb3IobGV0IHA9MDtwPDQ7cCsrKXtjb25zdCB5PWhbcF07aWYocy5jcm9zc1ZlY3RvcnMoZCx5KSxlLnNldEZyb21Qb2ludHMocyx0KSxuLnNldEZyb21Qb2ludHMocyx1KSxlLmlzU2VwYXJhdGVkKG4pKXJldHVybiExfX1yZXR1cm4hMH19KCksenQucHJvdG90eXBlLmNsb3Nlc3RQb2ludFRvUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKSxlLmNvcHkodCkuYXBwbHlNYXRyaXg0KHRoaXMuaW52TWF0cml4KS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4KSxlfX0oKSx6dC5wcm90b3R5cGUuZGlzdGFuY2VUb1BvaW50PWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgVDtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChlLGkpLGUuZGlzdGFuY2VUbyhpKX19KCksenQucHJvdG90eXBlLmRpc3RhbmNlVG9Cb3g9ZnVuY3Rpb24oKXtjb25zdCBpPVsieCIsInkiLCJ6Il0sdD1uZXcgQXJyYXkoMTIpLmZpbGwoKS5tYXAoKCk9Pm5ldyBRdCksZT1uZXcgQXJyYXkoMTIpLmZpbGwoKS5tYXAoKCk9Pm5ldyBRdCksbj1uZXcgVCxzPW5ldyBUO3JldHVybiBmdW5jdGlvbihvLGE9MCxjPW51bGwsbD1udWxsKXtpZih0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLHRoaXMuaW50ZXJzZWN0c0JveChvKSlyZXR1cm4oY3x8bCkmJihvLmdldENlbnRlcihzKSx0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQocyxuKSxvLmNsb3Nlc3RQb2ludFRvUG9pbnQobixzKSxjJiZjLmNvcHkobiksbCYmbC5jb3B5KHMpKSwwO2NvbnN0IGg9YSphLHU9by5taW4sZj1vLm1heCxkPXRoaXMucG9pbnRzO2xldCBwPTEvMDtmb3IobGV0IG09MDttPDg7bSsrKXtjb25zdCBnPWRbbV07cy5jb3B5KGcpLmNsYW1wKHUsZik7Y29uc3QgYj1nLmRpc3RhbmNlVG9TcXVhcmVkKHMpO2lmKGI8cCYmKHA9YixjJiZjLmNvcHkoZyksbCYmbC5jb3B5KHMpLGI8aCkpcmV0dXJuIE1hdGguc3FydChiKX1sZXQgeT0wO2ZvcihsZXQgbT0wO208MzttKyspZm9yKGxldCBnPTA7Zzw9MTtnKyspZm9yKGxldCBiPTA7Yjw9MTtiKyspe2NvbnN0IHc9KG0rMSklMyx4PShtKzIpJTMsTT1nPDx3fGI8PHgsQT0xPDxtfGc8PHd8Yjw8eCxTPWRbTV0sXz1kW0FdO3RbeV0uc2V0KFMsXyk7Y29uc3Qgej1pW21dLHY9aVt3XSxDPWlbeF0sUD1lW3ldLEY9UC5zdGFydCxCPVAuZW5kO0Zbel09dVt6XSxGW3ZdPWc/dVt2XTpmW3ZdLEZbQ109Yj91W0NdOmZbdl0sQlt6XT1mW3pdLEJbdl09Zz91W3ZdOmZbdl0sQltDXT1iP3VbQ106Zlt2XSx5Kyt9Zm9yKGxldCBtPTA7bTw9MTttKyspZm9yKGxldCBnPTA7Zzw9MTtnKyspZm9yKGxldCBiPTA7Yjw9MTtiKyspe3MueD1tP2YueDp1Lngscy55PWc/Zi55OnUueSxzLno9Yj9mLno6dS56LHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChzLG4pO2NvbnN0IHc9cy5kaXN0YW5jZVRvU3F1YXJlZChuKTtpZih3PHAmJihwPXcsYyYmYy5jb3B5KG4pLGwmJmwuY29weShzKSx3PGgpKXJldHVybiBNYXRoLnNxcnQodyl9Zm9yKGxldCBtPTA7bTwxMjttKyspe2NvbnN0IGc9dFttXTtmb3IobGV0IGI9MDtiPDEyO2IrKyl7Y29uc3Qgdz1lW2JdO1dvKGcsdyxuLHMpO2NvbnN0IHg9bi5kaXN0YW5jZVRvU3F1YXJlZChzKTtpZih4PHAmJihwPXgsYyYmYy5jb3B5KG4pLGwmJmwuY29weShzKSx4PGgpKXJldHVybiBNYXRoLnNxcnQoeCl9fXJldHVybiBNYXRoLnNxcnQocCl9fSgpO2NsYXNzIEpve2NvbnN0cnVjdG9yKHQpe3RoaXMuX2dldE5ld1ByaW1pdGl2ZT10LHRoaXMuX3ByaW1pdGl2ZXM9W119Z2V0UHJpbWl0aXZlKCl7Y29uc3QgdD10aGlzLl9wcmltaXRpdmVzO3JldHVybiB0Lmxlbmd0aD09PTA/dGhpcy5fZ2V0TmV3UHJpbWl0aXZlKCk6dC5wb3AoKX1yZWxlYXNlUHJpbWl0aXZlKHQpe3RoaXMuX3ByaW1pdGl2ZXMucHVzaCh0KX19Y2xhc3MgemQgZXh0ZW5kcyBKb3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCgpPT5uZXcgbmUpfX1jb25zdCBpZT1uZXcgemQ7Y2xhc3MgVGR7Y29uc3RydWN0b3IoKXt0aGlzLmZsb2F0MzJBcnJheT1udWxsLHRoaXMudWludDE2QXJyYXk9bnVsbCx0aGlzLnVpbnQzMkFycmF5PW51bGw7Y29uc3QgdD1bXTtsZXQgZT1udWxsO3RoaXMuc2V0QnVmZmVyPW49PntlJiZ0LnB1c2goZSksZT1uLHRoaXMuZmxvYXQzMkFycmF5PW5ldyBGbG9hdDMyQXJyYXkobiksdGhpcy51aW50MTZBcnJheT1uZXcgVWludDE2QXJyYXkobiksdGhpcy51aW50MzJBcnJheT1uZXcgVWludDMyQXJyYXkobil9LHRoaXMuY2xlYXJCdWZmZXI9KCk9PntlPW51bGwsdGhpcy5mbG9hdDMyQXJyYXk9bnVsbCx0aGlzLnVpbnQxNkFycmF5PW51bGwsdGhpcy51aW50MzJBcnJheT1udWxsLHQubGVuZ3RoIT09MCYmdGhpcy5zZXRCdWZmZXIodC5wb3AoKSl9fX1jb25zdCBudD1uZXcgVGQ7bGV0IHRuLFluO2NvbnN0IGpuPVtdLE5zPW5ldyBKbygoKT0+bmV3IGd0KTtmdW5jdGlvbiBFZChpLHQsZSxuLHMscil7dG49TnMuZ2V0UHJpbWl0aXZlKCksWW49TnMuZ2V0UHJpbWl0aXZlKCksam4ucHVzaCh0bixZbiksbnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBvPVlvKDAsaS5nZW9tZXRyeSxlLG4scyxyKTtudC5jbGVhckJ1ZmZlcigpLE5zLnJlbGVhc2VQcmltaXRpdmUodG4pLE5zLnJlbGVhc2VQcmltaXRpdmUoWW4pLGpuLnBvcCgpLGpuLnBvcCgpO2NvbnN0IGE9am4ubGVuZ3RoO3JldHVybiBhPjAmJihZbj1qblthLTFdLHRuPWpuW2EtMl0pLG99ZnVuY3Rpb24gWW8oaSx0LGUsbixzPW51bGwscj0wLG89MCl7Y29uc3R7ZmxvYXQzMkFycmF5OmEsdWludDE2QXJyYXk6Yyx1aW50MzJBcnJheTpsfT1udDtsZXQgaD1pKjI7aWYoa3QoaCxjKSl7Y29uc3QgZj1VdChpLGwpLGQ9S3QoaCxjKTtyZXR1cm4gbHQoaSxhLHRuKSxuKGYsZCwhMSxvLHIraSx0bil9ZWxzZXtsZXQgej1mdW5jdGlvbihDKXtjb25zdHt1aW50MTZBcnJheTpQLHVpbnQzMkFycmF5OkZ9PW50O2xldCBCPUMqMjtmb3IoOyFrdChCLFApOylDPXRlKEMpLEI9QyoyO3JldHVybiBVdChDLEYpfSx2PWZ1bmN0aW9uKEMpe2NvbnN0e3VpbnQxNkFycmF5OlAsdWludDMyQXJyYXk6Rn09bnQ7bGV0IEI9QyoyO2Zvcig7IWt0KEIsUCk7KUM9ZWUoQyxGKSxCPUMqMjtyZXR1cm4gVXQoQyxGKStLdChCLFApfTtjb25zdCBmPXRlKGkpLGQ9ZWUoaSxsKTtsZXQgcD1mLHk9ZCxtLGcsYix3O2lmKHMmJihiPXRuLHc9WW4sbHQocCxhLGIpLGx0KHksYSx3KSxtPXMoYiksZz1zKHcpLGc8bSkpe3A9ZCx5PWY7Y29uc3QgQz1tO209ZyxnPUMsYj13fWJ8fChiPXRuLGx0KHAsYSxiKSk7Y29uc3QgeD1rdChwKjIsYyksTT1lKGIseCxtLG8rMSxyK3ApO2xldCBBO2lmKE09PT1vbCl7Y29uc3QgQz16KHApLEY9dihwKS1DO0E9bihDLEYsITAsbysxLHIrcCxiKX1lbHNlIEE9TSYmWW8ocCx0LGUsbixzLHIsbysxKTtpZihBKXJldHVybiEwO3c9WW4sbHQoeSxhLHcpO2NvbnN0IFM9a3QoeSoyLGMpLF89ZSh3LFMsZyxvKzEscit5KTtsZXQgRTtpZihfPT09b2wpe2NvbnN0IEM9eih5KSxGPXYoeSktQztFPW4oQyxGLCEwLG8rMSxyK3ksdyl9ZWxzZSBFPV8mJllvKHksdCxlLG4scyxyLG8rMSk7cmV0dXJuISFFfX1jb25zdCBraT1uZXcgVCxqbz1uZXcgVDtmdW5jdGlvbiBQZChpLHQsZT17fSxuPTAscz0xLzApe2NvbnN0IHI9bipuLG89cypzO2xldCBhPTEvMCxjPW51bGw7aWYoaS5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6aD0+KGtpLmNvcHkodCkuY2xhbXAoaC5taW4saC5tYXgpLGtpLmRpc3RhbmNlVG9TcXVhcmVkKHQpKSxpbnRlcnNlY3RzQm91bmRzOihoLHUsZik9PmY8YSYmZjxvLGludGVyc2VjdHNUcmlhbmdsZTooaCx1KT0+e2guY2xvc2VzdFBvaW50VG9Qb2ludCh0LGtpKTtjb25zdCBmPXQuZGlzdGFuY2VUb1NxdWFyZWQoa2kpO3JldHVybiBmPGEmJihqby5jb3B5KGtpKSxhPWYsYz11KSxmPHJ9fSksYT09PTEvMClyZXR1cm4gbnVsbDtjb25zdCBsPU1hdGguc3FydChhKTtyZXR1cm4gZS5wb2ludD9lLnBvaW50LmNvcHkoam8pOmUucG9pbnQ9am8uY2xvbmUoKSxlLmRpc3RhbmNlPWwsZS5mYWNlSW5kZXg9YyxlfWNvbnN0IENkPXBhcnNlSW50KEopPj0xNjkseW49bmV3IFQsbW49bmV3IFQsZ249bmV3IFQsUnM9bmV3IFIsTHM9bmV3IFIsT3M9bmV3IFIsbWw9bmV3IFQsZ2w9bmV3IFQseGw9bmV3IFQsTmk9bmV3IFQ7ZnVuY3Rpb24gQmQoaSx0LGUsbixzLHIsbyxhKXtsZXQgYztpZihyPT09MT9jPWkuaW50ZXJzZWN0VHJpYW5nbGUobixlLHQsITAscyk6Yz1pLmludGVyc2VjdFRyaWFuZ2xlKHQsZSxuLHIhPT0yLHMpLGM9PT1udWxsKXJldHVybiBudWxsO2NvbnN0IGw9aS5vcmlnaW4uZGlzdGFuY2VUbyhzKTtyZXR1cm4gbDxvfHxsPmE/bnVsbDp7ZGlzdGFuY2U6bCxwb2ludDpzLmNsb25lKCl9fWZ1bmN0aW9uIEZkKGksdCxlLG4scyxyLG8sYSxjLGwsaCl7eW4uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LHIpLG1uLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxvKSxnbi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsYSk7Y29uc3QgdT1CZChpLHluLG1uLGduLE5pLGMsbCxoKTtpZih1KXtjb25zdCBmPW5ldyBUO2V0LmdldEJhcnljb29yZChOaSx5bixtbixnbixmKSxuJiYoUnMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHIpLExzLmZyb21CdWZmZXJBdHRyaWJ1dGUobixvKSxPcy5mcm9tQnVmZmVyQXR0cmlidXRlKG4sYSksdS51dj1ldC5nZXRJbnRlcnBvbGF0aW9uKE5pLHluLG1uLGduLFJzLExzLE9zLG5ldyBSKSkscyYmKFJzLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxyKSxMcy5mcm9tQnVmZmVyQXR0cmlidXRlKHMsbyksT3MuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGEpLHUudXYxPWV0LmdldEludGVycG9sYXRpb24oTmkseW4sbW4sZ24sUnMsTHMsT3MsbmV3IFIpKSxlJiYobWwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHIpLGdsLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxvKSx4bC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsYSksdS5ub3JtYWw9ZXQuZ2V0SW50ZXJwb2xhdGlvbihOaSx5bixtbixnbixtbCxnbCx4bCxuZXcgVCksdS5ub3JtYWwuZG90KGkuZGlyZWN0aW9uKT4wJiZ1Lm5vcm1hbC5tdWx0aXBseVNjYWxhcigtMSkpO2NvbnN0IGQ9e2E6cixiOm8sYzphLG5vcm1hbDpuZXcgVCxtYXRlcmlhbEluZGV4OjB9O2V0LmdldE5vcm1hbCh5bixtbixnbixkLm5vcm1hbCksdS5mYWNlPWQsdS5mYWNlSW5kZXg9cixDZCYmKHUuYmFyeWNvb3JkPWYpfXJldHVybiB1fWZ1bmN0aW9uIERzKGksdCxlLG4scyxyLG8pe2NvbnN0IGE9biozO2xldCBjPWErMCxsPWErMSxoPWErMjtjb25zdCB1PWkuaW5kZXg7aS5pbmRleCYmKGM9dS5nZXRYKGMpLGw9dS5nZXRYKGwpLGg9dS5nZXRYKGgpKTtjb25zdHtwb3NpdGlvbjpmLG5vcm1hbDpkLHV2OnAsdXYxOnl9PWkuYXR0cmlidXRlcyxtPUZkKGUsZixkLHAseSxjLGwsaCx0LHIsbyk7cmV0dXJuIG0/KG0uZmFjZUluZGV4PW4scyYmcy5wdXNoKG0pLG0pOm51bGx9ZnVuY3Rpb24geXQoaSx0LGUsbil7Y29uc3Qgcz1pLmEscj1pLmIsbz1pLmM7bGV0IGE9dCxjPXQrMSxsPXQrMjtlJiYoYT1lLmdldFgoYSksYz1lLmdldFgoYyksbD1lLmdldFgobCkpLHMueD1uLmdldFgoYSkscy55PW4uZ2V0WShhKSxzLno9bi5nZXRaKGEpLHIueD1uLmdldFgoYyksci55PW4uZ2V0WShjKSxyLno9bi5nZXRaKGMpLG8ueD1uLmdldFgobCksby55PW4uZ2V0WShsKSxvLno9bi5nZXRaKGwpfWZ1bmN0aW9uIElkKGksdCxlLG4scyxyLG8sYSl7Y29uc3R7Z2VvbWV0cnk6YyxfaW5kaXJlY3RCdWZmZXI6bH09aTtmb3IobGV0IGg9bix1PW4rcztoPHU7aCsrKURzKGMsdCxlLGgscixvLGEpfWZ1bmN0aW9uIGtkKGksdCxlLG4scyxyLG8pe2NvbnN0e2dlb21ldHJ5OmEsX2luZGlyZWN0QnVmZmVyOmN9PWk7bGV0IGw9MS8wLGg9bnVsbDtmb3IobGV0IHU9bixmPW4rczt1PGY7dSsrKXtsZXQgZDtkPURzKGEsdCxlLHUsbnVsbCxyLG8pLGQmJmQuZGlzdGFuY2U8bCYmKGg9ZCxsPWQuZGlzdGFuY2UpfXJldHVybiBofWZ1bmN0aW9uIE5kKGksdCxlLG4scyxyLG8pe2NvbnN0e2dlb21ldHJ5OmF9PWUse2luZGV4OmN9PWEsbD1hLmF0dHJpYnV0ZXMucG9zaXRpb247Zm9yKGxldCBoPWksdT10K2k7aDx1O2grKyl7bGV0IGY7aWYoZj1oLHl0KG8sZiozLGMsbCksby5uZWVkc1VwZGF0ZT0hMCxuKG8sZixzLHIpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFJkKGksdD1udWxsKXt0JiZBcnJheS5pc0FycmF5KHQpJiYodD1uZXcgU2V0KHQpKTtjb25zdCBlPWkuZ2VvbWV0cnksbj1lLmluZGV4P2UuaW5kZXguYXJyYXk6bnVsbCxzPWUuYXR0cmlidXRlcy5wb3NpdGlvbjtsZXQgcixvLGEsYyxsPTA7Y29uc3QgaD1pLl9yb290cztmb3IobGV0IGY9MCxkPWgubGVuZ3RoO2Y8ZDtmKyspcj1oW2ZdLG89bmV3IFVpbnQzMkFycmF5KHIpLGE9bmV3IFVpbnQxNkFycmF5KHIpLGM9bmV3IEZsb2F0MzJBcnJheShyKSx1KDAsbCksbCs9ci5ieXRlTGVuZ3RoO2Z1bmN0aW9uIHUoZixkLHA9ITEpe2NvbnN0IHk9ZioyO2lmKGFbeSsxNV09PT1Ccyl7Y29uc3QgZz1vW2YrNl0sYj1hW3krMTRdO2xldCB3PTEvMCx4PTEvMCxNPTEvMCxBPS0xLzAsUz0tMS8wLF89LTEvMDtmb3IobGV0IEU9MypnLHo9MyooZytiKTtFPHo7RSsrKXtsZXQgdj1uW0VdO2NvbnN0IEM9cy5nZXRYKHYpLFA9cy5nZXRZKHYpLEY9cy5nZXRaKHYpO0M8dyYmKHc9QyksQz5BJiYoQT1DKSxQPHgmJih4PVApLFA+UyYmKFM9UCksRjxNJiYoTT1GKSxGPl8mJihfPUYpfXJldHVybiBjW2YrMF0hPT13fHxjW2YrMV0hPT14fHxjW2YrMl0hPT1NfHxjW2YrM10hPT1BfHxjW2YrNF0hPT1TfHxjW2YrNV0hPT1fPyhjW2YrMF09dyxjW2YrMV09eCxjW2YrMl09TSxjW2YrM109QSxjW2YrNF09UyxjW2YrNV09XywhMCk6ITF9ZWxzZXtjb25zdCBnPWYrOCxiPW9bZis2XSx3PWcrZCx4PWIrZDtsZXQgTT1wLEE9ITEsUz0hMTt0P018fChBPXQuaGFzKHcpLFM9dC5oYXMoeCksTT0hQSYmIVMpOihBPSEwLFM9ITApO2NvbnN0IF89TXx8QSxFPU18fFM7bGV0IHo9ITE7XyYmKHo9dShnLGQsTSkpO2xldCB2PSExO0UmJih2PXUoYixkLE0pKTtjb25zdCBDPXp8fHY7aWYoQylmb3IobGV0IFA9MDtQPDM7UCsrKXtjb25zdCBGPWcrUCxCPWIrUCxJPWNbRl0saz1jW0YrM10sRD1jW0JdLFU9Y1tCKzNdO2NbZitQXT1JPEQ/STpELGNbZitQKzNdPWs+VT9rOlV9cmV0dXJuIEN9fX1mdW5jdGlvbiBlbihpLHQsZSxuLHMpe2xldCByLG8sYSxjLGwsaDtjb25zdCB1PTEvZS5kaXJlY3Rpb24ueCxmPTEvZS5kaXJlY3Rpb24ueSxkPTEvZS5kaXJlY3Rpb24ueixwPWUub3JpZ2luLngseT1lLm9yaWdpbi55LG09ZS5vcmlnaW4uejtsZXQgZz10W2ldLGI9dFtpKzNdLHc9dFtpKzFdLHg9dFtpKzMrMV0sTT10W2krMl0sQT10W2krMysyXTtyZXR1cm4gdT49MD8ocj0oZy1wKSp1LG89KGItcCkqdSk6KHI9KGItcCkqdSxvPShnLXApKnUpLGY+PTA/KGE9KHcteSkqZixjPSh4LXkpKmYpOihhPSh4LXkpKmYsYz0ody15KSpmKSxyPmN8fGE+b3x8KChhPnJ8fGlzTmFOKHIpKSYmKHI9YSksKGM8b3x8aXNOYU4obykpJiYobz1jKSxkPj0wPyhsPShNLW0pKmQsaD0oQS1tKSpkKToobD0oQS1tKSpkLGg9KE0tbSkqZCkscj5ofHxsPm8pPyExOigobD5yfHxyIT09cikmJihyPWwpLChoPG98fG8hPT1vKSYmKG89aCkscjw9cyYmbz49bil9ZnVuY3Rpb24gTGQoaSx0LGUsbixzLHIsbyxhKXtjb25zdHtnZW9tZXRyeTpjLF9pbmRpcmVjdEJ1ZmZlcjpsfT1pO2ZvcihsZXQgaD1uLHU9bitzO2g8dTtoKyspe2xldCBmPWw/bFtoXTpoO0RzKGMsdCxlLGYscixvLGEpfX1mdW5jdGlvbiBPZChpLHQsZSxuLHMscixvKXtjb25zdHtnZW9tZXRyeTphLF9pbmRpcmVjdEJ1ZmZlcjpjfT1pO2xldCBsPTEvMCxoPW51bGw7Zm9yKGxldCB1PW4sZj1uK3M7dTxmO3UrKyl7bGV0IGQ7ZD1EcyhhLHQsZSxjP2NbdV06dSxudWxsLHIsbyksZCYmZC5kaXN0YW5jZTxsJiYoaD1kLGw9ZC5kaXN0YW5jZSl9cmV0dXJuIGh9ZnVuY3Rpb24gRGQoaSx0LGUsbixzLHIsbyl7Y29uc3R7Z2VvbWV0cnk6YX09ZSx7aW5kZXg6Y309YSxsPWEuYXR0cmlidXRlcy5wb3NpdGlvbjtmb3IobGV0IGg9aSx1PXQraTtoPHU7aCsrKXtsZXQgZjtpZihmPWUucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoaCkseXQobyxmKjMsYyxsKSxvLm5lZWRzVXBkYXRlPSEwLG4obyxmLHMscikpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gJGQoaSx0LGUsbixzLHIsbyl7bnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKSxRbygwLGksZSxuLHMscixvKSxudC5jbGVhckJ1ZmZlcigpfWZ1bmN0aW9uIFFvKGksdCxlLG4scyxyLG8pe2NvbnN0e2Zsb2F0MzJBcnJheTphLHVpbnQxNkFycmF5OmMsdWludDMyQXJyYXk6bH09bnQsaD1pKjI7aWYoa3QoaCxjKSl7Y29uc3QgZj1VdChpLGwpLGQ9S3QoaCxjKTtJZCh0LGUsbixmLGQscyxyLG8pfWVsc2V7Y29uc3QgZj10ZShpKTtlbihmLGEsbixyLG8pJiZRbyhmLHQsZSxuLHMscixvKTtjb25zdCBkPWVlKGksbCk7ZW4oZCxhLG4scixvKSYmUW8oZCx0LGUsbixzLHIsbyl9fWNvbnN0IFZkPVsieCIsInkiLCJ6Il07ZnVuY3Rpb24gVWQoaSx0LGUsbixzLHIpe250LnNldEJ1ZmZlcihpLl9yb290c1t0XSk7Y29uc3Qgbz1LbygwLGksZSxuLHMscik7cmV0dXJuIG50LmNsZWFyQnVmZmVyKCksb31mdW5jdGlvbiBLbyhpLHQsZSxuLHMscil7Y29uc3R7ZmxvYXQzMkFycmF5Om8sdWludDE2QXJyYXk6YSx1aW50MzJBcnJheTpjfT1udDtsZXQgbD1pKjI7aWYoa3QobCxhKSl7Y29uc3QgdT1VdChpLGMpLGY9S3QobCxhKTtyZXR1cm4ga2QodCxlLG4sdSxmLHMscil9ZWxzZXtjb25zdCB1PWRsKGksYyksZj1WZFt1XSxwPW4uZGlyZWN0aW9uW2ZdPj0wO2xldCB5LG07cD8oeT10ZShpKSxtPWVlKGksYykpOih5PWVlKGksYyksbT10ZShpKSk7Y29uc3QgYj1lbih5LG8sbixzLHIpP0tvKHksdCxlLG4scyxyKTpudWxsO2lmKGIpe2NvbnN0IE09Yi5wb2ludFtmXTtpZihwP008PW9bbSt1XTpNPj1vW20rdSszXSlyZXR1cm4gYn1jb25zdCB4PWVuKG0sbyxuLHMscik/S28obSx0LGUsbixzLHIpOm51bGw7cmV0dXJuIGImJng/Yi5kaXN0YW5jZTw9eC5kaXN0YW5jZT9iOng6Ynx8eHx8bnVsbH19Y29uc3QgJHM9bmV3IGd0LFFuPW5ldyBuZSxLbj1uZXcgbmUsUmk9bmV3IHN0LHdsPW5ldyB6dCxWcz1uZXcgenQ7ZnVuY3Rpb24gcWQoaSx0LGUsbil7bnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBzPXRhKDAsaSxlLG4pO3JldHVybiBudC5jbGVhckJ1ZmZlcigpLHN9ZnVuY3Rpb24gdGEoaSx0LGUsbixzPW51bGwpe2NvbnN0e2Zsb2F0MzJBcnJheTpyLHVpbnQxNkFycmF5Om8sdWludDMyQXJyYXk6YX09bnQ7bGV0IGM9aSoyO2lmKHM9PT1udWxsJiYoZS5ib3VuZGluZ0JveHx8ZS5jb21wdXRlQm91bmRpbmdCb3goKSx3bC5zZXQoZS5ib3VuZGluZ0JveC5taW4sZS5ib3VuZGluZ0JveC5tYXgsbikscz13bCksa3QoYyxvKSl7Y29uc3QgaD10Lmdlb21ldHJ5LHU9aC5pbmRleCxmPWguYXR0cmlidXRlcy5wb3NpdGlvbixkPWUuaW5kZXgscD1lLmF0dHJpYnV0ZXMucG9zaXRpb24seT1VdChpLGEpLG09S3QoYyxvKTtpZihSaS5jb3B5KG4pLmludmVydCgpLGUuYm91bmRzVHJlZSlyZXR1cm4gbHQoaSxyLFZzKSxWcy5tYXRyaXguY29weShSaSksVnMubmVlZHNVcGRhdGU9ITAsZS5ib3VuZHNUcmVlLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczpiPT5Wcy5pbnRlcnNlY3RzQm94KGIpLGludGVyc2VjdHNUcmlhbmdsZTpiPT57Yi5hLmFwcGx5TWF0cml4NChuKSxiLmIuYXBwbHlNYXRyaXg0KG4pLGIuYy5hcHBseU1hdHJpeDQobiksYi5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHc9eSozLHg9KG0reSkqMzt3PHg7dys9MylpZih5dChLbix3LHUsZiksS24ubmVlZHNVcGRhdGU9ITAsYi5pbnRlcnNlY3RzVHJpYW5nbGUoS24pKXJldHVybiEwO3JldHVybiExfX0pO2ZvcihsZXQgZz15KjMsYj0obSt5KSozO2c8YjtnKz0zKXt5dChRbixnLHUsZiksUW4uYS5hcHBseU1hdHJpeDQoUmkpLFFuLmIuYXBwbHlNYXRyaXg0KFJpKSxRbi5jLmFwcGx5TWF0cml4NChSaSksUW4ubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCB3PTAseD1kLmNvdW50O3c8eDt3Kz0zKWlmKHl0KEtuLHcsZCxwKSxLbi5uZWVkc1VwZGF0ZT0hMCxRbi5pbnRlcnNlY3RzVHJpYW5nbGUoS24pKXJldHVybiEwfX1lbHNle2NvbnN0IGg9aSs4LHU9YVtpKzZdO3JldHVybiBsdChoLHIsJHMpLCEhKHMuaW50ZXJzZWN0c0JveCgkcykmJnRhKGgsdCxlLG4scyl8fChsdCh1LHIsJHMpLHMuaW50ZXJzZWN0c0JveCgkcykmJnRhKHUsdCxlLG4scykpKX19Y29uc3QgVXM9bmV3IHN0LGVhPW5ldyB6dCxMaT1uZXcgenQsSGQ9bmV3IFQsWGQ9bmV3IFQsR2Q9bmV3IFQsV2Q9bmV3IFQ7ZnVuY3Rpb24gWmQoaSx0LGUsbj17fSxzPXt9LHI9MCxvPTEvMCl7dC5ib3VuZGluZ0JveHx8dC5jb21wdXRlQm91bmRpbmdCb3goKSxlYS5zZXQodC5ib3VuZGluZ0JveC5taW4sdC5ib3VuZGluZ0JveC5tYXgsZSksZWEubmVlZHNVcGRhdGU9ITA7Y29uc3QgYT1pLmdlb21ldHJ5LGM9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9YS5pbmRleCxoPXQuYXR0cmlidXRlcy5wb3NpdGlvbix1PXQuaW5kZXgsZj1pZS5nZXRQcmltaXRpdmUoKSxkPWllLmdldFByaW1pdGl2ZSgpO2xldCBwPUhkLHk9WGQsbT1udWxsLGc9bnVsbDtzJiYobT1HZCxnPVdkKTtsZXQgYj0xLzAsdz1udWxsLHg9bnVsbDtyZXR1cm4gVXMuY29weShlKS5pbnZlcnQoKSxMaS5tYXRyaXguY29weShVcyksaS5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6TT0+ZWEuZGlzdGFuY2VUb0JveChNKSxpbnRlcnNlY3RzQm91bmRzOihNLEEsUyk9PlM8YiYmUzxvPyhBJiYoTGkubWluLmNvcHkoTS5taW4pLExpLm1heC5jb3B5KE0ubWF4KSxMaS5uZWVkc1VwZGF0ZT0hMCksITApOiExLGludGVyc2VjdHNSYW5nZTooTSxBKT0+e2lmKHQuYm91bmRzVHJlZSlyZXR1cm4gdC5ib3VuZHNUcmVlLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpfPT5MaS5kaXN0YW5jZVRvQm94KF8pLGludGVyc2VjdHNCb3VuZHM6KF8sRSx6KT0+ejxiJiZ6PG8saW50ZXJzZWN0c1JhbmdlOihfLEUpPT57Zm9yKGxldCB6PV8sdj1fK0U7ejx2O3orKyl7eXQoZCwzKnosdSxoKSxkLmEuYXBwbHlNYXRyaXg0KGUpLGQuYi5hcHBseU1hdHJpeDQoZSksZC5jLmFwcGx5TWF0cml4NChlKSxkLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgQz1NLFA9TStBO0M8UDtDKyspe3l0KGYsMypDLGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBGPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxtKTtpZihGPGImJih5LmNvcHkocCksZyYmZy5jb3B5KG0pLGI9Rix3PUMseD16KSxGPHIpcmV0dXJuITB9fX19KTt7Y29uc3QgUz1Kbih0KTtmb3IobGV0IF89MCxFPVM7XzxFO18rKyl7eXQoZCwzKl8sdSxoKSxkLmEuYXBwbHlNYXRyaXg0KGUpLGQuYi5hcHBseU1hdHJpeDQoZSksZC5jLmFwcGx5TWF0cml4NChlKSxkLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgej1NLHY9TStBO3o8djt6Kyspe3l0KGYsMyp6LGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBDPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxtKTtpZihDPGImJih5LmNvcHkocCksZyYmZy5jb3B5KG0pLGI9Qyx3PXoseD1fKSxDPHIpcmV0dXJuITB9fX19fSksaWUucmVsZWFzZVByaW1pdGl2ZShmKSxpZS5yZWxlYXNlUHJpbWl0aXZlKGQpLGI9PT0xLzA/bnVsbDoobi5wb2ludD9uLnBvaW50LmNvcHkoeSk6bi5wb2ludD15LmNsb25lKCksbi5kaXN0YW5jZT1iLG4uZmFjZUluZGV4PXcscyYmKHMucG9pbnQ/cy5wb2ludC5jb3B5KGcpOnMucG9pbnQ9Zy5jbG9uZSgpLHMucG9pbnQuYXBwbHlNYXRyaXg0KFVzKSx5LmFwcGx5TWF0cml4NChVcykscy5kaXN0YW5jZT15LnN1YihzLnBvaW50KS5sZW5ndGgoKSxzLmZhY2VJbmRleD14KSxuKX1mdW5jdGlvbiBKZChpLHQ9bnVsbCl7dCYmQXJyYXkuaXNBcnJheSh0KSYmKHQ9bmV3IFNldCh0KSk7Y29uc3QgZT1pLmdlb21ldHJ5LG49ZS5pbmRleD9lLmluZGV4LmFycmF5Om51bGwscz1lLmF0dHJpYnV0ZXMucG9zaXRpb247bGV0IHIsbyxhLGMsbD0wO2NvbnN0IGg9aS5fcm9vdHM7Zm9yKGxldCBmPTAsZD1oLmxlbmd0aDtmPGQ7ZisrKXI9aFtmXSxvPW5ldyBVaW50MzJBcnJheShyKSxhPW5ldyBVaW50MTZBcnJheShyKSxjPW5ldyBGbG9hdDMyQXJyYXkociksdSgwLGwpLGwrPXIuYnl0ZUxlbmd0aDtmdW5jdGlvbiB1KGYsZCxwPSExKXtjb25zdCB5PWYqMjtpZihhW3krMTVdPT09QnMpe2NvbnN0IGc9b1tmKzZdLGI9YVt5KzE0XTtsZXQgdz0xLzAseD0xLzAsTT0xLzAsQT0tMS8wLFM9LTEvMCxfPS0xLzA7Zm9yKGxldCBFPWcsej1nK2I7RTx6O0UrKyl7Y29uc3Qgdj0zKmkucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoRSk7Zm9yKGxldCBDPTA7QzwzO0MrKyl7bGV0IFA9ditDO1A9bj9uW1BdOlA7Y29uc3QgRj1zLmdldFgoUCksQj1zLmdldFkoUCksST1zLmdldFooUCk7Rjx3JiYodz1GKSxGPkEmJihBPUYpLEI8eCYmKHg9QiksQj5TJiYoUz1CKSxJPE0mJihNPUkpLEk+XyYmKF89SSl9fXJldHVybiBjW2YrMF0hPT13fHxjW2YrMV0hPT14fHxjW2YrMl0hPT1NfHxjW2YrM10hPT1BfHxjW2YrNF0hPT1TfHxjW2YrNV0hPT1fPyhjW2YrMF09dyxjW2YrMV09eCxjW2YrMl09TSxjW2YrM109QSxjW2YrNF09UyxjW2YrNV09XywhMCk6ITF9ZWxzZXtjb25zdCBnPWYrOCxiPW9bZis2XSx3PWcrZCx4PWIrZDtsZXQgTT1wLEE9ITEsUz0hMTt0P018fChBPXQuaGFzKHcpLFM9dC5oYXMoeCksTT0hQSYmIVMpOihBPSEwLFM9ITApO2NvbnN0IF89TXx8QSxFPU18fFM7bGV0IHo9ITE7XyYmKHo9dShnLGQsTSkpO2xldCB2PSExO0UmJih2PXUoYixkLE0pKTtjb25zdCBDPXp8fHY7aWYoQylmb3IobGV0IFA9MDtQPDM7UCsrKXtjb25zdCBGPWcrUCxCPWIrUCxJPWNbRl0saz1jW0YrM10sRD1jW0JdLFU9Y1tCKzNdO2NbZitQXT1JPEQ/STpELGNbZitQKzNdPWs+VT9rOlV9cmV0dXJuIEN9fX1mdW5jdGlvbiBZZChpLHQsZSxuLHMscixvKXtudC5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pLG5hKDAsaSxlLG4scyxyLG8pLG50LmNsZWFyQnVmZmVyKCl9ZnVuY3Rpb24gbmEoaSx0LGUsbixzLHIsbyl7Y29uc3R7ZmxvYXQzMkFycmF5OmEsdWludDE2QXJyYXk6Yyx1aW50MzJBcnJheTpsfT1udCxoPWkqMjtpZihrdChoLGMpKXtjb25zdCBmPVV0KGksbCksZD1LdChoLGMpO0xkKHQsZSxuLGYsZCxzLHIsbyl9ZWxzZXtjb25zdCBmPXRlKGkpO2VuKGYsYSxuLHIsbykmJm5hKGYsdCxlLG4scyxyLG8pO2NvbnN0IGQ9ZWUoaSxsKTtlbihkLGEsbixyLG8pJiZuYShkLHQsZSxuLHMscixvKX19Y29uc3QgamQ9WyJ4IiwieSIsInoiXTtmdW5jdGlvbiBRZChpLHQsZSxuLHMscil7bnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBvPWlhKDAsaSxlLG4scyxyKTtyZXR1cm4gbnQuY2xlYXJCdWZmZXIoKSxvfWZ1bmN0aW9uIGlhKGksdCxlLG4scyxyKXtjb25zdHtmbG9hdDMyQXJyYXk6byx1aW50MTZBcnJheTphLHVpbnQzMkFycmF5OmN9PW50O2xldCBsPWkqMjtpZihrdChsLGEpKXtjb25zdCB1PVV0KGksYyksZj1LdChsLGEpO3JldHVybiBPZCh0LGUsbix1LGYscyxyKX1lbHNle2NvbnN0IHU9ZGwoaSxjKSxmPWpkW3VdLHA9bi5kaXJlY3Rpb25bZl0+PTA7bGV0IHksbTtwPyh5PXRlKGkpLG09ZWUoaSxjKSk6KHk9ZWUoaSxjKSxtPXRlKGkpKTtjb25zdCBiPWVuKHksbyxuLHMscik/aWEoeSx0LGUsbixzLHIpOm51bGw7aWYoYil7Y29uc3QgTT1iLnBvaW50W2ZdO2lmKHA/TTw9b1ttK3VdOk0+PW9bbSt1KzNdKXJldHVybiBifWNvbnN0IHg9ZW4obSxvLG4scyxyKT9pYShtLHQsZSxuLHMscik6bnVsbDtyZXR1cm4gYiYmeD9iLmRpc3RhbmNlPD14LmRpc3RhbmNlP2I6eDpifHx4fHxudWxsfX1jb25zdCBxcz1uZXcgZ3QsdGk9bmV3IG5lLGVpPW5ldyBuZSxPaT1uZXcgc3QsYmw9bmV3IHp0LEhzPW5ldyB6dDtmdW5jdGlvbiBLZChpLHQsZSxuKXtudC5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pO2NvbnN0IHM9c2EoMCxpLGUsbik7cmV0dXJuIG50LmNsZWFyQnVmZmVyKCksc31mdW5jdGlvbiBzYShpLHQsZSxuLHM9bnVsbCl7Y29uc3R7ZmxvYXQzMkFycmF5OnIsdWludDE2QXJyYXk6byx1aW50MzJBcnJheTphfT1udDtsZXQgYz1pKjI7aWYocz09PW51bGwmJihlLmJvdW5kaW5nQm94fHxlLmNvbXB1dGVCb3VuZGluZ0JveCgpLGJsLnNldChlLmJvdW5kaW5nQm94Lm1pbixlLmJvdW5kaW5nQm94Lm1heCxuKSxzPWJsKSxrdChjLG8pKXtjb25zdCBoPXQuZ2VvbWV0cnksdT1oLmluZGV4LGY9aC5hdHRyaWJ1dGVzLnBvc2l0aW9uLGQ9ZS5pbmRleCxwPWUuYXR0cmlidXRlcy5wb3NpdGlvbix5PVV0KGksYSksbT1LdChjLG8pO2lmKE9pLmNvcHkobikuaW52ZXJ0KCksZS5ib3VuZHNUcmVlKXJldHVybiBsdChpLHIsSHMpLEhzLm1hdHJpeC5jb3B5KE9pKSxIcy5uZWVkc1VwZGF0ZT0hMCxlLmJvdW5kc1RyZWUuc2hhcGVjYXN0KHtpbnRlcnNlY3RzQm91bmRzOmI9PkhzLmludGVyc2VjdHNCb3goYiksaW50ZXJzZWN0c1RyaWFuZ2xlOmI9PntiLmEuYXBwbHlNYXRyaXg0KG4pLGIuYi5hcHBseU1hdHJpeDQobiksYi5jLmFwcGx5TWF0cml4NChuKSxiLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgdz15LHg9bSt5O3c8eDt3KyspaWYoeXQoZWksMyp0LnJlc29sdmVUcmlhbmdsZUluZGV4KHcpLHUsZiksZWkubmVlZHNVcGRhdGU9ITAsYi5pbnRlcnNlY3RzVHJpYW5nbGUoZWkpKXJldHVybiEwO3JldHVybiExfX0pO2ZvcihsZXQgZz15LGI9bSt5O2c8YjtnKyspe2NvbnN0IHc9dC5yZXNvbHZlVHJpYW5nbGVJbmRleChnKTt5dCh0aSwzKncsdSxmKSx0aS5hLmFwcGx5TWF0cml4NChPaSksdGkuYi5hcHBseU1hdHJpeDQoT2kpLHRpLmMuYXBwbHlNYXRyaXg0KE9pKSx0aS5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHg9MCxNPWQuY291bnQ7eDxNO3grPTMpaWYoeXQoZWkseCxkLHApLGVpLm5lZWRzVXBkYXRlPSEwLHRpLmludGVyc2VjdHNUcmlhbmdsZShlaSkpcmV0dXJuITB9fWVsc2V7Y29uc3QgaD1pKzgsdT1hW2krNl07cmV0dXJuIGx0KGgscixxcyksISEocy5pbnRlcnNlY3RzQm94KHFzKSYmc2EoaCx0LGUsbixzKXx8KGx0KHUscixxcykscy5pbnRlcnNlY3RzQm94KHFzKSYmc2EodSx0LGUsbixzKSkpfX1jb25zdCBYcz1uZXcgc3QscmE9bmV3IHp0LERpPW5ldyB6dCx0MD1uZXcgVCxlMD1uZXcgVCxuMD1uZXcgVCxpMD1uZXcgVDtmdW5jdGlvbiBzMChpLHQsZSxuPXt9LHM9e30scj0wLG89MS8wKXt0LmJvdW5kaW5nQm94fHx0LmNvbXB1dGVCb3VuZGluZ0JveCgpLHJhLnNldCh0LmJvdW5kaW5nQm94Lm1pbix0LmJvdW5kaW5nQm94Lm1heCxlKSxyYS5uZWVkc1VwZGF0ZT0hMDtjb25zdCBhPWkuZ2VvbWV0cnksYz1hLmF0dHJpYnV0ZXMucG9zaXRpb24sbD1hLmluZGV4LGg9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLHU9dC5pbmRleCxmPWllLmdldFByaW1pdGl2ZSgpLGQ9aWUuZ2V0UHJpbWl0aXZlKCk7bGV0IHA9dDAseT1lMCxtPW51bGwsZz1udWxsO3MmJihtPW4wLGc9aTApO2xldCBiPTEvMCx3PW51bGwseD1udWxsO3JldHVybiBYcy5jb3B5KGUpLmludmVydCgpLERpLm1hdHJpeC5jb3B5KFhzKSxpLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpNPT5yYS5kaXN0YW5jZVRvQm94KE0pLGludGVyc2VjdHNCb3VuZHM6KE0sQSxTKT0+UzxiJiZTPG8/KEEmJihEaS5taW4uY29weShNLm1pbiksRGkubWF4LmNvcHkoTS5tYXgpLERpLm5lZWRzVXBkYXRlPSEwKSwhMCk6ITEsaW50ZXJzZWN0c1JhbmdlOihNLEEpPT57aWYodC5ib3VuZHNUcmVlKXtjb25zdCBTPXQuYm91bmRzVHJlZTtyZXR1cm4gUy5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6Xz0+RGkuZGlzdGFuY2VUb0JveChfKSxpbnRlcnNlY3RzQm91bmRzOihfLEUseik9Pno8YiYmejxvLGludGVyc2VjdHNSYW5nZTooXyxFKT0+e2ZvcihsZXQgej1fLHY9XytFO3o8djt6Kyspe2NvbnN0IEM9Uy5yZXNvbHZlVHJpYW5nbGVJbmRleCh6KTt5dChkLDMqQyx1LGgpLGQuYS5hcHBseU1hdHJpeDQoZSksZC5iLmFwcGx5TWF0cml4NChlKSxkLmMuYXBwbHlNYXRyaXg0KGUpLGQubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBQPU0sRj1NK0E7UDxGO1ArKyl7Y29uc3QgQj1pLnJlc29sdmVUcmlhbmdsZUluZGV4KFApO3l0KGYsMypCLGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBJPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxtKTtpZihJPGImJih5LmNvcHkocCksZyYmZy5jb3B5KG0pLGI9SSx3PVAseD16KSxJPHIpcmV0dXJuITB9fX19KX1lbHNle2NvbnN0IFM9Sm4odCk7Zm9yKGxldCBfPTAsRT1TO188RTtfKyspe3l0KGQsMypfLHUsaCksZC5hLmFwcGx5TWF0cml4NChlKSxkLmIuYXBwbHlNYXRyaXg0KGUpLGQuYy5hcHBseU1hdHJpeDQoZSksZC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHo9TSx2PU0rQTt6PHY7eisrKXtjb25zdCBDPWkucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoeik7eXQoZiwzKkMsbCxjKSxmLm5lZWRzVXBkYXRlPSEwO2NvbnN0IFA9Zi5kaXN0YW5jZVRvVHJpYW5nbGUoZCxwLG0pO2lmKFA8YiYmKHkuY29weShwKSxnJiZnLmNvcHkobSksYj1QLHc9eix4PV8pLFA8cilyZXR1cm4hMH19fX19KSxpZS5yZWxlYXNlUHJpbWl0aXZlKGYpLGllLnJlbGVhc2VQcmltaXRpdmUoZCksYj09PTEvMD9udWxsOihuLnBvaW50P24ucG9pbnQuY29weSh5KTpuLnBvaW50PXkuY2xvbmUoKSxuLmRpc3RhbmNlPWIsbi5mYWNlSW5kZXg9dyxzJiYocy5wb2ludD9zLnBvaW50LmNvcHkoZyk6cy5wb2ludD1nLmNsb25lKCkscy5wb2ludC5hcHBseU1hdHJpeDQoWHMpLHkuYXBwbHlNYXRyaXg0KFhzKSxzLmRpc3RhbmNlPXkuc3ViKHMucG9pbnQpLmxlbmd0aCgpLHMuZmFjZUluZGV4PXgpLG4pfWZ1bmN0aW9uIHIwKCl7cmV0dXJuIHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciE9InVuZGVmaW5lZCJ9Y29uc3QgJGk9bmV3IG50LmNvbnN0cnVjdG9yLEdzPW5ldyBudC5jb25zdHJ1Y3Rvcixubj1uZXcgSm8oKCk9Pm5ldyBndCksbmk9bmV3IGd0LGlpPW5ldyBndCxvYT1uZXcgZ3QsYWE9bmV3IGd0O2xldCBjYT0hMTtmdW5jdGlvbiBvMChpLHQsZSxuKXtpZihjYSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IFJlY3Vyc2l2ZSBjYWxscyB0byBidmhjYXN0IG5vdCBzdXBwb3J0ZWQuIik7Y2E9ITA7Y29uc3Qgcz1pLl9yb290cyxyPXQuX3Jvb3RzO2xldCBvLGE9MCxjPTA7Y29uc3QgbD1uZXcgc3QoKS5jb3B5KGUpLmludmVydCgpO2ZvcihsZXQgaD0wLHU9cy5sZW5ndGg7aDx1O2grKyl7JGkuc2V0QnVmZmVyKHNbaF0pLGM9MDtjb25zdCBmPW5uLmdldFByaW1pdGl2ZSgpO2x0KDAsJGkuZmxvYXQzMkFycmF5LGYpLGYuYXBwbHlNYXRyaXg0KGwpO2ZvcihsZXQgZD0wLHA9ci5sZW5ndGg7ZDxwJiYoR3Muc2V0QnVmZmVyKHJbZF0pLG89dWUoMCwwLGUsbCxuLGEsYywwLDAsZiksR3MuY2xlYXJCdWZmZXIoKSxjKz1yW2RdLmxlbmd0aCwhbyk7ZCsrKTtpZihubi5yZWxlYXNlUHJpbWl0aXZlKGYpLCRpLmNsZWFyQnVmZmVyKCksYSs9c1toXS5sZW5ndGgsbylicmVha31yZXR1cm4gY2E9ITEsb31mdW5jdGlvbiB1ZShpLHQsZSxuLHMscj0wLG89MCxhPTAsYz0wLGw9bnVsbCxoPSExKXtsZXQgdSxmO2g/KHU9R3MsZj0kaSk6KHU9JGksZj1Hcyk7Y29uc3QgZD11LmZsb2F0MzJBcnJheSxwPXUudWludDMyQXJyYXkseT11LnVpbnQxNkFycmF5LG09Zi5mbG9hdDMyQXJyYXksZz1mLnVpbnQzMkFycmF5LGI9Zi51aW50MTZBcnJheSx3PWkqMix4PXQqMixNPWt0KHcseSksQT1rdCh4LGIpO2xldCBTPSExO2lmKEEmJk0paD9TPXMoVXQodCxnKSxLdCh0KjIsYiksVXQoaSxwKSxLdChpKjIseSksYyxvK3QsYSxyK2kpOlM9cyhVdChpLHApLEt0KGkqMix5KSxVdCh0LGcpLEt0KHQqMixiKSxhLHIraSxjLG8rdCk7ZWxzZSBpZihBKXtjb25zdCBfPW5uLmdldFByaW1pdGl2ZSgpO2x0KHQsbSxfKSxfLmFwcGx5TWF0cml4NChlKTtjb25zdCBFPXRlKGkpLHo9ZWUoaSxwKTtsdChFLGQsbmkpLGx0KHosZCxpaSk7Y29uc3Qgdj1fLmludGVyc2VjdHNCb3gobmkpLEM9Xy5pbnRlcnNlY3RzQm94KGlpKTtTPXYmJnVlKHQsRSxuLGUscyxvLHIsYyxhKzEsXywhaCl8fEMmJnVlKHQseixuLGUscyxvLHIsYyxhKzEsXywhaCksbm4ucmVsZWFzZVByaW1pdGl2ZShfKX1lbHNle2NvbnN0IF89dGUodCksRT1lZSh0LGcpO2x0KF8sbSxvYSksbHQoRSxtLGFhKTtjb25zdCB6PWwuaW50ZXJzZWN0c0JveChvYSksdj1sLmludGVyc2VjdHNCb3goYWEpO2lmKHomJnYpUz11ZShpLF8sZSxuLHMscixvLGEsYysxLGwsaCl8fHVlKGksRSxlLG4scyxyLG8sYSxjKzEsbCxoKTtlbHNlIGlmKHopaWYoTSlTPXVlKGksXyxlLG4scyxyLG8sYSxjKzEsbCxoKTtlbHNle2NvbnN0IEM9bm4uZ2V0UHJpbWl0aXZlKCk7Qy5jb3B5KG9hKS5hcHBseU1hdHJpeDQoZSk7Y29uc3QgUD10ZShpKSxGPWVlKGkscCk7bHQoUCxkLG5pKSxsdChGLGQsaWkpO2NvbnN0IEI9Qy5pbnRlcnNlY3RzQm94KG5pKSxJPUMuaW50ZXJzZWN0c0JveChpaSk7Uz1CJiZ1ZShfLFAsbixlLHMsbyxyLGMsYSsxLEMsIWgpfHxJJiZ1ZShfLEYsbixlLHMsbyxyLGMsYSsxLEMsIWgpLG5uLnJlbGVhc2VQcmltaXRpdmUoQyl9ZWxzZSBpZih2KWlmKE0pUz11ZShpLEUsZSxuLHMscixvLGEsYysxLGwsaCk7ZWxzZXtjb25zdCBDPW5uLmdldFByaW1pdGl2ZSgpO0MuY29weShhYSkuYXBwbHlNYXRyaXg0KGUpO2NvbnN0IFA9dGUoaSksRj1lZShpLHApO2x0KFAsZCxuaSksbHQoRixkLGlpKTtjb25zdCBCPUMuaW50ZXJzZWN0c0JveChuaSksST1DLmludGVyc2VjdHNCb3goaWkpO1M9QiYmdWUoRSxQLG4sZSxzLG8scixjLGErMSxDLCFoKXx8SSYmdWUoRSxGLG4sZSxzLG8scixjLGErMSxDLCFoKSxubi5yZWxlYXNlUHJpbWl0aXZlKEMpfX1yZXR1cm4gU31jb25zdCBXcz1uZXcgenQsTWw9bmV3IGd0LGEwPXtzdHJhdGVneTpybCxtYXhEZXB0aDo0MCxtYXhMZWFmVHJpczoxMCx1c2VTaGFyZWRBcnJheUJ1ZmZlcjohMSxzZXRCb3VuZGluZ0JveDohMCxvblByb2dyZXNzOm51bGwsaW5kaXJlY3Q6ITEsdmVyYm9zZTohMCxyYW5nZTpudWxsfTtjbGFzcyBsYXtzdGF0aWMgc2VyaWFsaXplKHQsZT17fSl7ZT1GdCh7Y2xvbmVCdWZmZXJzOiEwfSxlKTtjb25zdCBuPXQuZ2VvbWV0cnkscz10Ll9yb290cyxyPXQuX2luZGlyZWN0QnVmZmVyLG89bi5nZXRJbmRleCgpO2xldCBhO3JldHVybiBlLmNsb25lQnVmZmVycz9hPXtyb290czpzLm1hcChjPT5jLnNsaWNlKCkpLGluZGV4Om8/by5hcnJheS5zbGljZSgpOm51bGwsaW5kaXJlY3RCdWZmZXI6cj9yLnNsaWNlKCk6bnVsbH06YT17cm9vdHM6cyxpbmRleDpvP28uYXJyYXk6bnVsbCxpbmRpcmVjdEJ1ZmZlcjpyfSxhfXN0YXRpYyBkZXNlcmlhbGl6ZSh0LGUsbj17fSl7bj1GdCh7c2V0SW5kZXg6ITAsaW5kaXJlY3Q6ISF0LmluZGlyZWN0QnVmZmVyfSxuKTtjb25zdHtpbmRleDpzLHJvb3RzOnIsaW5kaXJlY3RCdWZmZXI6b309dCxhPW5ldyBsYShlLFdlKEZ0KHt9LG4pLHtbVW9dOiEwfSkpO2lmKGEuX3Jvb3RzPXIsYS5faW5kaXJlY3RCdWZmZXI9b3x8bnVsbCxuLnNldEluZGV4KXtjb25zdCBjPWUuZ2V0SW5kZXgoKTtpZihjPT09bnVsbCl7Y29uc3QgbD1uZXcgeHQodC5pbmRleCwxLCExKTtlLnNldEluZGV4KGwpfWVsc2UgYy5hcnJheSE9PXMmJihjLmFycmF5LnNldChzKSxjLm5lZWRzVXBkYXRlPSEwKX1yZXR1cm4gYX1nZXQgaW5kaXJlY3QoKXtyZXR1cm4hIXRoaXMuX2luZGlyZWN0QnVmZmVyfWNvbnN0cnVjdG9yKHQsZT17fSl7aWYodC5pc0J1ZmZlckdlb21ldHJ5KXtpZih0LmluZGV4JiZ0LmluZGV4LmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgaW5kZXggYXR0cmlidXRlLiIpfWVsc2UgdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBPbmx5IEJ1ZmZlckdlb21ldHJpZXMgYXJlIHN1cHBvcnRlZC4iKTtpZihlPU9iamVjdC5hc3NpZ24oV2UoRnQoe30sYTApLHtbVW9dOiExfSksZSksZS51c2VTaGFyZWRBcnJheUJ1ZmZlciYmIXIwKCkpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYXZhaWxhYmxlLiIpO3RoaXMuZ2VvbWV0cnk9dCx0aGlzLl9yb290cz1udWxsLHRoaXMuX2luZGlyZWN0QnVmZmVyPW51bGwsZVtVb118fChBZCh0aGlzLGUpLCF0LmJvdW5kaW5nQm94JiZlLnNldEJvdW5kaW5nQm94JiYodC5ib3VuZGluZ0JveD10aGlzLmdldEJvdW5kaW5nQm94KG5ldyBndCkpKSx0aGlzLnJlc29sdmVUcmlhbmdsZUluZGV4PWUuaW5kaXJlY3Q/bj0+dGhpcy5faW5kaXJlY3RCdWZmZXJbbl06bj0+bn1yZWZpdCh0PW51bGwpe3JldHVybih0aGlzLmluZGlyZWN0P0pkOlJkKSh0aGlzLHQpfXRyYXZlcnNlKHQsZT0wKXtjb25zdCBuPXRoaXMuX3Jvb3RzW2VdLHM9bmV3IFVpbnQzMkFycmF5KG4pLHI9bmV3IFVpbnQxNkFycmF5KG4pO28oMCk7ZnVuY3Rpb24gbyhhLGM9MCl7Y29uc3QgbD1hKjIsaD1yW2wrMTVdPT09QnM7aWYoaCl7Y29uc3QgdT1zW2ErNl0sZj1yW2wrMTRdO3QoYyxoLG5ldyBGbG9hdDMyQXJyYXkobixhKjQsNiksdSxmKX1lbHNle2NvbnN0IHU9YStCaS80LGY9c1thKzZdLGQ9c1thKzddO3QoYyxoLG5ldyBGbG9hdDMyQXJyYXkobixhKjQsNiksZCl8fChvKHUsYysxKSxvKGYsYysxKSl9fX1yYXljYXN0KHQsZT0wLG49MCxzPTEvMCl7Y29uc3Qgcj10aGlzLl9yb290cyxvPXRoaXMuZ2VvbWV0cnksYT1bXSxjPWUuaXNNYXRlcmlhbCxsPUFycmF5LmlzQXJyYXkoZSksaD1vLmdyb3Vwcyx1PWM/ZS5zaWRlOmUsZj10aGlzLmluZGlyZWN0P1lkOiRkO2ZvcihsZXQgZD0wLHA9ci5sZW5ndGg7ZDxwO2QrKyl7Y29uc3QgeT1sP2VbaFtkXS5tYXRlcmlhbEluZGV4XS5zaWRlOnUsbT1hLmxlbmd0aDtpZihmKHRoaXMsZCx5LHQsYSxuLHMpLGwpe2NvbnN0IGc9aFtkXS5tYXRlcmlhbEluZGV4O2ZvcihsZXQgYj1tLHc9YS5sZW5ndGg7Yjx3O2IrKylhW2JdLmZhY2UubWF0ZXJpYWxJbmRleD1nfX1yZXR1cm4gYX1yYXljYXN0Rmlyc3QodCxlPTAsbj0wLHM9MS8wKXtjb25zdCByPXRoaXMuX3Jvb3RzLG89dGhpcy5nZW9tZXRyeSxhPWUuaXNNYXRlcmlhbCxjPUFycmF5LmlzQXJyYXkoZSk7bGV0IGw9bnVsbDtjb25zdCBoPW8uZ3JvdXBzLHU9YT9lLnNpZGU6ZSxmPXRoaXMuaW5kaXJlY3Q/UWQ6VWQ7Zm9yKGxldCBkPTAscD1yLmxlbmd0aDtkPHA7ZCsrKXtjb25zdCB5PWM/ZVtoW2RdLm1hdGVyaWFsSW5kZXhdLnNpZGU6dSxtPWYodGhpcyxkLHksdCxuLHMpO20hPW51bGwmJihsPT1udWxsfHxtLmRpc3RhbmNlPGwuZGlzdGFuY2UpJiYobD1tLGMmJihtLmZhY2UubWF0ZXJpYWxJbmRleD1oW2RdLm1hdGVyaWFsSW5kZXgpKX1yZXR1cm4gbH1pbnRlcnNlY3RzR2VvbWV0cnkodCxlKXtsZXQgbj0hMTtjb25zdCBzPXRoaXMuX3Jvb3RzLHI9dGhpcy5pbmRpcmVjdD9LZDpxZDtmb3IobGV0IG89MCxhPXMubGVuZ3RoO288YSYmKG49cih0aGlzLG8sdCxlKSwhbik7bysrKTtyZXR1cm4gbn1zaGFwZWNhc3QodCl7Y29uc3QgZT1pZS5nZXRQcmltaXRpdmUoKSxuPXRoaXMuaW5kaXJlY3Q/RGQ6TmQ7bGV0e2JvdW5kc1RyYXZlcnNlT3JkZXI6cyxpbnRlcnNlY3RzQm91bmRzOnIsaW50ZXJzZWN0c1JhbmdlOm8saW50ZXJzZWN0c1RyaWFuZ2xlOmF9PXQ7aWYobyYmYSl7Y29uc3QgdT1vO289KGYsZCxwLHksbSk9PnUoZixkLHAseSxtKT8hMDpuKGYsZCx0aGlzLGEscCx5LGUpfWVsc2Ugb3x8KGE/bz0odSxmLGQscCk9Pm4odSxmLHRoaXMsYSxkLHAsZSk6bz0odSxmLGQpPT5kKTtsZXQgYz0hMSxsPTA7Y29uc3QgaD10aGlzLl9yb290cztmb3IobGV0IHU9MCxmPWgubGVuZ3RoO3U8Zjt1Kyspe2NvbnN0IGQ9aFt1XTtpZihjPUVkKHRoaXMsdSxyLG8scyxsKSxjKWJyZWFrO2wrPWQuYnl0ZUxlbmd0aH1yZXR1cm4gaWUucmVsZWFzZVByaW1pdGl2ZShlKSxjfWJ2aGNhc3QodCxlLG4pe2xldHtpbnRlcnNlY3RzUmFuZ2VzOnMsaW50ZXJzZWN0c1RyaWFuZ2xlczpyfT1uO2NvbnN0IG89aWUuZ2V0UHJpbWl0aXZlKCksYT10aGlzLmdlb21ldHJ5LmluZGV4LGM9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9dGhpcy5pbmRpcmVjdD9wPT57Y29uc3QgeT10aGlzLnJlc29sdmVUcmlhbmdsZUluZGV4KHApO3l0KG8seSozLGEsYyl9OnA9Pnt5dChvLHAqMyxhLGMpfSxoPWllLmdldFByaW1pdGl2ZSgpLHU9dC5nZW9tZXRyeS5pbmRleCxmPXQuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixkPXQuaW5kaXJlY3Q/cD0+e2NvbnN0IHk9dC5yZXNvbHZlVHJpYW5nbGVJbmRleChwKTt5dChoLHkqMyx1LGYpfTpwPT57eXQoaCxwKjMsdSxmKX07aWYocil7Y29uc3QgcD0oeSxtLGcsYix3LHgsTSxBKT0+e2ZvcihsZXQgUz1nLF89ZytiO1M8XztTKyspe2QoUyksaC5hLmFwcGx5TWF0cml4NChlKSxoLmIuYXBwbHlNYXRyaXg0KGUpLGguYy5hcHBseU1hdHJpeDQoZSksaC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IEU9eSx6PXkrbTtFPHo7RSsrKWlmKGwoRSksby5uZWVkc1VwZGF0ZT0hMCxyKG8saCxFLFMsdyx4LE0sQSkpcmV0dXJuITB9cmV0dXJuITF9O2lmKHMpe2NvbnN0IHk9cztzPWZ1bmN0aW9uKG0sZyxiLHcseCxNLEEsUyl7cmV0dXJuIHkobSxnLGIsdyx4LE0sQSxTKT8hMDpwKG0sZyxiLHcseCxNLEEsUyl9fWVsc2Ugcz1wfXJldHVybiBvMCh0aGlzLHQsZSxzKX1pbnRlcnNlY3RzQm94KHQsZSl7cmV0dXJuIFdzLnNldCh0Lm1pbix0Lm1heCxlKSxXcy5uZWVkc1VwZGF0ZT0hMCx0aGlzLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczpuPT5Xcy5pbnRlcnNlY3RzQm94KG4pLGludGVyc2VjdHNUcmlhbmdsZTpuPT5Xcy5pbnRlcnNlY3RzVHJpYW5nbGUobil9KX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0aGlzLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczplPT50LmludGVyc2VjdHNCb3goZSksaW50ZXJzZWN0c1RyaWFuZ2xlOmU9PmUuaW50ZXJzZWN0c1NwaGVyZSh0KX0pfWNsb3Nlc3RQb2ludFRvR2VvbWV0cnkodCxlLG49e30scz17fSxyPTAsbz0xLzApe3JldHVybih0aGlzLmluZGlyZWN0P3MwOlpkKSh0aGlzLHQsZSxuLHMscixvKX1jbG9zZXN0UG9pbnRUb1BvaW50KHQsZT17fSxuPTAscz0xLzApe3JldHVybiBQZCh0aGlzLHQsZSxuLHMpfWdldEJvdW5kaW5nQm94KHQpe3JldHVybiB0Lm1ha2VFbXB0eSgpLHRoaXMuX3Jvb3RzLmZvckVhY2gobj0+e2x0KDAsbmV3IEZsb2F0MzJBcnJheShuKSxNbCksdC51bmlvbihNbCl9KSx0fX1jb25zdCBBbD0xZS02LGMwPUFsKi41LFNsPU1hdGgucG93KDEwLC1NYXRoLmxvZzEwKEFsKSksbDA9YzAqU2w7ZnVuY3Rpb24gd2UoaSl7cmV0dXJufn4oaSpTbCtsMCl9ZnVuY3Rpb24gaDAoaSl7cmV0dXJuYCR7d2UoaS54KX0sJHt3ZShpLnkpfWB9ZnVuY3Rpb24gX2woaSl7cmV0dXJuYCR7d2UoaS54KX0sJHt3ZShpLnkpfSwke3dlKGkueil9YH1mdW5jdGlvbiB1MChpKXtyZXR1cm5gJHt3ZShpLngpfSwke3dlKGkueSl9LCR7d2UoaS56KX0sJHt3ZShpLncpfWB9ZnVuY3Rpb24gZjAoaSx0LGUpe2UuZGlyZWN0aW9uLnN1YlZlY3RvcnModCxpKS5ub3JtYWxpemUoKTtjb25zdCBuPWkuZG90KGUuZGlyZWN0aW9uKTtyZXR1cm4gZS5vcmlnaW4uY29weShpKS5hZGRTY2FsZWRWZWN0b3IoZS5kaXJlY3Rpb24sLW4pLGV9ZnVuY3Rpb24gdmwoKXtyZXR1cm4gdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIn1mdW5jdGlvbiBkMChpKXtpZihpLmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKXJldHVybiBpO2NvbnN0IHQ9aS5jb25zdHJ1Y3RvcixlPWkuYnVmZmVyLG49bmV3IFNoYXJlZEFycmF5QnVmZmVyKGUuYnl0ZUxlbmd0aCkscz1uZXcgVWludDhBcnJheShlKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkobikuc2V0KHMsMCksbmV3IHQobil9ZnVuY3Rpb24gcDAoaSx0PUFycmF5QnVmZmVyKXtyZXR1cm4gaT42NTUzNT9uZXcgVWludDMyQXJyYXkobmV3IHQoNCppKSk6bmV3IFVpbnQxNkFycmF5KG5ldyB0KDIqaSkpfWZ1bmN0aW9uIHkwKGksdCl7aWYoIWkuaW5kZXgpe2NvbnN0IGU9aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50LG49dC51c2VTaGFyZWRBcnJheUJ1ZmZlcj9TaGFyZWRBcnJheUJ1ZmZlcjpBcnJheUJ1ZmZlcixzPXAwKGUsbik7aS5zZXRJbmRleChuZXcgeHQocywxKSk7Zm9yKGxldCByPTA7cjxlO3IrKylzW3JdPXJ9fWZ1bmN0aW9uIG0wKGkpe3JldHVybiBpLmluZGV4P2kuaW5kZXguY291bnQ6aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50fWZ1bmN0aW9uIGhhKGkpe3JldHVybiBtMChpKS8zfWNvbnN0IGcwPTFlLTgseDA9bmV3IFQ7ZnVuY3Rpb24gdzAoaSl7cmV0dXJufn4oaS8zKX1mdW5jdGlvbiBiMChpKXtyZXR1cm4gaSUzfWZ1bmN0aW9uIHpsKGksdCl7cmV0dXJuIGkuc3RhcnQtdC5zdGFydH1mdW5jdGlvbiBUbChpLHQpe3JldHVybiB4MC5zdWJWZWN0b3JzKHQsaS5vcmlnaW4pLmRvdChpLmRpcmVjdGlvbil9ZnVuY3Rpb24gTTAoaSx0LGUsbj1nMCl7aS5zb3J0KHpsKSx0LnNvcnQoemwpO2ZvcihsZXQgYT0wO2E8aS5sZW5ndGg7YSsrKXtjb25zdCBjPWlbYV07Zm9yKGxldCBsPTA7bDx0Lmxlbmd0aDtsKyspe2NvbnN0IGg9dFtsXTtpZighKGguc3RhcnQ+Yy5lbmQpKXtpZihjLmVuZDxoLnN0YXJ0fHxoLmVuZDxjLnN0YXJ0KWNvbnRpbnVlO2lmKGMuc3RhcnQ8PWguc3RhcnQmJmMuZW5kPj1oLmVuZClyKGguZW5kLGMuZW5kKXx8aS5zcGxpY2UoYSsxLDAse3N0YXJ0OmguZW5kLGVuZDpjLmVuZCxpbmRleDpjLmluZGV4fSksYy5lbmQ9aC5zdGFydCxoLnN0YXJ0PTAsaC5lbmQ9MDtlbHNlIGlmKGMuc3RhcnQ+PWguc3RhcnQmJmMuZW5kPD1oLmVuZClyKGMuZW5kLGguZW5kKXx8dC5zcGxpY2UobCsxLDAse3N0YXJ0OmMuZW5kLGVuZDpoLmVuZCxpbmRleDpoLmluZGV4fSksaC5lbmQ9Yy5zdGFydCxjLnN0YXJ0PTAsYy5lbmQ9MDtlbHNlIGlmKGMuc3RhcnQ8PWguc3RhcnQmJmMuZW5kPD1oLmVuZCl7Y29uc3QgdT1jLmVuZDtjLmVuZD1oLnN0YXJ0LGguc3RhcnQ9dX1lbHNlIGlmKGMuc3RhcnQ+PWguc3RhcnQmJmMuZW5kPj1oLmVuZCl7Y29uc3QgdT1oLmVuZDtoLmVuZD1jLnN0YXJ0LGMuc3RhcnQ9dX1lbHNlIHRocm93IG5ldyBFcnJvcn1pZihlLmhhcyhjLmluZGV4KXx8ZS5zZXQoYy5pbmRleCxbXSksZS5oYXMoaC5pbmRleCl8fGUuc2V0KGguaW5kZXgsW10pLGUuZ2V0KGMuaW5kZXgpLnB1c2goaC5pbmRleCksZS5nZXQoaC5pbmRleCkucHVzaChjLmluZGV4KSxvKGgpJiYodC5zcGxpY2UobCwxKSxsLS0pLG8oYykpe2kuc3BsaWNlKGEsMSksYS0tO2JyZWFrfX19cyhpKSxzKHQpO2Z1bmN0aW9uIHMoYSl7Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspbyhhW2NdKSYmKGEuc3BsaWNlKGMsMSksYy0tKX1mdW5jdGlvbiByKGEsYyl7cmV0dXJuIE1hdGguYWJzKGMtYSk8bn1mdW5jdGlvbiBvKGEpe3JldHVybiBNYXRoLmFicyhhLmVuZC1hLnN0YXJ0KTxufX1jb25zdCBFbD0xZS01LFBsPTFlLTQ7Y2xhc3MgQTB7Y29uc3RydWN0b3IoKXt0aGlzLl9yYXlzPVtdfWFkZFJheSh0KXt0aGlzLl9yYXlzLnB1c2godCl9ZmluZENsb3Nlc3RSYXkodCl7Y29uc3QgZT10aGlzLl9yYXlzLG49dC5jbG9uZSgpO24uZGlyZWN0aW9uLm11bHRpcGx5U2NhbGFyKC0xKTtsZXQgcz0xLzAscj1udWxsO2ZvcihsZXQgYz0wLGw9ZS5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1lW2NdO2lmKG8oaCx0KSYmbyhoLG4pKWNvbnRpbnVlO2NvbnN0IHU9YShoLHQpLGY9YShoLG4pLGQ9TWF0aC5taW4odSxmKTtkPHMmJihzPWQscj1oKX1yZXR1cm4gcjtmdW5jdGlvbiBvKGMsbCl7Y29uc3QgaD1jLm9yaWdpbi5kaXN0YW5jZVRvKGwub3JpZ2luKT5FbDtyZXR1cm4gYy5kaXJlY3Rpb24uYW5nbGVUbyhsLmRpcmVjdGlvbik+UGx8fGh9ZnVuY3Rpb24gYShjLGwpe2NvbnN0IGg9Yy5vcmlnaW4uZGlzdGFuY2VUbyhsLm9yaWdpbiksdT1jLmRpcmVjdGlvbi5hbmdsZVRvKGwuZGlyZWN0aW9uKTtyZXR1cm4gaC9FbCt1L1BsfX19Y29uc3QgdWE9bmV3IFQsZmE9bmV3IFQsWnM9bmV3IHlvO2Z1bmN0aW9uIFMwKGksdCxlKXtjb25zdCBuPWkuYXR0cmlidXRlcyxzPWkuaW5kZXgscj1uLnBvc2l0aW9uLG89bmV3IE1hcCxhPW5ldyBNYXAsYz1BcnJheS5mcm9tKHQpLGw9bmV3IEEwO2ZvcihsZXQgaD0wLHU9Yy5sZW5ndGg7aDx1O2grKyl7Y29uc3QgZj1jW2hdLGQ9dzAoZikscD1iMChmKTtsZXQgeT0zKmQrcCxtPTMqZCsocCsxKSUzO3MmJih5PXMuZ2V0WCh5KSxtPXMuZ2V0WChtKSksdWEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLHkpLGZhLmZyb21CdWZmZXJBdHRyaWJ1dGUocixtKSxmMCh1YSxmYSxacyk7bGV0IGcsYj1sLmZpbmRDbG9zZXN0UmF5KFpzKTtiPT09bnVsbCYmKGI9WnMuY2xvbmUoKSxsLmFkZFJheShiKSksYS5oYXMoYil8fGEuc2V0KGIse2ZvcndhcmQ6W10scmV2ZXJzZTpbXSxyYXk6Yn0pLGc9YS5nZXQoYik7bGV0IHc9VGwoYix1YSkseD1UbChiLGZhKTt3PngmJihbdyx4XT1beCx3XSksWnMuZGlyZWN0aW9uLmRvdChiLmRpcmVjdGlvbik8MD9nLnJldmVyc2UucHVzaCh7c3RhcnQ6dyxlbmQ6eCxpbmRleDpmfSk6Zy5mb3J3YXJkLnB1c2goe3N0YXJ0OncsZW5kOngsaW5kZXg6Zn0pfXJldHVybiBhLmZvckVhY2goKHtmb3J3YXJkOmgscmV2ZXJzZTp1fSxmKT0+e00wKGgsdSxvLGUpLGgubGVuZ3RoPT09MCYmdS5sZW5ndGg9PT0wJiZhLmRlbGV0ZShmKX0pLHtkaXNqb2ludENvbm5lY3Rpdml0eU1hcDpvLGZyYWdtZW50TWFwOmF9fWNvbnN0IF8wPW5ldyBSLGRhPW5ldyBULHYwPW5ldyBZdCxwYT1bIiIsIiIsIiJdO2NsYXNzIHowe2NvbnN0cnVjdG9yKHQ9bnVsbCl7dGhpcy5kYXRhPW51bGwsdGhpcy5kaXNqb2ludENvbm5lY3Rpb25zPW51bGwsdGhpcy51bm1hdGNoZWREaXNqb2ludEVkZ2VzPW51bGwsdGhpcy51bm1hdGNoZWRFZGdlcz0tMSx0aGlzLm1hdGNoZWRFZGdlcz0tMSx0aGlzLnVzZURyYXdSYW5nZT0hMCx0aGlzLnVzZUFsbEF0dHJpYnV0ZXM9ITEsdGhpcy5tYXRjaERpc2pvaW50RWRnZXM9ITEsdGhpcy5kZWdlbmVyYXRlRXBzaWxvbj0xZS04LHQmJnRoaXMudXBkYXRlRnJvbSh0KX1nZXRTaWJsaW5nVHJpYW5nbGVJbmRleCh0LGUpe2NvbnN0IG49dGhpcy5kYXRhW3QqMytlXTtyZXR1cm4gbj09PS0xPy0xOn5+KG4vMyl9Z2V0U2libGluZ0VkZ2VJbmRleCh0LGUpe2NvbnN0IG49dGhpcy5kYXRhW3QqMytlXTtyZXR1cm4gbj09PS0xPy0xOm4lM31nZXREaXNqb2ludFNpYmxpbmdUcmlhbmdsZUluZGljZXModCxlKXtjb25zdCBuPXQqMytlLHM9dGhpcy5kaXNqb2ludENvbm5lY3Rpb25zLmdldChuKTtyZXR1cm4gcz9zLm1hcChyPT5+fihyLzMpKTpbXX1nZXREaXNqb2ludFNpYmxpbmdFZGdlSW5kaWNlcyh0LGUpe2NvbnN0IG49dCozK2Uscz10aGlzLmRpc2pvaW50Q29ubmVjdGlvbnMuZ2V0KG4pO3JldHVybiBzP3MubWFwKHI9PnIlMyk6W119aXNGdWxseUNvbm5lY3RlZCgpe3JldHVybiB0aGlzLnVubWF0Y2hlZEVkZ2VzPT09MH11cGRhdGVGcm9tKHQpe2NvbnN0e3VzZUFsbEF0dHJpYnV0ZXM6ZSx1c2VEcmF3UmFuZ2U6bixtYXRjaERpc2pvaW50RWRnZXM6cyxkZWdlbmVyYXRlRXBzaWxvbjpyfT10aGlzLG89ZT93OmIsYT1uZXcgTWFwLHthdHRyaWJ1dGVzOmN9PXQsbD1lP09iamVjdC5rZXlzKGMpOm51bGwsaD10LmluZGV4LHU9Yy5wb3NpdGlvbjtsZXQgZj1oYSh0KTtjb25zdCBkPWY7bGV0IHA9MDtuJiYocD10LmRyYXdSYW5nZS5zdGFydCx0LmRyYXdSYW5nZS5jb3VudCE9PTEvMCYmKGY9fn4odC5kcmF3UmFuZ2UuY291bnQvMykpKTtsZXQgeT10aGlzLmRhdGE7KCF5fHx5Lmxlbmd0aDwzKmQpJiYoeT1uZXcgSW50MzJBcnJheSgzKmQpKSx5LmZpbGwoLTEpO2xldCBtPTAsZz1uZXcgU2V0O2ZvcihsZXQgeD1wLE09ZiozK3A7eDxNO3grPTMpe2NvbnN0IEE9eDtmb3IobGV0IFM9MDtTPDM7UysrKXtsZXQgXz1BK1M7aCYmKF89aC5nZXRYKF8pKSxwYVtTXT1vKF8pfWZvcihsZXQgUz0wO1M8MztTKyspe2NvbnN0IF89KFMrMSklMyxFPXBhW1NdLHo9cGFbX10sdj1gJHt6fV8ke0V9YDtpZihhLmhhcyh2KSl7Y29uc3QgQz1BK1MsUD1hLmdldCh2KTt5W0NdPVAseVtQXT1DLGEuZGVsZXRlKHYpLG0rPTIsZy5kZWxldGUoUCl9ZWxzZXtjb25zdCBDPWAke0V9XyR7en1gLFA9QStTO2Euc2V0KEMsUCksZy5hZGQoUCl9fX1pZihzKXtjb25zdHtmcmFnbWVudE1hcDp4LGRpc2pvaW50Q29ubmVjdGl2aXR5TWFwOk19PVMwKHQsZyxyKTtnLmNsZWFyKCkseC5mb3JFYWNoKCh7Zm9yd2FyZDpBLHJldmVyc2U6U30pPT57QS5mb3JFYWNoKCh7aW5kZXg6X30pPT5nLmFkZChfKSksUy5mb3JFYWNoKCh7aW5kZXg6X30pPT5nLmFkZChfKSl9KSx0aGlzLnVubWF0Y2hlZERpc2pvaW50RWRnZXM9eCx0aGlzLmRpc2pvaW50Q29ubmVjdGlvbnM9TSxtPWYqMy1nLnNpemV9dGhpcy5tYXRjaGVkRWRnZXM9bSx0aGlzLnVubWF0Y2hlZEVkZ2VzPWcuc2l6ZSx0aGlzLmRhdGE9eTtmdW5jdGlvbiBiKHgpe3JldHVybiBkYS5mcm9tQnVmZmVyQXR0cmlidXRlKHUseCksX2woZGEpfWZ1bmN0aW9uIHcoeCl7bGV0IE09IiI7Zm9yKGxldCBBPTAsUz1sLmxlbmd0aDtBPFM7QSsrKXtjb25zdCBfPWNbbFtBXV07bGV0IEU7c3dpdGNoKF8uaXRlbVNpemUpe2Nhc2UgMTpFPXdlKF8uZ2V0WCh4KSk7YnJlYWs7Y2FzZSAyOkU9aDAoXzAuZnJvbUJ1ZmZlckF0dHJpYnV0ZShfLHgpKTticmVhaztjYXNlIDM6RT1fbChkYS5mcm9tQnVmZmVyQXR0cmlidXRlKF8seCkpO2JyZWFrO2Nhc2UgNDpFPXUwKHYwLmZyb21CdWZmZXJBdHRyaWJ1dGUoXyx4KSk7YnJlYWt9TSE9PSIiJiYoTSs9InwiKSxNKz1FfXJldHVybiBNfX19Y2xhc3MgSnMgZXh0ZW5kcyBBZntjb25zdHJ1Y3RvciguLi50KXtzdXBlciguLi50KSx0aGlzLmlzQnJ1c2g9ITAsdGhpcy5fcHJldmlvdXNNYXRyaXg9bmV3IHN0LHRoaXMuX3ByZXZpb3VzTWF0cml4LmVsZW1lbnRzLmZpbGwoMCl9bWFya1VwZGF0ZWQoKXt0aGlzLl9wcmV2aW91c01hdHJpeC5jb3B5KHRoaXMubWF0cml4KX1pc0RpcnR5KCl7Y29uc3R7bWF0cml4OnQsX3ByZXZpb3VzTWF0cml4OmV9PXRoaXMsbj10LmVsZW1lbnRzLHM9ZS5lbGVtZW50cztmb3IobGV0IHI9MDtyPDE2O3IrKylpZihuW3JdIT09c1tyXSlyZXR1cm4hMDtyZXR1cm4hMX1wcmVwYXJlR2VvbWV0cnkoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnksZT10LmF0dHJpYnV0ZXMsbj12bCgpO2lmKG4pZm9yKGNvbnN0IHMgaW4gZSl7Y29uc3Qgcj1lW3NdO2lmKHIuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSl0aHJvdyBuZXcgRXJyb3IoIkJydXNoOiBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7ci5hcnJheT1kMChyLmFycmF5KX1pZih0LmJvdW5kc1RyZWV8fCh5MCh0LHt1c2VTaGFyZWRBcnJheUJ1ZmZlcjpufSksdC5ib3VuZHNUcmVlPW5ldyBsYSh0LHttYXhMZWFmVHJpczozLGluZGlyZWN0OiEwLHVzZVNoYXJlZEFycmF5QnVmZmVyOm59KSksdC5oYWxmRWRnZXN8fCh0LmhhbGZFZGdlcz1uZXcgejAodCkpLCF0Lmdyb3VwSW5kaWNlcyl7Y29uc3Qgcz1oYSh0KSxyPW5ldyBVaW50MTZBcnJheShzKSxvPXQuZ3JvdXBzO2ZvcihsZXQgYT0wLGM9by5sZW5ndGg7YTxjO2ErKyl7Y29uc3R7c3RhcnQ6bCxjb3VudDpofT1vW2FdO2ZvcihsZXQgdT1sLzMsZj0obCtoKS8zO3U8Zjt1Kyspclt1XT1hfXQuZ3JvdXBJbmRpY2VzPXJ9fWRpc3Bvc2VDYWNoZURhdGEoKXtjb25zdHtnZW9tZXRyeTp0fT10aGlzO3QuaGFsZkVkZ2VzPW51bGwsdC5ib3VuZHNUcmVlPW51bGwsdC5ncm91cEluZGljZXM9bnVsbH19Y29uc3QgVDA9MWUtMTQseWE9bmV3IFQsQ2w9bmV3IFQsQmw9bmV3IFQ7ZnVuY3Rpb24gc24oaSx0PVQwKXt5YS5zdWJWZWN0b3JzKGkuYixpLmEpLENsLnN1YlZlY3RvcnMoaS5jLGkuYSksQmwuc3ViVmVjdG9ycyhpLmIsaS5jKTtjb25zdCBlPXlhLmFuZ2xlVG8oQ2wpLG49eWEuYW5nbGVUbyhCbCkscz1NYXRoLlBJLWUtbjtyZXR1cm4gTWF0aC5hYnMoZSk8dHx8TWF0aC5hYnMobik8dHx8TWF0aC5hYnMocyk8dHx8aS5hLmRpc3RhbmNlVG9TcXVhcmVkKGkuYik8dHx8aS5hLmRpc3RhbmNlVG9TcXVhcmVkKGkuYyk8dHx8aS5iLmRpc3RhbmNlVG9TcXVhcmVkKGkuYyk8dH1jb25zdCBtYT0xZS0xMCxWaT0xZS0xMCxFMD0xZS0xMCxrZT1uZXcgUXQsZnQ9bmV3IFF0LE5lPW5ldyBULGdhPW5ldyBULEZsPW5ldyBULFlzPW5ldyBFbyx4YT1uZXcgbmU7Y2xhc3MgUDB7Y29uc3RydWN0b3IoKXt0aGlzLl9wb29sPVtdLHRoaXMuX2luZGV4PTB9Z2V0VHJpYW5nbGUoKXtyZXR1cm4gdGhpcy5faW5kZXg+PXRoaXMuX3Bvb2wubGVuZ3RoJiZ0aGlzLl9wb29sLnB1c2gobmV3IGV0KSx0aGlzLl9wb29sW3RoaXMuX2luZGV4KytdfWNsZWFyKCl7dGhpcy5faW5kZXg9MH1yZXNldCgpe3RoaXMuX3Bvb2wubGVuZ3RoPTAsdGhpcy5faW5kZXg9MH19Y2xhc3MgQzB7Y29uc3RydWN0b3IoKXt0aGlzLnRyaWFuZ2xlUG9vbD1uZXcgUDAsdGhpcy50cmlhbmdsZXM9W10sdGhpcy5ub3JtYWw9bmV3IFQsdGhpcy5jb3BsYW5hclRyaWFuZ2xlVXNlZD0hMX1pbml0aWFsaXplKHQpe3RoaXMucmVzZXQoKTtjb25zdHt0cmlhbmdsZXM6ZSx0cmlhbmdsZVBvb2w6bixub3JtYWw6c309dGhpcztpZihBcnJheS5pc0FycmF5KHQpKWZvcihsZXQgcj0wLG89dC5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT10W3JdO2lmKHI9PT0wKWEuZ2V0Tm9ybWFsKHMpO2Vsc2UgaWYoTWF0aC5hYnMoMS1hLmdldE5vcm1hbChOZSkuZG90KHMpKT5tYSl0aHJvdyBuZXcgRXJyb3IoIlRyaWFuZ2xlIFNwbGl0dGVyOiBDYW5ub3QgaW5pdGlhbGl6ZSB3aXRoIHRyaWFuZ2xlcyB0aGF0IGhhdmUgZGlmZmVyZW50IG5vcm1hbHMuIik7Y29uc3QgYz1uLmdldFRyaWFuZ2xlKCk7Yy5jb3B5KGEpLGUucHVzaChjKX1lbHNle3QuZ2V0Tm9ybWFsKHMpO2NvbnN0IHI9bi5nZXRUcmlhbmdsZSgpO3IuY29weSh0KSxlLnB1c2gocil9fXNwbGl0QnlUcmlhbmdsZSh0KXtjb25zdHtub3JtYWw6ZSx0cmlhbmdsZXM6bn09dGhpcztpZih0LmdldE5vcm1hbChnYSkubm9ybWFsaXplKCksTWF0aC5hYnMoMS1NYXRoLmFicyhnYS5kb3QoZSkpKTxFMCl7dGhpcy5jb3BsYW5hclRyaWFuZ2xlVXNlZD0hMDtmb3IobGV0IHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9bltyXTthLmNvcGxhbmFyQ291bnQ9MH1jb25zdCBzPVt0LmEsdC5iLHQuY107Zm9yKGxldCByPTA7cjwzO3IrKyl7Y29uc3Qgbz0ocisxKSUzLGE9c1tyXSxjPXNbb107TmUuc3ViVmVjdG9ycyhjLGEpLm5vcm1hbGl6ZSgpLEZsLmNyb3NzVmVjdG9ycyhnYSxOZSksWXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoRmwsYSksdGhpcy5zcGxpdEJ5UGxhbmUoWXMsdCl9fWVsc2UgdC5nZXRQbGFuZShZcyksdGhpcy5zcGxpdEJ5UGxhbmUoWXMsdCl9c3BsaXRCeVBsYW5lKHQsZSl7Y29uc3R7dHJpYW5nbGVzOm4sdHJpYW5nbGVQb29sOnN9PXRoaXM7eGEuY29weShlKSx4YS5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9bltyXTtpZigheGEuaW50ZXJzZWN0c1RyaWFuZ2xlKGEsa2UsITApKWNvbnRpbnVlO2NvbnN0e2E6YyxiOmwsYzpofT1hO2xldCB1PTAsZj0tMSxkPSExLHA9W10seT1bXTtjb25zdCBtPVtjLGwsaF07Zm9yKGxldCBnPTA7ZzwzO2crKyl7Y29uc3QgYj0oZysxKSUzO2tlLnN0YXJ0LmNvcHkobVtnXSksa2UuZW5kLmNvcHkobVtiXSk7Y29uc3Qgdz10LmRpc3RhbmNlVG9Qb2ludChrZS5zdGFydCkseD10LmRpc3RhbmNlVG9Qb2ludChrZS5lbmQpO2lmKE1hdGguYWJzKHcpPFZpJiZNYXRoLmFicyh4KTxWaSl7ZD0hMDticmVha31pZih3PjA/cC5wdXNoKGcpOnkucHVzaChnKSxNYXRoLmFicyh3KTxWaSljb250aW51ZTtsZXQgTT0hIXQuaW50ZXJzZWN0TGluZShrZSxOZSk7IU0mJk1hdGguYWJzKHgpPFZpJiYoTmUuY29weShrZS5lbmQpLE09ITApLE0mJiEoTmUuZGlzdGFuY2VUbyhrZS5zdGFydCk8bWEpJiYoTmUuZGlzdGFuY2VUbyhrZS5lbmQpPG1hJiYoZj1nKSx1PT09MD9mdC5zdGFydC5jb3B5KE5lKTpmdC5lbmQuY29weShOZSksdSsrKX1pZighZCYmdT09PTImJmZ0LmRpc3RhbmNlKCk+VmkpaWYoZiE9PS0xKXtmPShmKzEpJTM7bGV0IGc9MDtnPT09ZiYmKGc9KGcrMSklMyk7bGV0IGI9ZysxO2I9PT1mJiYoYj0oYisxKSUzKTtjb25zdCB3PXMuZ2V0VHJpYW5nbGUoKTt3LmEuY29weShtW2JdKSx3LmIuY29weShmdC5lbmQpLHcuYy5jb3B5KGZ0LnN0YXJ0KSxzbih3KXx8bi5wdXNoKHcpLGEuYS5jb3B5KG1bZ10pLGEuYi5jb3B5KGZ0LnN0YXJ0KSxhLmMuY29weShmdC5lbmQpLHNuKGEpJiYobi5zcGxpY2UociwxKSxyLS0sby0tKX1lbHNle2NvbnN0IGc9cC5sZW5ndGg+PTI/eVswXTpwWzBdO2lmKGc9PT0wKXtsZXQgQT1mdC5zdGFydDtmdC5zdGFydD1mdC5lbmQsZnQuZW5kPUF9Y29uc3QgYj0oZysxKSUzLHc9KGcrMiklMyx4PXMuZ2V0VHJpYW5nbGUoKSxNPXMuZ2V0VHJpYW5nbGUoKTttW2JdLmRpc3RhbmNlVG9TcXVhcmVkKGZ0LnN0YXJ0KTxtW3ddLmRpc3RhbmNlVG9TcXVhcmVkKGZ0LmVuZCk/KHguYS5jb3B5KG1bYl0pLHguYi5jb3B5KGZ0LnN0YXJ0KSx4LmMuY29weShmdC5lbmQpLE0uYS5jb3B5KG1bYl0pLE0uYi5jb3B5KG1bd10pLE0uYy5jb3B5KGZ0LnN0YXJ0KSk6KHguYS5jb3B5KG1bd10pLHguYi5jb3B5KGZ0LnN0YXJ0KSx4LmMuY29weShmdC5lbmQpLE0uYS5jb3B5KG1bYl0pLE0uYi5jb3B5KG1bd10pLE0uYy5jb3B5KGZ0LmVuZCkpLGEuYS5jb3B5KG1bZ10pLGEuYi5jb3B5KGZ0LmVuZCksYS5jLmNvcHkoZnQuc3RhcnQpLHNuKHgpfHxuLnB1c2goeCksc24oTSl8fG4ucHVzaChNKSxzbihhKSYmKG4uc3BsaWNlKHIsMSksci0tLG8tLSl9ZWxzZSB1PT09MyYmY29uc29sZS53YXJuKCJUcmlhbmdsZUNsaXBwZXI6IENvcGxhbmFyIGNsaXAgbm90IGhhbmRsZWQiKX19cmVzZXQoKXt0aGlzLnRyaWFuZ2xlcy5sZW5ndGg9MCx0aGlzLnRyaWFuZ2xlUG9vbC5jbGVhcigpLHRoaXMuY29wbGFuYXJUcmlhbmdsZVVzZWQ9ITF9fWZ1bmN0aW9uIEIwKGkpe3JldHVybiBpPX5+aSxpKzQtaSU0fWNsYXNzIElse2NvbnN0cnVjdG9yKHQsZT01MDApe3RoaXMuZXhwYW5zaW9uRmFjdG9yPTEuNSx0aGlzLnR5cGU9dCx0aGlzLmxlbmd0aD0wLHRoaXMuYXJyYXk9bnVsbCx0aGlzLnNldFNpemUoZSl9c2V0VHlwZSh0KXtpZih0aGlzLmxlbmd0aCE9PTApdGhyb3cgbmV3IEVycm9yKCJUeXBlQmFja2VkQXJyYXk6IENhbm5vdCBjaGFuZ2UgdGhlIHR5cGUgd2hpbGUgdGhlcmUgaXMgdXNlZCBkYXRhIGluIHRoZSBidWZmZXIuIik7Y29uc3QgZT10aGlzLmFycmF5LmJ1ZmZlcjt0aGlzLmFycmF5PW5ldyB0KGUpLHRoaXMudHlwZT10fXNldFNpemUodCl7aWYodGhpcy5hcnJheSYmdD09PXRoaXMuYXJyYXkubGVuZ3RoKXJldHVybjtjb25zdCBlPXRoaXMudHlwZSxuPXZsKCk/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXIscz1uZXcgZShuZXcgbihCMCh0KmUuQllURVNfUEVSX0VMRU1FTlQpKSk7dGhpcy5hcnJheSYmcy5zZXQodGhpcy5hcnJheSwwKSx0aGlzLmFycmF5PXN9ZXhwYW5kKCl7Y29uc3R7YXJyYXk6dCxleHBhbnNpb25GYWN0b3I6ZX09dGhpczt0aGlzLnNldFNpemUodC5sZW5ndGgqZSl9cHVzaCguLi50KXtsZXR7YXJyYXk6ZSxsZW5ndGg6bn09dGhpcztuK3QubGVuZ3RoPmUubGVuZ3RoJiYodGhpcy5leHBhbmQoKSxlPXRoaXMuYXJyYXkpO2ZvcihsZXQgcz0wLHI9dC5sZW5ndGg7czxyO3MrKyllW24rc109dFtzXTt0aGlzLmxlbmd0aCs9dC5sZW5ndGh9Y2xlYXIoKXt0aGlzLmxlbmd0aD0wfX1jbGFzcyBGMHtjb25zdHJ1Y3Rvcigpe3RoaXMuZ3JvdXBBdHRyaWJ1dGVzPVt7fV0sdGhpcy5ncm91cENvdW50PTB9Z2V0VHlwZSh0KXtyZXR1cm4gdGhpcy5ncm91cEF0dHJpYnV0ZXNbMF1bdF0udHlwZX1nZXRJdGVtU2l6ZSh0KXtyZXR1cm4gdGhpcy5ncm91cEF0dHJpYnV0ZXNbMF1bdF0uaXRlbVNpemV9Z2V0Tm9ybWFsaXplZCh0KXtyZXR1cm4gdGhpcy5ncm91cEF0dHJpYnV0ZXNbMF1bdF0ubm9ybWFsaXplZH1nZXRDb3VudCh0KXtpZih0aGlzLmdyb3VwQ291bnQ8PXQpcmV0dXJuIDA7Y29uc3QgZT10aGlzLmdldEdyb3VwQXR0ckFycmF5KCJwb3NpdGlvbiIsdCk7cmV0dXJuIGUubGVuZ3RoL2UuaXRlbVNpemV9Z2V0VG90YWxMZW5ndGgodCl7Y29uc3R7Z3JvdXBDb3VudDplLGdyb3VwQXR0cmlidXRlczpufT10aGlzO2xldCBzPTA7Zm9yKGxldCByPTA7cjxlO3IrKyl7Y29uc3Qgbz1uW3JdO3MrPW9bdF0ubGVuZ3RofXJldHVybiBzfWdldEdyb3VwQXR0clNldCh0PTApe2NvbnN0e2dyb3VwQXR0cmlidXRlczplfT10aGlzO2lmKGVbdF0pcmV0dXJuIHRoaXMuZ3JvdXBDb3VudD1NYXRoLm1heCh0aGlzLmdyb3VwQ291bnQsdCsxKSxlW3RdO2NvbnN0IG49ZVswXTtmb3IodGhpcy5ncm91cENvdW50PU1hdGgubWF4KHRoaXMuZ3JvdXBDb3VudCx0KzEpO3Q+PWUubGVuZ3RoOyl7Y29uc3Qgcz17fTtlLnB1c2gocyk7Zm9yKGNvbnN0IHIgaW4gbil7Y29uc3Qgbz1uW3JdLGE9bmV3IElsKG8udHlwZSk7YS5pdGVtU2l6ZT1vLml0ZW1TaXplLGEubm9ybWFsaXplZD1vLm5vcm1hbGl6ZWQsc1tyXT1hfX1yZXR1cm4gZVt0XX1nZXRHcm91cEF0dHJBcnJheSh0LGU9MCl7Y29uc3R7Z3JvdXBBdHRyaWJ1dGVzOm59PXRoaXM7aWYoIW5bMF1bdF0pdGhyb3cgbmV3IEVycm9yKGBUeXBlZEF0dHJpYnV0ZURhdGE6IEF0dHJpYnV0ZSB3aXRoICIke3R9IiBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRgKTtyZXR1cm4gdGhpcy5nZXRHcm91cEF0dHJTZXQoZSlbdF19aW5pdGlhbGl6ZUFycmF5KHQsZSxuLHMpe2NvbnN0e2dyb3VwQXR0cmlidXRlczpyfT10aGlzLGE9clswXVt0XTtpZihhKXtpZihhLnR5cGUhPT1lKWZvcihsZXQgYz0wLGw9ci5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1yW2NdW3RdO2guc2V0VHlwZShlKSxoLml0ZW1TaXplPW4saC5ub3JtYWxpemVkPXN9fWVsc2UgZm9yKGxldCBjPTAsbD1yLmxlbmd0aDtjPGw7YysrKXtjb25zdCBoPW5ldyBJbChlKTtoLml0ZW1TaXplPW4saC5ub3JtYWxpemVkPXMscltjXVt0XT1ofX1jbGVhcigpe3RoaXMuZ3JvdXBDb3VudD0wO2NvbnN0e2dyb3VwQXR0cmlidXRlczp0fT10aGlzO3QuZm9yRWFjaChlPT57Zm9yKGNvbnN0IG4gaW4gZSllW25dLmNsZWFyKCl9KX1kZWxldGUodCl7dGhpcy5ncm91cEF0dHJpYnV0ZXMuZm9yRWFjaChlPT57ZGVsZXRlIGVbdF19KX1yZXNldCgpe3RoaXMuZ3JvdXBBdHRyaWJ1dGVzPVtdLHRoaXMuZ3JvdXBDb3VudD0wfX1jbGFzcyBrbHtjb25zdHJ1Y3Rvcigpe3RoaXMuaW50ZXJzZWN0aW9uU2V0PXt9LHRoaXMuaWRzPVtdfWFkZCh0LGUpe2NvbnN0e2ludGVyc2VjdGlvblNldDpuLGlkczpzfT10aGlzO25bdF18fChuW3RdPVtdLHMucHVzaCh0KSksblt0XS5wdXNoKGUpfX1jb25zdCBJMD0wLGswPTEsTjA9MixObD0zLFIwPTQsUmw9NSxMbD02LHNlPW5ldyB5byxPbD1uZXcgc3QsVHQ9bmV3IGV0LFJlPW5ldyBULERsPW5ldyBZdCwkbD1uZXcgWXQsVmw9bmV3IFl0LHdhPW5ldyBZdCxqcz1uZXcgWXQsUXM9bmV3IFl0LFVsPW5ldyBRdCxiYT1uZXcgVCxNYT0xZS04LEwwPTFlLTE1LHhuPS0xLHduPTEsS3M9LTIsdHI9MixVaT0wLGJuPTEsQWE9MixPMD0xZS0xNDtsZXQgZXI9bnVsbDtmdW5jdGlvbiBxbChpKXtlcj1pfWZ1bmN0aW9uIEhsKGksdCl7aS5nZXRNaWRwb2ludChzZS5vcmlnaW4pLGkuZ2V0Tm9ybWFsKHNlLmRpcmVjdGlvbik7Y29uc3QgZT10LnJheWNhc3RGaXJzdChzZSwyKTtyZXR1cm4hIShlJiZzZS5kaXJlY3Rpb24uZG90KGUuZmFjZS5ub3JtYWwpPjApP3huOndufWZ1bmN0aW9uIEQwKGksdCl7ZnVuY3Rpb24gZSgpe3JldHVybiBNYXRoLnJhbmRvbSgpLS41fWkuZ2V0Tm9ybWFsKGJhKSxzZS5kaXJlY3Rpb24uY29weShiYSksaS5nZXRNaWRwb2ludChzZS5vcmlnaW4pO2NvbnN0IG49MztsZXQgcz0wLHI9MS8wO2ZvcihsZXQgbz0wO288bjtvKyspe3NlLmRpcmVjdGlvbi54Kz1lKCkqTWEsc2UuZGlyZWN0aW9uLnkrPWUoKSpNYSxzZS5kaXJlY3Rpb24ueis9ZSgpKk1hLHNlLmRpcmVjdGlvbi5tdWx0aXBseVNjYWxhcigtMSk7Y29uc3QgYT10LnJheWNhc3RGaXJzdChzZSwyKTtpZighIShhJiZzZS5kaXJlY3Rpb24uZG90KGEuZmFjZS5ub3JtYWwpPjApJiZzKyssYSE9PW51bGwmJihyPU1hdGgubWluKHIsYS5kaXN0YW5jZSkpLHI8PUwwKXJldHVybiBhLmZhY2Uubm9ybWFsLmRvdChiYSk+MD90cjpLcztpZihzL24+LjV8fChvLXMrMSkvbj4uNSlicmVha31yZXR1cm4gcy9uPi41P3huOndufWZ1bmN0aW9uICQwKGksdCl7Y29uc3QgZT1uZXcga2wsbj1uZXcga2w7cmV0dXJuIE9sLmNvcHkoaS5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkubXVsdGlwbHkodC5tYXRyaXhXb3JsZCksaS5nZW9tZXRyeS5ib3VuZHNUcmVlLmJ2aGNhc3QodC5nZW9tZXRyeS5ib3VuZHNUcmVlLE9sLHtpbnRlcnNlY3RzVHJpYW5nbGVzKHMscixvLGEpe2lmKCFzbihzKSYmIXNuKHIpKXtsZXQgYz1zLmludGVyc2VjdHNUcmlhbmdsZShyLFVsLCEwKTtpZighYyl7Y29uc3QgbD1zLnBsYW5lLGg9ci5wbGFuZSx1PWwubm9ybWFsLGY9aC5ub3JtYWw7dS5kb3QoZik9PT0xJiZNYXRoLmFicyhsLmNvbnN0YW50LWguY29uc3RhbnQpPE8wJiYoYz0hMCl9aWYoYyl7bGV0IGw9aS5nZW9tZXRyeS5ib3VuZHNUcmVlLnJlc29sdmVUcmlhbmdsZUluZGV4KG8pLGg9dC5nZW9tZXRyeS5ib3VuZHNUcmVlLnJlc29sdmVUcmlhbmdsZUluZGV4KGEpO2UuYWRkKGwsaCksbi5hZGQoaCxsKSxlciYmKGVyLmFkZEVkZ2UoVWwpLGVyLmFkZEludGVyc2VjdGluZ1RyaWFuZ2xlcyhvLHMsYSxyKSl9fXJldHVybiExfX0pLHthSW50ZXJzZWN0aW9uczplLGJJbnRlcnNlY3Rpb25zOm59fWZ1bmN0aW9uIFYwKGksdCxlLG4scyxyLG89ITEpe2NvbnN0IGE9ZS5hdHRyaWJ1dGVzLGM9ZS5pbmRleCxsPWkqMyxoPWMuZ2V0WChsKzApLHU9Yy5nZXRYKGwrMSksZj1jLmdldFgobCsyKTtmb3IoY29uc3QgZCBpbiByKXtjb25zdCBwPWFbZF0seT1yW2RdO2lmKCEoZCBpbiBhKSl0aHJvdyBuZXcgRXJyb3IoYENTRyBPcGVyYXRpb25zOiBBdHRyaWJ1dGUgJHtkfSBub3QgYXZhaWxhYmxlIG9uIGdlb21ldHJ5LmApO2NvbnN0IG09cC5pdGVtU2l6ZTtkPT09InBvc2l0aW9uIj8oVHQuYS5mcm9tQnVmZmVyQXR0cmlidXRlKHAsaCkuYXBwbHlNYXRyaXg0KG4pLFR0LmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLHUpLmFwcGx5TWF0cml4NChuKSxUdC5jLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxmKS5hcHBseU1hdHJpeDQobiksU2EoVHQuYSxUdC5iLFR0LmMsdCwzLHksbykpOmQ9PT0ibm9ybWFsIj8oVHQuYS5mcm9tQnVmZmVyQXR0cmlidXRlKHAsaCkuYXBwbHlOb3JtYWxNYXRyaXgocyksVHQuYi5mcm9tQnVmZmVyQXR0cmlidXRlKHAsdSkuYXBwbHlOb3JtYWxNYXRyaXgocyksVHQuYy5mcm9tQnVmZmVyQXR0cmlidXRlKHAsZikuYXBwbHlOb3JtYWxNYXRyaXgocyksbyYmKFR0LmEubXVsdGlwbHlTY2FsYXIoLTEpLFR0LmIubXVsdGlwbHlTY2FsYXIoLTEpLFR0LmMubXVsdGlwbHlTY2FsYXIoLTEpKSxTYShUdC5hLFR0LmIsVHQuYyx0LDMseSxvLCEwKSk6KERsLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxoKSwkbC5mcm9tQnVmZmVyQXR0cmlidXRlKHAsdSksVmwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGYpLFNhKERsLCRsLFZsLHQsbSx5LG8pKX19ZnVuY3Rpb24gVTAoaSx0LGUsbixzLHIsbyxhPSExKXtfYShpLG4scyxyLG8sYSksX2EoYT9lOnQsbixzLHIsbyxhKSxfYShhP3Q6ZSxuLHMscixvLGEpfWZ1bmN0aW9uIFhsKGksdCxlPSExKXtzd2l0Y2goaSl7Y2FzZSBJMDppZih0PT09d258fHQ9PT10ciYmIWUpcmV0dXJuIGJuO2JyZWFrO2Nhc2UgazA6aWYoZSl7aWYodD09PXhuKXJldHVybiBVaX1lbHNlIGlmKHQ9PT13bnx8dD09PUtzKXJldHVybiBibjticmVhaztjYXNlIE4wOmlmKGUpe2lmKHQ9PT13bnx8dD09PUtzKXJldHVybiBibn1lbHNlIGlmKHQ9PT14bilyZXR1cm4gVWk7YnJlYWs7Y2FzZSBSMDppZih0PT09eG4pcmV0dXJuIFVpO2lmKHQ9PT13bilyZXR1cm4gYm47YnJlYWs7Y2FzZSBObDppZih0PT09eG58fHQ9PT10ciYmIWUpcmV0dXJuIGJuO2JyZWFrO2Nhc2UgUmw6aWYoIWUmJih0PT09d258fHQ9PT1LcykpcmV0dXJuIGJuO2JyZWFrO2Nhc2UgTGw6aWYoIWUmJih0PT09eG58fHQ9PT10cikpcmV0dXJuIGJuO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgQ1NHIG9wZXJhdGlvbiBlbnVtICIke2l9Ii5gKX1yZXR1cm4gQWF9ZnVuY3Rpb24gU2EoaSx0LGUsbixzLHIsbz0hMSxhPSExKXtjb25zdCBjPWw9PntyLnB1c2gobC54KSxzPjEmJnIucHVzaChsLnkpLHM+MiYmci5wdXNoKGwueikscz4zJiZyLnB1c2gobC53KX07d2Euc2V0KDAsMCwwLDApLmFkZFNjYWxlZFZlY3RvcihpLG4uYS54KS5hZGRTY2FsZWRWZWN0b3IodCxuLmEueSkuYWRkU2NhbGVkVmVjdG9yKGUsbi5hLnopLGpzLnNldCgwLDAsMCwwKS5hZGRTY2FsZWRWZWN0b3IoaSxuLmIueCkuYWRkU2NhbGVkVmVjdG9yKHQsbi5iLnkpLmFkZFNjYWxlZFZlY3RvcihlLG4uYi56KSxRcy5zZXQoMCwwLDAsMCkuYWRkU2NhbGVkVmVjdG9yKGksbi5jLngpLmFkZFNjYWxlZFZlY3Rvcih0LG4uYy55KS5hZGRTY2FsZWRWZWN0b3IoZSxuLmMueiksYSYmKHdhLm5vcm1hbGl6ZSgpLGpzLm5vcm1hbGl6ZSgpLFFzLm5vcm1hbGl6ZSgpKSxjKHdhKSxvPyhjKFFzKSxjKGpzKSk6KGMoanMpLGMoUXMpKX1mdW5jdGlvbiBfYShpLHQsZSxuLHMscj0hMSl7Zm9yKGNvbnN0IG8gaW4gcyl7Y29uc3QgYT10W29dLGM9c1tvXTtpZighKG8gaW4gdCkpdGhyb3cgbmV3IEVycm9yKGBDU0cgT3BlcmF0aW9uczogQXR0cmlidXRlICR7b30gbm8gYXZhaWxhYmxlIG9uIGdlb21ldHJ5LmApO2NvbnN0IGw9YS5pdGVtU2l6ZTtvPT09InBvc2l0aW9uIj8oUmUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGkpLmFwcGx5TWF0cml4NChlKSxjLnB1c2goUmUueCxSZS55LFJlLnopKTpvPT09Im5vcm1hbCI/KFJlLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxpKS5hcHBseU5vcm1hbE1hdHJpeChuKSxyJiZSZS5tdWx0aXBseVNjYWxhcigtMSksYy5wdXNoKFJlLngsUmUueSxSZS56KSk6KGMucHVzaChhLmdldFgoaSkpLGw+MSYmYy5wdXNoKGEuZ2V0WShpKSksbD4yJiZjLnB1c2goYS5nZXRaKGkpKSxsPjMmJmMucHVzaChhLmdldFcoaSkpKX19Y2xhc3MgcTB7Y29uc3RydWN0b3IodCl7dGhpcy50cmlhbmdsZT1uZXcgZXQoKS5jb3B5KHQpLHRoaXMuaW50ZXJzZWN0cz17fX1hZGRUcmlhbmdsZSh0LGUpe3RoaXMuaW50ZXJzZWN0c1t0XT1uZXcgZXQoKS5jb3B5KGUpfWdldEludGVyc2VjdEFycmF5KCl7Y29uc3QgdD1bXSx7aW50ZXJzZWN0czplfT10aGlzO2Zvcihjb25zdCBuIGluIGUpdC5wdXNoKGVbbl0pO3JldHVybiB0fX1jbGFzcyBHbHtjb25zdHJ1Y3Rvcigpe3RoaXMuZGF0YT17fX1hZGRUcmlhbmdsZUludGVyc2VjdGlvbih0LGUsbixzKXtjb25zdHtkYXRhOnJ9PXRoaXM7clt0XXx8KHJbdF09bmV3IHEwKGUpKSxyW3RdLmFkZFRyaWFuZ2xlKG4scyl9Z2V0VHJpYW5nbGVzQXNBcnJheSh0PW51bGwpe2NvbnN0e2RhdGE6ZX09dGhpcyxuPVtdO2lmKHQhPT1udWxsKXQgaW4gZSYmbi5wdXNoKGVbdF0udHJpYW5nbGUpO2Vsc2UgZm9yKGNvbnN0IHMgaW4gZSluLnB1c2goZVtzXS50cmlhbmdsZSk7cmV0dXJuIG59Z2V0VHJpYW5nbGVJbmRpY2VzKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZGF0YSkubWFwKHQ9PnBhcnNlSW50KHQpKX1nZXRJbnRlcnNlY3Rpb25JbmRpY2VzKHQpe2NvbnN0e2RhdGE6ZX09dGhpcztyZXR1cm4gZVt0XT9PYmplY3Qua2V5cyhlW3RdLmludGVyc2VjdHMpLm1hcChuPT5wYXJzZUludChuKSk6W119Z2V0SW50ZXJzZWN0aW9uc0FzQXJyYXkodD1udWxsLGU9bnVsbCl7Y29uc3R7ZGF0YTpufT10aGlzLHM9bmV3IFNldCxyPVtdLG89YT0+e2lmKG5bYV0paWYoZSE9PW51bGwpblthXS5pbnRlcnNlY3RzW2VdJiZyLnB1c2goblthXS5pbnRlcnNlY3RzW2VdKTtlbHNle2NvbnN0IGM9blthXS5pbnRlcnNlY3RzO2Zvcihjb25zdCBsIGluIGMpcy5oYXMobCl8fChzLmFkZChsKSxyLnB1c2goY1tsXSkpfX07aWYodCE9PW51bGwpbyh0KTtlbHNlIGZvcihjb25zdCBhIGluIG4pbyhhKTtyZXR1cm4gcn1yZXNldCgpe3RoaXMuZGF0YT17fX19Y2xhc3MgSDB7Y29uc3RydWN0b3IoKXt0aGlzLmVuYWJsZWQ9ITEsdGhpcy50cmlhbmdsZUludGVyc2VjdHNBPW5ldyBHbCx0aGlzLnRyaWFuZ2xlSW50ZXJzZWN0c0I9bmV3IEdsLHRoaXMuaW50ZXJzZWN0aW9uRWRnZXM9W119YWRkSW50ZXJzZWN0aW5nVHJpYW5nbGVzKHQsZSxuLHMpe2NvbnN0e3RyaWFuZ2xlSW50ZXJzZWN0c0E6cix0cmlhbmdsZUludGVyc2VjdHNCOm99PXRoaXM7ci5hZGRUcmlhbmdsZUludGVyc2VjdGlvbih0LGUsbixzKSxvLmFkZFRyaWFuZ2xlSW50ZXJzZWN0aW9uKG4scyx0LGUpfWFkZEVkZ2UodCl7dGhpcy5pbnRlcnNlY3Rpb25FZGdlcy5wdXNoKHQuY2xvbmUoKSl9cmVzZXQoKXt0aGlzLnRyaWFuZ2xlSW50ZXJzZWN0c0EucmVzZXQoKSx0aGlzLnRyaWFuZ2xlSW50ZXJzZWN0c0IucmVzZXQoKSx0aGlzLmludGVyc2VjdGlvbkVkZ2VzPVtdfWluaXQoKXt0aGlzLmVuYWJsZWQmJih0aGlzLnJlc2V0KCkscWwodGhpcykpfWNvbXBsZXRlKCl7dGhpcy5lbmFibGVkJiZxbChudWxsKX19Y29uc3Qgcm49bmV3IHN0LG5yPW5ldyBtZSxNbj1uZXcgZXQsaXI9bmV3IGV0LG9uPW5ldyBldCxzcj1uZXcgZXQsZmU9W10sQW49W107ZnVuY3Rpb24gWDAoaSl7Zm9yKGNvbnN0IHQgb2YgaSlyZXR1cm4gdH1mdW5jdGlvbiBHMChpLHQsZSxuLHMscj17fSl7Y29uc3R7dXNlR3JvdXBzOm89ITB9PXIse2FJbnRlcnNlY3Rpb25zOmEsYkludGVyc2VjdGlvbnM6Y309JDAoaSx0KSxsPVtdO2xldCBoPW51bGwsdTtyZXR1cm4gdT1vPzA6LTEsV2woaSx0LGEsZSwhMSxuLHMsdSksWmwoaSx0LGEsZSwhMSxzLHUpLGUuZmluZEluZGV4KGQ9PmQhPT1MbCYmZCE9PVJsKSE9PS0xJiYodT1vP2kuZ2VvbWV0cnkuZ3JvdXBzLmxlbmd0aHx8MTotMSxXbCh0LGksYyxlLCEwLG4scyx1KSxabCh0LGksYyxlLCEwLHMsdSkpLGZlLmxlbmd0aD0wLEFuLmxlbmd0aD0wLHtncm91cHM6bCxtYXRlcmlhbHM6aH19ZnVuY3Rpb24gV2woaSx0LGUsbixzLHIsbyxhPTApe2NvbnN0IGM9aS5tYXRyaXhXb3JsZC5kZXRlcm1pbmFudCgpPDA7cm4uY29weSh0Lm1hdHJpeFdvcmxkKS5pbnZlcnQoKS5tdWx0aXBseShpLm1hdHJpeFdvcmxkKSxuci5nZXROb3JtYWxNYXRyaXgoaS5tYXRyaXhXb3JsZCkubXVsdGlwbHlTY2FsYXIoYz8tMToxKTtjb25zdCBsPWkuZ2VvbWV0cnkuZ3JvdXBJbmRpY2VzLGg9aS5nZW9tZXRyeS5pbmRleCx1PWkuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixmPXQuZ2VvbWV0cnkuYm91bmRzVHJlZSxkPXQuZ2VvbWV0cnkuaW5kZXgscD10Lmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24seT1lLmlkcyxtPWUuaW50ZXJzZWN0aW9uU2V0O2ZvcihsZXQgZz0wLGI9eS5sZW5ndGg7ZzxiO2crKyl7Y29uc3Qgdz15W2ddLHg9YT09PS0xPzA6bFt3XSthLE09Myp3LEE9aC5nZXRYKE0rMCksUz1oLmdldFgoTSsxKSxfPWguZ2V0WChNKzIpO01uLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh1LEEpLmFwcGx5TWF0cml4NChybiksTW4uYi5mcm9tQnVmZmVyQXR0cmlidXRlKHUsUykuYXBwbHlNYXRyaXg0KHJuKSxNbi5jLmZyb21CdWZmZXJBdHRyaWJ1dGUodSxfKS5hcHBseU1hdHJpeDQocm4pLHIucmVzZXQoKSxyLmluaXRpYWxpemUoTW4pO2NvbnN0IEU9bVt3XTtmb3IobGV0IHY9MCxDPUUubGVuZ3RoO3Y8Qzt2Kyspe2NvbnN0IFA9MypFW3ZdLEY9ZC5nZXRYKFArMCksQj1kLmdldFgoUCsxKSxJPWQuZ2V0WChQKzIpO2lyLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLEYpLGlyLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLEIpLGlyLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLEkpLHIuc3BsaXRCeVRyaWFuZ2xlKGlyKX1jb25zdCB6PXIudHJpYW5nbGVzO2ZvcihsZXQgdj0wLEM9ei5sZW5ndGg7djxDO3YrKyl7Y29uc3QgUD16W3ZdLEY9ci5jb3BsYW5hclRyaWFuZ2xlVXNlZD9EMChQLGYpOkhsKFAsZik7ZmUubGVuZ3RoPTAsQW4ubGVuZ3RoPTA7Zm9yKGxldCBCPTAsST1uLmxlbmd0aDtCPEk7QisrKXtjb25zdCBrPVhsKG5bQl0sRixzKTtrIT09QWEmJihBbi5wdXNoKGspLGZlLnB1c2gob1tCXS5nZXRHcm91cEF0dHJTZXQoeCkpKX1pZihmZS5sZW5ndGghPT0wKXtNbi5nZXRCYXJ5Y29vcmQoUC5hLHNyLmEpLE1uLmdldEJhcnljb29yZChQLmIsc3IuYiksTW4uZ2V0QmFyeWNvb3JkKFAuYyxzci5jKTtmb3IobGV0IEI9MCxJPWZlLmxlbmd0aDtCPEk7QisrKXtjb25zdCBrPWZlW0JdLFU9QW5bQl09PT1VaTtWMCh3LHNyLGkuZ2VvbWV0cnksaS5tYXRyaXhXb3JsZCxucixrLGMhPT1VKX19fX1yZXR1cm4geS5sZW5ndGh9ZnVuY3Rpb24gWmwoaSx0LGUsbixzLHIsbz0wKXtjb25zdCBhPWkubWF0cml4V29ybGQuZGV0ZXJtaW5hbnQoKTwwO3JuLmNvcHkodC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkubXVsdGlwbHkoaS5tYXRyaXhXb3JsZCksbnIuZ2V0Tm9ybWFsTWF0cml4KGkubWF0cml4V29ybGQpLm11bHRpcGx5U2NhbGFyKGE/LTE6MSk7Y29uc3QgYz10Lmdlb21ldHJ5LmJvdW5kc1RyZWUsbD1pLmdlb21ldHJ5Lmdyb3VwSW5kaWNlcyxoPWkuZ2VvbWV0cnkuaW5kZXgsdT1pLmdlb21ldHJ5LmF0dHJpYnV0ZXMsZj11LnBvc2l0aW9uLGQ9W10scD1pLmdlb21ldHJ5LmhhbGZFZGdlcyx5PW5ldyBTZXQsbT1oYShpLmdlb21ldHJ5KTtmb3IobGV0IGc9MCxiPW07ZzxiO2crKylnIGluIGUuaW50ZXJzZWN0aW9uU2V0fHx5LmFkZChnKTtmb3IoO3kuc2l6ZT4wOyl7Y29uc3QgZz1YMCh5KTt5LmRlbGV0ZShnKSxkLnB1c2goZyk7Y29uc3QgYj0zKmcsdz1oLmdldFgoYiswKSx4PWguZ2V0WChiKzEpLE09aC5nZXRYKGIrMik7b24uYS5mcm9tQnVmZmVyQXR0cmlidXRlKGYsdykuYXBwbHlNYXRyaXg0KHJuKSxvbi5iLmZyb21CdWZmZXJBdHRyaWJ1dGUoZix4KS5hcHBseU1hdHJpeDQocm4pLG9uLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLE0pLmFwcGx5TWF0cml4NChybik7Y29uc3QgQT1IbChvbixjKTtBbi5sZW5ndGg9MCxmZS5sZW5ndGg9MDtmb3IobGV0IFM9MCxfPW4ubGVuZ3RoO1M8XztTKyspe2NvbnN0IEU9WGwobltTXSxBLHMpO0UhPT1BYSYmKEFuLnB1c2goRSksZmUucHVzaChyW1NdKSl9Zm9yKDtkLmxlbmd0aD4wOyl7Y29uc3QgUz1kLnBvcCgpO2ZvcihsZXQgXz0wO188MztfKyspe2NvbnN0IEU9cC5nZXRTaWJsaW5nVHJpYW5nbGVJbmRleChTLF8pO0UhPT0tMSYmeS5oYXMoRSkmJihkLnB1c2goRSkseS5kZWxldGUoRSkpfWlmKGZlLmxlbmd0aCE9PTApe2NvbnN0IF89MypTLEU9aC5nZXRYKF8rMCksej1oLmdldFgoXysxKSx2PWguZ2V0WChfKzIpLEM9bz09PS0xPzA6bFtTXStvO2lmKG9uLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLEUpLG9uLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLHopLG9uLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLHYpLCFzbihvbikpZm9yKGxldCBQPTAsRj1mZS5sZW5ndGg7UDxGO1ArKyl7Y29uc3QgQj1BbltQXSxJPWZlW1BdLmdldEdyb3VwQXR0clNldChDKSxrPUI9PT1VaTtVMChFLHosdix1LGkubWF0cml4V29ybGQsbnIsSSxrIT09YSl9fX19fWZ1bmN0aW9uIFcwKGkpe2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGgtMTt0Kyspe2NvbnN0IGU9aVt0XSxuPWlbdCsxXTtpZihlLm1hdGVyaWFsSW5kZXg9PT1uLm1hdGVyaWFsSW5kZXgpe2NvbnN0IHM9ZS5zdGFydCxyPW4uc3RhcnQrbi5jb3VudDtuLnN0YXJ0PXMsbi5jb3VudD1yLXMsaS5zcGxpY2UodCwxKSx0LS19fX1mdW5jdGlvbiBaMChpLHQsZSxuKXtlLmNsZWFyKCk7Y29uc3Qgcz1pLmF0dHJpYnV0ZXM7Zm9yKGxldCByPTAsbz1uLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPW5bcl0sYz1zW2FdO2UuaW5pdGlhbGl6ZUFycmF5KGEsYy5hcnJheS5jb25zdHJ1Y3RvcixjLml0ZW1TaXplLGMubm9ybWFsaXplZCl9Zm9yKGNvbnN0IHIgaW4gZS5hdHRyaWJ1dGVzKW4uaW5jbHVkZXMocil8fGUuZGVsZXRlKHIpO2Zvcihjb25zdCByIGluIHQuYXR0cmlidXRlcyluLmluY2x1ZGVzKHIpfHwodC5kZWxldGVBdHRyaWJ1dGUociksdC5kaXNwb3NlKCkpfWZ1bmN0aW9uIEowKGksdCxlKXtsZXQgbj0hMSxzPS0xO2NvbnN0IHI9aS5hdHRyaWJ1dGVzLG89dC5ncm91cEF0dHJpYnV0ZXNbMF07Zm9yKGNvbnN0IGMgaW4gbyl7Y29uc3QgbD10LmdldFRvdGFsTGVuZ3RoKGMpLGg9dC5nZXRUeXBlKGMpLHU9dC5nZXRJdGVtU2l6ZShjKSxmPXQuZ2V0Tm9ybWFsaXplZChjKTtsZXQgZD1yW2NdOyghZHx8ZC5hcnJheS5sZW5ndGg8bCkmJihkPW5ldyB4dChuZXcgaChsKSx1LGYpLGkuc2V0QXR0cmlidXRlKGMsZCksbj0hMCk7bGV0IHA9MDtmb3IobGV0IHk9MCxtPU1hdGgubWluKGUubGVuZ3RoLHQuZ3JvdXBDb3VudCk7eTxtO3krKyl7Y29uc3QgZz1lW3ldLmluZGV4LHthcnJheTpiLHR5cGU6dyxsZW5ndGg6eH09dC5ncm91cEF0dHJpYnV0ZXNbZ11bY10sTT1uZXcgdyhiLmJ1ZmZlciwwLHgpO2QuYXJyYXkuc2V0KE0scCkscCs9TS5sZW5ndGh9ZC5uZWVkc1VwZGF0ZT0hMCxzPWwvZC5pdGVtU2l6ZX1pZihpLmluZGV4KXtjb25zdCBjPWkuaW5kZXguYXJyYXk7aWYoYy5sZW5ndGg8cylpLmluZGV4PW51bGwsbj0hMDtlbHNlIGZvcihsZXQgbD0wLGg9Yy5sZW5ndGg7bDxoO2wrKyljW2xdPWx9bGV0IGE9MDtpLmNsZWFyR3JvdXBzKCk7Zm9yKGxldCBjPTAsbD1NYXRoLm1pbihlLmxlbmd0aCx0Lmdyb3VwQ291bnQpO2M8bDtjKyspe2NvbnN0e2luZGV4OmgsbWF0ZXJpYWxJbmRleDp1fT1lW2NdLGY9dC5nZXRDb3VudChoKTtmIT09MCYmKGkuYWRkR3JvdXAoYSxmLHUpLGErPWYpfWkuc2V0RHJhd1JhbmdlKDAscyksaS5ib3VuZHNUcmVlPW51bGwsbiYmaS5kaXNwb3NlKCl9ZnVuY3Rpb24gSmwoaSx0KXtsZXQgZT10O3JldHVybiBBcnJheS5pc0FycmF5KHQpfHwoZT1bXSxpLmZvckVhY2gobj0+e2Vbbi5tYXRlcmlhbEluZGV4XT10fSkpLGV9Y2xhc3MgWTB7Y29uc3RydWN0b3IoKXt0aGlzLnRyaWFuZ2xlU3BsaXR0ZXI9bmV3IEMwLHRoaXMuYXR0cmlidXRlRGF0YT1bXSx0aGlzLmF0dHJpYnV0ZXM9WyJwb3NpdGlvbiIsInV2Iiwibm9ybWFsIl0sdGhpcy51c2VHcm91cHM9ITAsdGhpcy5jb25zb2xpZGF0ZUdyb3Vwcz0hMCx0aGlzLmRlYnVnPW5ldyBIMH1nZXRHcm91cFJhbmdlcyh0KXtyZXR1cm4hdGhpcy51c2VHcm91cHN8fHQuZ3JvdXBzLmxlbmd0aD09PTA/W3tzdGFydDowLGNvdW50OjEvMCxtYXRlcmlhbEluZGV4OjB9XTp0Lmdyb3Vwcy5tYXAoZT0+RnQoe30sZSkpfWV2YWx1YXRlKHQsZSxuLHM9bmV3IEpzKXtsZXQgcj0hMDtpZihBcnJheS5pc0FycmF5KG4pfHwobj1bbl0pLEFycmF5LmlzQXJyYXkocyl8fChzPVtzXSxyPSExKSxzLmxlbmd0aCE9PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiRXZhbHVhdG9yOiBvcGVyYXRpb25zIGFuZCB0YXJnZXQgYXJyYXkgcGFzc2VkIGFzIGRpZmZlcmVudCBzaXplcy4iKTt0LnByZXBhcmVHZW9tZXRyeSgpLGUucHJlcGFyZUdlb21ldHJ5KCk7Y29uc3R7dHJpYW5nbGVTcGxpdHRlcjpvLGF0dHJpYnV0ZURhdGE6YSxhdHRyaWJ1dGVzOmMsdXNlR3JvdXBzOmwsY29uc29saWRhdGVHcm91cHM6aCxkZWJ1Zzp1fT10aGlzO2Zvcig7YS5sZW5ndGg8cy5sZW5ndGg7KWEucHVzaChuZXcgRjApO3MuZm9yRWFjaCgoZyxiKT0+e1owKHQuZ2VvbWV0cnksZy5nZW9tZXRyeSxhW2JdLGMpfSksdS5pbml0KCksRzAodCxlLG4sbyxhLHt1c2VHcm91cHM6bH0pLHUuY29tcGxldGUoKTtjb25zdCBmPXRoaXMuZ2V0R3JvdXBSYW5nZXModC5nZW9tZXRyeSksZD1KbChmLHQubWF0ZXJpYWwpLHA9dGhpcy5nZXRHcm91cFJhbmdlcyhlLmdlb21ldHJ5KSx5PUpsKHAsZS5tYXRlcmlhbCk7cC5mb3JFYWNoKGc9PmcubWF0ZXJpYWxJbmRleCs9ZC5sZW5ndGgpO2xldCBtPVsuLi5mLC4uLnBdLm1hcCgoZyxiKT0+V2UoRnQoe30sZykse2luZGV4OmJ9KSk7aWYobCl7Y29uc3QgZz1bLi4uZCwuLi55XTtoJiYobT1tLm1hcCh3PT57Y29uc3QgeD1nW3cubWF0ZXJpYWxJbmRleF07cmV0dXJuIHcubWF0ZXJpYWxJbmRleD1nLmluZGV4T2YoeCksd30pLnNvcnQoKHcseCk9PncubWF0ZXJpYWxJbmRleC14Lm1hdGVyaWFsSW5kZXgpKTtjb25zdCBiPVtdO2ZvcihsZXQgdz0wLHg9Zy5sZW5ndGg7dzx4O3crKyl7bGV0IE09ITE7Zm9yKGxldCBBPTAsUz1tLmxlbmd0aDtBPFM7QSsrKXtjb25zdCBfPW1bQV07Xy5tYXRlcmlhbEluZGV4PT09dyYmKE09ITAsXy5tYXRlcmlhbEluZGV4PWIubGVuZ3RoKX1NJiZiLnB1c2goZ1t3XSl9cy5mb3JFYWNoKHc9Pnt3Lm1hdGVyaWFsPWJ9KX1lbHNlIG09W3tzdGFydDowLGNvdW50OjEvMCxpbmRleDowLG1hdGVyaWFsSW5kZXg6MH1dLHMuZm9yRWFjaChnPT57Zy5tYXRlcmlhbD1kWzBdfSk7cmV0dXJuIHMuZm9yRWFjaCgoZyxiKT0+e2NvbnN0IHc9Zy5nZW9tZXRyeTtKMCh3LGFbYl0sbSksaCYmVzAody5ncm91cHMpfSkscj9zOnNbMF19ZXZhbHVhdGVIaWVyYXJjaHkodCxlPW5ldyBKcyl7dC51cGRhdGVNYXRyaXhXb3JsZCghMCk7Y29uc3Qgbj0ocixvKT0+e2NvbnN0IGE9ci5jaGlsZHJlbjtmb3IobGV0IGM9MCxsPWEubGVuZ3RoO2M8bDtjKyspe2NvbnN0IGg9YVtjXTtoLmlzT3BlcmF0aW9uR3JvdXA/bihoLG8pOm8oaCl9fSxzPXI9Pntjb25zdCBvPXIuY2hpbGRyZW47bGV0IGE9ITE7Zm9yKGxldCBsPTAsaD1vLmxlbmd0aDtsPGg7bCsrKXtjb25zdCB1PW9bbF07YT1zKHUpfHxhfWNvbnN0IGM9ci5pc0RpcnR5KCk7aWYoYyYmci5tYXJrVXBkYXRlZCgpLGEmJiFyLmlzT3BlcmF0aW9uR3JvdXApe2xldCBsO3JldHVybiBuKHIsaD0+e2w/bD10aGlzLmV2YWx1YXRlKGwsaCxoLm9wZXJhdGlvbik6bD10aGlzLmV2YWx1YXRlKHIsaCxoLm9wZXJhdGlvbil9KSxyLl9jYWNoZWRHZW9tZXRyeT1sLmdlb21ldHJ5LHIuX2NhY2hlZE1hdGVyaWFscz1sLm1hdGVyaWFsLCEwfWVsc2UgcmV0dXJuIGF8fGN9O3JldHVybiBzKHQpLGUuZ2VvbWV0cnk9dC5fY2FjaGVkR2VvbWV0cnksZS5tYXRlcmlhbD10Ll9jYWNoZWRNYXRlcmlhbHMsZX1yZXNldCgpe3RoaXMudHJpYW5nbGVTcGxpdHRlci5yZXNldCgpfX1mdW5jdGlvbiBZbChpKXtsZXQgdCxlLG4scz0tMSxyPTA7Zm9yKGxldCBsPTA7bDxpLmxlbmd0aDsrK2wpe2NvbnN0IGg9aVtsXTtpZih0PT09dm9pZCAwJiYodD1oLmFycmF5LmNvbnN0cnVjdG9yKSx0IT09aC5hcnJheS5jb25zdHJ1Y3RvcilyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLmFycmF5IG11c3QgYmUgb2YgY29uc2lzdGVudCBhcnJheSB0eXBlcyBhY3Jvc3MgbWF0Y2hpbmcgYXR0cmlidXRlcy4iKSxudWxsO2lmKGU9PT12b2lkIDAmJihlPWguaXRlbVNpemUpLGUhPT1oLml0ZW1TaXplKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUuaXRlbVNpemUgbXVzdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7aWYobj09PXZvaWQgMCYmKG49aC5ub3JtYWxpemVkKSxuIT09aC5ub3JtYWxpemVkKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUubm9ybWFsaXplZCBtdXN0IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihzPT09LTEmJihzPWguZ3B1VHlwZSkscyE9PWguZ3B1VHlwZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLmdwdVR5cGUgbXVzdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7cis9aC5jb3VudCplfWNvbnN0IG89bmV3IHQociksYT1uZXcgeHQobyxlLG4pO2xldCBjPTA7Zm9yKGxldCBsPTA7bDxpLmxlbmd0aDsrK2wpe2NvbnN0IGg9aVtsXTtpZihoLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IHU9Yy9lO2ZvcihsZXQgZj0wLGQ9aC5jb3VudDtmPGQ7ZisrKWZvcihsZXQgcD0wO3A8ZTtwKyspe2NvbnN0IHk9aC5nZXRDb21wb25lbnQoZixwKTthLnNldENvbXBvbmVudChmK3UscCx5KX19ZWxzZSBvLnNldChoLmFycmF5LGMpO2MrPWguY291bnQqZX1yZXR1cm4gcyE9PXZvaWQgMCYmKGEuZ3B1VHlwZT1zKSxhfWZ1bmN0aW9uIGowKGkpe2lmKGkuZ3JvdXBzLmxlbmd0aD09PTApcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZUdyb3VwcygpOiBObyBncm91cHMgYXJlIGRlZmluZWQuIE5vdGhpbmcgdG8gbWVyZ2UuIiksaTtsZXQgdD1pLmdyb3VwcztpZih0PXQuc29ydCgobyxhKT0+by5tYXRlcmlhbEluZGV4IT09YS5tYXRlcmlhbEluZGV4P28ubWF0ZXJpYWxJbmRleC1hLm1hdGVyaWFsSW5kZXg6by5zdGFydC1hLnN0YXJ0KSxpLmdldEluZGV4KCk9PT1udWxsKXtjb25zdCBvPWkuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLGE9W107Zm9yKGxldCBjPTA7YzxvLmNvdW50O2MrPTMpYS5wdXNoKGMsYysxLGMrMik7aS5zZXRJbmRleChhKX1jb25zdCBlPWkuZ2V0SW5kZXgoKSxuPVtdO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBhPXRbb10sYz1hLnN0YXJ0LGw9YythLmNvdW50O2ZvcihsZXQgaD1jO2g8bDtoKyspbi5wdXNoKGUuZ2V0WChoKSl9aS5kaXNwb3NlKCksaS5zZXRJbmRleChuKTtsZXQgcz0wO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBhPXRbb107YS5zdGFydD1zLHMrPWEuY291bnR9bGV0IHI9dFswXTtpLmdyb3Vwcz1bcl07Zm9yKGxldCBvPTE7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGE9dFtvXTtyLm1hdGVyaWFsSW5kZXg9PT1hLm1hdGVyaWFsSW5kZXg/ci5jb3VudCs9YS5jb3VudDoocj1hLGkuZ3JvdXBzLnB1c2gocikpfXJldHVybiBpfWZ1bmN0aW9uIGpsKGksdD0wKXtjb25zdCBlPWlbMF0uaW5kZXghPT1udWxsLG49bmV3IFNldChPYmplY3Qua2V5cyhpWzBdLmF0dHJpYnV0ZXMpKSxzPW5ldyBTZXQoT2JqZWN0LmtleXMoaVswXS5tb3JwaEF0dHJpYnV0ZXMpKSxyPXt9LG89e30sYT1pWzBdLm1vcnBoVGFyZ2V0c1JlbGF0aXZlLGM9bmV3IGdlO2xldCBsPTA7Zm9yKGxldCBoPTA7aDxpLmxlbmd0aDsrK2gpe2NvbnN0IHU9aVtoXTtsZXQgZj0wO2lmKGUhPT0odS5pbmRleCE9PW51bGwpKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIitoKyIuIEFsbCBnZW9tZXRyaWVzIG11c3QgaGF2ZSBjb21wYXRpYmxlIGF0dHJpYnV0ZXM7IG1ha2Ugc3VyZSBpbmRleCBhdHRyaWJ1dGUgZXhpc3RzIGFtb25nIGFsbCBnZW9tZXRyaWVzLCBvciBpbiBub25lIG9mIHRoZW0uIiksbnVsbDtmb3IoY29uc3QgZCBpbiB1LmF0dHJpYnV0ZXMpe2lmKCFuLmhhcyhkKSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsnLiBBbGwgZ2VvbWV0cmllcyBtdXN0IGhhdmUgY29tcGF0aWJsZSBhdHRyaWJ1dGVzOyBtYWtlIHN1cmUgIicrZCsnIiBhdHRyaWJ1dGUgZXhpc3RzIGFtb25nIGFsbCBnZW9tZXRyaWVzLCBvciBpbiBub25lIG9mIHRoZW0uJyksbnVsbDtyW2RdPT09dm9pZCAwJiYocltkXT1bXSkscltkXS5wdXNoKHUuYXR0cmlidXRlc1tkXSksZisrfWlmKGYhPT1uLnNpemUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK2grIi4gTWFrZSBzdXJlIGFsbCBnZW9tZXRyaWVzIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihhIT09dS5tb3JwaFRhcmdldHNSZWxhdGl2ZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiAubW9ycGhUYXJnZXRzUmVsYXRpdmUgbXVzdCBiZSBjb25zaXN0ZW50IHRocm91Z2hvdXQgYWxsIGdlb21ldHJpZXMuIiksbnVsbDtmb3IoY29uc3QgZCBpbiB1Lm1vcnBoQXR0cmlidXRlcyl7aWYoIXMuaGFzKGQpKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIitoKyIuICAubW9ycGhBdHRyaWJ1dGVzIG11c3QgYmUgY29uc2lzdGVudCB0aHJvdWdob3V0IGFsbCBnZW9tZXRyaWVzLiIpLG51bGw7b1tkXT09PXZvaWQgMCYmKG9bZF09W10pLG9bZF0ucHVzaCh1Lm1vcnBoQXR0cmlidXRlc1tkXSl9aWYodCl7bGV0IGQ7aWYoZSlkPXUuaW5kZXguY291bnQ7ZWxzZSBpZih1LmF0dHJpYnV0ZXMucG9zaXRpb24hPT12b2lkIDApZD11LmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQ7ZWxzZSByZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiBUaGUgZ2VvbWV0cnkgbXVzdCBoYXZlIGVpdGhlciBhbiBpbmRleCBvciBhIHBvc2l0aW9uIGF0dHJpYnV0ZSIpLG51bGw7aWYodD09PTEpYy5hZGRHcm91cChsLGQsaCk7ZWxzZSBpZih0PT09MiYmdS5ncm91cHMubGVuZ3RoPjApZm9yKGxldCBwIG9mIHUuZ3JvdXBzKXtsZXQgeT1wLm1hdGVyaWFsSW5kZXg7Yy5hZGRHcm91cChsK3Auc3RhcnQsTWF0aC5taW4ocC5jb3VudCxkKSx5KX1sKz1kfX1pZihlKXtsZXQgaD0wO2NvbnN0IHU9W107Zm9yKGxldCBmPTA7ZjxpLmxlbmd0aDsrK2Ype2NvbnN0IGQ9aVtmXS5pbmRleDtmb3IobGV0IHA9MDtwPGQuY291bnQ7KytwKXUucHVzaChkLmdldFgocCkraCk7aCs9aVtmXS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50fWMuc2V0SW5kZXgodSl9Zm9yKGNvbnN0IGggaW4gcil7Y29uc3QgdT1ZbChyW2hdKTtpZighdSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aGlsZSB0cnlpbmcgdG8gbWVyZ2UgdGhlICIraCsiIGF0dHJpYnV0ZS4iKSxudWxsO2Muc2V0QXR0cmlidXRlKGgsdSl9Zm9yKGNvbnN0IGggaW4gbyl7Y29uc3QgdT1vW2hdWzBdLmxlbmd0aDtpZih1PT09MClicmVhaztjLm1vcnBoQXR0cmlidXRlcz1jLm1vcnBoQXR0cmlidXRlc3x8e30sYy5tb3JwaEF0dHJpYnV0ZXNbaF09W107Zm9yKGxldCBmPTA7Zjx1OysrZil7Y29uc3QgZD1bXTtmb3IobGV0IHk9MDt5PG9baF0ubGVuZ3RoOysreSlkLnB1c2gob1toXVt5XVtmXSk7Y29uc3QgcD1ZbChkKTtpZighcClyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aGlsZSB0cnlpbmcgdG8gbWVyZ2UgdGhlICIraCsiIG1vcnBoQXR0cmlidXRlLiIpLG51bGw7Yy5tb3JwaEF0dHJpYnV0ZXNbaF0ucHVzaChwKX19cmV0dXJuIHQ9PT0yP2owKGMpOmN9Y2xhc3MgUTAgZXh0ZW5kcyBabntjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSk7Y29uc3Qgbj1uZXcgSnMobmV3IFpuKHQsV2UoRnQoe30sZSkse2hhc1RvcDohMCxoYXNTaWRlOiEwLGhhc0JvdHRvbTohMX0pKSk7bi51cGRhdGVNYXRyaXhXb3JsZCgpO2NvbnN0IHM9bmV3IGd0KCkuc2V0RnJvbU9iamVjdChuKSxyPW5ldyBUO3MuZ2V0U2l6ZShyKTtjb25zdCBvPW5ldyBUKHMubWluLngrci54LzIscy5taW4ueStyLnkvMiwwKTtsZXQgYT1lLnRvcFNlZ21lbnRzLGM9ZS5ib3gzO2lmKGMpe2M9Yy51bmlvbihzKTtjb25zdCBnPW5ldyBUO2MuZ2V0U2l6ZShnKTtjb25zdCBiPU1hdGgubWF4KHIueC9nLngsci55L2cueSk7YT1NYXRoLmNlaWwoZS50b3BTZWdtZW50cypiKX1pZihhPDQpcmV0dXJuIHRoaXM7Y29uc3QgbD1uZXcgRG8oci54LHIueSxhLGEpLGg9bmV3IEpzKGwpO2gucG9zaXRpb24uc2V0KG8ueCxvLnksby56KSxoLnVwZGF0ZU1hdHJpeFdvcmxkKCk7Y29uc3QgZj1uZXcgWTAoKS5ldmFsdWF0ZShoLG4sTmwpLGQ9Zi5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikscD1uZXcgQmUoZC5jb3VudCoyLDIpO2ZvcihsZXQgZz0wO2c8ZC5jb3VudDtnKyspe2NvbnN0IGI9ZC5nZXRaKGcpO2Quc2V0WihnLGUuZGVwdGgrYil9aWYoYyl7Y29uc3QgZz1jLm1pbixiPWMubWF4LHc9bmV3IFQoKS5zdWJWZWN0b3JzKGIsZyk7Zm9yKGxldCB4PTA7eDxkLmNvdW50O3grKyl7Y29uc3QgTT1kLmdldFgoeCksQT1kLmdldFkoeCksUz0oTS1nLngpL3cueCxfPShBLWcueSkvdy55O3Auc2V0WFkoeCxTLF8pfWYuZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCJ1diIscCl9ZC5uZWVkc1VwZGF0ZT0hMDtjb25zdCB5PW5ldyBabih0LFdlKEZ0KHt9LGUpLHtoYXNUb3A6ITF9KSksbT1qbChbZi5nZW9tZXRyeSx5XSwyKTt0aGlzLmNvcHkobS50b05vbkluZGV4ZWQoKSl9fXZhciBLMD1pPT57Y29uc3R7c3BsaXQ6dCxkZXB0aDplLHBvaW50czpuLGJveDM6cyxoYXNUb3A6cixoYXNCb3R0b206byxoYXNTaWRlOmEsc2lkZVJlcGVhdDpjLHRvcFNlZ21lbnRzOmx9PWksaD1sP1EwOlpuLHU9bmV3IGgobmV3IFljKG4pLHtkZXB0aDplLGJldmVsRW5hYmxlZDohMSxib3gzOnMsVVZHZW5lcmF0b3I6dGQoe3NwbGl0OnQsYm94MzpzLHNpZGVSZXBlYXQ6Y30pLGhhc1RvcDpyLGhhc0JvdHRvbTpvLGhhc1NpZGU6YSx0b3BTZWdtZW50czpsfSk7cmV0dXJuIGVkKCksdX07ZnVuY3Rpb24gcnIoaSx0KXtyZXR1cm4gaT09bnVsbHx8dD09bnVsbD9OYU46aTx0Py0xOmk+dD8xOmk+PXQ/MDpOYU59ZnVuY3Rpb24gdHAoaSx0KXtyZXR1cm4gaT09bnVsbHx8dD09bnVsbD9OYU46dDxpPy0xOnQ+aT8xOnQ+PWk/MDpOYU59ZnVuY3Rpb24gUWwoaSl7bGV0IHQsZSxuO2kubGVuZ3RoIT09Mj8odD1ycixlPShhLGMpPT5ycihpKGEpLGMpLG49KGEsYyk9PmkoYSktYyk6KHQ9aT09PXJyfHxpPT09dHA/aTplcCxlPWksbj1pKTtmdW5jdGlvbiBzKGEsYyxsPTAsaD1hLmxlbmd0aCl7aWYobDxoKXtpZih0KGMsYykhPT0wKXJldHVybiBoO2Rve2NvbnN0IHU9bCtoPj4+MTtlKGFbdV0sYyk8MD9sPXUrMTpoPXV9d2hpbGUobDxoKX1yZXR1cm4gbH1mdW5jdGlvbiByKGEsYyxsPTAsaD1hLmxlbmd0aCl7aWYobDxoKXtpZih0KGMsYykhPT0wKXJldHVybiBoO2Rve2NvbnN0IHU9bCtoPj4+MTtlKGFbdV0sYyk8PTA/bD11KzE6aD11fXdoaWxlKGw8aCl9cmV0dXJuIGx9ZnVuY3Rpb24gbyhhLGMsbD0wLGg9YS5sZW5ndGgpe2NvbnN0IHU9cyhhLGMsbCxoLTEpO3JldHVybiB1PmwmJm4oYVt1LTFdLGMpPi1uKGFbdV0sYyk/dS0xOnV9cmV0dXJue2xlZnQ6cyxjZW50ZXI6byxyaWdodDpyfX1mdW5jdGlvbiBlcCgpe3JldHVybiAwfWZ1bmN0aW9uIG5wKGkpe3JldHVybiBpPT09bnVsbD9OYU46K2l9Y29uc3QgaXA9UWwocnIpLnJpZ2h0O1FsKG5wKS5jZW50ZXI7ZnVuY3Rpb24gb3IoaSx0KXtsZXQgZSxuO2lmKHQ9PT12b2lkIDApZm9yKGNvbnN0IHMgb2YgaSlzIT1udWxsJiYoZT09PXZvaWQgMD9zPj1zJiYoZT1uPXMpOihlPnMmJihlPXMpLG48cyYmKG49cykpKTtlbHNle2xldCBzPS0xO2ZvcihsZXQgciBvZiBpKShyPXQociwrK3MsaSkpIT1udWxsJiYoZT09PXZvaWQgMD9yPj1yJiYoZT1uPXIpOihlPnImJihlPXIpLG48ciYmKG49cikpKX1yZXR1cm5bZSxuXX1jbGFzcyBMZXtjb25zdHJ1Y3Rvcigpe3RoaXMuX3BhcnRpYWxzPW5ldyBGbG9hdDY0QXJyYXkoMzIpLHRoaXMuX249MH1hZGQodCl7Y29uc3QgZT10aGlzLl9wYXJ0aWFscztsZXQgbj0wO2ZvcihsZXQgcz0wO3M8dGhpcy5fbiYmczwzMjtzKyspe2NvbnN0IHI9ZVtzXSxvPXQrcixhPU1hdGguYWJzKHQpPE1hdGguYWJzKHIpP3QtKG8tcik6ci0oby10KTthJiYoZVtuKytdPWEpLHQ9b31yZXR1cm4gZVtuXT10LHRoaXMuX249bisxLHRoaXN9dmFsdWVPZigpe2NvbnN0IHQ9dGhpcy5fcGFydGlhbHM7bGV0IGU9dGhpcy5fbixuLHMscixvPTA7aWYoZT4wKXtmb3Iobz10Wy0tZV07ZT4wJiYobj1vLHM9dFstLWVdLG89bitzLHI9cy0oby1uKSwhcik7KTtlPjAmJihyPDAmJnRbZS0xXTwwfHxyPjAmJnRbZS0xXT4wKSYmKHM9cioyLG49bytzLHM9PW4tbyYmKG89bikpfXJldHVybiBvfX1jb25zdCBzcD1NYXRoLnNxcnQoNTApLHJwPU1hdGguc3FydCgxMCksb3A9TWF0aC5zcXJ0KDIpO2Z1bmN0aW9uIGFyKGksdCxlKXtjb25zdCBuPSh0LWkpL01hdGgubWF4KDAsZSkscz1NYXRoLmZsb29yKE1hdGgubG9nMTAobikpLHI9bi9NYXRoLnBvdygxMCxzKSxvPXI+PXNwPzEwOnI+PXJwPzU6cj49b3A/MjoxO2xldCBhLGMsbDtyZXR1cm4gczwwPyhsPU1hdGgucG93KDEwLC1zKS9vLGE9TWF0aC5yb3VuZChpKmwpLGM9TWF0aC5yb3VuZCh0KmwpLGEvbDxpJiYrK2EsYy9sPnQmJi0tYyxsPS1sKToobD1NYXRoLnBvdygxMCxzKSpvLGE9TWF0aC5yb3VuZChpL2wpLGM9TWF0aC5yb3VuZCh0L2wpLGEqbDxpJiYrK2EsYypsPnQmJi0tYyksYzxhJiYuNTw9ZSYmZTwyP2FyKGksdCxlKjIpOlthLGMsbF19ZnVuY3Rpb24gYXAoaSx0LGUpe2lmKHQ9K3QsaT0raSxlPStlLCEoZT4wKSlyZXR1cm5bXTtpZihpPT09dClyZXR1cm5baV07Y29uc3Qgbj10PGksW3MscixvXT1uP2FyKHQsaSxlKTphcihpLHQsZSk7aWYoIShyPj1zKSlyZXR1cm5bXTtjb25zdCBhPXItcysxLGM9bmV3IEFycmF5KGEpO2lmKG4paWYobzwwKWZvcihsZXQgbD0wO2w8YTsrK2wpY1tsXT0oci1sKS8tbztlbHNlIGZvcihsZXQgbD0wO2w8YTsrK2wpY1tsXT0oci1sKSpvO2Vsc2UgaWYobzwwKWZvcihsZXQgbD0wO2w8YTsrK2wpY1tsXT0ocytsKS8tbztlbHNlIGZvcihsZXQgbD0wO2w8YTsrK2wpY1tsXT0ocytsKSpvO3JldHVybiBjfWZ1bmN0aW9uIHZhKGksdCxlKXtyZXR1cm4gdD0rdCxpPStpLGU9K2UsYXIoaSx0LGUpWzJdfWZ1bmN0aW9uIGNwKGksdCxlKXt0PSt0LGk9K2ksZT0rZTtjb25zdCBuPXQ8aSxzPW4/dmEodCxpLGUpOnZhKGksdCxlKTtyZXR1cm4obj8tMToxKSooczwwPzEvLXM6cyl9ZnVuY3Rpb24gbHAoaSx0KXtsZXQgZT0wLG49MDtpZih0PT09dm9pZCAwKWZvcihsZXQgcyBvZiBpKXMhPW51bGwmJihzPStzKT49cyYmKCsrZSxuKz1zKTtlbHNle2xldCBzPS0xO2ZvcihsZXQgciBvZiBpKShyPXQociwrK3MsaSkpIT1udWxsJiYocj0rcik+PXImJigrK2Usbis9cil9aWYoZSlyZXR1cm4gbi9lfWZ1bmN0aW9uKmhwKGkpe2Zvcihjb25zdCB0IG9mIGkpeWllbGQqUXUodCl9ZnVuY3Rpb24gcWkoaSl7cmV0dXJuIEFycmF5LmZyb20oaHAoaSkpfXZhciBLPTFlLTYsY3I9MWUtMTIsWj1NYXRoLlBJLE50PVovMixscj1aLzQsUnQ9WioyLGh0PTE4MC9aLEg9Wi8xODAsdHQ9TWF0aC5hYnMsemE9TWF0aC5hdGFuLHJlPU1hdGguYXRhbjIsWD1NYXRoLmNvcyx1cD1NYXRoLmV4cCxUYT1NYXRoLmh5cG90LGZwPU1hdGgubG9nLHE9TWF0aC5zaW4sZHA9TWF0aC5zaWdufHxmdW5jdGlvbihpKXtyZXR1cm4gaT4wPzE6aTwwPy0xOjB9LE9lPU1hdGguc3FydCxwcD1NYXRoLnRhbjtmdW5jdGlvbiB5cChpKXtyZXR1cm4gaT4xPzA6aTwtMT9aOk1hdGguYWNvcyhpKX1mdW5jdGlvbiBEZShpKXtyZXR1cm4gaT4xP050Omk8LTE/LU50Ok1hdGguYXNpbihpKX1mdW5jdGlvbiBLbChpKXtyZXR1cm4oaT1xKGkvMikpKml9ZnVuY3Rpb24gX3QoKXt9ZnVuY3Rpb24gaHIoaSx0KXtpJiZlaC5oYXNPd25Qcm9wZXJ0eShpLnR5cGUpJiZlaFtpLnR5cGVdKGksdCl9dmFyIHRoPXtGZWF0dXJlOmZ1bmN0aW9uKGksdCl7aHIoaS5nZW9tZXRyeSx0KX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5mZWF0dXJlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KWhyKGVbbl0uZ2VvbWV0cnksdCl9fSxlaD17U3BoZXJlOmZ1bmN0aW9uKGksdCl7dC5zcGhlcmUoKX0sUG9pbnQ6ZnVuY3Rpb24oaSx0KXtpPWkuY29vcmRpbmF0ZXMsdC5wb2ludChpWzBdLGlbMV0saVsyXSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KWk9ZVtuXSx0LnBvaW50KGlbMF0saVsxXSxpWzJdKX0sTGluZVN0cmluZzpmdW5jdGlvbihpLHQpe0VhKGkuY29vcmRpbmF0ZXMsdCwwKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuY29vcmRpbmF0ZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylFYShlW25dLHQsMCl9LFBvbHlnb246ZnVuY3Rpb24oaSx0KXtuaChpLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KW5oKGVbbl0sdCl9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmdlb21ldHJpZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylocihlW25dLHQpfX07ZnVuY3Rpb24gRWEoaSx0LGUpe3ZhciBuPS0xLHM9aS5sZW5ndGgtZSxyO2Zvcih0LmxpbmVTdGFydCgpOysrbjxzOylyPWlbbl0sdC5wb2ludChyWzBdLHJbMV0sclsyXSk7dC5saW5lRW5kKCl9ZnVuY3Rpb24gbmgoaSx0KXt2YXIgZT0tMSxuPWkubGVuZ3RoO2Zvcih0LnBvbHlnb25TdGFydCgpOysrZTxuOylFYShpW2VdLHQsMSk7dC5wb2x5Z29uRW5kKCl9ZnVuY3Rpb24gdXIoaSx0KXtpJiZ0aC5oYXNPd25Qcm9wZXJ0eShpLnR5cGUpP3RoW2kudHlwZV0oaSx0KTpocihpLHQpfXZhciBmcj1uZXcgTGUsaWg9bmV3IExlLHNoLHJoLFBhLENhLEJhLCRlPXtwb2ludDpfdCxsaW5lU3RhcnQ6X3QsbGluZUVuZDpfdCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtmcj1uZXcgTGUsJGUubGluZVN0YXJ0PW1wLCRlLmxpbmVFbmQ9Z3B9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2YXIgaT0rZnI7aWguYWRkKGk8MD9SdCtpOmkpLHRoaXMubGluZVN0YXJ0PXRoaXMubGluZUVuZD10aGlzLnBvaW50PV90fSxzcGhlcmU6ZnVuY3Rpb24oKXtpaC5hZGQoUnQpfX07ZnVuY3Rpb24gbXAoKXskZS5wb2ludD14cH1mdW5jdGlvbiBncCgpe29oKHNoLHJoKX1mdW5jdGlvbiB4cChpLHQpeyRlLnBvaW50PW9oLHNoPWkscmg9dCxpKj1ILHQqPUgsUGE9aSxDYT1YKHQ9dC8yK2xyKSxCYT1xKHQpfWZ1bmN0aW9uIG9oKGksdCl7aSo9SCx0Kj1ILHQ9dC8yK2xyO3ZhciBlPWktUGEsbj1lPj0wPzE6LTEscz1uKmUscj1YKHQpLG89cSh0KSxhPUJhKm8sYz1DYSpyK2EqWChzKSxsPWEqbipxKHMpO2ZyLmFkZChyZShsLGMpKSxQYT1pLENhPXIsQmE9b31mdW5jdGlvbiBkcihpKXtyZXR1cm5bcmUoaVsxXSxpWzBdKSxEZShpWzJdKV19ZnVuY3Rpb24gU24oaSl7dmFyIHQ9aVswXSxlPWlbMV0sbj1YKGUpO3JldHVybltuKlgodCksbipxKHQpLHEoZSldfWZ1bmN0aW9uIHByKGksdCl7cmV0dXJuIGlbMF0qdFswXStpWzFdKnRbMV0raVsyXSp0WzJdfWZ1bmN0aW9uIHNpKGksdCl7cmV0dXJuW2lbMV0qdFsyXS1pWzJdKnRbMV0saVsyXSp0WzBdLWlbMF0qdFsyXSxpWzBdKnRbMV0taVsxXSp0WzBdXX1mdW5jdGlvbiBGYShpLHQpe2lbMF0rPXRbMF0saVsxXSs9dFsxXSxpWzJdKz10WzJdfWZ1bmN0aW9uIHlyKGksdCl7cmV0dXJuW2lbMF0qdCxpWzFdKnQsaVsyXSp0XX1mdW5jdGlvbiBtcihpKXt2YXIgdD1PZShpWzBdKmlbMF0raVsxXSppWzFdK2lbMl0qaVsyXSk7aVswXS89dCxpWzFdLz10LGlbMl0vPXR9dmFyIG90LEx0LHV0LHF0LF9uLGFoLGNoLHJpLEhpLGFuLFZlLFVlPXtwb2ludDpJYSxsaW5lU3RhcnQ6aGgsbGluZUVuZDp1aCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtVZS5wb2ludD1maCxVZS5saW5lU3RhcnQ9d3AsVWUubGluZUVuZD1icCxIaT1uZXcgTGUsJGUucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXskZS5wb2x5Z29uRW5kKCksVWUucG9pbnQ9SWEsVWUubGluZVN0YXJ0PWhoLFVlLmxpbmVFbmQ9dWgsZnI8MD8ob3Q9LSh1dD0xODApLEx0PS0ocXQ9OTApKTpIaT5LP3F0PTkwOkhpPC1LJiYoTHQ9LTkwKSxWZVswXT1vdCxWZVsxXT11dH0sc3BoZXJlOmZ1bmN0aW9uKCl7b3Q9LSh1dD0xODApLEx0PS0ocXQ9OTApfX07ZnVuY3Rpb24gSWEoaSx0KXthbi5wdXNoKFZlPVtvdD1pLHV0PWldKSx0PEx0JiYoTHQ9dCksdD5xdCYmKHF0PXQpfWZ1bmN0aW9uIGxoKGksdCl7dmFyIGU9U24oW2kqSCx0KkhdKTtpZihyaSl7dmFyIG49c2kocmksZSkscz1bblsxXSwtblswXSwwXSxyPXNpKHMsbik7bXIocikscj1kcihyKTt2YXIgbz1pLV9uLGE9bz4wPzE6LTEsYz1yWzBdKmh0KmEsbCxoPXR0KG8pPjE4MDtoXihhKl9uPGMmJmM8YSppKT8obD1yWzFdKmh0LGw+cXQmJihxdD1sKSk6KGM9KGMrMzYwKSUzNjAtMTgwLGheKGEqX248YyYmYzxhKmkpPyhsPS1yWzFdKmh0LGw8THQmJihMdD1sKSk6KHQ8THQmJihMdD10KSx0PnF0JiYocXQ9dCkpKSxoP2k8X24/SHQob3QsaSk+SHQob3QsdXQpJiYodXQ9aSk6SHQoaSx1dCk+SHQob3QsdXQpJiYob3Q9aSk6dXQ+PW90PyhpPG90JiYob3Q9aSksaT51dCYmKHV0PWkpKTppPl9uP0h0KG90LGkpPkh0KG90LHV0KSYmKHV0PWkpOkh0KGksdXQpPkh0KG90LHV0KSYmKG90PWkpfWVsc2UgYW4ucHVzaChWZT1bb3Q9aSx1dD1pXSk7dDxMdCYmKEx0PXQpLHQ+cXQmJihxdD10KSxyaT1lLF9uPWl9ZnVuY3Rpb24gaGgoKXtVZS5wb2ludD1saH1mdW5jdGlvbiB1aCgpe1ZlWzBdPW90LFZlWzFdPXV0LFVlLnBvaW50PUlhLHJpPW51bGx9ZnVuY3Rpb24gZmgoaSx0KXtpZihyaSl7dmFyIGU9aS1fbjtIaS5hZGQodHQoZSk+MTgwP2UrKGU+MD8zNjA6LTM2MCk6ZSl9ZWxzZSBhaD1pLGNoPXQ7JGUucG9pbnQoaSx0KSxsaChpLHQpfWZ1bmN0aW9uIHdwKCl7JGUubGluZVN0YXJ0KCl9ZnVuY3Rpb24gYnAoKXtmaChhaCxjaCksJGUubGluZUVuZCgpLHR0KEhpKT5LJiYob3Q9LSh1dD0xODApKSxWZVswXT1vdCxWZVsxXT11dCxyaT1udWxsfWZ1bmN0aW9uIEh0KGksdCl7cmV0dXJuKHQtPWkpPDA/dCszNjA6dH1mdW5jdGlvbiBNcChpLHQpe3JldHVybiBpWzBdLXRbMF19ZnVuY3Rpb24gZGgoaSx0KXtyZXR1cm4gaVswXTw9aVsxXT9pWzBdPD10JiZ0PD1pWzFdOnQ8aVswXXx8aVsxXTx0fWZ1bmN0aW9uIHBoKGkpe3ZhciB0LGUsbixzLHIsbyxhO2lmKHF0PXV0PS0ob3Q9THQ9MS8wKSxhbj1bXSx1cihpLFVlKSxlPWFuLmxlbmd0aCl7Zm9yKGFuLnNvcnQoTXApLHQ9MSxuPWFuWzBdLHI9W25dO3Q8ZTsrK3Qpcz1hblt0XSxkaChuLHNbMF0pfHxkaChuLHNbMV0pPyhIdChuWzBdLHNbMV0pPkh0KG5bMF0sblsxXSkmJihuWzFdPXNbMV0pLEh0KHNbMF0sblsxXSk+SHQoblswXSxuWzFdKSYmKG5bMF09c1swXSkpOnIucHVzaChuPXMpO2ZvcihvPS0xLzAsZT1yLmxlbmd0aC0xLHQ9MCxuPXJbZV07dDw9ZTtuPXMsKyt0KXM9clt0XSwoYT1IdChuWzFdLHNbMF0pKT5vJiYobz1hLG90PXNbMF0sdXQ9blsxXSl9cmV0dXJuIGFuPVZlPW51bGwsb3Q9PT0xLzB8fEx0PT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW290LEx0XSxbdXQscXRdXX12YXIgWGksZ3IseHIsd3IsYnIsTXIsQXIsU3Isa2EsTmEsUmEseWgsbWgsRXQsUHQsQ3QsZGU9e3NwaGVyZTpfdCxwb2ludDpMYSxsaW5lU3RhcnQ6Z2gsbGluZUVuZDp4aCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtkZS5saW5lU3RhcnQ9X3AsZGUubGluZUVuZD12cH0scG9seWdvbkVuZDpmdW5jdGlvbigpe2RlLmxpbmVTdGFydD1naCxkZS5saW5lRW5kPXhofX07ZnVuY3Rpb24gTGEoaSx0KXtpKj1ILHQqPUg7dmFyIGU9WCh0KTtHaShlKlgoaSksZSpxKGkpLHEodCkpfWZ1bmN0aW9uIEdpKGksdCxlKXsrK1hpLHhyKz0oaS14cikvWGksd3IrPSh0LXdyKS9YaSxicis9KGUtYnIpL1hpfWZ1bmN0aW9uIGdoKCl7ZGUucG9pbnQ9QXB9ZnVuY3Rpb24gQXAoaSx0KXtpKj1ILHQqPUg7dmFyIGU9WCh0KTtFdD1lKlgoaSksUHQ9ZSpxKGkpLEN0PXEodCksZGUucG9pbnQ9U3AsR2koRXQsUHQsQ3QpfWZ1bmN0aW9uIFNwKGksdCl7aSo9SCx0Kj1IO3ZhciBlPVgodCksbj1lKlgoaSkscz1lKnEoaSkscj1xKHQpLG89cmUoT2UoKG89UHQqci1DdCpzKSpvKyhvPUN0Km4tRXQqcikqbysobz1FdCpzLVB0Km4pKm8pLEV0Km4rUHQqcytDdCpyKTtncis9byxNcis9byooRXQrKEV0PW4pKSxBcis9byooUHQrKFB0PXMpKSxTcis9byooQ3QrKEN0PXIpKSxHaShFdCxQdCxDdCl9ZnVuY3Rpb24geGgoKXtkZS5wb2ludD1MYX1mdW5jdGlvbiBfcCgpe2RlLnBvaW50PXpwfWZ1bmN0aW9uIHZwKCl7d2goeWgsbWgpLGRlLnBvaW50PUxhfWZ1bmN0aW9uIHpwKGksdCl7eWg9aSxtaD10LGkqPUgsdCo9SCxkZS5wb2ludD13aDt2YXIgZT1YKHQpO0V0PWUqWChpKSxQdD1lKnEoaSksQ3Q9cSh0KSxHaShFdCxQdCxDdCl9ZnVuY3Rpb24gd2goaSx0KXtpKj1ILHQqPUg7dmFyIGU9WCh0KSxuPWUqWChpKSxzPWUqcShpKSxyPXEodCksbz1QdCpyLUN0KnMsYT1DdCpuLUV0KnIsYz1FdCpzLVB0Km4sbD1UYShvLGEsYyksaD1EZShsKSx1PWwmJi1oL2w7a2EuYWRkKHUqbyksTmEuYWRkKHUqYSksUmEuYWRkKHUqYyksZ3IrPWgsTXIrPWgqKEV0KyhFdD1uKSksQXIrPWgqKFB0KyhQdD1zKSksU3IrPWgqKEN0KyhDdD1yKSksR2koRXQsUHQsQ3QpfWZ1bmN0aW9uIGJoKGkpe1hpPWdyPXhyPXdyPWJyPU1yPUFyPVNyPTAsa2E9bmV3IExlLE5hPW5ldyBMZSxSYT1uZXcgTGUsdXIoaSxkZSk7dmFyIHQ9K2thLGU9K05hLG49K1JhLHM9VGEodCxlLG4pO3JldHVybiBzPGNyJiYodD1NcixlPUFyLG49U3IsZ3I8SyYmKHQ9eHIsZT13cixuPWJyKSxzPVRhKHQsZSxuKSxzPGNyKT9bTmFOLE5hTl06W3JlKGUsdCkqaHQsRGUobi9zKSpodF19ZnVuY3Rpb24gT2EoaSx0KXtmdW5jdGlvbiBlKG4scyl7cmV0dXJuIG49aShuLHMpLHQoblswXSxuWzFdKX1yZXR1cm4gaS5pbnZlcnQmJnQuaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24obixzKXtyZXR1cm4gbj10LmludmVydChuLHMpLG4mJmkuaW52ZXJ0KG5bMF0sblsxXSl9KSxlfWZ1bmN0aW9uIERhKGksdCl7cmV0dXJuIHR0KGkpPlomJihpLT1NYXRoLnJvdW5kKGkvUnQpKlJ0KSxbaSx0XX1EYS5pbnZlcnQ9RGE7ZnVuY3Rpb24gTWgoaSx0LGUpe3JldHVybihpJT1SdCk/dHx8ZT9PYShTaChpKSxfaCh0LGUpKTpTaChpKTp0fHxlP19oKHQsZSk6RGF9ZnVuY3Rpb24gQWgoaSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrPWksdHQodCk+WiYmKHQtPU1hdGgucm91bmQodC9SdCkqUnQpLFt0LGVdfX1mdW5jdGlvbiBTaChpKXt2YXIgdD1BaChpKTtyZXR1cm4gdC5pbnZlcnQ9QWgoLWkpLHR9ZnVuY3Rpb24gX2goaSx0KXt2YXIgZT1YKGkpLG49cShpKSxzPVgodCkscj1xKHQpO2Z1bmN0aW9uIG8oYSxjKXt2YXIgbD1YKGMpLGg9WChhKSpsLHU9cShhKSpsLGY9cShjKSxkPWYqZStoKm47cmV0dXJuW3JlKHUqcy1kKnIsaCplLWYqbiksRGUoZCpzK3UqcildfXJldHVybiBvLmludmVydD1mdW5jdGlvbihhLGMpe3ZhciBsPVgoYyksaD1YKGEpKmwsdT1xKGEpKmwsZj1xKGMpLGQ9ZipzLXUqcjtyZXR1cm5bcmUodSpzK2YqcixoKmUrZCpuKSxEZShkKmUtaCpuKV19LG99ZnVuY3Rpb24gdmgoaSl7aT1NaChpWzBdKkgsaVsxXSpILGkubGVuZ3RoPjI/aVsyXSpIOjApO2Z1bmN0aW9uIHQoZSl7cmV0dXJuIGU9aShlWzBdKkgsZVsxXSpIKSxlWzBdKj1odCxlWzFdKj1odCxlfXJldHVybiB0LmludmVydD1mdW5jdGlvbihlKXtyZXR1cm4gZT1pLmludmVydChlWzBdKkgsZVsxXSpIKSxlWzBdKj1odCxlWzFdKj1odCxlfSx0fWZ1bmN0aW9uIFRwKGksdCxlLG4scyxyKXtpZihlKXt2YXIgbz1YKHQpLGE9cSh0KSxjPW4qZTtzPT1udWxsPyhzPXQrbipSdCxyPXQtYy8yKToocz16aChvLHMpLHI9emgobyxyKSwobj4wP3M8cjpzPnIpJiYocys9bipSdCkpO2Zvcih2YXIgbCxoPXM7bj4wP2g+cjpoPHI7aC09YylsPWRyKFtvLC1hKlgoaCksLWEqcShoKV0pLGkucG9pbnQobFswXSxsWzFdKX19ZnVuY3Rpb24gemgoaSx0KXt0PVNuKHQpLHRbMF0tPWksbXIodCk7dmFyIGU9eXAoLXRbMV0pO3JldHVybigoLXRbMl08MD8tZTplKStSdC1LKSVSdH1mdW5jdGlvbiBUaCgpe3ZhciBpPVtdLHQ7cmV0dXJue3BvaW50OmZ1bmN0aW9uKGUsbixzKXt0LnB1c2goW2UsbixzXSl9LGxpbmVTdGFydDpmdW5jdGlvbigpe2kucHVzaCh0PVtdKX0sbGluZUVuZDpfdCxyZWpvaW46ZnVuY3Rpb24oKXtpLmxlbmd0aD4xJiZpLnB1c2goaS5wb3AoKS5jb25jYXQoaS5zaGlmdCgpKSl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciBlPWk7cmV0dXJuIGk9W10sdD1udWxsLGV9fX1mdW5jdGlvbiBfcihpLHQpe3JldHVybiB0dChpWzBdLXRbMF0pPEsmJnR0KGlbMV0tdFsxXSk8S31mdW5jdGlvbiB2cihpLHQsZSxuKXt0aGlzLng9aSx0aGlzLno9dCx0aGlzLm89ZSx0aGlzLmU9bix0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIEVoKGksdCxlLG4scyl7dmFyIHI9W10sbz1bXSxhLGM7aWYoaS5mb3JFYWNoKGZ1bmN0aW9uKHApe2lmKCEoKHk9cC5sZW5ndGgtMSk8PTApKXt2YXIgeSxtPXBbMF0sZz1wW3ldLGI7aWYoX3IobSxnKSl7aWYoIW1bMl0mJiFnWzJdKXtmb3Iocy5saW5lU3RhcnQoKSxhPTA7YTx5OysrYSlzLnBvaW50KChtPXBbYV0pWzBdLG1bMV0pO3MubGluZUVuZCgpO3JldHVybn1nWzBdKz0yKkt9ci5wdXNoKGI9bmV3IHZyKG0scCxudWxsLCEwKSksby5wdXNoKGIubz1uZXcgdnIobSxudWxsLGIsITEpKSxyLnB1c2goYj1uZXcgdnIoZyxwLG51bGwsITEpKSxvLnB1c2goYi5vPW5ldyB2cihnLG51bGwsYiwhMCkpfX0pLCEhci5sZW5ndGgpe2ZvcihvLnNvcnQodCksUGgociksUGgobyksYT0wLGM9by5sZW5ndGg7YTxjOysrYSlvW2FdLmU9ZT0hZTtmb3IodmFyIGw9clswXSxoLHU7Oyl7Zm9yKHZhciBmPWwsZD0hMDtmLnY7KWlmKChmPWYubik9PT1sKXJldHVybjtoPWYueixzLmxpbmVTdGFydCgpO2Rve2lmKGYudj1mLm8udj0hMCxmLmUpe2lmKGQpZm9yKGE9MCxjPWgubGVuZ3RoO2E8YzsrK2Epcy5wb2ludCgodT1oW2FdKVswXSx1WzFdKTtlbHNlIG4oZi54LGYubi54LDEscyk7Zj1mLm59ZWxzZXtpZihkKWZvcihoPWYucC56LGE9aC5sZW5ndGgtMTthPj0wOy0tYSlzLnBvaW50KCh1PWhbYV0pWzBdLHVbMV0pO2Vsc2UgbihmLngsZi5wLngsLTEscyk7Zj1mLnB9Zj1mLm8saD1mLnosZD0hZH13aGlsZSghZi52KTtzLmxpbmVFbmQoKX19fWZ1bmN0aW9uIFBoKGkpe2lmKHQ9aS5sZW5ndGgpe2Zvcih2YXIgdCxlPTAsbj1pWzBdLHM7KytlPHQ7KW4ubj1zPWlbZV0scy5wPW4sbj1zO24ubj1zPWlbMF0scy5wPW59fWZ1bmN0aW9uICRhKGkpe3JldHVybiB0dChpWzBdKTw9Wj9pWzBdOmRwKGlbMF0pKigodHQoaVswXSkrWiklUnQtWil9ZnVuY3Rpb24gQ2goaSx0KXt2YXIgZT0kYSh0KSxuPXRbMV0scz1xKG4pLHI9W3EoZSksLVgoZSksMF0sbz0wLGE9MCxjPW5ldyBMZTtzPT09MT9uPU50K0s6cz09PS0xJiYobj0tTnQtSyk7Zm9yKHZhciBsPTAsaD1pLmxlbmd0aDtsPGg7KytsKWlmKGY9KHU9aVtsXSkubGVuZ3RoKWZvcih2YXIgdSxmLGQ9dVtmLTFdLHA9JGEoZCkseT1kWzFdLzIrbHIsbT1xKHkpLGc9WCh5KSxiPTA7YjxmOysrYixwPXgsbT1BLGc9UyxkPXcpe3ZhciB3PXVbYl0seD0kYSh3KSxNPXdbMV0vMitscixBPXEoTSksUz1YKE0pLF89eC1wLEU9Xz49MD8xOi0xLHo9RSpfLHY9ej5aLEM9bSpBO2lmKGMuYWRkKHJlKEMqRSpxKHopLGcqUytDKlgoeikpKSxvKz12P18rRSpSdDpfLHZecD49ZV54Pj1lKXt2YXIgUD1zaShTbihkKSxTbih3KSk7bXIoUCk7dmFyIEY9c2kocixQKTttcihGKTt2YXIgQj0odl5fPj0wPy0xOjEpKkRlKEZbMl0pOyhuPkJ8fG49PT1CJiYoUFswXXx8UFsxXSkpJiYoYSs9dl5fPj0wPzE6LTEpfX1yZXR1cm4obzwtS3x8bzxLJiZjPC1jcileYSYxfWZ1bmN0aW9uIEJoKGksdCxlLG4pe3JldHVybiBmdW5jdGlvbihzKXt2YXIgcj10KHMpLG89VGgoKSxhPXQobyksYz0hMSxsLGgsdSxmPXtwb2ludDpkLGxpbmVTdGFydDp5LGxpbmVFbmQ6bSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtmLnBvaW50PWcsZi5saW5lU3RhcnQ9YixmLmxpbmVFbmQ9dyxoPVtdLGw9W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtmLnBvaW50PWQsZi5saW5lU3RhcnQ9eSxmLmxpbmVFbmQ9bSxoPXFpKGgpO3ZhciB4PUNoKGwsbik7aC5sZW5ndGg/KGN8fChzLnBvbHlnb25TdGFydCgpLGM9ITApLEVoKGgsUHAseCxlLHMpKTp4JiYoY3x8KHMucG9seWdvblN0YXJ0KCksYz0hMCkscy5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLHMpLHMubGluZUVuZCgpKSxjJiYocy5wb2x5Z29uRW5kKCksYz0hMSksaD1sPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe3MucG9seWdvblN0YXJ0KCkscy5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLHMpLHMubGluZUVuZCgpLHMucG9seWdvbkVuZCgpfX07ZnVuY3Rpb24gZCh4LE0pe2koeCxNKSYmcy5wb2ludCh4LE0pfWZ1bmN0aW9uIHAoeCxNKXtyLnBvaW50KHgsTSl9ZnVuY3Rpb24geSgpe2YucG9pbnQ9cCxyLmxpbmVTdGFydCgpfWZ1bmN0aW9uIG0oKXtmLnBvaW50PWQsci5saW5lRW5kKCl9ZnVuY3Rpb24gZyh4LE0pe3UucHVzaChbeCxNXSksYS5wb2ludCh4LE0pfWZ1bmN0aW9uIGIoKXthLmxpbmVTdGFydCgpLHU9W119ZnVuY3Rpb24gdygpe2codVswXVswXSx1WzBdWzFdKSxhLmxpbmVFbmQoKTt2YXIgeD1hLmNsZWFuKCksTT1vLnJlc3VsdCgpLEEsUz1NLmxlbmd0aCxfLEUsejtpZih1LnBvcCgpLGwucHVzaCh1KSx1PW51bGwsISFTKXtpZih4JjEpe2lmKEU9TVswXSwoXz1FLmxlbmd0aC0xKT4wKXtmb3IoY3x8KHMucG9seWdvblN0YXJ0KCksYz0hMCkscy5saW5lU3RhcnQoKSxBPTA7QTxfOysrQSlzLnBvaW50KCh6PUVbQV0pWzBdLHpbMV0pO3MubGluZUVuZCgpfXJldHVybn1TPjEmJngmMiYmTS5wdXNoKE0ucG9wKCkuY29uY2F0KE0uc2hpZnQoKSkpLGgucHVzaChNLmZpbHRlcihFcCkpfX1yZXR1cm4gZn19ZnVuY3Rpb24gRXAoaSl7cmV0dXJuIGkubGVuZ3RoPjF9ZnVuY3Rpb24gUHAoaSx0KXtyZXR1cm4oKGk9aS54KVswXTwwP2lbMV0tTnQtSzpOdC1pWzFdKS0oKHQ9dC54KVswXTwwP3RbMV0tTnQtSzpOdC10WzFdKX12YXIgRmg9QmgoZnVuY3Rpb24oKXtyZXR1cm4hMH0sQ3AsRnAsWy1aLC1OdF0pO2Z1bmN0aW9uIENwKGkpe3ZhciB0PU5hTixlPU5hTixuPU5hTixzO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtpLmxpbmVTdGFydCgpLHM9MX0scG9pbnQ6ZnVuY3Rpb24ocixvKXt2YXIgYT1yPjA/WjotWixjPXR0KHItdCk7dHQoYy1aKTxLPyhpLnBvaW50KHQsZT0oZStvKS8yPjA/TnQ6LU50KSxpLnBvaW50KG4sZSksaS5saW5lRW5kKCksaS5saW5lU3RhcnQoKSxpLnBvaW50KGEsZSksaS5wb2ludChyLGUpLHM9MCk6biE9PWEmJmM+PVomJih0dCh0LW4pPEsmJih0LT1uKkspLHR0KHItYSk8SyYmKHItPWEqSyksZT1CcCh0LGUscixvKSxpLnBvaW50KG4sZSksaS5saW5lRW5kKCksaS5saW5lU3RhcnQoKSxpLnBvaW50KGEsZSkscz0wKSxpLnBvaW50KHQ9cixlPW8pLG49YX0sbGluZUVuZDpmdW5jdGlvbigpe2kubGluZUVuZCgpLHQ9ZT1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItc319fWZ1bmN0aW9uIEJwKGksdCxlLG4pe3ZhciBzLHIsbz1xKGktZSk7cmV0dXJuIHR0KG8pPks/emEoKHEodCkqKHI9WChuKSkqcShlKS1xKG4pKihzPVgodCkpKnEoaSkpLyhzKnIqbykpOih0K24pLzJ9ZnVuY3Rpb24gRnAoaSx0LGUsbil7dmFyIHM7aWYoaT09bnVsbClzPWUqTnQsbi5wb2ludCgtWixzKSxuLnBvaW50KDAscyksbi5wb2ludChaLHMpLG4ucG9pbnQoWiwwKSxuLnBvaW50KFosLXMpLG4ucG9pbnQoMCwtcyksbi5wb2ludCgtWiwtcyksbi5wb2ludCgtWiwwKSxuLnBvaW50KC1aLHMpO2Vsc2UgaWYodHQoaVswXS10WzBdKT5LKXt2YXIgcj1pWzBdPHRbMF0/WjotWjtzPWUqci8yLG4ucG9pbnQoLXIscyksbi5wb2ludCgwLHMpLG4ucG9pbnQocixzKX1lbHNlIG4ucG9pbnQodFswXSx0WzFdKX1mdW5jdGlvbiBJcChpKXt2YXIgdD1YKGkpLGU9MipILG49dD4wLHM9dHQodCk+SztmdW5jdGlvbiByKGgsdSxmLGQpe1RwKGQsaSxlLGYsaCx1KX1mdW5jdGlvbiBvKGgsdSl7cmV0dXJuIFgoaCkqWCh1KT50fWZ1bmN0aW9uIGEoaCl7dmFyIHUsZixkLHAseTtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7cD1kPSExLHk9MX0scG9pbnQ6ZnVuY3Rpb24obSxnKXt2YXIgYj1bbSxnXSx3LHg9byhtLGcpLE09bj94PzA6bChtLGcpOng/bChtKyhtPDA/WjotWiksZyk6MDtpZighdSYmKHA9ZD14KSYmaC5saW5lU3RhcnQoKSx4IT09ZCYmKHc9Yyh1LGIpLCghd3x8X3IodSx3KXx8X3IoYix3KSkmJihiWzJdPTEpKSx4IT09ZCl5PTAseD8oaC5saW5lU3RhcnQoKSx3PWMoYix1KSxoLnBvaW50KHdbMF0sd1sxXSkpOih3PWModSxiKSxoLnBvaW50KHdbMF0sd1sxXSwyKSxoLmxpbmVFbmQoKSksdT13O2Vsc2UgaWYocyYmdSYmbl54KXt2YXIgQTshKE0mZikmJihBPWMoYix1LCEwKSkmJih5PTAsbj8oaC5saW5lU3RhcnQoKSxoLnBvaW50KEFbMF1bMF0sQVswXVsxXSksaC5wb2ludChBWzFdWzBdLEFbMV1bMV0pLGgubGluZUVuZCgpKTooaC5wb2ludChBWzFdWzBdLEFbMV1bMV0pLGgubGluZUVuZCgpLGgubGluZVN0YXJ0KCksaC5wb2ludChBWzBdWzBdLEFbMF1bMV0sMykpKX14JiYoIXV8fCFfcih1LGIpKSYmaC5wb2ludChiWzBdLGJbMV0pLHU9YixkPXgsZj1NfSxsaW5lRW5kOmZ1bmN0aW9uKCl7ZCYmaC5saW5lRW5kKCksdT1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiB5fChwJiZkKTw8MX19fWZ1bmN0aW9uIGMoaCx1LGYpe3ZhciBkPVNuKGgpLHA9U24odSkseT1bMSwwLDBdLG09c2koZCxwKSxnPXByKG0sbSksYj1tWzBdLHc9Zy1iKmI7aWYoIXcpcmV0dXJuIWYmJmg7dmFyIHg9dCpnL3csTT0tdCpiL3csQT1zaSh5LG0pLFM9eXIoeSx4KSxfPXlyKG0sTSk7RmEoUyxfKTt2YXIgRT1BLHo9cHIoUyxFKSx2PXByKEUsRSksQz16KnotdioocHIoUyxTKS0xKTtpZighKEM8MCkpe3ZhciBQPU9lKEMpLEY9eXIoRSwoLXotUCkvdik7aWYoRmEoRixTKSxGPWRyKEYpLCFmKXJldHVybiBGO3ZhciBCPWhbMF0sST11WzBdLGs9aFsxXSxEPXVbMV0sVTtJPEImJihVPUIsQj1JLEk9VSk7dmFyIGo9SS1CLGR0PXR0KGotWik8SyxEdD1kdHx8ajxLO2lmKCFkdCYmRDxrJiYoVT1rLGs9RCxEPVUpLER0P2R0P2srRD4wXkZbMV08KHR0KEZbMF0tQik8Sz9rOkQpOms8PUZbMV0mJkZbMV08PUQ6aj5aXihCPD1GWzBdJiZGWzBdPD1JKSl7dmFyIEd0PXlyKEUsKC16K1ApL3YpO3JldHVybiBGYShHdCxTKSxbRixkcihHdCldfX19ZnVuY3Rpb24gbChoLHUpe3ZhciBmPW4/aTpaLWksZD0wO3JldHVybiBoPC1mP2R8PTE6aD5mJiYoZHw9MiksdTwtZj9kfD00OnU+ZiYmKGR8PTgpLGR9cmV0dXJuIEJoKG8sYSxyLG4/WzAsLWldOlstWixpLVpdKX1mdW5jdGlvbiBrcChpLHQsZSxuLHMscil7dmFyIG89aVswXSxhPWlbMV0sYz10WzBdLGw9dFsxXSxoPTAsdT0xLGY9Yy1vLGQ9bC1hLHA7aWYocD1lLW8sISghZiYmcD4wKSl7aWYocC89ZixmPDApe2lmKHA8aClyZXR1cm47cDx1JiYodT1wKX1lbHNlIGlmKGY+MCl7aWYocD51KXJldHVybjtwPmgmJihoPXApfWlmKHA9cy1vLCEoIWYmJnA8MCkpe2lmKHAvPWYsZjwwKXtpZihwPnUpcmV0dXJuO3A+aCYmKGg9cCl9ZWxzZSBpZihmPjApe2lmKHA8aClyZXR1cm47cDx1JiYodT1wKX1pZihwPW4tYSwhKCFkJiZwPjApKXtpZihwLz1kLGQ8MCl7aWYocDxoKXJldHVybjtwPHUmJih1PXApfWVsc2UgaWYoZD4wKXtpZihwPnUpcmV0dXJuO3A+aCYmKGg9cCl9aWYocD1yLWEsISghZCYmcDwwKSl7aWYocC89ZCxkPDApe2lmKHA+dSlyZXR1cm47cD5oJiYoaD1wKX1lbHNlIGlmKGQ+MCl7aWYocDxoKXJldHVybjtwPHUmJih1PXApfXJldHVybiBoPjAmJihpWzBdPW8raCpmLGlbMV09YStoKmQpLHU8MSYmKHRbMF09byt1KmYsdFsxXT1hK3UqZCksITB9fX19fXZhciBXaT0xZTksenI9LVdpO2Z1bmN0aW9uIE5wKGksdCxlLG4pe2Z1bmN0aW9uIHMobCxoKXtyZXR1cm4gaTw9bCYmbDw9ZSYmdDw9aCYmaDw9bn1mdW5jdGlvbiByKGwsaCx1LGYpe3ZhciBkPTAscD0wO2lmKGw9PW51bGx8fChkPW8obCx1KSkhPT0ocD1vKGgsdSkpfHxjKGwsaCk8MF51PjApZG8gZi5wb2ludChkPT09MHx8ZD09PTM/aTplLGQ+MT9uOnQpO3doaWxlKChkPShkK3UrNCklNCkhPT1wKTtlbHNlIGYucG9pbnQoaFswXSxoWzFdKX1mdW5jdGlvbiBvKGwsaCl7cmV0dXJuIHR0KGxbMF0taSk8Sz9oPjA/MDozOnR0KGxbMF0tZSk8Sz9oPjA/MjoxOnR0KGxbMV0tdCk8Sz9oPjA/MTowOmg+MD8zOjJ9ZnVuY3Rpb24gYShsLGgpe3JldHVybiBjKGwueCxoLngpfWZ1bmN0aW9uIGMobCxoKXt2YXIgdT1vKGwsMSksZj1vKGgsMSk7cmV0dXJuIHUhPT1mP3UtZjp1PT09MD9oWzFdLWxbMV06dT09PTE/bFswXS1oWzBdOnU9PT0yP2xbMV0taFsxXTpoWzBdLWxbMF19cmV0dXJuIGZ1bmN0aW9uKGwpe3ZhciBoPWwsdT1UaCgpLGYsZCxwLHksbSxnLGIsdyx4LE0sQSxTPXtwb2ludDpfLGxpbmVTdGFydDpDLGxpbmVFbmQ6UCxwb2x5Z29uU3RhcnQ6eixwb2x5Z29uRW5kOnZ9O2Z1bmN0aW9uIF8oQixJKXtzKEIsSSkmJmgucG9pbnQoQixJKX1mdW5jdGlvbiBFKCl7Zm9yKHZhciBCPTAsST0wLGs9ZC5sZW5ndGg7STxrOysrSSlmb3IodmFyIEQ9ZFtJXSxVPTEsaj1ELmxlbmd0aCxkdD1EWzBdLER0LEd0LFd0PWR0WzBdLHllPWR0WzFdO1U8ajsrK1UpRHQ9V3QsR3Q9eWUsZHQ9RFtVXSxXdD1kdFswXSx5ZT1kdFsxXSxHdDw9bj95ZT5uJiYoV3QtRHQpKihuLUd0KT4oeWUtR3QpKihpLUR0KSYmKytCOnllPD1uJiYoV3QtRHQpKihuLUd0KTwoeWUtR3QpKihpLUR0KSYmLS1CO3JldHVybiBCfWZ1bmN0aW9uIHooKXtoPXUsZj1bXSxkPVtdLEE9ITB9ZnVuY3Rpb24gdigpe3ZhciBCPUUoKSxJPUEmJkIsaz0oZj1xaShmKSkubGVuZ3RoOyhJfHxrKSYmKGwucG9seWdvblN0YXJ0KCksSSYmKGwubGluZVN0YXJ0KCkscihudWxsLG51bGwsMSxsKSxsLmxpbmVFbmQoKSksayYmRWgoZixhLEIscixsKSxsLnBvbHlnb25FbmQoKSksaD1sLGY9ZD1wPW51bGx9ZnVuY3Rpb24gQygpe1MucG9pbnQ9RixkJiZkLnB1c2gocD1bXSksTT0hMCx4PSExLGI9dz1OYU59ZnVuY3Rpb24gUCgpe2YmJihGKHksbSksZyYmeCYmdS5yZWpvaW4oKSxmLnB1c2godS5yZXN1bHQoKSkpLFMucG9pbnQ9Xyx4JiZoLmxpbmVFbmQoKX1mdW5jdGlvbiBGKEIsSSl7dmFyIGs9cyhCLEkpO2lmKGQmJnAucHVzaChbQixJXSksTSl5PUIsbT1JLGc9ayxNPSExLGsmJihoLmxpbmVTdGFydCgpLGgucG9pbnQoQixJKSk7ZWxzZSBpZihrJiZ4KWgucG9pbnQoQixJKTtlbHNle3ZhciBEPVtiPU1hdGgubWF4KHpyLE1hdGgubWluKFdpLGIpKSx3PU1hdGgubWF4KHpyLE1hdGgubWluKFdpLHcpKV0sVT1bQj1NYXRoLm1heCh6cixNYXRoLm1pbihXaSxCKSksST1NYXRoLm1heCh6cixNYXRoLm1pbihXaSxJKSldO2twKEQsVSxpLHQsZSxuKT8oeHx8KGgubGluZVN0YXJ0KCksaC5wb2ludChEWzBdLERbMV0pKSxoLnBvaW50KFVbMF0sVVsxXSksa3x8aC5saW5lRW5kKCksQT0hMSk6ayYmKGgubGluZVN0YXJ0KCksaC5wb2ludChCLEkpLEE9ITEpfWI9Qix3PUkseD1rfXJldHVybiBTfX12YXIgVmEsVWEsVHIsRXIsb2k9e3NwaGVyZTpfdCxwb2ludDpfdCxsaW5lU3RhcnQ6UnAsbGluZUVuZDpfdCxwb2x5Z29uU3RhcnQ6X3QscG9seWdvbkVuZDpfdH07ZnVuY3Rpb24gUnAoKXtvaS5wb2ludD1PcCxvaS5saW5lRW5kPUxwfWZ1bmN0aW9uIExwKCl7b2kucG9pbnQ9b2kubGluZUVuZD1fdH1mdW5jdGlvbiBPcChpLHQpe2kqPUgsdCo9SCxVYT1pLFRyPXEodCksRXI9WCh0KSxvaS5wb2ludD1EcH1mdW5jdGlvbiBEcChpLHQpe2kqPUgsdCo9SDt2YXIgZT1xKHQpLG49WCh0KSxzPXR0KGktVWEpLHI9WChzKSxvPXEocyksYT1uKm8sYz1FciplLVRyKm4qcixsPVRyKmUrRXIqbipyO1ZhLmFkZChyZShPZShhKmErYypjKSxsKSksVWE9aSxUcj1lLEVyPW59ZnVuY3Rpb24gJHAoaSl7cmV0dXJuIFZhPW5ldyBMZSx1cihpLG9pKSwrVmF9dmFyIHFhPVtudWxsLG51bGxdLFZwPXt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpxYX07ZnVuY3Rpb24gYWkoaSx0KXtyZXR1cm4gcWFbMF09aSxxYVsxXT10LCRwKFZwKX12YXIgSWg9e0ZlYXR1cmU6ZnVuY3Rpb24oaSx0KXtyZXR1cm4gUHIoaS5nZW9tZXRyeSx0KX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5mZWF0dXJlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KWlmKFByKGVbbl0uZ2VvbWV0cnksdCkpcmV0dXJuITA7cmV0dXJuITF9fSxraD17U3BoZXJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBvaW50OmZ1bmN0aW9uKGksdCl7cmV0dXJuIE5oKGkuY29vcmRpbmF0ZXMsdCl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KWlmKE5oKGVbbl0sdCkpcmV0dXJuITA7cmV0dXJuITF9LExpbmVTdHJpbmc6ZnVuY3Rpb24oaSx0KXtyZXR1cm4gUmgoaS5jb29yZGluYXRlcyx0KX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuY29vcmRpbmF0ZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylpZihSaChlW25dLHQpKXJldHVybiEwO3JldHVybiExfSxQb2x5Z29uOmZ1bmN0aW9uKGksdCl7cmV0dXJuIExoKGkuY29vcmRpbmF0ZXMsdCl9LE11bHRpUG9seWdvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspaWYoTGgoZVtuXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuZ2VvbWV0cmllcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KWlmKFByKGVbbl0sdCkpcmV0dXJuITA7cmV0dXJuITF9fTtmdW5jdGlvbiBQcihpLHQpe3JldHVybiBpJiZraC5oYXNPd25Qcm9wZXJ0eShpLnR5cGUpP2toW2kudHlwZV0oaSx0KTohMX1mdW5jdGlvbiBOaChpLHQpe3JldHVybiBhaShpLHQpPT09MH1mdW5jdGlvbiBSaChpLHQpe2Zvcih2YXIgZSxuLHMscj0wLG89aS5sZW5ndGg7cjxvO3IrKyl7aWYobj1haShpW3JdLHQpLG49PT0wfHxyPjAmJihzPWFpKGlbcl0saVtyLTFdKSxzPjAmJmU8PXMmJm48PXMmJihlK24tcykqKDEtTWF0aC5wb3coKGUtbikvcywyKSk8Y3IqcykpcmV0dXJuITA7ZT1ufXJldHVybiExfWZ1bmN0aW9uIExoKGksdCl7cmV0dXJuISFDaChpLm1hcChVcCksT2godCkpfWZ1bmN0aW9uIFVwKGkpe3JldHVybiBpPWkubWFwKE9oKSxpLnBvcCgpLGl9ZnVuY3Rpb24gT2goaSl7cmV0dXJuW2lbMF0qSCxpWzFdKkhdfWZ1bmN0aW9uIHFwKGksdCl7cmV0dXJuKGkmJkloLmhhc093blByb3BlcnR5KGkudHlwZSk/SWhbaS50eXBlXTpQcikoaSx0KX1mdW5jdGlvbiBIcChpLHQpe3ZhciBlPWlbMF0qSCxuPWlbMV0qSCxzPXRbMF0qSCxyPXRbMV0qSCxvPVgobiksYT1xKG4pLGM9WChyKSxsPXEociksaD1vKlgoZSksdT1vKnEoZSksZj1jKlgocyksZD1jKnEocykscD0yKkRlKE9lKEtsKHItbikrbypjKktsKHMtZSkpKSx5PXEocCksbT1wP2Z1bmN0aW9uKGcpe3ZhciBiPXEoZyo9cCkveSx3PXEocC1nKS95LHg9dypoK2IqZixNPXcqdStiKmQsQT13KmErYipsO3JldHVybltyZShNLHgpKmh0LHJlKEEsT2UoeCp4K00qTSkpKmh0XX06ZnVuY3Rpb24oKXtyZXR1cm5bZSpodCxuKmh0XX07cmV0dXJuIG0uZGlzdGFuY2U9cCxtfXZhciBEaD1pPT5pLGNpPTEvMCxDcj1jaSxaaT0tY2ksQnI9WmksJGg9e3BvaW50OlhwLGxpbmVTdGFydDpfdCxsaW5lRW5kOl90LHBvbHlnb25TdGFydDpfdCxwb2x5Z29uRW5kOl90LHJlc3VsdDpmdW5jdGlvbigpe3ZhciBpPVtbY2ksQ3JdLFtaaSxCcl1dO3JldHVybiBaaT1Ccj0tKENyPWNpPTEvMCksaX19O2Z1bmN0aW9uIFhwKGksdCl7aTxjaSYmKGNpPWkpLGk+WmkmJihaaT1pKSx0PENyJiYoQ3I9dCksdD5CciYmKEJyPXQpfWZ1bmN0aW9uIEhhKGkpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1uZXcgWGE7Zm9yKHZhciBuIGluIGkpZVtuXT1pW25dO3JldHVybiBlLnN0cmVhbT10LGV9fWZ1bmN0aW9uIFhhKCl7fVhhLnByb3RvdHlwZT17Y29uc3RydWN0b3I6WGEscG9pbnQ6ZnVuY3Rpb24oaSx0KXt0aGlzLnN0cmVhbS5wb2ludChpLHQpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07ZnVuY3Rpb24gR2EoaSx0LGUpe3ZhciBuPWkuY2xpcEV4dGVudCYmaS5jbGlwRXh0ZW50KCk7cmV0dXJuIGkuc2NhbGUoMTUwKS50cmFuc2xhdGUoWzAsMF0pLG4hPW51bGwmJmkuY2xpcEV4dGVudChudWxsKSx1cihlLGkuc3RyZWFtKCRoKSksdCgkaC5yZXN1bHQoKSksbiE9bnVsbCYmaS5jbGlwRXh0ZW50KG4pLGl9ZnVuY3Rpb24gVmgoaSx0LGUpe3JldHVybiBHYShpLGZ1bmN0aW9uKG4pe3ZhciBzPXRbMV1bMF0tdFswXVswXSxyPXRbMV1bMV0tdFswXVsxXSxvPU1hdGgubWluKHMvKG5bMV1bMF0tblswXVswXSksci8oblsxXVsxXS1uWzBdWzFdKSksYT0rdFswXVswXSsocy1vKihuWzFdWzBdK25bMF1bMF0pKS8yLGM9K3RbMF1bMV0rKHItbyooblsxXVsxXStuWzBdWzFdKSkvMjtpLnNjYWxlKDE1MCpvKS50cmFuc2xhdGUoW2EsY10pfSxlKX1mdW5jdGlvbiBHcChpLHQsZSl7cmV0dXJuIFZoKGksW1swLDBdLHRdLGUpfWZ1bmN0aW9uIFdwKGksdCxlKXtyZXR1cm4gR2EoaSxmdW5jdGlvbihuKXt2YXIgcz0rdCxyPXMvKG5bMV1bMF0tblswXVswXSksbz0ocy1yKihuWzFdWzBdK25bMF1bMF0pKS8yLGE9LXIqblswXVsxXTtpLnNjYWxlKDE1MCpyKS50cmFuc2xhdGUoW28sYV0pfSxlKX1mdW5jdGlvbiBacChpLHQsZSl7cmV0dXJuIEdhKGksZnVuY3Rpb24obil7dmFyIHM9K3Qscj1zLyhuWzFdWzFdLW5bMF1bMV0pLG89LXIqblswXVswXSxhPShzLXIqKG5bMV1bMV0rblswXVsxXSkpLzI7aS5zY2FsZSgxNTAqcikudHJhbnNsYXRlKFtvLGFdKX0sZSl9dmFyIFVoPTE2LEpwPVgoMzAqSCk7ZnVuY3Rpb24gcWgoaSx0KXtyZXR1cm4rdD9qcChpLHQpOllwKGkpfWZ1bmN0aW9uIFlwKGkpe3JldHVybiBIYSh7cG9pbnQ6ZnVuY3Rpb24odCxlKXt0PWkodCxlKSx0aGlzLnN0cmVhbS5wb2ludCh0WzBdLHRbMV0pfX0pfWZ1bmN0aW9uIGpwKGksdCl7ZnVuY3Rpb24gZShuLHMscixvLGEsYyxsLGgsdSxmLGQscCx5LG0pe3ZhciBnPWwtbixiPWgtcyx3PWcqZytiKmI7aWYodz40KnQmJnktLSl7dmFyIHg9bytmLE09YStkLEE9YytwLFM9T2UoeCp4K00qTStBKkEpLF89RGUoQS89UyksRT10dCh0dChBKS0xKTxLfHx0dChyLXUpPEs/KHIrdSkvMjpyZShNLHgpLHo9aShFLF8pLHY9elswXSxDPXpbMV0sUD12LW4sRj1DLXMsQj1iKlAtZypGOyhCKkIvdz50fHx0dCgoZypQK2IqRikvdy0uNSk+LjN8fG8qZithKmQrYypwPEpwKSYmKGUobixzLHIsbyxhLGMsdixDLEUseC89UyxNLz1TLEEseSxtKSxtLnBvaW50KHYsQyksZSh2LEMsRSx4LE0sQSxsLGgsdSxmLGQscCx5LG0pKX19cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBzLHIsbyxhLGMsbCxoLHUsZixkLHAseSxtPXtwb2ludDpnLGxpbmVTdGFydDpiLGxpbmVFbmQ6eCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25TdGFydCgpLG0ubGluZVN0YXJ0PU19LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25FbmQoKSxtLmxpbmVTdGFydD1ifX07ZnVuY3Rpb24gZyhfLEUpe189aShfLEUpLG4ucG9pbnQoX1swXSxfWzFdKX1mdW5jdGlvbiBiKCl7dT1OYU4sbS5wb2ludD13LG4ubGluZVN0YXJ0KCl9ZnVuY3Rpb24gdyhfLEUpe3ZhciB6PVNuKFtfLEVdKSx2PWkoXyxFKTtlKHUsZixoLGQscCx5LHU9dlswXSxmPXZbMV0saD1fLGQ9elswXSxwPXpbMV0seT16WzJdLFVoLG4pLG4ucG9pbnQodSxmKX1mdW5jdGlvbiB4KCl7bS5wb2ludD1nLG4ubGluZUVuZCgpfWZ1bmN0aW9uIE0oKXtiKCksbS5wb2ludD1BLG0ubGluZUVuZD1TfWZ1bmN0aW9uIEEoXyxFKXt3KHM9XyxFKSxyPXUsbz1mLGE9ZCxjPXAsbD15LG0ucG9pbnQ9d31mdW5jdGlvbiBTKCl7ZSh1LGYsaCxkLHAseSxyLG8scyxhLGMsbCxVaCxuKSxtLmxpbmVFbmQ9eCx4KCl9cmV0dXJuIG19fXZhciBRcD1IYSh7cG9pbnQ6ZnVuY3Rpb24oaSx0KXt0aGlzLnN0cmVhbS5wb2ludChpKkgsdCpIKX19KTtmdW5jdGlvbiBLcChpKXtyZXR1cm4gSGEoe3BvaW50OmZ1bmN0aW9uKHQsZSl7dmFyIG49aSh0LGUpO3JldHVybiB0aGlzLnN0cmVhbS5wb2ludChuWzBdLG5bMV0pfX0pfWZ1bmN0aW9uIHR5KGksdCxlLG4scyl7ZnVuY3Rpb24gcihvLGEpe3JldHVybiBvKj1uLGEqPXMsW3QraSpvLGUtaSphXX1yZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24obyxhKXtyZXR1cm5bKG8tdCkvaSpuLChlLWEpL2kqc119LHJ9ZnVuY3Rpb24gSGgoaSx0LGUsbixzLHIpe2lmKCFyKXJldHVybiB0eShpLHQsZSxuLHMpO3ZhciBvPVgociksYT1xKHIpLGM9byppLGw9YSppLGg9by9pLHU9YS9pLGY9KGEqZS1vKnQpL2ksZD0oYSp0K28qZSkvaTtmdW5jdGlvbiBwKHksbSl7cmV0dXJuIHkqPW4sbSo9cyxbYyp5LWwqbSt0LGUtbCp5LWMqbV19cmV0dXJuIHAuaW52ZXJ0PWZ1bmN0aW9uKHksbSl7cmV0dXJuW24qKGgqeS11Km0rZikscyooZC11KnktaCptKV19LHB9ZnVuY3Rpb24gRnIoaSl7cmV0dXJuIGV5KGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSgpfWZ1bmN0aW9uIGV5KGkpe3ZhciB0LGU9MTUwLG49NDgwLHM9MjUwLHI9MCxvPTAsYT0wLGM9MCxsPTAsaCx1PTAsZj0xLGQ9MSxwPW51bGwseT1GaCxtPW51bGwsZyxiLHcseD1EaCxNPS41LEEsUyxfLEUsejtmdW5jdGlvbiB2KEIpe3JldHVybiBfKEJbMF0qSCxCWzFdKkgpfWZ1bmN0aW9uIEMoQil7cmV0dXJuIEI9Xy5pbnZlcnQoQlswXSxCWzFdKSxCJiZbQlswXSpodCxCWzFdKmh0XX12LnN0cmVhbT1mdW5jdGlvbihCKXtyZXR1cm4gRSYmej09PUI/RTpFPVFwKEtwKGgpKHkoQSh4KHo9QikpKSkpfSx2LnByZWNsaXA9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9QixwPXZvaWQgMCxGKCkpOnl9LHYucG9zdGNsaXA9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9QixtPWc9Yj13PW51bGwsRigpKTp4fSx2LmNsaXBBbmdsZT1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0rQj9JcChwPUIqSCk6KHA9bnVsbCxGaCksRigpKTpwKmh0fSx2LmNsaXBFeHRlbnQ9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9Qj09bnVsbD8obT1nPWI9dz1udWxsLERoKTpOcChtPStCWzBdWzBdLGc9K0JbMF1bMV0sYj0rQlsxXVswXSx3PStCWzFdWzFdKSxGKCkpOm09PW51bGw/bnVsbDpbW20sZ10sW2Isd11dfSx2LnNjYWxlPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPStCLFAoKSk6ZX0sdi50cmFuc2xhdGU9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K0JbMF0scz0rQlsxXSxQKCkpOltuLHNdfSx2LmNlbnRlcj1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1CWzBdJTM2MCpILG89QlsxXSUzNjAqSCxQKCkpOltyKmh0LG8qaHRdfSx2LnJvdGF0ZT1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1CWzBdJTM2MCpILGM9QlsxXSUzNjAqSCxsPUIubGVuZ3RoPjI/QlsyXSUzNjAqSDowLFAoKSk6W2EqaHQsYypodCxsKmh0XX0sdi5hbmdsZT1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1CJTM2MCpILFAoKSk6dSpodH0sdi5yZWZsZWN0WD1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1CPy0xOjEsUCgpKTpmPDB9LHYucmVmbGVjdFk9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9Qj8tMToxLFAoKSk6ZDwwfSx2LnByZWNpc2lvbj1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQT1xaChTLE09QipCKSxGKCkpOk9lKE0pfSx2LmZpdEV4dGVudD1mdW5jdGlvbihCLEkpe3JldHVybiBWaCh2LEIsSSl9LHYuZml0U2l6ZT1mdW5jdGlvbihCLEkpe3JldHVybiBHcCh2LEIsSSl9LHYuZml0V2lkdGg9ZnVuY3Rpb24oQixJKXtyZXR1cm4gV3AodixCLEkpfSx2LmZpdEhlaWdodD1mdW5jdGlvbihCLEkpe3JldHVybiBacCh2LEIsSSl9O2Z1bmN0aW9uIFAoKXt2YXIgQj1IaChlLDAsMCxmLGQsdSkuYXBwbHkobnVsbCx0KHIsbykpLEk9SGgoZSxuLUJbMF0scy1CWzFdLGYsZCx1KTtyZXR1cm4gaD1NaChhLGMsbCksUz1PYSh0LEkpLF89T2EoaCxTKSxBPXFoKFMsTSksRigpfWZ1bmN0aW9uIEYoKXtyZXR1cm4gRT16PW51bGwsdn1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx2LmludmVydD10LmludmVydCYmQyxQKCl9fWZ1bmN0aW9uIG55KGkpe3JldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPU9lKHQqdCtlKmUpLHM9aShuKSxyPXEocyksbz1YKHMpO3JldHVybltyZSh0KnIsbipvKSxEZShuJiZlKnIvbildfX1mdW5jdGlvbiBXYShpLHQpe3JldHVybltpLGZwKHBwKChOdCt0KS8yKSldfVdhLmludmVydD1mdW5jdGlvbihpLHQpe3JldHVybltpLDIqemEodXAodCkpLU50XX07ZnVuY3Rpb24gaXkoKXtyZXR1cm4gc3koV2EpLnNjYWxlKDk2MS9SdCl9ZnVuY3Rpb24gc3koaSl7dmFyIHQ9RnIoaSksZT10LmNlbnRlcixuPXQuc2NhbGUscz10LnRyYW5zbGF0ZSxyPXQuY2xpcEV4dGVudCxvPW51bGwsYSxjLGw7dC5zY2FsZT1mdW5jdGlvbih1KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obih1KSxoKCkpOm4oKX0sdC50cmFuc2xhdGU9ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHModSksaCgpKTpzKCl9LHQuY2VudGVyPWZ1bmN0aW9uKHUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlKHUpLGgoKSk6ZSgpfSx0LmNsaXBFeHRlbnQ9ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9PW51bGw/bz1hPWM9bD1udWxsOihvPSt1WzBdWzBdLGE9K3VbMF1bMV0sYz0rdVsxXVswXSxsPSt1WzFdWzFdKSxoKCkpOm89PW51bGw/bnVsbDpbW28sYV0sW2MsbF1dfTtmdW5jdGlvbiBoKCl7dmFyIHU9WipuKCksZj10KHZoKHQucm90YXRlKCkpLmludmVydChbMCwwXSkpO3JldHVybiByKG89PW51bGw/W1tmWzBdLXUsZlsxXS11XSxbZlswXSt1LGZbMV0rdV1dOmk9PT1XYT9bW01hdGgubWF4KGZbMF0tdSxvKSxhXSxbTWF0aC5taW4oZlswXSt1LGMpLGxdXTpbW28sTWF0aC5tYXgoZlsxXS11LGEpXSxbYyxNYXRoLm1pbihmWzFdK3UsbCldXSl9cmV0dXJuIGgoKX1mdW5jdGlvbiBaYShpLHQpe3JldHVybltpLHRdfVphLmludmVydD1aYTtmdW5jdGlvbiByeSgpe3JldHVybiBGcihaYSkuc2NhbGUoMTUyLjYzKX1mdW5jdGlvbiBYaChpLHQpe3ZhciBlPVgodCksbj0xK1goaSkqZTtyZXR1cm5bZSpxKGkpL24scSh0KS9uXX1YaC5pbnZlcnQ9bnkoZnVuY3Rpb24oaSl7cmV0dXJuIDIqemEoaSl9KTtmdW5jdGlvbiBveSgpe3JldHVybiBGcihYaCkuc2NhbGUoMjUwKS5jbGlwQW5nbGUoMTQyKX12YXIgSXI9TWF0aC5hYnMsbGk9TWF0aC5jb3MsYmU9TWF0aC5zaW4sSmk9MWUtNixrcj1NYXRoLlBJLEphPWtyLzI7ZnVuY3Rpb24gYXkoaSl7cmV0dXJuIGk/aS9NYXRoLnNpbihpKToxfWZ1bmN0aW9uIFlhKGkpe3JldHVybiBpPjE/MDppPC0xP2tyOk1hdGguYWNvcyhpKX1mdW5jdGlvbiBHaChpKXtyZXR1cm4gaT4wP01hdGguc3FydChpKTowfWZ1bmN0aW9uIFdoKGksdCl7dmFyIGU9bGkodCksbj1heShZYShlKmxpKGkvPTIpKSk7cmV0dXJuWzIqZSpiZShpKSpuLGJlKHQpKm5dfVdoLmludmVydD1mdW5jdGlvbihpLHQpe2lmKCEoaSppKzQqdCp0PmtyKmtyK0ppKSl7dmFyIGU9aSxuPXQscz0yNTtkb3t2YXIgcj1iZShlKSxvPWJlKGUvMiksYT1saShlLzIpLGM9YmUobiksbD1saShuKSxoPWJlKDIqbiksdT1jKmMsZj1sKmwsZD1vKm8scD0xLWYqYSphLHk9cD9ZYShsKmEpKkdoKG09MS9wKTptPTAsbSxnPTIqeSpsKm8taSxiPXkqYy10LHc9bSooZipkK3kqbCphKnUpLHg9bSooLjUqcipoLXkqMipjKm8pLE09bSouMjUqKGgqby15KmMqZipyKSxBPW0qKHUqYSt5KmQqbCksUz14Kk0tQSp3O2lmKCFTKWJyZWFrO3ZhciBfPShiKngtZypBKS9TLEU9KGcqTS1iKncpL1M7ZS09XyxuLT1FfXdoaWxlKChJcihfKT5KaXx8SXIoRSk+SmkpJiYtLXM+MCk7cmV0dXJuW2Usbl19fTtmdW5jdGlvbiBaaChpLHQpe3ZhciBlPVdoKGksdCk7cmV0dXJuWyhlWzBdK2kvSmEpLzIsKGVbMV0rdCkvMl19WmguaW52ZXJ0PWZ1bmN0aW9uKGksdCl7dmFyIGU9aSxuPXQscz0yNTtkb3t2YXIgcj1saShuKSxvPWJlKG4pLGE9YmUoMipuKSxjPW8qbyxsPXIqcixoPWJlKGUpLHU9bGkoZS8yKSxmPWJlKGUvMiksZD1mKmYscD0xLWwqdSp1LHk9cD9ZYShyKnUpKkdoKG09MS9wKTptPTAsbSxnPS41KigyKnkqcipmK2UvSmEpLWksYj0uNSooeSpvK24pLXQsdz0uNSptKihsKmQreSpyKnUqYykrLjUvSmEseD1tKihoKmEvNC15Km8qZiksTT0uMTI1Km0qKGEqZi15Km8qbCpoKSxBPS41Km0qKGMqdSt5KmQqcikrLjUsUz14Kk0tQSp3LF89KGIqeC1nKkEpL1MsRT0oZypNLWIqdykvUztlLT1fLG4tPUV9d2hpbGUoKElyKF8pPkppfHxJcihFKT5KaSkmJi0tcz4wKTtyZXR1cm5bZSxuXX07ZnVuY3Rpb24gY3koKXtyZXR1cm4gRnIoWmgpLnNjYWxlKDE1OC44MzcpfWNvbnN0IGx5PXttZXJjYXRvcjppeSxlcXVpcmVjdGFuZ3VsYXI6cnksd2lua2VsMzpjeX0samE9e30sWWk9aT0+e3ZhciBuLHMscjtjb25zdCB0PUpTT04uc3RyaW5naWZ5KGkpO2lmKGphW3RdKXJldHVybiBqYVt0XTtjb25zdCBlPWx5WyhuPWkucHJvamVjdGlvblR5cGUpIT1udWxsP246Im1lcmNhdG9yIl0oKS5jZW50ZXIoaS5jZW50ZXIpLnNjYWxlKGkuc2NhbGUpLnRyYW5zbGF0ZSgocz1pLnRyYW5zbGF0ZSkhPW51bGw/czpbMCwwXSkucHJlY2lzaW9uKChyPWkucHJlY2lzaW9uKSE9bnVsbD9yOi4xKTtyZXR1cm4gaS5yb3RhdGUmJmUucm90YXRlKGkucm90YXRlKSxqYVt0XT1lLGV9O2Z1bmN0aW9uIGh5KGksdCxlPTApe2NvbnN0IG49KDkwLXQpKk1hdGguUEkvMTgwLHM9KDkwLWkpKk1hdGguUEkvMTgwO3JldHVybltlKk1hdGguc2luKG4pKk1hdGguY29zKHMpLGUqTWF0aC5jb3MobiksZSpNYXRoLnNpbihuKSpNYXRoLnNpbihzKV19Y29uc3QgTnI9KGksdCk9PmkubWFwKChbZSxuXSk9PntsZXQgcztpZih0KXtjb25zdFtyLG9dPXQoW2Usbl0pO3M9bmV3IFIociwtbyl9ZWxzZSBzPW5ldyBSKGUsbik7cmV0dXJuIHN9KTt2YXIgamk9KGksdCk9Pntjb25zdCBlPWpsKGksdCE9bnVsbD90OjApLG49e30scz1bXSxyPU9iamVjdC5rZXlzKGUuYXR0cmlidXRlcyk7cmV0dXJuIGUuaW5kZXgmJnIucHVzaCgiaW5kZXgiKSxyLmZvckVhY2gobz0+e2NvbnN0IGE9bz09PSJpbmRleCI/ZS5pbmRleDplLmF0dHJpYnV0ZXNbb107bltvXT17YXJyYXk6YS5hcnJheSxpdGVtU2l6ZTphLml0ZW1TaXplfSxzLnB1c2goYS5hcnJheS5idWZmZXIpfSksdCYmKG4uZ3JvdXBzPWUuZ3JvdXBzKSxlLmRpc3Bvc2UoKSxpLmZvckVhY2gobz0+e28uZGlzcG9zZSgpfSkse21lc3NhZ2U6bix0cmFuc2ZlcjpzfX0sUWE9KGksdD0zMDApPT57Y29uc3QgZT1bXTtyZXR1cm4gaS5mb3JFYWNoKG49PntsZXQgcz0hMTtmb3IobGV0IHI9MTtyPG4ubGVuZ3RoO3IrKylpZihNYXRoLmFicyhuW3JdLngtbltyLTFdLngpPnQpe3M9ITA7YnJlYWt9aWYocyl7Y29uc3Qgcj1bXSxvPVtdO24uZm9yRWFjaChhPT57YS54PDA/ci5wdXNoKGEpOm8ucHVzaChhKX0pLGUucHVzaChyLG8pfWVsc2UgZS5wdXNoKG4pfSksZX07ZnVuY3Rpb24gdXkoaSx0LGU9MCl7Y29uc3RbbixzLHIsb109aTtsZXQgYT0xLzAsYz0xLzAsbD0tMS8wLGg9LTEvMDtmb3IobGV0IHU9MDt1PD1lO3UrKyl7Y29uc3QgZj1lJiZ1L2U7TnIoW1tuK2YqKHItbiksc10sW24rZiooci1uKSxvXSxbbixzK2YqKG8tcyldLFtyLHMrZiooby1zKV1dLHQpLmZvckVhY2goZD0+e2E9TWF0aC5taW4oYSxkLngpLGM9TWF0aC5taW4oYyxkLnkpLGw9TWF0aC5tYXgobCxkLngpLGg9TWF0aC5tYXgoaCxkLnkpfSl9cmV0dXJuW1thLGNdLFtsLGhdXX1jb25zdCBmeT0oe2Nvb3JkaW5hdGVzQXJyOmksc3BsaXQ6dCxzaWRlUmVwZWF0OmUsYmJveDpuLGRlcHRoOnMscHJvamVjdGlvbjpyLHVzZUdyb3VwczpvLGhhc1RvcDphLGhhc0JvdHRvbTpjLGhhc1NpZGU6bCxzcGxpdFBvbHlnb25zOmgsdG9wU2VnbWVudHM6dX0pPT57Y29uc3QgZj1yJiZZaShyKTtsZXQgZD1pLm1hcChtPT5OcihtLGYpKTtoJiYoZD1RYShkLGgpKTtsZXQgcDtpZihuKXtjb25zdFttLGddPXV5KG4sciE9bnVsbCYmci5yb3RhdGU/WWkoV2UoRnQoe30scikse3JvdGF0ZTp2b2lkIDB9KSk6Ziwocj09bnVsbD92b2lkIDA6ci5wcm9qZWN0aW9uVHlwZSk9PT0id2lua2VsMyI/MTA6MCk7cD1uZXcgZ3QobmV3IFQobVswXSxtWzFdLDApLG5ldyBUKGdbMF0sZ1sxXSwwKSl9Y29uc3QgeT1kLm1hcCgobSxnKT0+e3ZhciBiO3JldHVybiBLMCh7cG9pbnRzOm0sc3BsaXQ6dCxzaWRlUmVwZWF0OmUsZGVwdGg6KGI9c1tnXSkhPW51bGw/YjpzWzBdLGhhc1RvcDphLGhhc0JvdHRvbTpjLGhhc1NpZGU6bCxib3gzOnAsdG9wU2VnbWVudHM6dX0pfSk7cmV0dXJuIGppKHksbyl9O2NsYXNzIGR5IGV4dGVuZHMgZ2V7Y29uc3RydWN0b3IodD1bXSxlPSJub25lIixuKXtzdXBlcigpLHRoaXMudHlwZT0iTWVzaExpbmVHZW9tZXRyeSIsdGhpcy5wb2ludENvdW50PTAsdGhpcy5fcG9pbnRzPVtdLHRoaXMuc2hhcGU9Im5vbmUiLHRoaXMuc2hhcGVGdW5jdGlvbj1zPT4xLHRoaXMubWF0cml4V29ybGQ9bmV3IHN0LHRoaXMuc2hhcGU9ZSxuJiYodGhpcy5zaGFwZUZ1bmN0aW9uPW4pLHQubGVuZ3RoPjAmJnRoaXMuc2V0UG9pbnRzKHQpfWNvbnZlcnRUb1ZlY3RvcjNBcnJheSh0KXtpZih0eXBlb2YgdFswXT09Im51bWJlciIpe2NvbnN0IGU9W10sbj10O2ZvcihsZXQgcz0wO3M8bi5sZW5ndGg7cys9MyllLnB1c2gobmV3IFQobltzXSxuW3MrMV0sbltzKzJdKSk7cmV0dXJuIGV9ZWxzZSByZXR1cm4gdC5tYXAoZT0+e2lmKGUgaW5zdGFuY2VvZiBSKXJldHVybiBuZXcgVChlLngsZS55LDApO2lmKGUgaW5zdGFuY2VvZiBUKXJldHVybiBlO2lmKEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPT09MilyZXR1cm4gbmV3IFQoZVswXSxlWzFdLDApO2lmKEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPT09MylyZXR1cm4gbmV3IFQoZVswXSxlWzFdLGVbMl0pfSkuZmlsdGVyKEJvb2xlYW4pfXNldE1hdHJpeFdvcmxkKHQpe3RoaXMubWF0cml4V29ybGQ9dH1zZXRQb2ludHModCxlKXshdHx8dC5sZW5ndGg9PT0wfHwodGhpcy5fcG9pbnRzPXRoaXMuY29udmVydFRvVmVjdG9yM0FycmF5KHQpLHRoaXMucG9pbnRDb3VudD10aGlzLl9wb2ludHMubGVuZ3RoLGUmJih0aGlzLnNoYXBlRnVuY3Rpb249ZSx0aGlzLnNoYXBlPSJjdXN0b20iKSx0aGlzLmluaXRpYWxpemVHZW9tZXRyeSgpLHRoaXMudXBkYXRlR2VvbWV0cnkoKSl9aW5pdGlhbGl6ZUdlb21ldHJ5KCl7Y29uc3QgdD1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqNiksMyksZT1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqNiksMyksbj1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqNiksMykscz1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqMiksMSkscj1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqMiksMSksbz1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqMiksMSksYT1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqNCksMiksYz1uZXcgeHQobmV3IFVpbnQxNkFycmF5KCh0aGlzLnBvaW50Q291bnQtMSkqNiksMSk7dGhpcy5zaGFwZT09PSJ0YXBlciImJih0aGlzLnNoYXBlRnVuY3Rpb249bD0+MSpNYXRoLnBvdyg0KmwqKDEtbCksMSkpO2ZvcihsZXQgbD0wLGg9MCx1PTA7bDx0aGlzLnBvaW50Q291bnQ7bCs9MSxoKz0yLHUrPTYpe3Muc2V0WChoLGwvdGhpcy5wb2ludENvdW50KSxzLnNldFgoaCsxLGwvdGhpcy5wb2ludENvdW50KSxyLnNldFgoaCwxKSxyLnNldFgoaCsxLC0xKTtjb25zdCBmPXRoaXMuc2hhcGU9PT0ibm9uZSI/MTp0aGlzLnNoYXBlRnVuY3Rpb24obC8odGhpcy5wb2ludENvdW50LTEpKTtvLnNldFgoaCxmKSxvLnNldFgoaCsxLGYpO2NvbnN0IGQ9bC8odGhpcy5wb2ludENvdW50LTEpO2lmKGEuc2V0WFkoaCxkLDApLGEuc2V0WFkoaCsxLGQsMSksbDx0aGlzLnBvaW50Q291bnQtMSl7Y29uc3QgcD1sKjI7Yy5zZXRYKHUrMCxwKzApLGMuc2V0WCh1KzEscCsxKSxjLnNldFgodSsyLHArMiksYy5zZXRYKHUrMyxwKzIpLGMuc2V0WCh1KzQscCsxKSxjLnNldFgodSs1LHArMyl9fXRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsdCksdGhpcy5zZXRBdHRyaWJ1dGUoInByZXZpb3VzIixlKSx0aGlzLnNldEF0dHJpYnV0ZSgibmV4dCIsbiksdGhpcy5zZXRBdHRyaWJ1dGUoImNvdW50ZXJzIixzKSx0aGlzLnNldEF0dHJpYnV0ZSgic2lkZSIsciksdGhpcy5zZXRBdHRyaWJ1dGUoIndpZHRoIixvKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLGEpLHRoaXMuc2V0SW5kZXgoYyl9dXBkYXRlR2VvbWV0cnkoKXtpZighdGhpcy5fcG9pbnRzWzBdKXJldHVybjtjb25zdCB0PXRoaXMuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLGU9dGhpcy5nZXRBdHRyaWJ1dGUoInByZXZpb3VzIiksbj10aGlzLmdldEF0dHJpYnV0ZSgibmV4dCIpO2xldCBzPTAscj0wLG89MDtjb25zdCBhPXRoaXMuX3BvaW50c1swXTtlLnNldFhZWihyLGEueCxhLnksYS56KSxyKz0xLGUuc2V0WFlaKHIsYS54LGEueSxhLnopLHIrPTE7Zm9yKGxldCBsPTA7bDx0aGlzLnBvaW50Q291bnQ7bCsrKXtjb25zdCBoPXRoaXMuX3BvaW50c1tsXTt0LnNldFhZWihzLGgueCxoLnksaC56KSxzKz0xLHQuc2V0WFlaKHMsaC54LGgueSxoLnopLHMrPTEsbDx0aGlzLnBvaW50Q291bnQtMSYmKGUuc2V0WFlaKHIsaC54LGgueSxoLnopLHIrPTEsZS5zZXRYWVoocixoLngsaC55LGgueikscis9MSksbD4wJiZsKzE8PXRoaXMucG9pbnRDb3VudCYmKG4uc2V0WFlaKG8saC54LGgueSxoLnopLG8rPTEsbi5zZXRYWVoobyxoLngsaC55LGgueiksbys9MSl9Y29uc3QgYz10aGlzLl9wb2ludHNbdGhpcy5wb2ludENvdW50LTFdO24uc2V0WFlaKG8sYy54LGMueSxjLnopLG8rPTEsbi5zZXRYWVoobyxjLngsYy55LGMueiksbys9MSx0Lm5lZWRzVXBkYXRlPSEwLGUubmVlZHNVcGRhdGU9ITAsbi5uZWVkc1VwZGF0ZT0hMCx0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCl9Z2V0IHBvaW50cygpe3JldHVybiB0aGlzLl9wb2ludHN9c2V0IHBvaW50cyh0KXt0aGlzLnNldFBvaW50cyh0KX11cGRhdGVQb2ludHModCxlKXtjb25zdCBuPXRoaXMuY29udmVydFRvVmVjdG9yM0FycmF5KHQpO2lmKG4ubGVuZ3RoIT09dGhpcy5wb2ludENvdW50KXtjb25zb2xlLndhcm4oIk1lc2hMaW5lR2VvbWV0cnk6IENhbm5vdCB1cGRhdGUgcG9pbnRzIHdpdGggZGlmZmVyZW50IGxlbmd0aC4gVXNlIHNldFBvaW50cygpIGluc3RlYWQuIik7cmV0dXJufXRoaXMuX3BvaW50cz1uLGUmJih0aGlzLnNoYXBlRnVuY3Rpb249ZSx0aGlzLnNoYXBlPSJjdXN0b20iLHRoaXMuaW5pdGlhbGl6ZUdlb21ldHJ5KCkpLHRoaXMudXBkYXRlR2VvbWV0cnkoKX1zZXRTaGFwZSh0LGUpe3RoaXMuc2hhcGU9dCxlJiYodGhpcy5zaGFwZUZ1bmN0aW9uPWUpLHRoaXMuX3BvaW50cy5sZW5ndGg+MCYmKHRoaXMuaW5pdGlhbGl6ZUdlb21ldHJ5KCksdGhpcy51cGRhdGVHZW9tZXRyeSgpKX19dmFyIEpoPWk9Pntjb25zdHtzZXRQb2ludFdpZHRoOnQsbm9kZXM6ZX09aSxuPW5ldyBkeTtyZXR1cm4gbi5zZXRQb2ludHMoZSx0KSxufTtjb25zdCBweT0oe2Nvb3JkaW5hdGVzQXJyOmkscHJvamVjdGlvbjp0LGxpbmVXaWR0aDplLHVzZUdyb3VwczpuLHNwbGl0UG9seWdvbnM6c30pPT57Y29uc3Qgcj10JiZZaSh0KTtsZXQgbz1pLm1hcChjPT5OcihjLHIpKTtzJiYobz1RYShvLHMpKTtjb25zdCBhPW8ubWFwKChjLGwpPT57dmFyIHU7Y29uc3QgaD0odT1lW2xdKSE9bnVsbD91OmVbMF07cmV0dXJuIEpoKHtub2RlczpjLHNldFBvaW50V2lkdGg6KCk9Pmh9KX0pO3JldHVybiBqaShhLG4pfTt2YXIgeXk9aT0+e2NvbnN0e3BvaW50czp0fT1pLGU9dC5yZWR1Y2UoKHMscixvKT0+KG88dC5sZW5ndGgtMSYmcy5wdXNoKHIsdFtvKzFdKSxzKSxbXSk7cmV0dXJuIG5ldyBnZSgpLnNldEZyb21Qb2ludHMoZSl9O2NvbnN0IG15PSh7Y29vcmRpbmF0ZXNBcnI6aSxwcm9qZWN0aW9uOnQsbGluZVdpZHRoOmUsdXNlR3JvdXBzOm4sc3BsaXRQb2x5Z29uczpzfSk9Pntjb25zdCByPXQmJllpKHQpO2xldCBvPWkubWFwKGM9Pk5yKGMscikpO3MmJihvPVFhKG8scykpO2NvbnN0IGE9by5tYXAoKGMsbCk9Pnl5KHtwb2ludHM6Yy5tYXAoaD0+bmV3IFQoaC54LGgueSwwKSl9KSk7cmV0dXJuIGppKGEsbil9O2Z1bmN0aW9uIGd5KGksdCxlPTIpe2NvbnN0IG49dCYmdC5sZW5ndGgscz1uP3RbMF0qZTppLmxlbmd0aDtsZXQgcj1ZaChpLDAscyxlLCEwKTtjb25zdCBvPVtdO2lmKCFyfHxyLm5leHQ9PT1yLnByZXYpcmV0dXJuIG87bGV0IGEsYyxsO2lmKG4mJihyPUF5KGksdCxyLGUpKSxpLmxlbmd0aD44MCplKXthPTEvMCxjPTEvMDtsZXQgaD0tMS8wLHU9LTEvMDtmb3IobGV0IGY9ZTtmPHM7Zis9ZSl7Y29uc3QgZD1pW2ZdLHA9aVtmKzFdO2Q8YSYmKGE9ZCkscDxjJiYoYz1wKSxkPmgmJihoPWQpLHA+dSYmKHU9cCl9bD1NYXRoLm1heChoLWEsdS1jKSxsPWwhPT0wPzMyNzY3L2w6MH1yZXR1cm4gUWkocixvLGUsYSxjLGwsMCksb31mdW5jdGlvbiBZaChpLHQsZSxuLHMpe2xldCByO2lmKHM9PT1JeShpLHQsZSxuKT4wKWZvcihsZXQgbz10O288ZTtvKz1uKXI9S2goby9ufDAsaVtvXSxpW28rMV0scik7ZWxzZSBmb3IobGV0IG89ZS1uO28+PXQ7by09bilyPUtoKG8vbnwwLGlbb10saVtvKzFdLHIpO3JldHVybiByJiZScihyLHIubmV4dCkmJih0cyhyKSxyPXIubmV4dCkscn1mdW5jdGlvbiB2bihpLHQpe2lmKCFpKXJldHVybiBpO3R8fCh0PWkpO2xldCBlPWksbjtkbyBpZihuPSExLCFlLnN0ZWluZXImJihScihlLGUubmV4dCl8fGF0KGUucHJldixlLGUubmV4dCk9PT0wKSl7aWYodHMoZSksZT10PWUucHJldixlPT09ZS5uZXh0KWJyZWFrO249ITB9ZWxzZSBlPWUubmV4dDt3aGlsZShufHxlIT09dCk7cmV0dXJuIHR9ZnVuY3Rpb24gUWkoaSx0LGUsbixzLHIsbyl7aWYoIWkpcmV0dXJuOyFvJiZyJiZUeShpLG4scyxyKTtsZXQgYT1pO2Zvcig7aS5wcmV2IT09aS5uZXh0Oyl7Y29uc3QgYz1pLnByZXYsbD1pLm5leHQ7aWYocj93eShpLG4scyxyKTp4eShpKSl7dC5wdXNoKGMuaSxpLmksbC5pKSx0cyhpKSxpPWwubmV4dCxhPWwubmV4dDtjb250aW51ZX1pZihpPWwsaT09PWEpe28/bz09PTE/KGk9Ynkodm4oaSksdCksUWkoaSx0LGUsbixzLHIsMikpOm89PT0yJiZNeShpLHQsZSxuLHMscik6UWkodm4oaSksdCxlLG4scyxyLDEpO2JyZWFrfX19ZnVuY3Rpb24geHkoaSl7Y29uc3QgdD1pLnByZXYsZT1pLG49aS5uZXh0O2lmKGF0KHQsZSxuKT49MClyZXR1cm4hMTtjb25zdCBzPXQueCxyPWUueCxvPW4ueCxhPXQueSxjPWUueSxsPW4ueSxoPXM8cj9zPG8/czpvOnI8bz9yOm8sdT1hPGM/YTxsP2E6bDpjPGw/YzpsLGY9cz5yP3M+bz9zOm86cj5vP3I6byxkPWE+Yz9hPmw/YTpsOmM+bD9jOmw7bGV0IHA9bi5uZXh0O2Zvcig7cCE9PXQ7KXtpZihwLng+PWgmJnAueDw9ZiYmcC55Pj11JiZwLnk8PWQmJmhpKHMsYSxyLGMsbyxsLHAueCxwLnkpJiZhdChwLnByZXYscCxwLm5leHQpPj0wKXJldHVybiExO3A9cC5uZXh0fXJldHVybiEwfWZ1bmN0aW9uIHd5KGksdCxlLG4pe2NvbnN0IHM9aS5wcmV2LHI9aSxvPWkubmV4dDtpZihhdChzLHIsbyk+PTApcmV0dXJuITE7Y29uc3QgYT1zLngsYz1yLngsbD1vLngsaD1zLnksdT1yLnksZj1vLnksZD1hPGM/YTxsP2E6bDpjPGw/YzpsLHA9aDx1P2g8Zj9oOmY6dTxmP3U6Zix5PWE+Yz9hPmw/YTpsOmM+bD9jOmwsbT1oPnU/aD5mP2g6Zjp1PmY/dTpmLGc9S2EoZCxwLHQsZSxuKSxiPUthKHksbSx0LGUsbik7bGV0IHc9aS5wcmV2Wix4PWkubmV4dFo7Zm9yKDt3JiZ3Lno+PWcmJngmJnguejw9Yjspe2lmKHcueD49ZCYmdy54PD15JiZ3Lnk+PXAmJncueTw9bSYmdyE9PXMmJnchPT1vJiZoaShhLGgsYyx1LGwsZix3Lngsdy55KSYmYXQody5wcmV2LHcsdy5uZXh0KT49MHx8KHc9dy5wcmV2Wix4Lng+PWQmJngueDw9eSYmeC55Pj1wJiZ4Lnk8PW0mJnghPT1zJiZ4IT09byYmaGkoYSxoLGMsdSxsLGYseC54LHgueSkmJmF0KHgucHJldix4LHgubmV4dCk+PTApKXJldHVybiExO3g9eC5uZXh0Wn1mb3IoO3cmJncuej49Zzspe2lmKHcueD49ZCYmdy54PD15JiZ3Lnk+PXAmJncueTw9bSYmdyE9PXMmJnchPT1vJiZoaShhLGgsYyx1LGwsZix3Lngsdy55KSYmYXQody5wcmV2LHcsdy5uZXh0KT49MClyZXR1cm4hMTt3PXcucHJldlp9Zm9yKDt4JiZ4Lno8PWI7KXtpZih4Lng+PWQmJngueDw9eSYmeC55Pj1wJiZ4Lnk8PW0mJnghPT1zJiZ4IT09byYmaGkoYSxoLGMsdSxsLGYseC54LHgueSkmJmF0KHgucHJldix4LHgubmV4dCk+PTApcmV0dXJuITE7eD14Lm5leHRafXJldHVybiEwfWZ1bmN0aW9uIGJ5KGksdCl7bGV0IGU9aTtkb3tjb25zdCBuPWUucHJldixzPWUubmV4dC5uZXh0OyFScihuLHMpJiZqaChuLGUsZS5uZXh0LHMpJiZLaShuLHMpJiZLaShzLG4pJiYodC5wdXNoKG4uaSxlLmkscy5pKSx0cyhlKSx0cyhlLm5leHQpLGU9aT1zKSxlPWUubmV4dH13aGlsZShlIT09aSk7cmV0dXJuIHZuKGUpfWZ1bmN0aW9uIE15KGksdCxlLG4scyxyKXtsZXQgbz1pO2Rve2xldCBhPW8ubmV4dC5uZXh0O2Zvcig7YSE9PW8ucHJldjspe2lmKG8uaSE9PWEuaSYmQ3kobyxhKSl7bGV0IGM9UWgobyxhKTtvPXZuKG8sby5uZXh0KSxjPXZuKGMsYy5uZXh0KSxRaShvLHQsZSxuLHMsciwwKSxRaShjLHQsZSxuLHMsciwwKTtyZXR1cm59YT1hLm5leHR9bz1vLm5leHR9d2hpbGUobyE9PWkpfWZ1bmN0aW9uIEF5KGksdCxlLG4pe2NvbnN0IHM9W107Zm9yKGxldCByPTAsbz10Lmxlbmd0aDtyPG87cisrKXtjb25zdCBhPXRbcl0qbixjPXI8by0xP3RbcisxXSpuOmkubGVuZ3RoLGw9WWgoaSxhLGMsbiwhMSk7bD09PWwubmV4dCYmKGwuc3RlaW5lcj0hMCkscy5wdXNoKFB5KGwpKX1zLnNvcnQoU3kpO2ZvcihsZXQgcj0wO3I8cy5sZW5ndGg7cisrKWU9X3koc1tyXSxlKTtyZXR1cm4gZX1mdW5jdGlvbiBTeShpLHQpe3JldHVybiBpLngtdC54fWZ1bmN0aW9uIF95KGksdCl7Y29uc3QgZT12eShpLHQpO2lmKCFlKXJldHVybiB0O2NvbnN0IG49UWgoZSxpKTtyZXR1cm4gdm4obixuLm5leHQpLHZuKGUsZS5uZXh0KX1mdW5jdGlvbiB2eShpLHQpe2xldCBlPXQ7Y29uc3Qgbj1pLngscz1pLnk7bGV0IHI9LTEvMCxvO2Rve2lmKHM8PWUueSYmcz49ZS5uZXh0LnkmJmUubmV4dC55IT09ZS55KXtjb25zdCB1PWUueCsocy1lLnkpKihlLm5leHQueC1lLngpLyhlLm5leHQueS1lLnkpO2lmKHU8PW4mJnU+ciYmKHI9dSxvPWUueDxlLm5leHQueD9lOmUubmV4dCx1PT09bikpcmV0dXJuIG99ZT1lLm5leHR9d2hpbGUoZSE9PXQpO2lmKCFvKXJldHVybiBudWxsO2NvbnN0IGE9byxjPW8ueCxsPW8ueTtsZXQgaD0xLzA7ZT1vO2Rve2lmKG4+PWUueCYmZS54Pj1jJiZuIT09ZS54JiZoaShzPGw/bjpyLHMsYyxsLHM8bD9yOm4scyxlLngsZS55KSl7Y29uc3QgdT1NYXRoLmFicyhzLWUueSkvKG4tZS54KTtLaShlLGkpJiYodTxofHx1PT09aCYmKGUueD5vLnh8fGUueD09PW8ueCYmenkobyxlKSkpJiYobz1lLGg9dSl9ZT1lLm5leHR9d2hpbGUoZSE9PWEpO3JldHVybiBvfWZ1bmN0aW9uIHp5KGksdCl7cmV0dXJuIGF0KGkucHJldixpLHQucHJldik8MCYmYXQodC5uZXh0LGksaS5uZXh0KTwwfWZ1bmN0aW9uIFR5KGksdCxlLG4pe2xldCBzPWk7ZG8gcy56PT09MCYmKHMuej1LYShzLngscy55LHQsZSxuKSkscy5wcmV2Wj1zLnByZXYscy5uZXh0Wj1zLm5leHQscz1zLm5leHQ7d2hpbGUocyE9PWkpO3MucHJldloubmV4dFo9bnVsbCxzLnByZXZaPW51bGwsRXkocyl9ZnVuY3Rpb24gRXkoaSl7bGV0IHQsZT0xO2Rve2xldCBuPWkscztpPW51bGw7bGV0IHI9bnVsbDtmb3IodD0wO247KXt0Kys7bGV0IG89bixhPTA7Zm9yKGxldCBsPTA7bDxlJiYoYSsrLG89by5uZXh0WiwhIW8pO2wrKyk7bGV0IGM9ZTtmb3IoO2E+MHx8Yz4wJiZvOylhIT09MCYmKGM9PT0wfHwhb3x8bi56PD1vLnopPyhzPW4sbj1uLm5leHRaLGEtLSk6KHM9byxvPW8ubmV4dFosYy0tKSxyP3IubmV4dFo9czppPXMscy5wcmV2Wj1yLHI9cztuPW99ci5uZXh0Wj1udWxsLGUqPTJ9d2hpbGUodD4xKTtyZXR1cm4gaX1mdW5jdGlvbiBLYShpLHQsZSxuLHMpe3JldHVybiBpPShpLWUpKnN8MCx0PSh0LW4pKnN8MCxpPShpfGk8PDgpJjE2NzExOTM1LGk9KGl8aTw8NCkmMjUyNjQ1MTM1LGk9KGl8aTw8MikmODU4OTkzNDU5LGk9KGl8aTw8MSkmMTQzMTY1NTc2NSx0PSh0fHQ8PDgpJjE2NzExOTM1LHQ9KHR8dDw8NCkmMjUyNjQ1MTM1LHQ9KHR8dDw8MikmODU4OTkzNDU5LHQ9KHR8dDw8MSkmMTQzMTY1NTc2NSxpfHQ8PDF9ZnVuY3Rpb24gUHkoaSl7bGV0IHQ9aSxlPWk7ZG8odC54PGUueHx8dC54PT09ZS54JiZ0Lnk8ZS55KSYmKGU9dCksdD10Lm5leHQ7d2hpbGUodCE9PWkpO3JldHVybiBlfWZ1bmN0aW9uIGhpKGksdCxlLG4scyxyLG8sYSl7cmV0dXJuKHMtbykqKHQtYSk+PShpLW8pKihyLWEpJiYoaS1vKSoobi1hKT49KGUtbykqKHQtYSkmJihlLW8pKihyLWEpPj0ocy1vKSoobi1hKX1mdW5jdGlvbiBDeShpLHQpe3JldHVybiBpLm5leHQuaSE9PXQuaSYmaS5wcmV2LmkhPT10LmkmJiFCeShpLHQpJiYoS2koaSx0KSYmS2kodCxpKSYmRnkoaSx0KSYmKGF0KGkucHJldixpLHQucHJldil8fGF0KGksdC5wcmV2LHQpKXx8UnIoaSx0KSYmYXQoaS5wcmV2LGksaS5uZXh0KT4wJiZhdCh0LnByZXYsdCx0Lm5leHQpPjApfWZ1bmN0aW9uIGF0KGksdCxlKXtyZXR1cm4odC55LWkueSkqKGUueC10LngpLSh0LngtaS54KSooZS55LXQueSl9ZnVuY3Rpb24gUnIoaSx0KXtyZXR1cm4gaS54PT09dC54JiZpLnk9PT10Lnl9ZnVuY3Rpb24gamgoaSx0LGUsbil7Y29uc3Qgcz1PcihhdChpLHQsZSkpLHI9T3IoYXQoaSx0LG4pKSxvPU9yKGF0KGUsbixpKSksYT1PcihhdChlLG4sdCkpO3JldHVybiEhKHMhPT1yJiZvIT09YXx8cz09PTAmJkxyKGksZSx0KXx8cj09PTAmJkxyKGksbix0KXx8bz09PTAmJkxyKGUsaSxuKXx8YT09PTAmJkxyKGUsdCxuKSl9ZnVuY3Rpb24gTHIoaSx0LGUpe3JldHVybiB0Lng8PU1hdGgubWF4KGkueCxlLngpJiZ0Lng+PU1hdGgubWluKGkueCxlLngpJiZ0Lnk8PU1hdGgubWF4KGkueSxlLnkpJiZ0Lnk+PU1hdGgubWluKGkueSxlLnkpfWZ1bmN0aW9uIE9yKGkpe3JldHVybiBpPjA/MTppPDA/LTE6MH1mdW5jdGlvbiBCeShpLHQpe2xldCBlPWk7ZG97aWYoZS5pIT09aS5pJiZlLm5leHQuaSE9PWkuaSYmZS5pIT09dC5pJiZlLm5leHQuaSE9PXQuaSYmamgoZSxlLm5leHQsaSx0KSlyZXR1cm4hMDtlPWUubmV4dH13aGlsZShlIT09aSk7cmV0dXJuITF9ZnVuY3Rpb24gS2koaSx0KXtyZXR1cm4gYXQoaS5wcmV2LGksaS5uZXh0KTwwP2F0KGksdCxpLm5leHQpPj0wJiZhdChpLGkucHJldix0KT49MDphdChpLHQsaS5wcmV2KTwwfHxhdChpLGkubmV4dCx0KTwwfWZ1bmN0aW9uIEZ5KGksdCl7bGV0IGU9aSxuPSExO2NvbnN0IHM9KGkueCt0LngpLzIscj0oaS55K3QueSkvMjtkbyBlLnk+ciE9ZS5uZXh0Lnk+ciYmZS5uZXh0LnkhPT1lLnkmJnM8KGUubmV4dC54LWUueCkqKHItZS55KS8oZS5uZXh0LnktZS55KStlLngmJihuPSFuKSxlPWUubmV4dDt3aGlsZShlIT09aSk7cmV0dXJuIG59ZnVuY3Rpb24gUWgoaSx0KXtjb25zdCBlPXRjKGkuaSxpLngsaS55KSxuPXRjKHQuaSx0LngsdC55KSxzPWkubmV4dCxyPXQucHJldjtyZXR1cm4gaS5uZXh0PXQsdC5wcmV2PWksZS5uZXh0PXMscy5wcmV2PWUsbi5uZXh0PWUsZS5wcmV2PW4sci5uZXh0PW4sbi5wcmV2PXIsbn1mdW5jdGlvbiBLaChpLHQsZSxuKXtjb25zdCBzPXRjKGksdCxlKTtyZXR1cm4gbj8ocy5uZXh0PW4ubmV4dCxzLnByZXY9bixuLm5leHQucHJldj1zLG4ubmV4dD1zKToocy5wcmV2PXMscy5uZXh0PXMpLHN9ZnVuY3Rpb24gdHMoaSl7aS5uZXh0LnByZXY9aS5wcmV2LGkucHJldi5uZXh0PWkubmV4dCxpLnByZXZaJiYoaS5wcmV2Wi5uZXh0Wj1pLm5leHRaKSxpLm5leHRaJiYoaS5uZXh0Wi5wcmV2Wj1pLnByZXZaKX1mdW5jdGlvbiB0YyhpLHQsZSl7cmV0dXJue2kseDp0LHk6ZSxwcmV2Om51bGwsbmV4dDpudWxsLHo6MCxwcmV2WjpudWxsLG5leHRaOm51bGwsc3RlaW5lcjohMX19ZnVuY3Rpb24gSXkoaSx0LGUsbil7bGV0IHM9MDtmb3IobGV0IHI9dCxvPWUtbjtyPGU7cis9bilzKz0oaVtvXS1pW3JdKSooaVtyKzFdK2lbbysxXSksbz1yO3JldHVybiBzfWZ1bmN0aW9uIHR1KGkpe2NvbnN0IHQ9W10sZT1bXSxuPWlbMF1bMF0ubGVuZ3RoO2xldCBzPTAscj0wO2Zvcihjb25zdCBvIG9mIGkpe2Zvcihjb25zdCBhIG9mIG8pZm9yKGxldCBjPTA7YzxuO2MrKyl0LnB1c2goYVtjXSk7ciYmKHMrPXIsZS5wdXNoKHMpKSxyPW8ubGVuZ3RofXJldHVybnt2ZXJ0aWNlczp0LGhvbGVzOmUsZGltZW5zaW9uczpufX1mdW5jdGlvbiBreShpKXtpZighaSl0aHJvdyBuZXcgRXJyb3IoImNvb3JkIGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkoaSkpe2lmKGkudHlwZT09PSJGZWF0dXJlIiYmaS5nZW9tZXRyeSE9PW51bGwmJmkuZ2VvbWV0cnkudHlwZT09PSJQb2ludCIpcmV0dXJuWy4uLmkuZ2VvbWV0cnkuY29vcmRpbmF0ZXNdO2lmKGkudHlwZT09PSJQb2ludCIpcmV0dXJuWy4uLmkuY29vcmRpbmF0ZXNdfWlmKEFycmF5LmlzQXJyYXkoaSkmJmkubGVuZ3RoPj0yJiYhQXJyYXkuaXNBcnJheShpWzBdKSYmIUFycmF5LmlzQXJyYXkoaVsxXSkpcmV0dXJuWy4uLmldO3Rocm93IG5ldyBFcnJvcigiY29vcmQgbXVzdCBiZSBHZW9KU09OIFBvaW50IG9yIGFuIEFycmF5IG9mIG51bWJlcnMiKX1mdW5jdGlvbiBOeShpKXtpZihBcnJheS5pc0FycmF5KGkpKXJldHVybiBpO2lmKGkudHlwZT09PSJGZWF0dXJlIil7aWYoaS5nZW9tZXRyeSE9PW51bGwpcmV0dXJuIGkuZ2VvbWV0cnkuY29vcmRpbmF0ZXN9ZWxzZSBpZihpLmNvb3JkaW5hdGVzKXJldHVybiBpLmNvb3JkaW5hdGVzO3Rocm93IG5ldyBFcnJvcigiY29vcmRzIG11c3QgYmUgR2VvSlNPTiBGZWF0dXJlLCBHZW9tZXRyeSBPYmplY3Qgb3IgYW4gQXJyYXkiKX1mdW5jdGlvbiBSeShpKXtyZXR1cm4gaS50eXBlPT09IkZlYXR1cmUiP2kuZ2VvbWV0cnk6aX1mdW5jdGlvbiBMeShpKXtjb25zdCB0PU55KGkpO2xldCBlPTAsbj0xLHMscjtmb3IoO248dC5sZW5ndGg7KXM9cnx8dFswXSxyPXRbbl0sZSs9KHJbMF0tc1swXSkqKHJbMV0rc1sxXSksbisrO3JldHVybiBlPjB9dmFyIE95PUx5O2NvbnN0IHFlPTExMTAyMjMwMjQ2MjUxNTY1ZS0zMix2dD0xMzQyMTc3MjksRHk9KDMrOCpxZSkqcWU7ZnVuY3Rpb24gZWMoaSx0LGUsbixzKXtsZXQgcixvLGEsYyxsPXRbMF0saD1uWzBdLHU9MCxmPTA7aD5sPT1oPi1sPyhyPWwsbD10WysrdV0pOihyPWgsaD1uWysrZl0pO2xldCBkPTA7aWYodTxpJiZmPGUpZm9yKGg+bD09aD4tbD8obz1sK3IsYT1yLShvLWwpLGw9dFsrK3VdKToobz1oK3IsYT1yLShvLWgpLGg9blsrK2ZdKSxyPW8sYSE9PTAmJihzW2QrK109YSk7dTxpJiZmPGU7KWg+bD09aD4tbD8obz1yK2wsYz1vLXIsYT1yLShvLWMpKyhsLWMpLGw9dFsrK3VdKToobz1yK2gsYz1vLXIsYT1yLShvLWMpKyhoLWMpLGg9blsrK2ZdKSxyPW8sYSE9PTAmJihzW2QrK109YSk7Zm9yKDt1PGk7KW89citsLGM9by1yLGE9ci0oby1jKSsobC1jKSxsPXRbKyt1XSxyPW8sYSE9PTAmJihzW2QrK109YSk7Zm9yKDtmPGU7KW89citoLGM9by1yLGE9ci0oby1jKSsoaC1jKSxoPW5bKytmXSxyPW8sYSE9PTAmJihzW2QrK109YSk7cmV0dXJuKHIhPT0wfHxkPT09MCkmJihzW2QrK109ciksZH1mdW5jdGlvbiAkeShpLHQpe2xldCBlPXRbMF07Zm9yKGxldCBuPTE7bjxpO24rKyllKz10W25dO3JldHVybiBlfWZ1bmN0aW9uIGVzKGkpe3JldHVybiBuZXcgRmxvYXQ2NEFycmF5KGkpfWNvbnN0IFZ5PSgzKzE2KnFlKSpxZSxVeT0oMisxMipxZSkqcWUscXk9KDkrNjQqcWUpKnFlKnFlLHVpPWVzKDQpLGV1PWVzKDgpLG51PWVzKDEyKSxpdT1lcygxNiksQnQ9ZXMoNCk7ZnVuY3Rpb24gSHkoaSx0LGUsbixzLHIsbyl7bGV0IGEsYyxsLGgsdSxmLGQscCx5LG0sZyxiLHcseCxNLEEsUyxfO2NvbnN0IEU9aS1zLHo9ZS1zLHY9dC1yLEM9bi1yO3g9RSpDLGY9dnQqRSxkPWYtKGYtRSkscD1FLWQsZj12dCpDLHk9Zi0oZi1DKSxtPUMteSxNPXAqbS0oeC1kKnktcCp5LWQqbSksQT12KnosZj12dCp2LGQ9Zi0oZi12KSxwPXYtZCxmPXZ0KnoseT1mLShmLXopLG09ei15LFM9cCptLShBLWQqeS1wKnktZCptKSxnPU0tUyx1PU0tZyx1aVswXT1NLShnK3UpKyh1LVMpLGI9eCtnLHU9Yi14LHc9eC0oYi11KSsoZy11KSxnPXctQSx1PXctZyx1aVsxXT13LShnK3UpKyh1LUEpLF89YitnLHU9Xy1iLHVpWzJdPWItKF8tdSkrKGctdSksdWlbM109XztsZXQgUD0keSg0LHVpKSxGPVV5Km87aWYoUD49Rnx8LVA+PUZ8fCh1PWktRSxhPWktKEUrdSkrKHUtcyksdT1lLXosbD1lLSh6K3UpKyh1LXMpLHU9dC12LGM9dC0odit1KSsodS1yKSx1PW4tQyxoPW4tKEMrdSkrKHUtciksYT09PTAmJmM9PT0wJiZsPT09MCYmaD09PTApfHwoRj1xeSpvK0R5Kk1hdGguYWJzKFApLFArPUUqaCtDKmEtKHYqbCt6KmMpLFA+PUZ8fC1QPj1GKSlyZXR1cm4gUDt4PWEqQyxmPXZ0KmEsZD1mLShmLWEpLHA9YS1kLGY9dnQqQyx5PWYtKGYtQyksbT1DLXksTT1wKm0tKHgtZCp5LXAqeS1kKm0pLEE9Yyp6LGY9dnQqYyxkPWYtKGYtYykscD1jLWQsZj12dCp6LHk9Zi0oZi16KSxtPXoteSxTPXAqbS0oQS1kKnktcCp5LWQqbSksZz1NLVMsdT1NLWcsQnRbMF09TS0oZyt1KSsodS1TKSxiPXgrZyx1PWIteCx3PXgtKGItdSkrKGctdSksZz13LUEsdT13LWcsQnRbMV09dy0oZyt1KSsodS1BKSxfPWIrZyx1PV8tYixCdFsyXT1iLShfLXUpKyhnLXUpLEJ0WzNdPV87Y29uc3QgQj1lYyg0LHVpLDQsQnQsZXUpO3g9RSpoLGY9dnQqRSxkPWYtKGYtRSkscD1FLWQsZj12dCpoLHk9Zi0oZi1oKSxtPWgteSxNPXAqbS0oeC1kKnktcCp5LWQqbSksQT12KmwsZj12dCp2LGQ9Zi0oZi12KSxwPXYtZCxmPXZ0KmwseT1mLShmLWwpLG09bC15LFM9cCptLShBLWQqeS1wKnktZCptKSxnPU0tUyx1PU0tZyxCdFswXT1NLShnK3UpKyh1LVMpLGI9eCtnLHU9Yi14LHc9eC0oYi11KSsoZy11KSxnPXctQSx1PXctZyxCdFsxXT13LShnK3UpKyh1LUEpLF89YitnLHU9Xy1iLEJ0WzJdPWItKF8tdSkrKGctdSksQnRbM109Xztjb25zdCBJPWVjKEIsZXUsNCxCdCxudSk7eD1hKmgsZj12dCphLGQ9Zi0oZi1hKSxwPWEtZCxmPXZ0KmgseT1mLShmLWgpLG09aC15LE09cCptLSh4LWQqeS1wKnktZCptKSxBPWMqbCxmPXZ0KmMsZD1mLShmLWMpLHA9Yy1kLGY9dnQqbCx5PWYtKGYtbCksbT1sLXksUz1wKm0tKEEtZCp5LXAqeS1kKm0pLGc9TS1TLHU9TS1nLEJ0WzBdPU0tKGcrdSkrKHUtUyksYj14K2csdT1iLXgsdz14LShiLXUpKyhnLXUpLGc9dy1BLHU9dy1nLEJ0WzFdPXctKGcrdSkrKHUtQSksXz1iK2csdT1fLWIsQnRbMl09Yi0oXy11KSsoZy11KSxCdFszXT1fO2NvbnN0IGs9ZWMoSSxudSw0LEJ0LGl1KTtyZXR1cm4gaXVbay0xXX1mdW5jdGlvbiBEcihpLHQsZSxuLHMscil7Y29uc3Qgbz0odC1yKSooZS1zKSxhPShpLXMpKihuLXIpLGM9by1hO2lmKG89PT0wfHxhPT09MHx8bz4wIT1hPjApcmV0dXJuIGM7Y29uc3QgbD1NYXRoLmFicyhvK2EpO3JldHVybiBNYXRoLmFicyhjKT49VnkqbD9jOi1IeShpLHQsZSxuLHMscixsKX1jb25zdCBzdT1NYXRoLnBvdygyLC01MiksJHI9bmV3IFVpbnQzMkFycmF5KDUxMik7Y2xhc3MgbnN7c3RhdGljIGZyb20odCxlPUp5LG49WXkpe2NvbnN0IHM9dC5sZW5ndGgscj1uZXcgRmxvYXQ2NEFycmF5KHMqMik7Zm9yKGxldCBvPTA7bzxzO28rKyl7Y29uc3QgYT10W29dO3JbMipvXT1lKGEpLHJbMipvKzFdPW4oYSl9cmV0dXJuIG5ldyBucyhyKX1jb25zdHJ1Y3Rvcih0KXtjb25zdCBlPXQubGVuZ3RoPj4xO2lmKGU+MCYmdHlwZW9mIHRbMF0hPSJudW1iZXIiKXRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgY29vcmRzIHRvIGNvbnRhaW4gbnVtYmVycy4iKTt0aGlzLmNvb3Jkcz10O2NvbnN0IG49TWF0aC5tYXgoMiplLTUsMCk7dGhpcy5fdHJpYW5nbGVzPW5ldyBVaW50MzJBcnJheShuKjMpLHRoaXMuX2hhbGZlZGdlcz1uZXcgSW50MzJBcnJheShuKjMpLHRoaXMuX2hhc2hTaXplPU1hdGguY2VpbChNYXRoLnNxcnQoZSkpLHRoaXMuX2h1bGxQcmV2PW5ldyBVaW50MzJBcnJheShlKSx0aGlzLl9odWxsTmV4dD1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbFRyaT1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbEhhc2g9bmV3IEludDMyQXJyYXkodGhpcy5faGFzaFNpemUpLmZpbGwoLTEpLHRoaXMuX2lkcz1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5fZGlzdHM9bmV3IEZsb2F0NjRBcnJheShlKSx0aGlzLnVwZGF0ZSgpfXVwZGF0ZSgpe2NvbnN0e2Nvb3Jkczp0LF9odWxsUHJldjplLF9odWxsTmV4dDpuLF9odWxsVHJpOnMsX2h1bGxIYXNoOnJ9PXRoaXMsbz10Lmxlbmd0aD4+MTtsZXQgYT0xLzAsYz0xLzAsbD0tMS8wLGg9LTEvMDtmb3IobGV0IHo9MDt6PG87eisrKXtjb25zdCB2PXRbMip6XSxDPXRbMip6KzFdO3Y8YSYmKGE9diksQzxjJiYoYz1DKSx2PmwmJihsPXYpLEM+aCYmKGg9QyksdGhpcy5faWRzW3pdPXp9Y29uc3QgdT0oYStsKS8yLGY9KGMraCkvMjtsZXQgZD0xLzAscCx5LG07Zm9yKGxldCB6PTA7ejxvO3orKyl7Y29uc3Qgdj1uYyh1LGYsdFsyKnpdLHRbMip6KzFdKTt2PGQmJihwPXosZD12KX1jb25zdCBnPXRbMipwXSxiPXRbMipwKzFdO2Q9MS8wO2ZvcihsZXQgej0wO3o8bzt6Kyspe2lmKHo9PT1wKWNvbnRpbnVlO2NvbnN0IHY9bmMoZyxiLHRbMip6XSx0WzIqeisxXSk7djxkJiZ2PjAmJih5PXosZD12KX1sZXQgdz10WzIqeV0seD10WzIqeSsxXSxNPTEvMDtmb3IobGV0IHo9MDt6PG87eisrKXtpZih6PT09cHx8ej09PXkpY29udGludWU7Y29uc3Qgdj1XeShnLGIsdyx4LHRbMip6XSx0WzIqeisxXSk7djxNJiYobT16LE09dil9bGV0IEE9dFsyKm1dLFM9dFsyKm0rMV07aWYoTT09PTEvMCl7Zm9yKGxldCBDPTA7QzxvO0MrKyl0aGlzLl9kaXN0c1tDXT10WzIqQ10tdFswXXx8dFsyKkMrMV0tdFsxXTtmaSh0aGlzLl9pZHMsdGhpcy5fZGlzdHMsMCxvLTEpO2NvbnN0IHo9bmV3IFVpbnQzMkFycmF5KG8pO2xldCB2PTA7Zm9yKGxldCBDPTAsUD0tMS8wO0M8bztDKyspe2NvbnN0IEY9dGhpcy5faWRzW0NdO3RoaXMuX2Rpc3RzW0ZdPlAmJih6W3YrK109RixQPXRoaXMuX2Rpc3RzW0ZdKX10aGlzLmh1bGw9ei5zdWJhcnJheSgwLHYpLHRoaXMudHJpYW5nbGVzPW5ldyBVaW50MzJBcnJheSgwKSx0aGlzLmhhbGZlZGdlcz1uZXcgVWludDMyQXJyYXkoMCk7cmV0dXJufWlmKERyKGcsYix3LHgsQSxTKTwwKXtjb25zdCB6PXksdj13LEM9eDt5PW0sdz1BLHg9UyxtPXosQT12LFM9Q31jb25zdCBfPVp5KGcsYix3LHgsQSxTKTt0aGlzLl9jeD1fLngsdGhpcy5fY3k9Xy55O2ZvcihsZXQgej0wO3o8bzt6KyspdGhpcy5fZGlzdHNbel09bmModFsyKnpdLHRbMip6KzFdLF8ueCxfLnkpO2ZpKHRoaXMuX2lkcyx0aGlzLl9kaXN0cywwLG8tMSksdGhpcy5faHVsbFN0YXJ0PXA7bGV0IEU9MztuW3BdPWVbbV09eSxuW3ldPWVbcF09bSxuW21dPWVbeV09cCxzW3BdPTAsc1t5XT0xLHNbbV09MixyLmZpbGwoLTEpLHJbdGhpcy5faGFzaEtleShnLGIpXT1wLHJbdGhpcy5faGFzaEtleSh3LHgpXT15LHJbdGhpcy5faGFzaEtleShBLFMpXT1tLHRoaXMudHJpYW5nbGVzTGVuPTAsdGhpcy5fYWRkVHJpYW5nbGUocCx5LG0sLTEsLTEsLTEpO2ZvcihsZXQgej0wLHYsQzt6PHRoaXMuX2lkcy5sZW5ndGg7eisrKXtjb25zdCBQPXRoaXMuX2lkc1t6XSxGPXRbMipQXSxCPXRbMipQKzFdO2lmKHo+MCYmTWF0aC5hYnMoRi12KTw9c3UmJk1hdGguYWJzKEItQyk8PXN1fHwodj1GLEM9QixQPT09cHx8UD09PXl8fFA9PT1tKSljb250aW51ZTtsZXQgST0wO2ZvcihsZXQgZHQ9MCxEdD10aGlzLl9oYXNoS2V5KEYsQik7ZHQ8dGhpcy5faGFzaFNpemUmJihJPXJbKER0K2R0KSV0aGlzLl9oYXNoU2l6ZV0sIShJIT09LTEmJkkhPT1uW0ldKSk7ZHQrKyk7ST1lW0ldO2xldCBrPUksRDtmb3IoO0Q9bltrXSxEcihGLEIsdFsyKmtdLHRbMiprKzFdLHRbMipEXSx0WzIqRCsxXSk+PTA7KWlmKGs9RCxrPT09SSl7az0tMTticmVha31pZihrPT09LTEpY29udGludWU7bGV0IFU9dGhpcy5fYWRkVHJpYW5nbGUoayxQLG5ba10sLTEsLTEsc1trXSk7c1tQXT10aGlzLl9sZWdhbGl6ZShVKzIpLHNba109VSxFKys7bGV0IGo9bltrXTtmb3IoO0Q9bltqXSxEcihGLEIsdFsyKmpdLHRbMipqKzFdLHRbMipEXSx0WzIqRCsxXSk8MDspVT10aGlzLl9hZGRUcmlhbmdsZShqLFAsRCxzW1BdLC0xLHNbal0pLHNbUF09dGhpcy5fbGVnYWxpemUoVSsyKSxuW2pdPWosRS0tLGo9RDtpZihrPT09SSlmb3IoO0Q9ZVtrXSxEcihGLEIsdFsyKkRdLHRbMipEKzFdLHRbMiprXSx0WzIqaysxXSk8MDspVT10aGlzLl9hZGRUcmlhbmdsZShELFAsaywtMSxzW2tdLHNbRF0pLHRoaXMuX2xlZ2FsaXplKFUrMiksc1tEXT1VLG5ba109ayxFLS0saz1EO3RoaXMuX2h1bGxTdGFydD1lW1BdPWssbltrXT1lW2pdPVAsbltQXT1qLHJbdGhpcy5faGFzaEtleShGLEIpXT1QLHJbdGhpcy5faGFzaEtleSh0WzIqa10sdFsyKmsrMV0pXT1rfXRoaXMuaHVsbD1uZXcgVWludDMyQXJyYXkoRSk7Zm9yKGxldCB6PTAsdj10aGlzLl9odWxsU3RhcnQ7ejxFO3orKyl0aGlzLmh1bGxbel09dix2PW5bdl07dGhpcy50cmlhbmdsZXM9dGhpcy5fdHJpYW5nbGVzLnN1YmFycmF5KDAsdGhpcy50cmlhbmdsZXNMZW4pLHRoaXMuaGFsZmVkZ2VzPXRoaXMuX2hhbGZlZGdlcy5zdWJhcnJheSgwLHRoaXMudHJpYW5nbGVzTGVuKX1faGFzaEtleSh0LGUpe3JldHVybiBNYXRoLmZsb29yKFh5KHQtdGhpcy5fY3gsZS10aGlzLl9jeSkqdGhpcy5faGFzaFNpemUpJXRoaXMuX2hhc2hTaXplfV9sZWdhbGl6ZSh0KXtjb25zdHtfdHJpYW5nbGVzOmUsX2hhbGZlZGdlczpuLGNvb3JkczpzfT10aGlzO2xldCByPTAsbz0wO2Zvcig7Oyl7Y29uc3QgYT1uW3RdLGM9dC10JTM7aWYobz1jKyh0KzIpJTMsYT09PS0xKXtpZihyPT09MClicmVhazt0PSRyWy0tcl07Y29udGludWV9Y29uc3QgbD1hLWElMyxoPWMrKHQrMSklMyx1PWwrKGErMiklMyxmPWVbb10sZD1lW3RdLHA9ZVtoXSx5PWVbdV07aWYoR3koc1syKmZdLHNbMipmKzFdLHNbMipkXSxzWzIqZCsxXSxzWzIqcF0sc1syKnArMV0sc1syKnldLHNbMip5KzFdKSl7ZVt0XT15LGVbYV09Zjtjb25zdCBnPW5bdV07aWYoZz09PS0xKXtsZXQgdz10aGlzLl9odWxsU3RhcnQ7ZG97aWYodGhpcy5faHVsbFRyaVt3XT09PXUpe3RoaXMuX2h1bGxUcmlbd109dDticmVha313PXRoaXMuX2h1bGxQcmV2W3ddfXdoaWxlKHchPT10aGlzLl9odWxsU3RhcnQpfXRoaXMuX2xpbmsodCxnKSx0aGlzLl9saW5rKGEsbltvXSksdGhpcy5fbGluayhvLHUpO2NvbnN0IGI9bCsoYSsxKSUzO3I8JHIubGVuZ3RoJiYoJHJbcisrXT1iKX1lbHNle2lmKHI9PT0wKWJyZWFrO3Q9JHJbLS1yXX19cmV0dXJuIG99X2xpbmsodCxlKXt0aGlzLl9oYWxmZWRnZXNbdF09ZSxlIT09LTEmJih0aGlzLl9oYWxmZWRnZXNbZV09dCl9X2FkZFRyaWFuZ2xlKHQsZSxuLHMscixvKXtjb25zdCBhPXRoaXMudHJpYW5nbGVzTGVuO3JldHVybiB0aGlzLl90cmlhbmdsZXNbYV09dCx0aGlzLl90cmlhbmdsZXNbYSsxXT1lLHRoaXMuX3RyaWFuZ2xlc1thKzJdPW4sdGhpcy5fbGluayhhLHMpLHRoaXMuX2xpbmsoYSsxLHIpLHRoaXMuX2xpbmsoYSsyLG8pLHRoaXMudHJpYW5nbGVzTGVuKz0zLGF9fWZ1bmN0aW9uIFh5KGksdCl7Y29uc3QgZT1pLyhNYXRoLmFicyhpKStNYXRoLmFicyh0KSk7cmV0dXJuKHQ+MD8zLWU6MStlKS80fWZ1bmN0aW9uIG5jKGksdCxlLG4pe2NvbnN0IHM9aS1lLHI9dC1uO3JldHVybiBzKnMrcipyfWZ1bmN0aW9uIEd5KGksdCxlLG4scyxyLG8sYSl7Y29uc3QgYz1pLW8sbD10LWEsaD1lLW8sdT1uLWEsZj1zLW8sZD1yLWEscD1jKmMrbCpsLHk9aCpoK3UqdSxtPWYqZitkKmQ7cmV0dXJuIGMqKHUqbS15KmQpLWwqKGgqbS15KmYpK3AqKGgqZC11KmYpPDB9ZnVuY3Rpb24gV3koaSx0LGUsbixzLHIpe2NvbnN0IG89ZS1pLGE9bi10LGM9cy1pLGw9ci10LGg9bypvK2EqYSx1PWMqYytsKmwsZj0uNS8obypsLWEqYyksZD0obCpoLWEqdSkqZixwPShvKnUtYypoKSpmO3JldHVybiBkKmQrcCpwfWZ1bmN0aW9uIFp5KGksdCxlLG4scyxyKXtjb25zdCBvPWUtaSxhPW4tdCxjPXMtaSxsPXItdCxoPW8qbythKmEsdT1jKmMrbCpsLGY9LjUvKG8qbC1hKmMpLGQ9aSsobCpoLWEqdSkqZixwPXQrKG8qdS1jKmgpKmY7cmV0dXJue3g6ZCx5OnB9fWZ1bmN0aW9uIGZpKGksdCxlLG4pe2lmKG4tZTw9MjApZm9yKGxldCBzPWUrMTtzPD1uO3MrKyl7Y29uc3Qgcj1pW3NdLG89dFtyXTtsZXQgYT1zLTE7Zm9yKDthPj1lJiZ0W2lbYV1dPm87KWlbYSsxXT1pW2EtLV07aVthKzFdPXJ9ZWxzZXtjb25zdCBzPWUrbj4+MTtsZXQgcj1lKzEsbz1uO2lzKGkscyxyKSx0W2lbZV1dPnRbaVtuXV0mJmlzKGksZSxuKSx0W2lbcl1dPnRbaVtuXV0mJmlzKGkscixuKSx0W2lbZV1dPnRbaVtyXV0mJmlzKGksZSxyKTtjb25zdCBhPWlbcl0sYz10W2FdO2Zvcig7Oyl7ZG8gcisrO3doaWxlKHRbaVtyXV08Yyk7ZG8gby0tO3doaWxlKHRbaVtvXV0+Yyk7aWYobzxyKWJyZWFrO2lzKGkscixvKX1pW2UrMV09aVtvXSxpW29dPWEsbi1yKzE+PW8tZT8oZmkoaSx0LHIsbiksZmkoaSx0LGUsby0xKSk6KGZpKGksdCxlLG8tMSksZmkoaSx0LHIsbikpfX1mdW5jdGlvbiBpcyhpLHQsZSl7Y29uc3Qgbj1pW3RdO2lbdF09aVtlXSxpW2VdPW59ZnVuY3Rpb24gSnkoaSl7cmV0dXJuIGlbMF19ZnVuY3Rpb24gWXkoaSl7cmV0dXJuIGlbMV19ZnVuY3Rpb24gankoaSx0KXt2YXIgZT0wLG49MCxzPTAscj0wLG89MCxhPTAsYz0wLGw9MCxoPW51bGwsdT1udWxsLGY9aVswXSxkPWlbMV0scD10Lmxlbmd0aDtmb3IoZTtlPHA7ZSsrKXtuPTA7dmFyIHk9dFtlXS5sZW5ndGgtMSxtPXRbZV07aWYoaD1tWzBdLGhbMF0hPT1tW3ldWzBdJiZoWzFdIT09bVt5XVsxXSl0aHJvdyBuZXcgRXJyb3IoIkZpcnN0IGFuZCBsYXN0IGNvb3JkaW5hdGVzIGluIGEgcmluZyBtdXN0IGJlIHRoZSBzYW1lIik7Zm9yKG89aFswXS1mLGE9aFsxXS1kLG47bjx5O24rKyl7aWYodT1tW24rMV0sbD11WzFdLWQsYTwwJiZsPDB8fGE+MCYmbD4wKXtoPXUsYT1sLG89aFswXS1mO2NvbnRpbnVlfWlmKGM9dVswXS1pWzBdLGw+MCYmYTw9MCl7aWYocj1vKmwtYyphLHI+MClzPXMrMTtlbHNlIGlmKHI9PT0wKXJldHVybiAwfWVsc2UgaWYoYT4wJiZsPD0wKXtpZihyPW8qbC1jKmEscjwwKXM9cysxO2Vsc2UgaWYocj09PTApcmV0dXJuIDB9ZWxzZSBpZihsPT09MCYmYTwwKXtpZihyPW8qbC1jKmEscj09PTApcmV0dXJuIDB9ZWxzZSBpZihhPT09MCYmbDwwKXtpZihyPW8qbC1jKmEscj09PTApcmV0dXJuIDB9ZWxzZSBpZihhPT09MCYmbD09PTApe2lmKGM8PTAmJm8+PTApcmV0dXJuIDA7aWYobzw9MCYmYz49MClyZXR1cm4gMH1oPXUsYT1sLG89Y319cmV0dXJuIHMlMiE9PTB9ZnVuY3Rpb24gUXkoaSx0LGU9e30pe2lmKCFpKXRocm93IG5ldyBFcnJvcigicG9pbnQgaXMgcmVxdWlyZWQiKTtpZighdCl0aHJvdyBuZXcgRXJyb3IoInBvbHlnb24gaXMgcmVxdWlyZWQiKTtjb25zdCBuPWt5KGkpLHM9UnkodCkscj1zLnR5cGUsbz10LmJib3g7bGV0IGE9cy5jb29yZGluYXRlcztpZihvJiZLeShuLG8pPT09ITEpcmV0dXJuITE7cj09PSJQb2x5Z29uIiYmKGE9W2FdKTtsZXQgYz0hMTtmb3IodmFyIGw9MDtsPGEubGVuZ3RoOysrbCl7Y29uc3QgaD1qeShuLGFbbF0pO2lmKGg9PT0wKXJldHVybiFlLmlnbm9yZUJvdW5kYXJ5O2gmJihjPSEwKX1yZXR1cm4gY31mdW5jdGlvbiBLeShpLHQpe3JldHVybiB0WzBdPD1pWzBdJiZ0WzFdPD1pWzFdJiZ0WzJdPj1pWzBdJiZ0WzNdPj1pWzFdfXZhciB0bT1ReTtjb25zdCBydT0xZS02O2NsYXNzIHpue2NvbnN0cnVjdG9yKCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbCx0aGlzLl89IiJ9bW92ZVRvKHQsZSl7dGhpcy5fKz1gTSR7dGhpcy5feDA9dGhpcy5feDE9K3R9LCR7dGhpcy5feTA9dGhpcy5feTE9K2V9YH1jbG9zZVBhdGgoKXt0aGlzLl94MSE9PW51bGwmJih0aGlzLl94MT10aGlzLl94MCx0aGlzLl95MT10aGlzLl95MCx0aGlzLl8rPSJaIil9bGluZVRvKHQsZSl7dGhpcy5fKz1gTCR7dGhpcy5feDE9K3R9LCR7dGhpcy5feTE9K2V9YH1hcmModCxlLG4pe3Q9K3QsZT0rZSxuPStuO2NvbnN0IHM9dCtuLHI9ZTtpZihuPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXMiKTt0aGlzLl94MT09PW51bGw/dGhpcy5fKz1gTSR7c30sJHtyfWA6KE1hdGguYWJzKHRoaXMuX3gxLXMpPnJ1fHxNYXRoLmFicyh0aGlzLl95MS1yKT5ydSkmJih0aGlzLl8rPSJMIitzKyIsIityKSxuJiYodGhpcy5fKz1gQSR7bn0sJHtufSwwLDEsMSwke3Qtbn0sJHtlfUEke259LCR7bn0sMCwxLDEsJHt0aGlzLl94MT1zfSwke3RoaXMuX3kxPXJ9YCl9cmVjdCh0LGUsbixzKXt0aGlzLl8rPWBNJHt0aGlzLl94MD10aGlzLl94MT0rdH0sJHt0aGlzLl95MD10aGlzLl95MT0rZX1oJHsrbn12JHsrc31oJHstbn1aYH12YWx1ZSgpe3JldHVybiB0aGlzLl98fG51bGx9fWNsYXNzIGlje2NvbnN0cnVjdG9yKCl7dGhpcy5fPVtdfW1vdmVUbyh0LGUpe3RoaXMuXy5wdXNoKFt0LGVdKX1jbG9zZVBhdGgoKXt0aGlzLl8ucHVzaCh0aGlzLl9bMF0uc2xpY2UoKSl9bGluZVRvKHQsZSl7dGhpcy5fLnB1c2goW3QsZV0pfXZhbHVlKCl7cmV0dXJuIHRoaXMuXy5sZW5ndGg/dGhpcy5fOm51bGx9fWNsYXNzIGVte2NvbnN0cnVjdG9yKHQsW2UsbixzLHJdPVswLDAsOTYwLDUwMF0pe2lmKCEoKHM9K3MpPj0oZT0rZSkpfHwhKChyPStyKT49KG49K24pKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgYm91bmRzIik7dGhpcy5kZWxhdW5heT10LHRoaXMuX2NpcmN1bWNlbnRlcnM9bmV3IEZsb2F0NjRBcnJheSh0LnBvaW50cy5sZW5ndGgqMiksdGhpcy52ZWN0b3JzPW5ldyBGbG9hdDY0QXJyYXkodC5wb2ludHMubGVuZ3RoKjIpLHRoaXMueG1heD1zLHRoaXMueG1pbj1lLHRoaXMueW1heD1yLHRoaXMueW1pbj1uLHRoaXMuX2luaXQoKX11cGRhdGUoKXtyZXR1cm4gdGhpcy5kZWxhdW5heS51cGRhdGUoKSx0aGlzLl9pbml0KCksdGhpc31faW5pdCgpe2NvbnN0e2RlbGF1bmF5Ontwb2ludHM6dCxodWxsOmUsdHJpYW5nbGVzOm59LHZlY3RvcnM6c309dGhpcyxyPXRoaXMuY2lyY3VtY2VudGVycz10aGlzLl9jaXJjdW1jZW50ZXJzLnN1YmFycmF5KDAsbi5sZW5ndGgvMyoyKTtmb3IobGV0IGQ9MCxwPTAseT1uLmxlbmd0aCxtLGc7ZDx5O2QrPTMscCs9Mil7Y29uc3QgYj1uW2RdKjIsdz1uW2QrMV0qMix4PW5bZCsyXSoyLE09dFtiXSxBPXRbYisxXSxTPXRbd10sXz10W3crMV0sRT10W3hdLHo9dFt4KzFdLHY9Uy1NLEM9Xy1BLFA9RS1NLEY9ei1BLEI9KHYqRi1DKlApKjI7aWYoTWF0aC5hYnMoQik8MWUtOSl7bGV0IEk9MWU5O2NvbnN0IGs9blswXSoyO0kqPU1hdGguc2lnbigodFtrXS1NKSpGLSh0W2srMV0tQSkqUCksbT0oTStFKS8yLUkqRixnPShBK3opLzIrSSpQfWVsc2V7Y29uc3QgST0xL0Isaz12KnYrQypDLEQ9UCpQK0YqRjttPU0rKEYqay1DKkQpKkksZz1BKyh2KkQtUCprKSpJfXJbcF09bSxyW3ArMV09Z31sZXQgbz1lW2UubGVuZ3RoLTFdLGEsYz1vKjQsbCxoPXRbMipvXSx1LGY9dFsyKm8rMV07cy5maWxsKDApO2ZvcihsZXQgZD0wO2Q8ZS5sZW5ndGg7KytkKW89ZVtkXSxhPWMsbD1oLHU9ZixjPW8qNCxoPXRbMipvXSxmPXRbMipvKzFdLHNbYSsyXT1zW2NdPXUtZixzW2ErM109c1tjKzFdPWgtbH1yZW5kZXIodCl7Y29uc3QgZT10PT1udWxsP3Q9bmV3IHpuOnZvaWQgMCx7ZGVsYXVuYXk6e2hhbGZlZGdlczpuLGluZWRnZXM6cyxodWxsOnJ9LGNpcmN1bWNlbnRlcnM6byx2ZWN0b3JzOmF9PXRoaXM7aWYoci5sZW5ndGg8PTEpcmV0dXJuIG51bGw7Zm9yKGxldCBoPTAsdT1uLmxlbmd0aDtoPHU7KytoKXtjb25zdCBmPW5baF07aWYoZjxoKWNvbnRpbnVlO2NvbnN0IGQ9TWF0aC5mbG9vcihoLzMpKjIscD1NYXRoLmZsb29yKGYvMykqMix5PW9bZF0sbT1vW2QrMV0sZz1vW3BdLGI9b1twKzFdO3RoaXMuX3JlbmRlclNlZ21lbnQoeSxtLGcsYix0KX1sZXQgYyxsPXJbci5sZW5ndGgtMV07Zm9yKGxldCBoPTA7aDxyLmxlbmd0aDsrK2gpe2M9bCxsPXJbaF07Y29uc3QgdT1NYXRoLmZsb29yKHNbbF0vMykqMixmPW9bdV0sZD1vW3UrMV0scD1jKjQseT10aGlzLl9wcm9qZWN0KGYsZCxhW3ArMl0sYVtwKzNdKTt5JiZ0aGlzLl9yZW5kZXJTZWdtZW50KGYsZCx5WzBdLHlbMV0sdCl9cmV0dXJuIGUmJmUudmFsdWUoKX1yZW5kZXJCb3VuZHModCl7Y29uc3QgZT10PT1udWxsP3Q9bmV3IHpuOnZvaWQgMDtyZXR1cm4gdC5yZWN0KHRoaXMueG1pbix0aGlzLnltaW4sdGhpcy54bWF4LXRoaXMueG1pbix0aGlzLnltYXgtdGhpcy55bWluKSxlJiZlLnZhbHVlKCl9cmVuZGVyQ2VsbCh0LGUpe2NvbnN0IG49ZT09bnVsbD9lPW5ldyB6bjp2b2lkIDAscz10aGlzLl9jbGlwKHQpO2lmKHM9PT1udWxsfHwhcy5sZW5ndGgpcmV0dXJuO2UubW92ZVRvKHNbMF0sc1sxXSk7bGV0IHI9cy5sZW5ndGg7Zm9yKDtzWzBdPT09c1tyLTJdJiZzWzFdPT09c1tyLTFdJiZyPjE7KXItPTI7Zm9yKGxldCBvPTI7bzxyO28rPTIpKHNbb10hPT1zW28tMl18fHNbbysxXSE9PXNbby0xXSkmJmUubGluZVRvKHNbb10sc1tvKzFdKTtyZXR1cm4gZS5jbG9zZVBhdGgoKSxuJiZuLnZhbHVlKCl9KmNlbGxQb2x5Z29ucygpe2NvbnN0e2RlbGF1bmF5Ontwb2ludHM6dH19PXRoaXM7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aC8yO2U8bjsrK2Upe2NvbnN0IHM9dGhpcy5jZWxsUG9seWdvbihlKTtzJiYocy5pbmRleD1lLHlpZWxkIHMpfX1jZWxsUG9seWdvbih0KXtjb25zdCBlPW5ldyBpYztyZXR1cm4gdGhpcy5yZW5kZXJDZWxsKHQsZSksZS52YWx1ZSgpfV9yZW5kZXJTZWdtZW50KHQsZSxuLHMscil7bGV0IG87Y29uc3QgYT10aGlzLl9yZWdpb25jb2RlKHQsZSksYz10aGlzLl9yZWdpb25jb2RlKG4scyk7YT09PTAmJmM9PT0wPyhyLm1vdmVUbyh0LGUpLHIubGluZVRvKG4scykpOihvPXRoaXMuX2NsaXBTZWdtZW50KHQsZSxuLHMsYSxjKSkmJihyLm1vdmVUbyhvWzBdLG9bMV0pLHIubGluZVRvKG9bMl0sb1szXSkpfWNvbnRhaW5zKHQsZSxuKXtyZXR1cm4gZT0rZSxlIT09ZXx8KG49K24sbiE9PW4pPyExOnRoaXMuZGVsYXVuYXkuX3N0ZXAodCxlLG4pPT09dH0qbmVpZ2hib3JzKHQpe2NvbnN0IGU9dGhpcy5fY2xpcCh0KTtpZihlKWZvcihjb25zdCBuIG9mIHRoaXMuZGVsYXVuYXkubmVpZ2hib3JzKHQpKXtjb25zdCBzPXRoaXMuX2NsaXAobik7aWYocyl7dDpmb3IobGV0IHI9MCxvPWUubGVuZ3RoO3I8bztyKz0yKWZvcihsZXQgYT0wLGM9cy5sZW5ndGg7YTxjO2ErPTIpaWYoZVtyXT09c1thXSYmZVtyKzFdPT1zW2ErMV0mJmVbKHIrMiklb109PXNbKGErYy0yKSVjXSYmZVsociszKSVvXT09c1soYStjLTEpJWNdKXt5aWVsZCBuO2JyZWFrIHR9fX19X2NlbGwodCl7Y29uc3R7Y2lyY3VtY2VudGVyczplLGRlbGF1bmF5OntpbmVkZ2VzOm4saGFsZmVkZ2VzOnMsdHJpYW5nbGVzOnJ9fT10aGlzLG89blt0XTtpZihvPT09LTEpcmV0dXJuIG51bGw7Y29uc3QgYT1bXTtsZXQgYz1vO2Rve2NvbnN0IGw9TWF0aC5mbG9vcihjLzMpO2lmKGEucHVzaChlW2wqMl0sZVtsKjIrMV0pLGM9YyUzPT09Mj9jLTI6YysxLHJbY10hPT10KWJyZWFrO2M9c1tjXX13aGlsZShjIT09byYmYyE9PS0xKTtyZXR1cm4gYX1fY2xpcCh0KXtpZih0PT09MCYmdGhpcy5kZWxhdW5heS5odWxsLmxlbmd0aD09PTEpcmV0dXJuW3RoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltaW5dO2NvbnN0IGU9dGhpcy5fY2VsbCh0KTtpZihlPT09bnVsbClyZXR1cm4gbnVsbDtjb25zdHt2ZWN0b3JzOm59PXRoaXMscz10KjQ7cmV0dXJuIG5bc118fG5bcysxXT90aGlzLl9jbGlwSW5maW5pdGUodCxlLG5bc10sbltzKzFdLG5bcysyXSxuW3MrM10pOnRoaXMuX2NsaXBGaW5pdGUodCxlKX1fY2xpcEZpbml0ZSh0LGUpe2NvbnN0IG49ZS5sZW5ndGg7bGV0IHM9bnVsbCxyLG8sYT1lW24tMl0sYz1lW24tMV0sbCxoPXRoaXMuX3JlZ2lvbmNvZGUoYSxjKSx1LGY9MDtmb3IobGV0IGQ9MDtkPG47ZCs9MilpZihyPWEsbz1jLGE9ZVtkXSxjPWVbZCsxXSxsPWgsaD10aGlzLl9yZWdpb25jb2RlKGEsYyksbD09PTAmJmg9PT0wKXU9ZixmPTAscz9zLnB1c2goYSxjKTpzPVthLGNdO2Vsc2V7bGV0IHAseSxtLGcsYjtpZihsPT09MCl7aWYoKHA9dGhpcy5fY2xpcFNlZ21lbnQocixvLGEsYyxsLGgpKT09PW51bGwpY29udGludWU7W3ksbSxnLGJdPXB9ZWxzZXtpZigocD10aGlzLl9jbGlwU2VnbWVudChhLGMscixvLGgsbCkpPT09bnVsbCljb250aW51ZTtbZyxiLHksbV09cCx1PWYsZj10aGlzLl9lZGdlY29kZSh5LG0pLHUmJmYmJnRoaXMuX2VkZ2UodCx1LGYscyxzLmxlbmd0aCkscz9zLnB1c2goeSxtKTpzPVt5LG1dfXU9ZixmPXRoaXMuX2VkZ2Vjb2RlKGcsYiksdSYmZiYmdGhpcy5fZWRnZSh0LHUsZixzLHMubGVuZ3RoKSxzP3MucHVzaChnLGIpOnM9W2csYl19aWYocyl1PWYsZj10aGlzLl9lZGdlY29kZShzWzBdLHNbMV0pLHUmJmYmJnRoaXMuX2VkZ2UodCx1LGYscyxzLmxlbmd0aCk7ZWxzZSBpZih0aGlzLmNvbnRhaW5zKHQsKHRoaXMueG1pbit0aGlzLnhtYXgpLzIsKHRoaXMueW1pbit0aGlzLnltYXgpLzIpKXJldHVyblt0aGlzLnhtYXgsdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWluXTtyZXR1cm4gc31fY2xpcFNlZ21lbnQodCxlLG4scyxyLG8pe2Zvcig7Oyl7aWYocj09PTAmJm89PT0wKXJldHVyblt0LGUsbixzXTtpZihyJm8pcmV0dXJuIG51bGw7bGV0IGEsYyxsPXJ8fG87bCY4PyhhPXQrKG4tdCkqKHRoaXMueW1heC1lKS8ocy1lKSxjPXRoaXMueW1heCk6bCY0PyhhPXQrKG4tdCkqKHRoaXMueW1pbi1lKS8ocy1lKSxjPXRoaXMueW1pbik6bCYyPyhjPWUrKHMtZSkqKHRoaXMueG1heC10KS8obi10KSxhPXRoaXMueG1heCk6KGM9ZSsocy1lKSoodGhpcy54bWluLXQpLyhuLXQpLGE9dGhpcy54bWluKSxyPyh0PWEsZT1jLHI9dGhpcy5fcmVnaW9uY29kZSh0LGUpKToobj1hLHM9YyxvPXRoaXMuX3JlZ2lvbmNvZGUobixzKSl9fV9jbGlwSW5maW5pdGUodCxlLG4scyxyLG8pe2xldCBhPUFycmF5LmZyb20oZSksYztpZigoYz10aGlzLl9wcm9qZWN0KGFbMF0sYVsxXSxuLHMpKSYmYS51bnNoaWZ0KGNbMF0sY1sxXSksKGM9dGhpcy5fcHJvamVjdChhW2EubGVuZ3RoLTJdLGFbYS5sZW5ndGgtMV0scixvKSkmJmEucHVzaChjWzBdLGNbMV0pLGE9dGhpcy5fY2xpcEZpbml0ZSh0LGEpKWZvcihsZXQgbD0wLGg9YS5sZW5ndGgsdSxmPXRoaXMuX2VkZ2Vjb2RlKGFbaC0yXSxhW2gtMV0pO2w8aDtsKz0yKXU9ZixmPXRoaXMuX2VkZ2Vjb2RlKGFbbF0sYVtsKzFdKSx1JiZmJiYobD10aGlzLl9lZGdlKHQsdSxmLGEsbCksaD1hLmxlbmd0aCk7ZWxzZSB0aGlzLmNvbnRhaW5zKHQsKHRoaXMueG1pbit0aGlzLnhtYXgpLzIsKHRoaXMueW1pbit0aGlzLnltYXgpLzIpJiYoYT1bdGhpcy54bWluLHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1heF0pO3JldHVybiBhfV9lZGdlKHQsZSxuLHMscil7Zm9yKDtlIT09bjspe2xldCBvLGE7c3dpdGNoKGUpe2Nhc2UgNTplPTQ7Y29udGludWU7Y2FzZSA0OmU9NixvPXRoaXMueG1heCxhPXRoaXMueW1pbjticmVhaztjYXNlIDY6ZT0yO2NvbnRpbnVlO2Nhc2UgMjplPTEwLG89dGhpcy54bWF4LGE9dGhpcy55bWF4O2JyZWFrO2Nhc2UgMTA6ZT04O2NvbnRpbnVlO2Nhc2UgODplPTksbz10aGlzLnhtaW4sYT10aGlzLnltYXg7YnJlYWs7Y2FzZSA5OmU9MTtjb250aW51ZTtjYXNlIDE6ZT01LG89dGhpcy54bWluLGE9dGhpcy55bWluO2JyZWFrfShzW3JdIT09b3x8c1tyKzFdIT09YSkmJnRoaXMuY29udGFpbnModCxvLGEpJiYocy5zcGxpY2UociwwLG8sYSkscis9Mil9aWYocy5sZW5ndGg+NClmb3IobGV0IG89MDtvPHMubGVuZ3RoO28rPTIpe2NvbnN0IGE9KG8rMiklcy5sZW5ndGgsYz0obys0KSVzLmxlbmd0aDsoc1tvXT09PXNbYV0mJnNbYV09PT1zW2NdfHxzW28rMV09PT1zW2ErMV0mJnNbYSsxXT09PXNbYysxXSkmJihzLnNwbGljZShhLDIpLG8tPTIpfXJldHVybiByfV9wcm9qZWN0KHQsZSxuLHMpe2xldCByPTEvMCxvLGEsYztpZihzPDApe2lmKGU8PXRoaXMueW1pbilyZXR1cm4gbnVsbDsobz0odGhpcy55bWluLWUpL3MpPHImJihjPXRoaXMueW1pbixhPXQrKHI9bykqbil9ZWxzZSBpZihzPjApe2lmKGU+PXRoaXMueW1heClyZXR1cm4gbnVsbDsobz0odGhpcy55bWF4LWUpL3MpPHImJihjPXRoaXMueW1heCxhPXQrKHI9bykqbil9aWYobj4wKXtpZih0Pj10aGlzLnhtYXgpcmV0dXJuIG51bGw7KG89KHRoaXMueG1heC10KS9uKTxyJiYoYT10aGlzLnhtYXgsYz1lKyhyPW8pKnMpfWVsc2UgaWYobjwwKXtpZih0PD10aGlzLnhtaW4pcmV0dXJuIG51bGw7KG89KHRoaXMueG1pbi10KS9uKTxyJiYoYT10aGlzLnhtaW4sYz1lKyhyPW8pKnMpfXJldHVyblthLGNdfV9lZGdlY29kZSh0LGUpe3JldHVybih0PT09dGhpcy54bWluPzE6dD09PXRoaXMueG1heD8yOjApfChlPT09dGhpcy55bWluPzQ6ZT09PXRoaXMueW1heD84OjApfV9yZWdpb25jb2RlKHQsZSl7cmV0dXJuKHQ8dGhpcy54bWluPzE6dD50aGlzLnhtYXg/MjowKXwoZTx0aGlzLnltaW4/NDplPnRoaXMueW1heD84OjApfX1jb25zdCBubT0yKk1hdGguUEksZGk9TWF0aC5wb3c7ZnVuY3Rpb24gaW0oaSl7cmV0dXJuIGlbMF19ZnVuY3Rpb24gc20oaSl7cmV0dXJuIGlbMV19ZnVuY3Rpb24gcm0oaSl7Y29uc3R7dHJpYW5nbGVzOnQsY29vcmRzOmV9PWk7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKz0zKXtjb25zdCBzPTIqdFtuXSxyPTIqdFtuKzFdLG89Mip0W24rMl07aWYoKGVbb10tZVtzXSkqKGVbcisxXS1lW3MrMV0pLShlW3JdLWVbc10pKihlW28rMV0tZVtzKzFdKT4xZS0xMClyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBvbShpLHQsZSl7cmV0dXJuW2krTWF0aC5zaW4oaSt0KSplLHQrTWF0aC5jb3MoaS10KSplXX1jbGFzcyBzY3tzdGF0aWMgZnJvbSh0LGU9aW0sbj1zbSxzKXtyZXR1cm4gbmV3IHNjKCJsZW5ndGgiaW4gdD9hbSh0LGUsbixzKTpGbG9hdDY0QXJyYXkuZnJvbShjbSh0LGUsbixzKSkpfWNvbnN0cnVjdG9yKHQpe3RoaXMuX2RlbGF1bmF0b3I9bmV3IG5zKHQpLHRoaXMuaW5lZGdlcz1uZXcgSW50MzJBcnJheSh0Lmxlbmd0aC8yKSx0aGlzLl9odWxsSW5kZXg9bmV3IEludDMyQXJyYXkodC5sZW5ndGgvMiksdGhpcy5wb2ludHM9dGhpcy5fZGVsYXVuYXRvci5jb29yZHMsdGhpcy5faW5pdCgpfXVwZGF0ZSgpe3JldHVybiB0aGlzLl9kZWxhdW5hdG9yLnVwZGF0ZSgpLHRoaXMuX2luaXQoKSx0aGlzfV9pbml0KCl7Y29uc3QgdD10aGlzLl9kZWxhdW5hdG9yLGU9dGhpcy5wb2ludHM7aWYodC5odWxsJiZ0Lmh1bGwubGVuZ3RoPjImJnJtKHQpKXt0aGlzLmNvbGxpbmVhcj1JbnQzMkFycmF5LmZyb20oe2xlbmd0aDplLmxlbmd0aC8yfSwoZixkKT0+ZCkuc29ydCgoZixkKT0+ZVsyKmZdLWVbMipkXXx8ZVsyKmYrMV0tZVsyKmQrMV0pO2NvbnN0IGM9dGhpcy5jb2xsaW5lYXJbMF0sbD10aGlzLmNvbGxpbmVhclt0aGlzLmNvbGxpbmVhci5sZW5ndGgtMV0saD1bZVsyKmNdLGVbMipjKzFdLGVbMipsXSxlWzIqbCsxXV0sdT0xZS04Kk1hdGguaHlwb3QoaFszXS1oWzFdLGhbMl0taFswXSk7Zm9yKGxldCBmPTAsZD1lLmxlbmd0aC8yO2Y8ZDsrK2Ype2NvbnN0IHA9b20oZVsyKmZdLGVbMipmKzFdLHUpO2VbMipmXT1wWzBdLGVbMipmKzFdPXBbMV19dGhpcy5fZGVsYXVuYXRvcj1uZXcgbnMoZSl9ZWxzZSBkZWxldGUgdGhpcy5jb2xsaW5lYXI7Y29uc3Qgbj10aGlzLmhhbGZlZGdlcz10aGlzLl9kZWxhdW5hdG9yLmhhbGZlZGdlcyxzPXRoaXMuaHVsbD10aGlzLl9kZWxhdW5hdG9yLmh1bGwscj10aGlzLnRyaWFuZ2xlcz10aGlzLl9kZWxhdW5hdG9yLnRyaWFuZ2xlcyxvPXRoaXMuaW5lZGdlcy5maWxsKC0xKSxhPXRoaXMuX2h1bGxJbmRleC5maWxsKC0xKTtmb3IobGV0IGM9MCxsPW4ubGVuZ3RoO2M8bDsrK2Mpe2NvbnN0IGg9cltjJTM9PT0yP2MtMjpjKzFdOyhuW2NdPT09LTF8fG9baF09PT0tMSkmJihvW2hdPWMpfWZvcihsZXQgYz0wLGw9cy5sZW5ndGg7YzxsOysrYylhW3NbY11dPWM7cy5sZW5ndGg8PTImJnMubGVuZ3RoPjAmJih0aGlzLnRyaWFuZ2xlcz1uZXcgSW50MzJBcnJheSgzKS5maWxsKC0xKSx0aGlzLmhhbGZlZGdlcz1uZXcgSW50MzJBcnJheSgzKS5maWxsKC0xKSx0aGlzLnRyaWFuZ2xlc1swXT1zWzBdLG9bc1swXV09MSxzLmxlbmd0aD09PTImJihvW3NbMV1dPTAsdGhpcy50cmlhbmdsZXNbMV09c1sxXSx0aGlzLnRyaWFuZ2xlc1syXT1zWzFdKSl9dm9yb25vaSh0KXtyZXR1cm4gbmV3IGVtKHRoaXMsdCl9Km5laWdoYm9ycyh0KXtjb25zdHtpbmVkZ2VzOmUsaHVsbDpuLF9odWxsSW5kZXg6cyxoYWxmZWRnZXM6cix0cmlhbmdsZXM6byxjb2xsaW5lYXI6YX09dGhpcztpZihhKXtjb25zdCB1PWEuaW5kZXhPZih0KTt1PjAmJih5aWVsZCBhW3UtMV0pLHU8YS5sZW5ndGgtMSYmKHlpZWxkIGFbdSsxXSk7cmV0dXJufWNvbnN0IGM9ZVt0XTtpZihjPT09LTEpcmV0dXJuO2xldCBsPWMsaD0tMTtkb3tpZih5aWVsZCBoPW9bbF0sbD1sJTM9PT0yP2wtMjpsKzEsb1tsXSE9PXQpcmV0dXJuO2lmKGw9cltsXSxsPT09LTEpe2NvbnN0IHU9blsoc1t0XSsxKSVuLmxlbmd0aF07dSE9PWgmJih5aWVsZCB1KTtyZXR1cm59fXdoaWxlKGwhPT1jKX1maW5kKHQsZSxuPTApe2lmKHQ9K3QsdCE9PXR8fChlPStlLGUhPT1lKSlyZXR1cm4tMTtjb25zdCBzPW47bGV0IHI7Zm9yKDsocj10aGlzLl9zdGVwKG4sdCxlKSk+PTAmJnIhPT1uJiZyIT09czspbj1yO3JldHVybiByfV9zdGVwKHQsZSxuKXtjb25zdHtpbmVkZ2VzOnMsaHVsbDpyLF9odWxsSW5kZXg6byxoYWxmZWRnZXM6YSx0cmlhbmdsZXM6Yyxwb2ludHM6bH09dGhpcztpZihzW3RdPT09LTF8fCFsLmxlbmd0aClyZXR1cm4odCsxKSUobC5sZW5ndGg+PjEpO2xldCBoPXQsdT1kaShlLWxbdCoyXSwyKStkaShuLWxbdCoyKzFdLDIpO2NvbnN0IGY9c1t0XTtsZXQgZD1mO2Rve2xldCBwPWNbZF07Y29uc3QgeT1kaShlLWxbcCoyXSwyKStkaShuLWxbcCoyKzFdLDIpO2lmKHk8dSYmKHU9eSxoPXApLGQ9ZCUzPT09Mj9kLTI6ZCsxLGNbZF0hPT10KWJyZWFrO2lmKGQ9YVtkXSxkPT09LTEpe2lmKGQ9clsob1t0XSsxKSVyLmxlbmd0aF0sZCE9PXAmJmRpKGUtbFtkKjJdLDIpK2RpKG4tbFtkKjIrMV0sMik8dSlyZXR1cm4gZDticmVha319d2hpbGUoZCE9PWYpO3JldHVybiBofXJlbmRlcih0KXtjb25zdCBlPXQ9PW51bGw/dD1uZXcgem46dm9pZCAwLHtwb2ludHM6bixoYWxmZWRnZXM6cyx0cmlhbmdsZXM6cn09dGhpcztmb3IobGV0IG89MCxhPXMubGVuZ3RoO288YTsrK28pe2NvbnN0IGM9c1tvXTtpZihjPG8pY29udGludWU7Y29uc3QgbD1yW29dKjIsaD1yW2NdKjI7dC5tb3ZlVG8obltsXSxuW2wrMV0pLHQubGluZVRvKG5baF0sbltoKzFdKX1yZXR1cm4gdGhpcy5yZW5kZXJIdWxsKHQpLGUmJmUudmFsdWUoKX1yZW5kZXJQb2ludHModCxlKXtlPT09dm9pZCAwJiYoIXR8fHR5cGVvZiB0Lm1vdmVUbyE9ImZ1bmN0aW9uIikmJihlPXQsdD1udWxsKSxlPWU9PW51bGw/MjorZTtjb25zdCBuPXQ9PW51bGw/dD1uZXcgem46dm9pZCAwLHtwb2ludHM6c309dGhpcztmb3IobGV0IHI9MCxvPXMubGVuZ3RoO3I8bztyKz0yKXtjb25zdCBhPXNbcl0sYz1zW3IrMV07dC5tb3ZlVG8oYStlLGMpLHQuYXJjKGEsYyxlLDAsbm0pfXJldHVybiBuJiZuLnZhbHVlKCl9cmVuZGVySHVsbCh0KXtjb25zdCBlPXQ9PW51bGw/dD1uZXcgem46dm9pZCAwLHtodWxsOm4scG9pbnRzOnN9PXRoaXMscj1uWzBdKjIsbz1uLmxlbmd0aDt0Lm1vdmVUbyhzW3JdLHNbcisxXSk7Zm9yKGxldCBhPTE7YTxvOysrYSl7Y29uc3QgYz0yKm5bYV07dC5saW5lVG8oc1tjXSxzW2MrMV0pfXJldHVybiB0LmNsb3NlUGF0aCgpLGUmJmUudmFsdWUoKX1odWxsUG9seWdvbigpe2NvbnN0IHQ9bmV3IGljO3JldHVybiB0aGlzLnJlbmRlckh1bGwodCksdC52YWx1ZSgpfXJlbmRlclRyaWFuZ2xlKHQsZSl7Y29uc3Qgbj1lPT1udWxsP2U9bmV3IHpuOnZvaWQgMCx7cG9pbnRzOnMsdHJpYW5nbGVzOnJ9PXRoaXMsbz1yW3QqPTNdKjIsYT1yW3QrMV0qMixjPXJbdCsyXSoyO3JldHVybiBlLm1vdmVUbyhzW29dLHNbbysxXSksZS5saW5lVG8oc1thXSxzW2ErMV0pLGUubGluZVRvKHNbY10sc1tjKzFdKSxlLmNsb3NlUGF0aCgpLG4mJm4udmFsdWUoKX0qdHJpYW5nbGVQb2x5Z29ucygpe2NvbnN0e3RyaWFuZ2xlczp0fT10aGlzO2ZvcihsZXQgZT0wLG49dC5sZW5ndGgvMztlPG47KytlKXlpZWxkIHRoaXMudHJpYW5nbGVQb2x5Z29uKGUpfXRyaWFuZ2xlUG9seWdvbih0KXtjb25zdCBlPW5ldyBpYztyZXR1cm4gdGhpcy5yZW5kZXJUcmlhbmdsZSh0LGUpLGUudmFsdWUoKX19ZnVuY3Rpb24gYW0oaSx0LGUsbil7Y29uc3Qgcz1pLmxlbmd0aCxyPW5ldyBGbG9hdDY0QXJyYXkocyoyKTtmb3IobGV0IG89MDtvPHM7KytvKXtjb25zdCBhPWlbb107cltvKjJdPXQuY2FsbChuLGEsbyxpKSxyW28qMisxXT1lLmNhbGwobixhLG8saSl9cmV0dXJuIHJ9ZnVuY3Rpb24qY20oaSx0LGUsbil7bGV0IHM9MDtmb3IoY29uc3QgciBvZiBpKXlpZWxkIHQuY2FsbChuLHIscyxpKSx5aWVsZCBlLmNhbGwobixyLHMsaSksKytzfWNvbnN0IHJjPU1hdGguUEksb3U9cmMvMixhdT0xODAvcmMsY3U9cmMvMTgwLGxtPU1hdGguYXRhbjIsbHU9TWF0aC5jb3MsaG09TWF0aC5tYXgsdW09TWF0aC5taW4saHU9TWF0aC5zaW4sZm09TWF0aC5zaWdufHxmdW5jdGlvbihpKXtyZXR1cm4gaT4wPzE6aTwwPy0xOjB9LHV1PU1hdGguc3FydDtmdW5jdGlvbiBkbShpKXtyZXR1cm4gaT4xP291Omk8LTE/LW91Ok1hdGguYXNpbihpKX1mdW5jdGlvbiBmdShpLHQpe3JldHVybiBpWzBdKnRbMF0raVsxXSp0WzFdK2lbMl0qdFsyXX1mdW5jdGlvbiBYdChpLHQpe3JldHVybltpWzFdKnRbMl0taVsyXSp0WzFdLGlbMl0qdFswXS1pWzBdKnRbMl0saVswXSp0WzFdLWlbMV0qdFswXV19ZnVuY3Rpb24gVnIoaSx0KXtyZXR1cm5baVswXSt0WzBdLGlbMV0rdFsxXSxpWzJdK3RbMl1dfWZ1bmN0aW9uIFVyKGkpe3ZhciB0PXV1KGlbMF0qaVswXStpWzFdKmlbMV0raVsyXSppWzJdKTtyZXR1cm5baVswXS90LGlbMV0vdCxpWzJdL3RdfWZ1bmN0aW9uIG9jKGkpe3JldHVybltsbShpWzFdLGlbMF0pKmF1LGRtKGhtKC0xLHVtKDEsaVsyXSkpKSphdV19ZnVuY3Rpb24gTWUoaSl7Y29uc3QgdD1pWzBdKmN1LGU9aVsxXSpjdSxuPWx1KGUpO3JldHVybltuKmx1KHQpLG4qaHUodCksaHUoZSldfWZ1bmN0aW9uIGFjKGkpe3JldHVybiBpPWkubWFwKHQ9Pk1lKHQpKSxmdShpWzBdLFh0KGlbMl0saVsxXSkpfWZ1bmN0aW9uIHBtKGkpe2NvbnN0IHQ9bW0oaSksZT14bSh0KSxuPWdtKGUsaSkscz1ibShlLGkubGVuZ3RoKSxyPXltKHMsaSksbz13bShlLGkpLHtwb2x5Z29uczphLGNlbnRlcnM6Y309TW0obyxlLGkpLGw9QW0oYSksaD1fbShlLGkpLHU9U20obixlKTtyZXR1cm57ZGVsYXVuYXk6dCxlZGdlczpuLHRyaWFuZ2xlczplLGNlbnRlcnM6YyxuZWlnaGJvcnM6cyxwb2x5Z29uczphLG1lc2g6bCxodWxsOmgsdXJxdWhhcnQ6dSxmaW5kOnJ9fWZ1bmN0aW9uIHltKGksdCl7ZnVuY3Rpb24gZShuLHMpe2xldCByPW5bMF0tc1swXSxvPW5bMV0tc1sxXSxhPW5bMl0tc1syXTtyZXR1cm4gcipyK28qbythKmF9cmV0dXJuIGZ1bmN0aW9uKHMscixvKXtvPT09dm9pZCAwJiYobz0wKTtsZXQgYSxjLGw9bztjb25zdCBoPU1lKFtzLHJdKTtkbyBhPW8sbz1udWxsLGM9ZShoLE1lKHRbYV0pKSxpW2FdLmZvckVhY2godT0+e2xldCBmPWUoaCxNZSh0W3VdKSk7aWYoZjxjKXtjPWYsbz11LGw9dTtyZXR1cm59fSk7d2hpbGUobyE9PW51bGwpO3JldHVybiBsfX1mdW5jdGlvbiBtbShpKXtpZihpLmxlbmd0aDwyKXJldHVybnt9O2xldCB0PTA7Zm9yKDtpc05hTihpW3RdWzBdK2lbdF1bMV0pJiZ0Kys8aS5sZW5ndGg7KTtjb25zdCBlPXZoKGlbdF0pLG49b3koKS50cmFuc2xhdGUoWzAsMF0pLnNjYWxlKDEpLnJvdGF0ZShlLmludmVydChbMTgwLDBdKSk7aT1pLm1hcChuKTtjb25zdCBzPVtdO2xldCByPTE7Zm9yKGxldCB1PTAsZj1pLmxlbmd0aDt1PGY7dSsrKXtsZXQgZD1naShpW3VdWzBdLDIpK2dpKGlbdV1bMV0sMik7IWlzRmluaXRlKGQpfHxkPjFlMzI/cy5wdXNoKHUpOmQ+ciYmKHI9ZCl9Y29uc3Qgbz0xZTYqdXUocik7cy5mb3JFYWNoKHU9PmlbdV09W28sMF0pLGkucHVzaChbMCxvXSksaS5wdXNoKFstbywwXSksaS5wdXNoKFswLC1vXSk7Y29uc3QgYT1zYy5mcm9tKGkpO2EucHJvamVjdGlvbj1uO2NvbnN0e3RyaWFuZ2xlczpjLGhhbGZlZGdlczpsLGluZWRnZXM6aH09YTtmb3IobGV0IHU9MCxmPWwubGVuZ3RoO3U8Zjt1KyspaWYobFt1XTwwKXtjb25zdCBkPXUlMz09Mj91LTI6dSsxLHA9dSUzPT0wP3UrMjp1LTEseT1sW2RdLG09bFtwXTtsW3ldPW0sbFttXT15LGxbZF09bFtwXT0tMSxjW3VdPWNbZF09Y1twXT10LGhbY1t5XV09eSUzPT0wP3krMjp5LTEsaFtjW21dXT1tJTM9PTA/bSsyOm0tMSx1Kz0yLXUlM31lbHNlIGNbdV0+aS5sZW5ndGgtMy0xJiYoY1t1XT10KTtyZXR1cm4gYX1mdW5jdGlvbiBnbShpLHQpe2NvbnN0IGU9bmV3IFNldDtyZXR1cm4gdC5sZW5ndGg9PT0yP1tbMCwxXV06KGkuZm9yRWFjaChuPT57aWYoblswXSE9PW5bMV0mJiEoYWMobi5tYXAocz0+dFtzXSkpPDApKWZvcihsZXQgcz0wLHI7czwzO3MrKylyPShzKzEpJTMsZS5hZGQob3IoW25bc10sbltyXV0pLmpvaW4oIi0iKSl9KSxBcnJheS5mcm9tKGUsbj0+bi5zcGxpdCgiLSIpLm1hcChOdW1iZXIpKSl9ZnVuY3Rpb24geG0oaSl7Y29uc3R7dHJpYW5nbGVzOnR9PWk7aWYoIXQpcmV0dXJuW107Y29uc3QgZT1bXTtmb3IobGV0IG49MCxzPXQubGVuZ3RoLzM7bjxzO24rKyl7Y29uc3Qgcj10WzMqbl0sbz10WzMqbisxXSxhPXRbMypuKzJdO3IhPT1vJiZvIT09YSYmZS5wdXNoKFtyLGEsb10pfXJldHVybiBlfWZ1bmN0aW9uIHdtKGksdCl7cmV0dXJuIGkubWFwKGU9Pntjb25zdCBuPWUubWFwKHI9PnRbcl0pLm1hcChNZSkscz1WcihWcihYdChuWzFdLG5bMF0pLFh0KG5bMl0sblsxXSkpLFh0KG5bMF0sblsyXSkpO3JldHVybiBvYyhVcihzKSl9KX1mdW5jdGlvbiBibShpLHQpe2NvbnN0IGU9W107cmV0dXJuIGkuZm9yRWFjaChuPT57Zm9yKGxldCBzPTA7czwzO3MrKyl7Y29uc3Qgcj1uW3NdLG89blsocysxKSUzXTtlW3JdPWVbcl18fFtdLGVbcl0ucHVzaChvKX19KSxpLmxlbmd0aD09PTAmJih0PT09Mj8oZVswXT1bMV0sZVsxXT1bMF0pOnQ9PT0xJiYoZVswXT1bXSkpLGV9ZnVuY3Rpb24gTW0oaSx0LGUpe2NvbnN0IG49W10scz1pLnNsaWNlKCk7aWYodC5sZW5ndGg9PT0wKXtpZihlLmxlbmd0aDwyKXJldHVybntwb2x5Z29uczpuLGNlbnRlcnM6c307aWYoZS5sZW5ndGg9PT0yKXtjb25zdCBhPU1lKGVbMF0pLGM9TWUoZVsxXSksbD1VcihWcihhLGMpKSxoPVVyKFh0KGEsYykpLHU9WHQobCxoKSxmPVtsLFh0KGwsdSksWHQoWHQobCx1KSx1KSxYdChYdChYdChsLHUpLHUpLHUpXS5tYXAob2MpLm1hcChvKTtyZXR1cm4gbi5wdXNoKGYpLG4ucHVzaChmLnNsaWNlKCkucmV2ZXJzZSgpKSx7cG9seWdvbnM6bixjZW50ZXJzOnN9fX10LmZvckVhY2goKGEsYyk9Pntmb3IobGV0IGw9MDtsPDM7bCsrKXtjb25zdCBoPWFbbF0sdT1hWyhsKzEpJTNdLGY9YVsobCsyKSUzXTtuW2hdPW5baF18fFtdLG5baF0ucHVzaChbdSxmLGMsW2gsdSxmXV0pfX0pO2NvbnN0IHI9bi5tYXAoYT0+e2NvbnN0IGM9W2FbMF1bMl1dO2xldCBsPWFbMF1bMV07Zm9yKGxldCBoPTE7aDxhLmxlbmd0aDtoKyspZm9yKGxldCB1PTA7dTxhLmxlbmd0aDt1KyspaWYoYVt1XVswXT09bCl7bD1hW3VdWzFdLGMucHVzaChhW3VdWzJdKTticmVha31pZihjLmxlbmd0aD4yKXJldHVybiBjO2lmKGMubGVuZ3RoPT0yKXtjb25zdCBoPWR1KGVbYVswXVszXVswXV0sZVthWzBdWzNdWzFdXSxzW2NbMF1dKSx1PWR1KGVbYVswXVszXVsyXV0sZVthWzBdWzNdWzBdXSxzW2NbMF1dKSxmPW8oaCksZD1vKHUpO3JldHVybltjWzBdLGQsY1sxXSxmXX19KTtmdW5jdGlvbiBvKGEpe2xldCBjPS0xO3JldHVybiBzLnNsaWNlKHQubGVuZ3RoLDEvMCkuZm9yRWFjaCgobCxoKT0+e2xbMF09PT1hWzBdJiZsWzFdPT09YVsxXSYmKGM9aCt0Lmxlbmd0aCl9KSxjPDAmJihjPXMubGVuZ3RoLHMucHVzaChhKSksY31yZXR1cm57cG9seWdvbnM6cixjZW50ZXJzOnN9fWZ1bmN0aW9uIGR1KGksdCxlKXtpPU1lKGkpLHQ9TWUodCksZT1NZShlKTtjb25zdCBuPWZtKGZ1KFh0KHQsaSksZSkpO3JldHVybiBvYyhVcihWcihpLHQpKS5tYXAocz0+bipzKSl9ZnVuY3Rpb24gQW0oaSl7Y29uc3QgdD1bXTtyZXR1cm4gaS5mb3JFYWNoKGU9PntpZighZSlyZXR1cm47bGV0IG49ZVtlLmxlbmd0aC0xXTtmb3IobGV0IHMgb2YgZSlzPm4mJnQucHVzaChbbixzXSksbj1zfSksdH1mdW5jdGlvbiBTbShpLHQpe3JldHVybiBmdW5jdGlvbihlKXtjb25zdCBuPW5ldyBNYXAscz1uZXcgTWFwO3JldHVybiBpLmZvckVhY2goKHIsbyk9Pntjb25zdCBhPXIuam9pbigiLSIpO24uc2V0KGEsZVtvXSkscy5zZXQoYSwhMCl9KSx0LmZvckVhY2gocj0+e2xldCBvPTAsYT0tMTtmb3IobGV0IGM9MDtjPDM7YysrKXtsZXQgbD1vcihbcltjXSxyWyhjKzEpJTNdXSkuam9pbigiLSIpO24uZ2V0KGwpPm8mJihvPW4uZ2V0KGwpLGE9bCl9cy5zZXQoYSwhMSl9KSxpLm1hcChyPT5zLmdldChyLmpvaW4oIi0iKSkpfX1mdW5jdGlvbiBfbShpLHQpe2NvbnN0IGU9bmV3IFNldCxuPVtdO2kubWFwKGE9PntpZighKGFjKGEubWFwKGM9PnRbYz50Lmxlbmd0aD8wOmNdKSk+MWUtMTIpKWZvcihsZXQgYz0wO2M8MztjKyspe2xldCBsPVthW2NdLGFbKGMrMSklM11dLGg9YCR7bFswXX0tJHtsWzFdfWA7ZS5oYXMoaCk/ZS5kZWxldGUoaCk6ZS5hZGQoYCR7bFsxXX0tJHtsWzBdfWApfX0pO2NvbnN0IHM9bmV3IE1hcDtsZXQgcjtpZihlLmZvckVhY2goYT0+e2E9YS5zcGxpdCgiLSIpLm1hcChOdW1iZXIpLHMuc2V0KGFbMF0sYVsxXSkscj1hWzBdfSkscj09PXZvaWQgMClyZXR1cm4gbjtsZXQgbz1yO2Rve24ucHVzaChvKTtsZXQgYT1zLmdldChvKTtzLnNldChvLC0xKSxvPWF9d2hpbGUobz4tMSYmbyE9PXIpO3JldHVybiBufWZ1bmN0aW9uIHZtKGkpe2NvbnN0IHQ9ZnVuY3Rpb24oZSl7aWYodC5kZWxhdW5heT1udWxsLHQuX2RhdGE9ZSx0eXBlb2YgdC5fZGF0YT09Im9iamVjdCImJnQuX2RhdGEudHlwZT09PSJGZWF0dXJlQ29sbGVjdGlvbiImJih0Ll9kYXRhPXQuX2RhdGEuZmVhdHVyZXMpLHR5cGVvZiB0Ll9kYXRhPT0ib2JqZWN0Iil7Y29uc3Qgbj10Ll9kYXRhLm1hcChzPT5bdC5fdngocyksdC5fdnkocyksc10pLmZpbHRlcihzPT5pc0Zpbml0ZShzWzBdK3NbMV0pKTt0LnBvaW50cz1uLm1hcChzPT5bc1swXSxzWzFdXSksdC52YWxpZD1uLm1hcChzPT5zWzJdKSx0LmRlbGF1bmF5PXBtKHQucG9pbnRzKX1yZXR1cm4gdH07cmV0dXJuIHQuX3Z4PWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlPT0ib2JqZWN0IiYmInR5cGUiaW4gZSlyZXR1cm4gYmgoZSlbMF07aWYoMCBpbiBlKXJldHVybiBlWzBdfSx0Ll92eT1mdW5jdGlvbihlKXtpZih0eXBlb2YgZT09Im9iamVjdCImJiJ0eXBlImluIGUpcmV0dXJuIGJoKGUpWzFdO2lmKDEgaW4gZSlyZXR1cm4gZVsxXX0sdC54PWZ1bmN0aW9uKGUpe3JldHVybiBlPyh0Ll92eD1lLHQpOnQuX3Z4fSx0Lnk9ZnVuY3Rpb24oZSl7cmV0dXJuIGU/KHQuX3Z5PWUsdCk6dC5fdnl9LHQucG9seWdvbnM9ZnVuY3Rpb24oZSl7aWYoZSE9PXZvaWQgMCYmdChlKSwhdC5kZWxhdW5heSlyZXR1cm4hMTtjb25zdCBuPXt0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiIsZmVhdHVyZXM6W119O3JldHVybiB0LnZhbGlkLmxlbmd0aD09PTB8fCh0LmRlbGF1bmF5LnBvbHlnb25zLmZvckVhY2goKHMscik9Pm4uZmVhdHVyZXMucHVzaCh7dHlwZToiRmVhdHVyZSIsZ2VvbWV0cnk6cz97dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W1suLi5zLHNbMF1dLm1hcChvPT50LmRlbGF1bmF5LmNlbnRlcnNbb10pXX06bnVsbCxwcm9wZXJ0aWVzOntzaXRlOnQudmFsaWRbcl0sc2l0ZWNvb3JkaW5hdGVzOnQucG9pbnRzW3JdLG5laWdoYm91cnM6dC5kZWxhdW5heS5uZWlnaGJvcnNbcl19fSkpLHQudmFsaWQubGVuZ3RoPT09MSYmbi5mZWF0dXJlcy5wdXNoKHt0eXBlOiJGZWF0dXJlIixnZW9tZXRyeTp7dHlwZToiU3BoZXJlIn0scHJvcGVydGllczp7c2l0ZTp0LnZhbGlkWzBdLHNpdGVjb29yZGluYXRlczp0LnBvaW50c1swXSxuZWlnaGJvdXJzOltdfX0pKSxufSx0LnRyaWFuZ2xlcz1mdW5jdGlvbihlKXtyZXR1cm4gZSE9PXZvaWQgMCYmdChlKSx0LmRlbGF1bmF5P3t0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiIsZmVhdHVyZXM6dC5kZWxhdW5heS50cmlhbmdsZXMubWFwKChuLHMpPT4obj1uLm1hcChyPT50LnBvaW50c1tyXSksbi5jZW50ZXI9dC5kZWxhdW5heS5jZW50ZXJzW3NdLG4pKS5maWx0ZXIobj0+YWMobik+MCkubWFwKG49Pih7dHlwZToiRmVhdHVyZSIscHJvcGVydGllczp7Y2lyY3VtY2VudGVyOm4uY2VudGVyfSxnZW9tZXRyeTp7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W1suLi5uLG5bMF1dXX19KSl9OiExfSx0LmxpbmtzPWZ1bmN0aW9uKGUpe2lmKGUhPT12b2lkIDAmJnQoZSksIXQuZGVsYXVuYXkpcmV0dXJuITE7Y29uc3Qgbj10LmRlbGF1bmF5LmVkZ2VzLm1hcChyPT5haSh0LnBvaW50c1tyWzBdXSx0LnBvaW50c1tyWzFdXSkpLHM9dC5kZWxhdW5heS51cnF1aGFydChuKTtyZXR1cm57dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24iLGZlYXR1cmVzOnQuZGVsYXVuYXkuZWRnZXMubWFwKChyLG8pPT4oe3R5cGU6IkZlYXR1cmUiLHByb3BlcnRpZXM6e3NvdXJjZTp0LnZhbGlkW3JbMF1dLHRhcmdldDp0LnZhbGlkW3JbMV1dLGxlbmd0aDpuW29dLHVycXVoYXJ0OiEhc1tvXX0sZ2VvbWV0cnk6e3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOlt0LnBvaW50c1tyWzBdXSx0LnBvaW50c1tyWzFdXV19fSkpfX0sdC5tZXNoPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dm9pZCAwJiZ0KGUpLHQuZGVsYXVuYXk/e3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dC5kZWxhdW5heS5lZGdlcy5tYXAobj0+W3QucG9pbnRzW25bMF1dLHQucG9pbnRzW25bMV1dXSl9OiExfSx0LmNlbGxNZXNoPWZ1bmN0aW9uKGUpe2lmKGUhPT12b2lkIDAmJnQoZSksIXQuZGVsYXVuYXkpcmV0dXJuITE7Y29uc3R7Y2VudGVyczpuLHBvbHlnb25zOnN9PXQuZGVsYXVuYXkscj1bXTtmb3IoY29uc3QgbyBvZiBzKWlmKG8pZm9yKGxldCBhPW8ubGVuZ3RoLGM9b1thLTFdLGw9b1swXSxoPTA7aDxhO2M9bCxsPW9bKytoXSlsPmMmJnIucHVzaChbbltjXSxuW2xdXSk7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6cn19LHQuX2ZvdW5kPXZvaWQgMCx0LmZpbmQ9ZnVuY3Rpb24oZSxuLHMpe2lmKHQuX2ZvdW5kPXQuZGVsYXVuYXkuZmluZChlLG4sdC5fZm91bmQpLCFzfHxhaShbZSxuXSx0LnBvaW50c1t0Ll9mb3VuZF0pPHMpcmV0dXJuIHQuX2ZvdW5kfSx0Lmh1bGw9ZnVuY3Rpb24oZSl7ZSE9PXZvaWQgMCYmdChlKTtjb25zdCBuPXQuZGVsYXVuYXkuaHVsbCxzPXQucG9pbnRzO3JldHVybiBuLmxlbmd0aD09PTA/bnVsbDp7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W1suLi5uLm1hcChyPT5zW3JdKSxzW25bMF1dXV19fSxpP3QoaSk6dH1mdW5jdGlvbiB6bShpLHQpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6YnJlYWs7Y2FzZSAxOnRoaXMucmFuZ2UoaSk7YnJlYWs7ZGVmYXVsdDp0aGlzLnJhbmdlKHQpLmRvbWFpbihpKTticmVha31yZXR1cm4gdGhpc31mdW5jdGlvbiBjYyhpLHQsZSl7aS5wcm90b3R5cGU9dC5wcm90b3R5cGU9ZSxlLmNvbnN0cnVjdG9yPWl9ZnVuY3Rpb24gcHUoaSx0KXt2YXIgZT1PYmplY3QuY3JlYXRlKGkucHJvdG90eXBlKTtmb3IodmFyIG4gaW4gdCllW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gc3MoKXt9dmFyIHJzPS43LHFyPTEvcnMscGk9IlxccyooWystXT9cXGQrKVxccyoiLG9zPSJcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixBZT0iXFxzKihbKy1dPyg/OlxcZCpcXC4pP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pJVxccyoiLFRtPS9eIyhbMC05YS1mXXszLDh9KSQvLEVtPW5ldyBSZWdFeHAoYF5yZ2JcXCgke3BpfSwke3BpfSwke3BpfVxcKSRgKSxQbT1uZXcgUmVnRXhwKGBecmdiXFwoJHtBZX0sJHtBZX0sJHtBZX1cXCkkYCksQ209bmV3IFJlZ0V4cChgXnJnYmFcXCgke3BpfSwke3BpfSwke3BpfSwke29zfVxcKSRgKSxCbT1uZXcgUmVnRXhwKGBecmdiYVxcKCR7QWV9LCR7QWV9LCR7QWV9LCR7b3N9XFwpJGApLEZtPW5ldyBSZWdFeHAoYF5oc2xcXCgke29zfSwke0FlfSwke0FlfVxcKSRgKSxJbT1uZXcgUmVnRXhwKGBeaHNsYVxcKCR7b3N9LCR7QWV9LCR7QWV9LCR7b3N9XFwpJGApLHl1PXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O2NjKHNzLGFzLHtjb3B5KGkpe3JldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLHRoaXMsaSl9LGRpc3BsYXlhYmxlKCl7cmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKX0saGV4Om11LGZvcm1hdEhleDptdSxmb3JtYXRIZXg4OmttLGZvcm1hdEhzbDpObSxmb3JtYXRSZ2I6Z3UsdG9TdHJpbmc6Z3V9KTtmdW5jdGlvbiBtdSgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpfWZ1bmN0aW9uIGttKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4OCgpfWZ1bmN0aW9uIE5tKCl7cmV0dXJuIEF1KHRoaXMpLmZvcm1hdEhzbCgpfWZ1bmN0aW9uIGd1KCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCl9ZnVuY3Rpb24gYXMoaSl7dmFyIHQsZTtyZXR1cm4gaT0oaSsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKHQ9VG0uZXhlYyhpKSk/KGU9dFsxXS5sZW5ndGgsdD1wYXJzZUludCh0WzFdLDE2KSxlPT09Nj94dSh0KTplPT09Mz9uZXcgT3QodD4+OCYxNXx0Pj40JjI0MCx0Pj40JjE1fHQmMjQwLCh0JjE1KTw8NHx0JjE1LDEpOmU9PT04P0hyKHQ+PjI0JjI1NSx0Pj4xNiYyNTUsdD4+OCYyNTUsKHQmMjU1KS8yNTUpOmU9PT00P0hyKHQ+PjEyJjE1fHQ+PjgmMjQwLHQ+PjgmMTV8dD4+NCYyNDAsdD4+NCYxNXx0JjI0MCwoKHQmMTUpPDw0fHQmMTUpLzI1NSk6bnVsbCk6KHQ9RW0uZXhlYyhpKSk/bmV3IE90KHRbMV0sdFsyXSx0WzNdLDEpOih0PVBtLmV4ZWMoaSkpP25ldyBPdCh0WzFdKjI1NS8xMDAsdFsyXSoyNTUvMTAwLHRbM10qMjU1LzEwMCwxKToodD1DbS5leGVjKGkpKT9Icih0WzFdLHRbMl0sdFszXSx0WzRdKToodD1CbS5leGVjKGkpKT9Icih0WzFdKjI1NS8xMDAsdFsyXSoyNTUvMTAwLHRbM10qMjU1LzEwMCx0WzRdKToodD1GbS5leGVjKGkpKT9NdSh0WzFdLHRbMl0vMTAwLHRbM10vMTAwLDEpOih0PUltLmV4ZWMoaSkpP011KHRbMV0sdFsyXS8xMDAsdFszXS8xMDAsdFs0XSk6eXUuaGFzT3duUHJvcGVydHkoaSk/eHUoeXVbaV0pOmk9PT0idHJhbnNwYXJlbnQiP25ldyBPdChOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIHh1KGkpe3JldHVybiBuZXcgT3QoaT4+MTYmMjU1LGk+PjgmMjU1LGkmMjU1LDEpfWZ1bmN0aW9uIEhyKGksdCxlLG4pe3JldHVybiBuPD0wJiYoaT10PWU9TmFOKSxuZXcgT3QoaSx0LGUsbil9ZnVuY3Rpb24gUm0oaSl7cmV0dXJuIGkgaW5zdGFuY2VvZiBzc3x8KGk9YXMoaSkpLGk/KGk9aS5yZ2IoKSxuZXcgT3QoaS5yLGkuZyxpLmIsaS5vcGFjaXR5KSk6bmV3IE90fWZ1bmN0aW9uIGxjKGksdCxlLG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MT9SbShpKTpuZXcgT3QoaSx0LGUsbj09bnVsbD8xOm4pfWZ1bmN0aW9uIE90KGksdCxlLG4pe3RoaXMucj0raSx0aGlzLmc9K3QsdGhpcy5iPStlLHRoaXMub3BhY2l0eT0rbn1jYyhPdCxsYyxwdShzcyx7YnJpZ2h0ZXIoaSl7cmV0dXJuIGk9aT09bnVsbD9xcjpNYXRoLnBvdyhxcixpKSxuZXcgT3QodGhpcy5yKmksdGhpcy5nKmksdGhpcy5iKmksdGhpcy5vcGFjaXR5KX0sZGFya2VyKGkpe3JldHVybiBpPWk9PW51bGw/cnM6TWF0aC5wb3cocnMsaSksbmV3IE90KHRoaXMucippLHRoaXMuZyppLHRoaXMuYippLHRoaXMub3BhY2l0eSl9LHJnYigpe3JldHVybiB0aGlzfSxjbGFtcCgpe3JldHVybiBuZXcgT3QoVG4odGhpcy5yKSxUbih0aGlzLmcpLFRuKHRoaXMuYiksWHIodGhpcy5vcGFjaXR5KSl9LGRpc3BsYXlhYmxlKCl7cmV0dXJuLS41PD10aGlzLnImJnRoaXMucjwyNTUuNSYmLS41PD10aGlzLmcmJnRoaXMuZzwyNTUuNSYmLS41PD10aGlzLmImJnRoaXMuYjwyNTUuNSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGhleDp3dSxmb3JtYXRIZXg6d3UsZm9ybWF0SGV4ODpMbSxmb3JtYXRSZ2I6YnUsdG9TdHJpbmc6YnV9KSk7ZnVuY3Rpb24gd3UoKXtyZXR1cm5gIyR7RW4odGhpcy5yKX0ke0VuKHRoaXMuZyl9JHtFbih0aGlzLmIpfWB9ZnVuY3Rpb24gTG0oKXtyZXR1cm5gIyR7RW4odGhpcy5yKX0ke0VuKHRoaXMuZyl9JHtFbih0aGlzLmIpfSR7RW4oKGlzTmFOKHRoaXMub3BhY2l0eSk/MTp0aGlzLm9wYWNpdHkpKjI1NSl9YH1mdW5jdGlvbiBidSgpe2NvbnN0IGk9WHIodGhpcy5vcGFjaXR5KTtyZXR1cm5gJHtpPT09MT8icmdiKCI6InJnYmEoIn0ke1RuKHRoaXMucil9LCAke1RuKHRoaXMuZyl9LCAke1RuKHRoaXMuYil9JHtpPT09MT8iKSI6YCwgJHtpfSlgfWB9ZnVuY3Rpb24gWHIoaSl7cmV0dXJuIGlzTmFOKGkpPzE6TWF0aC5tYXgoMCxNYXRoLm1pbigxLGkpKX1mdW5jdGlvbiBUbihpKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZChpKXx8MCkpfWZ1bmN0aW9uIEVuKGkpe3JldHVybiBpPVRuKGkpLChpPDE2PyIwIjoiIikraS50b1N0cmluZygxNil9ZnVuY3Rpb24gTXUoaSx0LGUsbil7cmV0dXJuIG48PTA/aT10PWU9TmFOOmU8PTB8fGU+PTE/aT10PU5hTjp0PD0wJiYoaT1OYU4pLG5ldyBwZShpLHQsZSxuKX1mdW5jdGlvbiBBdShpKXtpZihpIGluc3RhbmNlb2YgcGUpcmV0dXJuIG5ldyBwZShpLmgsaS5zLGkubCxpLm9wYWNpdHkpO2lmKGkgaW5zdGFuY2VvZiBzc3x8KGk9YXMoaSkpLCFpKXJldHVybiBuZXcgcGU7aWYoaSBpbnN0YW5jZW9mIHBlKXJldHVybiBpO2k9aS5yZ2IoKTt2YXIgdD1pLnIvMjU1LGU9aS5nLzI1NSxuPWkuYi8yNTUscz1NYXRoLm1pbih0LGUsbikscj1NYXRoLm1heCh0LGUsbiksbz1OYU4sYT1yLXMsYz0ocitzKS8yO3JldHVybiBhPyh0PT09cj9vPShlLW4pL2ErKGU8bikqNjplPT09cj9vPShuLXQpL2ErMjpvPSh0LWUpL2ErNCxhLz1jPC41P3IrczoyLXItcyxvKj02MCk6YT1jPjAmJmM8MT8wOm8sbmV3IHBlKG8sYSxjLGkub3BhY2l0eSl9ZnVuY3Rpb24gT20oaSx0LGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0xP0F1KGkpOm5ldyBwZShpLHQsZSxuPT1udWxsPzE6bil9ZnVuY3Rpb24gcGUoaSx0LGUsbil7dGhpcy5oPStpLHRoaXMucz0rdCx0aGlzLmw9K2UsdGhpcy5vcGFjaXR5PStufWNjKHBlLE9tLHB1KHNzLHticmlnaHRlcihpKXtyZXR1cm4gaT1pPT1udWxsP3FyOk1hdGgucG93KHFyLGkpLG5ldyBwZSh0aGlzLmgsdGhpcy5zLHRoaXMubCppLHRoaXMub3BhY2l0eSl9LGRhcmtlcihpKXtyZXR1cm4gaT1pPT1udWxsP3JzOk1hdGgucG93KHJzLGkpLG5ldyBwZSh0aGlzLmgsdGhpcy5zLHRoaXMubCppLHRoaXMub3BhY2l0eSl9LHJnYigpe3ZhciBpPXRoaXMuaCUzNjArKHRoaXMuaDwwKSozNjAsdD1pc05hTihpKXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxlPXRoaXMubCxuPWUrKGU8LjU/ZToxLWUpKnQscz0yKmUtbjtyZXR1cm4gbmV3IE90KGhjKGk+PTI0MD9pLTI0MDppKzEyMCxzLG4pLGhjKGkscyxuKSxoYyhpPDEyMD9pKzI0MDppLTEyMCxzLG4pLHRoaXMub3BhY2l0eSl9LGNsYW1wKCl7cmV0dXJuIG5ldyBwZShTdSh0aGlzLmgpLEdyKHRoaXMucyksR3IodGhpcy5sKSxYcih0aGlzLm9wYWNpdHkpKX0sZGlzcGxheWFibGUoKXtyZXR1cm4oMDw9dGhpcy5zJiZ0aGlzLnM8PTF8fGlzTmFOKHRoaXMucykpJiYwPD10aGlzLmwmJnRoaXMubDw9MSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGZvcm1hdEhzbCgpe2NvbnN0IGk9WHIodGhpcy5vcGFjaXR5KTtyZXR1cm5gJHtpPT09MT8iaHNsKCI6ImhzbGEoIn0ke1N1KHRoaXMuaCl9LCAke0dyKHRoaXMucykqMTAwfSUsICR7R3IodGhpcy5sKSoxMDB9JSR7aT09PTE/IikiOmAsICR7aX0pYH1gfX0pKTtmdW5jdGlvbiBTdShpKXtyZXR1cm4gaT0oaXx8MCklMzYwLGk8MD9pKzM2MDppfWZ1bmN0aW9uIEdyKGkpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDEsaXx8MCkpfWZ1bmN0aW9uIGhjKGksdCxlKXtyZXR1cm4oaTw2MD90KyhlLXQpKmkvNjA6aTwxODA/ZTppPDI0MD90KyhlLXQpKigyNDAtaSkvNjA6dCkqMjU1fXZhciB1Yz1pPT4oKT0+aTtmdW5jdGlvbiBEbShpLHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gaStlKnR9fWZ1bmN0aW9uICRtKGksdCxlKXtyZXR1cm4gaT1NYXRoLnBvdyhpLGUpLHQ9TWF0aC5wb3codCxlKS1pLGU9MS9lLGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnBvdyhpK24qdCxlKX19ZnVuY3Rpb24gVm0oaSl7cmV0dXJuKGk9K2kpPT0xP191OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdD8kbSh0LGUsaSk6dWMoaXNOYU4odCk/ZTp0KX19ZnVuY3Rpb24gX3UoaSx0KXt2YXIgZT10LWk7cmV0dXJuIGU/RG0oaSxlKTp1Yyhpc05hTihpKT90OmkpfXZhciB2dT1mdW5jdGlvbiBpKHQpe3ZhciBlPVZtKHQpO2Z1bmN0aW9uIG4ocyxyKXt2YXIgbz1lKChzPWxjKHMpKS5yLChyPWxjKHIpKS5yKSxhPWUocy5nLHIuZyksYz1lKHMuYixyLmIpLGw9X3Uocy5vcGFjaXR5LHIub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKGgpe3JldHVybiBzLnI9byhoKSxzLmc9YShoKSxzLmI9YyhoKSxzLm9wYWNpdHk9bChoKSxzKyIifX1yZXR1cm4gbi5nYW1tYT1pLG59KDEpO2Z1bmN0aW9uIFVtKGksdCl7dHx8KHQ9W10pO3ZhciBlPWk/TWF0aC5taW4odC5sZW5ndGgsaS5sZW5ndGgpOjAsbj10LnNsaWNlKCkscztyZXR1cm4gZnVuY3Rpb24ocil7Zm9yKHM9MDtzPGU7KytzKW5bc109aVtzXSooMS1yKSt0W3NdKnI7cmV0dXJuIG59fWZ1bmN0aW9uIHFtKGkpe3JldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoaSkmJiEoaSBpbnN0YW5jZW9mIERhdGFWaWV3KX1mdW5jdGlvbiBIbShpLHQpe3ZhciBlPXQ/dC5sZW5ndGg6MCxuPWk/TWF0aC5taW4oZSxpLmxlbmd0aCk6MCxzPW5ldyBBcnJheShuKSxyPW5ldyBBcnJheShlKSxvO2ZvcihvPTA7bzxuOysrbylzW29dPXBjKGlbb10sdFtvXSk7Zm9yKDtvPGU7KytvKXJbb109dFtvXTtyZXR1cm4gZnVuY3Rpb24oYSl7Zm9yKG89MDtvPG47KytvKXJbb109c1tvXShhKTtyZXR1cm4gcn19ZnVuY3Rpb24gWG0oaSx0KXt2YXIgZT1uZXcgRGF0ZTtyZXR1cm4gaT0raSx0PSt0LGZ1bmN0aW9uKG4pe3JldHVybiBlLnNldFRpbWUoaSooMS1uKSt0Km4pLGV9fWZ1bmN0aW9uIFdyKGksdCl7cmV0dXJuIGk9K2ksdD0rdCxmdW5jdGlvbihlKXtyZXR1cm4gaSooMS1lKSt0KmV9fWZ1bmN0aW9uIEdtKGksdCl7dmFyIGU9e30sbj17fSxzOyhpPT09bnVsbHx8dHlwZW9mIGkhPSJvYmplY3QiKSYmKGk9e30pLCh0PT09bnVsbHx8dHlwZW9mIHQhPSJvYmplY3QiKSYmKHQ9e30pO2ZvcihzIGluIHQpcyBpbiBpP2Vbc109cGMoaVtzXSx0W3NdKTpuW3NdPXRbc107cmV0dXJuIGZ1bmN0aW9uKHIpe2ZvcihzIGluIGUpbltzXT1lW3NdKHIpO3JldHVybiBufX12YXIgZmM9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLGRjPW5ldyBSZWdFeHAoZmMuc291cmNlLCJnIik7ZnVuY3Rpb24gV20oaSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGl9fWZ1bmN0aW9uIFptKGkpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaSh0KSsiIn19ZnVuY3Rpb24gSm0oaSx0KXt2YXIgZT1mYy5sYXN0SW5kZXg9ZGMubGFzdEluZGV4PTAsbixzLHIsbz0tMSxhPVtdLGM9W107Zm9yKGk9aSsiIix0PXQrIiI7KG49ZmMuZXhlYyhpKSkmJihzPWRjLmV4ZWModCkpOykocj1zLmluZGV4KT5lJiYocj10LnNsaWNlKGUsciksYVtvXT9hW29dKz1yOmFbKytvXT1yKSwobj1uWzBdKT09PShzPXNbMF0pP2Fbb10/YVtvXSs9czphWysrb109czooYVsrK29dPW51bGwsYy5wdXNoKHtpOm8seDpXcihuLHMpfSkpLGU9ZGMubGFzdEluZGV4O3JldHVybiBlPHQubGVuZ3RoJiYocj10LnNsaWNlKGUpLGFbb10/YVtvXSs9cjphWysrb109ciksYS5sZW5ndGg8Mj9jWzBdP1ptKGNbMF0ueCk6V20odCk6KHQ9Yy5sZW5ndGgsZnVuY3Rpb24obCl7Zm9yKHZhciBoPTAsdTtoPHQ7KytoKWFbKHU9Y1toXSkuaV09dS54KGwpO3JldHVybiBhLmpvaW4oIiIpfSl9ZnVuY3Rpb24gcGMoaSx0KXt2YXIgZT10eXBlb2YgdCxuO3JldHVybiB0PT1udWxsfHxlPT09ImJvb2xlYW4iP3VjKHQpOihlPT09Im51bWJlciI/V3I6ZT09PSJzdHJpbmciPyhuPWFzKHQpKT8odD1uLHZ1KTpKbTp0IGluc3RhbmNlb2YgYXM/dnU6dCBpbnN0YW5jZW9mIERhdGU/WG06cW0odCk/VW06QXJyYXkuaXNBcnJheSh0KT9IbTp0eXBlb2YgdC52YWx1ZU9mIT0iZnVuY3Rpb24iJiZ0eXBlb2YgdC50b1N0cmluZyE9ImZ1bmN0aW9uInx8aXNOYU4odCk/R206V3IpKGksdCl9ZnVuY3Rpb24gWW0oaSx0KXtyZXR1cm4gaT0raSx0PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnJvdW5kKGkqKDEtZSkrdCplKX19ZnVuY3Rpb24gam0oaSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGl9fWZ1bmN0aW9uIFFtKGkpe3JldHVybitpfXZhciB6dT1bMCwxXTtmdW5jdGlvbiB5aShpKXtyZXR1cm4gaX1mdW5jdGlvbiB5YyhpLHQpe3JldHVybih0LT1pPStpKT9mdW5jdGlvbihlKXtyZXR1cm4oZS1pKS90fTpqbShpc05hTih0KT9OYU46LjUpfWZ1bmN0aW9uIEttKGksdCl7dmFyIGU7cmV0dXJuIGk+dCYmKGU9aSxpPXQsdD1lKSxmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5tYXgoaSxNYXRoLm1pbih0LG4pKX19ZnVuY3Rpb24gdGcoaSx0LGUpe3ZhciBuPWlbMF0scz1pWzFdLHI9dFswXSxvPXRbMV07cmV0dXJuIHM8bj8obj15YyhzLG4pLHI9ZShvLHIpKToobj15YyhuLHMpLHI9ZShyLG8pKSxmdW5jdGlvbihhKXtyZXR1cm4gcihuKGEpKX19ZnVuY3Rpb24gZWcoaSx0LGUpe3ZhciBuPU1hdGgubWluKGkubGVuZ3RoLHQubGVuZ3RoKS0xLHM9bmV3IEFycmF5KG4pLHI9bmV3IEFycmF5KG4pLG89LTE7Zm9yKGlbbl08aVswXSYmKGk9aS5zbGljZSgpLnJldmVyc2UoKSx0PXQuc2xpY2UoKS5yZXZlcnNlKCkpOysrbzxuOylzW29dPXljKGlbb10saVtvKzFdKSxyW29dPWUodFtvXSx0W28rMV0pO3JldHVybiBmdW5jdGlvbihhKXt2YXIgYz1pcChpLGEsMSxuKS0xO3JldHVybiByW2NdKHNbY10oYSkpfX1mdW5jdGlvbiBuZyhpLHQpe3JldHVybiB0LmRvbWFpbihpLmRvbWFpbigpKS5yYW5nZShpLnJhbmdlKCkpLmludGVycG9sYXRlKGkuaW50ZXJwb2xhdGUoKSkuY2xhbXAoaS5jbGFtcCgpKS51bmtub3duKGkudW5rbm93bigpKX1mdW5jdGlvbiBpZygpe3ZhciBpPXp1LHQ9enUsZT1wYyxuLHMscixvPXlpLGEsYyxsO2Z1bmN0aW9uIGgoKXt2YXIgZj1NYXRoLm1pbihpLmxlbmd0aCx0Lmxlbmd0aCk7cmV0dXJuIG8hPT15aSYmKG89S20oaVswXSxpW2YtMV0pKSxhPWY+Mj9lZzp0ZyxjPWw9bnVsbCx1fWZ1bmN0aW9uIHUoZil7cmV0dXJuIGY9PW51bGx8fGlzTmFOKGY9K2YpP3I6KGN8fChjPWEoaS5tYXAobiksdCxlKSkpKG4obyhmKSkpfXJldHVybiB1LmludmVydD1mdW5jdGlvbihmKXtyZXR1cm4gbyhzKChsfHwobD1hKHQsaS5tYXAobiksV3IpKSkoZikpKX0sdS5kb21haW49ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9QXJyYXkuZnJvbShmLFFtKSxoKCkpOmkuc2xpY2UoKX0sdS5yYW5nZT1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1BcnJheS5mcm9tKGYpLGgoKSk6dC5zbGljZSgpfSx1LnJhbmdlUm91bmQ9ZnVuY3Rpb24oZil7cmV0dXJuIHQ9QXJyYXkuZnJvbShmKSxlPVltLGgoKX0sdS5jbGFtcD1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1mPyEwOnlpLGgoKSk6byE9PXlpfSx1LmludGVycG9sYXRlPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWYsaCgpKTplfSx1LnVua25vd249ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9Zix1KTpyfSxmdW5jdGlvbihmLGQpe3JldHVybiBuPWYscz1kLGgoKX19ZnVuY3Rpb24gc2coKXtyZXR1cm4gaWcoKSh5aSx5aSl9ZnVuY3Rpb24gcmcoaSl7cmV0dXJuIE1hdGguYWJzKGk9TWF0aC5yb3VuZChpKSk+PTFlMjE/aS50b0xvY2FsZVN0cmluZygiZW4iKS5yZXBsYWNlKC8sL2csIiIpOmkudG9TdHJpbmcoMTApfWZ1bmN0aW9uIFpyKGksdCl7aWYoKGU9KGk9dD9pLnRvRXhwb25lbnRpYWwodC0xKTppLnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKTwwKXJldHVybiBudWxsO3ZhciBlLG49aS5zbGljZSgwLGUpO3JldHVybltuLmxlbmd0aD4xP25bMF0rbi5zbGljZSgyKTpuLCtpLnNsaWNlKGUrMSldfWZ1bmN0aW9uIG1pKGkpe3JldHVybiBpPVpyKE1hdGguYWJzKGkpKSxpP2lbMV06TmFOfWZ1bmN0aW9uIG9nKGksdCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7Zm9yKHZhciBzPWUubGVuZ3RoLHI9W10sbz0wLGE9aVswXSxjPTA7cz4wJiZhPjAmJihjK2ErMT5uJiYoYT1NYXRoLm1heCgxLG4tYykpLHIucHVzaChlLnN1YnN0cmluZyhzLT1hLHMrYSkpLCEoKGMrPWErMSk+bikpOylhPWlbbz0obysxKSVpLmxlbmd0aF07cmV0dXJuIHIucmV2ZXJzZSgpLmpvaW4odCl9fWZ1bmN0aW9uIGFnKGkpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdC5yZXBsYWNlKC9bMC05XS9nLGZ1bmN0aW9uKGUpe3JldHVybiBpWytlXX0pfX12YXIgY2c9L14oPzooLik/KFs8Pj1eXSkpPyhbK1wtKCBdKT8oWyQjXSk/KDApPyhcZCspPygsKT8oXC5cZCspPyh+KT8oW2EteiVdKT8kL2k7ZnVuY3Rpb24gSnIoaSl7aWYoISh0PWNnLmV4ZWMoaSkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIraSk7dmFyIHQ7cmV0dXJuIG5ldyBtYyh7ZmlsbDp0WzFdLGFsaWduOnRbMl0sc2lnbjp0WzNdLHN5bWJvbDp0WzRdLHplcm86dFs1XSx3aWR0aDp0WzZdLGNvbW1hOnRbN10scHJlY2lzaW9uOnRbOF0mJnRbOF0uc2xpY2UoMSksdHJpbTp0WzldLHR5cGU6dFsxMF19KX1Kci5wcm90b3R5cGU9bWMucHJvdG90eXBlO2Z1bmN0aW9uIG1jKGkpe3RoaXMuZmlsbD1pLmZpbGw9PT12b2lkIDA/IiAiOmkuZmlsbCsiIix0aGlzLmFsaWduPWkuYWxpZ249PT12b2lkIDA/Ij4iOmkuYWxpZ24rIiIsdGhpcy5zaWduPWkuc2lnbj09PXZvaWQgMD8iLSI6aS5zaWduKyIiLHRoaXMuc3ltYm9sPWkuc3ltYm9sPT09dm9pZCAwPyIiOmkuc3ltYm9sKyIiLHRoaXMuemVybz0hIWkuemVybyx0aGlzLndpZHRoPWkud2lkdGg9PT12b2lkIDA/dm9pZCAwOitpLndpZHRoLHRoaXMuY29tbWE9ISFpLmNvbW1hLHRoaXMucHJlY2lzaW9uPWkucHJlY2lzaW9uPT09dm9pZCAwP3ZvaWQgMDoraS5wcmVjaXNpb24sdGhpcy50cmltPSEhaS50cmltLHRoaXMudHlwZT1pLnR5cGU9PT12b2lkIDA/IiI6aS50eXBlKyIifW1jLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGwrdGhpcy5hbGlnbit0aGlzLnNpZ24rdGhpcy5zeW1ib2wrKHRoaXMuemVybz8iMCI6IiIpKyh0aGlzLndpZHRoPT09dm9pZCAwPyIiOk1hdGgubWF4KDEsdGhpcy53aWR0aHwwKSkrKHRoaXMuY29tbWE/IiwiOiIiKSsodGhpcy5wcmVjaXNpb249PT12b2lkIDA/IiI6Ii4iK01hdGgubWF4KDAsdGhpcy5wcmVjaXNpb258MCkpKyh0aGlzLnRyaW0/In4iOiIiKSt0aGlzLnR5cGV9O2Z1bmN0aW9uIGxnKGkpe3Q6Zm9yKHZhciB0PWkubGVuZ3RoLGU9MSxuPS0xLHM7ZTx0OysrZSlzd2l0Y2goaVtlXSl7Y2FzZSIuIjpuPXM9ZTticmVhaztjYXNlIjAiOm49PT0wJiYobj1lKSxzPWU7YnJlYWs7ZGVmYXVsdDppZighK2lbZV0pYnJlYWsgdDtuPjAmJihuPTApO2JyZWFrfXJldHVybiBuPjA/aS5zbGljZSgwLG4pK2kuc2xpY2UocysxKTppfXZhciBUdTtmdW5jdGlvbiBoZyhpLHQpe3ZhciBlPVpyKGksdCk7aWYoIWUpcmV0dXJuIGkrIiI7dmFyIG49ZVswXSxzPWVbMV0scj1zLShUdT1NYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3Iocy8zKSkpKjMpKzEsbz1uLmxlbmd0aDtyZXR1cm4gcj09PW8/bjpyPm8/bituZXcgQXJyYXkoci1vKzEpLmpvaW4oIjAiKTpyPjA/bi5zbGljZSgwLHIpKyIuIituLnNsaWNlKHIpOiIwLiIrbmV3IEFycmF5KDEtcikuam9pbigiMCIpK1pyKGksTWF0aC5tYXgoMCx0K3ItMSkpWzBdfWZ1bmN0aW9uIEV1KGksdCl7dmFyIGU9WnIoaSx0KTtpZighZSlyZXR1cm4gaSsiIjt2YXIgbj1lWzBdLHM9ZVsxXTtyZXR1cm4gczwwPyIwLiIrbmV3IEFycmF5KC1zKS5qb2luKCIwIikrbjpuLmxlbmd0aD5zKzE/bi5zbGljZSgwLHMrMSkrIi4iK24uc2xpY2UocysxKTpuK25ldyBBcnJheShzLW4ubGVuZ3RoKzIpLmpvaW4oIjAiKX12YXIgUHU9eyIlIjooaSx0KT0+KGkqMTAwKS50b0ZpeGVkKHQpLGI6aT0+TWF0aC5yb3VuZChpKS50b1N0cmluZygyKSxjOmk9PmkrIiIsZDpyZyxlOihpLHQpPT5pLnRvRXhwb25lbnRpYWwodCksZjooaSx0KT0+aS50b0ZpeGVkKHQpLGc6KGksdCk9PmkudG9QcmVjaXNpb24odCksbzppPT5NYXRoLnJvdW5kKGkpLnRvU3RyaW5nKDgpLHA6KGksdCk9PkV1KGkqMTAwLHQpLHI6RXUsczpoZyxYOmk9Pk1hdGgucm91bmQoaSkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkseDppPT5NYXRoLnJvdW5kKGkpLnRvU3RyaW5nKDE2KX07ZnVuY3Rpb24gQ3UoaSl7cmV0dXJuIGl9dmFyIEJ1PUFycmF5LnByb3RvdHlwZS5tYXAsRnU9WyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCLCtSIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdO2Z1bmN0aW9uIHVnKGkpe3ZhciB0PWkuZ3JvdXBpbmc9PT12b2lkIDB8fGkudGhvdXNhbmRzPT09dm9pZCAwP0N1Om9nKEJ1LmNhbGwoaS5ncm91cGluZyxOdW1iZXIpLGkudGhvdXNhbmRzKyIiKSxlPWkuY3VycmVuY3k9PT12b2lkIDA/IiI6aS5jdXJyZW5jeVswXSsiIixuPWkuY3VycmVuY3k9PT12b2lkIDA/IiI6aS5jdXJyZW5jeVsxXSsiIixzPWkuZGVjaW1hbD09PXZvaWQgMD8iLiI6aS5kZWNpbWFsKyIiLHI9aS5udW1lcmFscz09PXZvaWQgMD9DdTphZyhCdS5jYWxsKGkubnVtZXJhbHMsU3RyaW5nKSksbz1pLnBlcmNlbnQ9PT12b2lkIDA/IiUiOmkucGVyY2VudCsiIixhPWkubWludXM9PT12b2lkIDA/IuKIkiI6aS5taW51cysiIixjPWkubmFuPT09dm9pZCAwPyJOYU4iOmkubmFuKyIiO2Z1bmN0aW9uIGwodSl7dT1Kcih1KTt2YXIgZj11LmZpbGwsZD11LmFsaWduLHA9dS5zaWduLHk9dS5zeW1ib2wsbT11Lnplcm8sZz11LndpZHRoLGI9dS5jb21tYSx3PXUucHJlY2lzaW9uLHg9dS50cmltLE09dS50eXBlO009PT0ibiI/KGI9ITAsTT0iZyIpOlB1W01dfHwodz09PXZvaWQgMCYmKHc9MTIpLHg9ITAsTT0iZyIpLChtfHxmPT09IjAiJiZkPT09Ij0iKSYmKG09ITAsZj0iMCIsZD0iPSIpO3ZhciBBPXk9PT0iJCI/ZTp5PT09IiMiJiYvW2JveFhdLy50ZXN0KE0pPyIwIitNLnRvTG93ZXJDYXNlKCk6IiIsUz15PT09IiQiP246L1slcF0vLnRlc3QoTSk/bzoiIixfPVB1W01dLEU9L1tkZWZncHJzJV0vLnRlc3QoTSk7dz13PT09dm9pZCAwPzY6L1tncHJzXS8udGVzdChNKT9NYXRoLm1heCgxLE1hdGgubWluKDIxLHcpKTpNYXRoLm1heCgwLE1hdGgubWluKDIwLHcpKTtmdW5jdGlvbiB6KHYpe3ZhciBDPUEsUD1TLEYsQixJO2lmKE09PT0iYyIpUD1fKHYpK1Asdj0iIjtlbHNle3Y9K3Y7dmFyIGs9djwwfHwxL3Y8MDtpZih2PWlzTmFOKHYpP2M6XyhNYXRoLmFicyh2KSx3KSx4JiYodj1sZyh2KSksayYmK3Y9PTAmJnAhPT0iKyImJihrPSExKSxDPShrP3A9PT0iKCI/cDphOnA9PT0iLSJ8fHA9PT0iKCI/IiI6cCkrQyxQPShNPT09InMiP0Z1WzgrVHUvM106IiIpK1ArKGsmJnA9PT0iKCI/IikiOiIiKSxFKXtmb3IoRj0tMSxCPXYubGVuZ3RoOysrRjxCOylpZihJPXYuY2hhckNvZGVBdChGKSw0OD5JfHxJPjU3KXtQPShJPT09NDY/cyt2LnNsaWNlKEYrMSk6di5zbGljZShGKSkrUCx2PXYuc2xpY2UoMCxGKTticmVha319fWImJiFtJiYodj10KHYsMS8wKSk7dmFyIEQ9Qy5sZW5ndGgrdi5sZW5ndGgrUC5sZW5ndGgsVT1EPGc/bmV3IEFycmF5KGctRCsxKS5qb2luKGYpOiIiO3N3aXRjaChiJiZtJiYodj10KFUrdixVLmxlbmd0aD9nLVAubGVuZ3RoOjEvMCksVT0iIiksZCl7Y2FzZSI8Ijp2PUMrditQK1U7YnJlYWs7Y2FzZSI9Ijp2PUMrVSt2K1A7YnJlYWs7Y2FzZSJeIjp2PVUuc2xpY2UoMCxEPVUubGVuZ3RoPj4xKStDK3YrUCtVLnNsaWNlKEQpO2JyZWFrO2RlZmF1bHQ6dj1VK0MrditQO2JyZWFrfXJldHVybiByKHYpfXJldHVybiB6LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHUrIiJ9LHp9ZnVuY3Rpb24gaCh1LGYpe3ZhciBkPWwoKHU9SnIodSksdS50eXBlPSJmIix1KSkscD1NYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IobWkoZikvMykpKSozLHk9TWF0aC5wb3coMTAsLXApLG09RnVbOCtwLzNdO3JldHVybiBmdW5jdGlvbihnKXtyZXR1cm4gZCh5KmcpK219fXJldHVybntmb3JtYXQ6bCxmb3JtYXRQcmVmaXg6aH19dmFyIFlyLEl1LGt1O2ZnKHt0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXX0pO2Z1bmN0aW9uIGZnKGkpe3JldHVybiBZcj11ZyhpKSxJdT1Zci5mb3JtYXQsa3U9WXIuZm9ybWF0UHJlZml4LFlyfWZ1bmN0aW9uIGRnKGkpe3JldHVybiBNYXRoLm1heCgwLC1taShNYXRoLmFicyhpKSkpfWZ1bmN0aW9uIHBnKGksdCl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKG1pKHQpLzMpKSkqMy1taShNYXRoLmFicyhpKSkpfWZ1bmN0aW9uIHlnKGksdCl7cmV0dXJuIGk9TWF0aC5hYnMoaSksdD1NYXRoLmFicyh0KS1pLE1hdGgubWF4KDAsbWkodCktbWkoaSkpKzF9ZnVuY3Rpb24gbWcoaSx0LGUsbil7dmFyIHM9Y3AoaSx0LGUpLHI7c3dpdGNoKG49SnIobj09bnVsbD8iLGYiOm4pLG4udHlwZSl7Y2FzZSJzIjp7dmFyIG89TWF0aC5tYXgoTWF0aC5hYnMoaSksTWF0aC5hYnModCkpO3JldHVybiBuLnByZWNpc2lvbj09bnVsbCYmIWlzTmFOKHI9cGcocyxvKSkmJihuLnByZWNpc2lvbj1yKSxrdShuLG8pfWNhc2UiIjpjYXNlImUiOmNhc2UiZyI6Y2FzZSJwIjpjYXNlInIiOntuLnByZWNpc2lvbj09bnVsbCYmIWlzTmFOKHI9eWcocyxNYXRoLm1heChNYXRoLmFicyhpKSxNYXRoLmFicyh0KSkpKSYmKG4ucHJlY2lzaW9uPXItKG4udHlwZT09PSJlIikpO2JyZWFrfWNhc2UiZiI6Y2FzZSIlIjp7bi5wcmVjaXNpb249PW51bGwmJiFpc05hTihyPWRnKHMpKSYmKG4ucHJlY2lzaW9uPXItKG4udHlwZT09PSIlIikqMik7YnJlYWt9fXJldHVybiBJdShuKX1mdW5jdGlvbiBnZyhpKXt2YXIgdD1pLmRvbWFpbjtyZXR1cm4gaS50aWNrcz1mdW5jdGlvbihlKXt2YXIgbj10KCk7cmV0dXJuIGFwKG5bMF0sbltuLmxlbmd0aC0xXSxlPT1udWxsPzEwOmUpfSxpLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oZSxuKXt2YXIgcz10KCk7cmV0dXJuIG1nKHNbMF0sc1tzLmxlbmd0aC0xXSxlPT1udWxsPzEwOmUsbil9LGkubmljZT1mdW5jdGlvbihlKXtlPT1udWxsJiYoZT0xMCk7dmFyIG49dCgpLHM9MCxyPW4ubGVuZ3RoLTEsbz1uW3NdLGE9bltyXSxjLGwsaD0xMDtmb3IoYTxvJiYobD1vLG89YSxhPWwsbD1zLHM9cixyPWwpO2gtLSA+MDspe2lmKGw9dmEobyxhLGUpLGw9PT1jKXJldHVybiBuW3NdPW8sbltyXT1hLHQobik7aWYobD4wKW89TWF0aC5mbG9vcihvL2wpKmwsYT1NYXRoLmNlaWwoYS9sKSpsO2Vsc2UgaWYobDwwKW89TWF0aC5jZWlsKG8qbCkvbCxhPU1hdGguZmxvb3IoYSpsKS9sO2Vsc2UgYnJlYWs7Yz1sfXJldHVybiBpfSxpfWZ1bmN0aW9uIGdjKCl7dmFyIGk9c2coKTtyZXR1cm4gaS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIG5nKGksZ2MoKSl9LHptLmFwcGx5KGksYXJndW1lbnRzKSxnZyhpKX1mdW5jdGlvbiB4ZyhpLHQpe3JldHVybiBpLm1hcChlPT57Y29uc3Qgbj1bXTtsZXQgcztyZXR1cm4gZS5mb3JFYWNoKHI9PntpZihzKXtjb25zdCBvPWFpKHIscykqMTgwL01hdGguUEk7aWYobz50KXtjb25zdCBhPUhwKHMsciksYz0xL01hdGguY2VpbChvL3QpO2xldCBsPWM7Zm9yKDtsPDE7KW4ucHVzaChhKGwpKSxsKz1jfX1uLnB1c2gocz1yKX0pLG59KX1mdW5jdGlvbiB3ZyhpLHttaW5Mbmc6dCxtYXhMbmc6ZSxtaW5MYXQ6bixtYXhMYXQ6c309e30pe2NvbnN0IHI9TWF0aC5yb3VuZChnaSgzNjAvaSwyKS9NYXRoLlBJKSxvPSgxK01hdGguc3FydCg1KSkvMixhPWQ9PmQvbyozNjAlMzYwLTE4MCxjPWQ9Pk1hdGguYWNvcygyKmQvci0xKS9NYXRoLlBJKjE4MC05MCxsPWQ9PnIqKE1hdGguY29zKChkKzkwKSpNYXRoLlBJLzE4MCkrMSkvMixoPVtzIT09dm9pZCAwP01hdGguY2VpbChsKHMpKTowLG4hPT12b2lkIDA/TWF0aC5mbG9vcihsKG4pKTpyLTFdLHU9dD09PXZvaWQgMCYmZT09PXZvaWQgMD8oKT0+ITA6dD09PXZvaWQgMD9kPT5kPD1lOmU9PT12b2lkIDA/ZD0+ZD49dDplPj10P2Q9PmQ+PXQmJmQ8PWU6ZD0+ZD49dHx8ZDw9ZSxmPVtdO2ZvcihsZXQgZD1oWzBdO2Q8PWhbMV07ZCsrKXtjb25zdCBwPWEoZCk7dShwKSYmZi5wdXNoKFtwLGMoZCldKX1yZXR1cm4gZn1mdW5jdGlvbiB4YyhpLHQsZT0hMSl7cmV0dXJuIGU/cXAodCxpKTp0bShpLHQpfWZ1bmN0aW9uIGJnKGksdCl7Y29uc3QgZT17dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6aX0sW1tuLHNdLFtyLG9dXT1waChlKTtpZihNYXRoLm1pbihNYXRoLmFicyhyLW4pLE1hdGguYWJzKG8tcykpPHQpcmV0dXJuW107Y29uc3QgYT1uPnJ8fG8+PTg5fHxzPD0tODk7cmV0dXJuIHdnKHQse21pbkxuZzpuLG1heExuZzpyLG1pbkxhdDpzLG1heExhdDpvfSkuZmlsdGVyKGM9PnhjKGMsZSxhKSl9ZnVuY3Rpb24gTWcoaSx7cmVzb2x1dGlvbjp0PTEvMCxiYm94OmUscHJvamVjdGlvbjpufT17fSl7Y29uc3Qgcz14ZyhpLHQpLHI9cWkocyksbz1iZyhpLHQpLGE9Wy4uLnIsLi4ub10sYz17dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6aX0sW1tsLGhdLFt1LGZdXT1waChjKSxkPWw+dXx8Zj49ODl8fGg8PS04OTtsZXQgcD1bXTtpZihkKXtjb25zdCBNPXZtKGEpLnRyaWFuZ2xlcygpLEE9bmV3IE1hcChhLm1hcCgoW1MsX10sRSk9PltgJHtTfS0ke199YCxFXSkpO00uZmVhdHVyZXMuZm9yRWFjaChTPT57Y29uc3QgXz1TLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLnNsaWNlKDAsMykucmV2ZXJzZSgpLEU9W107aWYoXy5mb3JFYWNoKChbeix2XSk9Pntjb25zdCBDPWAke3p9LSR7dn1gO0EuaGFzKEMpJiZFLnB1c2goQS5nZXQoQykpfSksRS5sZW5ndGg9PT0zKXtpZihFLnNvbWUoej0+ejxyLmxlbmd0aCkpe2NvbnN0IHo9Uy5wcm9wZXJ0aWVzLmNpcmN1bWNlbnRlcjtpZigheGMoeixjLGQpKXJldHVybn1wLnB1c2goLi4uRSl9fSl9ZWxzZSBpZihvLmxlbmd0aCl7Y29uc3QgTT1ucy5mcm9tKGEpO2ZvcihsZXQgQT0wLFM9TS50cmlhbmdsZXMubGVuZ3RoO0E8UztBKz0zKXtjb25zdCBfPVsyLDEsMF0ubWFwKHo9Pk0udHJpYW5nbGVzW0Erel0pLEU9Xy5tYXAoej0+YVt6XSk7aWYoXy5zb21lKHo9Pno8ci5sZW5ndGgpKXtjb25zdCB6PVswLDFdLm1hcCh2PT5scChFLEM9PkNbdl0pKTtpZigheGMoeixjLGQpKWNvbnRpbnVlfXAucHVzaCguLi5fKX19ZWxzZXtjb25zdHt2ZXJ0aWNlczpNLGhvbGVzOkE9W119PXR1KHMpO3A9Z3koTSxBLDIpfWxldCB5PWU/W2VbMF0sZVsyXV06b3IoYSxNPT5NWzBdKSxtPWU/W2VbMV0sZVszXV06b3IoYSxNPT5NWzFdKTtpZihuKXtjb25zdFtNLEFdPW4oW3lbMF0sbVswXV0pLFtTLF9dPW4oW3lbMV0sbVsxXV0pO3k9W00sU10sbT1bLUEsLV9dfWNvbnN0IGc9Z2MoeSxbMCwxXSksYj1nYyhtLFswLDFdKSx3PWEubWFwKChbTSxBXSk9PntpZihuKXtjb25zdFtTLF9dPW4oW00sQV0pO3JldHVybltnKFMpLGIoLV8pXX1lbHNlIHJldHVybltnKE0pLGIoQSldfSk7cmV0dXJue2NvbnRvdXI6cyx0cmlhbmdsZXM6e3BvaW50czphLGluZGljZXM6cCx1dnM6d319fWNvbnN0IE51PW5ldyBnZSgpLnNldEF0dHJpYnV0ZT8ic2V0QXR0cmlidXRlIjoiYWRkQXR0cmlidXRlIjtmdW5jdGlvbiBqcihpLHQsZSxuKXtjb25zdCBzPWkubWFwKHI9PnIubWFwKChbbyxhXSk9PntpZihuKXtjb25zdFtjLGxdPW4oW28sYV0pO3JldHVybltjLC1sLHRdfXJldHVybiBlP2h5KG8sYSx0KTpbbyxhLHRdfSkpO3JldHVybiB0dShzKX1mdW5jdGlvbiBBZyhpLHQsZSxuLHMpe2NvbnN0e3ZlcnRpY2VzOnIsaG9sZXM6b309anIoaSx0LG4scykse3ZlcnRpY2VzOmF9PWpyKGksZSxuLHMpLGM9cWkoW2Escl0pLGw9TWF0aC5yb3VuZChhLmxlbmd0aC8zKSxoPW5ldyBTZXQobyk7bGV0IHU9MDtjb25zdCBmPVtdO2ZvcihsZXQgcD0wO3A8bDtwKyspe2xldCB5PXArMTtpZih5PT09bCl5PXU7ZWxzZSBpZihoLmhhcyh5KSl7Y29uc3QgbT15O3k9dSx1PW19Zi5wdXNoKHAscCtsLHkrbCksZi5wdXNoKHkrbCx5LHApfWNvbnN0IGQ9W107Zm9yKGxldCBwPTE7cD49MDtwLS0pZm9yKGxldCB5PTA7eTxsO3krPTEpZC5wdXNoKHkvKGwtMSkscCk7cmV0dXJue2luZGljZXM6Zix2ZXJ0aWNlczpjLHV2czpkLHRvcFZlcnRzOmF9fWZ1bmN0aW9uIFJ1KGksdCxlLG4scyxyKXtyZXR1cm57aW5kaWNlczpuP2kuaW5kaWNlczppLmluZGljZXMuc2xpY2UoKS5yZXZlcnNlKCksdmVydGljZXM6anIoW2kucG9pbnRzXSx0LHMscikudmVydGljZXMsdXZzOmV9fWNvbnN0IEx1PSh7cG9seWdvbkdlb0pzb246aSxzdGFydEhlaWdodDp0LGVuZEhlaWdodDplLGN1cnZhdHVyZVJlc29sdXRpb246bj0xLGNhcnRlc2lhbjpzPSEwLGhhc1NpZGU6cj0hMCxoYXNCb3R0b206bz0hMSxoYXNUb3A6YT0hMSxwcm9qZWN0aW9uOmMsYmJveDpsfSk9PntpLmZvckVhY2goZz0+e095KGcpfHxnLnJldmVyc2UoKX0pO2NvbnN0e2NvbnRvdXI6aCx0cmlhbmdsZXM6dX09TWcoaSx7cmVzb2x1dGlvbjpuLGJib3g6bCxwcm9qZWN0aW9uOmN9KTtsZXQgZj17fSxkO3ImJihmPUFnKGgsdCE9bnVsbD90OmUsZSE9bnVsbD9lOnQscyxjKSxkPWYudG9wVmVydHMpO2xldCBwPVtdOyhvfHxhKSYmKHA9cWkodS51dnMpKTtsZXQgeT17fTtvJiYoeT1SdSh1LHQscCwhMSxzLGMpKTtsZXQgbT17fTtyZXR1cm4gYSYmKG09UnUodSxlLHAsITAscyxjKSkse2NvbnRvdXI6aCx0cmlhbmdsZXM6dSxzaWRlVG9yc286Zixib3R0b21DYXA6eSx0b3BDYXA6bSx0b3BWZXJ0czpkfX07Y2xhc3MgU2cgZXh0ZW5kcyBnZXtjb25zdHJ1Y3Rvcih0LGU9e30pe3N1cGVyKCksdGhpcy50eXBlPSJQb2x5Z29uQnVmZmVyR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz1GdCh7cG9seWdvbkdlb0pzb246dCxzdGFydEhlaWdodDowLGVuZEhlaWdodDoxLGhhc1RvcDohMCx0b3BGaXJzdDohMSxoYXNCb3R0b206ITAsaGFzU2lkZTohMCxjdXJ2YXR1cmVSZXNvbHV0aW9uOjEsY2FydGVzaWFuOiEwLHVzZXJEYXRhUnNvT2Zmc2V0OjB9LGUpO2NvbnN0e2VuZEhlaWdodDpuLGhhc1RvcDpzLHRvcEZpcnN0OnIsaGFzQm90dG9tOm8saGFzU2lkZTphLGNhcnRlc2lhbjpjLHVzZXJEYXRhUnNvT2Zmc2V0OmwscHJvamVjdGlvbjpofT10aGlzLnBhcmFtZXRlcnMse2NvbnRvdXI6dSxzaWRlVG9yc286Zix0b3BWZXJ0czpkLGJvdHRvbUNhcDpwLHRvcENhcDp5fT1MdShGdCh7fSx0aGlzLnBhcmFtZXRlcnMpKTtsZXQgbT1bXSxnPVtdLGI9W10sdz0wO2NvbnN0IHg9TT0+e2NvbnN0IEE9TWF0aC5yb3VuZChtLmxlbmd0aC8zKSxTPWIubGVuZ3RoO209bS5jb25jYXQoTS52ZXJ0aWNlcyksZz1nLmNvbmNhdChNLnV2cyksYj1iLmNvbmNhdChBP00uaW5kaWNlcy5tYXAoXz0+XytBKTpNLmluZGljZXMpLHRoaXMuYWRkR3JvdXAoUyxiLmxlbmd0aC1TLHcrKyl9O3MmJnImJngoeSksYSYmKHgoZiksdGhpcy51c2VyRGF0YS50b3BWZXJ0cz1sP2pyKHUsbitsLGMsaCkudmVydGljZXM6ZCksbyYmeChwKSxzJiYhciYmeCh5KSx0aGlzLnNldEluZGV4KGIpLHRoaXNbTnVdKCJwb3NpdGlvbiIsbmV3IEJlKG0sMykpLHRoaXNbTnVdKCJ1diIsbmV3IEJlKGcsMikpLHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKX19dmFyIF9nPWk9Pntjb25zdCBhPWkse2Nvb3JkaW5hdGU6dCxzdGFydEhlaWdodDplLGhlaWdodDpufT1hLHM9anUoYSxbImNvb3JkaW5hdGUiLCJzdGFydEhlaWdodCIsImhlaWdodCJdKTtsZXQgcj1lfHwwO3JldHVybiB0eXBlb2YgZSE9InVuZGVmaW5lZCImJnR5cGVvZiBuIT0idW5kZWZpbmVkIiYmKHI9ZStuKSxuZXcgU2coW3RdLFdlKEZ0KHt9LHMpLHtzdGFydEhlaWdodDplLGVuZEhlaWdodDpyfSkpfTtjb25zdCB2Zz0oe2Nvb3JkaW5hdGVzQXJyOmksc3RhcnQ6dCxkZXB0aDplLHVzZUdyb3VwczpuLGhhc1RvcDpzLHRvcEZpcnN0OnIsaGFzQm90dG9tOm8saGFzU2lkZTphLGNhcnRlc2lhbjpjLHByb2plY3Rpb246bCxjdXJ2YXR1cmVSZXNvbHV0aW9uOmgsYmJveDp1fSk9Pntjb25zdCBmPWwmJllpKGwpO2YmJihjPSExKSx0fHwodD1bMF0pO2NvbnN0IGQ9aS5tYXAoKHAseSk9Pnt2YXIgbSxnO3JldHVybiBfZyh7Y29vcmRpbmF0ZTpwLHByb2plY3Rpb246ZixzdGFydEhlaWdodDoobT10W3ldKSE9bnVsbD9tOnRbMF0saGVpZ2h0OihnPWVbeV0pIT1udWxsP2c6ZVswXSxoYXNUb3A6cyE9bnVsbD9zOiEwLHRvcEZpcnN0OnIhPW51bGw/cjohMSxoYXNCb3R0b206byE9bnVsbD9vOiEwLGhhc1NpZGU6YSE9bnVsbD9hOiEwLGNhcnRlc2lhbjpjIT1udWxsP2M6ITAsY3VydmF0dXJlUmVzb2x1dGlvbjpoIT1udWxsP2g6MSxiYm94OnV9KX0pO3JldHVybiBqaShkLG4pfSx6Zz0oe2Nvb3JkaW5hdGVzQXJyOmksbGluZVdpZHRoOnQsc3RhcnQ6ZSx1c2VHcm91cHM6bn0pPT57Y29uc3Qgcj1pLm1hcCgobyxhKT0+e3ZhciBjO3JldHVybiBMdSh7cG9seWdvbkdlb0pzb246W29dLHN0YXJ0SGVpZ2h0OihjPWVbYV0pIT1udWxsP2M6ZVswXX0pLnRvcFZlcnRzfSkubWFwKChvLGEpPT57dmFyIGw7Y29uc3QgYz0obD10W2FdKSE9bnVsbD9sOnRbMF07cmV0dXJuIEpoKHtub2RlczpvLHNldFBvaW50V2lkdGg6KCk9PmN9KX0pO3JldHVybiBqaShyLG4pfTt2YXIgVGc9KGksdCxlKT0+bmV3IFByb21pc2UoKG4scyk9Pnt2YXIgcj1jPT57dHJ5e2EoZS5uZXh0KGMpKX1jYXRjaChsKXtzKGwpfX0sbz1jPT57dHJ5e2EoZS50aHJvdyhjKSl9Y2F0Y2gobCl7cyhsKX19LGE9Yz0+Yy5kb25lP24oYy52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKGMudmFsdWUpLnRoZW4ocixvKTthKChlPWUuYXBwbHkoaSx0KSkubmV4dCgpKX0pO2Z1bmN0aW9uIEVnKGkpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpKS5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6aVtlXSxlbnVtZXJhYmxlOiEwfSl9LHt9KX0oaT0+e2NvbnN0IHQ9e3J1bihlLG4pe2NvbnN0IHM9bmV3IEZ1bmN0aW9uKCJyZXR1cm4gKCIrZSsiKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyIpO3JldHVybiBzLmFwcGx5KHMsbil9LG1ldGhvZHMoKXtyZXR1cm4gT2JqZWN0LmtleXModCl9fTthZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixlPT5UZyh2b2lkIDAsW2VdLGZ1bmN0aW9uKih7ZGF0YTpufSl7dHJ5e2NvbnN0IHM9dFtuLm1ldGhvZF07aWYocyl7Y29uc3Qgcj15aWVsZCBzLmFwcGx5KHMsbi5wYXJhbXMpO3IudHJhbnNmZXImJnIubWVzc2FnZT9wb3N0TWVzc2FnZSh7aWQ6bi5pZCxyZXN1bHQ6ci5tZXNzYWdlLGVycm9yOm51bGx9LHIudHJhbnNmZXIpOnBvc3RNZXNzYWdlKHtpZDpuLmlkLHJlc3VsdDpyLGVycm9yOm51bGx9KX1lbHNlIHRocm93IG5ldyBFcnJvcignVW5rbm93biBtZXRob2QgIicrbi5tZXRob2QrJyInKX1jYXRjaChzKXtwb3N0TWVzc2FnZSh7aWQ6bi5pZCxyZXN1bHQ6bnVsbCxlcnJvcjpFZyhzKX0pfX0pKSxPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGU9Pnt0W2VdPWlbZV19KSxwb3N0TWVzc2FnZSgicmVhZHkiKX0pKHtleHRydWRlUG9seWdvbjpmeSxsaW5lOnB5LGxpbmUyOm15LGNvbmljUG9seWdvbjp2Zyxjb25pY0xpbmU6emd9KX0pKCk7Cg==",n=l=>Uint8Array.from(atob(l),b=>b.charCodeAt(0)),z=typeof window!="undefined"&&window.Blob&&new Blob([n(H)],{type:"text/javascript;charset=utf-8"});function i(l){let b;try{if(b=z&&(window.URL||window.webkitURL).createObjectURL(z),!b)throw"";const d=new Worker(b,{name:l==null?void 0:l.name});return d.addEventListener("error",()=>{(window.URL||window.webkitURL).revokeObjectURL(b)}),d}catch(d){return new Worker("data:text/javascript;base64,"+H,{name:l==null?void 0:l.name})}finally{b&&(window.URL||window.webkitURL).revokeObjectURL(b)}}const o=l=>{const b=new K.BufferGeometry;return Object.keys(l).forEach(d=>{d==="groups"?l[d].forEach(G=>{b.addGroup(G.start,G.count,G.materialIndex)}):d==="index"?b.setIndex(new K.BufferAttribute(l[d].array,l[d].itemSize)):b.setAttribute(d,new K.BufferAttribute(l[d].array,l[d].itemSize))}),b};class k{constructor(b){this.pluginName="worker",this.bufferGeometryLoader=new K.BufferGeometryLoader,this.cacheObj={},this._dispose=!1,this.options=W({dbName:"base",cacheVersion:"1"},b),this.store=a.createStore(this.options.dbName,"attributes")}install(b){this.pencil=b;const d=new M.WorkerPool(i,{maxWorkers:this.options.maxWorkers});this.pool=d}geoGeometry(b,d){return V(this,null,function*(){const{mesaage:G,cacheKey:X,userData:p,cacheVersion:L,cb:m}=W(W({},this.options),d),Z=this.pool,{err:c,res:u}=yield Z.exec(b,[W({},G)],void 0,!0);if(c)throw c;const h=o(u);if(Object.assign(h.userData,W({},p)),m&&(yield m(h)),X){const{cacheObj:s}=this;s[X]||(s[X]={[L]:[]}),s[X][L].push(W({attributes:u},p))}return h})}getCachedGeometry(b){return V(this,null,function*(){const{cacheKey:d,cacheVersion:G}=b;if(d){const X=yield a.get(d,this.store),p=G||this.options.cacheVersion;return X!=null&&X[p]?X[p].map(L=>{const u=L,{attributes:m}=u,Z=R(u,["attributes"]),c=o(m);return Object.assign(c.userData,W({},Z)),c}):[]}else return[]})}saveCache(){a.setMany(Object.entries(this.cacheObj),this.store)}dispose(){this.cacheObj={},this.pool.dispose(),this._dispose=!0}}exports.Wk=k;
|
|
1
|
+
"use strict";var H=Object.defineProperty;var u=Object.getOwnPropertySymbols;var x=Object.prototype.hasOwnProperty,S=Object.prototype.propertyIsEnumerable;var a=(l,b,d)=>b in l?H(l,b,{enumerable:!0,configurable:!0,writable:!0,value:d}):l[b]=d,W=(l,b)=>{for(var d in b||(b={}))x.call(b,d)&&a(l,d,b[d]);if(u)for(var d of u(b))S.call(b,d)&&a(l,d,b[d]);return l};var R=(l,b)=>{var d={};for(var G in l)x.call(l,G)&&b.indexOf(G)<0&&(d[G]=l[G]);if(l!=null&&u)for(var G of u(l))b.indexOf(G)<0&&S.call(l,G)&&(d[G]=l[G]);return d};var V=(l,b,d)=>new Promise((G,X)=>{var p=Z=>{try{m(d.next(Z))}catch(c){X(c)}},L=Z=>{try{m(d.throw(Z))}catch(c){X(c)}},m=Z=>Z.done?G(Z.value):Promise.resolve(Z.value).then(p,L);m((d=d.apply(l,b)).next())});Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Y=require("idb-keyval"),h=require("three"),M=require("esus-lite"),C="dmFyIE5nPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxSZz1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgTGc9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIHRvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIFl1PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksanU9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgd2M9KEosaik9PihqPVN5bWJvbFtKXSk/ajpTeW1ib2wuZm9yKCJTeW1ib2wuIitKKSxPZz1KPT57dGhyb3cgVHlwZUVycm9yKEopfSxnaT1NYXRoLnBvdyxKdT0oSixqLHl0KT0+aiBpbiBKP05nKEosaix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6eXR9KTpKW2pdPXl0LEZ0PShKLGopPT57Zm9yKHZhciB5dCBpbiBqfHwoaj17fSkpWXUuY2FsbChqLHl0KSYmSnUoSix5dCxqW3l0XSk7aWYodG8pZm9yKHZhciB5dCBvZiB0byhqKSlqdS5jYWxsKGoseXQpJiZKdShKLHl0LGpbeXRdKTtyZXR1cm4gSn0sV2U9KEosaik9PlJnKEosTGcoaikpO3ZhciBRdT0oSixqKT0+e3ZhciB5dD17fTtmb3IodmFyIE10IGluIEopWXUuY2FsbChKLE10KSYmai5pbmRleE9mKE10KTwwJiYoeXRbTXRdPUpbTXRdKTtpZihKIT1udWxsJiZ0bylmb3IodmFyIE10IG9mIHRvKEopKWouaW5kZXhPZihNdCk8MCYmanUuY2FsbChKLE10KSYmKHl0W010XT1KW010XSk7cmV0dXJuIHl0fTt2YXIgRGc9ZnVuY3Rpb24oSixqKXt0aGlzWzBdPUosdGhpc1sxXT1qfTt2YXIgS3U9Sj0+e3ZhciBqPUpbd2MoImFzeW5jSXRlcmF0b3IiKV0seXQ9ITEsTXQsY249e307cmV0dXJuIGo9PW51bGw/KGo9Slt3YygiaXRlcmF0b3IiKV0oKSxNdD1TZT0+Y25bU2VdPUJuPT5qW1NlXShCbikpOihqPWouY2FsbChKKSxNdD1TZT0+Y25bU2VdPUJuPT57aWYoeXQpe2lmKHl0PSExLFNlPT09InRocm93Iil0aHJvdyBCbjtyZXR1cm4gQm59cmV0dXJuIHl0PSEwLHtkb25lOiExLHZhbHVlOm5ldyBEZyhuZXcgUHJvbWlzZShiYz0+e3ZhciBlbz1qW1NlXShCbik7ZW8gaW5zdGFuY2VvZiBPYmplY3R8fE9nKCJPYmplY3QgZXhwZWN0ZWQiKSxiYyhlbyl9KSwxKX19KSxjblt3YygiaXRlcmF0b3IiKV09KCk9PmNuLE10KCJuZXh0IiksInRocm93ImluIGo/TXQoInRocm93Iik6Y24udGhyb3c9U2U9Pnt0aHJvdyBTZX0sInJldHVybiJpbiBqJiZNdCgicmV0dXJuIiksY259OyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjsvKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IDIwMTAtMjAyNSBUaHJlZS5qcyBBdXRob3JzCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICovY29uc3QgSj0iMTgwIixNYz0iIixvZT0ic3JnYiIsQWM9InNyZ2ItbGluZWFyIixTYz0ibGluZWFyIixubz0ic3JnYiI7Y2xhc3MgbHN7YWRkRXZlbnRMaXN0ZW5lcih0LGUpe3RoaXMuX2xpc3RlbmVycz09PXZvaWQgMCYmKHRoaXMuX2xpc3RlbmVycz17fSk7Y29uc3Qgbj10aGlzLl9saXN0ZW5lcnM7blt0XT09PXZvaWQgMCYmKG5bdF09W10pLG5bdF0uaW5kZXhPZihlKT09PS0xJiZuW3RdLnB1c2goZSl9aGFzRXZlbnRMaXN0ZW5lcih0LGUpe2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO3JldHVybiBuPT09dm9pZCAwPyExOm5bdF0hPT12b2lkIDAmJm5bdF0uaW5kZXhPZihlKSE9PS0xfXJlbW92ZUV2ZW50TGlzdGVuZXIodCxlKXtjb25zdCBuPXRoaXMuX2xpc3RlbmVycztpZihuPT09dm9pZCAwKXJldHVybjtjb25zdCBzPW5bdF07aWYocyE9PXZvaWQgMCl7Y29uc3Qgcj1zLmluZGV4T2YoZSk7ciE9PS0xJiZzLnNwbGljZShyLDEpfX1kaXNwYXRjaEV2ZW50KHQpe2NvbnN0IGU9dGhpcy5fbGlzdGVuZXJzO2lmKGU9PT12b2lkIDApcmV0dXJuO2NvbnN0IG49ZVt0LnR5cGVdO2lmKG4hPT12b2lkIDApe3QudGFyZ2V0PXRoaXM7Y29uc3Qgcz1uLnNsaWNlKDApO2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKylzW3JdLmNhbGwodGhpcyx0KTt0LnRhcmdldD1udWxsfX19Y29uc3QgQXQ9WyIwMCIsIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjBhIiwiMGIiLCIwYyIsIjBkIiwiMGUiLCIwZiIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMWEiLCIxYiIsIjFjIiwiMWQiLCIxZSIsIjFmIiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIyYSIsIjJiIiwiMmMiLCIyZCIsIjJlIiwiMmYiLCIzMCIsIjMxIiwiMzIiLCIzMyIsIjM0IiwiMzUiLCIzNiIsIjM3IiwiMzgiLCIzOSIsIjNhIiwiM2IiLCIzYyIsIjNkIiwiM2UiLCIzZiIsIjQwIiwiNDEiLCI0MiIsIjQzIiwiNDQiLCI0NSIsIjQ2IiwiNDciLCI0OCIsIjQ5IiwiNGEiLCI0YiIsIjRjIiwiNGQiLCI0ZSIsIjRmIiwiNTAiLCI1MSIsIjUyIiwiNTMiLCI1NCIsIjU1IiwiNTYiLCI1NyIsIjU4IiwiNTkiLCI1YSIsIjViIiwiNWMiLCI1ZCIsIjVlIiwiNWYiLCI2MCIsIjYxIiwiNjIiLCI2MyIsIjY0IiwiNjUiLCI2NiIsIjY3IiwiNjgiLCI2OSIsIjZhIiwiNmIiLCI2YyIsIjZkIiwiNmUiLCI2ZiIsIjcwIiwiNzEiLCI3MiIsIjczIiwiNzQiLCI3NSIsIjc2IiwiNzciLCI3OCIsIjc5IiwiN2EiLCI3YiIsIjdjIiwiN2QiLCI3ZSIsIjdmIiwiODAiLCI4MSIsIjgyIiwiODMiLCI4NCIsIjg1IiwiODYiLCI4NyIsIjg4IiwiODkiLCI4YSIsIjhiIiwiOGMiLCI4ZCIsIjhlIiwiOGYiLCI5MCIsIjkxIiwiOTIiLCI5MyIsIjk0IiwiOTUiLCI5NiIsIjk3IiwiOTgiLCI5OSIsIjlhIiwiOWIiLCI5YyIsIjlkIiwiOWUiLCI5ZiIsImEwIiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsImE2IiwiYTciLCJhOCIsImE5IiwiYWEiLCJhYiIsImFjIiwiYWQiLCJhZSIsImFmIiwiYjAiLCJiMSIsImIyIiwiYjMiLCJiNCIsImI1IiwiYjYiLCJiNyIsImI4IiwiYjkiLCJiYSIsImJiIiwiYmMiLCJiZCIsImJlIiwiYmYiLCJjMCIsImMxIiwiYzIiLCJjMyIsImM0IiwiYzUiLCJjNiIsImM3IiwiYzgiLCJjOSIsImNhIiwiY2IiLCJjYyIsImNkIiwiY2UiLCJjZiIsImQwIiwiZDEiLCJkMiIsImQzIiwiZDQiLCJkNSIsImQ2IiwiZDciLCJkOCIsImQ5IiwiZGEiLCJkYiIsImRjIiwiZGQiLCJkZSIsImRmIiwiZTAiLCJlMSIsImUyIiwiZTMiLCJlNCIsImU1IiwiZTYiLCJlNyIsImU4IiwiZTkiLCJlYSIsImViIiwiZWMiLCJlZCIsImVlIiwiZWYiLCJmMCIsImYxIiwiZjIiLCJmMyIsImY0IiwiZjUiLCJmNiIsImY3IiwiZjgiLCJmOSIsImZhIiwiZmIiLCJmYyIsImZkIiwiZmUiLCJmZiJdO2Z1bmN0aW9uIEZuKCl7Y29uc3QgaT1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MCx0PU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwLGU9TWF0aC5yYW5kb20oKSo0Mjk0OTY3Mjk1fDAsbj1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MDtyZXR1cm4oQXRbaSYyNTVdK0F0W2k+PjgmMjU1XStBdFtpPj4xNiYyNTVdK0F0W2k+PjI0JjI1NV0rIi0iK0F0W3QmMjU1XStBdFt0Pj44JjI1NV0rIi0iK0F0W3Q+PjE2JjE1fDY0XStBdFt0Pj4yNCYyNTVdKyItIitBdFtlJjYzfDEyOF0rQXRbZT4+OCYyNTVdKyItIitBdFtlPj4xNiYyNTVdK0F0W2U+PjI0JjI1NV0rQXRbbiYyNTVdK0F0W24+PjgmMjU1XStBdFtuPj4xNiYyNTVdK0F0W24+PjI0JjI1NV0pLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gRyhpLHQsZSl7cmV0dXJuIE1hdGgubWF4KHQsTWF0aC5taW4oZSxpKSl9ZnVuY3Rpb24gdGYoaSx0KXtyZXR1cm4oaSV0K3QpJXR9ZnVuY3Rpb24gaW8oaSx0LGUpe3JldHVybigxLWUpKmkrZSp0fWZ1bmN0aW9uIHhpKGksdCl7c3dpdGNoKHQuY29uc3RydWN0b3Ipe2Nhc2UgRmxvYXQzMkFycmF5OnJldHVybiBpO2Nhc2UgVWludDMyQXJyYXk6cmV0dXJuIGkvNDI5NDk2NzI5NTtjYXNlIFVpbnQxNkFycmF5OnJldHVybiBpLzY1NTM1O2Nhc2UgVWludDhBcnJheTpyZXR1cm4gaS8yNTU7Y2FzZSBJbnQzMkFycmF5OnJldHVybiBNYXRoLm1heChpLzIxNDc0ODM2NDcsLTEpO2Nhc2UgSW50MTZBcnJheTpyZXR1cm4gTWF0aC5tYXgoaS8zMjc2NywtMSk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgubWF4KGkvMTI3LC0xKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb21wb25lbnQgdHlwZS4iKX19ZnVuY3Rpb24gSXQoaSx0KXtzd2l0Y2godC5jb25zdHJ1Y3Rvcil7Y2FzZSBGbG9hdDMyQXJyYXk6cmV0dXJuIGk7Y2FzZSBVaW50MzJBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChpKjQyOTQ5NjcyOTUpO2Nhc2UgVWludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSo2NTUzNSk7Y2FzZSBVaW50OEFycmF5OnJldHVybiBNYXRoLnJvdW5kKGkqMjU1KTtjYXNlIEludDMyQXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSoyMTQ3NDgzNjQ3KTtjYXNlIEludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSozMjc2Nyk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSoxMjcpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCB0eXBlLiIpfX1jbGFzcyBOe2NvbnN0cnVjdG9yKHQ9MCxlPTApe04ucHJvdG90eXBlLmlzVmVjdG9yMj0hMCx0aGlzLng9dCx0aGlzLnk9ZX1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy54fXNldCB3aWR0aCh0KXt0aGlzLng9dH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMueX1zZXQgaGVpZ2h0KHQpe3RoaXMueT10fXNldCh0LGUpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnkpfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpc31kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHM9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PXNbMF0qZStzWzNdKm4rc1s2XSx0aGlzLnk9c1sxXSplK3NbNF0qbitzWzddLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PUcodGhpcy54LHQueCxlLngpLHRoaXMueT1HKHRoaXMueSx0LnksZS55KSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1HKHRoaXMueCx0LGUpLHRoaXMueT1HKHRoaXMueSx0LGUpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKEcobix0LGUpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9TWF0aC50cnVuYyh0aGlzLngpLHRoaXMueT1NYXRoLnRydW5jKHRoaXMueSksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueX1jcm9zcyh0KXtyZXR1cm4gdGhpcy54KnQueS10aGlzLnkqdC54fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueX1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9YW5nbGUoKXtyZXR1cm4gTWF0aC5hdGFuMigtdGhpcy55LC10aGlzLngpK01hdGguUEl9YW5nbGVUbyh0KXtjb25zdCBlPU1hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqdC5sZW5ndGhTcSgpKTtpZihlPT09MClyZXR1cm4gTWF0aC5QSS8yO2NvbnN0IG49dGhpcy5kb3QodCkvZTtyZXR1cm4gTWF0aC5hY29zKEcobiwtMSwxKSl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnk7cmV0dXJuIGUqZStuKm59bWFuaGF0dGFuRGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5hYnModGhpcy54LXQueCkrTWF0aC5hYnModGhpcy55LXQueSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXN9cm90YXRlQXJvdW5kKHQsZSl7Y29uc3Qgbj1NYXRoLmNvcyhlKSxzPU1hdGguc2luKGUpLHI9dGhpcy54LXQueCxvPXRoaXMueS10Lnk7cmV0dXJuIHRoaXMueD1yKm4tbypzK3QueCx0aGlzLnk9cipzK28qbit0LnksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55fX1jbGFzcyB3aXtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxzPTEpe3RoaXMuaXNRdWF0ZXJuaW9uPSEwLHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX3c9c31zdGF0aWMgc2xlcnBGbGF0KHQsZSxuLHMscixvLGEpe2xldCBjPW5bcyswXSxsPW5bcysxXSxoPW5bcysyXSx1PW5bcyszXTtjb25zdCBmPXJbbyswXSxkPXJbbysxXSxwPXJbbysyXSx5PXJbbyszXTtpZihhPT09MCl7dFtlKzBdPWMsdFtlKzFdPWwsdFtlKzJdPWgsdFtlKzNdPXU7cmV0dXJufWlmKGE9PT0xKXt0W2UrMF09Zix0W2UrMV09ZCx0W2UrMl09cCx0W2UrM109eTtyZXR1cm59aWYodSE9PXl8fGMhPT1mfHxsIT09ZHx8aCE9PXApe2xldCBtPTEtYTtjb25zdCBnPWMqZitsKmQraCpwK3UqeSxiPWc+PTA/MTotMSx3PTEtZypnO2lmKHc+TnVtYmVyLkVQU0lMT04pe2NvbnN0IE09TWF0aC5zcXJ0KHcpLEE9TWF0aC5hdGFuMihNLGcqYik7bT1NYXRoLnNpbihtKkEpL00sYT1NYXRoLnNpbihhKkEpL019Y29uc3QgeD1hKmI7aWYoYz1jKm0rZip4LGw9bCptK2QqeCxoPWgqbStwKngsdT11Km0reSp4LG09PT0xLWEpe2NvbnN0IE09MS9NYXRoLnNxcnQoYypjK2wqbCtoKmgrdSp1KTtjKj1NLGwqPU0saCo9TSx1Kj1NfX10W2VdPWMsdFtlKzFdPWwsdFtlKzJdPWgsdFtlKzNdPXV9c3RhdGljIG11bHRpcGx5UXVhdGVybmlvbnNGbGF0KHQsZSxuLHMscixvKXtjb25zdCBhPW5bc10sYz1uW3MrMV0sbD1uW3MrMl0saD1uW3MrM10sdT1yW29dLGY9cltvKzFdLGQ9cltvKzJdLHA9cltvKzNdO3JldHVybiB0W2VdPWEqcCtoKnUrYypkLWwqZix0W2UrMV09YypwK2gqZitsKnUtYSpkLHRbZSsyXT1sKnAraCpkK2EqZi1jKnUsdFtlKzNdPWgqcC1hKnUtYypmLWwqZCx0fWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB3KCl7cmV0dXJuIHRoaXMuX3d9c2V0IHcodCl7dGhpcy5fdz10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1zZXQodCxlLG4scyl7cmV0dXJuIHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX3c9cyx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl93KX1jb3B5KHQpe3JldHVybiB0aGlzLl94PXQueCx0aGlzLl95PXQueSx0aGlzLl96PXQueix0aGlzLl93PXQudyx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tRXVsZXIodCxlPSEwKXtjb25zdCBuPXQuX3gscz10Ll95LHI9dC5feixvPXQuX29yZGVyLGE9TWF0aC5jb3MsYz1NYXRoLnNpbixsPWEobi8yKSxoPWEocy8yKSx1PWEoci8yKSxmPWMobi8yKSxkPWMocy8yKSxwPWMoci8yKTtzd2l0Y2gobyl7Y2FzZSJYWVoiOnRoaXMuX3g9ZipoKnUrbCpkKnAsdGhpcy5feT1sKmQqdS1mKmgqcCx0aGlzLl96PWwqaCpwK2YqZCp1LHRoaXMuX3c9bCpoKnUtZipkKnA7YnJlYWs7Y2FzZSJZWFoiOnRoaXMuX3g9ZipoKnUrbCpkKnAsdGhpcy5feT1sKmQqdS1mKmgqcCx0aGlzLl96PWwqaCpwLWYqZCp1LHRoaXMuX3c9bCpoKnUrZipkKnA7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9ZipoKnUtbCpkKnAsdGhpcy5feT1sKmQqdStmKmgqcCx0aGlzLl96PWwqaCpwK2YqZCp1LHRoaXMuX3c9bCpoKnUtZipkKnA7YnJlYWs7Y2FzZSJaWVgiOnRoaXMuX3g9ZipoKnUtbCpkKnAsdGhpcy5feT1sKmQqdStmKmgqcCx0aGlzLl96PWwqaCpwLWYqZCp1LHRoaXMuX3c9bCpoKnUrZipkKnA7YnJlYWs7Y2FzZSJZWlgiOnRoaXMuX3g9ZipoKnUrbCpkKnAsdGhpcy5feT1sKmQqdStmKmgqcCx0aGlzLl96PWwqaCpwLWYqZCp1LHRoaXMuX3c9bCpoKnUtZipkKnA7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3g9ZipoKnUtbCpkKnAsdGhpcy5feT1sKmQqdS1mKmgqcCx0aGlzLl96PWwqaCpwK2YqZCp1LHRoaXMuX3c9bCpoKnUrZipkKnA7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAiK28pfXJldHVybiBlPT09ITAmJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21BeGlzQW5nbGUodCxlKXtjb25zdCBuPWUvMixzPU1hdGguc2luKG4pO3JldHVybiB0aGlzLl94PXQueCpzLHRoaXMuX3k9dC55KnMsdGhpcy5fej10Lnoqcyx0aGlzLl93PU1hdGguY29zKG4pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Sb3RhdGlvbk1hdHJpeCh0KXtjb25zdCBlPXQuZWxlbWVudHMsbj1lWzBdLHM9ZVs0XSxyPWVbOF0sbz1lWzFdLGE9ZVs1XSxjPWVbOV0sbD1lWzJdLGg9ZVs2XSx1PWVbMTBdLGY9bithK3U7aWYoZj4wKXtjb25zdCBkPS41L01hdGguc3FydChmKzEpO3RoaXMuX3c9LjI1L2QsdGhpcy5feD0oaC1jKSpkLHRoaXMuX3k9KHItbCkqZCx0aGlzLl96PShvLXMpKmR9ZWxzZSBpZihuPmEmJm4+dSl7Y29uc3QgZD0yKk1hdGguc3FydCgxK24tYS11KTt0aGlzLl93PShoLWMpL2QsdGhpcy5feD0uMjUqZCx0aGlzLl95PShzK28pL2QsdGhpcy5fej0ocitsKS9kfWVsc2UgaWYoYT51KXtjb25zdCBkPTIqTWF0aC5zcXJ0KDErYS1uLXUpO3RoaXMuX3c9KHItbCkvZCx0aGlzLl94PShzK28pL2QsdGhpcy5feT0uMjUqZCx0aGlzLl96PShjK2gpL2R9ZWxzZXtjb25zdCBkPTIqTWF0aC5zcXJ0KDErdS1uLWEpO3RoaXMuX3c9KG8tcykvZCx0aGlzLl94PShyK2wpL2QsdGhpcy5feT0oYytoKS9kLHRoaXMuX3o9LjI1KmR9cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Vbml0VmVjdG9ycyh0LGUpe2xldCBuPXQuZG90KGUpKzE7cmV0dXJuIG48MWUtOD8obj0wLE1hdGguYWJzKHQueCk+TWF0aC5hYnModC56KT8odGhpcy5feD0tdC55LHRoaXMuX3k9dC54LHRoaXMuX3o9MCx0aGlzLl93PW4pOih0aGlzLl94PTAsdGhpcy5feT0tdC56LHRoaXMuX3o9dC55LHRoaXMuX3c9bikpOih0aGlzLl94PXQueSplLnotdC56KmUueSx0aGlzLl95PXQueiplLngtdC54KmUueix0aGlzLl96PXQueCplLnktdC55KmUueCx0aGlzLl93PW4pLHRoaXMubm9ybWFsaXplKCl9YW5nbGVUbyh0KXtyZXR1cm4gMipNYXRoLmFjb3MoTWF0aC5hYnMoRyh0aGlzLmRvdCh0KSwtMSwxKSkpfXJvdGF0ZVRvd2FyZHModCxlKXtjb25zdCBuPXRoaXMuYW5nbGVUbyh0KTtpZihuPT09MClyZXR1cm4gdGhpcztjb25zdCBzPU1hdGgubWluKDEsZS9uKTtyZXR1cm4gdGhpcy5zbGVycCh0LHMpLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMSl9aW52ZXJ0KCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9Y29uanVnYXRlKCl7cmV0dXJuIHRoaXMuX3gqPS0xLHRoaXMuX3kqPS0xLHRoaXMuX3oqPS0xLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy5feCp0Ll94K3RoaXMuX3kqdC5feSt0aGlzLl96KnQuX3ordGhpcy5fdyp0Ll93fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fd31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fdyl9bm9ybWFsaXplKCl7bGV0IHQ9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdD09PTA/KHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fej0wLHRoaXMuX3c9MSk6KHQ9MS90LHRoaXMuX3g9dGhpcy5feCp0LHRoaXMuX3k9dGhpcy5feSp0LHRoaXMuX3o9dGhpcy5feip0LHRoaXMuX3c9dGhpcy5fdyp0KSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0LHRoaXMpfW11bHRpcGx5UXVhdGVybmlvbnModCxlKXtjb25zdCBuPXQuX3gscz10Ll95LHI9dC5feixvPXQuX3csYT1lLl94LGM9ZS5feSxsPWUuX3osaD1lLl93O3JldHVybiB0aGlzLl94PW4qaCtvKmErcypsLXIqYyx0aGlzLl95PXMqaCtvKmMrciphLW4qbCx0aGlzLl96PXIqaCtvKmwrbipjLXMqYSx0aGlzLl93PW8qaC1uKmEtcypjLXIqbCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycCh0LGUpe2lmKGU9PT0wKXJldHVybiB0aGlzO2lmKGU9PT0xKXJldHVybiB0aGlzLmNvcHkodCk7Y29uc3Qgbj10aGlzLl94LHM9dGhpcy5feSxyPXRoaXMuX3osbz10aGlzLl93O2xldCBhPW8qdC5fdytuKnQuX3grcyp0Ll95K3IqdC5fejtpZihhPDA/KHRoaXMuX3c9LXQuX3csdGhpcy5feD0tdC5feCx0aGlzLl95PS10Ll95LHRoaXMuX3o9LXQuX3osYT0tYSk6dGhpcy5jb3B5KHQpLGE+PTEpcmV0dXJuIHRoaXMuX3c9byx0aGlzLl94PW4sdGhpcy5feT1zLHRoaXMuX3o9cix0aGlzO2NvbnN0IGM9MS1hKmE7aWYoYzw9TnVtYmVyLkVQU0lMT04pe2NvbnN0IGQ9MS1lO3JldHVybiB0aGlzLl93PWQqbytlKnRoaXMuX3csdGhpcy5feD1kKm4rZSp0aGlzLl94LHRoaXMuX3k9ZCpzK2UqdGhpcy5feSx0aGlzLl96PWQqcitlKnRoaXMuX3osdGhpcy5ub3JtYWxpemUoKSx0aGlzfWNvbnN0IGw9TWF0aC5zcXJ0KGMpLGg9TWF0aC5hdGFuMihsLGEpLHU9TWF0aC5zaW4oKDEtZSkqaCkvbCxmPU1hdGguc2luKGUqaCkvbDtyZXR1cm4gdGhpcy5fdz1vKnUrdGhpcy5fdypmLHRoaXMuX3g9bip1K3RoaXMuX3gqZix0aGlzLl95PXMqdSt0aGlzLl95KmYsdGhpcy5fej1yKnUrdGhpcy5feipmLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwUXVhdGVybmlvbnModCxlLG4pe3JldHVybiB0aGlzLmNvcHkodCkuc2xlcnAoZSxuKX1yYW5kb20oKXtjb25zdCB0PTIqTWF0aC5QSSpNYXRoLnJhbmRvbSgpLGU9MipNYXRoLlBJKk1hdGgucmFuZG9tKCksbj1NYXRoLnJhbmRvbSgpLHM9TWF0aC5zcXJ0KDEtbikscj1NYXRoLnNxcnQobik7cmV0dXJuIHRoaXMuc2V0KHMqTWF0aC5zaW4odCkscypNYXRoLmNvcyh0KSxyKk1hdGguc2luKGUpLHIqTWF0aC5jb3MoZSkpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fdz09PXRoaXMuX3d9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5feD10W2VdLHRoaXMuX3k9dFtlKzFdLHRoaXMuX3o9dFtlKzJdLHRoaXMuX3c9dFtlKzNdLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX3csdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuX3g9dC5nZXRYKGUpLHRoaXMuX3k9dC5nZXRZKGUpLHRoaXMuX3o9dC5nZXRaKGUpLHRoaXMuX3c9dC5nZXRXKGUpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvSlNPTigpe3JldHVybiB0aGlzLnRvQXJyYXkoKX1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMuX3gseWllbGQgdGhpcy5feSx5aWVsZCB0aGlzLl96LHlpZWxkIHRoaXMuX3d9fWNsYXNzIFR7Y29uc3RydWN0b3IodD0wLGU9MCxuPTApe1QucHJvdG90eXBlLmlzVmVjdG9yMz0hMCx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bn1zZXQodCxlLG4pe3JldHVybiBuPT09dm9pZCAwJiYobj10aGlzLnopLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnopfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzLnorPXQueix0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXMuej10LnorZS56LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzLnorPXQueiplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzLnotPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXMuej10LnotZS56LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXMueio9dC56LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpcy56Kj10LHRoaXN9bXVsdGlwbHlWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngqZS54LHRoaXMueT10LnkqZS55LHRoaXMuej10LnoqZS56LHRoaXN9YXBwbHlFdWxlcih0KXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oX2Muc2V0RnJvbUV1bGVyKHQpKX1hcHBseUF4aXNBbmdsZSh0LGUpe3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihfYy5zZXRGcm9tQXhpc0FuZ2xlKHQsZSkpfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1yWzBdKmUrclszXSpuK3JbNl0qcyx0aGlzLnk9clsxXSplK3JbNF0qbityWzddKnMsdGhpcy56PXJbMl0qZStyWzVdKm4rcls4XSpzLHRoaXN9YXBwbHlOb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXgzKHQpLm5vcm1hbGl6ZSgpfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHMsbz0xLyhyWzNdKmUrcls3XSpuK3JbMTFdKnMrclsxNV0pO3JldHVybiB0aGlzLng9KHJbMF0qZStyWzRdKm4rcls4XSpzK3JbMTJdKSpvLHRoaXMueT0oclsxXSplK3JbNV0qbityWzldKnMrclsxM10pKm8sdGhpcy56PShyWzJdKmUrcls2XSpuK3JbMTBdKnMrclsxNF0pKm8sdGhpc31hcHBseVF1YXRlcm5pb24odCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscz10aGlzLnoscj10Lngsbz10LnksYT10LnosYz10LncsbD0yKihvKnMtYSpuKSxoPTIqKGEqZS1yKnMpLHU9MioocipuLW8qZSk7cmV0dXJuIHRoaXMueD1lK2MqbCtvKnUtYSpoLHRoaXMueT1uK2MqaCthKmwtcip1LHRoaXMuej1zK2MqdStyKmgtbypsLHRoaXN9cHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZEludmVyc2UpLmFwcGx5TWF0cml4NCh0LnByb2plY3Rpb25NYXRyaXgpfXVucHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpfXRyYW5zZm9ybURpcmVjdGlvbih0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1yWzBdKmUrcls0XSpuK3JbOF0qcyx0aGlzLnk9clsxXSplK3JbNV0qbityWzldKnMsdGhpcy56PXJbMl0qZStyWzZdKm4rclsxMF0qcyx0aGlzLm5vcm1hbGl6ZSgpfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpcy56Lz10LnosdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpcy56PU1hdGgubWluKHRoaXMueix0LnopLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1HKHRoaXMueCx0LngsZS54KSx0aGlzLnk9Ryh0aGlzLnksdC55LGUueSksdGhpcy56PUcodGhpcy56LHQueixlLnopLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PUcodGhpcy54LHQsZSksdGhpcy55PUcodGhpcy55LHQsZSksdGhpcy56PUcodGhpcy56LHQsZSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoRyhuLHQsZSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzLno9dC56KyhlLnotdC56KSpuLHRoaXN9Y3Jvc3ModCl7cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKHRoaXMsdCl9Y3Jvc3NWZWN0b3JzKHQsZSl7Y29uc3Qgbj10Lngscz10Lnkscj10Lnosbz1lLngsYT1lLnksYz1lLno7cmV0dXJuIHRoaXMueD1zKmMtciphLHRoaXMueT1yKm8tbipjLHRoaXMuej1uKmEtcypvLHRoaXN9cHJvamVjdE9uVmVjdG9yKHQpe2NvbnN0IGU9dC5sZW5ndGhTcSgpO2lmKGU9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCk7Y29uc3Qgbj10LmRvdCh0aGlzKS9lO3JldHVybiB0aGlzLmNvcHkodCkubXVsdGlwbHlTY2FsYXIobil9cHJvamVjdE9uUGxhbmUodCl7cmV0dXJuIHNvLmNvcHkodGhpcykucHJvamVjdE9uVmVjdG9yKHQpLHRoaXMuc3ViKHNvKX1yZWZsZWN0KHQpe3JldHVybiB0aGlzLnN1Yihzby5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QodCkpKX1hbmdsZVRvKHQpe2NvbnN0IGU9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSp0Lmxlbmd0aFNxKCkpO2lmKGU9PT0wKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgbj10aGlzLmRvdCh0KS9lO3JldHVybiBNYXRoLmFjb3MoRyhuLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LG49dGhpcy55LXQueSxzPXRoaXMuei10Lno7cmV0dXJuIGUqZStuKm4rcypzfW1hbmhhdHRhbkRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC10LngpK01hdGguYWJzKHRoaXMueS10LnkpK01hdGguYWJzKHRoaXMuei10LnopfXNldEZyb21TcGhlcmljYWwodCl7cmV0dXJuIHRoaXMuc2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnBoaSx0LnRoZXRhKX1zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKHQsZSxuKXtjb25zdCBzPU1hdGguc2luKGUpKnQ7cmV0dXJuIHRoaXMueD1zKk1hdGguc2luKG4pLHRoaXMueT1NYXRoLmNvcyhlKSp0LHRoaXMuej1zKk1hdGguY29zKG4pLHRoaXN9c2V0RnJvbUN5bGluZHJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnRoZXRhLHQueSl9c2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQqTWF0aC5zaW4oZSksdGhpcy55PW4sdGhpcy56PXQqTWF0aC5jb3MoZSksdGhpc31zZXRGcm9tTWF0cml4UG9zaXRpb24odCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9ZVsxMl0sdGhpcy55PWVbMTNdLHRoaXMuej1lWzE0XSx0aGlzfXNldEZyb21NYXRyaXhTY2FsZSh0KXtjb25zdCBlPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLG49dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCkscz10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gdGhpcy54PWUsdGhpcy55PW4sdGhpcy56PXMsdGhpc31zZXRGcm9tTWF0cml4Q29sdW1uKHQsZSl7cmV0dXJuIHRoaXMuZnJvbUFycmF5KHQuZWxlbWVudHMsZSo0KX1zZXRGcm9tTWF0cml4M0NvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLGUqMyl9c2V0RnJvbUV1bGVyKHQpe3JldHVybiB0aGlzLng9dC5feCx0aGlzLnk9dC5feSx0aGlzLno9dC5feix0aGlzfXNldEZyb21Db2xvcih0KXtyZXR1cm4gdGhpcy54PXQucix0aGlzLnk9dC5nLHRoaXMuej10LmIsdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnp9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdFtlKzJdPXRoaXMueix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpc31yYW5kb21EaXJlY3Rpb24oKXtjb25zdCB0PU1hdGgucmFuZG9tKCkqTWF0aC5QSSoyLGU9TWF0aC5yYW5kb20oKSoyLTEsbj1NYXRoLnNxcnQoMS1lKmUpO3JldHVybiB0aGlzLng9bipNYXRoLmNvcyh0KSx0aGlzLnk9ZSx0aGlzLno9bipNYXRoLnNpbih0KSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnkseWllbGQgdGhpcy56fX1jb25zdCBzbz1uZXcgVCxfYz1uZXcgd2k7Y2xhc3MgbWV7Y29uc3RydWN0b3IodCxlLG4scyxyLG8sYSxjLGwpe21lLnByb3RvdHlwZS5pc01hdHJpeDM9ITAsdGhpcy5lbGVtZW50cz1bMSwwLDAsMCwxLDAsMCwwLDFdLHQhPT12b2lkIDAmJnRoaXMuc2V0KHQsZSxuLHMscixvLGEsYyxsKX1zZXQodCxlLG4scyxyLG8sYSxjLGwpe2NvbnN0IGg9dGhpcy5lbGVtZW50cztyZXR1cm4gaFswXT10LGhbMV09cyxoWzJdPWEsaFszXT1lLGhbNF09cixoWzVdPWMsaFs2XT1uLGhbN109byxoWzhdPWwsdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDEsMCwwLDAsMSksdGhpc31jb3B5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMF09blswXSxlWzFdPW5bMV0sZVsyXT1uWzJdLGVbM109blszXSxlWzRdPW5bNF0sZVs1XT1uWzVdLGVbNl09bls2XSxlWzddPW5bN10sZVs4XT1uWzhdLHRoaXN9ZXh0cmFjdEJhc2lzKHQsZSxuKXtyZXR1cm4gdC5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywxKSxuLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMiksdGhpc31zZXRGcm9tTWF0cml4NCh0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KGVbMF0sZVs0XSxlWzhdLGVbMV0sZVs1XSxlWzldLGVbMl0sZVs2XSxlWzEwXSksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBuPXQuZWxlbWVudHMscz1lLmVsZW1lbnRzLHI9dGhpcy5lbGVtZW50cyxvPW5bMF0sYT1uWzNdLGM9bls2XSxsPW5bMV0saD1uWzRdLHU9bls3XSxmPW5bMl0sZD1uWzVdLHA9bls4XSx5PXNbMF0sbT1zWzNdLGc9c1s2XSxiPXNbMV0sdz1zWzRdLHg9c1s3XSxNPXNbMl0sQT1zWzVdLFM9c1s4XTtyZXR1cm4gclswXT1vKnkrYSpiK2MqTSxyWzNdPW8qbSthKncrYypBLHJbNl09bypnK2EqeCtjKlMsclsxXT1sKnkraCpiK3UqTSxyWzRdPWwqbStoKncrdSpBLHJbN109bCpnK2gqeCt1KlMsclsyXT1mKnkrZCpiK3AqTSxyWzVdPWYqbStkKncrcCpBLHJbOF09ZipnK2QqeCtwKlMsdGhpc31tdWx0aXBseVNjYWxhcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIGVbMF0qPXQsZVszXSo9dCxlWzZdKj10LGVbMV0qPXQsZVs0XSo9dCxlWzddKj10LGVbMl0qPXQsZVs1XSo9dCxlWzhdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxzPXRbMl0scj10WzNdLG89dFs0XSxhPXRbNV0sYz10WzZdLGw9dFs3XSxoPXRbOF07cmV0dXJuIGUqbypoLWUqYSpsLW4qcipoK24qYSpjK3MqcipsLXMqbypjfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLHM9dFsyXSxyPXRbM10sbz10WzRdLGE9dFs1XSxjPXRbNl0sbD10WzddLGg9dFs4XSx1PWgqby1hKmwsZj1hKmMtaCpyLGQ9bCpyLW8qYyxwPWUqdStuKmYrcypkO2lmKHA9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgeT0xL3A7cmV0dXJuIHRbMF09dSp5LHRbMV09KHMqbC1oKm4pKnksdFsyXT0oYSpuLXMqbykqeSx0WzNdPWYqeSx0WzRdPShoKmUtcypjKSp5LHRbNV09KHMqci1hKmUpKnksdFs2XT1kKnksdFs3XT0obipjLWwqZSkqeSx0WzhdPShvKmUtbipyKSp5LHRoaXN9dHJhbnNwb3NlKCl7bGV0IHQ7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiB0PWVbMV0sZVsxXT1lWzNdLGVbM109dCx0PWVbMl0sZVsyXT1lWzZdLGVbNl09dCx0PWVbNV0sZVs1XT1lWzddLGVbN109dCx0aGlzfWdldE5vcm1hbE1hdHJpeCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NCh0KS5pbnZlcnQoKS50cmFuc3Bvc2UoKX10cmFuc3Bvc2VJbnRvQXJyYXkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzNdLHRbMl09ZVs2XSx0WzNdPWVbMV0sdFs0XT1lWzRdLHRbNV09ZVs3XSx0WzZdPWVbMl0sdFs3XT1lWzVdLHRbOF09ZVs4XSx0aGlzfXNldFV2VHJhbnNmb3JtKHQsZSxuLHMscixvLGEpe2NvbnN0IGM9TWF0aC5jb3MociksbD1NYXRoLnNpbihyKTtyZXR1cm4gdGhpcy5zZXQobipjLG4qbCwtbiooYypvK2wqYSkrbyt0LC1zKmwscypjLC1zKigtbCpvK2MqYSkrYStlLDAsMCwxKSx0aGlzfXNjYWxlKHQsZSl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkocm8ubWFrZVNjYWxlKHQsZSkpLHRoaXN9cm90YXRlKHQpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KHJvLm1ha2VSb3RhdGlvbigtdCkpLHRoaXN9dHJhbnNsYXRlKHQsZSl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkocm8ubWFrZVRyYW5zbGF0aW9uKHQsZSkpLHRoaXN9bWFrZVRyYW5zbGF0aW9uKHQsZSl7cmV0dXJuIHQuaXNWZWN0b3IyP3RoaXMuc2V0KDEsMCx0LngsMCwxLHQueSwwLDAsMSk6dGhpcy5zZXQoMSwwLHQsMCwxLGUsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwtbiwwLG4sZSwwLDAsMCwxKSx0aGlzfW1ha2VTY2FsZSh0LGUpe3JldHVybiB0aGlzLnNldCh0LDAsMCwwLGUsMCwwLDAsMSksdGhpc31lcXVhbHModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztmb3IobGV0IHM9MDtzPDk7cysrKWlmKGVbc10hPT1uW3NdKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBuPTA7bjw5O24rKyl0aGlzLmVsZW1lbnRzW25dPXRbbitlXTtyZXR1cm4gdGhpc310b0FycmF5KHQ9W10sZT0wKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbZV09blswXSx0W2UrMV09blsxXSx0W2UrMl09blsyXSx0W2UrM109blszXSx0W2UrNF09bls0XSx0W2UrNV09bls1XSx0W2UrNl09bls2XSx0W2UrN109bls3XSx0W2UrOF09bls4XSx0fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfX1jb25zdCBybz1uZXcgbWU7ZnVuY3Rpb24gZWYoaSl7Zm9yKGxldCB0PWkubGVuZ3RoLTE7dD49MDstLXQpaWYoaVt0XT49NjU1MzUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gdmMoaSl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsaSl9Y29uc3QgemM9e307ZnVuY3Rpb24gVGMoaSl7aSBpbiB6Y3x8KHpjW2ldPSEwLGNvbnNvbGUud2FybihpKSl9Y29uc3QgRWM9bmV3IG1lKCkuc2V0KC40MTIzOTA4LC4zNTc1ODQzLC4xODA0ODA4LC4yMTI2MzksLjcxNTE2ODcsLjA3MjE5MjMsLjAxOTMzMDgsLjExOTE5NDgsLjk1MDUzMjIpLFBjPW5ldyBtZSgpLnNldCgzLjI0MDk2OTksLTEuNTM3MzgzMiwtLjQ5ODYxMDgsLS45NjkyNDM2LDEuODc1OTY3NSwuMDQxNTU1MSwuMDU1NjMwMSwtLjIwMzk3NywxLjA1Njk3MTUpO2Z1bmN0aW9uIG5mKCl7Y29uc3QgaT17ZW5hYmxlZDohMCx3b3JraW5nQ29sb3JTcGFjZTpBYyxzcGFjZXM6e30sY29udmVydDpmdW5jdGlvbihzLHIsbyl7cmV0dXJuIHRoaXMuZW5hYmxlZD09PSExfHxyPT09b3x8IXJ8fCFvfHwodGhpcy5zcGFjZXNbcl0udHJhbnNmZXI9PT1ubyYmKHMucj1fZShzLnIpLHMuZz1fZShzLmcpLHMuYj1fZShzLmIpKSx0aGlzLnNwYWNlc1tyXS5wcmltYXJpZXMhPT10aGlzLnNwYWNlc1tvXS5wcmltYXJpZXMmJihzLmFwcGx5TWF0cml4Myh0aGlzLnNwYWNlc1tyXS50b1hZWikscy5hcHBseU1hdHJpeDModGhpcy5zcGFjZXNbb10uZnJvbVhZWikpLHRoaXMuc3BhY2VzW29dLnRyYW5zZmVyPT09bm8mJihzLnI9SW4ocy5yKSxzLmc9SW4ocy5nKSxzLmI9SW4ocy5iKSkpLHN9LHdvcmtpbmdUb0NvbG9yU3BhY2U6ZnVuY3Rpb24ocyxyKXtyZXR1cm4gdGhpcy5jb252ZXJ0KHMsdGhpcy53b3JraW5nQ29sb3JTcGFjZSxyKX0sY29sb3JTcGFjZVRvV29ya2luZzpmdW5jdGlvbihzLHIpe3JldHVybiB0aGlzLmNvbnZlcnQocyxyLHRoaXMud29ya2luZ0NvbG9yU3BhY2UpfSxnZXRQcmltYXJpZXM6ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMuc3BhY2VzW3NdLnByaW1hcmllc30sZ2V0VHJhbnNmZXI6ZnVuY3Rpb24ocyl7cmV0dXJuIHM9PT1NYz9TYzp0aGlzLnNwYWNlc1tzXS50cmFuc2Zlcn0sZ2V0VG9uZU1hcHBpbmdNb2RlOmZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLnNwYWNlc1tzXS5vdXRwdXRDb2xvclNwYWNlQ29uZmlnLnRvbmVNYXBwaW5nTW9kZXx8InN0YW5kYXJkIn0sZ2V0THVtaW5hbmNlQ29lZmZpY2llbnRzOmZ1bmN0aW9uKHMscj10aGlzLndvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gcy5mcm9tQXJyYXkodGhpcy5zcGFjZXNbcl0ubHVtaW5hbmNlQ29lZmZpY2llbnRzKX0sZGVmaW5lOmZ1bmN0aW9uKHMpe09iamVjdC5hc3NpZ24odGhpcy5zcGFjZXMscyl9LF9nZXRNYXRyaXg6ZnVuY3Rpb24ocyxyLG8pe3JldHVybiBzLmNvcHkodGhpcy5zcGFjZXNbcl0udG9YWVopLm11bHRpcGx5KHRoaXMuc3BhY2VzW29dLmZyb21YWVopfSxfZ2V0RHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMuc3BhY2VzW3NdLm91dHB1dENvbG9yU3BhY2VDb25maWcuZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2V9LF9nZXRVbnBhY2tDb2xvclNwYWNlOmZ1bmN0aW9uKHM9dGhpcy53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHRoaXMuc3BhY2VzW3NdLndvcmtpbmdDb2xvclNwYWNlQ29uZmlnLnVucGFja0NvbG9yU3BhY2V9LGZyb21Xb3JraW5nQ29sb3JTcGFjZTpmdW5jdGlvbihzLHIpe3JldHVybiBUYygiVEhSRUUuQ29sb3JNYW5hZ2VtZW50OiAuZnJvbVdvcmtpbmdDb2xvclNwYWNlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAud29ya2luZ1RvQ29sb3JTcGFjZSgpLiIpLGkud29ya2luZ1RvQ29sb3JTcGFjZShzLHIpfSx0b1dvcmtpbmdDb2xvclNwYWNlOmZ1bmN0aW9uKHMscil7cmV0dXJuIFRjKCJUSFJFRS5Db2xvck1hbmFnZW1lbnQ6IC50b1dvcmtpbmdDb2xvclNwYWNlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY29sb3JTcGFjZVRvV29ya2luZygpLiIpLGkuY29sb3JTcGFjZVRvV29ya2luZyhzLHIpfX0sdD1bLjY0LC4zMywuMywuNiwuMTUsLjA2XSxlPVsuMjEyNiwuNzE1MiwuMDcyMl0sbj1bLjMxMjcsLjMyOV07cmV0dXJuIGkuZGVmaW5lKHtbQWNdOntwcmltYXJpZXM6dCx3aGl0ZVBvaW50Om4sdHJhbnNmZXI6U2MsdG9YWVo6RWMsZnJvbVhZWjpQYyxsdW1pbmFuY2VDb2VmZmljaWVudHM6ZSx3b3JraW5nQ29sb3JTcGFjZUNvbmZpZzp7dW5wYWNrQ29sb3JTcGFjZTpvZX0sb3V0cHV0Q29sb3JTcGFjZUNvbmZpZzp7ZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6b2V9fSxbb2VdOntwcmltYXJpZXM6dCx3aGl0ZVBvaW50Om4sdHJhbnNmZXI6bm8sdG9YWVo6RWMsZnJvbVhZWjpQYyxsdW1pbmFuY2VDb2VmZmljaWVudHM6ZSxvdXRwdXRDb2xvclNwYWNlQ29uZmlnOntkcmF3aW5nQnVmZmVyQ29sb3JTcGFjZTpvZX19fSksaX1jb25zdCBhZT1uZigpO2Z1bmN0aW9uIF9lKGkpe3JldHVybiBpPC4wNDA0NT9pKi4wNzczOTkzODA4Ok1hdGgucG93KGkqLjk0Nzg2NzI5ODYrLjA1MjEzMjcwMTQsMi40KX1mdW5jdGlvbiBJbihpKXtyZXR1cm4gaTwuMDAzMTMwOD9pKjEyLjkyOjEuMDU1Kk1hdGgucG93KGksLjQxNjY2KS0uMDU1fWxldCBrbjtjbGFzcyBzZntzdGF0aWMgZ2V0RGF0YVVSTCh0LGU9ImltYWdlL3BuZyIpe2lmKC9eZGF0YTovaS50ZXN0KHQuc3JjKXx8dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50PT0idW5kZWZpbmVkIilyZXR1cm4gdC5zcmM7bGV0IG47aWYodCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KW49dDtlbHNle2tuPT09dm9pZCAwJiYoa249dmMoImNhbnZhcyIpKSxrbi53aWR0aD10LndpZHRoLGtuLmhlaWdodD10LmhlaWdodDtjb25zdCBzPWtuLmdldENvbnRleHQoIjJkIik7dCBpbnN0YW5jZW9mIEltYWdlRGF0YT9zLnB1dEltYWdlRGF0YSh0LDAsMCk6cy5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCksbj1rbn1yZXR1cm4gbi50b0RhdGFVUkwoZSl9c3RhdGljIHNSR0JUb0xpbmVhcih0KXtpZih0eXBlb2YgSFRNTEltYWdlRWxlbWVudCE9InVuZGVmaW5lZCImJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHx0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQhPSJ1bmRlZmluZWQiJiZ0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fHR5cGVvZiBJbWFnZUJpdG1hcCE9InVuZGVmaW5lZCImJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7Y29uc3QgZT12YygiY2FudmFzIik7ZS53aWR0aD10LndpZHRoLGUuaGVpZ2h0PXQuaGVpZ2h0O2NvbnN0IG49ZS5nZXRDb250ZXh0KCIyZCIpO24uZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpO2NvbnN0IHM9bi5nZXRJbWFnZURhdGEoMCwwLHQud2lkdGgsdC5oZWlnaHQpLHI9cy5kYXRhO2ZvcihsZXQgbz0wO288ci5sZW5ndGg7bysrKXJbb109X2UocltvXS8yNTUpKjI1NTtyZXR1cm4gbi5wdXRJbWFnZURhdGEocywwLDApLGV9ZWxzZSBpZih0LmRhdGEpe2NvbnN0IGU9dC5kYXRhLnNsaWNlKDApO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxlIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXk/ZVtuXT1NYXRoLmZsb29yKF9lKGVbbl0vMjU1KSoyNTUpOmVbbl09X2UoZVtuXSk7cmV0dXJue2RhdGE6ZSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH19ZWxzZSByZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLnNSR0JUb0xpbmVhcigpOiBVbnN1cHBvcnRlZCBpbWFnZSB0eXBlLiBObyBjb2xvciBzcGFjZSBjb252ZXJzaW9uIGFwcGxpZWQuIiksdH19bGV0IHJmPTA7Y2xhc3Mgb2Z7Y29uc3RydWN0b3IodD1udWxsKXt0aGlzLmlzU291cmNlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOnJmKyt9KSx0aGlzLnV1aWQ9Rm4oKSx0aGlzLmRhdGE9dCx0aGlzLmRhdGFSZWFkeT0hMCx0aGlzLnZlcnNpb249MH1nZXRTaXplKHQpe2NvbnN0IGU9dGhpcy5kYXRhO3JldHVybiB0eXBlb2YgSFRNTFZpZGVvRWxlbWVudCE9InVuZGVmaW5lZCImJmUgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50P3Quc2V0KGUudmlkZW9XaWR0aCxlLnZpZGVvSGVpZ2h0LDApOmUgaW5zdGFuY2VvZiBWaWRlb0ZyYW1lP3Quc2V0KGUuZGlzcGxheUhlaWdodCxlLmRpc3BsYXlXaWR0aCwwKTplIT09bnVsbD90LnNldChlLndpZHRoLGUuaGVpZ2h0LGUuZGVwdGh8fDApOnQuc2V0KDAsMCwwKSx0fXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfXRvSlNPTih0KXtjb25zdCBlPXQ9PT12b2lkIDB8fHR5cGVvZiB0PT0ic3RyaW5nIjtpZighZSYmdC5pbWFnZXNbdGhpcy51dWlkXSE9PXZvaWQgMClyZXR1cm4gdC5pbWFnZXNbdGhpcy51dWlkXTtjb25zdCBuPXt1dWlkOnRoaXMudXVpZCx1cmw6IiJ9LHM9dGhpcy5kYXRhO2lmKHMhPT1udWxsKXtsZXQgcjtpZihBcnJheS5pc0FycmF5KHMpKXtyPVtdO2ZvcihsZXQgbz0wLGE9cy5sZW5ndGg7bzxhO28rKylzW29dLmlzRGF0YVRleHR1cmU/ci5wdXNoKG9vKHNbb10uaW1hZ2UpKTpyLnB1c2gob28oc1tvXSkpfWVsc2Ugcj1vbyhzKTtuLnVybD1yfXJldHVybiBlfHwodC5pbWFnZXNbdGhpcy51dWlkXT1uKSxufX1mdW5jdGlvbiBvbyhpKXtyZXR1cm4gdHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQhPSJ1bmRlZmluZWQiJiZpIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudHx8dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50IT0idW5kZWZpbmVkIiYmaSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHx0eXBlb2YgSW1hZ2VCaXRtYXAhPSJ1bmRlZmluZWQiJiZpIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXA/c2YuZ2V0RGF0YVVSTChpKTppLmRhdGE/e2RhdGE6QXJyYXkuZnJvbShpLmRhdGEpLHdpZHRoOmkud2lkdGgsaGVpZ2h0OmkuaGVpZ2h0LHR5cGU6aS5kYXRhLmNvbnN0cnVjdG9yLm5hbWV9Oihjb25zb2xlLndhcm4oIlRIUkVFLlRleHR1cmU6IFVuYWJsZSB0byBzZXJpYWxpemUgVGV4dHVyZS4iKSx7fSl9bGV0IGFmPTA7Y29uc3QgYW89bmV3IFQ7Y2xhc3MgbG4gZXh0ZW5kcyBsc3tjb25zdHJ1Y3Rvcih0PWxuLkRFRkFVTFRfSU1BR0UsZT1sbi5ERUZBVUxUX01BUFBJTkcsbj0xMDAxLHM9MTAwMSxyPTEwMDYsbz0xMDA4LGE9MTAyMyxjPTEwMDksbD1sbi5ERUZBVUxUX0FOSVNPVFJPUFksaD1NYyl7c3VwZXIoKSx0aGlzLmlzVGV4dHVyZT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTphZisrfSksdGhpcy51dWlkPUZuKCksdGhpcy5uYW1lPSIiLHRoaXMuc291cmNlPW5ldyBvZih0KSx0aGlzLm1pcG1hcHM9W10sdGhpcy5tYXBwaW5nPWUsdGhpcy5jaGFubmVsPTAsdGhpcy53cmFwUz1uLHRoaXMud3JhcFQ9cyx0aGlzLm1hZ0ZpbHRlcj1yLHRoaXMubWluRmlsdGVyPW8sdGhpcy5hbmlzb3Ryb3B5PWwsdGhpcy5mb3JtYXQ9YSx0aGlzLmludGVybmFsRm9ybWF0PW51bGwsdGhpcy50eXBlPWMsdGhpcy5vZmZzZXQ9bmV3IE4oMCwwKSx0aGlzLnJlcGVhdD1uZXcgTigxLDEpLHRoaXMuY2VudGVyPW5ldyBOKDAsMCksdGhpcy5yb3RhdGlvbj0wLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMCx0aGlzLm1hdHJpeD1uZXcgbWUsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITAsdGhpcy5wcmVtdWx0aXBseUFscGhhPSExLHRoaXMuZmxpcFk9ITAsdGhpcy51bnBhY2tBbGlnbm1lbnQ9NCx0aGlzLmNvbG9yU3BhY2U9aCx0aGlzLnVzZXJEYXRhPXt9LHRoaXMudXBkYXRlUmFuZ2VzPVtdLHRoaXMudmVyc2lvbj0wLHRoaXMub25VcGRhdGU9bnVsbCx0aGlzLnJlbmRlclRhcmdldD1udWxsLHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSExLHRoaXMuaXNBcnJheVRleHR1cmU9ISEodCYmdC5kZXB0aCYmdC5kZXB0aD4xKSx0aGlzLnBtcmVtVmVyc2lvbj0wfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnNvdXJjZS5nZXRTaXplKGFvKS54fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy5zb3VyY2UuZ2V0U2l6ZShhbykueX1nZXQgZGVwdGgoKXtyZXR1cm4gdGhpcy5zb3VyY2UuZ2V0U2l6ZShhbykuen1nZXQgaW1hZ2UoKXtyZXR1cm4gdGhpcy5zb3VyY2UuZGF0YX1zZXQgaW1hZ2UodD1udWxsKXt0aGlzLnNvdXJjZS5kYXRhPXR9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguc2V0VXZUcmFuc2Zvcm0odGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55LHRoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueSx0aGlzLnJvdGF0aW9uLHRoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueSl9YWRkVXBkYXRlUmFuZ2UodCxlKXt0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKHtzdGFydDp0LGNvdW50OmV9KX1jbGVhclVwZGF0ZVJhbmdlcygpe3RoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aD0wfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLm5hbWU9dC5uYW1lLHRoaXMuc291cmNlPXQuc291cmNlLHRoaXMubWlwbWFwcz10Lm1pcG1hcHMuc2xpY2UoMCksdGhpcy5tYXBwaW5nPXQubWFwcGluZyx0aGlzLmNoYW5uZWw9dC5jaGFubmVsLHRoaXMud3JhcFM9dC53cmFwUyx0aGlzLndyYXBUPXQud3JhcFQsdGhpcy5tYWdGaWx0ZXI9dC5tYWdGaWx0ZXIsdGhpcy5taW5GaWx0ZXI9dC5taW5GaWx0ZXIsdGhpcy5hbmlzb3Ryb3B5PXQuYW5pc290cm9weSx0aGlzLmZvcm1hdD10LmZvcm1hdCx0aGlzLmludGVybmFsRm9ybWF0PXQuaW50ZXJuYWxGb3JtYXQsdGhpcy50eXBlPXQudHlwZSx0aGlzLm9mZnNldC5jb3B5KHQub2Zmc2V0KSx0aGlzLnJlcGVhdC5jb3B5KHQucmVwZWF0KSx0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJvdGF0aW9uPXQucm90YXRpb24sdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLmdlbmVyYXRlTWlwbWFwcz10LmdlbmVyYXRlTWlwbWFwcyx0aGlzLnByZW11bHRpcGx5QWxwaGE9dC5wcmVtdWx0aXBseUFscGhhLHRoaXMuZmxpcFk9dC5mbGlwWSx0aGlzLnVucGFja0FsaWdubWVudD10LnVucGFja0FsaWdubWVudCx0aGlzLmNvbG9yU3BhY2U9dC5jb2xvclNwYWNlLHRoaXMucmVuZGVyVGFyZ2V0PXQucmVuZGVyVGFyZ2V0LHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPXQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlLHRoaXMuaXNBcnJheVRleHR1cmU9dC5pc0FycmF5VGV4dHVyZSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLHRoaXMubmVlZHNVcGRhdGU9ITAsdGhpc31zZXRWYWx1ZXModCl7Zm9yKGNvbnN0IGUgaW4gdCl7Y29uc3Qgbj10W2VdO2lmKG49PT12b2lkIDApe2NvbnNvbGUud2FybihgVEhSRUUuVGV4dHVyZS5zZXRWYWx1ZXMoKTogcGFyYW1ldGVyICcke2V9JyBoYXMgdmFsdWUgb2YgdW5kZWZpbmVkLmApO2NvbnRpbnVlfWNvbnN0IHM9dGhpc1tlXTtpZihzPT09dm9pZCAwKXtjb25zb2xlLndhcm4oYFRIUkVFLlRleHR1cmUuc2V0VmFsdWVzKCk6IHByb3BlcnR5ICcke2V9JyBkb2VzIG5vdCBleGlzdC5gKTtjb250aW51ZX1zJiZuJiZzLmlzVmVjdG9yMiYmbi5pc1ZlY3RvcjJ8fHMmJm4mJnMuaXNWZWN0b3IzJiZuLmlzVmVjdG9yM3x8cyYmbiYmcy5pc01hdHJpeDMmJm4uaXNNYXRyaXgzP3MuY29weShuKTp0aGlzW2VdPW59fXRvSlNPTih0KXtjb25zdCBlPXQ9PT12b2lkIDB8fHR5cGVvZiB0PT0ic3RyaW5nIjtpZighZSYmdC50ZXh0dXJlc1t0aGlzLnV1aWRdIT09dm9pZCAwKXJldHVybiB0LnRleHR1cmVzW3RoaXMudXVpZF07Y29uc3Qgbj17bWV0YWRhdGE6e3ZlcnNpb246NC43LHR5cGU6IlRleHR1cmUiLGdlbmVyYXRvcjoiVGV4dHVyZS50b0pTT04ifSx1dWlkOnRoaXMudXVpZCxuYW1lOnRoaXMubmFtZSxpbWFnZTp0aGlzLnNvdXJjZS50b0pTT04odCkudXVpZCxtYXBwaW5nOnRoaXMubWFwcGluZyxjaGFubmVsOnRoaXMuY2hhbm5lbCxyZXBlYXQ6W3RoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueV0sb2Zmc2V0Olt0aGlzLm9mZnNldC54LHRoaXMub2Zmc2V0LnldLGNlbnRlcjpbdGhpcy5jZW50ZXIueCx0aGlzLmNlbnRlci55XSxyb3RhdGlvbjp0aGlzLnJvdGF0aW9uLHdyYXA6W3RoaXMud3JhcFMsdGhpcy53cmFwVF0sZm9ybWF0OnRoaXMuZm9ybWF0LGludGVybmFsRm9ybWF0OnRoaXMuaW50ZXJuYWxGb3JtYXQsdHlwZTp0aGlzLnR5cGUsY29sb3JTcGFjZTp0aGlzLmNvbG9yU3BhY2UsbWluRmlsdGVyOnRoaXMubWluRmlsdGVyLG1hZ0ZpbHRlcjp0aGlzLm1hZ0ZpbHRlcixhbmlzb3Ryb3B5OnRoaXMuYW5pc290cm9weSxmbGlwWTp0aGlzLmZsaXBZLGdlbmVyYXRlTWlwbWFwczp0aGlzLmdlbmVyYXRlTWlwbWFwcyxwcmVtdWx0aXBseUFscGhhOnRoaXMucHJlbXVsdGlwbHlBbHBoYSx1bnBhY2tBbGlnbm1lbnQ6dGhpcy51bnBhY2tBbGlnbm1lbnR9O3JldHVybiBPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKG4udXNlckRhdGE9dGhpcy51c2VyRGF0YSksZXx8KHQudGV4dHVyZXNbdGhpcy51dWlkXT1uKSxufWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9dHJhbnNmb3JtVXYodCl7aWYodGhpcy5tYXBwaW5nIT09MzAwKXJldHVybiB0O2lmKHQuYXBwbHlNYXRyaXgzKHRoaXMubWF0cml4KSx0Lng8MHx8dC54PjEpc3dpdGNoKHRoaXMud3JhcFMpe2Nhc2UgMWUzOnQueD10LngtTWF0aC5mbG9vcih0LngpO2JyZWFrO2Nhc2UgMTAwMTp0Lng9dC54PDA/MDoxO2JyZWFrO2Nhc2UgMTAwMjpNYXRoLmFicyhNYXRoLmZsb29yKHQueCklMik9PT0xP3QueD1NYXRoLmNlaWwodC54KS10Lng6dC54PXQueC1NYXRoLmZsb29yKHQueCk7YnJlYWt9aWYodC55PDB8fHQueT4xKXN3aXRjaCh0aGlzLndyYXBUKXtjYXNlIDFlMzp0Lnk9dC55LU1hdGguZmxvb3IodC55KTticmVhaztjYXNlIDEwMDE6dC55PXQueTwwPzA6MTticmVhaztjYXNlIDEwMDI6TWF0aC5hYnMoTWF0aC5mbG9vcih0LnkpJTIpPT09MT90Lnk9TWF0aC5jZWlsKHQueSktdC55OnQueT10LnktTWF0aC5mbG9vcih0LnkpO2JyZWFrfXJldHVybiB0aGlzLmZsaXBZJiYodC55PTEtdC55KSx0fXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJih0aGlzLnZlcnNpb24rKyx0aGlzLnNvdXJjZS5uZWVkc1VwZGF0ZT0hMCl9c2V0IG5lZWRzUE1SRU1VcGRhdGUodCl7dD09PSEwJiZ0aGlzLnBtcmVtVmVyc2lvbisrfX1sbi5ERUZBVUxUX0lNQUdFPW51bGwsbG4uREVGQVVMVF9NQVBQSU5HPTMwMCxsbi5ERUZBVUxUX0FOSVNPVFJPUFk9MTtjbGFzcyBKdHtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxzPTEpe0p0LnByb3RvdHlwZS5pc1ZlY3RvcjQ9ITAsdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW4sdGhpcy53PXN9Z2V0IHdpZHRoKCl7cmV0dXJuIHRoaXMuen1zZXQgd2lkdGgodCl7dGhpcy56PXR9Z2V0IGhlaWdodCgpe3JldHVybiB0aGlzLnd9c2V0IGhlaWdodCh0KXt0aGlzLnc9dH1zZXQodCxlLG4scyl7cmV0dXJuIHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXMudz1zLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzLnc9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldFcodCl7cmV0dXJuIHRoaXMudz10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7Y2FzZSAyOnRoaXMuej1lO2JyZWFrO2Nhc2UgMzp0aGlzLnc9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7Y2FzZSAzOnJldHVybiB0aGlzLnc7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnosdGhpcy53KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQueix0aGlzLnc9dC53IT09dm9pZCAwP3QudzoxLHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzLnorPXQueix0aGlzLncrPXQudyx0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpcy53Kz10LHRoaXN9YWRkVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54K2UueCx0aGlzLnk9dC55K2UueSx0aGlzLno9dC56K2Uueix0aGlzLnc9dC53K2Uudyx0aGlzfWFkZFNjYWxlZFZlY3Rvcih0LGUpe3JldHVybiB0aGlzLngrPXQueCplLHRoaXMueSs9dC55KmUsdGhpcy56Kz10LnoqZSx0aGlzLncrPXQudyplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzLnctPXQudyx0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzLnotPXQsdGhpcy53LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzLnc9dC53LWUudyx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzLnoqPXQueix0aGlzLncqPXQudyx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzLncqPXQsdGhpc31hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscz10aGlzLnoscj10aGlzLncsbz10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9b1swXSplK29bNF0qbitvWzhdKnMrb1sxMl0qcix0aGlzLnk9b1sxXSplK29bNV0qbitvWzldKnMrb1sxM10qcix0aGlzLno9b1syXSplK29bNl0qbitvWzEwXSpzK29bMTRdKnIsdGhpcy53PW9bM10qZStvWzddKm4rb1sxMV0qcytvWzE1XSpyLHRoaXN9ZGl2aWRlKHQpe3JldHVybiB0aGlzLngvPXQueCx0aGlzLnkvPXQueSx0aGlzLnovPXQueix0aGlzLncvPXQudyx0aGlzfWRpdmlkZVNjYWxhcih0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxL3QpfXNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uKHQpe3RoaXMudz0yKk1hdGguYWNvcyh0LncpO2NvbnN0IGU9TWF0aC5zcXJ0KDEtdC53KnQudyk7cmV0dXJuIGU8MWUtND8odGhpcy54PTEsdGhpcy55PTAsdGhpcy56PTApOih0aGlzLng9dC54L2UsdGhpcy55PXQueS9lLHRoaXMuej10LnovZSksdGhpc31zZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXgodCl7bGV0IGUsbixzLHI7Y29uc3QgYz10LmVsZW1lbnRzLGw9Y1swXSxoPWNbNF0sdT1jWzhdLGY9Y1sxXSxkPWNbNV0scD1jWzldLHk9Y1syXSxtPWNbNl0sZz1jWzEwXTtpZihNYXRoLmFicyhoLWYpPC4wMSYmTWF0aC5hYnModS15KTwuMDEmJk1hdGguYWJzKHAtbSk8LjAxKXtpZihNYXRoLmFicyhoK2YpPC4xJiZNYXRoLmFicyh1K3kpPC4xJiZNYXRoLmFicyhwK20pPC4xJiZNYXRoLmFicyhsK2QrZy0zKTwuMSlyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCksdGhpcztlPU1hdGguUEk7Y29uc3Qgdz0obCsxKS8yLHg9KGQrMSkvMixNPShnKzEpLzIsQT0oaCtmKS80LFM9KHUreSkvNCx2PShwK20pLzQ7cmV0dXJuIHc+eCYmdz5NP3c8LjAxPyhuPTAscz0uNzA3MTA2NzgxLHI9LjcwNzEwNjc4MSk6KG49TWF0aC5zcXJ0KHcpLHM9QS9uLHI9Uy9uKTp4Pk0/eDwuMDE/KG49LjcwNzEwNjc4MSxzPTAscj0uNzA3MTA2NzgxKToocz1NYXRoLnNxcnQoeCksbj1BL3Mscj12L3MpOk08LjAxPyhuPS43MDcxMDY3ODEscz0uNzA3MTA2NzgxLHI9MCk6KHI9TWF0aC5zcXJ0KE0pLG49Uy9yLHM9di9yKSx0aGlzLnNldChuLHMscixlKSx0aGlzfWxldCBiPU1hdGguc3FydCgobS1wKSoobS1wKSsodS15KSoodS15KSsoZi1oKSooZi1oKSk7cmV0dXJuIE1hdGguYWJzKGIpPC4wMDEmJihiPTEpLHRoaXMueD0obS1wKS9iLHRoaXMueT0odS15KS9iLHRoaXMuej0oZi1oKS9iLHRoaXMudz1NYXRoLmFjb3MoKGwrZCtnLTEpLzIpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWVbMTJdLHRoaXMueT1lWzEzXSx0aGlzLno9ZVsxNF0sdGhpcy53PWVbMTVdLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5taW4odGhpcy53LHQudyksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpcy56PU1hdGgubWF4KHRoaXMueix0LnopLHRoaXMudz1NYXRoLm1heCh0aGlzLncsdC53KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1HKHRoaXMueCx0LngsZS54KSx0aGlzLnk9Ryh0aGlzLnksdC55LGUueSksdGhpcy56PUcodGhpcy56LHQueixlLnopLHRoaXMudz1HKHRoaXMudyx0LncsZS53KSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1HKHRoaXMueCx0LGUpLHRoaXMueT1HKHRoaXMueSx0LGUpLHRoaXMuej1HKHRoaXMueix0LGUpLHRoaXMudz1HKHRoaXMudyx0LGUpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKEcobix0LGUpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpcy56PU1hdGguZmxvb3IodGhpcy56KSx0aGlzLnc9TWF0aC5mbG9vcih0aGlzLncpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzLnc9TWF0aC5jZWlsKHRoaXMudyksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpcy56PU1hdGgucm91bmQodGhpcy56KSx0aGlzLnc9TWF0aC5yb3VuZCh0aGlzLncpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpcy53PU1hdGgudHJ1bmModGhpcy53KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzLno9LXRoaXMueix0aGlzLnc9LXRoaXMudyx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55K3RoaXMueip0LnordGhpcy53KnQud31sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMudyl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopK01hdGguYWJzKHRoaXMudyl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzLnorPSh0LnotdGhpcy56KSplLHRoaXMudys9KHQudy10aGlzLncpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzLno9dC56KyhlLnotdC56KSpuLHRoaXMudz10LncrKGUudy10LncpKm4sdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnomJnQudz09PXRoaXMud31mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXMuej10W2UrMl0sdGhpcy53PXRbZSszXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdFtlKzNdPXRoaXMudyx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpcy53PXQuZ2V0VyhlKSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzLno9TWF0aC5yYW5kb20oKSx0aGlzLnc9TWF0aC5yYW5kb20oKSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnkseWllbGQgdGhpcy56LHlpZWxkIHRoaXMud319Y2xhc3MgbXR7Y29uc3RydWN0b3IodD1uZXcgVCgxLzAsMS8wLDEvMCksZT1uZXcgVCgtMS8wLC0xLzAsLTEvMCkpe3RoaXMuaXNCb3gzPSEwLHRoaXMubWluPXQsdGhpcy5tYXg9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5taW4uY29weSh0KSx0aGlzLm1heC5jb3B5KGUpLHRoaXN9c2V0RnJvbUFycmF5KHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSs9Myl0aGlzLmV4cGFuZEJ5UG9pbnQoY2UuZnJvbUFycmF5KHQsZSkpO3JldHVybiB0aGlzfXNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IGU9MCxuPXQuY291bnQ7ZTxuO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQoY2UuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpKTtyZXR1cm4gdGhpc31zZXRGcm9tUG9pbnRzKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMuZXhwYW5kQnlQb2ludCh0W2VdKTtyZXR1cm4gdGhpc31zZXRGcm9tQ2VudGVyQW5kU2l6ZSh0LGUpe2NvbnN0IG49Y2UuY29weShlKS5tdWx0aXBseVNjYWxhciguNSk7cmV0dXJuIHRoaXMubWluLmNvcHkodCkuc3ViKG4pLHRoaXMubWF4LmNvcHkodCkuYWRkKG4pLHRoaXN9c2V0RnJvbU9iamVjdCh0LGU9ITEpe3JldHVybiB0aGlzLm1ha2VFbXB0eSgpLHRoaXMuZXhwYW5kQnlPYmplY3QodCxlKX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpc31tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5taW4ueD10aGlzLm1pbi55PXRoaXMubWluLno9MS8wLHRoaXMubWF4Lng9dGhpcy5tYXgueT10aGlzLm1heC56PS0xLzAsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMubWF4Lng8dGhpcy5taW4ueHx8dGhpcy5tYXgueTx0aGlzLm1pbi55fHx0aGlzLm1heC56PHRoaXMubWluLnp9Z2V0Q2VudGVyKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDAsMCk6dC5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9Z2V0U2l6ZSh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuc3ViVmVjdG9ycyh0aGlzLm1heCx0aGlzLm1pbil9ZXhwYW5kQnlQb2ludCh0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQpLHRoaXMubWF4Lm1heCh0KSx0aGlzfWV4cGFuZEJ5VmVjdG9yKHQpe3JldHVybiB0aGlzLm1pbi5zdWIodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXhwYW5kQnlTY2FsYXIodCl7cmV0dXJuIHRoaXMubWluLmFkZFNjYWxhcigtdCksdGhpcy5tYXguYWRkU2NhbGFyKHQpLHRoaXN9ZXhwYW5kQnlPYmplY3QodCxlPSExKXt0LnVwZGF0ZVdvcmxkTWF0cml4KCExLCExKTtjb25zdCBuPXQuZ2VvbWV0cnk7aWYobiE9PXZvaWQgMCl7Y29uc3Qgcj1uLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZihlPT09ITAmJnIhPT12b2lkIDAmJnQuaXNJbnN0YW5jZWRNZXNoIT09ITApZm9yKGxldCBvPTAsYT1yLmNvdW50O288YTtvKyspdC5pc01lc2g9PT0hMD90LmdldFZlcnRleFBvc2l0aW9uKG8sY2UpOmNlLmZyb21CdWZmZXJBdHRyaWJ1dGUocixvKSxjZS5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy5leHBhbmRCeVBvaW50KGNlKTtlbHNlIHQuYm91bmRpbmdCb3ghPT12b2lkIDA/KHQuYm91bmRpbmdCb3g9PT1udWxsJiZ0LmNvbXB1dGVCb3VuZGluZ0JveCgpLGhzLmNvcHkodC5ib3VuZGluZ0JveCkpOihuLmJvdW5kaW5nQm94PT09bnVsbCYmbi5jb21wdXRlQm91bmRpbmdCb3goKSxocy5jb3B5KG4uYm91bmRpbmdCb3gpKSxocy5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy51bmlvbihocyl9Y29uc3Qgcz10LmNoaWxkcmVuO2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKyl0aGlzLmV4cGFuZEJ5T2JqZWN0KHNbcl0sZSk7cmV0dXJuIHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdC54Pj10aGlzLm1pbi54JiZ0Lng8PXRoaXMubWF4LngmJnQueT49dGhpcy5taW4ueSYmdC55PD10aGlzLm1heC55JiZ0Lno+PXRoaXMubWluLnomJnQuejw9dGhpcy5tYXguen1jb250YWluc0JveCh0KXtyZXR1cm4gdGhpcy5taW4ueDw9dC5taW4ueCYmdC5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9dC5taW4ueSYmdC5tYXgueTw9dGhpcy5tYXgueSYmdGhpcy5taW4uejw9dC5taW4ueiYmdC5tYXguejw9dGhpcy5tYXguen1nZXRQYXJhbWV0ZXIodCxlKXtyZXR1cm4gZS5zZXQoKHQueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwodC55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpLCh0LnotdGhpcy5taW4ueikvKHRoaXMubWF4LnotdGhpcy5taW4ueikpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQubWF4Lng+PXRoaXMubWluLngmJnQubWluLng8PXRoaXMubWF4LngmJnQubWF4Lnk+PXRoaXMubWluLnkmJnQubWluLnk8PXRoaXMubWF4LnkmJnQubWF4Lno+PXRoaXMubWluLnomJnQubWluLno8PXRoaXMubWF4Lnp9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQuY2VudGVyLGNlKSxjZS5kaXN0YW5jZVRvU3F1YXJlZCh0LmNlbnRlcik8PXQucmFkaXVzKnQucmFkaXVzfWludGVyc2VjdHNQbGFuZSh0KXtsZXQgZSxuO3JldHVybiB0Lm5vcm1hbC54PjA/KGU9dC5ub3JtYWwueCp0aGlzLm1pbi54LG49dC5ub3JtYWwueCp0aGlzLm1heC54KTooZT10Lm5vcm1hbC54KnRoaXMubWF4Lngsbj10Lm5vcm1hbC54KnRoaXMubWluLngpLHQubm9ybWFsLnk+MD8oZSs9dC5ub3JtYWwueSp0aGlzLm1pbi55LG4rPXQubm9ybWFsLnkqdGhpcy5tYXgueSk6KGUrPXQubm9ybWFsLnkqdGhpcy5tYXgueSxuKz10Lm5vcm1hbC55KnRoaXMubWluLnkpLHQubm9ybWFsLno+MD8oZSs9dC5ub3JtYWwueip0aGlzLm1pbi56LG4rPXQubm9ybWFsLnoqdGhpcy5tYXgueik6KGUrPXQubm9ybWFsLnoqdGhpcy5tYXgueixuKz10Lm5vcm1hbC56KnRoaXMubWluLnopLGU8PS10LmNvbnN0YW50JiZuPj0tdC5jb25zdGFudH1pbnRlcnNlY3RzVHJpYW5nbGUodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuITE7dGhpcy5nZXRDZW50ZXIoYmkpLHVzLnN1YlZlY3RvcnModGhpcy5tYXgsYmkpLE5uLnN1YlZlY3RvcnModC5hLGJpKSxSbi5zdWJWZWN0b3JzKHQuYixiaSksTG4uc3ViVmVjdG9ycyh0LmMsYmkpLFplLnN1YlZlY3RvcnMoUm4sTm4pLEplLnN1YlZlY3RvcnMoTG4sUm4pLGhuLnN1YlZlY3RvcnMoTm4sTG4pO2xldCBlPVswLC1aZS56LFplLnksMCwtSmUueixKZS55LDAsLWhuLnosaG4ueSxaZS56LDAsLVplLngsSmUueiwwLC1KZS54LGhuLnosMCwtaG4ueCwtWmUueSxaZS54LDAsLUplLnksSmUueCwwLC1obi55LGhuLngsMF07cmV0dXJuIWNvKGUsTm4sUm4sTG4sdXMpfHwoZT1bMSwwLDAsMCwxLDAsMCwwLDFdLCFjbyhlLE5uLFJuLExuLHVzKSk/ITE6KGZzLmNyb3NzVmVjdG9ycyhaZSxKZSksZT1bZnMueCxmcy55LGZzLnpdLGNvKGUsTm4sUm4sTG4sdXMpKX1jbGFtcFBvaW50KHQsZSl7cmV0dXJuIGUuY29weSh0KS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCl9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiB0aGlzLmNsYW1wUG9pbnQodCxjZSkuZGlzdGFuY2VUbyh0KX1nZXRCb3VuZGluZ1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5tYWtlRW1wdHkoKToodGhpcy5nZXRDZW50ZXIodC5jZW50ZXIpLHQucmFkaXVzPXRoaXMuZ2V0U2l6ZShjZSkubGVuZ3RoKCkqLjUpLHR9aW50ZXJzZWN0KHQpe3JldHVybiB0aGlzLm1pbi5tYXgodC5taW4pLHRoaXMubWF4Lm1pbih0Lm1heCksdGhpcy5pc0VtcHR5KCkmJnRoaXMubWFrZUVtcHR5KCksdGhpc311bmlvbih0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQubWluKSx0aGlzLm1heC5tYXgodC5tYXgpLHRoaXN9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90aGlzOih2ZVswXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSx2ZVsxXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx2ZVsyXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSx2ZVszXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx2ZVs0XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSx2ZVs1XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx2ZVs2XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSx2ZVs3XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldEZyb21Qb2ludHModmUpLHRoaXMpfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5taW4uYWRkKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5taW4uZXF1YWxzKHRoaXMubWluKSYmdC5tYXguZXF1YWxzKHRoaXMubWF4KX10b0pTT04oKXtyZXR1cm57bWluOnRoaXMubWluLnRvQXJyYXkoKSxtYXg6dGhpcy5tYXgudG9BcnJheSgpfX1mcm9tSlNPTih0KXtyZXR1cm4gdGhpcy5taW4uZnJvbUFycmF5KHQubWluKSx0aGlzLm1heC5mcm9tQXJyYXkodC5tYXgpLHRoaXN9fWNvbnN0IHZlPVtuZXcgVCxuZXcgVCxuZXcgVCxuZXcgVCxuZXcgVCxuZXcgVCxuZXcgVCxuZXcgVF0sY2U9bmV3IFQsaHM9bmV3IG10LE5uPW5ldyBULFJuPW5ldyBULExuPW5ldyBULFplPW5ldyBULEplPW5ldyBULGhuPW5ldyBULGJpPW5ldyBULHVzPW5ldyBULGZzPW5ldyBULHVuPW5ldyBUO2Z1bmN0aW9uIGNvKGksdCxlLG4scyl7Zm9yKGxldCByPTAsbz1pLmxlbmd0aC0zO3I8PW87cis9Myl7dW4uZnJvbUFycmF5KGkscik7Y29uc3QgYT1zLngqTWF0aC5hYnModW4ueCkrcy55Kk1hdGguYWJzKHVuLnkpK3MueipNYXRoLmFicyh1bi56KSxjPXQuZG90KHVuKSxsPWUuZG90KHVuKSxoPW4uZG90KHVuKTtpZihNYXRoLm1heCgtTWF0aC5tYXgoYyxsLGgpLE1hdGgubWluKGMsbCxoKSk+YSlyZXR1cm4hMX1yZXR1cm4hMH1jb25zdCBjZj1uZXcgbXQsTWk9bmV3IFQsbG89bmV3IFQ7Y2xhc3MgaG97Y29uc3RydWN0b3IodD1uZXcgVCxlPS0xKXt0aGlzLmlzU3BoZXJlPSEwLHRoaXMuY2VudGVyPXQsdGhpcy5yYWRpdXM9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0KSx0aGlzLnJhZGl1cz1lLHRoaXN9c2V0RnJvbVBvaW50cyh0LGUpe2NvbnN0IG49dGhpcy5jZW50ZXI7ZSE9PXZvaWQgMD9uLmNvcHkoZSk6Y2Yuc2V0RnJvbVBvaW50cyh0KS5nZXRDZW50ZXIobik7bGV0IHM9MDtmb3IobGV0IHI9MCxvPXQubGVuZ3RoO3I8bztyKyspcz1NYXRoLm1heChzLG4uZGlzdGFuY2VUb1NxdWFyZWQodFtyXSkpO3JldHVybiB0aGlzLnJhZGl1cz1NYXRoLnNxcnQocyksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5yYWRpdXM8MH1tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5jZW50ZXIuc2V0KDAsMCwwKSx0aGlzLnJhZGl1cz0tMSx0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIHQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD10aGlzLnJhZGl1cyp0aGlzLnJhZGl1c31kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHQuZGlzdGFuY2VUbyh0aGlzLmNlbnRlciktdGhpcy5yYWRpdXN9aW50ZXJzZWN0c1NwaGVyZSh0KXtjb25zdCBlPXRoaXMucmFkaXVzK3QucmFkaXVzO3JldHVybiB0LmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PWUqZX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNTcGhlcmUodGhpcyl9aW50ZXJzZWN0c1BsYW5lKHQpe3JldHVybiBNYXRoLmFicyh0LmRpc3RhbmNlVG9Qb2ludCh0aGlzLmNlbnRlcikpPD10aGlzLnJhZGl1c31jbGFtcFBvaW50KHQsZSl7Y29uc3Qgbj10aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0KTtyZXR1cm4gZS5jb3B5KHQpLG4+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMmJihlLnN1Yih0aGlzLmNlbnRlcikubm9ybWFsaXplKCksZS5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cykuYWRkKHRoaXMuY2VudGVyKSksZX1nZXRCb3VuZGluZ0JveCh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/KHQubWFrZUVtcHR5KCksdCk6KHQuc2V0KHRoaXMuY2VudGVyLHRoaXMuY2VudGVyKSx0LmV4cGFuZEJ5U2NhbGFyKHRoaXMucmFkaXVzKSx0KX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuY2VudGVyLmFwcGx5TWF0cml4NCh0KSx0aGlzLnJhZGl1cz10aGlzLnJhZGl1cyp0LmdldE1heFNjYWxlT25BeGlzKCksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMuY2VudGVyLmFkZCh0KSx0aGlzfWV4cGFuZEJ5UG9pbnQodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodCksdGhpcy5yYWRpdXM9MCx0aGlzO01pLnN1YlZlY3RvcnModCx0aGlzLmNlbnRlcik7Y29uc3QgZT1NaS5sZW5ndGhTcSgpO2lmKGU+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMpe2NvbnN0IG49TWF0aC5zcXJ0KGUpLHM9KG4tdGhpcy5yYWRpdXMpKi41O3RoaXMuY2VudGVyLmFkZFNjYWxlZFZlY3RvcihNaSxzL24pLHRoaXMucmFkaXVzKz1zfXJldHVybiB0aGlzfXVuaW9uKHQpe3JldHVybiB0LmlzRW1wdHkoKT90aGlzOnRoaXMuaXNFbXB0eSgpPyh0aGlzLmNvcHkodCksdGhpcyk6KHRoaXMuY2VudGVyLmVxdWFscyh0LmNlbnRlcik9PT0hMD90aGlzLnJhZGl1cz1NYXRoLm1heCh0aGlzLnJhZGl1cyx0LnJhZGl1cyk6KGxvLnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5jZW50ZXIpLnNldExlbmd0aCh0LnJhZGl1cyksdGhpcy5leHBhbmRCeVBvaW50KE1pLmNvcHkodC5jZW50ZXIpLmFkZChsbykpLHRoaXMuZXhwYW5kQnlQb2ludChNaS5jb3B5KHQuY2VudGVyKS5zdWIobG8pKSksdGhpcyl9ZXF1YWxzKHQpe3JldHVybiB0LmNlbnRlci5lcXVhbHModGhpcy5jZW50ZXIpJiZ0LnJhZGl1cz09PXRoaXMucmFkaXVzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX10b0pTT04oKXtyZXR1cm57cmFkaXVzOnRoaXMucmFkaXVzLGNlbnRlcjp0aGlzLmNlbnRlci50b0FycmF5KCl9fWZyb21KU09OKHQpe3JldHVybiB0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzLmNlbnRlci5mcm9tQXJyYXkodC5jZW50ZXIpLHRoaXN9fWNvbnN0IHplPW5ldyBULHVvPW5ldyBULGRzPW5ldyBULFllPW5ldyBULGZvPW5ldyBULHBzPW5ldyBULHBvPW5ldyBUO2NsYXNzIHlve2NvbnN0cnVjdG9yKHQ9bmV3IFQsZT1uZXcgVCgwLDAsLTEpKXt0aGlzLm9yaWdpbj10LHRoaXMuZGlyZWN0aW9uPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodCksdGhpcy5kaXJlY3Rpb24uY29weShlKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodC5vcmlnaW4pLHRoaXMuZGlyZWN0aW9uLmNvcHkodC5kaXJlY3Rpb24pLHRoaXN9YXQodCxlKXtyZXR1cm4gZS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sdCl9bG9va0F0KHQpe3JldHVybiB0aGlzLmRpcmVjdGlvbi5jb3B5KHQpLnN1Yih0aGlzLm9yaWdpbikubm9ybWFsaXplKCksdGhpc31yZWNhc3QodCl7cmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodGhpcy5hdCh0LHplKSksdGhpc31jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSl7ZS5zdWJWZWN0b3JzKHQsdGhpcy5vcmlnaW4pO2NvbnN0IG49ZS5kb3QodGhpcy5kaXJlY3Rpb24pO3JldHVybiBuPDA/ZS5jb3B5KHRoaXMub3JpZ2luKTplLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbixuKX1kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlU3FUb1BvaW50KHQpKX1kaXN0YW5jZVNxVG9Qb2ludCh0KXtjb25zdCBlPXplLnN1YlZlY3RvcnModCx0aGlzLm9yaWdpbikuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gZTwwP3RoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKHQpOih6ZS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sZSksemUuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlU3FUb1NlZ21lbnQodCxlLG4scyl7dW8uY29weSh0KS5hZGQoZSkubXVsdGlwbHlTY2FsYXIoLjUpLGRzLmNvcHkoZSkuc3ViKHQpLm5vcm1hbGl6ZSgpLFllLmNvcHkodGhpcy5vcmlnaW4pLnN1Yih1byk7Y29uc3Qgcj10LmRpc3RhbmNlVG8oZSkqLjUsbz0tdGhpcy5kaXJlY3Rpb24uZG90KGRzKSxhPVllLmRvdCh0aGlzLmRpcmVjdGlvbiksYz0tWWUuZG90KGRzKSxsPVllLmxlbmd0aFNxKCksaD1NYXRoLmFicygxLW8qbyk7bGV0IHUsZixkLHA7aWYoaD4wKWlmKHU9bypjLWEsZj1vKmEtYyxwPXIqaCx1Pj0wKWlmKGY+PS1wKWlmKGY8PXApe2NvbnN0IHk9MS9oO3UqPXksZio9eSxkPXUqKHUrbypmKzIqYSkrZioobyp1K2YrMipjKStsfWVsc2UgZj1yLHU9TWF0aC5tYXgoMCwtKG8qZithKSksZD0tdSp1K2YqKGYrMipjKStsO2Vsc2UgZj0tcix1PU1hdGgubWF4KDAsLShvKmYrYSkpLGQ9LXUqdStmKihmKzIqYykrbDtlbHNlIGY8PS1wPyh1PU1hdGgubWF4KDAsLSgtbypyK2EpKSxmPXU+MD8tcjpNYXRoLm1pbihNYXRoLm1heCgtciwtYyksciksZD0tdSp1K2YqKGYrMipjKStsKTpmPD1wPyh1PTAsZj1NYXRoLm1pbihNYXRoLm1heCgtciwtYyksciksZD1mKihmKzIqYykrbCk6KHU9TWF0aC5tYXgoMCwtKG8qcithKSksZj11PjA/cjpNYXRoLm1pbihNYXRoLm1heCgtciwtYyksciksZD0tdSp1K2YqKGYrMipjKStsKTtlbHNlIGY9bz4wPy1yOnIsdT1NYXRoLm1heCgwLC0obypmK2EpKSxkPS11KnUrZiooZisyKmMpK2w7cmV0dXJuIG4mJm4uY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLHUpLHMmJnMuY29weSh1bykuYWRkU2NhbGVkVmVjdG9yKGRzLGYpLGR9aW50ZXJzZWN0U3BoZXJlKHQsZSl7emUuc3ViVmVjdG9ycyh0LmNlbnRlcix0aGlzLm9yaWdpbik7Y29uc3Qgbj16ZS5kb3QodGhpcy5kaXJlY3Rpb24pLHM9emUuZG90KHplKS1uKm4scj10LnJhZGl1cyp0LnJhZGl1cztpZihzPnIpcmV0dXJuIG51bGw7Y29uc3Qgbz1NYXRoLnNxcnQoci1zKSxhPW4tbyxjPW4rbztyZXR1cm4gYzwwP251bGw6YTwwP3RoaXMuYXQoYyxlKTp0aGlzLmF0KGEsZSl9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdC5yYWRpdXM8MD8hMTp0aGlzLmRpc3RhbmNlU3FUb1BvaW50KHQuY2VudGVyKTw9dC5yYWRpdXMqdC5yYWRpdXN9ZGlzdGFuY2VUb1BsYW5lKHQpe2NvbnN0IGU9dC5ub3JtYWwuZG90KHRoaXMuZGlyZWN0aW9uKTtpZihlPT09MClyZXR1cm4gdC5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pPT09MD8wOm51bGw7Y29uc3Qgbj0tKHRoaXMub3JpZ2luLmRvdCh0Lm5vcm1hbCkrdC5jb25zdGFudCkvZTtyZXR1cm4gbj49MD9uOm51bGx9aW50ZXJzZWN0UGxhbmUodCxlKXtjb25zdCBuPXRoaXMuZGlzdGFuY2VUb1BsYW5lKHQpO3JldHVybiBuPT09bnVsbD9udWxsOnRoaXMuYXQobixlKX1pbnRlcnNlY3RzUGxhbmUodCl7Y29uc3QgZT10LmRpc3RhbmNlVG9Qb2ludCh0aGlzLm9yaWdpbik7cmV0dXJuIGU9PT0wfHx0Lm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pKmU8MH1pbnRlcnNlY3RCb3godCxlKXtsZXQgbixzLHIsbyxhLGM7Y29uc3QgbD0xL3RoaXMuZGlyZWN0aW9uLngsaD0xL3RoaXMuZGlyZWN0aW9uLnksdT0xL3RoaXMuZGlyZWN0aW9uLnosZj10aGlzLm9yaWdpbjtyZXR1cm4gbD49MD8obj0odC5taW4ueC1mLngpKmwscz0odC5tYXgueC1mLngpKmwpOihuPSh0Lm1heC54LWYueCkqbCxzPSh0Lm1pbi54LWYueCkqbCksaD49MD8ocj0odC5taW4ueS1mLnkpKmgsbz0odC5tYXgueS1mLnkpKmgpOihyPSh0Lm1heC55LWYueSkqaCxvPSh0Lm1pbi55LWYueSkqaCksbj5vfHxyPnN8fCgocj5ufHxpc05hTihuKSkmJihuPXIpLChvPHN8fGlzTmFOKHMpKSYmKHM9byksdT49MD8oYT0odC5taW4uei1mLnopKnUsYz0odC5tYXguei1mLnopKnUpOihhPSh0Lm1heC56LWYueikqdSxjPSh0Lm1pbi56LWYueikqdSksbj5jfHxhPnMpfHwoKGE+bnx8biE9PW4pJiYobj1hKSwoYzxzfHxzIT09cykmJihzPWMpLHM8MCk/bnVsbDp0aGlzLmF0KG4+PTA/bjpzLGUpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHRoaXMuaW50ZXJzZWN0Qm94KHQsemUpIT09bnVsbH1pbnRlcnNlY3RUcmlhbmdsZSh0LGUsbixzLHIpe2ZvLnN1YlZlY3RvcnMoZSx0KSxwcy5zdWJWZWN0b3JzKG4sdCkscG8uY3Jvc3NWZWN0b3JzKGZvLHBzKTtsZXQgbz10aGlzLmRpcmVjdGlvbi5kb3QocG8pLGE7aWYobz4wKXtpZihzKXJldHVybiBudWxsO2E9MX1lbHNlIGlmKG88MClhPS0xLG89LW87ZWxzZSByZXR1cm4gbnVsbDtZZS5zdWJWZWN0b3JzKHRoaXMub3JpZ2luLHQpO2NvbnN0IGM9YSp0aGlzLmRpcmVjdGlvbi5kb3QocHMuY3Jvc3NWZWN0b3JzKFllLHBzKSk7aWYoYzwwKXJldHVybiBudWxsO2NvbnN0IGw9YSp0aGlzLmRpcmVjdGlvbi5kb3QoZm8uY3Jvc3MoWWUpKTtpZihsPDB8fGMrbD5vKXJldHVybiBudWxsO2NvbnN0IGg9LWEqWWUuZG90KHBvKTtyZXR1cm4gaDwwP251bGw6dGhpcy5hdChoL28scil9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLm9yaWdpbi5hcHBseU1hdHJpeDQodCksdGhpcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm9yaWdpbi5lcXVhbHModGhpcy5vcmlnaW4pJiZ0LmRpcmVjdGlvbi5lcXVhbHModGhpcy5kaXJlY3Rpb24pfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19Y2xhc3Mgc3R7Y29uc3RydWN0b3IodCxlLG4scyxyLG8sYSxjLGwsaCx1LGYsZCxwLHksbSl7c3QucHJvdG90eXBlLmlzTWF0cml4ND0hMCx0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSx0IT09dm9pZCAwJiZ0aGlzLnNldCh0LGUsbixzLHIsbyxhLGMsbCxoLHUsZixkLHAseSxtKX1zZXQodCxlLG4scyxyLG8sYSxjLGwsaCx1LGYsZCxwLHksbSl7Y29uc3QgZz10aGlzLmVsZW1lbnRzO3JldHVybiBnWzBdPXQsZ1s0XT1lLGdbOF09bixnWzEyXT1zLGdbMV09cixnWzVdPW8sZ1s5XT1hLGdbMTNdPWMsZ1syXT1sLGdbNl09aCxnWzEwXT11LGdbMTRdPWYsZ1szXT1kLGdbN109cCxnWzExXT15LGdbMTVdPW0sdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyBzdCgpLmZyb21BcnJheSh0aGlzLmVsZW1lbnRzKX1jb3B5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMF09blswXSxlWzFdPW5bMV0sZVsyXT1uWzJdLGVbM109blszXSxlWzRdPW5bNF0sZVs1XT1uWzVdLGVbNl09bls2XSxlWzddPW5bN10sZVs4XT1uWzhdLGVbOV09bls5XSxlWzEwXT1uWzEwXSxlWzExXT1uWzExXSxlWzEyXT1uWzEyXSxlWzEzXT1uWzEzXSxlWzE0XT1uWzE0XSxlWzE1XT1uWzE1XSx0aGlzfWNvcHlQb3NpdGlvbih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO3JldHVybiBlWzEyXT1uWzEyXSxlWzEzXT1uWzEzXSxlWzE0XT1uWzE0XSx0aGlzfXNldEZyb21NYXRyaXgzKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5zZXQoZVswXSxlWzNdLGVbNl0sMCxlWzFdLGVbNF0sZVs3XSwwLGVbMl0sZVs1XSxlWzhdLDAsMCwwLDAsMSksdGhpc31leHRyYWN0QmFzaXModCxlLG4pe3JldHVybiB0LnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywwKSxlLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywxKSxuLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywyKSx0aGlzfW1ha2VCYXNpcyh0LGUsbil7cmV0dXJuIHRoaXMuc2V0KHQueCxlLngsbi54LDAsdC55LGUueSxuLnksMCx0LnosZS56LG4ueiwwLDAsMCwwLDEpLHRoaXN9ZXh0cmFjdFJvdGF0aW9uKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHMscz0xL09uLnNldEZyb21NYXRyaXhDb2x1bW4odCwwKS5sZW5ndGgoKSxyPTEvT24uc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLG89MS9Pbi5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMikubGVuZ3RoKCk7cmV0dXJuIGVbMF09blswXSpzLGVbMV09blsxXSpzLGVbMl09blsyXSpzLGVbM109MCxlWzRdPW5bNF0qcixlWzVdPW5bNV0qcixlWzZdPW5bNl0qcixlWzddPTAsZVs4XT1uWzhdKm8sZVs5XT1uWzldKm8sZVsxMF09blsxMF0qbyxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wLGVbMTVdPTEsdGhpc31tYWtlUm90YXRpb25Gcm9tRXVsZXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC54LHM9dC55LHI9dC56LG89TWF0aC5jb3MobiksYT1NYXRoLnNpbihuKSxjPU1hdGguY29zKHMpLGw9TWF0aC5zaW4ocyksaD1NYXRoLmNvcyhyKSx1PU1hdGguc2luKHIpO2lmKHQub3JkZXI9PT0iWFlaIil7Y29uc3QgZj1vKmgsZD1vKnUscD1hKmgseT1hKnU7ZVswXT1jKmgsZVs0XT0tYyp1LGVbOF09bCxlWzFdPWQrcCpsLGVbNV09Zi15KmwsZVs5XT0tYSpjLGVbMl09eS1mKmwsZVs2XT1wK2QqbCxlWzEwXT1vKmN9ZWxzZSBpZih0Lm9yZGVyPT09IllYWiIpe2NvbnN0IGY9YypoLGQ9Yyp1LHA9bCpoLHk9bCp1O2VbMF09Zit5KmEsZVs0XT1wKmEtZCxlWzhdPW8qbCxlWzFdPW8qdSxlWzVdPW8qaCxlWzldPS1hLGVbMl09ZCphLXAsZVs2XT15K2YqYSxlWzEwXT1vKmN9ZWxzZSBpZih0Lm9yZGVyPT09IlpYWSIpe2NvbnN0IGY9YypoLGQ9Yyp1LHA9bCpoLHk9bCp1O2VbMF09Zi15KmEsZVs0XT0tbyp1LGVbOF09cCtkKmEsZVsxXT1kK3AqYSxlWzVdPW8qaCxlWzldPXktZiphLGVbMl09LW8qbCxlWzZdPWEsZVsxMF09bypjfWVsc2UgaWYodC5vcmRlcj09PSJaWVgiKXtjb25zdCBmPW8qaCxkPW8qdSxwPWEqaCx5PWEqdTtlWzBdPWMqaCxlWzRdPXAqbC1kLGVbOF09ZipsK3ksZVsxXT1jKnUsZVs1XT15KmwrZixlWzldPWQqbC1wLGVbMl09LWwsZVs2XT1hKmMsZVsxMF09bypjfWVsc2UgaWYodC5vcmRlcj09PSJZWlgiKXtjb25zdCBmPW8qYyxkPW8qbCxwPWEqYyx5PWEqbDtlWzBdPWMqaCxlWzRdPXktZip1LGVbOF09cCp1K2QsZVsxXT11LGVbNV09bypoLGVbOV09LWEqaCxlWzJdPS1sKmgsZVs2XT1kKnUrcCxlWzEwXT1mLXkqdX1lbHNlIGlmKHQub3JkZXI9PT0iWFpZIil7Y29uc3QgZj1vKmMsZD1vKmwscD1hKmMseT1hKmw7ZVswXT1jKmgsZVs0XT0tdSxlWzhdPWwqaCxlWzFdPWYqdSt5LGVbNV09bypoLGVbOV09ZCp1LXAsZVsyXT1wKnUtZCxlWzZdPWEqaCxlWzEwXT15KnUrZn1yZXR1cm4gZVszXT0wLGVbN109MCxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wLGVbMTVdPTEsdGhpc31tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy5jb21wb3NlKGxmLHQsaGYpfWxvb2tBdCh0LGUsbil7Y29uc3Qgcz10aGlzLmVsZW1lbnRzO3JldHVybiBEdC5zdWJWZWN0b3JzKHQsZSksRHQubGVuZ3RoU3EoKT09PTAmJihEdC56PTEpLER0Lm5vcm1hbGl6ZSgpLGplLmNyb3NzVmVjdG9ycyhuLER0KSxqZS5sZW5ndGhTcSgpPT09MCYmKE1hdGguYWJzKG4ueik9PT0xP0R0LngrPTFlLTQ6RHQueis9MWUtNCxEdC5ub3JtYWxpemUoKSxqZS5jcm9zc1ZlY3RvcnMobixEdCkpLGplLm5vcm1hbGl6ZSgpLHlzLmNyb3NzVmVjdG9ycyhEdCxqZSksc1swXT1qZS54LHNbNF09eXMueCxzWzhdPUR0Lngsc1sxXT1qZS55LHNbNV09eXMueSxzWzldPUR0Lnksc1syXT1qZS56LHNbNl09eXMueixzWzEwXT1EdC56LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLHQpfXByZW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModCx0aGlzKX1tdWx0aXBseU1hdHJpY2VzKHQsZSl7Y29uc3Qgbj10LmVsZW1lbnRzLHM9ZS5lbGVtZW50cyxyPXRoaXMuZWxlbWVudHMsbz1uWzBdLGE9bls0XSxjPW5bOF0sbD1uWzEyXSxoPW5bMV0sdT1uWzVdLGY9bls5XSxkPW5bMTNdLHA9blsyXSx5PW5bNl0sbT1uWzEwXSxnPW5bMTRdLGI9blszXSx3PW5bN10seD1uWzExXSxNPW5bMTVdLEE9c1swXSxTPXNbNF0sdj1zWzhdLF89c1sxMl0sRT1zWzFdLHo9c1s1XSxDPXNbOV0sUD1zWzEzXSxGPXNbMl0sQj1zWzZdLEk9c1sxMF0sUj1zWzE0XSwkPXNbM10sVj1zWzddLG50PXNbMTFdLHh0PXNbMTVdO3JldHVybiByWzBdPW8qQSthKkUrYypGK2wqJCxyWzRdPW8qUythKnorYypCK2wqVixyWzhdPW8qdithKkMrYypJK2wqbnQsclsxMl09bypfK2EqUCtjKlIrbCp4dCxyWzFdPWgqQSt1KkUrZipGK2QqJCxyWzVdPWgqUyt1KnorZipCK2QqVixyWzldPWgqdit1KkMrZipJK2QqbnQsclsxM109aCpfK3UqUCtmKlIrZCp4dCxyWzJdPXAqQSt5KkUrbSpGK2cqJCxyWzZdPXAqUyt5KnorbSpCK2cqVixyWzEwXT1wKnYreSpDK20qSStnKm50LHJbMTRdPXAqXyt5KlArbSpSK2cqeHQsclszXT1iKkErdypFK3gqRitNKiQscls3XT1iKlMrdyp6K3gqQitNKlYsclsxMV09Yip2K3cqQyt4KkkrTSpudCxyWzE1XT1iKl8rdypQK3gqUitNKnh0LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbNF0qPXQsZVs4XSo9dCxlWzEyXSo9dCxlWzFdKj10LGVbNV0qPXQsZVs5XSo9dCxlWzEzXSo9dCxlWzJdKj10LGVbNl0qPXQsZVsxMF0qPXQsZVsxNF0qPXQsZVszXSo9dCxlWzddKj10LGVbMTFdKj10LGVbMTVdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFs0XSxzPXRbOF0scj10WzEyXSxvPXRbMV0sYT10WzVdLGM9dFs5XSxsPXRbMTNdLGg9dFsyXSx1PXRbNl0sZj10WzEwXSxkPXRbMTRdLHA9dFszXSx5PXRbN10sbT10WzExXSxnPXRbMTVdO3JldHVybiBwKigrcipjKnUtcypsKnUtciphKmYrbipsKmYrcyphKmQtbipjKmQpK3kqKCtlKmMqZC1lKmwqZityKm8qZi1zKm8qZCtzKmwqaC1yKmMqaCkrbSooK2UqbCp1LWUqYSpkLXIqbyp1K24qbypkK3IqYSpoLW4qbCpoKStnKigtcyphKmgtZSpjKnUrZSphKmYrcypvKnUtbipvKmYrbipjKmgpfXRyYW5zcG9zZSgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cztsZXQgZTtyZXR1cm4gZT10WzFdLHRbMV09dFs0XSx0WzRdPWUsZT10WzJdLHRbMl09dFs4XSx0WzhdPWUsZT10WzZdLHRbNl09dFs5XSx0WzldPWUsZT10WzNdLHRbM109dFsxMl0sdFsxMl09ZSxlPXRbN10sdFs3XT10WzEzXSx0WzEzXT1lLGU9dFsxMV0sdFsxMV09dFsxNF0sdFsxNF09ZSx0aGlzfXNldFBvc2l0aW9uKHQsZSxuKXtjb25zdCBzPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQuaXNWZWN0b3IzPyhzWzEyXT10Lngsc1sxM109dC55LHNbMTRdPXQueik6KHNbMTJdPXQsc1sxM109ZSxzWzE0XT1uKSx0aGlzfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLHM9dFsyXSxyPXRbM10sbz10WzRdLGE9dFs1XSxjPXRbNl0sbD10WzddLGg9dFs4XSx1PXRbOV0sZj10WzEwXSxkPXRbMTFdLHA9dFsxMl0seT10WzEzXSxtPXRbMTRdLGc9dFsxNV0sYj11Km0qbC15KmYqbCt5KmMqZC1hKm0qZC11KmMqZythKmYqZyx3PXAqZipsLWgqbSpsLXAqYypkK28qbSpkK2gqYypnLW8qZipnLHg9aCp5KmwtcCp1KmwrcCphKmQtbyp5KmQtaCphKmcrbyp1KmcsTT1wKnUqYy1oKnkqYy1wKmEqZitvKnkqZitoKmEqbS1vKnUqbSxBPWUqYituKncrcyp4K3IqTTtpZihBPT09MClyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgUz0xL0E7cmV0dXJuIHRbMF09YipTLHRbMV09KHkqZipyLXUqbSpyLXkqcypkK24qbSpkK3UqcypnLW4qZipnKSpTLHRbMl09KGEqbSpyLXkqYypyK3kqcypsLW4qbSpsLWEqcypnK24qYypnKSpTLHRbM109KHUqYypyLWEqZipyLXUqcypsK24qZipsK2EqcypkLW4qYypkKSpTLHRbNF09dypTLHRbNV09KGgqbSpyLXAqZipyK3AqcypkLWUqbSpkLWgqcypnK2UqZipnKSpTLHRbNl09KHAqYypyLW8qbSpyLXAqcypsK2UqbSpsK28qcypnLWUqYypnKSpTLHRbN109KG8qZipyLWgqYypyK2gqcypsLWUqZipsLW8qcypkK2UqYypkKSpTLHRbOF09eCpTLHRbOV09KHAqdSpyLWgqeSpyLXAqbipkK2UqeSpkK2gqbipnLWUqdSpnKSpTLHRbMTBdPShvKnkqci1wKmEqcitwKm4qbC1lKnkqbC1vKm4qZytlKmEqZykqUyx0WzExXT0oaCphKnItbyp1KnItaCpuKmwrZSp1KmwrbypuKmQtZSphKmQpKlMsdFsxMl09TSpTLHRbMTNdPShoKnkqcy1wKnUqcytwKm4qZi1lKnkqZi1oKm4qbStlKnUqbSkqUyx0WzE0XT0ocCphKnMtbyp5KnMtcCpuKmMrZSp5KmMrbypuKm0tZSphKm0pKlMsdFsxNV09KG8qdSpzLWgqYSpzK2gqbipjLWUqdSpjLW8qbipmK2UqYSpmKSpTLHRoaXN9c2NhbGUodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC54LHM9dC55LHI9dC56O3JldHVybiBlWzBdKj1uLGVbNF0qPXMsZVs4XSo9cixlWzFdKj1uLGVbNV0qPXMsZVs5XSo9cixlWzJdKj1uLGVbNl0qPXMsZVsxMF0qPXIsZVszXSo9bixlWzddKj1zLGVbMTFdKj1yLHRoaXN9Z2V0TWF4U2NhbGVPbkF4aXMoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSxuPXRbNF0qdFs0XSt0WzVdKnRbNV0rdFs2XSp0WzZdLHM9dFs4XSp0WzhdK3RbOV0qdFs5XSt0WzEwXSp0WzEwXTtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgubWF4KGUsbixzKSl9bWFrZVRyYW5zbGF0aW9uKHQsZSxuKXtyZXR1cm4gdC5pc1ZlY3RvcjM/dGhpcy5zZXQoMSwwLDAsdC54LDAsMSwwLHQueSwwLDAsMSx0LnosMCwwLDAsMSk6dGhpcy5zZXQoMSwwLDAsdCwwLDEsMCxlLDAsMCwxLG4sMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25YKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLGUsLW4sMCwwLG4sZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWSh0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsMCxuLDAsMCwxLDAsMCwtbiwwLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbloodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLC1uLDAsMCxuLGUsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25BeGlzKHQsZSl7Y29uc3Qgbj1NYXRoLmNvcyhlKSxzPU1hdGguc2luKGUpLHI9MS1uLG89dC54LGE9dC55LGM9dC56LGw9cipvLGg9ciphO3JldHVybiB0aGlzLnNldChsKm8rbixsKmEtcypjLGwqYytzKmEsMCxsKmErcypjLGgqYStuLGgqYy1zKm8sMCxsKmMtcyphLGgqYytzKm8scipjKmMrbiwwLDAsMCwwLDEpLHRoaXN9bWFrZVNjYWxlKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCwwLGUsMCwwLDAsMCxuLDAsMCwwLDAsMSksdGhpc31tYWtlU2hlYXIodCxlLG4scyxyLG8pe3JldHVybiB0aGlzLnNldCgxLG4sciwwLHQsMSxvLDAsZSxzLDEsMCwwLDAsMCwxKSx0aGlzfWNvbXBvc2UodCxlLG4pe2NvbnN0IHM9dGhpcy5lbGVtZW50cyxyPWUuX3gsbz1lLl95LGE9ZS5feixjPWUuX3csbD1yK3IsaD1vK28sdT1hK2EsZj1yKmwsZD1yKmgscD1yKnUseT1vKmgsbT1vKnUsZz1hKnUsYj1jKmwsdz1jKmgseD1jKnUsTT1uLngsQT1uLnksUz1uLno7cmV0dXJuIHNbMF09KDEtKHkrZykpKk0sc1sxXT0oZCt4KSpNLHNbMl09KHAtdykqTSxzWzNdPTAsc1s0XT0oZC14KSpBLHNbNV09KDEtKGYrZykpKkEsc1s2XT0obStiKSpBLHNbN109MCxzWzhdPShwK3cpKlMsc1s5XT0obS1iKSpTLHNbMTBdPSgxLShmK3kpKSpTLHNbMTFdPTAsc1sxMl09dC54LHNbMTNdPXQueSxzWzE0XT10Lnosc1sxNV09MSx0aGlzfWRlY29tcG9zZSh0LGUsbil7Y29uc3Qgcz10aGlzLmVsZW1lbnRzO2xldCByPU9uLnNldChzWzBdLHNbMV0sc1syXSkubGVuZ3RoKCk7Y29uc3Qgbz1Pbi5zZXQoc1s0XSxzWzVdLHNbNl0pLmxlbmd0aCgpLGE9T24uc2V0KHNbOF0sc1s5XSxzWzEwXSkubGVuZ3RoKCk7dGhpcy5kZXRlcm1pbmFudCgpPDAmJihyPS1yKSx0Lng9c1sxMl0sdC55PXNbMTNdLHQuej1zWzE0XSxsZS5jb3B5KHRoaXMpO2NvbnN0IGw9MS9yLGg9MS9vLHU9MS9hO3JldHVybiBsZS5lbGVtZW50c1swXSo9bCxsZS5lbGVtZW50c1sxXSo9bCxsZS5lbGVtZW50c1syXSo9bCxsZS5lbGVtZW50c1s0XSo9aCxsZS5lbGVtZW50c1s1XSo9aCxsZS5lbGVtZW50c1s2XSo9aCxsZS5lbGVtZW50c1s4XSo9dSxsZS5lbGVtZW50c1s5XSo9dSxsZS5lbGVtZW50c1sxMF0qPXUsZS5zZXRGcm9tUm90YXRpb25NYXRyaXgobGUpLG4ueD1yLG4ueT1vLG4uej1hLHRoaXN9bWFrZVBlcnNwZWN0aXZlKHQsZSxuLHMscixvLGE9MmUzLGM9ITEpe2NvbnN0IGw9dGhpcy5lbGVtZW50cyxoPTIqci8oZS10KSx1PTIqci8obi1zKSxmPShlK3QpLyhlLXQpLGQ9KG4rcykvKG4tcyk7bGV0IHAseTtpZihjKXA9ci8oby1yKSx5PW8qci8oby1yKTtlbHNlIGlmKGE9PT0yZTMpcD0tKG8rcikvKG8tcikseT0tMipvKnIvKG8tcik7ZWxzZSBpZihhPT09MjAwMSlwPS1vLyhvLXIpLHk9LW8qci8oby1yKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuTWF0cml4NC5tYWtlUGVyc3BlY3RpdmUoKTogSW52YWxpZCBjb29yZGluYXRlIHN5c3RlbTogIithKTtyZXR1cm4gbFswXT1oLGxbNF09MCxsWzhdPWYsbFsxMl09MCxsWzFdPTAsbFs1XT11LGxbOV09ZCxsWzEzXT0wLGxbMl09MCxsWzZdPTAsbFsxMF09cCxsWzE0XT15LGxbM109MCxsWzddPTAsbFsxMV09LTEsbFsxNV09MCx0aGlzfW1ha2VPcnRob2dyYXBoaWModCxlLG4scyxyLG8sYT0yZTMsYz0hMSl7Y29uc3QgbD10aGlzLmVsZW1lbnRzLGg9Mi8oZS10KSx1PTIvKG4tcyksZj0tKGUrdCkvKGUtdCksZD0tKG4rcykvKG4tcyk7bGV0IHAseTtpZihjKXA9MS8oby1yKSx5PW8vKG8tcik7ZWxzZSBpZihhPT09MmUzKXA9LTIvKG8tcikseT0tKG8rcikvKG8tcik7ZWxzZSBpZihhPT09MjAwMSlwPS0xLyhvLXIpLHk9LXIvKG8tcik7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk1hdHJpeDQubWFrZU9ydGhvZ3JhcGhpYygpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK2EpO3JldHVybiBsWzBdPWgsbFs0XT0wLGxbOF09MCxsWzEyXT1mLGxbMV09MCxsWzVdPXUsbFs5XT0wLGxbMTNdPWQsbFsyXT0wLGxbNl09MCxsWzEwXT1wLGxbMTRdPXksbFszXT0wLGxbN109MCxsWzExXT0wLGxbMTVdPTEsdGhpc31lcXVhbHModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztmb3IobGV0IHM9MDtzPDE2O3MrKylpZihlW3NdIT09bltzXSlyZXR1cm4hMTtyZXR1cm4hMH1mcm9tQXJyYXkodCxlPTApe2ZvcihsZXQgbj0wO248MTY7bisrKXRoaXMuZWxlbWVudHNbbl09dFtuK2VdO3JldHVybiB0aGlzfXRvQXJyYXkodD1bXSxlPTApe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gdFtlXT1uWzBdLHRbZSsxXT1uWzFdLHRbZSsyXT1uWzJdLHRbZSszXT1uWzNdLHRbZSs0XT1uWzRdLHRbZSs1XT1uWzVdLHRbZSs2XT1uWzZdLHRbZSs3XT1uWzddLHRbZSs4XT1uWzhdLHRbZSs5XT1uWzldLHRbZSsxMF09blsxMF0sdFtlKzExXT1uWzExXSx0W2UrMTJdPW5bMTJdLHRbZSsxM109blsxM10sdFtlKzE0XT1uWzE0XSx0W2UrMTVdPW5bMTVdLHR9fWNvbnN0IE9uPW5ldyBULGxlPW5ldyBzdCxsZj1uZXcgVCgwLDAsMCksaGY9bmV3IFQoMSwxLDEpLGplPW5ldyBULHlzPW5ldyBULER0PW5ldyBULENjPW5ldyBzdCxCYz1uZXcgd2k7Y2xhc3MgQWl7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAscz1BaS5ERUZBVUxUX09SREVSKXt0aGlzLmlzRXVsZXI9ITAsdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fb3JkZXI9c31nZXQgeCgpe3JldHVybiB0aGlzLl94fXNldCB4KHQpe3RoaXMuX3g9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHkoKXtyZXR1cm4gdGhpcy5feX1zZXQgeSh0KXt0aGlzLl95PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB6KCl7cmV0dXJuIHRoaXMuX3p9c2V0IHoodCl7dGhpcy5fej10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgb3JkZXIoKXtyZXR1cm4gdGhpcy5fb3JkZXJ9c2V0IG9yZGVyKHQpe3RoaXMuX29yZGVyPXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldCh0LGUsbixzPXRoaXMuX29yZGVyKXtyZXR1cm4gdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fb3JkZXI9cyx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl9vcmRlcil9Y29weSh0KXtyZXR1cm4gdGhpcy5feD10Ll94LHRoaXMuX3k9dC5feSx0aGlzLl96PXQuX3osdGhpcy5fb3JkZXI9dC5fb3JkZXIsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KHQsZT10aGlzLl9vcmRlcixuPSEwKXtjb25zdCBzPXQuZWxlbWVudHMscj1zWzBdLG89c1s0XSxhPXNbOF0sYz1zWzFdLGw9c1s1XSxoPXNbOV0sdT1zWzJdLGY9c1s2XSxkPXNbMTBdO3N3aXRjaChlKXtjYXNlIlhZWiI6dGhpcy5feT1NYXRoLmFzaW4oRyhhLC0xLDEpKSxNYXRoLmFicyhhKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1oLGQpLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxyKSk6KHRoaXMuX3g9TWF0aC5hdGFuMihmLGwpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJZWFoiOnRoaXMuX3g9TWF0aC5hc2luKC1HKGgsLTEsMSkpLE1hdGguYWJzKGgpPC45OTk5OTk5Pyh0aGlzLl95PU1hdGguYXRhbjIoYSxkKSx0aGlzLl96PU1hdGguYXRhbjIoYyxsKSk6KHRoaXMuX3k9TWF0aC5hdGFuMigtdSxyKSx0aGlzLl96PTApO2JyZWFrO2Nhc2UiWlhZIjp0aGlzLl94PU1hdGguYXNpbihHKGYsLTEsMSkpLE1hdGguYWJzKGYpPC45OTk5OTk5Pyh0aGlzLl95PU1hdGguYXRhbjIoLXUsZCksdGhpcy5fej1NYXRoLmF0YW4yKC1vLGwpKToodGhpcy5feT0wLHRoaXMuX3o9TWF0aC5hdGFuMihjLHIpKTticmVhaztjYXNlIlpZWCI6dGhpcy5feT1NYXRoLmFzaW4oLUcodSwtMSwxKSksTWF0aC5hYnModSk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMihmLGQpLHRoaXMuX3o9TWF0aC5hdGFuMihjLHIpKToodGhpcy5feD0wLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxsKSk7YnJlYWs7Y2FzZSJZWlgiOnRoaXMuX3o9TWF0aC5hc2luKEcoYywtMSwxKSksTWF0aC5hYnMoYyk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMigtaCxsKSx0aGlzLl95PU1hdGguYXRhbjIoLXUscikpOih0aGlzLl94PTAsdGhpcy5feT1NYXRoLmF0YW4yKGEsZCkpO2JyZWFrO2Nhc2UiWFpZIjp0aGlzLl96PU1hdGguYXNpbigtRyhvLC0xLDEpKSxNYXRoLmFicyhvKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKGYsbCksdGhpcy5feT1NYXRoLmF0YW4yKGEscikpOih0aGlzLl94PU1hdGguYXRhbjIoLWgsZCksdGhpcy5feT0wKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuRXVsZXI6IC5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAiK2UpfXJldHVybiB0aGlzLl9vcmRlcj1lLG49PT0hMCYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVF1YXRlcm5pb24odCxlLG4pe3JldHVybiBDYy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KSx0aGlzLnNldEZyb21Sb3RhdGlvbk1hdHJpeChDYyxlLG4pfXNldEZyb21WZWN0b3IzKHQsZT10aGlzLl9vcmRlcil7cmV0dXJuIHRoaXMuc2V0KHQueCx0LnksdC56LGUpfXJlb3JkZXIodCl7cmV0dXJuIEJjLnNldEZyb21FdWxlcih0aGlzKSx0aGlzLnNldEZyb21RdWF0ZXJuaW9uKEJjLHQpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fb3JkZXI9PT10aGlzLl9vcmRlcn1mcm9tQXJyYXkodCl7cmV0dXJuIHRoaXMuX3g9dFswXSx0aGlzLl95PXRbMV0sdGhpcy5fej10WzJdLHRbM10hPT12b2lkIDAmJih0aGlzLl9vcmRlcj10WzNdKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLl94LHRbZSsxXT10aGlzLl95LHRbZSsyXT10aGlzLl96LHRbZSszXT10aGlzLl9vcmRlcix0fV9vbkNoYW5nZSh0KXtyZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaz10LHRoaXN9X29uQ2hhbmdlQ2FsbGJhY2soKXt9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5feCx5aWVsZCB0aGlzLl95LHlpZWxkIHRoaXMuX3oseWllbGQgdGhpcy5fb3JkZXJ9fUFpLkRFRkFVTFRfT1JERVI9IlhZWiI7Y2xhc3MgdWZ7Y29uc3RydWN0b3IoKXt0aGlzLm1hc2s9MX1zZXQodCl7dGhpcy5tYXNrPSgxPDx0fDApPj4+MH1lbmFibGUodCl7dGhpcy5tYXNrfD0xPDx0fDB9ZW5hYmxlQWxsKCl7dGhpcy5tYXNrPS0xfXRvZ2dsZSh0KXt0aGlzLm1hc2tePTE8PHR8MH1kaXNhYmxlKHQpe3RoaXMubWFzayY9figxPDx0fDApfWRpc2FibGVBbGwoKXt0aGlzLm1hc2s9MH10ZXN0KHQpe3JldHVybih0aGlzLm1hc2smdC5tYXNrKSE9PTB9aXNFbmFibGVkKHQpe3JldHVybih0aGlzLm1hc2smKDE8PHR8MCkpIT09MH19bGV0IGZmPTA7Y29uc3QgRmM9bmV3IFQsRG49bmV3IHdpLFRlPW5ldyBzdCxtcz1uZXcgVCxTaT1uZXcgVCxkZj1uZXcgVCxwZj1uZXcgd2ksSWM9bmV3IFQoMSwwLDApLGtjPW5ldyBUKDAsMSwwKSxOYz1uZXcgVCgwLDAsMSksUmM9e3R5cGU6ImFkZGVkIn0seWY9e3R5cGU6InJlbW92ZWQifSwkbj17dHlwZToiY2hpbGRhZGRlZCIsY2hpbGQ6bnVsbH0sbW89e3R5cGU6ImNoaWxkcmVtb3ZlZCIsY2hpbGQ6bnVsbH07Y2xhc3MgRWUgZXh0ZW5kcyBsc3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc09iamVjdDNEPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOmZmKyt9KSx0aGlzLnV1aWQ9Rm4oKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJPYmplY3QzRCIsdGhpcy5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuPVtdLHRoaXMudXA9RWUuREVGQVVMVF9VUC5jbG9uZSgpO2NvbnN0IHQ9bmV3IFQsZT1uZXcgQWksbj1uZXcgd2kscz1uZXcgVCgxLDEsMSk7ZnVuY3Rpb24gcigpe24uc2V0RnJvbUV1bGVyKGUsITEpfWZ1bmN0aW9uIG8oKXtlLnNldEZyb21RdWF0ZXJuaW9uKG4sdm9pZCAwLCExKX1lLl9vbkNoYW5nZShyKSxuLl9vbkNoYW5nZShvKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtwb3NpdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dH0scm90YXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmV9LHF1YXRlcm5pb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm59LHNjYWxlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpzfSxtb2RlbFZpZXdNYXRyaXg6e3ZhbHVlOm5ldyBzdH0sbm9ybWFsTWF0cml4Ont2YWx1ZTpuZXcgbWV9fSksdGhpcy5tYXRyaXg9bmV3IHN0LHRoaXMubWF0cml4V29ybGQ9bmV3IHN0LHRoaXMubWF0cml4QXV0b1VwZGF0ZT1FZS5ERUZBVUxUX01BVFJJWF9BVVRPX1VQREFURSx0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT1FZS5ERUZBVUxUX01BVFJJWF9XT1JMRF9BVVRPX1VQREFURSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITEsdGhpcy5sYXllcnM9bmV3IHVmLHRoaXMudmlzaWJsZT0hMCx0aGlzLmNhc3RTaGFkb3c9ITEsdGhpcy5yZWNlaXZlU2hhZG93PSExLHRoaXMuZnJ1c3R1bUN1bGxlZD0hMCx0aGlzLnJlbmRlck9yZGVyPTAsdGhpcy5hbmltYXRpb25zPVtdLHRoaXMuY3VzdG9tRGVwdGhNYXRlcmlhbD12b2lkIDAsdGhpcy5jdXN0b21EaXN0YW5jZU1hdGVyaWFsPXZvaWQgMCx0aGlzLnVzZXJEYXRhPXt9fW9uQmVmb3JlU2hhZG93KCl7fW9uQWZ0ZXJTaGFkb3coKXt9b25CZWZvcmVSZW5kZXIoKXt9b25BZnRlclJlbmRlcigpe31hcHBseU1hdHJpeDQodCl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLHRoaXMubWF0cml4LnByZW11bHRpcGx5KHQpLHRoaXMubWF0cml4LmRlY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKX1hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSh0KSx0aGlzfXNldFJvdGF0aW9uRnJvbUF4aXNBbmdsZSh0LGUpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKHQsZSl9c2V0Um90YXRpb25Gcm9tRXVsZXIodCl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21FdWxlcih0LCEwKX1zZXRSb3RhdGlvbkZyb21NYXRyaXgodCl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCh0KX1zZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpe3RoaXMucXVhdGVybmlvbi5jb3B5KHQpfXJvdGF0ZU9uQXhpcyh0LGUpe3JldHVybiBEbi5zZXRGcm9tQXhpc0FuZ2xlKHQsZSksdGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KERuKSx0aGlzfXJvdGF0ZU9uV29ybGRBeGlzKHQsZSl7cmV0dXJuIERuLnNldEZyb21BeGlzQW5nbGUodCxlKSx0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoRG4pLHRoaXN9cm90YXRlWCh0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoSWMsdCl9cm90YXRlWSh0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoa2MsdCl9cm90YXRlWih0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoTmMsdCl9dHJhbnNsYXRlT25BeGlzKHQsZSl7cmV0dXJuIEZjLmNvcHkodCkuYXBwbHlRdWF0ZXJuaW9uKHRoaXMucXVhdGVybmlvbiksdGhpcy5wb3NpdGlvbi5hZGQoRmMubXVsdGlwbHlTY2FsYXIoZSkpLHRoaXN9dHJhbnNsYXRlWCh0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoSWMsdCl9dHJhbnNsYXRlWSh0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoa2MsdCl9dHJhbnNsYXRlWih0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoTmMsdCl9bG9jYWxUb1dvcmxkKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKX13b3JsZFRvTG9jYWwodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuYXBwbHlNYXRyaXg0KFRlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkpfWxvb2tBdCh0LGUsbil7dC5pc1ZlY3RvcjM/bXMuY29weSh0KTptcy5zZXQodCxlLG4pO2NvbnN0IHM9dGhpcy5wYXJlbnQ7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksU2kuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpLHRoaXMuaXNDYW1lcmF8fHRoaXMuaXNMaWdodD9UZS5sb29rQXQoU2ksbXMsdGhpcy51cCk6VGUubG9va0F0KG1zLFNpLHRoaXMudXApLHRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoVGUpLHMmJihUZS5leHRyYWN0Um90YXRpb24ocy5tYXRyaXhXb3JsZCksRG4uc2V0RnJvbVJvdGF0aW9uTWF0cml4KFRlKSx0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoRG4uaW52ZXJ0KCkpKX1hZGQodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRoaXMuYWRkKGFyZ3VtZW50c1tlXSk7cmV0dXJuIHRoaXN9cmV0dXJuIHQ9PT10aGlzPyhjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBjYW4ndCBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIGl0c2VsZi4iLHQpLHRoaXMpOih0JiZ0LmlzT2JqZWN0M0Q/KHQucmVtb3ZlRnJvbVBhcmVudCgpLHQucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKHQpLHQuZGlzcGF0Y2hFdmVudChSYyksJG4uY2hpbGQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQoJG4pLCRuLmNoaWxkPW51bGwpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC4iLHQpLHRoaXMpfXJlbW92ZSh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2ZvcihsZXQgbj0wO248YXJndW1lbnRzLmxlbmd0aDtuKyspdGhpcy5yZW1vdmUoYXJndW1lbnRzW25dKTtyZXR1cm4gdGhpc31jb25zdCBlPXRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KTtyZXR1cm4gZSE9PS0xJiYodC5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuLnNwbGljZShlLDEpLHQuZGlzcGF0Y2hFdmVudCh5ZiksbW8uY2hpbGQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQobW8pLG1vLmNoaWxkPW51bGwpLHRoaXN9cmVtb3ZlRnJvbVBhcmVudCgpe2NvbnN0IHQ9dGhpcy5wYXJlbnQ7cmV0dXJuIHQhPT1udWxsJiZ0LnJlbW92ZSh0aGlzKSx0aGlzfWNsZWFyKCl7cmV0dXJuIHRoaXMucmVtb3ZlKC4uLnRoaXMuY2hpbGRyZW4pfWF0dGFjaCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksVGUuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSx0LnBhcmVudCE9PW51bGwmJih0LnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksVGUubXVsdGlwbHkodC5wYXJlbnQubWF0cml4V29ybGQpKSx0LmFwcGx5TWF0cml4NChUZSksdC5yZW1vdmVGcm9tUGFyZW50KCksdC5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2godCksdC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMCksdC5kaXNwYXRjaEV2ZW50KFJjKSwkbi5jaGlsZD10LHRoaXMuZGlzcGF0Y2hFdmVudCgkbiksJG4uY2hpbGQ9bnVsbCx0aGlzfWdldE9iamVjdEJ5SWQodCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgiaWQiLHQpfWdldE9iamVjdEJ5TmFtZSh0KXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJuYW1lIix0KX1nZXRPYmplY3RCeVByb3BlcnR5KHQsZSl7aWYodGhpc1t0XT09PWUpcmV0dXJuIHRoaXM7Zm9yKGxldCBuPTAscz10aGlzLmNoaWxkcmVuLmxlbmd0aDtuPHM7bisrKXtjb25zdCBvPXRoaXMuY2hpbGRyZW5bbl0uZ2V0T2JqZWN0QnlQcm9wZXJ0eSh0LGUpO2lmKG8hPT12b2lkIDApcmV0dXJuIG99fWdldE9iamVjdHNCeVByb3BlcnR5KHQsZSxuPVtdKXt0aGlzW3RdPT09ZSYmbi5wdXNoKHRoaXMpO2NvbnN0IHM9dGhpcy5jaGlsZHJlbjtmb3IobGV0IHI9MCxvPXMubGVuZ3RoO3I8bztyKyspc1tyXS5nZXRPYmplY3RzQnlQcm9wZXJ0eSh0LGUsbik7cmV0dXJuIG59Z2V0V29ybGRQb3NpdGlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCl9Z2V0V29ybGRRdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShTaSx0LGRmKSx0fWdldFdvcmxkU2NhbGUodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKFNpLHBmLHQpLHR9Z2V0V29ybGREaXJlY3Rpb24odCl7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7Y29uc3QgZT10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiB0LnNldChlWzhdLGVbOV0sZVsxMF0pLm5vcm1hbGl6ZSgpfXJheWNhc3QoKXt9dHJhdmVyc2UodCl7dCh0aGlzKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAscz1lLmxlbmd0aDtuPHM7bisrKWVbbl0udHJhdmVyc2UodCl9dHJhdmVyc2VWaXNpYmxlKHQpe2lmKHRoaXMudmlzaWJsZT09PSExKXJldHVybjt0KHRoaXMpO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxzPWUubGVuZ3RoO248cztuKyspZVtuXS50cmF2ZXJzZVZpc2libGUodCl9dHJhdmVyc2VBbmNlc3RvcnModCl7Y29uc3QgZT10aGlzLnBhcmVudDtlIT09bnVsbCYmKHQoZSksZS50cmF2ZXJzZUFuY2VzdG9ycyh0KSl9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9dXBkYXRlTWF0cml4V29ybGQodCl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLCh0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGV8fHQpJiYodGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9PT0hMCYmKHRoaXMucGFyZW50PT09bnVsbD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCkpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSx0PSEwKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAscz1lLmxlbmd0aDtuPHM7bisrKWVbbl0udXBkYXRlTWF0cml4V29ybGQodCl9dXBkYXRlV29ybGRNYXRyaXgodCxlKXtjb25zdCBuPXRoaXMucGFyZW50O2lmKHQ9PT0hMCYmbiE9PW51bGwmJm4udXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT09PSEwJiYodGhpcy5wYXJlbnQ9PT1udWxsP3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSksZT09PSEwKXtjb25zdCBzPXRoaXMuY2hpbGRyZW47Zm9yKGxldCByPTAsbz1zLmxlbmd0aDtyPG87cisrKXNbcl0udXBkYXRlV29ybGRNYXRyaXgoITEsITApfX10b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyIsbj17fTtlJiYodD17Z2VvbWV0cmllczp7fSxtYXRlcmlhbHM6e30sdGV4dHVyZXM6e30saW1hZ2VzOnt9LHNoYXBlczp7fSxza2VsZXRvbnM6e30sYW5pbWF0aW9uczp7fSxub2Rlczp7fX0sbi5tZXRhZGF0YT17dmVyc2lvbjo0LjcsdHlwZToiT2JqZWN0IixnZW5lcmF0b3I6Ik9iamVjdDNELnRvSlNPTiJ9KTtjb25zdCBzPXt9O3MudXVpZD10aGlzLnV1aWQscy50eXBlPXRoaXMudHlwZSx0aGlzLm5hbWUhPT0iIiYmKHMubmFtZT10aGlzLm5hbWUpLHRoaXMuY2FzdFNoYWRvdz09PSEwJiYocy5jYXN0U2hhZG93PSEwKSx0aGlzLnJlY2VpdmVTaGFkb3c9PT0hMCYmKHMucmVjZWl2ZVNoYWRvdz0hMCksdGhpcy52aXNpYmxlPT09ITEmJihzLnZpc2libGU9ITEpLHRoaXMuZnJ1c3R1bUN1bGxlZD09PSExJiYocy5mcnVzdHVtQ3VsbGVkPSExKSx0aGlzLnJlbmRlck9yZGVyIT09MCYmKHMucmVuZGVyT3JkZXI9dGhpcy5yZW5kZXJPcmRlciksT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihzLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLHMubGF5ZXJzPXRoaXMubGF5ZXJzLm1hc2sscy5tYXRyaXg9dGhpcy5tYXRyaXgudG9BcnJheSgpLHMudXA9dGhpcy51cC50b0FycmF5KCksdGhpcy5tYXRyaXhBdXRvVXBkYXRlPT09ITEmJihzLm1hdHJpeEF1dG9VcGRhdGU9ITEpLHRoaXMuaXNJbnN0YW5jZWRNZXNoJiYocy50eXBlPSJJbnN0YW5jZWRNZXNoIixzLmNvdW50PXRoaXMuY291bnQscy5pbnN0YW5jZU1hdHJpeD10aGlzLmluc3RhbmNlTWF0cml4LnRvSlNPTigpLHRoaXMuaW5zdGFuY2VDb2xvciE9PW51bGwmJihzLmluc3RhbmNlQ29sb3I9dGhpcy5pbnN0YW5jZUNvbG9yLnRvSlNPTigpKSksdGhpcy5pc0JhdGNoZWRNZXNoJiYocy50eXBlPSJCYXRjaGVkTWVzaCIscy5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkPXRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCxzLnNvcnRPYmplY3RzPXRoaXMuc29ydE9iamVjdHMscy5kcmF3UmFuZ2VzPXRoaXMuX2RyYXdSYW5nZXMscy5yZXNlcnZlZFJhbmdlcz10aGlzLl9yZXNlcnZlZFJhbmdlcyxzLmdlb21ldHJ5SW5mbz10aGlzLl9nZW9tZXRyeUluZm8ubWFwKGE9PldlKEZ0KHt9LGEpLHtib3VuZGluZ0JveDphLmJvdW5kaW5nQm94P2EuYm91bmRpbmdCb3gudG9KU09OKCk6dm9pZCAwLGJvdW5kaW5nU3BoZXJlOmEuYm91bmRpbmdTcGhlcmU/YS5ib3VuZGluZ1NwaGVyZS50b0pTT04oKTp2b2lkIDB9KSkscy5pbnN0YW5jZUluZm89dGhpcy5faW5zdGFuY2VJbmZvLm1hcChhPT5GdCh7fSxhKSkscy5hdmFpbGFibGVJbnN0YW5jZUlkcz10aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcy5zbGljZSgpLHMuYXZhaWxhYmxlR2VvbWV0cnlJZHM9dGhpcy5fYXZhaWxhYmxlR2VvbWV0cnlJZHMuc2xpY2UoKSxzLm5leHRJbmRleFN0YXJ0PXRoaXMuX25leHRJbmRleFN0YXJ0LHMubmV4dFZlcnRleFN0YXJ0PXRoaXMuX25leHRWZXJ0ZXhTdGFydCxzLmdlb21ldHJ5Q291bnQ9dGhpcy5fZ2VvbWV0cnlDb3VudCxzLm1heEluc3RhbmNlQ291bnQ9dGhpcy5fbWF4SW5zdGFuY2VDb3VudCxzLm1heFZlcnRleENvdW50PXRoaXMuX21heFZlcnRleENvdW50LHMubWF4SW5kZXhDb3VudD10aGlzLl9tYXhJbmRleENvdW50LHMuZ2VvbWV0cnlJbml0aWFsaXplZD10aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkLHMubWF0cmljZXNUZXh0dXJlPXRoaXMuX21hdHJpY2VzVGV4dHVyZS50b0pTT04odCkscy5pbmRpcmVjdFRleHR1cmU9dGhpcy5faW5kaXJlY3RUZXh0dXJlLnRvSlNPTih0KSx0aGlzLl9jb2xvcnNUZXh0dXJlIT09bnVsbCYmKHMuY29sb3JzVGV4dHVyZT10aGlzLl9jb2xvcnNUZXh0dXJlLnRvSlNPTih0KSksdGhpcy5ib3VuZGluZ1NwaGVyZSE9PW51bGwmJihzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdTcGhlcmUudG9KU09OKCkpLHRoaXMuYm91bmRpbmdCb3ghPT1udWxsJiYocy5ib3VuZGluZ0JveD10aGlzLmJvdW5kaW5nQm94LnRvSlNPTigpKSk7ZnVuY3Rpb24gcihhLGMpe3JldHVybiBhW2MudXVpZF09PT12b2lkIDAmJihhW2MudXVpZF09Yy50b0pTT04odCkpLGMudXVpZH1pZih0aGlzLmlzU2NlbmUpdGhpcy5iYWNrZ3JvdW5kJiYodGhpcy5iYWNrZ3JvdW5kLmlzQ29sb3I/cy5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04oKTp0aGlzLmJhY2tncm91bmQuaXNUZXh0dXJlJiYocy5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04odCkudXVpZCkpLHRoaXMuZW52aXJvbm1lbnQmJnRoaXMuZW52aXJvbm1lbnQuaXNUZXh0dXJlJiZ0aGlzLmVudmlyb25tZW50LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSE9PSEwJiYocy5lbnZpcm9ubWVudD10aGlzLmVudmlyb25tZW50LnRvSlNPTih0KS51dWlkKTtlbHNlIGlmKHRoaXMuaXNNZXNofHx0aGlzLmlzTGluZXx8dGhpcy5pc1BvaW50cyl7cy5nZW9tZXRyeT1yKHQuZ2VvbWV0cmllcyx0aGlzLmdlb21ldHJ5KTtjb25zdCBhPXRoaXMuZ2VvbWV0cnkucGFyYW1ldGVycztpZihhIT09dm9pZCAwJiZhLnNoYXBlcyE9PXZvaWQgMCl7Y29uc3QgYz1hLnNoYXBlcztpZihBcnJheS5pc0FycmF5KGMpKWZvcihsZXQgbD0wLGg9Yy5sZW5ndGg7bDxoO2wrKyl7Y29uc3QgdT1jW2xdO3IodC5zaGFwZXMsdSl9ZWxzZSByKHQuc2hhcGVzLGMpfX1pZih0aGlzLmlzU2tpbm5lZE1lc2gmJihzLmJpbmRNb2RlPXRoaXMuYmluZE1vZGUscy5iaW5kTWF0cml4PXRoaXMuYmluZE1hdHJpeC50b0FycmF5KCksdGhpcy5za2VsZXRvbiE9PXZvaWQgMCYmKHIodC5za2VsZXRvbnMsdGhpcy5za2VsZXRvbikscy5za2VsZXRvbj10aGlzLnNrZWxldG9uLnV1aWQpKSx0aGlzLm1hdGVyaWFsIT09dm9pZCAwKWlmKEFycmF5LmlzQXJyYXkodGhpcy5tYXRlcmlhbCkpe2NvbnN0IGE9W107Zm9yKGxldCBjPTAsbD10aGlzLm1hdGVyaWFsLmxlbmd0aDtjPGw7YysrKWEucHVzaChyKHQubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWxbY10pKTtzLm1hdGVyaWFsPWF9ZWxzZSBzLm1hdGVyaWFsPXIodC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbCk7aWYodGhpcy5jaGlsZHJlbi5sZW5ndGg+MCl7cy5jaGlsZHJlbj1bXTtmb3IobGV0IGE9MDthPHRoaXMuY2hpbGRyZW4ubGVuZ3RoO2ErKylzLmNoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlblthXS50b0pTT04odCkub2JqZWN0KX1pZih0aGlzLmFuaW1hdGlvbnMubGVuZ3RoPjApe3MuYW5pbWF0aW9ucz1bXTtmb3IobGV0IGE9MDthPHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg7YSsrKXtjb25zdCBjPXRoaXMuYW5pbWF0aW9uc1thXTtzLmFuaW1hdGlvbnMucHVzaChyKHQuYW5pbWF0aW9ucyxjKSl9fWlmKGUpe2NvbnN0IGE9byh0Lmdlb21ldHJpZXMpLGM9byh0Lm1hdGVyaWFscyksbD1vKHQudGV4dHVyZXMpLGg9byh0LmltYWdlcyksdT1vKHQuc2hhcGVzKSxmPW8odC5za2VsZXRvbnMpLGQ9byh0LmFuaW1hdGlvbnMpLHA9byh0Lm5vZGVzKTthLmxlbmd0aD4wJiYobi5nZW9tZXRyaWVzPWEpLGMubGVuZ3RoPjAmJihuLm1hdGVyaWFscz1jKSxsLmxlbmd0aD4wJiYobi50ZXh0dXJlcz1sKSxoLmxlbmd0aD4wJiYobi5pbWFnZXM9aCksdS5sZW5ndGg+MCYmKG4uc2hhcGVzPXUpLGYubGVuZ3RoPjAmJihuLnNrZWxldG9ucz1mKSxkLmxlbmd0aD4wJiYobi5hbmltYXRpb25zPWQpLHAubGVuZ3RoPjAmJihuLm5vZGVzPXApfXJldHVybiBuLm9iamVjdD1zLG47ZnVuY3Rpb24gbyhhKXtjb25zdCBjPVtdO2Zvcihjb25zdCBsIGluIGEpe2NvbnN0IGg9YVtsXTtkZWxldGUgaC5tZXRhZGF0YSxjLnB1c2goaCl9cmV0dXJuIGN9fWNsb25lKHQpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyx0KX1jb3B5KHQsZT0hMCl7aWYodGhpcy5uYW1lPXQubmFtZSx0aGlzLnVwLmNvcHkodC51cCksdGhpcy5wb3NpdGlvbi5jb3B5KHQucG9zaXRpb24pLHRoaXMucm90YXRpb24ub3JkZXI9dC5yb3RhdGlvbi5vcmRlcix0aGlzLnF1YXRlcm5pb24uY29weSh0LnF1YXRlcm5pb24pLHRoaXMuc2NhbGUuY29weSh0LnNjYWxlKSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXhXb3JsZCksdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT10Lm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9dC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlLHRoaXMubGF5ZXJzLm1hc2s9dC5sYXllcnMubWFzayx0aGlzLnZpc2libGU9dC52aXNpYmxlLHRoaXMuY2FzdFNoYWRvdz10LmNhc3RTaGFkb3csdGhpcy5yZWNlaXZlU2hhZG93PXQucmVjZWl2ZVNoYWRvdyx0aGlzLmZydXN0dW1DdWxsZWQ9dC5mcnVzdHVtQ3VsbGVkLHRoaXMucmVuZGVyT3JkZXI9dC5yZW5kZXJPcmRlcix0aGlzLmFuaW1hdGlvbnM9dC5hbmltYXRpb25zLnNsaWNlKCksdGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQudXNlckRhdGEpKSxlPT09ITApZm9yKGxldCBuPTA7bjx0LmNoaWxkcmVuLmxlbmd0aDtuKyspe2NvbnN0IHM9dC5jaGlsZHJlbltuXTt0aGlzLmFkZChzLmNsb25lKCkpfXJldHVybiB0aGlzfX1FZS5ERUZBVUxUX1VQPW5ldyBUKDAsMSwwKSxFZS5ERUZBVUxUX01BVFJJWF9BVVRPX1VQREFURT0hMCxFZS5ERUZBVUxUX01BVFJJWF9XT1JMRF9BVVRPX1VQREFURT0hMDtjb25zdCBoZT1uZXcgVCxQZT1uZXcgVCxnbz1uZXcgVCxDZT1uZXcgVCxWbj1uZXcgVCxVbj1uZXcgVCxMYz1uZXcgVCx4bz1uZXcgVCx3bz1uZXcgVCxibz1uZXcgVCxNbz1uZXcgSnQsQW89bmV3IEp0LFNvPW5ldyBKdDtjbGFzcyB0dHtjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQsbj1uZXcgVCl7dGhpcy5hPXQsdGhpcy5iPWUsdGhpcy5jPW59c3RhdGljIGdldE5vcm1hbCh0LGUsbixzKXtzLnN1YlZlY3RvcnMobixlKSxoZS5zdWJWZWN0b3JzKHQsZSkscy5jcm9zcyhoZSk7Y29uc3Qgcj1zLmxlbmd0aFNxKCk7cmV0dXJuIHI+MD9zLm11bHRpcGx5U2NhbGFyKDEvTWF0aC5zcXJ0KHIpKTpzLnNldCgwLDAsMCl9c3RhdGljIGdldEJhcnljb29yZCh0LGUsbixzLHIpe2hlLnN1YlZlY3RvcnMocyxlKSxQZS5zdWJWZWN0b3JzKG4sZSksZ28uc3ViVmVjdG9ycyh0LGUpO2NvbnN0IG89aGUuZG90KGhlKSxhPWhlLmRvdChQZSksYz1oZS5kb3QoZ28pLGw9UGUuZG90KFBlKSxoPVBlLmRvdChnbyksdT1vKmwtYSphO2lmKHU9PT0wKXJldHVybiByLnNldCgwLDAsMCksbnVsbDtjb25zdCBmPTEvdSxkPShsKmMtYSpoKSpmLHA9KG8qaC1hKmMpKmY7cmV0dXJuIHIuc2V0KDEtZC1wLHAsZCl9c3RhdGljIGNvbnRhaW5zUG9pbnQodCxlLG4scyl7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKHQsZSxuLHMsQ2UpPT09bnVsbD8hMTpDZS54Pj0wJiZDZS55Pj0wJiZDZS54K0NlLnk8PTF9c3RhdGljIGdldEludGVycG9sYXRpb24odCxlLG4scyxyLG8sYSxjKXtyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQodCxlLG4scyxDZSk9PT1udWxsPyhjLng9MCxjLnk9MCwieiJpbiBjJiYoYy56PTApLCJ3ImluIGMmJihjLnc9MCksbnVsbCk6KGMuc2V0U2NhbGFyKDApLGMuYWRkU2NhbGVkVmVjdG9yKHIsQ2UueCksYy5hZGRTY2FsZWRWZWN0b3IobyxDZS55KSxjLmFkZFNjYWxlZFZlY3RvcihhLENlLnopLGMpfXN0YXRpYyBnZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUodCxlLG4scyxyLG8pe3JldHVybiBNby5zZXRTY2FsYXIoMCksQW8uc2V0U2NhbGFyKDApLFNvLnNldFNjYWxhcigwKSxNby5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksQW8uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LG4pLFNvLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxzKSxvLnNldFNjYWxhcigwKSxvLmFkZFNjYWxlZFZlY3RvcihNbyxyLngpLG8uYWRkU2NhbGVkVmVjdG9yKEFvLHIueSksby5hZGRTY2FsZWRWZWN0b3IoU28sci56KSxvfXN0YXRpYyBpc0Zyb250RmFjaW5nKHQsZSxuLHMpe3JldHVybiBoZS5zdWJWZWN0b3JzKG4sZSksUGUuc3ViVmVjdG9ycyh0LGUpLGhlLmNyb3NzKFBlKS5kb3Qocyk8MH1zZXQodCxlLG4pe3JldHVybiB0aGlzLmEuY29weSh0KSx0aGlzLmIuY29weShlKSx0aGlzLmMuY29weShuKSx0aGlzfXNldEZyb21Qb2ludHNBbmRJbmRpY2VzKHQsZSxuLHMpe3JldHVybiB0aGlzLmEuY29weSh0W2VdKSx0aGlzLmIuY29weSh0W25dKSx0aGlzLmMuY29weSh0W3NdKSx0aGlzfXNldEZyb21BdHRyaWJ1dGVBbmRJbmRpY2VzKHQsZSxuLHMpe3JldHVybiB0aGlzLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpLHRoaXMuYi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsbiksdGhpcy5jLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxzKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLmEuY29weSh0LmEpLHRoaXMuYi5jb3B5KHQuYiksdGhpcy5jLmNvcHkodC5jKSx0aGlzfWdldEFyZWEoKXtyZXR1cm4gaGUuc3ViVmVjdG9ycyh0aGlzLmMsdGhpcy5iKSxQZS5zdWJWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLGhlLmNyb3NzKFBlKS5sZW5ndGgoKSouNX1nZXRNaWRwb2ludCh0KXtyZXR1cm4gdC5hZGRWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLmFkZCh0aGlzLmMpLm11bHRpcGx5U2NhbGFyKDEvMyl9Z2V0Tm9ybWFsKHQpe3JldHVybiB0dC5nZXROb3JtYWwodGhpcy5hLHRoaXMuYix0aGlzLmMsdCl9Z2V0UGxhbmUodCl7cmV0dXJuIHQuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1nZXRCYXJ5Y29vcmQodCxlKXtyZXR1cm4gdHQuZ2V0QmFyeWNvb3JkKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSl9Z2V0SW50ZXJwb2xhdGlvbih0LGUsbixzLHIpe3JldHVybiB0dC5nZXRJbnRlcnBvbGF0aW9uKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSxuLHMscil9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdHQuY29udGFpbnNQb2ludCh0LHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1pc0Zyb250RmFjaW5nKHQpe3JldHVybiB0dC5pc0Zyb250RmFjaW5nKHRoaXMuYSx0aGlzLmIsdGhpcy5jLHQpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQuaW50ZXJzZWN0c1RyaWFuZ2xlKHRoaXMpfWNsb3Nlc3RQb2ludFRvUG9pbnQodCxlKXtjb25zdCBuPXRoaXMuYSxzPXRoaXMuYixyPXRoaXMuYztsZXQgbyxhO1ZuLnN1YlZlY3RvcnMocyxuKSxVbi5zdWJWZWN0b3JzKHIsbikseG8uc3ViVmVjdG9ycyh0LG4pO2NvbnN0IGM9Vm4uZG90KHhvKSxsPVVuLmRvdCh4byk7aWYoYzw9MCYmbDw9MClyZXR1cm4gZS5jb3B5KG4pO3dvLnN1YlZlY3RvcnModCxzKTtjb25zdCBoPVZuLmRvdCh3byksdT1Vbi5kb3Qod28pO2lmKGg+PTAmJnU8PWgpcmV0dXJuIGUuY29weShzKTtjb25zdCBmPWMqdS1oKmw7aWYoZjw9MCYmYz49MCYmaDw9MClyZXR1cm4gbz1jLyhjLWgpLGUuY29weShuKS5hZGRTY2FsZWRWZWN0b3IoVm4sbyk7Ym8uc3ViVmVjdG9ycyh0LHIpO2NvbnN0IGQ9Vm4uZG90KGJvKSxwPVVuLmRvdChibyk7aWYocD49MCYmZDw9cClyZXR1cm4gZS5jb3B5KHIpO2NvbnN0IHk9ZCpsLWMqcDtpZih5PD0wJiZsPj0wJiZwPD0wKXJldHVybiBhPWwvKGwtcCksZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3RvcihVbixhKTtjb25zdCBtPWgqcC1kKnU7aWYobTw9MCYmdS1oPj0wJiZkLXA+PTApcmV0dXJuIExjLnN1YlZlY3RvcnMocixzKSxhPSh1LWgpLyh1LWgrKGQtcCkpLGUuY29weShzKS5hZGRTY2FsZWRWZWN0b3IoTGMsYSk7Y29uc3QgZz0xLyhtK3krZik7cmV0dXJuIG89eSpnLGE9ZipnLGUuY29weShuKS5hZGRTY2FsZWRWZWN0b3IoVm4sbykuYWRkU2NhbGVkVmVjdG9yKFVuLGEpfWVxdWFscyh0KXtyZXR1cm4gdC5hLmVxdWFscyh0aGlzLmEpJiZ0LmIuZXF1YWxzKHRoaXMuYikmJnQuYy5lcXVhbHModGhpcy5jKX19Y29uc3QgT2M9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH0sUWU9e2g6MCxzOjAsbDowfSxncz17aDowLHM6MCxsOjB9O2Z1bmN0aW9uIF9vKGksdCxlKXtyZXR1cm4gZTwwJiYoZSs9MSksZT4xJiYoZS09MSksZTwxLzY/aSsodC1pKSo2KmU6ZTwxLzI/dDplPDIvMz9pKyh0LWkpKjYqKDIvMy1lKTppfWxldCB4cz1jbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbil7cmV0dXJuIHRoaXMuaXNDb2xvcj0hMCx0aGlzLnI9MSx0aGlzLmc9MSx0aGlzLmI9MSx0aGlzLnNldCh0LGUsbil9c2V0KHQsZSxuKXtpZihlPT09dm9pZCAwJiZuPT09dm9pZCAwKXtjb25zdCBzPXQ7cyYmcy5pc0NvbG9yP3RoaXMuY29weShzKTp0eXBlb2Ygcz09Im51bWJlciI/dGhpcy5zZXRIZXgocyk6dHlwZW9mIHM9PSJzdHJpbmciJiZ0aGlzLnNldFN0eWxlKHMpfWVsc2UgdGhpcy5zZXRSR0IodCxlLG4pO3JldHVybiB0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPXQsdGhpcy5iPXQsdGhpc31zZXRIZXgodCxlPW9lKXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLHRoaXMucj0odD4+MTYmMjU1KS8yNTUsdGhpcy5nPSh0Pj44JjI1NSkvMjU1LHRoaXMuYj0odCYyNTUpLzI1NSxhZS5jb2xvclNwYWNlVG9Xb3JraW5nKHRoaXMsZSksdGhpc31zZXRSR0IodCxlLG4scz1hZS53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHRoaXMucj10LHRoaXMuZz1lLHRoaXMuYj1uLGFlLmNvbG9yU3BhY2VUb1dvcmtpbmcodGhpcyxzKSx0aGlzfXNldEhTTCh0LGUsbixzPWFlLndvcmtpbmdDb2xvclNwYWNlKXtpZih0PXRmKHQsMSksZT1HKGUsMCwxKSxuPUcobiwwLDEpLGU9PT0wKXRoaXMucj10aGlzLmc9dGhpcy5iPW47ZWxzZXtjb25zdCByPW48PS41P24qKDErZSk6bitlLW4qZSxvPTIqbi1yO3RoaXMucj1fbyhvLHIsdCsxLzMpLHRoaXMuZz1fbyhvLHIsdCksdGhpcy5iPV9vKG8scix0LTEvMyl9cmV0dXJuIGFlLmNvbG9yU3BhY2VUb1dvcmtpbmcodGhpcyxzKSx0aGlzfXNldFN0eWxlKHQsZT1vZSl7ZnVuY3Rpb24gbihyKXtyIT09dm9pZCAwJiZwYXJzZUZsb2F0KHIpPDEmJmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAiK3QrIiB3aWxsIGJlIGlnbm9yZWQuIil9bGV0IHM7aWYocz0vXihcdyspXCgoW15cKV0qKVwpLy5leGVjKHQpKXtsZXQgcjtjb25zdCBvPXNbMV0sYT1zWzJdO3N3aXRjaChvKXtjYXNlInJnYiI6Y2FzZSJyZ2JhIjppZihyPS9eXHMqKFxkKylccyosXHMqKFxkKylccyosXHMqKFxkKylccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIG4ocls0XSksdGhpcy5zZXRSR0IoTWF0aC5taW4oMjU1LHBhcnNlSW50KHJbMV0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KHJbMl0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KHJbM10sMTApKS8yNTUsZSk7aWYocj0vXlxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKGEpKXJldHVybiBuKHJbNF0pLHRoaXMuc2V0UkdCKE1hdGgubWluKDEwMCxwYXJzZUludChyWzFdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludChyWzJdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludChyWzNdLDEwKSkvMTAwLGUpO2JyZWFrO2Nhc2UiaHNsIjpjYXNlImhzbGEiOmlmKHI9L15ccyooXGQqXC4/XGQrKVxzKixccyooXGQqXC4/XGQrKVwlXHMqLFxzKihcZCpcLj9cZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIG4ocls0XSksdGhpcy5zZXRIU0wocGFyc2VGbG9hdChyWzFdKS8zNjAscGFyc2VGbG9hdChyWzJdKS8xMDAscGFyc2VGbG9hdChyWzNdKS8xMDAsZSk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yIG1vZGVsICIrdCl9fWVsc2UgaWYocz0vXlwjKFtBLUZhLWZcZF0rKSQvLmV4ZWModCkpe2NvbnN0IHI9c1sxXSxvPXIubGVuZ3RoO2lmKG89PT0zKXJldHVybiB0aGlzLnNldFJHQihwYXJzZUludChyLmNoYXJBdCgwKSwxNikvMTUscGFyc2VJbnQoci5jaGFyQXQoMSksMTYpLzE1LHBhcnNlSW50KHIuY2hhckF0KDIpLDE2KS8xNSxlKTtpZihvPT09NilyZXR1cm4gdGhpcy5zZXRIZXgocGFyc2VJbnQociwxNiksZSk7Y29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogSW52YWxpZCBoZXggY29sb3IgIit0KX1lbHNlIGlmKHQmJnQubGVuZ3RoPjApcmV0dXJuIHRoaXMuc2V0Q29sb3JOYW1lKHQsZSk7cmV0dXJuIHRoaXN9c2V0Q29sb3JOYW1lKHQsZT1vZSl7Y29uc3Qgbj1PY1t0LnRvTG93ZXJDYXNlKCldO3JldHVybiBuIT09dm9pZCAwP3RoaXMuc2V0SGV4KG4sZSk6Y29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAiK3QpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5yLHRoaXMuZyx0aGlzLmIpfWNvcHkodCl7cmV0dXJuIHRoaXMucj10LnIsdGhpcy5nPXQuZyx0aGlzLmI9dC5iLHRoaXN9Y29weVNSR0JUb0xpbmVhcih0KXtyZXR1cm4gdGhpcy5yPV9lKHQuciksdGhpcy5nPV9lKHQuZyksdGhpcy5iPV9lKHQuYiksdGhpc31jb3B5TGluZWFyVG9TUkdCKHQpe3JldHVybiB0aGlzLnI9SW4odC5yKSx0aGlzLmc9SW4odC5nKSx0aGlzLmI9SW4odC5iKSx0aGlzfWNvbnZlcnRTUkdCVG9MaW5lYXIoKXtyZXR1cm4gdGhpcy5jb3B5U1JHQlRvTGluZWFyKHRoaXMpLHRoaXN9Y29udmVydExpbmVhclRvU1JHQigpe3JldHVybiB0aGlzLmNvcHlMaW5lYXJUb1NSR0IodGhpcyksdGhpc31nZXRIZXgodD1vZSl7cmV0dXJuIGFlLndvcmtpbmdUb0NvbG9yU3BhY2UoU3QuY29weSh0aGlzKSx0KSxNYXRoLnJvdW5kKEcoU3QucioyNTUsMCwyNTUpKSo2NTUzNitNYXRoLnJvdW5kKEcoU3QuZyoyNTUsMCwyNTUpKSoyNTYrTWF0aC5yb3VuZChHKFN0LmIqMjU1LDAsMjU1KSl9Z2V0SGV4U3RyaW5nKHQ9b2Upe3JldHVybigiMDAwMDAwIit0aGlzLmdldEhleCh0KS50b1N0cmluZygxNikpLnNsaWNlKC02KX1nZXRIU0wodCxlPWFlLndvcmtpbmdDb2xvclNwYWNlKXthZS53b3JraW5nVG9Db2xvclNwYWNlKFN0LmNvcHkodGhpcyksZSk7Y29uc3Qgbj1TdC5yLHM9U3QuZyxyPVN0LmIsbz1NYXRoLm1heChuLHMsciksYT1NYXRoLm1pbihuLHMscik7bGV0IGMsbDtjb25zdCBoPShhK28pLzI7aWYoYT09PW8pYz0wLGw9MDtlbHNle2NvbnN0IHU9by1hO3N3aXRjaChsPWg8PS41P3UvKG8rYSk6dS8oMi1vLWEpLG8pe2Nhc2UgbjpjPShzLXIpL3UrKHM8cj82OjApO2JyZWFrO2Nhc2UgczpjPShyLW4pL3UrMjticmVhaztjYXNlIHI6Yz0obi1zKS91KzQ7YnJlYWt9Yy89Nn1yZXR1cm4gdC5oPWMsdC5zPWwsdC5sPWgsdH1nZXRSR0IodCxlPWFlLndvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gYWUud29ya2luZ1RvQ29sb3JTcGFjZShTdC5jb3B5KHRoaXMpLGUpLHQucj1TdC5yLHQuZz1TdC5nLHQuYj1TdC5iLHR9Z2V0U3R5bGUodD1vZSl7YWUud29ya2luZ1RvQ29sb3JTcGFjZShTdC5jb3B5KHRoaXMpLHQpO2NvbnN0IGU9U3QucixuPVN0Lmcscz1TdC5iO3JldHVybiB0IT09b2U/YGNvbG9yKCR7dH0gJHtlLnRvRml4ZWQoMyl9ICR7bi50b0ZpeGVkKDMpfSAke3MudG9GaXhlZCgzKX0pYDpgcmdiKCR7TWF0aC5yb3VuZChlKjI1NSl9LCR7TWF0aC5yb3VuZChuKjI1NSl9LCR7TWF0aC5yb3VuZChzKjI1NSl9KWB9b2Zmc2V0SFNMKHQsZSxuKXtyZXR1cm4gdGhpcy5nZXRIU0woUWUpLHRoaXMuc2V0SFNMKFFlLmgrdCxRZS5zK2UsUWUubCtuKX1hZGQodCl7cmV0dXJuIHRoaXMucis9dC5yLHRoaXMuZys9dC5nLHRoaXMuYis9dC5iLHRoaXN9YWRkQ29sb3JzKHQsZSl7cmV0dXJuIHRoaXMucj10LnIrZS5yLHRoaXMuZz10LmcrZS5nLHRoaXMuYj10LmIrZS5iLHRoaXN9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLnIrPXQsdGhpcy5nKz10LHRoaXMuYis9dCx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy5yPU1hdGgubWF4KDAsdGhpcy5yLXQuciksdGhpcy5nPU1hdGgubWF4KDAsdGhpcy5nLXQuZyksdGhpcy5iPU1hdGgubWF4KDAsdGhpcy5iLXQuYiksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5yKj10LnIsdGhpcy5nKj10LmcsdGhpcy5iKj10LmIsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy5yKj10LHRoaXMuZyo9dCx0aGlzLmIqPXQsdGhpc31sZXJwKHQsZSl7cmV0dXJuIHRoaXMucis9KHQuci10aGlzLnIpKmUsdGhpcy5nKz0odC5nLXRoaXMuZykqZSx0aGlzLmIrPSh0LmItdGhpcy5iKSplLHRoaXN9bGVycENvbG9ycyh0LGUsbil7cmV0dXJuIHRoaXMucj10LnIrKGUuci10LnIpKm4sdGhpcy5nPXQuZysoZS5nLXQuZykqbix0aGlzLmI9dC5iKyhlLmItdC5iKSpuLHRoaXN9bGVycEhTTCh0LGUpe3RoaXMuZ2V0SFNMKFFlKSx0LmdldEhTTChncyk7Y29uc3Qgbj1pbyhRZS5oLGdzLmgsZSkscz1pbyhRZS5zLGdzLnMsZSkscj1pbyhRZS5sLGdzLmwsZSk7cmV0dXJuIHRoaXMuc2V0SFNMKG4scyxyKSx0aGlzfXNldEZyb21WZWN0b3IzKHQpe3JldHVybiB0aGlzLnI9dC54LHRoaXMuZz10LnksdGhpcy5iPXQueix0aGlzfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMucixuPXRoaXMuZyxzPXRoaXMuYixyPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMucj1yWzBdKmUrclszXSpuK3JbNl0qcyx0aGlzLmc9clsxXSplK3JbNF0qbityWzddKnMsdGhpcy5iPXJbMl0qZStyWzVdKm4rcls4XSpzLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0LnI9PT10aGlzLnImJnQuZz09PXRoaXMuZyYmdC5iPT09dGhpcy5ifWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMucj10W2VdLHRoaXMuZz10W2UrMV0sdGhpcy5iPXRbZSsyXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMucix0W2UrMV09dGhpcy5nLHRbZSsyXT10aGlzLmIsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMucj10LmdldFgoZSksdGhpcy5nPXQuZ2V0WShlKSx0aGlzLmI9dC5nZXRaKGUpLHRoaXN9dG9KU09OKCl7cmV0dXJuIHRoaXMuZ2V0SGV4KCl9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5yLHlpZWxkIHRoaXMuZyx5aWVsZCB0aGlzLmJ9fTtjb25zdCBTdD1uZXcgeHM7eHMuTkFNRVM9T2M7bGV0IG1mPTA7Y2xhc3MgZ2YgZXh0ZW5kcyBsc3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc01hdGVyaWFsPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOm1mKyt9KSx0aGlzLnV1aWQ9Rm4oKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJNYXRlcmlhbCIsdGhpcy5ibGVuZGluZz0xLHRoaXMuc2lkZT0wLHRoaXMudmVydGV4Q29sb3JzPSExLHRoaXMub3BhY2l0eT0xLHRoaXMudHJhbnNwYXJlbnQ9ITEsdGhpcy5hbHBoYUhhc2g9ITEsdGhpcy5ibGVuZFNyYz0yMDQsdGhpcy5ibGVuZERzdD0yMDUsdGhpcy5ibGVuZEVxdWF0aW9uPTEwMCx0aGlzLmJsZW5kU3JjQWxwaGE9bnVsbCx0aGlzLmJsZW5kRHN0QWxwaGE9bnVsbCx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT1udWxsLHRoaXMuYmxlbmRDb2xvcj1uZXcgeHMoMCwwLDApLHRoaXMuYmxlbmRBbHBoYT0wLHRoaXMuZGVwdGhGdW5jPTMsdGhpcy5kZXB0aFRlc3Q9ITAsdGhpcy5kZXB0aFdyaXRlPSEwLHRoaXMuc3RlbmNpbFdyaXRlTWFzaz0yNTUsdGhpcy5zdGVuY2lsRnVuYz01MTksdGhpcy5zdGVuY2lsUmVmPTAsdGhpcy5zdGVuY2lsRnVuY01hc2s9MjU1LHRoaXMuc3RlbmNpbEZhaWw9NzY4MCx0aGlzLnN0ZW5jaWxaRmFpbD03NjgwLHRoaXMuc3RlbmNpbFpQYXNzPTc2ODAsdGhpcy5zdGVuY2lsV3JpdGU9ITEsdGhpcy5jbGlwcGluZ1BsYW5lcz1udWxsLHRoaXMuY2xpcEludGVyc2VjdGlvbj0hMSx0aGlzLmNsaXBTaGFkb3dzPSExLHRoaXMuc2hhZG93U2lkZT1udWxsLHRoaXMuY29sb3JXcml0ZT0hMCx0aGlzLnByZWNpc2lvbj1udWxsLHRoaXMucG9seWdvbk9mZnNldD0hMSx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9MCx0aGlzLnBvbHlnb25PZmZzZXRVbml0cz0wLHRoaXMuZGl0aGVyaW5nPSExLHRoaXMuYWxwaGFUb0NvdmVyYWdlPSExLHRoaXMucHJlbXVsdGlwbGllZEFscGhhPSExLHRoaXMuZm9yY2VTaW5nbGVQYXNzPSExLHRoaXMuYWxsb3dPdmVycmlkZT0hMCx0aGlzLnZpc2libGU9ITAsdGhpcy50b25lTWFwcGVkPSEwLHRoaXMudXNlckRhdGE9e30sdGhpcy52ZXJzaW9uPTAsdGhpcy5fYWxwaGFUZXN0PTB9Z2V0IGFscGhhVGVzdCgpe3JldHVybiB0aGlzLl9hbHBoYVRlc3R9c2V0IGFscGhhVGVzdCh0KXt0aGlzLl9hbHBoYVRlc3Q+MCE9dD4wJiZ0aGlzLnZlcnNpb24rKyx0aGlzLl9hbHBoYVRlc3Q9dH1vbkJlZm9yZVJlbmRlcigpe31vbkJlZm9yZUNvbXBpbGUoKXt9Y3VzdG9tUHJvZ3JhbUNhY2hlS2V5KCl7cmV0dXJuIHRoaXMub25CZWZvcmVDb21waWxlLnRvU3RyaW5nKCl9c2V0VmFsdWVzKHQpe2lmKHQhPT12b2lkIDApZm9yKGNvbnN0IGUgaW4gdCl7Y29uc3Qgbj10W2VdO2lmKG49PT12b2lkIDApe2NvbnNvbGUud2FybihgVEhSRUUuTWF0ZXJpYWw6IHBhcmFtZXRlciAnJHtlfScgaGFzIHZhbHVlIG9mIHVuZGVmaW5lZC5gKTtjb250aW51ZX1jb25zdCBzPXRoaXNbZV07aWYocz09PXZvaWQgMCl7Y29uc29sZS53YXJuKGBUSFJFRS5NYXRlcmlhbDogJyR7ZX0nIGlzIG5vdCBhIHByb3BlcnR5IG9mIFRIUkVFLiR7dGhpcy50eXBlfS5gKTtjb250aW51ZX1zJiZzLmlzQ29sb3I/cy5zZXQobik6cyYmcy5pc1ZlY3RvcjMmJm4mJm4uaXNWZWN0b3IzP3MuY29weShuKTp0aGlzW2VdPW59fXRvSlNPTih0KXtjb25zdCBlPXQ9PT12b2lkIDB8fHR5cGVvZiB0PT0ic3RyaW5nIjtlJiYodD17dGV4dHVyZXM6e30saW1hZ2VzOnt9fSk7Y29uc3Qgbj17bWV0YWRhdGE6e3ZlcnNpb246NC43LHR5cGU6Ik1hdGVyaWFsIixnZW5lcmF0b3I6Ik1hdGVyaWFsLnRvSlNPTiJ9fTtuLnV1aWQ9dGhpcy51dWlkLG4udHlwZT10aGlzLnR5cGUsdGhpcy5uYW1lIT09IiImJihuLm5hbWU9dGhpcy5uYW1lKSx0aGlzLmNvbG9yJiZ0aGlzLmNvbG9yLmlzQ29sb3ImJihuLmNvbG9yPXRoaXMuY29sb3IuZ2V0SGV4KCkpLHRoaXMucm91Z2huZXNzIT09dm9pZCAwJiYobi5yb3VnaG5lc3M9dGhpcy5yb3VnaG5lc3MpLHRoaXMubWV0YWxuZXNzIT09dm9pZCAwJiYobi5tZXRhbG5lc3M9dGhpcy5tZXRhbG5lc3MpLHRoaXMuc2hlZW4hPT12b2lkIDAmJihuLnNoZWVuPXRoaXMuc2hlZW4pLHRoaXMuc2hlZW5Db2xvciYmdGhpcy5zaGVlbkNvbG9yLmlzQ29sb3ImJihuLnNoZWVuQ29sb3I9dGhpcy5zaGVlbkNvbG9yLmdldEhleCgpKSx0aGlzLnNoZWVuUm91Z2huZXNzIT09dm9pZCAwJiYobi5zaGVlblJvdWdobmVzcz10aGlzLnNoZWVuUm91Z2huZXNzKSx0aGlzLmVtaXNzaXZlJiZ0aGlzLmVtaXNzaXZlLmlzQ29sb3ImJihuLmVtaXNzaXZlPXRoaXMuZW1pc3NpdmUuZ2V0SGV4KCkpLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkhPT12b2lkIDAmJnRoaXMuZW1pc3NpdmVJbnRlbnNpdHkhPT0xJiYobi5lbWlzc2l2ZUludGVuc2l0eT10aGlzLmVtaXNzaXZlSW50ZW5zaXR5KSx0aGlzLnNwZWN1bGFyJiZ0aGlzLnNwZWN1bGFyLmlzQ29sb3ImJihuLnNwZWN1bGFyPXRoaXMuc3BlY3VsYXIuZ2V0SGV4KCkpLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHkhPT12b2lkIDAmJihuLnNwZWN1bGFySW50ZW5zaXR5PXRoaXMuc3BlY3VsYXJJbnRlbnNpdHkpLHRoaXMuc3BlY3VsYXJDb2xvciYmdGhpcy5zcGVjdWxhckNvbG9yLmlzQ29sb3ImJihuLnNwZWN1bGFyQ29sb3I9dGhpcy5zcGVjdWxhckNvbG9yLmdldEhleCgpKSx0aGlzLnNoaW5pbmVzcyE9PXZvaWQgMCYmKG4uc2hpbmluZXNzPXRoaXMuc2hpbmluZXNzKSx0aGlzLmNsZWFyY29hdCE9PXZvaWQgMCYmKG4uY2xlYXJjb2F0PXRoaXMuY2xlYXJjb2F0KSx0aGlzLmNsZWFyY29hdFJvdWdobmVzcyE9PXZvaWQgMCYmKG4uY2xlYXJjb2F0Um91Z2huZXNzPXRoaXMuY2xlYXJjb2F0Um91Z2huZXNzKSx0aGlzLmNsZWFyY29hdE1hcCYmdGhpcy5jbGVhcmNvYXRNYXAuaXNUZXh0dXJlJiYobi5jbGVhcmNvYXRNYXA9dGhpcy5jbGVhcmNvYXRNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwJiZ0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcC5pc1RleHR1cmUmJihuLmNsZWFyY29hdFJvdWdobmVzc01hcD10aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAmJnRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwLmlzVGV4dHVyZSYmKG4uY2xlYXJjb2F0Tm9ybWFsTWFwPXRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwLnRvSlNPTih0KS51dWlkLG4uY2xlYXJjb2F0Tm9ybWFsU2NhbGU9dGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZS50b0FycmF5KCkpLHRoaXMuc2hlZW5Db2xvck1hcCYmdGhpcy5zaGVlbkNvbG9yTWFwLmlzVGV4dHVyZSYmKG4uc2hlZW5Db2xvck1hcD10aGlzLnNoZWVuQ29sb3JNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc2hlZW5Sb3VnaG5lc3NNYXAmJnRoaXMuc2hlZW5Sb3VnaG5lc3NNYXAuaXNUZXh0dXJlJiYobi5zaGVlblJvdWdobmVzc01hcD10aGlzLnNoZWVuUm91Z2huZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmRpc3BlcnNpb24hPT12b2lkIDAmJihuLmRpc3BlcnNpb249dGhpcy5kaXNwZXJzaW9uKSx0aGlzLmlyaWRlc2NlbmNlIT09dm9pZCAwJiYobi5pcmlkZXNjZW5jZT10aGlzLmlyaWRlc2NlbmNlKSx0aGlzLmlyaWRlc2NlbmNlSU9SIT09dm9pZCAwJiYobi5pcmlkZXNjZW5jZUlPUj10aGlzLmlyaWRlc2NlbmNlSU9SKSx0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UhPT12b2lkIDAmJihuLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2U9dGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlKSx0aGlzLmlyaWRlc2NlbmNlTWFwJiZ0aGlzLmlyaWRlc2NlbmNlTWFwLmlzVGV4dHVyZSYmKG4uaXJpZGVzY2VuY2VNYXA9dGhpcy5pcmlkZXNjZW5jZU1hcC50b0pTT04odCkudXVpZCksdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCYmdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcC5pc1RleHR1cmUmJihuLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwPXRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuYW5pc290cm9weSE9PXZvaWQgMCYmKG4uYW5pc290cm9weT10aGlzLmFuaXNvdHJvcHkpLHRoaXMuYW5pc290cm9weVJvdGF0aW9uIT09dm9pZCAwJiYobi5hbmlzb3Ryb3B5Um90YXRpb249dGhpcy5hbmlzb3Ryb3B5Um90YXRpb24pLHRoaXMuYW5pc290cm9weU1hcCYmdGhpcy5hbmlzb3Ryb3B5TWFwLmlzVGV4dHVyZSYmKG4uYW5pc290cm9weU1hcD10aGlzLmFuaXNvdHJvcHlNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubWFwJiZ0aGlzLm1hcC5pc1RleHR1cmUmJihuLm1hcD10aGlzLm1hcC50b0pTT04odCkudXVpZCksdGhpcy5tYXRjYXAmJnRoaXMubWF0Y2FwLmlzVGV4dHVyZSYmKG4ubWF0Y2FwPXRoaXMubWF0Y2FwLnRvSlNPTih0KS51dWlkKSx0aGlzLmFscGhhTWFwJiZ0aGlzLmFscGhhTWFwLmlzVGV4dHVyZSYmKG4uYWxwaGFNYXA9dGhpcy5hbHBoYU1hcC50b0pTT04odCkudXVpZCksdGhpcy5saWdodE1hcCYmdGhpcy5saWdodE1hcC5pc1RleHR1cmUmJihuLmxpZ2h0TWFwPXRoaXMubGlnaHRNYXAudG9KU09OKHQpLnV1aWQsbi5saWdodE1hcEludGVuc2l0eT10aGlzLmxpZ2h0TWFwSW50ZW5zaXR5KSx0aGlzLmFvTWFwJiZ0aGlzLmFvTWFwLmlzVGV4dHVyZSYmKG4uYW9NYXA9dGhpcy5hb01hcC50b0pTT04odCkudXVpZCxuLmFvTWFwSW50ZW5zaXR5PXRoaXMuYW9NYXBJbnRlbnNpdHkpLHRoaXMuYnVtcE1hcCYmdGhpcy5idW1wTWFwLmlzVGV4dHVyZSYmKG4uYnVtcE1hcD10aGlzLmJ1bXBNYXAudG9KU09OKHQpLnV1aWQsbi5idW1wU2NhbGU9dGhpcy5idW1wU2NhbGUpLHRoaXMubm9ybWFsTWFwJiZ0aGlzLm5vcm1hbE1hcC5pc1RleHR1cmUmJihuLm5vcm1hbE1hcD10aGlzLm5vcm1hbE1hcC50b0pTT04odCkudXVpZCxuLm5vcm1hbE1hcFR5cGU9dGhpcy5ub3JtYWxNYXBUeXBlLG4ubm9ybWFsU2NhbGU9dGhpcy5ub3JtYWxTY2FsZS50b0FycmF5KCkpLHRoaXMuZGlzcGxhY2VtZW50TWFwJiZ0aGlzLmRpc3BsYWNlbWVudE1hcC5pc1RleHR1cmUmJihuLmRpc3BsYWNlbWVudE1hcD10aGlzLmRpc3BsYWNlbWVudE1hcC50b0pTT04odCkudXVpZCxuLmRpc3BsYWNlbWVudFNjYWxlPXRoaXMuZGlzcGxhY2VtZW50U2NhbGUsbi5kaXNwbGFjZW1lbnRCaWFzPXRoaXMuZGlzcGxhY2VtZW50QmlhcyksdGhpcy5yb3VnaG5lc3NNYXAmJnRoaXMucm91Z2huZXNzTWFwLmlzVGV4dHVyZSYmKG4ucm91Z2huZXNzTWFwPXRoaXMucm91Z2huZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLm1ldGFsbmVzc01hcCYmdGhpcy5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlJiYobi5tZXRhbG5lc3NNYXA9dGhpcy5tZXRhbG5lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuZW1pc3NpdmVNYXAmJnRoaXMuZW1pc3NpdmVNYXAuaXNUZXh0dXJlJiYobi5lbWlzc2l2ZU1hcD10aGlzLmVtaXNzaXZlTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnNwZWN1bGFyTWFwJiZ0aGlzLnNwZWN1bGFyTWFwLmlzVGV4dHVyZSYmKG4uc3BlY3VsYXJNYXA9dGhpcy5zcGVjdWxhck1hcC50b0pTT04odCkudXVpZCksdGhpcy5zcGVjdWxhckludGVuc2l0eU1hcCYmdGhpcy5zcGVjdWxhckludGVuc2l0eU1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFySW50ZW5zaXR5TWFwPXRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc3BlY3VsYXJDb2xvck1hcCYmdGhpcy5zcGVjdWxhckNvbG9yTWFwLmlzVGV4dHVyZSYmKG4uc3BlY3VsYXJDb2xvck1hcD10aGlzLnNwZWN1bGFyQ29sb3JNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuZW52TWFwJiZ0aGlzLmVudk1hcC5pc1RleHR1cmUmJihuLmVudk1hcD10aGlzLmVudk1hcC50b0pTT04odCkudXVpZCx0aGlzLmNvbWJpbmUhPT12b2lkIDAmJihuLmNvbWJpbmU9dGhpcy5jb21iaW5lKSksdGhpcy5lbnZNYXBSb3RhdGlvbiE9PXZvaWQgMCYmKG4uZW52TWFwUm90YXRpb249dGhpcy5lbnZNYXBSb3RhdGlvbi50b0FycmF5KCkpLHRoaXMuZW52TWFwSW50ZW5zaXR5IT09dm9pZCAwJiYobi5lbnZNYXBJbnRlbnNpdHk9dGhpcy5lbnZNYXBJbnRlbnNpdHkpLHRoaXMucmVmbGVjdGl2aXR5IT09dm9pZCAwJiYobi5yZWZsZWN0aXZpdHk9dGhpcy5yZWZsZWN0aXZpdHkpLHRoaXMucmVmcmFjdGlvblJhdGlvIT09dm9pZCAwJiYobi5yZWZyYWN0aW9uUmF0aW89dGhpcy5yZWZyYWN0aW9uUmF0aW8pLHRoaXMuZ3JhZGllbnRNYXAmJnRoaXMuZ3JhZGllbnRNYXAuaXNUZXh0dXJlJiYobi5ncmFkaWVudE1hcD10aGlzLmdyYWRpZW50TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnRyYW5zbWlzc2lvbiE9PXZvaWQgMCYmKG4udHJhbnNtaXNzaW9uPXRoaXMudHJhbnNtaXNzaW9uKSx0aGlzLnRyYW5zbWlzc2lvbk1hcCYmdGhpcy50cmFuc21pc3Npb25NYXAuaXNUZXh0dXJlJiYobi50cmFuc21pc3Npb25NYXA9dGhpcy50cmFuc21pc3Npb25NYXAudG9KU09OKHQpLnV1aWQpLHRoaXMudGhpY2tuZXNzIT09dm9pZCAwJiYobi50aGlja25lc3M9dGhpcy50aGlja25lc3MpLHRoaXMudGhpY2tuZXNzTWFwJiZ0aGlzLnRoaWNrbmVzc01hcC5pc1RleHR1cmUmJihuLnRoaWNrbmVzc01hcD10aGlzLnRoaWNrbmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlIT09dm9pZCAwJiZ0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2UhPT0xLzAmJihuLmF0dGVudWF0aW9uRGlzdGFuY2U9dGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlKSx0aGlzLmF0dGVudWF0aW9uQ29sb3IhPT12b2lkIDAmJihuLmF0dGVudWF0aW9uQ29sb3I9dGhpcy5hdHRlbnVhdGlvbkNvbG9yLmdldEhleCgpKSx0aGlzLnNpemUhPT12b2lkIDAmJihuLnNpemU9dGhpcy5zaXplKSx0aGlzLnNoYWRvd1NpZGUhPT1udWxsJiYobi5zaGFkb3dTaWRlPXRoaXMuc2hhZG93U2lkZSksdGhpcy5zaXplQXR0ZW51YXRpb24hPT12b2lkIDAmJihuLnNpemVBdHRlbnVhdGlvbj10aGlzLnNpemVBdHRlbnVhdGlvbiksdGhpcy5ibGVuZGluZyE9PTEmJihuLmJsZW5kaW5nPXRoaXMuYmxlbmRpbmcpLHRoaXMuc2lkZSE9PTAmJihuLnNpZGU9dGhpcy5zaWRlKSx0aGlzLnZlcnRleENvbG9ycz09PSEwJiYobi52ZXJ0ZXhDb2xvcnM9ITApLHRoaXMub3BhY2l0eTwxJiYobi5vcGFjaXR5PXRoaXMub3BhY2l0eSksdGhpcy50cmFuc3BhcmVudD09PSEwJiYobi50cmFuc3BhcmVudD0hMCksdGhpcy5ibGVuZFNyYyE9PTIwNCYmKG4uYmxlbmRTcmM9dGhpcy5ibGVuZFNyYyksdGhpcy5ibGVuZERzdCE9PTIwNSYmKG4uYmxlbmREc3Q9dGhpcy5ibGVuZERzdCksdGhpcy5ibGVuZEVxdWF0aW9uIT09MTAwJiYobi5ibGVuZEVxdWF0aW9uPXRoaXMuYmxlbmRFcXVhdGlvbiksdGhpcy5ibGVuZFNyY0FscGhhIT09bnVsbCYmKG4uYmxlbmRTcmNBbHBoYT10aGlzLmJsZW5kU3JjQWxwaGEpLHRoaXMuYmxlbmREc3RBbHBoYSE9PW51bGwmJihuLmJsZW5kRHN0QWxwaGE9dGhpcy5ibGVuZERzdEFscGhhKSx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSE9PW51bGwmJihuLmJsZW5kRXF1YXRpb25BbHBoYT10aGlzLmJsZW5kRXF1YXRpb25BbHBoYSksdGhpcy5ibGVuZENvbG9yJiZ0aGlzLmJsZW5kQ29sb3IuaXNDb2xvciYmKG4uYmxlbmRDb2xvcj10aGlzLmJsZW5kQ29sb3IuZ2V0SGV4KCkpLHRoaXMuYmxlbmRBbHBoYSE9PTAmJihuLmJsZW5kQWxwaGE9dGhpcy5ibGVuZEFscGhhKSx0aGlzLmRlcHRoRnVuYyE9PTMmJihuLmRlcHRoRnVuYz10aGlzLmRlcHRoRnVuYyksdGhpcy5kZXB0aFRlc3Q9PT0hMSYmKG4uZGVwdGhUZXN0PXRoaXMuZGVwdGhUZXN0KSx0aGlzLmRlcHRoV3JpdGU9PT0hMSYmKG4uZGVwdGhXcml0ZT10aGlzLmRlcHRoV3JpdGUpLHRoaXMuY29sb3JXcml0ZT09PSExJiYobi5jb2xvcldyaXRlPXRoaXMuY29sb3JXcml0ZSksdGhpcy5zdGVuY2lsV3JpdGVNYXNrIT09MjU1JiYobi5zdGVuY2lsV3JpdGVNYXNrPXRoaXMuc3RlbmNpbFdyaXRlTWFzayksdGhpcy5zdGVuY2lsRnVuYyE9PTUxOSYmKG4uc3RlbmNpbEZ1bmM9dGhpcy5zdGVuY2lsRnVuYyksdGhpcy5zdGVuY2lsUmVmIT09MCYmKG4uc3RlbmNpbFJlZj10aGlzLnN0ZW5jaWxSZWYpLHRoaXMuc3RlbmNpbEZ1bmNNYXNrIT09MjU1JiYobi5zdGVuY2lsRnVuY01hc2s9dGhpcy5zdGVuY2lsRnVuY01hc2spLHRoaXMuc3RlbmNpbEZhaWwhPT03NjgwJiYobi5zdGVuY2lsRmFpbD10aGlzLnN0ZW5jaWxGYWlsKSx0aGlzLnN0ZW5jaWxaRmFpbCE9PTc2ODAmJihuLnN0ZW5jaWxaRmFpbD10aGlzLnN0ZW5jaWxaRmFpbCksdGhpcy5zdGVuY2lsWlBhc3MhPT03NjgwJiYobi5zdGVuY2lsWlBhc3M9dGhpcy5zdGVuY2lsWlBhc3MpLHRoaXMuc3RlbmNpbFdyaXRlPT09ITAmJihuLnN0ZW5jaWxXcml0ZT10aGlzLnN0ZW5jaWxXcml0ZSksdGhpcy5yb3RhdGlvbiE9PXZvaWQgMCYmdGhpcy5yb3RhdGlvbiE9PTAmJihuLnJvdGF0aW9uPXRoaXMucm90YXRpb24pLHRoaXMucG9seWdvbk9mZnNldD09PSEwJiYobi5wb2x5Z29uT2Zmc2V0PSEwKSx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IhPT0wJiYobi5wb2x5Z29uT2Zmc2V0RmFjdG9yPXRoaXMucG9seWdvbk9mZnNldEZhY3RvciksdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMhPT0wJiYobi5wb2x5Z29uT2Zmc2V0VW5pdHM9dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMpLHRoaXMubGluZXdpZHRoIT09dm9pZCAwJiZ0aGlzLmxpbmV3aWR0aCE9PTEmJihuLmxpbmV3aWR0aD10aGlzLmxpbmV3aWR0aCksdGhpcy5kYXNoU2l6ZSE9PXZvaWQgMCYmKG4uZGFzaFNpemU9dGhpcy5kYXNoU2l6ZSksdGhpcy5nYXBTaXplIT09dm9pZCAwJiYobi5nYXBTaXplPXRoaXMuZ2FwU2l6ZSksdGhpcy5zY2FsZSE9PXZvaWQgMCYmKG4uc2NhbGU9dGhpcy5zY2FsZSksdGhpcy5kaXRoZXJpbmc9PT0hMCYmKG4uZGl0aGVyaW5nPSEwKSx0aGlzLmFscGhhVGVzdD4wJiYobi5hbHBoYVRlc3Q9dGhpcy5hbHBoYVRlc3QpLHRoaXMuYWxwaGFIYXNoPT09ITAmJihuLmFscGhhSGFzaD0hMCksdGhpcy5hbHBoYVRvQ292ZXJhZ2U9PT0hMCYmKG4uYWxwaGFUb0NvdmVyYWdlPSEwKSx0aGlzLnByZW11bHRpcGxpZWRBbHBoYT09PSEwJiYobi5wcmVtdWx0aXBsaWVkQWxwaGE9ITApLHRoaXMuZm9yY2VTaW5nbGVQYXNzPT09ITAmJihuLmZvcmNlU2luZ2xlUGFzcz0hMCksdGhpcy53aXJlZnJhbWU9PT0hMCYmKG4ud2lyZWZyYW1lPSEwKSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD4xJiYobi53aXJlZnJhbWVMaW5ld2lkdGg9dGhpcy53aXJlZnJhbWVMaW5ld2lkdGgpLHRoaXMud2lyZWZyYW1lTGluZWNhcCE9PSJyb3VuZCImJihuLndpcmVmcmFtZUxpbmVjYXA9dGhpcy53aXJlZnJhbWVMaW5lY2FwKSx0aGlzLndpcmVmcmFtZUxpbmVqb2luIT09InJvdW5kIiYmKG4ud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lam9pbiksdGhpcy5mbGF0U2hhZGluZz09PSEwJiYobi5mbGF0U2hhZGluZz0hMCksdGhpcy52aXNpYmxlPT09ITEmJihuLnZpc2libGU9ITEpLHRoaXMudG9uZU1hcHBlZD09PSExJiYobi50b25lTWFwcGVkPSExKSx0aGlzLmZvZz09PSExJiYobi5mb2c9ITEpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYobi51c2VyRGF0YT10aGlzLnVzZXJEYXRhKTtmdW5jdGlvbiBzKHIpe2NvbnN0IG89W107Zm9yKGNvbnN0IGEgaW4gcil7Y29uc3QgYz1yW2FdO2RlbGV0ZSBjLm1ldGFkYXRhLG8ucHVzaChjKX1yZXR1cm4gb31pZihlKXtjb25zdCByPXModC50ZXh0dXJlcyksbz1zKHQuaW1hZ2VzKTtyLmxlbmd0aD4wJiYobi50ZXh0dXJlcz1yKSxvLmxlbmd0aD4wJiYobi5pbWFnZXM9byl9cmV0dXJuIG59Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7dGhpcy5uYW1lPXQubmFtZSx0aGlzLmJsZW5kaW5nPXQuYmxlbmRpbmcsdGhpcy5zaWRlPXQuc2lkZSx0aGlzLnZlcnRleENvbG9ycz10LnZlcnRleENvbG9ycyx0aGlzLm9wYWNpdHk9dC5vcGFjaXR5LHRoaXMudHJhbnNwYXJlbnQ9dC50cmFuc3BhcmVudCx0aGlzLmJsZW5kU3JjPXQuYmxlbmRTcmMsdGhpcy5ibGVuZERzdD10LmJsZW5kRHN0LHRoaXMuYmxlbmRFcXVhdGlvbj10LmJsZW5kRXF1YXRpb24sdGhpcy5ibGVuZFNyY0FscGhhPXQuYmxlbmRTcmNBbHBoYSx0aGlzLmJsZW5kRHN0QWxwaGE9dC5ibGVuZERzdEFscGhhLHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhPXQuYmxlbmRFcXVhdGlvbkFscGhhLHRoaXMuYmxlbmRDb2xvci5jb3B5KHQuYmxlbmRDb2xvciksdGhpcy5ibGVuZEFscGhhPXQuYmxlbmRBbHBoYSx0aGlzLmRlcHRoRnVuYz10LmRlcHRoRnVuYyx0aGlzLmRlcHRoVGVzdD10LmRlcHRoVGVzdCx0aGlzLmRlcHRoV3JpdGU9dC5kZXB0aFdyaXRlLHRoaXMuc3RlbmNpbFdyaXRlTWFzaz10LnN0ZW5jaWxXcml0ZU1hc2ssdGhpcy5zdGVuY2lsRnVuYz10LnN0ZW5jaWxGdW5jLHRoaXMuc3RlbmNpbFJlZj10LnN0ZW5jaWxSZWYsdGhpcy5zdGVuY2lsRnVuY01hc2s9dC5zdGVuY2lsRnVuY01hc2ssdGhpcy5zdGVuY2lsRmFpbD10LnN0ZW5jaWxGYWlsLHRoaXMuc3RlbmNpbFpGYWlsPXQuc3RlbmNpbFpGYWlsLHRoaXMuc3RlbmNpbFpQYXNzPXQuc3RlbmNpbFpQYXNzLHRoaXMuc3RlbmNpbFdyaXRlPXQuc3RlbmNpbFdyaXRlO2NvbnN0IGU9dC5jbGlwcGluZ1BsYW5lcztsZXQgbj1udWxsO2lmKGUhPT1udWxsKXtjb25zdCBzPWUubGVuZ3RoO249bmV3IEFycmF5KHMpO2ZvcihsZXQgcj0wO3IhPT1zOysrciluW3JdPWVbcl0uY2xvbmUoKX1yZXR1cm4gdGhpcy5jbGlwcGluZ1BsYW5lcz1uLHRoaXMuY2xpcEludGVyc2VjdGlvbj10LmNsaXBJbnRlcnNlY3Rpb24sdGhpcy5jbGlwU2hhZG93cz10LmNsaXBTaGFkb3dzLHRoaXMuc2hhZG93U2lkZT10LnNoYWRvd1NpZGUsdGhpcy5jb2xvcldyaXRlPXQuY29sb3JXcml0ZSx0aGlzLnByZWNpc2lvbj10LnByZWNpc2lvbix0aGlzLnBvbHlnb25PZmZzZXQ9dC5wb2x5Z29uT2Zmc2V0LHRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj10LnBvbHlnb25PZmZzZXRGYWN0b3IsdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHM9dC5wb2x5Z29uT2Zmc2V0VW5pdHMsdGhpcy5kaXRoZXJpbmc9dC5kaXRoZXJpbmcsdGhpcy5hbHBoYVRlc3Q9dC5hbHBoYVRlc3QsdGhpcy5hbHBoYUhhc2g9dC5hbHBoYUhhc2gsdGhpcy5hbHBoYVRvQ292ZXJhZ2U9dC5hbHBoYVRvQ292ZXJhZ2UsdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9dC5wcmVtdWx0aXBsaWVkQWxwaGEsdGhpcy5mb3JjZVNpbmdsZVBhc3M9dC5mb3JjZVNpbmdsZVBhc3MsdGhpcy52aXNpYmxlPXQudmlzaWJsZSx0aGlzLnRvbmVNYXBwZWQ9dC50b25lTWFwcGVkLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfX1jbGFzcyB4ZiBleHRlbmRzIGdme2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc01lc2hCYXNpY01hdGVyaWFsPSEwLHRoaXMudHlwZT0iTWVzaEJhc2ljTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IHhzKDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLnNwZWN1bGFyTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5lbnZNYXBSb3RhdGlvbj1uZXcgQWksdGhpcy5jb21iaW5lPTAsdGhpcy5yZWZsZWN0aXZpdHk9MSx0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTgsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXA9dC5tYXAsdGhpcy5saWdodE1hcD10LmxpZ2h0TWFwLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9dC5saWdodE1hcEludGVuc2l0eSx0aGlzLmFvTWFwPXQuYW9NYXAsdGhpcy5hb01hcEludGVuc2l0eT10LmFvTWFwSW50ZW5zaXR5LHRoaXMuc3BlY3VsYXJNYXA9dC5zcGVjdWxhck1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5lbnZNYXA9dC5lbnZNYXAsdGhpcy5lbnZNYXBSb3RhdGlvbi5jb3B5KHQuZW52TWFwUm90YXRpb24pLHRoaXMuY29tYmluZT10LmNvbWJpbmUsdGhpcy5yZWZsZWN0aXZpdHk9dC5yZWZsZWN0aXZpdHksdGhpcy5yZWZyYWN0aW9uUmF0aW89dC5yZWZyYWN0aW9uUmF0aW8sdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPXQud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPXQud2lyZWZyYW1lTGluZWpvaW4sdGhpcy5mb2c9dC5mb2csdGhpc319Y29uc3QgZHQ9bmV3IFQsd3M9bmV3IE47bGV0IHdmPTA7Y2xhc3MgZ3R7Y29uc3RydWN0b3IodCxlLG49ITEpe2lmKEFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTt0aGlzLmlzQnVmZmVyQXR0cmlidXRlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOndmKyt9KSx0aGlzLm5hbWU9IiIsdGhpcy5hcnJheT10LHRoaXMuaXRlbVNpemU9ZSx0aGlzLmNvdW50PXQhPT12b2lkIDA/dC5sZW5ndGgvZTowLHRoaXMubm9ybWFsaXplZD1uLHRoaXMudXNhZ2U9MzUwNDQsdGhpcy51cGRhdGVSYW5nZXM9W10sdGhpcy5ncHVUeXBlPTEwMTUsdGhpcy52ZXJzaW9uPTB9b25VcGxvYWRDYWxsYmFjaygpe31zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK31zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXN9YWRkVXBkYXRlUmFuZ2UodCxlKXt0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKHtzdGFydDp0LGNvdW50OmV9KX1jbGVhclVwZGF0ZVJhbmdlcygpe3RoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aD0wfWNvcHkodCl7cmV0dXJuIHRoaXMubmFtZT10Lm5hbWUsdGhpcy5hcnJheT1uZXcgdC5hcnJheS5jb25zdHJ1Y3Rvcih0LmFycmF5KSx0aGlzLml0ZW1TaXplPXQuaXRlbVNpemUsdGhpcy5jb3VudD10LmNvdW50LHRoaXMubm9ybWFsaXplZD10Lm5vcm1hbGl6ZWQsdGhpcy51c2FnZT10LnVzYWdlLHRoaXMuZ3B1VHlwZT10LmdwdVR5cGUsdGhpc31jb3B5QXQodCxlLG4pe3QqPXRoaXMuaXRlbVNpemUsbio9ZS5pdGVtU2l6ZTtmb3IobGV0IHM9MCxyPXRoaXMuaXRlbVNpemU7czxyO3MrKyl0aGlzLmFycmF5W3Qrc109ZS5hcnJheVtuK3NdO3JldHVybiB0aGlzfWNvcHlBcnJheSh0KXtyZXR1cm4gdGhpcy5hcnJheS5zZXQodCksdGhpc31hcHBseU1hdHJpeDModCl7aWYodGhpcy5pdGVtU2l6ZT09PTIpZm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspd3MuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLHdzLmFwcGx5TWF0cml4Myh0KSx0aGlzLnNldFhZKGUsd3MueCx3cy55KTtlbHNlIGlmKHRoaXMuaXRlbVNpemU9PT0zKWZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKWR0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxkdC5hcHBseU1hdHJpeDModCksdGhpcy5zZXRYWVooZSxkdC54LGR0LnksZHQueik7cmV0dXJuIHRoaXN9YXBwbHlNYXRyaXg0KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKWR0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxkdC5hcHBseU1hdHJpeDQodCksdGhpcy5zZXRYWVooZSxkdC54LGR0LnksZHQueik7cmV0dXJuIHRoaXN9YXBwbHlOb3JtYWxNYXRyaXgodCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspZHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLGR0LmFwcGx5Tm9ybWFsTWF0cml4KHQpLHRoaXMuc2V0WFlaKGUsZHQueCxkdC55LGR0LnopO3JldHVybiB0aGlzfXRyYW5zZm9ybURpcmVjdGlvbih0KXtmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylkdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksZHQudHJhbnNmb3JtRGlyZWN0aW9uKHQpLHRoaXMuc2V0WFlaKGUsZHQueCxkdC55LGR0LnopO3JldHVybiB0aGlzfXNldCh0LGU9MCl7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQsZSksdGhpc31nZXRDb21wb25lbnQodCxlKXtsZXQgbj10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZStlXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYobj14aShuLHRoaXMuYXJyYXkpKSxufXNldENvbXBvbmVudCh0LGUsbil7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKG49SXQobix0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrZV09bix0aGlzfWdldFgodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemVdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPXhpKGUsdGhpcy5hcnJheSkpLGV9c2V0WCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPUl0KGUsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplXT1lLHRoaXN9Z2V0WSh0KXtsZXQgZT10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsxXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT14aShlLHRoaXMuYXJyYXkpKSxlfXNldFkodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1JdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsxXT1lLHRoaXN9Z2V0Wih0KXtsZXQgZT10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsyXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT14aShlLHRoaXMuYXJyYXkpKSxlfXNldFoodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1JdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsyXT1lLHRoaXN9Z2V0Vyh0KXtsZXQgZT10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSszXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT14aShlLHRoaXMuYXJyYXkpKSxlfXNldFcodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1JdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSszXT1lLHRoaXN9c2V0WFkodCxlLG4pe3JldHVybiB0Kj10aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCYmKGU9SXQoZSx0aGlzLmFycmF5KSxuPUl0KG4sdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCswXT1lLHRoaXMuYXJyYXlbdCsxXT1uLHRoaXN9c2V0WFlaKHQsZSxuLHMpe3JldHVybiB0Kj10aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCYmKGU9SXQoZSx0aGlzLmFycmF5KSxuPUl0KG4sdGhpcy5hcnJheSkscz1JdChzLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzLmFycmF5W3QrMl09cyx0aGlzfXNldFhZWlcodCxlLG4scyxyKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPUl0KGUsdGhpcy5hcnJheSksbj1JdChuLHRoaXMuYXJyYXkpLHM9SXQocyx0aGlzLmFycmF5KSxyPUl0KHIsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCswXT1lLHRoaXMuYXJyYXlbdCsxXT1uLHRoaXMuYXJyYXlbdCsyXT1zLHRoaXMuYXJyYXlbdCszXT1yLHRoaXN9b25VcGxvYWQodCl7cmV0dXJuIHRoaXMub25VcGxvYWRDYWxsYmFjaz10LHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5hcnJheSx0aGlzLml0ZW1TaXplKS5jb3B5KHRoaXMpfXRvSlNPTigpe2NvbnN0IHQ9e2l0ZW1TaXplOnRoaXMuaXRlbVNpemUsdHlwZTp0aGlzLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6QXJyYXkuZnJvbSh0aGlzLmFycmF5KSxub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH07cmV0dXJuIHRoaXMubmFtZSE9PSIiJiYodC5uYW1lPXRoaXMubmFtZSksdGhpcy51c2FnZSE9PTM1MDQ0JiYodC51c2FnZT10aGlzLnVzYWdlKSx0fX1jbGFzcyBiZiBleHRlbmRzIGd0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgVWludDE2QXJyYXkodCksZSxuKX19Y2xhc3MgTWYgZXh0ZW5kcyBndHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQzMkFycmF5KHQpLGUsbil9fWNsYXNzIEJlIGV4dGVuZHMgZ3R7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBGbG9hdDMyQXJyYXkodCksZSxuKX19bGV0IEFmPTA7Y29uc3QgWXQ9bmV3IHN0LHZvPW5ldyBFZSxxbj1uZXcgVCwkdD1uZXcgbXQsX2k9bmV3IG10LGJ0PW5ldyBUO2NsYXNzIGdlIGV4dGVuZHMgbHN7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNCdWZmZXJHZW9tZXRyeT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpBZisrfSksdGhpcy51dWlkPUZuKCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iQnVmZmVyR2VvbWV0cnkiLHRoaXMuaW5kZXg9bnVsbCx0aGlzLmluZGlyZWN0PW51bGwsdGhpcy5hdHRyaWJ1dGVzPXt9LHRoaXMubW9ycGhBdHRyaWJ1dGVzPXt9LHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU9ITEsdGhpcy5ncm91cHM9W10sdGhpcy5ib3VuZGluZ0JveD1udWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9bnVsbCx0aGlzLmRyYXdSYW5nZT17c3RhcnQ6MCxjb3VudDoxLzB9LHRoaXMudXNlckRhdGE9e319Z2V0SW5kZXgoKXtyZXR1cm4gdGhpcy5pbmRleH1zZXRJbmRleCh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT90aGlzLmluZGV4PW5ldyhlZih0KT9NZjpiZikodCwxKTp0aGlzLmluZGV4PXQsdGhpc31zZXRJbmRpcmVjdCh0KXtyZXR1cm4gdGhpcy5pbmRpcmVjdD10LHRoaXN9Z2V0SW5kaXJlY3QoKXtyZXR1cm4gdGhpcy5pbmRpcmVjdH1nZXRBdHRyaWJ1dGUodCl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XX1zZXRBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW3RdPWUsdGhpc31kZWxldGVBdHRyaWJ1dGUodCl7cmV0dXJuIGRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbdF0sdGhpc31oYXNBdHRyaWJ1dGUodCl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XSE9PXZvaWQgMH1hZGRHcm91cCh0LGUsbj0wKXt0aGlzLmdyb3Vwcy5wdXNoKHtzdGFydDp0LGNvdW50OmUsbWF0ZXJpYWxJbmRleDpufSl9Y2xlYXJHcm91cHMoKXt0aGlzLmdyb3Vwcz1bXX1zZXREcmF3UmFuZ2UodCxlKXt0aGlzLmRyYXdSYW5nZS5zdGFydD10LHRoaXMuZHJhd1JhbmdlLmNvdW50PWV9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO2UhPT12b2lkIDAmJihlLmFwcGx5TWF0cml4NCh0KSxlLm5lZWRzVXBkYXRlPSEwKTtjb25zdCBuPXRoaXMuYXR0cmlidXRlcy5ub3JtYWw7aWYobiE9PXZvaWQgMCl7Y29uc3Qgcj1uZXcgbWUoKS5nZXROb3JtYWxNYXRyaXgodCk7bi5hcHBseU5vcm1hbE1hdHJpeChyKSxuLm5lZWRzVXBkYXRlPSEwfWNvbnN0IHM9dGhpcy5hdHRyaWJ1dGVzLnRhbmdlbnQ7cmV0dXJuIHMhPT12b2lkIDAmJihzLnRyYW5zZm9ybURpcmVjdGlvbih0KSxzLm5lZWRzVXBkYXRlPSEwKSx0aGlzLmJvdW5kaW5nQm94IT09bnVsbCYmdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nU3BoZXJlIT09bnVsbCYmdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSx0aGlzfWFwcGx5UXVhdGVybmlvbih0KXtyZXR1cm4gWXQubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCksdGhpcy5hcHBseU1hdHJpeDQoWXQpLHRoaXN9cm90YXRlWCh0KXtyZXR1cm4gWXQubWFrZVJvdGF0aW9uWCh0KSx0aGlzLmFwcGx5TWF0cml4NChZdCksdGhpc31yb3RhdGVZKHQpe3JldHVybiBZdC5tYWtlUm90YXRpb25ZKHQpLHRoaXMuYXBwbHlNYXRyaXg0KFl0KSx0aGlzfXJvdGF0ZVoodCl7cmV0dXJuIFl0Lm1ha2VSb3RhdGlvbloodCksdGhpcy5hcHBseU1hdHJpeDQoWXQpLHRoaXN9dHJhbnNsYXRlKHQsZSxuKXtyZXR1cm4gWXQubWFrZVRyYW5zbGF0aW9uKHQsZSxuKSx0aGlzLmFwcGx5TWF0cml4NChZdCksdGhpc31zY2FsZSh0LGUsbil7cmV0dXJuIFl0Lm1ha2VTY2FsZSh0LGUsbiksdGhpcy5hcHBseU1hdHJpeDQoWXQpLHRoaXN9bG9va0F0KHQpe3JldHVybiB2by5sb29rQXQodCksdm8udXBkYXRlTWF0cml4KCksdGhpcy5hcHBseU1hdHJpeDQodm8ubWF0cml4KSx0aGlzfWNlbnRlcigpe3JldHVybiB0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpLHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKHFuKS5uZWdhdGUoKSx0aGlzLnRyYW5zbGF0ZShxbi54LHFuLnkscW4ueiksdGhpc31zZXRGcm9tUG9pbnRzKHQpe2NvbnN0IGU9dGhpcy5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aWYoZT09PXZvaWQgMCl7Y29uc3Qgbj1bXTtmb3IobGV0IHM9MCxyPXQubGVuZ3RoO3M8cjtzKyspe2NvbnN0IG89dFtzXTtuLnB1c2goby54LG8ueSxvLnp8fDApfXRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IEJlKG4sMykpfWVsc2V7Y29uc3Qgbj1NYXRoLm1pbih0Lmxlbmd0aCxlLmNvdW50KTtmb3IobGV0IHM9MDtzPG47cysrKXtjb25zdCByPXRbc107ZS5zZXRYWVoocyxyLngsci55LHIuenx8MCl9dC5sZW5ndGg+ZS5jb3VudCYmY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogQnVmZmVyIHNpemUgdG9vIHNtYWxsIGZvciBwb2ludHMgZGF0YS4gVXNlIC5kaXNwb3NlKCkgYW5kIGNyZWF0ZSBhIG5ldyBnZW9tZXRyeS4iKSxlLm5lZWRzVXBkYXRlPSEwfXJldHVybiB0aGlzfWNvbXB1dGVCb3VuZGluZ0JveCgpe3RoaXMuYm91bmRpbmdCb3g9PT1udWxsJiYodGhpcy5ib3VuZGluZ0JveD1uZXcgbXQpO2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYodCYmdC5pc0dMQnVmZmVyQXR0cmlidXRlKXtjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgYm94LiIsdGhpcyksdGhpcy5ib3VuZGluZ0JveC5zZXQobmV3IFQoLTEvMCwtMS8wLC0xLzApLG5ldyBUKDEvMCwxLzAsMS8wKSk7cmV0dXJufWlmKHQhPT12b2lkIDApe2lmKHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KSxlKWZvcihsZXQgbj0wLHM9ZS5sZW5ndGg7bjxzO24rKyl7Y29uc3Qgcj1lW25dOyR0LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUociksdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT8oYnQuYWRkVmVjdG9ycyh0aGlzLmJvdW5kaW5nQm94Lm1pbiwkdC5taW4pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChidCksYnQuYWRkVmVjdG9ycyh0aGlzLmJvdW5kaW5nQm94Lm1heCwkdC5tYXgpLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChidCkpOih0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoJHQubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoJHQubWF4KSl9fWVsc2UgdGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTsoaXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueCl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnkpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi56KSkmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBDb21wdXRlZCBtaW4vbWF4IGhhdmUgTmFOIHZhbHVlcy4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX1jb21wdXRlQm91bmRpbmdTcGhlcmUoKXt0aGlzLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9bmV3IGhvKTtjb25zdCB0PXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbixlPXRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKHQmJnQuaXNHTEJ1ZmZlckF0dHJpYnV0ZSl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IEdMQnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIGEgbWFudWFsIGJvdW5kaW5nIHNwaGVyZS4iLHRoaXMpLHRoaXMuYm91bmRpbmdTcGhlcmUuc2V0KG5ldyBULDEvMCk7cmV0dXJufWlmKHQpe2NvbnN0IG49dGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7aWYoJHQuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KSxlKWZvcihsZXQgcj0wLG89ZS5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT1lW3JdO19pLnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoYSksdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT8oYnQuYWRkVmVjdG9ycygkdC5taW4sX2kubWluKSwkdC5leHBhbmRCeVBvaW50KGJ0KSxidC5hZGRWZWN0b3JzKCR0Lm1heCxfaS5tYXgpLCR0LmV4cGFuZEJ5UG9pbnQoYnQpKTooJHQuZXhwYW5kQnlQb2ludChfaS5taW4pLCR0LmV4cGFuZEJ5UG9pbnQoX2kubWF4KSl9JHQuZ2V0Q2VudGVyKG4pO2xldCBzPTA7Zm9yKGxldCByPTAsbz10LmNvdW50O3I8bztyKyspYnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LHIpLHM9TWF0aC5tYXgocyxuLmRpc3RhbmNlVG9TcXVhcmVkKGJ0KSk7aWYoZSlmb3IobGV0IHI9MCxvPWUubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9ZVtyXSxjPXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7Zm9yKGxldCBsPTAsaD1hLmNvdW50O2w8aDtsKyspYnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGwpLGMmJihxbi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsbCksYnQuYWRkKHFuKSkscz1NYXRoLm1heChzLG4uZGlzdGFuY2VUb1NxdWFyZWQoYnQpKX10aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cz1NYXRoLnNxcnQocyksaXNOYU4odGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMpJiZjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogQ29tcHV0ZWQgcmFkaXVzIGlzIE5hTi4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX19Y29tcHV0ZVRhbmdlbnRzKCl7Y29uc3QgdD10aGlzLmluZGV4LGU9dGhpcy5hdHRyaWJ1dGVzO2lmKHQ9PT1udWxsfHxlLnBvc2l0aW9uPT09dm9pZCAwfHxlLm5vcm1hbD09PXZvaWQgMHx8ZS51dj09PXZvaWQgMCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBmYWlsZWQuIE1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlcyAoaW5kZXgsIHBvc2l0aW9uLCBub3JtYWwgb3IgdXYpIik7cmV0dXJufWNvbnN0IG49ZS5wb3NpdGlvbixzPWUubm9ybWFsLHI9ZS51djt0aGlzLmhhc0F0dHJpYnV0ZSgidGFuZ2VudCIpPT09ITEmJnRoaXMuc2V0QXR0cmlidXRlKCJ0YW5nZW50IixuZXcgZ3QobmV3IEZsb2F0MzJBcnJheSg0Km4uY291bnQpLDQpKTtjb25zdCBvPXRoaXMuZ2V0QXR0cmlidXRlKCJ0YW5nZW50IiksYT1bXSxjPVtdO2ZvcihsZXQgdj0wO3Y8bi5jb3VudDt2KyspYVt2XT1uZXcgVCxjW3ZdPW5ldyBUO2NvbnN0IGw9bmV3IFQsaD1uZXcgVCx1PW5ldyBULGY9bmV3IE4sZD1uZXcgTixwPW5ldyBOLHk9bmV3IFQsbT1uZXcgVDtmdW5jdGlvbiBnKHYsXyxFKXtsLmZyb21CdWZmZXJBdHRyaWJ1dGUobix2KSxoLmZyb21CdWZmZXJBdHRyaWJ1dGUobixfKSx1LmZyb21CdWZmZXJBdHRyaWJ1dGUobixFKSxmLmZyb21CdWZmZXJBdHRyaWJ1dGUocix2KSxkLmZyb21CdWZmZXJBdHRyaWJ1dGUocixfKSxwLmZyb21CdWZmZXJBdHRyaWJ1dGUocixFKSxoLnN1YihsKSx1LnN1YihsKSxkLnN1YihmKSxwLnN1YihmKTtjb25zdCB6PTEvKGQueCpwLnktcC54KmQueSk7aXNGaW5pdGUoeikmJih5LmNvcHkoaCkubXVsdGlwbHlTY2FsYXIocC55KS5hZGRTY2FsZWRWZWN0b3IodSwtZC55KS5tdWx0aXBseVNjYWxhcih6KSxtLmNvcHkodSkubXVsdGlwbHlTY2FsYXIoZC54KS5hZGRTY2FsZWRWZWN0b3IoaCwtcC54KS5tdWx0aXBseVNjYWxhcih6KSxhW3ZdLmFkZCh5KSxhW19dLmFkZCh5KSxhW0VdLmFkZCh5KSxjW3ZdLmFkZChtKSxjW19dLmFkZChtKSxjW0VdLmFkZChtKSl9bGV0IGI9dGhpcy5ncm91cHM7Yi5sZW5ndGg9PT0wJiYoYj1be3N0YXJ0OjAsY291bnQ6dC5jb3VudH1dKTtmb3IobGV0IHY9MCxfPWIubGVuZ3RoO3Y8XzsrK3Ype2NvbnN0IEU9Ylt2XSx6PUUuc3RhcnQsQz1FLmNvdW50O2ZvcihsZXQgUD16LEY9eitDO1A8RjtQKz0zKWcodC5nZXRYKFArMCksdC5nZXRYKFArMSksdC5nZXRYKFArMikpfWNvbnN0IHc9bmV3IFQseD1uZXcgVCxNPW5ldyBULEE9bmV3IFQ7ZnVuY3Rpb24gUyh2KXtNLmZyb21CdWZmZXJBdHRyaWJ1dGUocyx2KSxBLmNvcHkoTSk7Y29uc3QgXz1hW3ZdO3cuY29weShfKSx3LnN1YihNLm11bHRpcGx5U2NhbGFyKE0uZG90KF8pKSkubm9ybWFsaXplKCkseC5jcm9zc1ZlY3RvcnMoQSxfKTtjb25zdCB6PXguZG90KGNbdl0pPDA/LTE6MTtvLnNldFhZWlcodix3Lngsdy55LHcueix6KX1mb3IobGV0IHY9MCxfPWIubGVuZ3RoO3Y8XzsrK3Ype2NvbnN0IEU9Ylt2XSx6PUUuc3RhcnQsQz1FLmNvdW50O2ZvcihsZXQgUD16LEY9eitDO1A8RjtQKz0zKVModC5nZXRYKFArMCkpLFModC5nZXRYKFArMSkpLFModC5nZXRYKFArMikpfX1jb21wdXRlVmVydGV4Tm9ybWFscygpe2NvbnN0IHQ9dGhpcy5pbmRleCxlPXRoaXMuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2lmKGUhPT12b2lkIDApe2xldCBuPXRoaXMuZ2V0QXR0cmlidXRlKCJub3JtYWwiKTtpZihuPT09dm9pZCAwKW49bmV3IGd0KG5ldyBGbG9hdDMyQXJyYXkoZS5jb3VudCozKSwzKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuKTtlbHNlIGZvcihsZXQgZj0wLGQ9bi5jb3VudDtmPGQ7ZisrKW4uc2V0WFlaKGYsMCwwLDApO2NvbnN0IHM9bmV3IFQscj1uZXcgVCxvPW5ldyBULGE9bmV3IFQsYz1uZXcgVCxsPW5ldyBULGg9bmV3IFQsdT1uZXcgVDtpZih0KWZvcihsZXQgZj0wLGQ9dC5jb3VudDtmPGQ7Zis9Myl7Y29uc3QgcD10LmdldFgoZiswKSx5PXQuZ2V0WChmKzEpLG09dC5nZXRYKGYrMik7cy5mcm9tQnVmZmVyQXR0cmlidXRlKGUscCksci5mcm9tQnVmZmVyQXR0cmlidXRlKGUseSksby5mcm9tQnVmZmVyQXR0cmlidXRlKGUsbSksaC5zdWJWZWN0b3JzKG8sciksdS5zdWJWZWN0b3JzKHMsciksaC5jcm9zcyh1KSxhLmZyb21CdWZmZXJBdHRyaWJ1dGUobixwKSxjLmZyb21CdWZmZXJBdHRyaWJ1dGUobix5KSxsLmZyb21CdWZmZXJBdHRyaWJ1dGUobixtKSxhLmFkZChoKSxjLmFkZChoKSxsLmFkZChoKSxuLnNldFhZWihwLGEueCxhLnksYS56KSxuLnNldFhZWih5LGMueCxjLnksYy56KSxuLnNldFhZWihtLGwueCxsLnksbC56KX1lbHNlIGZvcihsZXQgZj0wLGQ9ZS5jb3VudDtmPGQ7Zis9MylzLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxmKzApLHIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGYrMSksby5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZisyKSxoLnN1YlZlY3RvcnMobyxyKSx1LnN1YlZlY3RvcnMocyxyKSxoLmNyb3NzKHUpLG4uc2V0WFlaKGYrMCxoLngsaC55LGgueiksbi5zZXRYWVooZisxLGgueCxoLnksaC56KSxuLnNldFhZWihmKzIsaC54LGgueSxoLnopO3RoaXMubm9ybWFsaXplTm9ybWFscygpLG4ubmVlZHNVcGRhdGU9ITB9fW5vcm1hbGl6ZU5vcm1hbHMoKXtjb25zdCB0PXRoaXMuYXR0cmlidXRlcy5ub3JtYWw7Zm9yKGxldCBlPTAsbj10LmNvdW50O2U8bjtlKyspYnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpLGJ0Lm5vcm1hbGl6ZSgpLHQuc2V0WFlaKGUsYnQueCxidC55LGJ0LnopfXRvTm9uSW5kZXhlZCgpe2Z1bmN0aW9uIHQoYSxjKXtjb25zdCBsPWEuYXJyYXksaD1hLml0ZW1TaXplLHU9YS5ub3JtYWxpemVkLGY9bmV3IGwuY29uc3RydWN0b3IoYy5sZW5ndGgqaCk7bGV0IGQ9MCxwPTA7Zm9yKGxldCB5PTAsbT1jLmxlbmd0aDt5PG07eSsrKXthLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU/ZD1jW3ldKmEuZGF0YS5zdHJpZGUrYS5vZmZzZXQ6ZD1jW3ldKmg7Zm9yKGxldCBnPTA7ZzxoO2crKylmW3ArK109bFtkKytdfXJldHVybiBuZXcgZ3QoZixoLHUpfWlmKHRoaXMuaW5kZXg9PT1udWxsKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBCdWZmZXJHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLiIpLHRoaXM7Y29uc3QgZT1uZXcgZ2Usbj10aGlzLmluZGV4LmFycmF5LHM9dGhpcy5hdHRyaWJ1dGVzO2Zvcihjb25zdCBhIGluIHMpe2NvbnN0IGM9c1thXSxsPXQoYyxuKTtlLnNldEF0dHJpYnV0ZShhLGwpfWNvbnN0IHI9dGhpcy5tb3JwaEF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGEgaW4gcil7Y29uc3QgYz1bXSxsPXJbYV07Zm9yKGxldCBoPTAsdT1sLmxlbmd0aDtoPHU7aCsrKXtjb25zdCBmPWxbaF0sZD10KGYsbik7Yy5wdXNoKGQpfWUubW9ycGhBdHRyaWJ1dGVzW2FdPWN9ZS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2NvbnN0IG89dGhpcy5ncm91cHM7Zm9yKGxldCBhPTAsYz1vLmxlbmd0aDthPGM7YSsrKXtjb25zdCBsPW9bYV07ZS5hZGRHcm91cChsLnN0YXJ0LGwuY291bnQsbC5tYXRlcmlhbEluZGV4KX1yZXR1cm4gZX10b0pTT04oKXtjb25zdCB0PXttZXRhZGF0YTp7dmVyc2lvbjo0LjcsdHlwZToiQnVmZmVyR2VvbWV0cnkiLGdlbmVyYXRvcjoiQnVmZmVyR2VvbWV0cnkudG9KU09OIn19O2lmKHQudXVpZD10aGlzLnV1aWQsdC50eXBlPXRoaXMudHlwZSx0aGlzLm5hbWUhPT0iIiYmKHQubmFtZT10aGlzLm5hbWUpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYodC51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSx0aGlzLnBhcmFtZXRlcnMhPT12b2lkIDApe2NvbnN0IGM9dGhpcy5wYXJhbWV0ZXJzO2Zvcihjb25zdCBsIGluIGMpY1tsXSE9PXZvaWQgMCYmKHRbbF09Y1tsXSk7cmV0dXJuIHR9dC5kYXRhPXthdHRyaWJ1dGVzOnt9fTtjb25zdCBlPXRoaXMuaW5kZXg7ZSE9PW51bGwmJih0LmRhdGEuaW5kZXg9e3R5cGU6ZS5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUuYXJyYXkpfSk7Y29uc3Qgbj10aGlzLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGMgaW4gbil7Y29uc3QgbD1uW2NdO3QuZGF0YS5hdHRyaWJ1dGVzW2NdPWwudG9KU09OKHQuZGF0YSl9Y29uc3Qgcz17fTtsZXQgcj0hMTtmb3IoY29uc3QgYyBpbiB0aGlzLm1vcnBoQXR0cmlidXRlcyl7Y29uc3QgbD10aGlzLm1vcnBoQXR0cmlidXRlc1tjXSxoPVtdO2ZvcihsZXQgdT0wLGY9bC5sZW5ndGg7dTxmO3UrKyl7Y29uc3QgZD1sW3VdO2gucHVzaChkLnRvSlNPTih0LmRhdGEpKX1oLmxlbmd0aD4wJiYoc1tjXT1oLHI9ITApfXImJih0LmRhdGEubW9ycGhBdHRyaWJ1dGVzPXMsdC5kYXRhLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmUpO2NvbnN0IG89dGhpcy5ncm91cHM7by5sZW5ndGg+MCYmKHQuZGF0YS5ncm91cHM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvKSkpO2NvbnN0IGE9dGhpcy5ib3VuZGluZ1NwaGVyZTtyZXR1cm4gYSE9PW51bGwmJih0LmRhdGEuYm91bmRpbmdTcGhlcmU9YS50b0pTT04oKSksdH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXt0aGlzLmluZGV4PW51bGwsdGhpcy5hdHRyaWJ1dGVzPXt9LHRoaXMubW9ycGhBdHRyaWJ1dGVzPXt9LHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGw7Y29uc3QgZT17fTt0aGlzLm5hbWU9dC5uYW1lO2NvbnN0IG49dC5pbmRleDtuIT09bnVsbCYmdGhpcy5zZXRJbmRleChuLmNsb25lKCkpO2NvbnN0IHM9dC5hdHRyaWJ1dGVzO2Zvcihjb25zdCBsIGluIHMpe2NvbnN0IGg9c1tsXTt0aGlzLnNldEF0dHJpYnV0ZShsLGguY2xvbmUoZSkpfWNvbnN0IHI9dC5tb3JwaEF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGwgaW4gcil7Y29uc3QgaD1bXSx1PXJbbF07Zm9yKGxldCBmPTAsZD11Lmxlbmd0aDtmPGQ7ZisrKWgucHVzaCh1W2ZdLmNsb25lKGUpKTt0aGlzLm1vcnBoQXR0cmlidXRlc1tsXT1ofXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU9dC5tb3JwaFRhcmdldHNSZWxhdGl2ZTtjb25zdCBvPXQuZ3JvdXBzO2ZvcihsZXQgbD0wLGg9by5sZW5ndGg7bDxoO2wrKyl7Y29uc3QgdT1vW2xdO3RoaXMuYWRkR3JvdXAodS5zdGFydCx1LmNvdW50LHUubWF0ZXJpYWxJbmRleCl9Y29uc3QgYT10LmJvdW5kaW5nQm94O2EhPT1udWxsJiYodGhpcy5ib3VuZGluZ0JveD1hLmNsb25lKCkpO2NvbnN0IGM9dC5ib3VuZGluZ1NwaGVyZTtyZXR1cm4gYyE9PW51bGwmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWMuY2xvbmUoKSksdGhpcy5kcmF3UmFuZ2Uuc3RhcnQ9dC5kcmF3UmFuZ2Uuc3RhcnQsdGhpcy5kcmF3UmFuZ2UuY291bnQ9dC5kcmF3UmFuZ2UuY291bnQsdGhpcy51c2VyRGF0YT10LnVzZXJEYXRhLHRoaXN9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19Y29uc3QgRGM9bmV3IHN0LGZuPW5ldyB5byxicz1uZXcgaG8sJGM9bmV3IFQsTXM9bmV3IFQsQXM9bmV3IFQsU3M9bmV3IFQsem89bmV3IFQsX3M9bmV3IFQsVmM9bmV3IFQsdnM9bmV3IFQ7Y2xhc3MgU2YgZXh0ZW5kcyBFZXtjb25zdHJ1Y3Rvcih0PW5ldyBnZSxlPW5ldyB4Zil7c3VwZXIoKSx0aGlzLmlzTWVzaD0hMCx0aGlzLnR5cGU9Ik1lc2giLHRoaXMuZ2VvbWV0cnk9dCx0aGlzLm1hdGVyaWFsPWUsdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9dm9pZCAwLHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPXZvaWQgMCx0aGlzLmNvdW50PTEsdGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyE9PXZvaWQgMCYmKHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPXQubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCkpLHQubW9ycGhUYXJnZXREaWN0aW9uYXJ5IT09dm9pZCAwJiYodGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9T2JqZWN0LmFzc2lnbih7fSx0Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeSkpLHRoaXMubWF0ZXJpYWw9QXJyYXkuaXNBcnJheSh0Lm1hdGVyaWFsKT90Lm1hdGVyaWFsLnNsaWNlKCk6dC5tYXRlcmlhbCx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnksdGhpc311cGRhdGVNb3JwaFRhcmdldHMoKXtjb25zdCBlPXRoaXMuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLG49T2JqZWN0LmtleXMoZSk7aWYobi5sZW5ndGg+MCl7Y29uc3Qgcz1lW25bMF1dO2lmKHMhPT12b2lkIDApe3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPVtdLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXt9O2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT1zW3JdLm5hbWV8fFN0cmluZyhyKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W2FdPXJ9fX19Z2V0VmVydGV4UG9zaXRpb24odCxlKXtjb25zdCBuPXRoaXMuZ2VvbWV0cnkscz1uLmF0dHJpYnV0ZXMucG9zaXRpb24scj1uLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixvPW4ubW9ycGhUYXJnZXRzUmVsYXRpdmU7ZS5mcm9tQnVmZmVyQXR0cmlidXRlKHMsdCk7Y29uc3QgYT10aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztpZihyJiZhKXtfcy5zZXQoMCwwLDApO2ZvcihsZXQgYz0wLGw9ci5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1hW2NdLHU9cltjXTtoIT09MCYmKHpvLmZyb21CdWZmZXJBdHRyaWJ1dGUodSx0KSxvP19zLmFkZFNjYWxlZFZlY3Rvcih6byxoKTpfcy5hZGRTY2FsZWRWZWN0b3Ioem8uc3ViKGUpLGgpKX1lLmFkZChfcyl9cmV0dXJuIGV9cmF5Y2FzdCh0LGUpe2NvbnN0IG49dGhpcy5nZW9tZXRyeSxzPXRoaXMubWF0ZXJpYWwscj10aGlzLm1hdHJpeFdvcmxkO3MhPT12b2lkIDAmJihuLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmbi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxicy5jb3B5KG4uYm91bmRpbmdTcGhlcmUpLGJzLmFwcGx5TWF0cml4NChyKSxmbi5jb3B5KHQucmF5KS5yZWNhc3QodC5uZWFyKSwhKGJzLmNvbnRhaW5zUG9pbnQoZm4ub3JpZ2luKT09PSExJiYoZm4uaW50ZXJzZWN0U3BoZXJlKGJzLCRjKT09PW51bGx8fGZuLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZCgkYyk+Z2kodC5mYXItdC5uZWFyLDIpKSkmJihEYy5jb3B5KHIpLmludmVydCgpLGZuLmNvcHkodC5yYXkpLmFwcGx5TWF0cml4NChEYyksIShuLmJvdW5kaW5nQm94IT09bnVsbCYmZm4uaW50ZXJzZWN0c0JveChuLmJvdW5kaW5nQm94KT09PSExKSYmdGhpcy5fY29tcHV0ZUludGVyc2VjdGlvbnModCxlLGZuKSkpfV9jb21wdXRlSW50ZXJzZWN0aW9ucyh0LGUsbil7bGV0IHM7Y29uc3Qgcj10aGlzLmdlb21ldHJ5LG89dGhpcy5tYXRlcmlhbCxhPXIuaW5kZXgsYz1yLmF0dHJpYnV0ZXMucG9zaXRpb24sbD1yLmF0dHJpYnV0ZXMudXYsaD1yLmF0dHJpYnV0ZXMudXYxLHU9ci5hdHRyaWJ1dGVzLm5vcm1hbCxmPXIuZ3JvdXBzLGQ9ci5kcmF3UmFuZ2U7aWYoYSE9PW51bGwpaWYoQXJyYXkuaXNBcnJheShvKSlmb3IobGV0IHA9MCx5PWYubGVuZ3RoO3A8eTtwKyspe2NvbnN0IG09ZltwXSxnPW9bbS5tYXRlcmlhbEluZGV4XSxiPU1hdGgubWF4KG0uc3RhcnQsZC5zdGFydCksdz1NYXRoLm1pbihhLmNvdW50LE1hdGgubWluKG0uc3RhcnQrbS5jb3VudCxkLnN0YXJ0K2QuY291bnQpKTtmb3IobGV0IHg9YixNPXc7eDxNO3grPTMpe2NvbnN0IEE9YS5nZXRYKHgpLFM9YS5nZXRYKHgrMSksdj1hLmdldFgoeCsyKTtzPXpzKHRoaXMsZyx0LG4sbCxoLHUsQSxTLHYpLHMmJihzLmZhY2VJbmRleD1NYXRoLmZsb29yKHgvMykscy5mYWNlLm1hdGVyaWFsSW5kZXg9bS5tYXRlcmlhbEluZGV4LGUucHVzaChzKSl9fWVsc2V7Y29uc3QgcD1NYXRoLm1heCgwLGQuc3RhcnQpLHk9TWF0aC5taW4oYS5jb3VudCxkLnN0YXJ0K2QuY291bnQpO2ZvcihsZXQgbT1wLGc9eTttPGc7bSs9Myl7Y29uc3QgYj1hLmdldFgobSksdz1hLmdldFgobSsxKSx4PWEuZ2V0WChtKzIpO3M9enModGhpcyxvLHQsbixsLGgsdSxiLHcseCkscyYmKHMuZmFjZUluZGV4PU1hdGguZmxvb3IobS8zKSxlLnB1c2gocykpfX1lbHNlIGlmKGMhPT12b2lkIDApaWYoQXJyYXkuaXNBcnJheShvKSlmb3IobGV0IHA9MCx5PWYubGVuZ3RoO3A8eTtwKyspe2NvbnN0IG09ZltwXSxnPW9bbS5tYXRlcmlhbEluZGV4XSxiPU1hdGgubWF4KG0uc3RhcnQsZC5zdGFydCksdz1NYXRoLm1pbihjLmNvdW50LE1hdGgubWluKG0uc3RhcnQrbS5jb3VudCxkLnN0YXJ0K2QuY291bnQpKTtmb3IobGV0IHg9YixNPXc7eDxNO3grPTMpe2NvbnN0IEE9eCxTPXgrMSx2PXgrMjtzPXpzKHRoaXMsZyx0LG4sbCxoLHUsQSxTLHYpLHMmJihzLmZhY2VJbmRleD1NYXRoLmZsb29yKHgvMykscy5mYWNlLm1hdGVyaWFsSW5kZXg9bS5tYXRlcmlhbEluZGV4LGUucHVzaChzKSl9fWVsc2V7Y29uc3QgcD1NYXRoLm1heCgwLGQuc3RhcnQpLHk9TWF0aC5taW4oYy5jb3VudCxkLnN0YXJ0K2QuY291bnQpO2ZvcihsZXQgbT1wLGc9eTttPGc7bSs9Myl7Y29uc3QgYj1tLHc9bSsxLHg9bSsyO3M9enModGhpcyxvLHQsbixsLGgsdSxiLHcseCkscyYmKHMuZmFjZUluZGV4PU1hdGguZmxvb3IobS8zKSxlLnB1c2gocykpfX19fWZ1bmN0aW9uIF9mKGksdCxlLG4scyxyLG8sYSl7bGV0IGM7aWYodC5zaWRlPT09MT9jPW4uaW50ZXJzZWN0VHJpYW5nbGUobyxyLHMsITAsYSk6Yz1uLmludGVyc2VjdFRyaWFuZ2xlKHMscixvLHQuc2lkZT09PTAsYSksYz09PW51bGwpcmV0dXJuIG51bGw7dnMuY29weShhKSx2cy5hcHBseU1hdHJpeDQoaS5tYXRyaXhXb3JsZCk7Y29uc3QgbD1lLnJheS5vcmlnaW4uZGlzdGFuY2VUbyh2cyk7cmV0dXJuIGw8ZS5uZWFyfHxsPmUuZmFyP251bGw6e2Rpc3RhbmNlOmwscG9pbnQ6dnMuY2xvbmUoKSxvYmplY3Q6aX19ZnVuY3Rpb24genMoaSx0LGUsbixzLHIsbyxhLGMsbCl7aS5nZXRWZXJ0ZXhQb3NpdGlvbihhLE1zKSxpLmdldFZlcnRleFBvc2l0aW9uKGMsQXMpLGkuZ2V0VmVydGV4UG9zaXRpb24obCxTcyk7Y29uc3QgaD1fZihpLHQsZSxuLE1zLEFzLFNzLFZjKTtpZihoKXtjb25zdCB1PW5ldyBUO3R0LmdldEJhcnljb29yZChWYyxNcyxBcyxTcyx1KSxzJiYoaC51dj10dC5nZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUocyxhLGMsbCx1LG5ldyBOKSksciYmKGgudXYxPXR0LmdldEludGVycG9sYXRlZEF0dHJpYnV0ZShyLGEsYyxsLHUsbmV3IE4pKSxvJiYoaC5ub3JtYWw9dHQuZ2V0SW50ZXJwb2xhdGVkQXR0cmlidXRlKG8sYSxjLGwsdSxuZXcgVCksaC5ub3JtYWwuZG90KG4uZGlyZWN0aW9uKT4wJiZoLm5vcm1hbC5tdWx0aXBseVNjYWxhcigtMSkpO2NvbnN0IGY9e2EsYjpjLGM6bCxub3JtYWw6bmV3IFQsbWF0ZXJpYWxJbmRleDowfTt0dC5nZXROb3JtYWwoTXMsQXMsU3MsZi5ub3JtYWwpLGguZmFjZT1mLGguYmFyeWNvb3JkPXV9cmV0dXJuIGh9Y29uc3QgVG89bmV3IFQsdmY9bmV3IFQsemY9bmV3IG1lO2NsYXNzIEVve2NvbnN0cnVjdG9yKHQ9bmV3IFQoMSwwLDApLGU9MCl7dGhpcy5pc1BsYW5lPSEwLHRoaXMubm9ybWFsPXQsdGhpcy5jb25zdGFudD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQpLHRoaXMuY29uc3RhbnQ9ZSx0aGlzfXNldENvbXBvbmVudHModCxlLG4scyl7cmV0dXJuIHRoaXMubm9ybWFsLnNldCh0LGUsbiksdGhpcy5jb25zdGFudD1zLHRoaXN9c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weSh0KSx0aGlzLmNvbnN0YW50PS1lLmRvdCh0aGlzLm5vcm1hbCksdGhpc31zZXRGcm9tQ29wbGFuYXJQb2ludHModCxlLG4pe2NvbnN0IHM9VG8uc3ViVmVjdG9ycyhuLGUpLmNyb3NzKHZmLnN1YlZlY3RvcnModCxlKSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQocyx0KSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodC5ub3JtYWwpLHRoaXMuY29uc3RhbnQ9dC5jb25zdGFudCx0aGlzfW5vcm1hbGl6ZSgpe2NvbnN0IHQ9MS90aGlzLm5vcm1hbC5sZW5ndGgoKTtyZXR1cm4gdGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIodCksdGhpcy5jb25zdGFudCo9dCx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLmNvbnN0YW50Kj0tMSx0aGlzLm5vcm1hbC5uZWdhdGUoKSx0aGlzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5ub3JtYWwuZG90KHQpK3RoaXMuY29uc3RhbnR9ZGlzdGFuY2VUb1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQodC5jZW50ZXIpLXQucmFkaXVzfXByb2plY3RQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuYWRkU2NhbGVkVmVjdG9yKHRoaXMubm9ybWFsLC10aGlzLmRpc3RhbmNlVG9Qb2ludCh0KSl9aW50ZXJzZWN0TGluZSh0LGUpe2NvbnN0IG49dC5kZWx0YShUbykscz10aGlzLm5vcm1hbC5kb3Qobik7aWYocz09PTApcmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpPT09MD9lLmNvcHkodC5zdGFydCk6bnVsbDtjb25zdCByPS0odC5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL3M7cmV0dXJuIHI8MHx8cj4xP251bGw6ZS5jb3B5KHQuc3RhcnQpLmFkZFNjYWxlZFZlY3RvcihuLHIpfWludGVyc2VjdHNMaW5lKHQpe2NvbnN0IGU9dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5zdGFydCksbj10aGlzLmRpc3RhbmNlVG9Qb2ludCh0LmVuZCk7cmV0dXJuIGU8MCYmbj4wfHxuPDAmJmU+MH1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1jb3BsYW5hclBvaW50KHQpe3JldHVybiB0LmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX1hcHBseU1hdHJpeDQodCxlKXtjb25zdCBuPWV8fHpmLmdldE5vcm1hbE1hdHJpeCh0KSxzPXRoaXMuY29wbGFuYXJQb2ludChUbykuYXBwbHlNYXRyaXg0KHQpLHI9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKG4pLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLmNvbnN0YW50PS1zLmRvdChyKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jb25zdGFudC09dC5kb3QodGhpcy5ub3JtYWwpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZ0LmNvbnN0YW50PT09dGhpcy5jb25zdGFudH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWxldCB4ZT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMudHlwZT0iQ3VydmUiLHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPTIwMCx0aGlzLm5lZWRzVXBkYXRlPSExLHRoaXMuY2FjaGVBcmNMZW5ndGhzPW51bGx9Z2V0UG9pbnQoKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlOiAuZ2V0UG9pbnQoKSBub3QgaW1wbGVtZW50ZWQuIil9Z2V0UG9pbnRBdCh0LGUpe2NvbnN0IG49dGhpcy5nZXRVdG9UbWFwcGluZyh0KTtyZXR1cm4gdGhpcy5nZXRQb2ludChuLGUpfWdldFBvaW50cyh0PTUpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjw9dDtuKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnQobi90KSk7cmV0dXJuIGV9Z2V0U3BhY2VkUG9pbnRzKHQ9NSl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPD10O24rKyllLnB1c2godGhpcy5nZXRQb2ludEF0KG4vdCkpO3JldHVybiBlfWdldExlbmd0aCgpe2NvbnN0IHQ9dGhpcy5nZXRMZW5ndGhzKCk7cmV0dXJuIHRbdC5sZW5ndGgtMV19Z2V0TGVuZ3Rocyh0PXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zKXtpZih0aGlzLmNhY2hlQXJjTGVuZ3RocyYmdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoPT09dCsxJiYhdGhpcy5uZWVkc1VwZGF0ZSlyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM7dGhpcy5uZWVkc1VwZGF0ZT0hMTtjb25zdCBlPVtdO2xldCBuLHM9dGhpcy5nZXRQb2ludCgwKSxyPTA7ZS5wdXNoKDApO2ZvcihsZXQgbz0xO288PXQ7bysrKW49dGhpcy5nZXRQb2ludChvL3QpLHIrPW4uZGlzdGFuY2VUbyhzKSxlLnB1c2gocikscz1uO3JldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3Rocz1lLGV9dXBkYXRlQXJjTGVuZ3Rocygpe3RoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5nZXRMZW5ndGhzKCl9Z2V0VXRvVG1hcHBpbmcodCxlPW51bGwpe2NvbnN0IG49dGhpcy5nZXRMZW5ndGhzKCk7bGV0IHM9MDtjb25zdCByPW4ubGVuZ3RoO2xldCBvO2U/bz1lOm89dCpuW3ItMV07bGV0IGE9MCxjPXItMSxsO2Zvcig7YTw9YzspaWYocz1NYXRoLmZsb29yKGErKGMtYSkvMiksbD1uW3NdLW8sbDwwKWE9cysxO2Vsc2UgaWYobD4wKWM9cy0xO2Vsc2V7Yz1zO2JyZWFrfWlmKHM9YyxuW3NdPT09bylyZXR1cm4gcy8oci0xKTtjb25zdCBoPW5bc10sZj1uW3MrMV0taCxkPShvLWgpL2Y7cmV0dXJuKHMrZCkvKHItMSl9Z2V0VGFuZ2VudCh0LGUpe2xldCBzPXQtMWUtNCxyPXQrMWUtNDtzPDAmJihzPTApLHI+MSYmKHI9MSk7Y29uc3Qgbz10aGlzLmdldFBvaW50KHMpLGE9dGhpcy5nZXRQb2ludChyKSxjPWV8fChvLmlzVmVjdG9yMj9uZXcgTjpuZXcgVCk7cmV0dXJuIGMuY29weShhKS5zdWIobykubm9ybWFsaXplKCksY31nZXRUYW5nZW50QXQodCxlKXtjb25zdCBuPXRoaXMuZ2V0VXRvVG1hcHBpbmcodCk7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudChuLGUpfWNvbXB1dGVGcmVuZXRGcmFtZXModCxlPSExKXtjb25zdCBuPW5ldyBULHM9W10scj1bXSxvPVtdLGE9bmV3IFQsYz1uZXcgc3Q7Zm9yKGxldCBkPTA7ZDw9dDtkKyspe2NvbnN0IHA9ZC90O3NbZF09dGhpcy5nZXRUYW5nZW50QXQocCxuZXcgVCl9clswXT1uZXcgVCxvWzBdPW5ldyBUO2xldCBsPU51bWJlci5NQVhfVkFMVUU7Y29uc3QgaD1NYXRoLmFicyhzWzBdLngpLHU9TWF0aC5hYnMoc1swXS55KSxmPU1hdGguYWJzKHNbMF0ueik7aDw9bCYmKGw9aCxuLnNldCgxLDAsMCkpLHU8PWwmJihsPXUsbi5zZXQoMCwxLDApKSxmPD1sJiZuLnNldCgwLDAsMSksYS5jcm9zc1ZlY3RvcnMoc1swXSxuKS5ub3JtYWxpemUoKSxyWzBdLmNyb3NzVmVjdG9ycyhzWzBdLGEpLG9bMF0uY3Jvc3NWZWN0b3JzKHNbMF0sclswXSk7Zm9yKGxldCBkPTE7ZDw9dDtkKyspe2lmKHJbZF09cltkLTFdLmNsb25lKCksb1tkXT1vW2QtMV0uY2xvbmUoKSxhLmNyb3NzVmVjdG9ycyhzW2QtMV0sc1tkXSksYS5sZW5ndGgoKT5OdW1iZXIuRVBTSUxPTil7YS5ub3JtYWxpemUoKTtjb25zdCBwPU1hdGguYWNvcyhHKHNbZC0xXS5kb3Qoc1tkXSksLTEsMSkpO3JbZF0uYXBwbHlNYXRyaXg0KGMubWFrZVJvdGF0aW9uQXhpcyhhLHApKX1vW2RdLmNyb3NzVmVjdG9ycyhzW2RdLHJbZF0pfWlmKGU9PT0hMCl7bGV0IGQ9TWF0aC5hY29zKEcoclswXS5kb3Qoclt0XSksLTEsMSkpO2QvPXQsc1swXS5kb3QoYS5jcm9zc1ZlY3RvcnMoclswXSxyW3RdKSk+MCYmKGQ9LWQpO2ZvcihsZXQgcD0xO3A8PXQ7cCsrKXJbcF0uYXBwbHlNYXRyaXg0KGMubWFrZVJvdGF0aW9uQXhpcyhzW3BdLGQqcCkpLG9bcF0uY3Jvc3NWZWN0b3JzKHNbcF0scltwXSl9cmV0dXJue3RhbmdlbnRzOnMsbm9ybWFsczpyLGJpbm9ybWFsczpvfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9dC5hcmNMZW5ndGhEaXZpc2lvbnMsdGhpc310b0pTT04oKXtjb25zdCB0PXttZXRhZGF0YTp7dmVyc2lvbjo0LjcsdHlwZToiQ3VydmUiLGdlbmVyYXRvcjoiQ3VydmUudG9KU09OIn19O3JldHVybiB0LmFyY0xlbmd0aERpdmlzaW9ucz10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyx0LnR5cGU9dGhpcy50eXBlLHR9ZnJvbUpTT04odCl7cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPXQuYXJjTGVuZ3RoRGl2aXNpb25zLHRoaXN9fTtjbGFzcyBUcyBleHRlbmRzIHhle2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0xLHM9MSxyPTAsbz1NYXRoLlBJKjIsYT0hMSxjPTApe3N1cGVyKCksdGhpcy5pc0VsbGlwc2VDdXJ2ZT0hMCx0aGlzLnR5cGU9IkVsbGlwc2VDdXJ2ZSIsdGhpcy5hWD10LHRoaXMuYVk9ZSx0aGlzLnhSYWRpdXM9bix0aGlzLnlSYWRpdXM9cyx0aGlzLmFTdGFydEFuZ2xlPXIsdGhpcy5hRW5kQW5nbGU9byx0aGlzLmFDbG9ja3dpc2U9YSx0aGlzLmFSb3RhdGlvbj1jfWdldFBvaW50KHQsZT1uZXcgTil7Y29uc3Qgbj1lLHM9TWF0aC5QSSoyO2xldCByPXRoaXMuYUVuZEFuZ2xlLXRoaXMuYVN0YXJ0QW5nbGU7Y29uc3Qgbz1NYXRoLmFicyhyKTxOdW1iZXIuRVBTSUxPTjtmb3IoO3I8MDspcis9cztmb3IoO3I+czspci09cztyPE51bWJlci5FUFNJTE9OJiYobz9yPTA6cj1zKSx0aGlzLmFDbG9ja3dpc2U9PT0hMCYmIW8mJihyPT09cz9yPS1zOnI9ci1zKTtjb25zdCBhPXRoaXMuYVN0YXJ0QW5nbGUrdCpyO2xldCBjPXRoaXMuYVgrdGhpcy54UmFkaXVzKk1hdGguY29zKGEpLGw9dGhpcy5hWSt0aGlzLnlSYWRpdXMqTWF0aC5zaW4oYSk7aWYodGhpcy5hUm90YXRpb24hPT0wKXtjb25zdCBoPU1hdGguY29zKHRoaXMuYVJvdGF0aW9uKSx1PU1hdGguc2luKHRoaXMuYVJvdGF0aW9uKSxmPWMtdGhpcy5hWCxkPWwtdGhpcy5hWTtjPWYqaC1kKnUrdGhpcy5hWCxsPWYqdStkKmgrdGhpcy5hWX1yZXR1cm4gbi5zZXQoYyxsKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuYVg9dC5hWCx0aGlzLmFZPXQuYVksdGhpcy54UmFkaXVzPXQueFJhZGl1cyx0aGlzLnlSYWRpdXM9dC55UmFkaXVzLHRoaXMuYVN0YXJ0QW5nbGU9dC5hU3RhcnRBbmdsZSx0aGlzLmFFbmRBbmdsZT10LmFFbmRBbmdsZSx0aGlzLmFDbG9ja3dpc2U9dC5hQ2xvY2t3aXNlLHRoaXMuYVJvdGF0aW9uPXQuYVJvdGF0aW9uLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5hWD10aGlzLmFYLHQuYVk9dGhpcy5hWSx0LnhSYWRpdXM9dGhpcy54UmFkaXVzLHQueVJhZGl1cz10aGlzLnlSYWRpdXMsdC5hU3RhcnRBbmdsZT10aGlzLmFTdGFydEFuZ2xlLHQuYUVuZEFuZ2xlPXRoaXMuYUVuZEFuZ2xlLHQuYUNsb2Nrd2lzZT10aGlzLmFDbG9ja3dpc2UsdC5hUm90YXRpb249dGhpcy5hUm90YXRpb24sdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5hWD10LmFYLHRoaXMuYVk9dC5hWSx0aGlzLnhSYWRpdXM9dC54UmFkaXVzLHRoaXMueVJhZGl1cz10LnlSYWRpdXMsdGhpcy5hU3RhcnRBbmdsZT10LmFTdGFydEFuZ2xlLHRoaXMuYUVuZEFuZ2xlPXQuYUVuZEFuZ2xlLHRoaXMuYUNsb2Nrd2lzZT10LmFDbG9ja3dpc2UsdGhpcy5hUm90YXRpb249dC5hUm90YXRpb24sdGhpc319Y2xhc3MgVWMgZXh0ZW5kcyBUc3tjb25zdHJ1Y3Rvcih0LGUsbixzLHIsbyl7c3VwZXIodCxlLG4sbixzLHIsbyksdGhpcy5pc0FyY0N1cnZlPSEwLHRoaXMudHlwZT0iQXJjQ3VydmUifX1mdW5jdGlvbiBQbygpe2xldCBpPTAsdD0wLGU9MCxuPTA7ZnVuY3Rpb24gcyhyLG8sYSxjKXtpPXIsdD1hLGU9LTMqciszKm8tMiphLWMsbj0yKnItMipvK2ErY31yZXR1cm57aW5pdENhdG11bGxSb206ZnVuY3Rpb24ocixvLGEsYyxsKXtzKG8sYSxsKihhLXIpLGwqKGMtbykpfSxpbml0Tm9udW5pZm9ybUNhdG11bGxSb206ZnVuY3Rpb24ocixvLGEsYyxsLGgsdSl7bGV0IGY9KG8tcikvbC0oYS1yKS8obCtoKSsoYS1vKS9oLGQ9KGEtbykvaC0oYy1vKS8oaCt1KSsoYy1hKS91O2YqPWgsZCo9aCxzKG8sYSxmLGQpfSxjYWxjOmZ1bmN0aW9uKHIpe2NvbnN0IG89cipyLGE9bypyO3JldHVybiBpK3QqcitlKm8rbiphfX19Y29uc3QgRXM9bmV3IFQsQ289bmV3IFBvLEJvPW5ldyBQbyxGbz1uZXcgUG87Y2xhc3MgcWMgZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PVtdLGU9ITEsbj0iY2VudHJpcGV0YWwiLHM9LjUpe3N1cGVyKCksdGhpcy5pc0NhdG11bGxSb21DdXJ2ZTM9ITAsdGhpcy50eXBlPSJDYXRtdWxsUm9tQ3VydmUzIix0aGlzLnBvaW50cz10LHRoaXMuY2xvc2VkPWUsdGhpcy5jdXJ2ZVR5cGU9bix0aGlzLnRlbnNpb249c31nZXRQb2ludCh0LGU9bmV3IFQpe2NvbnN0IG49ZSxzPXRoaXMucG9pbnRzLHI9cy5sZW5ndGgsbz0oci0odGhpcy5jbG9zZWQ/MDoxKSkqdDtsZXQgYT1NYXRoLmZsb29yKG8pLGM9by1hO3RoaXMuY2xvc2VkP2ErPWE+MD8wOihNYXRoLmZsb29yKE1hdGguYWJzKGEpL3IpKzEpKnI6Yz09PTAmJmE9PT1yLTEmJihhPXItMixjPTEpO2xldCBsLGg7dGhpcy5jbG9zZWR8fGE+MD9sPXNbKGEtMSklcl06KEVzLnN1YlZlY3RvcnMoc1swXSxzWzFdKS5hZGQoc1swXSksbD1Fcyk7Y29uc3QgdT1zW2Elcl0sZj1zWyhhKzEpJXJdO2lmKHRoaXMuY2xvc2VkfHxhKzI8cj9oPXNbKGErMiklcl06KEVzLnN1YlZlY3RvcnMoc1tyLTFdLHNbci0yXSkuYWRkKHNbci0xXSksaD1FcyksdGhpcy5jdXJ2ZVR5cGU9PT0iY2VudHJpcGV0YWwifHx0aGlzLmN1cnZlVHlwZT09PSJjaG9yZGFsIil7Y29uc3QgZD10aGlzLmN1cnZlVHlwZT09PSJjaG9yZGFsIj8uNTouMjU7bGV0IHA9TWF0aC5wb3cobC5kaXN0YW5jZVRvU3F1YXJlZCh1KSxkKSx5PU1hdGgucG93KHUuZGlzdGFuY2VUb1NxdWFyZWQoZiksZCksbT1NYXRoLnBvdyhmLmRpc3RhbmNlVG9TcXVhcmVkKGgpLGQpO3k8MWUtNCYmKHk9MSkscDwxZS00JiYocD15KSxtPDFlLTQmJihtPXkpLENvLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShsLngsdS54LGYueCxoLngscCx5LG0pLEJvLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShsLnksdS55LGYueSxoLnkscCx5LG0pLEZvLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShsLnosdS56LGYueixoLnoscCx5LG0pfWVsc2UgdGhpcy5jdXJ2ZVR5cGU9PT0iY2F0bXVsbHJvbSImJihDby5pbml0Q2F0bXVsbFJvbShsLngsdS54LGYueCxoLngsdGhpcy50ZW5zaW9uKSxCby5pbml0Q2F0bXVsbFJvbShsLnksdS55LGYueSxoLnksdGhpcy50ZW5zaW9uKSxGby5pbml0Q2F0bXVsbFJvbShsLnosdS56LGYueixoLnosdGhpcy50ZW5zaW9uKSk7cmV0dXJuIG4uc2V0KENvLmNhbGMoYyksQm8uY2FsYyhjKSxGby5jYWxjKGMpKSxufWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2gocy5jbG9uZSgpKX1yZXR1cm4gdGhpcy5jbG9zZWQ9dC5jbG9zZWQsdGhpcy5jdXJ2ZVR5cGU9dC5jdXJ2ZVR5cGUsdGhpcy50ZW5zaW9uPXQudGVuc2lvbix0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10aGlzLnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10aGlzLnBvaW50c1tlXTt0LnBvaW50cy5wdXNoKHMudG9BcnJheSgpKX1yZXR1cm4gdC5jbG9zZWQ9dGhpcy5jbG9zZWQsdC5jdXJ2ZVR5cGU9dGhpcy5jdXJ2ZVR5cGUsdC50ZW5zaW9uPXRoaXMudGVuc2lvbix0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaChuZXcgVCgpLmZyb21BcnJheShzKSl9cmV0dXJuIHRoaXMuY2xvc2VkPXQuY2xvc2VkLHRoaXMuY3VydmVUeXBlPXQuY3VydmVUeXBlLHRoaXMudGVuc2lvbj10LnRlbnNpb24sdGhpc319ZnVuY3Rpb24gSGMoaSx0LGUsbixzKXtjb25zdCByPShuLXQpKi41LG89KHMtZSkqLjUsYT1pKmksYz1pKmE7cmV0dXJuKDIqZS0yKm4rcitvKSpjKygtMyplKzMqbi0yKnItbykqYStyKmkrZX1mdW5jdGlvbiBUZihpLHQpe2NvbnN0IGU9MS1pO3JldHVybiBlKmUqdH1mdW5jdGlvbiBFZihpLHQpe3JldHVybiAyKigxLWkpKmkqdH1mdW5jdGlvbiBQZihpLHQpe3JldHVybiBpKmkqdH1mdW5jdGlvbiB2aShpLHQsZSxuKXtyZXR1cm4gVGYoaSx0KStFZihpLGUpK1BmKGksbil9ZnVuY3Rpb24gQ2YoaSx0KXtjb25zdCBlPTEtaTtyZXR1cm4gZSplKmUqdH1mdW5jdGlvbiBCZihpLHQpe2NvbnN0IGU9MS1pO3JldHVybiAzKmUqZSppKnR9ZnVuY3Rpb24gRmYoaSx0KXtyZXR1cm4gMyooMS1pKSppKmkqdH1mdW5jdGlvbiBJZihpLHQpe3JldHVybiBpKmkqaSp0fWZ1bmN0aW9uIHppKGksdCxlLG4scyl7cmV0dXJuIENmKGksdCkrQmYoaSxlKStGZihpLG4pK0lmKGkscyl9Y2xhc3MgSW8gZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PW5ldyBOLGU9bmV3IE4sbj1uZXcgTixzPW5ldyBOKXtzdXBlcigpLHRoaXMuaXNDdWJpY0JlemllckN1cnZlPSEwLHRoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZSIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW4sdGhpcy52Mz1zfWdldFBvaW50KHQsZT1uZXcgTil7Y29uc3Qgbj1lLHM9dGhpcy52MCxyPXRoaXMudjEsbz10aGlzLnYyLGE9dGhpcy52MztyZXR1cm4gbi5zZXQoemkodCxzLngsci54LG8ueCxhLngpLHppKHQscy55LHIueSxvLnksYS55KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXMudjMuY29weSh0LnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHQudjM9dGhpcy52My50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpcy52My5mcm9tQXJyYXkodC52MyksdGhpc319Y2xhc3MgWGMgZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQsbj1uZXcgVCxzPW5ldyBUKXtzdXBlcigpLHRoaXMuaXNDdWJpY0JlemllckN1cnZlMz0hMCx0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUzIix0aGlzLnYwPXQsdGhpcy52MT1lLHRoaXMudjI9bix0aGlzLnYzPXN9Z2V0UG9pbnQodCxlPW5ldyBUKXtjb25zdCBuPWUscz10aGlzLnYwLHI9dGhpcy52MSxvPXRoaXMudjIsYT10aGlzLnYzO3JldHVybiBuLnNldCh6aSh0LHMueCxyLngsby54LGEueCksemkodCxzLnksci55LG8ueSxhLnkpLHppKHQscy56LHIueixvLnosYS56KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXMudjMuY29weSh0LnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHQudjM9dGhpcy52My50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpcy52My5mcm9tQXJyYXkodC52MyksdGhpc319Y2xhc3Mga28gZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PW5ldyBOLGU9bmV3IE4pe3N1cGVyKCksdGhpcy5pc0xpbmVDdXJ2ZT0hMCx0aGlzLnR5cGU9IkxpbmVDdXJ2ZSIsdGhpcy52MT10LHRoaXMudjI9ZX1nZXRQb2ludCh0LGU9bmV3IE4pe2NvbnN0IG49ZTtyZXR1cm4gdD09PTE/bi5jb3B5KHRoaXMudjIpOihuLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLG4ubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMudjEpKSxufWdldFBvaW50QXQodCxlKXtyZXR1cm4gdGhpcy5nZXRQb2ludCh0LGUpfWdldFRhbmdlbnQodCxlPW5ldyBOKXtyZXR1cm4gZS5zdWJWZWN0b3JzKHRoaXMudjIsdGhpcy52MSkubm9ybWFsaXplKCl9Z2V0VGFuZ2VudEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudCh0LGUpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1jbGFzcyBHYyBleHRlbmRzIHhle2NvbnN0cnVjdG9yKHQ9bmV3IFQsZT1uZXcgVCl7c3VwZXIoKSx0aGlzLmlzTGluZUN1cnZlMz0hMCx0aGlzLnR5cGU9IkxpbmVDdXJ2ZTMiLHRoaXMudjE9dCx0aGlzLnYyPWV9Z2V0UG9pbnQodCxlPW5ldyBUKXtjb25zdCBuPWU7cmV0dXJuIHQ9PT0xP24uY29weSh0aGlzLnYyKToobi5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSxuLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnYxKSksbn1nZXRQb2ludEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQodCxlKX1nZXRUYW5nZW50KHQsZT1uZXcgVCl7cmV0dXJuIGUuc3ViVmVjdG9ycyh0aGlzLnYyLHRoaXMudjEpLm5vcm1hbGl6ZSgpfWdldFRhbmdlbnRBdCh0LGUpe3JldHVybiB0aGlzLmdldFRhbmdlbnQodCxlKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgTm8gZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PW5ldyBOLGU9bmV3IE4sbj1uZXcgTil7c3VwZXIoKSx0aGlzLmlzUXVhZHJhdGljQmV6aWVyQ3VydmU9ITAsdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZSIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW59Z2V0UG9pbnQodCxlPW5ldyBOKXtjb25zdCBuPWUscz10aGlzLnYwLHI9dGhpcy52MSxvPXRoaXMudjI7cmV0dXJuIG4uc2V0KHZpKHQscy54LHIueCxvLngpLHZpKHQscy55LHIueSxvLnkpKSxufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MC5jb3B5KHQudjApLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYwLmZyb21BcnJheSh0LnYwKSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1jbGFzcyBXYyBleHRlbmRzIHhle2NvbnN0cnVjdG9yKHQ9bmV3IFQsZT1uZXcgVCxuPW5ldyBUKXtzdXBlcigpLHRoaXMuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTM9ITAsdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1ufWdldFBvaW50KHQsZT1uZXcgVCl7Y29uc3Qgbj1lLHM9dGhpcy52MCxyPXRoaXMudjEsbz10aGlzLnYyO3JldHVybiBuLnNldCh2aSh0LHMueCxyLngsby54KSx2aSh0LHMueSxyLnksby55KSx2aSh0LHMueixyLnosby56KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MD10aGlzLnYwLnRvQXJyYXkoKSx0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgUm8gZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PVtdKXtzdXBlcigpLHRoaXMuaXNTcGxpbmVDdXJ2ZT0hMCx0aGlzLnR5cGU9IlNwbGluZUN1cnZlIix0aGlzLnBvaW50cz10fWdldFBvaW50KHQsZT1uZXcgTil7Y29uc3Qgbj1lLHM9dGhpcy5wb2ludHMscj0ocy5sZW5ndGgtMSkqdCxvPU1hdGguZmxvb3IociksYT1yLW8sYz1zW289PT0wP286by0xXSxsPXNbb10saD1zW28+cy5sZW5ndGgtMj9zLmxlbmd0aC0xOm8rMV0sdT1zW28+cy5sZW5ndGgtMz9zLmxlbmd0aC0xOm8rMl07cmV0dXJuIG4uc2V0KEhjKGEsYy54LGwueCxoLngsdS54KSxIYyhhLGMueSxsLnksaC55LHUueSkpLG59Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaChzLmNsb25lKCkpfXJldHVybiB0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10aGlzLnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10aGlzLnBvaW50c1tlXTt0LnBvaW50cy5wdXNoKHMudG9BcnJheSgpKX1yZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2gobmV3IE4oKS5mcm9tQXJyYXkocykpfXJldHVybiB0aGlzfX12YXIgWmM9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQXJjQ3VydmU6VWMsQ2F0bXVsbFJvbUN1cnZlMzpxYyxDdWJpY0JlemllckN1cnZlOklvLEN1YmljQmV6aWVyQ3VydmUzOlhjLEVsbGlwc2VDdXJ2ZTpUcyxMaW5lQ3VydmU6a28sTGluZUN1cnZlMzpHYyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTpObyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6V2MsU3BsaW5lQ3VydmU6Um99KTtjbGFzcyBrZiBleHRlbmRzIHhle2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnR5cGU9IkN1cnZlUGF0aCIsdGhpcy5jdXJ2ZXM9W10sdGhpcy5hdXRvQ2xvc2U9ITF9YWRkKHQpe3RoaXMuY3VydmVzLnB1c2godCl9Y2xvc2VQYXRoKCl7Y29uc3QgdD10aGlzLmN1cnZlc1swXS5nZXRQb2ludCgwKSxlPXRoaXMuY3VydmVzW3RoaXMuY3VydmVzLmxlbmd0aC0xXS5nZXRQb2ludCgxKTtpZighdC5lcXVhbHMoZSkpe2NvbnN0IG49dC5pc1ZlY3RvcjI9PT0hMD8iTGluZUN1cnZlIjoiTGluZUN1cnZlMyI7dGhpcy5jdXJ2ZXMucHVzaChuZXcgWmNbbl0oZSx0KSl9cmV0dXJuIHRoaXN9Z2V0UG9pbnQodCxlKXtjb25zdCBuPXQqdGhpcy5nZXRMZW5ndGgoKSxzPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7bGV0IHI9MDtmb3IoO3I8cy5sZW5ndGg7KXtpZihzW3JdPj1uKXtjb25zdCBvPXNbcl0tbixhPXRoaXMuY3VydmVzW3JdLGM9YS5nZXRMZW5ndGgoKSxsPWM9PT0wPzA6MS1vL2M7cmV0dXJuIGEuZ2V0UG9pbnRBdChsLGUpfXIrK31yZXR1cm4gbnVsbH1nZXRMZW5ndGgoKXtjb25zdCB0PXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7cmV0dXJuIHRbdC5sZW5ndGgtMV19dXBkYXRlQXJjTGVuZ3Rocygpe3RoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5jYWNoZUxlbmd0aHM9bnVsbCx0aGlzLmdldEN1cnZlTGVuZ3RocygpfWdldEN1cnZlTGVuZ3Rocygpe2lmKHRoaXMuY2FjaGVMZW5ndGhzJiZ0aGlzLmNhY2hlTGVuZ3Rocy5sZW5ndGg9PT10aGlzLmN1cnZlcy5sZW5ndGgpcmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzO2NvbnN0IHQ9W107bGV0IGU9MDtmb3IobGV0IG49MCxzPXRoaXMuY3VydmVzLmxlbmd0aDtuPHM7bisrKWUrPXRoaXMuY3VydmVzW25dLmdldExlbmd0aCgpLHQucHVzaChlKTtyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM9dCx0fWdldFNwYWNlZFBvaW50cyh0PTQwKXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248PXQ7bisrKWUucHVzaCh0aGlzLmdldFBvaW50KG4vdCkpO3JldHVybiB0aGlzLmF1dG9DbG9zZSYmZS5wdXNoKGVbMF0pLGV9Z2V0UG9pbnRzKHQ9MTIpe2NvbnN0IGU9W107bGV0IG47Zm9yKGxldCBzPTAscj10aGlzLmN1cnZlcztzPHIubGVuZ3RoO3MrKyl7Y29uc3Qgbz1yW3NdLGE9by5pc0VsbGlwc2VDdXJ2ZT90KjI6by5pc0xpbmVDdXJ2ZXx8by5pc0xpbmVDdXJ2ZTM/MTpvLmlzU3BsaW5lQ3VydmU/dCpvLnBvaW50cy5sZW5ndGg6dCxjPW8uZ2V0UG9pbnRzKGEpO2ZvcihsZXQgbD0wO2w8Yy5sZW5ndGg7bCsrKXtjb25zdCBoPWNbbF07biYmbi5lcXVhbHMoaCl8fChlLnB1c2goaCksbj1oKX19cmV0dXJuIHRoaXMuYXV0b0Nsb3NlJiZlLmxlbmd0aD4xJiYhZVtlLmxlbmd0aC0xXS5lcXVhbHMoZVswXSkmJmUucHVzaChlWzBdKSxlfWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IGU9MCxuPXQuY3VydmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuY3VydmVzW2VdO3RoaXMuY3VydmVzLnB1c2gocy5jbG9uZSgpKX1yZXR1cm4gdGhpcy5hdXRvQ2xvc2U9dC5hdXRvQ2xvc2UsdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QuYXV0b0Nsb3NlPXRoaXMuYXV0b0Nsb3NlLHQuY3VydmVzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5jdXJ2ZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dGhpcy5jdXJ2ZXNbZV07dC5jdXJ2ZXMucHVzaChzLnRvSlNPTigpKX1yZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLmF1dG9DbG9zZT10LmF1dG9DbG9zZSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IGU9MCxuPXQuY3VydmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuY3VydmVzW2VdO3RoaXMuY3VydmVzLnB1c2gobmV3IFpjW3MudHlwZV0oKS5mcm9tSlNPTihzKSl9cmV0dXJuIHRoaXN9fWxldCBKYz1jbGFzcyBleHRlbmRzIGtme2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJQYXRoIix0aGlzLmN1cnJlbnRQb2ludD1uZXcgTix0JiZ0aGlzLnNldEZyb21Qb2ludHModCl9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1vdmVUbyh0WzBdLngsdFswXS55KTtmb3IobGV0IGU9MSxuPXQubGVuZ3RoO2U8bjtlKyspdGhpcy5saW5lVG8odFtlXS54LHRbZV0ueSk7cmV0dXJuIHRoaXN9bW92ZVRvKHQsZSl7cmV0dXJuIHRoaXMuY3VycmVudFBvaW50LnNldCh0LGUpLHRoaXN9bGluZVRvKHQsZSl7Y29uc3Qgbj1uZXcga28odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgTih0LGUpKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSx0aGlzLmN1cnJlbnRQb2ludC5zZXQodCxlKSx0aGlzfXF1YWRyYXRpY0N1cnZlVG8odCxlLG4scyl7Y29uc3Qgcj1uZXcgTm8odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgTih0LGUpLG5ldyBOKG4scykpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKHIpLHRoaXMuY3VycmVudFBvaW50LnNldChuLHMpLHRoaXN9YmV6aWVyQ3VydmVUbyh0LGUsbixzLHIsbyl7Y29uc3QgYT1uZXcgSW8odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgTih0LGUpLG5ldyBOKG4scyksbmV3IE4ocixvKSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2goYSksdGhpcy5jdXJyZW50UG9pbnQuc2V0KHIsbyksdGhpc31zcGxpbmVUaHJ1KHQpe2NvbnN0IGU9W3RoaXMuY3VycmVudFBvaW50LmNsb25lKCldLmNvbmNhdCh0KSxuPW5ldyBSbyhlKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSx0aGlzLmN1cnJlbnRQb2ludC5jb3B5KHRbdC5sZW5ndGgtMV0pLHRoaXN9YXJjKHQsZSxuLHMscixvKXtjb25zdCBhPXRoaXMuY3VycmVudFBvaW50LngsYz10aGlzLmN1cnJlbnRQb2ludC55O3JldHVybiB0aGlzLmFic2FyYyh0K2EsZStjLG4scyxyLG8pLHRoaXN9YWJzYXJjKHQsZSxuLHMscixvKXtyZXR1cm4gdGhpcy5hYnNlbGxpcHNlKHQsZSxuLG4scyxyLG8pLHRoaXN9ZWxsaXBzZSh0LGUsbixzLHIsbyxhLGMpe2NvbnN0IGw9dGhpcy5jdXJyZW50UG9pbnQueCxoPXRoaXMuY3VycmVudFBvaW50Lnk7cmV0dXJuIHRoaXMuYWJzZWxsaXBzZSh0K2wsZStoLG4scyxyLG8sYSxjKSx0aGlzfWFic2VsbGlwc2UodCxlLG4scyxyLG8sYSxjKXtjb25zdCBsPW5ldyBUcyh0LGUsbixzLHIsbyxhLGMpO2lmKHRoaXMuY3VydmVzLmxlbmd0aD4wKXtjb25zdCB1PWwuZ2V0UG9pbnQoMCk7dS5lcXVhbHModGhpcy5jdXJyZW50UG9pbnQpfHx0aGlzLmxpbmVUbyh1LngsdS55KX10aGlzLmN1cnZlcy5wdXNoKGwpO2NvbnN0IGg9bC5nZXRQb2ludCgxKTtyZXR1cm4gdGhpcy5jdXJyZW50UG9pbnQuY29weShoKSx0aGlzfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jdXJyZW50UG9pbnQuY29weSh0LmN1cnJlbnRQb2ludCksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LmN1cnJlbnRQb2ludD10aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KHQuY3VycmVudFBvaW50KSx0aGlzfX07Y2xhc3MgWWMgZXh0ZW5kcyBKY3tjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnV1aWQ9Rm4oKSx0aGlzLnR5cGU9IlNoYXBlIix0aGlzLmhvbGVzPVtdfWdldFBvaW50c0hvbGVzKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTAscz10aGlzLmhvbGVzLmxlbmd0aDtuPHM7bisrKWVbbl09dGhpcy5ob2xlc1tuXS5nZXRQb2ludHModCk7cmV0dXJuIGV9ZXh0cmFjdFBvaW50cyh0KXtyZXR1cm57c2hhcGU6dGhpcy5nZXRQb2ludHModCksaG9sZXM6dGhpcy5nZXRQb2ludHNIb2xlcyh0KX19Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMuaG9sZXM9W107Zm9yKGxldCBlPTAsbj10LmhvbGVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuaG9sZXNbZV07dGhpcy5ob2xlcy5wdXNoKHMuY2xvbmUoKSl9cmV0dXJuIHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTt0LnV1aWQ9dGhpcy51dWlkLHQuaG9sZXM9W107Zm9yKGxldCBlPTAsbj10aGlzLmhvbGVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXRoaXMuaG9sZXNbZV07dC5ob2xlcy5wdXNoKHMudG9KU09OKCkpfXJldHVybiB0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMudXVpZD10LnV1aWQsdGhpcy5ob2xlcz1bXTtmb3IobGV0IGU9MCxuPXQuaG9sZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dC5ob2xlc1tlXTt0aGlzLmhvbGVzLnB1c2gobmV3IEpjKCkuZnJvbUpTT04ocykpfXJldHVybiB0aGlzfX1mdW5jdGlvbiBOZihpLHQsZT0yKXtjb25zdCBuPXQmJnQubGVuZ3RoLHM9bj90WzBdKmU6aS5sZW5ndGg7bGV0IHI9amMoaSwwLHMsZSwhMCk7Y29uc3Qgbz1bXTtpZighcnx8ci5uZXh0PT09ci5wcmV2KXJldHVybiBvO2xldCBhLGMsbDtpZihuJiYocj0kZihpLHQscixlKSksaS5sZW5ndGg+ODAqZSl7YT0xLzAsYz0xLzA7bGV0IGg9LTEvMCx1PS0xLzA7Zm9yKGxldCBmPWU7ZjxzO2YrPWUpe2NvbnN0IGQ9aVtmXSxwPWlbZisxXTtkPGEmJihhPWQpLHA8YyYmKGM9cCksZD5oJiYoaD1kKSxwPnUmJih1PXApfWw9TWF0aC5tYXgoaC1hLHUtYyksbD1sIT09MD8zMjc2Ny9sOjB9cmV0dXJuIFRpKHIsbyxlLGEsYyxsLDApLG99ZnVuY3Rpb24gamMoaSx0LGUsbixzKXtsZXQgcjtpZihzPT09amYoaSx0LGUsbik+MClmb3IobGV0IG89dDtvPGU7bys9bilyPWVsKG8vbnwwLGlbb10saVtvKzFdLHIpO2Vsc2UgZm9yKGxldCBvPWUtbjtvPj10O28tPW4pcj1lbChvL258MCxpW29dLGlbbysxXSxyKTtyZXR1cm4gciYmSG4ocixyLm5leHQpJiYoQ2kocikscj1yLm5leHQpLHJ9ZnVuY3Rpb24gZG4oaSx0KXtpZighaSlyZXR1cm4gaTt0fHwodD1pKTtsZXQgZT1pLG47ZG8gaWYobj0hMSwhZS5zdGVpbmVyJiYoSG4oZSxlLm5leHQpfHxydChlLnByZXYsZSxlLm5leHQpPT09MCkpe2lmKENpKGUpLGU9dD1lLnByZXYsZT09PWUubmV4dClicmVhaztuPSEwfWVsc2UgZT1lLm5leHQ7d2hpbGUobnx8ZSE9PXQpO3JldHVybiB0fWZ1bmN0aW9uIFRpKGksdCxlLG4scyxyLG8pe2lmKCFpKXJldHVybjshbyYmciYmWGYoaSxuLHMscik7bGV0IGE9aTtmb3IoO2kucHJldiE9PWkubmV4dDspe2NvbnN0IGM9aS5wcmV2LGw9aS5uZXh0O2lmKHI/TGYoaSxuLHMscik6UmYoaSkpe3QucHVzaChjLmksaS5pLGwuaSksQ2koaSksaT1sLm5leHQsYT1sLm5leHQ7Y29udGludWV9aWYoaT1sLGk9PT1hKXtvP289PT0xPyhpPU9mKGRuKGkpLHQpLFRpKGksdCxlLG4scyxyLDIpKTpvPT09MiYmRGYoaSx0LGUsbixzLHIpOlRpKGRuKGkpLHQsZSxuLHMsciwxKTticmVha319fWZ1bmN0aW9uIFJmKGkpe2NvbnN0IHQ9aS5wcmV2LGU9aSxuPWkubmV4dDtpZihydCh0LGUsbik+PTApcmV0dXJuITE7Y29uc3Qgcz10Lngscj1lLngsbz1uLngsYT10LnksYz1lLnksbD1uLnksaD1NYXRoLm1pbihzLHIsbyksdT1NYXRoLm1pbihhLGMsbCksZj1NYXRoLm1heChzLHIsbyksZD1NYXRoLm1heChhLGMsbCk7bGV0IHA9bi5uZXh0O2Zvcig7cCE9PXQ7KXtpZihwLng+PWgmJnAueDw9ZiYmcC55Pj11JiZwLnk8PWQmJkVpKHMsYSxyLGMsbyxsLHAueCxwLnkpJiZydChwLnByZXYscCxwLm5leHQpPj0wKXJldHVybiExO3A9cC5uZXh0fXJldHVybiEwfWZ1bmN0aW9uIExmKGksdCxlLG4pe2NvbnN0IHM9aS5wcmV2LHI9aSxvPWkubmV4dDtpZihydChzLHIsbyk+PTApcmV0dXJuITE7Y29uc3QgYT1zLngsYz1yLngsbD1vLngsaD1zLnksdT1yLnksZj1vLnksZD1NYXRoLm1pbihhLGMsbCkscD1NYXRoLm1pbihoLHUsZikseT1NYXRoLm1heChhLGMsbCksbT1NYXRoLm1heChoLHUsZiksZz1MbyhkLHAsdCxlLG4pLGI9TG8oeSxtLHQsZSxuKTtsZXQgdz1pLnByZXZaLHg9aS5uZXh0Wjtmb3IoO3cmJncuej49ZyYmeCYmeC56PD1iOyl7aWYody54Pj1kJiZ3Lng8PXkmJncueT49cCYmdy55PD1tJiZ3IT09cyYmdyE9PW8mJkVpKGEsaCxjLHUsbCxmLHcueCx3LnkpJiZydCh3LnByZXYsdyx3Lm5leHQpPj0wfHwodz13LnByZXZaLHgueD49ZCYmeC54PD15JiZ4Lnk+PXAmJngueTw9bSYmeCE9PXMmJnghPT1vJiZFaShhLGgsYyx1LGwsZix4LngseC55KSYmcnQoeC5wcmV2LHgseC5uZXh0KT49MCkpcmV0dXJuITE7eD14Lm5leHRafWZvcig7dyYmdy56Pj1nOyl7aWYody54Pj1kJiZ3Lng8PXkmJncueT49cCYmdy55PD1tJiZ3IT09cyYmdyE9PW8mJkVpKGEsaCxjLHUsbCxmLHcueCx3LnkpJiZydCh3LnByZXYsdyx3Lm5leHQpPj0wKXJldHVybiExO3c9dy5wcmV2Wn1mb3IoO3gmJnguejw9Yjspe2lmKHgueD49ZCYmeC54PD15JiZ4Lnk+PXAmJngueTw9bSYmeCE9PXMmJnghPT1vJiZFaShhLGgsYyx1LGwsZix4LngseC55KSYmcnQoeC5wcmV2LHgseC5uZXh0KT49MClyZXR1cm4hMTt4PXgubmV4dFp9cmV0dXJuITB9ZnVuY3Rpb24gT2YoaSx0KXtsZXQgZT1pO2Rve2NvbnN0IG49ZS5wcmV2LHM9ZS5uZXh0Lm5leHQ7IUhuKG4scykmJktjKG4sZSxlLm5leHQscykmJlBpKG4scykmJlBpKHMsbikmJih0LnB1c2gobi5pLGUuaSxzLmkpLENpKGUpLENpKGUubmV4dCksZT1pPXMpLGU9ZS5uZXh0fXdoaWxlKGUhPT1pKTtyZXR1cm4gZG4oZSl9ZnVuY3Rpb24gRGYoaSx0LGUsbixzLHIpe2xldCBvPWk7ZG97bGV0IGE9by5uZXh0Lm5leHQ7Zm9yKDthIT09by5wcmV2Oyl7aWYoby5pIT09YS5pJiZaZihvLGEpKXtsZXQgYz10bChvLGEpO289ZG4obyxvLm5leHQpLGM9ZG4oYyxjLm5leHQpLFRpKG8sdCxlLG4scyxyLDApLFRpKGMsdCxlLG4scyxyLDApO3JldHVybn1hPWEubmV4dH1vPW8ubmV4dH13aGlsZShvIT09aSl9ZnVuY3Rpb24gJGYoaSx0LGUsbil7Y29uc3Qgcz1bXTtmb3IobGV0IHI9MCxvPXQubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9dFtyXSpuLGM9cjxvLTE/dFtyKzFdKm46aS5sZW5ndGgsbD1qYyhpLGEsYyxuLCExKTtsPT09bC5uZXh0JiYobC5zdGVpbmVyPSEwKSxzLnB1c2goV2YobCkpfXMuc29ydChWZik7Zm9yKGxldCByPTA7cjxzLmxlbmd0aDtyKyspZT1VZihzW3JdLGUpO3JldHVybiBlfWZ1bmN0aW9uIFZmKGksdCl7bGV0IGU9aS54LXQueDtpZihlPT09MCYmKGU9aS55LXQueSxlPT09MCkpe2NvbnN0IG49KGkubmV4dC55LWkueSkvKGkubmV4dC54LWkueCkscz0odC5uZXh0LnktdC55KS8odC5uZXh0LngtdC54KTtlPW4tc31yZXR1cm4gZX1mdW5jdGlvbiBVZihpLHQpe2NvbnN0IGU9cWYoaSx0KTtpZighZSlyZXR1cm4gdDtjb25zdCBuPXRsKGUsaSk7cmV0dXJuIGRuKG4sbi5uZXh0KSxkbihlLGUubmV4dCl9ZnVuY3Rpb24gcWYoaSx0KXtsZXQgZT10O2NvbnN0IG49aS54LHM9aS55O2xldCByPS0xLzAsbztpZihIbihpLGUpKXJldHVybiBlO2Rve2lmKEhuKGksZS5uZXh0KSlyZXR1cm4gZS5uZXh0O2lmKHM8PWUueSYmcz49ZS5uZXh0LnkmJmUubmV4dC55IT09ZS55KXtjb25zdCB1PWUueCsocy1lLnkpKihlLm5leHQueC1lLngpLyhlLm5leHQueS1lLnkpO2lmKHU8PW4mJnU+ciYmKHI9dSxvPWUueDxlLm5leHQueD9lOmUubmV4dCx1PT09bikpcmV0dXJuIG99ZT1lLm5leHR9d2hpbGUoZSE9PXQpO2lmKCFvKXJldHVybiBudWxsO2NvbnN0IGE9byxjPW8ueCxsPW8ueTtsZXQgaD0xLzA7ZT1vO2Rve2lmKG4+PWUueCYmZS54Pj1jJiZuIT09ZS54JiZRYyhzPGw/bjpyLHMsYyxsLHM8bD9yOm4scyxlLngsZS55KSl7Y29uc3QgdT1NYXRoLmFicyhzLWUueSkvKG4tZS54KTtQaShlLGkpJiYodTxofHx1PT09aCYmKGUueD5vLnh8fGUueD09PW8ueCYmSGYobyxlKSkpJiYobz1lLGg9dSl9ZT1lLm5leHR9d2hpbGUoZSE9PWEpO3JldHVybiBvfWZ1bmN0aW9uIEhmKGksdCl7cmV0dXJuIHJ0KGkucHJldixpLHQucHJldik8MCYmcnQodC5uZXh0LGksaS5uZXh0KTwwfWZ1bmN0aW9uIFhmKGksdCxlLG4pe2xldCBzPWk7ZG8gcy56PT09MCYmKHMuej1MbyhzLngscy55LHQsZSxuKSkscy5wcmV2Wj1zLnByZXYscy5uZXh0Wj1zLm5leHQscz1zLm5leHQ7d2hpbGUocyE9PWkpO3MucHJldloubmV4dFo9bnVsbCxzLnByZXZaPW51bGwsR2Yocyl9ZnVuY3Rpb24gR2YoaSl7bGV0IHQsZT0xO2Rve2xldCBuPWkscztpPW51bGw7bGV0IHI9bnVsbDtmb3IodD0wO247KXt0Kys7bGV0IG89bixhPTA7Zm9yKGxldCBsPTA7bDxlJiYoYSsrLG89by5uZXh0WiwhIW8pO2wrKyk7bGV0IGM9ZTtmb3IoO2E+MHx8Yz4wJiZvOylhIT09MCYmKGM9PT0wfHwhb3x8bi56PD1vLnopPyhzPW4sbj1uLm5leHRaLGEtLSk6KHM9byxvPW8ubmV4dFosYy0tKSxyP3IubmV4dFo9czppPXMscy5wcmV2Wj1yLHI9cztuPW99ci5uZXh0Wj1udWxsLGUqPTJ9d2hpbGUodD4xKTtyZXR1cm4gaX1mdW5jdGlvbiBMbyhpLHQsZSxuLHMpe3JldHVybiBpPShpLWUpKnN8MCx0PSh0LW4pKnN8MCxpPShpfGk8PDgpJjE2NzExOTM1LGk9KGl8aTw8NCkmMjUyNjQ1MTM1LGk9KGl8aTw8MikmODU4OTkzNDU5LGk9KGl8aTw8MSkmMTQzMTY1NTc2NSx0PSh0fHQ8PDgpJjE2NzExOTM1LHQ9KHR8dDw8NCkmMjUyNjQ1MTM1LHQ9KHR8dDw8MikmODU4OTkzNDU5LHQ9KHR8dDw8MSkmMTQzMTY1NTc2NSxpfHQ8PDF9ZnVuY3Rpb24gV2YoaSl7bGV0IHQ9aSxlPWk7ZG8odC54PGUueHx8dC54PT09ZS54JiZ0Lnk8ZS55KSYmKGU9dCksdD10Lm5leHQ7d2hpbGUodCE9PWkpO3JldHVybiBlfWZ1bmN0aW9uIFFjKGksdCxlLG4scyxyLG8sYSl7cmV0dXJuKHMtbykqKHQtYSk+PShpLW8pKihyLWEpJiYoaS1vKSoobi1hKT49KGUtbykqKHQtYSkmJihlLW8pKihyLWEpPj0ocy1vKSoobi1hKX1mdW5jdGlvbiBFaShpLHQsZSxuLHMscixvLGEpe3JldHVybiEoaT09PW8mJnQ9PT1hKSYmUWMoaSx0LGUsbixzLHIsbyxhKX1mdW5jdGlvbiBaZihpLHQpe3JldHVybiBpLm5leHQuaSE9PXQuaSYmaS5wcmV2LmkhPT10LmkmJiFKZihpLHQpJiYoUGkoaSx0KSYmUGkodCxpKSYmWWYoaSx0KSYmKHJ0KGkucHJldixpLHQucHJldil8fHJ0KGksdC5wcmV2LHQpKXx8SG4oaSx0KSYmcnQoaS5wcmV2LGksaS5uZXh0KT4wJiZydCh0LnByZXYsdCx0Lm5leHQpPjApfWZ1bmN0aW9uIHJ0KGksdCxlKXtyZXR1cm4odC55LWkueSkqKGUueC10LngpLSh0LngtaS54KSooZS55LXQueSl9ZnVuY3Rpb24gSG4oaSx0KXtyZXR1cm4gaS54PT09dC54JiZpLnk9PT10Lnl9ZnVuY3Rpb24gS2MoaSx0LGUsbil7Y29uc3Qgcz1DcyhydChpLHQsZSkpLHI9Q3MocnQoaSx0LG4pKSxvPUNzKHJ0KGUsbixpKSksYT1DcyhydChlLG4sdCkpO3JldHVybiEhKHMhPT1yJiZvIT09YXx8cz09PTAmJlBzKGksZSx0KXx8cj09PTAmJlBzKGksbix0KXx8bz09PTAmJlBzKGUsaSxuKXx8YT09PTAmJlBzKGUsdCxuKSl9ZnVuY3Rpb24gUHMoaSx0LGUpe3JldHVybiB0Lng8PU1hdGgubWF4KGkueCxlLngpJiZ0Lng+PU1hdGgubWluKGkueCxlLngpJiZ0Lnk8PU1hdGgubWF4KGkueSxlLnkpJiZ0Lnk+PU1hdGgubWluKGkueSxlLnkpfWZ1bmN0aW9uIENzKGkpe3JldHVybiBpPjA/MTppPDA/LTE6MH1mdW5jdGlvbiBKZihpLHQpe2xldCBlPWk7ZG97aWYoZS5pIT09aS5pJiZlLm5leHQuaSE9PWkuaSYmZS5pIT09dC5pJiZlLm5leHQuaSE9PXQuaSYmS2MoZSxlLm5leHQsaSx0KSlyZXR1cm4hMDtlPWUubmV4dH13aGlsZShlIT09aSk7cmV0dXJuITF9ZnVuY3Rpb24gUGkoaSx0KXtyZXR1cm4gcnQoaS5wcmV2LGksaS5uZXh0KTwwP3J0KGksdCxpLm5leHQpPj0wJiZydChpLGkucHJldix0KT49MDpydChpLHQsaS5wcmV2KTwwfHxydChpLGkubmV4dCx0KTwwfWZ1bmN0aW9uIFlmKGksdCl7bGV0IGU9aSxuPSExO2NvbnN0IHM9KGkueCt0LngpLzIscj0oaS55K3QueSkvMjtkbyBlLnk+ciE9ZS5uZXh0Lnk+ciYmZS5uZXh0LnkhPT1lLnkmJnM8KGUubmV4dC54LWUueCkqKHItZS55KS8oZS5uZXh0LnktZS55KStlLngmJihuPSFuKSxlPWUubmV4dDt3aGlsZShlIT09aSk7cmV0dXJuIG59ZnVuY3Rpb24gdGwoaSx0KXtjb25zdCBlPU9vKGkuaSxpLngsaS55KSxuPU9vKHQuaSx0LngsdC55KSxzPWkubmV4dCxyPXQucHJldjtyZXR1cm4gaS5uZXh0PXQsdC5wcmV2PWksZS5uZXh0PXMscy5wcmV2PWUsbi5uZXh0PWUsZS5wcmV2PW4sci5uZXh0PW4sbi5wcmV2PXIsbn1mdW5jdGlvbiBlbChpLHQsZSxuKXtjb25zdCBzPU9vKGksdCxlKTtyZXR1cm4gbj8ocy5uZXh0PW4ubmV4dCxzLnByZXY9bixuLm5leHQucHJldj1zLG4ubmV4dD1zKToocy5wcmV2PXMscy5uZXh0PXMpLHN9ZnVuY3Rpb24gQ2koaSl7aS5uZXh0LnByZXY9aS5wcmV2LGkucHJldi5uZXh0PWkubmV4dCxpLnByZXZaJiYoaS5wcmV2Wi5uZXh0Wj1pLm5leHRaKSxpLm5leHRaJiYoaS5uZXh0Wi5wcmV2Wj1pLnByZXZaKX1mdW5jdGlvbiBPbyhpLHQsZSl7cmV0dXJue2kseDp0LHk6ZSxwcmV2Om51bGwsbmV4dDpudWxsLHo6MCxwcmV2WjpudWxsLG5leHRaOm51bGwsc3RlaW5lcjohMX19ZnVuY3Rpb24gamYoaSx0LGUsbil7bGV0IHM9MDtmb3IobGV0IHI9dCxvPWUtbjtyPGU7cis9bilzKz0oaVtvXS1pW3JdKSooaVtyKzFdK2lbbysxXSksbz1yO3JldHVybiBzfWNsYXNzIFFme3N0YXRpYyB0cmlhbmd1bGF0ZSh0LGUsbj0yKXtyZXR1cm4gTmYodCxlLG4pfX1jbGFzcyBYbntzdGF0aWMgYXJlYSh0KXtjb25zdCBlPXQubGVuZ3RoO2xldCBuPTA7Zm9yKGxldCBzPWUtMSxyPTA7cjxlO3M9cisrKW4rPXRbc10ueCp0W3JdLnktdFtyXS54KnRbc10ueTtyZXR1cm4gbiouNX1zdGF0aWMgaXNDbG9ja1dpc2UodCl7cmV0dXJuIFhuLmFyZWEodCk8MH1zdGF0aWMgdHJpYW5ndWxhdGVTaGFwZSh0LGUpe2NvbnN0IG49W10scz1bXSxyPVtdO25sKHQpLGlsKG4sdCk7bGV0IG89dC5sZW5ndGg7ZS5mb3JFYWNoKG5sKTtmb3IobGV0IGM9MDtjPGUubGVuZ3RoO2MrKylzLnB1c2gobyksbys9ZVtjXS5sZW5ndGgsaWwobixlW2NdKTtjb25zdCBhPVFmLnRyaWFuZ3VsYXRlKG4scyk7Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKz0zKXIucHVzaChhLnNsaWNlKGMsYyszKSk7cmV0dXJuIHJ9fWZ1bmN0aW9uIG5sKGkpe2NvbnN0IHQ9aS5sZW5ndGg7dD4yJiZpW3QtMV0uZXF1YWxzKGlbMF0pJiZpLnBvcCgpfWZ1bmN0aW9uIGlsKGksdCl7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspaS5wdXNoKHRbZV0ueCksaS5wdXNoKHRbZV0ueSl9Y2xhc3MgRG8gZXh0ZW5kcyBnZXtjb25zdHJ1Y3Rvcih0PTEsZT0xLG49MSxzPTEpe3N1cGVyKCksdGhpcy50eXBlPSJQbGFuZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOnQsaGVpZ2h0OmUsd2lkdGhTZWdtZW50czpuLGhlaWdodFNlZ21lbnRzOnN9O2NvbnN0IHI9dC8yLG89ZS8yLGE9TWF0aC5mbG9vcihuKSxjPU1hdGguZmxvb3IocyksbD1hKzEsaD1jKzEsdT10L2EsZj1lL2MsZD1bXSxwPVtdLHk9W10sbT1bXTtmb3IobGV0IGc9MDtnPGg7ZysrKXtjb25zdCBiPWcqZi1vO2ZvcihsZXQgdz0wO3c8bDt3Kyspe2NvbnN0IHg9dyp1LXI7cC5wdXNoKHgsLWIsMCkseS5wdXNoKDAsMCwxKSxtLnB1c2gody9hKSxtLnB1c2goMS1nL2MpfX1mb3IobGV0IGc9MDtnPGM7ZysrKWZvcihsZXQgYj0wO2I8YTtiKyspe2NvbnN0IHc9YitsKmcseD1iK2wqKGcrMSksTT1iKzErbCooZysxKSxBPWIrMStsKmc7ZC5wdXNoKHcseCxBKSxkLnB1c2goeCxNLEEpfXRoaXMuc2V0SW5kZXgoZCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgQmUocCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IEJlKHksMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IEJlKG0sMikpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IERvKHQud2lkdGgsdC5oZWlnaHQsdC53aWR0aFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMpfX1jb25zdCBzbD1uZXcgVCxCcz1uZXcgVCxHbj1uZXcgVCxXbj1uZXcgVCwkbz1uZXcgVCxLZj1uZXcgVCx0ZD1uZXcgVDtjbGFzcyBqdHtjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQpe3RoaXMuc3RhcnQ9dCx0aGlzLmVuZD1lfXNldCh0LGUpe3JldHVybiB0aGlzLnN0YXJ0LmNvcHkodCksdGhpcy5lbmQuY29weShlKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMuc3RhcnQuY29weSh0LnN0YXJ0KSx0aGlzLmVuZC5jb3B5KHQuZW5kKSx0aGlzfWdldENlbnRlcih0KXtyZXR1cm4gdC5hZGRWZWN0b3JzKHRoaXMuc3RhcnQsdGhpcy5lbmQpLm11bHRpcGx5U2NhbGFyKC41KX1kZWx0YSh0KXtyZXR1cm4gdC5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpfWRpc3RhbmNlU3EoKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmVuZCl9ZGlzdGFuY2UoKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKHRoaXMuZW5kKX1hdCh0LGUpe3JldHVybiB0aGlzLmRlbHRhKGUpLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnN0YXJ0KX1jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKHQsZSl7c2wuc3ViVmVjdG9ycyh0LHRoaXMuc3RhcnQpLEJzLnN1YlZlY3RvcnModGhpcy5lbmQsdGhpcy5zdGFydCk7Y29uc3Qgbj1Ccy5kb3QoQnMpO2xldCByPUJzLmRvdChzbCkvbjtyZXR1cm4gZSYmKHI9RyhyLDAsMSkpLHJ9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUsbil7Y29uc3Qgcz10aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIodCxlKTtyZXR1cm4gdGhpcy5kZWx0YShuKS5tdWx0aXBseVNjYWxhcihzKS5hZGQodGhpcy5zdGFydCl9ZGlzdGFuY2VTcVRvTGluZTModCxlPUtmLG49dGQpe2NvbnN0IHM9MTAwMDAwMDAwMDAwMDAwMDFlLTMyO2xldCByLG87Y29uc3QgYT10aGlzLnN0YXJ0LGM9dC5zdGFydCxsPXRoaXMuZW5kLGg9dC5lbmQ7R24uc3ViVmVjdG9ycyhsLGEpLFduLnN1YlZlY3RvcnMoaCxjKSwkby5zdWJWZWN0b3JzKGEsYyk7Y29uc3QgdT1Hbi5kb3QoR24pLGY9V24uZG90KFduKSxkPVduLmRvdCgkbyk7aWYodTw9cyYmZjw9cylyZXR1cm4gZS5jb3B5KGEpLG4uY29weShjKSxlLnN1YihuKSxlLmRvdChlKTtpZih1PD1zKXI9MCxvPWQvZixvPUcobywwLDEpO2Vsc2V7Y29uc3QgcD1Hbi5kb3QoJG8pO2lmKGY8PXMpbz0wLHI9RygtcC91LDAsMSk7ZWxzZXtjb25zdCB5PUduLmRvdChXbiksbT11KmYteSp5O20hPT0wP3I9RygoeSpkLXAqZikvbSwwLDEpOnI9MCxvPSh5KnIrZCkvZixvPDA/KG89MCxyPUcoLXAvdSwwLDEpKTpvPjEmJihvPTEscj1HKCh5LXApL3UsMCwxKSl9fXJldHVybiBlLmNvcHkoYSkuYWRkKEduLm11bHRpcGx5U2NhbGFyKHIpKSxuLmNvcHkoYykuYWRkKFduLm11bHRpcGx5U2NhbGFyKG8pKSxlLnN1YihuKSxlLmRvdChlKX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuZW5kLmFwcGx5TWF0cml4NCh0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5zdGFydC5lcXVhbHModGhpcy5zdGFydCkmJnQuZW5kLmVxdWFscyh0aGlzLmVuZCl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX10eXBlb2YgX19USFJFRV9ERVZUT09MU19fIT0idW5kZWZpbmVkIiYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJyZWdpc3RlciIse2RldGFpbDp7cmV2aXNpb246Sn19KSksdHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJih3aW5kb3cuX19USFJFRV9fP2NvbnNvbGUud2FybigiV0FSTklORzogTXVsdGlwbGUgaW5zdGFuY2VzIG9mIFRocmVlLmpzIGJlaW5nIGltcG9ydGVkLiIpOndpbmRvdy5fX1RIUkVFX189Sik7Y29uc3QgcG49bmV3IE1hcCxlZD0oaT17fSk9Pih7Z2VuZXJhdGVUb3BVVih0LGUsbixzLHIpe2NvbnN0IG89ZVtuKjNdLGE9ZVtuKjMrMV0sYz1lW3MqM10sbD1lW3MqMysxXSxoPWVbciozXSx1PWVbciozKzFdO2xldCBmO2lmKHBuLmhhcyh0KSlmPXBuLmdldCh0KTtlbHNle2xldCBtPWkuYm94MztpZighbSl7bT1uZXcgbXQ7Y29uc3Qgdz10LnBhcmFtZXRlcnMuc2hhcGVzLmdldFBvaW50cygpLm1hcCh4PT5beC54LHgueSwwXSkuZmxhdCgpO20uc2V0RnJvbUFycmF5KHcpfWNvbnN0IGc9bS5nZXRTaXplKG5ldyBUKTtpLnNwbGl0JiYoZy55Lz1pLnNwbGl0KSxmPXtib3g6bSxzaXplOmd9LHBuLnNldCh0LGYpfWNvbnN0e2JveDpkLHNpemU6cH09Zix5PWkuc3BsaXQ/MS1pLnNwbGl0OjA7cmV0dXJuW25ldyBOKChvLWQubWluLngpL3AueCwoYS1kLm1pbi55KS9wLnkreSksbmV3IE4oKGMtZC5taW4ueCkvcC54LChsLWQubWluLnkpL3AueSt5KSxuZXcgTigoaC1kLm1pbi54KS9wLngsKHUtZC5taW4ueSkvcC55K3kpXX0sZ2VuZXJhdGVTaWRlV2FsbFVWKHQsZSxuLHMscixvKXtjb25zdCBhPWVbbiozXSxjPWVbbiozKzFdLGw9ZVtuKjMrMl0saD1lW3MqM10sdT1lW3MqMysxXSxmPWVbcyozKzJdLGQ9ZVtyKjNdLHA9ZVtyKjMrMV0seT1lW3IqMysyXSxtPWVbbyozXSxnPWVbbyozKzFdLGI9ZVtvKjMrMl07bGV0IHc7aWYocG4uaGFzKGUpKXc9cG4uZ2V0KGUpO2Vsc2V7Y29uc3QgQT1uZXcgbXQ7QS5zZXRGcm9tQXJyYXkoZSk7Y29uc3QgUz1BLmdldFNpemUobmV3IFQpO2kuc3BsaXQmJihTLnovPTEtaS5zcGxpdCksaS5zaWRlUmVwZWF0JiYoUy56Lz1pLnNpZGVSZXBlYXQpLHc9e2JveDpBLHNpemU6U30scG4uc2V0KGUsdyl9Y29uc3R7Ym94Ongsc2l6ZTpNfT13O3JldHVybiBNYXRoLmFicyhjLXUpPE1hdGguYWJzKGEtaCk/W25ldyBOKChhLXgubWluLngpL00ueCwobC14Lm1pbi56KS9NLnopLG5ldyBOKChoLXgubWluLngpL00ueCwoZi14Lm1pbi56KS9NLnopLG5ldyBOKChkLXgubWluLngpL00ueCwoeS14Lm1pbi56KS9NLnopLG5ldyBOKChtLXgubWluLngpL00ueCwoYi14Lm1pbi56KS9NLnopXTpbbmV3IE4oKGMteC5taW4ueSkvTS55LChsLXgubWluLnopL00ueiksbmV3IE4oKHUteC5taW4ueSkvTS55LChmLXgubWluLnopL00ueiksbmV3IE4oKHAteC5taW4ueSkvTS55LCh5LXgubWluLnopL00ueiksbmV3IE4oKGcteC5taW4ueSkvTS55LChiLXgubWluLnopL00ueildfX0pLG5kPSgpPT57cG4uY2xlYXIoKX0saWQ9e0FyY0N1cnZlOlVjLENhdG11bGxSb21DdXJ2ZTM6cWMsQ3ViaWNCZXppZXJDdXJ2ZTpJbyxDdWJpY0JlemllckN1cnZlMzpYYyxFbGxpcHNlQ3VydmU6VHMsTGluZUN1cnZlOmtvLExpbmVDdXJ2ZTM6R2MsUXVhZHJhdGljQmV6aWVyQ3VydmU6Tm8sUXVhZHJhdGljQmV6aWVyQ3VydmUzOldjLFNwbGluZUN1cnZlOlJvfTtjbGFzcyBabiBleHRlbmRzIGdle2NvbnN0cnVjdG9yKHQ9bmV3IFljKFtuZXcgTiguNSwuNSksbmV3IE4oLS41LC41KSxuZXcgTigtLjUsLS41KSxuZXcgTiguNSwtLjUpXSksZT17fSl7c3VwZXIoKSx0aGlzLnR5cGU9IkV4dHJ1ZGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6dCxvcHRpb25zOmV9LHQ9QXJyYXkuaXNBcnJheSh0KT90Olt0XTtjb25zdCBuPXRoaXMscz1bXSxyPVtdO2ZvcihsZXQgYT0wLGM9dC5sZW5ndGg7YTxjO2ErKyl7Y29uc3QgbD10W2FdO28obCl9dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgQmUocywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgQmUociwyKSksdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO2Z1bmN0aW9uIG8oYSl7dmFyIFZ1LFV1LHF1O2NvbnN0IGM9W10sbD1lLmN1cnZlU2VnbWVudHMhPT12b2lkIDA/ZS5jdXJ2ZVNlZ21lbnRzOjEyLGg9ZS5zdGVwcyE9PXZvaWQgMD9lLnN0ZXBzOjEsdT1lLmRlcHRoIT09dm9pZCAwP2UuZGVwdGg6MTtsZXQgZj1lLmJldmVsRW5hYmxlZCE9PXZvaWQgMD9lLmJldmVsRW5hYmxlZDohMCxkPWUuYmV2ZWxUaGlja25lc3MhPT12b2lkIDA/ZS5iZXZlbFRoaWNrbmVzczouMixwPWUuYmV2ZWxTaXplIT09dm9pZCAwP2UuYmV2ZWxTaXplOmQtLjEseT1lLmJldmVsT2Zmc2V0IT09dm9pZCAwP2UuYmV2ZWxPZmZzZXQ6MCxtPWUuYmV2ZWxTZWdtZW50cyE9PXZvaWQgMD9lLmJldmVsU2VnbWVudHM6Mztjb25zdCBnPWUuZXh0cnVkZVBhdGgsYj1lLlVWR2VuZXJhdG9yIT09dm9pZCAwP2UuVVZHZW5lcmF0b3I6c2Qsdz0oVnU9ZS5oYXNUb3ApIT1udWxsP1Z1OiEwLHg9KFV1PWUuaGFzQm90dG9tKSE9bnVsbD9VdTohMCxNPShxdT1lLmhhc1NpZGUpIT1udWxsP3F1OiEwO2xldCBBLFM9ITEsdixfLEUsejtnJiYoQT1nLmdldFNwYWNlZFBvaW50cyhoKSxTPSEwLGY9ITEsdj1nLmNvbXB1dGVGcmVuZXRGcmFtZXMoaCwhMSksXz1uZXcgVCxFPW5ldyBULHo9bmV3IFQpLGZ8fChtPTAsZD0wLHA9MCx5PTApO2NvbnN0IEM9YS5leHRyYWN0UG9pbnRzKGwpO2xldCBQPUMuc2hhcGU7Y29uc3QgRj1DLmhvbGVzO2lmKCFYbi5pc0Nsb2NrV2lzZShQKSl7UD1QLnJldmVyc2UoKTtmb3IobGV0IGs9MCxMPUYubGVuZ3RoO2s8TDtrKyspe2NvbnN0IE89RltrXTtYbi5pc0Nsb2NrV2lzZShPKSYmKEZba109Ty5yZXZlcnNlKCkpfX1mdW5jdGlvbiBJKGspe2NvbnN0IE89MTAwMDAwMDAwMDAwMDAwMDFlLTM2O2xldCBVPWtbMF07Zm9yKGxldCBEPTE7RDw9ay5sZW5ndGg7RCsrKXtjb25zdCBZPUQlay5sZW5ndGgsVz1rW1ldLGl0PVcueC1VLngsY3Q9Vy55LVUueSx3dD1pdCppdCtjdCpjdCxXdD1NYXRoLm1heChNYXRoLmFicyhXLngpLE1hdGguYWJzKFcueSksTWF0aC5hYnMoVS54KSxNYXRoLmFicyhVLnkpKSxDbj1PKld0Kld0O2lmKHd0PD1Dbil7ay5zcGxpY2UoWSwxKSxELS07Y29udGludWV9VT1XfX1JKFApLEYuZm9yRWFjaChJKTtjb25zdCBSPUYubGVuZ3RoLCQ9UDtmb3IobGV0IGs9MDtrPFI7aysrKXtjb25zdCBMPUZba107UD1QLmNvbmNhdChMKX1mdW5jdGlvbiBWKGssTCxPKXtyZXR1cm4gTHx8Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiB2ZWMgZG9lcyBub3QgZXhpc3QiKSxrLmNsb25lKCkuYWRkU2NhbGVkVmVjdG9yKEwsTyl9Y29uc3QgbnQ9UC5sZW5ndGg7ZnVuY3Rpb24geHQoayxMLE8pe2xldCBVLEQsWTtjb25zdCBXPWsueC1MLngsaXQ9ay55LUwueSxjdD1PLngtay54LHd0PU8ueS1rLnksV3Q9VypXK2l0Kml0LENuPVcqd3QtaXQqY3Q7aWYoTWF0aC5hYnMoQ24pPk51bWJlci5FUFNJTE9OKXtjb25zdCBadD1NYXRoLnNxcnQoV3QpLEh1PU1hdGguc3FydChjdCpjdCt3dCp3dCksWHU9TC54LWl0L1p0LEd1PUwueStXL1p0LElnPU8ueC13dC9IdSxrZz1PLnkrY3QvSHUsV3U9KChJZy1YdSkqd3QtKGtnLUd1KSpjdCkvKFcqd3QtaXQqY3QpO1U9WHUrVypXdS1rLngsRD1HdStpdCpXdS1rLnk7Y29uc3QgWnU9VSpVK0QqRDtpZihadTw9MilyZXR1cm4gbmV3IE4oVSxEKTtZPU1hdGguc3FydChadS8yKX1lbHNle2xldCBadD0hMTtXPk51bWJlci5FUFNJTE9OP2N0Pk51bWJlci5FUFNJTE9OJiYoWnQ9ITApOlc8LU51bWJlci5FUFNJTE9OP2N0PC1OdW1iZXIuRVBTSUxPTiYmKFp0PSEwKTpNYXRoLnNpZ24oaXQpPT09TWF0aC5zaWduKHd0KSYmKFp0PSEwKSxadD8oVT0taXQsRD1XLFk9TWF0aC5zcXJ0KFd0KSk6KFU9VyxEPWl0LFk9TWF0aC5zcXJ0KFd0LzIpKX1yZXR1cm4gbmV3IE4oVS9ZLEQvWSl9Y29uc3QgcmU9W107Zm9yKGxldCBrPTAsTD0kLmxlbmd0aCxPPUwtMSxVPWsrMTtrPEw7aysrLE8rKyxVKyspTz09PUwmJihPPTApLFU9PT1MJiYoVT0wKSxyZVtrXT14dCgkW2tdLCRbT10sJFtVXSk7Y29uc3QgWHQ9W107bGV0IEd0LHllPXJlLmNvbmNhdCgpO2ZvcihsZXQgaz0wLEw9UjtrPEw7aysrKXtjb25zdCBPPUZba107R3Q9W107Zm9yKGxldCBVPTAsRD1PLmxlbmd0aCxZPUQtMSxXPVUrMTtVPEQ7VSsrLFkrKyxXKyspWT09PUQmJihZPTApLFc9PT1EJiYoVz0wKSxHdFtVXT14dChPW1VdLE9bWV0sT1tXXSk7WHQucHVzaChHdCkseWU9eWUuY29uY2F0KEd0KX1sZXQgUG47aWYobT09PTApUG49WG4udHJpYW5ndWxhdGVTaGFwZSgkLEYpO2Vsc2V7Y29uc3Qgaz1bXSxMPVtdO2ZvcihsZXQgTz0wO088bTtPKyspe2NvbnN0IFU9Ty9tLEQ9ZCpNYXRoLmNvcyhVKk1hdGguUEkvMiksWT1wKk1hdGguc2luKFUqTWF0aC5QSS8yKSt5O2ZvcihsZXQgVz0wLGl0PSQubGVuZ3RoO1c8aXQ7VysrKXtjb25zdCBjdD1WKCRbV10scmVbV10sWSk7SGUoY3QueCxjdC55LC1EKSxVPT09MCYmay5wdXNoKGN0KX1mb3IobGV0IFc9MCxpdD1SO1c8aXQ7VysrKXtjb25zdCBjdD1GW1ddO0d0PVh0W1ddO2NvbnN0IHd0PVtdO2ZvcihsZXQgV3Q9MCxDbj1jdC5sZW5ndGg7V3Q8Q247V3QrKyl7Y29uc3QgWnQ9VihjdFtXdF0sR3RbV3RdLFkpO0hlKFp0LngsWnQueSwtRCksVT09PTAmJnd0LnB1c2goWnQpfVU9PT0wJiZMLnB1c2god3QpfX1Qbj1Ybi50cmlhbmd1bGF0ZVNoYXBlKGssTCl9Y29uc3QgUXI9UG4ubGVuZ3RoLER1PXAreTtmb3IobGV0IGs9MDtrPG50O2srKyl7Y29uc3QgTD1mP1YoUFtrXSx5ZVtrXSxEdSk6UFtrXTtTPyhFLmNvcHkodi5ub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihMLngpLF8uY29weSh2LmJpbm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIoTC55KSx6LmNvcHkoQVswXSkuYWRkKEUpLmFkZChfKSxIZSh6Lngsei55LHoueikpOkhlKEwueCxMLnksMCl9Zm9yKGxldCBrPTE7azw9aDtrKyspZm9yKGxldCBMPTA7TDxudDtMKyspe2NvbnN0IE89Zj9WKFBbTF0seWVbTF0sRHUpOlBbTF07Uz8oRS5jb3B5KHYubm9ybWFsc1trXSkubXVsdGlwbHlTY2FsYXIoTy54KSxfLmNvcHkodi5iaW5vcm1hbHNba10pLm11bHRpcGx5U2NhbGFyKE8ueSksei5jb3B5KEFba10pLmFkZChFKS5hZGQoXyksSGUoei54LHoueSx6LnopKTpIZShPLngsTy55LHUvaCprKX1mb3IobGV0IGs9bS0xO2s+PTA7ay0tKXtjb25zdCBMPWsvbSxPPWQqTWF0aC5jb3MoTCpNYXRoLlBJLzIpLFU9cCpNYXRoLnNpbihMKk1hdGguUEkvMikreTtmb3IobGV0IEQ9MCxZPSQubGVuZ3RoO0Q8WTtEKyspe2NvbnN0IFc9VigkW0RdLHJlW0RdLFUpO0hlKFcueCxXLnksdStPKX1mb3IobGV0IEQ9MCxZPUYubGVuZ3RoO0Q8WTtEKyspe2NvbnN0IFc9RltEXTtHdD1YdFtEXTtmb3IobGV0IGl0PTAsY3Q9Vy5sZW5ndGg7aXQ8Y3Q7aXQrKyl7Y29uc3Qgd3Q9VihXW2l0XSxHdFtpdF0sVSk7Uz9IZSh3dC54LHd0LnkrQVtoLTFdLnksQVtoLTFdLngrTyk6SGUod3QueCx3dC55LHUrTyl9fX1DZygpLE0mJkJnKCk7ZnVuY3Rpb24gQ2coKXtjb25zdCBrPXMubGVuZ3RoLzM7aWYoZil7bGV0IEw9MCxPPW50Kkw7aWYoeClmb3IobGV0IFU9MDtVPFFyO1UrKyl7Y29uc3QgRD1QbltVXTtLcihEWzJdK08sRFsxXStPLERbMF0rTyl9aWYoTD1oK20qMixPPW50Kkwsdylmb3IobGV0IFU9MDtVPFFyO1UrKyl7Y29uc3QgRD1QbltVXTtLcihEWzBdK08sRFsxXStPLERbMl0rTyl9fWVsc2V7aWYoeClmb3IobGV0IEw9MDtMPFFyO0wrKyl7Y29uc3QgTz1QbltMXTtLcihPWzJdLE9bMV0sT1swXSl9aWYodylmb3IobGV0IEw9MDtMPFFyO0wrKyl7Y29uc3QgTz1QbltMXTtLcihPWzBdK250KmgsT1sxXStudCpoLE9bMl0rbnQqaCl9fW4uYWRkR3JvdXAoayxzLmxlbmd0aC8zLWssMCl9ZnVuY3Rpb24gQmcoKXtjb25zdCBrPXMubGVuZ3RoLzM7bGV0IEw9MDskdSgkLEwpLEwrPSQubGVuZ3RoO2ZvcihsZXQgTz0wLFU9Ri5sZW5ndGg7TzxVO08rKyl7Y29uc3QgRD1GW09dOyR1KEQsTCksTCs9RC5sZW5ndGh9bi5hZGRHcm91cChrLHMubGVuZ3RoLzMtaywxKX1mdW5jdGlvbiAkdShrLEwpe2xldCBPPWsubGVuZ3RoO2Zvcig7LS1PPj0wOyl7Y29uc3QgVT1PO2xldCBEPU8tMTtEPDAmJihEPWsubGVuZ3RoLTEpO2ZvcihsZXQgWT0wLFc9aCttKjI7WTxXO1krKyl7Y29uc3QgaXQ9bnQqWSxjdD1udCooWSsxKSx3dD1MK1UraXQsV3Q9TCtEK2l0LENuPUwrRCtjdCxadD1MK1UrY3Q7Rmcod3QsV3QsQ24sWnQpfX19ZnVuY3Rpb24gSGUoayxMLE8pe2MucHVzaChrKSxjLnB1c2goTCksYy5wdXNoKE8pfWZ1bmN0aW9uIEtyKGssTCxPKXtYZShrKSxYZShMKSxYZShPKTtjb25zdCBVPXMubGVuZ3RoLzMsRD1iLmdlbmVyYXRlVG9wVVYobixzLFUtMyxVLTIsVS0xKTtHZShEWzBdKSxHZShEWzFdKSxHZShEWzJdKX1mdW5jdGlvbiBGZyhrLEwsTyxVKXtYZShrKSxYZShMKSxYZShVKSxYZShMKSxYZShPKSxYZShVKTtjb25zdCBEPXMubGVuZ3RoLzMsWT1iLmdlbmVyYXRlU2lkZVdhbGxVVihuLHMsRC02LEQtMyxELTIsRC0xKTtHZShZWzBdKSxHZShZWzFdKSxHZShZWzNdKSxHZShZWzFdKSxHZShZWzJdKSxHZShZWzNdKX1mdW5jdGlvbiBYZShrKXtzLnB1c2goY1trKjMrMF0pLHMucHVzaChjW2sqMysxXSkscy5wdXNoKGNbayozKzJdKX1mdW5jdGlvbiBHZShrKXtyLnB1c2goay54KSxyLnB1c2goay55KX19fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCksZT10aGlzLnBhcmFtZXRlcnMuc2hhcGVzLG49dGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnM7cmV0dXJuIHJkKGUsbix0KX1zdGF0aWMgZnJvbUpTT04odCxlKXtjb25zdCBuPVtdO2ZvcihsZXQgcj0wLG89dC5zaGFwZXMubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9ZVt0LnNoYXBlc1tyXV07bi5wdXNoKGEpfWNvbnN0IHM9dC5vcHRpb25zLmV4dHJ1ZGVQYXRoO3JldHVybiBzIT09dm9pZCAwJiYodC5vcHRpb25zLmV4dHJ1ZGVQYXRoPW5ldyBpZFtgJHtzLnR5cGV9YF0oKS5mcm9tSlNPTihzKSksbmV3IFpuKG4sdC5vcHRpb25zKX19Y29uc3Qgc2Q9e2dlbmVyYXRlVG9wVVY6ZnVuY3Rpb24oaSx0LGUsbixzKXtjb25zdCByPXRbZSozXSxvPXRbZSozKzFdLGE9dFtuKjNdLGM9dFtuKjMrMV0sbD10W3MqM10saD10W3MqMysxXTtyZXR1cm5bbmV3IE4ocixvKSxuZXcgTihhLGMpLG5ldyBOKGwsaCldfSxnZW5lcmF0ZVNpZGVXYWxsVVY6ZnVuY3Rpb24oaSx0LGUsbixzLHIpe2NvbnN0IG89dFtlKjNdLGE9dFtlKjMrMV0sYz10W2UqMysyXSxsPXRbbiozXSxoPXRbbiozKzFdLHU9dFtuKjMrMl0sZj10W3MqM10sZD10W3MqMysxXSxwPXRbcyozKzJdLHk9dFtyKjNdLG09dFtyKjMrMV0sZz10W3IqMysyXTtyZXR1cm4gTWF0aC5hYnMoYS1oKTxNYXRoLmFicyhvLWwpP1tuZXcgTihvLDEtYyksbmV3IE4obCwxLXUpLG5ldyBOKGYsMS1wKSxuZXcgTih5LDEtZyldOltuZXcgTihhLDEtYyksbmV3IE4oaCwxLXUpLG5ldyBOKGQsMS1wKSxuZXcgTihtLDEtZyldfX07ZnVuY3Rpb24gcmQoaSx0LGUpe2lmKGUuc2hhcGVzPVtdLEFycmF5LmlzQXJyYXkoaSkpZm9yKGxldCBuPTAscz1pLmxlbmd0aDtuPHM7bisrKXtjb25zdCByPWlbbl07ZS5zaGFwZXMucHVzaChyLnV1aWQpfWVsc2UgZS5zaGFwZXMucHVzaChpLnV1aWQpO3JldHVybiBlLm9wdGlvbnM9T2JqZWN0LmFzc2lnbih7fSx0KSx0LmV4dHJ1ZGVQYXRoIT09dm9pZCAwJiYoZS5vcHRpb25zLmV4dHJ1ZGVQYXRoPXQuZXh0cnVkZVBhdGgudG9KU09OKCkpLGV9Y29uc3Qgcmw9MCxvZD0xLGFkPTIsb2w9MixWbz0xLjI1LGFsPTEsQmk9Nio0KzQrNCxGcz02NTUzNSxjZD1NYXRoLnBvdygyLC0yNCksVW89U3ltYm9sKCJTS0lQX0dFTkVSQVRJT04iKTtmdW5jdGlvbiBsZChpKXtyZXR1cm4gaS5pbmRleD9pLmluZGV4LmNvdW50OmkuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudH1mdW5jdGlvbiBKbihpKXtyZXR1cm4gbGQoaSkvM31mdW5jdGlvbiBoZChpLHQ9QXJyYXlCdWZmZXIpe3JldHVybiBpPjY1NTM1P25ldyBVaW50MzJBcnJheShuZXcgdCg0KmkpKTpuZXcgVWludDE2QXJyYXkobmV3IHQoMippKSl9ZnVuY3Rpb24gdWQoaSx0KXtpZighaS5pbmRleCl7Y29uc3QgZT1pLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQsbj10LnVzZVNoYXJlZEFycmF5QnVmZmVyP1NoYXJlZEFycmF5QnVmZmVyOkFycmF5QnVmZmVyLHM9aGQoZSxuKTtpLnNldEluZGV4KG5ldyBndChzLDEpKTtmb3IobGV0IHI9MDtyPGU7cisrKXNbcl09cn19ZnVuY3Rpb24gY2woaSx0KXtjb25zdCBlPUpuKGkpLG49dHx8aS5kcmF3UmFuZ2Uscz1uLnN0YXJ0LzMscj0obi5zdGFydCtuLmNvdW50KS8zLG89TWF0aC5tYXgoMCxzKSxhPU1hdGgubWluKGUsciktbztyZXR1cm5be29mZnNldDpNYXRoLmZsb29yKG8pLGNvdW50Ok1hdGguZmxvb3IoYSl9XX1mdW5jdGlvbiBsbChpLHQpe2lmKCFpLmdyb3Vwc3x8IWkuZ3JvdXBzLmxlbmd0aClyZXR1cm4gY2woaSx0KTtjb25zdCBlPVtdLG49bmV3IFNldCxzPXR8fGkuZHJhd1JhbmdlLHI9cy5zdGFydC8zLG89KHMuc3RhcnQrcy5jb3VudCkvMztmb3IoY29uc3QgYyBvZiBpLmdyb3Vwcyl7Y29uc3QgbD1jLnN0YXJ0LzMsaD0oYy5zdGFydCtjLmNvdW50KS8zO24uYWRkKE1hdGgubWF4KHIsbCkpLG4uYWRkKE1hdGgubWluKG8saCkpfWNvbnN0IGE9QXJyYXkuZnJvbShuLnZhbHVlcygpKS5zb3J0KChjLGwpPT5jLWwpO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGgtMTtjKyspe2NvbnN0IGw9YVtjXSxoPWFbYysxXTtlLnB1c2goe29mZnNldDpNYXRoLmZsb29yKGwpLGNvdW50Ok1hdGguZmxvb3IoaC1sKX0pfXJldHVybiBlfWZ1bmN0aW9uIGZkKGksdCl7Y29uc3QgZT1KbihpKSxuPWxsKGksdCkuc29ydCgobyxhKT0+by5vZmZzZXQtYS5vZmZzZXQpLHM9bltuLmxlbmd0aC0xXTtzLmNvdW50PU1hdGgubWluKGUtcy5vZmZzZXQscy5jb3VudCk7bGV0IHI9MDtyZXR1cm4gbi5mb3JFYWNoKCh7Y291bnQ6b30pPT5yKz1vKSxlIT09cn1mdW5jdGlvbiBxbyhpLHQsZSxuLHMpe2xldCByPTEvMCxvPTEvMCxhPTEvMCxjPS0xLzAsbD0tMS8wLGg9LTEvMCx1PTEvMCxmPTEvMCxkPTEvMCxwPS0xLzAseT0tMS8wLG09LTEvMDtmb3IobGV0IGc9dCo2LGI9KHQrZSkqNjtnPGI7Zys9Nil7Y29uc3Qgdz1pW2crMF0seD1pW2crMV0sTT13LXgsQT13K3g7TTxyJiYocj1NKSxBPmMmJihjPUEpLHc8dSYmKHU9dyksdz5wJiYocD13KTtjb25zdCBTPWlbZysyXSx2PWlbZyszXSxfPVMtdixFPVMrdjtfPG8mJihvPV8pLEU+bCYmKGw9RSksUzxmJiYoZj1TKSxTPnkmJih5PVMpO2NvbnN0IHo9aVtnKzRdLEM9aVtnKzVdLFA9ei1DLEY9eitDO1A8YSYmKGE9UCksRj5oJiYoaD1GKSx6PGQmJihkPXopLHo+bSYmKG09eil9blswXT1yLG5bMV09byxuWzJdPWEsblszXT1jLG5bNF09bCxuWzVdPWgsc1swXT11LHNbMV09ZixzWzJdPWQsc1szXT1wLHNbNF09eSxzWzVdPW19ZnVuY3Rpb24gZGQoaSx0PW51bGwsZT1udWxsLG49bnVsbCl7Y29uc3Qgcz1pLmF0dHJpYnV0ZXMucG9zaXRpb24scj1pLmluZGV4P2kuaW5kZXguYXJyYXk6bnVsbCxvPUpuKGkpLGE9cy5ub3JtYWxpemVkO2xldCBjO3Q9PT1udWxsPyhjPW5ldyBGbG9hdDMyQXJyYXkobyo2KSxlPTAsbj1vKTooYz10LGU9ZXx8MCxuPW58fG8pO2NvbnN0IGw9cy5hcnJheSxoPXMub2Zmc2V0fHwwO2xldCB1PTM7cy5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYodT1zLmRhdGEuc3RyaWRlKTtjb25zdCBmPVsiZ2V0WCIsImdldFkiLCJnZXRaIl07Zm9yKGxldCBkPWU7ZDxlK247ZCsrKXtjb25zdCBwPWQqMyx5PWQqNjtsZXQgbT1wKzAsZz1wKzEsYj1wKzI7ciYmKG09clttXSxnPXJbZ10sYj1yW2JdKSxhfHwobT1tKnUraCxnPWcqdStoLGI9Yip1K2gpO2ZvcihsZXQgdz0wO3c8Mzt3Kyspe2xldCB4LE0sQTthPyh4PXNbZlt3XV0obSksTT1zW2Zbd11dKGcpLEE9c1tmW3ddXShiKSk6KHg9bFttK3ddLE09bFtnK3ddLEE9bFtiK3ddKTtsZXQgUz14O008UyYmKFM9TSksQTxTJiYoUz1BKTtsZXQgdj14O00+diYmKHY9TSksQT52JiYodj1BKTtjb25zdCBfPSh2LVMpLzIsRT13KjI7Y1t5K0UrMF09UytfLGNbeStFKzFdPV8rKE1hdGguYWJzKFMpK18pKmNkfX1yZXR1cm4gY31mdW5jdGlvbiBsdChpLHQsZSl7cmV0dXJuIGUubWluLng9dFtpXSxlLm1pbi55PXRbaSsxXSxlLm1pbi56PXRbaSsyXSxlLm1heC54PXRbaSszXSxlLm1heC55PXRbaSs0XSxlLm1heC56PXRbaSs1XSxlfWZ1bmN0aW9uIGhsKGkpe2xldCB0PS0xLGU9LTEvMDtmb3IobGV0IG49MDtuPDM7bisrKXtjb25zdCBzPWlbbiszXS1pW25dO3M+ZSYmKGU9cyx0PW4pfXJldHVybiB0fWZ1bmN0aW9uIHVsKGksdCl7dC5zZXQoaSl9ZnVuY3Rpb24gZmwoaSx0LGUpe2xldCBuLHM7Zm9yKGxldCByPTA7cjwzO3IrKyl7Y29uc3Qgbz1yKzM7bj1pW3JdLHM9dFtyXSxlW3JdPW48cz9uOnMsbj1pW29dLHM9dFtvXSxlW29dPW4+cz9uOnN9fWZ1bmN0aW9uIElzKGksdCxlKXtmb3IobGV0IG49MDtuPDM7bisrKXtjb25zdCBzPXRbaSsyKm5dLHI9dFtpKzIqbisxXSxvPXMtcixhPXMrcjtvPGVbbl0mJihlW25dPW8pLGE+ZVtuKzNdJiYoZVtuKzNdPWEpfX1mdW5jdGlvbiBGaShpKXtjb25zdCB0PWlbM10taVswXSxlPWlbNF0taVsxXSxuPWlbNV0taVsyXTtyZXR1cm4gMioodCplK2UqbituKnQpfWNvbnN0IEZlPTMyLHBkPShpLHQpPT5pLmNhbmRpZGF0ZS10LmNhbmRpZGF0ZSxLZT1uZXcgQXJyYXkoRmUpLmZpbGwoKS5tYXAoKCk9Pih7Y291bnQ6MCxib3VuZHM6bmV3IEZsb2F0MzJBcnJheSg2KSxyaWdodENhY2hlQm91bmRzOm5ldyBGbG9hdDMyQXJyYXkoNiksbGVmdENhY2hlQm91bmRzOm5ldyBGbG9hdDMyQXJyYXkoNiksY2FuZGlkYXRlOjB9KSksa3M9bmV3IEZsb2F0MzJBcnJheSg2KTtmdW5jdGlvbiB5ZChpLHQsZSxuLHMscil7bGV0IG89LTEsYT0wO2lmKHI9PT1ybClvPWhsKHQpLG8hPT0tMSYmKGE9KHRbb10rdFtvKzNdKS8yKTtlbHNlIGlmKHI9PT1vZClvPWhsKGkpLG8hPT0tMSYmKGE9bWQoZSxuLHMsbykpO2Vsc2UgaWYocj09PWFkKXtjb25zdCBjPUZpKGkpO2xldCBsPVZvKnM7Y29uc3QgaD1uKjYsdT0obitzKSo2O2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9dFtmXSxtPSh0W2YrM10tZCkvRmU7aWYoczxGZS80KXtjb25zdCBnPVsuLi5LZV07Zy5sZW5ndGg9cztsZXQgYj0wO2ZvcihsZXQgeD1oO3g8dTt4Kz02LGIrKyl7Y29uc3QgTT1nW2JdO00uY2FuZGlkYXRlPWVbeCsyKmZdLE0uY291bnQ9MDtjb25zdHtib3VuZHM6QSxsZWZ0Q2FjaGVCb3VuZHM6UyxyaWdodENhY2hlQm91bmRzOnZ9PU07Zm9yKGxldCBfPTA7XzwzO18rKyl2W19dPTEvMCx2W18rM109LTEvMCxTW19dPTEvMCxTW18rM109LTEvMCxBW19dPTEvMCxBW18rM109LTEvMDtJcyh4LGUsQSl9Zy5zb3J0KHBkKTtsZXQgdz1zO2ZvcihsZXQgeD0wO3g8dzt4Kyspe2NvbnN0IE09Z1t4XTtmb3IoO3grMTx3JiZnW3grMV0uY2FuZGlkYXRlPT09TS5jYW5kaWRhdGU7KWcuc3BsaWNlKHgrMSwxKSx3LS19Zm9yKGxldCB4PWg7eDx1O3grPTYpe2NvbnN0IE09ZVt4KzIqZl07Zm9yKGxldCBBPTA7QTx3O0ErKyl7Y29uc3QgUz1nW0FdO00+PVMuY2FuZGlkYXRlP0lzKHgsZSxTLnJpZ2h0Q2FjaGVCb3VuZHMpOihJcyh4LGUsUy5sZWZ0Q2FjaGVCb3VuZHMpLFMuY291bnQrKyl9fWZvcihsZXQgeD0wO3g8dzt4Kyspe2NvbnN0IE09Z1t4XSxBPU0uY291bnQsUz1zLU0uY291bnQsdj1NLmxlZnRDYWNoZUJvdW5kcyxfPU0ucmlnaHRDYWNoZUJvdW5kcztsZXQgRT0wO0EhPT0wJiYoRT1GaSh2KS9jKTtsZXQgej0wO1MhPT0wJiYoej1GaShfKS9jKTtjb25zdCBDPWFsK1ZvKihFKkEreipTKTtDPGwmJihvPWYsbD1DLGE9TS5jYW5kaWRhdGUpfX1lbHNle2ZvcihsZXQgdz0wO3c8RmU7dysrKXtjb25zdCB4PUtlW3ddO3guY291bnQ9MCx4LmNhbmRpZGF0ZT1kK20rdyptO2NvbnN0IE09eC5ib3VuZHM7Zm9yKGxldCBBPTA7QTwzO0ErKylNW0FdPTEvMCxNW0ErM109LTEvMH1mb3IobGV0IHc9aDt3PHU7dys9Nil7bGV0IEE9fn4oKGVbdysyKmZdLWQpL20pO0E+PUZlJiYoQT1GZS0xKTtjb25zdCBTPUtlW0FdO1MuY291bnQrKyxJcyh3LGUsUy5ib3VuZHMpfWNvbnN0IGc9S2VbRmUtMV07dWwoZy5ib3VuZHMsZy5yaWdodENhY2hlQm91bmRzKTtmb3IobGV0IHc9RmUtMjt3Pj0wO3ctLSl7Y29uc3QgeD1LZVt3XSxNPUtlW3crMV07ZmwoeC5ib3VuZHMsTS5yaWdodENhY2hlQm91bmRzLHgucmlnaHRDYWNoZUJvdW5kcyl9bGV0IGI9MDtmb3IobGV0IHc9MDt3PEZlLTE7dysrKXtjb25zdCB4PUtlW3ddLE09eC5jb3VudCxBPXguYm91bmRzLHY9S2VbdysxXS5yaWdodENhY2hlQm91bmRzO00hPT0wJiYoYj09PTA/dWwoQSxrcyk6ZmwoQSxrcyxrcykpLGIrPU07bGV0IF89MCxFPTA7YiE9PTAmJihfPUZpKGtzKS9jKTtjb25zdCB6PXMtYjt6IT09MCYmKEU9RmkodikvYyk7Y29uc3QgQz1hbCtWbyooXypiK0Uqeik7QzxsJiYobz1mLGw9QyxhPXguY2FuZGlkYXRlKX19fX1lbHNlIGNvbnNvbGUud2FybihgTWVzaEJWSDogSW52YWxpZCBidWlsZCBzdHJhdGVneSB2YWx1ZSAke3J9IHVzZWQuYCk7cmV0dXJue2F4aXM6byxwb3M6YX19ZnVuY3Rpb24gbWQoaSx0LGUsbil7bGV0IHM9MDtmb3IobGV0IHI9dCxvPXQrZTtyPG87cisrKXMrPWlbcio2K24qMl07cmV0dXJuIHMvZX1jbGFzcyBIb3tjb25zdHJ1Y3Rvcigpe3RoaXMuYm91bmRpbmdEYXRhPW5ldyBGbG9hdDMyQXJyYXkoNil9fWZ1bmN0aW9uIGdkKGksdCxlLG4scyxyKXtsZXQgbz1uLGE9bitzLTE7Y29uc3QgYz1yLnBvcyxsPXIuYXhpcyoyO2Zvcig7Oyl7Zm9yKDtvPD1hJiZlW28qNitsXTxjOylvKys7Zm9yKDtvPD1hJiZlW2EqNitsXT49YzspYS0tO2lmKG88YSl7Zm9yKGxldCBoPTA7aDwzO2grKyl7bGV0IHU9dFtvKjMraF07dFtvKjMraF09dFthKjMraF0sdFthKjMraF09dX1mb3IobGV0IGg9MDtoPDY7aCsrKXtsZXQgdT1lW28qNitoXTtlW28qNitoXT1lW2EqNitoXSxlW2EqNitoXT11fW8rKyxhLS19ZWxzZSByZXR1cm4gb319ZnVuY3Rpb24geGQoaSx0LGUsbixzLHIpe2xldCBvPW4sYT1uK3MtMTtjb25zdCBjPXIucG9zLGw9ci5heGlzKjI7Zm9yKDs7KXtmb3IoO288PWEmJmVbbyo2K2xdPGM7KW8rKztmb3IoO288PWEmJmVbYSo2K2xdPj1jOylhLS07aWYobzxhKXtsZXQgaD1pW29dO2lbb109aVthXSxpW2FdPWg7Zm9yKGxldCB1PTA7dTw2O3UrKyl7bGV0IGY9ZVtvKjYrdV07ZVtvKjYrdV09ZVthKjYrdV0sZVthKjYrdV09Zn1vKyssYS0tfWVsc2UgcmV0dXJuIG99fWZ1bmN0aW9uIGt0KGksdCl7cmV0dXJuIHRbaSsxNV09PT02NTUzNX1mdW5jdGlvbiBWdChpLHQpe3JldHVybiB0W2krNl19ZnVuY3Rpb24gUXQoaSx0KXtyZXR1cm4gdFtpKzE0XX1mdW5jdGlvbiBLdChpKXtyZXR1cm4gaSs4fWZ1bmN0aW9uIHRlKGksdCl7cmV0dXJuIHRbaSs2XX1mdW5jdGlvbiBkbChpLHQpe3JldHVybiB0W2krN119ZnVuY3Rpb24gZXgoaSl7cmV0dXJuIGl9bGV0IHBsLElpLE5zLHlsO2NvbnN0IHdkPU1hdGgucG93KDIsMzIpO2Z1bmN0aW9uIFhvKGkpe3JldHVybiJjb3VudCJpbiBpPzE6MStYbyhpLmxlZnQpK1hvKGkucmlnaHQpfWZ1bmN0aW9uIGJkKGksdCxlKXtyZXR1cm4gcGw9bmV3IEZsb2F0MzJBcnJheShlKSxJaT1uZXcgVWludDMyQXJyYXkoZSksTnM9bmV3IFVpbnQxNkFycmF5KGUpLHlsPW5ldyBVaW50OEFycmF5KGUpLEdvKGksdCl9ZnVuY3Rpb24gR28oaSx0KXtjb25zdCBlPWkvNCxuPWkvMixzPSJjb3VudCJpbiB0LHI9dC5ib3VuZGluZ0RhdGE7Zm9yKGxldCBvPTA7bzw2O28rKylwbFtlK29dPXJbb107aWYocylpZih0LmJ1ZmZlcil7Y29uc3Qgbz10LmJ1ZmZlcjt5bC5zZXQobmV3IFVpbnQ4QXJyYXkobyksaSk7Zm9yKGxldCBhPWksYz1pK28uYnl0ZUxlbmd0aDthPGM7YSs9Qmkpe2NvbnN0IGw9YS8yO2t0KGwsTnMpfHwoSWlbYS80KzZdKz1lKX1yZXR1cm4gaStvLmJ5dGVMZW5ndGh9ZWxzZXtjb25zdCBvPXQub2Zmc2V0LGE9dC5jb3VudDtyZXR1cm4gSWlbZSs2XT1vLE5zW24rMTRdPWEsTnNbbisxNV09RnMsaStCaX1lbHNle2NvbnN0IG89dC5sZWZ0LGE9dC5yaWdodCxjPXQuc3BsaXRBeGlzO2xldCBsO2lmKGw9R28oaStCaSxvKSxsLzQ+d2QpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBDYW5ub3Qgc3RvcmUgY2hpbGQgcG9pbnRlciBncmVhdGVyIHRoYW4gMzIgYml0cy4iKTtyZXR1cm4gSWlbZSs2XT1sLzQsbD1HbyhsLGEpLElpW2UrN109YyxsfX1mdW5jdGlvbiBNZChpLHQpe2NvbnN0IGU9KGkuaW5kZXg/aS5pbmRleC5jb3VudDppLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQpLzMsbj1lPmdpKDIsMTYpLHM9bj80OjIscj10P25ldyBTaGFyZWRBcnJheUJ1ZmZlcihlKnMpOm5ldyBBcnJheUJ1ZmZlcihlKnMpLG89bj9uZXcgVWludDMyQXJyYXkocik6bmV3IFVpbnQxNkFycmF5KHIpO2ZvcihsZXQgYT0wLGM9by5sZW5ndGg7YTxjO2ErKylvW2FdPWE7cmV0dXJuIG99ZnVuY3Rpb24gQWQoaSx0LGUsbixzKXtjb25zdHttYXhEZXB0aDpyLHZlcmJvc2U6byxtYXhMZWFmVHJpczphLHN0cmF0ZWd5OmMsb25Qcm9ncmVzczpsLGluZGlyZWN0Omh9PXMsdT1pLl9pbmRpcmVjdEJ1ZmZlcixmPWkuZ2VvbWV0cnksZD1mLmluZGV4P2YuaW5kZXguYXJyYXk6bnVsbCxwPWg/eGQ6Z2QseT1KbihmKSxtPW5ldyBGbG9hdDMyQXJyYXkoNik7bGV0IGc9ITE7Y29uc3QgYj1uZXcgSG87cmV0dXJuIHFvKHQsZSxuLGIuYm91bmRpbmdEYXRhLG0pLHgoYixlLG4sbSksYjtmdW5jdGlvbiB3KE0pe2wmJmwoTS95KX1mdW5jdGlvbiB4KE0sQSxTLHY9bnVsbCxfPTApe2lmKCFnJiZfPj1yJiYoZz0hMCxvJiYoY29uc29sZS53YXJuKGBNZXNoQlZIOiBNYXggZGVwdGggb2YgJHtyfSByZWFjaGVkIHdoZW4gZ2VuZXJhdGluZyBCVkguIENvbnNpZGVyIGluY3JlYXNpbmcgbWF4RGVwdGguYCksY29uc29sZS53YXJuKGYpKSksUzw9YXx8Xz49cilyZXR1cm4gdyhBK1MpLE0ub2Zmc2V0PUEsTS5jb3VudD1TLE07Y29uc3QgRT15ZChNLmJvdW5kaW5nRGF0YSx2LHQsQSxTLGMpO2lmKEUuYXhpcz09PS0xKXJldHVybiB3KEErUyksTS5vZmZzZXQ9QSxNLmNvdW50PVMsTTtjb25zdCB6PXAodSxkLHQsQSxTLEUpO2lmKHo9PT1BfHx6PT09QStTKXcoQStTKSxNLm9mZnNldD1BLE0uY291bnQ9UztlbHNle00uc3BsaXRBeGlzPUUuYXhpcztjb25zdCBDPW5ldyBIbyxQPUEsRj16LUE7TS5sZWZ0PUMscW8odCxQLEYsQy5ib3VuZGluZ0RhdGEsbSkseChDLFAsRixtLF8rMSk7Y29uc3QgQj1uZXcgSG8sST16LFI9Uy1GO00ucmlnaHQ9Qixxbyh0LEksUixCLmJvdW5kaW5nRGF0YSxtKSx4KEIsSSxSLG0sXysxKX1yZXR1cm4gTX19ZnVuY3Rpb24gU2QoaSx0KXtjb25zdCBlPWkuZ2VvbWV0cnk7dC5pbmRpcmVjdCYmKGkuX2luZGlyZWN0QnVmZmVyPU1kKGUsdC51c2VTaGFyZWRBcnJheUJ1ZmZlciksZmQoZSx0LnJhbmdlKSYmIXQudmVyYm9zZSYmY29uc29sZS53YXJuKCdNZXNoQlZIOiBQcm92aWRlZCBnZW9tZXRyeSBjb250YWlucyBncm91cHMgb3IgYSByYW5nZSB0aGF0IGRvIG5vdCBmdWxseSBzcGFuIHRoZSB2ZXJ0ZXggY29udGVudHMgd2hpbGUgdXNpbmcgdGhlICJpbmRpcmVjdCIgb3B0aW9uLiBCVkggbWF5IGluY29ycmVjdGx5IHJlcG9ydCBpbnRlcnNlY3Rpb25zIG9uIHVucmVuZGVyZWQgcG9ydGlvbnMgb2YgdGhlIGdlb21ldHJ5LicpKSxpLl9pbmRpcmVjdEJ1ZmZlcnx8dWQoZSx0KTtjb25zdCBuPXQudXNlU2hhcmVkQXJyYXlCdWZmZXI/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXIscz1kZChlKSxyPXQuaW5kaXJlY3Q/Y2woZSx0LnJhbmdlKTpsbChlLHQucmFuZ2UpO2kuX3Jvb3RzPXIubWFwKG89Pntjb25zdCBhPUFkKGkscyxvLm9mZnNldCxvLmNvdW50LHQpLGM9WG8oYSksbD1uZXcgbihCaSpjKTtyZXR1cm4gYmQoMCxhLGwpLGx9KX1jbGFzcyBJZXtjb25zdHJ1Y3Rvcigpe3RoaXMubWluPTEvMCx0aGlzLm1heD0tMS8wfXNldEZyb21Qb2ludHNGaWVsZCh0LGUpe2xldCBuPTEvMCxzPS0xLzA7Zm9yKGxldCByPTAsbz10Lmxlbmd0aDtyPG87cisrKXtjb25zdCBjPXRbcl1bZV07bj1jPG4/YzpuLHM9Yz5zP2M6c310aGlzLm1pbj1uLHRoaXMubWF4PXN9c2V0RnJvbVBvaW50cyh0LGUpe2xldCBuPTEvMCxzPS0xLzA7Zm9yKGxldCByPTAsbz1lLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPWVbcl0sYz10LmRvdChhKTtuPWM8bj9jOm4scz1jPnM/YzpzfXRoaXMubWluPW4sdGhpcy5tYXg9c31pc1NlcGFyYXRlZCh0KXtyZXR1cm4gdGhpcy5taW4+dC5tYXh8fHQubWluPnRoaXMubWF4fX1JZS5wcm90b3R5cGUuc2V0RnJvbUJveD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKGUsbil7Y29uc3Qgcz1uLm1pbixyPW4ubWF4O2xldCBvPTEvMCxhPS0xLzA7Zm9yKGxldCBjPTA7Yzw9MTtjKyspZm9yKGxldCBsPTA7bDw9MTtsKyspZm9yKGxldCBoPTA7aDw9MTtoKyspe2kueD1zLngqYytyLngqKDEtYyksaS55PXMueSpsK3IueSooMS1sKSxpLno9cy56Kmgrci56KigxLWgpO2NvbnN0IHU9ZS5kb3QoaSk7bz1NYXRoLm1pbih1LG8pLGE9TWF0aC5tYXgodSxhKX10aGlzLm1pbj1vLHRoaXMubWF4PWF9fSgpO2NvbnN0IF9kPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgVCx0PW5ldyBULGU9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKHMscixvKXtjb25zdCBhPXMuc3RhcnQsYz1pLGw9ci5zdGFydCxoPXQ7ZS5zdWJWZWN0b3JzKGEsbCksaS5zdWJWZWN0b3JzKHMuZW5kLHMuc3RhcnQpLHQuc3ViVmVjdG9ycyhyLmVuZCxyLnN0YXJ0KTtjb25zdCB1PWUuZG90KGgpLGY9aC5kb3QoYyksZD1oLmRvdChoKSxwPWUuZG90KGMpLG09Yy5kb3QoYykqZC1mKmY7bGV0IGcsYjttIT09MD9nPSh1KmYtcCpkKS9tOmc9MCxiPSh1K2cqZikvZCxvLng9ZyxvLnk9Yn19KCksV289ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBOLHQ9bmV3IFQsZT1uZXcgVDtyZXR1cm4gZnVuY3Rpb24ocyxyLG8sYSl7X2QocyxyLGkpO2xldCBjPWkueCxsPWkueTtpZihjPj0wJiZjPD0xJiZsPj0wJiZsPD0xKXtzLmF0KGMsbyksci5hdChsLGEpO3JldHVybn1lbHNlIGlmKGM+PTAmJmM8PTEpe2w8MD9yLmF0KDAsYSk6ci5hdCgxLGEpLHMuY2xvc2VzdFBvaW50VG9Qb2ludChhLCEwLG8pO3JldHVybn1lbHNlIGlmKGw+PTAmJmw8PTEpe2M8MD9zLmF0KDAsbyk6cy5hdCgxLG8pLHIuY2xvc2VzdFBvaW50VG9Qb2ludChvLCEwLGEpO3JldHVybn1lbHNle2xldCBoO2M8MD9oPXMuc3RhcnQ6aD1zLmVuZDtsZXQgdTtsPDA/dT1yLnN0YXJ0OnU9ci5lbmQ7Y29uc3QgZj10LGQ9ZTtpZihzLmNsb3Nlc3RQb2ludFRvUG9pbnQodSwhMCx0KSxyLmNsb3Nlc3RQb2ludFRvUG9pbnQoaCwhMCxlKSxmLmRpc3RhbmNlVG9TcXVhcmVkKHUpPD1kLmRpc3RhbmNlVG9TcXVhcmVkKGgpKXtvLmNvcHkoZiksYS5jb3B5KHUpO3JldHVybn1lbHNle28uY29weShoKSxhLmNvcHkoZCk7cmV0dXJufX19fSgpLHZkPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgVCx0PW5ldyBULGU9bmV3IEVvLG49bmV3IGp0O3JldHVybiBmdW5jdGlvbihyLG8pe2NvbnN0e3JhZGl1czphLGNlbnRlcjpjfT1yLHthOmwsYjpoLGM6dX09bztpZihuLnN0YXJ0PWwsbi5lbmQ9aCxuLmNsb3Nlc3RQb2ludFRvUG9pbnQoYywhMCxpKS5kaXN0YW5jZVRvKGMpPD1hfHwobi5zdGFydD1sLG4uZW5kPXUsbi5jbG9zZXN0UG9pbnRUb1BvaW50KGMsITAsaSkuZGlzdGFuY2VUbyhjKTw9YSl8fChuLnN0YXJ0PWgsbi5lbmQ9dSxuLmNsb3Nlc3RQb2ludFRvUG9pbnQoYywhMCxpKS5kaXN0YW5jZVRvKGMpPD1hKSlyZXR1cm4hMDtjb25zdCB5PW8uZ2V0UGxhbmUoZSk7aWYoTWF0aC5hYnMoeS5kaXN0YW5jZVRvUG9pbnQoYykpPD1hKXtjb25zdCBnPXkucHJvamVjdFBvaW50KGMsdCk7aWYoby5jb250YWluc1BvaW50KGcpKXJldHVybiEwfXJldHVybiExfX0oKSx6ZD0xZS0xNTtmdW5jdGlvbiBabyhpKXtyZXR1cm4gTWF0aC5hYnMoaSk8emR9Y2xhc3MgZWUgZXh0ZW5kcyB0dHtjb25zdHJ1Y3RvciguLi50KXtzdXBlciguLi50KSx0aGlzLmlzRXh0ZW5kZWRUcmlhbmdsZT0hMCx0aGlzLnNhdEF4ZXM9bmV3IEFycmF5KDQpLmZpbGwoKS5tYXAoKCk9Pm5ldyBUKSx0aGlzLnNhdEJvdW5kcz1uZXcgQXJyYXkoNCkuZmlsbCgpLm1hcCgoKT0+bmV3IEllKSx0aGlzLnBvaW50cz1bdGhpcy5hLHRoaXMuYix0aGlzLmNdLHRoaXMuc3BoZXJlPW5ldyBobyx0aGlzLnBsYW5lPW5ldyBFbyx0aGlzLm5lZWRzVXBkYXRlPSEwfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHZkKHQsdGhpcyl9dXBkYXRlKCl7Y29uc3QgdD10aGlzLmEsZT10aGlzLmIsbj10aGlzLmMscz10aGlzLnBvaW50cyxyPXRoaXMuc2F0QXhlcyxvPXRoaXMuc2F0Qm91bmRzLGE9clswXSxjPW9bMF07dGhpcy5nZXROb3JtYWwoYSksYy5zZXRGcm9tUG9pbnRzKGEscyk7Y29uc3QgbD1yWzFdLGg9b1sxXTtsLnN1YlZlY3RvcnModCxlKSxoLnNldEZyb21Qb2ludHMobCxzKTtjb25zdCB1PXJbMl0sZj1vWzJdO3Uuc3ViVmVjdG9ycyhlLG4pLGYuc2V0RnJvbVBvaW50cyh1LHMpO2NvbnN0IGQ9clszXSxwPW9bM107ZC5zdWJWZWN0b3JzKG4sdCkscC5zZXRGcm9tUG9pbnRzKGQscyksdGhpcy5zcGhlcmUuc2V0RnJvbVBvaW50cyh0aGlzLnBvaW50cyksdGhpcy5wbGFuZS5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludChhLHQpLHRoaXMubmVlZHNVcGRhdGU9ITF9fWVlLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb1NlZ21lbnQ9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBULHQ9bmV3IFQsZT1uZXcganQ7cmV0dXJuIGZ1bmN0aW9uKHMscj1udWxsLG89bnVsbCl7Y29uc3R7c3RhcnQ6YSxlbmQ6Y309cyxsPXRoaXMucG9pbnRzO2xldCBoLHU9MS8wO2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9KGYrMSklMztlLnN0YXJ0LmNvcHkobFtmXSksZS5lbmQuY29weShsW2RdKSxXbyhlLHMsaSx0KSxoPWkuZGlzdGFuY2VUb1NxdWFyZWQodCksaDx1JiYodT1oLHImJnIuY29weShpKSxvJiZvLmNvcHkodCkpfXJldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoYSxpKSxoPWEuZGlzdGFuY2VUb1NxdWFyZWQoaSksaDx1JiYodT1oLHImJnIuY29weShpKSxvJiZvLmNvcHkoYSkpLHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChjLGkpLGg9Yy5kaXN0YW5jZVRvU3F1YXJlZChpKSxoPHUmJih1PWgsciYmci5jb3B5KGkpLG8mJm8uY29weShjKSksTWF0aC5zcXJ0KHUpfX0oKSxlZS5wcm90b3R5cGUuaW50ZXJzZWN0c1RyaWFuZ2xlPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgZWUsdD1uZXcgQXJyYXkoMyksZT1uZXcgQXJyYXkoMyksbj1uZXcgSWUscz1uZXcgSWUscj1uZXcgVCxvPW5ldyBULGE9bmV3IFQsYz1uZXcgVCxsPW5ldyBULGg9bmV3IGp0LHU9bmV3IGp0LGY9bmV3IGp0LGQ9bmV3IFQ7ZnVuY3Rpb24gcCh5LG0sZyl7Y29uc3QgYj15LnBvaW50cztsZXQgdz0wLHg9LTE7Zm9yKGxldCBNPTA7TTwzO00rKyl7Y29uc3R7c3RhcnQ6QSxlbmQ6U309aDtBLmNvcHkoYltNXSksUy5jb3B5KGJbKE0rMSklM10pLGguZGVsdGEobyk7Y29uc3Qgdj1abyhtLmRpc3RhbmNlVG9Qb2ludChBKSk7aWYoWm8obS5ub3JtYWwuZG90KG8pKSYmdil7Zy5jb3B5KGgpLHc9MjticmVha31jb25zdCBfPW0uaW50ZXJzZWN0TGluZShoLGQpO2lmKCFfJiZ2JiZkLmNvcHkoQSksKF98fHYpJiYhWm8oZC5kaXN0YW5jZVRvKFMpKSl7aWYodzw9MSkodz09PTE/Zy5zdGFydDpnLmVuZCkuY29weShkKSx2JiYoeD13KTtlbHNlIGlmKHc+PTIpeyh4PT09MT9nLnN0YXJ0OmcuZW5kKS5jb3B5KGQpLHc9MjticmVha31pZih3Kyssdz09PTImJng9PT0tMSlicmVha319cmV0dXJuIHd9cmV0dXJuIGZ1bmN0aW9uKG0sZz1udWxsLGI9ITEpe3RoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksbS5pc0V4dGVuZGVkVHJpYW5nbGU/bS5uZWVkc1VwZGF0ZSYmbS51cGRhdGUoKTooaS5jb3B5KG0pLGkudXBkYXRlKCksbT1pKTtjb25zdCB3PXRoaXMucGxhbmUseD1tLnBsYW5lO2lmKE1hdGguYWJzKHcubm9ybWFsLmRvdCh4Lm5vcm1hbCkpPjEtMWUtMTApe2NvbnN0IE09dGhpcy5zYXRCb3VuZHMsQT10aGlzLnNhdEF4ZXM7ZVswXT1tLmEsZVsxXT1tLmIsZVsyXT1tLmM7Zm9yKGxldCBfPTA7Xzw0O18rKyl7Y29uc3QgRT1NW19dLHo9QVtfXTtpZihuLnNldEZyb21Qb2ludHMoeixlKSxFLmlzU2VwYXJhdGVkKG4pKXJldHVybiExfWNvbnN0IFM9bS5zYXRCb3VuZHMsdj1tLnNhdEF4ZXM7dFswXT10aGlzLmEsdFsxXT10aGlzLmIsdFsyXT10aGlzLmM7Zm9yKGxldCBfPTA7Xzw0O18rKyl7Y29uc3QgRT1TW19dLHo9dltfXTtpZihuLnNldEZyb21Qb2ludHMoeix0KSxFLmlzU2VwYXJhdGVkKG4pKXJldHVybiExfWZvcihsZXQgXz0wO188NDtfKyspe2NvbnN0IEU9QVtfXTtmb3IobGV0IHo9MDt6PDQ7eisrKXtjb25zdCBDPXZbel07aWYoci5jcm9zc1ZlY3RvcnMoRSxDKSxuLnNldEZyb21Qb2ludHMocix0KSxzLnNldEZyb21Qb2ludHMocixlKSxuLmlzU2VwYXJhdGVkKHMpKXJldHVybiExfX1yZXR1cm4gZyYmKGJ8fGNvbnNvbGUud2FybigiRXh0ZW5kZWRUcmlhbmdsZS5pbnRlcnNlY3RzVHJpYW5nbGU6IFRyaWFuZ2xlcyBhcmUgY29wbGFuYXIgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBhbiBvdXRwdXQgZWRnZS4gU2V0dGluZyBlZGdlIHRvIDAsIDAsIDAuIiksZy5zdGFydC5zZXQoMCwwLDApLGcuZW5kLnNldCgwLDAsMCkpLCEwfWVsc2V7Y29uc3QgTT1wKHRoaXMseCx1KTtpZihNPT09MSYmbS5jb250YWluc1BvaW50KHUuZW5kKSlyZXR1cm4gZyYmKGcuc3RhcnQuY29weSh1LmVuZCksZy5lbmQuY29weSh1LmVuZCkpLCEwO2lmKE0hPT0yKXJldHVybiExO2NvbnN0IEE9cChtLHcsZik7aWYoQT09PTEmJnRoaXMuY29udGFpbnNQb2ludChmLmVuZCkpcmV0dXJuIGcmJihnLnN0YXJ0LmNvcHkoZi5lbmQpLGcuZW5kLmNvcHkoZi5lbmQpKSwhMDtpZihBIT09MilyZXR1cm4hMTtpZih1LmRlbHRhKGEpLGYuZGVsdGEoYyksYS5kb3QoYyk8MCl7bGV0IFA9Zi5zdGFydDtmLnN0YXJ0PWYuZW5kLGYuZW5kPVB9Y29uc3QgUz11LnN0YXJ0LmRvdChhKSx2PXUuZW5kLmRvdChhKSxfPWYuc3RhcnQuZG90KGEpLEU9Zi5lbmQuZG90KGEpLHo9djxfLEM9UzxFO3JldHVybiBTIT09RSYmXyE9PXYmJno9PT1DPyExOihnJiYobC5zdWJWZWN0b3JzKHUuc3RhcnQsZi5zdGFydCksbC5kb3QoYSk+MD9nLnN0YXJ0LmNvcHkodS5zdGFydCk6Zy5zdGFydC5jb3B5KGYuc3RhcnQpLGwuc3ViVmVjdG9ycyh1LmVuZCxmLmVuZCksbC5kb3QoYSk8MD9nLmVuZC5jb3B5KHUuZW5kKTpnLmVuZC5jb3B5KGYuZW5kKSksITApfX19KCksZWUucHJvdG90eXBlLmRpc3RhbmNlVG9Qb2ludD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoZSxpKSxlLmRpc3RhbmNlVG8oaSl9fSgpLGVlLnByb3RvdHlwZS5kaXN0YW5jZVRvVHJpYW5nbGU9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBULHQ9bmV3IFQsZT1bImEiLCJiIiwiYyJdLG49bmV3IGp0LHM9bmV3IGp0O3JldHVybiBmdW5jdGlvbihvLGE9bnVsbCxjPW51bGwpe2NvbnN0IGw9YXx8Yz9uOm51bGw7aWYodGhpcy5pbnRlcnNlY3RzVHJpYW5nbGUobyxsKSlyZXR1cm4oYXx8YykmJihhJiZsLmdldENlbnRlcihhKSxjJiZsLmdldENlbnRlcihjKSksMDtsZXQgaD0xLzA7Zm9yKGxldCB1PTA7dTwzO3UrKyl7bGV0IGY7Y29uc3QgZD1lW3VdLHA9b1tkXTt0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQocCxpKSxmPXAuZGlzdGFuY2VUb1NxdWFyZWQoaSksZjxoJiYoaD1mLGEmJmEuY29weShpKSxjJiZjLmNvcHkocCkpO2NvbnN0IHk9dGhpc1tkXTtvLmNsb3Nlc3RQb2ludFRvUG9pbnQoeSxpKSxmPXkuZGlzdGFuY2VUb1NxdWFyZWQoaSksZjxoJiYoaD1mLGEmJmEuY29weSh5KSxjJiZjLmNvcHkoaSkpfWZvcihsZXQgdT0wO3U8Mzt1Kyspe2NvbnN0IGY9ZVt1XSxkPWVbKHUrMSklM107bi5zZXQodGhpc1tmXSx0aGlzW2RdKTtmb3IobGV0IHA9MDtwPDM7cCsrKXtjb25zdCB5PWVbcF0sbT1lWyhwKzEpJTNdO3Muc2V0KG9beV0sb1ttXSksV28obixzLGksdCk7Y29uc3QgZz1pLmRpc3RhbmNlVG9TcXVhcmVkKHQpO2c8aCYmKGg9ZyxhJiZhLmNvcHkoaSksYyYmYy5jb3B5KHQpKX19cmV0dXJuIE1hdGguc3FydChoKX19KCk7Y2xhc3MgenR7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuaXNPcmllbnRlZEJveD0hMCx0aGlzLm1pbj1uZXcgVCx0aGlzLm1heD1uZXcgVCx0aGlzLm1hdHJpeD1uZXcgc3QsdGhpcy5pbnZNYXRyaXg9bmV3IHN0LHRoaXMucG9pbnRzPW5ldyBBcnJheSg4KS5maWxsKCkubWFwKCgpPT5uZXcgVCksdGhpcy5zYXRBeGVzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgpPT5uZXcgVCksdGhpcy5zYXRCb3VuZHM9bmV3IEFycmF5KDMpLmZpbGwoKS5tYXAoKCk9Pm5ldyBJZSksdGhpcy5hbGlnbmVkU2F0Qm91bmRzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgpPT5uZXcgSWUpLHRoaXMubmVlZHNVcGRhdGU9ITEsdCYmdGhpcy5taW4uY29weSh0KSxlJiZ0aGlzLm1heC5jb3B5KGUpLG4mJnRoaXMubWF0cml4LmNvcHkobil9c2V0KHQsZSxuKXt0aGlzLm1pbi5jb3B5KHQpLHRoaXMubWF4LmNvcHkoZSksdGhpcy5tYXRyaXguY29weShuKSx0aGlzLm5lZWRzVXBkYXRlPSEwfWNvcHkodCl7dGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5uZWVkc1VwZGF0ZT0hMH19enQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5tYXRyaXgsZT10aGlzLm1pbixuPXRoaXMubWF4LHM9dGhpcy5wb2ludHM7Zm9yKGxldCBsPTA7bDw9MTtsKyspZm9yKGxldCBoPTA7aDw9MTtoKyspZm9yKGxldCB1PTA7dTw9MTt1Kyspe2NvbnN0IGY9MSpsfDIqaHw0KnUsZD1zW2ZdO2QueD1sP24ueDplLngsZC55PWg/bi55OmUueSxkLno9dT9uLno6ZS56LGQuYXBwbHlNYXRyaXg0KHQpfWNvbnN0IHI9dGhpcy5zYXRCb3VuZHMsbz10aGlzLnNhdEF4ZXMsYT1zWzBdO2ZvcihsZXQgbD0wO2w8MztsKyspe2NvbnN0IGg9b1tsXSx1PXJbbF0sZj0xPDxsLGQ9c1tmXTtoLnN1YlZlY3RvcnMoYSxkKSx1LnNldEZyb21Qb2ludHMoaCxzKX1jb25zdCBjPXRoaXMuYWxpZ25lZFNhdEJvdW5kcztjWzBdLnNldEZyb21Qb2ludHNGaWVsZChzLCJ4IiksY1sxXS5zZXRGcm9tUG9pbnRzRmllbGQocywieSIpLGNbMl0uc2V0RnJvbVBvaW50c0ZpZWxkKHMsInoiKSx0aGlzLmludk1hdHJpeC5jb3B5KHRoaXMubWF0cml4KS5pbnZlcnQoKSx0aGlzLm5lZWRzVXBkYXRlPSExfX0oKSx6dC5wcm90b3R5cGUuaW50ZXJzZWN0c0JveD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IEllO3JldHVybiBmdW5jdGlvbihlKXt0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpO2NvbnN0IG49ZS5taW4scz1lLm1heCxyPXRoaXMuc2F0Qm91bmRzLG89dGhpcy5zYXRBeGVzLGE9dGhpcy5hbGlnbmVkU2F0Qm91bmRzO2lmKGkubWluPW4ueCxpLm1heD1zLngsYVswXS5pc1NlcGFyYXRlZChpKXx8KGkubWluPW4ueSxpLm1heD1zLnksYVsxXS5pc1NlcGFyYXRlZChpKSl8fChpLm1pbj1uLnosaS5tYXg9cy56LGFbMl0uaXNTZXBhcmF0ZWQoaSkpKXJldHVybiExO2ZvcihsZXQgYz0wO2M8MztjKyspe2NvbnN0IGw9b1tjXSxoPXJbY107aWYoaS5zZXRGcm9tQm94KGwsZSksaC5pc1NlcGFyYXRlZChpKSlyZXR1cm4hMX1yZXR1cm4hMH19KCksenQucHJvdG90eXBlLmludGVyc2VjdHNUcmlhbmdsZT1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IGVlLHQ9bmV3IEFycmF5KDMpLGU9bmV3IEllLG49bmV3IEllLHM9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKG8pe3RoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksby5pc0V4dGVuZGVkVHJpYW5nbGU/by5uZWVkc1VwZGF0ZSYmby51cGRhdGUoKTooaS5jb3B5KG8pLGkudXBkYXRlKCksbz1pKTtjb25zdCBhPXRoaXMuc2F0Qm91bmRzLGM9dGhpcy5zYXRBeGVzO3RbMF09by5hLHRbMV09by5iLHRbMl09by5jO2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9YVtmXSxwPWNbZl07aWYoZS5zZXRGcm9tUG9pbnRzKHAsdCksZC5pc1NlcGFyYXRlZChlKSlyZXR1cm4hMX1jb25zdCBsPW8uc2F0Qm91bmRzLGg9by5zYXRBeGVzLHU9dGhpcy5wb2ludHM7Zm9yKGxldCBmPTA7ZjwzO2YrKyl7Y29uc3QgZD1sW2ZdLHA9aFtmXTtpZihlLnNldEZyb21Qb2ludHMocCx1KSxkLmlzU2VwYXJhdGVkKGUpKXJldHVybiExfWZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9Y1tmXTtmb3IobGV0IHA9MDtwPDQ7cCsrKXtjb25zdCB5PWhbcF07aWYocy5jcm9zc1ZlY3RvcnMoZCx5KSxlLnNldEZyb21Qb2ludHMocyx0KSxuLnNldEZyb21Qb2ludHMocyx1KSxlLmlzU2VwYXJhdGVkKG4pKXJldHVybiExfX1yZXR1cm4hMH19KCksenQucHJvdG90eXBlLmNsb3Nlc3RQb2ludFRvUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKSxlLmNvcHkodCkuYXBwbHlNYXRyaXg0KHRoaXMuaW52TWF0cml4KS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4KSxlfX0oKSx6dC5wcm90b3R5cGUuZGlzdGFuY2VUb1BvaW50PWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgVDtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChlLGkpLGUuZGlzdGFuY2VUbyhpKX19KCksenQucHJvdG90eXBlLmRpc3RhbmNlVG9Cb3g9ZnVuY3Rpb24oKXtjb25zdCBpPVsieCIsInkiLCJ6Il0sdD1uZXcgQXJyYXkoMTIpLmZpbGwoKS5tYXAoKCk9Pm5ldyBqdCksZT1uZXcgQXJyYXkoMTIpLmZpbGwoKS5tYXAoKCk9Pm5ldyBqdCksbj1uZXcgVCxzPW5ldyBUO3JldHVybiBmdW5jdGlvbihvLGE9MCxjPW51bGwsbD1udWxsKXtpZih0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLHRoaXMuaW50ZXJzZWN0c0JveChvKSlyZXR1cm4oY3x8bCkmJihvLmdldENlbnRlcihzKSx0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQocyxuKSxvLmNsb3Nlc3RQb2ludFRvUG9pbnQobixzKSxjJiZjLmNvcHkobiksbCYmbC5jb3B5KHMpKSwwO2NvbnN0IGg9YSphLHU9by5taW4sZj1vLm1heCxkPXRoaXMucG9pbnRzO2xldCBwPTEvMDtmb3IobGV0IG09MDttPDg7bSsrKXtjb25zdCBnPWRbbV07cy5jb3B5KGcpLmNsYW1wKHUsZik7Y29uc3QgYj1nLmRpc3RhbmNlVG9TcXVhcmVkKHMpO2lmKGI8cCYmKHA9YixjJiZjLmNvcHkoZyksbCYmbC5jb3B5KHMpLGI8aCkpcmV0dXJuIE1hdGguc3FydChiKX1sZXQgeT0wO2ZvcihsZXQgbT0wO208MzttKyspZm9yKGxldCBnPTA7Zzw9MTtnKyspZm9yKGxldCBiPTA7Yjw9MTtiKyspe2NvbnN0IHc9KG0rMSklMyx4PShtKzIpJTMsTT1nPDx3fGI8PHgsQT0xPDxtfGc8PHd8Yjw8eCxTPWRbTV0sdj1kW0FdO3RbeV0uc2V0KFMsdik7Y29uc3QgRT1pW21dLHo9aVt3XSxDPWlbeF0sUD1lW3ldLEY9UC5zdGFydCxCPVAuZW5kO0ZbRV09dVtFXSxGW3pdPWc/dVt6XTpmW3pdLEZbQ109Yj91W0NdOmZbel0sQltFXT1mW0VdLEJbel09Zz91W3pdOmZbel0sQltDXT1iP3VbQ106Zlt6XSx5Kyt9Zm9yKGxldCBtPTA7bTw9MTttKyspZm9yKGxldCBnPTA7Zzw9MTtnKyspZm9yKGxldCBiPTA7Yjw9MTtiKyspe3MueD1tP2YueDp1Lngscy55PWc/Zi55OnUueSxzLno9Yj9mLno6dS56LHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChzLG4pO2NvbnN0IHc9cy5kaXN0YW5jZVRvU3F1YXJlZChuKTtpZih3PHAmJihwPXcsYyYmYy5jb3B5KG4pLGwmJmwuY29weShzKSx3PGgpKXJldHVybiBNYXRoLnNxcnQodyl9Zm9yKGxldCBtPTA7bTwxMjttKyspe2NvbnN0IGc9dFttXTtmb3IobGV0IGI9MDtiPDEyO2IrKyl7Y29uc3Qgdz1lW2JdO1dvKGcsdyxuLHMpO2NvbnN0IHg9bi5kaXN0YW5jZVRvU3F1YXJlZChzKTtpZih4PHAmJihwPXgsYyYmYy5jb3B5KG4pLGwmJmwuY29weShzKSx4PGgpKXJldHVybiBNYXRoLnNxcnQoeCl9fXJldHVybiBNYXRoLnNxcnQocCl9fSgpO2NsYXNzIEpve2NvbnN0cnVjdG9yKHQpe3RoaXMuX2dldE5ld1ByaW1pdGl2ZT10LHRoaXMuX3ByaW1pdGl2ZXM9W119Z2V0UHJpbWl0aXZlKCl7Y29uc3QgdD10aGlzLl9wcmltaXRpdmVzO3JldHVybiB0Lmxlbmd0aD09PTA/dGhpcy5fZ2V0TmV3UHJpbWl0aXZlKCk6dC5wb3AoKX1yZWxlYXNlUHJpbWl0aXZlKHQpe3RoaXMuX3ByaW1pdGl2ZXMucHVzaCh0KX19Y2xhc3MgVGQgZXh0ZW5kcyBKb3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCgpPT5uZXcgZWUpfX1jb25zdCBuZT1uZXcgVGQ7Y2xhc3MgRWR7Y29uc3RydWN0b3IoKXt0aGlzLmZsb2F0MzJBcnJheT1udWxsLHRoaXMudWludDE2QXJyYXk9bnVsbCx0aGlzLnVpbnQzMkFycmF5PW51bGw7Y29uc3QgdD1bXTtsZXQgZT1udWxsO3RoaXMuc2V0QnVmZmVyPW49PntlJiZ0LnB1c2goZSksZT1uLHRoaXMuZmxvYXQzMkFycmF5PW5ldyBGbG9hdDMyQXJyYXkobiksdGhpcy51aW50MTZBcnJheT1uZXcgVWludDE2QXJyYXkobiksdGhpcy51aW50MzJBcnJheT1uZXcgVWludDMyQXJyYXkobil9LHRoaXMuY2xlYXJCdWZmZXI9KCk9PntlPW51bGwsdGhpcy5mbG9hdDMyQXJyYXk9bnVsbCx0aGlzLnVpbnQxNkFycmF5PW51bGwsdGhpcy51aW50MzJBcnJheT1udWxsLHQubGVuZ3RoIT09MCYmdGhpcy5zZXRCdWZmZXIodC5wb3AoKSl9fX1jb25zdCBldD1uZXcgRWQ7bGV0IHRuLFluO2NvbnN0IGpuPVtdLFJzPW5ldyBKbygoKT0+bmV3IG10KTtmdW5jdGlvbiBQZChpLHQsZSxuLHMscil7dG49UnMuZ2V0UHJpbWl0aXZlKCksWW49UnMuZ2V0UHJpbWl0aXZlKCksam4ucHVzaCh0bixZbiksZXQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBvPVlvKDAsaS5nZW9tZXRyeSxlLG4scyxyKTtldC5jbGVhckJ1ZmZlcigpLFJzLnJlbGVhc2VQcmltaXRpdmUodG4pLFJzLnJlbGVhc2VQcmltaXRpdmUoWW4pLGpuLnBvcCgpLGpuLnBvcCgpO2NvbnN0IGE9am4ubGVuZ3RoO3JldHVybiBhPjAmJihZbj1qblthLTFdLHRuPWpuW2EtMl0pLG99ZnVuY3Rpb24gWW8oaSx0LGUsbixzPW51bGwscj0wLG89MCl7Y29uc3R7ZmxvYXQzMkFycmF5OmEsdWludDE2QXJyYXk6Yyx1aW50MzJBcnJheTpsfT1ldDtsZXQgaD1pKjI7aWYoa3QoaCxjKSl7Y29uc3QgZj1WdChpLGwpLGQ9UXQoaCxjKTtyZXR1cm4gbHQoaSxhLHRuKSxuKGYsZCwhMSxvLHIraSx0bil9ZWxzZXtsZXQgRT1mdW5jdGlvbihDKXtjb25zdHt1aW50MTZBcnJheTpQLHVpbnQzMkFycmF5OkZ9PWV0O2xldCBCPUMqMjtmb3IoOyFrdChCLFApOylDPUt0KEMpLEI9QyoyO3JldHVybiBWdChDLEYpfSx6PWZ1bmN0aW9uKEMpe2NvbnN0e3VpbnQxNkFycmF5OlAsdWludDMyQXJyYXk6Rn09ZXQ7bGV0IEI9QyoyO2Zvcig7IWt0KEIsUCk7KUM9dGUoQyxGKSxCPUMqMjtyZXR1cm4gVnQoQyxGKStRdChCLFApfTtjb25zdCBmPUt0KGkpLGQ9dGUoaSxsKTtsZXQgcD1mLHk9ZCxtLGcsYix3O2lmKHMmJihiPXRuLHc9WW4sbHQocCxhLGIpLGx0KHksYSx3KSxtPXMoYiksZz1zKHcpLGc8bSkpe3A9ZCx5PWY7Y29uc3QgQz1tO209ZyxnPUMsYj13fWJ8fChiPXRuLGx0KHAsYSxiKSk7Y29uc3QgeD1rdChwKjIsYyksTT1lKGIseCxtLG8rMSxyK3ApO2xldCBBO2lmKE09PT1vbCl7Y29uc3QgQz1FKHApLEY9eihwKS1DO0E9bihDLEYsITAsbysxLHIrcCxiKX1lbHNlIEE9TSYmWW8ocCx0LGUsbixzLHIsbysxKTtpZihBKXJldHVybiEwO3c9WW4sbHQoeSxhLHcpO2NvbnN0IFM9a3QoeSoyLGMpLHY9ZSh3LFMsZyxvKzEscit5KTtsZXQgXztpZih2PT09b2wpe2NvbnN0IEM9RSh5KSxGPXooeSktQztfPW4oQyxGLCEwLG8rMSxyK3ksdyl9ZWxzZSBfPXYmJllvKHksdCxlLG4scyxyLG8rMSk7cmV0dXJuISFffX1jb25zdCBraT1uZXcgVCxqbz1uZXcgVDtmdW5jdGlvbiBDZChpLHQsZT17fSxuPTAscz0xLzApe2NvbnN0IHI9bipuLG89cypzO2xldCBhPTEvMCxjPW51bGw7aWYoaS5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6aD0+KGtpLmNvcHkodCkuY2xhbXAoaC5taW4saC5tYXgpLGtpLmRpc3RhbmNlVG9TcXVhcmVkKHQpKSxpbnRlcnNlY3RzQm91bmRzOihoLHUsZik9PmY8YSYmZjxvLGludGVyc2VjdHNUcmlhbmdsZTooaCx1KT0+e2guY2xvc2VzdFBvaW50VG9Qb2ludCh0LGtpKTtjb25zdCBmPXQuZGlzdGFuY2VUb1NxdWFyZWQoa2kpO3JldHVybiBmPGEmJihqby5jb3B5KGtpKSxhPWYsYz11KSxmPHJ9fSksYT09PTEvMClyZXR1cm4gbnVsbDtjb25zdCBsPU1hdGguc3FydChhKTtyZXR1cm4gZS5wb2ludD9lLnBvaW50LmNvcHkoam8pOmUucG9pbnQ9am8uY2xvbmUoKSxlLmRpc3RhbmNlPWwsZS5mYWNlSW5kZXg9YyxlfWNvbnN0IEJkPXBhcnNlSW50KEopPj0xNjkseW49bmV3IFQsbW49bmV3IFQsZ249bmV3IFQsTHM9bmV3IE4sT3M9bmV3IE4sRHM9bmV3IE4sbWw9bmV3IFQsZ2w9bmV3IFQseGw9bmV3IFQsTmk9bmV3IFQ7ZnVuY3Rpb24gRmQoaSx0LGUsbixzLHIsbyxhKXtsZXQgYztpZihyPT09MT9jPWkuaW50ZXJzZWN0VHJpYW5nbGUobixlLHQsITAscyk6Yz1pLmludGVyc2VjdFRyaWFuZ2xlKHQsZSxuLHIhPT0yLHMpLGM9PT1udWxsKXJldHVybiBudWxsO2NvbnN0IGw9aS5vcmlnaW4uZGlzdGFuY2VUbyhzKTtyZXR1cm4gbDxvfHxsPmE/bnVsbDp7ZGlzdGFuY2U6bCxwb2ludDpzLmNsb25lKCl9fWZ1bmN0aW9uIElkKGksdCxlLG4scyxyLG8sYSxjLGwsaCl7eW4uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LHIpLG1uLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxvKSxnbi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsYSk7Y29uc3QgdT1GZChpLHluLG1uLGduLE5pLGMsbCxoKTtpZih1KXtjb25zdCBmPW5ldyBUO3R0LmdldEJhcnljb29yZChOaSx5bixtbixnbixmKSxuJiYoTHMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHIpLE9zLmZyb21CdWZmZXJBdHRyaWJ1dGUobixvKSxEcy5mcm9tQnVmZmVyQXR0cmlidXRlKG4sYSksdS51dj10dC5nZXRJbnRlcnBvbGF0aW9uKE5pLHluLG1uLGduLExzLE9zLERzLG5ldyBOKSkscyYmKExzLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxyKSxPcy5mcm9tQnVmZmVyQXR0cmlidXRlKHMsbyksRHMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGEpLHUudXYxPXR0LmdldEludGVycG9sYXRpb24oTmkseW4sbW4sZ24sTHMsT3MsRHMsbmV3IE4pKSxlJiYobWwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHIpLGdsLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxvKSx4bC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsYSksdS5ub3JtYWw9dHQuZ2V0SW50ZXJwb2xhdGlvbihOaSx5bixtbixnbixtbCxnbCx4bCxuZXcgVCksdS5ub3JtYWwuZG90KGkuZGlyZWN0aW9uKT4wJiZ1Lm5vcm1hbC5tdWx0aXBseVNjYWxhcigtMSkpO2NvbnN0IGQ9e2E6cixiOm8sYzphLG5vcm1hbDpuZXcgVCxtYXRlcmlhbEluZGV4OjB9O3R0LmdldE5vcm1hbCh5bixtbixnbixkLm5vcm1hbCksdS5mYWNlPWQsdS5mYWNlSW5kZXg9cixCZCYmKHUuYmFyeWNvb3JkPWYpfXJldHVybiB1fWZ1bmN0aW9uICRzKGksdCxlLG4scyxyLG8pe2NvbnN0IGE9biozO2xldCBjPWErMCxsPWErMSxoPWErMjtjb25zdCB1PWkuaW5kZXg7aS5pbmRleCYmKGM9dS5nZXRYKGMpLGw9dS5nZXRYKGwpLGg9dS5nZXRYKGgpKTtjb25zdHtwb3NpdGlvbjpmLG5vcm1hbDpkLHV2OnAsdXYxOnl9PWkuYXR0cmlidXRlcyxtPUlkKGUsZixkLHAseSxjLGwsaCx0LHIsbyk7cmV0dXJuIG0/KG0uZmFjZUluZGV4PW4scyYmcy5wdXNoKG0pLG0pOm51bGx9ZnVuY3Rpb24gcHQoaSx0LGUsbil7Y29uc3Qgcz1pLmEscj1pLmIsbz1pLmM7bGV0IGE9dCxjPXQrMSxsPXQrMjtlJiYoYT1lLmdldFgoYSksYz1lLmdldFgoYyksbD1lLmdldFgobCkpLHMueD1uLmdldFgoYSkscy55PW4uZ2V0WShhKSxzLno9bi5nZXRaKGEpLHIueD1uLmdldFgoYyksci55PW4uZ2V0WShjKSxyLno9bi5nZXRaKGMpLG8ueD1uLmdldFgobCksby55PW4uZ2V0WShsKSxvLno9bi5nZXRaKGwpfWZ1bmN0aW9uIGtkKGksdCxlLG4scyxyLG8sYSl7Y29uc3R7Z2VvbWV0cnk6YyxfaW5kaXJlY3RCdWZmZXI6bH09aTtmb3IobGV0IGg9bix1PW4rcztoPHU7aCsrKSRzKGMsdCxlLGgscixvLGEpfWZ1bmN0aW9uIE5kKGksdCxlLG4scyxyLG8pe2NvbnN0e2dlb21ldHJ5OmEsX2luZGlyZWN0QnVmZmVyOmN9PWk7bGV0IGw9MS8wLGg9bnVsbDtmb3IobGV0IHU9bixmPW4rczt1PGY7dSsrKXtsZXQgZDtkPSRzKGEsdCxlLHUsbnVsbCxyLG8pLGQmJmQuZGlzdGFuY2U8bCYmKGg9ZCxsPWQuZGlzdGFuY2UpfXJldHVybiBofWZ1bmN0aW9uIFJkKGksdCxlLG4scyxyLG8pe2NvbnN0e2dlb21ldHJ5OmF9PWUse2luZGV4OmN9PWEsbD1hLmF0dHJpYnV0ZXMucG9zaXRpb247Zm9yKGxldCBoPWksdT10K2k7aDx1O2grKyl7bGV0IGY7aWYoZj1oLHB0KG8sZiozLGMsbCksby5uZWVkc1VwZGF0ZT0hMCxuKG8sZixzLHIpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIExkKGksdD1udWxsKXt0JiZBcnJheS5pc0FycmF5KHQpJiYodD1uZXcgU2V0KHQpKTtjb25zdCBlPWkuZ2VvbWV0cnksbj1lLmluZGV4P2UuaW5kZXguYXJyYXk6bnVsbCxzPWUuYXR0cmlidXRlcy5wb3NpdGlvbjtsZXQgcixvLGEsYyxsPTA7Y29uc3QgaD1pLl9yb290cztmb3IobGV0IGY9MCxkPWgubGVuZ3RoO2Y8ZDtmKyspcj1oW2ZdLG89bmV3IFVpbnQzMkFycmF5KHIpLGE9bmV3IFVpbnQxNkFycmF5KHIpLGM9bmV3IEZsb2F0MzJBcnJheShyKSx1KDAsbCksbCs9ci5ieXRlTGVuZ3RoO2Z1bmN0aW9uIHUoZixkLHA9ITEpe2NvbnN0IHk9ZioyO2lmKGFbeSsxNV09PT1Gcyl7Y29uc3QgZz1vW2YrNl0sYj1hW3krMTRdO2xldCB3PTEvMCx4PTEvMCxNPTEvMCxBPS0xLzAsUz0tMS8wLHY9LTEvMDtmb3IobGV0IF89MypnLEU9MyooZytiKTtfPEU7XysrKXtsZXQgej1uW19dO2NvbnN0IEM9cy5nZXRYKHopLFA9cy5nZXRZKHopLEY9cy5nZXRaKHopO0M8dyYmKHc9QyksQz5BJiYoQT1DKSxQPHgmJih4PVApLFA+UyYmKFM9UCksRjxNJiYoTT1GKSxGPnYmJih2PUYpfXJldHVybiBjW2YrMF0hPT13fHxjW2YrMV0hPT14fHxjW2YrMl0hPT1NfHxjW2YrM10hPT1BfHxjW2YrNF0hPT1TfHxjW2YrNV0hPT12PyhjW2YrMF09dyxjW2YrMV09eCxjW2YrMl09TSxjW2YrM109QSxjW2YrNF09UyxjW2YrNV09diwhMCk6ITF9ZWxzZXtjb25zdCBnPWYrOCxiPW9bZis2XSx3PWcrZCx4PWIrZDtsZXQgTT1wLEE9ITEsUz0hMTt0P018fChBPXQuaGFzKHcpLFM9dC5oYXMoeCksTT0hQSYmIVMpOihBPSEwLFM9ITApO2NvbnN0IHY9TXx8QSxfPU18fFM7bGV0IEU9ITE7diYmKEU9dShnLGQsTSkpO2xldCB6PSExO18mJih6PXUoYixkLE0pKTtjb25zdCBDPUV8fHo7aWYoQylmb3IobGV0IFA9MDtQPDM7UCsrKXtjb25zdCBGPWcrUCxCPWIrUCxJPWNbRl0sUj1jW0YrM10sJD1jW0JdLFY9Y1tCKzNdO2NbZitQXT1JPCQ/STokLGNbZitQKzNdPVI+Vj9SOlZ9cmV0dXJuIEN9fX1mdW5jdGlvbiBlbihpLHQsZSxuLHMpe2xldCByLG8sYSxjLGwsaDtjb25zdCB1PTEvZS5kaXJlY3Rpb24ueCxmPTEvZS5kaXJlY3Rpb24ueSxkPTEvZS5kaXJlY3Rpb24ueixwPWUub3JpZ2luLngseT1lLm9yaWdpbi55LG09ZS5vcmlnaW4uejtsZXQgZz10W2ldLGI9dFtpKzNdLHc9dFtpKzFdLHg9dFtpKzMrMV0sTT10W2krMl0sQT10W2krMysyXTtyZXR1cm4gdT49MD8ocj0oZy1wKSp1LG89KGItcCkqdSk6KHI9KGItcCkqdSxvPShnLXApKnUpLGY+PTA/KGE9KHcteSkqZixjPSh4LXkpKmYpOihhPSh4LXkpKmYsYz0ody15KSpmKSxyPmN8fGE+b3x8KChhPnJ8fGlzTmFOKHIpKSYmKHI9YSksKGM8b3x8aXNOYU4obykpJiYobz1jKSxkPj0wPyhsPShNLW0pKmQsaD0oQS1tKSpkKToobD0oQS1tKSpkLGg9KE0tbSkqZCkscj5ofHxsPm8pPyExOigobD5yfHxyIT09cikmJihyPWwpLChoPG98fG8hPT1vKSYmKG89aCkscjw9cyYmbz49bil9ZnVuY3Rpb24gT2QoaSx0LGUsbixzLHIsbyxhKXtjb25zdHtnZW9tZXRyeTpjLF9pbmRpcmVjdEJ1ZmZlcjpsfT1pO2ZvcihsZXQgaD1uLHU9bitzO2g8dTtoKyspe2xldCBmPWw/bFtoXTpoOyRzKGMsdCxlLGYscixvLGEpfX1mdW5jdGlvbiBEZChpLHQsZSxuLHMscixvKXtjb25zdHtnZW9tZXRyeTphLF9pbmRpcmVjdEJ1ZmZlcjpjfT1pO2xldCBsPTEvMCxoPW51bGw7Zm9yKGxldCB1PW4sZj1uK3M7dTxmO3UrKyl7bGV0IGQ7ZD0kcyhhLHQsZSxjP2NbdV06dSxudWxsLHIsbyksZCYmZC5kaXN0YW5jZTxsJiYoaD1kLGw9ZC5kaXN0YW5jZSl9cmV0dXJuIGh9ZnVuY3Rpb24gJGQoaSx0LGUsbixzLHIsbyl7Y29uc3R7Z2VvbWV0cnk6YX09ZSx7aW5kZXg6Y309YSxsPWEuYXR0cmlidXRlcy5wb3NpdGlvbjtmb3IobGV0IGg9aSx1PXQraTtoPHU7aCsrKXtsZXQgZjtpZihmPWUucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoaCkscHQobyxmKjMsYyxsKSxvLm5lZWRzVXBkYXRlPSEwLG4obyxmLHMscikpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gVmQoaSx0LGUsbixzLHIsbyl7ZXQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKSxRbygwLGksZSxuLHMscixvKSxldC5jbGVhckJ1ZmZlcigpfWZ1bmN0aW9uIFFvKGksdCxlLG4scyxyLG8pe2NvbnN0e2Zsb2F0MzJBcnJheTphLHVpbnQxNkFycmF5OmMsdWludDMyQXJyYXk6bH09ZXQsaD1pKjI7aWYoa3QoaCxjKSl7Y29uc3QgZj1WdChpLGwpLGQ9UXQoaCxjKTtrZCh0LGUsbixmLGQscyxyLG8pfWVsc2V7Y29uc3QgZj1LdChpKTtlbihmLGEsbixyLG8pJiZRbyhmLHQsZSxuLHMscixvKTtjb25zdCBkPXRlKGksbCk7ZW4oZCxhLG4scixvKSYmUW8oZCx0LGUsbixzLHIsbyl9fWNvbnN0IFVkPVsieCIsInkiLCJ6Il07ZnVuY3Rpb24gcWQoaSx0LGUsbixzLHIpe2V0LnNldEJ1ZmZlcihpLl9yb290c1t0XSk7Y29uc3Qgbz1LbygwLGksZSxuLHMscik7cmV0dXJuIGV0LmNsZWFyQnVmZmVyKCksb31mdW5jdGlvbiBLbyhpLHQsZSxuLHMscil7Y29uc3R7ZmxvYXQzMkFycmF5Om8sdWludDE2QXJyYXk6YSx1aW50MzJBcnJheTpjfT1ldDtsZXQgbD1pKjI7aWYoa3QobCxhKSl7Y29uc3QgdT1WdChpLGMpLGY9UXQobCxhKTtyZXR1cm4gTmQodCxlLG4sdSxmLHMscil9ZWxzZXtjb25zdCB1PWRsKGksYyksZj1VZFt1XSxwPW4uZGlyZWN0aW9uW2ZdPj0wO2xldCB5LG07cD8oeT1LdChpKSxtPXRlKGksYykpOih5PXRlKGksYyksbT1LdChpKSk7Y29uc3QgYj1lbih5LG8sbixzLHIpP0tvKHksdCxlLG4scyxyKTpudWxsO2lmKGIpe2NvbnN0IE09Yi5wb2ludFtmXTtpZihwP008PW9bbSt1XTpNPj1vW20rdSszXSlyZXR1cm4gYn1jb25zdCB4PWVuKG0sbyxuLHMscik/S28obSx0LGUsbixzLHIpOm51bGw7cmV0dXJuIGImJng/Yi5kaXN0YW5jZTw9eC5kaXN0YW5jZT9iOng6Ynx8eHx8bnVsbH19Y29uc3QgVnM9bmV3IG10LFFuPW5ldyBlZSxLbj1uZXcgZWUsUmk9bmV3IHN0LHdsPW5ldyB6dCxVcz1uZXcgenQ7ZnVuY3Rpb24gSGQoaSx0LGUsbil7ZXQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBzPXRhKDAsaSxlLG4pO3JldHVybiBldC5jbGVhckJ1ZmZlcigpLHN9ZnVuY3Rpb24gdGEoaSx0LGUsbixzPW51bGwpe2NvbnN0e2Zsb2F0MzJBcnJheTpyLHVpbnQxNkFycmF5Om8sdWludDMyQXJyYXk6YX09ZXQ7bGV0IGM9aSoyO2lmKHM9PT1udWxsJiYoZS5ib3VuZGluZ0JveHx8ZS5jb21wdXRlQm91bmRpbmdCb3goKSx3bC5zZXQoZS5ib3VuZGluZ0JveC5taW4sZS5ib3VuZGluZ0JveC5tYXgsbikscz13bCksa3QoYyxvKSl7Y29uc3QgaD10Lmdlb21ldHJ5LHU9aC5pbmRleCxmPWguYXR0cmlidXRlcy5wb3NpdGlvbixkPWUuaW5kZXgscD1lLmF0dHJpYnV0ZXMucG9zaXRpb24seT1WdChpLGEpLG09UXQoYyxvKTtpZihSaS5jb3B5KG4pLmludmVydCgpLGUuYm91bmRzVHJlZSlyZXR1cm4gbHQoaSxyLFVzKSxVcy5tYXRyaXguY29weShSaSksVXMubmVlZHNVcGRhdGU9ITAsZS5ib3VuZHNUcmVlLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczpiPT5Vcy5pbnRlcnNlY3RzQm94KGIpLGludGVyc2VjdHNUcmlhbmdsZTpiPT57Yi5hLmFwcGx5TWF0cml4NChuKSxiLmIuYXBwbHlNYXRyaXg0KG4pLGIuYy5hcHBseU1hdHJpeDQobiksYi5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHc9eSozLHg9KG0reSkqMzt3PHg7dys9MylpZihwdChLbix3LHUsZiksS24ubmVlZHNVcGRhdGU9ITAsYi5pbnRlcnNlY3RzVHJpYW5nbGUoS24pKXJldHVybiEwO3JldHVybiExfX0pO2ZvcihsZXQgZz15KjMsYj0obSt5KSozO2c8YjtnKz0zKXtwdChRbixnLHUsZiksUW4uYS5hcHBseU1hdHJpeDQoUmkpLFFuLmIuYXBwbHlNYXRyaXg0KFJpKSxRbi5jLmFwcGx5TWF0cml4NChSaSksUW4ubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCB3PTAseD1kLmNvdW50O3c8eDt3Kz0zKWlmKHB0KEtuLHcsZCxwKSxLbi5uZWVkc1VwZGF0ZT0hMCxRbi5pbnRlcnNlY3RzVHJpYW5nbGUoS24pKXJldHVybiEwfX1lbHNle2NvbnN0IGg9aSs4LHU9YVtpKzZdO3JldHVybiBsdChoLHIsVnMpLCEhKHMuaW50ZXJzZWN0c0JveChWcykmJnRhKGgsdCxlLG4scyl8fChsdCh1LHIsVnMpLHMuaW50ZXJzZWN0c0JveChWcykmJnRhKHUsdCxlLG4scykpKX19Y29uc3QgcXM9bmV3IHN0LGVhPW5ldyB6dCxMaT1uZXcgenQsWGQ9bmV3IFQsR2Q9bmV3IFQsV2Q9bmV3IFQsWmQ9bmV3IFQ7ZnVuY3Rpb24gSmQoaSx0LGUsbj17fSxzPXt9LHI9MCxvPTEvMCl7dC5ib3VuZGluZ0JveHx8dC5jb21wdXRlQm91bmRpbmdCb3goKSxlYS5zZXQodC5ib3VuZGluZ0JveC5taW4sdC5ib3VuZGluZ0JveC5tYXgsZSksZWEubmVlZHNVcGRhdGU9ITA7Y29uc3QgYT1pLmdlb21ldHJ5LGM9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9YS5pbmRleCxoPXQuYXR0cmlidXRlcy5wb3NpdGlvbix1PXQuaW5kZXgsZj1uZS5nZXRQcmltaXRpdmUoKSxkPW5lLmdldFByaW1pdGl2ZSgpO2xldCBwPVhkLHk9R2QsbT1udWxsLGc9bnVsbDtzJiYobT1XZCxnPVpkKTtsZXQgYj0xLzAsdz1udWxsLHg9bnVsbDtyZXR1cm4gcXMuY29weShlKS5pbnZlcnQoKSxMaS5tYXRyaXguY29weShxcyksaS5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6TT0+ZWEuZGlzdGFuY2VUb0JveChNKSxpbnRlcnNlY3RzQm91bmRzOihNLEEsUyk9PlM8YiYmUzxvPyhBJiYoTGkubWluLmNvcHkoTS5taW4pLExpLm1heC5jb3B5KE0ubWF4KSxMaS5uZWVkc1VwZGF0ZT0hMCksITApOiExLGludGVyc2VjdHNSYW5nZTooTSxBKT0+e2lmKHQuYm91bmRzVHJlZSlyZXR1cm4gdC5ib3VuZHNUcmVlLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjp2PT5MaS5kaXN0YW5jZVRvQm94KHYpLGludGVyc2VjdHNCb3VuZHM6KHYsXyxFKT0+RTxiJiZFPG8saW50ZXJzZWN0c1JhbmdlOih2LF8pPT57Zm9yKGxldCBFPXYsej12K187RTx6O0UrKyl7cHQoZCwzKkUsdSxoKSxkLmEuYXBwbHlNYXRyaXg0KGUpLGQuYi5hcHBseU1hdHJpeDQoZSksZC5jLmFwcGx5TWF0cml4NChlKSxkLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgQz1NLFA9TStBO0M8UDtDKyspe3B0KGYsMypDLGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBGPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxtKTtpZihGPGImJih5LmNvcHkocCksZyYmZy5jb3B5KG0pLGI9Rix3PUMseD1FKSxGPHIpcmV0dXJuITB9fX19KTt7Y29uc3QgUz1Kbih0KTtmb3IobGV0IHY9MCxfPVM7djxfO3YrKyl7cHQoZCwzKnYsdSxoKSxkLmEuYXBwbHlNYXRyaXg0KGUpLGQuYi5hcHBseU1hdHJpeDQoZSksZC5jLmFwcGx5TWF0cml4NChlKSxkLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgRT1NLHo9TStBO0U8ejtFKyspe3B0KGYsMypFLGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBDPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxtKTtpZihDPGImJih5LmNvcHkocCksZyYmZy5jb3B5KG0pLGI9Qyx3PUUseD12KSxDPHIpcmV0dXJuITB9fX19fSksbmUucmVsZWFzZVByaW1pdGl2ZShmKSxuZS5yZWxlYXNlUHJpbWl0aXZlKGQpLGI9PT0xLzA/bnVsbDoobi5wb2ludD9uLnBvaW50LmNvcHkoeSk6bi5wb2ludD15LmNsb25lKCksbi5kaXN0YW5jZT1iLG4uZmFjZUluZGV4PXcscyYmKHMucG9pbnQ/cy5wb2ludC5jb3B5KGcpOnMucG9pbnQ9Zy5jbG9uZSgpLHMucG9pbnQuYXBwbHlNYXRyaXg0KHFzKSx5LmFwcGx5TWF0cml4NChxcykscy5kaXN0YW5jZT15LnN1YihzLnBvaW50KS5sZW5ndGgoKSxzLmZhY2VJbmRleD14KSxuKX1mdW5jdGlvbiBZZChpLHQ9bnVsbCl7dCYmQXJyYXkuaXNBcnJheSh0KSYmKHQ9bmV3IFNldCh0KSk7Y29uc3QgZT1pLmdlb21ldHJ5LG49ZS5pbmRleD9lLmluZGV4LmFycmF5Om51bGwscz1lLmF0dHJpYnV0ZXMucG9zaXRpb247bGV0IHIsbyxhLGMsbD0wO2NvbnN0IGg9aS5fcm9vdHM7Zm9yKGxldCBmPTAsZD1oLmxlbmd0aDtmPGQ7ZisrKXI9aFtmXSxvPW5ldyBVaW50MzJBcnJheShyKSxhPW5ldyBVaW50MTZBcnJheShyKSxjPW5ldyBGbG9hdDMyQXJyYXkociksdSgwLGwpLGwrPXIuYnl0ZUxlbmd0aDtmdW5jdGlvbiB1KGYsZCxwPSExKXtjb25zdCB5PWYqMjtpZihhW3krMTVdPT09RnMpe2NvbnN0IGc9b1tmKzZdLGI9YVt5KzE0XTtsZXQgdz0xLzAseD0xLzAsTT0xLzAsQT0tMS8wLFM9LTEvMCx2PS0xLzA7Zm9yKGxldCBfPWcsRT1nK2I7XzxFO18rKyl7Y29uc3Qgej0zKmkucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoXyk7Zm9yKGxldCBDPTA7QzwzO0MrKyl7bGV0IFA9eitDO1A9bj9uW1BdOlA7Y29uc3QgRj1zLmdldFgoUCksQj1zLmdldFkoUCksST1zLmdldFooUCk7Rjx3JiYodz1GKSxGPkEmJihBPUYpLEI8eCYmKHg9QiksQj5TJiYoUz1CKSxJPE0mJihNPUkpLEk+diYmKHY9SSl9fXJldHVybiBjW2YrMF0hPT13fHxjW2YrMV0hPT14fHxjW2YrMl0hPT1NfHxjW2YrM10hPT1BfHxjW2YrNF0hPT1TfHxjW2YrNV0hPT12PyhjW2YrMF09dyxjW2YrMV09eCxjW2YrMl09TSxjW2YrM109QSxjW2YrNF09UyxjW2YrNV09diwhMCk6ITF9ZWxzZXtjb25zdCBnPWYrOCxiPW9bZis2XSx3PWcrZCx4PWIrZDtsZXQgTT1wLEE9ITEsUz0hMTt0P018fChBPXQuaGFzKHcpLFM9dC5oYXMoeCksTT0hQSYmIVMpOihBPSEwLFM9ITApO2NvbnN0IHY9TXx8QSxfPU18fFM7bGV0IEU9ITE7diYmKEU9dShnLGQsTSkpO2xldCB6PSExO18mJih6PXUoYixkLE0pKTtjb25zdCBDPUV8fHo7aWYoQylmb3IobGV0IFA9MDtQPDM7UCsrKXtjb25zdCBGPWcrUCxCPWIrUCxJPWNbRl0sUj1jW0YrM10sJD1jW0JdLFY9Y1tCKzNdO2NbZitQXT1JPCQ/STokLGNbZitQKzNdPVI+Vj9SOlZ9cmV0dXJuIEN9fX1mdW5jdGlvbiBqZChpLHQsZSxuLHMscixvKXtldC5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pLG5hKDAsaSxlLG4scyxyLG8pLGV0LmNsZWFyQnVmZmVyKCl9ZnVuY3Rpb24gbmEoaSx0LGUsbixzLHIsbyl7Y29uc3R7ZmxvYXQzMkFycmF5OmEsdWludDE2QXJyYXk6Yyx1aW50MzJBcnJheTpsfT1ldCxoPWkqMjtpZihrdChoLGMpKXtjb25zdCBmPVZ0KGksbCksZD1RdChoLGMpO09kKHQsZSxuLGYsZCxzLHIsbyl9ZWxzZXtjb25zdCBmPUt0KGkpO2VuKGYsYSxuLHIsbykmJm5hKGYsdCxlLG4scyxyLG8pO2NvbnN0IGQ9dGUoaSxsKTtlbihkLGEsbixyLG8pJiZuYShkLHQsZSxuLHMscixvKX19Y29uc3QgUWQ9WyJ4IiwieSIsInoiXTtmdW5jdGlvbiBLZChpLHQsZSxuLHMscil7ZXQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBvPWlhKDAsaSxlLG4scyxyKTtyZXR1cm4gZXQuY2xlYXJCdWZmZXIoKSxvfWZ1bmN0aW9uIGlhKGksdCxlLG4scyxyKXtjb25zdHtmbG9hdDMyQXJyYXk6byx1aW50MTZBcnJheTphLHVpbnQzMkFycmF5OmN9PWV0O2xldCBsPWkqMjtpZihrdChsLGEpKXtjb25zdCB1PVZ0KGksYyksZj1RdChsLGEpO3JldHVybiBEZCh0LGUsbix1LGYscyxyKX1lbHNle2NvbnN0IHU9ZGwoaSxjKSxmPVFkW3VdLHA9bi5kaXJlY3Rpb25bZl0+PTA7bGV0IHksbTtwPyh5PUt0KGkpLG09dGUoaSxjKSk6KHk9dGUoaSxjKSxtPUt0KGkpKTtjb25zdCBiPWVuKHksbyxuLHMscik/aWEoeSx0LGUsbixzLHIpOm51bGw7aWYoYil7Y29uc3QgTT1iLnBvaW50W2ZdO2lmKHA/TTw9b1ttK3VdOk0+PW9bbSt1KzNdKXJldHVybiBifWNvbnN0IHg9ZW4obSxvLG4scyxyKT9pYShtLHQsZSxuLHMscik6bnVsbDtyZXR1cm4gYiYmeD9iLmRpc3RhbmNlPD14LmRpc3RhbmNlP2I6eDpifHx4fHxudWxsfX1jb25zdCBIcz1uZXcgbXQsdGk9bmV3IGVlLGVpPW5ldyBlZSxPaT1uZXcgc3QsYmw9bmV3IHp0LFhzPW5ldyB6dDtmdW5jdGlvbiB0MChpLHQsZSxuKXtldC5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pO2NvbnN0IHM9c2EoMCxpLGUsbik7cmV0dXJuIGV0LmNsZWFyQnVmZmVyKCksc31mdW5jdGlvbiBzYShpLHQsZSxuLHM9bnVsbCl7Y29uc3R7ZmxvYXQzMkFycmF5OnIsdWludDE2QXJyYXk6byx1aW50MzJBcnJheTphfT1ldDtsZXQgYz1pKjI7aWYocz09PW51bGwmJihlLmJvdW5kaW5nQm94fHxlLmNvbXB1dGVCb3VuZGluZ0JveCgpLGJsLnNldChlLmJvdW5kaW5nQm94Lm1pbixlLmJvdW5kaW5nQm94Lm1heCxuKSxzPWJsKSxrdChjLG8pKXtjb25zdCBoPXQuZ2VvbWV0cnksdT1oLmluZGV4LGY9aC5hdHRyaWJ1dGVzLnBvc2l0aW9uLGQ9ZS5pbmRleCxwPWUuYXR0cmlidXRlcy5wb3NpdGlvbix5PVZ0KGksYSksbT1RdChjLG8pO2lmKE9pLmNvcHkobikuaW52ZXJ0KCksZS5ib3VuZHNUcmVlKXJldHVybiBsdChpLHIsWHMpLFhzLm1hdHJpeC5jb3B5KE9pKSxYcy5uZWVkc1VwZGF0ZT0hMCxlLmJvdW5kc1RyZWUuc2hhcGVjYXN0KHtpbnRlcnNlY3RzQm91bmRzOmI9PlhzLmludGVyc2VjdHNCb3goYiksaW50ZXJzZWN0c1RyaWFuZ2xlOmI9PntiLmEuYXBwbHlNYXRyaXg0KG4pLGIuYi5hcHBseU1hdHJpeDQobiksYi5jLmFwcGx5TWF0cml4NChuKSxiLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgdz15LHg9bSt5O3c8eDt3KyspaWYocHQoZWksMyp0LnJlc29sdmVUcmlhbmdsZUluZGV4KHcpLHUsZiksZWkubmVlZHNVcGRhdGU9ITAsYi5pbnRlcnNlY3RzVHJpYW5nbGUoZWkpKXJldHVybiEwO3JldHVybiExfX0pO2ZvcihsZXQgZz15LGI9bSt5O2c8YjtnKyspe2NvbnN0IHc9dC5yZXNvbHZlVHJpYW5nbGVJbmRleChnKTtwdCh0aSwzKncsdSxmKSx0aS5hLmFwcGx5TWF0cml4NChPaSksdGkuYi5hcHBseU1hdHJpeDQoT2kpLHRpLmMuYXBwbHlNYXRyaXg0KE9pKSx0aS5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHg9MCxNPWQuY291bnQ7eDxNO3grPTMpaWYocHQoZWkseCxkLHApLGVpLm5lZWRzVXBkYXRlPSEwLHRpLmludGVyc2VjdHNUcmlhbmdsZShlaSkpcmV0dXJuITB9fWVsc2V7Y29uc3QgaD1pKzgsdT1hW2krNl07cmV0dXJuIGx0KGgscixIcyksISEocy5pbnRlcnNlY3RzQm94KEhzKSYmc2EoaCx0LGUsbixzKXx8KGx0KHUscixIcykscy5pbnRlcnNlY3RzQm94KEhzKSYmc2EodSx0LGUsbixzKSkpfX1jb25zdCBHcz1uZXcgc3QscmE9bmV3IHp0LERpPW5ldyB6dCxlMD1uZXcgVCxuMD1uZXcgVCxpMD1uZXcgVCxzMD1uZXcgVDtmdW5jdGlvbiByMChpLHQsZSxuPXt9LHM9e30scj0wLG89MS8wKXt0LmJvdW5kaW5nQm94fHx0LmNvbXB1dGVCb3VuZGluZ0JveCgpLHJhLnNldCh0LmJvdW5kaW5nQm94Lm1pbix0LmJvdW5kaW5nQm94Lm1heCxlKSxyYS5uZWVkc1VwZGF0ZT0hMDtjb25zdCBhPWkuZ2VvbWV0cnksYz1hLmF0dHJpYnV0ZXMucG9zaXRpb24sbD1hLmluZGV4LGg9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLHU9dC5pbmRleCxmPW5lLmdldFByaW1pdGl2ZSgpLGQ9bmUuZ2V0UHJpbWl0aXZlKCk7bGV0IHA9ZTAseT1uMCxtPW51bGwsZz1udWxsO3MmJihtPWkwLGc9czApO2xldCBiPTEvMCx3PW51bGwseD1udWxsO3JldHVybiBHcy5jb3B5KGUpLmludmVydCgpLERpLm1hdHJpeC5jb3B5KEdzKSxpLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpNPT5yYS5kaXN0YW5jZVRvQm94KE0pLGludGVyc2VjdHNCb3VuZHM6KE0sQSxTKT0+UzxiJiZTPG8/KEEmJihEaS5taW4uY29weShNLm1pbiksRGkubWF4LmNvcHkoTS5tYXgpLERpLm5lZWRzVXBkYXRlPSEwKSwhMCk6ITEsaW50ZXJzZWN0c1JhbmdlOihNLEEpPT57aWYodC5ib3VuZHNUcmVlKXtjb25zdCBTPXQuYm91bmRzVHJlZTtyZXR1cm4gUy5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6dj0+RGkuZGlzdGFuY2VUb0JveCh2KSxpbnRlcnNlY3RzQm91bmRzOih2LF8sRSk9PkU8YiYmRTxvLGludGVyc2VjdHNSYW5nZToodixfKT0+e2ZvcihsZXQgRT12LHo9ditfO0U8ejtFKyspe2NvbnN0IEM9Uy5yZXNvbHZlVHJpYW5nbGVJbmRleChFKTtwdChkLDMqQyx1LGgpLGQuYS5hcHBseU1hdHJpeDQoZSksZC5iLmFwcGx5TWF0cml4NChlKSxkLmMuYXBwbHlNYXRyaXg0KGUpLGQubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBQPU0sRj1NK0E7UDxGO1ArKyl7Y29uc3QgQj1pLnJlc29sdmVUcmlhbmdsZUluZGV4KFApO3B0KGYsMypCLGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBJPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxtKTtpZihJPGImJih5LmNvcHkocCksZyYmZy5jb3B5KG0pLGI9SSx3PVAseD1FKSxJPHIpcmV0dXJuITB9fX19KX1lbHNle2NvbnN0IFM9Sm4odCk7Zm9yKGxldCB2PTAsXz1TO3Y8Xzt2Kyspe3B0KGQsMyp2LHUsaCksZC5hLmFwcGx5TWF0cml4NChlKSxkLmIuYXBwbHlNYXRyaXg0KGUpLGQuYy5hcHBseU1hdHJpeDQoZSksZC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IEU9TSx6PU0rQTtFPHo7RSsrKXtjb25zdCBDPWkucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoRSk7cHQoZiwzKkMsbCxjKSxmLm5lZWRzVXBkYXRlPSEwO2NvbnN0IFA9Zi5kaXN0YW5jZVRvVHJpYW5nbGUoZCxwLG0pO2lmKFA8YiYmKHkuY29weShwKSxnJiZnLmNvcHkobSksYj1QLHc9RSx4PXYpLFA8cilyZXR1cm4hMH19fX19KSxuZS5yZWxlYXNlUHJpbWl0aXZlKGYpLG5lLnJlbGVhc2VQcmltaXRpdmUoZCksYj09PTEvMD9udWxsOihuLnBvaW50P24ucG9pbnQuY29weSh5KTpuLnBvaW50PXkuY2xvbmUoKSxuLmRpc3RhbmNlPWIsbi5mYWNlSW5kZXg9dyxzJiYocy5wb2ludD9zLnBvaW50LmNvcHkoZyk6cy5wb2ludD1nLmNsb25lKCkscy5wb2ludC5hcHBseU1hdHJpeDQoR3MpLHkuYXBwbHlNYXRyaXg0KEdzKSxzLmRpc3RhbmNlPXkuc3ViKHMucG9pbnQpLmxlbmd0aCgpLHMuZmFjZUluZGV4PXgpLG4pfWZ1bmN0aW9uIG8wKCl7cmV0dXJuIHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciE9InVuZGVmaW5lZCJ9Y29uc3QgJGk9bmV3IGV0LmNvbnN0cnVjdG9yLFdzPW5ldyBldC5jb25zdHJ1Y3Rvcixubj1uZXcgSm8oKCk9Pm5ldyBtdCksbmk9bmV3IG10LGlpPW5ldyBtdCxvYT1uZXcgbXQsYWE9bmV3IG10O2xldCBjYT0hMTtmdW5jdGlvbiBhMChpLHQsZSxuKXtpZihjYSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IFJlY3Vyc2l2ZSBjYWxscyB0byBidmhjYXN0IG5vdCBzdXBwb3J0ZWQuIik7Y2E9ITA7Y29uc3Qgcz1pLl9yb290cyxyPXQuX3Jvb3RzO2xldCBvLGE9MCxjPTA7Y29uc3QgbD1uZXcgc3QoKS5jb3B5KGUpLmludmVydCgpO2ZvcihsZXQgaD0wLHU9cy5sZW5ndGg7aDx1O2grKyl7JGkuc2V0QnVmZmVyKHNbaF0pLGM9MDtjb25zdCBmPW5uLmdldFByaW1pdGl2ZSgpO2x0KDAsJGkuZmxvYXQzMkFycmF5LGYpLGYuYXBwbHlNYXRyaXg0KGwpO2ZvcihsZXQgZD0wLHA9ci5sZW5ndGg7ZDxwJiYoV3Muc2V0QnVmZmVyKHJbZF0pLG89dWUoMCwwLGUsbCxuLGEsYywwLDAsZiksV3MuY2xlYXJCdWZmZXIoKSxjKz1yW2RdLmxlbmd0aCwhbyk7ZCsrKTtpZihubi5yZWxlYXNlUHJpbWl0aXZlKGYpLCRpLmNsZWFyQnVmZmVyKCksYSs9c1toXS5sZW5ndGgsbylicmVha31yZXR1cm4gY2E9ITEsb31mdW5jdGlvbiB1ZShpLHQsZSxuLHMscj0wLG89MCxhPTAsYz0wLGw9bnVsbCxoPSExKXtsZXQgdSxmO2g/KHU9V3MsZj0kaSk6KHU9JGksZj1Xcyk7Y29uc3QgZD11LmZsb2F0MzJBcnJheSxwPXUudWludDMyQXJyYXkseT11LnVpbnQxNkFycmF5LG09Zi5mbG9hdDMyQXJyYXksZz1mLnVpbnQzMkFycmF5LGI9Zi51aW50MTZBcnJheSx3PWkqMix4PXQqMixNPWt0KHcseSksQT1rdCh4LGIpO2xldCBTPSExO2lmKEEmJk0paD9TPXMoVnQodCxnKSxRdCh0KjIsYiksVnQoaSxwKSxRdChpKjIseSksYyxvK3QsYSxyK2kpOlM9cyhWdChpLHApLFF0KGkqMix5KSxWdCh0LGcpLFF0KHQqMixiKSxhLHIraSxjLG8rdCk7ZWxzZSBpZihBKXtjb25zdCB2PW5uLmdldFByaW1pdGl2ZSgpO2x0KHQsbSx2KSx2LmFwcGx5TWF0cml4NChlKTtjb25zdCBfPUt0KGkpLEU9dGUoaSxwKTtsdChfLGQsbmkpLGx0KEUsZCxpaSk7Y29uc3Qgej12LmludGVyc2VjdHNCb3gobmkpLEM9di5pbnRlcnNlY3RzQm94KGlpKTtTPXomJnVlKHQsXyxuLGUscyxvLHIsYyxhKzEsdiwhaCl8fEMmJnVlKHQsRSxuLGUscyxvLHIsYyxhKzEsdiwhaCksbm4ucmVsZWFzZVByaW1pdGl2ZSh2KX1lbHNle2NvbnN0IHY9S3QodCksXz10ZSh0LGcpO2x0KHYsbSxvYSksbHQoXyxtLGFhKTtjb25zdCBFPWwuaW50ZXJzZWN0c0JveChvYSksej1sLmludGVyc2VjdHNCb3goYWEpO2lmKEUmJnopUz11ZShpLHYsZSxuLHMscixvLGEsYysxLGwsaCl8fHVlKGksXyxlLG4scyxyLG8sYSxjKzEsbCxoKTtlbHNlIGlmKEUpaWYoTSlTPXVlKGksdixlLG4scyxyLG8sYSxjKzEsbCxoKTtlbHNle2NvbnN0IEM9bm4uZ2V0UHJpbWl0aXZlKCk7Qy5jb3B5KG9hKS5hcHBseU1hdHJpeDQoZSk7Y29uc3QgUD1LdChpKSxGPXRlKGkscCk7bHQoUCxkLG5pKSxsdChGLGQsaWkpO2NvbnN0IEI9Qy5pbnRlcnNlY3RzQm94KG5pKSxJPUMuaW50ZXJzZWN0c0JveChpaSk7Uz1CJiZ1ZSh2LFAsbixlLHMsbyxyLGMsYSsxLEMsIWgpfHxJJiZ1ZSh2LEYsbixlLHMsbyxyLGMsYSsxLEMsIWgpLG5uLnJlbGVhc2VQcmltaXRpdmUoQyl9ZWxzZSBpZih6KWlmKE0pUz11ZShpLF8sZSxuLHMscixvLGEsYysxLGwsaCk7ZWxzZXtjb25zdCBDPW5uLmdldFByaW1pdGl2ZSgpO0MuY29weShhYSkuYXBwbHlNYXRyaXg0KGUpO2NvbnN0IFA9S3QoaSksRj10ZShpLHApO2x0KFAsZCxuaSksbHQoRixkLGlpKTtjb25zdCBCPUMuaW50ZXJzZWN0c0JveChuaSksST1DLmludGVyc2VjdHNCb3goaWkpO1M9QiYmdWUoXyxQLG4sZSxzLG8scixjLGErMSxDLCFoKXx8SSYmdWUoXyxGLG4sZSxzLG8scixjLGErMSxDLCFoKSxubi5yZWxlYXNlUHJpbWl0aXZlKEMpfX1yZXR1cm4gU31jb25zdCBacz1uZXcgenQsTWw9bmV3IG10LGMwPXtzdHJhdGVneTpybCxtYXhEZXB0aDo0MCxtYXhMZWFmVHJpczoxMCx1c2VTaGFyZWRBcnJheUJ1ZmZlcjohMSxzZXRCb3VuZGluZ0JveDohMCxvblByb2dyZXNzOm51bGwsaW5kaXJlY3Q6ITEsdmVyYm9zZTohMCxyYW5nZTpudWxsfTtjbGFzcyBsYXtzdGF0aWMgc2VyaWFsaXplKHQsZT17fSl7ZT1GdCh7Y2xvbmVCdWZmZXJzOiEwfSxlKTtjb25zdCBuPXQuZ2VvbWV0cnkscz10Ll9yb290cyxyPXQuX2luZGlyZWN0QnVmZmVyLG89bi5nZXRJbmRleCgpO2xldCBhO3JldHVybiBlLmNsb25lQnVmZmVycz9hPXtyb290czpzLm1hcChjPT5jLnNsaWNlKCkpLGluZGV4Om8/by5hcnJheS5zbGljZSgpOm51bGwsaW5kaXJlY3RCdWZmZXI6cj9yLnNsaWNlKCk6bnVsbH06YT17cm9vdHM6cyxpbmRleDpvP28uYXJyYXk6bnVsbCxpbmRpcmVjdEJ1ZmZlcjpyfSxhfXN0YXRpYyBkZXNlcmlhbGl6ZSh0LGUsbj17fSl7bj1GdCh7c2V0SW5kZXg6ITAsaW5kaXJlY3Q6ISF0LmluZGlyZWN0QnVmZmVyfSxuKTtjb25zdHtpbmRleDpzLHJvb3RzOnIsaW5kaXJlY3RCdWZmZXI6b309dCxhPW5ldyBsYShlLFdlKEZ0KHt9LG4pLHtbVW9dOiEwfSkpO2lmKGEuX3Jvb3RzPXIsYS5faW5kaXJlY3RCdWZmZXI9b3x8bnVsbCxuLnNldEluZGV4KXtjb25zdCBjPWUuZ2V0SW5kZXgoKTtpZihjPT09bnVsbCl7Y29uc3QgbD1uZXcgZ3QodC5pbmRleCwxLCExKTtlLnNldEluZGV4KGwpfWVsc2UgYy5hcnJheSE9PXMmJihjLmFycmF5LnNldChzKSxjLm5lZWRzVXBkYXRlPSEwKX1yZXR1cm4gYX1nZXQgaW5kaXJlY3QoKXtyZXR1cm4hIXRoaXMuX2luZGlyZWN0QnVmZmVyfWNvbnN0cnVjdG9yKHQsZT17fSl7aWYodC5pc0J1ZmZlckdlb21ldHJ5KXtpZih0LmluZGV4JiZ0LmluZGV4LmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgaW5kZXggYXR0cmlidXRlLiIpfWVsc2UgdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBPbmx5IEJ1ZmZlckdlb21ldHJpZXMgYXJlIHN1cHBvcnRlZC4iKTtpZihlPU9iamVjdC5hc3NpZ24oV2UoRnQoe30sYzApLHtbVW9dOiExfSksZSksZS51c2VTaGFyZWRBcnJheUJ1ZmZlciYmIW8wKCkpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYXZhaWxhYmxlLiIpO3RoaXMuZ2VvbWV0cnk9dCx0aGlzLl9yb290cz1udWxsLHRoaXMuX2luZGlyZWN0QnVmZmVyPW51bGwsZVtVb118fChTZCh0aGlzLGUpLCF0LmJvdW5kaW5nQm94JiZlLnNldEJvdW5kaW5nQm94JiYodC5ib3VuZGluZ0JveD10aGlzLmdldEJvdW5kaW5nQm94KG5ldyBtdCkpKSx0aGlzLnJlc29sdmVUcmlhbmdsZUluZGV4PWUuaW5kaXJlY3Q/bj0+dGhpcy5faW5kaXJlY3RCdWZmZXJbbl06bj0+bn1yZWZpdCh0PW51bGwpe3JldHVybih0aGlzLmluZGlyZWN0P1lkOkxkKSh0aGlzLHQpfXRyYXZlcnNlKHQsZT0wKXtjb25zdCBuPXRoaXMuX3Jvb3RzW2VdLHM9bmV3IFVpbnQzMkFycmF5KG4pLHI9bmV3IFVpbnQxNkFycmF5KG4pO28oMCk7ZnVuY3Rpb24gbyhhLGM9MCl7Y29uc3QgbD1hKjIsaD1yW2wrMTVdPT09RnM7aWYoaCl7Y29uc3QgdT1zW2ErNl0sZj1yW2wrMTRdO3QoYyxoLG5ldyBGbG9hdDMyQXJyYXkobixhKjQsNiksdSxmKX1lbHNle2NvbnN0IHU9YStCaS80LGY9c1thKzZdLGQ9c1thKzddO3QoYyxoLG5ldyBGbG9hdDMyQXJyYXkobixhKjQsNiksZCl8fChvKHUsYysxKSxvKGYsYysxKSl9fX1yYXljYXN0KHQsZT0wLG49MCxzPTEvMCl7Y29uc3Qgcj10aGlzLl9yb290cyxvPXRoaXMuZ2VvbWV0cnksYT1bXSxjPWUuaXNNYXRlcmlhbCxsPUFycmF5LmlzQXJyYXkoZSksaD1vLmdyb3Vwcyx1PWM/ZS5zaWRlOmUsZj10aGlzLmluZGlyZWN0P2pkOlZkO2ZvcihsZXQgZD0wLHA9ci5sZW5ndGg7ZDxwO2QrKyl7Y29uc3QgeT1sP2VbaFtkXS5tYXRlcmlhbEluZGV4XS5zaWRlOnUsbT1hLmxlbmd0aDtpZihmKHRoaXMsZCx5LHQsYSxuLHMpLGwpe2NvbnN0IGc9aFtkXS5tYXRlcmlhbEluZGV4O2ZvcihsZXQgYj1tLHc9YS5sZW5ndGg7Yjx3O2IrKylhW2JdLmZhY2UubWF0ZXJpYWxJbmRleD1nfX1yZXR1cm4gYX1yYXljYXN0Rmlyc3QodCxlPTAsbj0wLHM9MS8wKXtjb25zdCByPXRoaXMuX3Jvb3RzLG89dGhpcy5nZW9tZXRyeSxhPWUuaXNNYXRlcmlhbCxjPUFycmF5LmlzQXJyYXkoZSk7bGV0IGw9bnVsbDtjb25zdCBoPW8uZ3JvdXBzLHU9YT9lLnNpZGU6ZSxmPXRoaXMuaW5kaXJlY3Q/S2Q6cWQ7Zm9yKGxldCBkPTAscD1yLmxlbmd0aDtkPHA7ZCsrKXtjb25zdCB5PWM/ZVtoW2RdLm1hdGVyaWFsSW5kZXhdLnNpZGU6dSxtPWYodGhpcyxkLHksdCxuLHMpO20hPW51bGwmJihsPT1udWxsfHxtLmRpc3RhbmNlPGwuZGlzdGFuY2UpJiYobD1tLGMmJihtLmZhY2UubWF0ZXJpYWxJbmRleD1oW2RdLm1hdGVyaWFsSW5kZXgpKX1yZXR1cm4gbH1pbnRlcnNlY3RzR2VvbWV0cnkodCxlKXtsZXQgbj0hMTtjb25zdCBzPXRoaXMuX3Jvb3RzLHI9dGhpcy5pbmRpcmVjdD90MDpIZDtmb3IobGV0IG89MCxhPXMubGVuZ3RoO288YSYmKG49cih0aGlzLG8sdCxlKSwhbik7bysrKTtyZXR1cm4gbn1zaGFwZWNhc3QodCl7Y29uc3QgZT1uZS5nZXRQcmltaXRpdmUoKSxuPXRoaXMuaW5kaXJlY3Q/JGQ6UmQ7bGV0e2JvdW5kc1RyYXZlcnNlT3JkZXI6cyxpbnRlcnNlY3RzQm91bmRzOnIsaW50ZXJzZWN0c1JhbmdlOm8saW50ZXJzZWN0c1RyaWFuZ2xlOmF9PXQ7aWYobyYmYSl7Y29uc3QgdT1vO289KGYsZCxwLHksbSk9PnUoZixkLHAseSxtKT8hMDpuKGYsZCx0aGlzLGEscCx5LGUpfWVsc2Ugb3x8KGE/bz0odSxmLGQscCk9Pm4odSxmLHRoaXMsYSxkLHAsZSk6bz0odSxmLGQpPT5kKTtsZXQgYz0hMSxsPTA7Y29uc3QgaD10aGlzLl9yb290cztmb3IobGV0IHU9MCxmPWgubGVuZ3RoO3U8Zjt1Kyspe2NvbnN0IGQ9aFt1XTtpZihjPVBkKHRoaXMsdSxyLG8scyxsKSxjKWJyZWFrO2wrPWQuYnl0ZUxlbmd0aH1yZXR1cm4gbmUucmVsZWFzZVByaW1pdGl2ZShlKSxjfWJ2aGNhc3QodCxlLG4pe2xldHtpbnRlcnNlY3RzUmFuZ2VzOnMsaW50ZXJzZWN0c1RyaWFuZ2xlczpyfT1uO2NvbnN0IG89bmUuZ2V0UHJpbWl0aXZlKCksYT10aGlzLmdlb21ldHJ5LmluZGV4LGM9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9dGhpcy5pbmRpcmVjdD9wPT57Y29uc3QgeT10aGlzLnJlc29sdmVUcmlhbmdsZUluZGV4KHApO3B0KG8seSozLGEsYyl9OnA9PntwdChvLHAqMyxhLGMpfSxoPW5lLmdldFByaW1pdGl2ZSgpLHU9dC5nZW9tZXRyeS5pbmRleCxmPXQuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixkPXQuaW5kaXJlY3Q/cD0+e2NvbnN0IHk9dC5yZXNvbHZlVHJpYW5nbGVJbmRleChwKTtwdChoLHkqMyx1LGYpfTpwPT57cHQoaCxwKjMsdSxmKX07aWYocil7Y29uc3QgcD0oeSxtLGcsYix3LHgsTSxBKT0+e2ZvcihsZXQgUz1nLHY9ZytiO1M8djtTKyspe2QoUyksaC5hLmFwcGx5TWF0cml4NChlKSxoLmIuYXBwbHlNYXRyaXg0KGUpLGguYy5hcHBseU1hdHJpeDQoZSksaC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IF89eSxFPXkrbTtfPEU7XysrKWlmKGwoXyksby5uZWVkc1VwZGF0ZT0hMCxyKG8saCxfLFMsdyx4LE0sQSkpcmV0dXJuITB9cmV0dXJuITF9O2lmKHMpe2NvbnN0IHk9cztzPWZ1bmN0aW9uKG0sZyxiLHcseCxNLEEsUyl7cmV0dXJuIHkobSxnLGIsdyx4LE0sQSxTKT8hMDpwKG0sZyxiLHcseCxNLEEsUyl9fWVsc2Ugcz1wfXJldHVybiBhMCh0aGlzLHQsZSxzKX1pbnRlcnNlY3RzQm94KHQsZSl7cmV0dXJuIFpzLnNldCh0Lm1pbix0Lm1heCxlKSxacy5uZWVkc1VwZGF0ZT0hMCx0aGlzLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczpuPT5acy5pbnRlcnNlY3RzQm94KG4pLGludGVyc2VjdHNUcmlhbmdsZTpuPT5acy5pbnRlcnNlY3RzVHJpYW5nbGUobil9KX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0aGlzLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczplPT50LmludGVyc2VjdHNCb3goZSksaW50ZXJzZWN0c1RyaWFuZ2xlOmU9PmUuaW50ZXJzZWN0c1NwaGVyZSh0KX0pfWNsb3Nlc3RQb2ludFRvR2VvbWV0cnkodCxlLG49e30scz17fSxyPTAsbz0xLzApe3JldHVybih0aGlzLmluZGlyZWN0P3IwOkpkKSh0aGlzLHQsZSxuLHMscixvKX1jbG9zZXN0UG9pbnRUb1BvaW50KHQsZT17fSxuPTAscz0xLzApe3JldHVybiBDZCh0aGlzLHQsZSxuLHMpfWdldEJvdW5kaW5nQm94KHQpe3JldHVybiB0Lm1ha2VFbXB0eSgpLHRoaXMuX3Jvb3RzLmZvckVhY2gobj0+e2x0KDAsbmV3IEZsb2F0MzJBcnJheShuKSxNbCksdC51bmlvbihNbCl9KSx0fX1jb25zdCBBbD0xZS02LGwwPUFsKi41LFNsPU1hdGgucG93KDEwLC1NYXRoLmxvZzEwKEFsKSksaDA9bDAqU2w7ZnVuY3Rpb24gd2UoaSl7cmV0dXJufn4oaSpTbCtoMCl9ZnVuY3Rpb24gdTAoaSl7cmV0dXJuYCR7d2UoaS54KX0sJHt3ZShpLnkpfWB9ZnVuY3Rpb24gX2woaSl7cmV0dXJuYCR7d2UoaS54KX0sJHt3ZShpLnkpfSwke3dlKGkueil9YH1mdW5jdGlvbiBmMChpKXtyZXR1cm5gJHt3ZShpLngpfSwke3dlKGkueSl9LCR7d2UoaS56KX0sJHt3ZShpLncpfWB9ZnVuY3Rpb24gZDAoaSx0LGUpe2UuZGlyZWN0aW9uLnN1YlZlY3RvcnModCxpKS5ub3JtYWxpemUoKTtjb25zdCBuPWkuZG90KGUuZGlyZWN0aW9uKTtyZXR1cm4gZS5vcmlnaW4uY29weShpKS5hZGRTY2FsZWRWZWN0b3IoZS5kaXJlY3Rpb24sLW4pLGV9ZnVuY3Rpb24gdmwoKXtyZXR1cm4gdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIn1mdW5jdGlvbiBwMChpKXtpZihpLmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKXJldHVybiBpO2NvbnN0IHQ9aS5jb25zdHJ1Y3RvcixlPWkuYnVmZmVyLG49bmV3IFNoYXJlZEFycmF5QnVmZmVyKGUuYnl0ZUxlbmd0aCkscz1uZXcgVWludDhBcnJheShlKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkobikuc2V0KHMsMCksbmV3IHQobil9ZnVuY3Rpb24geTAoaSx0PUFycmF5QnVmZmVyKXtyZXR1cm4gaT42NTUzNT9uZXcgVWludDMyQXJyYXkobmV3IHQoNCppKSk6bmV3IFVpbnQxNkFycmF5KG5ldyB0KDIqaSkpfWZ1bmN0aW9uIG0wKGksdCl7aWYoIWkuaW5kZXgpe2NvbnN0IGU9aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50LG49dC51c2VTaGFyZWRBcnJheUJ1ZmZlcj9TaGFyZWRBcnJheUJ1ZmZlcjpBcnJheUJ1ZmZlcixzPXkwKGUsbik7aS5zZXRJbmRleChuZXcgZ3QocywxKSk7Zm9yKGxldCByPTA7cjxlO3IrKylzW3JdPXJ9fWZ1bmN0aW9uIGcwKGkpe3JldHVybiBpLmluZGV4P2kuaW5kZXguY291bnQ6aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50fWZ1bmN0aW9uIGhhKGkpe3JldHVybiBnMChpKS8zfWNvbnN0IHgwPTFlLTgsdzA9bmV3IFQ7ZnVuY3Rpb24gYjAoaSl7cmV0dXJufn4oaS8zKX1mdW5jdGlvbiBNMChpKXtyZXR1cm4gaSUzfWZ1bmN0aW9uIHpsKGksdCl7cmV0dXJuIGkuc3RhcnQtdC5zdGFydH1mdW5jdGlvbiBUbChpLHQpe3JldHVybiB3MC5zdWJWZWN0b3JzKHQsaS5vcmlnaW4pLmRvdChpLmRpcmVjdGlvbil9ZnVuY3Rpb24gQTAoaSx0LGUsbj14MCl7aS5zb3J0KHpsKSx0LnNvcnQoemwpO2ZvcihsZXQgYT0wO2E8aS5sZW5ndGg7YSsrKXtjb25zdCBjPWlbYV07Zm9yKGxldCBsPTA7bDx0Lmxlbmd0aDtsKyspe2NvbnN0IGg9dFtsXTtpZighKGguc3RhcnQ+Yy5lbmQpKXtpZihjLmVuZDxoLnN0YXJ0fHxoLmVuZDxjLnN0YXJ0KWNvbnRpbnVlO2lmKGMuc3RhcnQ8PWguc3RhcnQmJmMuZW5kPj1oLmVuZClyKGguZW5kLGMuZW5kKXx8aS5zcGxpY2UoYSsxLDAse3N0YXJ0OmguZW5kLGVuZDpjLmVuZCxpbmRleDpjLmluZGV4fSksYy5lbmQ9aC5zdGFydCxoLnN0YXJ0PTAsaC5lbmQ9MDtlbHNlIGlmKGMuc3RhcnQ+PWguc3RhcnQmJmMuZW5kPD1oLmVuZClyKGMuZW5kLGguZW5kKXx8dC5zcGxpY2UobCsxLDAse3N0YXJ0OmMuZW5kLGVuZDpoLmVuZCxpbmRleDpoLmluZGV4fSksaC5lbmQ9Yy5zdGFydCxjLnN0YXJ0PTAsYy5lbmQ9MDtlbHNlIGlmKGMuc3RhcnQ8PWguc3RhcnQmJmMuZW5kPD1oLmVuZCl7Y29uc3QgdT1jLmVuZDtjLmVuZD1oLnN0YXJ0LGguc3RhcnQ9dX1lbHNlIGlmKGMuc3RhcnQ+PWguc3RhcnQmJmMuZW5kPj1oLmVuZCl7Y29uc3QgdT1oLmVuZDtoLmVuZD1jLnN0YXJ0LGMuc3RhcnQ9dX1lbHNlIHRocm93IG5ldyBFcnJvcn1pZihlLmhhcyhjLmluZGV4KXx8ZS5zZXQoYy5pbmRleCxbXSksZS5oYXMoaC5pbmRleCl8fGUuc2V0KGguaW5kZXgsW10pLGUuZ2V0KGMuaW5kZXgpLnB1c2goaC5pbmRleCksZS5nZXQoaC5pbmRleCkucHVzaChjLmluZGV4KSxvKGgpJiYodC5zcGxpY2UobCwxKSxsLS0pLG8oYykpe2kuc3BsaWNlKGEsMSksYS0tO2JyZWFrfX19cyhpKSxzKHQpO2Z1bmN0aW9uIHMoYSl7Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspbyhhW2NdKSYmKGEuc3BsaWNlKGMsMSksYy0tKX1mdW5jdGlvbiByKGEsYyl7cmV0dXJuIE1hdGguYWJzKGMtYSk8bn1mdW5jdGlvbiBvKGEpe3JldHVybiBNYXRoLmFicyhhLmVuZC1hLnN0YXJ0KTxufX1jb25zdCBFbD0xZS01LFBsPTFlLTQ7Y2xhc3MgUzB7Y29uc3RydWN0b3IoKXt0aGlzLl9yYXlzPVtdfWFkZFJheSh0KXt0aGlzLl9yYXlzLnB1c2godCl9ZmluZENsb3Nlc3RSYXkodCl7Y29uc3QgZT10aGlzLl9yYXlzLG49dC5jbG9uZSgpO24uZGlyZWN0aW9uLm11bHRpcGx5U2NhbGFyKC0xKTtsZXQgcz0xLzAscj1udWxsO2ZvcihsZXQgYz0wLGw9ZS5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1lW2NdO2lmKG8oaCx0KSYmbyhoLG4pKWNvbnRpbnVlO2NvbnN0IHU9YShoLHQpLGY9YShoLG4pLGQ9TWF0aC5taW4odSxmKTtkPHMmJihzPWQscj1oKX1yZXR1cm4gcjtmdW5jdGlvbiBvKGMsbCl7Y29uc3QgaD1jLm9yaWdpbi5kaXN0YW5jZVRvKGwub3JpZ2luKT5FbDtyZXR1cm4gYy5kaXJlY3Rpb24uYW5nbGVUbyhsLmRpcmVjdGlvbik+UGx8fGh9ZnVuY3Rpb24gYShjLGwpe2NvbnN0IGg9Yy5vcmlnaW4uZGlzdGFuY2VUbyhsLm9yaWdpbiksdT1jLmRpcmVjdGlvbi5hbmdsZVRvKGwuZGlyZWN0aW9uKTtyZXR1cm4gaC9FbCt1L1BsfX19Y29uc3QgdWE9bmV3IFQsZmE9bmV3IFQsSnM9bmV3IHlvO2Z1bmN0aW9uIF8wKGksdCxlKXtjb25zdCBuPWkuYXR0cmlidXRlcyxzPWkuaW5kZXgscj1uLnBvc2l0aW9uLG89bmV3IE1hcCxhPW5ldyBNYXAsYz1BcnJheS5mcm9tKHQpLGw9bmV3IFMwO2ZvcihsZXQgaD0wLHU9Yy5sZW5ndGg7aDx1O2grKyl7Y29uc3QgZj1jW2hdLGQ9YjAoZikscD1NMChmKTtsZXQgeT0zKmQrcCxtPTMqZCsocCsxKSUzO3MmJih5PXMuZ2V0WCh5KSxtPXMuZ2V0WChtKSksdWEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLHkpLGZhLmZyb21CdWZmZXJBdHRyaWJ1dGUocixtKSxkMCh1YSxmYSxKcyk7bGV0IGcsYj1sLmZpbmRDbG9zZXN0UmF5KEpzKTtiPT09bnVsbCYmKGI9SnMuY2xvbmUoKSxsLmFkZFJheShiKSksYS5oYXMoYil8fGEuc2V0KGIse2ZvcndhcmQ6W10scmV2ZXJzZTpbXSxyYXk6Yn0pLGc9YS5nZXQoYik7bGV0IHc9VGwoYix1YSkseD1UbChiLGZhKTt3PngmJihbdyx4XT1beCx3XSksSnMuZGlyZWN0aW9uLmRvdChiLmRpcmVjdGlvbik8MD9nLnJldmVyc2UucHVzaCh7c3RhcnQ6dyxlbmQ6eCxpbmRleDpmfSk6Zy5mb3J3YXJkLnB1c2goe3N0YXJ0OncsZW5kOngsaW5kZXg6Zn0pfXJldHVybiBhLmZvckVhY2goKHtmb3J3YXJkOmgscmV2ZXJzZTp1fSxmKT0+e0EwKGgsdSxvLGUpLGgubGVuZ3RoPT09MCYmdS5sZW5ndGg9PT0wJiZhLmRlbGV0ZShmKX0pLHtkaXNqb2ludENvbm5lY3Rpdml0eU1hcDpvLGZyYWdtZW50TWFwOmF9fWNvbnN0IHYwPW5ldyBOLGRhPW5ldyBULHowPW5ldyBKdCxwYT1bIiIsIiIsIiJdO2NsYXNzIFQwe2NvbnN0cnVjdG9yKHQ9bnVsbCl7dGhpcy5kYXRhPW51bGwsdGhpcy5kaXNqb2ludENvbm5lY3Rpb25zPW51bGwsdGhpcy51bm1hdGNoZWREaXNqb2ludEVkZ2VzPW51bGwsdGhpcy51bm1hdGNoZWRFZGdlcz0tMSx0aGlzLm1hdGNoZWRFZGdlcz0tMSx0aGlzLnVzZURyYXdSYW5nZT0hMCx0aGlzLnVzZUFsbEF0dHJpYnV0ZXM9ITEsdGhpcy5tYXRjaERpc2pvaW50RWRnZXM9ITEsdGhpcy5kZWdlbmVyYXRlRXBzaWxvbj0xZS04LHQmJnRoaXMudXBkYXRlRnJvbSh0KX1nZXRTaWJsaW5nVHJpYW5nbGVJbmRleCh0LGUpe2NvbnN0IG49dGhpcy5kYXRhW3QqMytlXTtyZXR1cm4gbj09PS0xPy0xOn5+KG4vMyl9Z2V0U2libGluZ0VkZ2VJbmRleCh0LGUpe2NvbnN0IG49dGhpcy5kYXRhW3QqMytlXTtyZXR1cm4gbj09PS0xPy0xOm4lM31nZXREaXNqb2ludFNpYmxpbmdUcmlhbmdsZUluZGljZXModCxlKXtjb25zdCBuPXQqMytlLHM9dGhpcy5kaXNqb2ludENvbm5lY3Rpb25zLmdldChuKTtyZXR1cm4gcz9zLm1hcChyPT5+fihyLzMpKTpbXX1nZXREaXNqb2ludFNpYmxpbmdFZGdlSW5kaWNlcyh0LGUpe2NvbnN0IG49dCozK2Uscz10aGlzLmRpc2pvaW50Q29ubmVjdGlvbnMuZ2V0KG4pO3JldHVybiBzP3MubWFwKHI9PnIlMyk6W119aXNGdWxseUNvbm5lY3RlZCgpe3JldHVybiB0aGlzLnVubWF0Y2hlZEVkZ2VzPT09MH11cGRhdGVGcm9tKHQpe2NvbnN0e3VzZUFsbEF0dHJpYnV0ZXM6ZSx1c2VEcmF3UmFuZ2U6bixtYXRjaERpc2pvaW50RWRnZXM6cyxkZWdlbmVyYXRlRXBzaWxvbjpyfT10aGlzLG89ZT93OmIsYT1uZXcgTWFwLHthdHRyaWJ1dGVzOmN9PXQsbD1lP09iamVjdC5rZXlzKGMpOm51bGwsaD10LmluZGV4LHU9Yy5wb3NpdGlvbjtsZXQgZj1oYSh0KTtjb25zdCBkPWY7bGV0IHA9MDtuJiYocD10LmRyYXdSYW5nZS5zdGFydCx0LmRyYXdSYW5nZS5jb3VudCE9PTEvMCYmKGY9fn4odC5kcmF3UmFuZ2UuY291bnQvMykpKTtsZXQgeT10aGlzLmRhdGE7KCF5fHx5Lmxlbmd0aDwzKmQpJiYoeT1uZXcgSW50MzJBcnJheSgzKmQpKSx5LmZpbGwoLTEpO2xldCBtPTAsZz1uZXcgU2V0O2ZvcihsZXQgeD1wLE09ZiozK3A7eDxNO3grPTMpe2NvbnN0IEE9eDtmb3IobGV0IFM9MDtTPDM7UysrKXtsZXQgdj1BK1M7aCYmKHY9aC5nZXRYKHYpKSxwYVtTXT1vKHYpfWZvcihsZXQgUz0wO1M8MztTKyspe2NvbnN0IHY9KFMrMSklMyxfPXBhW1NdLEU9cGFbdl0sej1gJHtFfV8ke199YDtpZihhLmhhcyh6KSl7Y29uc3QgQz1BK1MsUD1hLmdldCh6KTt5W0NdPVAseVtQXT1DLGEuZGVsZXRlKHopLG0rPTIsZy5kZWxldGUoUCl9ZWxzZXtjb25zdCBDPWAke199XyR7RX1gLFA9QStTO2Euc2V0KEMsUCksZy5hZGQoUCl9fX1pZihzKXtjb25zdHtmcmFnbWVudE1hcDp4LGRpc2pvaW50Q29ubmVjdGl2aXR5TWFwOk19PV8wKHQsZyxyKTtnLmNsZWFyKCkseC5mb3JFYWNoKCh7Zm9yd2FyZDpBLHJldmVyc2U6U30pPT57QS5mb3JFYWNoKCh7aW5kZXg6dn0pPT5nLmFkZCh2KSksUy5mb3JFYWNoKCh7aW5kZXg6dn0pPT5nLmFkZCh2KSl9KSx0aGlzLnVubWF0Y2hlZERpc2pvaW50RWRnZXM9eCx0aGlzLmRpc2pvaW50Q29ubmVjdGlvbnM9TSxtPWYqMy1nLnNpemV9dGhpcy5tYXRjaGVkRWRnZXM9bSx0aGlzLnVubWF0Y2hlZEVkZ2VzPWcuc2l6ZSx0aGlzLmRhdGE9eTtmdW5jdGlvbiBiKHgpe3JldHVybiBkYS5mcm9tQnVmZmVyQXR0cmlidXRlKHUseCksX2woZGEpfWZ1bmN0aW9uIHcoeCl7bGV0IE09IiI7Zm9yKGxldCBBPTAsUz1sLmxlbmd0aDtBPFM7QSsrKXtjb25zdCB2PWNbbFtBXV07bGV0IF87c3dpdGNoKHYuaXRlbVNpemUpe2Nhc2UgMTpfPXdlKHYuZ2V0WCh4KSk7YnJlYWs7Y2FzZSAyOl89dTAodjAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh2LHgpKTticmVhaztjYXNlIDM6Xz1fbChkYS5mcm9tQnVmZmVyQXR0cmlidXRlKHYseCkpO2JyZWFrO2Nhc2UgNDpfPWYwKHowLmZyb21CdWZmZXJBdHRyaWJ1dGUodix4KSk7YnJlYWt9TSE9PSIiJiYoTSs9InwiKSxNKz1ffXJldHVybiBNfX19Y2xhc3MgWXMgZXh0ZW5kcyBTZntjb25zdHJ1Y3RvciguLi50KXtzdXBlciguLi50KSx0aGlzLmlzQnJ1c2g9ITAsdGhpcy5fcHJldmlvdXNNYXRyaXg9bmV3IHN0LHRoaXMuX3ByZXZpb3VzTWF0cml4LmVsZW1lbnRzLmZpbGwoMCl9bWFya1VwZGF0ZWQoKXt0aGlzLl9wcmV2aW91c01hdHJpeC5jb3B5KHRoaXMubWF0cml4KX1pc0RpcnR5KCl7Y29uc3R7bWF0cml4OnQsX3ByZXZpb3VzTWF0cml4OmV9PXRoaXMsbj10LmVsZW1lbnRzLHM9ZS5lbGVtZW50cztmb3IobGV0IHI9MDtyPDE2O3IrKylpZihuW3JdIT09c1tyXSlyZXR1cm4hMDtyZXR1cm4hMX1wcmVwYXJlR2VvbWV0cnkoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnksZT10LmF0dHJpYnV0ZXMsbj12bCgpO2lmKG4pZm9yKGNvbnN0IHMgaW4gZSl7Y29uc3Qgcj1lW3NdO2lmKHIuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSl0aHJvdyBuZXcgRXJyb3IoIkJydXNoOiBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7ci5hcnJheT1wMChyLmFycmF5KX1pZih0LmJvdW5kc1RyZWV8fChtMCh0LHt1c2VTaGFyZWRBcnJheUJ1ZmZlcjpufSksdC5ib3VuZHNUcmVlPW5ldyBsYSh0LHttYXhMZWFmVHJpczozLGluZGlyZWN0OiEwLHVzZVNoYXJlZEFycmF5QnVmZmVyOm59KSksdC5oYWxmRWRnZXN8fCh0LmhhbGZFZGdlcz1uZXcgVDAodCkpLCF0Lmdyb3VwSW5kaWNlcyl7Y29uc3Qgcz1oYSh0KSxyPW5ldyBVaW50MTZBcnJheShzKSxvPXQuZ3JvdXBzO2ZvcihsZXQgYT0wLGM9by5sZW5ndGg7YTxjO2ErKyl7Y29uc3R7c3RhcnQ6bCxjb3VudDpofT1vW2FdO2ZvcihsZXQgdT1sLzMsZj0obCtoKS8zO3U8Zjt1Kyspclt1XT1hfXQuZ3JvdXBJbmRpY2VzPXJ9fWRpc3Bvc2VDYWNoZURhdGEoKXtjb25zdHtnZW9tZXRyeTp0fT10aGlzO3QuaGFsZkVkZ2VzPW51bGwsdC5ib3VuZHNUcmVlPW51bGwsdC5ncm91cEluZGljZXM9bnVsbH19Y29uc3QgRTA9MWUtMTQseWE9bmV3IFQsQ2w9bmV3IFQsQmw9bmV3IFQ7ZnVuY3Rpb24gc24oaSx0PUUwKXt5YS5zdWJWZWN0b3JzKGkuYixpLmEpLENsLnN1YlZlY3RvcnMoaS5jLGkuYSksQmwuc3ViVmVjdG9ycyhpLmIsaS5jKTtjb25zdCBlPXlhLmFuZ2xlVG8oQ2wpLG49eWEuYW5nbGVUbyhCbCkscz1NYXRoLlBJLWUtbjtyZXR1cm4gTWF0aC5hYnMoZSk8dHx8TWF0aC5hYnMobik8dHx8TWF0aC5hYnMocyk8dHx8aS5hLmRpc3RhbmNlVG9TcXVhcmVkKGkuYik8dHx8aS5hLmRpc3RhbmNlVG9TcXVhcmVkKGkuYyk8dHx8aS5iLmRpc3RhbmNlVG9TcXVhcmVkKGkuYyk8dH1jb25zdCBtYT0xZS0xMCxWaT0xZS0xMCxQMD0xZS0xMCxrZT1uZXcganQsZnQ9bmV3IGp0LE5lPW5ldyBULGdhPW5ldyBULEZsPW5ldyBULGpzPW5ldyBFbyx4YT1uZXcgZWU7Y2xhc3MgQzB7Y29uc3RydWN0b3IoKXt0aGlzLl9wb29sPVtdLHRoaXMuX2luZGV4PTB9Z2V0VHJpYW5nbGUoKXtyZXR1cm4gdGhpcy5faW5kZXg+PXRoaXMuX3Bvb2wubGVuZ3RoJiZ0aGlzLl9wb29sLnB1c2gobmV3IHR0KSx0aGlzLl9wb29sW3RoaXMuX2luZGV4KytdfWNsZWFyKCl7dGhpcy5faW5kZXg9MH1yZXNldCgpe3RoaXMuX3Bvb2wubGVuZ3RoPTAsdGhpcy5faW5kZXg9MH19Y2xhc3MgQjB7Y29uc3RydWN0b3IoKXt0aGlzLnRyaWFuZ2xlUG9vbD1uZXcgQzAsdGhpcy50cmlhbmdsZXM9W10sdGhpcy5ub3JtYWw9bmV3IFQsdGhpcy5jb3BsYW5hclRyaWFuZ2xlVXNlZD0hMX1pbml0aWFsaXplKHQpe3RoaXMucmVzZXQoKTtjb25zdHt0cmlhbmdsZXM6ZSx0cmlhbmdsZVBvb2w6bixub3JtYWw6c309dGhpcztpZihBcnJheS5pc0FycmF5KHQpKWZvcihsZXQgcj0wLG89dC5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT10W3JdO2lmKHI9PT0wKWEuZ2V0Tm9ybWFsKHMpO2Vsc2UgaWYoTWF0aC5hYnMoMS1hLmdldE5vcm1hbChOZSkuZG90KHMpKT5tYSl0aHJvdyBuZXcgRXJyb3IoIlRyaWFuZ2xlIFNwbGl0dGVyOiBDYW5ub3QgaW5pdGlhbGl6ZSB3aXRoIHRyaWFuZ2xlcyB0aGF0IGhhdmUgZGlmZmVyZW50IG5vcm1hbHMuIik7Y29uc3QgYz1uLmdldFRyaWFuZ2xlKCk7Yy5jb3B5KGEpLGUucHVzaChjKX1lbHNle3QuZ2V0Tm9ybWFsKHMpO2NvbnN0IHI9bi5nZXRUcmlhbmdsZSgpO3IuY29weSh0KSxlLnB1c2gocil9fXNwbGl0QnlUcmlhbmdsZSh0KXtjb25zdHtub3JtYWw6ZSx0cmlhbmdsZXM6bn09dGhpcztpZih0LmdldE5vcm1hbChnYSkubm9ybWFsaXplKCksTWF0aC5hYnMoMS1NYXRoLmFicyhnYS5kb3QoZSkpKTxQMCl7dGhpcy5jb3BsYW5hclRyaWFuZ2xlVXNlZD0hMDtmb3IobGV0IHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9bltyXTthLmNvcGxhbmFyQ291bnQ9MH1jb25zdCBzPVt0LmEsdC5iLHQuY107Zm9yKGxldCByPTA7cjwzO3IrKyl7Y29uc3Qgbz0ocisxKSUzLGE9c1tyXSxjPXNbb107TmUuc3ViVmVjdG9ycyhjLGEpLm5vcm1hbGl6ZSgpLEZsLmNyb3NzVmVjdG9ycyhnYSxOZSksanMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoRmwsYSksdGhpcy5zcGxpdEJ5UGxhbmUoanMsdCl9fWVsc2UgdC5nZXRQbGFuZShqcyksdGhpcy5zcGxpdEJ5UGxhbmUoanMsdCl9c3BsaXRCeVBsYW5lKHQsZSl7Y29uc3R7dHJpYW5nbGVzOm4sdHJpYW5nbGVQb29sOnN9PXRoaXM7eGEuY29weShlKSx4YS5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9bltyXTtpZigheGEuaW50ZXJzZWN0c1RyaWFuZ2xlKGEsa2UsITApKWNvbnRpbnVlO2NvbnN0e2E6YyxiOmwsYzpofT1hO2xldCB1PTAsZj0tMSxkPSExLHA9W10seT1bXTtjb25zdCBtPVtjLGwsaF07Zm9yKGxldCBnPTA7ZzwzO2crKyl7Y29uc3QgYj0oZysxKSUzO2tlLnN0YXJ0LmNvcHkobVtnXSksa2UuZW5kLmNvcHkobVtiXSk7Y29uc3Qgdz10LmRpc3RhbmNlVG9Qb2ludChrZS5zdGFydCkseD10LmRpc3RhbmNlVG9Qb2ludChrZS5lbmQpO2lmKE1hdGguYWJzKHcpPFZpJiZNYXRoLmFicyh4KTxWaSl7ZD0hMDticmVha31pZih3PjA/cC5wdXNoKGcpOnkucHVzaChnKSxNYXRoLmFicyh3KTxWaSljb250aW51ZTtsZXQgTT0hIXQuaW50ZXJzZWN0TGluZShrZSxOZSk7IU0mJk1hdGguYWJzKHgpPFZpJiYoTmUuY29weShrZS5lbmQpLE09ITApLE0mJiEoTmUuZGlzdGFuY2VUbyhrZS5zdGFydCk8bWEpJiYoTmUuZGlzdGFuY2VUbyhrZS5lbmQpPG1hJiYoZj1nKSx1PT09MD9mdC5zdGFydC5jb3B5KE5lKTpmdC5lbmQuY29weShOZSksdSsrKX1pZighZCYmdT09PTImJmZ0LmRpc3RhbmNlKCk+VmkpaWYoZiE9PS0xKXtmPShmKzEpJTM7bGV0IGc9MDtnPT09ZiYmKGc9KGcrMSklMyk7bGV0IGI9ZysxO2I9PT1mJiYoYj0oYisxKSUzKTtjb25zdCB3PXMuZ2V0VHJpYW5nbGUoKTt3LmEuY29weShtW2JdKSx3LmIuY29weShmdC5lbmQpLHcuYy5jb3B5KGZ0LnN0YXJ0KSxzbih3KXx8bi5wdXNoKHcpLGEuYS5jb3B5KG1bZ10pLGEuYi5jb3B5KGZ0LnN0YXJ0KSxhLmMuY29weShmdC5lbmQpLHNuKGEpJiYobi5zcGxpY2UociwxKSxyLS0sby0tKX1lbHNle2NvbnN0IGc9cC5sZW5ndGg+PTI/eVswXTpwWzBdO2lmKGc9PT0wKXtsZXQgQT1mdC5zdGFydDtmdC5zdGFydD1mdC5lbmQsZnQuZW5kPUF9Y29uc3QgYj0oZysxKSUzLHc9KGcrMiklMyx4PXMuZ2V0VHJpYW5nbGUoKSxNPXMuZ2V0VHJpYW5nbGUoKTttW2JdLmRpc3RhbmNlVG9TcXVhcmVkKGZ0LnN0YXJ0KTxtW3ddLmRpc3RhbmNlVG9TcXVhcmVkKGZ0LmVuZCk/KHguYS5jb3B5KG1bYl0pLHguYi5jb3B5KGZ0LnN0YXJ0KSx4LmMuY29weShmdC5lbmQpLE0uYS5jb3B5KG1bYl0pLE0uYi5jb3B5KG1bd10pLE0uYy5jb3B5KGZ0LnN0YXJ0KSk6KHguYS5jb3B5KG1bd10pLHguYi5jb3B5KGZ0LnN0YXJ0KSx4LmMuY29weShmdC5lbmQpLE0uYS5jb3B5KG1bYl0pLE0uYi5jb3B5KG1bd10pLE0uYy5jb3B5KGZ0LmVuZCkpLGEuYS5jb3B5KG1bZ10pLGEuYi5jb3B5KGZ0LmVuZCksYS5jLmNvcHkoZnQuc3RhcnQpLHNuKHgpfHxuLnB1c2goeCksc24oTSl8fG4ucHVzaChNKSxzbihhKSYmKG4uc3BsaWNlKHIsMSksci0tLG8tLSl9ZWxzZSB1PT09MyYmY29uc29sZS53YXJuKCJUcmlhbmdsZUNsaXBwZXI6IENvcGxhbmFyIGNsaXAgbm90IGhhbmRsZWQiKX19cmVzZXQoKXt0aGlzLnRyaWFuZ2xlcy5sZW5ndGg9MCx0aGlzLnRyaWFuZ2xlUG9vbC5jbGVhcigpLHRoaXMuY29wbGFuYXJUcmlhbmdsZVVzZWQ9ITF9fWZ1bmN0aW9uIEYwKGkpe3JldHVybiBpPX5+aSxpKzQtaSU0fWNsYXNzIElse2NvbnN0cnVjdG9yKHQsZT01MDApe3RoaXMuZXhwYW5zaW9uRmFjdG9yPTEuNSx0aGlzLnR5cGU9dCx0aGlzLmxlbmd0aD0wLHRoaXMuYXJyYXk9bnVsbCx0aGlzLnNldFNpemUoZSl9c2V0VHlwZSh0KXtpZih0aGlzLmxlbmd0aCE9PTApdGhyb3cgbmV3IEVycm9yKCJUeXBlQmFja2VkQXJyYXk6IENhbm5vdCBjaGFuZ2UgdGhlIHR5cGUgd2hpbGUgdGhlcmUgaXMgdXNlZCBkYXRhIGluIHRoZSBidWZmZXIuIik7Y29uc3QgZT10aGlzLmFycmF5LmJ1ZmZlcjt0aGlzLmFycmF5PW5ldyB0KGUpLHRoaXMudHlwZT10fXNldFNpemUodCl7aWYodGhpcy5hcnJheSYmdD09PXRoaXMuYXJyYXkubGVuZ3RoKXJldHVybjtjb25zdCBlPXRoaXMudHlwZSxuPXZsKCk/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXIscz1uZXcgZShuZXcgbihGMCh0KmUuQllURVNfUEVSX0VMRU1FTlQpKSk7dGhpcy5hcnJheSYmcy5zZXQodGhpcy5hcnJheSwwKSx0aGlzLmFycmF5PXN9ZXhwYW5kKCl7Y29uc3R7YXJyYXk6dCxleHBhbnNpb25GYWN0b3I6ZX09dGhpczt0aGlzLnNldFNpemUodC5sZW5ndGgqZSl9cHVzaCguLi50KXtsZXR7YXJyYXk6ZSxsZW5ndGg6bn09dGhpcztuK3QubGVuZ3RoPmUubGVuZ3RoJiYodGhpcy5leHBhbmQoKSxlPXRoaXMuYXJyYXkpO2ZvcihsZXQgcz0wLHI9dC5sZW5ndGg7czxyO3MrKyllW24rc109dFtzXTt0aGlzLmxlbmd0aCs9dC5sZW5ndGh9Y2xlYXIoKXt0aGlzLmxlbmd0aD0wfX1jbGFzcyBJMHtjb25zdHJ1Y3Rvcigpe3RoaXMuZ3JvdXBBdHRyaWJ1dGVzPVt7fV0sdGhpcy5ncm91cENvdW50PTB9Z2V0VHlwZSh0KXtyZXR1cm4gdGhpcy5ncm91cEF0dHJpYnV0ZXNbMF1bdF0udHlwZX1nZXRJdGVtU2l6ZSh0KXtyZXR1cm4gdGhpcy5ncm91cEF0dHJpYnV0ZXNbMF1bdF0uaXRlbVNpemV9Z2V0Tm9ybWFsaXplZCh0KXtyZXR1cm4gdGhpcy5ncm91cEF0dHJpYnV0ZXNbMF1bdF0ubm9ybWFsaXplZH1nZXRDb3VudCh0KXtpZih0aGlzLmdyb3VwQ291bnQ8PXQpcmV0dXJuIDA7Y29uc3QgZT10aGlzLmdldEdyb3VwQXR0ckFycmF5KCJwb3NpdGlvbiIsdCk7cmV0dXJuIGUubGVuZ3RoL2UuaXRlbVNpemV9Z2V0VG90YWxMZW5ndGgodCl7Y29uc3R7Z3JvdXBDb3VudDplLGdyb3VwQXR0cmlidXRlczpufT10aGlzO2xldCBzPTA7Zm9yKGxldCByPTA7cjxlO3IrKyl7Y29uc3Qgbz1uW3JdO3MrPW9bdF0ubGVuZ3RofXJldHVybiBzfWdldEdyb3VwQXR0clNldCh0PTApe2NvbnN0e2dyb3VwQXR0cmlidXRlczplfT10aGlzO2lmKGVbdF0pcmV0dXJuIHRoaXMuZ3JvdXBDb3VudD1NYXRoLm1heCh0aGlzLmdyb3VwQ291bnQsdCsxKSxlW3RdO2NvbnN0IG49ZVswXTtmb3IodGhpcy5ncm91cENvdW50PU1hdGgubWF4KHRoaXMuZ3JvdXBDb3VudCx0KzEpO3Q+PWUubGVuZ3RoOyl7Y29uc3Qgcz17fTtlLnB1c2gocyk7Zm9yKGNvbnN0IHIgaW4gbil7Y29uc3Qgbz1uW3JdLGE9bmV3IElsKG8udHlwZSk7YS5pdGVtU2l6ZT1vLml0ZW1TaXplLGEubm9ybWFsaXplZD1vLm5vcm1hbGl6ZWQsc1tyXT1hfX1yZXR1cm4gZVt0XX1nZXRHcm91cEF0dHJBcnJheSh0LGU9MCl7Y29uc3R7Z3JvdXBBdHRyaWJ1dGVzOm59PXRoaXM7aWYoIW5bMF1bdF0pdGhyb3cgbmV3IEVycm9yKGBUeXBlZEF0dHJpYnV0ZURhdGE6IEF0dHJpYnV0ZSB3aXRoICIke3R9IiBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRgKTtyZXR1cm4gdGhpcy5nZXRHcm91cEF0dHJTZXQoZSlbdF19aW5pdGlhbGl6ZUFycmF5KHQsZSxuLHMpe2NvbnN0e2dyb3VwQXR0cmlidXRlczpyfT10aGlzLGE9clswXVt0XTtpZihhKXtpZihhLnR5cGUhPT1lKWZvcihsZXQgYz0wLGw9ci5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1yW2NdW3RdO2guc2V0VHlwZShlKSxoLml0ZW1TaXplPW4saC5ub3JtYWxpemVkPXN9fWVsc2UgZm9yKGxldCBjPTAsbD1yLmxlbmd0aDtjPGw7YysrKXtjb25zdCBoPW5ldyBJbChlKTtoLml0ZW1TaXplPW4saC5ub3JtYWxpemVkPXMscltjXVt0XT1ofX1jbGVhcigpe3RoaXMuZ3JvdXBDb3VudD0wO2NvbnN0e2dyb3VwQXR0cmlidXRlczp0fT10aGlzO3QuZm9yRWFjaChlPT57Zm9yKGNvbnN0IG4gaW4gZSllW25dLmNsZWFyKCl9KX1kZWxldGUodCl7dGhpcy5ncm91cEF0dHJpYnV0ZXMuZm9yRWFjaChlPT57ZGVsZXRlIGVbdF19KX1yZXNldCgpe3RoaXMuZ3JvdXBBdHRyaWJ1dGVzPVtdLHRoaXMuZ3JvdXBDb3VudD0wfX1jbGFzcyBrbHtjb25zdHJ1Y3Rvcigpe3RoaXMuaW50ZXJzZWN0aW9uU2V0PXt9LHRoaXMuaWRzPVtdfWFkZCh0LGUpe2NvbnN0e2ludGVyc2VjdGlvblNldDpuLGlkczpzfT10aGlzO25bdF18fChuW3RdPVtdLHMucHVzaCh0KSksblt0XS5wdXNoKGUpfX1jb25zdCBrMD0wLE4wPTEsUjA9MixObD0zLEwwPTQsUmw9NSxMbD02LGllPW5ldyB5byxPbD1uZXcgc3QsVHQ9bmV3IHR0LFJlPW5ldyBULERsPW5ldyBKdCwkbD1uZXcgSnQsVmw9bmV3IEp0LHdhPW5ldyBKdCxRcz1uZXcgSnQsS3M9bmV3IEp0LFVsPW5ldyBqdCxiYT1uZXcgVCxNYT0xZS04LE8wPTFlLTE1LHhuPS0xLHduPTEsdHI9LTIsZXI9MixVaT0wLGJuPTEsQWE9MixEMD0xZS0xNDtsZXQgbnI9bnVsbDtmdW5jdGlvbiBxbChpKXtucj1pfWZ1bmN0aW9uIEhsKGksdCl7aS5nZXRNaWRwb2ludChpZS5vcmlnaW4pLGkuZ2V0Tm9ybWFsKGllLmRpcmVjdGlvbik7Y29uc3QgZT10LnJheWNhc3RGaXJzdChpZSwyKTtyZXR1cm4hIShlJiZpZS5kaXJlY3Rpb24uZG90KGUuZmFjZS5ub3JtYWwpPjApP3huOndufWZ1bmN0aW9uICQwKGksdCl7ZnVuY3Rpb24gZSgpe3JldHVybiBNYXRoLnJhbmRvbSgpLS41fWkuZ2V0Tm9ybWFsKGJhKSxpZS5kaXJlY3Rpb24uY29weShiYSksaS5nZXRNaWRwb2ludChpZS5vcmlnaW4pO2NvbnN0IG49MztsZXQgcz0wLHI9MS8wO2ZvcihsZXQgbz0wO288bjtvKyspe2llLmRpcmVjdGlvbi54Kz1lKCkqTWEsaWUuZGlyZWN0aW9uLnkrPWUoKSpNYSxpZS5kaXJlY3Rpb24ueis9ZSgpKk1hLGllLmRpcmVjdGlvbi5tdWx0aXBseVNjYWxhcigtMSk7Y29uc3QgYT10LnJheWNhc3RGaXJzdChpZSwyKTtpZighIShhJiZpZS5kaXJlY3Rpb24uZG90KGEuZmFjZS5ub3JtYWwpPjApJiZzKyssYSE9PW51bGwmJihyPU1hdGgubWluKHIsYS5kaXN0YW5jZSkpLHI8PU8wKXJldHVybiBhLmZhY2Uubm9ybWFsLmRvdChiYSk+MD9lcjp0cjtpZihzL24+LjV8fChvLXMrMSkvbj4uNSlicmVha31yZXR1cm4gcy9uPi41P3huOndufWZ1bmN0aW9uIFYwKGksdCl7Y29uc3QgZT1uZXcga2wsbj1uZXcga2w7cmV0dXJuIE9sLmNvcHkoaS5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkubXVsdGlwbHkodC5tYXRyaXhXb3JsZCksaS5nZW9tZXRyeS5ib3VuZHNUcmVlLmJ2aGNhc3QodC5nZW9tZXRyeS5ib3VuZHNUcmVlLE9sLHtpbnRlcnNlY3RzVHJpYW5nbGVzKHMscixvLGEpe2lmKCFzbihzKSYmIXNuKHIpKXtsZXQgYz1zLmludGVyc2VjdHNUcmlhbmdsZShyLFVsLCEwKTtpZighYyl7Y29uc3QgbD1zLnBsYW5lLGg9ci5wbGFuZSx1PWwubm9ybWFsLGY9aC5ub3JtYWw7dS5kb3QoZik9PT0xJiZNYXRoLmFicyhsLmNvbnN0YW50LWguY29uc3RhbnQpPEQwJiYoYz0hMCl9aWYoYyl7bGV0IGw9aS5nZW9tZXRyeS5ib3VuZHNUcmVlLnJlc29sdmVUcmlhbmdsZUluZGV4KG8pLGg9dC5nZW9tZXRyeS5ib3VuZHNUcmVlLnJlc29sdmVUcmlhbmdsZUluZGV4KGEpO2UuYWRkKGwsaCksbi5hZGQoaCxsKSxuciYmKG5yLmFkZEVkZ2UoVWwpLG5yLmFkZEludGVyc2VjdGluZ1RyaWFuZ2xlcyhvLHMsYSxyKSl9fXJldHVybiExfX0pLHthSW50ZXJzZWN0aW9uczplLGJJbnRlcnNlY3Rpb25zOm59fWZ1bmN0aW9uIFUwKGksdCxlLG4scyxyLG89ITEpe2NvbnN0IGE9ZS5hdHRyaWJ1dGVzLGM9ZS5pbmRleCxsPWkqMyxoPWMuZ2V0WChsKzApLHU9Yy5nZXRYKGwrMSksZj1jLmdldFgobCsyKTtmb3IoY29uc3QgZCBpbiByKXtjb25zdCBwPWFbZF0seT1yW2RdO2lmKCEoZCBpbiBhKSl0aHJvdyBuZXcgRXJyb3IoYENTRyBPcGVyYXRpb25zOiBBdHRyaWJ1dGUgJHtkfSBub3QgYXZhaWxhYmxlIG9uIGdlb21ldHJ5LmApO2NvbnN0IG09cC5pdGVtU2l6ZTtkPT09InBvc2l0aW9uIj8oVHQuYS5mcm9tQnVmZmVyQXR0cmlidXRlKHAsaCkuYXBwbHlNYXRyaXg0KG4pLFR0LmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLHUpLmFwcGx5TWF0cml4NChuKSxUdC5jLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxmKS5hcHBseU1hdHJpeDQobiksU2EoVHQuYSxUdC5iLFR0LmMsdCwzLHksbykpOmQ9PT0ibm9ybWFsIj8oVHQuYS5mcm9tQnVmZmVyQXR0cmlidXRlKHAsaCkuYXBwbHlOb3JtYWxNYXRyaXgocyksVHQuYi5mcm9tQnVmZmVyQXR0cmlidXRlKHAsdSkuYXBwbHlOb3JtYWxNYXRyaXgocyksVHQuYy5mcm9tQnVmZmVyQXR0cmlidXRlKHAsZikuYXBwbHlOb3JtYWxNYXRyaXgocyksbyYmKFR0LmEubXVsdGlwbHlTY2FsYXIoLTEpLFR0LmIubXVsdGlwbHlTY2FsYXIoLTEpLFR0LmMubXVsdGlwbHlTY2FsYXIoLTEpKSxTYShUdC5hLFR0LmIsVHQuYyx0LDMseSxvLCEwKSk6KERsLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxoKSwkbC5mcm9tQnVmZmVyQXR0cmlidXRlKHAsdSksVmwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGYpLFNhKERsLCRsLFZsLHQsbSx5LG8pKX19ZnVuY3Rpb24gcTAoaSx0LGUsbixzLHIsbyxhPSExKXtfYShpLG4scyxyLG8sYSksX2EoYT9lOnQsbixzLHIsbyxhKSxfYShhP3Q6ZSxuLHMscixvLGEpfWZ1bmN0aW9uIFhsKGksdCxlPSExKXtzd2l0Y2goaSl7Y2FzZSBrMDppZih0PT09d258fHQ9PT1lciYmIWUpcmV0dXJuIGJuO2JyZWFrO2Nhc2UgTjA6aWYoZSl7aWYodD09PXhuKXJldHVybiBVaX1lbHNlIGlmKHQ9PT13bnx8dD09PXRyKXJldHVybiBibjticmVhaztjYXNlIFIwOmlmKGUpe2lmKHQ9PT13bnx8dD09PXRyKXJldHVybiBibn1lbHNlIGlmKHQ9PT14bilyZXR1cm4gVWk7YnJlYWs7Y2FzZSBMMDppZih0PT09eG4pcmV0dXJuIFVpO2lmKHQ9PT13bilyZXR1cm4gYm47YnJlYWs7Y2FzZSBObDppZih0PT09eG58fHQ9PT1lciYmIWUpcmV0dXJuIGJuO2JyZWFrO2Nhc2UgUmw6aWYoIWUmJih0PT09d258fHQ9PT10cikpcmV0dXJuIGJuO2JyZWFrO2Nhc2UgTGw6aWYoIWUmJih0PT09eG58fHQ9PT1lcikpcmV0dXJuIGJuO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgQ1NHIG9wZXJhdGlvbiBlbnVtICIke2l9Ii5gKX1yZXR1cm4gQWF9ZnVuY3Rpb24gU2EoaSx0LGUsbixzLHIsbz0hMSxhPSExKXtjb25zdCBjPWw9PntyLnB1c2gobC54KSxzPjEmJnIucHVzaChsLnkpLHM+MiYmci5wdXNoKGwueikscz4zJiZyLnB1c2gobC53KX07d2Euc2V0KDAsMCwwLDApLmFkZFNjYWxlZFZlY3RvcihpLG4uYS54KS5hZGRTY2FsZWRWZWN0b3IodCxuLmEueSkuYWRkU2NhbGVkVmVjdG9yKGUsbi5hLnopLFFzLnNldCgwLDAsMCwwKS5hZGRTY2FsZWRWZWN0b3IoaSxuLmIueCkuYWRkU2NhbGVkVmVjdG9yKHQsbi5iLnkpLmFkZFNjYWxlZFZlY3RvcihlLG4uYi56KSxLcy5zZXQoMCwwLDAsMCkuYWRkU2NhbGVkVmVjdG9yKGksbi5jLngpLmFkZFNjYWxlZFZlY3Rvcih0LG4uYy55KS5hZGRTY2FsZWRWZWN0b3IoZSxuLmMueiksYSYmKHdhLm5vcm1hbGl6ZSgpLFFzLm5vcm1hbGl6ZSgpLEtzLm5vcm1hbGl6ZSgpKSxjKHdhKSxvPyhjKEtzKSxjKFFzKSk6KGMoUXMpLGMoS3MpKX1mdW5jdGlvbiBfYShpLHQsZSxuLHMscj0hMSl7Zm9yKGNvbnN0IG8gaW4gcyl7Y29uc3QgYT10W29dLGM9c1tvXTtpZighKG8gaW4gdCkpdGhyb3cgbmV3IEVycm9yKGBDU0cgT3BlcmF0aW9uczogQXR0cmlidXRlICR7b30gbm8gYXZhaWxhYmxlIG9uIGdlb21ldHJ5LmApO2NvbnN0IGw9YS5pdGVtU2l6ZTtvPT09InBvc2l0aW9uIj8oUmUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGkpLmFwcGx5TWF0cml4NChlKSxjLnB1c2goUmUueCxSZS55LFJlLnopKTpvPT09Im5vcm1hbCI/KFJlLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxpKS5hcHBseU5vcm1hbE1hdHJpeChuKSxyJiZSZS5tdWx0aXBseVNjYWxhcigtMSksYy5wdXNoKFJlLngsUmUueSxSZS56KSk6KGMucHVzaChhLmdldFgoaSkpLGw+MSYmYy5wdXNoKGEuZ2V0WShpKSksbD4yJiZjLnB1c2goYS5nZXRaKGkpKSxsPjMmJmMucHVzaChhLmdldFcoaSkpKX19Y2xhc3MgSDB7Y29uc3RydWN0b3IodCl7dGhpcy50cmlhbmdsZT1uZXcgdHQoKS5jb3B5KHQpLHRoaXMuaW50ZXJzZWN0cz17fX1hZGRUcmlhbmdsZSh0LGUpe3RoaXMuaW50ZXJzZWN0c1t0XT1uZXcgdHQoKS5jb3B5KGUpfWdldEludGVyc2VjdEFycmF5KCl7Y29uc3QgdD1bXSx7aW50ZXJzZWN0czplfT10aGlzO2Zvcihjb25zdCBuIGluIGUpdC5wdXNoKGVbbl0pO3JldHVybiB0fX1jbGFzcyBHbHtjb25zdHJ1Y3Rvcigpe3RoaXMuZGF0YT17fX1hZGRUcmlhbmdsZUludGVyc2VjdGlvbih0LGUsbixzKXtjb25zdHtkYXRhOnJ9PXRoaXM7clt0XXx8KHJbdF09bmV3IEgwKGUpKSxyW3RdLmFkZFRyaWFuZ2xlKG4scyl9Z2V0VHJpYW5nbGVzQXNBcnJheSh0PW51bGwpe2NvbnN0e2RhdGE6ZX09dGhpcyxuPVtdO2lmKHQhPT1udWxsKXQgaW4gZSYmbi5wdXNoKGVbdF0udHJpYW5nbGUpO2Vsc2UgZm9yKGNvbnN0IHMgaW4gZSluLnB1c2goZVtzXS50cmlhbmdsZSk7cmV0dXJuIG59Z2V0VHJpYW5nbGVJbmRpY2VzKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZGF0YSkubWFwKHQ9PnBhcnNlSW50KHQpKX1nZXRJbnRlcnNlY3Rpb25JbmRpY2VzKHQpe2NvbnN0e2RhdGE6ZX09dGhpcztyZXR1cm4gZVt0XT9PYmplY3Qua2V5cyhlW3RdLmludGVyc2VjdHMpLm1hcChuPT5wYXJzZUludChuKSk6W119Z2V0SW50ZXJzZWN0aW9uc0FzQXJyYXkodD1udWxsLGU9bnVsbCl7Y29uc3R7ZGF0YTpufT10aGlzLHM9bmV3IFNldCxyPVtdLG89YT0+e2lmKG5bYV0paWYoZSE9PW51bGwpblthXS5pbnRlcnNlY3RzW2VdJiZyLnB1c2goblthXS5pbnRlcnNlY3RzW2VdKTtlbHNle2NvbnN0IGM9blthXS5pbnRlcnNlY3RzO2Zvcihjb25zdCBsIGluIGMpcy5oYXMobCl8fChzLmFkZChsKSxyLnB1c2goY1tsXSkpfX07aWYodCE9PW51bGwpbyh0KTtlbHNlIGZvcihjb25zdCBhIGluIG4pbyhhKTtyZXR1cm4gcn1yZXNldCgpe3RoaXMuZGF0YT17fX19Y2xhc3MgWDB7Y29uc3RydWN0b3IoKXt0aGlzLmVuYWJsZWQ9ITEsdGhpcy50cmlhbmdsZUludGVyc2VjdHNBPW5ldyBHbCx0aGlzLnRyaWFuZ2xlSW50ZXJzZWN0c0I9bmV3IEdsLHRoaXMuaW50ZXJzZWN0aW9uRWRnZXM9W119YWRkSW50ZXJzZWN0aW5nVHJpYW5nbGVzKHQsZSxuLHMpe2NvbnN0e3RyaWFuZ2xlSW50ZXJzZWN0c0E6cix0cmlhbmdsZUludGVyc2VjdHNCOm99PXRoaXM7ci5hZGRUcmlhbmdsZUludGVyc2VjdGlvbih0LGUsbixzKSxvLmFkZFRyaWFuZ2xlSW50ZXJzZWN0aW9uKG4scyx0LGUpfWFkZEVkZ2UodCl7dGhpcy5pbnRlcnNlY3Rpb25FZGdlcy5wdXNoKHQuY2xvbmUoKSl9cmVzZXQoKXt0aGlzLnRyaWFuZ2xlSW50ZXJzZWN0c0EucmVzZXQoKSx0aGlzLnRyaWFuZ2xlSW50ZXJzZWN0c0IucmVzZXQoKSx0aGlzLmludGVyc2VjdGlvbkVkZ2VzPVtdfWluaXQoKXt0aGlzLmVuYWJsZWQmJih0aGlzLnJlc2V0KCkscWwodGhpcykpfWNvbXBsZXRlKCl7dGhpcy5lbmFibGVkJiZxbChudWxsKX19Y29uc3Qgcm49bmV3IHN0LGlyPW5ldyBtZSxNbj1uZXcgdHQsc3I9bmV3IHR0LG9uPW5ldyB0dCxycj1uZXcgdHQsZmU9W10sQW49W107ZnVuY3Rpb24gRzAoaSl7Zm9yKGNvbnN0IHQgb2YgaSlyZXR1cm4gdH1mdW5jdGlvbiBXMChpLHQsZSxuLHMscj17fSl7Y29uc3R7dXNlR3JvdXBzOm89ITB9PXIse2FJbnRlcnNlY3Rpb25zOmEsYkludGVyc2VjdGlvbnM6Y309VjAoaSx0KSxsPVtdO2xldCBoPW51bGwsdTtyZXR1cm4gdT1vPzA6LTEsV2woaSx0LGEsZSwhMSxuLHMsdSksWmwoaSx0LGEsZSwhMSxzLHUpLGUuZmluZEluZGV4KGQ9PmQhPT1MbCYmZCE9PVJsKSE9PS0xJiYodT1vP2kuZ2VvbWV0cnkuZ3JvdXBzLmxlbmd0aHx8MTotMSxXbCh0LGksYyxlLCEwLG4scyx1KSxabCh0LGksYyxlLCEwLHMsdSkpLGZlLmxlbmd0aD0wLEFuLmxlbmd0aD0wLHtncm91cHM6bCxtYXRlcmlhbHM6aH19ZnVuY3Rpb24gV2woaSx0LGUsbixzLHIsbyxhPTApe2NvbnN0IGM9aS5tYXRyaXhXb3JsZC5kZXRlcm1pbmFudCgpPDA7cm4uY29weSh0Lm1hdHJpeFdvcmxkKS5pbnZlcnQoKS5tdWx0aXBseShpLm1hdHJpeFdvcmxkKSxpci5nZXROb3JtYWxNYXRyaXgoaS5tYXRyaXhXb3JsZCkubXVsdGlwbHlTY2FsYXIoYz8tMToxKTtjb25zdCBsPWkuZ2VvbWV0cnkuZ3JvdXBJbmRpY2VzLGg9aS5nZW9tZXRyeS5pbmRleCx1PWkuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixmPXQuZ2VvbWV0cnkuYm91bmRzVHJlZSxkPXQuZ2VvbWV0cnkuaW5kZXgscD10Lmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24seT1lLmlkcyxtPWUuaW50ZXJzZWN0aW9uU2V0O2ZvcihsZXQgZz0wLGI9eS5sZW5ndGg7ZzxiO2crKyl7Y29uc3Qgdz15W2ddLHg9YT09PS0xPzA6bFt3XSthLE09Myp3LEE9aC5nZXRYKE0rMCksUz1oLmdldFgoTSsxKSx2PWguZ2V0WChNKzIpO01uLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh1LEEpLmFwcGx5TWF0cml4NChybiksTW4uYi5mcm9tQnVmZmVyQXR0cmlidXRlKHUsUykuYXBwbHlNYXRyaXg0KHJuKSxNbi5jLmZyb21CdWZmZXJBdHRyaWJ1dGUodSx2KS5hcHBseU1hdHJpeDQocm4pLHIucmVzZXQoKSxyLmluaXRpYWxpemUoTW4pO2NvbnN0IF89bVt3XTtmb3IobGV0IHo9MCxDPV8ubGVuZ3RoO3o8Qzt6Kyspe2NvbnN0IFA9MypfW3pdLEY9ZC5nZXRYKFArMCksQj1kLmdldFgoUCsxKSxJPWQuZ2V0WChQKzIpO3NyLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLEYpLHNyLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLEIpLHNyLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLEkpLHIuc3BsaXRCeVRyaWFuZ2xlKHNyKX1jb25zdCBFPXIudHJpYW5nbGVzO2ZvcihsZXQgej0wLEM9RS5sZW5ndGg7ejxDO3orKyl7Y29uc3QgUD1FW3pdLEY9ci5jb3BsYW5hclRyaWFuZ2xlVXNlZD8kMChQLGYpOkhsKFAsZik7ZmUubGVuZ3RoPTAsQW4ubGVuZ3RoPTA7Zm9yKGxldCBCPTAsST1uLmxlbmd0aDtCPEk7QisrKXtjb25zdCBSPVhsKG5bQl0sRixzKTtSIT09QWEmJihBbi5wdXNoKFIpLGZlLnB1c2gob1tCXS5nZXRHcm91cEF0dHJTZXQoeCkpKX1pZihmZS5sZW5ndGghPT0wKXtNbi5nZXRCYXJ5Y29vcmQoUC5hLHJyLmEpLE1uLmdldEJhcnljb29yZChQLmIscnIuYiksTW4uZ2V0QmFyeWNvb3JkKFAuYyxyci5jKTtmb3IobGV0IEI9MCxJPWZlLmxlbmd0aDtCPEk7QisrKXtjb25zdCBSPWZlW0JdLFY9QW5bQl09PT1VaTtVMCh3LHJyLGkuZ2VvbWV0cnksaS5tYXRyaXhXb3JsZCxpcixSLGMhPT1WKX19fX1yZXR1cm4geS5sZW5ndGh9ZnVuY3Rpb24gWmwoaSx0LGUsbixzLHIsbz0wKXtjb25zdCBhPWkubWF0cml4V29ybGQuZGV0ZXJtaW5hbnQoKTwwO3JuLmNvcHkodC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkubXVsdGlwbHkoaS5tYXRyaXhXb3JsZCksaXIuZ2V0Tm9ybWFsTWF0cml4KGkubWF0cml4V29ybGQpLm11bHRpcGx5U2NhbGFyKGE/LTE6MSk7Y29uc3QgYz10Lmdlb21ldHJ5LmJvdW5kc1RyZWUsbD1pLmdlb21ldHJ5Lmdyb3VwSW5kaWNlcyxoPWkuZ2VvbWV0cnkuaW5kZXgsdT1pLmdlb21ldHJ5LmF0dHJpYnV0ZXMsZj11LnBvc2l0aW9uLGQ9W10scD1pLmdlb21ldHJ5LmhhbGZFZGdlcyx5PW5ldyBTZXQsbT1oYShpLmdlb21ldHJ5KTtmb3IobGV0IGc9MCxiPW07ZzxiO2crKylnIGluIGUuaW50ZXJzZWN0aW9uU2V0fHx5LmFkZChnKTtmb3IoO3kuc2l6ZT4wOyl7Y29uc3QgZz1HMCh5KTt5LmRlbGV0ZShnKSxkLnB1c2goZyk7Y29uc3QgYj0zKmcsdz1oLmdldFgoYiswKSx4PWguZ2V0WChiKzEpLE09aC5nZXRYKGIrMik7b24uYS5mcm9tQnVmZmVyQXR0cmlidXRlKGYsdykuYXBwbHlNYXRyaXg0KHJuKSxvbi5iLmZyb21CdWZmZXJBdHRyaWJ1dGUoZix4KS5hcHBseU1hdHJpeDQocm4pLG9uLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLE0pLmFwcGx5TWF0cml4NChybik7Y29uc3QgQT1IbChvbixjKTtBbi5sZW5ndGg9MCxmZS5sZW5ndGg9MDtmb3IobGV0IFM9MCx2PW4ubGVuZ3RoO1M8djtTKyspe2NvbnN0IF89WGwobltTXSxBLHMpO18hPT1BYSYmKEFuLnB1c2goXyksZmUucHVzaChyW1NdKSl9Zm9yKDtkLmxlbmd0aD4wOyl7Y29uc3QgUz1kLnBvcCgpO2ZvcihsZXQgdj0wO3Y8Mzt2Kyspe2NvbnN0IF89cC5nZXRTaWJsaW5nVHJpYW5nbGVJbmRleChTLHYpO18hPT0tMSYmeS5oYXMoXykmJihkLnB1c2goXykseS5kZWxldGUoXykpfWlmKGZlLmxlbmd0aCE9PTApe2NvbnN0IHY9MypTLF89aC5nZXRYKHYrMCksRT1oLmdldFgodisxKSx6PWguZ2V0WCh2KzIpLEM9bz09PS0xPzA6bFtTXStvO2lmKG9uLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLF8pLG9uLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLEUpLG9uLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLHopLCFzbihvbikpZm9yKGxldCBQPTAsRj1mZS5sZW5ndGg7UDxGO1ArKyl7Y29uc3QgQj1BbltQXSxJPWZlW1BdLmdldEdyb3VwQXR0clNldChDKSxSPUI9PT1VaTtxMChfLEUseix1LGkubWF0cml4V29ybGQsaXIsSSxSIT09YSl9fX19fWZ1bmN0aW9uIFowKGkpe2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGgtMTt0Kyspe2NvbnN0IGU9aVt0XSxuPWlbdCsxXTtpZihlLm1hdGVyaWFsSW5kZXg9PT1uLm1hdGVyaWFsSW5kZXgpe2NvbnN0IHM9ZS5zdGFydCxyPW4uc3RhcnQrbi5jb3VudDtuLnN0YXJ0PXMsbi5jb3VudD1yLXMsaS5zcGxpY2UodCwxKSx0LS19fX1mdW5jdGlvbiBKMChpLHQsZSxuKXtlLmNsZWFyKCk7Y29uc3Qgcz1pLmF0dHJpYnV0ZXM7Zm9yKGxldCByPTAsbz1uLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPW5bcl0sYz1zW2FdO2UuaW5pdGlhbGl6ZUFycmF5KGEsYy5hcnJheS5jb25zdHJ1Y3RvcixjLml0ZW1TaXplLGMubm9ybWFsaXplZCl9Zm9yKGNvbnN0IHIgaW4gZS5hdHRyaWJ1dGVzKW4uaW5jbHVkZXMocil8fGUuZGVsZXRlKHIpO2Zvcihjb25zdCByIGluIHQuYXR0cmlidXRlcyluLmluY2x1ZGVzKHIpfHwodC5kZWxldGVBdHRyaWJ1dGUociksdC5kaXNwb3NlKCkpfWZ1bmN0aW9uIFkwKGksdCxlKXtsZXQgbj0hMSxzPS0xO2NvbnN0IHI9aS5hdHRyaWJ1dGVzLG89dC5ncm91cEF0dHJpYnV0ZXNbMF07Zm9yKGNvbnN0IGMgaW4gbyl7Y29uc3QgbD10LmdldFRvdGFsTGVuZ3RoKGMpLGg9dC5nZXRUeXBlKGMpLHU9dC5nZXRJdGVtU2l6ZShjKSxmPXQuZ2V0Tm9ybWFsaXplZChjKTtsZXQgZD1yW2NdOyghZHx8ZC5hcnJheS5sZW5ndGg8bCkmJihkPW5ldyBndChuZXcgaChsKSx1LGYpLGkuc2V0QXR0cmlidXRlKGMsZCksbj0hMCk7bGV0IHA9MDtmb3IobGV0IHk9MCxtPU1hdGgubWluKGUubGVuZ3RoLHQuZ3JvdXBDb3VudCk7eTxtO3krKyl7Y29uc3QgZz1lW3ldLmluZGV4LHthcnJheTpiLHR5cGU6dyxsZW5ndGg6eH09dC5ncm91cEF0dHJpYnV0ZXNbZ11bY10sTT1uZXcgdyhiLmJ1ZmZlciwwLHgpO2QuYXJyYXkuc2V0KE0scCkscCs9TS5sZW5ndGh9ZC5uZWVkc1VwZGF0ZT0hMCxzPWwvZC5pdGVtU2l6ZX1pZihpLmluZGV4KXtjb25zdCBjPWkuaW5kZXguYXJyYXk7aWYoYy5sZW5ndGg8cylpLmluZGV4PW51bGwsbj0hMDtlbHNlIGZvcihsZXQgbD0wLGg9Yy5sZW5ndGg7bDxoO2wrKyljW2xdPWx9bGV0IGE9MDtpLmNsZWFyR3JvdXBzKCk7Zm9yKGxldCBjPTAsbD1NYXRoLm1pbihlLmxlbmd0aCx0Lmdyb3VwQ291bnQpO2M8bDtjKyspe2NvbnN0e2luZGV4OmgsbWF0ZXJpYWxJbmRleDp1fT1lW2NdLGY9dC5nZXRDb3VudChoKTtmIT09MCYmKGkuYWRkR3JvdXAoYSxmLHUpLGErPWYpfWkuc2V0RHJhd1JhbmdlKDAscyksaS5ib3VuZHNUcmVlPW51bGwsbiYmaS5kaXNwb3NlKCl9ZnVuY3Rpb24gSmwoaSx0KXtsZXQgZT10O3JldHVybiBBcnJheS5pc0FycmF5KHQpfHwoZT1bXSxpLmZvckVhY2gobj0+e2Vbbi5tYXRlcmlhbEluZGV4XT10fSkpLGV9Y2xhc3MgajB7Y29uc3RydWN0b3IoKXt0aGlzLnRyaWFuZ2xlU3BsaXR0ZXI9bmV3IEIwLHRoaXMuYXR0cmlidXRlRGF0YT1bXSx0aGlzLmF0dHJpYnV0ZXM9WyJwb3NpdGlvbiIsInV2Iiwibm9ybWFsIl0sdGhpcy51c2VHcm91cHM9ITAsdGhpcy5jb25zb2xpZGF0ZUdyb3Vwcz0hMCx0aGlzLmRlYnVnPW5ldyBYMH1nZXRHcm91cFJhbmdlcyh0KXtyZXR1cm4hdGhpcy51c2VHcm91cHN8fHQuZ3JvdXBzLmxlbmd0aD09PTA/W3tzdGFydDowLGNvdW50OjEvMCxtYXRlcmlhbEluZGV4OjB9XTp0Lmdyb3Vwcy5tYXAoZT0+RnQoe30sZSkpfWV2YWx1YXRlKHQsZSxuLHM9bmV3IFlzKXtsZXQgcj0hMDtpZihBcnJheS5pc0FycmF5KG4pfHwobj1bbl0pLEFycmF5LmlzQXJyYXkocyl8fChzPVtzXSxyPSExKSxzLmxlbmd0aCE9PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiRXZhbHVhdG9yOiBvcGVyYXRpb25zIGFuZCB0YXJnZXQgYXJyYXkgcGFzc2VkIGFzIGRpZmZlcmVudCBzaXplcy4iKTt0LnByZXBhcmVHZW9tZXRyeSgpLGUucHJlcGFyZUdlb21ldHJ5KCk7Y29uc3R7dHJpYW5nbGVTcGxpdHRlcjpvLGF0dHJpYnV0ZURhdGE6YSxhdHRyaWJ1dGVzOmMsdXNlR3JvdXBzOmwsY29uc29saWRhdGVHcm91cHM6aCxkZWJ1Zzp1fT10aGlzO2Zvcig7YS5sZW5ndGg8cy5sZW5ndGg7KWEucHVzaChuZXcgSTApO3MuZm9yRWFjaCgoZyxiKT0+e0owKHQuZ2VvbWV0cnksZy5nZW9tZXRyeSxhW2JdLGMpfSksdS5pbml0KCksVzAodCxlLG4sbyxhLHt1c2VHcm91cHM6bH0pLHUuY29tcGxldGUoKTtjb25zdCBmPXRoaXMuZ2V0R3JvdXBSYW5nZXModC5nZW9tZXRyeSksZD1KbChmLHQubWF0ZXJpYWwpLHA9dGhpcy5nZXRHcm91cFJhbmdlcyhlLmdlb21ldHJ5KSx5PUpsKHAsZS5tYXRlcmlhbCk7cC5mb3JFYWNoKGc9PmcubWF0ZXJpYWxJbmRleCs9ZC5sZW5ndGgpO2xldCBtPVsuLi5mLC4uLnBdLm1hcCgoZyxiKT0+V2UoRnQoe30sZykse2luZGV4OmJ9KSk7aWYobCl7Y29uc3QgZz1bLi4uZCwuLi55XTtoJiYobT1tLm1hcCh3PT57Y29uc3QgeD1nW3cubWF0ZXJpYWxJbmRleF07cmV0dXJuIHcubWF0ZXJpYWxJbmRleD1nLmluZGV4T2YoeCksd30pLnNvcnQoKHcseCk9PncubWF0ZXJpYWxJbmRleC14Lm1hdGVyaWFsSW5kZXgpKTtjb25zdCBiPVtdO2ZvcihsZXQgdz0wLHg9Zy5sZW5ndGg7dzx4O3crKyl7bGV0IE09ITE7Zm9yKGxldCBBPTAsUz1tLmxlbmd0aDtBPFM7QSsrKXtjb25zdCB2PW1bQV07di5tYXRlcmlhbEluZGV4PT09dyYmKE09ITAsdi5tYXRlcmlhbEluZGV4PWIubGVuZ3RoKX1NJiZiLnB1c2goZ1t3XSl9cy5mb3JFYWNoKHc9Pnt3Lm1hdGVyaWFsPWJ9KX1lbHNlIG09W3tzdGFydDowLGNvdW50OjEvMCxpbmRleDowLG1hdGVyaWFsSW5kZXg6MH1dLHMuZm9yRWFjaChnPT57Zy5tYXRlcmlhbD1kWzBdfSk7cmV0dXJuIHMuZm9yRWFjaCgoZyxiKT0+e2NvbnN0IHc9Zy5nZW9tZXRyeTtZMCh3LGFbYl0sbSksaCYmWjAody5ncm91cHMpfSkscj9zOnNbMF19ZXZhbHVhdGVIaWVyYXJjaHkodCxlPW5ldyBZcyl7dC51cGRhdGVNYXRyaXhXb3JsZCghMCk7Y29uc3Qgbj0ocixvKT0+e2NvbnN0IGE9ci5jaGlsZHJlbjtmb3IobGV0IGM9MCxsPWEubGVuZ3RoO2M8bDtjKyspe2NvbnN0IGg9YVtjXTtoLmlzT3BlcmF0aW9uR3JvdXA/bihoLG8pOm8oaCl9fSxzPXI9Pntjb25zdCBvPXIuY2hpbGRyZW47bGV0IGE9ITE7Zm9yKGxldCBsPTAsaD1vLmxlbmd0aDtsPGg7bCsrKXtjb25zdCB1PW9bbF07YT1zKHUpfHxhfWNvbnN0IGM9ci5pc0RpcnR5KCk7aWYoYyYmci5tYXJrVXBkYXRlZCgpLGEmJiFyLmlzT3BlcmF0aW9uR3JvdXApe2xldCBsO3JldHVybiBuKHIsaD0+e2w/bD10aGlzLmV2YWx1YXRlKGwsaCxoLm9wZXJhdGlvbik6bD10aGlzLmV2YWx1YXRlKHIsaCxoLm9wZXJhdGlvbil9KSxyLl9jYWNoZWRHZW9tZXRyeT1sLmdlb21ldHJ5LHIuX2NhY2hlZE1hdGVyaWFscz1sLm1hdGVyaWFsLCEwfWVsc2UgcmV0dXJuIGF8fGN9O3JldHVybiBzKHQpLGUuZ2VvbWV0cnk9dC5fY2FjaGVkR2VvbWV0cnksZS5tYXRlcmlhbD10Ll9jYWNoZWRNYXRlcmlhbHMsZX1yZXNldCgpe3RoaXMudHJpYW5nbGVTcGxpdHRlci5yZXNldCgpfX1mdW5jdGlvbiBZbChpKXtsZXQgdCxlLG4scz0tMSxyPTA7Zm9yKGxldCBsPTA7bDxpLmxlbmd0aDsrK2wpe2NvbnN0IGg9aVtsXTtpZih0PT09dm9pZCAwJiYodD1oLmFycmF5LmNvbnN0cnVjdG9yKSx0IT09aC5hcnJheS5jb25zdHJ1Y3RvcilyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLmFycmF5IG11c3QgYmUgb2YgY29uc2lzdGVudCBhcnJheSB0eXBlcyBhY3Jvc3MgbWF0Y2hpbmcgYXR0cmlidXRlcy4iKSxudWxsO2lmKGU9PT12b2lkIDAmJihlPWguaXRlbVNpemUpLGUhPT1oLml0ZW1TaXplKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUuaXRlbVNpemUgbXVzdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7aWYobj09PXZvaWQgMCYmKG49aC5ub3JtYWxpemVkKSxuIT09aC5ub3JtYWxpemVkKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUubm9ybWFsaXplZCBtdXN0IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihzPT09LTEmJihzPWguZ3B1VHlwZSkscyE9PWguZ3B1VHlwZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLmdwdVR5cGUgbXVzdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7cis9aC5jb3VudCplfWNvbnN0IG89bmV3IHQociksYT1uZXcgZ3QobyxlLG4pO2xldCBjPTA7Zm9yKGxldCBsPTA7bDxpLmxlbmd0aDsrK2wpe2NvbnN0IGg9aVtsXTtpZihoLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IHU9Yy9lO2ZvcihsZXQgZj0wLGQ9aC5jb3VudDtmPGQ7ZisrKWZvcihsZXQgcD0wO3A8ZTtwKyspe2NvbnN0IHk9aC5nZXRDb21wb25lbnQoZixwKTthLnNldENvbXBvbmVudChmK3UscCx5KX19ZWxzZSBvLnNldChoLmFycmF5LGMpO2MrPWguY291bnQqZX1yZXR1cm4gcyE9PXZvaWQgMCYmKGEuZ3B1VHlwZT1zKSxhfWZ1bmN0aW9uIFEwKGkpe2lmKGkuZ3JvdXBzLmxlbmd0aD09PTApcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZUdyb3VwcygpOiBObyBncm91cHMgYXJlIGRlZmluZWQuIE5vdGhpbmcgdG8gbWVyZ2UuIiksaTtsZXQgdD1pLmdyb3VwcztpZih0PXQuc29ydCgobyxhKT0+by5tYXRlcmlhbEluZGV4IT09YS5tYXRlcmlhbEluZGV4P28ubWF0ZXJpYWxJbmRleC1hLm1hdGVyaWFsSW5kZXg6by5zdGFydC1hLnN0YXJ0KSxpLmdldEluZGV4KCk9PT1udWxsKXtjb25zdCBvPWkuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLGE9W107Zm9yKGxldCBjPTA7YzxvLmNvdW50O2MrPTMpYS5wdXNoKGMsYysxLGMrMik7aS5zZXRJbmRleChhKX1jb25zdCBlPWkuZ2V0SW5kZXgoKSxuPVtdO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBhPXRbb10sYz1hLnN0YXJ0LGw9YythLmNvdW50O2ZvcihsZXQgaD1jO2g8bDtoKyspbi5wdXNoKGUuZ2V0WChoKSl9aS5kaXNwb3NlKCksaS5zZXRJbmRleChuKTtsZXQgcz0wO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBhPXRbb107YS5zdGFydD1zLHMrPWEuY291bnR9bGV0IHI9dFswXTtpLmdyb3Vwcz1bcl07Zm9yKGxldCBvPTE7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGE9dFtvXTtyLm1hdGVyaWFsSW5kZXg9PT1hLm1hdGVyaWFsSW5kZXg/ci5jb3VudCs9YS5jb3VudDoocj1hLGkuZ3JvdXBzLnB1c2gocikpfXJldHVybiBpfWZ1bmN0aW9uIGpsKGksdD0wKXtjb25zdCBlPWlbMF0uaW5kZXghPT1udWxsLG49bmV3IFNldChPYmplY3Qua2V5cyhpWzBdLmF0dHJpYnV0ZXMpKSxzPW5ldyBTZXQoT2JqZWN0LmtleXMoaVswXS5tb3JwaEF0dHJpYnV0ZXMpKSxyPXt9LG89e30sYT1pWzBdLm1vcnBoVGFyZ2V0c1JlbGF0aXZlLGM9bmV3IGdlO2xldCBsPTA7Zm9yKGxldCBoPTA7aDxpLmxlbmd0aDsrK2gpe2NvbnN0IHU9aVtoXTtsZXQgZj0wO2lmKGUhPT0odS5pbmRleCE9PW51bGwpKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIitoKyIuIEFsbCBnZW9tZXRyaWVzIG11c3QgaGF2ZSBjb21wYXRpYmxlIGF0dHJpYnV0ZXM7IG1ha2Ugc3VyZSBpbmRleCBhdHRyaWJ1dGUgZXhpc3RzIGFtb25nIGFsbCBnZW9tZXRyaWVzLCBvciBpbiBub25lIG9mIHRoZW0uIiksbnVsbDtmb3IoY29uc3QgZCBpbiB1LmF0dHJpYnV0ZXMpe2lmKCFuLmhhcyhkKSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsnLiBBbGwgZ2VvbWV0cmllcyBtdXN0IGhhdmUgY29tcGF0aWJsZSBhdHRyaWJ1dGVzOyBtYWtlIHN1cmUgIicrZCsnIiBhdHRyaWJ1dGUgZXhpc3RzIGFtb25nIGFsbCBnZW9tZXRyaWVzLCBvciBpbiBub25lIG9mIHRoZW0uJyksbnVsbDtyW2RdPT09dm9pZCAwJiYocltkXT1bXSkscltkXS5wdXNoKHUuYXR0cmlidXRlc1tkXSksZisrfWlmKGYhPT1uLnNpemUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK2grIi4gTWFrZSBzdXJlIGFsbCBnZW9tZXRyaWVzIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihhIT09dS5tb3JwaFRhcmdldHNSZWxhdGl2ZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiAubW9ycGhUYXJnZXRzUmVsYXRpdmUgbXVzdCBiZSBjb25zaXN0ZW50IHRocm91Z2hvdXQgYWxsIGdlb21ldHJpZXMuIiksbnVsbDtmb3IoY29uc3QgZCBpbiB1Lm1vcnBoQXR0cmlidXRlcyl7aWYoIXMuaGFzKGQpKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIitoKyIuICAubW9ycGhBdHRyaWJ1dGVzIG11c3QgYmUgY29uc2lzdGVudCB0aHJvdWdob3V0IGFsbCBnZW9tZXRyaWVzLiIpLG51bGw7b1tkXT09PXZvaWQgMCYmKG9bZF09W10pLG9bZF0ucHVzaCh1Lm1vcnBoQXR0cmlidXRlc1tkXSl9aWYodCl7bGV0IGQ7aWYoZSlkPXUuaW5kZXguY291bnQ7ZWxzZSBpZih1LmF0dHJpYnV0ZXMucG9zaXRpb24hPT12b2lkIDApZD11LmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQ7ZWxzZSByZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiBUaGUgZ2VvbWV0cnkgbXVzdCBoYXZlIGVpdGhlciBhbiBpbmRleCBvciBhIHBvc2l0aW9uIGF0dHJpYnV0ZSIpLG51bGw7aWYodD09PTEpYy5hZGRHcm91cChsLGQsaCk7ZWxzZSBpZih0PT09MiYmdS5ncm91cHMubGVuZ3RoPjApZm9yKGxldCBwIG9mIHUuZ3JvdXBzKXtsZXQgeT1wLm1hdGVyaWFsSW5kZXg7Yy5hZGRHcm91cChsK3Auc3RhcnQsTWF0aC5taW4ocC5jb3VudCxkKSx5KX1sKz1kfX1pZihlKXtsZXQgaD0wO2NvbnN0IHU9W107Zm9yKGxldCBmPTA7ZjxpLmxlbmd0aDsrK2Ype2NvbnN0IGQ9aVtmXS5pbmRleDtmb3IobGV0IHA9MDtwPGQuY291bnQ7KytwKXUucHVzaChkLmdldFgocCkraCk7aCs9aVtmXS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50fWMuc2V0SW5kZXgodSl9Zm9yKGNvbnN0IGggaW4gcil7Y29uc3QgdT1ZbChyW2hdKTtpZighdSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aGlsZSB0cnlpbmcgdG8gbWVyZ2UgdGhlICIraCsiIGF0dHJpYnV0ZS4iKSxudWxsO2Muc2V0QXR0cmlidXRlKGgsdSl9Zm9yKGNvbnN0IGggaW4gbyl7Y29uc3QgdT1vW2hdWzBdLmxlbmd0aDtpZih1PT09MClicmVhaztjLm1vcnBoQXR0cmlidXRlcz1jLm1vcnBoQXR0cmlidXRlc3x8e30sYy5tb3JwaEF0dHJpYnV0ZXNbaF09W107Zm9yKGxldCBmPTA7Zjx1OysrZil7Y29uc3QgZD1bXTtmb3IobGV0IHk9MDt5PG9baF0ubGVuZ3RoOysreSlkLnB1c2gob1toXVt5XVtmXSk7Y29uc3QgcD1ZbChkKTtpZighcClyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aGlsZSB0cnlpbmcgdG8gbWVyZ2UgdGhlICIraCsiIG1vcnBoQXR0cmlidXRlLiIpLG51bGw7Yy5tb3JwaEF0dHJpYnV0ZXNbaF0ucHVzaChwKX19cmV0dXJuIHQ9PT0yP1EwKGMpOmN9Y2xhc3MgSzAgZXh0ZW5kcyBabntjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSk7Y29uc3Qgbj1uZXcgWXMobmV3IFpuKHQsV2UoRnQoe30sZSkse2hhc1RvcDohMCxoYXNTaWRlOiEwLGhhc0JvdHRvbTohMX0pKSk7bi51cGRhdGVNYXRyaXhXb3JsZCgpO2NvbnN0IHM9bmV3IG10KCkuc2V0RnJvbU9iamVjdChuKSxyPW5ldyBUO3MuZ2V0U2l6ZShyKTtjb25zdCBvPW5ldyBUKHMubWluLngrci54LzIscy5taW4ueStyLnkvMiwwKTtsZXQgYT1lLnRvcFNlZ21lbnRzLGM9ZS5ib3gzO2lmKGMpe2M9Yy51bmlvbihzKTtjb25zdCBnPW5ldyBUO2MuZ2V0U2l6ZShnKTtjb25zdCBiPU1hdGgubWF4KHIueC9nLngsci55L2cueSk7YT1NYXRoLmNlaWwoZS50b3BTZWdtZW50cypiKX1pZihhPDQpcmV0dXJuIHRoaXM7Y29uc3QgbD1uZXcgRG8oci54LHIueSxhLGEpLGg9bmV3IFlzKGwpO2gucG9zaXRpb24uc2V0KG8ueCxvLnksby56KSxoLnVwZGF0ZU1hdHJpeFdvcmxkKCk7Y29uc3QgZj1uZXcgajAoKS5ldmFsdWF0ZShoLG4sTmwpLGQ9Zi5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikscD1uZXcgQmUoZC5jb3VudCoyLDIpO2ZvcihsZXQgZz0wO2c8ZC5jb3VudDtnKyspe2NvbnN0IGI9ZC5nZXRaKGcpO2Quc2V0WihnLGUuZGVwdGgrYil9aWYoYyl7Y29uc3QgZz1jLm1pbixiPWMubWF4LHc9bmV3IFQoKS5zdWJWZWN0b3JzKGIsZyk7Zm9yKGxldCB4PTA7eDxkLmNvdW50O3grKyl7Y29uc3QgTT1kLmdldFgoeCksQT1kLmdldFkoeCksUz0oTS1nLngpL3cueCx2PShBLWcueSkvdy55O3Auc2V0WFkoeCxTLHYpfWYuZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCJ1diIscCl9ZC5uZWVkc1VwZGF0ZT0hMDtjb25zdCB5PW5ldyBabih0LFdlKEZ0KHt9LGUpLHtoYXNUb3A6ITF9KSksbT1qbChbZi5nZW9tZXRyeSx5XSwyKTt0aGlzLmNvcHkobS50b05vbkluZGV4ZWQoKSl9fXZhciB0cD1pPT57Y29uc3R7c3BsaXQ6dCxkZXB0aDplLHBvaW50czpuLGJveDM6cyxoYXNUb3A6cixoYXNCb3R0b206byxoYXNTaWRlOmEsc2lkZVJlcGVhdDpjLHRvcFNlZ21lbnRzOmx9PWksaD1sP0swOlpuLHU9bmV3IGgobmV3IFljKG4pLHtkZXB0aDplLGJldmVsRW5hYmxlZDohMSxib3gzOnMsVVZHZW5lcmF0b3I6ZWQoe3NwbGl0OnQsYm94MzpzLHNpZGVSZXBlYXQ6Y30pLGhhc1RvcDpyLGhhc0JvdHRvbTpvLGhhc1NpZGU6YSx0b3BTZWdtZW50czpsfSk7cmV0dXJuIG5kKCksdX07ZnVuY3Rpb24gb3IoaSx0KXtyZXR1cm4gaT09bnVsbHx8dD09bnVsbD9OYU46aTx0Py0xOmk+dD8xOmk+PXQ/MDpOYU59ZnVuY3Rpb24gZXAoaSx0KXtyZXR1cm4gaT09bnVsbHx8dD09bnVsbD9OYU46dDxpPy0xOnQ+aT8xOnQ+PWk/MDpOYU59ZnVuY3Rpb24gUWwoaSl7bGV0IHQsZSxuO2kubGVuZ3RoIT09Mj8odD1vcixlPShhLGMpPT5vcihpKGEpLGMpLG49KGEsYyk9PmkoYSktYyk6KHQ9aT09PW9yfHxpPT09ZXA/aTpucCxlPWksbj1pKTtmdW5jdGlvbiBzKGEsYyxsPTAsaD1hLmxlbmd0aCl7aWYobDxoKXtpZih0KGMsYykhPT0wKXJldHVybiBoO2Rve2NvbnN0IHU9bCtoPj4+MTtlKGFbdV0sYyk8MD9sPXUrMTpoPXV9d2hpbGUobDxoKX1yZXR1cm4gbH1mdW5jdGlvbiByKGEsYyxsPTAsaD1hLmxlbmd0aCl7aWYobDxoKXtpZih0KGMsYykhPT0wKXJldHVybiBoO2Rve2NvbnN0IHU9bCtoPj4+MTtlKGFbdV0sYyk8PTA/bD11KzE6aD11fXdoaWxlKGw8aCl9cmV0dXJuIGx9ZnVuY3Rpb24gbyhhLGMsbD0wLGg9YS5sZW5ndGgpe2NvbnN0IHU9cyhhLGMsbCxoLTEpO3JldHVybiB1PmwmJm4oYVt1LTFdLGMpPi1uKGFbdV0sYyk/dS0xOnV9cmV0dXJue2xlZnQ6cyxjZW50ZXI6byxyaWdodDpyfX1mdW5jdGlvbiBucCgpe3JldHVybiAwfWZ1bmN0aW9uIGlwKGkpe3JldHVybiBpPT09bnVsbD9OYU46K2l9Y29uc3Qgc3A9UWwob3IpLnJpZ2h0O1FsKGlwKS5jZW50ZXI7ZnVuY3Rpb24gYXIoaSx0KXtsZXQgZSxuO2lmKHQ9PT12b2lkIDApZm9yKGNvbnN0IHMgb2YgaSlzIT1udWxsJiYoZT09PXZvaWQgMD9zPj1zJiYoZT1uPXMpOihlPnMmJihlPXMpLG48cyYmKG49cykpKTtlbHNle2xldCBzPS0xO2ZvcihsZXQgciBvZiBpKShyPXQociwrK3MsaSkpIT1udWxsJiYoZT09PXZvaWQgMD9yPj1yJiYoZT1uPXIpOihlPnImJihlPXIpLG48ciYmKG49cikpKX1yZXR1cm5bZSxuXX1jbGFzcyBMZXtjb25zdHJ1Y3Rvcigpe3RoaXMuX3BhcnRpYWxzPW5ldyBGbG9hdDY0QXJyYXkoMzIpLHRoaXMuX249MH1hZGQodCl7Y29uc3QgZT10aGlzLl9wYXJ0aWFscztsZXQgbj0wO2ZvcihsZXQgcz0wO3M8dGhpcy5fbiYmczwzMjtzKyspe2NvbnN0IHI9ZVtzXSxvPXQrcixhPU1hdGguYWJzKHQpPE1hdGguYWJzKHIpP3QtKG8tcik6ci0oby10KTthJiYoZVtuKytdPWEpLHQ9b31yZXR1cm4gZVtuXT10LHRoaXMuX249bisxLHRoaXN9dmFsdWVPZigpe2NvbnN0IHQ9dGhpcy5fcGFydGlhbHM7bGV0IGU9dGhpcy5fbixuLHMscixvPTA7aWYoZT4wKXtmb3Iobz10Wy0tZV07ZT4wJiYobj1vLHM9dFstLWVdLG89bitzLHI9cy0oby1uKSwhcik7KTtlPjAmJihyPDAmJnRbZS0xXTwwfHxyPjAmJnRbZS0xXT4wKSYmKHM9cioyLG49bytzLHM9PW4tbyYmKG89bikpfXJldHVybiBvfX1jb25zdCBycD1NYXRoLnNxcnQoNTApLG9wPU1hdGguc3FydCgxMCksYXA9TWF0aC5zcXJ0KDIpO2Z1bmN0aW9uIGNyKGksdCxlKXtjb25zdCBuPSh0LWkpL01hdGgubWF4KDAsZSkscz1NYXRoLmZsb29yKE1hdGgubG9nMTAobikpLHI9bi9NYXRoLnBvdygxMCxzKSxvPXI+PXJwPzEwOnI+PW9wPzU6cj49YXA/MjoxO2xldCBhLGMsbDtyZXR1cm4gczwwPyhsPU1hdGgucG93KDEwLC1zKS9vLGE9TWF0aC5yb3VuZChpKmwpLGM9TWF0aC5yb3VuZCh0KmwpLGEvbDxpJiYrK2EsYy9sPnQmJi0tYyxsPS1sKToobD1NYXRoLnBvdygxMCxzKSpvLGE9TWF0aC5yb3VuZChpL2wpLGM9TWF0aC5yb3VuZCh0L2wpLGEqbDxpJiYrK2EsYypsPnQmJi0tYyksYzxhJiYuNTw9ZSYmZTwyP2NyKGksdCxlKjIpOlthLGMsbF19ZnVuY3Rpb24gY3AoaSx0LGUpe2lmKHQ9K3QsaT0raSxlPStlLCEoZT4wKSlyZXR1cm5bXTtpZihpPT09dClyZXR1cm5baV07Y29uc3Qgbj10PGksW3MscixvXT1uP2NyKHQsaSxlKTpjcihpLHQsZSk7aWYoIShyPj1zKSlyZXR1cm5bXTtjb25zdCBhPXItcysxLGM9bmV3IEFycmF5KGEpO2lmKG4paWYobzwwKWZvcihsZXQgbD0wO2w8YTsrK2wpY1tsXT0oci1sKS8tbztlbHNlIGZvcihsZXQgbD0wO2w8YTsrK2wpY1tsXT0oci1sKSpvO2Vsc2UgaWYobzwwKWZvcihsZXQgbD0wO2w8YTsrK2wpY1tsXT0ocytsKS8tbztlbHNlIGZvcihsZXQgbD0wO2w8YTsrK2wpY1tsXT0ocytsKSpvO3JldHVybiBjfWZ1bmN0aW9uIHZhKGksdCxlKXtyZXR1cm4gdD0rdCxpPStpLGU9K2UsY3IoaSx0LGUpWzJdfWZ1bmN0aW9uIGxwKGksdCxlKXt0PSt0LGk9K2ksZT0rZTtjb25zdCBuPXQ8aSxzPW4/dmEodCxpLGUpOnZhKGksdCxlKTtyZXR1cm4obj8tMToxKSooczwwPzEvLXM6cyl9ZnVuY3Rpb24gaHAoaSx0KXtsZXQgZT0wLG49MDtpZih0PT09dm9pZCAwKWZvcihsZXQgcyBvZiBpKXMhPW51bGwmJihzPStzKT49cyYmKCsrZSxuKz1zKTtlbHNle2xldCBzPS0xO2ZvcihsZXQgciBvZiBpKShyPXQociwrK3MsaSkpIT1udWxsJiYocj0rcik+PXImJigrK2Usbis9cil9aWYoZSlyZXR1cm4gbi9lfWZ1bmN0aW9uKnVwKGkpe2Zvcihjb25zdCB0IG9mIGkpeWllbGQqS3UodCl9ZnVuY3Rpb24gcWkoaSl7cmV0dXJuIEFycmF5LmZyb20odXAoaSkpfXZhciBRPTFlLTYsbHI9MWUtMTIsWj1NYXRoLlBJLE50PVovMixocj1aLzQsUnQ9WioyLGh0PTE4MC9aLEg9Wi8xODAsSz1NYXRoLmFicyx6YT1NYXRoLmF0YW4sc2U9TWF0aC5hdGFuMixYPU1hdGguY29zLGZwPU1hdGguZXhwLFRhPU1hdGguaHlwb3QsZHA9TWF0aC5sb2cscT1NYXRoLnNpbixwcD1NYXRoLnNpZ258fGZ1bmN0aW9uKGkpe3JldHVybiBpPjA/MTppPDA/LTE6MH0sT2U9TWF0aC5zcXJ0LHlwPU1hdGgudGFuO2Z1bmN0aW9uIG1wKGkpe3JldHVybiBpPjE/MDppPC0xP1o6TWF0aC5hY29zKGkpfWZ1bmN0aW9uIERlKGkpe3JldHVybiBpPjE/TnQ6aTwtMT8tTnQ6TWF0aC5hc2luKGkpfWZ1bmN0aW9uIEtsKGkpe3JldHVybihpPXEoaS8yKSkqaX1mdW5jdGlvbiBfdCgpe31mdW5jdGlvbiB1cihpLHQpe2kmJmVoLmhhc093blByb3BlcnR5KGkudHlwZSkmJmVoW2kudHlwZV0oaSx0KX12YXIgdGg9e0ZlYXR1cmU6ZnVuY3Rpb24oaSx0KXt1cihpLmdlb21ldHJ5LHQpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmZlYXR1cmVzLG49LTEscz1lLmxlbmd0aDsrK248czspdXIoZVtuXS5nZW9tZXRyeSx0KX19LGVoPXtTcGhlcmU6ZnVuY3Rpb24oaSx0KXt0LnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbihpLHQpe2k9aS5jb29yZGluYXRlcyx0LnBvaW50KGlbMF0saVsxXSxpWzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspaT1lW25dLHQucG9pbnQoaVswXSxpWzFdLGlbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKGksdCl7RWEoaS5jb29yZGluYXRlcyx0LDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KUVhKGVbbl0sdCwwKX0sUG9seWdvbjpmdW5jdGlvbihpLHQpe25oKGkuY29vcmRpbmF0ZXMsdCl9LE11bHRpUG9seWdvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspbmgoZVtuXSx0KX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuZ2VvbWV0cmllcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KXVyKGVbbl0sdCl9fTtmdW5jdGlvbiBFYShpLHQsZSl7dmFyIG49LTEscz1pLmxlbmd0aC1lLHI7Zm9yKHQubGluZVN0YXJ0KCk7KytuPHM7KXI9aVtuXSx0LnBvaW50KHJbMF0sclsxXSxyWzJdKTt0LmxpbmVFbmQoKX1mdW5jdGlvbiBuaChpLHQpe3ZhciBlPS0xLG49aS5sZW5ndGg7Zm9yKHQucG9seWdvblN0YXJ0KCk7KytlPG47KUVhKGlbZV0sdCwxKTt0LnBvbHlnb25FbmQoKX1mdW5jdGlvbiBmcihpLHQpe2kmJnRoLmhhc093blByb3BlcnR5KGkudHlwZSk/dGhbaS50eXBlXShpLHQpOnVyKGksdCl9dmFyIGRyPW5ldyBMZSxpaD1uZXcgTGUsc2gscmgsUGEsQ2EsQmEsJGU9e3BvaW50Ol90LGxpbmVTdGFydDpfdCxsaW5lRW5kOl90LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2RyPW5ldyBMZSwkZS5saW5lU3RhcnQ9Z3AsJGUubGluZUVuZD14cH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciBpPStkcjtpaC5hZGQoaTwwP1J0K2k6aSksdGhpcy5saW5lU3RhcnQ9dGhpcy5saW5lRW5kPXRoaXMucG9pbnQ9X3R9LHNwaGVyZTpmdW5jdGlvbigpe2loLmFkZChSdCl9fTtmdW5jdGlvbiBncCgpeyRlLnBvaW50PXdwfWZ1bmN0aW9uIHhwKCl7b2goc2gscmgpfWZ1bmN0aW9uIHdwKGksdCl7JGUucG9pbnQ9b2gsc2g9aSxyaD10LGkqPUgsdCo9SCxQYT1pLENhPVgodD10LzIraHIpLEJhPXEodCl9ZnVuY3Rpb24gb2goaSx0KXtpKj1ILHQqPUgsdD10LzIraHI7dmFyIGU9aS1QYSxuPWU+PTA/MTotMSxzPW4qZSxyPVgodCksbz1xKHQpLGE9QmEqbyxjPUNhKnIrYSpYKHMpLGw9YSpuKnEocyk7ZHIuYWRkKHNlKGwsYykpLFBhPWksQ2E9cixCYT1vfWZ1bmN0aW9uIHByKGkpe3JldHVybltzZShpWzFdLGlbMF0pLERlKGlbMl0pXX1mdW5jdGlvbiBTbihpKXt2YXIgdD1pWzBdLGU9aVsxXSxuPVgoZSk7cmV0dXJuW24qWCh0KSxuKnEodCkscShlKV19ZnVuY3Rpb24geXIoaSx0KXtyZXR1cm4gaVswXSp0WzBdK2lbMV0qdFsxXStpWzJdKnRbMl19ZnVuY3Rpb24gc2koaSx0KXtyZXR1cm5baVsxXSp0WzJdLWlbMl0qdFsxXSxpWzJdKnRbMF0taVswXSp0WzJdLGlbMF0qdFsxXS1pWzFdKnRbMF1dfWZ1bmN0aW9uIEZhKGksdCl7aVswXSs9dFswXSxpWzFdKz10WzFdLGlbMl0rPXRbMl19ZnVuY3Rpb24gbXIoaSx0KXtyZXR1cm5baVswXSp0LGlbMV0qdCxpWzJdKnRdfWZ1bmN0aW9uIGdyKGkpe3ZhciB0PU9lKGlbMF0qaVswXStpWzFdKmlbMV0raVsyXSppWzJdKTtpWzBdLz10LGlbMV0vPXQsaVsyXS89dH12YXIgb3QsTHQsdXQsVXQsX24sYWgsY2gscmksSGksYW4sVmUsVWU9e3BvaW50OklhLGxpbmVTdGFydDpoaCxsaW5lRW5kOnVoLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1VlLnBvaW50PWZoLFVlLmxpbmVTdGFydD1icCxVZS5saW5lRW5kPU1wLEhpPW5ldyBMZSwkZS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpeyRlLnBvbHlnb25FbmQoKSxVZS5wb2ludD1JYSxVZS5saW5lU3RhcnQ9aGgsVWUubGluZUVuZD11aCxkcjwwPyhvdD0tKHV0PTE4MCksTHQ9LShVdD05MCkpOkhpPlE/VXQ9OTA6SGk8LVEmJihMdD0tOTApLFZlWzBdPW90LFZlWzFdPXV0fSxzcGhlcmU6ZnVuY3Rpb24oKXtvdD0tKHV0PTE4MCksTHQ9LShVdD05MCl9fTtmdW5jdGlvbiBJYShpLHQpe2FuLnB1c2goVmU9W290PWksdXQ9aV0pLHQ8THQmJihMdD10KSx0PlV0JiYoVXQ9dCl9ZnVuY3Rpb24gbGgoaSx0KXt2YXIgZT1TbihbaSpILHQqSF0pO2lmKHJpKXt2YXIgbj1zaShyaSxlKSxzPVtuWzFdLC1uWzBdLDBdLHI9c2kocyxuKTtncihyKSxyPXByKHIpO3ZhciBvPWktX24sYT1vPjA/MTotMSxjPXJbMF0qaHQqYSxsLGg9SyhvKT4xODA7aF4oYSpfbjxjJiZjPGEqaSk/KGw9clsxXSpodCxsPlV0JiYoVXQ9bCkpOihjPShjKzM2MCklMzYwLTE4MCxoXihhKl9uPGMmJmM8YSppKT8obD0tclsxXSpodCxsPEx0JiYoTHQ9bCkpOih0PEx0JiYoTHQ9dCksdD5VdCYmKFV0PXQpKSksaD9pPF9uP3F0KG90LGkpPnF0KG90LHV0KSYmKHV0PWkpOnF0KGksdXQpPnF0KG90LHV0KSYmKG90PWkpOnV0Pj1vdD8oaTxvdCYmKG90PWkpLGk+dXQmJih1dD1pKSk6aT5fbj9xdChvdCxpKT5xdChvdCx1dCkmJih1dD1pKTpxdChpLHV0KT5xdChvdCx1dCkmJihvdD1pKX1lbHNlIGFuLnB1c2goVmU9W290PWksdXQ9aV0pO3Q8THQmJihMdD10KSx0PlV0JiYoVXQ9dCkscmk9ZSxfbj1pfWZ1bmN0aW9uIGhoKCl7VWUucG9pbnQ9bGh9ZnVuY3Rpb24gdWgoKXtWZVswXT1vdCxWZVsxXT11dCxVZS5wb2ludD1JYSxyaT1udWxsfWZ1bmN0aW9uIGZoKGksdCl7aWYocmkpe3ZhciBlPWktX247SGkuYWRkKEsoZSk+MTgwP2UrKGU+MD8zNjA6LTM2MCk6ZSl9ZWxzZSBhaD1pLGNoPXQ7JGUucG9pbnQoaSx0KSxsaChpLHQpfWZ1bmN0aW9uIGJwKCl7JGUubGluZVN0YXJ0KCl9ZnVuY3Rpb24gTXAoKXtmaChhaCxjaCksJGUubGluZUVuZCgpLEsoSGkpPlEmJihvdD0tKHV0PTE4MCkpLFZlWzBdPW90LFZlWzFdPXV0LHJpPW51bGx9ZnVuY3Rpb24gcXQoaSx0KXtyZXR1cm4odC09aSk8MD90KzM2MDp0fWZ1bmN0aW9uIEFwKGksdCl7cmV0dXJuIGlbMF0tdFswXX1mdW5jdGlvbiBkaChpLHQpe3JldHVybiBpWzBdPD1pWzFdP2lbMF08PXQmJnQ8PWlbMV06dDxpWzBdfHxpWzFdPHR9ZnVuY3Rpb24gcGgoaSl7dmFyIHQsZSxuLHMscixvLGE7aWYoVXQ9dXQ9LShvdD1MdD0xLzApLGFuPVtdLGZyKGksVWUpLGU9YW4ubGVuZ3RoKXtmb3IoYW4uc29ydChBcCksdD0xLG49YW5bMF0scj1bbl07dDxlOysrdClzPWFuW3RdLGRoKG4sc1swXSl8fGRoKG4sc1sxXSk/KHF0KG5bMF0sc1sxXSk+cXQoblswXSxuWzFdKSYmKG5bMV09c1sxXSkscXQoc1swXSxuWzFdKT5xdChuWzBdLG5bMV0pJiYoblswXT1zWzBdKSk6ci5wdXNoKG49cyk7Zm9yKG89LTEvMCxlPXIubGVuZ3RoLTEsdD0wLG49cltlXTt0PD1lO249cywrK3Qpcz1yW3RdLChhPXF0KG5bMV0sc1swXSkpPm8mJihvPWEsb3Q9c1swXSx1dD1uWzFdKX1yZXR1cm4gYW49VmU9bnVsbCxvdD09PTEvMHx8THQ9PT0xLzA/W1tOYU4sTmFOXSxbTmFOLE5hTl1dOltbb3QsTHRdLFt1dCxVdF1dfXZhciBYaSx4cix3cixicixNcixBcixTcixfcixrYSxOYSxSYSx5aCxtaCxFdCxQdCxDdCxkZT17c3BoZXJlOl90LHBvaW50OkxhLGxpbmVTdGFydDpnaCxsaW5lRW5kOnhoLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2RlLmxpbmVTdGFydD12cCxkZS5saW5lRW5kPXpwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7ZGUubGluZVN0YXJ0PWdoLGRlLmxpbmVFbmQ9eGh9fTtmdW5jdGlvbiBMYShpLHQpe2kqPUgsdCo9SDt2YXIgZT1YKHQpO0dpKGUqWChpKSxlKnEoaSkscSh0KSl9ZnVuY3Rpb24gR2koaSx0LGUpeysrWGksd3IrPShpLXdyKS9YaSxicis9KHQtYnIpL1hpLE1yKz0oZS1NcikvWGl9ZnVuY3Rpb24gZ2goKXtkZS5wb2ludD1TcH1mdW5jdGlvbiBTcChpLHQpe2kqPUgsdCo9SDt2YXIgZT1YKHQpO0V0PWUqWChpKSxQdD1lKnEoaSksQ3Q9cSh0KSxkZS5wb2ludD1fcCxHaShFdCxQdCxDdCl9ZnVuY3Rpb24gX3AoaSx0KXtpKj1ILHQqPUg7dmFyIGU9WCh0KSxuPWUqWChpKSxzPWUqcShpKSxyPXEodCksbz1zZShPZSgobz1QdCpyLUN0KnMpKm8rKG89Q3Qqbi1FdCpyKSpvKyhvPUV0KnMtUHQqbikqbyksRXQqbitQdCpzK0N0KnIpO3hyKz1vLEFyKz1vKihFdCsoRXQ9bikpLFNyKz1vKihQdCsoUHQ9cykpLF9yKz1vKihDdCsoQ3Q9cikpLEdpKEV0LFB0LEN0KX1mdW5jdGlvbiB4aCgpe2RlLnBvaW50PUxhfWZ1bmN0aW9uIHZwKCl7ZGUucG9pbnQ9VHB9ZnVuY3Rpb24genAoKXt3aCh5aCxtaCksZGUucG9pbnQ9TGF9ZnVuY3Rpb24gVHAoaSx0KXt5aD1pLG1oPXQsaSo9SCx0Kj1ILGRlLnBvaW50PXdoO3ZhciBlPVgodCk7RXQ9ZSpYKGkpLFB0PWUqcShpKSxDdD1xKHQpLEdpKEV0LFB0LEN0KX1mdW5jdGlvbiB3aChpLHQpe2kqPUgsdCo9SDt2YXIgZT1YKHQpLG49ZSpYKGkpLHM9ZSpxKGkpLHI9cSh0KSxvPVB0KnItQ3QqcyxhPUN0Km4tRXQqcixjPUV0KnMtUHQqbixsPVRhKG8sYSxjKSxoPURlKGwpLHU9bCYmLWgvbDtrYS5hZGQodSpvKSxOYS5hZGQodSphKSxSYS5hZGQodSpjKSx4cis9aCxBcis9aCooRXQrKEV0PW4pKSxTcis9aCooUHQrKFB0PXMpKSxfcis9aCooQ3QrKEN0PXIpKSxHaShFdCxQdCxDdCl9ZnVuY3Rpb24gYmgoaSl7WGk9eHI9d3I9YnI9TXI9QXI9U3I9X3I9MCxrYT1uZXcgTGUsTmE9bmV3IExlLFJhPW5ldyBMZSxmcihpLGRlKTt2YXIgdD0ra2EsZT0rTmEsbj0rUmEscz1UYSh0LGUsbik7cmV0dXJuIHM8bHImJih0PUFyLGU9U3Isbj1fcix4cjxRJiYodD13cixlPWJyLG49TXIpLHM9VGEodCxlLG4pLHM8bHIpP1tOYU4sTmFOXTpbc2UoZSx0KSpodCxEZShuL3MpKmh0XX1mdW5jdGlvbiBPYShpLHQpe2Z1bmN0aW9uIGUobixzKXtyZXR1cm4gbj1pKG4scyksdChuWzBdLG5bMV0pfXJldHVybiBpLmludmVydCYmdC5pbnZlcnQmJihlLmludmVydD1mdW5jdGlvbihuLHMpe3JldHVybiBuPXQuaW52ZXJ0KG4scyksbiYmaS5pbnZlcnQoblswXSxuWzFdKX0pLGV9ZnVuY3Rpb24gRGEoaSx0KXtyZXR1cm4gSyhpKT5aJiYoaS09TWF0aC5yb3VuZChpL1J0KSpSdCksW2ksdF19RGEuaW52ZXJ0PURhO2Z1bmN0aW9uIE1oKGksdCxlKXtyZXR1cm4oaSU9UnQpP3R8fGU/T2EoU2goaSksX2godCxlKSk6U2goaSk6dHx8ZT9faCh0LGUpOkRhfWZ1bmN0aW9uIEFoKGkpe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiB0Kz1pLEsodCk+WiYmKHQtPU1hdGgucm91bmQodC9SdCkqUnQpLFt0LGVdfX1mdW5jdGlvbiBTaChpKXt2YXIgdD1BaChpKTtyZXR1cm4gdC5pbnZlcnQ9QWgoLWkpLHR9ZnVuY3Rpb24gX2goaSx0KXt2YXIgZT1YKGkpLG49cShpKSxzPVgodCkscj1xKHQpO2Z1bmN0aW9uIG8oYSxjKXt2YXIgbD1YKGMpLGg9WChhKSpsLHU9cShhKSpsLGY9cShjKSxkPWYqZStoKm47cmV0dXJuW3NlKHUqcy1kKnIsaCplLWYqbiksRGUoZCpzK3UqcildfXJldHVybiBvLmludmVydD1mdW5jdGlvbihhLGMpe3ZhciBsPVgoYyksaD1YKGEpKmwsdT1xKGEpKmwsZj1xKGMpLGQ9ZipzLXUqcjtyZXR1cm5bc2UodSpzK2YqcixoKmUrZCpuKSxEZShkKmUtaCpuKV19LG99ZnVuY3Rpb24gdmgoaSl7aT1NaChpWzBdKkgsaVsxXSpILGkubGVuZ3RoPjI/aVsyXSpIOjApO2Z1bmN0aW9uIHQoZSl7cmV0dXJuIGU9aShlWzBdKkgsZVsxXSpIKSxlWzBdKj1odCxlWzFdKj1odCxlfXJldHVybiB0LmludmVydD1mdW5jdGlvbihlKXtyZXR1cm4gZT1pLmludmVydChlWzBdKkgsZVsxXSpIKSxlWzBdKj1odCxlWzFdKj1odCxlfSx0fWZ1bmN0aW9uIEVwKGksdCxlLG4scyxyKXtpZihlKXt2YXIgbz1YKHQpLGE9cSh0KSxjPW4qZTtzPT1udWxsPyhzPXQrbipSdCxyPXQtYy8yKToocz16aChvLHMpLHI9emgobyxyKSwobj4wP3M8cjpzPnIpJiYocys9bipSdCkpO2Zvcih2YXIgbCxoPXM7bj4wP2g+cjpoPHI7aC09YylsPXByKFtvLC1hKlgoaCksLWEqcShoKV0pLGkucG9pbnQobFswXSxsWzFdKX19ZnVuY3Rpb24gemgoaSx0KXt0PVNuKHQpLHRbMF0tPWksZ3IodCk7dmFyIGU9bXAoLXRbMV0pO3JldHVybigoLXRbMl08MD8tZTplKStSdC1RKSVSdH1mdW5jdGlvbiBUaCgpe3ZhciBpPVtdLHQ7cmV0dXJue3BvaW50OmZ1bmN0aW9uKGUsbixzKXt0LnB1c2goW2UsbixzXSl9LGxpbmVTdGFydDpmdW5jdGlvbigpe2kucHVzaCh0PVtdKX0sbGluZUVuZDpfdCxyZWpvaW46ZnVuY3Rpb24oKXtpLmxlbmd0aD4xJiZpLnB1c2goaS5wb3AoKS5jb25jYXQoaS5zaGlmdCgpKSl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciBlPWk7cmV0dXJuIGk9W10sdD1udWxsLGV9fX1mdW5jdGlvbiB2cihpLHQpe3JldHVybiBLKGlbMF0tdFswXSk8USYmSyhpWzFdLXRbMV0pPFF9ZnVuY3Rpb24genIoaSx0LGUsbil7dGhpcy54PWksdGhpcy56PXQsdGhpcy5vPWUsdGhpcy5lPW4sdGhpcy52PSExLHRoaXMubj10aGlzLnA9bnVsbH1mdW5jdGlvbiBFaChpLHQsZSxuLHMpe3ZhciByPVtdLG89W10sYSxjO2lmKGkuZm9yRWFjaChmdW5jdGlvbihwKXtpZighKCh5PXAubGVuZ3RoLTEpPD0wKSl7dmFyIHksbT1wWzBdLGc9cFt5XSxiO2lmKHZyKG0sZykpe2lmKCFtWzJdJiYhZ1syXSl7Zm9yKHMubGluZVN0YXJ0KCksYT0wO2E8eTsrK2Epcy5wb2ludCgobT1wW2FdKVswXSxtWzFdKTtzLmxpbmVFbmQoKTtyZXR1cm59Z1swXSs9MipRfXIucHVzaChiPW5ldyB6cihtLHAsbnVsbCwhMCkpLG8ucHVzaChiLm89bmV3IHpyKG0sbnVsbCxiLCExKSksci5wdXNoKGI9bmV3IHpyKGcscCxudWxsLCExKSksby5wdXNoKGIubz1uZXcgenIoZyxudWxsLGIsITApKX19KSwhIXIubGVuZ3RoKXtmb3Ioby5zb3J0KHQpLFBoKHIpLFBoKG8pLGE9MCxjPW8ubGVuZ3RoO2E8YzsrK2Epb1thXS5lPWU9IWU7Zm9yKHZhciBsPXJbMF0saCx1Ozspe2Zvcih2YXIgZj1sLGQ9ITA7Zi52OylpZigoZj1mLm4pPT09bClyZXR1cm47aD1mLnoscy5saW5lU3RhcnQoKTtkb3tpZihmLnY9Zi5vLnY9ITAsZi5lKXtpZihkKWZvcihhPTAsYz1oLmxlbmd0aDthPGM7KythKXMucG9pbnQoKHU9aFthXSlbMF0sdVsxXSk7ZWxzZSBuKGYueCxmLm4ueCwxLHMpO2Y9Zi5ufWVsc2V7aWYoZClmb3IoaD1mLnAueixhPWgubGVuZ3RoLTE7YT49MDstLWEpcy5wb2ludCgodT1oW2FdKVswXSx1WzFdKTtlbHNlIG4oZi54LGYucC54LC0xLHMpO2Y9Zi5wfWY9Zi5vLGg9Zi56LGQ9IWR9d2hpbGUoIWYudik7cy5saW5lRW5kKCl9fX1mdW5jdGlvbiBQaChpKXtpZih0PWkubGVuZ3RoKXtmb3IodmFyIHQsZT0wLG49aVswXSxzOysrZTx0OyluLm49cz1pW2VdLHMucD1uLG49cztuLm49cz1pWzBdLHMucD1ufX1mdW5jdGlvbiAkYShpKXtyZXR1cm4gSyhpWzBdKTw9Wj9pWzBdOnBwKGlbMF0pKigoSyhpWzBdKStaKSVSdC1aKX1mdW5jdGlvbiBDaChpLHQpe3ZhciBlPSRhKHQpLG49dFsxXSxzPXEobikscj1bcShlKSwtWChlKSwwXSxvPTAsYT0wLGM9bmV3IExlO3M9PT0xP249TnQrUTpzPT09LTEmJihuPS1OdC1RKTtmb3IodmFyIGw9MCxoPWkubGVuZ3RoO2w8aDsrK2wpaWYoZj0odT1pW2xdKS5sZW5ndGgpZm9yKHZhciB1LGYsZD11W2YtMV0scD0kYShkKSx5PWRbMV0vMitocixtPXEoeSksZz1YKHkpLGI9MDtiPGY7KytiLHA9eCxtPUEsZz1TLGQ9dyl7dmFyIHc9dVtiXSx4PSRhKHcpLE09d1sxXS8yK2hyLEE9cShNKSxTPVgoTSksdj14LXAsXz12Pj0wPzE6LTEsRT1fKnYsej1FPlosQz1tKkE7aWYoYy5hZGQoc2UoQypfKnEoRSksZypTK0MqWChFKSkpLG8rPXo/ditfKlJ0OnYsel5wPj1lXng+PWUpe3ZhciBQPXNpKFNuKGQpLFNuKHcpKTtncihQKTt2YXIgRj1zaShyLFApO2dyKEYpO3ZhciBCPSh6XnY+PTA/LTE6MSkqRGUoRlsyXSk7KG4+Qnx8bj09PUImJihQWzBdfHxQWzFdKSkmJihhKz16XnY+PTA/MTotMSl9fXJldHVybihvPC1RfHxvPFEmJmM8LWxyKV5hJjF9ZnVuY3Rpb24gQmgoaSx0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKHMpe3ZhciByPXQocyksbz1UaCgpLGE9dChvKSxjPSExLGwsaCx1LGY9e3BvaW50OmQsbGluZVN0YXJ0OnksbGluZUVuZDptLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2YucG9pbnQ9ZyxmLmxpbmVTdGFydD1iLGYubGluZUVuZD13LGg9W10sbD1bXX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2YucG9pbnQ9ZCxmLmxpbmVTdGFydD15LGYubGluZUVuZD1tLGg9cWkoaCk7dmFyIHg9Q2gobCxuKTtoLmxlbmd0aD8oY3x8KHMucG9seWdvblN0YXJ0KCksYz0hMCksRWgoaCxDcCx4LGUscykpOngmJihjfHwocy5wb2x5Z29uU3RhcnQoKSxjPSEwKSxzLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEscykscy5saW5lRW5kKCkpLGMmJihzLnBvbHlnb25FbmQoKSxjPSExKSxoPWw9bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7cy5wb2x5Z29uU3RhcnQoKSxzLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEscykscy5saW5lRW5kKCkscy5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBkKHgsTSl7aSh4LE0pJiZzLnBvaW50KHgsTSl9ZnVuY3Rpb24gcCh4LE0pe3IucG9pbnQoeCxNKX1mdW5jdGlvbiB5KCl7Zi5wb2ludD1wLHIubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbSgpe2YucG9pbnQ9ZCxyLmxpbmVFbmQoKX1mdW5jdGlvbiBnKHgsTSl7dS5wdXNoKFt4LE1dKSxhLnBvaW50KHgsTSl9ZnVuY3Rpb24gYigpe2EubGluZVN0YXJ0KCksdT1bXX1mdW5jdGlvbiB3KCl7Zyh1WzBdWzBdLHVbMF1bMV0pLGEubGluZUVuZCgpO3ZhciB4PWEuY2xlYW4oKSxNPW8ucmVzdWx0KCksQSxTPU0ubGVuZ3RoLHYsXyxFO2lmKHUucG9wKCksbC5wdXNoKHUpLHU9bnVsbCwhIVMpe2lmKHgmMSl7aWYoXz1NWzBdLCh2PV8ubGVuZ3RoLTEpPjApe2ZvcihjfHwocy5wb2x5Z29uU3RhcnQoKSxjPSEwKSxzLmxpbmVTdGFydCgpLEE9MDtBPHY7KytBKXMucG9pbnQoKEU9X1tBXSlbMF0sRVsxXSk7cy5saW5lRW5kKCl9cmV0dXJufVM+MSYmeCYyJiZNLnB1c2goTS5wb3AoKS5jb25jYXQoTS5zaGlmdCgpKSksaC5wdXNoKE0uZmlsdGVyKFBwKSl9fXJldHVybiBmfX1mdW5jdGlvbiBQcChpKXtyZXR1cm4gaS5sZW5ndGg+MX1mdW5jdGlvbiBDcChpLHQpe3JldHVybigoaT1pLngpWzBdPDA/aVsxXS1OdC1ROk50LWlbMV0pLSgodD10LngpWzBdPDA/dFsxXS1OdC1ROk50LXRbMV0pfXZhciBGaD1CaChmdW5jdGlvbigpe3JldHVybiEwfSxCcCxJcCxbLVosLU50XSk7ZnVuY3Rpb24gQnAoaSl7dmFyIHQ9TmFOLGU9TmFOLG49TmFOLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2kubGluZVN0YXJ0KCkscz0xfSxwb2ludDpmdW5jdGlvbihyLG8pe3ZhciBhPXI+MD9aOi1aLGM9SyhyLXQpO0soYy1aKTxRPyhpLnBvaW50KHQsZT0oZStvKS8yPjA/TnQ6LU50KSxpLnBvaW50KG4sZSksaS5saW5lRW5kKCksaS5saW5lU3RhcnQoKSxpLnBvaW50KGEsZSksaS5wb2ludChyLGUpLHM9MCk6biE9PWEmJmM+PVomJihLKHQtbik8USYmKHQtPW4qUSksSyhyLWEpPFEmJihyLT1hKlEpLGU9RnAodCxlLHIsbyksaS5wb2ludChuLGUpLGkubGluZUVuZCgpLGkubGluZVN0YXJ0KCksaS5wb2ludChhLGUpLHM9MCksaS5wb2ludCh0PXIsZT1vKSxuPWF9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtpLmxpbmVFbmQoKSx0PWU9TmFOfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiAyLXN9fX1mdW5jdGlvbiBGcChpLHQsZSxuKXt2YXIgcyxyLG89cShpLWUpO3JldHVybiBLKG8pPlE/emEoKHEodCkqKHI9WChuKSkqcShlKS1xKG4pKihzPVgodCkpKnEoaSkpLyhzKnIqbykpOih0K24pLzJ9ZnVuY3Rpb24gSXAoaSx0LGUsbil7dmFyIHM7aWYoaT09bnVsbClzPWUqTnQsbi5wb2ludCgtWixzKSxuLnBvaW50KDAscyksbi5wb2ludChaLHMpLG4ucG9pbnQoWiwwKSxuLnBvaW50KFosLXMpLG4ucG9pbnQoMCwtcyksbi5wb2ludCgtWiwtcyksbi5wb2ludCgtWiwwKSxuLnBvaW50KC1aLHMpO2Vsc2UgaWYoSyhpWzBdLXRbMF0pPlEpe3ZhciByPWlbMF08dFswXT9aOi1aO3M9ZSpyLzIsbi5wb2ludCgtcixzKSxuLnBvaW50KDAscyksbi5wb2ludChyLHMpfWVsc2Ugbi5wb2ludCh0WzBdLHRbMV0pfWZ1bmN0aW9uIGtwKGkpe3ZhciB0PVgoaSksZT0yKkgsbj10PjAscz1LKHQpPlE7ZnVuY3Rpb24gcihoLHUsZixkKXtFcChkLGksZSxmLGgsdSl9ZnVuY3Rpb24gbyhoLHUpe3JldHVybiBYKGgpKlgodSk+dH1mdW5jdGlvbiBhKGgpe3ZhciB1LGYsZCxwLHk7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3A9ZD0hMSx5PTF9LHBvaW50OmZ1bmN0aW9uKG0sZyl7dmFyIGI9W20sZ10sdyx4PW8obSxnKSxNPW4/eD8wOmwobSxnKTp4P2wobSsobTwwP1o6LVopLGcpOjA7aWYoIXUmJihwPWQ9eCkmJmgubGluZVN0YXJ0KCkseCE9PWQmJih3PWModSxiKSwoIXd8fHZyKHUsdyl8fHZyKGIsdykpJiYoYlsyXT0xKSkseCE9PWQpeT0wLHg/KGgubGluZVN0YXJ0KCksdz1jKGIsdSksaC5wb2ludCh3WzBdLHdbMV0pKToodz1jKHUsYiksaC5wb2ludCh3WzBdLHdbMV0sMiksaC5saW5lRW5kKCkpLHU9dztlbHNlIGlmKHMmJnUmJm5eeCl7dmFyIEE7IShNJmYpJiYoQT1jKGIsdSwhMCkpJiYoeT0wLG4/KGgubGluZVN0YXJ0KCksaC5wb2ludChBWzBdWzBdLEFbMF1bMV0pLGgucG9pbnQoQVsxXVswXSxBWzFdWzFdKSxoLmxpbmVFbmQoKSk6KGgucG9pbnQoQVsxXVswXSxBWzFdWzFdKSxoLmxpbmVFbmQoKSxoLmxpbmVTdGFydCgpLGgucG9pbnQoQVswXVswXSxBWzBdWzFdLDMpKSl9eCYmKCF1fHwhdnIodSxiKSkmJmgucG9pbnQoYlswXSxiWzFdKSx1PWIsZD14LGY9TX0sbGluZUVuZDpmdW5jdGlvbigpe2QmJmgubGluZUVuZCgpLHU9bnVsbH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4geXwocCYmZCk8PDF9fX1mdW5jdGlvbiBjKGgsdSxmKXt2YXIgZD1TbihoKSxwPVNuKHUpLHk9WzEsMCwwXSxtPXNpKGQscCksZz15cihtLG0pLGI9bVswXSx3PWctYipiO2lmKCF3KXJldHVybiFmJiZoO3ZhciB4PXQqZy93LE09LXQqYi93LEE9c2koeSxtKSxTPW1yKHkseCksdj1tcihtLE0pO0ZhKFMsdik7dmFyIF89QSxFPXlyKFMsXyksej15cihfLF8pLEM9RSpFLXoqKHlyKFMsUyktMSk7aWYoIShDPDApKXt2YXIgUD1PZShDKSxGPW1yKF8sKC1FLVApL3opO2lmKEZhKEYsUyksRj1wcihGKSwhZilyZXR1cm4gRjt2YXIgQj1oWzBdLEk9dVswXSxSPWhbMV0sJD11WzFdLFY7STxCJiYoVj1CLEI9SSxJPVYpO3ZhciBudD1JLUIseHQ9SyhudC1aKTxRLHJlPXh0fHxudDxRO2lmKCF4dCYmJDxSJiYoVj1SLFI9JCwkPVYpLHJlP3h0P1IrJD4wXkZbMV08KEsoRlswXS1CKTxRP1I6JCk6Ujw9RlsxXSYmRlsxXTw9JDpudD5aXihCPD1GWzBdJiZGWzBdPD1JKSl7dmFyIFh0PW1yKF8sKC1FK1ApL3opO3JldHVybiBGYShYdCxTKSxbRixwcihYdCldfX19ZnVuY3Rpb24gbChoLHUpe3ZhciBmPW4/aTpaLWksZD0wO3JldHVybiBoPC1mP2R8PTE6aD5mJiYoZHw9MiksdTwtZj9kfD00OnU+ZiYmKGR8PTgpLGR9cmV0dXJuIEJoKG8sYSxyLG4/WzAsLWldOlstWixpLVpdKX1mdW5jdGlvbiBOcChpLHQsZSxuLHMscil7dmFyIG89aVswXSxhPWlbMV0sYz10WzBdLGw9dFsxXSxoPTAsdT0xLGY9Yy1vLGQ9bC1hLHA7aWYocD1lLW8sISghZiYmcD4wKSl7aWYocC89ZixmPDApe2lmKHA8aClyZXR1cm47cDx1JiYodT1wKX1lbHNlIGlmKGY+MCl7aWYocD51KXJldHVybjtwPmgmJihoPXApfWlmKHA9cy1vLCEoIWYmJnA8MCkpe2lmKHAvPWYsZjwwKXtpZihwPnUpcmV0dXJuO3A+aCYmKGg9cCl9ZWxzZSBpZihmPjApe2lmKHA8aClyZXR1cm47cDx1JiYodT1wKX1pZihwPW4tYSwhKCFkJiZwPjApKXtpZihwLz1kLGQ8MCl7aWYocDxoKXJldHVybjtwPHUmJih1PXApfWVsc2UgaWYoZD4wKXtpZihwPnUpcmV0dXJuO3A+aCYmKGg9cCl9aWYocD1yLWEsISghZCYmcDwwKSl7aWYocC89ZCxkPDApe2lmKHA+dSlyZXR1cm47cD5oJiYoaD1wKX1lbHNlIGlmKGQ+MCl7aWYocDxoKXJldHVybjtwPHUmJih1PXApfXJldHVybiBoPjAmJihpWzBdPW8raCpmLGlbMV09YStoKmQpLHU8MSYmKHRbMF09byt1KmYsdFsxXT1hK3UqZCksITB9fX19fXZhciBXaT0xZTksVHI9LVdpO2Z1bmN0aW9uIFJwKGksdCxlLG4pe2Z1bmN0aW9uIHMobCxoKXtyZXR1cm4gaTw9bCYmbDw9ZSYmdDw9aCYmaDw9bn1mdW5jdGlvbiByKGwsaCx1LGYpe3ZhciBkPTAscD0wO2lmKGw9PW51bGx8fChkPW8obCx1KSkhPT0ocD1vKGgsdSkpfHxjKGwsaCk8MF51PjApZG8gZi5wb2ludChkPT09MHx8ZD09PTM/aTplLGQ+MT9uOnQpO3doaWxlKChkPShkK3UrNCklNCkhPT1wKTtlbHNlIGYucG9pbnQoaFswXSxoWzFdKX1mdW5jdGlvbiBvKGwsaCl7cmV0dXJuIEsobFswXS1pKTxRP2g+MD8wOjM6SyhsWzBdLWUpPFE/aD4wPzI6MTpLKGxbMV0tdCk8UT9oPjA/MTowOmg+MD8zOjJ9ZnVuY3Rpb24gYShsLGgpe3JldHVybiBjKGwueCxoLngpfWZ1bmN0aW9uIGMobCxoKXt2YXIgdT1vKGwsMSksZj1vKGgsMSk7cmV0dXJuIHUhPT1mP3UtZjp1PT09MD9oWzFdLWxbMV06dT09PTE/bFswXS1oWzBdOnU9PT0yP2xbMV0taFsxXTpoWzBdLWxbMF19cmV0dXJuIGZ1bmN0aW9uKGwpe3ZhciBoPWwsdT1UaCgpLGYsZCxwLHksbSxnLGIsdyx4LE0sQSxTPXtwb2ludDp2LGxpbmVTdGFydDpDLGxpbmVFbmQ6UCxwb2x5Z29uU3RhcnQ6RSxwb2x5Z29uRW5kOnp9O2Z1bmN0aW9uIHYoQixJKXtzKEIsSSkmJmgucG9pbnQoQixJKX1mdW5jdGlvbiBfKCl7Zm9yKHZhciBCPTAsST0wLFI9ZC5sZW5ndGg7STxSOysrSSlmb3IodmFyICQ9ZFtJXSxWPTEsbnQ9JC5sZW5ndGgseHQ9JFswXSxyZSxYdCxHdD14dFswXSx5ZT14dFsxXTtWPG50OysrVilyZT1HdCxYdD15ZSx4dD0kW1ZdLEd0PXh0WzBdLHllPXh0WzFdLFh0PD1uP3llPm4mJihHdC1yZSkqKG4tWHQpPih5ZS1YdCkqKGktcmUpJiYrK0I6eWU8PW4mJihHdC1yZSkqKG4tWHQpPCh5ZS1YdCkqKGktcmUpJiYtLUI7cmV0dXJuIEJ9ZnVuY3Rpb24gRSgpe2g9dSxmPVtdLGQ9W10sQT0hMH1mdW5jdGlvbiB6KCl7dmFyIEI9XygpLEk9QSYmQixSPShmPXFpKGYpKS5sZW5ndGg7KEl8fFIpJiYobC5wb2x5Z29uU3RhcnQoKSxJJiYobC5saW5lU3RhcnQoKSxyKG51bGwsbnVsbCwxLGwpLGwubGluZUVuZCgpKSxSJiZFaChmLGEsQixyLGwpLGwucG9seWdvbkVuZCgpKSxoPWwsZj1kPXA9bnVsbH1mdW5jdGlvbiBDKCl7Uy5wb2ludD1GLGQmJmQucHVzaChwPVtdKSxNPSEwLHg9ITEsYj13PU5hTn1mdW5jdGlvbiBQKCl7ZiYmKEYoeSxtKSxnJiZ4JiZ1LnJlam9pbigpLGYucHVzaCh1LnJlc3VsdCgpKSksUy5wb2ludD12LHgmJmgubGluZUVuZCgpfWZ1bmN0aW9uIEYoQixJKXt2YXIgUj1zKEIsSSk7aWYoZCYmcC5wdXNoKFtCLEldKSxNKXk9QixtPUksZz1SLE09ITEsUiYmKGgubGluZVN0YXJ0KCksaC5wb2ludChCLEkpKTtlbHNlIGlmKFImJngpaC5wb2ludChCLEkpO2Vsc2V7dmFyICQ9W2I9TWF0aC5tYXgoVHIsTWF0aC5taW4oV2ksYikpLHc9TWF0aC5tYXgoVHIsTWF0aC5taW4oV2ksdykpXSxWPVtCPU1hdGgubWF4KFRyLE1hdGgubWluKFdpLEIpKSxJPU1hdGgubWF4KFRyLE1hdGgubWluKFdpLEkpKV07TnAoJCxWLGksdCxlLG4pPyh4fHwoaC5saW5lU3RhcnQoKSxoLnBvaW50KCRbMF0sJFsxXSkpLGgucG9pbnQoVlswXSxWWzFdKSxSfHxoLmxpbmVFbmQoKSxBPSExKTpSJiYoaC5saW5lU3RhcnQoKSxoLnBvaW50KEIsSSksQT0hMSl9Yj1CLHc9SSx4PVJ9cmV0dXJuIFN9fXZhciBWYSxVYSxFcixQcixvaT17c3BoZXJlOl90LHBvaW50Ol90LGxpbmVTdGFydDpMcCxsaW5lRW5kOl90LHBvbHlnb25TdGFydDpfdCxwb2x5Z29uRW5kOl90fTtmdW5jdGlvbiBMcCgpe29pLnBvaW50PURwLG9pLmxpbmVFbmQ9T3B9ZnVuY3Rpb24gT3AoKXtvaS5wb2ludD1vaS5saW5lRW5kPV90fWZ1bmN0aW9uIERwKGksdCl7aSo9SCx0Kj1ILFVhPWksRXI9cSh0KSxQcj1YKHQpLG9pLnBvaW50PSRwfWZ1bmN0aW9uICRwKGksdCl7aSo9SCx0Kj1IO3ZhciBlPXEodCksbj1YKHQpLHM9SyhpLVVhKSxyPVgocyksbz1xKHMpLGE9bipvLGM9UHIqZS1FcipuKnIsbD1FciplK1ByKm4qcjtWYS5hZGQoc2UoT2UoYSphK2MqYyksbCkpLFVhPWksRXI9ZSxQcj1ufWZ1bmN0aW9uIFZwKGkpe3JldHVybiBWYT1uZXcgTGUsZnIoaSxvaSksK1ZhfXZhciBxYT1bbnVsbCxudWxsXSxVcD17dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6cWF9O2Z1bmN0aW9uIGFpKGksdCl7cmV0dXJuIHFhWzBdPWkscWFbMV09dCxWcChVcCl9dmFyIEloPXtGZWF0dXJlOmZ1bmN0aW9uKGksdCl7cmV0dXJuIENyKGkuZ2VvbWV0cnksdCl9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuZmVhdHVyZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylpZihDcihlW25dLmdlb21ldHJ5LHQpKXJldHVybiEwO3JldHVybiExfX0sa2g9e1NwaGVyZTpmdW5jdGlvbigpe3JldHVybiEwfSxQb2ludDpmdW5jdGlvbihpLHQpe3JldHVybiBOaChpLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvaW50OmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuY29vcmRpbmF0ZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylpZihOaChlW25dLHQpKXJldHVybiEwO3JldHVybiExfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKGksdCl7cmV0dXJuIFJoKGkuY29vcmRpbmF0ZXMsdCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspaWYoUmgoZVtuXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX0sUG9seWdvbjpmdW5jdGlvbihpLHQpe3JldHVybiBMaChpLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KWlmKExoKGVbbl0sdCkpcmV0dXJuITA7cmV0dXJuITF9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmdlb21ldHJpZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylpZihDcihlW25dLHQpKXJldHVybiEwO3JldHVybiExfX07ZnVuY3Rpb24gQ3IoaSx0KXtyZXR1cm4gaSYma2guaGFzT3duUHJvcGVydHkoaS50eXBlKT9raFtpLnR5cGVdKGksdCk6ITF9ZnVuY3Rpb24gTmgoaSx0KXtyZXR1cm4gYWkoaSx0KT09PTB9ZnVuY3Rpb24gUmgoaSx0KXtmb3IodmFyIGUsbixzLHI9MCxvPWkubGVuZ3RoO3I8bztyKyspe2lmKG49YWkoaVtyXSx0KSxuPT09MHx8cj4wJiYocz1haShpW3JdLGlbci0xXSkscz4wJiZlPD1zJiZuPD1zJiYoZStuLXMpKigxLU1hdGgucG93KChlLW4pL3MsMikpPGxyKnMpKXJldHVybiEwO2U9bn1yZXR1cm4hMX1mdW5jdGlvbiBMaChpLHQpe3JldHVybiEhQ2goaS5tYXAocXApLE9oKHQpKX1mdW5jdGlvbiBxcChpKXtyZXR1cm4gaT1pLm1hcChPaCksaS5wb3AoKSxpfWZ1bmN0aW9uIE9oKGkpe3JldHVybltpWzBdKkgsaVsxXSpIXX1mdW5jdGlvbiBIcChpLHQpe3JldHVybihpJiZJaC5oYXNPd25Qcm9wZXJ0eShpLnR5cGUpP0loW2kudHlwZV06Q3IpKGksdCl9ZnVuY3Rpb24gWHAoaSx0KXt2YXIgZT1pWzBdKkgsbj1pWzFdKkgscz10WzBdKkgscj10WzFdKkgsbz1YKG4pLGE9cShuKSxjPVgociksbD1xKHIpLGg9bypYKGUpLHU9bypxKGUpLGY9YypYKHMpLGQ9YypxKHMpLHA9MipEZShPZShLbChyLW4pK28qYypLbChzLWUpKSkseT1xKHApLG09cD9mdW5jdGlvbihnKXt2YXIgYj1xKGcqPXApL3ksdz1xKHAtZykveSx4PXcqaCtiKmYsTT13KnUrYipkLEE9dyphK2IqbDtyZXR1cm5bc2UoTSx4KSpodCxzZShBLE9lKHgqeCtNKk0pKSpodF19OmZ1bmN0aW9uKCl7cmV0dXJuW2UqaHQsbipodF19O3JldHVybiBtLmRpc3RhbmNlPXAsbX12YXIgRGg9aT0+aSxjaT0xLzAsQnI9Y2ksWmk9LWNpLEZyPVppLCRoPXtwb2ludDpHcCxsaW5lU3RhcnQ6X3QsbGluZUVuZDpfdCxwb2x5Z29uU3RhcnQ6X3QscG9seWdvbkVuZDpfdCxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgaT1bW2NpLEJyXSxbWmksRnJdXTtyZXR1cm4gWmk9RnI9LShCcj1jaT0xLzApLGl9fTtmdW5jdGlvbiBHcChpLHQpe2k8Y2kmJihjaT1pKSxpPlppJiYoWmk9aSksdDxCciYmKEJyPXQpLHQ+RnImJihGcj10KX1mdW5jdGlvbiBIYShpKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9bmV3IFhhO2Zvcih2YXIgbiBpbiBpKWVbbl09aVtuXTtyZXR1cm4gZS5zdHJlYW09dCxlfX1mdW5jdGlvbiBYYSgpe31YYS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlhhLHBvaW50OmZ1bmN0aW9uKGksdCl7dGhpcy5zdHJlYW0ucG9pbnQoaSx0KX0sc3BoZXJlOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25FbmQoKX19O2Z1bmN0aW9uIEdhKGksdCxlKXt2YXIgbj1pLmNsaXBFeHRlbnQmJmkuY2xpcEV4dGVudCgpO3JldHVybiBpLnNjYWxlKDE1MCkudHJhbnNsYXRlKFswLDBdKSxuIT1udWxsJiZpLmNsaXBFeHRlbnQobnVsbCksZnIoZSxpLnN0cmVhbSgkaCkpLHQoJGgucmVzdWx0KCkpLG4hPW51bGwmJmkuY2xpcEV4dGVudChuKSxpfWZ1bmN0aW9uIFZoKGksdCxlKXtyZXR1cm4gR2EoaSxmdW5jdGlvbihuKXt2YXIgcz10WzFdWzBdLXRbMF1bMF0scj10WzFdWzFdLXRbMF1bMV0sbz1NYXRoLm1pbihzLyhuWzFdWzBdLW5bMF1bMF0pLHIvKG5bMV1bMV0tblswXVsxXSkpLGE9K3RbMF1bMF0rKHMtbyooblsxXVswXStuWzBdWzBdKSkvMixjPSt0WzBdWzFdKyhyLW8qKG5bMV1bMV0rblswXVsxXSkpLzI7aS5zY2FsZSgxNTAqbykudHJhbnNsYXRlKFthLGNdKX0sZSl9ZnVuY3Rpb24gV3AoaSx0LGUpe3JldHVybiBWaChpLFtbMCwwXSx0XSxlKX1mdW5jdGlvbiBacChpLHQsZSl7cmV0dXJuIEdhKGksZnVuY3Rpb24obil7dmFyIHM9K3Qscj1zLyhuWzFdWzBdLW5bMF1bMF0pLG89KHMtciooblsxXVswXStuWzBdWzBdKSkvMixhPS1yKm5bMF1bMV07aS5zY2FsZSgxNTAqcikudHJhbnNsYXRlKFtvLGFdKX0sZSl9ZnVuY3Rpb24gSnAoaSx0LGUpe3JldHVybiBHYShpLGZ1bmN0aW9uKG4pe3ZhciBzPSt0LHI9cy8oblsxXVsxXS1uWzBdWzFdKSxvPS1yKm5bMF1bMF0sYT0ocy1yKihuWzFdWzFdK25bMF1bMV0pKS8yO2kuc2NhbGUoMTUwKnIpLnRyYW5zbGF0ZShbbyxhXSl9LGUpfXZhciBVaD0xNixZcD1YKDMwKkgpO2Z1bmN0aW9uIHFoKGksdCl7cmV0dXJuK3Q/UXAoaSx0KTpqcChpKX1mdW5jdGlvbiBqcChpKXtyZXR1cm4gSGEoe3BvaW50OmZ1bmN0aW9uKHQsZSl7dD1pKHQsZSksdGhpcy5zdHJlYW0ucG9pbnQodFswXSx0WzFdKX19KX1mdW5jdGlvbiBRcChpLHQpe2Z1bmN0aW9uIGUobixzLHIsbyxhLGMsbCxoLHUsZixkLHAseSxtKXt2YXIgZz1sLW4sYj1oLXMsdz1nKmcrYipiO2lmKHc+NCp0JiZ5LS0pe3ZhciB4PW8rZixNPWErZCxBPWMrcCxTPU9lKHgqeCtNKk0rQSpBKSx2PURlKEEvPVMpLF89SyhLKEEpLTEpPFF8fEsoci11KTxRPyhyK3UpLzI6c2UoTSx4KSxFPWkoXyx2KSx6PUVbMF0sQz1FWzFdLFA9ei1uLEY9Qy1zLEI9YipQLWcqRjsoQipCL3c+dHx8SygoZypQK2IqRikvdy0uNSk+LjN8fG8qZithKmQrYypwPFlwKSYmKGUobixzLHIsbyxhLGMseixDLF8seC89UyxNLz1TLEEseSxtKSxtLnBvaW50KHosQyksZSh6LEMsXyx4LE0sQSxsLGgsdSxmLGQscCx5LG0pKX19cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBzLHIsbyxhLGMsbCxoLHUsZixkLHAseSxtPXtwb2ludDpnLGxpbmVTdGFydDpiLGxpbmVFbmQ6eCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25TdGFydCgpLG0ubGluZVN0YXJ0PU19LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25FbmQoKSxtLmxpbmVTdGFydD1ifX07ZnVuY3Rpb24gZyh2LF8pe3Y9aSh2LF8pLG4ucG9pbnQodlswXSx2WzFdKX1mdW5jdGlvbiBiKCl7dT1OYU4sbS5wb2ludD13LG4ubGluZVN0YXJ0KCl9ZnVuY3Rpb24gdyh2LF8pe3ZhciBFPVNuKFt2LF9dKSx6PWkodixfKTtlKHUsZixoLGQscCx5LHU9elswXSxmPXpbMV0saD12LGQ9RVswXSxwPUVbMV0seT1FWzJdLFVoLG4pLG4ucG9pbnQodSxmKX1mdW5jdGlvbiB4KCl7bS5wb2ludD1nLG4ubGluZUVuZCgpfWZ1bmN0aW9uIE0oKXtiKCksbS5wb2ludD1BLG0ubGluZUVuZD1TfWZ1bmN0aW9uIEEodixfKXt3KHM9dixfKSxyPXUsbz1mLGE9ZCxjPXAsbD15LG0ucG9pbnQ9d31mdW5jdGlvbiBTKCl7ZSh1LGYsaCxkLHAseSxyLG8scyxhLGMsbCxVaCxuKSxtLmxpbmVFbmQ9eCx4KCl9cmV0dXJuIG19fXZhciBLcD1IYSh7cG9pbnQ6ZnVuY3Rpb24oaSx0KXt0aGlzLnN0cmVhbS5wb2ludChpKkgsdCpIKX19KTtmdW5jdGlvbiB0eShpKXtyZXR1cm4gSGEoe3BvaW50OmZ1bmN0aW9uKHQsZSl7dmFyIG49aSh0LGUpO3JldHVybiB0aGlzLnN0cmVhbS5wb2ludChuWzBdLG5bMV0pfX0pfWZ1bmN0aW9uIGV5KGksdCxlLG4scyl7ZnVuY3Rpb24gcihvLGEpe3JldHVybiBvKj1uLGEqPXMsW3QraSpvLGUtaSphXX1yZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24obyxhKXtyZXR1cm5bKG8tdCkvaSpuLChlLWEpL2kqc119LHJ9ZnVuY3Rpb24gSGgoaSx0LGUsbixzLHIpe2lmKCFyKXJldHVybiBleShpLHQsZSxuLHMpO3ZhciBvPVgociksYT1xKHIpLGM9byppLGw9YSppLGg9by9pLHU9YS9pLGY9KGEqZS1vKnQpL2ksZD0oYSp0K28qZSkvaTtmdW5jdGlvbiBwKHksbSl7cmV0dXJuIHkqPW4sbSo9cyxbYyp5LWwqbSt0LGUtbCp5LWMqbV19cmV0dXJuIHAuaW52ZXJ0PWZ1bmN0aW9uKHksbSl7cmV0dXJuW24qKGgqeS11Km0rZikscyooZC11KnktaCptKV19LHB9ZnVuY3Rpb24gSXIoaSl7cmV0dXJuIG55KGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSgpfWZ1bmN0aW9uIG55KGkpe3ZhciB0LGU9MTUwLG49NDgwLHM9MjUwLHI9MCxvPTAsYT0wLGM9MCxsPTAsaCx1PTAsZj0xLGQ9MSxwPW51bGwseT1GaCxtPW51bGwsZyxiLHcseD1EaCxNPS41LEEsUyx2LF8sRTtmdW5jdGlvbiB6KEIpe3JldHVybiB2KEJbMF0qSCxCWzFdKkgpfWZ1bmN0aW9uIEMoQil7cmV0dXJuIEI9di5pbnZlcnQoQlswXSxCWzFdKSxCJiZbQlswXSpodCxCWzFdKmh0XX16LnN0cmVhbT1mdW5jdGlvbihCKXtyZXR1cm4gXyYmRT09PUI/XzpfPUtwKHR5KGgpKHkoQSh4KEU9QikpKSkpfSx6LnByZWNsaXA9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9QixwPXZvaWQgMCxGKCkpOnl9LHoucG9zdGNsaXA9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9QixtPWc9Yj13PW51bGwsRigpKTp4fSx6LmNsaXBBbmdsZT1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0rQj9rcChwPUIqSCk6KHA9bnVsbCxGaCksRigpKTpwKmh0fSx6LmNsaXBFeHRlbnQ9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9Qj09bnVsbD8obT1nPWI9dz1udWxsLERoKTpScChtPStCWzBdWzBdLGc9K0JbMF1bMV0sYj0rQlsxXVswXSx3PStCWzFdWzFdKSxGKCkpOm09PW51bGw/bnVsbDpbW20sZ10sW2Isd11dfSx6LnNjYWxlPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPStCLFAoKSk6ZX0sei50cmFuc2xhdGU9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K0JbMF0scz0rQlsxXSxQKCkpOltuLHNdfSx6LmNlbnRlcj1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1CWzBdJTM2MCpILG89QlsxXSUzNjAqSCxQKCkpOltyKmh0LG8qaHRdfSx6LnJvdGF0ZT1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1CWzBdJTM2MCpILGM9QlsxXSUzNjAqSCxsPUIubGVuZ3RoPjI/QlsyXSUzNjAqSDowLFAoKSk6W2EqaHQsYypodCxsKmh0XX0sei5hbmdsZT1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1CJTM2MCpILFAoKSk6dSpodH0sei5yZWZsZWN0WD1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1CPy0xOjEsUCgpKTpmPDB9LHoucmVmbGVjdFk9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9Qj8tMToxLFAoKSk6ZDwwfSx6LnByZWNpc2lvbj1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQT1xaChTLE09QipCKSxGKCkpOk9lKE0pfSx6LmZpdEV4dGVudD1mdW5jdGlvbihCLEkpe3JldHVybiBWaCh6LEIsSSl9LHouZml0U2l6ZT1mdW5jdGlvbihCLEkpe3JldHVybiBXcCh6LEIsSSl9LHouZml0V2lkdGg9ZnVuY3Rpb24oQixJKXtyZXR1cm4gWnAoeixCLEkpfSx6LmZpdEhlaWdodD1mdW5jdGlvbihCLEkpe3JldHVybiBKcCh6LEIsSSl9O2Z1bmN0aW9uIFAoKXt2YXIgQj1IaChlLDAsMCxmLGQsdSkuYXBwbHkobnVsbCx0KHIsbykpLEk9SGgoZSxuLUJbMF0scy1CWzFdLGYsZCx1KTtyZXR1cm4gaD1NaChhLGMsbCksUz1PYSh0LEkpLHY9T2EoaCxTKSxBPXFoKFMsTSksRigpfWZ1bmN0aW9uIEYoKXtyZXR1cm4gXz1FPW51bGwsen1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx6LmludmVydD10LmludmVydCYmQyxQKCl9fWZ1bmN0aW9uIGl5KGkpe3JldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPU9lKHQqdCtlKmUpLHM9aShuKSxyPXEocyksbz1YKHMpO3JldHVybltzZSh0KnIsbipvKSxEZShuJiZlKnIvbildfX1mdW5jdGlvbiBXYShpLHQpe3JldHVybltpLGRwKHlwKChOdCt0KS8yKSldfVdhLmludmVydD1mdW5jdGlvbihpLHQpe3JldHVybltpLDIqemEoZnAodCkpLU50XX07ZnVuY3Rpb24gc3koKXtyZXR1cm4gcnkoV2EpLnNjYWxlKDk2MS9SdCl9ZnVuY3Rpb24gcnkoaSl7dmFyIHQ9SXIoaSksZT10LmNlbnRlcixuPXQuc2NhbGUscz10LnRyYW5zbGF0ZSxyPXQuY2xpcEV4dGVudCxvPW51bGwsYSxjLGw7dC5zY2FsZT1mdW5jdGlvbih1KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obih1KSxoKCkpOm4oKX0sdC50cmFuc2xhdGU9ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHModSksaCgpKTpzKCl9LHQuY2VudGVyPWZ1bmN0aW9uKHUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlKHUpLGgoKSk6ZSgpfSx0LmNsaXBFeHRlbnQ9ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9PW51bGw/bz1hPWM9bD1udWxsOihvPSt1WzBdWzBdLGE9K3VbMF1bMV0sYz0rdVsxXVswXSxsPSt1WzFdWzFdKSxoKCkpOm89PW51bGw/bnVsbDpbW28sYV0sW2MsbF1dfTtmdW5jdGlvbiBoKCl7dmFyIHU9WipuKCksZj10KHZoKHQucm90YXRlKCkpLmludmVydChbMCwwXSkpO3JldHVybiByKG89PW51bGw/W1tmWzBdLXUsZlsxXS11XSxbZlswXSt1LGZbMV0rdV1dOmk9PT1XYT9bW01hdGgubWF4KGZbMF0tdSxvKSxhXSxbTWF0aC5taW4oZlswXSt1LGMpLGxdXTpbW28sTWF0aC5tYXgoZlsxXS11LGEpXSxbYyxNYXRoLm1pbihmWzFdK3UsbCldXSl9cmV0dXJuIGgoKX1mdW5jdGlvbiBaYShpLHQpe3JldHVybltpLHRdfVphLmludmVydD1aYTtmdW5jdGlvbiBveSgpe3JldHVybiBJcihaYSkuc2NhbGUoMTUyLjYzKX1mdW5jdGlvbiBYaChpLHQpe3ZhciBlPVgodCksbj0xK1goaSkqZTtyZXR1cm5bZSpxKGkpL24scSh0KS9uXX1YaC5pbnZlcnQ9aXkoZnVuY3Rpb24oaSl7cmV0dXJuIDIqemEoaSl9KTtmdW5jdGlvbiBheSgpe3JldHVybiBJcihYaCkuc2NhbGUoMjUwKS5jbGlwQW5nbGUoMTQyKX12YXIga3I9TWF0aC5hYnMsbGk9TWF0aC5jb3MsYmU9TWF0aC5zaW4sSmk9MWUtNixOcj1NYXRoLlBJLEphPU5yLzI7ZnVuY3Rpb24gY3koaSl7cmV0dXJuIGk/aS9NYXRoLnNpbihpKToxfWZ1bmN0aW9uIFlhKGkpe3JldHVybiBpPjE/MDppPC0xP05yOk1hdGguYWNvcyhpKX1mdW5jdGlvbiBHaChpKXtyZXR1cm4gaT4wP01hdGguc3FydChpKTowfWZ1bmN0aW9uIFdoKGksdCl7dmFyIGU9bGkodCksbj1jeShZYShlKmxpKGkvPTIpKSk7cmV0dXJuWzIqZSpiZShpKSpuLGJlKHQpKm5dfVdoLmludmVydD1mdW5jdGlvbihpLHQpe2lmKCEoaSppKzQqdCp0Pk5yKk5yK0ppKSl7dmFyIGU9aSxuPXQscz0yNTtkb3t2YXIgcj1iZShlKSxvPWJlKGUvMiksYT1saShlLzIpLGM9YmUobiksbD1saShuKSxoPWJlKDIqbiksdT1jKmMsZj1sKmwsZD1vKm8scD0xLWYqYSphLHk9cD9ZYShsKmEpKkdoKG09MS9wKTptPTAsbSxnPTIqeSpsKm8taSxiPXkqYy10LHc9bSooZipkK3kqbCphKnUpLHg9bSooLjUqcipoLXkqMipjKm8pLE09bSouMjUqKGgqby15KmMqZipyKSxBPW0qKHUqYSt5KmQqbCksUz14Kk0tQSp3O2lmKCFTKWJyZWFrO3ZhciB2PShiKngtZypBKS9TLF89KGcqTS1iKncpL1M7ZS09dixuLT1ffXdoaWxlKChrcih2KT5KaXx8a3IoXyk+SmkpJiYtLXM+MCk7cmV0dXJuW2Usbl19fTtmdW5jdGlvbiBaaChpLHQpe3ZhciBlPVdoKGksdCk7cmV0dXJuWyhlWzBdK2kvSmEpLzIsKGVbMV0rdCkvMl19WmguaW52ZXJ0PWZ1bmN0aW9uKGksdCl7dmFyIGU9aSxuPXQscz0yNTtkb3t2YXIgcj1saShuKSxvPWJlKG4pLGE9YmUoMipuKSxjPW8qbyxsPXIqcixoPWJlKGUpLHU9bGkoZS8yKSxmPWJlKGUvMiksZD1mKmYscD0xLWwqdSp1LHk9cD9ZYShyKnUpKkdoKG09MS9wKTptPTAsbSxnPS41KigyKnkqcipmK2UvSmEpLWksYj0uNSooeSpvK24pLXQsdz0uNSptKihsKmQreSpyKnUqYykrLjUvSmEseD1tKihoKmEvNC15Km8qZiksTT0uMTI1Km0qKGEqZi15Km8qbCpoKSxBPS41Km0qKGMqdSt5KmQqcikrLjUsUz14Kk0tQSp3LHY9KGIqeC1nKkEpL1MsXz0oZypNLWIqdykvUztlLT12LG4tPV99d2hpbGUoKGtyKHYpPkppfHxrcihfKT5KaSkmJi0tcz4wKTtyZXR1cm5bZSxuXX07ZnVuY3Rpb24gbHkoKXtyZXR1cm4gSXIoWmgpLnNjYWxlKDE1OC44MzcpfWNvbnN0IGh5PXttZXJjYXRvcjpzeSxlcXVpcmVjdGFuZ3VsYXI6b3ksd2lua2VsMzpseX0samE9e30sWWk9aT0+e3ZhciBuLHMscjtjb25zdCB0PUpTT04uc3RyaW5naWZ5KGkpO2lmKGphW3RdKXJldHVybiBqYVt0XTtjb25zdCBlPWh5WyhuPWkucHJvamVjdGlvblR5cGUpIT1udWxsP246Im1lcmNhdG9yIl0oKS5jZW50ZXIoaS5jZW50ZXIpLnNjYWxlKGkuc2NhbGUpLnRyYW5zbGF0ZSgocz1pLnRyYW5zbGF0ZSkhPW51bGw/czpbMCwwXSkucHJlY2lzaW9uKChyPWkucHJlY2lzaW9uKSE9bnVsbD9yOi4xKTtyZXR1cm4gaS5yb3RhdGUmJmUucm90YXRlKGkucm90YXRlKSxqYVt0XT1lLGV9O2Z1bmN0aW9uIHV5KGksdCxlPTApe2NvbnN0IG49KDkwLXQpKk1hdGguUEkvMTgwLHM9KDkwLWkpKk1hdGguUEkvMTgwO3JldHVybltlKk1hdGguc2luKG4pKk1hdGguY29zKHMpLGUqTWF0aC5jb3MobiksZSpNYXRoLnNpbihuKSpNYXRoLnNpbihzKV19Y29uc3QgUnI9KGksdCk9PmkubWFwKChbZSxuXSk9PntsZXQgcztpZih0KXtjb25zdFtyLG9dPXQoW2Usbl0pO3M9bmV3IE4ociwtbyl9ZWxzZSBzPW5ldyBOKGUsbik7cmV0dXJuIHN9KTt2YXIgamk9KGksdCk9Pntjb25zdCBlPWpsKGksdCE9bnVsbD90OjApLG49e30scz1bXSxyPU9iamVjdC5rZXlzKGUuYXR0cmlidXRlcyk7cmV0dXJuIGUuaW5kZXgmJnIucHVzaCgiaW5kZXgiKSxyLmZvckVhY2gobz0+e2NvbnN0IGE9bz09PSJpbmRleCI/ZS5pbmRleDplLmF0dHJpYnV0ZXNbb107bltvXT17YXJyYXk6YS5hcnJheSxpdGVtU2l6ZTphLml0ZW1TaXplfSxzLnB1c2goYS5hcnJheS5idWZmZXIpfSksdCYmKG4uZ3JvdXBzPWUuZ3JvdXBzKSxlLmRpc3Bvc2UoKSxpLmZvckVhY2gobz0+e28uZGlzcG9zZSgpfSkse21lc3NhZ2U6bix0cmFuc2ZlcjpzfX0sUWE9KGksdD0zMDApPT57Y29uc3QgZT1bXTtyZXR1cm4gaS5mb3JFYWNoKG49PntsZXQgcz0hMTtmb3IobGV0IHI9MTtyPG4ubGVuZ3RoO3IrKylpZihNYXRoLmFicyhuW3JdLngtbltyLTFdLngpPnQpe3M9ITA7YnJlYWt9aWYocyl7Y29uc3Qgcj1bXSxvPVtdO24uZm9yRWFjaChhPT57YS54PDA/ci5wdXNoKGEpOm8ucHVzaChhKX0pLGUucHVzaChyLG8pfWVsc2UgZS5wdXNoKG4pfSksZX07ZnVuY3Rpb24gZnkoaSx0LGU9MCl7Y29uc3RbbixzLHIsb109aTtsZXQgYT0xLzAsYz0xLzAsbD0tMS8wLGg9LTEvMDtmb3IobGV0IHU9MDt1PD1lO3UrKyl7Y29uc3QgZj1lJiZ1L2U7UnIoW1tuK2YqKHItbiksc10sW24rZiooci1uKSxvXSxbbixzK2YqKG8tcyldLFtyLHMrZiooby1zKV1dLHQpLmZvckVhY2goZD0+e2E9TWF0aC5taW4oYSxkLngpLGM9TWF0aC5taW4oYyxkLnkpLGw9TWF0aC5tYXgobCxkLngpLGg9TWF0aC5tYXgoaCxkLnkpfSl9cmV0dXJuW1thLGNdLFtsLGhdXX1jb25zdCBkeT0oe2Nvb3JkaW5hdGVzQXJyOmksc3BsaXQ6dCxzaWRlUmVwZWF0OmUsYmJveDpuLGRlcHRoOnMscHJvamVjdGlvbjpyLHVzZUdyb3VwczpvLGhhc1RvcDphLGhhc0JvdHRvbTpjLGhhc1NpZGU6bCxzcGxpdFBvbHlnb25zOmgsdG9wU2VnbWVudHM6dX0pPT57Y29uc3QgZj1yJiZZaShyKTtsZXQgZD1pLm1hcChtPT5ScihtLGYpKTtoJiYoZD1RYShkLGgpKTtsZXQgcDtpZihuKXtjb25zdFttLGddPWZ5KG4sciE9bnVsbCYmci5yb3RhdGU/WWkoV2UoRnQoe30scikse3JvdGF0ZTp2b2lkIDB9KSk6Ziwocj09bnVsbD92b2lkIDA6ci5wcm9qZWN0aW9uVHlwZSk9PT0id2lua2VsMyI/MTA6MCk7cD1uZXcgbXQobmV3IFQobVswXSxtWzFdLDApLG5ldyBUKGdbMF0sZ1sxXSwwKSl9Y29uc3QgeT1kLm1hcCgobSxnKT0+e3ZhciBiO3JldHVybiB0cCh7cG9pbnRzOm0sc3BsaXQ6dCxzaWRlUmVwZWF0OmUsZGVwdGg6KGI9c1tnXSkhPW51bGw/YjpzWzBdLGhhc1RvcDphLGhhc0JvdHRvbTpjLGhhc1NpZGU6bCxib3gzOnAsdG9wU2VnbWVudHM6dX0pfSk7cmV0dXJuIGppKHksbyl9O2NsYXNzIHB5IGV4dGVuZHMgZ2V7Y29uc3RydWN0b3IodD1bXSxlPSJub25lIixuKXtzdXBlcigpLHRoaXMudHlwZT0iTWVzaExpbmVHZW9tZXRyeSIsdGhpcy5wb2ludENvdW50PTAsdGhpcy5fcG9pbnRzPVtdLHRoaXMuc2hhcGU9Im5vbmUiLHRoaXMuc2hhcGVGdW5jdGlvbj1zPT4xLHRoaXMubWF0cml4V29ybGQ9bmV3IHN0LHRoaXMuc2hhcGU9ZSxuJiYodGhpcy5zaGFwZUZ1bmN0aW9uPW4pLHQubGVuZ3RoPjAmJnRoaXMuc2V0UG9pbnRzKHQpfWNvbnZlcnRUb1ZlY3RvcjNBcnJheSh0KXtpZih0eXBlb2YgdFswXT09Im51bWJlciIpe2NvbnN0IGU9W10sbj10O2ZvcihsZXQgcz0wO3M8bi5sZW5ndGg7cys9MyllLnB1c2gobmV3IFQobltzXSxuW3MrMV0sbltzKzJdKSk7cmV0dXJuIGV9ZWxzZSByZXR1cm4gdC5tYXAoZT0+e2lmKGUgaW5zdGFuY2VvZiBOKXJldHVybiBuZXcgVChlLngsZS55LDApO2lmKGUgaW5zdGFuY2VvZiBUKXJldHVybiBlO2lmKEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPT09MilyZXR1cm4gbmV3IFQoZVswXSxlWzFdLDApO2lmKEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPT09MylyZXR1cm4gbmV3IFQoZVswXSxlWzFdLGVbMl0pfSkuZmlsdGVyKEJvb2xlYW4pfXNldE1hdHJpeFdvcmxkKHQpe3RoaXMubWF0cml4V29ybGQ9dH1zZXRQb2ludHModCxlKXshdHx8dC5sZW5ndGg9PT0wfHwodGhpcy5fcG9pbnRzPXRoaXMuY29udmVydFRvVmVjdG9yM0FycmF5KHQpLHRoaXMucG9pbnRDb3VudD10aGlzLl9wb2ludHMubGVuZ3RoLGUmJih0aGlzLnNoYXBlRnVuY3Rpb249ZSx0aGlzLnNoYXBlPSJjdXN0b20iKSx0aGlzLmluaXRpYWxpemVHZW9tZXRyeSgpLHRoaXMudXBkYXRlR2VvbWV0cnkoKSl9aW5pdGlhbGl6ZUdlb21ldHJ5KCl7Y29uc3QgdD1uZXcgZ3QobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqNiksMyksZT1uZXcgZ3QobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqNiksMyksbj1uZXcgZ3QobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqNiksMykscz1uZXcgZ3QobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqMiksMSkscj1uZXcgZ3QobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqMiksMSksbz1uZXcgZ3QobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqMiksMSksYT1uZXcgZ3QobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqNCksMiksYz1uZXcgZ3QobmV3IFVpbnQxNkFycmF5KCh0aGlzLnBvaW50Q291bnQtMSkqNiksMSk7dGhpcy5zaGFwZT09PSJ0YXBlciImJih0aGlzLnNoYXBlRnVuY3Rpb249bD0+MSpNYXRoLnBvdyg0KmwqKDEtbCksMSkpO2ZvcihsZXQgbD0wLGg9MCx1PTA7bDx0aGlzLnBvaW50Q291bnQ7bCs9MSxoKz0yLHUrPTYpe3Muc2V0WChoLGwvdGhpcy5wb2ludENvdW50KSxzLnNldFgoaCsxLGwvdGhpcy5wb2ludENvdW50KSxyLnNldFgoaCwxKSxyLnNldFgoaCsxLC0xKTtjb25zdCBmPXRoaXMuc2hhcGU9PT0ibm9uZSI/MTp0aGlzLnNoYXBlRnVuY3Rpb24obC8odGhpcy5wb2ludENvdW50LTEpKTtvLnNldFgoaCxmKSxvLnNldFgoaCsxLGYpO2NvbnN0IGQ9bC8odGhpcy5wb2ludENvdW50LTEpO2lmKGEuc2V0WFkoaCxkLDApLGEuc2V0WFkoaCsxLGQsMSksbDx0aGlzLnBvaW50Q291bnQtMSl7Y29uc3QgcD1sKjI7Yy5zZXRYKHUrMCxwKzApLGMuc2V0WCh1KzEscCsxKSxjLnNldFgodSsyLHArMiksYy5zZXRYKHUrMyxwKzIpLGMuc2V0WCh1KzQscCsxKSxjLnNldFgodSs1LHArMyl9fXRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsdCksdGhpcy5zZXRBdHRyaWJ1dGUoInByZXZpb3VzIixlKSx0aGlzLnNldEF0dHJpYnV0ZSgibmV4dCIsbiksdGhpcy5zZXRBdHRyaWJ1dGUoImNvdW50ZXJzIixzKSx0aGlzLnNldEF0dHJpYnV0ZSgic2lkZSIsciksdGhpcy5zZXRBdHRyaWJ1dGUoIndpZHRoIixvKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLGEpLHRoaXMuc2V0SW5kZXgoYyl9dXBkYXRlR2VvbWV0cnkoKXtpZighdGhpcy5fcG9pbnRzWzBdKXJldHVybjtjb25zdCB0PXRoaXMuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLGU9dGhpcy5nZXRBdHRyaWJ1dGUoInByZXZpb3VzIiksbj10aGlzLmdldEF0dHJpYnV0ZSgibmV4dCIpO2xldCBzPTAscj0wLG89MDtjb25zdCBhPXRoaXMuX3BvaW50c1swXTtlLnNldFhZWihyLGEueCxhLnksYS56KSxyKz0xLGUuc2V0WFlaKHIsYS54LGEueSxhLnopLHIrPTE7Zm9yKGxldCBsPTA7bDx0aGlzLnBvaW50Q291bnQ7bCsrKXtjb25zdCBoPXRoaXMuX3BvaW50c1tsXTt0LnNldFhZWihzLGgueCxoLnksaC56KSxzKz0xLHQuc2V0WFlaKHMsaC54LGgueSxoLnopLHMrPTEsbDx0aGlzLnBvaW50Q291bnQtMSYmKGUuc2V0WFlaKHIsaC54LGgueSxoLnopLHIrPTEsZS5zZXRYWVoocixoLngsaC55LGgueikscis9MSksbD4wJiZsKzE8PXRoaXMucG9pbnRDb3VudCYmKG4uc2V0WFlaKG8saC54LGgueSxoLnopLG8rPTEsbi5zZXRYWVoobyxoLngsaC55LGgueiksbys9MSl9Y29uc3QgYz10aGlzLl9wb2ludHNbdGhpcy5wb2ludENvdW50LTFdO24uc2V0WFlaKG8sYy54LGMueSxjLnopLG8rPTEsbi5zZXRYWVoobyxjLngsYy55LGMueiksbys9MSx0Lm5lZWRzVXBkYXRlPSEwLGUubmVlZHNVcGRhdGU9ITAsbi5uZWVkc1VwZGF0ZT0hMCx0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCl9Z2V0IHBvaW50cygpe3JldHVybiB0aGlzLl9wb2ludHN9c2V0IHBvaW50cyh0KXt0aGlzLnNldFBvaW50cyh0KX11cGRhdGVQb2ludHModCxlKXtjb25zdCBuPXRoaXMuY29udmVydFRvVmVjdG9yM0FycmF5KHQpO2lmKG4ubGVuZ3RoIT09dGhpcy5wb2ludENvdW50KXtjb25zb2xlLndhcm4oIk1lc2hMaW5lR2VvbWV0cnk6IENhbm5vdCB1cGRhdGUgcG9pbnRzIHdpdGggZGlmZmVyZW50IGxlbmd0aC4gVXNlIHNldFBvaW50cygpIGluc3RlYWQuIik7cmV0dXJufXRoaXMuX3BvaW50cz1uLGUmJih0aGlzLnNoYXBlRnVuY3Rpb249ZSx0aGlzLnNoYXBlPSJjdXN0b20iLHRoaXMuaW5pdGlhbGl6ZUdlb21ldHJ5KCkpLHRoaXMudXBkYXRlR2VvbWV0cnkoKX1zZXRTaGFwZSh0LGUpe3RoaXMuc2hhcGU9dCxlJiYodGhpcy5zaGFwZUZ1bmN0aW9uPWUpLHRoaXMuX3BvaW50cy5sZW5ndGg+MCYmKHRoaXMuaW5pdGlhbGl6ZUdlb21ldHJ5KCksdGhpcy51cGRhdGVHZW9tZXRyeSgpKX19dmFyIEpoPWk9Pntjb25zdHtzZXRQb2ludFdpZHRoOnQsbm9kZXM6ZX09aSxuPW5ldyBweTtyZXR1cm4gbi5zZXRQb2ludHMoZSx0KSxufTtjb25zdCB5eT0oe2Nvb3JkaW5hdGVzQXJyOmkscHJvamVjdGlvbjp0LGxpbmVXaWR0aDplLHVzZUdyb3VwczpuLHNwbGl0UG9seWdvbnM6c30pPT57Y29uc3Qgcj10JiZZaSh0KTtsZXQgbz1pLm1hcChjPT5ScihjLHIpKTtzJiYobz1RYShvLHMpKTtjb25zdCBhPW8ubWFwKChjLGwpPT57dmFyIHU7Y29uc3QgaD0odT1lW2xdKSE9bnVsbD91OmVbMF07cmV0dXJuIEpoKHtub2RlczpjLHNldFBvaW50V2lkdGg6KCk9Pmh9KX0pO3JldHVybiBqaShhLG4pfTt2YXIgbXk9aT0+e2NvbnN0e3BvaW50czp0fT1pLGU9dC5yZWR1Y2UoKHMscixvKT0+KG88dC5sZW5ndGgtMSYmcy5wdXNoKHIsdFtvKzFdKSxzKSxbXSk7cmV0dXJuIG5ldyBnZSgpLnNldEZyb21Qb2ludHMoZSl9O2NvbnN0IGd5PSh7Y29vcmRpbmF0ZXNBcnI6aSxwcm9qZWN0aW9uOnQsbGluZVdpZHRoOmUsdXNlR3JvdXBzOm4sc3BsaXRQb2x5Z29uczpzfSk9Pntjb25zdCByPXQmJllpKHQpO2xldCBvPWkubWFwKGM9PlJyKGMscikpO3MmJihvPVFhKG8scykpO2NvbnN0IGE9by5tYXAoKGMsbCk9Pm15KHtwb2ludHM6Yy5tYXAoaD0+bmV3IFQoaC54LGgueSwwKSl9KSk7cmV0dXJuIGppKGEsbil9O2Z1bmN0aW9uIHh5KGksdCxlPTIpe2NvbnN0IG49dCYmdC5sZW5ndGgscz1uP3RbMF0qZTppLmxlbmd0aDtsZXQgcj1ZaChpLDAscyxlLCEwKTtjb25zdCBvPVtdO2lmKCFyfHxyLm5leHQ9PT1yLnByZXYpcmV0dXJuIG87bGV0IGEsYyxsO2lmKG4mJihyPVN5KGksdCxyLGUpKSxpLmxlbmd0aD44MCplKXthPWlbMF0sYz1pWzFdO2xldCBoPWEsdT1jO2ZvcihsZXQgZj1lO2Y8cztmKz1lKXtjb25zdCBkPWlbZl0scD1pW2YrMV07ZDxhJiYoYT1kKSxwPGMmJihjPXApLGQ+aCYmKGg9ZCkscD51JiYodT1wKX1sPU1hdGgubWF4KGgtYSx1LWMpLGw9bCE9PTA/MzI3NjcvbDowfXJldHVybiBRaShyLG8sZSxhLGMsbCwwKSxvfWZ1bmN0aW9uIFloKGksdCxlLG4scyl7bGV0IHI7aWYocz09PWt5KGksdCxlLG4pPjApZm9yKGxldCBvPXQ7bzxlO28rPW4pcj10dShvL258MCxpW29dLGlbbysxXSxyKTtlbHNlIGZvcihsZXQgbz1lLW47bz49dDtvLT1uKXI9dHUoby9ufDAsaVtvXSxpW28rMV0scik7cmV0dXJuIHImJmhpKHIsci5uZXh0KSYmKGVzKHIpLHI9ci5uZXh0KSxyfWZ1bmN0aW9uIHZuKGksdCl7aWYoIWkpcmV0dXJuIGk7dHx8KHQ9aSk7bGV0IGU9aSxuO2RvIGlmKG49ITEsIWUuc3RlaW5lciYmKGhpKGUsZS5uZXh0KXx8YXQoZS5wcmV2LGUsZS5uZXh0KT09PTApKXtpZihlcyhlKSxlPXQ9ZS5wcmV2LGU9PT1lLm5leHQpYnJlYWs7bj0hMH1lbHNlIGU9ZS5uZXh0O3doaWxlKG58fGUhPT10KTtyZXR1cm4gdH1mdW5jdGlvbiBRaShpLHQsZSxuLHMscixvKXtpZighaSlyZXR1cm47IW8mJnImJkV5KGksbixzLHIpO2xldCBhPWk7Zm9yKDtpLnByZXYhPT1pLm5leHQ7KXtjb25zdCBjPWkucHJldixsPWkubmV4dDtpZihyP2J5KGksbixzLHIpOnd5KGkpKXt0LnB1c2goYy5pLGkuaSxsLmkpLGVzKGkpLGk9bC5uZXh0LGE9bC5uZXh0O2NvbnRpbnVlfWlmKGk9bCxpPT09YSl7bz9vPT09MT8oaT1NeSh2bihpKSx0KSxRaShpLHQsZSxuLHMsciwyKSk6bz09PTImJkF5KGksdCxlLG4scyxyKTpRaSh2bihpKSx0LGUsbixzLHIsMSk7YnJlYWt9fX1mdW5jdGlvbiB3eShpKXtjb25zdCB0PWkucHJldixlPWksbj1pLm5leHQ7aWYoYXQodCxlLG4pPj0wKXJldHVybiExO2NvbnN0IHM9dC54LHI9ZS54LG89bi54LGE9dC55LGM9ZS55LGw9bi55LGg9TWF0aC5taW4ocyxyLG8pLHU9TWF0aC5taW4oYSxjLGwpLGY9TWF0aC5tYXgocyxyLG8pLGQ9TWF0aC5tYXgoYSxjLGwpO2xldCBwPW4ubmV4dDtmb3IoO3AhPT10Oyl7aWYocC54Pj1oJiZwLng8PWYmJnAueT49dSYmcC55PD1kJiZLaShzLGEscixjLG8sbCxwLngscC55KSYmYXQocC5wcmV2LHAscC5uZXh0KT49MClyZXR1cm4hMTtwPXAubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBieShpLHQsZSxuKXtjb25zdCBzPWkucHJldixyPWksbz1pLm5leHQ7aWYoYXQocyxyLG8pPj0wKXJldHVybiExO2NvbnN0IGE9cy54LGM9ci54LGw9by54LGg9cy55LHU9ci55LGY9by55LGQ9TWF0aC5taW4oYSxjLGwpLHA9TWF0aC5taW4oaCx1LGYpLHk9TWF0aC5tYXgoYSxjLGwpLG09TWF0aC5tYXgoaCx1LGYpLGc9S2EoZCxwLHQsZSxuKSxiPUthKHksbSx0LGUsbik7bGV0IHc9aS5wcmV2Wix4PWkubmV4dFo7Zm9yKDt3JiZ3Lno+PWcmJngmJnguejw9Yjspe2lmKHcueD49ZCYmdy54PD15JiZ3Lnk+PXAmJncueTw9bSYmdyE9PXMmJnchPT1vJiZLaShhLGgsYyx1LGwsZix3Lngsdy55KSYmYXQody5wcmV2LHcsdy5uZXh0KT49MHx8KHc9dy5wcmV2Wix4Lng+PWQmJngueDw9eSYmeC55Pj1wJiZ4Lnk8PW0mJnghPT1zJiZ4IT09byYmS2koYSxoLGMsdSxsLGYseC54LHgueSkmJmF0KHgucHJldix4LHgubmV4dCk+PTApKXJldHVybiExO3g9eC5uZXh0Wn1mb3IoO3cmJncuej49Zzspe2lmKHcueD49ZCYmdy54PD15JiZ3Lnk+PXAmJncueTw9bSYmdyE9PXMmJnchPT1vJiZLaShhLGgsYyx1LGwsZix3Lngsdy55KSYmYXQody5wcmV2LHcsdy5uZXh0KT49MClyZXR1cm4hMTt3PXcucHJldlp9Zm9yKDt4JiZ4Lno8PWI7KXtpZih4Lng+PWQmJngueDw9eSYmeC55Pj1wJiZ4Lnk8PW0mJnghPT1zJiZ4IT09byYmS2koYSxoLGMsdSxsLGYseC54LHgueSkmJmF0KHgucHJldix4LHgubmV4dCk+PTApcmV0dXJuITE7eD14Lm5leHRafXJldHVybiEwfWZ1bmN0aW9uIE15KGksdCl7bGV0IGU9aTtkb3tjb25zdCBuPWUucHJldixzPWUubmV4dC5uZXh0OyFoaShuLHMpJiZRaChuLGUsZS5uZXh0LHMpJiZ0cyhuLHMpJiZ0cyhzLG4pJiYodC5wdXNoKG4uaSxlLmkscy5pKSxlcyhlKSxlcyhlLm5leHQpLGU9aT1zKSxlPWUubmV4dH13aGlsZShlIT09aSk7cmV0dXJuIHZuKGUpfWZ1bmN0aW9uIEF5KGksdCxlLG4scyxyKXtsZXQgbz1pO2Rve2xldCBhPW8ubmV4dC5uZXh0O2Zvcig7YSE9PW8ucHJldjspe2lmKG8uaSE9PWEuaSYmQnkobyxhKSl7bGV0IGM9S2gobyxhKTtvPXZuKG8sby5uZXh0KSxjPXZuKGMsYy5uZXh0KSxRaShvLHQsZSxuLHMsciwwKSxRaShjLHQsZSxuLHMsciwwKTtyZXR1cm59YT1hLm5leHR9bz1vLm5leHR9d2hpbGUobyE9PWkpfWZ1bmN0aW9uIFN5KGksdCxlLG4pe2NvbnN0IHM9W107Zm9yKGxldCByPTAsbz10Lmxlbmd0aDtyPG87cisrKXtjb25zdCBhPXRbcl0qbixjPXI8by0xP3RbcisxXSpuOmkubGVuZ3RoLGw9WWgoaSxhLGMsbiwhMSk7bD09PWwubmV4dCYmKGwuc3RlaW5lcj0hMCkscy5wdXNoKEN5KGwpKX1zLnNvcnQoX3kpO2ZvcihsZXQgcj0wO3I8cy5sZW5ndGg7cisrKWU9dnkoc1tyXSxlKTtyZXR1cm4gZX1mdW5jdGlvbiBfeShpLHQpe2xldCBlPWkueC10Lng7aWYoZT09PTAmJihlPWkueS10LnksZT09PTApKXtjb25zdCBuPShpLm5leHQueS1pLnkpLyhpLm5leHQueC1pLngpLHM9KHQubmV4dC55LXQueSkvKHQubmV4dC54LXQueCk7ZT1uLXN9cmV0dXJuIGV9ZnVuY3Rpb24gdnkoaSx0KXtjb25zdCBlPXp5KGksdCk7aWYoIWUpcmV0dXJuIHQ7Y29uc3Qgbj1LaChlLGkpO3JldHVybiB2bihuLG4ubmV4dCksdm4oZSxlLm5leHQpfWZ1bmN0aW9uIHp5KGksdCl7bGV0IGU9dDtjb25zdCBuPWkueCxzPWkueTtsZXQgcj0tMS8wLG87aWYoaGkoaSxlKSlyZXR1cm4gZTtkb3tpZihoaShpLGUubmV4dCkpcmV0dXJuIGUubmV4dDtpZihzPD1lLnkmJnM+PWUubmV4dC55JiZlLm5leHQueSE9PWUueSl7Y29uc3QgdT1lLngrKHMtZS55KSooZS5uZXh0LngtZS54KS8oZS5uZXh0LnktZS55KTtpZih1PD1uJiZ1PnImJihyPXUsbz1lLng8ZS5uZXh0Lng/ZTplLm5leHQsdT09PW4pKXJldHVybiBvfWU9ZS5uZXh0fXdoaWxlKGUhPT10KTtpZighbylyZXR1cm4gbnVsbDtjb25zdCBhPW8sYz1vLngsbD1vLnk7bGV0IGg9MS8wO2U9bztkb3tpZihuPj1lLngmJmUueD49YyYmbiE9PWUueCYmamgoczxsP246cixzLGMsbCxzPGw/cjpuLHMsZS54LGUueSkpe2NvbnN0IHU9TWF0aC5hYnMocy1lLnkpLyhuLWUueCk7dHMoZSxpKSYmKHU8aHx8dT09PWgmJihlLng+by54fHxlLng9PT1vLngmJlR5KG8sZSkpKSYmKG89ZSxoPXUpfWU9ZS5uZXh0fXdoaWxlKGUhPT1hKTtyZXR1cm4gb31mdW5jdGlvbiBUeShpLHQpe3JldHVybiBhdChpLnByZXYsaSx0LnByZXYpPDAmJmF0KHQubmV4dCxpLGkubmV4dCk8MH1mdW5jdGlvbiBFeShpLHQsZSxuKXtsZXQgcz1pO2RvIHMuej09PTAmJihzLno9S2Eocy54LHMueSx0LGUsbikpLHMucHJldlo9cy5wcmV2LHMubmV4dFo9cy5uZXh0LHM9cy5uZXh0O3doaWxlKHMhPT1pKTtzLnByZXZaLm5leHRaPW51bGwscy5wcmV2Wj1udWxsLFB5KHMpfWZ1bmN0aW9uIFB5KGkpe2xldCB0LGU9MTtkb3tsZXQgbj1pLHM7aT1udWxsO2xldCByPW51bGw7Zm9yKHQ9MDtuOyl7dCsrO2xldCBvPW4sYT0wO2ZvcihsZXQgbD0wO2w8ZSYmKGErKyxvPW8ubmV4dFosISFvKTtsKyspO2xldCBjPWU7Zm9yKDthPjB8fGM+MCYmbzspYSE9PTAmJihjPT09MHx8IW98fG4uejw9by56KT8ocz1uLG49bi5uZXh0WixhLS0pOihzPW8sbz1vLm5leHRaLGMtLSkscj9yLm5leHRaPXM6aT1zLHMucHJldlo9cixyPXM7bj1vfXIubmV4dFo9bnVsbCxlKj0yfXdoaWxlKHQ+MSk7cmV0dXJuIGl9ZnVuY3Rpb24gS2EoaSx0LGUsbixzKXtyZXR1cm4gaT0oaS1lKSpzfDAsdD0odC1uKSpzfDAsaT0oaXxpPDw4KSYxNjcxMTkzNSxpPShpfGk8PDQpJjI1MjY0NTEzNSxpPShpfGk8PDIpJjg1ODk5MzQ1OSxpPShpfGk8PDEpJjE0MzE2NTU3NjUsdD0odHx0PDw4KSYxNjcxMTkzNSx0PSh0fHQ8PDQpJjI1MjY0NTEzNSx0PSh0fHQ8PDIpJjg1ODk5MzQ1OSx0PSh0fHQ8PDEpJjE0MzE2NTU3NjUsaXx0PDwxfWZ1bmN0aW9uIEN5KGkpe2xldCB0PWksZT1pO2RvKHQueDxlLnh8fHQueD09PWUueCYmdC55PGUueSkmJihlPXQpLHQ9dC5uZXh0O3doaWxlKHQhPT1pKTtyZXR1cm4gZX1mdW5jdGlvbiBqaChpLHQsZSxuLHMscixvLGEpe3JldHVybihzLW8pKih0LWEpPj0oaS1vKSooci1hKSYmKGktbykqKG4tYSk+PShlLW8pKih0LWEpJiYoZS1vKSooci1hKT49KHMtbykqKG4tYSl9ZnVuY3Rpb24gS2koaSx0LGUsbixzLHIsbyxhKXtyZXR1cm4hKGk9PT1vJiZ0PT09YSkmJmpoKGksdCxlLG4scyxyLG8sYSl9ZnVuY3Rpb24gQnkoaSx0KXtyZXR1cm4gaS5uZXh0LmkhPT10LmkmJmkucHJldi5pIT09dC5pJiYhRnkoaSx0KSYmKHRzKGksdCkmJnRzKHQsaSkmJkl5KGksdCkmJihhdChpLnByZXYsaSx0LnByZXYpfHxhdChpLHQucHJldix0KSl8fGhpKGksdCkmJmF0KGkucHJldixpLGkubmV4dCk+MCYmYXQodC5wcmV2LHQsdC5uZXh0KT4wKX1mdW5jdGlvbiBhdChpLHQsZSl7cmV0dXJuKHQueS1pLnkpKihlLngtdC54KS0odC54LWkueCkqKGUueS10LnkpfWZ1bmN0aW9uIGhpKGksdCl7cmV0dXJuIGkueD09PXQueCYmaS55PT09dC55fWZ1bmN0aW9uIFFoKGksdCxlLG4pe2NvbnN0IHM9T3IoYXQoaSx0LGUpKSxyPU9yKGF0KGksdCxuKSksbz1PcihhdChlLG4saSkpLGE9T3IoYXQoZSxuLHQpKTtyZXR1cm4hIShzIT09ciYmbyE9PWF8fHM9PT0wJiZMcihpLGUsdCl8fHI9PT0wJiZMcihpLG4sdCl8fG89PT0wJiZMcihlLGksbil8fGE9PT0wJiZMcihlLHQsbikpfWZ1bmN0aW9uIExyKGksdCxlKXtyZXR1cm4gdC54PD1NYXRoLm1heChpLngsZS54KSYmdC54Pj1NYXRoLm1pbihpLngsZS54KSYmdC55PD1NYXRoLm1heChpLnksZS55KSYmdC55Pj1NYXRoLm1pbihpLnksZS55KX1mdW5jdGlvbiBPcihpKXtyZXR1cm4gaT4wPzE6aTwwPy0xOjB9ZnVuY3Rpb24gRnkoaSx0KXtsZXQgZT1pO2Rve2lmKGUuaSE9PWkuaSYmZS5uZXh0LmkhPT1pLmkmJmUuaSE9PXQuaSYmZS5uZXh0LmkhPT10LmkmJlFoKGUsZS5uZXh0LGksdCkpcmV0dXJuITA7ZT1lLm5leHR9d2hpbGUoZSE9PWkpO3JldHVybiExfWZ1bmN0aW9uIHRzKGksdCl7cmV0dXJuIGF0KGkucHJldixpLGkubmV4dCk8MD9hdChpLHQsaS5uZXh0KT49MCYmYXQoaSxpLnByZXYsdCk+PTA6YXQoaSx0LGkucHJldik8MHx8YXQoaSxpLm5leHQsdCk8MH1mdW5jdGlvbiBJeShpLHQpe2xldCBlPWksbj0hMTtjb25zdCBzPShpLngrdC54KS8yLHI9KGkueSt0LnkpLzI7ZG8gZS55PnIhPWUubmV4dC55PnImJmUubmV4dC55IT09ZS55JiZzPChlLm5leHQueC1lLngpKihyLWUueSkvKGUubmV4dC55LWUueSkrZS54JiYobj0hbiksZT1lLm5leHQ7d2hpbGUoZSE9PWkpO3JldHVybiBufWZ1bmN0aW9uIEtoKGksdCl7Y29uc3QgZT10YyhpLmksaS54LGkueSksbj10Yyh0LmksdC54LHQueSkscz1pLm5leHQscj10LnByZXY7cmV0dXJuIGkubmV4dD10LHQucHJldj1pLGUubmV4dD1zLHMucHJldj1lLG4ubmV4dD1lLGUucHJldj1uLHIubmV4dD1uLG4ucHJldj1yLG59ZnVuY3Rpb24gdHUoaSx0LGUsbil7Y29uc3Qgcz10YyhpLHQsZSk7cmV0dXJuIG4/KHMubmV4dD1uLm5leHQscy5wcmV2PW4sbi5uZXh0LnByZXY9cyxuLm5leHQ9cyk6KHMucHJldj1zLHMubmV4dD1zKSxzfWZ1bmN0aW9uIGVzKGkpe2kubmV4dC5wcmV2PWkucHJldixpLnByZXYubmV4dD1pLm5leHQsaS5wcmV2WiYmKGkucHJldloubmV4dFo9aS5uZXh0WiksaS5uZXh0WiYmKGkubmV4dFoucHJldlo9aS5wcmV2Wil9ZnVuY3Rpb24gdGMoaSx0LGUpe3JldHVybntpLHg6dCx5OmUscHJldjpudWxsLG5leHQ6bnVsbCx6OjAscHJldlo6bnVsbCxuZXh0WjpudWxsLHN0ZWluZXI6ITF9fWZ1bmN0aW9uIGt5KGksdCxlLG4pe2xldCBzPTA7Zm9yKGxldCByPXQsbz1lLW47cjxlO3IrPW4pcys9KGlbb10taVtyXSkqKGlbcisxXStpW28rMV0pLG89cjtyZXR1cm4gc31mdW5jdGlvbiBldShpKXtjb25zdCB0PVtdLGU9W10sbj1pWzBdWzBdLmxlbmd0aDtsZXQgcz0wLHI9MDtmb3IoY29uc3QgbyBvZiBpKXtmb3IoY29uc3QgYSBvZiBvKWZvcihsZXQgYz0wO2M8bjtjKyspdC5wdXNoKGFbY10pO3ImJihzKz1yLGUucHVzaChzKSkscj1vLmxlbmd0aH1yZXR1cm57dmVydGljZXM6dCxob2xlczplLGRpbWVuc2lvbnM6bn19ZnVuY3Rpb24gTnkoaSl7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJjb29yZCBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KGkpKXtpZihpLnR5cGU9PT0iRmVhdHVyZSImJmkuZ2VvbWV0cnkhPT1udWxsJiZpLmdlb21ldHJ5LnR5cGU9PT0iUG9pbnQiKXJldHVyblsuLi5pLmdlb21ldHJ5LmNvb3JkaW5hdGVzXTtpZihpLnR5cGU9PT0iUG9pbnQiKXJldHVyblsuLi5pLmNvb3JkaW5hdGVzXX1pZihBcnJheS5pc0FycmF5KGkpJiZpLmxlbmd0aD49MiYmIUFycmF5LmlzQXJyYXkoaVswXSkmJiFBcnJheS5pc0FycmF5KGlbMV0pKXJldHVyblsuLi5pXTt0aHJvdyBuZXcgRXJyb3IoImNvb3JkIG11c3QgYmUgR2VvSlNPTiBQb2ludCBvciBhbiBBcnJheSBvZiBudW1iZXJzIil9ZnVuY3Rpb24gUnkoaSl7aWYoQXJyYXkuaXNBcnJheShpKSlyZXR1cm4gaTtpZihpLnR5cGU9PT0iRmVhdHVyZSIpe2lmKGkuZ2VvbWV0cnkhPT1udWxsKXJldHVybiBpLmdlb21ldHJ5LmNvb3JkaW5hdGVzfWVsc2UgaWYoaS5jb29yZGluYXRlcylyZXR1cm4gaS5jb29yZGluYXRlczt0aHJvdyBuZXcgRXJyb3IoImNvb3JkcyBtdXN0IGJlIEdlb0pTT04gRmVhdHVyZSwgR2VvbWV0cnkgT2JqZWN0IG9yIGFuIEFycmF5Iil9ZnVuY3Rpb24gTHkoaSl7cmV0dXJuIGkudHlwZT09PSJGZWF0dXJlIj9pLmdlb21ldHJ5Oml9ZnVuY3Rpb24gT3koaSl7Y29uc3QgdD1SeShpKTtsZXQgZT0wLG49MSxzLHI7Zm9yKDtuPHQubGVuZ3RoOylzPXJ8fHRbMF0scj10W25dLGUrPShyWzBdLXNbMF0pKihyWzFdK3NbMV0pLG4rKztyZXR1cm4gZT4wfXZhciBEeT1PeTtjb25zdCBxZT0xMTEwMjIzMDI0NjI1MTU2NWUtMzIsdnQ9MTM0MjE3NzI5LCR5PSgzKzgqcWUpKnFlO2Z1bmN0aW9uIGVjKGksdCxlLG4scyl7bGV0IHIsbyxhLGMsbD10WzBdLGg9blswXSx1PTAsZj0wO2g+bD09aD4tbD8ocj1sLGw9dFsrK3VdKToocj1oLGg9blsrK2ZdKTtsZXQgZD0wO2lmKHU8aSYmZjxlKWZvcihoPmw9PWg+LWw/KG89bCtyLGE9ci0oby1sKSxsPXRbKyt1XSk6KG89aCtyLGE9ci0oby1oKSxoPW5bKytmXSkscj1vLGEhPT0wJiYoc1tkKytdPWEpO3U8aSYmZjxlOyloPmw9PWg+LWw/KG89citsLGM9by1yLGE9ci0oby1jKSsobC1jKSxsPXRbKyt1XSk6KG89citoLGM9by1yLGE9ci0oby1jKSsoaC1jKSxoPW5bKytmXSkscj1vLGEhPT0wJiYoc1tkKytdPWEpO2Zvcig7dTxpOylvPXIrbCxjPW8tcixhPXItKG8tYykrKGwtYyksbD10WysrdV0scj1vLGEhPT0wJiYoc1tkKytdPWEpO2Zvcig7ZjxlOylvPXIraCxjPW8tcixhPXItKG8tYykrKGgtYyksaD1uWysrZl0scj1vLGEhPT0wJiYoc1tkKytdPWEpO3JldHVybihyIT09MHx8ZD09PTApJiYoc1tkKytdPXIpLGR9ZnVuY3Rpb24gVnkoaSx0KXtsZXQgZT10WzBdO2ZvcihsZXQgbj0xO248aTtuKyspZSs9dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBucyhpKXtyZXR1cm4gbmV3IEZsb2F0NjRBcnJheShpKX1jb25zdCBVeT0oMysxNipxZSkqcWUscXk9KDIrMTIqcWUpKnFlLEh5PSg5KzY0KnFlKSpxZSpxZSx1aT1ucyg0KSxudT1ucyg4KSxpdT1ucygxMiksc3U9bnMoMTYpLEJ0PW5zKDQpO2Z1bmN0aW9uIFh5KGksdCxlLG4scyxyLG8pe2xldCBhLGMsbCxoLHUsZixkLHAseSxtLGcsYix3LHgsTSxBLFMsdjtjb25zdCBfPWktcyxFPWUtcyx6PXQtcixDPW4tcjt4PV8qQyxmPXZ0Kl8sZD1mLShmLV8pLHA9Xy1kLGY9dnQqQyx5PWYtKGYtQyksbT1DLXksTT1wKm0tKHgtZCp5LXAqeS1kKm0pLEE9eipFLGY9dnQqeixkPWYtKGYteikscD16LWQsZj12dCpFLHk9Zi0oZi1FKSxtPUUteSxTPXAqbS0oQS1kKnktcCp5LWQqbSksZz1NLVMsdT1NLWcsdWlbMF09TS0oZyt1KSsodS1TKSxiPXgrZyx1PWIteCx3PXgtKGItdSkrKGctdSksZz13LUEsdT13LWcsdWlbMV09dy0oZyt1KSsodS1BKSx2PWIrZyx1PXYtYix1aVsyXT1iLSh2LXUpKyhnLXUpLHVpWzNdPXY7bGV0IFA9VnkoNCx1aSksRj1xeSpvO2lmKFA+PUZ8fC1QPj1GfHwodT1pLV8sYT1pLShfK3UpKyh1LXMpLHU9ZS1FLGw9ZS0oRSt1KSsodS1zKSx1PXQteixjPXQtKHordSkrKHUtciksdT1uLUMsaD1uLShDK3UpKyh1LXIpLGE9PT0wJiZjPT09MCYmbD09PTAmJmg9PT0wKXx8KEY9SHkqbyskeSpNYXRoLmFicyhQKSxQKz1fKmgrQyphLSh6KmwrRSpjKSxQPj1GfHwtUD49RikpcmV0dXJuIFA7eD1hKkMsZj12dCphLGQ9Zi0oZi1hKSxwPWEtZCxmPXZ0KkMseT1mLShmLUMpLG09Qy15LE09cCptLSh4LWQqeS1wKnktZCptKSxBPWMqRSxmPXZ0KmMsZD1mLShmLWMpLHA9Yy1kLGY9dnQqRSx5PWYtKGYtRSksbT1FLXksUz1wKm0tKEEtZCp5LXAqeS1kKm0pLGc9TS1TLHU9TS1nLEJ0WzBdPU0tKGcrdSkrKHUtUyksYj14K2csdT1iLXgsdz14LShiLXUpKyhnLXUpLGc9dy1BLHU9dy1nLEJ0WzFdPXctKGcrdSkrKHUtQSksdj1iK2csdT12LWIsQnRbMl09Yi0odi11KSsoZy11KSxCdFszXT12O2NvbnN0IEI9ZWMoNCx1aSw0LEJ0LG51KTt4PV8qaCxmPXZ0Kl8sZD1mLShmLV8pLHA9Xy1kLGY9dnQqaCx5PWYtKGYtaCksbT1oLXksTT1wKm0tKHgtZCp5LXAqeS1kKm0pLEE9eipsLGY9dnQqeixkPWYtKGYteikscD16LWQsZj12dCpsLHk9Zi0oZi1sKSxtPWwteSxTPXAqbS0oQS1kKnktcCp5LWQqbSksZz1NLVMsdT1NLWcsQnRbMF09TS0oZyt1KSsodS1TKSxiPXgrZyx1PWIteCx3PXgtKGItdSkrKGctdSksZz13LUEsdT13LWcsQnRbMV09dy0oZyt1KSsodS1BKSx2PWIrZyx1PXYtYixCdFsyXT1iLSh2LXUpKyhnLXUpLEJ0WzNdPXY7Y29uc3QgST1lYyhCLG51LDQsQnQsaXUpO3g9YSpoLGY9dnQqYSxkPWYtKGYtYSkscD1hLWQsZj12dCpoLHk9Zi0oZi1oKSxtPWgteSxNPXAqbS0oeC1kKnktcCp5LWQqbSksQT1jKmwsZj12dCpjLGQ9Zi0oZi1jKSxwPWMtZCxmPXZ0KmwseT1mLShmLWwpLG09bC15LFM9cCptLShBLWQqeS1wKnktZCptKSxnPU0tUyx1PU0tZyxCdFswXT1NLShnK3UpKyh1LVMpLGI9eCtnLHU9Yi14LHc9eC0oYi11KSsoZy11KSxnPXctQSx1PXctZyxCdFsxXT13LShnK3UpKyh1LUEpLHY9YitnLHU9di1iLEJ0WzJdPWItKHYtdSkrKGctdSksQnRbM109djtjb25zdCBSPWVjKEksaXUsNCxCdCxzdSk7cmV0dXJuIHN1W1ItMV19ZnVuY3Rpb24gRHIoaSx0LGUsbixzLHIpe2NvbnN0IG89KHQtcikqKGUtcyksYT0oaS1zKSoobi1yKSxjPW8tYSxsPU1hdGguYWJzKG8rYSk7cmV0dXJuIE1hdGguYWJzKGMpPj1VeSpsP2M6LVh5KGksdCxlLG4scyxyLGwpfWNvbnN0IHJ1PU1hdGgucG93KDIsLTUyKSwkcj1uZXcgVWludDMyQXJyYXkoNTEyKTtjbGFzcyBpc3tzdGF0aWMgZnJvbSh0LGU9WXksbj1qeSl7Y29uc3Qgcz10Lmxlbmd0aCxyPW5ldyBGbG9hdDY0QXJyYXkocyoyKTtmb3IobGV0IG89MDtvPHM7bysrKXtjb25zdCBhPXRbb107clsyKm9dPWUoYSksclsyKm8rMV09bihhKX1yZXR1cm4gbmV3IGlzKHIpfWNvbnN0cnVjdG9yKHQpe2NvbnN0IGU9dC5sZW5ndGg+PjE7aWYoZT4wJiZ0eXBlb2YgdFswXSE9Im51bWJlciIpdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBjb29yZHMgdG8gY29udGFpbiBudW1iZXJzLiIpO3RoaXMuY29vcmRzPXQ7Y29uc3Qgbj1NYXRoLm1heCgyKmUtNSwwKTt0aGlzLl90cmlhbmdsZXM9bmV3IFVpbnQzMkFycmF5KG4qMyksdGhpcy5faGFsZmVkZ2VzPW5ldyBJbnQzMkFycmF5KG4qMyksdGhpcy5faGFzaFNpemU9TWF0aC5jZWlsKE1hdGguc3FydChlKSksdGhpcy5faHVsbFByZXY9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2h1bGxOZXh0PW5ldyBVaW50MzJBcnJheShlKSx0aGlzLl9odWxsVHJpPW5ldyBVaW50MzJBcnJheShlKSx0aGlzLl9odWxsSGFzaD1uZXcgSW50MzJBcnJheSh0aGlzLl9oYXNoU2l6ZSksdGhpcy5faWRzPW5ldyBVaW50MzJBcnJheShlKSx0aGlzLl9kaXN0cz1uZXcgRmxvYXQ2NEFycmF5KGUpLHRoaXMudXBkYXRlKCl9dXBkYXRlKCl7Y29uc3R7Y29vcmRzOnQsX2h1bGxQcmV2OmUsX2h1bGxOZXh0Om4sX2h1bGxUcmk6cyxfaHVsbEhhc2g6cn09dGhpcyxvPXQubGVuZ3RoPj4xO2xldCBhPTEvMCxjPTEvMCxsPS0xLzAsaD0tMS8wO2ZvcihsZXQgXz0wO188bztfKyspe2NvbnN0IEU9dFsyKl9dLHo9dFsyKl8rMV07RTxhJiYoYT1FKSx6PGMmJihjPXopLEU+bCYmKGw9RSksej5oJiYoaD16KSx0aGlzLl9pZHNbX109X31jb25zdCB1PShhK2wpLzIsZj0oYytoKS8yO2xldCBkLHAseTtmb3IobGV0IF89MCxFPTEvMDtfPG87XysrKXtjb25zdCB6PW5jKHUsZix0WzIqX10sdFsyKl8rMV0pO3o8RSYmKGQ9XyxFPXopfWNvbnN0IG09dFsyKmRdLGc9dFsyKmQrMV07Zm9yKGxldCBfPTAsRT0xLzA7XzxvO18rKyl7aWYoXz09PWQpY29udGludWU7Y29uc3Qgej1uYyhtLGcsdFsyKl9dLHRbMipfKzFdKTt6PEUmJno+MCYmKHA9XyxFPXopfWxldCBiPXRbMipwXSx3PXRbMipwKzFdLHg9MS8wO2ZvcihsZXQgXz0wO188bztfKyspe2lmKF89PT1kfHxfPT09cCljb250aW51ZTtjb25zdCBFPVp5KG0sZyxiLHcsdFsyKl9dLHRbMipfKzFdKTtFPHgmJih5PV8seD1FKX1sZXQgTT10WzIqeV0sQT10WzIqeSsxXTtpZih4PT09MS8wKXtmb3IobGV0IHo9MDt6PG87eisrKXRoaXMuX2Rpc3RzW3pdPXRbMip6XS10WzBdfHx0WzIqeisxXS10WzFdO2ZpKHRoaXMuX2lkcyx0aGlzLl9kaXN0cywwLG8tMSk7Y29uc3QgXz1uZXcgVWludDMyQXJyYXkobyk7bGV0IEU9MDtmb3IobGV0IHo9MCxDPS0xLzA7ejxvO3orKyl7Y29uc3QgUD10aGlzLl9pZHNbel0sRj10aGlzLl9kaXN0c1tQXTtGPkMmJihfW0UrK109UCxDPUYpfXRoaXMuaHVsbD1fLnN1YmFycmF5KDAsRSksdGhpcy50cmlhbmdsZXM9bmV3IFVpbnQzMkFycmF5KDApLHRoaXMuaGFsZmVkZ2VzPW5ldyBVaW50MzJBcnJheSgwKTtyZXR1cm59aWYoRHIobSxnLGIsdyxNLEEpPDApe2NvbnN0IF89cCxFPWIsej13O3A9eSxiPU0sdz1BLHk9XyxNPUUsQT16fWNvbnN0IFM9SnkobSxnLGIsdyxNLEEpO3RoaXMuX2N4PVMueCx0aGlzLl9jeT1TLnk7Zm9yKGxldCBfPTA7XzxvO18rKyl0aGlzLl9kaXN0c1tfXT1uYyh0WzIqX10sdFsyKl8rMV0sUy54LFMueSk7ZmkodGhpcy5faWRzLHRoaXMuX2Rpc3RzLDAsby0xKSx0aGlzLl9odWxsU3RhcnQ9ZDtsZXQgdj0zO25bZF09ZVt5XT1wLG5bcF09ZVtkXT15LG5beV09ZVtwXT1kLHNbZF09MCxzW3BdPTEsc1t5XT0yLHIuZmlsbCgtMSksclt0aGlzLl9oYXNoS2V5KG0sZyldPWQsclt0aGlzLl9oYXNoS2V5KGIsdyldPXAsclt0aGlzLl9oYXNoS2V5KE0sQSldPXksdGhpcy50cmlhbmdsZXNMZW49MCx0aGlzLl9hZGRUcmlhbmdsZShkLHAseSwtMSwtMSwtMSk7Zm9yKGxldCBfPTAsRSx6O188dGhpcy5faWRzLmxlbmd0aDtfKyspe2NvbnN0IEM9dGhpcy5faWRzW19dLFA9dFsyKkNdLEY9dFsyKkMrMV07aWYoXz4wJiZNYXRoLmFicyhQLUUpPD1ydSYmTWF0aC5hYnMoRi16KTw9cnV8fChFPVAsej1GLEM9PT1kfHxDPT09cHx8Qz09PXkpKWNvbnRpbnVlO2xldCBCPTA7Zm9yKGxldCBudD0wLHh0PXRoaXMuX2hhc2hLZXkoUCxGKTtudDx0aGlzLl9oYXNoU2l6ZSYmKEI9clsoeHQrbnQpJXRoaXMuX2hhc2hTaXplXSwhKEIhPT0tMSYmQiE9PW5bQl0pKTtudCsrKTtCPWVbQl07bGV0IEk9QixSO2Zvcig7Uj1uW0ldLERyKFAsRix0WzIqSV0sdFsyKkkrMV0sdFsyKlJdLHRbMipSKzFdKT49MDspaWYoST1SLEk9PT1CKXtJPS0xO2JyZWFrfWlmKEk9PT0tMSljb250aW51ZTtsZXQgJD10aGlzLl9hZGRUcmlhbmdsZShJLEMsbltJXSwtMSwtMSxzW0ldKTtzW0NdPXRoaXMuX2xlZ2FsaXplKCQrMiksc1tJXT0kLHYrKztsZXQgVj1uW0ldO2Zvcig7Uj1uW1ZdLERyKFAsRix0WzIqVl0sdFsyKlYrMV0sdFsyKlJdLHRbMipSKzFdKTwwOykkPXRoaXMuX2FkZFRyaWFuZ2xlKFYsQyxSLHNbQ10sLTEsc1tWXSksc1tDXT10aGlzLl9sZWdhbGl6ZSgkKzIpLG5bVl09Vix2LS0sVj1SO2lmKEk9PT1CKWZvcig7Uj1lW0ldLERyKFAsRix0WzIqUl0sdFsyKlIrMV0sdFsyKkldLHRbMipJKzFdKTwwOykkPXRoaXMuX2FkZFRyaWFuZ2xlKFIsQyxJLC0xLHNbSV0sc1tSXSksdGhpcy5fbGVnYWxpemUoJCsyKSxzW1JdPSQsbltJXT1JLHYtLSxJPVI7dGhpcy5faHVsbFN0YXJ0PWVbQ109SSxuW0ldPWVbVl09QyxuW0NdPVYsclt0aGlzLl9oYXNoS2V5KFAsRildPUMsclt0aGlzLl9oYXNoS2V5KHRbMipJXSx0WzIqSSsxXSldPUl9dGhpcy5odWxsPW5ldyBVaW50MzJBcnJheSh2KTtmb3IobGV0IF89MCxFPXRoaXMuX2h1bGxTdGFydDtfPHY7XysrKXRoaXMuaHVsbFtfXT1FLEU9bltFXTt0aGlzLnRyaWFuZ2xlcz10aGlzLl90cmlhbmdsZXMuc3ViYXJyYXkoMCx0aGlzLnRyaWFuZ2xlc0xlbiksdGhpcy5oYWxmZWRnZXM9dGhpcy5faGFsZmVkZ2VzLnN1YmFycmF5KDAsdGhpcy50cmlhbmdsZXNMZW4pfV9oYXNoS2V5KHQsZSl7cmV0dXJuIE1hdGguZmxvb3IoR3kodC10aGlzLl9jeCxlLXRoaXMuX2N5KSp0aGlzLl9oYXNoU2l6ZSkldGhpcy5faGFzaFNpemV9X2xlZ2FsaXplKHQpe2NvbnN0e190cmlhbmdsZXM6ZSxfaGFsZmVkZ2VzOm4sY29vcmRzOnN9PXRoaXM7bGV0IHI9MCxvPTA7Zm9yKDs7KXtjb25zdCBhPW5bdF0sYz10LXQlMztpZihvPWMrKHQrMiklMyxhPT09LTEpe2lmKHI9PT0wKWJyZWFrO3Q9JHJbLS1yXTtjb250aW51ZX1jb25zdCBsPWEtYSUzLGg9YysodCsxKSUzLHU9bCsoYSsyKSUzLGY9ZVtvXSxkPWVbdF0scD1lW2hdLHk9ZVt1XTtpZihXeShzWzIqZl0sc1syKmYrMV0sc1syKmRdLHNbMipkKzFdLHNbMipwXSxzWzIqcCsxXSxzWzIqeV0sc1syKnkrMV0pKXtlW3RdPXksZVthXT1mO2NvbnN0IGc9blt1XTtpZihnPT09LTEpe2xldCB3PXRoaXMuX2h1bGxTdGFydDtkb3tpZih0aGlzLl9odWxsVHJpW3ddPT09dSl7dGhpcy5faHVsbFRyaVt3XT10O2JyZWFrfXc9dGhpcy5faHVsbFByZXZbd119d2hpbGUodyE9PXRoaXMuX2h1bGxTdGFydCl9dGhpcy5fbGluayh0LGcpLHRoaXMuX2xpbmsoYSxuW29dKSx0aGlzLl9saW5rKG8sdSk7Y29uc3QgYj1sKyhhKzEpJTM7cjwkci5sZW5ndGgmJigkcltyKytdPWIpfWVsc2V7aWYocj09PTApYnJlYWs7dD0kclstLXJdfX1yZXR1cm4gb31fbGluayh0LGUpe3RoaXMuX2hhbGZlZGdlc1t0XT1lLGUhPT0tMSYmKHRoaXMuX2hhbGZlZGdlc1tlXT10KX1fYWRkVHJpYW5nbGUodCxlLG4scyxyLG8pe2NvbnN0IGE9dGhpcy50cmlhbmdsZXNMZW47cmV0dXJuIHRoaXMuX3RyaWFuZ2xlc1thXT10LHRoaXMuX3RyaWFuZ2xlc1thKzFdPWUsdGhpcy5fdHJpYW5nbGVzW2ErMl09bix0aGlzLl9saW5rKGEscyksdGhpcy5fbGluayhhKzEsciksdGhpcy5fbGluayhhKzIsbyksdGhpcy50cmlhbmdsZXNMZW4rPTMsYX19ZnVuY3Rpb24gR3koaSx0KXtjb25zdCBlPWkvKE1hdGguYWJzKGkpK01hdGguYWJzKHQpKTtyZXR1cm4odD4wPzMtZToxK2UpLzR9ZnVuY3Rpb24gbmMoaSx0LGUsbil7Y29uc3Qgcz1pLWUscj10LW47cmV0dXJuIHMqcytyKnJ9ZnVuY3Rpb24gV3koaSx0LGUsbixzLHIsbyxhKXtjb25zdCBjPWktbyxsPXQtYSxoPWUtbyx1PW4tYSxmPXMtbyxkPXItYSxwPWMqYytsKmwseT1oKmgrdSp1LG09ZipmK2QqZDtyZXR1cm4gYyoodSptLXkqZCktbCooaCptLXkqZikrcCooaCpkLXUqZik8MH1mdW5jdGlvbiBaeShpLHQsZSxuLHMscil7Y29uc3Qgbz1lLWksYT1uLXQsYz1zLWksbD1yLXQsaD1vKm8rYSphLHU9YypjK2wqbCxmPS41LyhvKmwtYSpjKSxkPShsKmgtYSp1KSpmLHA9KG8qdS1jKmgpKmY7cmV0dXJuIGQqZCtwKnB9ZnVuY3Rpb24gSnkoaSx0LGUsbixzLHIpe2NvbnN0IG89ZS1pLGE9bi10LGM9cy1pLGw9ci10LGg9bypvK2EqYSx1PWMqYytsKmwsZj0uNS8obypsLWEqYyksZD1pKyhsKmgtYSp1KSpmLHA9dCsobyp1LWMqaCkqZjtyZXR1cm57eDpkLHk6cH19ZnVuY3Rpb24gZmkoaSx0LGUsbil7aWYobi1lPD0yMClmb3IobGV0IHM9ZSsxO3M8PW47cysrKXtjb25zdCByPWlbc10sbz10W3JdO2xldCBhPXMtMTtmb3IoO2E+PWUmJnRbaVthXV0+bzspaVthKzFdPWlbYS0tXTtpW2ErMV09cn1lbHNle2NvbnN0IHM9ZStuPj4xO2xldCByPWUrMSxvPW47c3MoaSxzLHIpLHRbaVtlXV0+dFtpW25dXSYmc3MoaSxlLG4pLHRbaVtyXV0+dFtpW25dXSYmc3MoaSxyLG4pLHRbaVtlXV0+dFtpW3JdXSYmc3MoaSxlLHIpO2NvbnN0IGE9aVtyXSxjPXRbYV07Zm9yKDs7KXtkbyByKys7d2hpbGUodFtpW3JdXTxjKTtkbyBvLS07d2hpbGUodFtpW29dXT5jKTtpZihvPHIpYnJlYWs7c3MoaSxyLG8pfWlbZSsxXT1pW29dLGlbb109YSxuLXIrMT49by1lPyhmaShpLHQscixuKSxmaShpLHQsZSxvLTEpKTooZmkoaSx0LGUsby0xKSxmaShpLHQscixuKSl9fWZ1bmN0aW9uIHNzKGksdCxlKXtjb25zdCBuPWlbdF07aVt0XT1pW2VdLGlbZV09bn1mdW5jdGlvbiBZeShpKXtyZXR1cm4gaVswXX1mdW5jdGlvbiBqeShpKXtyZXR1cm4gaVsxXX1mdW5jdGlvbiBReShpLHQpe3ZhciBlPTAsbj0wLHM9MCxyPTAsbz0wLGE9MCxjPTAsbD0wLGg9bnVsbCx1PW51bGwsZj1pWzBdLGQ9aVsxXSxwPXQubGVuZ3RoO2ZvcihlO2U8cDtlKyspe249MDt2YXIgeT10W2VdLmxlbmd0aC0xLG09dFtlXTtpZihoPW1bMF0saFswXSE9PW1beV1bMF0mJmhbMV0hPT1tW3ldWzFdKXRocm93IG5ldyBFcnJvcigiRmlyc3QgYW5kIGxhc3QgY29vcmRpbmF0ZXMgaW4gYSByaW5nIG11c3QgYmUgdGhlIHNhbWUiKTtmb3Iobz1oWzBdLWYsYT1oWzFdLWQsbjtuPHk7bisrKXtpZih1PW1bbisxXSxsPXVbMV0tZCxhPDAmJmw8MHx8YT4wJiZsPjApe2g9dSxhPWwsbz1oWzBdLWY7Y29udGludWV9aWYoYz11WzBdLWlbMF0sbD4wJiZhPD0wKXtpZihyPW8qbC1jKmEscj4wKXM9cysxO2Vsc2UgaWYocj09PTApcmV0dXJuIDB9ZWxzZSBpZihhPjAmJmw8PTApe2lmKHI9bypsLWMqYSxyPDApcz1zKzE7ZWxzZSBpZihyPT09MClyZXR1cm4gMH1lbHNlIGlmKGw9PT0wJiZhPDApe2lmKHI9bypsLWMqYSxyPT09MClyZXR1cm4gMH1lbHNlIGlmKGE9PT0wJiZsPDApe2lmKHI9bypsLWMqYSxyPT09MClyZXR1cm4gMH1lbHNlIGlmKGE9PT0wJiZsPT09MCl7aWYoYzw9MCYmbz49MClyZXR1cm4gMDtpZihvPD0wJiZjPj0wKXJldHVybiAwfWg9dSxhPWwsbz1jfX1yZXR1cm4gcyUyIT09MH1mdW5jdGlvbiBLeShpLHQsZT17fSl7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJwb2ludCBpcyByZXF1aXJlZCIpO2lmKCF0KXRocm93IG5ldyBFcnJvcigicG9seWdvbiBpcyByZXF1aXJlZCIpO2NvbnN0IG49TnkoaSkscz1MeSh0KSxyPXMudHlwZSxvPXQuYmJveDtsZXQgYT1zLmNvb3JkaW5hdGVzO2lmKG8mJnRtKG4sbyk9PT0hMSlyZXR1cm4hMTtyPT09IlBvbHlnb24iJiYoYT1bYV0pO2xldCBjPSExO2Zvcih2YXIgbD0wO2w8YS5sZW5ndGg7KytsKXtjb25zdCBoPVF5KG4sYVtsXSk7aWYoaD09PTApcmV0dXJuIWUuaWdub3JlQm91bmRhcnk7aCYmKGM9ITApfXJldHVybiBjfWZ1bmN0aW9uIHRtKGksdCl7cmV0dXJuIHRbMF08PWlbMF0mJnRbMV08PWlbMV0mJnRbMl0+PWlbMF0mJnRbM10+PWlbMV19dmFyIGVtPUt5O2NvbnN0IG91PTFlLTY7Y2xhc3Mgem57Y29uc3RydWN0b3IoKXt0aGlzLl94MD10aGlzLl95MD10aGlzLl94MT10aGlzLl95MT1udWxsLHRoaXMuXz0iIn1tb3ZlVG8odCxlKXt0aGlzLl8rPWBNJHt0aGlzLl94MD10aGlzLl94MT0rdH0sJHt0aGlzLl95MD10aGlzLl95MT0rZX1gfWNsb3NlUGF0aCgpe3RoaXMuX3gxIT09bnVsbCYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX1saW5lVG8odCxlKXt0aGlzLl8rPWBMJHt0aGlzLl94MT0rdH0sJHt0aGlzLl95MT0rZX1gfWFyYyh0LGUsbil7dD0rdCxlPStlLG49K247Y29uc3Qgcz10K24scj1lO2lmKG48MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1cyIpO3RoaXMuX3gxPT09bnVsbD90aGlzLl8rPWBNJHtzfSwke3J9YDooTWF0aC5hYnModGhpcy5feDEtcyk+b3V8fE1hdGguYWJzKHRoaXMuX3kxLXIpPm91KSYmKHRoaXMuXys9IkwiK3MrIiwiK3IpLG4mJih0aGlzLl8rPWBBJHtufSwke259LDAsMSwxLCR7dC1ufSwke2V9QSR7bn0sJHtufSwwLDEsMSwke3RoaXMuX3gxPXN9LCR7dGhpcy5feTE9cn1gKX1yZWN0KHQsZSxuLHMpe3RoaXMuXys9YE0ke3RoaXMuX3gwPXRoaXMuX3gxPSt0fSwke3RoaXMuX3kwPXRoaXMuX3kxPStlfWgkeytufXYkeytzfWgkey1ufVpgfXZhbHVlKCl7cmV0dXJuIHRoaXMuX3x8bnVsbH19Y2xhc3MgaWN7Y29uc3RydWN0b3IoKXt0aGlzLl89W119bW92ZVRvKHQsZSl7dGhpcy5fLnB1c2goW3QsZV0pfWNsb3NlUGF0aCgpe3RoaXMuXy5wdXNoKHRoaXMuX1swXS5zbGljZSgpKX1saW5lVG8odCxlKXt0aGlzLl8ucHVzaChbdCxlXSl9dmFsdWUoKXtyZXR1cm4gdGhpcy5fLmxlbmd0aD90aGlzLl86bnVsbH19Y2xhc3Mgbm17Y29uc3RydWN0b3IodCxbZSxuLHMscl09WzAsMCw5NjAsNTAwXSl7aWYoISgocz0rcyk+PShlPStlKSl8fCEoKHI9K3IpPj0obj0rbikpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBib3VuZHMiKTt0aGlzLmRlbGF1bmF5PXQsdGhpcy5fY2lyY3VtY2VudGVycz1uZXcgRmxvYXQ2NEFycmF5KHQucG9pbnRzLmxlbmd0aCoyKSx0aGlzLnZlY3RvcnM9bmV3IEZsb2F0NjRBcnJheSh0LnBvaW50cy5sZW5ndGgqMiksdGhpcy54bWF4PXMsdGhpcy54bWluPWUsdGhpcy55bWF4PXIsdGhpcy55bWluPW4sdGhpcy5faW5pdCgpfXVwZGF0ZSgpe3JldHVybiB0aGlzLmRlbGF1bmF5LnVwZGF0ZSgpLHRoaXMuX2luaXQoKSx0aGlzfV9pbml0KCl7Y29uc3R7ZGVsYXVuYXk6e3BvaW50czp0LGh1bGw6ZSx0cmlhbmdsZXM6bn0sdmVjdG9yczpzfT10aGlzLHI9dGhpcy5jaXJjdW1jZW50ZXJzPXRoaXMuX2NpcmN1bWNlbnRlcnMuc3ViYXJyYXkoMCxuLmxlbmd0aC8zKjIpO2ZvcihsZXQgZD0wLHA9MCx5PW4ubGVuZ3RoLG0sZztkPHk7ZCs9MyxwKz0yKXtjb25zdCBiPW5bZF0qMix3PW5bZCsxXSoyLHg9bltkKzJdKjIsTT10W2JdLEE9dFtiKzFdLFM9dFt3XSx2PXRbdysxXSxfPXRbeF0sRT10W3grMV0sej1TLU0sQz12LUEsUD1fLU0sRj1FLUEsQj0oeipGLUMqUCkqMjtpZihNYXRoLmFicyhCKTwxZS05KXtsZXQgST0xZTk7Y29uc3QgUj1uWzBdKjI7SSo9TWF0aC5zaWduKCh0W1JdLU0pKkYtKHRbUisxXS1BKSpQKSxtPShNK18pLzItSSpGLGc9KEErRSkvMitJKlB9ZWxzZXtjb25zdCBJPTEvQixSPXoqeitDKkMsJD1QKlArRipGO209TSsoRipSLUMqJCkqSSxnPUErKHoqJC1QKlIpKkl9cltwXT1tLHJbcCsxXT1nfWxldCBvPWVbZS5sZW5ndGgtMV0sYSxjPW8qNCxsLGg9dFsyKm9dLHUsZj10WzIqbysxXTtzLmZpbGwoMCk7Zm9yKGxldCBkPTA7ZDxlLmxlbmd0aDsrK2Qpbz1lW2RdLGE9YyxsPWgsdT1mLGM9byo0LGg9dFsyKm9dLGY9dFsyKm8rMV0sc1thKzJdPXNbY109dS1mLHNbYSszXT1zW2MrMV09aC1sfXJlbmRlcih0KXtjb25zdCBlPXQ9PW51bGw/dD1uZXcgem46dm9pZCAwLHtkZWxhdW5heTp7aGFsZmVkZ2VzOm4saW5lZGdlczpzLGh1bGw6cn0sY2lyY3VtY2VudGVyczpvLHZlY3RvcnM6YX09dGhpcztpZihyLmxlbmd0aDw9MSlyZXR1cm4gbnVsbDtmb3IobGV0IGg9MCx1PW4ubGVuZ3RoO2g8dTsrK2gpe2NvbnN0IGY9bltoXTtpZihmPGgpY29udGludWU7Y29uc3QgZD1NYXRoLmZsb29yKGgvMykqMixwPU1hdGguZmxvb3IoZi8zKSoyLHk9b1tkXSxtPW9bZCsxXSxnPW9bcF0sYj1vW3ArMV07dGhpcy5fcmVuZGVyU2VnbWVudCh5LG0sZyxiLHQpfWxldCBjLGw9cltyLmxlbmd0aC0xXTtmb3IobGV0IGg9MDtoPHIubGVuZ3RoOysraCl7Yz1sLGw9cltoXTtjb25zdCB1PU1hdGguZmxvb3Ioc1tsXS8zKSoyLGY9b1t1XSxkPW9bdSsxXSxwPWMqNCx5PXRoaXMuX3Byb2plY3QoZixkLGFbcCsyXSxhW3ArM10pO3kmJnRoaXMuX3JlbmRlclNlZ21lbnQoZixkLHlbMF0seVsxXSx0KX1yZXR1cm4gZSYmZS52YWx1ZSgpfXJlbmRlckJvdW5kcyh0KXtjb25zdCBlPXQ9PW51bGw/dD1uZXcgem46dm9pZCAwO3JldHVybiB0LnJlY3QodGhpcy54bWluLHRoaXMueW1pbix0aGlzLnhtYXgtdGhpcy54bWluLHRoaXMueW1heC10aGlzLnltaW4pLGUmJmUudmFsdWUoKX1yZW5kZXJDZWxsKHQsZSl7Y29uc3Qgbj1lPT1udWxsP2U9bmV3IHpuOnZvaWQgMCxzPXRoaXMuX2NsaXAodCk7aWYocz09PW51bGx8fCFzLmxlbmd0aClyZXR1cm47ZS5tb3ZlVG8oc1swXSxzWzFdKTtsZXQgcj1zLmxlbmd0aDtmb3IoO3NbMF09PT1zW3ItMl0mJnNbMV09PT1zW3ItMV0mJnI+MTspci09Mjtmb3IobGV0IG89MjtvPHI7bys9Mikoc1tvXSE9PXNbby0yXXx8c1tvKzFdIT09c1tvLTFdKSYmZS5saW5lVG8oc1tvXSxzW28rMV0pO3JldHVybiBlLmNsb3NlUGF0aCgpLG4mJm4udmFsdWUoKX0qY2VsbFBvbHlnb25zKCl7Y29uc3R7ZGVsYXVuYXk6e3BvaW50czp0fX09dGhpcztmb3IobGV0IGU9MCxuPXQubGVuZ3RoLzI7ZTxuOysrZSl7Y29uc3Qgcz10aGlzLmNlbGxQb2x5Z29uKGUpO3MmJihzLmluZGV4PWUseWllbGQgcyl9fWNlbGxQb2x5Z29uKHQpe2NvbnN0IGU9bmV3IGljO3JldHVybiB0aGlzLnJlbmRlckNlbGwodCxlKSxlLnZhbHVlKCl9X3JlbmRlclNlZ21lbnQodCxlLG4scyxyKXtsZXQgbztjb25zdCBhPXRoaXMuX3JlZ2lvbmNvZGUodCxlKSxjPXRoaXMuX3JlZ2lvbmNvZGUobixzKTthPT09MCYmYz09PTA/KHIubW92ZVRvKHQsZSksci5saW5lVG8obixzKSk6KG89dGhpcy5fY2xpcFNlZ21lbnQodCxlLG4scyxhLGMpKSYmKHIubW92ZVRvKG9bMF0sb1sxXSksci5saW5lVG8ob1syXSxvWzNdKSl9Y29udGFpbnModCxlLG4pe3JldHVybiBlPStlLGUhPT1lfHwobj0rbixuIT09bik/ITE6dGhpcy5kZWxhdW5heS5fc3RlcCh0LGUsbik9PT10fSpuZWlnaGJvcnModCl7Y29uc3QgZT10aGlzLl9jbGlwKHQpO2lmKGUpZm9yKGNvbnN0IG4gb2YgdGhpcy5kZWxhdW5heS5uZWlnaGJvcnModCkpe2NvbnN0IHM9dGhpcy5fY2xpcChuKTtpZihzKXt0OmZvcihsZXQgcj0wLG89ZS5sZW5ndGg7cjxvO3IrPTIpZm9yKGxldCBhPTAsYz1zLmxlbmd0aDthPGM7YSs9MilpZihlW3JdPT1zW2FdJiZlW3IrMV09PXNbYSsxXSYmZVsocisyKSVvXT09c1soYStjLTIpJWNdJiZlWyhyKzMpJW9dPT1zWyhhK2MtMSklY10pe3lpZWxkIG47YnJlYWsgdH19fX1fY2VsbCh0KXtjb25zdHtjaXJjdW1jZW50ZXJzOmUsZGVsYXVuYXk6e2luZWRnZXM6bixoYWxmZWRnZXM6cyx0cmlhbmdsZXM6cn19PXRoaXMsbz1uW3RdO2lmKG89PT0tMSlyZXR1cm4gbnVsbDtjb25zdCBhPVtdO2xldCBjPW87ZG97Y29uc3QgbD1NYXRoLmZsb29yKGMvMyk7aWYoYS5wdXNoKGVbbCoyXSxlW2wqMisxXSksYz1jJTM9PT0yP2MtMjpjKzEscltjXSE9PXQpYnJlYWs7Yz1zW2NdfXdoaWxlKGMhPT1vJiZjIT09LTEpO3JldHVybiBhfV9jbGlwKHQpe2lmKHQ9PT0wJiZ0aGlzLmRlbGF1bmF5Lmh1bGwubGVuZ3RoPT09MSlyZXR1cm5bdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1pbl07Y29uc3QgZT10aGlzLl9jZWxsKHQpO2lmKGU9PT1udWxsKXJldHVybiBudWxsO2NvbnN0e3ZlY3RvcnM6bn09dGhpcyxzPXQqNDtyZXR1cm4gbltzXXx8bltzKzFdP3RoaXMuX2NsaXBJbmZpbml0ZSh0LGUsbltzXSxuW3MrMV0sbltzKzJdLG5bcyszXSk6dGhpcy5fY2xpcEZpbml0ZSh0LGUpfV9jbGlwRmluaXRlKHQsZSl7Y29uc3Qgbj1lLmxlbmd0aDtsZXQgcz1udWxsLHIsbyxhPWVbbi0yXSxjPWVbbi0xXSxsLGg9dGhpcy5fcmVnaW9uY29kZShhLGMpLHUsZj0wO2ZvcihsZXQgZD0wO2Q8bjtkKz0yKWlmKHI9YSxvPWMsYT1lW2RdLGM9ZVtkKzFdLGw9aCxoPXRoaXMuX3JlZ2lvbmNvZGUoYSxjKSxsPT09MCYmaD09PTApdT1mLGY9MCxzP3MucHVzaChhLGMpOnM9W2EsY107ZWxzZXtsZXQgcCx5LG0sZyxiO2lmKGw9PT0wKXtpZigocD10aGlzLl9jbGlwU2VnbWVudChyLG8sYSxjLGwsaCkpPT09bnVsbCljb250aW51ZTtbeSxtLGcsYl09cH1lbHNle2lmKChwPXRoaXMuX2NsaXBTZWdtZW50KGEsYyxyLG8saCxsKSk9PT1udWxsKWNvbnRpbnVlO1tnLGIseSxtXT1wLHU9ZixmPXRoaXMuX2VkZ2Vjb2RlKHksbSksdSYmZiYmdGhpcy5fZWRnZSh0LHUsZixzLHMubGVuZ3RoKSxzP3MucHVzaCh5LG0pOnM9W3ksbV19dT1mLGY9dGhpcy5fZWRnZWNvZGUoZyxiKSx1JiZmJiZ0aGlzLl9lZGdlKHQsdSxmLHMscy5sZW5ndGgpLHM/cy5wdXNoKGcsYik6cz1bZyxiXX1pZihzKXU9ZixmPXRoaXMuX2VkZ2Vjb2RlKHNbMF0sc1sxXSksdSYmZiYmdGhpcy5fZWRnZSh0LHUsZixzLHMubGVuZ3RoKTtlbHNlIGlmKHRoaXMuY29udGFpbnModCwodGhpcy54bWluK3RoaXMueG1heCkvMiwodGhpcy55bWluK3RoaXMueW1heCkvMikpcmV0dXJuW3RoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltaW5dO3JldHVybiBzfV9jbGlwU2VnbWVudCh0LGUsbixzLHIsbyl7Zm9yKDs7KXtpZihyPT09MCYmbz09PTApcmV0dXJuW3QsZSxuLHNdO2lmKHImbylyZXR1cm4gbnVsbDtsZXQgYSxjLGw9cnx8bztsJjg/KGE9dCsobi10KSoodGhpcy55bWF4LWUpLyhzLWUpLGM9dGhpcy55bWF4KTpsJjQ/KGE9dCsobi10KSoodGhpcy55bWluLWUpLyhzLWUpLGM9dGhpcy55bWluKTpsJjI/KGM9ZSsocy1lKSoodGhpcy54bWF4LXQpLyhuLXQpLGE9dGhpcy54bWF4KTooYz1lKyhzLWUpKih0aGlzLnhtaW4tdCkvKG4tdCksYT10aGlzLnhtaW4pLHI/KHQ9YSxlPWMscj10aGlzLl9yZWdpb25jb2RlKHQsZSkpOihuPWEscz1jLG89dGhpcy5fcmVnaW9uY29kZShuLHMpKX19X2NsaXBJbmZpbml0ZSh0LGUsbixzLHIsbyl7bGV0IGE9QXJyYXkuZnJvbShlKSxjO2lmKChjPXRoaXMuX3Byb2plY3QoYVswXSxhWzFdLG4scykpJiZhLnVuc2hpZnQoY1swXSxjWzFdKSwoYz10aGlzLl9wcm9qZWN0KGFbYS5sZW5ndGgtMl0sYVthLmxlbmd0aC0xXSxyLG8pKSYmYS5wdXNoKGNbMF0sY1sxXSksYT10aGlzLl9jbGlwRmluaXRlKHQsYSkpZm9yKGxldCBsPTAsaD1hLmxlbmd0aCx1LGY9dGhpcy5fZWRnZWNvZGUoYVtoLTJdLGFbaC0xXSk7bDxoO2wrPTIpdT1mLGY9dGhpcy5fZWRnZWNvZGUoYVtsXSxhW2wrMV0pLHUmJmYmJihsPXRoaXMuX2VkZ2UodCx1LGYsYSxsKSxoPWEubGVuZ3RoKTtlbHNlIHRoaXMuY29udGFpbnModCwodGhpcy54bWluK3RoaXMueG1heCkvMiwodGhpcy55bWluK3RoaXMueW1heCkvMikmJihhPVt0aGlzLnhtaW4sdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4XSk7cmV0dXJuIGF9X2VkZ2UodCxlLG4scyxyKXtmb3IoO2UhPT1uOyl7bGV0IG8sYTtzd2l0Y2goZSl7Y2FzZSA1OmU9NDtjb250aW51ZTtjYXNlIDQ6ZT02LG89dGhpcy54bWF4LGE9dGhpcy55bWluO2JyZWFrO2Nhc2UgNjplPTI7Y29udGludWU7Y2FzZSAyOmU9MTAsbz10aGlzLnhtYXgsYT10aGlzLnltYXg7YnJlYWs7Y2FzZSAxMDplPTg7Y29udGludWU7Y2FzZSA4OmU9OSxvPXRoaXMueG1pbixhPXRoaXMueW1heDticmVhaztjYXNlIDk6ZT0xO2NvbnRpbnVlO2Nhc2UgMTplPTUsbz10aGlzLnhtaW4sYT10aGlzLnltaW47YnJlYWt9KHNbcl0hPT1vfHxzW3IrMV0hPT1hKSYmdGhpcy5jb250YWlucyh0LG8sYSkmJihzLnNwbGljZShyLDAsbyxhKSxyKz0yKX1pZihzLmxlbmd0aD40KWZvcihsZXQgbz0wO288cy5sZW5ndGg7bys9Mil7Y29uc3QgYT0obysyKSVzLmxlbmd0aCxjPShvKzQpJXMubGVuZ3RoOyhzW29dPT09c1thXSYmc1thXT09PXNbY118fHNbbysxXT09PXNbYSsxXSYmc1thKzFdPT09c1tjKzFdKSYmKHMuc3BsaWNlKGEsMiksby09Mil9cmV0dXJuIHJ9X3Byb2plY3QodCxlLG4scyl7bGV0IHI9MS8wLG8sYSxjO2lmKHM8MCl7aWYoZTw9dGhpcy55bWluKXJldHVybiBudWxsOyhvPSh0aGlzLnltaW4tZSkvcyk8ciYmKGM9dGhpcy55bWluLGE9dCsocj1vKSpuKX1lbHNlIGlmKHM+MCl7aWYoZT49dGhpcy55bWF4KXJldHVybiBudWxsOyhvPSh0aGlzLnltYXgtZSkvcyk8ciYmKGM9dGhpcy55bWF4LGE9dCsocj1vKSpuKX1pZihuPjApe2lmKHQ+PXRoaXMueG1heClyZXR1cm4gbnVsbDsobz0odGhpcy54bWF4LXQpL24pPHImJihhPXRoaXMueG1heCxjPWUrKHI9bykqcyl9ZWxzZSBpZihuPDApe2lmKHQ8PXRoaXMueG1pbilyZXR1cm4gbnVsbDsobz0odGhpcy54bWluLXQpL24pPHImJihhPXRoaXMueG1pbixjPWUrKHI9bykqcyl9cmV0dXJuW2EsY119X2VkZ2Vjb2RlKHQsZSl7cmV0dXJuKHQ9PT10aGlzLnhtaW4/MTp0PT09dGhpcy54bWF4PzI6MCl8KGU9PT10aGlzLnltaW4/NDplPT09dGhpcy55bWF4Pzg6MCl9X3JlZ2lvbmNvZGUodCxlKXtyZXR1cm4odDx0aGlzLnhtaW4/MTp0PnRoaXMueG1heD8yOjApfChlPHRoaXMueW1pbj80OmU+dGhpcy55bWF4Pzg6MCl9fWNvbnN0IGltPTIqTWF0aC5QSSxkaT1NYXRoLnBvdztmdW5jdGlvbiBzbShpKXtyZXR1cm4gaVswXX1mdW5jdGlvbiBybShpKXtyZXR1cm4gaVsxXX1mdW5jdGlvbiBvbShpKXtjb25zdHt0cmlhbmdsZXM6dCxjb29yZHM6ZX09aTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rPTMpe2NvbnN0IHM9Mip0W25dLHI9Mip0W24rMV0sbz0yKnRbbisyXTtpZigoZVtvXS1lW3NdKSooZVtyKzFdLWVbcysxXSktKGVbcl0tZVtzXSkqKGVbbysxXS1lW3MrMV0pPjFlLTEwKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGFtKGksdCxlKXtyZXR1cm5baStNYXRoLnNpbihpK3QpKmUsdCtNYXRoLmNvcyhpLXQpKmVdfWNsYXNzIHNje3N0YXRpYyBmcm9tKHQsZT1zbSxuPXJtLHMpe3JldHVybiBuZXcgc2MoImxlbmd0aCJpbiB0P2NtKHQsZSxuLHMpOkZsb2F0NjRBcnJheS5mcm9tKGxtKHQsZSxuLHMpKSl9Y29uc3RydWN0b3IodCl7dGhpcy5fZGVsYXVuYXRvcj1uZXcgaXModCksdGhpcy5pbmVkZ2VzPW5ldyBJbnQzMkFycmF5KHQubGVuZ3RoLzIpLHRoaXMuX2h1bGxJbmRleD1uZXcgSW50MzJBcnJheSh0Lmxlbmd0aC8yKSx0aGlzLnBvaW50cz10aGlzLl9kZWxhdW5hdG9yLmNvb3Jkcyx0aGlzLl9pbml0KCl9dXBkYXRlKCl7cmV0dXJuIHRoaXMuX2RlbGF1bmF0b3IudXBkYXRlKCksdGhpcy5faW5pdCgpLHRoaXN9X2luaXQoKXtjb25zdCB0PXRoaXMuX2RlbGF1bmF0b3IsZT10aGlzLnBvaW50cztpZih0Lmh1bGwmJnQuaHVsbC5sZW5ndGg+MiYmb20odCkpe3RoaXMuY29sbGluZWFyPUludDMyQXJyYXkuZnJvbSh7bGVuZ3RoOmUubGVuZ3RoLzJ9LChmLGQpPT5kKS5zb3J0KChmLGQpPT5lWzIqZl0tZVsyKmRdfHxlWzIqZisxXS1lWzIqZCsxXSk7Y29uc3QgYz10aGlzLmNvbGxpbmVhclswXSxsPXRoaXMuY29sbGluZWFyW3RoaXMuY29sbGluZWFyLmxlbmd0aC0xXSxoPVtlWzIqY10sZVsyKmMrMV0sZVsyKmxdLGVbMipsKzFdXSx1PTFlLTgqTWF0aC5oeXBvdChoWzNdLWhbMV0saFsyXS1oWzBdKTtmb3IobGV0IGY9MCxkPWUubGVuZ3RoLzI7ZjxkOysrZil7Y29uc3QgcD1hbShlWzIqZl0sZVsyKmYrMV0sdSk7ZVsyKmZdPXBbMF0sZVsyKmYrMV09cFsxXX10aGlzLl9kZWxhdW5hdG9yPW5ldyBpcyhlKX1lbHNlIGRlbGV0ZSB0aGlzLmNvbGxpbmVhcjtjb25zdCBuPXRoaXMuaGFsZmVkZ2VzPXRoaXMuX2RlbGF1bmF0b3IuaGFsZmVkZ2VzLHM9dGhpcy5odWxsPXRoaXMuX2RlbGF1bmF0b3IuaHVsbCxyPXRoaXMudHJpYW5nbGVzPXRoaXMuX2RlbGF1bmF0b3IudHJpYW5nbGVzLG89dGhpcy5pbmVkZ2VzLmZpbGwoLTEpLGE9dGhpcy5faHVsbEluZGV4LmZpbGwoLTEpO2ZvcihsZXQgYz0wLGw9bi5sZW5ndGg7YzxsOysrYyl7Y29uc3QgaD1yW2MlMz09PTI/Yy0yOmMrMV07KG5bY109PT0tMXx8b1toXT09PS0xKSYmKG9baF09Yyl9Zm9yKGxldCBjPTAsbD1zLmxlbmd0aDtjPGw7KytjKWFbc1tjXV09YztzLmxlbmd0aDw9MiYmcy5sZW5ndGg+MCYmKHRoaXMudHJpYW5nbGVzPW5ldyBJbnQzMkFycmF5KDMpLmZpbGwoLTEpLHRoaXMuaGFsZmVkZ2VzPW5ldyBJbnQzMkFycmF5KDMpLmZpbGwoLTEpLHRoaXMudHJpYW5nbGVzWzBdPXNbMF0sb1tzWzBdXT0xLHMubGVuZ3RoPT09MiYmKG9bc1sxXV09MCx0aGlzLnRyaWFuZ2xlc1sxXT1zWzFdLHRoaXMudHJpYW5nbGVzWzJdPXNbMV0pKX12b3Jvbm9pKHQpe3JldHVybiBuZXcgbm0odGhpcyx0KX0qbmVpZ2hib3JzKHQpe2NvbnN0e2luZWRnZXM6ZSxodWxsOm4sX2h1bGxJbmRleDpzLGhhbGZlZGdlczpyLHRyaWFuZ2xlczpvLGNvbGxpbmVhcjphfT10aGlzO2lmKGEpe2NvbnN0IHU9YS5pbmRleE9mKHQpO3U+MCYmKHlpZWxkIGFbdS0xXSksdTxhLmxlbmd0aC0xJiYoeWllbGQgYVt1KzFdKTtyZXR1cm59Y29uc3QgYz1lW3RdO2lmKGM9PT0tMSlyZXR1cm47bGV0IGw9YyxoPS0xO2Rve2lmKHlpZWxkIGg9b1tsXSxsPWwlMz09PTI/bC0yOmwrMSxvW2xdIT09dClyZXR1cm47aWYobD1yW2xdLGw9PT0tMSl7Y29uc3QgdT1uWyhzW3RdKzEpJW4ubGVuZ3RoXTt1IT09aCYmKHlpZWxkIHUpO3JldHVybn19d2hpbGUobCE9PWMpfWZpbmQodCxlLG49MCl7aWYodD0rdCx0IT09dHx8KGU9K2UsZSE9PWUpKXJldHVybi0xO2NvbnN0IHM9bjtsZXQgcjtmb3IoOyhyPXRoaXMuX3N0ZXAobix0LGUpKT49MCYmciE9PW4mJnIhPT1zOyluPXI7cmV0dXJuIHJ9X3N0ZXAodCxlLG4pe2NvbnN0e2luZWRnZXM6cyxodWxsOnIsX2h1bGxJbmRleDpvLGhhbGZlZGdlczphLHRyaWFuZ2xlczpjLHBvaW50czpsfT10aGlzO2lmKHNbdF09PT0tMXx8IWwubGVuZ3RoKXJldHVybih0KzEpJShsLmxlbmd0aD4+MSk7bGV0IGg9dCx1PWRpKGUtbFt0KjJdLDIpK2RpKG4tbFt0KjIrMV0sMik7Y29uc3QgZj1zW3RdO2xldCBkPWY7ZG97bGV0IHA9Y1tkXTtjb25zdCB5PWRpKGUtbFtwKjJdLDIpK2RpKG4tbFtwKjIrMV0sMik7aWYoeTx1JiYodT15LGg9cCksZD1kJTM9PT0yP2QtMjpkKzEsY1tkXSE9PXQpYnJlYWs7aWYoZD1hW2RdLGQ9PT0tMSl7aWYoZD1yWyhvW3RdKzEpJXIubGVuZ3RoXSxkIT09cCYmZGkoZS1sW2QqMl0sMikrZGkobi1sW2QqMisxXSwyKTx1KXJldHVybiBkO2JyZWFrfX13aGlsZShkIT09Zik7cmV0dXJuIGh9cmVuZGVyKHQpe2NvbnN0IGU9dD09bnVsbD90PW5ldyB6bjp2b2lkIDAse3BvaW50czpuLGhhbGZlZGdlczpzLHRyaWFuZ2xlczpyfT10aGlzO2ZvcihsZXQgbz0wLGE9cy5sZW5ndGg7bzxhOysrbyl7Y29uc3QgYz1zW29dO2lmKGM8byljb250aW51ZTtjb25zdCBsPXJbb10qMixoPXJbY10qMjt0Lm1vdmVUbyhuW2xdLG5bbCsxXSksdC5saW5lVG8obltoXSxuW2grMV0pfXJldHVybiB0aGlzLnJlbmRlckh1bGwodCksZSYmZS52YWx1ZSgpfXJlbmRlclBvaW50cyh0LGUpe2U9PT12b2lkIDAmJighdHx8dHlwZW9mIHQubW92ZVRvIT0iZnVuY3Rpb24iKSYmKGU9dCx0PW51bGwpLGU9ZT09bnVsbD8yOitlO2NvbnN0IG49dD09bnVsbD90PW5ldyB6bjp2b2lkIDAse3BvaW50czpzfT10aGlzO2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrPTIpe2NvbnN0IGE9c1tyXSxjPXNbcisxXTt0Lm1vdmVUbyhhK2UsYyksdC5hcmMoYSxjLGUsMCxpbSl9cmV0dXJuIG4mJm4udmFsdWUoKX1yZW5kZXJIdWxsKHQpe2NvbnN0IGU9dD09bnVsbD90PW5ldyB6bjp2b2lkIDAse2h1bGw6bixwb2ludHM6c309dGhpcyxyPW5bMF0qMixvPW4ubGVuZ3RoO3QubW92ZVRvKHNbcl0sc1tyKzFdKTtmb3IobGV0IGE9MTthPG87KythKXtjb25zdCBjPTIqblthXTt0LmxpbmVUbyhzW2NdLHNbYysxXSl9cmV0dXJuIHQuY2xvc2VQYXRoKCksZSYmZS52YWx1ZSgpfWh1bGxQb2x5Z29uKCl7Y29uc3QgdD1uZXcgaWM7cmV0dXJuIHRoaXMucmVuZGVySHVsbCh0KSx0LnZhbHVlKCl9cmVuZGVyVHJpYW5nbGUodCxlKXtjb25zdCBuPWU9PW51bGw/ZT1uZXcgem46dm9pZCAwLHtwb2ludHM6cyx0cmlhbmdsZXM6cn09dGhpcyxvPXJbdCo9M10qMixhPXJbdCsxXSoyLGM9clt0KzJdKjI7cmV0dXJuIGUubW92ZVRvKHNbb10sc1tvKzFdKSxlLmxpbmVUbyhzW2FdLHNbYSsxXSksZS5saW5lVG8oc1tjXSxzW2MrMV0pLGUuY2xvc2VQYXRoKCksbiYmbi52YWx1ZSgpfSp0cmlhbmdsZVBvbHlnb25zKCl7Y29uc3R7dHJpYW5nbGVzOnR9PXRoaXM7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aC8zO2U8bjsrK2UpeWllbGQgdGhpcy50cmlhbmdsZVBvbHlnb24oZSl9dHJpYW5nbGVQb2x5Z29uKHQpe2NvbnN0IGU9bmV3IGljO3JldHVybiB0aGlzLnJlbmRlclRyaWFuZ2xlKHQsZSksZS52YWx1ZSgpfX1mdW5jdGlvbiBjbShpLHQsZSxuKXtjb25zdCBzPWkubGVuZ3RoLHI9bmV3IEZsb2F0NjRBcnJheShzKjIpO2ZvcihsZXQgbz0wO288czsrK28pe2NvbnN0IGE9aVtvXTtyW28qMl09dC5jYWxsKG4sYSxvLGkpLHJbbyoyKzFdPWUuY2FsbChuLGEsbyxpKX1yZXR1cm4gcn1mdW5jdGlvbipsbShpLHQsZSxuKXtsZXQgcz0wO2Zvcihjb25zdCByIG9mIGkpeWllbGQgdC5jYWxsKG4scixzLGkpLHlpZWxkIGUuY2FsbChuLHIscyxpKSwrK3N9Y29uc3QgcmM9TWF0aC5QSSxhdT1yYy8yLGN1PTE4MC9yYyxsdT1yYy8xODAsaG09TWF0aC5hdGFuMixodT1NYXRoLmNvcyx1bT1NYXRoLm1heCxmbT1NYXRoLm1pbix1dT1NYXRoLnNpbixkbT1NYXRoLnNpZ258fGZ1bmN0aW9uKGkpe3JldHVybiBpPjA/MTppPDA/LTE6MH0sZnU9TWF0aC5zcXJ0O2Z1bmN0aW9uIHBtKGkpe3JldHVybiBpPjE/YXU6aTwtMT8tYXU6TWF0aC5hc2luKGkpfWZ1bmN0aW9uIGR1KGksdCl7cmV0dXJuIGlbMF0qdFswXStpWzFdKnRbMV0raVsyXSp0WzJdfWZ1bmN0aW9uIEh0KGksdCl7cmV0dXJuW2lbMV0qdFsyXS1pWzJdKnRbMV0saVsyXSp0WzBdLWlbMF0qdFsyXSxpWzBdKnRbMV0taVsxXSp0WzBdXX1mdW5jdGlvbiBWcihpLHQpe3JldHVybltpWzBdK3RbMF0saVsxXSt0WzFdLGlbMl0rdFsyXV19ZnVuY3Rpb24gVXIoaSl7dmFyIHQ9ZnUoaVswXSppWzBdK2lbMV0qaVsxXStpWzJdKmlbMl0pO3JldHVybltpWzBdL3QsaVsxXS90LGlbMl0vdF19ZnVuY3Rpb24gb2MoaSl7cmV0dXJuW2htKGlbMV0saVswXSkqY3UscG0odW0oLTEsZm0oMSxpWzJdKSkpKmN1XX1mdW5jdGlvbiBNZShpKXtjb25zdCB0PWlbMF0qbHUsZT1pWzFdKmx1LG49aHUoZSk7cmV0dXJuW24qaHUodCksbip1dSh0KSx1dShlKV19ZnVuY3Rpb24gYWMoaSl7cmV0dXJuIGk9aS5tYXAodD0+TWUodCkpLGR1KGlbMF0sSHQoaVsyXSxpWzFdKSl9ZnVuY3Rpb24geW0oaSl7Y29uc3QgdD1nbShpKSxlPXdtKHQpLG49eG0oZSxpKSxzPU1tKGUsaS5sZW5ndGgpLHI9bW0ocyxpKSxvPWJtKGUsaSkse3BvbHlnb25zOmEsY2VudGVyczpjfT1BbShvLGUsaSksbD1TbShhKSxoPXZtKGUsaSksdT1fbShuLGUpO3JldHVybntkZWxhdW5heTp0LGVkZ2VzOm4sdHJpYW5nbGVzOmUsY2VudGVyczpjLG5laWdoYm9yczpzLHBvbHlnb25zOmEsbWVzaDpsLGh1bGw6aCx1cnF1aGFydDp1LGZpbmQ6cn19ZnVuY3Rpb24gbW0oaSx0KXtmdW5jdGlvbiBlKG4scyl7bGV0IHI9blswXS1zWzBdLG89blsxXS1zWzFdLGE9blsyXS1zWzJdO3JldHVybiByKnIrbypvK2EqYX1yZXR1cm4gZnVuY3Rpb24ocyxyLG8pe289PT12b2lkIDAmJihvPTApO2xldCBhLGMsbD1vO2NvbnN0IGg9TWUoW3Mscl0pO2RvIGE9byxvPW51bGwsYz1lKGgsTWUodFthXSkpLGlbYV0uZm9yRWFjaCh1PT57bGV0IGY9ZShoLE1lKHRbdV0pKTtpZihmPGMpe2M9ZixvPXUsbD11O3JldHVybn19KTt3aGlsZShvIT09bnVsbCk7cmV0dXJuIGx9fWZ1bmN0aW9uIGdtKGkpe2lmKGkubGVuZ3RoPDIpcmV0dXJue307bGV0IHQ9MDtmb3IoO2lzTmFOKGlbdF1bMF0raVt0XVsxXSkmJnQrKzxpLmxlbmd0aDspO2NvbnN0IGU9dmgoaVt0XSksbj1heSgpLnRyYW5zbGF0ZShbMCwwXSkuc2NhbGUoMSkucm90YXRlKGUuaW52ZXJ0KFsxODAsMF0pKTtpPWkubWFwKG4pO2NvbnN0IHM9W107bGV0IHI9MTtmb3IobGV0IHU9MCxmPWkubGVuZ3RoO3U8Zjt1Kyspe2xldCBkPWdpKGlbdV1bMF0sMikrZ2koaVt1XVsxXSwyKTshaXNGaW5pdGUoZCl8fGQ+MWUzMj9zLnB1c2godSk6ZD5yJiYocj1kKX1jb25zdCBvPTFlNipmdShyKTtzLmZvckVhY2godT0+aVt1XT1bbywwXSksaS5wdXNoKFswLG9dKSxpLnB1c2goWy1vLDBdKSxpLnB1c2goWzAsLW9dKTtjb25zdCBhPXNjLmZyb20oaSk7YS5wcm9qZWN0aW9uPW47Y29uc3R7dHJpYW5nbGVzOmMsaGFsZmVkZ2VzOmwsaW5lZGdlczpofT1hO2ZvcihsZXQgdT0wLGY9bC5sZW5ndGg7dTxmO3UrKylpZihsW3VdPDApe2NvbnN0IGQ9dSUzPT0yP3UtMjp1KzEscD11JTM9PTA/dSsyOnUtMSx5PWxbZF0sbT1sW3BdO2xbeV09bSxsW21dPXksbFtkXT1sW3BdPS0xLGNbdV09Y1tkXT1jW3BdPXQsaFtjW3ldXT15JTM9PTA/eSsyOnktMSxoW2NbbV1dPW0lMz09MD9tKzI6bS0xLHUrPTItdSUzfWVsc2UgY1t1XT5pLmxlbmd0aC0zLTEmJihjW3VdPXQpO3JldHVybiBhfWZ1bmN0aW9uIHhtKGksdCl7Y29uc3QgZT1uZXcgU2V0O3JldHVybiB0Lmxlbmd0aD09PTI/W1swLDFdXTooaS5mb3JFYWNoKG49PntpZihuWzBdIT09blsxXSYmIShhYyhuLm1hcChzPT50W3NdKSk8MCkpZm9yKGxldCBzPTAscjtzPDM7cysrKXI9KHMrMSklMyxlLmFkZChhcihbbltzXSxuW3JdXSkuam9pbigiLSIpKX0pLEFycmF5LmZyb20oZSxuPT5uLnNwbGl0KCItIikubWFwKE51bWJlcikpKX1mdW5jdGlvbiB3bShpKXtjb25zdHt0cmlhbmdsZXM6dH09aTtpZighdClyZXR1cm5bXTtjb25zdCBlPVtdO2ZvcihsZXQgbj0wLHM9dC5sZW5ndGgvMztuPHM7bisrKXtjb25zdCByPXRbMypuXSxvPXRbMypuKzFdLGE9dFszKm4rMl07ciE9PW8mJm8hPT1hJiZlLnB1c2goW3IsYSxvXSl9cmV0dXJuIGV9ZnVuY3Rpb24gYm0oaSx0KXtyZXR1cm4gaS5tYXAoZT0+e2NvbnN0IG49ZS5tYXAocj0+dFtyXSkubWFwKE1lKSxzPVZyKFZyKEh0KG5bMV0sblswXSksSHQoblsyXSxuWzFdKSksSHQoblswXSxuWzJdKSk7cmV0dXJuIG9jKFVyKHMpKX0pfWZ1bmN0aW9uIE1tKGksdCl7Y29uc3QgZT1bXTtyZXR1cm4gaS5mb3JFYWNoKG49Pntmb3IobGV0IHM9MDtzPDM7cysrKXtjb25zdCByPW5bc10sbz1uWyhzKzEpJTNdO2Vbcl09ZVtyXXx8W10sZVtyXS5wdXNoKG8pfX0pLGkubGVuZ3RoPT09MCYmKHQ9PT0yPyhlWzBdPVsxXSxlWzFdPVswXSk6dD09PTEmJihlWzBdPVtdKSksZX1mdW5jdGlvbiBBbShpLHQsZSl7Y29uc3Qgbj1bXSxzPWkuc2xpY2UoKTtpZih0Lmxlbmd0aD09PTApe2lmKGUubGVuZ3RoPDIpcmV0dXJue3BvbHlnb25zOm4sY2VudGVyczpzfTtpZihlLmxlbmd0aD09PTIpe2NvbnN0IGE9TWUoZVswXSksYz1NZShlWzFdKSxsPVVyKFZyKGEsYykpLGg9VXIoSHQoYSxjKSksdT1IdChsLGgpLGY9W2wsSHQobCx1KSxIdChIdChsLHUpLHUpLEh0KEh0KEh0KGwsdSksdSksdSldLm1hcChvYykubWFwKG8pO3JldHVybiBuLnB1c2goZiksbi5wdXNoKGYuc2xpY2UoKS5yZXZlcnNlKCkpLHtwb2x5Z29uczpuLGNlbnRlcnM6c319fXQuZm9yRWFjaCgoYSxjKT0+e2ZvcihsZXQgbD0wO2w8MztsKyspe2NvbnN0IGg9YVtsXSx1PWFbKGwrMSklM10sZj1hWyhsKzIpJTNdO25baF09bltoXXx8W10sbltoXS5wdXNoKFt1LGYsYyxbaCx1LGZdXSl9fSk7Y29uc3Qgcj1uLm1hcChhPT57Y29uc3QgYz1bYVswXVsyXV07bGV0IGw9YVswXVsxXTtmb3IobGV0IGg9MTtoPGEubGVuZ3RoO2grKylmb3IobGV0IHU9MDt1PGEubGVuZ3RoO3UrKylpZihhW3VdWzBdPT1sKXtsPWFbdV1bMV0sYy5wdXNoKGFbdV1bMl0pO2JyZWFrfWlmKGMubGVuZ3RoPjIpcmV0dXJuIGM7aWYoYy5sZW5ndGg9PTIpe2NvbnN0IGg9cHUoZVthWzBdWzNdWzBdXSxlW2FbMF1bM11bMV1dLHNbY1swXV0pLHU9cHUoZVthWzBdWzNdWzJdXSxlW2FbMF1bM11bMF1dLHNbY1swXV0pLGY9byhoKSxkPW8odSk7cmV0dXJuW2NbMF0sZCxjWzFdLGZdfX0pO2Z1bmN0aW9uIG8oYSl7bGV0IGM9LTE7cmV0dXJuIHMuc2xpY2UodC5sZW5ndGgsMS8wKS5mb3JFYWNoKChsLGgpPT57bFswXT09PWFbMF0mJmxbMV09PT1hWzFdJiYoYz1oK3QubGVuZ3RoKX0pLGM8MCYmKGM9cy5sZW5ndGgscy5wdXNoKGEpKSxjfXJldHVybntwb2x5Z29uczpyLGNlbnRlcnM6c319ZnVuY3Rpb24gcHUoaSx0LGUpe2k9TWUoaSksdD1NZSh0KSxlPU1lKGUpO2NvbnN0IG49ZG0oZHUoSHQodCxpKSxlKSk7cmV0dXJuIG9jKFVyKFZyKGksdCkpLm1hcChzPT5uKnMpKX1mdW5jdGlvbiBTbShpKXtjb25zdCB0PVtdO3JldHVybiBpLmZvckVhY2goZT0+e2lmKCFlKXJldHVybjtsZXQgbj1lW2UubGVuZ3RoLTFdO2ZvcihsZXQgcyBvZiBlKXM+biYmdC5wdXNoKFtuLHNdKSxuPXN9KSx0fWZ1bmN0aW9uIF9tKGksdCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2NvbnN0IG49bmV3IE1hcCxzPW5ldyBNYXA7cmV0dXJuIGkuZm9yRWFjaCgocixvKT0+e2NvbnN0IGE9ci5qb2luKCItIik7bi5zZXQoYSxlW29dKSxzLnNldChhLCEwKX0pLHQuZm9yRWFjaChyPT57bGV0IG89MCxhPS0xO2ZvcihsZXQgYz0wO2M8MztjKyspe2xldCBsPWFyKFtyW2NdLHJbKGMrMSklM11dKS5qb2luKCItIik7bi5nZXQobCk+byYmKG89bi5nZXQobCksYT1sKX1zLnNldChhLCExKX0pLGkubWFwKHI9PnMuZ2V0KHIuam9pbigiLSIpKSl9fWZ1bmN0aW9uIHZtKGksdCl7Y29uc3QgZT1uZXcgU2V0LG49W107aS5tYXAoYT0+e2lmKCEoYWMoYS5tYXAoYz0+dFtjPnQubGVuZ3RoPzA6Y10pKT4xZS0xMikpZm9yKGxldCBjPTA7YzwzO2MrKyl7bGV0IGw9W2FbY10sYVsoYysxKSUzXV0saD1gJHtsWzBdfS0ke2xbMV19YDtlLmhhcyhoKT9lLmRlbGV0ZShoKTplLmFkZChgJHtsWzFdfS0ke2xbMF19YCl9fSk7Y29uc3Qgcz1uZXcgTWFwO2xldCByO2lmKGUuZm9yRWFjaChhPT57YT1hLnNwbGl0KCItIikubWFwKE51bWJlcikscy5zZXQoYVswXSxhWzFdKSxyPWFbMF19KSxyPT09dm9pZCAwKXJldHVybiBuO2xldCBvPXI7ZG97bi5wdXNoKG8pO2xldCBhPXMuZ2V0KG8pO3Muc2V0KG8sLTEpLG89YX13aGlsZShvPi0xJiZvIT09cik7cmV0dXJuIG59ZnVuY3Rpb24gem0oaSl7Y29uc3QgdD1mdW5jdGlvbihlKXtpZih0LmRlbGF1bmF5PW51bGwsdC5fZGF0YT1lLHR5cGVvZiB0Ll9kYXRhPT0ib2JqZWN0IiYmdC5fZGF0YS50eXBlPT09IkZlYXR1cmVDb2xsZWN0aW9uIiYmKHQuX2RhdGE9dC5fZGF0YS5mZWF0dXJlcyksdHlwZW9mIHQuX2RhdGE9PSJvYmplY3QiKXtjb25zdCBuPXQuX2RhdGEubWFwKHM9Plt0Ll92eChzKSx0Ll92eShzKSxzXSkuZmlsdGVyKHM9PmlzRmluaXRlKHNbMF0rc1sxXSkpO3QucG9pbnRzPW4ubWFwKHM9PltzWzBdLHNbMV1dKSx0LnZhbGlkPW4ubWFwKHM9PnNbMl0pLHQuZGVsYXVuYXk9eW0odC5wb2ludHMpfXJldHVybiB0fTtyZXR1cm4gdC5fdng9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGU9PSJvYmplY3QiJiYidHlwZSJpbiBlKXJldHVybiBiaChlKVswXTtpZigwIGluIGUpcmV0dXJuIGVbMF19LHQuX3Z5PWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlPT0ib2JqZWN0IiYmInR5cGUiaW4gZSlyZXR1cm4gYmgoZSlbMV07aWYoMSBpbiBlKXJldHVybiBlWzFdfSx0Lng9ZnVuY3Rpb24oZSl7cmV0dXJuIGU/KHQuX3Z4PWUsdCk6dC5fdnh9LHQueT1mdW5jdGlvbihlKXtyZXR1cm4gZT8odC5fdnk9ZSx0KTp0Ll92eX0sdC5wb2x5Z29ucz1mdW5jdGlvbihlKXtpZihlIT09dm9pZCAwJiZ0KGUpLCF0LmRlbGF1bmF5KXJldHVybiExO2NvbnN0IG49e3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIixmZWF0dXJlczpbXX07cmV0dXJuIHQudmFsaWQubGVuZ3RoPT09MHx8KHQuZGVsYXVuYXkucG9seWdvbnMuZm9yRWFjaCgocyxyKT0+bi5mZWF0dXJlcy5wdXNoKHt0eXBlOiJGZWF0dXJlIixnZW9tZXRyeTpzP3t0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbWy4uLnMsc1swXV0ubWFwKG89PnQuZGVsYXVuYXkuY2VudGVyc1tvXSldfTpudWxsLHByb3BlcnRpZXM6e3NpdGU6dC52YWxpZFtyXSxzaXRlY29vcmRpbmF0ZXM6dC5wb2ludHNbcl0sbmVpZ2hib3Vyczp0LmRlbGF1bmF5Lm5laWdoYm9yc1tyXX19KSksdC52YWxpZC5sZW5ndGg9PT0xJiZuLmZlYXR1cmVzLnB1c2goe3R5cGU6IkZlYXR1cmUiLGdlb21ldHJ5Ont0eXBlOiJTcGhlcmUifSxwcm9wZXJ0aWVzOntzaXRlOnQudmFsaWRbMF0sc2l0ZWNvb3JkaW5hdGVzOnQucG9pbnRzWzBdLG5laWdoYm91cnM6W119fSkpLG59LHQudHJpYW5nbGVzPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dm9pZCAwJiZ0KGUpLHQuZGVsYXVuYXk/e3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIixmZWF0dXJlczp0LmRlbGF1bmF5LnRyaWFuZ2xlcy5tYXAoKG4scyk9PihuPW4ubWFwKHI9PnQucG9pbnRzW3JdKSxuLmNlbnRlcj10LmRlbGF1bmF5LmNlbnRlcnNbc10sbikpLmZpbHRlcihuPT5hYyhuKT4wKS5tYXAobj0+KHt0eXBlOiJGZWF0dXJlIixwcm9wZXJ0aWVzOntjaXJjdW1jZW50ZXI6bi5jZW50ZXJ9LGdlb21ldHJ5Ont0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbWy4uLm4sblswXV1dfX0pKX06ITF9LHQubGlua3M9ZnVuY3Rpb24oZSl7aWYoZSE9PXZvaWQgMCYmdChlKSwhdC5kZWxhdW5heSlyZXR1cm4hMTtjb25zdCBuPXQuZGVsYXVuYXkuZWRnZXMubWFwKHI9PmFpKHQucG9pbnRzW3JbMF1dLHQucG9pbnRzW3JbMV1dKSkscz10LmRlbGF1bmF5LnVycXVoYXJ0KG4pO3JldHVybnt0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiIsZmVhdHVyZXM6dC5kZWxhdW5heS5lZGdlcy5tYXAoKHIsbyk9Pih7dHlwZToiRmVhdHVyZSIscHJvcGVydGllczp7c291cmNlOnQudmFsaWRbclswXV0sdGFyZ2V0OnQudmFsaWRbclsxXV0sbGVuZ3RoOm5bb10sdXJxdWhhcnQ6ISFzW29dfSxnZW9tZXRyeTp7dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6W3QucG9pbnRzW3JbMF1dLHQucG9pbnRzW3JbMV1dXX19KSl9fSx0Lm1lc2g9ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT12b2lkIDAmJnQoZSksdC5kZWxhdW5heT97dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczp0LmRlbGF1bmF5LmVkZ2VzLm1hcChuPT5bdC5wb2ludHNbblswXV0sdC5wb2ludHNbblsxXV1dKX06ITF9LHQuY2VsbE1lc2g9ZnVuY3Rpb24oZSl7aWYoZSE9PXZvaWQgMCYmdChlKSwhdC5kZWxhdW5heSlyZXR1cm4hMTtjb25zdHtjZW50ZXJzOm4scG9seWdvbnM6c309dC5kZWxhdW5heSxyPVtdO2Zvcihjb25zdCBvIG9mIHMpaWYobylmb3IobGV0IGE9by5sZW5ndGgsYz1vW2EtMV0sbD1vWzBdLGg9MDtoPGE7Yz1sLGw9b1srK2hdKWw+YyYmci5wdXNoKFtuW2NdLG5bbF1dKTtyZXR1cm57dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczpyfX0sdC5fZm91bmQ9dm9pZCAwLHQuZmluZD1mdW5jdGlvbihlLG4scyl7aWYodC5fZm91bmQ9dC5kZWxhdW5heS5maW5kKGUsbix0Ll9mb3VuZCksIXN8fGFpKFtlLG5dLHQucG9pbnRzW3QuX2ZvdW5kXSk8cylyZXR1cm4gdC5fZm91bmR9LHQuaHVsbD1mdW5jdGlvbihlKXtlIT09dm9pZCAwJiZ0KGUpO2NvbnN0IG49dC5kZWxhdW5heS5odWxsLHM9dC5wb2ludHM7cmV0dXJuIG4ubGVuZ3RoPT09MD9udWxsOnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbWy4uLm4ubWFwKHI9PnNbcl0pLHNbblswXV1dXX19LGk/dChpKTp0fWZ1bmN0aW9uIFRtKGksdCl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpicmVhaztjYXNlIDE6dGhpcy5yYW5nZShpKTticmVhaztkZWZhdWx0OnRoaXMucmFuZ2UodCkuZG9tYWluKGkpO2JyZWFrfXJldHVybiB0aGlzfWZ1bmN0aW9uIGNjKGksdCxlKXtpLnByb3RvdHlwZT10LnByb3RvdHlwZT1lLGUuY29uc3RydWN0b3I9aX1mdW5jdGlvbiB5dShpLHQpe3ZhciBlPU9iamVjdC5jcmVhdGUoaS5wcm90b3R5cGUpO2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBycygpe312YXIgb3M9LjcscXI9MS9vcyxwaT0iXFxzKihbKy1dP1xcZCspXFxzKiIsYXM9IlxccyooWystXT8oPzpcXGQqXFwuKT9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLEFlPSJcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsRW09L14jKFswLTlhLWZdezMsOH0pJC8sUG09bmV3IFJlZ0V4cChgXnJnYlxcKCR7cGl9LCR7cGl9LCR7cGl9XFwpJGApLENtPW5ldyBSZWdFeHAoYF5yZ2JcXCgke0FlfSwke0FlfSwke0FlfVxcKSRgKSxCbT1uZXcgUmVnRXhwKGBecmdiYVxcKCR7cGl9LCR7cGl9LCR7cGl9LCR7YXN9XFwpJGApLEZtPW5ldyBSZWdFeHAoYF5yZ2JhXFwoJHtBZX0sJHtBZX0sJHtBZX0sJHthc31cXCkkYCksSW09bmV3IFJlZ0V4cChgXmhzbFxcKCR7YXN9LCR7QWV9LCR7QWV9XFwpJGApLGttPW5ldyBSZWdFeHAoYF5oc2xhXFwoJHthc30sJHtBZX0sJHtBZX0sJHthc31cXCkkYCksbXU9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH07Y2MocnMsY3Mse2NvcHkoaSl7cmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IHRoaXMuY29uc3RydWN0b3IsdGhpcyxpKX0sZGlzcGxheWFibGUoKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSxoZXg6Z3UsZm9ybWF0SGV4Omd1LGZvcm1hdEhleDg6Tm0sZm9ybWF0SHNsOlJtLGZvcm1hdFJnYjp4dSx0b1N0cmluZzp4dX0pO2Z1bmN0aW9uIGd1KCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCl9ZnVuY3Rpb24gTm0oKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXg4KCl9ZnVuY3Rpb24gUm0oKXtyZXR1cm4gU3UodGhpcykuZm9ybWF0SHNsKCl9ZnVuY3Rpb24geHUoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKX1mdW5jdGlvbiBjcyhpKXt2YXIgdCxlO3JldHVybiBpPShpKyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwodD1FbS5leGVjKGkpKT8oZT10WzFdLmxlbmd0aCx0PXBhcnNlSW50KHRbMV0sMTYpLGU9PT02P3d1KHQpOmU9PT0zP25ldyBPdCh0Pj44JjE1fHQ+PjQmMjQwLHQ+PjQmMTV8dCYyNDAsKHQmMTUpPDw0fHQmMTUsMSk6ZT09PTg/SHIodD4+MjQmMjU1LHQ+PjE2JjI1NSx0Pj44JjI1NSwodCYyNTUpLzI1NSk6ZT09PTQ/SHIodD4+MTImMTV8dD4+OCYyNDAsdD4+OCYxNXx0Pj40JjI0MCx0Pj40JjE1fHQmMjQwLCgodCYxNSk8PDR8dCYxNSkvMjU1KTpudWxsKToodD1QbS5leGVjKGkpKT9uZXcgT3QodFsxXSx0WzJdLHRbM10sMSk6KHQ9Q20uZXhlYyhpKSk/bmV3IE90KHRbMV0qMjU1LzEwMCx0WzJdKjI1NS8xMDAsdFszXSoyNTUvMTAwLDEpOih0PUJtLmV4ZWMoaSkpP0hyKHRbMV0sdFsyXSx0WzNdLHRbNF0pOih0PUZtLmV4ZWMoaSkpP0hyKHRbMV0qMjU1LzEwMCx0WzJdKjI1NS8xMDAsdFszXSoyNTUvMTAwLHRbNF0pOih0PUltLmV4ZWMoaSkpP0F1KHRbMV0sdFsyXS8xMDAsdFszXS8xMDAsMSk6KHQ9a20uZXhlYyhpKSk/QXUodFsxXSx0WzJdLzEwMCx0WzNdLzEwMCx0WzRdKTptdS5oYXNPd25Qcm9wZXJ0eShpKT93dShtdVtpXSk6aT09PSJ0cmFuc3BhcmVudCI/bmV3IE90KE5hTixOYU4sTmFOLDApOm51bGx9ZnVuY3Rpb24gd3UoaSl7cmV0dXJuIG5ldyBPdChpPj4xNiYyNTUsaT4+OCYyNTUsaSYyNTUsMSl9ZnVuY3Rpb24gSHIoaSx0LGUsbil7cmV0dXJuIG48PTAmJihpPXQ9ZT1OYU4pLG5ldyBPdChpLHQsZSxuKX1mdW5jdGlvbiBMbShpKXtyZXR1cm4gaSBpbnN0YW5jZW9mIHJzfHwoaT1jcyhpKSksaT8oaT1pLnJnYigpLG5ldyBPdChpLnIsaS5nLGkuYixpLm9wYWNpdHkpKTpuZXcgT3R9ZnVuY3Rpb24gbGMoaSx0LGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0xP0xtKGkpOm5ldyBPdChpLHQsZSxuPT1udWxsPzE6bil9ZnVuY3Rpb24gT3QoaSx0LGUsbil7dGhpcy5yPStpLHRoaXMuZz0rdCx0aGlzLmI9K2UsdGhpcy5vcGFjaXR5PStufWNjKE90LGxjLHl1KHJzLHticmlnaHRlcihpKXtyZXR1cm4gaT1pPT1udWxsP3FyOk1hdGgucG93KHFyLGkpLG5ldyBPdCh0aGlzLnIqaSx0aGlzLmcqaSx0aGlzLmIqaSx0aGlzLm9wYWNpdHkpfSxkYXJrZXIoaSl7cmV0dXJuIGk9aT09bnVsbD9vczpNYXRoLnBvdyhvcyxpKSxuZXcgT3QodGhpcy5yKmksdGhpcy5nKmksdGhpcy5iKmksdGhpcy5vcGFjaXR5KX0scmdiKCl7cmV0dXJuIHRoaXN9LGNsYW1wKCl7cmV0dXJuIG5ldyBPdChUbih0aGlzLnIpLFRuKHRoaXMuZyksVG4odGhpcy5iKSxYcih0aGlzLm9wYWNpdHkpKX0sZGlzcGxheWFibGUoKXtyZXR1cm4tLjU8PXRoaXMuciYmdGhpcy5yPDI1NS41JiYtLjU8PXRoaXMuZyYmdGhpcy5nPDI1NS41JiYtLjU8PXRoaXMuYiYmdGhpcy5iPDI1NS41JiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0saGV4OmJ1LGZvcm1hdEhleDpidSxmb3JtYXRIZXg4Ok9tLGZvcm1hdFJnYjpNdSx0b1N0cmluZzpNdX0pKTtmdW5jdGlvbiBidSgpe3JldHVybmAjJHtFbih0aGlzLnIpfSR7RW4odGhpcy5nKX0ke0VuKHRoaXMuYil9YH1mdW5jdGlvbiBPbSgpe3JldHVybmAjJHtFbih0aGlzLnIpfSR7RW4odGhpcy5nKX0ke0VuKHRoaXMuYil9JHtFbigoaXNOYU4odGhpcy5vcGFjaXR5KT8xOnRoaXMub3BhY2l0eSkqMjU1KX1gfWZ1bmN0aW9uIE11KCl7Y29uc3QgaT1Ycih0aGlzLm9wYWNpdHkpO3JldHVybmAke2k9PT0xPyJyZ2IoIjoicmdiYSgifSR7VG4odGhpcy5yKX0sICR7VG4odGhpcy5nKX0sICR7VG4odGhpcy5iKX0ke2k9PT0xPyIpIjpgLCAke2l9KWB9YH1mdW5jdGlvbiBYcihpKXtyZXR1cm4gaXNOYU4oaSk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsaSkpfWZ1bmN0aW9uIFRuKGkpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKGkpfHwwKSl9ZnVuY3Rpb24gRW4oaSl7cmV0dXJuIGk9VG4oaSksKGk8MTY/IjAiOiIiKStpLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBBdShpLHQsZSxuKXtyZXR1cm4gbjw9MD9pPXQ9ZT1OYU46ZTw9MHx8ZT49MT9pPXQ9TmFOOnQ8PTAmJihpPU5hTiksbmV3IHBlKGksdCxlLG4pfWZ1bmN0aW9uIFN1KGkpe2lmKGkgaW5zdGFuY2VvZiBwZSlyZXR1cm4gbmV3IHBlKGkuaCxpLnMsaS5sLGkub3BhY2l0eSk7aWYoaSBpbnN0YW5jZW9mIHJzfHwoaT1jcyhpKSksIWkpcmV0dXJuIG5ldyBwZTtpZihpIGluc3RhbmNlb2YgcGUpcmV0dXJuIGk7aT1pLnJnYigpO3ZhciB0PWkuci8yNTUsZT1pLmcvMjU1LG49aS5iLzI1NSxzPU1hdGgubWluKHQsZSxuKSxyPU1hdGgubWF4KHQsZSxuKSxvPU5hTixhPXItcyxjPShyK3MpLzI7cmV0dXJuIGE/KHQ9PT1yP289KGUtbikvYSsoZTxuKSo2OmU9PT1yP289KG4tdCkvYSsyOm89KHQtZSkvYSs0LGEvPWM8LjU/citzOjItci1zLG8qPTYwKTphPWM+MCYmYzwxPzA6byxuZXcgcGUobyxhLGMsaS5vcGFjaXR5KX1mdW5jdGlvbiBEbShpLHQsZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTE/U3UoaSk6bmV3IHBlKGksdCxlLG49PW51bGw/MTpuKX1mdW5jdGlvbiBwZShpLHQsZSxuKXt0aGlzLmg9K2ksdGhpcy5zPSt0LHRoaXMubD0rZSx0aGlzLm9wYWNpdHk9K259Y2MocGUsRG0seXUocnMse2JyaWdodGVyKGkpe3JldHVybiBpPWk9PW51bGw/cXI6TWF0aC5wb3cocXIsaSksbmV3IHBlKHRoaXMuaCx0aGlzLnMsdGhpcy5sKmksdGhpcy5vcGFjaXR5KX0sZGFya2VyKGkpe3JldHVybiBpPWk9PW51bGw/b3M6TWF0aC5wb3cob3MsaSksbmV3IHBlKHRoaXMuaCx0aGlzLnMsdGhpcy5sKmksdGhpcy5vcGFjaXR5KX0scmdiKCl7dmFyIGk9dGhpcy5oJTM2MCsodGhpcy5oPDApKjM2MCx0PWlzTmFOKGkpfHxpc05hTih0aGlzLnMpPzA6dGhpcy5zLGU9dGhpcy5sLG49ZSsoZTwuNT9lOjEtZSkqdCxzPTIqZS1uO3JldHVybiBuZXcgT3QoaGMoaT49MjQwP2ktMjQwOmkrMTIwLHMsbiksaGMoaSxzLG4pLGhjKGk8MTIwP2krMjQwOmktMTIwLHMsbiksdGhpcy5vcGFjaXR5KX0sY2xhbXAoKXtyZXR1cm4gbmV3IHBlKF91KHRoaXMuaCksR3IodGhpcy5zKSxHcih0aGlzLmwpLFhyKHRoaXMub3BhY2l0eSkpfSxkaXNwbGF5YWJsZSgpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sZm9ybWF0SHNsKCl7Y29uc3QgaT1Ycih0aGlzLm9wYWNpdHkpO3JldHVybmAke2k9PT0xPyJoc2woIjoiaHNsYSgifSR7X3UodGhpcy5oKX0sICR7R3IodGhpcy5zKSoxMDB9JSwgJHtHcih0aGlzLmwpKjEwMH0lJHtpPT09MT8iKSI6YCwgJHtpfSlgfWB9fSkpO2Z1bmN0aW9uIF91KGkpe3JldHVybiBpPShpfHwwKSUzNjAsaTwwP2krMzYwOml9ZnVuY3Rpb24gR3IoaSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMSxpfHwwKSl9ZnVuY3Rpb24gaGMoaSx0LGUpe3JldHVybihpPDYwP3QrKGUtdCkqaS82MDppPDE4MD9lOmk8MjQwP3QrKGUtdCkqKDI0MC1pKS82MDp0KSoyNTV9dmFyIHVjPWk9PigpPT5pO2Z1bmN0aW9uICRtKGksdCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBpK2UqdH19ZnVuY3Rpb24gVm0oaSx0LGUpe3JldHVybiBpPU1hdGgucG93KGksZSksdD1NYXRoLnBvdyh0LGUpLWksZT0xL2UsZnVuY3Rpb24obil7cmV0dXJuIE1hdGgucG93KGkrbip0LGUpfX1mdW5jdGlvbiBVbShpKXtyZXR1cm4oaT0raSk9PTE/dnU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS10P1ZtKHQsZSxpKTp1Yyhpc05hTih0KT9lOnQpfX1mdW5jdGlvbiB2dShpLHQpe3ZhciBlPXQtaTtyZXR1cm4gZT8kbShpLGUpOnVjKGlzTmFOKGkpP3Q6aSl9dmFyIHp1PWZ1bmN0aW9uIGkodCl7dmFyIGU9VW0odCk7ZnVuY3Rpb24gbihzLHIpe3ZhciBvPWUoKHM9bGMocykpLnIsKHI9bGMocikpLnIpLGE9ZShzLmcsci5nKSxjPWUocy5iLHIuYiksbD12dShzLm9wYWNpdHksci5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24oaCl7cmV0dXJuIHMucj1vKGgpLHMuZz1hKGgpLHMuYj1jKGgpLHMub3BhY2l0eT1sKGgpLHMrIiJ9fXJldHVybiBuLmdhbW1hPWksbn0oMSk7ZnVuY3Rpb24gcW0oaSx0KXt0fHwodD1bXSk7dmFyIGU9aT9NYXRoLm1pbih0Lmxlbmd0aCxpLmxlbmd0aCk6MCxuPXQuc2xpY2UoKSxzO3JldHVybiBmdW5jdGlvbihyKXtmb3Iocz0wO3M8ZTsrK3MpbltzXT1pW3NdKigxLXIpK3Rbc10qcjtyZXR1cm4gbn19ZnVuY3Rpb24gSG0oaSl7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhpKSYmIShpIGluc3RhbmNlb2YgRGF0YVZpZXcpfWZ1bmN0aW9uIFhtKGksdCl7dmFyIGU9dD90Lmxlbmd0aDowLG49aT9NYXRoLm1pbihlLGkubGVuZ3RoKTowLHM9bmV3IEFycmF5KG4pLHI9bmV3IEFycmF5KGUpLG87Zm9yKG89MDtvPG47KytvKXNbb109cGMoaVtvXSx0W29dKTtmb3IoO288ZTsrK28pcltvXT10W29dO3JldHVybiBmdW5jdGlvbihhKXtmb3Iobz0wO288bjsrK28pcltvXT1zW29dKGEpO3JldHVybiByfX1mdW5jdGlvbiBHbShpLHQpe3ZhciBlPW5ldyBEYXRlO3JldHVybiBpPStpLHQ9K3QsZnVuY3Rpb24obil7cmV0dXJuIGUuc2V0VGltZShpKigxLW4pK3QqbiksZX19ZnVuY3Rpb24gV3IoaSx0KXtyZXR1cm4gaT0raSx0PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBpKigxLWUpK3QqZX19ZnVuY3Rpb24gV20oaSx0KXt2YXIgZT17fSxuPXt9LHM7KGk9PT1udWxsfHx0eXBlb2YgaSE9Im9iamVjdCIpJiYoaT17fSksKHQ9PT1udWxsfHx0eXBlb2YgdCE9Im9iamVjdCIpJiYodD17fSk7Zm9yKHMgaW4gdClzIGluIGk/ZVtzXT1wYyhpW3NdLHRbc10pOm5bc109dFtzXTtyZXR1cm4gZnVuY3Rpb24ocil7Zm9yKHMgaW4gZSluW3NdPWVbc10ocik7cmV0dXJuIG59fXZhciBmYz0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2csZGM9bmV3IFJlZ0V4cChmYy5zb3VyY2UsImciKTtmdW5jdGlvbiBabShpKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaX19ZnVuY3Rpb24gSm0oaSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpKHQpKyIifX1mdW5jdGlvbiBZbShpLHQpe3ZhciBlPWZjLmxhc3RJbmRleD1kYy5sYXN0SW5kZXg9MCxuLHMscixvPS0xLGE9W10sYz1bXTtmb3IoaT1pKyIiLHQ9dCsiIjsobj1mYy5leGVjKGkpKSYmKHM9ZGMuZXhlYyh0KSk7KShyPXMuaW5kZXgpPmUmJihyPXQuc2xpY2UoZSxyKSxhW29dP2Fbb10rPXI6YVsrK29dPXIpLChuPW5bMF0pPT09KHM9c1swXSk/YVtvXT9hW29dKz1zOmFbKytvXT1zOihhWysrb109bnVsbCxjLnB1c2goe2k6byx4OldyKG4scyl9KSksZT1kYy5sYXN0SW5kZXg7cmV0dXJuIGU8dC5sZW5ndGgmJihyPXQuc2xpY2UoZSksYVtvXT9hW29dKz1yOmFbKytvXT1yKSxhLmxlbmd0aDwyP2NbMF0/Sm0oY1swXS54KTpabSh0KToodD1jLmxlbmd0aCxmdW5jdGlvbihsKXtmb3IodmFyIGg9MCx1O2g8dDsrK2gpYVsodT1jW2hdKS5pXT11LngobCk7cmV0dXJuIGEuam9pbigiIil9KX1mdW5jdGlvbiBwYyhpLHQpe3ZhciBlPXR5cGVvZiB0LG47cmV0dXJuIHQ9PW51bGx8fGU9PT0iYm9vbGVhbiI/dWModCk6KGU9PT0ibnVtYmVyIj9XcjplPT09InN0cmluZyI/KG49Y3ModCkpPyh0PW4senUpOlltOnQgaW5zdGFuY2VvZiBjcz96dTp0IGluc3RhbmNlb2YgRGF0ZT9HbTpIbSh0KT9xbTpBcnJheS5pc0FycmF5KHQpP1htOnR5cGVvZiB0LnZhbHVlT2YhPSJmdW5jdGlvbiImJnR5cGVvZiB0LnRvU3RyaW5nIT0iZnVuY3Rpb24ifHxpc05hTih0KT9XbTpXcikoaSx0KX1mdW5jdGlvbiBqbShpLHQpe3JldHVybiBpPStpLHQ9K3QsZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQoaSooMS1lKSt0KmUpfX1mdW5jdGlvbiBRbShpKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaX19ZnVuY3Rpb24gS20oaSl7cmV0dXJuK2l9dmFyIFR1PVswLDFdO2Z1bmN0aW9uIHlpKGkpe3JldHVybiBpfWZ1bmN0aW9uIHljKGksdCl7cmV0dXJuKHQtPWk9K2kpP2Z1bmN0aW9uKGUpe3JldHVybihlLWkpL3R9OlFtKGlzTmFOKHQpP05hTjouNSl9ZnVuY3Rpb24gdGcoaSx0KXt2YXIgZTtyZXR1cm4gaT50JiYoZT1pLGk9dCx0PWUpLGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLm1heChpLE1hdGgubWluKHQsbikpfX1mdW5jdGlvbiBlZyhpLHQsZSl7dmFyIG49aVswXSxzPWlbMV0scj10WzBdLG89dFsxXTtyZXR1cm4gczxuPyhuPXljKHMsbikscj1lKG8scikpOihuPXljKG4scykscj1lKHIsbykpLGZ1bmN0aW9uKGEpe3JldHVybiByKG4oYSkpfX1mdW5jdGlvbiBuZyhpLHQsZSl7dmFyIG49TWF0aC5taW4oaS5sZW5ndGgsdC5sZW5ndGgpLTEscz1uZXcgQXJyYXkobikscj1uZXcgQXJyYXkobiksbz0tMTtmb3IoaVtuXTxpWzBdJiYoaT1pLnNsaWNlKCkucmV2ZXJzZSgpLHQ9dC5zbGljZSgpLnJldmVyc2UoKSk7KytvPG47KXNbb109eWMoaVtvXSxpW28rMV0pLHJbb109ZSh0W29dLHRbbysxXSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjPXNwKGksYSwxLG4pLTE7cmV0dXJuIHJbY10oc1tjXShhKSl9fWZ1bmN0aW9uIGlnKGksdCl7cmV0dXJuIHQuZG9tYWluKGkuZG9tYWluKCkpLnJhbmdlKGkucmFuZ2UoKSkuaW50ZXJwb2xhdGUoaS5pbnRlcnBvbGF0ZSgpKS5jbGFtcChpLmNsYW1wKCkpLnVua25vd24oaS51bmtub3duKCkpfWZ1bmN0aW9uIHNnKCl7dmFyIGk9VHUsdD1UdSxlPXBjLG4scyxyLG89eWksYSxjLGw7ZnVuY3Rpb24gaCgpe3ZhciBmPU1hdGgubWluKGkubGVuZ3RoLHQubGVuZ3RoKTtyZXR1cm4gbyE9PXlpJiYobz10ZyhpWzBdLGlbZi0xXSkpLGE9Zj4yP25nOmVnLGM9bD1udWxsLHV9ZnVuY3Rpb24gdShmKXtyZXR1cm4gZj09bnVsbHx8aXNOYU4oZj0rZik/cjooY3x8KGM9YShpLm1hcChuKSx0LGUpKSkobihvKGYpKSl9cmV0dXJuIHUuaW52ZXJ0PWZ1bmN0aW9uKGYpe3JldHVybiBvKHMoKGx8fChsPWEodCxpLm1hcChuKSxXcikpKShmKSkpfSx1LmRvbWFpbj1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1BcnJheS5mcm9tKGYsS20pLGgoKSk6aS5zbGljZSgpfSx1LnJhbmdlPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PUFycmF5LmZyb20oZiksaCgpKTp0LnNsaWNlKCl9LHUucmFuZ2VSb3VuZD1mdW5jdGlvbihmKXtyZXR1cm4gdD1BcnJheS5mcm9tKGYpLGU9am0saCgpfSx1LmNsYW1wPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWY/ITA6eWksaCgpKTpvIT09eWl9LHUuaW50ZXJwb2xhdGU9ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ZixoKCkpOmV9LHUudW5rbm93bj1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1mLHUpOnJ9LGZ1bmN0aW9uKGYsZCl7cmV0dXJuIG49ZixzPWQsaCgpfX1mdW5jdGlvbiByZygpe3JldHVybiBzZygpKHlpLHlpKX1mdW5jdGlvbiBvZyhpKXtyZXR1cm4gTWF0aC5hYnMoaT1NYXRoLnJvdW5kKGkpKT49MWUyMT9pLnRvTG9jYWxlU3RyaW5nKCJlbiIpLnJlcGxhY2UoLywvZywiIik6aS50b1N0cmluZygxMCl9ZnVuY3Rpb24gWnIoaSx0KXtpZigoZT0oaT10P2kudG9FeHBvbmVudGlhbCh0LTEpOmkudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKCJlIikpPDApcmV0dXJuIG51bGw7dmFyIGUsbj1pLnNsaWNlKDAsZSk7cmV0dXJuW24ubGVuZ3RoPjE/blswXStuLnNsaWNlKDIpOm4sK2kuc2xpY2UoZSsxKV19ZnVuY3Rpb24gbWkoaSl7cmV0dXJuIGk9WnIoTWF0aC5hYnMoaSkpLGk/aVsxXTpOYU59ZnVuY3Rpb24gYWcoaSx0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtmb3IodmFyIHM9ZS5sZW5ndGgscj1bXSxvPTAsYT1pWzBdLGM9MDtzPjAmJmE+MCYmKGMrYSsxPm4mJihhPU1hdGgubWF4KDEsbi1jKSksci5wdXNoKGUuc3Vic3RyaW5nKHMtPWEscythKSksISgoYys9YSsxKT5uKSk7KWE9aVtvPShvKzEpJWkubGVuZ3RoXTtyZXR1cm4gci5yZXZlcnNlKCkuam9pbih0KX19ZnVuY3Rpb24gY2coaSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2UoL1swLTldL2csZnVuY3Rpb24oZSl7cmV0dXJuIGlbK2VdfSl9fXZhciBsZz0vXig/OiguKT8oWzw+PV5dKSk/KFsrXC0oIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KH4pPyhbYS16JV0pPyQvaTtmdW5jdGlvbiBKcihpKXtpZighKHQ9bGcuZXhlYyhpKSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdDogIitpKTt2YXIgdDtyZXR1cm4gbmV3IG1jKHtmaWxsOnRbMV0sYWxpZ246dFsyXSxzaWduOnRbM10sc3ltYm9sOnRbNF0semVybzp0WzVdLHdpZHRoOnRbNl0sY29tbWE6dFs3XSxwcmVjaXNpb246dFs4XSYmdFs4XS5zbGljZSgxKSx0cmltOnRbOV0sdHlwZTp0WzEwXX0pfUpyLnByb3RvdHlwZT1tYy5wcm90b3R5cGU7ZnVuY3Rpb24gbWMoaSl7dGhpcy5maWxsPWkuZmlsbD09PXZvaWQgMD8iICI6aS5maWxsKyIiLHRoaXMuYWxpZ249aS5hbGlnbj09PXZvaWQgMD8iPiI6aS5hbGlnbisiIix0aGlzLnNpZ249aS5zaWduPT09dm9pZCAwPyItIjppLnNpZ24rIiIsdGhpcy5zeW1ib2w9aS5zeW1ib2w9PT12b2lkIDA/IiI6aS5zeW1ib2wrIiIsdGhpcy56ZXJvPSEhaS56ZXJvLHRoaXMud2lkdGg9aS53aWR0aD09PXZvaWQgMD92b2lkIDA6K2kud2lkdGgsdGhpcy5jb21tYT0hIWkuY29tbWEsdGhpcy5wcmVjaXNpb249aS5wcmVjaXNpb249PT12b2lkIDA/dm9pZCAwOitpLnByZWNpc2lvbix0aGlzLnRyaW09ISFpLnRyaW0sdGhpcy50eXBlPWkudHlwZT09PXZvaWQgMD8iIjppLnR5cGUrIiJ9bWMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbCt0aGlzLmFsaWduK3RoaXMuc2lnbit0aGlzLnN5bWJvbCsodGhpcy56ZXJvPyIwIjoiIikrKHRoaXMud2lkdGg9PT12b2lkIDA/IiI6TWF0aC5tYXgoMSx0aGlzLndpZHRofDApKSsodGhpcy5jb21tYT8iLCI6IiIpKyh0aGlzLnByZWNpc2lvbj09PXZvaWQgMD8iIjoiLiIrTWF0aC5tYXgoMCx0aGlzLnByZWNpc2lvbnwwKSkrKHRoaXMudHJpbT8ifiI6IiIpK3RoaXMudHlwZX07ZnVuY3Rpb24gaGcoaSl7dDpmb3IodmFyIHQ9aS5sZW5ndGgsZT0xLG49LTEscztlPHQ7KytlKXN3aXRjaChpW2VdKXtjYXNlIi4iOm49cz1lO2JyZWFrO2Nhc2UiMCI6bj09PTAmJihuPWUpLHM9ZTticmVhaztkZWZhdWx0OmlmKCEraVtlXSlicmVhayB0O24+MCYmKG49MCk7YnJlYWt9cmV0dXJuIG4+MD9pLnNsaWNlKDAsbikraS5zbGljZShzKzEpOml9dmFyIEV1O2Z1bmN0aW9uIHVnKGksdCl7dmFyIGU9WnIoaSx0KTtpZighZSlyZXR1cm4gaSsiIjt2YXIgbj1lWzBdLHM9ZVsxXSxyPXMtKEV1PU1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihzLzMpKSkqMykrMSxvPW4ubGVuZ3RoO3JldHVybiByPT09bz9uOnI+bz9uK25ldyBBcnJheShyLW8rMSkuam9pbigiMCIpOnI+MD9uLnNsaWNlKDAscikrIi4iK24uc2xpY2Uocik6IjAuIituZXcgQXJyYXkoMS1yKS5qb2luKCIwIikrWnIoaSxNYXRoLm1heCgwLHQrci0xKSlbMF19ZnVuY3Rpb24gUHUoaSx0KXt2YXIgZT1acihpLHQpO2lmKCFlKXJldHVybiBpKyIiO3ZhciBuPWVbMF0scz1lWzFdO3JldHVybiBzPDA/IjAuIituZXcgQXJyYXkoLXMpLmpvaW4oIjAiKStuOm4ubGVuZ3RoPnMrMT9uLnNsaWNlKDAscysxKSsiLiIrbi5zbGljZShzKzEpOm4rbmV3IEFycmF5KHMtbi5sZW5ndGgrMikuam9pbigiMCIpfXZhciBDdT17IiUiOihpLHQpPT4oaSoxMDApLnRvRml4ZWQodCksYjppPT5NYXRoLnJvdW5kKGkpLnRvU3RyaW5nKDIpLGM6aT0+aSsiIixkOm9nLGU6KGksdCk9PmkudG9FeHBvbmVudGlhbCh0KSxmOihpLHQpPT5pLnRvRml4ZWQodCksZzooaSx0KT0+aS50b1ByZWNpc2lvbih0KSxvOmk9Pk1hdGgucm91bmQoaSkudG9TdHJpbmcoOCkscDooaSx0KT0+UHUoaSoxMDAsdCkscjpQdSxzOnVnLFg6aT0+TWF0aC5yb3VuZChpKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSx4Omk9Pk1hdGgucm91bmQoaSkudG9TdHJpbmcoMTYpfTtmdW5jdGlvbiBCdShpKXtyZXR1cm4gaX12YXIgRnU9QXJyYXkucHJvdG90eXBlLm1hcCxJdT1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIsK1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl07ZnVuY3Rpb24gZmcoaSl7dmFyIHQ9aS5ncm91cGluZz09PXZvaWQgMHx8aS50aG91c2FuZHM9PT12b2lkIDA/QnU6YWcoRnUuY2FsbChpLmdyb3VwaW5nLE51bWJlciksaS50aG91c2FuZHMrIiIpLGU9aS5jdXJyZW5jeT09PXZvaWQgMD8iIjppLmN1cnJlbmN5WzBdKyIiLG49aS5jdXJyZW5jeT09PXZvaWQgMD8iIjppLmN1cnJlbmN5WzFdKyIiLHM9aS5kZWNpbWFsPT09dm9pZCAwPyIuIjppLmRlY2ltYWwrIiIscj1pLm51bWVyYWxzPT09dm9pZCAwP0J1OmNnKEZ1LmNhbGwoaS5udW1lcmFscyxTdHJpbmcpKSxvPWkucGVyY2VudD09PXZvaWQgMD8iJSI6aS5wZXJjZW50KyIiLGE9aS5taW51cz09PXZvaWQgMD8i4oiSIjppLm1pbnVzKyIiLGM9aS5uYW49PT12b2lkIDA/Ik5hTiI6aS5uYW4rIiI7ZnVuY3Rpb24gbCh1KXt1PUpyKHUpO3ZhciBmPXUuZmlsbCxkPXUuYWxpZ24scD11LnNpZ24seT11LnN5bWJvbCxtPXUuemVybyxnPXUud2lkdGgsYj11LmNvbW1hLHc9dS5wcmVjaXNpb24seD11LnRyaW0sTT11LnR5cGU7TT09PSJuIj8oYj0hMCxNPSJnIik6Q3VbTV18fCh3PT09dm9pZCAwJiYodz0xMikseD0hMCxNPSJnIiksKG18fGY9PT0iMCImJmQ9PT0iPSIpJiYobT0hMCxmPSIwIixkPSI9Iik7dmFyIEE9eT09PSIkIj9lOnk9PT0iIyImJi9bYm94WF0vLnRlc3QoTSk/IjAiK00udG9Mb3dlckNhc2UoKToiIixTPXk9PT0iJCI/bjovWyVwXS8udGVzdChNKT9vOiIiLHY9Q3VbTV0sXz0vW2RlZmdwcnMlXS8udGVzdChNKTt3PXc9PT12b2lkIDA/NjovW2dwcnNdLy50ZXN0KE0pP01hdGgubWF4KDEsTWF0aC5taW4oMjEsdykpOk1hdGgubWF4KDAsTWF0aC5taW4oMjAsdykpO2Z1bmN0aW9uIEUoeil7dmFyIEM9QSxQPVMsRixCLEk7aWYoTT09PSJjIilQPXYoeikrUCx6PSIiO2Vsc2V7ej0rejt2YXIgUj16PDB8fDEvejwwO2lmKHo9aXNOYU4oeik/Yzp2KE1hdGguYWJzKHopLHcpLHgmJih6PWhnKHopKSxSJiYrej09MCYmcCE9PSIrIiYmKFI9ITEpLEM9KFI/cD09PSIoIj9wOmE6cD09PSItInx8cD09PSIoIj8iIjpwKStDLFA9KE09PT0icyI/SXVbOCtFdS8zXToiIikrUCsoUiYmcD09PSIoIj8iKSI6IiIpLF8pe2ZvcihGPS0xLEI9ei5sZW5ndGg7KytGPEI7KWlmKEk9ei5jaGFyQ29kZUF0KEYpLDQ4Pkl8fEk+NTcpe1A9KEk9PT00Nj9zK3ouc2xpY2UoRisxKTp6LnNsaWNlKEYpKStQLHo9ei5zbGljZSgwLEYpO2JyZWFrfX19YiYmIW0mJih6PXQoeiwxLzApKTt2YXIgJD1DLmxlbmd0aCt6Lmxlbmd0aCtQLmxlbmd0aCxWPSQ8Zz9uZXcgQXJyYXkoZy0kKzEpLmpvaW4oZik6IiI7c3dpdGNoKGImJm0mJih6PXQoVit6LFYubGVuZ3RoP2ctUC5sZW5ndGg6MS8wKSxWPSIiKSxkKXtjYXNlIjwiOno9Qyt6K1ArVjticmVhaztjYXNlIj0iOno9QytWK3orUDticmVhaztjYXNlIl4iOno9Vi5zbGljZSgwLCQ9Vi5sZW5ndGg+PjEpK0MreitQK1Yuc2xpY2UoJCk7YnJlYWs7ZGVmYXVsdDp6PVYrQyt6K1A7YnJlYWt9cmV0dXJuIHIoeil9cmV0dXJuIEUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdSsiIn0sRX1mdW5jdGlvbiBoKHUsZil7dmFyIGQ9bCgodT1Kcih1KSx1LnR5cGU9ImYiLHUpKSxwPU1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihtaShmKS8zKSkpKjMseT1NYXRoLnBvdygxMCwtcCksbT1JdVs4K3AvM107cmV0dXJuIGZ1bmN0aW9uKGcpe3JldHVybiBkKHkqZykrbX19cmV0dXJue2Zvcm1hdDpsLGZvcm1hdFByZWZpeDpofX12YXIgWXIsa3UsTnU7ZGcoe3Rob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdfSk7ZnVuY3Rpb24gZGcoaSl7cmV0dXJuIFlyPWZnKGkpLGt1PVlyLmZvcm1hdCxOdT1Zci5mb3JtYXRQcmVmaXgsWXJ9ZnVuY3Rpb24gcGcoaSl7cmV0dXJuIE1hdGgubWF4KDAsLW1pKE1hdGguYWJzKGkpKSl9ZnVuY3Rpb24geWcoaSx0KXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IobWkodCkvMykpKSozLW1pKE1hdGguYWJzKGkpKSl9ZnVuY3Rpb24gbWcoaSx0KXtyZXR1cm4gaT1NYXRoLmFicyhpKSx0PU1hdGguYWJzKHQpLWksTWF0aC5tYXgoMCxtaSh0KS1taShpKSkrMX1mdW5jdGlvbiBnZyhpLHQsZSxuKXt2YXIgcz1scChpLHQsZSkscjtzd2l0Y2gobj1KcihuPT1udWxsPyIsZiI6biksbi50eXBlKXtjYXNlInMiOnt2YXIgbz1NYXRoLm1heChNYXRoLmFicyhpKSxNYXRoLmFicyh0KSk7cmV0dXJuIG4ucHJlY2lzaW9uPT1udWxsJiYhaXNOYU4ocj15ZyhzLG8pKSYmKG4ucHJlY2lzaW9uPXIpLE51KG4sbyl9Y2FzZSIiOmNhc2UiZSI6Y2FzZSJnIjpjYXNlInAiOmNhc2UiciI6e24ucHJlY2lzaW9uPT1udWxsJiYhaXNOYU4ocj1tZyhzLE1hdGgubWF4KE1hdGguYWJzKGkpLE1hdGguYWJzKHQpKSkpJiYobi5wcmVjaXNpb249ci0obi50eXBlPT09ImUiKSk7YnJlYWt9Y2FzZSJmIjpjYXNlIiUiOntuLnByZWNpc2lvbj09bnVsbCYmIWlzTmFOKHI9cGcocykpJiYobi5wcmVjaXNpb249ci0obi50eXBlPT09IiUiKSoyKTticmVha319cmV0dXJuIGt1KG4pfWZ1bmN0aW9uIHhnKGkpe3ZhciB0PWkuZG9tYWluO3JldHVybiBpLnRpY2tzPWZ1bmN0aW9uKGUpe3ZhciBuPXQoKTtyZXR1cm4gY3AoblswXSxuW24ubGVuZ3RoLTFdLGU9PW51bGw/MTA6ZSl9LGkudGlja0Zvcm1hdD1mdW5jdGlvbihlLG4pe3ZhciBzPXQoKTtyZXR1cm4gZ2coc1swXSxzW3MubGVuZ3RoLTFdLGU9PW51bGw/MTA6ZSxuKX0saS5uaWNlPWZ1bmN0aW9uKGUpe2U9PW51bGwmJihlPTEwKTt2YXIgbj10KCkscz0wLHI9bi5sZW5ndGgtMSxvPW5bc10sYT1uW3JdLGMsbCxoPTEwO2ZvcihhPG8mJihsPW8sbz1hLGE9bCxsPXMscz1yLHI9bCk7aC0tID4wOyl7aWYobD12YShvLGEsZSksbD09PWMpcmV0dXJuIG5bc109byxuW3JdPWEsdChuKTtpZihsPjApbz1NYXRoLmZsb29yKG8vbCkqbCxhPU1hdGguY2VpbChhL2wpKmw7ZWxzZSBpZihsPDApbz1NYXRoLmNlaWwobypsKS9sLGE9TWF0aC5mbG9vcihhKmwpL2w7ZWxzZSBicmVhaztjPWx9cmV0dXJuIGl9LGl9ZnVuY3Rpb24gZ2MoKXt2YXIgaT1yZygpO3JldHVybiBpLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gaWcoaSxnYygpKX0sVG0uYXBwbHkoaSxhcmd1bWVudHMpLHhnKGkpfWZ1bmN0aW9uIHdnKGksdCl7cmV0dXJuIGkubWFwKGU9Pntjb25zdCBuPVtdO2xldCBzO3JldHVybiBlLmZvckVhY2gocj0+e2lmKHMpe2NvbnN0IG89YWkocixzKSoxODAvTWF0aC5QSTtpZihvPnQpe2NvbnN0IGE9WHAocyxyKSxjPTEvTWF0aC5jZWlsKG8vdCk7bGV0IGw9Yztmb3IoO2w8MTspbi5wdXNoKGEobCkpLGwrPWN9fW4ucHVzaChzPXIpfSksbn0pfWZ1bmN0aW9uIGJnKGkse21pbkxuZzp0LG1heExuZzplLG1pbkxhdDpuLG1heExhdDpzfT17fSl7Y29uc3Qgcj1NYXRoLnJvdW5kKGdpKDM2MC9pLDIpL01hdGguUEkpLG89KDErTWF0aC5zcXJ0KDUpKS8yLGE9ZD0+ZC9vKjM2MCUzNjAtMTgwLGM9ZD0+TWF0aC5hY29zKDIqZC9yLTEpL01hdGguUEkqMTgwLTkwLGw9ZD0+ciooTWF0aC5jb3MoKGQrOTApKk1hdGguUEkvMTgwKSsxKS8yLGg9W3MhPT12b2lkIDA/TWF0aC5jZWlsKGwocykpOjAsbiE9PXZvaWQgMD9NYXRoLmZsb29yKGwobikpOnItMV0sdT10PT09dm9pZCAwJiZlPT09dm9pZCAwPygpPT4hMDp0PT09dm9pZCAwP2Q9PmQ8PWU6ZT09PXZvaWQgMD9kPT5kPj10OmU+PXQ/ZD0+ZD49dCYmZDw9ZTpkPT5kPj10fHxkPD1lLGY9W107Zm9yKGxldCBkPWhbMF07ZDw9aFsxXTtkKyspe2NvbnN0IHA9YShkKTt1KHApJiZmLnB1c2goW3AsYyhkKV0pfXJldHVybiBmfWZ1bmN0aW9uIHhjKGksdCxlPSExKXtyZXR1cm4gZT9IcCh0LGkpOmVtKGksdCl9ZnVuY3Rpb24gTWcoaSx0KXtjb25zdCBlPXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczppfSxbW24sc10sW3Isb11dPXBoKGUpO2lmKE1hdGgubWluKE1hdGguYWJzKHItbiksTWF0aC5hYnMoby1zKSk8dClyZXR1cm5bXTtjb25zdCBhPW4+cnx8bz49ODl8fHM8PS04OTtyZXR1cm4gYmcodCx7bWluTG5nOm4sbWF4TG5nOnIsbWluTGF0OnMsbWF4TGF0Om99KS5maWx0ZXIoYz0+eGMoYyxlLGEpKX1mdW5jdGlvbiBBZyhpLHtyZXNvbHV0aW9uOnQ9MS8wLGJib3g6ZSxwcm9qZWN0aW9uOm59PXt9KXtjb25zdCBzPXdnKGksdCkscj1xaShzKSxvPU1nKGksdCksYT1bLi4uciwuLi5vXSxjPXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczppfSxbW2wsaF0sW3UsZl1dPXBoKGMpLGQ9bD51fHxmPj04OXx8aDw9LTg5O2xldCBwPVtdO2lmKGQpe2NvbnN0IE09em0oYSkudHJpYW5nbGVzKCksQT1uZXcgTWFwKGEubWFwKChbUyx2XSxfKT0+W2Ake1N9LSR7dn1gLF9dKSk7TS5mZWF0dXJlcy5mb3JFYWNoKFM9Pntjb25zdCB2PVMuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0uc2xpY2UoMCwzKS5yZXZlcnNlKCksXz1bXTtpZih2LmZvckVhY2goKFtFLHpdKT0+e2NvbnN0IEM9YCR7RX0tJHt6fWA7QS5oYXMoQykmJl8ucHVzaChBLmdldChDKSl9KSxfLmxlbmd0aD09PTMpe2lmKF8uc29tZShFPT5FPHIubGVuZ3RoKSl7Y29uc3QgRT1TLnByb3BlcnRpZXMuY2lyY3VtY2VudGVyO2lmKCF4YyhFLGMsZCkpcmV0dXJufXAucHVzaCguLi5fKX19KX1lbHNlIGlmKG8ubGVuZ3RoKXtjb25zdCBNPWlzLmZyb20oYSk7Zm9yKGxldCBBPTAsUz1NLnRyaWFuZ2xlcy5sZW5ndGg7QTxTO0ErPTMpe2NvbnN0IHY9WzIsMSwwXS5tYXAoRT0+TS50cmlhbmdsZXNbQStFXSksXz12Lm1hcChFPT5hW0VdKTtpZih2LnNvbWUoRT0+RTxyLmxlbmd0aCkpe2NvbnN0IEU9WzAsMV0ubWFwKHo9PmhwKF8sQz0+Q1t6XSkpO2lmKCF4YyhFLGMsZCkpY29udGludWV9cC5wdXNoKC4uLnYpfX1lbHNle2NvbnN0e3ZlcnRpY2VzOk0saG9sZXM6QT1bXX09ZXUocyk7cD14eShNLEEsMil9bGV0IHk9ZT9bZVswXSxlWzJdXTphcihhLE09Pk1bMF0pLG09ZT9bZVsxXSxlWzNdXTphcihhLE09Pk1bMV0pO2lmKG4pe2NvbnN0W00sQV09bihbeVswXSxtWzBdXSksW1Msdl09bihbeVsxXSxtWzFdXSk7eT1bTSxTXSxtPVstQSwtdl19Y29uc3QgZz1nYyh5LFswLDFdKSxiPWdjKG0sWzAsMV0pLHc9YS5tYXAoKFtNLEFdKT0+e2lmKG4pe2NvbnN0W1Msdl09bihbTSxBXSk7cmV0dXJuW2coUyksYigtdildfWVsc2UgcmV0dXJuW2coTSksYihBKV19KTtyZXR1cm57Y29udG91cjpzLHRyaWFuZ2xlczp7cG9pbnRzOmEsaW5kaWNlczpwLHV2czp3fX19Y29uc3QgUnU9bmV3IGdlKCkuc2V0QXR0cmlidXRlPyJzZXRBdHRyaWJ1dGUiOiJhZGRBdHRyaWJ1dGUiO2Z1bmN0aW9uIGpyKGksdCxlLG4pe2NvbnN0IHM9aS5tYXAocj0+ci5tYXAoKFtvLGFdKT0+e2lmKG4pe2NvbnN0W2MsbF09bihbbyxhXSk7cmV0dXJuW2MsLWwsdF19cmV0dXJuIGU/dXkobyxhLHQpOltvLGEsdF19KSk7cmV0dXJuIGV1KHMpfWZ1bmN0aW9uIFNnKGksdCxlLG4scyl7Y29uc3R7dmVydGljZXM6cixob2xlczpvfT1qcihpLHQsbixzKSx7dmVydGljZXM6YX09anIoaSxlLG4scyksYz1xaShbYSxyXSksbD1NYXRoLnJvdW5kKGEubGVuZ3RoLzMpLGg9bmV3IFNldChvKTtsZXQgdT0wO2NvbnN0IGY9W107Zm9yKGxldCBwPTA7cDxsO3ArKyl7bGV0IHk9cCsxO2lmKHk9PT1sKXk9dTtlbHNlIGlmKGguaGFzKHkpKXtjb25zdCBtPXk7eT11LHU9bX1mLnB1c2gocCxwK2wseStsKSxmLnB1c2goeStsLHkscCl9Y29uc3QgZD1bXTtmb3IobGV0IHA9MTtwPj0wO3AtLSlmb3IobGV0IHk9MDt5PGw7eSs9MSlkLnB1c2goeS8obC0xKSxwKTtyZXR1cm57aW5kaWNlczpmLHZlcnRpY2VzOmMsdXZzOmQsdG9wVmVydHM6YX19ZnVuY3Rpb24gTHUoaSx0LGUsbixzLHIpe3JldHVybntpbmRpY2VzOm4/aS5pbmRpY2VzOmkuaW5kaWNlcy5zbGljZSgpLnJldmVyc2UoKSx2ZXJ0aWNlczpqcihbaS5wb2ludHNdLHQscyxyKS52ZXJ0aWNlcyx1dnM6ZX19Y29uc3QgT3U9KHtwb2x5Z29uR2VvSnNvbjppLHN0YXJ0SGVpZ2h0OnQsZW5kSGVpZ2h0OmUsY3VydmF0dXJlUmVzb2x1dGlvbjpuPTEsY2FydGVzaWFuOnM9ITAsaGFzU2lkZTpyPSEwLGhhc0JvdHRvbTpvPSExLGhhc1RvcDphPSExLHByb2plY3Rpb246YyxiYm94Omx9KT0+e2kuZm9yRWFjaChnPT57RHkoZyl8fGcucmV2ZXJzZSgpfSk7Y29uc3R7Y29udG91cjpoLHRyaWFuZ2xlczp1fT1BZyhpLHtyZXNvbHV0aW9uOm4sYmJveDpsLHByb2plY3Rpb246Y30pO2xldCBmPXt9LGQ7ciYmKGY9U2coaCx0IT1udWxsP3Q6ZSxlIT1udWxsP2U6dCxzLGMpLGQ9Zi50b3BWZXJ0cyk7bGV0IHA9W107KG98fGEpJiYocD1xaSh1LnV2cykpO2xldCB5PXt9O28mJih5PUx1KHUsdCxwLCExLHMsYykpO2xldCBtPXt9O3JldHVybiBhJiYobT1MdSh1LGUscCwhMCxzLGMpKSx7Y29udG91cjpoLHRyaWFuZ2xlczp1LHNpZGVUb3JzbzpmLGJvdHRvbUNhcDp5LHRvcENhcDptLHRvcFZlcnRzOmR9fTtjbGFzcyBfZyBleHRlbmRzIGdle2NvbnN0cnVjdG9yKHQsZT17fSl7c3VwZXIoKSx0aGlzLnR5cGU9IlBvbHlnb25CdWZmZXJHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPUZ0KHtwb2x5Z29uR2VvSnNvbjp0LHN0YXJ0SGVpZ2h0OjAsZW5kSGVpZ2h0OjEsaGFzVG9wOiEwLHRvcEZpcnN0OiExLGhhc0JvdHRvbTohMCxoYXNTaWRlOiEwLGN1cnZhdHVyZVJlc29sdXRpb246MSxjYXJ0ZXNpYW46ITAsdXNlckRhdGFSc29PZmZzZXQ6MH0sZSk7Y29uc3R7ZW5kSGVpZ2h0Om4saGFzVG9wOnMsdG9wRmlyc3Q6cixoYXNCb3R0b206byxoYXNTaWRlOmEsY2FydGVzaWFuOmMsdXNlckRhdGFSc29PZmZzZXQ6bCxwcm9qZWN0aW9uOmh9PXRoaXMucGFyYW1ldGVycyx7Y29udG91cjp1LHNpZGVUb3JzbzpmLHRvcFZlcnRzOmQsYm90dG9tQ2FwOnAsdG9wQ2FwOnl9PU91KEZ0KHt9LHRoaXMucGFyYW1ldGVycykpO2xldCBtPVtdLGc9W10sYj1bXSx3PTA7Y29uc3QgeD1NPT57Y29uc3QgQT1NYXRoLnJvdW5kKG0ubGVuZ3RoLzMpLFM9Yi5sZW5ndGg7bT1tLmNvbmNhdChNLnZlcnRpY2VzKSxnPWcuY29uY2F0KE0udXZzKSxiPWIuY29uY2F0KEE/TS5pbmRpY2VzLm1hcCh2PT52K0EpOk0uaW5kaWNlcyksdGhpcy5hZGRHcm91cChTLGIubGVuZ3RoLVMsdysrKX07cyYmciYmeCh5KSxhJiYoeChmKSx0aGlzLnVzZXJEYXRhLnRvcFZlcnRzPWw/anIodSxuK2wsYyxoKS52ZXJ0aWNlczpkKSxvJiZ4KHApLHMmJiFyJiZ4KHkpLHRoaXMuc2V0SW5kZXgoYiksdGhpc1tSdV0oInBvc2l0aW9uIixuZXcgQmUobSwzKSksdGhpc1tSdV0oInV2IixuZXcgQmUoZywyKSksdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpfX12YXIgdmc9aT0+e2NvbnN0IGE9aSx7Y29vcmRpbmF0ZTp0LHN0YXJ0SGVpZ2h0OmUsaGVpZ2h0Om59PWEscz1RdShhLFsiY29vcmRpbmF0ZSIsInN0YXJ0SGVpZ2h0IiwiaGVpZ2h0Il0pO2xldCByPWV8fDA7cmV0dXJuIHR5cGVvZiBlIT0idW5kZWZpbmVkIiYmdHlwZW9mIG4hPSJ1bmRlZmluZWQiJiYocj1lK24pLG5ldyBfZyhbdF0sV2UoRnQoe30scykse3N0YXJ0SGVpZ2h0OmUsZW5kSGVpZ2h0OnJ9KSl9O2NvbnN0IHpnPSh7Y29vcmRpbmF0ZXNBcnI6aSxzdGFydDp0LGRlcHRoOmUsdXNlR3JvdXBzOm4saGFzVG9wOnMsdG9wRmlyc3Q6cixoYXNCb3R0b206byxoYXNTaWRlOmEsY2FydGVzaWFuOmMscHJvamVjdGlvbjpsLGN1cnZhdHVyZVJlc29sdXRpb246aCxiYm94OnV9KT0+e2NvbnN0IGY9bCYmWWkobCk7ZiYmKGM9ITEpLHR8fCh0PVswXSk7Y29uc3QgZD1pLm1hcCgocCx5KT0+e3ZhciBtLGc7cmV0dXJuIHZnKHtjb29yZGluYXRlOnAscHJvamVjdGlvbjpmLHN0YXJ0SGVpZ2h0OihtPXRbeV0pIT1udWxsP206dFswXSxoZWlnaHQ6KGc9ZVt5XSkhPW51bGw/ZzplWzBdLGhhc1RvcDpzIT1udWxsP3M6ITAsdG9wRmlyc3Q6ciE9bnVsbD9yOiExLGhhc0JvdHRvbTpvIT1udWxsP286ITAsaGFzU2lkZTphIT1udWxsP2E6ITAsY2FydGVzaWFuOmMhPW51bGw/YzohMCxjdXJ2YXR1cmVSZXNvbHV0aW9uOmghPW51bGw/aDoxLGJib3g6dX0pfSk7cmV0dXJuIGppKGQsbil9LFRnPSh7Y29vcmRpbmF0ZXNBcnI6aSxsaW5lV2lkdGg6dCxzdGFydDplLHVzZUdyb3VwczpufSk9Pntjb25zdCByPWkubWFwKChvLGEpPT57dmFyIGM7cmV0dXJuIE91KHtwb2x5Z29uR2VvSnNvbjpbb10sc3RhcnRIZWlnaHQ6KGM9ZVthXSkhPW51bGw/YzplWzBdfSkudG9wVmVydHN9KS5tYXAoKG8sYSk9Pnt2YXIgbDtjb25zdCBjPShsPXRbYV0pIT1udWxsP2w6dFswXTtyZXR1cm4gSmgoe25vZGVzOm8sc2V0UG9pbnRXaWR0aDooKT0+Y30pfSk7cmV0dXJuIGppKHIsbil9O3ZhciBFZz0oaSx0LGUpPT5uZXcgUHJvbWlzZSgobixzKT0+e3ZhciByPWM9Pnt0cnl7YShlLm5leHQoYykpfWNhdGNoKGwpe3MobCl9fSxvPWM9Pnt0cnl7YShlLnRocm93KGMpKX1jYXRjaChsKXtzKGwpfX0sYT1jPT5jLmRvbmU/bihjLnZhbHVlKTpQcm9taXNlLnJlc29sdmUoYy52YWx1ZSkudGhlbihyLG8pO2EoKGU9ZS5hcHBseShpLHQpKS5uZXh0KCkpfSk7ZnVuY3Rpb24gUGcoaSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGkpLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTppW2VdLGVudW1lcmFibGU6ITB9KX0se30pfShpPT57Y29uc3QgdD17cnVuKGUsbil7Y29uc3Qgcz1uZXcgRnVuY3Rpb24oInJldHVybiAoIitlKyIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7Iik7cmV0dXJuIHMuYXBwbHkocyxuKX0sbWV0aG9kcygpe3JldHVybiBPYmplY3Qua2V5cyh0KX19O2FkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGU9PkVnKHZvaWQgMCxbZV0sZnVuY3Rpb24qKHtkYXRhOm59KXt0cnl7Y29uc3Qgcz10W24ubWV0aG9kXTtpZihzKXtjb25zdCByPXlpZWxkIHMuYXBwbHkocyxuLnBhcmFtcyk7ci50cmFuc2ZlciYmci5tZXNzYWdlP3Bvc3RNZXNzYWdlKHtpZDpuLmlkLHJlc3VsdDpyLm1lc3NhZ2UsZXJyb3I6bnVsbH0sci50cmFuc2Zlcik6cG9zdE1lc3NhZ2Uoe2lkOm4uaWQscmVzdWx0OnIsZXJyb3I6bnVsbH0pfWVsc2UgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1ldGhvZCAiJytuLm1ldGhvZCsnIicpfWNhdGNoKHMpe3Bvc3RNZXNzYWdlKHtpZDpuLmlkLHJlc3VsdDpudWxsLGVycm9yOlBnKHMpfSl9fSkpLE9iamVjdC5rZXlzKGkpLmZvckVhY2goZT0+e3RbZV09aVtlXX0pLHBvc3RNZXNzYWdlKCJyZWFkeSIpfSkoe2V4dHJ1ZGVQb2x5Z29uOmR5LGxpbmU6eXksbGluZTI6Z3ksY29uaWNQb2x5Z29uOnpnLGNvbmljTGluZTpUZ30pfSkoKTsK",i=l=>Uint8Array.from(atob(l),b=>b.charCodeAt(0)),o=typeof window!="undefined"&&window.Blob&&new Blob([i(C)],{type:"text/javascript;charset=utf-8"});function n(l){let b;try{if(b=o&&(window.URL||window.webkitURL).createObjectURL(o),!b)throw"";const d=new Worker(b,{name:l==null?void 0:l.name});return d.addEventListener("error",()=>{(window.URL||window.webkitURL).revokeObjectURL(b)}),d}catch(d){return new Worker("data:text/javascript;base64,"+C,{name:l==null?void 0:l.name})}finally{b&&(window.URL||window.webkitURL).revokeObjectURL(b)}}const z=l=>{const b=new h.BufferGeometry;return Object.keys(l).forEach(d=>{d==="groups"?l[d].forEach(G=>{b.addGroup(G.start,G.count,G.materialIndex)}):d==="index"?b.setIndex(new h.BufferAttribute(l[d].array,l[d].itemSize)):b.setAttribute(d,new h.BufferAttribute(l[d].array,l[d].itemSize))}),b};class k{constructor(b){this.pluginName="worker",this.bufferGeometryLoader=new h.BufferGeometryLoader,this.cacheObj={},this._dispose=!1,this.options=W({dbName:"base",cacheVersion:"1"},b),this.store=Y.createStore(this.options.dbName,"attributes")}install(b){this.pencil=b;const d=new M.WorkerPool(n,{maxWorkers:this.options.maxWorkers});this.pool=d}geoGeometry(b,d){return V(this,null,function*(){const{mesaage:G,cacheKey:X,userData:p,cacheVersion:L,cb:m}=W(W({},this.options),d),Z=this.pool,{err:c,res:y}=yield Z.exec(b,[W({},G)],void 0,!0);if(c)throw c;const K=z(y);if(Object.assign(K.userData,W({},p)),m&&(yield m(K)),X){const{cacheObj:s}=this;s[X]||(s[X]={[L]:[]}),s[X][L].push(W({attributes:y},p))}return K})}getCachedGeometry(b){return V(this,null,function*(){const{cacheKey:d,cacheVersion:G}=b;if(d){const X=yield Y.get(d,this.store),p=G||this.options.cacheVersion;return X!=null&&X[p]?X[p].map(L=>{const y=L,{attributes:m}=y,Z=R(y,["attributes"]),c=z(m);return Object.assign(c.userData,W({},Z)),c}):[]}else return[]})}saveCache(){Y.setMany(Object.entries(this.cacheObj),this.store)}dispose(){this.cacheObj={},this.pool.dispose(),this._dispose=!0}}exports.Wk=k;
|