w-gis 1.0.22 → 1.0.25

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.
Files changed (36) hide show
  1. package/README.md +2 -2
  2. package/dist/interp2.wk.umd.js +1 -0
  3. package/dist/w-gis.umd.js +2 -2
  4. package/dist/w-gis.umd.js.map +1 -1
  5. package/docs/-_class.mjs.html +1 -1
  6. package/docs/convertCoordinate.mjs.html +1 -1
  7. package/docs/examples/ex-getCenterOfMassMultiPolygon.html +1 -1
  8. package/docs/examples/ex-getCentroidMultiPolygon.html +1 -1
  9. package/docs/fixCloseMultiPolygon.mjs.html +1 -1
  10. package/docs/getAreaMultiPolygon.mjs.html +1 -1
  11. package/docs/getAreaMultiPolygonSm.mjs.html +1 -1
  12. package/docs/getAreaPolygon.mjs.html +1 -1
  13. package/docs/getAreaRingString.mjs.html +1 -1
  14. package/docs/getCenterOfMassMultiPolygon.mjs.html +1 -1
  15. package/docs/getCentroidMultiPolygon.mjs.html +1 -1
  16. package/docs/importTurf.mjs.html +1 -1
  17. package/docs/index.html +1 -1
  18. package/docs/interp2.mjs.html +146 -81
  19. package/docs/interp2Kriging.mjs.html +86 -86
  20. package/docs/interp2NaturalNeighbor.mjs.html +21 -18
  21. package/docs/normalizeArray.mjs.html +4 -4
  22. package/docs/ptsXYZtoArr.mjs.html +1 -1
  23. package/docs/ptsXYtoArr.mjs.html +1 -1
  24. package/docs/toMultiPolygon.mjs.html +1 -1
  25. package/docs/toPolygon.mjs.html +1 -1
  26. package/docs/w-gis.html +94 -13
  27. package/g.mjs +91 -73
  28. package/package.json +1 -1
  29. package/src/interp2.mjs +145 -80
  30. package/src/interp2Kriging.mjs +85 -85
  31. package/src/interp2NaturalNeighbor.mjs +20 -17
  32. package/src/interp2Normalize.mjs +53 -24
  33. package/src/normalizeArray.mjs +3 -3
  34. package/toolg/gDistRollup.mjs +34 -12
  35. package/_kriging/kriging-111440-townshipInt-All.txt.xlsx +0 -0
  36. package/_kriging/kriging-111442-townshipInt-All.txt.xlsx +0 -0
package/README.md CHANGED
@@ -13,7 +13,7 @@ To view documentation or get support, visit [docs](https://yuda-lyu.github.io/w-
13
13
 
14
14
  ## Installation
15
15
  ### Using npm(ES6 module):
16
- > **Note:** w-gis is mainly dependent on `@turf`, `proj4`, `d3-tricontour`, `lodash` and `wsemi`.
16
+ > **Note:** w-gis is mainly dependent on `@turf`, `proj4`, `d3-tricontour`, `d3-delaunay`, `polybooljs`, `lodash` and `wsemi`.
17
17
  ```alias
18
18
  npm i w-gis
19
19
  ```
@@ -23,6 +23,6 @@ npm i w-gis
23
23
 
24
24
  Add script for w-gis.
25
25
  ```alias
26
- <script src="https://cdn.jsdelivr.net/npm/w-gis@1.0.22/dist/w-gis.umd.js"></script>
26
+ <script src="https://cdn.jsdelivr.net/npm/w-gis@1.0.25/dist/w-gis.umd.js"></script>
27
27
 
28
28
  ```
@@ -0,0 +1 @@
1
+ !function(l,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b(require("worker_threads")):"function"==typeof define&&define.amd?define(["worker_threads"],b):(l="undefined"!=typeof globalThis?globalThis:l||self).interp2=b(l.worker_threads)}(this,(function(l){"use strict";function b(l){return l&&"object"==typeof l&&"default"in l?l:{default:l}}var d=b(l);function Z(l){return Z="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(l){return typeof l}:function(l){return l&&"function"==typeof Symbol&&l.constructor===Symbol&&l!==Symbol.prototype?"symbol":typeof l},Z(l)}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function m(l){var b={exports:{}};return l(b,b.exports),b.exports}var X=m((function(l,b){l.exports=function(l){function b(l,b){(null==b||b>l.length)&&(b=l.length);for(var d=0,Z=new Array(b);d<b;d++)Z[d]=l[d];return Z}function d(l){return function(l){if(Array.isArray(l))return b(l)}(l)||function(l){if("undefined"!=typeof Symbol&&null!=l[Symbol.iterator]||null!=l["@@iterator"])return Array.from(l)}(l)||function(l,d){if(l){if("string"==typeof l)return b(l,d);var Z=Object.prototype.toString.call(l).slice(8,-1);return"Object"===Z&&l.constructor&&(Z=l.constructor.name),"Map"===Z||"Set"===Z?Array.from(l):"Arguments"===Z||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(Z)?b(l,d):void 0}}(l)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function m(l,b,d,Z,m,X,c){try{var G=l[X](c),i=G.value}catch(l){return void d(l)}G.done?b(i):Promise.resolve(i).then(Z,m)}function X(l){return X="function"==typeof Symbol&&"symbol"==Z(Symbol.iterator)?function(l){return Z(l)}:function(l){return l&&"function"==typeof Symbol&&l.constructor===Symbol&&l!==Symbol.prototype?"symbol":Z(l)},X(l)}function c(l){var b={exports:{}};return l(b,b.exports),b.exports}var G,i=c((function(l){var b=function(l){var b,d=Object.prototype,Z=d.hasOwnProperty,m="function"==typeof Symbol?Symbol:{},c=m.iterator||"@@iterator",G=m.asyncIterator||"@@asyncIterator",i=m.toStringTag||"@@toStringTag";function W(l,b,d){return Object.defineProperty(l,b,{value:d,enumerable:!0,configurable:!0,writable:!0}),l[b]}try{W({},"")}catch(l){W=function(l,b,d){return l[b]=d}}function p(l,b,d,Z){var m=b&&b.prototype instanceof o?b:o,X=Object.create(m.prototype),c=new T(Z||[]);return X._invoke=function(l,b,d){var Z=s;return function(m,X){if(Z===K)throw new Error("Generator is already running");if(Z===y){if("throw"===m)throw X;return J()}for(d.method=m,d.arg=X;;){var c=d.delegate;if(c){var G=S(c,d);if(G){if(G===h)continue;return G}}if("next"===d.method)d.sent=d._sent=d.arg;else if("throw"===d.method){if(Z===s)throw Z=y,d.arg;d.dispatchException(d.arg)}else"return"===d.method&&d.abrupt("return",d.arg);Z=K;var i=t(l,b,d);if("normal"===i.type){if(Z=d.done?y:u,i.arg===h)continue;return{value:i.arg,done:d.done}}"throw"===i.type&&(Z=y,d.method="throw",d.arg=i.arg)}}}(l,d,c),X}function t(l,b,d){try{return{type:"normal",arg:l.call(b,d)}}catch(l){return{type:"throw",arg:l}}}l.wrap=p;var s="suspendedStart",u="suspendedYield",K="executing",y="completed",h={};function o(){}function n(){}function I(){}var L={};W(L,c,(function(){return this}));var V=Object.getPrototypeOf,a=V&&V(V(g([])));a&&a!==d&&Z.call(a,c)&&(L=a);var x=I.prototype=o.prototype=Object.create(L);function Y(l){["next","throw","return"].forEach((function(b){W(l,b,(function(l){return this._invoke(b,l)}))}))}function C(l,b){function d(m,c,G,i){var W=t(l[m],l,c);if("throw"!==W.type){var p=W.arg,s=p.value;return s&&"object"===X(s)&&Z.call(s,"__await")?b.resolve(s.__await).then((function(l){d("next",l,G,i)}),(function(l){d("throw",l,G,i)})):b.resolve(s).then((function(l){p.value=l,G(p)}),(function(l){return d("throw",l,G,i)}))}i(W.arg)}var m;this._invoke=function(l,Z){function X(){return new b((function(b,m){d(l,Z,b,m)}))}return m=m?m.then(X,X):X()}}function S(l,d){var Z=l.iterator[d.method];if(Z===b){if(d.delegate=null,"throw"===d.method){if(l.iterator.return&&(d.method="return",d.arg=b,S(l,d),"throw"===d.method))return h;d.method="throw",d.arg=new TypeError("The iterator does not provide a 'throw' method")}return h}var m=t(Z,l.iterator,d.arg);if("throw"===m.type)return d.method="throw",d.arg=m.arg,d.delegate=null,h;var X=m.arg;return X?X.done?(d[l.resultName]=X.value,d.next=l.nextLoc,"return"!==d.method&&(d.method="next",d.arg=b),d.delegate=null,h):X:(d.method="throw",d.arg=new TypeError("iterator result is not an object"),d.delegate=null,h)}function H(l){var b={tryLoc:l[0]};1 in l&&(b.catchLoc=l[1]),2 in l&&(b.finallyLoc=l[2],b.afterLoc=l[3]),this.tryEntries.push(b)}function e(l){var b=l.completion||{};b.type="normal",delete b.arg,l.completion=b}function T(l){this.tryEntries=[{tryLoc:"root"}],l.forEach(H,this),this.reset(!0)}function g(l){if(l){var d=l[c];if(d)return d.call(l);if("function"==typeof l.next)return l;if(!isNaN(l.length)){var m=-1,X=function d(){for(;++m<l.length;)if(Z.call(l,m))return d.value=l[m],d.done=!1,d;return d.value=b,d.done=!0,d};return X.next=X}}return{next:J}}function J(){return{value:b,done:!0}}return n.prototype=I,W(x,"constructor",I),W(I,"constructor",n),n.displayName=W(I,i,"GeneratorFunction"),l.isGeneratorFunction=function(l){var b="function"==typeof l&&l.constructor;return!!b&&(b===n||"GeneratorFunction"===(b.displayName||b.name))},l.mark=function(l){return Object.setPrototypeOf?Object.setPrototypeOf(l,I):(l.__proto__=I,W(l,i,"GeneratorFunction")),l.prototype=Object.create(x),l},l.awrap=function(l){return{__await:l}},Y(C.prototype),W(C.prototype,G,(function(){return this})),l.AsyncIterator=C,l.async=function(b,d,Z,m,X){void 0===X&&(X=Promise);var c=new C(p(b,d,Z,m),X);return l.isGeneratorFunction(d)?c:c.next().then((function(l){return l.done?l.value:c.next()}))},Y(x),W(x,i,"Generator"),W(x,c,(function(){return this})),W(x,"toString",(function(){return"[object Generator]"})),l.keys=function(l){var b=[];for(var d in l)b.push(d);return b.reverse(),function d(){for(;b.length;){var Z=b.pop();if(Z in l)return d.value=Z,d.done=!1,d}return d.done=!0,d}},l.values=g,T.prototype={constructor:T,reset:function(l){if(this.prev=0,this.next=0,this.sent=this._sent=b,this.done=!1,this.delegate=null,this.method="next",this.arg=b,this.tryEntries.forEach(e),!l)for(var d in this)"t"===d.charAt(0)&&Z.call(this,d)&&!isNaN(+d.slice(1))&&(this[d]=b)},stop:function(){this.done=!0;var l=this.tryEntries[0].completion;if("throw"===l.type)throw l.arg;return this.rval},dispatchException:function(l){if(this.done)throw l;var d=this;function m(Z,m){return G.type="throw",G.arg=l,d.next=Z,m&&(d.method="next",d.arg=b),!!m}for(var X=this.tryEntries.length-1;X>=0;--X){var c=this.tryEntries[X],G=c.completion;if("root"===c.tryLoc)return m("end");if(c.tryLoc<=this.prev){var i=Z.call(c,"catchLoc"),W=Z.call(c,"finallyLoc");if(i&&W){if(this.prev<c.catchLoc)return m(c.catchLoc,!0);if(this.prev<c.finallyLoc)return m(c.finallyLoc)}else if(i){if(this.prev<c.catchLoc)return m(c.catchLoc,!0)}else{if(!W)throw new Error("try statement without catch or finally");if(this.prev<c.finallyLoc)return m(c.finallyLoc)}}}},abrupt:function(l,b){for(var d=this.tryEntries.length-1;d>=0;--d){var m=this.tryEntries[d];if(m.tryLoc<=this.prev&&Z.call(m,"finallyLoc")&&this.prev<m.finallyLoc){var X=m;break}}X&&("break"===l||"continue"===l)&&X.tryLoc<=b&&b<=X.finallyLoc&&(X=null);var c=X?X.completion:{};return c.type=l,c.arg=b,X?(this.method="next",this.next=X.finallyLoc,h):this.complete(c)},complete:function(l,b){if("throw"===l.type)throw l.arg;return"break"===l.type||"continue"===l.type?this.next=l.arg:"return"===l.type?(this.rval=this.arg=l.arg,this.method="return",this.next="end"):"normal"===l.type&&b&&(this.next=b),h},finish:function(l){for(var b=this.tryEntries.length-1;b>=0;--b){var d=this.tryEntries[b];if(d.finallyLoc===l)return this.complete(d.completion,d.afterLoc),e(d),h}},catch:function(l){for(var b=this.tryEntries.length-1;b>=0;--b){var d=this.tryEntries[b];if(d.tryLoc===l){var Z=d.completion;if("throw"===Z.type){var m=Z.arg;e(d)}return m}}throw new Error("illegal catch attempt")},delegateYield:function(l,d,Z){return this.delegate={iterator:g(l),resultName:d,nextLoc:Z},"next"===this.method&&(this.arg=b),h}},l}(l.exports);try{regeneratorRuntime=b}catch(l){"object"===("undefined"==typeof globalThis?"undefined":X(globalThis))?globalThis.regeneratorRuntime=b:Function("r","regeneratorRuntime = r")(b)}})),W=c((function(l){var b=Object.prototype.hasOwnProperty,d="~";function Z(){}function m(l,b,d){this.fn=l,this.context=b,this.once=d||!1}function X(l,b,Z,X,c){if("function"!=typeof Z)throw new TypeError("The listener must be a function");var G=new m(Z,X||l,c),i=d?d+b:b;return l._events[i]?l._events[i].fn?l._events[i]=[l._events[i],G]:l._events[i].push(G):(l._events[i]=G,l._eventsCount++),l}function c(l,b){0==--l._eventsCount?l._events=new Z:delete l._events[b]}function G(){this._events=new Z,this._eventsCount=0}Object.create&&(Z.prototype=Object.create(null),(new Z).__proto__||(d=!1)),G.prototype.eventNames=function(){var l,Z,m=[];if(0===this._eventsCount)return m;for(Z in l=this._events)b.call(l,Z)&&m.push(d?Z.slice(1):Z);return Object.getOwnPropertySymbols?m.concat(Object.getOwnPropertySymbols(l)):m},G.prototype.listeners=function(l){var b=d?d+l:l,Z=this._events[b];if(!Z)return[];if(Z.fn)return[Z.fn];for(var m=0,X=Z.length,c=new Array(X);m<X;m++)c[m]=Z[m].fn;return c},G.prototype.listenerCount=function(l){var b=d?d+l:l,Z=this._events[b];return Z?Z.fn?1:Z.length:0},G.prototype.emit=function(l,b,Z,m,X,c){var G=d?d+l:l;if(!this._events[G])return!1;var i,W,p=this._events[G],t=arguments.length;if(p.fn){switch(p.once&&this.removeListener(l,p.fn,void 0,!0),t){case 1:return p.fn.call(p.context),!0;case 2:return p.fn.call(p.context,b),!0;case 3:return p.fn.call(p.context,b,Z),!0;case 4:return p.fn.call(p.context,b,Z,m),!0;case 5:return p.fn.call(p.context,b,Z,m,X),!0;case 6:return p.fn.call(p.context,b,Z,m,X,c),!0}for(W=1,i=new Array(t-1);W<t;W++)i[W-1]=arguments[W];p.fn.apply(p.context,i)}else{var s,u=p.length;for(W=0;W<u;W++)switch(p[W].once&&this.removeListener(l,p[W].fn,void 0,!0),t){case 1:p[W].fn.call(p[W].context);break;case 2:p[W].fn.call(p[W].context,b);break;case 3:p[W].fn.call(p[W].context,b,Z);break;case 4:p[W].fn.call(p[W].context,b,Z,m);break;default:if(!i)for(s=1,i=new Array(t-1);s<t;s++)i[s-1]=arguments[s];p[W].fn.apply(p[W].context,i)}}return!0},G.prototype.on=function(l,b,d){return X(this,l,b,d,!1)},G.prototype.once=function(l,b,d){return X(this,l,b,d,!0)},G.prototype.removeListener=function(l,b,Z,m){var X=d?d+l:l;if(!this._events[X])return this;if(!b)return c(this,X),this;var G=this._events[X];if(G.fn)G.fn!==b||m&&!G.once||Z&&G.context!==Z||c(this,X);else{for(var i=0,W=[],p=G.length;i<p;i++)(G[i].fn!==b||m&&!G[i].once||Z&&G[i].context!==Z)&&W.push(G[i]);W.length?this._events[X]=1===W.length?W[0]:W:c(this,X)}return this},G.prototype.removeAllListeners=function(l){var b;return l?(b=d?d+l:l,this._events[b]&&c(this,b)):(this._events=new Z,this._eventsCount=0),this},G.prototype.off=G.prototype.removeListener,G.prototype.addListener=G.prototype.on,G.prefixed=d,G.EventEmitter=G,l.exports=G}));return function(){if("nodejs"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function b(){return new W}function Z(){var l,b,d=new Promise((function(){l=arguments[0],b=arguments[1]}));return d.resolve=l,d.reject=b,d}function X(){for(var l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,b=[],d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),Z=d.length,m=0;m<l;m++)b[m]=d[0|Math.random()*Z];return b.join("")}var c,p=(c="CgogICAgICAgIGxldCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykKICAgICAgICAKCnZhciB0PUFycmF5LmlzQXJyYXksZT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O2Z1bmN0aW9uIG4odCl7dmFyIGU9e2V4cG9ydHM6e319O3JldHVybiB0KGUsZS5leHBvcnRzKSxlLmV4cG9ydHN9dmFyIHI9Im9iamVjdCI9PXR5cGVvZiBlJiZlJiZlLk9iamVjdD09PU9iamVjdCYmZSxpPSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsbz1yfHxpfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLGw9by5TeW1ib2wsYT1PYmplY3QucHJvdG90eXBlLHM9YS5oYXNPd25Qcm9wZXJ0eSx1PWEudG9TdHJpbmcsYz1sP2wudG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBmPWZ1bmN0aW9uKHQpe3ZhciBlPXMuY2FsbCh0LGMpLG49dFtjXTt0cnl7dFtjXT12b2lkIDA7dmFyIHI9ITB9Y2F0Y2godCl7fXZhciBpPXUuY2FsbCh0KTtyZXR1cm4gciYmKGU/dFtjXT1uOmRlbGV0ZSB0W2NdKSxpfSxoPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dmFyIGc9ZnVuY3Rpb24odCl7cmV0dXJuIGguY2FsbCh0KX0sdj1sP2wudG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBkPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMD09PXQ/IltvYmplY3QgVW5kZWZpbmVkXSI6IltvYmplY3QgTnVsbF0iOnYmJnYgaW4gT2JqZWN0KHQpP2YodCk6Zyh0KX07dmFyIHA9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH07dmFyIHk9ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxwKHQpJiYiW29iamVjdCBTeW1ib2xdIj09ZCh0KX0sXz0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxtPS9eXHcqJC87dmFyIGI9ZnVuY3Rpb24oZSxuKXtpZih0KGUpKXJldHVybiExO3ZhciByPXR5cGVvZiBlO3JldHVybiEoIm51bWJlciIhPXImJiJzeW1ib2wiIT1yJiYiYm9vbGVhbiIhPXImJm51bGwhPWUmJiF5KGUpKXx8KG0udGVzdChlKXx8IV8udGVzdChlKXx8bnVsbCE9biYmZSBpbiBPYmplY3QobikpfTt2YXIgeD1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX07dmFyIHcsaj1mdW5jdGlvbih0KXtpZigheCh0KSlyZXR1cm4hMTt2YXIgZT1kKHQpO3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgUHJveHldIj09ZX0sQT1vWyJfX2NvcmUtanNfc2hhcmVkX18iXSxPPSh3PS9bXi5dKyQvLmV4ZWMoQSYmQS5rZXlzJiZBLmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIit3OiIiO3ZhciBTPWZ1bmN0aW9uKHQpe3JldHVybiEhTyYmTyBpbiB0fSxNPUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZzt2YXIgUD1mdW5jdGlvbih0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIE0uY2FsbCh0KX1jYXRjaCh0KXt9dHJ5e3JldHVybiB0KyIifWNhdGNoKHQpe319cmV0dXJuIiJ9LGs9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sRj1GdW5jdGlvbi5wcm90b3R5cGUsVD1PYmplY3QucHJvdG90eXBlLHo9Ri50b1N0cmluZywkPVQuaGFzT3duUHJvcGVydHksST1SZWdFeHAoIl4iK3ouY2FsbCgkKS5yZXBsYWNlKC9bXFxeJC4qKz8oKVtcXXt9fF0vZywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt2YXIgRT1mdW5jdGlvbih0KXtyZXR1cm4hKCF4KHQpfHxTKHQpKSYmKGoodCk/STprKS50ZXN0KFAodCkpfTt2YXIgTj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfTt2YXIgUj1mdW5jdGlvbih0LGUpe3ZhciBuPU4odCxlKTtyZXR1cm4gRShuKT9uOnZvaWQgMH0sQz1SKE9iamVjdCwiY3JlYXRlIik7dmFyIEI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPUM/QyhudWxsKTp7fSx0aGlzLnNpemU9MH07dmFyIFU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LEw9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgRD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKEMpe3ZhciBuPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09bj92b2lkIDA6bn1yZXR1cm4gTC5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9LEg9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgSz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBDP3ZvaWQgMCE9PWVbdF06SC5jYWxsKGUsdCl9O3ZhciBYPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsblt0XT1DJiZ2b2lkIDA9PT1lPyJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjplLHRoaXN9O2Z1bmN0aW9uIEoodCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19Si5wcm90b3R5cGUuY2xlYXI9QixKLnByb3RvdHlwZS5kZWxldGU9VSxKLnByb3RvdHlwZS5nZXQ9RCxKLnByb3RvdHlwZS5oYXM9SyxKLnByb3RvdHlwZS5zZXQ9WDt2YXIgWT1KO3ZhciBaPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH07dmFyIFY9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHQhPXQmJmUhPWV9O3ZhciBXPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoO24tLTspaWYoVih0W25dWzBdLGUpKXJldHVybiBuO3JldHVybi0xfSxxPUFycmF5LnByb3RvdHlwZS5zcGxpY2U7dmFyIEc9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPVcoZSx0KTtyZXR1cm4hKG48MCkmJihuPT1lLmxlbmd0aC0xP2UucG9wKCk6cS5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwhMCl9O3ZhciBRPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1XKGUsdCk7cmV0dXJuIG48MD92b2lkIDA6ZVtuXVsxXX07dmFyIHR0PWZ1bmN0aW9uKHQpe3JldHVybiBXKHRoaXMuX19kYXRhX18sdCk+LTF9O3ZhciBldD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX19kYXRhX18scj1XKG4sdCk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9O2Z1bmN0aW9uIG50KHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fW50LnByb3RvdHlwZS5jbGVhcj1aLG50LnByb3RvdHlwZS5kZWxldGU9RyxudC5wcm90b3R5cGUuZ2V0PVEsbnQucHJvdG90eXBlLmhhcz10dCxudC5wcm90b3R5cGUuc2V0PWV0O3ZhciBydD1udCxpdD1SKG8sIk1hcCIpO3ZhciBvdD1mdW5jdGlvbigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IFksbWFwOm5ldyhpdHx8cnQpLHN0cmluZzpuZXcgWX19O3ZhciBsdD1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09ZXx8Im51bWJlciI9PWV8fCJzeW1ib2wiPT1lfHwiYm9vbGVhbiI9PWU/Il9fcHJvdG9fXyIhPT10Om51bGw9PT10fTt2YXIgYXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10Ll9fZGF0YV9fO3JldHVybiBsdChlKT9uWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOm4ubWFwfTt2YXIgc3Q9ZnVuY3Rpb24odCl7dmFyIGU9YXQodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX07dmFyIHV0PWZ1bmN0aW9uKHQpe3JldHVybiBhdCh0aGlzLHQpLmdldCh0KX07dmFyIGN0PWZ1bmN0aW9uKHQpe3JldHVybiBhdCh0aGlzLHQpLmhhcyh0KX07dmFyIGZ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49YXQodGhpcyx0KSxyPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09cj8wOjEsdGhpc307ZnVuY3Rpb24gaHQodCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19aHQucHJvdG90eXBlLmNsZWFyPW90LGh0LnByb3RvdHlwZS5kZWxldGU9c3QsaHQucHJvdG90eXBlLmdldD11dCxodC5wcm90b3R5cGUuaGFzPWN0LGh0LnByb3RvdHlwZS5zZXQ9ZnQ7dmFyIGd0PWh0O2Z1bmN0aW9uIHZ0KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZnVuY3Rpb24iKTt2YXIgbj1mdW5jdGlvbigpe3ZhciByPWFyZ3VtZW50cyxpPWU/ZS5hcHBseSh0aGlzLHIpOnJbMF0sbz1uLmNhY2hlO2lmKG8uaGFzKGkpKXJldHVybiBvLmdldChpKTt2YXIgbD10LmFwcGx5KHRoaXMscik7cmV0dXJuIG4uY2FjaGU9by5zZXQoaSxsKXx8byxsfTtyZXR1cm4gbi5jYWNoZT1uZXcodnQuQ2FjaGV8fGd0KSxufXZ0LkNhY2hlPWd0O3ZhciBkdD12dDt2YXIgcHQ9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2cseXQ9L1xcKFxcKT8vZyxfdD1mdW5jdGlvbih0KXt2YXIgZT1kdCh0LChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09bi5zaXplJiZuLmNsZWFyKCksdH0pKSxuPWUuY2FjaGU7cmV0dXJuIGV9KChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKHB0LChmdW5jdGlvbih0LG4scixpKXtlLnB1c2gocj9pLnJlcGxhY2UoeXQsIiQxIik6bnx8dCl9KSksZX0pKTt2YXIgbXQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGgsaT1BcnJheShyKTsrK248cjspaVtuXT1lKHRbbl0sbix0KTtyZXR1cm4gaX0sYnQ9bD9sLnByb3RvdHlwZTp2b2lkIDAseHQ9YnQ/YnQudG9TdHJpbmc6dm9pZCAwO3ZhciB3dD1mdW5jdGlvbiBlKG4pe2lmKCJzdHJpbmciPT10eXBlb2YgbilyZXR1cm4gbjtpZih0KG4pKXJldHVybiBtdChuLGUpKyIiO2lmKHkobikpcmV0dXJuIHh0P3h0LmNhbGwobik6IiI7dmFyIHI9bisiIjtyZXR1cm4iMCI9PXImJjEvbj09LUluZmluaXR5PyItMCI6cn07dmFyIGp0PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOnd0KHQpfTt2YXIgQXQ9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdChlKT9lOmIoZSxuKT9bZV06X3QoanQoZSkpfTt2YXIgT3Q9ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHx5KHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1JbmZpbml0eT8iLTAiOmV9O3ZhciBTdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9KGU9QXQoZSx0KSkubGVuZ3RoO251bGwhPXQmJm48cjspdD10W090KGVbbisrXSldO3JldHVybiBuJiZuPT1yP3Q6dm9pZCAwfTt2YXIgTXQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW51bGw9PXQ/dm9pZCAwOlN0KHQsZSk7cmV0dXJuIHZvaWQgMD09PXI/bjpyfTt2YXIgUHQ9ZnVuY3Rpb24odCl7cmV0dXJuITA9PT10fHwhMT09PXR8fHAodCkmJiJbb2JqZWN0IEJvb2xlYW5dIj09ZCh0KX07ZnVuY3Rpb24ga3QodCl7cmV0dXJuIFB0KHQpfWZ1bmN0aW9uIEZ0KHQpe3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIFR0KHQpe3JldHVybiEoIUZ0KHQpfHwiIj09PXQpfXZhciB6dD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK248ciYmITEhPT1lKHRbbl0sbix0KTspO3JldHVybiB0fTt2YXIgJHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixyKXtmb3IodmFyIGk9LTEsbz1PYmplY3QoZSksbD1yKGUpLGE9bC5sZW5ndGg7YS0tOyl7dmFyIHM9bFt0P2E6KytpXTtpZighMT09PW4ob1tzXSxzLG8pKWJyZWFrfXJldHVybiBlfX0oKTt2YXIgSXQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEscj1BcnJheSh0KTsrK248dDspcltuXT1lKG4pO3JldHVybiByfTt2YXIgRXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHAodCkmJiJbb2JqZWN0IEFyZ3VtZW50c10iPT1kKHQpfSxOdD1PYmplY3QucHJvdG90eXBlLFJ0PU50Lmhhc093blByb3BlcnR5LEN0PU50LnByb3BlcnR5SXNFbnVtZXJhYmxlLEJ0PUV0KGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/RXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHAodCkmJlJ0LmNhbGwodCwiY2FsbGVlIikmJiFDdC5jYWxsKHQsImNhbGxlZSIpfTt2YXIgVXQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTHQ9bigoZnVuY3Rpb24odCxlKXt2YXIgbj1lJiYhZS5ub2RlVHlwZSYmZSxyPW4mJnQmJiF0Lm5vZGVUeXBlJiZ0LGk9ciYmci5leHBvcnRzPT09bj9vLkJ1ZmZlcjp2b2lkIDAsbD0oaT9pLmlzQnVmZmVyOnZvaWQgMCl8fFV0O3QuZXhwb3J0cz1sfSkpLER0PS9eKD86MHxbMS05XVxkKikkLzt2YXIgSHQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10eXBlb2YgdDtyZXR1cm4hIShlPW51bGw9PWU/OTAwNzE5OTI1NDc0MDk5MTplKSYmKCJudW1iZXIiPT1ufHwic3ltYm9sIiE9biYmRHQudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxlfTt2YXIgS3Q9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PTkwMDcxOTkyNTQ3NDA5OTF9LFh0PXt9O1h0WyJbb2JqZWN0IEZsb2F0MzJBcnJheV0iXT1YdFsiW29iamVjdCBGbG9hdDY0QXJyYXldIl09WHRbIltvYmplY3QgSW50OEFycmF5XSJdPVh0WyJbb2JqZWN0IEludDE2QXJyYXldIl09WHRbIltvYmplY3QgSW50MzJBcnJheV0iXT1YdFsiW29iamVjdCBVaW50OEFycmF5XSJdPVh0WyJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSJdPVh0WyJbb2JqZWN0IFVpbnQxNkFycmF5XSJdPVh0WyJbb2JqZWN0IFVpbnQzMkFycmF5XSJdPSEwLFh0WyJbb2JqZWN0IEFyZ3VtZW50c10iXT1YdFsiW29iamVjdCBBcnJheV0iXT1YdFsiW29iamVjdCBBcnJheUJ1ZmZlcl0iXT1YdFsiW29iamVjdCBCb29sZWFuXSJdPVh0WyJbb2JqZWN0IERhdGFWaWV3XSJdPVh0WyJbb2JqZWN0IERhdGVdIl09WHRbIltvYmplY3QgRXJyb3JdIl09WHRbIltvYmplY3QgRnVuY3Rpb25dIl09WHRbIltvYmplY3QgTWFwXSJdPVh0WyJbb2JqZWN0IE51bWJlcl0iXT1YdFsiW29iamVjdCBPYmplY3RdIl09WHRbIltvYmplY3QgUmVnRXhwXSJdPVh0WyJbb2JqZWN0IFNldF0iXT1YdFsiW29iamVjdCBTdHJpbmddIl09WHRbIltvYmplY3QgV2Vha01hcF0iXT0hMTt2YXIgSnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHAodCkmJkt0KHQubGVuZ3RoKSYmISFYdFtkKHQpXX07dmFyIFl0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlKX19LFp0PW4oKGZ1bmN0aW9uKHQsZSl7dmFyIG49ZSYmIWUubm9kZVR5cGUmJmUsaT1uJiZ0JiYhdC5ub2RlVHlwZSYmdCxvPWkmJmkuZXhwb3J0cz09PW4mJnIucHJvY2VzcyxsPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PWkmJmkucmVxdWlyZSYmaS5yZXF1aXJlKCJ1dGlsIikudHlwZXM7cmV0dXJuIHR8fG8mJm8uYmluZGluZyYmby5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2godCl7fX0oKTt0LmV4cG9ydHM9bH0pKSxWdD1adCYmWnQuaXNUeXBlZEFycmF5LFd0PVZ0P1l0KFZ0KTpKdCxxdD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBHdD1mdW5jdGlvbihlLG4pe3ZhciByPXQoZSksaT0hciYmQnQoZSksbz0hciYmIWkmJkx0KGUpLGw9IXImJiFpJiYhbyYmV3QoZSksYT1yfHxpfHxvfHxsLHM9YT9JdChlLmxlbmd0aCxTdHJpbmcpOltdLHU9cy5sZW5ndGg7Zm9yKHZhciBjIGluIGUpIW4mJiFxdC5jYWxsKGUsYyl8fGEmJigibGVuZ3RoIj09Y3x8byYmKCJvZmZzZXQiPT1jfHwicGFyZW50Ij09Yyl8fGwmJigiYnVmZmVyIj09Y3x8ImJ5dGVMZW5ndGgiPT1jfHwiYnl0ZU9mZnNldCI9PWMpfHxIdChjLHUpKXx8cy5wdXNoKGMpO3JldHVybiBzfSxRdD1PYmplY3QucHJvdG90eXBlO3ZhciB0ZT1mdW5jdGlvbih0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yO3JldHVybiB0PT09KCJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLnByb3RvdHlwZXx8UXQpfTt2YXIgZWU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQoZShuKSl9fShPYmplY3Qua2V5cyxPYmplY3QpLG5lPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIHJlPWZ1bmN0aW9uKHQpe2lmKCF0ZSh0KSlyZXR1cm4gZWUodCk7dmFyIGU9W107Zm9yKHZhciBuIGluIE9iamVjdCh0KSluZS5jYWxsKHQsbikmJiJjb25zdHJ1Y3RvciIhPW4mJmUucHVzaChuKTtyZXR1cm4gZX07dmFyIGllPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiZLdCh0Lmxlbmd0aCkmJiFqKHQpfTt2YXIgb2U9ZnVuY3Rpb24odCl7cmV0dXJuIGllKHQpP0d0KHQpOnJlKHQpfTt2YXIgbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obixyKXtpZihudWxsPT1uKXJldHVybiBuO2lmKCFpZShuKSlyZXR1cm4gdChuLHIpO2Zvcih2YXIgaT1uLmxlbmd0aCxvPWU/aTotMSxsPU9iamVjdChuKTsoZT9vLS06KytvPGkpJiYhMSE9PXIobFtvXSxvLGwpOyk7cmV0dXJuIG59fSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmJHQodCxlLG9lKX0pKTt2YXIgYWU9ZnVuY3Rpb24odCl7cmV0dXJuIHR9O3ZhciBzZT1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OmFlfTt2YXIgdWU9ZnVuY3Rpb24oZSxuKXtyZXR1cm4odChlKT96dDpsZSkoZSxzZShuKSl9O3ZhciBjZT1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189bmV3IHJ0LHRoaXMuc2l6ZT0wfTt2YXIgZmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWUuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemU9ZS5zaXplLG59O3ZhciBoZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9O3ZhciBnZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9O3ZhciB2ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187aWYobiBpbnN0YW5jZW9mIHJ0KXt2YXIgcj1uLl9fZGF0YV9fO2lmKCFpdHx8ci5sZW5ndGg8MTk5KXJldHVybiByLnB1c2goW3QsZV0pLHRoaXMuc2l6ZT0rK24uc2l6ZSx0aGlzO249dGhpcy5fX2RhdGFfXz1uZXcgZ3Qocil9cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplPW4uc2l6ZSx0aGlzfTtmdW5jdGlvbiBkZSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fPW5ldyBydCh0KTt0aGlzLnNpemU9ZS5zaXplfWRlLnByb3RvdHlwZS5jbGVhcj1jZSxkZS5wcm90b3R5cGUuZGVsZXRlPWZlLGRlLnByb3RvdHlwZS5nZXQ9aGUsZGUucHJvdG90eXBlLmhhcz1nZSxkZS5wcm90b3R5cGUuc2V0PXZlO3ZhciBwZT1kZTt2YXIgeWU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iKSx0aGlzfTt2YXIgX2U9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfTtmdW5jdGlvbiBtZSh0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgZ3Q7KytlPG47KXRoaXMuYWRkKHRbZV0pfW1lLnByb3RvdHlwZS5hZGQ9bWUucHJvdG90eXBlLnB1c2g9eWUsbWUucHJvdG90eXBlLmhhcz1fZTt2YXIgYmU9bWU7dmFyIHhlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoOysrbjxyOylpZihlKHRbbl0sbix0KSlyZXR1cm4hMDtyZXR1cm4hMX07dmFyIHdlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaGFzKGUpfTt2YXIgamU9ZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBsPTEmbixhPXQubGVuZ3RoLHM9ZS5sZW5ndGg7aWYoYSE9cyYmIShsJiZzPmEpKXJldHVybiExO3ZhciB1PW8uZ2V0KHQpLGM9by5nZXQoZSk7aWYodSYmYylyZXR1cm4gdT09ZSYmYz09dDt2YXIgZj0tMSxoPSEwLGc9MiZuP25ldyBiZTp2b2lkIDA7Zm9yKG8uc2V0KHQsZSksby5zZXQoZSx0KTsrK2Y8YTspe3ZhciB2PXRbZl0sZD1lW2ZdO2lmKHIpdmFyIHA9bD9yKGQsdixmLGUsdCxvKTpyKHYsZCxmLHQsZSxvKTtpZih2b2lkIDAhPT1wKXtpZihwKWNvbnRpbnVlO2g9ITE7YnJlYWt9aWYoZyl7aWYoIXhlKGUsKGZ1bmN0aW9uKHQsZSl7aWYoIXdlKGcsZSkmJih2PT09dHx8aSh2LHQsbixyLG8pKSlyZXR1cm4gZy5wdXNoKGUpfSkpKXtoPSExO2JyZWFrfX1lbHNlIGlmKHYhPT1kJiYhaSh2LGQsbixyLG8pKXtoPSExO2JyZWFrfX1yZXR1cm4gby5kZWxldGUodCksby5kZWxldGUoZSksaH0sQWU9by5VaW50OEFycmF5O3ZhciBPZT1mdW5jdGlvbih0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxyKXtuWysrZV09W3IsdF19KSksbn07dmFyIFNlPWZ1bmN0aW9uKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtuWysrZV09dH0pKSxufSxNZT1sP2wucHJvdG90eXBlOnZvaWQgMCxQZT1NZT9NZS52YWx1ZU9mOnZvaWQgMDt2YXIga2U9ZnVuY3Rpb24odCxlLG4scixpLG8sbCl7c3dpdGNoKG4pe2Nhc2UiW29iamVjdCBEYXRhVmlld10iOmlmKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHx0LmJ5dGVPZmZzZXQhPWUuYnl0ZU9mZnNldClyZXR1cm4hMTt0PXQuYnVmZmVyLGU9ZS5idWZmZXI7Y2FzZSJbb2JqZWN0IEFycmF5QnVmZmVyXSI6cmV0dXJuISh0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8IW8obmV3IEFlKHQpLG5ldyBBZShlKSkpO2Nhc2UiW29iamVjdCBCb29sZWFuXSI6Y2FzZSJbb2JqZWN0IERhdGVdIjpjYXNlIltvYmplY3QgTnVtYmVyXSI6cmV0dXJuIFYoK3QsK2UpO2Nhc2UiW29iamVjdCBFcnJvcl0iOnJldHVybiB0Lm5hbWU9PWUubmFtZSYmdC5tZXNzYWdlPT1lLm1lc3NhZ2U7Y2FzZSJbb2JqZWN0IFJlZ0V4cF0iOmNhc2UiW29iamVjdCBTdHJpbmddIjpyZXR1cm4gdD09ZSsiIjtjYXNlIltvYmplY3QgTWFwXSI6dmFyIGE9T2U7Y2FzZSJbb2JqZWN0IFNldF0iOnZhciBzPTEmcjtpZihhfHwoYT1TZSksdC5zaXplIT1lLnNpemUmJiFzKXJldHVybiExO3ZhciB1PWwuZ2V0KHQpO2lmKHUpcmV0dXJuIHU9PWU7cnw9MixsLnNldCh0LGUpO3ZhciBjPWplKGEodCksYShlKSxyLGksbyxsKTtyZXR1cm4gbC5kZWxldGUodCksYztjYXNlIltvYmplY3QgU3ltYm9sXSI6aWYoUGUpcmV0dXJuIFBlLmNhbGwodCk9PVBlLmNhbGwoZSl9cmV0dXJuITF9O3ZhciBGZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxyPWUubGVuZ3RoLGk9dC5sZW5ndGg7KytuPHI7KXRbaStuXT1lW25dO3JldHVybiB0fTt2YXIgVGU9ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPW4oZSk7cmV0dXJuIHQoZSk/aTpGZShpLHIoZSkpfTt2YXIgemU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGgsaT0wLG89W107KytuPHI7KXt2YXIgbD10W25dO2UobCxuLHQpJiYob1tpKytdPWwpfXJldHVybiBvfTt2YXIgJGU9ZnVuY3Rpb24oKXtyZXR1cm5bXX0sSWU9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxFZT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLE5lPUVlP2Z1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1tdOih0PU9iamVjdCh0KSx6ZShFZSh0KSwoZnVuY3Rpb24oZSl7cmV0dXJuIEllLmNhbGwodCxlKX0pKSl9OiRlO3ZhciBSZT1mdW5jdGlvbih0KXtyZXR1cm4gVGUodCxvZSxOZSl9LENlPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIEJlPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXt2YXIgbD0xJm4sYT1SZSh0KSxzPWEubGVuZ3RoO2lmKHMhPVJlKGUpLmxlbmd0aCYmIWwpcmV0dXJuITE7Zm9yKHZhciB1PXM7dS0tOyl7dmFyIGM9YVt1XTtpZighKGw/YyBpbiBlOkNlLmNhbGwoZSxjKSkpcmV0dXJuITF9dmFyIGY9by5nZXQodCksaD1vLmdldChlKTtpZihmJiZoKXJldHVybiBmPT1lJiZoPT10O3ZhciBnPSEwO28uc2V0KHQsZSksby5zZXQoZSx0KTtmb3IodmFyIHY9bDsrK3U8czspe3ZhciBkPXRbYz1hW3VdXSxwPWVbY107aWYocil2YXIgeT1sP3IocCxkLGMsZSx0LG8pOnIoZCxwLGMsdCxlLG8pO2lmKCEodm9pZCAwPT09eT9kPT09cHx8aShkLHAsbixyLG8pOnkpKXtnPSExO2JyZWFrfXZ8fCh2PSJjb25zdHJ1Y3RvciI9PWMpfWlmKGcmJiF2KXt2YXIgXz10LmNvbnN0cnVjdG9yLG09ZS5jb25zdHJ1Y3RvcjtfPT1tfHwhKCJjb25zdHJ1Y3RvciJpbiB0KXx8ISgiY29uc3RydWN0b3IiaW4gZSl8fCJmdW5jdGlvbiI9PXR5cGVvZiBfJiZfIGluc3RhbmNlb2YgXyYmImZ1bmN0aW9uIj09dHlwZW9mIG0mJm0gaW5zdGFuY2VvZiBtfHwoZz0hMSl9cmV0dXJuIG8uZGVsZXRlKHQpLG8uZGVsZXRlKGUpLGd9LFVlPVIobywiRGF0YVZpZXciKSxMZT1SKG8sIlByb21pc2UiKSxEZT1SKG8sIlNldCIpLEhlPVIobywiV2Vha01hcCIpLEtlPVAoVWUpLFhlPVAoaXQpLEplPVAoTGUpLFllPVAoRGUpLFplPVAoSGUpLFZlPWQ7KFVlJiYiW29iamVjdCBEYXRhVmlld10iIT1WZShuZXcgVWUobmV3IEFycmF5QnVmZmVyKDEpKSl8fGl0JiYiW29iamVjdCBNYXBdIiE9VmUobmV3IGl0KXx8TGUmJiJbb2JqZWN0IFByb21pc2VdIiE9VmUoTGUucmVzb2x2ZSgpKXx8RGUmJiJbb2JqZWN0IFNldF0iIT1WZShuZXcgRGUpfHxIZSYmIltvYmplY3QgV2Vha01hcF0iIT1WZShuZXcgSGUpKSYmKFZlPWZ1bmN0aW9uKHQpe3ZhciBlPWQodCksbj0iW29iamVjdCBPYmplY3RdIj09ZT90LmNvbnN0cnVjdG9yOnZvaWQgMCxyPW4/UChuKToiIjtpZihyKXN3aXRjaChyKXtjYXNlIEtlOnJldHVybiJbb2JqZWN0IERhdGFWaWV3XSI7Y2FzZSBYZTpyZXR1cm4iW29iamVjdCBNYXBdIjtjYXNlIEplOnJldHVybiJbb2JqZWN0IFByb21pc2VdIjtjYXNlIFllOnJldHVybiJbb2JqZWN0IFNldF0iO2Nhc2UgWmU6cmV0dXJuIltvYmplY3QgV2Vha01hcF0ifXJldHVybiBlfSk7dmFyIFdlPVZlLHFlPSJbb2JqZWN0IE9iamVjdF0iLEdlPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIFFlPWZ1bmN0aW9uKGUsbixyLGksbyxsKXt2YXIgYT10KGUpLHM9dChuKSx1PWE/IltvYmplY3QgQXJyYXldIjpXZShlKSxjPXM/IltvYmplY3QgQXJyYXldIjpXZShuKSxmPSh1PSJbb2JqZWN0IEFyZ3VtZW50c10iPT11P3FlOnUpPT1xZSxoPShjPSJbb2JqZWN0IEFyZ3VtZW50c10iPT1jP3FlOmMpPT1xZSxnPXU9PWM7aWYoZyYmTHQoZSkpe2lmKCFMdChuKSlyZXR1cm4hMTthPSEwLGY9ITF9aWYoZyYmIWYpcmV0dXJuIGx8fChsPW5ldyBwZSksYXx8V3QoZSk/amUoZSxuLHIsaSxvLGwpOmtlKGUsbix1LHIsaSxvLGwpO2lmKCEoMSZyKSl7dmFyIHY9ZiYmR2UuY2FsbChlLCJfX3dyYXBwZWRfXyIpLGQ9aCYmR2UuY2FsbChuLCJfX3dyYXBwZWRfXyIpO2lmKHZ8fGQpe3ZhciBwPXY/ZS52YWx1ZSgpOmUseT1kP24udmFsdWUoKTpuO3JldHVybiBsfHwobD1uZXcgcGUpLG8ocCx5LHIsaSxsKX19cmV0dXJuISFnJiYobHx8KGw9bmV3IHBlKSxCZShlLG4scixpLG8sbCkpfTt2YXIgdG49ZnVuY3Rpb24gdChlLG4scixpLG8pe3JldHVybiBlPT09bnx8KG51bGw9PWV8fG51bGw9PW58fCFwKGUpJiYhcChuKT9lIT1lJiZuIT1uOlFlKGUsbixyLGksdCxvKSl9O3ZhciBlbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLmxlbmd0aCxvPWksbD0hcjtpZihudWxsPT10KXJldHVybiFvO2Zvcih0PU9iamVjdCh0KTtpLS07KXt2YXIgYT1uW2ldO2lmKGwmJmFbMl0/YVsxXSE9PXRbYVswXV06IShhWzBdaW4gdCkpcmV0dXJuITF9Zm9yKDsrK2k8bzspe3ZhciBzPShhPW5baV0pWzBdLHU9dFtzXSxjPWFbMV07aWYobCYmYVsyXSl7aWYodm9pZCAwPT09dSYmIShzIGluIHQpKXJldHVybiExfWVsc2V7dmFyIGY9bmV3IHBlO2lmKHIpdmFyIGg9cih1LGMscyx0LGUsZik7aWYoISh2b2lkIDA9PT1oP3RuKGMsdSwzLHIsZik6aCkpcmV0dXJuITF9fXJldHVybiEwfTt2YXIgbm49ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PXQmJiF4KHQpfTt2YXIgcm49ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW9lKHQpLG49ZS5sZW5ndGg7bi0tOyl7dmFyIHI9ZVtuXSxpPXRbcl07ZVtuXT1bcixpLG5uKGkpXX1yZXR1cm4gZX07dmFyIG9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBudWxsIT1uJiYoblt0XT09PWUmJih2b2lkIDAhPT1lfHx0IGluIE9iamVjdChuKSkpfX07dmFyIGxuPWZ1bmN0aW9uKHQpe3ZhciBlPXJuKHQpO3JldHVybiAxPT1lLmxlbmd0aCYmZVswXVsyXT9vbihlWzBdWzBdLGVbMF1bMV0pOmZ1bmN0aW9uKG4pe3JldHVybiBuPT09dHx8ZW4obix0LGUpfX07dmFyIGFuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPXQmJmUgaW4gT2JqZWN0KHQpfTt2YXIgc249ZnVuY3Rpb24oZSxuLHIpe2Zvcih2YXIgaT0tMSxvPShuPUF0KG4sZSkpLmxlbmd0aCxsPSExOysraTxvOyl7dmFyIGE9T3QobltpXSk7aWYoIShsPW51bGwhPWUmJnIoZSxhKSkpYnJlYWs7ZT1lW2FdfXJldHVybiBsfHwrK2khPW8/bDohIShvPW51bGw9PWU/MDplLmxlbmd0aCkmJkt0KG8pJiZIdChhLG8pJiYodChlKXx8QnQoZSkpfTt2YXIgdW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmc24odCxlLGFuKX07dmFyIGNuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGIodCkmJm5uKGUpP29uKE90KHQpLGUpOmZ1bmN0aW9uKG4pe3ZhciByPU10KG4sdCk7cmV0dXJuIHZvaWQgMD09PXImJnI9PT1lP3VuKG4sdCk6dG4oZSxyLDMpfX07dmFyIGZuPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT92b2lkIDA6ZVt0XX19O3ZhciBobj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIFN0KGUsdCl9fTt2YXIgZ249ZnVuY3Rpb24odCl7cmV0dXJuIGIodCk/Zm4oT3QodCkpOmhuKHQpfTt2YXIgdm49ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpudWxsPT1lP2FlOiJvYmplY3QiPT10eXBlb2YgZT90KGUpP2NuKGVbMF0sZVsxXSk6bG4oZSk6Z24oZSl9O3ZhciBkbj1mdW5jdGlvbih0LGUpe3ZhciBuPS0xLHI9aWUodCk/QXJyYXkodC5sZW5ndGgpOltdO3JldHVybiBsZSh0LChmdW5jdGlvbih0LGksbyl7clsrK25dPWUodCxpLG8pfSkpLHJ9O3ZhciBwbj1mdW5jdGlvbihlLG4pe3JldHVybih0KGUpP210OmRuKShlLHZuKG4pKX07dmFyIHluPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLHI9LTEsaT10Lmxlbmd0aDsrK3I8aTspe3ZhciBvPWUodFtyXSk7dm9pZCAwIT09byYmKG49dm9pZCAwPT09bj9vOm4rbyl9cmV0dXJuIG59O3ZhciBfbj1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/eW4odCxhZSk6MH07dmFyIG1uPWZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZXx8IXQoZSkmJnAoZSkmJiJbb2JqZWN0IFN0cmluZ10iPT1kKGUpfSxibj1mbigibGVuZ3RoIikseG49UmVnRXhwKCJbXFx1MjAwZFxcdWQ4MDAtXFx1ZGZmZlxcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZlxcdWZlMGVcXHVmZTBmXSIpO3ZhciB3bj1mdW5jdGlvbih0KXtyZXR1cm4geG4udGVzdCh0KX0sam49IltcXHVkODAwLVxcdWRmZmZdIixBbj0iW1xcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZl0iLE9uPSJcXHVkODNjW1xcdWRmZmItXFx1ZGZmZl0iLFNuPSJbXlxcdWQ4MDAtXFx1ZGZmZl0iLE1uPSIoPzpcXHVkODNjW1xcdWRkZTYtXFx1ZGRmZl0pezJ9IixQbj0iW1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXSIsa249Iig/OiIrQW4rInwiK09uKyIpIisiPyIsRm49IltcXHVmZTBlXFx1ZmUwZl0/IitrbisoIig/OlxcdTIwMGQoPzoiK1tTbixNbixQbl0uam9pbigifCIpKyIpW1xcdWZlMGVcXHVmZTBmXT8iK2tuKyIpKiIpLFRuPSIoPzoiK1tTbitBbisiPyIsQW4sTW4sUG4sam5dLmpvaW4oInwiKSsiKSIsem49UmVnRXhwKE9uKyIoPz0iK09uKyIpfCIrVG4rRm4sImciKTt2YXIgJG49ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXpuLmxhc3RJbmRleD0wO3puLnRlc3QodCk7KSsrZTtyZXR1cm4gZX07dmFyIEluPWZ1bmN0aW9uKHQpe3JldHVybiB3bih0KT8kbih0KTpibih0KX07dmFyIEVuPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIDA7aWYoaWUodCkpcmV0dXJuIG1uKHQpP0luKHQpOnQubGVuZ3RoO3ZhciBlPVdlKHQpO3JldHVybiJbb2JqZWN0IE1hcF0iPT1lfHwiW29iamVjdCBTZXRdIj09ZT90LnNpemU6cmUodCkubGVuZ3RofTt2YXIgTm49ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0fHxwKHQpJiYiW29iamVjdCBOdW1iZXJdIj09ZCh0KX07ZnVuY3Rpb24gUm4odCl7cmV0dXJuIltvYmplY3QgT2JqZWN0XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gQ24odCl7aWYoUm4odCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiEwO3JldHVybiExfXJldHVybiExfWZ1bmN0aW9uIEJuKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gVW4odCl7cmV0dXJuISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBVbmRlZmluZWRdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IE51bGxdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCl8fCghIWZ1bmN0aW9uKHQpe2lmKFJuKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX0odCl8fCghIWZ1bmN0aW9uKHQpe3JldHVybiEoIUZ0KHQpfHwiIiE9PXQpfSh0KXx8ISFmdW5jdGlvbih0KXtyZXR1cm4hIUJuKHQpJiYwPT09dC5sZW5ndGh9KHQpKSkpfWZ1bmN0aW9uIExuKHQpe3JldHVybiEhQm4odCkmJigwIT09dC5sZW5ndGgmJigxIT09dC5sZW5ndGh8fCFVbih0WzBdKSkpfWZ1bmN0aW9uIERuKHQpe2xldCBlPSExO3JldHVybiBUdCh0KT9lPSFpc05hTihOdW1iZXIodCkpOmZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IE51bWJlcl0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KSYmKGU9ITApLGV9dmFyIEhuPS9ccy87dmFyIEtuPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS0mJkhuLnRlc3QodC5jaGFyQXQoZSkpOyk7cmV0dXJuIGV9LFhuPS9eXHMrLzt2YXIgSm49ZnVuY3Rpb24odCl7cmV0dXJuIHQ/dC5zbGljZSgwLEtuKHQpKzEpLnJlcGxhY2UoWG4sIiIpOnR9LFluPS9eWy0rXTB4WzAtOWEtZl0rJC9pLFpuPS9eMGJbMDFdKyQvaSxWbj0vXjBvWzAtN10rJC9pLFduPXBhcnNlSW50O3ZhciBxbj1mdW5jdGlvbih0KXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYoeSh0KSlyZXR1cm4gTmFOO2lmKHgodCkpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PXgoZSk/ZSsiIjplfWlmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gMD09PXQ/dDordDt0PUpuKHQpO3ZhciBuPVpuLnRlc3QodCk7cmV0dXJuIG58fFZuLnRlc3QodCk/V24odC5zbGljZSgyKSxuPzI6OCk6WW4udGVzdCh0KT9OYU46K3R9O3ZhciBHbj1mdW5jdGlvbih0KXtyZXR1cm4gdD9JbmZpbml0eT09PSh0PXFuKHQpKXx8LUluZmluaXR5PT09dD8xNzk3NjkzMTM0ODYyMzE1N2UyOTIqKHQ8MD8tMToxKTp0PT10P3Q6MDowPT09dD90OjB9O2Z1bmN0aW9uIFFuKHQpe2lmKCFEbih0KSlyZXR1cm4gMDtyZXR1cm4gR24odCl9ZnVuY3Rpb24gdHIodCxlKXtyZXR1cm4hIVJuKHQpJiYoISghVHQoZSkmJiFEbihlKSkmJmUgaW4gdCl9ZnVuY3Rpb24gZXIodCxlPXt9KXtpZihFbih0KTw9MClyZXR1cm5bXTtsZXQgbj1NdChlLCJrZXlYIik7VHQobil8fChuPSJ4Iik7bGV0IHI9TXQoZSwia2V5WSIpO1R0KHIpfHwocj0ieSIpO2xldCBpPVtdO3JldHVybiB1ZSh0LCh0PT57bGV0IGU9bnVsbCxvPW51bGw7Qm4odCkmJkVuKHQpPj0yPyhlPU10KHQsMCksbz1NdCh0LDEpKTooZT1NdCh0LG4sbnVsbCksbz1NdCh0LHIsbnVsbCkpLERuKGUpJiZEbihvKSYmKGU9cW4oZSksbz1xbihvKSxpLnB1c2goe3g6ZSx5Om99KSl9KSksaX1mdW5jdGlvbiBucih0LGU9e30pe2lmKEVuKHQpPD0wKXJldHVybltdO2xldCBuPU10KGUsImtleVgiKTtUdChuKXx8KG49IngiKTtsZXQgcj1NdChlLCJrZXlZIik7VHQocil8fChyPSJ5Iik7bGV0IGk9TXQoZSwia2V5WiIsIiIpO1R0KGkpfHwoaT0ieiIpO2xldCBvPVtdO3JldHVybiB1ZSh0LCh0PT57bGV0IGU9bnVsbCxsPW51bGwsYT1udWxsO0JuKHQpJiZFbih0KT49Mz8oZT1NdCh0LDApLGw9TXQodCwxKSxhPU10KHQsMikpOihlPU10KHQsbixudWxsKSxsPU10KHQscixudWxsKSxhPU10KHQsaSxudWxsKSksRG4oZSkmJkRuKGwpJiZEbihhKSYmKGU9cW4oZSksbD1xbihsKSxhPXFuKGEpLG8ucHVzaCh7eDplLHk6bCx6OmF9KSl9KSksb312YXIgcnI9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0tMSxpPXQubGVuZ3RoOysrcjxpOyl7dmFyIG89dFtyXSxsPWUobyk7aWYobnVsbCE9bCYmKHZvaWQgMD09PWE/bD09bCYmIXkobCk6bihsLGEpKSl2YXIgYT1sLHM9b31yZXR1cm4gc307dmFyIGlyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZX07dmFyIG9yPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9ycih0LGFlLGlyKTp2b2lkIDB9O3ZhciBscj1mdW5jdGlvbih0LGUpe3JldHVybiB0PmV9O3ZhciBhcj1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/cnIodCxhZSxscik6dm9pZCAwfTtmdW5jdGlvbiBzcih0LGUsbil7cmV0dXJuIGUgaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9dmFyIHVyPWZ1bmN0aW9uKHQsZSl7dmFyIG49W107cmV0dXJuIGxlKHQsKGZ1bmN0aW9uKHQscixpKXtlKHQscixpKSYmbi5wdXNoKHQpfSkpLG59O3ZhciBjcj1mdW5jdGlvbihlLG4pe3JldHVybih0KGUpP3plOnVyKShlLHZuKG4pKX0sZnI9TWF0aC5jZWlsLGhyPU1hdGgubWF4O3ZhciBncj1mdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGk9LTEsbz1ocihmcigoZS10KS8obnx8MSkpLDApLGw9QXJyYXkobyk7by0tOylsW3I/bzorK2ldPXQsdCs9bjtyZXR1cm4gbH07dmFyIHZyPWZ1bmN0aW9uKHQsZSxuKXtpZigheChuKSlyZXR1cm4hMTt2YXIgcj10eXBlb2YgZTtyZXR1cm4hISgibnVtYmVyIj09cj9pZShuKSYmSHQoZSxuLmxlbmd0aCk6InN0cmluZyI9PXImJmUgaW4gbikmJlYobltlXSx0KX07dmFyIGRyPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4scil7cmV0dXJuIHImJiJudW1iZXIiIT10eXBlb2YgciYmdnIoZSxuLHIpJiYobj1yPXZvaWQgMCksZT1HbihlKSx2b2lkIDA9PT1uPyhuPWUsZT0wKTpuPUduKG4pLHI9dm9pZCAwPT09cj9lPG4/MTotMTpHbihyKSxncihlLG4scix0KX19KCk7dmFyIHByPWZ1bmN0aW9uKHQsZSl7dmFyIG49bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBuP3luKHQsZSkvbjpOYU59O3ZhciB5cj1mdW5jdGlvbih0KXtyZXR1cm4gcHIodCxhZSl9O2Z1bmN0aW9uIF9yKHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBtcih0KXtpZighTG4odCkpcmV0dXJue2VycjoiYXJyIGlzIG5vdCBhbiBlZmZlY3RpdmUgYXJyYXkifTtsZXQgZT1NdCh0LDApLG49MDtMbihlKSYmKG49RW4oZSkpO2xldCByPVtdO2lmKDA9PT1uPyhyPWNyKHQsRG4pLHI9cG4ocixRbikpOnVlKHQsKHQ9PntsZXQgZT0hMCxpPVtdO3VlKGRyKG4pLChuPT57bGV0IHI9TXQodCxuKTtEbihyKXx8KGU9ITEpLGkucHVzaChRbihyKSl9KSksZSYmci5wdXNoKGkpfSkpLDA9PT1FbihyKSlyZXR1cm57ZXJyOiJhcnIgaGFzIG5vIGVmZmVjdGl2ZSBkYXRhIn07bGV0IGk9dD0+e2xldCBlPSh0PT57bGV0IGU9b3IodCksbj1hcih0KTtyZXR1cm57bWluOmUsbWF4Om4scmFuZ2U6bi1lLG1pZDoobitlKS8yLGF2Zzp5cih0KX19KSh0KSxuPSgodCxlLG4scik9PnBuKHQsKHQ9Pih0LWUpL3IpKSkodCxlLm1pbixlLm1heCxlLnJhbmdlKTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/X3IoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtzcih0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6X3IoT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKSl9KSl9cmV0dXJuIHR9KHthcnI6bn0sZSl9LG89bnVsbDtyZXR1cm4gbz0wPT09bj9pKHIpOnBuKGRyKG4pLCh0PT57bGV0IGU9cG4ocix0KTtyZXR1cm4gaShlKX0pKSxvfWZ1bmN0aW9uIGJyKHQsZT1bXSl7aWYoIUxuKHQpKXJldHVybntlcnI6ImFyciBpcyBub3QgYW4gZWZmZWN0aXZlIGFycmF5In07aWYoRW4oZSk+MCl7aWYoIUNuKE10KHQsMCkpKXJldHVybntlcnI6ImFyciBpcyBub3QgYW4gZWZmZWN0aXZlIGFycmF5IG9mIG9iamVjdHMifTtsZXQgbj1bXTt1ZSh0LCh0PT57bGV0IHI9W107dWUoZSwoZT0+e3IucHVzaChNdCh0LGUsIiIpKX0pKSxuLnB1c2gocil9KSksdD1ufXJldHVybiBtcih0KX1mdW5jdGlvbiB4cih0LGU9e30pe2xldCBuPU10KGUsInNjYWxlIik7RG4obil8fChuPTEpLG49UW4obik7bGV0IHI9YnIocG4odCwieCIpKSxpPWJyKHBuKHQsInkiKSksbz1icihwbih0LCJ6IikpLGw9TWF0aC5tYXgoci5yYW5nZSxpLnJhbmdlKSxhPWwvMixzPVt7bWluOnIubWlkLWEsbWF4OnIubWlkK2EscmFuZ2U6bH0se21pbjppLm1pZC1hLG1heDppLm1pZCthLHJhbmdlOmx9LHttaW46by5taW4sbWF4Om8ubWF4LHJhbmdlOm8ucmFuZ2V9XSx1PSh0LGUpPT5Obih0KT8odC1zW2VdLm1pbikvc1tlXS5yYW5nZSpuOm51bGw7dD1wbih0LCh0PT4oe3g6dSh0LngsMCkseTp1KHQueSwxKSx6OnUodC56LDIpfSkpKTtsZXQgYz1wbih0LCJ4IiksZj1vcihjKSxoPWFyKGMpLGc9cG4odCwieSIpLHY9b3IoZyksZD1hcihnKSxwPXBuKHQsInoiKTtyZXR1cm57cHM6dCxwc01pbk1heDp7eG1pbjpmLHhtYXg6aCx5bWluOnYseW1heDpkLHptaW46b3IocCksem1heDphcihwKX0sc3Q6cyxudjp1LGludjoodCxlKT0+Tm4odCk/dC9uKnNbZV0ucmFuZ2Urc1tlXS5taW46bnVsbH19dmFyIHdyPWw/bC5pc0NvbmNhdFNwcmVhZGFibGU6dm9pZCAwO3ZhciBqcj1mdW5jdGlvbihlKXtyZXR1cm4gdChlKXx8QnQoZSl8fCEhKHdyJiZlJiZlW3dyXSl9O3ZhciBBcj1mdW5jdGlvbiB0KGUsbixyLGksbyl7dmFyIGw9LTEsYT1lLmxlbmd0aDtmb3Iocnx8KHI9anIpLG98fChvPVtdKTsrK2w8YTspe3ZhciBzPWVbbF07bj4wJiZyKHMpP24+MT90KHMsbi0xLHIsaSxvKTpGZShvLHMpOml8fChvW28ubGVuZ3RoXT1zKX1yZXR1cm4gb307dmFyIE9yPWZ1bmN0aW9uKHQpe3JldHVybihudWxsPT10PzA6dC5sZW5ndGgpP0FyKHQsMSk6W119O2Z1bmN0aW9uIFNyKHQpe2xldCBlPWZ1bmN0aW9uKHQpe2xldCBlPUVuKE10KHQsIjAiLG51bGwpKSxuPUVuKE10KHQsIjAuMCIsbnVsbCkpO3JldHVybiAyPT09RW4oTXQodCwiMC4wLjAiLG51bGwpKT8zOjI9PT1uPzI6Mj09PWU/MTowPT09ZT8wOihjb25zb2xlLmxvZygiaW52YWxpZCBwb2ludCBkZXB0aCIsdCksbnVsbCl9KHQpO3JldHVybiAzPT09ZT9Pcih0KToyPT09ZT90OjE9PT1lP1t0XTowPT09ZT9bXTp0fWZ1bmN0aW9uIE1yKHQpe2lmKCFMbih0KSlyZXR1cm4gMDt0PVNyKHQpO2xldCBlPTA7cmV0dXJuIHVlKHQsKCh0LG4pPT57bGV0IHI9ZnVuY3Rpb24odCxlPXt9KXtsZXQgbj1NdChlLCJ1c2VBYnMiKTtpZihrdChuKXx8KG49ITApLCFMbih0KSlyZXR1cm4gMDtsZXQgcj1bXTtpZih1ZSh0LCh0PT57Mj09PUVuKHQpJiZEbih0WzBdKSYmRG4odFsxXSkmJnIucHVzaChbUW4odFswXSksUW4odFsxXSldKX0pKSwhTG4ocikpcmV0dXJuIDA7bGV0IGksbz0tMSxsPUVuKHIpLGE9cltsLTFdLHM9MDtmb3IoOysrbzxsOylpPWEsYT1yW29dLHMrPWlbMV0qYVswXS1pWzBdKmFbMV07bGV0IHU9cy8yO3JldHVybiBuJiYodT1NYXRoLmFicyh1KSksdX0odCk7MD09PW4/ZT1yOmUtPXJ9KSksZTwwPzA6ZX12YXIgUHI9ZnVuY3Rpb24oKXt2YXIgdCxlPTAsbj0hMTtmdW5jdGlvbiByKGUsbil7cmV0dXJuIHQubGlzdC5wdXNoKHt0eXBlOmUsZGF0YTpuP0pTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobikpOnZvaWQgMH0pLHR9cmV0dXJuIHQ9e2xpc3Q6W10sc2VnbWVudElkOmZ1bmN0aW9uKCl7cmV0dXJuIGUrK30sY2hlY2tJbnRlcnNlY3Rpb246ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigiY2hlY2siLHtzZWcxOnQsc2VnMjplfSl9LHNlZ21lbnRDaG9wOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoImRpdl9zZWciLHtzZWc6dCxwdDplfSkscigiY2hvcCIse3NlZzp0LHB0OmV9KX0sc3RhdHVzUmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiByKCJwb3Bfc2VnIix7c2VnOnR9KX0sc2VnbWVudFVwZGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gcigic2VnX3VwZGF0ZSIse3NlZzp0fSl9LHNlZ21lbnROZXc6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigibmV3X3NlZyIse3NlZzp0LHByaW1hcnk6ZX0pfSxzZWdtZW50UmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiByKCJyZW1fc2VnIix7c2VnOnR9KX0sdGVtcFN0YXR1czpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHIoInRlbXBfc3RhdHVzIix7c2VnOnQsYWJvdmU6ZSxiZWxvdzpufSl9LHJld2luZDpmdW5jdGlvbih0KXtyZXR1cm4gcigicmV3aW5kIix7c2VnOnR9KX0sc3RhdHVzOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcigic3RhdHVzIix7c2VnOnQsYWJvdmU6ZSxiZWxvdzpufSl9LHZlcnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1uP3Q6KG49ZSxyKCJ2ZXJ0Iix7eDplfSkpfSxsb2c6ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0JiYodD1KU09OLnN0cmluZ2lmeSh0LCExLCIgICIpKSxyKCJsb2ciLHt0eHQ6dH0pfSxyZXNldDpmdW5jdGlvbigpe3JldHVybiByKCJyZXNldCIpfSxzZWxlY3RlZDpmdW5jdGlvbih0KXtyZXR1cm4gcigic2VsZWN0ZWQiLHtzZWdzOnR9KX0sY2hhaW5TdGFydDpmdW5jdGlvbih0KXtyZXR1cm4gcigiY2hhaW5fc3RhcnQiLHtzZWc6dH0pfSxjaGFpblJlbW92ZUhlYWQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigiY2hhaW5fcmVtX2hlYWQiLHtpbmRleDp0LHB0OmV9KX0sY2hhaW5SZW1vdmVUYWlsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoImNoYWluX3JlbV90YWlsIix7aW5kZXg6dCxwdDplfSl9LGNoYWluTmV3OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoImNoYWluX25ldyIse3B0MTp0LHB0MjplfSl9LGNoYWluTWF0Y2g6ZnVuY3Rpb24odCl7cmV0dXJuIHIoImNoYWluX21hdGNoIix7aW5kZXg6dH0pfSxjaGFpbkNsb3NlOmZ1bmN0aW9uKHQpe3JldHVybiByKCJjaGFpbl9jbG9zZSIse2luZGV4OnR9KX0sY2hhaW5BZGRIZWFkOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoImNoYWluX2FkZF9oZWFkIix7aW5kZXg6dCxwdDplfSl9LGNoYWluQWRkVGFpbDpmdW5jdGlvbih0LGUpe3JldHVybiByKCJjaGFpbl9hZGRfdGFpbCIse2luZGV4OnQscHQ6ZX0pfSxjaGFpbkNvbm5lY3Q6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigiY2hhaW5fY29uIix7aW5kZXgxOnQsaW5kZXgyOmV9KX0sY2hhaW5SZXZlcnNlOmZ1bmN0aW9uKHQpe3JldHVybiByKCJjaGFpbl9yZXYiLHtpbmRleDp0fSl9LGNoYWluSm9pbjpmdW5jdGlvbih0LGUpe3JldHVybiByKCJjaGFpbl9qb2luIix7aW5kZXgxOnQsaW5kZXgyOmV9KX0sZG9uZTpmdW5jdGlvbigpe3JldHVybiByKCJkb25lIil9fX07dmFyIGtyPWZ1bmN0aW9uKHQpeyJudW1iZXIiIT10eXBlb2YgdCYmKHQ9MWUtMTApO3ZhciBlPXtlcHNpbG9uOmZ1bmN0aW9uKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZSYmKHQ9ZSksdH0scG9pbnRBYm92ZU9yT25MaW5lOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1uWzBdLG89blsxXSxsPXJbMF0sYT1yWzFdLHM9ZVswXTtyZXR1cm4obC1pKSooZVsxXS1vKS0oYS1vKSoocy1pKT49LXR9LHBvaW50QmV0d2VlbjpmdW5jdGlvbihlLG4scil7dmFyIGk9ZVsxXS1uWzFdLG89clswXS1uWzBdLGw9ZVswXS1uWzBdLGE9clsxXS1uWzFdLHM9bCpvK2kqYTtyZXR1cm4hKHM8dCkmJiEocy0obypvK2EqYSk+LXQpfSxwb2ludHNTYW1lWDpmdW5jdGlvbihlLG4pe3JldHVybiBNYXRoLmFicyhlWzBdLW5bMF0pPHR9LHBvaW50c1NhbWVZOmZ1bmN0aW9uKGUsbil7cmV0dXJuIE1hdGguYWJzKGVbMV0tblsxXSk8dH0scG9pbnRzU2FtZTpmdW5jdGlvbih0LG4pe3JldHVybiBlLnBvaW50c1NhbWVYKHQsbikmJmUucG9pbnRzU2FtZVkodCxuKX0scG9pbnRzQ29tcGFyZTpmdW5jdGlvbih0LG4pe3JldHVybiBlLnBvaW50c1NhbWVYKHQsbik/ZS5wb2ludHNTYW1lWSh0LG4pPzA6dFsxXTxuWzFdPy0xOjE6dFswXTxuWzBdPy0xOjF9LHBvaW50c0NvbGxpbmVhcjpmdW5jdGlvbihlLG4scil7dmFyIGk9ZVswXS1uWzBdLG89ZVsxXS1uWzFdLGw9blswXS1yWzBdLGE9blsxXS1yWzFdO3JldHVybiBNYXRoLmFicyhpKmEtbCpvKTx0fSxsaW5lc0ludGVyc2VjdDpmdW5jdGlvbihlLG4scixpKXt2YXIgbz1uWzBdLWVbMF0sbD1uWzFdLWVbMV0sYT1pWzBdLXJbMF0scz1pWzFdLXJbMV0sdT1vKnMtbCphO2lmKE1hdGguYWJzKHUpPHQpcmV0dXJuITE7dmFyIGM9ZVswXS1yWzBdLGY9ZVsxXS1yWzFdLGg9KGEqZi1zKmMpL3UsZz0obypmLWwqYykvdSx2PXthbG9uZ0E6MCxhbG9uZ0I6MCxwdDpbZVswXStoKm8sZVsxXStoKmxdfTtyZXR1cm4gdi5hbG9uZ0E9aDw9LXQ/LTI6aDx0Py0xOmgtMTw9LXQ/MDpoLTE8dD8xOjIsdi5hbG9uZ0I9Zzw9LXQ/LTI6Zzx0Py0xOmctMTw9LXQ/MDpnLTE8dD8xOjIsdn0scG9pbnRJbnNpZGVSZWdpb246ZnVuY3Rpb24oZSxuKXtmb3IodmFyIHI9ZVswXSxpPWVbMV0sbz1uW24ubGVuZ3RoLTFdWzBdLGw9bltuLmxlbmd0aC0xXVsxXSxhPSExLHM9MDtzPG4ubGVuZ3RoO3MrKyl7dmFyIHU9bltzXVswXSxjPW5bc11bMV07Yy1pPnQhPWwtaT50JiYoby11KSooaS1jKS8obC1jKSt1LXI+dCYmKGE9IWEpLG89dSxsPWN9cmV0dXJuIGF9fTtyZXR1cm4gZX0sRnI9e2NyZWF0ZTpmdW5jdGlvbigpe3ZhciB0PXtyb290Ontyb290OiEwLG5leHQ6bnVsbH0sZXhpc3RzOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT09ZSYmZSE9PXQucm9vdH0saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiBudWxsPT09dC5yb290Lm5leHR9LGdldEhlYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5yb290Lm5leHR9LGluc2VydEJlZm9yZTpmdW5jdGlvbihlLG4pe2Zvcih2YXIgcj10LnJvb3QsaT10LnJvb3QubmV4dDtudWxsIT09aTspe2lmKG4oaSkpcmV0dXJuIGUucHJldj1pLnByZXYsZS5uZXh0PWksaS5wcmV2Lm5leHQ9ZSx2b2lkKGkucHJldj1lKTtyPWksaT1pLm5leHR9ci5uZXh0PWUsZS5wcmV2PXIsZS5uZXh0PW51bGx9LGZpbmRUcmFuc2l0aW9uOmZ1bmN0aW9uKGUpe2Zvcih2YXIgbj10LnJvb3Qscj10LnJvb3QubmV4dDtudWxsIT09ciYmIWUocik7KW49cixyPXIubmV4dDtyZXR1cm57YmVmb3JlOm49PT10LnJvb3Q/bnVsbDpuLGFmdGVyOnIsaW5zZXJ0OmZ1bmN0aW9uKHQpe3JldHVybiB0LnByZXY9bix0Lm5leHQ9cixuLm5leHQ9dCxudWxsIT09ciYmKHIucHJldj10KSx0fX19fTtyZXR1cm4gdH0sbm9kZTpmdW5jdGlvbih0KXtyZXR1cm4gdC5wcmV2PW51bGwsdC5uZXh0PW51bGwsdC5yZW1vdmU9ZnVuY3Rpb24oKXt0LnByZXYubmV4dD10Lm5leHQsdC5uZXh0JiYodC5uZXh0LnByZXY9dC5wcmV2KSx0LnByZXY9bnVsbCx0Lm5leHQ9bnVsbH0sdH19O3ZhciBUcj1mdW5jdGlvbih0LGUsbil7ZnVuY3Rpb24gcih0LGUscil7cmV0dXJue2lkOm4/bi5zZWdtZW50SWQoKTotMSxzdGFydDp0LGVuZDplLG15RmlsbDp7YWJvdmU6ci5teUZpbGwuYWJvdmUsYmVsb3c6ci5teUZpbGwuYmVsb3d9LG90aGVyRmlsbDpudWxsfX12YXIgaT1Gci5jcmVhdGUoKTtmdW5jdGlvbiBvKHQsbil7aS5pbnNlcnRCZWZvcmUodCwoZnVuY3Rpb24ocil7cmV0dXJuIGZ1bmN0aW9uKHQsbixyLGksbyxsKXt2YXIgYT1lLnBvaW50c0NvbXBhcmUobixvKTtyZXR1cm4gMCE9PWE/YTplLnBvaW50c1NhbWUocixsKT8wOnQhPT1pP3Q/MTotMTplLnBvaW50QWJvdmVPck9uTGluZShyLGk/bzpsLGk/bDpvKT8xOi0xfSh0LmlzU3RhcnQsdC5wdCxuLHIuaXNTdGFydCxyLnB0LHIub3RoZXIucHQpPDB9KSl9ZnVuY3Rpb24gbCh0LGUpe3ZhciBuPWZ1bmN0aW9uKHQsZSl7dmFyIG49RnIubm9kZSh7aXNTdGFydDohMCxwdDp0LnN0YXJ0LHNlZzp0LHByaW1hcnk6ZSxvdGhlcjpudWxsLHN0YXR1czpudWxsfSk7cmV0dXJuIG8obix0LmVuZCksbn0odCxlKTtyZXR1cm4gZnVuY3Rpb24odCxlLG4pe3ZhciByPUZyLm5vZGUoe2lzU3RhcnQ6ITEscHQ6ZS5lbmQsc2VnOmUscHJpbWFyeTpuLG90aGVyOnQsc3RhdHVzOm51bGx9KTt0Lm90aGVyPXIsbyhyLHQucHQpfShuLHQsZSksbn1mdW5jdGlvbiBhKHQsZSl7dmFyIGk9cihlLHQuc2VnLmVuZCx0LnNlZyk7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7biYmbi5zZWdtZW50Q2hvcCh0LnNlZyxlKSx0Lm90aGVyLnJlbW92ZSgpLHQuc2VnLmVuZD1lLHQub3RoZXIucHQ9ZSxvKHQub3RoZXIsdC5wdCl9KHQsZSksbChpLHQucHJpbWFyeSl9ZnVuY3Rpb24gcyhyLG8pe3ZhciBsPUZyLmNyZWF0ZSgpO2Z1bmN0aW9uIHModCl7cmV0dXJuIGwuZmluZFRyYW5zaXRpb24oKGZ1bmN0aW9uKG4pe3ZhciByLGksbyxsLGEscztyZXR1cm4ocj10LGk9bi5ldixvPXIuc2VnLnN0YXJ0LGw9ci5zZWcuZW5kLGE9aS5zZWcuc3RhcnQscz1pLnNlZy5lbmQsZS5wb2ludHNDb2xsaW5lYXIobyxhLHMpP2UucG9pbnRzQ29sbGluZWFyKGwsYSxzKXx8ZS5wb2ludEFib3ZlT3JPbkxpbmUobCxhLHMpPzE6LTE6ZS5wb2ludEFib3ZlT3JPbkxpbmUobyxhLHMpPzE6LTEpPjB9KSl9ZnVuY3Rpb24gdSh0LHIpe3ZhciBpPXQuc2VnLG89ci5zZWcsbD1pLnN0YXJ0LHM9aS5lbmQsdT1vLnN0YXJ0LGM9by5lbmQ7biYmbi5jaGVja0ludGVyc2VjdGlvbihpLG8pO3ZhciBmPWUubGluZXNJbnRlcnNlY3QobCxzLHUsYyk7aWYoITE9PT1mKXtpZighZS5wb2ludHNDb2xsaW5lYXIobCxzLHUpKXJldHVybiExO2lmKGUucG9pbnRzU2FtZShsLGMpfHxlLnBvaW50c1NhbWUocyx1KSlyZXR1cm4hMTt2YXIgaD1lLnBvaW50c1NhbWUobCx1KSxnPWUucG9pbnRzU2FtZShzLGMpO2lmKGgmJmcpcmV0dXJuIHI7dmFyIHY9IWgmJmUucG9pbnRCZXR3ZWVuKGwsdSxjKSxkPSFnJiZlLnBvaW50QmV0d2VlbihzLHUsYyk7aWYoaClyZXR1cm4gZD9hKHIscyk6YSh0LGMpLHI7diYmKGd8fChkP2EocixzKTphKHQsYykpLGEocixsKSl9ZWxzZSAwPT09Zi5hbG9uZ0EmJigtMT09PWYuYWxvbmdCP2EodCx1KTowPT09Zi5hbG9uZ0I/YSh0LGYucHQpOjE9PT1mLmFsb25nQiYmYSh0LGMpKSwwPT09Zi5hbG9uZ0ImJigtMT09PWYuYWxvbmdBP2EocixsKTowPT09Zi5hbG9uZ0E/YShyLGYucHQpOjE9PT1mLmFsb25nQSYmYShyLHMpKTtyZXR1cm4hMX1mb3IodmFyIGM9W107IWkuaXNFbXB0eSgpOyl7dmFyIGY9aS5nZXRIZWFkKCk7aWYobiYmbi52ZXJ0KGYucHRbMF0pLGYuaXNTdGFydCl7biYmbi5zZWdtZW50TmV3KGYuc2VnLGYucHJpbWFyeSk7dmFyIGg9cyhmKSxnPWguYmVmb3JlP2guYmVmb3JlLmV2Om51bGwsdj1oLmFmdGVyP2guYWZ0ZXIuZXY6bnVsbDtmdW5jdGlvbiBkKCl7aWYoZyl7dmFyIHQ9dShmLGcpO2lmKHQpcmV0dXJuIHR9cmV0dXJuISF2JiZ1KGYsdil9biYmbi50ZW1wU3RhdHVzKGYuc2VnLCEhZyYmZy5zZWcsISF2JiZ2LnNlZyk7dmFyIHAseT1kKCk7aWYoeSl7dmFyIF87aWYodCkoXz1udWxsPT09Zi5zZWcubXlGaWxsLmJlbG93fHxmLnNlZy5teUZpbGwuYWJvdmUhPT1mLnNlZy5teUZpbGwuYmVsb3cpJiYoeS5zZWcubXlGaWxsLmFib3ZlPSF5LnNlZy5teUZpbGwuYWJvdmUpO2Vsc2UgeS5zZWcub3RoZXJGaWxsPWYuc2VnLm15RmlsbDtuJiZuLnNlZ21lbnRVcGRhdGUoeS5zZWcpLGYub3RoZXIucmVtb3ZlKCksZi5yZW1vdmUoKX1pZihpLmdldEhlYWQoKSE9PWYpe24mJm4ucmV3aW5kKGYuc2VnKTtjb250aW51ZX1pZih0KV89bnVsbD09PWYuc2VnLm15RmlsbC5iZWxvd3x8Zi5zZWcubXlGaWxsLmFib3ZlIT09Zi5zZWcubXlGaWxsLmJlbG93LGYuc2VnLm15RmlsbC5iZWxvdz12P3Yuc2VnLm15RmlsbC5hYm92ZTpyLGYuc2VnLm15RmlsbC5hYm92ZT1fPyFmLnNlZy5teUZpbGwuYmVsb3c6Zi5zZWcubXlGaWxsLmJlbG93O2Vsc2UgaWYobnVsbD09PWYuc2VnLm90aGVyRmlsbClwPXY/Zi5wcmltYXJ5PT09di5wcmltYXJ5P3Yuc2VnLm90aGVyRmlsbC5hYm92ZTp2LnNlZy5teUZpbGwuYWJvdmU6Zi5wcmltYXJ5P286cixmLnNlZy5vdGhlckZpbGw9e2Fib3ZlOnAsYmVsb3c6cH07biYmbi5zdGF0dXMoZi5zZWcsISFnJiZnLnNlZywhIXYmJnYuc2VnKSxmLm90aGVyLnN0YXR1cz1oLmluc2VydChGci5ub2RlKHtldjpmfSkpfWVsc2V7dmFyIG09Zi5zdGF0dXM7aWYobnVsbD09PW0pdGhyb3cgbmV3IEVycm9yKCJQb2x5Qm9vbDogWmVyby1sZW5ndGggc2VnbWVudCBkZXRlY3RlZDsgeW91ciBlcHNpbG9uIGlzIHByb2JhYmx5IHRvbyBzbWFsbCBvciB0b28gbGFyZ2UiKTtpZihsLmV4aXN0cyhtLnByZXYpJiZsLmV4aXN0cyhtLm5leHQpJiZ1KG0ucHJldi5ldixtLm5leHQuZXYpLG4mJm4uc3RhdHVzUmVtb3ZlKG0uZXYuc2VnKSxtLnJlbW92ZSgpLCFmLnByaW1hcnkpe3ZhciBiPWYuc2VnLm15RmlsbDtmLnNlZy5teUZpbGw9Zi5zZWcub3RoZXJGaWxsLGYuc2VnLm90aGVyRmlsbD1ifWMucHVzaChmLnNlZyl9aS5nZXRIZWFkKCkucmVtb3ZlKCl9cmV0dXJuIG4mJm4uZG9uZSgpLGN9cmV0dXJuIHQ/e2FkZFJlZ2lvbjpmdW5jdGlvbih0KXtmb3IodmFyIHIsaSxvLGE9dFt0Lmxlbmd0aC0xXSxzPTA7czx0Lmxlbmd0aDtzKyspe3I9YSxhPXRbc107dmFyIHU9ZS5wb2ludHNDb21wYXJlKHIsYSk7MCE9PXUmJmwoKGk9dTwwP3I6YSxvPXU8MD9hOnIse2lkOm4/bi5zZWdtZW50SWQoKTotMSxzdGFydDppLGVuZDpvLG15RmlsbDp7YWJvdmU6bnVsbCxiZWxvdzpudWxsfSxvdGhlckZpbGw6bnVsbH0pLCEwKX19LGNhbGN1bGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gcyh0LCExKX19OntjYWxjdWxhdGU6ZnVuY3Rpb24odCxlLG4saSl7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7bChyKHQuc3RhcnQsdC5lbmQsdCksITApfSkpLG4uZm9yRWFjaCgoZnVuY3Rpb24odCl7bChyKHQuc3RhcnQsdC5lbmQsdCksITEpfSkpLHMoZSxpKX19fTt2YXIgenI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPVtdLGk9W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG89dC5zdGFydCxsPXQuZW5kO2lmKGUucG9pbnRzU2FtZShvLGwpKWNvbnNvbGUud2FybigiUG9seUJvb2w6IFdhcm5pbmc6IFplcm8tbGVuZ3RoIHNlZ21lbnQgZGV0ZWN0ZWQ7IHlvdXIgZXBzaWxvbiBpcyBwcm9iYWJseSB0b28gc21hbGwgb3IgdG9vIGxhcmdlIik7ZWxzZXtuJiZuLmNoYWluU3RhcnQodCk7Zm9yKHZhciBhPXtpbmRleDowLG1hdGNoZXNfaGVhZDohMSxtYXRjaGVzX3B0MTohMX0scz17aW5kZXg6MCxtYXRjaGVzX2hlYWQ6ITEsbWF0Y2hlc19wdDE6ITF9LHU9YSxjPTA7YzxyLmxlbmd0aDtjKyspe3ZhciBmPShwPXJbY10pWzBdO3BbMV07dmFyIGg9cFtwLmxlbmd0aC0xXTtpZihwW3AubGVuZ3RoLTJdLGUucG9pbnRzU2FtZShmLG8pKXtpZihBKGMsITAsITApKWJyZWFrfWVsc2UgaWYoZS5wb2ludHNTYW1lKGYsbCkpe2lmKEEoYywhMCwhMSkpYnJlYWt9ZWxzZSBpZihlLnBvaW50c1NhbWUoaCxvKSl7aWYoQShjLCExLCEwKSlicmVha31lbHNlIGlmKGUucG9pbnRzU2FtZShoLGwpJiZBKGMsITEsITEpKWJyZWFrfWlmKHU9PT1hKXJldHVybiByLnB1c2goW28sbF0pLHZvaWQobiYmbi5jaGFpbk5ldyhvLGwpKTtpZih1PT09cyl7biYmbi5jaGFpbk1hdGNoKGEuaW5kZXgpO3ZhciBnPWEuaW5kZXgsdj1hLm1hdGNoZXNfcHQxP2w6byxkPWEubWF0Y2hlc19oZWFkLHA9cltnXSx5PWQ/cFswXTpwW3AubGVuZ3RoLTFdLF89ZD9wWzFdOnBbcC5sZW5ndGgtMl0sbT1kP3BbcC5sZW5ndGgtMV06cFswXSxiPWQ/cFtwLmxlbmd0aC0yXTpwWzFdO3JldHVybiBlLnBvaW50c0NvbGxpbmVhcihfLHksdikmJihkPyhuJiZuLmNoYWluUmVtb3ZlSGVhZChhLmluZGV4LHYpLHAuc2hpZnQoKSk6KG4mJm4uY2hhaW5SZW1vdmVUYWlsKGEuaW5kZXgsdikscC5wb3AoKSkseT1fKSxlLnBvaW50c1NhbWUobSx2KT8oci5zcGxpY2UoZywxKSxlLnBvaW50c0NvbGxpbmVhcihiLG0seSkmJihkPyhuJiZuLmNoYWluUmVtb3ZlVGFpbChhLmluZGV4LHkpLHAucG9wKCkpOihuJiZuLmNoYWluUmVtb3ZlSGVhZChhLmluZGV4LHkpLHAuc2hpZnQoKSkpLG4mJm4uY2hhaW5DbG9zZShhLmluZGV4KSx2b2lkIGkucHVzaChwKSk6dm9pZChkPyhuJiZuLmNoYWluQWRkSGVhZChhLmluZGV4LHYpLHAudW5zaGlmdCh2KSk6KG4mJm4uY2hhaW5BZGRUYWlsKGEuaW5kZXgsdikscC5wdXNoKHYpKSl9dmFyIHg9YS5pbmRleCx3PXMuaW5kZXg7biYmbi5jaGFpbkNvbm5lY3QoeCx3KTt2YXIgaj1yW3hdLmxlbmd0aDxyW3ddLmxlbmd0aDthLm1hdGNoZXNfaGVhZD9zLm1hdGNoZXNfaGVhZD9qPyhPKHgpLFMoeCx3KSk6KE8odyksUyh3LHgpKTpTKHcseCk6cy5tYXRjaGVzX2hlYWQ/Uyh4LHcpOmo/KE8oeCksUyh3LHgpKTooTyh3KSxTKHgsdykpfWZ1bmN0aW9uIEEodCxlLG4pe3JldHVybiB1LmluZGV4PXQsdS5tYXRjaGVzX2hlYWQ9ZSx1Lm1hdGNoZXNfcHQxPW4sdT09PWE/KHU9cywhMSk6KHU9bnVsbCwhMCl9ZnVuY3Rpb24gTyh0KXtuJiZuLmNoYWluUmV2ZXJzZSh0KSxyW3RdLnJldmVyc2UoKX1mdW5jdGlvbiBTKHQsaSl7dmFyIG89clt0XSxsPXJbaV0sYT1vW28ubGVuZ3RoLTFdLHM9b1tvLmxlbmd0aC0yXSx1PWxbMF0sYz1sWzFdO2UucG9pbnRzQ29sbGluZWFyKHMsYSx1KSYmKG4mJm4uY2hhaW5SZW1vdmVUYWlsKHQsYSksby5wb3AoKSxhPXMpLGUucG9pbnRzQ29sbGluZWFyKGEsdSxjKSYmKG4mJm4uY2hhaW5SZW1vdmVIZWFkKGksdSksbC5zaGlmdCgpKSxuJiZuLmNoYWluSm9pbih0LGkpLHJbdF09by5jb25jYXQobCksci5zcGxpY2UoaSwxKX19KSksaX07ZnVuY3Rpb24gJHIodCxlLG4pe3ZhciByPVtdO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBpPSh0Lm15RmlsbC5hYm92ZT84OjApKyh0Lm15RmlsbC5iZWxvdz80OjApKyh0Lm90aGVyRmlsbCYmdC5vdGhlckZpbGwuYWJvdmU/MjowKSsodC5vdGhlckZpbGwmJnQub3RoZXJGaWxsLmJlbG93PzE6MCk7MCE9PWVbaV0mJnIucHVzaCh7aWQ6bj9uLnNlZ21lbnRJZCgpOi0xLHN0YXJ0OnQuc3RhcnQsZW5kOnQuZW5kLG15RmlsbDp7YWJvdmU6MT09PWVbaV0sYmVsb3c6Mj09PWVbaV19LG90aGVyRmlsbDpudWxsfSl9KSksbiYmbi5zZWxlY3RlZChyKSxyfXZhciBJcixFcj17dW5pb246ZnVuY3Rpb24odCxlKXtyZXR1cm4gJHIodCxbMCwyLDEsMCwyLDIsMCwwLDEsMCwxLDAsMCwwLDAsMF0sZSl9LGludGVyc2VjdDpmdW5jdGlvbih0LGUpe3JldHVybiAkcih0LFswLDAsMCwwLDAsMiwwLDIsMCwwLDEsMSwwLDIsMSwwXSxlKX0sZGlmZmVyZW5jZTpmdW5jdGlvbih0LGUpe3JldHVybiAkcih0LFswLDAsMCwwLDIsMCwyLDAsMSwxLDAsMCwwLDEsMiwwXSxlKX0sZGlmZmVyZW5jZVJldjpmdW5jdGlvbih0LGUpe3JldHVybiAkcih0LFswLDIsMSwwLDAsMCwxLDEsMCwyLDAsMiwwLDAsMCwwXSxlKX0seG9yOmZ1bmN0aW9uKHQsZSl7cmV0dXJuICRyKHQsWzAsMiwxLDAsMiwwLDAsMSwxLDAsMCwyLDAsMSwyLDBdLGUpfX0sTnI9RXIsUnI9e3RvUG9seWdvbjpmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oZSl7aWYoZS5sZW5ndGg8PTApcmV0dXJuIHQuc2VnbWVudHMoe2ludmVydGVkOiExLHJlZ2lvbnM6W119KTtmdW5jdGlvbiBuKGUpe3ZhciBuPWUuc2xpY2UoMCxlLmxlbmd0aC0xKTtyZXR1cm4gdC5zZWdtZW50cyh7aW52ZXJ0ZWQ6ITEscmVnaW9uczpbbl19KX1mb3IodmFyIHI9bihlWzBdKSxpPTE7aTxlLmxlbmd0aDtpKyspcj10LnNlbGVjdERpZmZlcmVuY2UodC5jb21iaW5lKHIsbihlW2ldKSkpO3JldHVybiByfWlmKCJQb2x5Z29uIj09PWUudHlwZSlyZXR1cm4gdC5wb2x5Z29uKG4oZS5jb29yZGluYXRlcykpO2lmKCJNdWx0aVBvbHlnb24iPT09ZS50eXBlKXtmb3IodmFyIHI9dC5zZWdtZW50cyh7aW52ZXJ0ZWQ6ITEscmVnaW9uczpbXX0pLGk9MDtpPGUuY29vcmRpbmF0ZXMubGVuZ3RoO2krKylyPXQuc2VsZWN0VW5pb24odC5jb21iaW5lKHIsbihlLmNvb3JkaW5hdGVzW2ldKSkpO3JldHVybiB0LnBvbHlnb24ocil9dGhyb3cgbmV3IEVycm9yKCJQb2x5Qm9vbDogQ2Fubm90IGNvbnZlcnQgR2VvSlNPTiBvYmplY3QgdG8gUG9seUJvb2wgcG9seWdvbiIpfSxmcm9tUG9seWdvbjpmdW5jdGlvbih0LGUsbil7ZnVuY3Rpb24gcih0LG4pe3JldHVybiBlLnBvaW50SW5zaWRlUmVnaW9uKFsuNSoodFswXVswXSt0WzFdWzBdKSwuNSoodFswXVsxXSt0WzFdWzFdKV0sbil9ZnVuY3Rpb24gaSh0KXtyZXR1cm57cmVnaW9uOnQsY2hpbGRyZW46W119fW49dC5wb2x5Z29uKHQuc2VnbWVudHMobikpO3ZhciBvPWkobnVsbCk7ZnVuY3Rpb24gbCh0LGUpe2Zvcih2YXIgbj0wO248dC5jaGlsZHJlbi5sZW5ndGg7bisrKXtpZihyKGUsKGE9dC5jaGlsZHJlbltuXSkucmVnaW9uKSlyZXR1cm4gdm9pZCBsKGEsZSl9dmFyIG89aShlKTtmb3Iobj0wO248dC5jaGlsZHJlbi5sZW5ndGg7bisrKXt2YXIgYTtyKChhPXQuY2hpbGRyZW5bbl0pLnJlZ2lvbixlKSYmKG8uY2hpbGRyZW4ucHVzaChhKSx0LmNoaWxkcmVuLnNwbGljZShuLDEpLG4tLSl9dC5jaGlsZHJlbi5wdXNoKG8pfWZvcih2YXIgYT0wO2E8bi5yZWdpb25zLmxlbmd0aDthKyspe3ZhciBzPW4ucmVnaW9uc1thXTtzLmxlbmd0aDwzfHxsKG8scyl9ZnVuY3Rpb24gdSh0LGUpe2Zvcih2YXIgbj0wLHI9dFt0Lmxlbmd0aC0xXVswXSxpPXRbdC5sZW5ndGgtMV1bMV0sbz1bXSxsPTA7bDx0Lmxlbmd0aDtsKyspe3ZhciBhPXRbbF1bMF0scz10W2xdWzFdO28ucHVzaChbYSxzXSksbis9cypyLWEqaSxyPWEsaT1zfXJldHVybiBuPDAhPT1lJiZvLnJldmVyc2UoKSxvLnB1c2goW29bMF1bMF0sb1swXVsxXV0pLG99dmFyIGM9W107ZnVuY3Rpb24gZih0KXt2YXIgZT1bdSh0LnJlZ2lvbiwhMSldO2MucHVzaChlKTtmb3IodmFyIG49MDtuPHQuY2hpbGRyZW4ubGVuZ3RoO24rKyllLnB1c2goaCh0LmNoaWxkcmVuW25dKSl9ZnVuY3Rpb24gaCh0KXtmb3IodmFyIGU9MDtlPHQuY2hpbGRyZW4ubGVuZ3RoO2UrKylmKHQuY2hpbGRyZW5bZV0pO3JldHVybiB1KHQucmVnaW9uLCEwKX1mb3IoYT0wO2E8by5jaGlsZHJlbi5sZW5ndGg7YSsrKWYoby5jaGlsZHJlblthXSk7cmV0dXJuIGMubGVuZ3RoPD0wP3t0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbXX06MT09Yy5sZW5ndGg/e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOmNbMF19Ont0eXBlOiJNdWx0aVBvbHlnb24iLGNvb3JkaW5hdGVzOmN9fX0sQ3I9UnIsQnI9ITEsVXI9a3IoKTtmdW5jdGlvbiBMcih0LGUsbil7dmFyIHI9SXIuc2VnbWVudHModCksaT1Jci5zZWdtZW50cyhlKSxvPW4oSXIuY29tYmluZShyLGkpKTtyZXR1cm4gSXIucG9seWdvbihvKX1Jcj17YnVpbGRMb2c6ZnVuY3Rpb24odCl7cmV0dXJuITA9PT10P0JyPVByKCk6ITE9PT10JiYoQnI9ITEpLCExIT09QnImJkJyLmxpc3R9LGVwc2lsb246ZnVuY3Rpb24odCl7cmV0dXJuIFVyLmVwc2lsb24odCl9LHNlZ21lbnRzOmZ1bmN0aW9uKHQpe3ZhciBlPVRyKCEwLFVyLEJyKTtyZXR1cm4gdC5yZWdpb25zLmZvckVhY2goZS5hZGRSZWdpb24pLHtzZWdtZW50czplLmNhbGN1bGF0ZSh0LmludmVydGVkKSxpbnZlcnRlZDp0LmludmVydGVkfX0sY29tYmluZTpmdW5jdGlvbih0LGUpe3JldHVybntjb21iaW5lZDpUcighMSxVcixCcikuY2FsY3VsYXRlKHQuc2VnbWVudHMsdC5pbnZlcnRlZCxlLnNlZ21lbnRzLGUuaW52ZXJ0ZWQpLGludmVydGVkMTp0LmludmVydGVkLGludmVydGVkMjplLmludmVydGVkfX0sc2VsZWN0VW5pb246ZnVuY3Rpb24odCl7cmV0dXJue3NlZ21lbnRzOk5yLnVuaW9uKHQuY29tYmluZWQsQnIpLGludmVydGVkOnQuaW52ZXJ0ZWQxfHx0LmludmVydGVkMn19LHNlbGVjdEludGVyc2VjdDpmdW5jdGlvbih0KXtyZXR1cm57c2VnbWVudHM6TnIuaW50ZXJzZWN0KHQuY29tYmluZWQsQnIpLGludmVydGVkOnQuaW52ZXJ0ZWQxJiZ0LmludmVydGVkMn19LHNlbGVjdERpZmZlcmVuY2U6ZnVuY3Rpb24odCl7cmV0dXJue3NlZ21lbnRzOk5yLmRpZmZlcmVuY2UodC5jb21iaW5lZCxCciksaW52ZXJ0ZWQ6dC5pbnZlcnRlZDEmJiF0LmludmVydGVkMn19LHNlbGVjdERpZmZlcmVuY2VSZXY6ZnVuY3Rpb24odCl7cmV0dXJue3NlZ21lbnRzOk5yLmRpZmZlcmVuY2VSZXYodC5jb21iaW5lZCxCciksaW52ZXJ0ZWQ6IXQuaW52ZXJ0ZWQxJiZ0LmludmVydGVkMn19LHNlbGVjdFhvcjpmdW5jdGlvbih0KXtyZXR1cm57c2VnbWVudHM6TnIueG9yKHQuY29tYmluZWQsQnIpLGludmVydGVkOnQuaW52ZXJ0ZWQxIT09dC5pbnZlcnRlZDJ9fSxwb2x5Z29uOmZ1bmN0aW9uKHQpe3JldHVybntyZWdpb25zOnpyKHQuc2VnbWVudHMsVXIsQnIpLGludmVydGVkOnQuaW52ZXJ0ZWR9fSxwb2x5Z29uRnJvbUdlb0pTT046ZnVuY3Rpb24odCl7cmV0dXJuIENyLnRvUG9seWdvbihJcix0KX0scG9seWdvblRvR2VvSlNPTjpmdW5jdGlvbih0KXtyZXR1cm4gQ3IuZnJvbVBvbHlnb24oSXIsVXIsdCl9LHVuaW9uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIExyKHQsZSxJci5zZWxlY3RVbmlvbil9LGludGVyc2VjdDpmdW5jdGlvbih0LGUpe3JldHVybiBMcih0LGUsSXIuc2VsZWN0SW50ZXJzZWN0KX0sZGlmZmVyZW5jZTpmdW5jdGlvbih0LGUpe3JldHVybiBMcih0LGUsSXIuc2VsZWN0RGlmZmVyZW5jZSl9LGRpZmZlcmVuY2VSZXY6ZnVuY3Rpb24odCxlKXtyZXR1cm4gTHIodCxlLElyLnNlbGVjdERpZmZlcmVuY2VSZXYpfSx4b3I6ZnVuY3Rpb24odCxlKXtyZXR1cm4gTHIodCxlLElyLnNlbGVjdFhvcil9fSwib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5Qb2x5Qm9vbD1Jcik7dmFyIERyPUlyO2Z1bmN0aW9uIEhyKHQsZSxuLHIsaSl7bGV0IG8sbCxhLHMsdT1lWzBdLGM9clswXSxmPTAsaD0wO2M+dT09Yz4tdT8obz11LHU9ZVsrK2ZdKToobz1jLGM9clsrK2hdKTtsZXQgZz0wO2lmKGY8dCYmaDxuKWZvcihjPnU9PWM+LXU/KGw9dStvLGE9by0obC11KSx1PWVbKytmXSk6KGw9YytvLGE9by0obC1jKSxjPXJbKytoXSksbz1sLDAhPT1hJiYoaVtnKytdPWEpO2Y8dCYmaDxuOyljPnU9PWM+LXU/KGw9byt1LHM9bC1vLGE9by0obC1zKSsodS1zKSx1PWVbKytmXSk6KGw9bytjLHM9bC1vLGE9by0obC1zKSsoYy1zKSxjPXJbKytoXSksbz1sLDAhPT1hJiYoaVtnKytdPWEpO2Zvcig7Zjx0OylsPW8rdSxzPWwtbyxhPW8tKGwtcykrKHUtcyksdT1lWysrZl0sbz1sLDAhPT1hJiYoaVtnKytdPWEpO2Zvcig7aDxuOylsPW8rYyxzPWwtbyxhPW8tKGwtcykrKGMtcyksYz1yWysraF0sbz1sLDAhPT1hJiYoaVtnKytdPWEpO3JldHVybiAwPT09byYmMCE9PWd8fChpW2crK109byksZ31mdW5jdGlvbiBLcih0KXtyZXR1cm4gbmV3IEZsb2F0NjRBcnJheSh0KX1jb25zdCBYcj1Lcig0KSxKcj1Lcig4KSxZcj1LcigxMiksWnI9S3IoMTYpLFZyPUtyKDQpO2Z1bmN0aW9uIFdyKHQsZSxuLHIsaSxvKXtjb25zdCBsPShlLW8pKihuLWkpLGE9KHQtaSkqKHItbykscz1sLWE7aWYoMD09PWx8fDA9PT1hfHxsPjAhPWE+MClyZXR1cm4gcztjb25zdCB1PU1hdGguYWJzKGwrYSk7cmV0dXJuIE1hdGguYWJzKHMpPj0zMzMwNjY5MDczODc1NDcxNmUtMzIqdT9zOi1mdW5jdGlvbih0LGUsbixyLGksbyxsKXtsZXQgYSxzLHUsYyxmLGgsZyx2LGQscCx5LF8sbSxiLHgsdyxqLEE7Y29uc3QgTz10LWksUz1uLWksTT1lLW8sUD1yLW87Yj1PKlAsaD0xMzQyMTc3MjkqTyxnPWgtKGgtTyksdj1PLWcsaD0xMzQyMTc3MjkqUCxkPWgtKGgtUCkscD1QLWQseD12KnAtKGItZypkLXYqZC1nKnApLHc9TSpTLGg9MTM0MjE3NzI5Kk0sZz1oLShoLU0pLHY9TS1nLGg9MTM0MjE3NzI5KlMsZD1oLShoLVMpLHA9Uy1kLGo9dipwLSh3LWcqZC12KmQtZypwKSx5PXgtaixmPXgteSxYclswXT14LSh5K2YpKyhmLWopLF89Yit5LGY9Xy1iLG09Yi0oXy1mKSsoeS1mKSx5PW0tdyxmPW0teSxYclsxXT1tLSh5K2YpKyhmLXcpLEE9Xyt5LGY9QS1fLFhyWzJdPV8tKEEtZikrKHktZiksWHJbM109QTtsZXQgaz1mdW5jdGlvbih0LGUpe2xldCBuPWVbMF07Zm9yKGxldCByPTE7cjx0O3IrKyluKz1lW3JdO3JldHVybiBufSg0LFhyKSxGPTIyMjA0NDYwNDkyNTAzMTQ2ZS0zMipsO2lmKGs+PUZ8fC1rPj1GKXJldHVybiBrO2lmKGY9dC1PLGE9dC0oTytmKSsoZi1pKSxmPW4tUyx1PW4tKFMrZikrKGYtaSksZj1lLU0scz1lLShNK2YpKyhmLW8pLGY9ci1QLGM9ci0oUCtmKSsoZi1vKSwwPT09YSYmMD09PXMmJjA9PT11JiYwPT09YylyZXR1cm4gaztpZihGPTExMDkzMzU2NDc5NjcwNDg3ZS00NypsKzMzMzA2NjkwNzM4NzU0NzA2ZS0zMipNYXRoLmFicyhrKSxrKz1PKmMrUCphLShNKnUrUypzKSxrPj1GfHwtaz49RilyZXR1cm4gaztiPWEqUCxoPTEzNDIxNzcyOSphLGc9aC0oaC1hKSx2PWEtZyxoPTEzNDIxNzcyOSpQLGQ9aC0oaC1QKSxwPVAtZCx4PXYqcC0oYi1nKmQtdipkLWcqcCksdz1zKlMsaD0xMzQyMTc3MjkqcyxnPWgtKGgtcyksdj1zLWcsaD0xMzQyMTc3MjkqUyxkPWgtKGgtUykscD1TLWQsaj12KnAtKHctZypkLXYqZC1nKnApLHk9eC1qLGY9eC15LFZyWzBdPXgtKHkrZikrKGYtaiksXz1iK3ksZj1fLWIsbT1iLShfLWYpKyh5LWYpLHk9bS13LGY9bS15LFZyWzFdPW0tKHkrZikrKGYtdyksQT1fK3ksZj1BLV8sVnJbMl09Xy0oQS1mKSsoeS1mKSxWclszXT1BO2NvbnN0IFQ9SHIoNCxYciw0LFZyLEpyKTtiPU8qYyxoPTEzNDIxNzcyOSpPLGc9aC0oaC1PKSx2PU8tZyxoPTEzNDIxNzcyOSpjLGQ9aC0oaC1jKSxwPWMtZCx4PXYqcC0oYi1nKmQtdipkLWcqcCksdz1NKnUsaD0xMzQyMTc3MjkqTSxnPWgtKGgtTSksdj1NLWcsaD0xMzQyMTc3MjkqdSxkPWgtKGgtdSkscD11LWQsaj12KnAtKHctZypkLXYqZC1nKnApLHk9eC1qLGY9eC15LFZyWzBdPXgtKHkrZikrKGYtaiksXz1iK3ksZj1fLWIsbT1iLShfLWYpKyh5LWYpLHk9bS13LGY9bS15LFZyWzFdPW0tKHkrZikrKGYtdyksQT1fK3ksZj1BLV8sVnJbMl09Xy0oQS1mKSsoeS1mKSxWclszXT1BO2NvbnN0IHo9SHIoVCxKciw0LFZyLFlyKTtiPWEqYyxoPTEzNDIxNzcyOSphLGc9aC0oaC1hKSx2PWEtZyxoPTEzNDIxNzcyOSpjLGQ9aC0oaC1jKSxwPWMtZCx4PXYqcC0oYi1nKmQtdipkLWcqcCksdz1zKnUsaD0xMzQyMTc3MjkqcyxnPWgtKGgtcyksdj1zLWcsaD0xMzQyMTc3MjkqdSxkPWgtKGgtdSkscD11LWQsaj12KnAtKHctZypkLXYqZC1nKnApLHk9eC1qLGY9eC15LFZyWzBdPXgtKHkrZikrKGYtaiksXz1iK3ksZj1fLWIsbT1iLShfLWYpKyh5LWYpLHk9bS13LGY9bS15LFZyWzFdPW0tKHkrZikrKGYtdyksQT1fK3ksZj1BLV8sVnJbMl09Xy0oQS1mKSsoeS1mKSxWclszXT1BO2NvbnN0ICQ9SHIoeixZciw0LFZyLFpyKTtyZXR1cm4gWnJbJC0xXX0odCxlLG4scixpLG8sdSl9Y29uc3QgcXI9TWF0aC5wb3coMiwtNTIpLEdyPW5ldyBVaW50MzJBcnJheSg1MTIpO2NsYXNzIFFye3N0YXRpYyBmcm9tKHQsZT1vaSxuPWxpKXtjb25zdCByPXQubGVuZ3RoLGk9bmV3IEZsb2F0NjRBcnJheSgyKnIpO2ZvcihsZXQgbz0wO288cjtvKyspe2NvbnN0IHI9dFtvXTtpWzIqb109ZShyKSxpWzIqbysxXT1uKHIpfXJldHVybiBuZXcgUXIoaSl9Y29uc3RydWN0b3IodCl7Y29uc3QgZT10Lmxlbmd0aD4+MTtpZihlPjAmJiJudW1iZXIiIT10eXBlb2YgdFswXSl0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGNvb3JkcyB0byBjb250YWluIG51bWJlcnMuIik7dGhpcy5jb29yZHM9dDtjb25zdCBuPU1hdGgubWF4KDIqZS01LDApO3RoaXMuX3RyaWFuZ2xlcz1uZXcgVWludDMyQXJyYXkoMypuKSx0aGlzLl9oYWxmZWRnZXM9bmV3IEludDMyQXJyYXkoMypuKSx0aGlzLl9oYXNoU2l6ZT1NYXRoLmNlaWwoTWF0aC5zcXJ0KGUpKSx0aGlzLl9odWxsUHJldj1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbE5leHQ9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2h1bGxUcmk9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2h1bGxIYXNoPW5ldyBJbnQzMkFycmF5KHRoaXMuX2hhc2hTaXplKS5maWxsKC0xKSx0aGlzLl9pZHM9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2Rpc3RzPW5ldyBGbG9hdDY0QXJyYXkoZSksdGhpcy51cGRhdGUoKX11cGRhdGUoKXtjb25zdHtjb29yZHM6dCxfaHVsbFByZXY6ZSxfaHVsbE5leHQ6bixfaHVsbFRyaTpyLF9odWxsSGFzaDppfT10aGlzLG89dC5sZW5ndGg+PjE7bGV0IGw9MS8wLGE9MS8wLHM9LTEvMCx1PS0xLzA7Zm9yKGxldCBlPTA7ZTxvO2UrKyl7Y29uc3Qgbj10WzIqZV0scj10WzIqZSsxXTtuPGwmJihsPW4pLHI8YSYmKGE9ciksbj5zJiYocz1uKSxyPnUmJih1PXIpLHRoaXMuX2lkc1tlXT1lfWNvbnN0IGM9KGwrcykvMixmPShhK3UpLzI7bGV0IGgsZyx2LGQ9MS8wO2ZvcihsZXQgZT0wO2U8bztlKyspe2NvbnN0IG49dGkoYyxmLHRbMiplXSx0WzIqZSsxXSk7bjxkJiYoaD1lLGQ9bil9Y29uc3QgcD10WzIqaF0seT10WzIqaCsxXTtkPTEvMDtmb3IobGV0IGU9MDtlPG87ZSsrKXtpZihlPT09aCljb250aW51ZTtjb25zdCBuPXRpKHAseSx0WzIqZV0sdFsyKmUrMV0pO248ZCYmbj4wJiYoZz1lLGQ9bil9bGV0IF89dFsyKmddLG09dFsyKmcrMV0sYj0xLzA7Zm9yKGxldCBlPTA7ZTxvO2UrKyl7aWYoZT09PWh8fGU9PT1nKWNvbnRpbnVlO2NvbnN0IG49bmkocCx5LF8sbSx0WzIqZV0sdFsyKmUrMV0pO248YiYmKHY9ZSxiPW4pfWxldCB4PXRbMip2XSx3PXRbMip2KzFdO2lmKGI9PT0xLzApe2ZvcihsZXQgZT0wO2U8bztlKyspdGhpcy5fZGlzdHNbZV09dFsyKmVdLXRbMF18fHRbMiplKzFdLXRbMV07cmkodGhpcy5faWRzLHRoaXMuX2Rpc3RzLDAsby0xKTtjb25zdCBlPW5ldyBVaW50MzJBcnJheShvKTtsZXQgbj0wO2ZvcihsZXQgdD0wLHI9LTEvMDt0PG87dCsrKXtjb25zdCBpPXRoaXMuX2lkc1t0XTt0aGlzLl9kaXN0c1tpXT5yJiYoZVtuKytdPWkscj10aGlzLl9kaXN0c1tpXSl9cmV0dXJuIHRoaXMuaHVsbD1lLnN1YmFycmF5KDAsbiksdGhpcy50cmlhbmdsZXM9bmV3IFVpbnQzMkFycmF5KDApLHZvaWQodGhpcy5oYWxmZWRnZXM9bmV3IFVpbnQzMkFycmF5KDApKX1pZihXcihwLHksXyxtLHgsdyk8MCl7Y29uc3QgdD1nLGU9XyxuPW07Zz12LF89eCxtPXcsdj10LHg9ZSx3PW59Y29uc3Qgaj1mdW5jdGlvbih0LGUsbixyLGksbyl7Y29uc3QgbD1uLXQsYT1yLWUscz1pLXQsdT1vLWUsYz1sKmwrYSphLGY9cypzK3UqdSxoPS41LyhsKnUtYSpzKTtyZXR1cm57eDp0Kyh1KmMtYSpmKSpoLHk6ZSsobCpmLXMqYykqaH19KHAseSxfLG0seCx3KTt0aGlzLl9jeD1qLngsdGhpcy5fY3k9ai55O2ZvcihsZXQgZT0wO2U8bztlKyspdGhpcy5fZGlzdHNbZV09dGkodFsyKmVdLHRbMiplKzFdLGoueCxqLnkpO3JpKHRoaXMuX2lkcyx0aGlzLl9kaXN0cywwLG8tMSksdGhpcy5faHVsbFN0YXJ0PWg7bGV0IEE9MztuW2hdPWVbdl09ZyxuW2ddPWVbaF09dixuW3ZdPWVbZ109aCxyW2hdPTAscltnXT0xLHJbdl09MixpLmZpbGwoLTEpLGlbdGhpcy5faGFzaEtleShwLHkpXT1oLGlbdGhpcy5faGFzaEtleShfLG0pXT1nLGlbdGhpcy5faGFzaEtleSh4LHcpXT12LHRoaXMudHJpYW5nbGVzTGVuPTAsdGhpcy5fYWRkVHJpYW5nbGUoaCxnLHYsLTEsLTEsLTEpO2ZvcihsZXQgbyxsLGE9MDthPHRoaXMuX2lkcy5sZW5ndGg7YSsrKXtjb25zdCBzPXRoaXMuX2lkc1thXSx1PXRbMipzXSxjPXRbMipzKzFdO2lmKGE+MCYmTWF0aC5hYnModS1vKTw9cXImJk1hdGguYWJzKGMtbCk8PXFyKWNvbnRpbnVlO2lmKG89dSxsPWMscz09PWh8fHM9PT1nfHxzPT09diljb250aW51ZTtsZXQgZj0wO2ZvcihsZXQgdD0wLGU9dGhpcy5faGFzaEtleSh1LGMpO3Q8dGhpcy5faGFzaFNpemUmJihmPWlbKGUrdCkldGhpcy5faGFzaFNpemVdLC0xPT09Znx8Zj09PW5bZl0pO3QrKyk7Zj1lW2ZdO2xldCBkLHA9Zjtmb3IoO2Q9bltwXSxXcih1LGMsdFsyKnBdLHRbMipwKzFdLHRbMipkXSx0WzIqZCsxXSk+PTA7KWlmKHA9ZCxwPT09Zil7cD0tMTticmVha31pZigtMT09PXApY29udGludWU7bGV0IHk9dGhpcy5fYWRkVHJpYW5nbGUocCxzLG5bcF0sLTEsLTEscltwXSk7cltzXT10aGlzLl9sZWdhbGl6ZSh5KzIpLHJbcF09eSxBKys7bGV0IF89bltwXTtmb3IoO2Q9bltfXSxXcih1LGMsdFsyKl9dLHRbMipfKzFdLHRbMipkXSx0WzIqZCsxXSk8MDspeT10aGlzLl9hZGRUcmlhbmdsZShfLHMsZCxyW3NdLC0xLHJbX10pLHJbc109dGhpcy5fbGVnYWxpemUoeSsyKSxuW19dPV8sQS0tLF89ZDtpZihwPT09Zilmb3IoO2Q9ZVtwXSxXcih1LGMsdFsyKmRdLHRbMipkKzFdLHRbMipwXSx0WzIqcCsxXSk8MDspeT10aGlzLl9hZGRUcmlhbmdsZShkLHMscCwtMSxyW3BdLHJbZF0pLHRoaXMuX2xlZ2FsaXplKHkrMikscltkXT15LG5bcF09cCxBLS0scD1kO3RoaXMuX2h1bGxTdGFydD1lW3NdPXAsbltwXT1lW19dPXMsbltzXT1fLGlbdGhpcy5faGFzaEtleSh1LGMpXT1zLGlbdGhpcy5faGFzaEtleSh0WzIqcF0sdFsyKnArMV0pXT1wfXRoaXMuaHVsbD1uZXcgVWludDMyQXJyYXkoQSk7Zm9yKGxldCB0PTAsZT10aGlzLl9odWxsU3RhcnQ7dDxBO3QrKyl0aGlzLmh1bGxbdF09ZSxlPW5bZV07dGhpcy50cmlhbmdsZXM9dGhpcy5fdHJpYW5nbGVzLnN1YmFycmF5KDAsdGhpcy50cmlhbmdsZXNMZW4pLHRoaXMuaGFsZmVkZ2VzPXRoaXMuX2hhbGZlZGdlcy5zdWJhcnJheSgwLHRoaXMudHJpYW5nbGVzTGVuKX1faGFzaEtleSh0LGUpe3JldHVybiBNYXRoLmZsb29yKGZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj10LyhNYXRoLmFicyh0KStNYXRoLmFicyhlKSk7cmV0dXJuKGU+MD8zLW46MStuKS80fSh0LXRoaXMuX2N4LGUtdGhpcy5fY3kpKnRoaXMuX2hhc2hTaXplKSV0aGlzLl9oYXNoU2l6ZX1fbGVnYWxpemUodCl7Y29uc3R7X3RyaWFuZ2xlczplLF9oYWxmZWRnZXM6bixjb29yZHM6cn09dGhpcztsZXQgaT0wLG89MDtmb3IoOzspe2NvbnN0IGw9blt0XSxhPXQtdCUzO2lmKG89YSsodCsyKSUzLC0xPT09bCl7aWYoMD09PWkpYnJlYWs7dD1HclstLWldO2NvbnRpbnVlfWNvbnN0IHM9bC1sJTMsdT1hKyh0KzEpJTMsYz1zKyhsKzIpJTMsZj1lW29dLGg9ZVt0XSxnPWVbdV0sdj1lW2NdO2lmKGVpKHJbMipmXSxyWzIqZisxXSxyWzIqaF0sclsyKmgrMV0sclsyKmddLHJbMipnKzFdLHJbMip2XSxyWzIqdisxXSkpe2VbdF09dixlW2xdPWY7Y29uc3Qgcj1uW2NdO2lmKC0xPT09cil7bGV0IGU9dGhpcy5faHVsbFN0YXJ0O2Rve2lmKHRoaXMuX2h1bGxUcmlbZV09PT1jKXt0aGlzLl9odWxsVHJpW2VdPXQ7YnJlYWt9ZT10aGlzLl9odWxsUHJldltlXX13aGlsZShlIT09dGhpcy5faHVsbFN0YXJ0KX10aGlzLl9saW5rKHQsciksdGhpcy5fbGluayhsLG5bb10pLHRoaXMuX2xpbmsobyxjKTtjb25zdCBhPXMrKGwrMSklMztpPEdyLmxlbmd0aCYmKEdyW2krK109YSl9ZWxzZXtpZigwPT09aSlicmVhazt0PUdyWy0taV19fXJldHVybiBvfV9saW5rKHQsZSl7dGhpcy5faGFsZmVkZ2VzW3RdPWUsLTEhPT1lJiYodGhpcy5faGFsZmVkZ2VzW2VdPXQpfV9hZGRUcmlhbmdsZSh0LGUsbixyLGksbyl7Y29uc3QgbD10aGlzLnRyaWFuZ2xlc0xlbjtyZXR1cm4gdGhpcy5fdHJpYW5nbGVzW2xdPXQsdGhpcy5fdHJpYW5nbGVzW2wrMV09ZSx0aGlzLl90cmlhbmdsZXNbbCsyXT1uLHRoaXMuX2xpbmsobCxyKSx0aGlzLl9saW5rKGwrMSxpKSx0aGlzLl9saW5rKGwrMixvKSx0aGlzLnRyaWFuZ2xlc0xlbis9MyxsfX1mdW5jdGlvbiB0aSh0LGUsbixyKXtjb25zdCBpPXQtbixvPWUtcjtyZXR1cm4gaSppK28qb31mdW5jdGlvbiBlaSh0LGUsbixyLGksbyxsLGEpe2NvbnN0IHM9dC1sLHU9ZS1hLGM9bi1sLGY9ci1hLGg9aS1sLGc9by1hLHY9YypjK2YqZixkPWgqaCtnKmc7cmV0dXJuIHMqKGYqZC12KmcpLXUqKGMqZC12KmgpKyhzKnMrdSp1KSooYypnLWYqaCk8MH1mdW5jdGlvbiBuaSh0LGUsbixyLGksbyl7Y29uc3QgbD1uLXQsYT1yLWUscz1pLXQsdT1vLWUsYz1sKmwrYSphLGY9cypzK3UqdSxoPS41LyhsKnUtYSpzKSxnPSh1KmMtYSpmKSpoLHY9KGwqZi1zKmMpKmg7cmV0dXJuIGcqZyt2KnZ9ZnVuY3Rpb24gcmkodCxlLG4scil7aWYoci1uPD0yMClmb3IobGV0IGk9bisxO2k8PXI7aSsrKXtjb25zdCByPXRbaV0sbz1lW3JdO2xldCBsPWktMTtmb3IoO2w+PW4mJmVbdFtsXV0+bzspdFtsKzFdPXRbbC0tXTt0W2wrMV09cn1lbHNle2xldCBpPW4rMSxvPXI7aWkodCxuK3I+PjEsaSksZVt0W25dXT5lW3Rbcl1dJiZpaSh0LG4sciksZVt0W2ldXT5lW3Rbcl1dJiZpaSh0LGksciksZVt0W25dXT5lW3RbaV1dJiZpaSh0LG4saSk7Y29uc3QgbD10W2ldLGE9ZVtsXTtmb3IoOzspe2Rve2krK313aGlsZShlW3RbaV1dPGEpO2Rve28tLX13aGlsZShlW3Rbb11dPmEpO2lmKG88aSlicmVhaztpaSh0LGksbyl9dFtuKzFdPXRbb10sdFtvXT1sLHItaSsxPj1vLW4/KHJpKHQsZSxpLHIpLHJpKHQsZSxuLG8tMSkpOihyaSh0LGUsbixvLTEpLHJpKHQsZSxpLHIpKX19ZnVuY3Rpb24gaWkodCxlLG4pe2NvbnN0IHI9dFtlXTt0W2VdPXRbbl0sdFtuXT1yfWZ1bmN0aW9uIG9pKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIGxpKHQpe3JldHVybiB0WzFdfWNsYXNzIGFpe2NvbnN0cnVjdG9yKCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbCx0aGlzLl89IiJ9bW92ZVRvKHQsZSl7dGhpcy5fKz1gTSR7dGhpcy5feDA9dGhpcy5feDE9K3R9LCR7dGhpcy5feTA9dGhpcy5feTE9K2V9YH1jbG9zZVBhdGgoKXtudWxsIT09dGhpcy5feDEmJih0aGlzLl94MT10aGlzLl94MCx0aGlzLl95MT10aGlzLl95MCx0aGlzLl8rPSJaIil9bGluZVRvKHQsZSl7dGhpcy5fKz1gTCR7dGhpcy5feDE9K3R9LCR7dGhpcy5feTE9K2V9YH1hcmModCxlLG4pe2NvbnN0IHI9KHQ9K3QpKyhuPStuKSxpPWU9K2U7aWYobjwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzIik7bnVsbD09PXRoaXMuX3gxP3RoaXMuXys9YE0ke3J9LCR7aX1gOihNYXRoLmFicyh0aGlzLl94MS1yKT4xZS02fHxNYXRoLmFicyh0aGlzLl95MS1pKT4xZS02KSYmKHRoaXMuXys9IkwiK3IrIiwiK2kpLG4mJih0aGlzLl8rPWBBJHtufSwke259LDAsMSwxLCR7dC1ufSwke2V9QSR7bn0sJHtufSwwLDEsMSwke3RoaXMuX3gxPXJ9LCR7dGhpcy5feTE9aX1gKX1yZWN0KHQsZSxuLHIpe3RoaXMuXys9YE0ke3RoaXMuX3gwPXRoaXMuX3gxPSt0fSwke3RoaXMuX3kwPXRoaXMuX3kxPStlfWgkeytufXYkeytyfWgkey1ufVpgfXZhbHVlKCl7cmV0dXJuIHRoaXMuX3x8bnVsbH19Y2xhc3Mgc2l7Y29uc3RydWN0b3IoKXt0aGlzLl89W119bW92ZVRvKHQsZSl7dGhpcy5fLnB1c2goW3QsZV0pfWNsb3NlUGF0aCgpe3RoaXMuXy5wdXNoKHRoaXMuX1swXS5zbGljZSgpKX1saW5lVG8odCxlKXt0aGlzLl8ucHVzaChbdCxlXSl9dmFsdWUoKXtyZXR1cm4gdGhpcy5fLmxlbmd0aD90aGlzLl86bnVsbH19Y2xhc3MgdWl7Y29uc3RydWN0b3IodCxbZSxuLHIsaV09WzAsMCw5NjAsNTAwXSl7aWYoISgocj0rcik+PShlPStlKSYmKGk9K2kpPj0obj0rbikpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBib3VuZHMiKTt0aGlzLmRlbGF1bmF5PXQsdGhpcy5fY2lyY3VtY2VudGVycz1uZXcgRmxvYXQ2NEFycmF5KDIqdC5wb2ludHMubGVuZ3RoKSx0aGlzLnZlY3RvcnM9bmV3IEZsb2F0NjRBcnJheSgyKnQucG9pbnRzLmxlbmd0aCksdGhpcy54bWF4PXIsdGhpcy54bWluPWUsdGhpcy55bWF4PWksdGhpcy55bWluPW4sdGhpcy5faW5pdCgpfXVwZGF0ZSgpe3JldHVybiB0aGlzLmRlbGF1bmF5LnVwZGF0ZSgpLHRoaXMuX2luaXQoKSx0aGlzfV9pbml0KCl7Y29uc3R7ZGVsYXVuYXk6e3BvaW50czp0LGh1bGw6ZSx0cmlhbmdsZXM6bn0sdmVjdG9yczpyfT10aGlzLGk9dGhpcy5jaXJjdW1jZW50ZXJzPXRoaXMuX2NpcmN1bWNlbnRlcnMuc3ViYXJyYXkoMCxuLmxlbmd0aC8zKjIpO2ZvcihsZXQgZSxyLG89MCxsPTAsYT1uLmxlbmd0aDtvPGE7bys9MyxsKz0yKXtjb25zdCBhPTIqbltvXSxzPTIqbltvKzFdLHU9MipuW28rMl0sYz10W2FdLGY9dFthKzFdLGg9dFtzXSxnPXRbcysxXSx2PXRbdV0sZD10W3UrMV0scD1oLWMseT1nLWYsXz12LWMsbT1kLWYsYj0yKihwKm0teSpfKTtpZihNYXRoLmFicyhiKTwxZS05KXtsZXQgaT0xZTk7Y29uc3Qgbz0yKm5bMF07aSo9TWF0aC5zaWduKCh0W29dLWMpKm0tKHRbbysxXS1mKSpfKSxlPShjK3YpLzItaSptLHI9KGYrZCkvMitpKl99ZWxzZXtjb25zdCB0PTEvYixuPXAqcCt5KnksaT1fKl8rbSptO2U9YysobSpuLXkqaSkqdCxyPWYrKHAqaS1fKm4pKnR9aVtsXT1lLGlbbCsxXT1yfWxldCBvLGwsYSxzPWVbZS5sZW5ndGgtMV0sdT00KnMsYz10WzIqc10sZj10WzIqcysxXTtyLmZpbGwoMCk7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDsrK24pcz1lW25dLG89dSxsPWMsYT1mLHU9NCpzLGM9dFsyKnNdLGY9dFsyKnMrMV0scltvKzJdPXJbdV09YS1mLHJbbyszXT1yW3UrMV09Yy1sfXJlbmRlcih0KXtjb25zdCBlPW51bGw9PXQ/dD1uZXcgYWk6dm9pZCAwLHtkZWxhdW5heTp7aGFsZmVkZ2VzOm4saW5lZGdlczpyLGh1bGw6aX0sY2lyY3VtY2VudGVyczpvLHZlY3RvcnM6bH09dGhpcztpZihpLmxlbmd0aDw9MSlyZXR1cm4gbnVsbDtmb3IobGV0IGU9MCxyPW4ubGVuZ3RoO2U8cjsrK2Upe2NvbnN0IHI9bltlXTtpZihyPGUpY29udGludWU7Y29uc3QgaT0yKk1hdGguZmxvb3IoZS8zKSxsPTIqTWF0aC5mbG9vcihyLzMpLGE9b1tpXSxzPW9baSsxXSx1PW9bbF0sYz1vW2wrMV07dGhpcy5fcmVuZGVyU2VnbWVudChhLHMsdSxjLHQpfWxldCBhLHM9aVtpLmxlbmd0aC0xXTtmb3IobGV0IGU9MDtlPGkubGVuZ3RoOysrZSl7YT1zLHM9aVtlXTtjb25zdCBuPTIqTWF0aC5mbG9vcihyW3NdLzMpLHU9b1tuXSxjPW9bbisxXSxmPTQqYSxoPXRoaXMuX3Byb2plY3QodSxjLGxbZisyXSxsW2YrM10pO2gmJnRoaXMuX3JlbmRlclNlZ21lbnQodSxjLGhbMF0saFsxXSx0KX1yZXR1cm4gZSYmZS52YWx1ZSgpfXJlbmRlckJvdW5kcyh0KXtjb25zdCBlPW51bGw9PXQ/dD1uZXcgYWk6dm9pZCAwO3JldHVybiB0LnJlY3QodGhpcy54bWluLHRoaXMueW1pbix0aGlzLnhtYXgtdGhpcy54bWluLHRoaXMueW1heC10aGlzLnltaW4pLGUmJmUudmFsdWUoKX1yZW5kZXJDZWxsKHQsZSl7Y29uc3Qgbj1udWxsPT1lP2U9bmV3IGFpOnZvaWQgMCxyPXRoaXMuX2NsaXAodCk7aWYobnVsbD09PXJ8fCFyLmxlbmd0aClyZXR1cm47ZS5tb3ZlVG8oclswXSxyWzFdKTtsZXQgaT1yLmxlbmd0aDtmb3IoO3JbMF09PT1yW2ktMl0mJnJbMV09PT1yW2ktMV0mJmk+MTspaS09Mjtmb3IobGV0IHQ9Mjt0PGk7dCs9MilyW3RdPT09clt0LTJdJiZyW3QrMV09PT1yW3QtMV18fGUubGluZVRvKHJbdF0sclt0KzFdKTtyZXR1cm4gZS5jbG9zZVBhdGgoKSxuJiZuLnZhbHVlKCl9KmNlbGxQb2x5Z29ucygpe2NvbnN0e2RlbGF1bmF5Ontwb2ludHM6dH19PXRoaXM7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aC8yO2U8bjsrK2Upe2NvbnN0IHQ9dGhpcy5jZWxsUG9seWdvbihlKTt0JiYodC5pbmRleD1lLHlpZWxkIHQpfX1jZWxsUG9seWdvbih0KXtjb25zdCBlPW5ldyBzaTtyZXR1cm4gdGhpcy5yZW5kZXJDZWxsKHQsZSksZS52YWx1ZSgpfV9yZW5kZXJTZWdtZW50KHQsZSxuLHIsaSl7bGV0IG87Y29uc3QgbD10aGlzLl9yZWdpb25jb2RlKHQsZSksYT10aGlzLl9yZWdpb25jb2RlKG4scik7MD09PWwmJjA9PT1hPyhpLm1vdmVUbyh0LGUpLGkubGluZVRvKG4scikpOihvPXRoaXMuX2NsaXBTZWdtZW50KHQsZSxuLHIsbCxhKSkmJihpLm1vdmVUbyhvWzBdLG9bMV0pLGkubGluZVRvKG9bMl0sb1szXSkpfWNvbnRhaW5zKHQsZSxuKXtyZXR1cm4oZT0rZSk9PWUmJihuPStuKT09biYmdGhpcy5kZWxhdW5heS5fc3RlcCh0LGUsbik9PT10fSpuZWlnaGJvcnModCl7Y29uc3QgZT10aGlzLl9jbGlwKHQpO2lmKGUpZm9yKGNvbnN0IG4gb2YgdGhpcy5kZWxhdW5heS5uZWlnaGJvcnModCkpe2NvbnN0IHQ9dGhpcy5fY2xpcChuKTtpZih0KXQ6Zm9yKGxldCByPTAsaT1lLmxlbmd0aDtyPGk7cis9Milmb3IobGV0IG89MCxsPXQubGVuZ3RoO288bDtvKz0yKWlmKGVbcl09PXRbb10mJmVbcisxXT09dFtvKzFdJiZlWyhyKzIpJWldPT10WyhvK2wtMiklbF0mJmVbKHIrMyklaV09PXRbKG8rbC0xKSVsXSl7eWllbGQgbjticmVhayB0fX19X2NlbGwodCl7Y29uc3R7Y2lyY3VtY2VudGVyczplLGRlbGF1bmF5OntpbmVkZ2VzOm4saGFsZmVkZ2VzOnIsdHJpYW5nbGVzOml9fT10aGlzLG89blt0XTtpZigtMT09PW8pcmV0dXJuIG51bGw7Y29uc3QgbD1bXTtsZXQgYT1vO2Rve2NvbnN0IG49TWF0aC5mbG9vcihhLzMpO2lmKGwucHVzaChlWzIqbl0sZVsyKm4rMV0pLGE9YSUzPT0yP2EtMjphKzEsaVthXSE9PXQpYnJlYWs7YT1yW2FdfXdoaWxlKGEhPT1vJiYtMSE9PWEpO3JldHVybiBsfV9jbGlwKHQpe2lmKDA9PT10JiYxPT09dGhpcy5kZWxhdW5heS5odWxsLmxlbmd0aClyZXR1cm5bdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1pbl07Y29uc3QgZT10aGlzLl9jZWxsKHQpO2lmKG51bGw9PT1lKXJldHVybiBudWxsO2NvbnN0e3ZlY3RvcnM6bn09dGhpcyxyPTQqdDtyZXR1cm4gbltyXXx8bltyKzFdP3RoaXMuX2NsaXBJbmZpbml0ZSh0LGUsbltyXSxuW3IrMV0sbltyKzJdLG5bciszXSk6dGhpcy5fY2xpcEZpbml0ZSh0LGUpfV9jbGlwRmluaXRlKHQsZSl7Y29uc3Qgbj1lLmxlbmd0aDtsZXQgcixpLG8sbCxhPW51bGwscz1lW24tMl0sdT1lW24tMV0sYz10aGlzLl9yZWdpb25jb2RlKHMsdSksZj0wO2ZvcihsZXQgaD0wO2g8bjtoKz0yKWlmKHI9cyxpPXUscz1lW2hdLHU9ZVtoKzFdLG89YyxjPXRoaXMuX3JlZ2lvbmNvZGUocyx1KSwwPT09byYmMD09PWMpbD1mLGY9MCxhP2EucHVzaChzLHUpOmE9W3MsdV07ZWxzZXtsZXQgZSxuLGgsZyx2O2lmKDA9PT1vKXtpZihudWxsPT09KGU9dGhpcy5fY2xpcFNlZ21lbnQocixpLHMsdSxvLGMpKSljb250aW51ZTtbbixoLGcsdl09ZX1lbHNle2lmKG51bGw9PT0oZT10aGlzLl9jbGlwU2VnbWVudChzLHUscixpLGMsbykpKWNvbnRpbnVlO1tnLHYsbixoXT1lLGw9ZixmPXRoaXMuX2VkZ2Vjb2RlKG4saCksbCYmZiYmdGhpcy5fZWRnZSh0LGwsZixhLGEubGVuZ3RoKSxhP2EucHVzaChuLGgpOmE9W24saF19bD1mLGY9dGhpcy5fZWRnZWNvZGUoZyx2KSxsJiZmJiZ0aGlzLl9lZGdlKHQsbCxmLGEsYS5sZW5ndGgpLGE/YS5wdXNoKGcsdik6YT1bZyx2XX1pZihhKWw9ZixmPXRoaXMuX2VkZ2Vjb2RlKGFbMF0sYVsxXSksbCYmZiYmdGhpcy5fZWRnZSh0LGwsZixhLGEubGVuZ3RoKTtlbHNlIGlmKHRoaXMuY29udGFpbnModCwodGhpcy54bWluK3RoaXMueG1heCkvMiwodGhpcy55bWluK3RoaXMueW1heCkvMikpcmV0dXJuW3RoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltaW5dO3JldHVybiBhfV9jbGlwU2VnbWVudCh0LGUsbixyLGksbyl7Zm9yKDs7KXtpZigwPT09aSYmMD09PW8pcmV0dXJuW3QsZSxuLHJdO2lmKGkmbylyZXR1cm4gbnVsbDtsZXQgbCxhLHM9aXx8bzs4JnM/KGw9dCsobi10KSoodGhpcy55bWF4LWUpLyhyLWUpLGE9dGhpcy55bWF4KTo0JnM/KGw9dCsobi10KSoodGhpcy55bWluLWUpLyhyLWUpLGE9dGhpcy55bWluKToyJnM/KGE9ZSsoci1lKSoodGhpcy54bWF4LXQpLyhuLXQpLGw9dGhpcy54bWF4KTooYT1lKyhyLWUpKih0aGlzLnhtaW4tdCkvKG4tdCksbD10aGlzLnhtaW4pLGk/KHQ9bCxlPWEsaT10aGlzLl9yZWdpb25jb2RlKHQsZSkpOihuPWwscj1hLG89dGhpcy5fcmVnaW9uY29kZShuLHIpKX19X2NsaXBJbmZpbml0ZSh0LGUsbixyLGksbyl7bGV0IGwsYT1BcnJheS5mcm9tKGUpO2lmKChsPXRoaXMuX3Byb2plY3QoYVswXSxhWzFdLG4scikpJiZhLnVuc2hpZnQobFswXSxsWzFdKSwobD10aGlzLl9wcm9qZWN0KGFbYS5sZW5ndGgtMl0sYVthLmxlbmd0aC0xXSxpLG8pKSYmYS5wdXNoKGxbMF0sbFsxXSksYT10aGlzLl9jbGlwRmluaXRlKHQsYSkpZm9yKGxldCBlLG49MCxyPWEubGVuZ3RoLGk9dGhpcy5fZWRnZWNvZGUoYVtyLTJdLGFbci0xXSk7bjxyO24rPTIpZT1pLGk9dGhpcy5fZWRnZWNvZGUoYVtuXSxhW24rMV0pLGUmJmkmJihuPXRoaXMuX2VkZ2UodCxlLGksYSxuKSxyPWEubGVuZ3RoKTtlbHNlIHRoaXMuY29udGFpbnModCwodGhpcy54bWluK3RoaXMueG1heCkvMiwodGhpcy55bWluK3RoaXMueW1heCkvMikmJihhPVt0aGlzLnhtaW4sdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4XSk7cmV0dXJuIGF9X2VkZ2UodCxlLG4scixpKXtmb3IoO2UhPT1uOyl7bGV0IG4sbztzd2l0Y2goZSl7Y2FzZSA1OmU9NDtjb250aW51ZTtjYXNlIDQ6ZT02LG49dGhpcy54bWF4LG89dGhpcy55bWluO2JyZWFrO2Nhc2UgNjplPTI7Y29udGludWU7Y2FzZSAyOmU9MTAsbj10aGlzLnhtYXgsbz10aGlzLnltYXg7YnJlYWs7Y2FzZSAxMDplPTg7Y29udGludWU7Y2FzZSA4OmU9OSxuPXRoaXMueG1pbixvPXRoaXMueW1heDticmVhaztjYXNlIDk6ZT0xO2NvbnRpbnVlO2Nhc2UgMTplPTUsbj10aGlzLnhtaW4sbz10aGlzLnltaW59cltpXT09PW4mJnJbaSsxXT09PW98fCF0aGlzLmNvbnRhaW5zKHQsbixvKXx8KHIuc3BsaWNlKGksMCxuLG8pLGkrPTIpfWlmKHIubGVuZ3RoPjQpZm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0Kz0yKXtjb25zdCBlPSh0KzIpJXIubGVuZ3RoLG49KHQrNCklci5sZW5ndGg7KHJbdF09PT1yW2VdJiZyW2VdPT09cltuXXx8clt0KzFdPT09cltlKzFdJiZyW2UrMV09PT1yW24rMV0pJiYoci5zcGxpY2UoZSwyKSx0LT0yKX1yZXR1cm4gaX1fcHJvamVjdCh0LGUsbixyKXtsZXQgaSxvLGwsYT0xLzA7aWYocjwwKXtpZihlPD10aGlzLnltaW4pcmV0dXJuIG51bGw7KGk9KHRoaXMueW1pbi1lKS9yKTxhJiYobD10aGlzLnltaW4sbz10KyhhPWkpKm4pfWVsc2UgaWYocj4wKXtpZihlPj10aGlzLnltYXgpcmV0dXJuIG51bGw7KGk9KHRoaXMueW1heC1lKS9yKTxhJiYobD10aGlzLnltYXgsbz10KyhhPWkpKm4pfWlmKG4+MCl7aWYodD49dGhpcy54bWF4KXJldHVybiBudWxsOyhpPSh0aGlzLnhtYXgtdCkvbik8YSYmKG89dGhpcy54bWF4LGw9ZSsoYT1pKSpyKX1lbHNlIGlmKG48MCl7aWYodDw9dGhpcy54bWluKXJldHVybiBudWxsOyhpPSh0aGlzLnhtaW4tdCkvbik8YSYmKG89dGhpcy54bWluLGw9ZSsoYT1pKSpyKX1yZXR1cm5bbyxsXX1fZWRnZWNvZGUodCxlKXtyZXR1cm4odD09PXRoaXMueG1pbj8xOnQ9PT10aGlzLnhtYXg/MjowKXwoZT09PXRoaXMueW1pbj80OmU9PT10aGlzLnltYXg/ODowKX1fcmVnaW9uY29kZSh0LGUpe3JldHVybih0PHRoaXMueG1pbj8xOnQ+dGhpcy54bWF4PzI6MCl8KGU8dGhpcy55bWluPzQ6ZT50aGlzLnltYXg/ODowKX19Y29uc3QgY2k9MipNYXRoLlBJLGZpPU1hdGgucG93O2Z1bmN0aW9uIGhpKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIGdpKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIHZpKHQsZSxuKXtyZXR1cm5bdCtNYXRoLnNpbih0K2UpKm4sZStNYXRoLmNvcyh0LWUpKm5dfWNsYXNzIGRpe3N0YXRpYyBmcm9tKHQsZT1oaSxuPWdpLHIpe3JldHVybiBuZXcgZGkoImxlbmd0aCJpbiB0P2Z1bmN0aW9uKHQsZSxuLHIpe2NvbnN0IGk9dC5sZW5ndGgsbz1uZXcgRmxvYXQ2NEFycmF5KDIqaSk7Zm9yKGxldCBsPTA7bDxpOysrbCl7Y29uc3QgaT10W2xdO29bMipsXT1lLmNhbGwocixpLGwsdCksb1syKmwrMV09bi5jYWxsKHIsaSxsLHQpfXJldHVybiBvfSh0LGUsbixyKTpGbG9hdDY0QXJyYXkuZnJvbShmdW5jdGlvbioodCxlLG4scil7bGV0IGk9MDtmb3IoY29uc3QgbyBvZiB0KXlpZWxkIGUuY2FsbChyLG8saSx0KSx5aWVsZCBuLmNhbGwocixvLGksdCksKytpfSh0LGUsbixyKSkpfWNvbnN0cnVjdG9yKHQpe3RoaXMuX2RlbGF1bmF0b3I9bmV3IFFyKHQpLHRoaXMuaW5lZGdlcz1uZXcgSW50MzJBcnJheSh0Lmxlbmd0aC8yKSx0aGlzLl9odWxsSW5kZXg9bmV3IEludDMyQXJyYXkodC5sZW5ndGgvMiksdGhpcy5wb2ludHM9dGhpcy5fZGVsYXVuYXRvci5jb29yZHMsdGhpcy5faW5pdCgpfXVwZGF0ZSgpe3JldHVybiB0aGlzLl9kZWxhdW5hdG9yLnVwZGF0ZSgpLHRoaXMuX2luaXQoKSx0aGlzfV9pbml0KCl7Y29uc3QgdD10aGlzLl9kZWxhdW5hdG9yLGU9dGhpcy5wb2ludHM7aWYodC5odWxsJiZ0Lmh1bGwubGVuZ3RoPjImJmZ1bmN0aW9uKHQpe2NvbnN0e3RyaWFuZ2xlczplLGNvb3JkczpufT10O2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCs9Myl7Y29uc3Qgcj0yKmVbdF0saT0yKmVbdCsxXSxvPTIqZVt0KzJdO2lmKChuW29dLW5bcl0pKihuW2krMV0tbltyKzFdKS0obltpXS1uW3JdKSoobltvKzFdLW5bcisxXSk+MWUtMTApcmV0dXJuITF9cmV0dXJuITB9KHQpKXt0aGlzLmNvbGxpbmVhcj1JbnQzMkFycmF5LmZyb20oe2xlbmd0aDplLmxlbmd0aC8yfSwoKHQsZSk9PmUpKS5zb3J0KCgodCxuKT0+ZVsyKnRdLWVbMipuXXx8ZVsyKnQrMV0tZVsyKm4rMV0pKTtjb25zdCB0PXRoaXMuY29sbGluZWFyWzBdLG49dGhpcy5jb2xsaW5lYXJbdGhpcy5jb2xsaW5lYXIubGVuZ3RoLTFdLHI9W2VbMip0XSxlWzIqdCsxXSxlWzIqbl0sZVsyKm4rMV1dLGk9MWUtOCpNYXRoLmh5cG90KHJbM10tclsxXSxyWzJdLXJbMF0pO2ZvcihsZXQgdD0wLG49ZS5sZW5ndGgvMjt0PG47Kyt0KXtjb25zdCBuPXZpKGVbMip0XSxlWzIqdCsxXSxpKTtlWzIqdF09blswXSxlWzIqdCsxXT1uWzFdfXRoaXMuX2RlbGF1bmF0b3I9bmV3IFFyKGUpfWVsc2UgZGVsZXRlIHRoaXMuY29sbGluZWFyO2NvbnN0IG49dGhpcy5oYWxmZWRnZXM9dGhpcy5fZGVsYXVuYXRvci5oYWxmZWRnZXMscj10aGlzLmh1bGw9dGhpcy5fZGVsYXVuYXRvci5odWxsLGk9dGhpcy50cmlhbmdsZXM9dGhpcy5fZGVsYXVuYXRvci50cmlhbmdsZXMsbz10aGlzLmluZWRnZXMuZmlsbCgtMSksbD10aGlzLl9odWxsSW5kZXguZmlsbCgtMSk7Zm9yKGxldCB0PTAsZT1uLmxlbmd0aDt0PGU7Kyt0KXtjb25zdCBlPWlbdCUzPT0yP3QtMjp0KzFdOy0xIT09blt0XSYmLTEhPT1vW2VdfHwob1tlXT10KX1mb3IobGV0IHQ9MCxlPXIubGVuZ3RoO3Q8ZTsrK3QpbFtyW3RdXT10O3IubGVuZ3RoPD0yJiZyLmxlbmd0aD4wJiYodGhpcy50cmlhbmdsZXM9bmV3IEludDMyQXJyYXkoMykuZmlsbCgtMSksdGhpcy5oYWxmZWRnZXM9bmV3IEludDMyQXJyYXkoMykuZmlsbCgtMSksdGhpcy50cmlhbmdsZXNbMF09clswXSxvW3JbMF1dPTEsMj09PXIubGVuZ3RoJiYob1tyWzFdXT0wLHRoaXMudHJpYW5nbGVzWzFdPXJbMV0sdGhpcy50cmlhbmdsZXNbMl09clsxXSkpfXZvcm9ub2kodCl7cmV0dXJuIG5ldyB1aSh0aGlzLHQpfSpuZWlnaGJvcnModCl7Y29uc3R7aW5lZGdlczplLGh1bGw6bixfaHVsbEluZGV4OnIsaGFsZmVkZ2VzOmksdHJpYW5nbGVzOm8sY29sbGluZWFyOmx9PXRoaXM7aWYobCl7Y29uc3QgZT1sLmluZGV4T2YodCk7cmV0dXJuIGU+MCYmKHlpZWxkIGxbZS0xXSksdm9pZChlPGwubGVuZ3RoLTEmJih5aWVsZCBsW2UrMV0pKX1jb25zdCBhPWVbdF07aWYoLTE9PT1hKXJldHVybjtsZXQgcz1hLHU9LTE7ZG97aWYoeWllbGQgdT1vW3NdLHM9cyUzPT0yP3MtMjpzKzEsb1tzXSE9PXQpcmV0dXJuO2lmKHM9aVtzXSwtMT09PXMpe2NvbnN0IGU9blsoclt0XSsxKSVuLmxlbmd0aF07cmV0dXJuIHZvaWQoZSE9PXUmJih5aWVsZCBlKSl9fXdoaWxlKHMhPT1hKX1maW5kKHQsZSxuPTApe2lmKCh0PSt0KSE9dHx8KGU9K2UpIT1lKXJldHVybi0xO2NvbnN0IHI9bjtsZXQgaTtmb3IoOyhpPXRoaXMuX3N0ZXAobix0LGUpKT49MCYmaSE9PW4mJmkhPT1yOyluPWk7cmV0dXJuIGl9X3N0ZXAodCxlLG4pe2NvbnN0e2luZWRnZXM6cixodWxsOmksX2h1bGxJbmRleDpvLGhhbGZlZGdlczpsLHRyaWFuZ2xlczphLHBvaW50czpzfT10aGlzO2lmKC0xPT09clt0XXx8IXMubGVuZ3RoKXJldHVybih0KzEpJShzLmxlbmd0aD4+MSk7bGV0IHU9dCxjPWZpKGUtc1syKnRdLDIpK2ZpKG4tc1syKnQrMV0sMik7Y29uc3QgZj1yW3RdO2xldCBoPWY7ZG97bGV0IHI9YVtoXTtjb25zdCBmPWZpKGUtc1syKnJdLDIpK2ZpKG4tc1syKnIrMV0sMik7aWYoZjxjJiYoYz1mLHU9ciksaD1oJTM9PTI/aC0yOmgrMSxhW2hdIT09dClicmVhaztpZihoPWxbaF0sLTE9PT1oKXtpZihoPWlbKG9bdF0rMSklaS5sZW5ndGhdLGghPT1yJiZmaShlLXNbMipoXSwyKStmaShuLXNbMipoKzFdLDIpPGMpcmV0dXJuIGg7YnJlYWt9fXdoaWxlKGghPT1mKTtyZXR1cm4gdX1yZW5kZXIodCl7Y29uc3QgZT1udWxsPT10P3Q9bmV3IGFpOnZvaWQgMCx7cG9pbnRzOm4saGFsZmVkZ2VzOnIsdHJpYW5nbGVzOml9PXRoaXM7Zm9yKGxldCBlPTAsbz1yLmxlbmd0aDtlPG87KytlKXtjb25zdCBvPXJbZV07aWYobzxlKWNvbnRpbnVlO2NvbnN0IGw9MippW2VdLGE9MippW29dO3QubW92ZVRvKG5bbF0sbltsKzFdKSx0LmxpbmVUbyhuW2FdLG5bYSsxXSl9cmV0dXJuIHRoaXMucmVuZGVySHVsbCh0KSxlJiZlLnZhbHVlKCl9cmVuZGVyUG9pbnRzKHQsZSl7dm9pZCAwIT09ZXx8dCYmImZ1bmN0aW9uIj09dHlwZW9mIHQubW92ZVRvfHwoZT10LHQ9bnVsbCksZT1udWxsPT1lPzI6K2U7Y29uc3Qgbj1udWxsPT10P3Q9bmV3IGFpOnZvaWQgMCx7cG9pbnRzOnJ9PXRoaXM7Zm9yKGxldCBuPTAsaT1yLmxlbmd0aDtuPGk7bis9Mil7Y29uc3QgaT1yW25dLG89cltuKzFdO3QubW92ZVRvKGkrZSxvKSx0LmFyYyhpLG8sZSwwLGNpKX1yZXR1cm4gbiYmbi52YWx1ZSgpfXJlbmRlckh1bGwodCl7Y29uc3QgZT1udWxsPT10P3Q9bmV3IGFpOnZvaWQgMCx7aHVsbDpuLHBvaW50czpyfT10aGlzLGk9MipuWzBdLG89bi5sZW5ndGg7dC5tb3ZlVG8ocltpXSxyW2krMV0pO2ZvcihsZXQgZT0xO2U8bzsrK2Upe2NvbnN0IGk9MipuW2VdO3QubGluZVRvKHJbaV0scltpKzFdKX1yZXR1cm4gdC5jbG9zZVBhdGgoKSxlJiZlLnZhbHVlKCl9aHVsbFBvbHlnb24oKXtjb25zdCB0PW5ldyBzaTtyZXR1cm4gdGhpcy5yZW5kZXJIdWxsKHQpLHQudmFsdWUoKX1yZW5kZXJUcmlhbmdsZSh0LGUpe2NvbnN0IG49bnVsbD09ZT9lPW5ldyBhaTp2b2lkIDAse3BvaW50czpyLHRyaWFuZ2xlczppfT10aGlzLG89MippW3QqPTNdLGw9MippW3QrMV0sYT0yKmlbdCsyXTtyZXR1cm4gZS5tb3ZlVG8ocltvXSxyW28rMV0pLGUubGluZVRvKHJbbF0scltsKzFdKSxlLmxpbmVUbyhyW2FdLHJbYSsxXSksZS5jbG9zZVBhdGgoKSxuJiZuLnZhbHVlKCl9KnRyaWFuZ2xlUG9seWdvbnMoKXtjb25zdHt0cmlhbmdsZXM6dH09dGhpcztmb3IobGV0IGU9MCxuPXQubGVuZ3RoLzM7ZTxuOysrZSl5aWVsZCB0aGlzLnRyaWFuZ2xlUG9seWdvbihlKX10cmlhbmdsZVBvbHlnb24odCl7Y29uc3QgZT1uZXcgc2k7cmV0dXJuIHRoaXMucmVuZGVyVHJpYW5nbGUodCxlKSxlLnZhbHVlKCl9fWZ1bmN0aW9uIHBpKHQsZSxuPXt9KXtpZighTG4odCkpcmV0dXJue2VycjoicHNTcmMgaXMgbm90IGFuIGFycmF5In07aWYoIUNuKGUpJiYhTG4oZSkpcmV0dXJue2VycjoicHNUYXIgaXMgbm90IGFuIG9iamVjdCBvciBhcnJheSJ9O2xldCByPUNuKGUpO3ImJihlPVtlXSk7bGV0IGk9TXQobiwia2V5WCIpO1R0KGkpfHwoaT0ieCIpO2xldCBvPU10KG4sImtleVkiKTtUdChvKXx8KG89InkiKTtsZXQgbD1NdChuLCJrZXlaIik7VHQobCl8fChsPSJ6Iik7bGV0IGE9TXQobiwic2NhbGUiKTtpZihEbihhKXx8KGE9MSksYT1RbihhKSx0PW5yKHQsbiksMD09PUVuKHQpKXJldHVybntlcnI6InBzU3JjIGhhcyBubyBlZmZlY3RpdmUgZGF0YSJ9O2lmKGU9ZXIoZSxuKSwwPT09RW4oZSkpcmV0dXJue2VycjoicHNUYXIgaGFzIG5vIGVmZmVjdGl2ZSBkYXRhIn07bGV0IHM9eHIodCx7c2NhbGU6YX0pO3Q9cy5wcztsZXQgdT1zLm52LGM9cy5pbnYsZj1bLi4udF0saD1bLi4udF0sZz17fTt1ZSh0LCh0PT57bGV0IGU9YCR7dC54fS0ke3QueX1gO2dbZV09dC56fSkpO2xldCB2LGQ9ZGkuZnJvbShoLCh0PT50LngpLCh0PT50LnkpKSxwPVswLDAsYSxhXSx5PWQudm9yb25vaShwKSxfPShlLG4scik9PntsZXQgaT1bLi4udF0sbz17eDpuLHk6cix6OjB9O2kucHVzaChvKSxlLnB1c2gobyk7bGV0IGw9ZGkuZnJvbShpLCh0PT50LngpLCh0PT50LnkpKS52b3Jvbm9pKHApLGE9aS5sZW5ndGgtMSxzPWwuY2VsbFBvbHlnb24oYSksdT1NcihzKSxjPW51bGw7aWYodT4wKXtsZXQgdD1bXSxuPWwuZGVsYXVuYXkubmVpZ2hib3JzKGEpLHI9bi5uZXh0KCk7Zm9yKDshci5kb25lOyl7bGV0IGU9ci52YWx1ZTt0LnB1c2goZSkscj1uLm5leHQoKX1sZXQgaT1wbih0LCh0PT57bGV0IGU9W3NdLG49W3kuY2VsbFBvbHlnb24odCldLHI9W107dHJ5e3I9ZnVuY3Rpb24odCxlKXtpZighTG4odCkpcmV0dXJuIG51bGw7aWYoIUxuKGUpKXJldHVybiBudWxsO3Q9U3IodCksZT1TcihlKTtsZXQgbj1Eci5pbnRlcnNlY3Qoe3JlZ2lvbnM6dH0se3JlZ2lvbnM6ZX0pO3JldHVybiBNdChuLCJyZWdpb25zIixbXSl9KGUsbil9Y2F0Y2godCl7Y29uc29sZS5sb2coInBnczEiLGUpLGNvbnNvbGUubG9nKCJwZ3MyIixuKSxjb25zb2xlLmxvZyh0KX1sZXQgaT0wO2lmKDE9PT1FbihyKSl0cnl7aT1NcihyWzBdKX1jYXRjaCh0KXtjb25zb2xlLmxvZygiaW50cyIsciksY29uc29sZS5sb2codCl9cmV0dXJue2lhOmksaWR4OnR9fSkpO2M9cG4oaSwodD0+dC5pYS91KmVbdC5pZHhdLnopKSxjPV9uKGMpfXJldHVybiBlW2UubGVuZ3RoLTFdLno9YyxjfSxtPSh0LGUpPT57bGV0IG49YCR7dH0tJHtlfWA7aWYodHIoZyxuKSlyZXR1cm4gZ1tuXTtpZih0PHBbMF18fHQ+cFsyXXx8ZTxwWzFdfHxlPnBbM10pcmV0dXJuIG51bGw7bGV0IHI9KCh0LGUsbik9PntsZXQgcjt0cnl7cj1fKHQsZSxuKX1jYXRjaChlKXtjb25zb2xlLmxvZyhlKSxyPW51bGwsdC5wb3AoKX1yZXR1cm4gcn0pKGYsdCxlKTtyZXR1cm4gZ1tuXT1yLHJ9LGI9dD0+e2xldCBlPXQueCxuPXUoZSwwKTtpZighTm4obikpdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG54WyR7bn1dYCk7bGV0IHI9dC55LGE9dShyLDEpO2lmKCFObihhKSl0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgbnlbJHthfV1gKTtsZXQgcz1tKG4sYSksZj1jKHMsMik7cmV0dXJuIE5uKGYpfHwoZj1udWxsKSx7W2ldOmUsW29dOnIsW2xdOmZ9fTtpZihyKXtsZXQgdD1lWzBdO3Y9Yih0KX1lbHNlIHY9W10sdWUoZSwodD0+e3YucHVzaChiKHQpKX0pKTtyZXR1cm4gdn1sZXQgeWk9e30sX2k9ZnVuY3Rpb24odCxlKXtsZXQgbj1bXTtmb3IobGV0IHI9MDtyPGU7cisrKW4ucHVzaCh0KTtyZXR1cm4gbn0sbWk9ZnVuY3Rpb24odCxlKXtsZXQgbj1faSgwLGUqZSk7Zm9yKGxldCByPTA7cjxlO3IrKyluW3IqZStyXT10O3JldHVybiBufSxiaT1mdW5jdGlvbih0LGUsbixyKXtsZXQgaSxvLGw9QXJyYXkobipyKTtmb3IoaT0wO2k8bjtpKyspZm9yKG89MDtvPHI7bysrKWxbaSpyK29dPXRbaSpyK29dK2VbaSpyK29dO3JldHVybiBsfSx4aT1mdW5jdGlvbih0LGUsbixyLGkpe2xldCBvLGwsYSxzPUFycmF5KG4qaSk7Zm9yKG89MDtvPG47bysrKWZvcihsPTA7bDxpO2wrKylmb3Ioc1tvKmkrbF09MCxhPTA7YTxyO2ErKylzW28qaStsXSs9dFtvKnIrYV0qZVthKmkrbF07cmV0dXJuIHN9LHdpPWZ1bmN0aW9uKHQsZSl7bGV0IG4scixpLG89QXJyYXkoZSk7Zm9yKG49MDtuPGU7bisrKW9bbl09dFtuKmUrbl07Zm9yKG49MDtuPGU7bisrKXtmb3Iocj0wO3I8bjtyKyspb1tuXS09dFtuKmUrcl0qdFtuKmUrcl07aWYob1tuXTw9MClyZXR1cm4hMTtmb3Iob1tuXT1NYXRoLnNxcnQob1tuXSkscj1uKzE7cjxlO3IrKyl7Zm9yKGk9MDtpPG47aSsrKXRbciplK25dLT10W3IqZStpXSp0W24qZStpXTt0W3IqZStuXS89b1tuXX19Zm9yKG49MDtuPGU7bisrKXRbbiplK25dPW9bbl07cmV0dXJuITB9LGppPWZ1bmN0aW9uKHQsZSl7bGV0IG4scixpLG87Zm9yKG49MDtuPGU7bisrKWZvcih0W24qZStuXT0xL3RbbiplK25dLHI9bisxO3I8ZTtyKyspe2ZvcihvPTAsaT1uO2k8cjtpKyspby09dFtyKmUraV0qdFtpKmUrbl07dFtyKmUrbl09by90W3IqZStyXX1mb3Iobj0wO248ZTtuKyspZm9yKHI9bisxO3I8ZTtyKyspdFtuKmUrcl09MDtmb3Iobj0wO248ZTtuKyspe2Zvcih0W24qZStuXSo9dFtuKmUrbl0saT1uKzE7aTxlO2krKyl0W24qZStuXSs9dFtpKmUrbl0qdFtpKmUrbl07Zm9yKHI9bisxO3I8ZTtyKyspZm9yKGk9cjtpPGU7aSsrKXRbbiplK3JdKz10W2kqZStuXSp0W2kqZStyXX1mb3Iobj0wO248ZTtuKyspZm9yKHI9MDtyPG47cisrKXRbbiplK3JdPXRbciplK25dfSxBaT1mdW5jdGlvbih0LGUpe2xldCBuLHIsaSxvLGwsYSxzLHUsYyxmLGgsZz1lLHY9QXJyYXkoZSplKSxkPUFycmF5KGUpLHA9QXJyYXkoZSkseT1BcnJheShlKTtmb3Iobj0wO248ZTtuKyspZm9yKG89MDtvPGU7bysrKXZbbiplK29dPW49PT1vPzE6MDtmb3Iobz0wO288ZTtvKyspeVtvXT0wO2ZvcihuPTA7bjxlO24rKyl7Zm9yKHU9MCxvPTA7bzxlO28rKylpZigxIT09eVtvXSlmb3IobD0wO2w8ZTtsKyspMD09PXlbbF0mJk1hdGguYWJzKHRbbyplK2xdKT49dSYmKHU9TWF0aC5hYnModFtvKmUrbF0pLGk9byxyPWwpO2lmKCsreVtyXSxpIT09cil7Zm9yKGE9MDthPGU7YSsrKWg9dFtpKmUrYV0sdFtpKmUrYV09dFtyKmUrYV0sdFtyKmUrYV09aDtmb3IoYT0wO2E8ZzthKyspaD12W2kqZSthXSx2W2kqZSthXT12W3IqZSthXSx2W3IqZSthXT1ofWlmKHBbbl09aSxkW25dPXIsMD09PXRbciplK3JdKXJldHVybiExO2ZvcihmPTEvdFtyKmUrcl0sdFtyKmUrcl09MSxhPTA7YTxlO2ErKyl0W3IqZSthXSo9Zjtmb3IoYT0wO2E8ZzthKyspdltyKmUrYV0qPWY7Zm9yKHM9MDtzPGU7cysrKWlmKHMhPT1yKXtmb3IoYz10W3MqZStyXSx0W3MqZStyXT0wLGE9MDthPGU7YSsrKXRbcyplK2FdLT10W3IqZSthXSpjO2ZvcihhPTA7YTxnO2ErKyl2W3MqZSthXS09dltyKmUrYV0qY319Zm9yKGE9ZS0xO2E+PTA7YS0tKWlmKHBbYV0hPT1kW2FdKWZvcihsPTA7bDxlO2wrKyloPXRbbCplK3BbYV1dLHRbbCplK3BbYV1dPXRbbCplK2RbYV1dLHRbbCplK2RbYV1dPWg7cmV0dXJuITB9LE9pPWZ1bmN0aW9uKHQsZSxuLHIsaSl7cmV0dXJuIGUrKHItZSkvbiooMS1NYXRoLmV4cCgtMS9pKk1hdGgucG93KHQvbiwyKSkpfSxTaT1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiBlKyhyLWUpL24qKDEtTWF0aC5leHAoLTEvaSoodC9uKSkpfSxNaT1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiB0Pm4/ZSsoci1lKS9uOmUrKHItZSkvbioodC9uKjEuNS0uNSpNYXRoLnBvdyh0L24sMykpfTtmdW5jdGlvbiBQaSh0LGUsbj17fSl7aWYoIUxuKHQpKXJldHVybntlcnI6InBzU3JjIGlzIG5vdCBhbiBhcnJheSJ9O2lmKCFDbihlKSYmIUxuKGUpKXJldHVybntlcnI6InBzVGFyIGlzIG5vdCBhbiBvYmplY3Qgb3IgYXJyYXkifTtsZXQgcj1DbihlKTtyJiYoZT1bZV0pO2xldCBpPU10KG4sImtleVgiKTtUdChpKXx8KGk9IngiKTtsZXQgbz1NdChuLCJrZXlZIik7VHQobyl8fChvPSJ5Iik7bGV0IGw9TXQobiwia2V5WiIpO1R0KGwpfHwobD0ieiIpO2xldCBhPU10KG4sInNjYWxlIik7RG4oYSl8fChhPTEpLGE9UW4oYSk7bGV0IHM9TXQobiwibW9kZWwiKTsiZXhwb25lbnRpYWwiIT09cyYmImdhdXNzaWFuIiE9PXMmJiJzcGhlcmljYWwiIT09cyYmKHM9ImV4cG9uZW50aWFsIik7bGV0IHU9TXQobiwic2lnbWEyIik7RG4odSl8fCh1PTApLHU9UW4odSk7bGV0IGM9TXQobiwiYWxwaGEiKTtEbihjKXx8KGM9MTAwKSxjPVFuKGMpO2xldCBmPU10KG4sInJldHVybldpdGhWYXJpb2dyYW0iKTtpZihrdChmKXx8KGY9ITEpLHQ9bnIodCxuKSwwPT09RW4odCkpcmV0dXJue2VycjoicHNTcmMgaGFzIG5vIGVmZmVjdGl2ZSBkYXRhIn07aWYoZT1lcihlLG4pLDA9PT1FbihlKSlyZXR1cm57ZXJyOiJwc1RhciBoYXMgbm8gZWZmZWN0aXZlIGRhdGEifTtsZXQgaD14cih0LHtzY2FsZTphfSk7dD1oLnBzO2xldCBnPWgubnYsdj1oLmludixkPXt9O3VlKHQsKHQ9PntsZXQgZT1gJHt0Lnh9LSR7dC55fWA7ZFtlXT10Lnp9KSk7bGV0IHA9W10seT1bXSxfPVtdO3VlKHQsKHQ9PntwLnB1c2godC54KSx5LnB1c2godC55KSxfLnB1c2godC56KX0pKTtsZXQgbSxiPXlpLnRyYWluKF8scCx5LHMsdSxjKSx4PXQ9PntsZXQgZT10Lngsbj1nKGUsMCk7aWYoIU5uKG4pKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBueFske259XWApO2xldCByPXQueSxhPWcociwxKTtpZighTm4oYSkpdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG55WyR7YX1dYCk7bGV0IHM9KCh0LGUpPT57bGV0IG49YCR7dH0tJHtlfWA7aWYodHIoZCxuKSlyZXR1cm4gZFtuXTtsZXQgcj15aS5wcmVkaWN0KHQsZSxiKTtyZXR1cm4gZFtuXT1yLHJ9KShuLGEpLHU9dihzLDIpO3JldHVybiBObih1KXx8KHU9bnVsbCkse1tpXTplLFtvXTpyLFtsXTp1fX07aWYocil7bGV0IHQ9ZVswXTttPXgodCl9ZWxzZSBtPVtdLHVlKGUsKHQ9PnttLnB1c2goeCh0KSl9KSk7cmV0dXJuIGYmJihtPXtyZXN1bHQ6bSx2YXJpb2dyYW06Yn0pLG19ZnVuY3Rpb24gaW50ZXJwMih0LGUsbj17fSl7bGV0IHI9TXQobiwibWV0aG9kIik7Im5hdHVyYWxOZWlnaGJvciIhPT1yJiYia3JpZ2luZyIhPT1yJiYocj0ibmF0dXJhbE5laWdoYm9yIik7bGV0IGk9TXQobiwidXNlU3luYyIpO2t0KGkpfHwoaT0hMSk7bGV0IG89KCk9PntsZXQgaT1udWxsO3RyeXsibmF0dXJhbE5laWdoYm9yIj09PXI/aT1waSh0LGUsbik6ImtyaWdpbmciPT09ciYmKGk9UGkodCxlLG4pKX1jYXRjaCh0KXtpPXtlcnI6dC50b1N0cmluZygpfX1yZXR1cm4gaX07cmV0dXJuIGk/bygpOihhc3luYygpPT57bGV0IHQ9bnVsbDt0cnl7dD1vKCk7bGV0IGU9TXQodCwiZXJyIik7cmV0dXJuIFR0KGUpP1Byb21pc2UucmVqZWN0KGUpOnR9Y2F0Y2godCl7cmV0dXJuIGNvbnNvbGUubG9nKHQpLFByb21pc2UucmVqZWN0KHQudG9TdHJpbmcoKSl9fSkoKX15aS50cmFpbj1mdW5jdGlvbih0LGUsbixyLGksbyl7bGV0IGwsYSxzLHUsYz17dDp0LHg6ZSx5Om4sbnVnZ2V0OjAscmFuZ2U6MCxzaWxsOjAsQToxLzMsbjowfTtzd2l0Y2gocil7Y2FzZSJnYXVzc2lhbiI6Yy5tb2RlbD1PaTticmVhaztjYXNlImV4cG9uZW50aWFsIjpjLm1vZGVsPVNpO2JyZWFrO2Nhc2Uic3BoZXJpY2FsIjpjLm1vZGVsPU1pfWxldCBmPXQubGVuZ3RoLGg9QXJyYXkoKGYqZi1mKS8yKTtmb3IobD0wLHM9MDtsPGY7bCsrKWZvcihhPTA7YTxsO2ErKyxzKyspaFtzXT1BcnJheSgyKSxoW3NdWzBdPU1hdGgucG93KE1hdGgucG93KGVbbF0tZVthXSwyKStNYXRoLnBvdyhuW2xdLW5bYV0sMiksLjUpLGhbc11bMV09TWF0aC5hYnModFtsXS10W2FdKTtoLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF0tZVswXX0pKSxjLnJhbmdlPWhbKGYqZi1mKS8yLTFdWzBdO2xldCBnPShmKmYtZikvMj4zMD8zMDooZipmLWYpLzIsdj1jLnJhbmdlL2csZD1faSgwLGcpLHA9X2koMCxnKTtpZihnPDMwKWZvcih1PTA7dTxnO3UrKylkW3VdPWhbdV1bMF0scFt1XT1oW3VdWzFdO2Vsc2V7Zm9yKGw9MCxhPTAscz0wLHU9MDtsPGcmJmE8KGYqZi1mKS8yO2wrKyxzPTApe2Zvcig7aFthXVswXTw9KGwrMSkqdiYmKGRbdV0rPWhbYV1bMF0scFt1XSs9aFthXVsxXSxhKysscysrLCEoYT49KGYqZi1mKS8yKSk7KTtzPjAmJihkW3VdLz1zLHBbdV0vPXMsdSsrKX1pZih1PDIpcmV0dXJuIGN9bGV0IHk9W107Zm9yKGw9MDtsPHU7bCsrKXtsZXQgdD1kW2xdLGU9cFtsXTt5LnB1c2goW3QsZV0pfWxldCBfPXtkYXRhOmgsYmFyczp5fTtjLnN2cGQ9XyxmPXUsYy5yYW5nZT1kW2YtMV0tZFswXTtsZXQgbT1faSgxLDIqZiksYj1BcnJheShmKSx4PWMuQTtmb3IobD0wO2w8ZjtsKyspe3N3aXRjaChyKXtjYXNlImdhdXNzaWFuIjptWzIqbCsxXT0xLU1hdGguZXhwKC0xL3gqTWF0aC5wb3coZFtsXS9jLnJhbmdlLDIpKTticmVhaztjYXNlImV4cG9uZW50aWFsIjptWzIqbCsxXT0xLU1hdGguZXhwKC0xL3gqZFtsXS9jLnJhbmdlKTticmVhaztjYXNlInNwaGVyaWNhbCI6bVsyKmwrMV09ZFtsXS9jLnJhbmdlKjEuNS0uNSpNYXRoLnBvdyhkW2xdL2MucmFuZ2UsMyl9YltsXT1wW2xdfWxldCB3PWZ1bmN0aW9uKHQsZSxuKXtsZXQgcixpLG89QXJyYXkobiplKTtmb3Iocj0wO3I8ZTtyKyspZm9yKGk9MDtpPG47aSsrKW9baSplK3JdPXRbcipuK2ldO3JldHVybiBvfShtLGYsMiksaj14aSh3LG0sMixmLDIpO2o9YmkoaixtaSgxL28sMiksMiwyKTtsZXQgQT1qLnNsaWNlKDApO3dpKGosMik/amkoaiwyKTooQWkoQSwyKSxqPUEpO2xldCBPPXhpKHhpKGosdywyLDIsZiksYiwyLGYsMSk7Yy5udWdnZXQ9T1swXSxjLnNpbGw9T1sxXSpjLnJhbmdlK2MubnVnZ2V0LGMubj1lLmxlbmd0aCxmPWUubGVuZ3RoO2xldCBTPUFycmF5KGYqZik7Zm9yKGw9MDtsPGY7bCsrKXtmb3IoYT0wO2E8bDthKyspU1tsKmYrYV09Yy5tb2RlbChNYXRoLnBvdyhNYXRoLnBvdyhlW2xdLWVbYV0sMikrTWF0aC5wb3cobltsXS1uW2FdLDIpLC41KSxjLm51Z2dldCxjLnJhbmdlLGMuc2lsbCxjLkEpLFNbYSpmK2xdPVNbbCpmK2FdO1NbbCpmK2xdPWMubW9kZWwoMCxjLm51Z2dldCxjLnJhbmdlLGMuc2lsbCxjLkEpfWxldCBNPWJpKFMsbWkoaSxmKSxmLGYpLFA9TS5zbGljZSgwKTt3aShNLGYpP2ppKE0sZik6KEFpKFAsZiksTT1QKTtsZXQgaz1NLnNsaWNlKDApLEY9eGkoTSx0LGYsZiwxKTtyZXR1cm4gYy5LPWssYy5NPUYsY30seWkucHJlZGljdD1mdW5jdGlvbih0LGUsbil7bGV0IHIsaT1BcnJheShuLm4pO2ZvcihyPTA7cjxuLm47cisrKWlbcl09bi5tb2RlbChNYXRoLnBvdyhNYXRoLnBvdyh0LW4ueFtyXSwyKStNYXRoLnBvdyhlLW4ueVtyXSwyKSwuNSksbi5udWdnZXQsbi5yYW5nZSxuLnNpbGwsbi5BKTtyZXR1cm4geGkoaSxuLk0sMSxuLm4sMSlbMF19LHlpLnZhcmlhbmNlPWZ1bmN0aW9uKHQsZSxuKXtsZXQgcixpPUFycmF5KG4ubik7Zm9yKHI9MDtyPG4ubjtyKyspaVtyXT1uLm1vZGVsKE1hdGgucG93KE1hdGgucG93KHQtbi54W3JdLDIpK01hdGgucG93KGUtbi55W3JdLDIpLC41KSxuLm51Z2dldCxuLnJhbmdlLG4uc2lsbCxuLkEpO3JldHVybiBuLm1vZGVsKDAsbi5udWdnZXQsbi5yYW5nZSxuLnNpbGwsbi5BKSt4aSh4aShpLG4uSywxLG4ubixuLm4pLGksMSxuLm4sMSlbMF19OwoKbGV0IGluc3RhbmNlID0gbnVsbApmdW5jdGlvbiBpbml0KGlucHV0KXsKCiAgICAvL2luaXQKICAgIGxldCByCiAgICAKICAgICAgICByID0gewogICAgICAgICAgICBtYWluOiBpbnRlcnAyCiAgICAgICAgfQogICAgICAgIAoKICAgIC8vb24KICAgIAoKICAgIC8vc2F2ZQogICAgaW5zdGFuY2UgPSByCgp9CgpmdW5jdGlvbiBzZW5kTWVzc2FnZShkYXRhKSB7CiAgICAKICAgICAgICBwYXJlbnRQb3J0LnBvc3RNZXNzYWdlKGRhdGEpCiAgICAgICAgCn0KCmFzeW5jIGZ1bmN0aW9uIHJ1bihkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJ1bicsZGF0YSkKCiAgICAvL21vZGUKICAgIGxldCBtb2RlID0gZGF0YS5tb2RlCgogICAgLy9jaGVjawogICAgaWYobW9kZSAhPT0gJ2luaXQnICYmIG1vZGUgIT09ICdjYWxsJyl7CiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgLy9pbml0CiAgICBpZihtb2RlID09PSAnaW5pdCcpewogICAgICAgIAogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vdHlwZQogICAgICAgICAgICBsZXQgdHlwZSA9IGRhdGEudHlwZQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CiAgICAKICAgICAgICAgICAgLy9pbnN0YW5jZQogICAgICAgICAgICBpZih0eXBlID09PSAnZnVuY3Rpb24nKXsKICAgICAgICAgICAgICAgIGluaXQoLi4uaW5wdXQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZih0eXBlID09PSAnb2JqZWN0Jyl7CiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IGludGVycDIKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAKICAgICAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICAgICAgbW9kZTogJ2VtaXQnLAogICAgICAgICAgICAgICAgZXZOYW1lOiAnZXJyb3InLAogICAgICAgICAgICAgICAgbXNnOiBlcnIsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgICAgICB9CiAgICAgICAgICAgIAogICAgfQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgPT09ICdjYWxsJyl7CiAgICAgICAgbGV0IHN0YXRlID0gJycKICAgICAgICBsZXQgbXNnID0gbnVsbAoKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL2Z1bgogICAgICAgICAgICBsZXQgZnVuID0gaW5zdGFuY2VbZGF0YS5mdW5dCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKCiAgICAgICAgICAgIC8vZXhlYwogICAgICAgICAgICBhd2FpdCBmdW4oLi4uaW5wdXQpCiAgICAgICAgICAgICAgICAudGhlbigoc3VjKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J3N1Y2Nlc3MnCiAgICAgICAgICAgICAgICAgICAgbXNnPXN1YwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J2Vycm9yJwogICAgICAgICAgICAgICAgICAgIG1zZz1lcnIKICAgICAgICAgICAgICAgIH0pCgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgICAgICBzdGF0ZSA9ICdlcnJvcicKICAgICAgICAgICAgbXNnID0gZXJyCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICBtb2RlOiAncmV0dXJuJywKICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgIGZ1bjogZGF0YS5mdW4sCiAgICAgICAgICAgIHN0YXRlLAogICAgICAgICAgICBtc2csCiAgICAgICAgfQogICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICB9Cgp9CgpmdW5jdGlvbiByZWN2TWVzc2FnZShkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJlY3Y6JywgZGF0YSkKCiAgICAvL2RhdGFSZWN2CiAgICBsZXQgZGF0YVJlY3YgPSBkYXRhCgogICAgLy9ydW4KICAgIHJ1bihkYXRhUmVjdikKCn0KCgogICAgICAgIHBhcmVudFBvcnQub24oJ21lc3NhZ2UnLCByZWN2TWVzc2FnZSkKICAgICAgICAKCg==",Buffer.from(c,"base64").toString("utf8"));function t(){var d=b();function m(b){try{return new l.Worker(b,{eval:!0})}catch(l){s(l)}}var c=m(p);if(!c)return s("invalid worker"),null;function G(){c?(c.terminate(),c=void 0):s("worker has been terminated")}function i(){var l={mode:"init",type:"function",input:Array.prototype.slice.call(arguments)};c.postMessage(l)}function W(){var l=Z(),b=X(),m={mode:"call",id:b,fun:"main",input:Array.prototype.slice.call(arguments)};return c.postMessage(m),d.once(b,(function(b){"success"===b.state?l.resolve(b.msg):l.reject(b.msg)})),l}function t(l){var b=l,Z=b.mode;"emit"!==Z&&"return"!==Z||("emit"===Z&&d.emit(b.evName,b.msg),"return"===Z&&d.emit(b.id,b))}function s(l){d.emit("error",l)}return c.on("message",t),c.on("error",s),i(Array.prototype.slice.call(arguments)),d.main=W,d.main=W,d.terminate=G,d}G=function(){var l,b=(l=i.mark((function l(){var b,Z,m,X=arguments;return i.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return b=Array.prototype.slice.call(X),Z=t(),l.next=4,Z.main.apply(Z,d(b)).finally((function(){Z.terminate()}));case 4:return m=l.sent,l.abrupt("return",m);case 6:case"end":return l.stop()}}),l)})),function(){var b=this,d=arguments;return new Promise((function(Z,X){var c=l.apply(b,d);function G(l){m(c,Z,X,G,i,"next",l)}function i(l){m(c,Z,X,G,i,"throw",l)}G(void 0)}))});return function(){return b.apply(this,arguments)}}()}(),G}(d.default)})),c=m((function(l,b){l.exports=function(){function l(l,b){(null==b||b>l.length)&&(b=l.length);for(var d=0,Z=new Array(b);d<b;d++)Z[d]=l[d];return Z}function b(b){return function(b){if(Array.isArray(b))return l(b)}(b)||function(l){if("undefined"!=typeof Symbol&&null!=l[Symbol.iterator]||null!=l["@@iterator"])return Array.from(l)}(b)||function(b,d){if(b){if("string"==typeof b)return l(b,d);var Z=Object.prototype.toString.call(b).slice(8,-1);return"Object"===Z&&b.constructor&&(Z=b.constructor.name),"Map"===Z||"Set"===Z?Array.from(b):"Arguments"===Z||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(Z)?l(b,d):void 0}}(b)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function d(l,b,d,Z,m,X,c){try{var G=l[X](c),i=G.value}catch(l){return void d(l)}G.done?b(i):Promise.resolve(i).then(Z,m)}function m(l){return m="function"==typeof Symbol&&"symbol"==Z(Symbol.iterator)?function(l){return Z(l)}:function(l){return l&&"function"==typeof Symbol&&l.constructor===Symbol&&l!==Symbol.prototype?"symbol":Z(l)},m(l)}function X(l){var b={exports:{}};return l(b,b.exports),b.exports}var c,G,i=X((function(l){var b=function(l){var b,d=Object.prototype,Z=d.hasOwnProperty,X="function"==typeof Symbol?Symbol:{},c=X.iterator||"@@iterator",G=X.asyncIterator||"@@asyncIterator",i=X.toStringTag||"@@toStringTag";function W(l,b,d){return Object.defineProperty(l,b,{value:d,enumerable:!0,configurable:!0,writable:!0}),l[b]}try{W({},"")}catch(l){W=function(l,b,d){return l[b]=d}}function p(l,b,d,Z){var m=b&&b.prototype instanceof o?b:o,X=Object.create(m.prototype),c=new T(Z||[]);return X._invoke=function(l,b,d){var Z=s;return function(m,X){if(Z===K)throw new Error("Generator is already running");if(Z===y){if("throw"===m)throw X;return J()}for(d.method=m,d.arg=X;;){var c=d.delegate;if(c){var G=S(c,d);if(G){if(G===h)continue;return G}}if("next"===d.method)d.sent=d._sent=d.arg;else if("throw"===d.method){if(Z===s)throw Z=y,d.arg;d.dispatchException(d.arg)}else"return"===d.method&&d.abrupt("return",d.arg);Z=K;var i=t(l,b,d);if("normal"===i.type){if(Z=d.done?y:u,i.arg===h)continue;return{value:i.arg,done:d.done}}"throw"===i.type&&(Z=y,d.method="throw",d.arg=i.arg)}}}(l,d,c),X}function t(l,b,d){try{return{type:"normal",arg:l.call(b,d)}}catch(l){return{type:"throw",arg:l}}}l.wrap=p;var s="suspendedStart",u="suspendedYield",K="executing",y="completed",h={};function o(){}function n(){}function I(){}var L={};W(L,c,(function(){return this}));var V=Object.getPrototypeOf,a=V&&V(V(g([])));a&&a!==d&&Z.call(a,c)&&(L=a);var x=I.prototype=o.prototype=Object.create(L);function Y(l){["next","throw","return"].forEach((function(b){W(l,b,(function(l){return this._invoke(b,l)}))}))}function C(l,b){function d(X,c,G,i){var W=t(l[X],l,c);if("throw"!==W.type){var p=W.arg,s=p.value;return s&&"object"===m(s)&&Z.call(s,"__await")?b.resolve(s.__await).then((function(l){d("next",l,G,i)}),(function(l){d("throw",l,G,i)})):b.resolve(s).then((function(l){p.value=l,G(p)}),(function(l){return d("throw",l,G,i)}))}i(W.arg)}var X;this._invoke=function(l,Z){function m(){return new b((function(b,m){d(l,Z,b,m)}))}return X=X?X.then(m,m):m()}}function S(l,d){var Z=l.iterator[d.method];if(Z===b){if(d.delegate=null,"throw"===d.method){if(l.iterator.return&&(d.method="return",d.arg=b,S(l,d),"throw"===d.method))return h;d.method="throw",d.arg=new TypeError("The iterator does not provide a 'throw' method")}return h}var m=t(Z,l.iterator,d.arg);if("throw"===m.type)return d.method="throw",d.arg=m.arg,d.delegate=null,h;var X=m.arg;return X?X.done?(d[l.resultName]=X.value,d.next=l.nextLoc,"return"!==d.method&&(d.method="next",d.arg=b),d.delegate=null,h):X:(d.method="throw",d.arg=new TypeError("iterator result is not an object"),d.delegate=null,h)}function H(l){var b={tryLoc:l[0]};1 in l&&(b.catchLoc=l[1]),2 in l&&(b.finallyLoc=l[2],b.afterLoc=l[3]),this.tryEntries.push(b)}function e(l){var b=l.completion||{};b.type="normal",delete b.arg,l.completion=b}function T(l){this.tryEntries=[{tryLoc:"root"}],l.forEach(H,this),this.reset(!0)}function g(l){if(l){var d=l[c];if(d)return d.call(l);if("function"==typeof l.next)return l;if(!isNaN(l.length)){var m=-1,X=function d(){for(;++m<l.length;)if(Z.call(l,m))return d.value=l[m],d.done=!1,d;return d.value=b,d.done=!0,d};return X.next=X}}return{next:J}}function J(){return{value:b,done:!0}}return n.prototype=I,W(x,"constructor",I),W(I,"constructor",n),n.displayName=W(I,i,"GeneratorFunction"),l.isGeneratorFunction=function(l){var b="function"==typeof l&&l.constructor;return!!b&&(b===n||"GeneratorFunction"===(b.displayName||b.name))},l.mark=function(l){return Object.setPrototypeOf?Object.setPrototypeOf(l,I):(l.__proto__=I,W(l,i,"GeneratorFunction")),l.prototype=Object.create(x),l},l.awrap=function(l){return{__await:l}},Y(C.prototype),W(C.prototype,G,(function(){return this})),l.AsyncIterator=C,l.async=function(b,d,Z,m,X){void 0===X&&(X=Promise);var c=new C(p(b,d,Z,m),X);return l.isGeneratorFunction(d)?c:c.next().then((function(l){return l.done?l.value:c.next()}))},Y(x),W(x,i,"Generator"),W(x,c,(function(){return this})),W(x,"toString",(function(){return"[object Generator]"})),l.keys=function(l){var b=[];for(var d in l)b.push(d);return b.reverse(),function d(){for(;b.length;){var Z=b.pop();if(Z in l)return d.value=Z,d.done=!1,d}return d.done=!0,d}},l.values=g,T.prototype={constructor:T,reset:function(l){if(this.prev=0,this.next=0,this.sent=this._sent=b,this.done=!1,this.delegate=null,this.method="next",this.arg=b,this.tryEntries.forEach(e),!l)for(var d in this)"t"===d.charAt(0)&&Z.call(this,d)&&!isNaN(+d.slice(1))&&(this[d]=b)},stop:function(){this.done=!0;var l=this.tryEntries[0].completion;if("throw"===l.type)throw l.arg;return this.rval},dispatchException:function(l){if(this.done)throw l;var d=this;function m(Z,m){return G.type="throw",G.arg=l,d.next=Z,m&&(d.method="next",d.arg=b),!!m}for(var X=this.tryEntries.length-1;X>=0;--X){var c=this.tryEntries[X],G=c.completion;if("root"===c.tryLoc)return m("end");if(c.tryLoc<=this.prev){var i=Z.call(c,"catchLoc"),W=Z.call(c,"finallyLoc");if(i&&W){if(this.prev<c.catchLoc)return m(c.catchLoc,!0);if(this.prev<c.finallyLoc)return m(c.finallyLoc)}else if(i){if(this.prev<c.catchLoc)return m(c.catchLoc,!0)}else{if(!W)throw new Error("try statement without catch or finally");if(this.prev<c.finallyLoc)return m(c.finallyLoc)}}}},abrupt:function(l,b){for(var d=this.tryEntries.length-1;d>=0;--d){var m=this.tryEntries[d];if(m.tryLoc<=this.prev&&Z.call(m,"finallyLoc")&&this.prev<m.finallyLoc){var X=m;break}}X&&("break"===l||"continue"===l)&&X.tryLoc<=b&&b<=X.finallyLoc&&(X=null);var c=X?X.completion:{};return c.type=l,c.arg=b,X?(this.method="next",this.next=X.finallyLoc,h):this.complete(c)},complete:function(l,b){if("throw"===l.type)throw l.arg;return"break"===l.type||"continue"===l.type?this.next=l.arg:"return"===l.type?(this.rval=this.arg=l.arg,this.method="return",this.next="end"):"normal"===l.type&&b&&(this.next=b),h},finish:function(l){for(var b=this.tryEntries.length-1;b>=0;--b){var d=this.tryEntries[b];if(d.finallyLoc===l)return this.complete(d.completion,d.afterLoc),e(d),h}},catch:function(l){for(var b=this.tryEntries.length-1;b>=0;--b){var d=this.tryEntries[b];if(d.tryLoc===l){var Z=d.completion;if("throw"===Z.type){var m=Z.arg;e(d)}return m}}throw new Error("illegal catch attempt")},delegateYield:function(l,d,Z){return this.delegate={iterator:g(l),resultName:d,nextLoc:Z},"next"===this.method&&(this.arg=b),h}},l}(l.exports);try{regeneratorRuntime=b}catch(l){"object"===("undefined"==typeof globalThis?"undefined":m(globalThis))?globalThis.regeneratorRuntime=b:Function("r","regeneratorRuntime = r")(b)}})),W="function"==typeof atob,p="function"==typeof Buffer,t="function"==typeof TextDecoder?new TextDecoder:void 0,s=("function"==typeof TextEncoder&&new TextEncoder,Array.prototype.slice.call("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=")),u=(c={},s.forEach((function(l,b){return c[l]=b})),c),K=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,y=String.fromCharCode.bind(String),h="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):function(l){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(l){return l};return new Uint8Array(Array.prototype.slice.call(l,0).map(b))},o=function(l){return l.replace(/[^A-Za-z0-9\+\/]/g,"")},n=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,I=function(l){switch(l.length){case 4:var b=((7&l.charCodeAt(0))<<18|(63&l.charCodeAt(1))<<12|(63&l.charCodeAt(2))<<6|63&l.charCodeAt(3))-65536;return y(55296+(b>>>10))+y(56320+(1023&b));case 3:return y((15&l.charCodeAt(0))<<12|(63&l.charCodeAt(1))<<6|63&l.charCodeAt(2));default:return y((31&l.charCodeAt(0))<<6|63&l.charCodeAt(1))}},L=function(l){return l.replace(n,I)},V=function(l){if(l=l.replace(/\s+/g,""),!K.test(l))throw new TypeError("malformed base64.");l+="==".slice(2-(3&l.length));for(var b,d,Z,m="",X=0;X<l.length;)b=u[l.charAt(X++)]<<18|u[l.charAt(X++)]<<12|(d=u[l.charAt(X++)])<<6|(Z=u[l.charAt(X++)]),m+=64===d?y(b>>16&255):64===Z?y(b>>16&255,b>>8&255):y(b>>16&255,b>>8&255,255&b);return m},a=W?function(l){return atob(o(l))}:p?function(l){return Buffer.from(l,"base64").toString("binary")}:V,x=p?function(l){return h(Buffer.from(l,"base64"))}:function(l){return h(a(l),(function(l){return l.charCodeAt(0)}))},Y=p?function(l){return Buffer.from(l,"base64").toString("utf8")}:t?function(l){return t.decode(x(l))}:function(l){return L(a(l))},C=function(l){return o(l.replace(/[-_]/g,(function(l){return"-"==l?"+":"/"})))},S=function(l){return Y(C(l))},H=S,e=X((function(l){var b=Object.prototype.hasOwnProperty,d="~";function Z(){}function m(l,b,d){this.fn=l,this.context=b,this.once=d||!1}function X(l,b,Z,X,c){if("function"!=typeof Z)throw new TypeError("The listener must be a function");var G=new m(Z,X||l,c),i=d?d+b:b;return l._events[i]?l._events[i].fn?l._events[i]=[l._events[i],G]:l._events[i].push(G):(l._events[i]=G,l._eventsCount++),l}function c(l,b){0==--l._eventsCount?l._events=new Z:delete l._events[b]}function G(){this._events=new Z,this._eventsCount=0}Object.create&&(Z.prototype=Object.create(null),(new Z).__proto__||(d=!1)),G.prototype.eventNames=function(){var l,Z,m=[];if(0===this._eventsCount)return m;for(Z in l=this._events)b.call(l,Z)&&m.push(d?Z.slice(1):Z);return Object.getOwnPropertySymbols?m.concat(Object.getOwnPropertySymbols(l)):m},G.prototype.listeners=function(l){var b=d?d+l:l,Z=this._events[b];if(!Z)return[];if(Z.fn)return[Z.fn];for(var m=0,X=Z.length,c=new Array(X);m<X;m++)c[m]=Z[m].fn;return c},G.prototype.listenerCount=function(l){var b=d?d+l:l,Z=this._events[b];return Z?Z.fn?1:Z.length:0},G.prototype.emit=function(l,b,Z,m,X,c){var G=d?d+l:l;if(!this._events[G])return!1;var i,W,p=this._events[G],t=arguments.length;if(p.fn){switch(p.once&&this.removeListener(l,p.fn,void 0,!0),t){case 1:return p.fn.call(p.context),!0;case 2:return p.fn.call(p.context,b),!0;case 3:return p.fn.call(p.context,b,Z),!0;case 4:return p.fn.call(p.context,b,Z,m),!0;case 5:return p.fn.call(p.context,b,Z,m,X),!0;case 6:return p.fn.call(p.context,b,Z,m,X,c),!0}for(W=1,i=new Array(t-1);W<t;W++)i[W-1]=arguments[W];p.fn.apply(p.context,i)}else{var s,u=p.length;for(W=0;W<u;W++)switch(p[W].once&&this.removeListener(l,p[W].fn,void 0,!0),t){case 1:p[W].fn.call(p[W].context);break;case 2:p[W].fn.call(p[W].context,b);break;case 3:p[W].fn.call(p[W].context,b,Z);break;case 4:p[W].fn.call(p[W].context,b,Z,m);break;default:if(!i)for(s=1,i=new Array(t-1);s<t;s++)i[s-1]=arguments[s];p[W].fn.apply(p[W].context,i)}}return!0},G.prototype.on=function(l,b,d){return X(this,l,b,d,!1)},G.prototype.once=function(l,b,d){return X(this,l,b,d,!0)},G.prototype.removeListener=function(l,b,Z,m){var X=d?d+l:l;if(!this._events[X])return this;if(!b)return c(this,X),this;var G=this._events[X];if(G.fn)G.fn!==b||m&&!G.once||Z&&G.context!==Z||c(this,X);else{for(var i=0,W=[],p=G.length;i<p;i++)(G[i].fn!==b||m&&!G[i].once||Z&&G[i].context!==Z)&&W.push(G[i]);W.length?this._events[X]=1===W.length?W[0]:W:c(this,X)}return this},G.prototype.removeAllListeners=function(l){var b;return l?(b=d?d+l:l,this._events[b]&&c(this,b)):(this._events=new Z,this._eventsCount=0),this},G.prototype.off=G.prototype.removeListener,G.prototype.addListener=G.prototype.on,G.prefixed=d,G.EventEmitter=G,l.exports=G}));return function(){if("browser"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function l(){return new e}function Z(){var l,b,d=new Promise((function(){l=arguments[0],b=arguments[1]}));return d.resolve=l,d.reject=b,d}function m(){for(var l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,b=[],d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),Z=d.length,m=0;m<l;m++)b[m]=d[0|Math.random()*Z];return b.join("")}var X=H("CgoKdmFyIHQ9QXJyYXkuaXNBcnJheSxlPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gbih0KXt2YXIgZT17ZXhwb3J0czp7fX07cmV0dXJuIHQoZSxlLmV4cG9ydHMpLGUuZXhwb3J0c312YXIgcj0ib2JqZWN0Ij09dHlwZW9mIGUmJmUmJmUuT2JqZWN0PT09T2JqZWN0JiZlLGk9Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixvPXJ8fGl8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksbD1vLlN5bWJvbCxhPU9iamVjdC5wcm90b3R5cGUscz1hLmhhc093blByb3BlcnR5LHU9YS50b1N0cmluZyxjPWw/bC50b1N0cmluZ1RhZzp2b2lkIDA7dmFyIGY9ZnVuY3Rpb24odCl7dmFyIGU9cy5jYWxsKHQsYyksbj10W2NdO3RyeXt0W2NdPXZvaWQgMDt2YXIgcj0hMH1jYXRjaCh0KXt9dmFyIGk9dS5jYWxsKHQpO3JldHVybiByJiYoZT90W2NdPW46ZGVsZXRlIHRbY10pLGl9LGg9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzt2YXIgZz1mdW5jdGlvbih0KXtyZXR1cm4gaC5jYWxsKHQpfSx2PWw/bC50b1N0cmluZ1RhZzp2b2lkIDA7dmFyIGQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwPT09dD8iW29iamVjdCBVbmRlZmluZWRdIjoiW29iamVjdCBOdWxsXSI6diYmdiBpbiBPYmplY3QodCk/Zih0KTpnKHQpfTt2YXIgcD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmIm9iamVjdCI9PXR5cGVvZiB0fTt2YXIgeT1mdW5jdGlvbih0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR8fHAodCkmJiJbb2JqZWN0IFN5bWJvbF0iPT1kKHQpfSxfPS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLG09L15cdyokLzt2YXIgYj1mdW5jdGlvbihlLG4pe2lmKHQoZSkpcmV0dXJuITE7dmFyIHI9dHlwZW9mIGU7cmV0dXJuISgibnVtYmVyIiE9ciYmInN5bWJvbCIhPXImJiJib29sZWFuIiE9ciYmbnVsbCE9ZSYmIXkoZSkpfHwobS50ZXN0KGUpfHwhXy50ZXN0KGUpfHxudWxsIT1uJiZlIGluIE9iamVjdChuKSl9O3ZhciB4PWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiBudWxsIT10JiYoIm9iamVjdCI9PWV8fCJmdW5jdGlvbiI9PWUpfTt2YXIgdyxqPWZ1bmN0aW9uKHQpe2lmKCF4KHQpKXJldHVybiExO3ZhciBlPWQodCk7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBQcm94eV0iPT1lfSxBPW9bIl9fY29yZS1qc19zaGFyZWRfXyJdLE89KHc9L1teLl0rJC8uZXhlYyhBJiZBLmtleXMmJkEua2V5cy5JRV9QUk9UT3x8IiIpKT8iU3ltYm9sKHNyYylfMS4iK3c6IiI7dmFyIFM9ZnVuY3Rpb24odCl7cmV0dXJuISFPJiZPIGluIHR9LE09RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBQPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe3RyeXtyZXR1cm4gTS5jYWxsKHQpfWNhdGNoKHQpe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2godCl7fX1yZXR1cm4iIn0saz0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxGPUZ1bmN0aW9uLnByb3RvdHlwZSxUPU9iamVjdC5wcm90b3R5cGUsej1GLnRvU3RyaW5nLCQ9VC5oYXNPd25Qcm9wZXJ0eSxJPVJlZ0V4cCgiXiIrei5jYWxsKCQpLnJlcGxhY2UoL1tcXF4kLiorPygpW1xde318XS9nLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO3ZhciBFPWZ1bmN0aW9uKHQpe3JldHVybiEoIXgodCl8fFModCkpJiYoaih0KT9JOmspLnRlc3QoUCh0KSl9O3ZhciBOPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwOnRbZV19O3ZhciBSPWZ1bmN0aW9uKHQsZSl7dmFyIG49Tih0LGUpO3JldHVybiBFKG4pP246dm9pZCAwfSxDPVIoT2JqZWN0LCJjcmVhdGUiKTt2YXIgQj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189Qz9DKG51bGwpOnt9LHRoaXMuc2l6ZT0wfTt2YXIgVT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0sTD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBEPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoQyl7dmFyIG49ZVt0XTtyZXR1cm4iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI9PT1uP3ZvaWQgMDpufXJldHVybiBMLmNhbGwoZSx0KT9lW3RdOnZvaWQgMH0sSD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBLPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIEM/dm9pZCAwIT09ZVt0XTpILmNhbGwoZSx0KX07dmFyIFg9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MSxuW3RdPUMmJnZvaWQgMD09PWU/Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iOmUsdGhpc307ZnVuY3Rpb24gSih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1KLnByb3RvdHlwZS5jbGVhcj1CLEoucHJvdG90eXBlLmRlbGV0ZT1VLEoucHJvdG90eXBlLmdldD1ELEoucHJvdG90eXBlLmhhcz1LLEoucHJvdG90eXBlLnNldD1YO3ZhciBZPUo7dmFyIFo9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPVtdLHRoaXMuc2l6ZT0wfTt2YXIgVj1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8dCE9dCYmZSE9ZX07dmFyIFc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5sZW5ndGg7bi0tOylpZihWKHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9LHE9QXJyYXkucHJvdG90eXBlLnNwbGljZTt2YXIgRz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49VyhlLHQpO3JldHVybiEobjwwKSYmKG49PWUubGVuZ3RoLTE/ZS5wb3AoKTpxLmNhbGwoZSxuLDEpLC0tdGhpcy5zaXplLCEwKX07dmFyIFE9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPVcoZSx0KTtyZXR1cm4gbjwwP3ZvaWQgMDplW25dWzFdfTt2YXIgdHQ9ZnVuY3Rpb24odCl7cmV0dXJuIFcodGhpcy5fX2RhdGFfXyx0KT4tMX07dmFyIGV0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxyPVcobix0KTtyZXR1cm4gcjwwPygrK3RoaXMuc2l6ZSxuLnB1c2goW3QsZV0pKTpuW3JdWzFdPWUsdGhpc307ZnVuY3Rpb24gbnQodCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19bnQucHJvdG90eXBlLmNsZWFyPVosbnQucHJvdG90eXBlLmRlbGV0ZT1HLG50LnByb3RvdHlwZS5nZXQ9USxudC5wcm90b3R5cGUuaGFzPXR0LG50LnByb3RvdHlwZS5zZXQ9ZXQ7dmFyIHJ0PW50LGl0PVIobywiTWFwIik7dmFyIG90PWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgWSxtYXA6bmV3KGl0fHxydCksc3RyaW5nOm5ldyBZfX07dmFyIGx0PWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiJzdHJpbmciPT1lfHwibnVtYmVyIj09ZXx8InN5bWJvbCI9PWV8fCJib29sZWFuIj09ZT8iX19wcm90b19fIiE9PXQ6bnVsbD09PXR9O3ZhciBhdD1mdW5jdGlvbih0LGUpe3ZhciBuPXQuX19kYXRhX187cmV0dXJuIGx0KGUpP25bInN0cmluZyI9PXR5cGVvZiBlPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9O3ZhciBzdD1mdW5jdGlvbih0KXt2YXIgZT1hdCh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfTt2YXIgdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGF0KHRoaXMsdCkuZ2V0KHQpfTt2YXIgY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGF0KHRoaXMsdCkuaGFzKHQpfTt2YXIgZnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1hdCh0aGlzLHQpLHI9bi5zaXplO3JldHVybiBuLnNldCh0LGUpLHRoaXMuc2l6ZSs9bi5zaXplPT1yPzA6MSx0aGlzfTtmdW5jdGlvbiBodCh0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1odC5wcm90b3R5cGUuY2xlYXI9b3QsaHQucHJvdG90eXBlLmRlbGV0ZT1zdCxodC5wcm90b3R5cGUuZ2V0PXV0LGh0LnByb3RvdHlwZS5oYXM9Y3QsaHQucHJvdG90eXBlLnNldD1mdDt2YXIgZ3Q9aHQ7ZnVuY3Rpb24gdnQodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBmdW5jdGlvbiIpO3ZhciBuPWZ1bmN0aW9uKCl7dmFyIHI9YXJndW1lbnRzLGk9ZT9lLmFwcGx5KHRoaXMscik6clswXSxvPW4uY2FjaGU7aWYoby5oYXMoaSkpcmV0dXJuIG8uZ2V0KGkpO3ZhciBsPXQuYXBwbHkodGhpcyxyKTtyZXR1cm4gbi5jYWNoZT1vLnNldChpLGwpfHxvLGx9O3JldHVybiBuLmNhY2hlPW5ldyh2dC5DYWNoZXx8Z3QpLG59dnQuQ2FjaGU9Z3Q7dmFyIGR0PXZ0O3ZhciBwdD0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyx5dD0vXFwoXFwpPy9nLF90PWZ1bmN0aW9uKHQpe3ZhciBlPWR0KHQsKGZ1bmN0aW9uKHQpe3JldHVybiA1MDA9PT1uLnNpemUmJm4uY2xlYXIoKSx0fSkpLG49ZS5jYWNoZTtyZXR1cm4gZX0oKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UocHQsKGZ1bmN0aW9uKHQsbixyLGkpe2UucHVzaChyP2kucmVwbGFjZSh5dCwiJDEiKTpufHx0KX0pKSxlfSkpO3ZhciBtdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aCxpPUFycmF5KHIpOysrbjxyOylpW25dPWUodFtuXSxuLHQpO3JldHVybiBpfSxidD1sP2wucHJvdG90eXBlOnZvaWQgMCx4dD1idD9idC50b1N0cmluZzp2b2lkIDA7dmFyIHd0PWZ1bmN0aW9uIGUobil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXJldHVybiBuO2lmKHQobikpcmV0dXJuIG10KG4sZSkrIiI7aWYoeShuKSlyZXR1cm4geHQ/eHQuY2FsbChuKToiIjt2YXIgcj1uKyIiO3JldHVybiIwIj09ciYmMS9uPT0tSW5maW5pdHk/Ii0wIjpyfTt2YXIganQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/IiI6d3QodCl9O3ZhciBBdD1mdW5jdGlvbihlLG4pe3JldHVybiB0KGUpP2U6YihlLG4pP1tlXTpfdChqdChlKSl9O3ZhciBPdD1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fHkodCkpcmV0dXJuIHQ7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LUluZmluaXR5PyItMCI6ZX07dmFyIFN0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAscj0oZT1BdChlLHQpKS5sZW5ndGg7bnVsbCE9dCYmbjxyOyl0PXRbT3QoZVtuKytdKV07cmV0dXJuIG4mJm49PXI/dDp2b2lkIDB9O3ZhciBNdD1mdW5jdGlvbih0LGUsbil7dmFyIHI9bnVsbD09dD92b2lkIDA6U3QodCxlKTtyZXR1cm4gdm9pZCAwPT09cj9uOnJ9O3ZhciBQdD1mdW5jdGlvbih0KXtyZXR1cm4hMD09PXR8fCExPT09dHx8cCh0KSYmIltvYmplY3QgQm9vbGVhbl0iPT1kKHQpfTtmdW5jdGlvbiBrdCh0KXtyZXR1cm4gUHQodCl9ZnVuY3Rpb24gRnQodCl7cmV0dXJuIltvYmplY3QgU3RyaW5nXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gVHQodCl7cmV0dXJuISghRnQodCl8fCIiPT09dCl9dmFyIHp0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoOysrbjxyJiYhMSE9PWUodFtuXSxuLHQpOyk7cmV0dXJuIHR9O3ZhciAkdD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLHIpe2Zvcih2YXIgaT0tMSxvPU9iamVjdChlKSxsPXIoZSksYT1sLmxlbmd0aDthLS07KXt2YXIgcz1sW3Q/YTorK2ldO2lmKCExPT09bihvW3NdLHMsbykpYnJlYWt9cmV0dXJuIGV9fSgpO3ZhciBJdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxyPUFycmF5KHQpOysrbjx0OylyW25dPWUobik7cmV0dXJuIHJ9O3ZhciBFdD1mdW5jdGlvbih0KXtyZXR1cm4gcCh0KSYmIltvYmplY3QgQXJndW1lbnRzXSI9PWQodCl9LE50PU9iamVjdC5wcm90b3R5cGUsUnQ9TnQuaGFzT3duUHJvcGVydHksQ3Q9TnQucHJvcGVydHlJc0VudW1lcmFibGUsQnQ9RXQoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9FdDpmdW5jdGlvbih0KXtyZXR1cm4gcCh0KSYmUnQuY2FsbCh0LCJjYWxsZWUiKSYmIUN0LmNhbGwodCwiY2FsbGVlIil9O3ZhciBVdD1mdW5jdGlvbigpe3JldHVybiExfSxMdD1uKChmdW5jdGlvbih0LGUpe3ZhciBuPWUmJiFlLm5vZGVUeXBlJiZlLHI9biYmdCYmIXQubm9kZVR5cGUmJnQsaT1yJiZyLmV4cG9ydHM9PT1uP28uQnVmZmVyOnZvaWQgMCxsPShpP2kuaXNCdWZmZXI6dm9pZCAwKXx8VXQ7dC5leHBvcnRzPWx9KSksRHQ9L14oPzowfFsxLTldXGQqKSQvO3ZhciBIdD1mdW5jdGlvbih0LGUpe3ZhciBuPXR5cGVvZiB0O3JldHVybiEhKGU9bnVsbD09ZT85MDA3MTk5MjU0NzQwOTkxOmUpJiYoIm51bWJlciI9PW58fCJzeW1ib2wiIT1uJiZEdC50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PGV9O3ZhciBLdD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJnQ+LTEmJnQlMT09MCYmdDw9OTAwNzE5OTI1NDc0MDk5MX0sWHQ9e307WHRbIltvYmplY3QgRmxvYXQzMkFycmF5XSJdPVh0WyJbb2JqZWN0IEZsb2F0NjRBcnJheV0iXT1YdFsiW29iamVjdCBJbnQ4QXJyYXldIl09WHRbIltvYmplY3QgSW50MTZBcnJheV0iXT1YdFsiW29iamVjdCBJbnQzMkFycmF5XSJdPVh0WyJbb2JqZWN0IFVpbnQ4QXJyYXldIl09WHRbIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIl09WHRbIltvYmplY3QgVWludDE2QXJyYXldIl09WHRbIltvYmplY3QgVWludDMyQXJyYXldIl09ITAsWHRbIltvYmplY3QgQXJndW1lbnRzXSJdPVh0WyJbb2JqZWN0IEFycmF5XSJdPVh0WyJbb2JqZWN0IEFycmF5QnVmZmVyXSJdPVh0WyJbb2JqZWN0IEJvb2xlYW5dIl09WHRbIltvYmplY3QgRGF0YVZpZXddIl09WHRbIltvYmplY3QgRGF0ZV0iXT1YdFsiW29iamVjdCBFcnJvcl0iXT1YdFsiW29iamVjdCBGdW5jdGlvbl0iXT1YdFsiW29iamVjdCBNYXBdIl09WHRbIltvYmplY3QgTnVtYmVyXSJdPVh0WyJbb2JqZWN0IE9iamVjdF0iXT1YdFsiW29iamVjdCBSZWdFeHBdIl09WHRbIltvYmplY3QgU2V0XSJdPVh0WyJbb2JqZWN0IFN0cmluZ10iXT1YdFsiW29iamVjdCBXZWFrTWFwXSJdPSExO3ZhciBKdD1mdW5jdGlvbih0KXtyZXR1cm4gcCh0KSYmS3QodC5sZW5ndGgpJiYhIVh0W2QodCldfTt2YXIgWXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX0sWnQ9bigoZnVuY3Rpb24odCxlKXt2YXIgbj1lJiYhZS5ub2RlVHlwZSYmZSxpPW4mJnQmJiF0Lm5vZGVUeXBlJiZ0LG89aSYmaS5leHBvcnRzPT09biYmci5wcm9jZXNzLGw9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9aSYmaS5yZXF1aXJlJiZpLnJlcXVpcmUoInV0aWwiKS50eXBlcztyZXR1cm4gdHx8byYmby5iaW5kaW5nJiZvLmJpbmRpbmcoInV0aWwiKX1jYXRjaCh0KXt9fSgpO3QuZXhwb3J0cz1sfSkpLFZ0PVp0JiZadC5pc1R5cGVkQXJyYXksV3Q9VnQ/WXQoVnQpOkp0LHF0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIEd0PWZ1bmN0aW9uKGUsbil7dmFyIHI9dChlKSxpPSFyJiZCdChlKSxvPSFyJiYhaSYmTHQoZSksbD0hciYmIWkmJiFvJiZXdChlKSxhPXJ8fGl8fG98fGwscz1hP0l0KGUubGVuZ3RoLFN0cmluZyk6W10sdT1zLmxlbmd0aDtmb3IodmFyIGMgaW4gZSkhbiYmIXF0LmNhbGwoZSxjKXx8YSYmKCJsZW5ndGgiPT1jfHxvJiYoIm9mZnNldCI9PWN8fCJwYXJlbnQiPT1jKXx8bCYmKCJidWZmZXIiPT1jfHwiYnl0ZUxlbmd0aCI9PWN8fCJieXRlT2Zmc2V0Ij09Yyl8fEh0KGMsdSkpfHxzLnB1c2goYyk7cmV0dXJuIHN9LFF0PU9iamVjdC5wcm90b3R5cGU7dmFyIHRlPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuY29uc3RydWN0b3I7cmV0dXJuIHQ9PT0oImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUucHJvdG90eXBlfHxRdCl9O3ZhciBlZT1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChlKG4pKX19KE9iamVjdC5rZXlzLE9iamVjdCksbmU9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgcmU9ZnVuY3Rpb24odCl7aWYoIXRlKHQpKXJldHVybiBlZSh0KTt2YXIgZT1bXTtmb3IodmFyIG4gaW4gT2JqZWN0KHQpKW5lLmNhbGwodCxuKSYmImNvbnN0cnVjdG9yIiE9biYmZS5wdXNoKG4pO3JldHVybiBlfTt2YXIgaWU9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJkt0KHQubGVuZ3RoKSYmIWoodCl9O3ZhciBvZT1mdW5jdGlvbih0KXtyZXR1cm4gaWUodCk/R3QodCk6cmUodCl9O3ZhciBsZT1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuLHIpe2lmKG51bGw9PW4pcmV0dXJuIG47aWYoIWllKG4pKXJldHVybiB0KG4scik7Zm9yKHZhciBpPW4ubGVuZ3RoLG89ZT9pOi0xLGw9T2JqZWN0KG4pOyhlP28tLTorK288aSkmJiExIT09cihsW29dLG8sbCk7KTtyZXR1cm4gbn19KChmdW5jdGlvbih0LGUpe3JldHVybiB0JiYkdCh0LGUsb2UpfSkpO3ZhciBhZT1mdW5jdGlvbih0KXtyZXR1cm4gdH07dmFyIHNlPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6YWV9O3ZhciB1ZT1mdW5jdGlvbihlLG4pe3JldHVybih0KGUpP3p0OmxlKShlLHNlKG4pKX07dmFyIGNlPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1uZXcgcnQsdGhpcy5zaXplPTB9O3ZhciBmZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49ZS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1lLnNpemUsbn07dmFyIGhlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldCh0KX07dmFyIGdlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX07dmFyIHZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXztpZihuIGluc3RhbmNlb2YgcnQpe3ZhciByPW4uX19kYXRhX187aWYoIWl0fHxyLmxlbmd0aDwxOTkpcmV0dXJuIHIucHVzaChbdCxlXSksdGhpcy5zaXplPSsrbi5zaXplLHRoaXM7bj10aGlzLl9fZGF0YV9fPW5ldyBndChyKX1yZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemU9bi5zaXplLHRoaXN9O2Z1bmN0aW9uIGRlKHQpe3ZhciBlPXRoaXMuX19kYXRhX189bmV3IHJ0KHQpO3RoaXMuc2l6ZT1lLnNpemV9ZGUucHJvdG90eXBlLmNsZWFyPWNlLGRlLnByb3RvdHlwZS5kZWxldGU9ZmUsZGUucHJvdG90eXBlLmdldD1oZSxkZS5wcm90b3R5cGUuaGFzPWdlLGRlLnByb3RvdHlwZS5zZXQ9dmU7dmFyIHBlPWRlO3ZhciB5ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5zZXQodCwiX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyIpLHRoaXN9O3ZhciBfZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9O2Z1bmN0aW9uIG1lKHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBndDsrK2U8bjspdGhpcy5hZGQodFtlXSl9bWUucHJvdG90eXBlLmFkZD1tZS5wcm90b3R5cGUucHVzaD15ZSxtZS5wcm90b3R5cGUuaGFzPV9lO3ZhciBiZT1tZTt2YXIgeGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGg7KytuPHI7KWlmKGUodFtuXSxuLHQpKXJldHVybiEwO3JldHVybiExfTt2YXIgd2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5oYXMoZSl9O3ZhciBqZT1mdW5jdGlvbih0LGUsbixyLGksbyl7dmFyIGw9MSZuLGE9dC5sZW5ndGgscz1lLmxlbmd0aDtpZihhIT1zJiYhKGwmJnM+YSkpcmV0dXJuITE7dmFyIHU9by5nZXQodCksYz1vLmdldChlKTtpZih1JiZjKXJldHVybiB1PT1lJiZjPT10O3ZhciBmPS0xLGg9ITAsZz0yJm4/bmV3IGJlOnZvaWQgMDtmb3Ioby5zZXQodCxlKSxvLnNldChlLHQpOysrZjxhOyl7dmFyIHY9dFtmXSxkPWVbZl07aWYocil2YXIgcD1sP3IoZCx2LGYsZSx0LG8pOnIodixkLGYsdCxlLG8pO2lmKHZvaWQgMCE9PXApe2lmKHApY29udGludWU7aD0hMTticmVha31pZihnKXtpZigheGUoZSwoZnVuY3Rpb24odCxlKXtpZighd2UoZyxlKSYmKHY9PT10fHxpKHYsdCxuLHIsbykpKXJldHVybiBnLnB1c2goZSl9KSkpe2g9ITE7YnJlYWt9fWVsc2UgaWYodiE9PWQmJiFpKHYsZCxuLHIsbykpe2g9ITE7YnJlYWt9fXJldHVybiBvLmRlbGV0ZSh0KSxvLmRlbGV0ZShlKSxofSxBZT1vLlVpbnQ4QXJyYXk7dmFyIE9lPWZ1bmN0aW9uKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LHIpe25bKytlXT1bcix0XX0pKSxufTt2YXIgU2U9ZnVuY3Rpb24odCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe25bKytlXT10fSkpLG59LE1lPWw/bC5wcm90b3R5cGU6dm9pZCAwLFBlPU1lP01lLnZhbHVlT2Y6dm9pZCAwO3ZhciBrZT1mdW5jdGlvbih0LGUsbixyLGksbyxsKXtzd2l0Y2gobil7Y2FzZSJbb2JqZWN0IERhdGFWaWV3XSI6aWYodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fHQuYnl0ZU9mZnNldCE9ZS5ieXRlT2Zmc2V0KXJldHVybiExO3Q9dC5idWZmZXIsZT1lLmJ1ZmZlcjtjYXNlIltvYmplY3QgQXJyYXlCdWZmZXJdIjpyZXR1cm4hKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHwhbyhuZXcgQWUodCksbmV3IEFlKGUpKSk7Y2FzZSJbb2JqZWN0IEJvb2xlYW5dIjpjYXNlIltvYmplY3QgRGF0ZV0iOmNhc2UiW29iamVjdCBOdW1iZXJdIjpyZXR1cm4gVigrdCwrZSk7Y2FzZSJbb2JqZWN0IEVycm9yXSI6cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIltvYmplY3QgUmVnRXhwXSI6Y2FzZSJbb2JqZWN0IFN0cmluZ10iOnJldHVybiB0PT1lKyIiO2Nhc2UiW29iamVjdCBNYXBdIjp2YXIgYT1PZTtjYXNlIltvYmplY3QgU2V0XSI6dmFyIHM9MSZyO2lmKGF8fChhPVNlKSx0LnNpemUhPWUuc2l6ZSYmIXMpcmV0dXJuITE7dmFyIHU9bC5nZXQodCk7aWYodSlyZXR1cm4gdT09ZTtyfD0yLGwuc2V0KHQsZSk7dmFyIGM9amUoYSh0KSxhKGUpLHIsaSxvLGwpO3JldHVybiBsLmRlbGV0ZSh0KSxjO2Nhc2UiW29iamVjdCBTeW1ib2xdIjppZihQZSlyZXR1cm4gUGUuY2FsbCh0KT09UGUuY2FsbChlKX1yZXR1cm4hMX07dmFyIEZlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPS0xLHI9ZS5sZW5ndGgsaT10Lmxlbmd0aDsrK248cjspdFtpK25dPWVbbl07cmV0dXJuIHR9O3ZhciBUZT1mdW5jdGlvbihlLG4scil7dmFyIGk9bihlKTtyZXR1cm4gdChlKT9pOkZlKGkscihlKSl9O3ZhciB6ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aCxpPTAsbz1bXTsrK248cjspe3ZhciBsPXRbbl07ZShsLG4sdCkmJihvW2krK109bCl9cmV0dXJuIG99O3ZhciAkZT1mdW5jdGlvbigpe3JldHVybltdfSxJZT1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLEVlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsTmU9RWU/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9T2JqZWN0KHQpLHplKEVlKHQpLChmdW5jdGlvbihlKXtyZXR1cm4gSWUuY2FsbCh0LGUpfSkpKX06JGU7dmFyIFJlPWZ1bmN0aW9uKHQpe3JldHVybiBUZSh0LG9lLE5lKX0sQ2U9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgQmU9ZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBsPTEmbixhPVJlKHQpLHM9YS5sZW5ndGg7aWYocyE9UmUoZSkubGVuZ3RoJiYhbClyZXR1cm4hMTtmb3IodmFyIHU9czt1LS07KXt2YXIgYz1hW3VdO2lmKCEobD9jIGluIGU6Q2UuY2FsbChlLGMpKSlyZXR1cm4hMX12YXIgZj1vLmdldCh0KSxoPW8uZ2V0KGUpO2lmKGYmJmgpcmV0dXJuIGY9PWUmJmg9PXQ7dmFyIGc9ITA7by5zZXQodCxlKSxvLnNldChlLHQpO2Zvcih2YXIgdj1sOysrdTxzOyl7dmFyIGQ9dFtjPWFbdV1dLHA9ZVtjXTtpZihyKXZhciB5PWw/cihwLGQsYyxlLHQsbyk6cihkLHAsYyx0LGUsbyk7aWYoISh2b2lkIDA9PT15P2Q9PT1wfHxpKGQscCxuLHIsbyk6eSkpe2c9ITE7YnJlYWt9dnx8KHY9ImNvbnN0cnVjdG9yIj09Yyl9aWYoZyYmIXYpe3ZhciBfPXQuY29uc3RydWN0b3IsbT1lLmNvbnN0cnVjdG9yO189PW18fCEoImNvbnN0cnVjdG9yImluIHQpfHwhKCJjb25zdHJ1Y3RvciJpbiBlKXx8ImZ1bmN0aW9uIj09dHlwZW9mIF8mJl8gaW5zdGFuY2VvZiBfJiYiZnVuY3Rpb24iPT10eXBlb2YgbSYmbSBpbnN0YW5jZW9mIG18fChnPSExKX1yZXR1cm4gby5kZWxldGUodCksby5kZWxldGUoZSksZ30sVWU9UihvLCJEYXRhVmlldyIpLExlPVIobywiUHJvbWlzZSIpLERlPVIobywiU2V0IiksSGU9UihvLCJXZWFrTWFwIiksS2U9UChVZSksWGU9UChpdCksSmU9UChMZSksWWU9UChEZSksWmU9UChIZSksVmU9ZDsoVWUmJiJbb2JqZWN0IERhdGFWaWV3XSIhPVZlKG5ldyBVZShuZXcgQXJyYXlCdWZmZXIoMSkpKXx8aXQmJiJbb2JqZWN0IE1hcF0iIT1WZShuZXcgaXQpfHxMZSYmIltvYmplY3QgUHJvbWlzZV0iIT1WZShMZS5yZXNvbHZlKCkpfHxEZSYmIltvYmplY3QgU2V0XSIhPVZlKG5ldyBEZSl8fEhlJiYiW29iamVjdCBXZWFrTWFwXSIhPVZlKG5ldyBIZSkpJiYoVmU9ZnVuY3Rpb24odCl7dmFyIGU9ZCh0KSxuPSJbb2JqZWN0IE9iamVjdF0iPT1lP3QuY29uc3RydWN0b3I6dm9pZCAwLHI9bj9QKG4pOiIiO2lmKHIpc3dpdGNoKHIpe2Nhc2UgS2U6cmV0dXJuIltvYmplY3QgRGF0YVZpZXddIjtjYXNlIFhlOnJldHVybiJbb2JqZWN0IE1hcF0iO2Nhc2UgSmU6cmV0dXJuIltvYmplY3QgUHJvbWlzZV0iO2Nhc2UgWWU6cmV0dXJuIltvYmplY3QgU2V0XSI7Y2FzZSBaZTpyZXR1cm4iW29iamVjdCBXZWFrTWFwXSJ9cmV0dXJuIGV9KTt2YXIgV2U9VmUscWU9IltvYmplY3QgT2JqZWN0XSIsR2U9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgUWU9ZnVuY3Rpb24oZSxuLHIsaSxvLGwpe3ZhciBhPXQoZSkscz10KG4pLHU9YT8iW29iamVjdCBBcnJheV0iOldlKGUpLGM9cz8iW29iamVjdCBBcnJheV0iOldlKG4pLGY9KHU9IltvYmplY3QgQXJndW1lbnRzXSI9PXU/cWU6dSk9PXFlLGg9KGM9IltvYmplY3QgQXJndW1lbnRzXSI9PWM/cWU6Yyk9PXFlLGc9dT09YztpZihnJiZMdChlKSl7aWYoIUx0KG4pKXJldHVybiExO2E9ITAsZj0hMX1pZihnJiYhZilyZXR1cm4gbHx8KGw9bmV3IHBlKSxhfHxXdChlKT9qZShlLG4scixpLG8sbCk6a2UoZSxuLHUscixpLG8sbCk7aWYoISgxJnIpKXt2YXIgdj1mJiZHZS5jYWxsKGUsIl9fd3JhcHBlZF9fIiksZD1oJiZHZS5jYWxsKG4sIl9fd3JhcHBlZF9fIik7aWYodnx8ZCl7dmFyIHA9dj9lLnZhbHVlKCk6ZSx5PWQ/bi52YWx1ZSgpOm47cmV0dXJuIGx8fChsPW5ldyBwZSksbyhwLHkscixpLGwpfX1yZXR1cm4hIWcmJihsfHwobD1uZXcgcGUpLEJlKGUsbixyLGksbyxsKSl9O3ZhciB0bj1mdW5jdGlvbiB0KGUsbixyLGksbyl7cmV0dXJuIGU9PT1ufHwobnVsbD09ZXx8bnVsbD09bnx8IXAoZSkmJiFwKG4pP2UhPWUmJm4hPW46UWUoZSxuLHIsaSx0LG8pKX07dmFyIGVuPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW4ubGVuZ3RoLG89aSxsPSFyO2lmKG51bGw9PXQpcmV0dXJuIW87Zm9yKHQ9T2JqZWN0KHQpO2ktLTspe3ZhciBhPW5baV07aWYobCYmYVsyXT9hWzFdIT09dFthWzBdXTohKGFbMF1pbiB0KSlyZXR1cm4hMX1mb3IoOysraTxvOyl7dmFyIHM9KGE9bltpXSlbMF0sdT10W3NdLGM9YVsxXTtpZihsJiZhWzJdKXtpZih2b2lkIDA9PT11JiYhKHMgaW4gdCkpcmV0dXJuITF9ZWxzZXt2YXIgZj1uZXcgcGU7aWYocil2YXIgaD1yKHUsYyxzLHQsZSxmKTtpZighKHZvaWQgMD09PWg/dG4oYyx1LDMscixmKTpoKSlyZXR1cm4hMX19cmV0dXJuITB9O3ZhciBubj1mdW5jdGlvbih0KXtyZXR1cm4gdD09dCYmIXgodCl9O3ZhciBybj1mdW5jdGlvbih0KXtmb3IodmFyIGU9b2UodCksbj1lLmxlbmd0aDtuLS07KXt2YXIgcj1lW25dLGk9dFtyXTtlW25dPVtyLGksbm4oaSldfXJldHVybiBlfTt2YXIgb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG51bGwhPW4mJihuW3RdPT09ZSYmKHZvaWQgMCE9PWV8fHQgaW4gT2JqZWN0KG4pKSl9fTt2YXIgbG49ZnVuY3Rpb24odCl7dmFyIGU9cm4odCk7cmV0dXJuIDE9PWUubGVuZ3RoJiZlWzBdWzJdP29uKGVbMF1bMF0sZVswXVsxXSk6ZnVuY3Rpb24obil7cmV0dXJuIG49PT10fHxlbihuLHQsZSl9fTt2YXIgYW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmZSBpbiBPYmplY3QodCl9O3ZhciBzbj1mdW5jdGlvbihlLG4scil7Zm9yKHZhciBpPS0xLG89KG49QXQobixlKSkubGVuZ3RoLGw9ITE7KytpPG87KXt2YXIgYT1PdChuW2ldKTtpZighKGw9bnVsbCE9ZSYmcihlLGEpKSlicmVhaztlPWVbYV19cmV0dXJuIGx8fCsraSE9bz9sOiEhKG89bnVsbD09ZT8wOmUubGVuZ3RoKSYmS3QobykmJkh0KGEsbykmJih0KGUpfHxCdChlKSl9O3ZhciB1bj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZzbih0LGUsYW4pfTt2YXIgY249ZnVuY3Rpb24odCxlKXtyZXR1cm4gYih0KSYmbm4oZSk/b24oT3QodCksZSk6ZnVuY3Rpb24obil7dmFyIHI9TXQobix0KTtyZXR1cm4gdm9pZCAwPT09ciYmcj09PWU/dW4obix0KTp0bihlLHIsMyl9fTt2YXIgZm49ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3ZvaWQgMDplW3RdfX07dmFyIGhuPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gU3QoZSx0KX19O3ZhciBnbj1mdW5jdGlvbih0KXtyZXR1cm4gYih0KT9mbihPdCh0KSk6aG4odCl9O3ZhciB2bj1mdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm51bGw9PWU/YWU6Im9iamVjdCI9PXR5cGVvZiBlP3QoZSk/Y24oZVswXSxlWzFdKTpsbihlKTpnbihlKX07dmFyIGRuPWZ1bmN0aW9uKHQsZSl7dmFyIG49LTEscj1pZSh0KT9BcnJheSh0Lmxlbmd0aCk6W107cmV0dXJuIGxlKHQsKGZ1bmN0aW9uKHQsaSxvKXtyWysrbl09ZSh0LGksbyl9KSkscn07dmFyIHBuPWZ1bmN0aW9uKGUsbil7cmV0dXJuKHQoZSk/bXQ6ZG4pKGUsdm4obikpfTt2YXIgeW49ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scj0tMSxpPXQubGVuZ3RoOysrcjxpOyl7dmFyIG89ZSh0W3JdKTt2b2lkIDAhPT1vJiYobj12b2lkIDA9PT1uP286bitvKX1yZXR1cm4gbn07dmFyIF9uPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD95bih0LGFlKTowfTt2YXIgbW49ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlfHwhdChlKSYmcChlKSYmIltvYmplY3QgU3RyaW5nXSI9PWQoZSl9LGJuPWZuKCJsZW5ndGgiKSx4bj1SZWdFeHAoIltcXHUyMDBkXFx1ZDgwMC1cXHVkZmZmXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXFx1ZmUwZVxcdWZlMGZdIik7dmFyIHduPWZ1bmN0aW9uKHQpe3JldHVybiB4bi50ZXN0KHQpfSxqbj0iW1xcdWQ4MDAtXFx1ZGZmZl0iLEFuPSJbXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXSIsT249IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIsU249IlteXFx1ZDgwMC1cXHVkZmZmXSIsTW49Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLFBuPSJbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdIixrbj0iKD86IitBbisifCIrT24rIikiKyI/IixGbj0iW1xcdWZlMGVcXHVmZTBmXT8iK2tuKygiKD86XFx1MjAwZCg/OiIrW1NuLE1uLFBuXS5qb2luKCJ8IikrIilbXFx1ZmUwZVxcdWZlMGZdPyIra24rIikqIiksVG49Iig/OiIrW1NuK0FuKyI/IixBbixNbixQbixqbl0uam9pbigifCIpKyIpIix6bj1SZWdFeHAoT24rIig/PSIrT24rIil8IitUbitGbiwiZyIpO3ZhciAkbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9em4ubGFzdEluZGV4PTA7em4udGVzdCh0KTspKytlO3JldHVybiBlfTt2YXIgSW49ZnVuY3Rpb24odCl7cmV0dXJuIHduKHQpPyRuKHQpOmJuKHQpfTt2YXIgRW49ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gMDtpZihpZSh0KSlyZXR1cm4gbW4odCk/SW4odCk6dC5sZW5ndGg7dmFyIGU9V2UodCk7cmV0dXJuIltvYmplY3QgTWFwXSI9PWV8fCJbb2JqZWN0IFNldF0iPT1lP3Quc2l6ZTpyZSh0KS5sZW5ndGh9O3ZhciBObj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR8fHAodCkmJiJbb2JqZWN0IE51bWJlcl0iPT1kKHQpfTtmdW5jdGlvbiBSbih0KXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBDbih0KXtpZihSbih0KSl7Zm9yKGxldCBlIGluIHQpcmV0dXJuITA7cmV0dXJuITF9cmV0dXJuITF9ZnVuY3Rpb24gQm4odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBVbih0KXtyZXR1cm4hIWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IFVuZGVmaW5lZF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVsbF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7aWYoUm4odCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiExO3JldHVybiEwfXJldHVybiExfSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuISghRnQodCl8fCIiIT09dCl9KHQpfHwhIWZ1bmN0aW9uKHQpe3JldHVybiEhQm4odCkmJjA9PT10Lmxlbmd0aH0odCkpKSl9ZnVuY3Rpb24gTG4odCl7cmV0dXJuISFCbih0KSYmKDAhPT10Lmxlbmd0aCYmKDEhPT10Lmxlbmd0aHx8IVVuKHRbMF0pKSl9ZnVuY3Rpb24gRG4odCl7bGV0IGU9ITE7cmV0dXJuIFR0KHQpP2U9IWlzTmFOKE51bWJlcih0KSk6ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVtYmVyXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpJiYoZT0hMCksZX12YXIgSG49L1xzLzt2YXIgS249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoO2UtLSYmSG4udGVzdCh0LmNoYXJBdChlKSk7KTtyZXR1cm4gZX0sWG49L15ccysvO3ZhciBKbj1mdW5jdGlvbih0KXtyZXR1cm4gdD90LnNsaWNlKDAsS24odCkrMSkucmVwbGFjZShYbiwiIik6dH0sWW49L15bLStdMHhbMC05YS1mXSskL2ksWm49L14wYlswMV0rJC9pLFZuPS9eMG9bMC03XSskL2ksV249cGFyc2VJbnQ7dmFyIHFuPWZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdDtpZih5KHQpKXJldHVybiBOYU47aWYoeCh0KSl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQudmFsdWVPZj90LnZhbHVlT2YoKTp0O3Q9eChlKT9lKyIiOmV9aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiAwPT09dD90Oit0O3Q9Sm4odCk7dmFyIG49Wm4udGVzdCh0KTtyZXR1cm4gbnx8Vm4udGVzdCh0KT9Xbih0LnNsaWNlKDIpLG4/Mjo4KTpZbi50ZXN0KHQpP05hTjordH07dmFyIEduPWZ1bmN0aW9uKHQpe3JldHVybiB0P0luZmluaXR5PT09KHQ9cW4odCkpfHwtSW5maW5pdHk9PT10PzE3OTc2OTMxMzQ4NjIzMTU3ZTI5MioodDwwPy0xOjEpOnQ9PXQ/dDowOjA9PT10P3Q6MH07ZnVuY3Rpb24gUW4odCl7aWYoIURuKHQpKXJldHVybiAwO3JldHVybiBHbih0KX1mdW5jdGlvbiB0cih0LGUpe3JldHVybiEhUm4odCkmJighKCFUdChlKSYmIURuKGUpKSYmZSBpbiB0KX1mdW5jdGlvbiBlcih0LGU9e30pe2lmKEVuKHQpPD0wKXJldHVybltdO2xldCBuPU10KGUsImtleVgiKTtUdChuKXx8KG49IngiKTtsZXQgcj1NdChlLCJrZXlZIik7VHQocil8fChyPSJ5Iik7bGV0IGk9W107cmV0dXJuIHVlKHQsKHQ9PntsZXQgZT1udWxsLG89bnVsbDtCbih0KSYmRW4odCk+PTI/KGU9TXQodCwwKSxvPU10KHQsMSkpOihlPU10KHQsbixudWxsKSxvPU10KHQscixudWxsKSksRG4oZSkmJkRuKG8pJiYoZT1xbihlKSxvPXFuKG8pLGkucHVzaCh7eDplLHk6b30pKX0pKSxpfWZ1bmN0aW9uIG5yKHQsZT17fSl7aWYoRW4odCk8PTApcmV0dXJuW107bGV0IG49TXQoZSwia2V5WCIpO1R0KG4pfHwobj0ieCIpO2xldCByPU10KGUsImtleVkiKTtUdChyKXx8KHI9InkiKTtsZXQgaT1NdChlLCJrZXlaIiwiIik7VHQoaSl8fChpPSJ6Iik7bGV0IG89W107cmV0dXJuIHVlKHQsKHQ9PntsZXQgZT1udWxsLGw9bnVsbCxhPW51bGw7Qm4odCkmJkVuKHQpPj0zPyhlPU10KHQsMCksbD1NdCh0LDEpLGE9TXQodCwyKSk6KGU9TXQodCxuLG51bGwpLGw9TXQodCxyLG51bGwpLGE9TXQodCxpLG51bGwpKSxEbihlKSYmRG4obCkmJkRuKGEpJiYoZT1xbihlKSxsPXFuKGwpLGE9cW4oYSksby5wdXNoKHt4OmUseTpsLHo6YX0pKX0pKSxvfXZhciBycj1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPS0xLGk9dC5sZW5ndGg7KytyPGk7KXt2YXIgbz10W3JdLGw9ZShvKTtpZihudWxsIT1sJiYodm9pZCAwPT09YT9sPT1sJiYheShsKTpuKGwsYSkpKXZhciBhPWwscz1vfXJldHVybiBzfTt2YXIgaXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDxlfTt2YXIgb3I9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoP3JyKHQsYWUsaXIpOnZvaWQgMH07dmFyIGxyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+ZX07dmFyIGFyPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9ycih0LGFlLGxyKTp2b2lkIDB9O2Z1bmN0aW9uIHNyKHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH12YXIgdXI9ZnVuY3Rpb24odCxlKXt2YXIgbj1bXTtyZXR1cm4gbGUodCwoZnVuY3Rpb24odCxyLGkpe2UodCxyLGkpJiZuLnB1c2godCl9KSksbn07dmFyIGNyPWZ1bmN0aW9uKGUsbil7cmV0dXJuKHQoZSk/emU6dXIpKGUsdm4obikpfSxmcj1NYXRoLmNlaWwsaHI9TWF0aC5tYXg7dmFyIGdyPWZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgaT0tMSxvPWhyKGZyKChlLXQpLyhufHwxKSksMCksbD1BcnJheShvKTtvLS07KWxbcj9vOisraV09dCx0Kz1uO3JldHVybiBsfTt2YXIgdnI9ZnVuY3Rpb24odCxlLG4pe2lmKCF4KG4pKXJldHVybiExO3ZhciByPXR5cGVvZiBlO3JldHVybiEhKCJudW1iZXIiPT1yP2llKG4pJiZIdChlLG4ubGVuZ3RoKToic3RyaW5nIj09ciYmZSBpbiBuKSYmVihuW2VdLHQpfTt2YXIgZHI9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gciYmIm51bWJlciIhPXR5cGVvZiByJiZ2cihlLG4scikmJihuPXI9dm9pZCAwKSxlPUduKGUpLHZvaWQgMD09PW4/KG49ZSxlPTApOm49R24obikscj12b2lkIDA9PT1yP2U8bj8xOi0xOkduKHIpLGdyKGUsbixyLHQpfX0oKTt2YXIgcHI9ZnVuY3Rpb24odCxlKXt2YXIgbj1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIG4/eW4odCxlKS9uOk5hTn07dmFyIHlyPWZ1bmN0aW9uKHQpe3JldHVybiBwcih0LGFlKX07ZnVuY3Rpb24gX3IodCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIG1yKHQpe2lmKCFMbih0KSlyZXR1cm57ZXJyOiJhcnIgaXMgbm90IGFuIGVmZmVjdGl2ZSBhcnJheSJ9O2xldCBlPU10KHQsMCksbj0wO0xuKGUpJiYobj1FbihlKSk7bGV0IHI9W107aWYoMD09PW4/KHI9Y3IodCxEbikscj1wbihyLFFuKSk6dWUodCwodD0+e2xldCBlPSEwLGk9W107dWUoZHIobiksKG49PntsZXQgcj1NdCh0LG4pO0RuKHIpfHwoZT0hMSksaS5wdXNoKFFuKHIpKX0pKSxlJiZyLnB1c2goaSl9KSksMD09PUVuKHIpKXJldHVybntlcnI6ImFyciBoYXMgbm8gZWZmZWN0aXZlIGRhdGEifTtsZXQgaT10PT57bGV0IGU9KHQ9PntsZXQgZT1vcih0KSxuPWFyKHQpO3JldHVybnttaW46ZSxtYXg6bixyYW5nZTpuLWUsbWlkOihuK2UpLzIsYXZnOnlyKHQpfX0pKHQpLG49KCh0LGUsbixyKT0+cG4odCwodD0+KHQtZSkvcikpKSh0LGUubWluLGUubWF4LGUucmFuZ2UpO3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9fcihPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe3NyKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpfcihPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH0oe2FycjpufSxlKX0sbz1udWxsO3JldHVybiBvPTA9PT1uP2kocik6cG4oZHIobiksKHQ9PntsZXQgZT1wbihyLHQpO3JldHVybiBpKGUpfSkpLG99ZnVuY3Rpb24gYnIodCxlPVtdKXtpZighTG4odCkpcmV0dXJue2VycjoiYXJyIGlzIG5vdCBhbiBlZmZlY3RpdmUgYXJyYXkifTtpZihFbihlKT4wKXtpZighQ24oTXQodCwwKSkpcmV0dXJue2VycjoiYXJyIGlzIG5vdCBhbiBlZmZlY3RpdmUgYXJyYXkgb2Ygb2JqZWN0cyJ9O2xldCBuPVtdO3VlKHQsKHQ9PntsZXQgcj1bXTt1ZShlLChlPT57ci5wdXNoKE10KHQsZSwiIikpfSkpLG4ucHVzaChyKX0pKSx0PW59cmV0dXJuIG1yKHQpfWZ1bmN0aW9uIHhyKHQsZT17fSl7bGV0IG49TXQoZSwic2NhbGUiKTtEbihuKXx8KG49MSksbj1RbihuKTtsZXQgcj1icihwbih0LCJ4IikpLGk9YnIocG4odCwieSIpKSxvPWJyKHBuKHQsInoiKSksbD1NYXRoLm1heChyLnJhbmdlLGkucmFuZ2UpLGE9bC8yLHM9W3ttaW46ci5taWQtYSxtYXg6ci5taWQrYSxyYW5nZTpsfSx7bWluOmkubWlkLWEsbWF4OmkubWlkK2EscmFuZ2U6bH0se21pbjpvLm1pbixtYXg6by5tYXgscmFuZ2U6by5yYW5nZX1dLHU9KHQsZSk9Pk5uKHQpPyh0LXNbZV0ubWluKS9zW2VdLnJhbmdlKm46bnVsbDt0PXBuKHQsKHQ9Pih7eDp1KHQueCwwKSx5OnUodC55LDEpLHo6dSh0LnosMil9KSkpO2xldCBjPXBuKHQsIngiKSxmPW9yKGMpLGg9YXIoYyksZz1wbih0LCJ5Iiksdj1vcihnKSxkPWFyKGcpLHA9cG4odCwieiIpO3JldHVybntwczp0LHBzTWluTWF4Ont4bWluOmYseG1heDpoLHltaW46dix5bWF4OmQsem1pbjpvcihwKSx6bWF4OmFyKHApfSxzdDpzLG52OnUsaW52Oih0LGUpPT5Obih0KT90L24qc1tlXS5yYW5nZStzW2VdLm1pbjpudWxsfX12YXIgd3I9bD9sLmlzQ29uY2F0U3ByZWFkYWJsZTp2b2lkIDA7dmFyIGpyPWZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfHxCdChlKXx8ISEod3ImJmUmJmVbd3JdKX07dmFyIEFyPWZ1bmN0aW9uIHQoZSxuLHIsaSxvKXt2YXIgbD0tMSxhPWUubGVuZ3RoO2ZvcihyfHwocj1qciksb3x8KG89W10pOysrbDxhOyl7dmFyIHM9ZVtsXTtuPjAmJnIocyk/bj4xP3QocyxuLTEscixpLG8pOkZlKG8scyk6aXx8KG9bby5sZW5ndGhdPXMpfXJldHVybiBvfTt2YXIgT3I9ZnVuY3Rpb24odCl7cmV0dXJuKG51bGw9PXQ/MDp0Lmxlbmd0aCk/QXIodCwxKTpbXX07ZnVuY3Rpb24gU3IodCl7bGV0IGU9ZnVuY3Rpb24odCl7bGV0IGU9RW4oTXQodCwiMCIsbnVsbCkpLG49RW4oTXQodCwiMC4wIixudWxsKSk7cmV0dXJuIDI9PT1FbihNdCh0LCIwLjAuMCIsbnVsbCkpPzM6Mj09PW4/MjoyPT09ZT8xOjA9PT1lPzA6KGNvbnNvbGUubG9nKCJpbnZhbGlkIHBvaW50IGRlcHRoIix0KSxudWxsKX0odCk7cmV0dXJuIDM9PT1lP09yKHQpOjI9PT1lP3Q6MT09PWU/W3RdOjA9PT1lP1tdOnR9ZnVuY3Rpb24gTXIodCl7aWYoIUxuKHQpKXJldHVybiAwO3Q9U3IodCk7bGV0IGU9MDtyZXR1cm4gdWUodCwoKHQsbik9PntsZXQgcj1mdW5jdGlvbih0LGU9e30pe2xldCBuPU10KGUsInVzZUFicyIpO2lmKGt0KG4pfHwobj0hMCksIUxuKHQpKXJldHVybiAwO2xldCByPVtdO2lmKHVlKHQsKHQ9PnsyPT09RW4odCkmJkRuKHRbMF0pJiZEbih0WzFdKSYmci5wdXNoKFtRbih0WzBdKSxRbih0WzFdKV0pfSkpLCFMbihyKSlyZXR1cm4gMDtsZXQgaSxvPS0xLGw9RW4ociksYT1yW2wtMV0scz0wO2Zvcig7KytvPGw7KWk9YSxhPXJbb10scys9aVsxXSphWzBdLWlbMF0qYVsxXTtsZXQgdT1zLzI7cmV0dXJuIG4mJih1PU1hdGguYWJzKHUpKSx1fSh0KTswPT09bj9lPXI6ZS09cn0pKSxlPDA/MDplfXZhciBQcj1mdW5jdGlvbigpe3ZhciB0LGU9MCxuPSExO2Z1bmN0aW9uIHIoZSxuKXtyZXR1cm4gdC5saXN0LnB1c2goe3R5cGU6ZSxkYXRhOm4/SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShuKSk6dm9pZCAwfSksdH1yZXR1cm4gdD17bGlzdDpbXSxzZWdtZW50SWQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSsrfSxjaGVja0ludGVyc2VjdGlvbjpmdW5jdGlvbih0LGUpe3JldHVybiByKCJjaGVjayIse3NlZzE6dCxzZWcyOmV9KX0sc2VnbWVudENob3A6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigiZGl2X3NlZyIse3NlZzp0LHB0OmV9KSxyKCJjaG9wIix7c2VnOnQscHQ6ZX0pfSxzdGF0dXNSZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHIoInBvcF9zZWciLHtzZWc6dH0pfSxzZWdtZW50VXBkYXRlOmZ1bmN0aW9uKHQpe3JldHVybiByKCJzZWdfdXBkYXRlIix7c2VnOnR9KX0sc2VnbWVudE5ldzpmdW5jdGlvbih0LGUpe3JldHVybiByKCJuZXdfc2VnIix7c2VnOnQscHJpbWFyeTplfSl9LHNlZ21lbnRSZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHIoInJlbV9zZWciLHtzZWc6dH0pfSx0ZW1wU3RhdHVzOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcigidGVtcF9zdGF0dXMiLHtzZWc6dCxhYm92ZTplLGJlbG93Om59KX0scmV3aW5kOmZ1bmN0aW9uKHQpe3JldHVybiByKCJyZXdpbmQiLHtzZWc6dH0pfSxzdGF0dXM6ZnVuY3Rpb24odCxlLG4pe3JldHVybiByKCJzdGF0dXMiLHtzZWc6dCxhYm92ZTplLGJlbG93Om59KX0sdmVydDpmdW5jdGlvbihlKXtyZXR1cm4gZT09PW4/dDoobj1lLHIoInZlcnQiLHt4OmV9KSl9LGxvZzpmdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJih0PUpTT04uc3RyaW5naWZ5KHQsITEsIiAgIikpLHIoImxvZyIse3R4dDp0fSl9LHJlc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHIoInJlc2V0Iil9LHNlbGVjdGVkOmZ1bmN0aW9uKHQpe3JldHVybiByKCJzZWxlY3RlZCIse3NlZ3M6dH0pfSxjaGFpblN0YXJ0OmZ1bmN0aW9uKHQpe3JldHVybiByKCJjaGFpbl9zdGFydCIse3NlZzp0fSl9LGNoYWluUmVtb3ZlSGVhZDpmdW5jdGlvbih0LGUpe3JldHVybiByKCJjaGFpbl9yZW1faGVhZCIse2luZGV4OnQscHQ6ZX0pfSxjaGFpblJlbW92ZVRhaWw6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigiY2hhaW5fcmVtX3RhaWwiLHtpbmRleDp0LHB0OmV9KX0sY2hhaW5OZXc6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigiY2hhaW5fbmV3Iix7cHQxOnQscHQyOmV9KX0sY2hhaW5NYXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gcigiY2hhaW5fbWF0Y2giLHtpbmRleDp0fSl9LGNoYWluQ2xvc2U6ZnVuY3Rpb24odCl7cmV0dXJuIHIoImNoYWluX2Nsb3NlIix7aW5kZXg6dH0pfSxjaGFpbkFkZEhlYWQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcigiY2hhaW5fYWRkX2hlYWQiLHtpbmRleDp0LHB0OmV9KX0sY2hhaW5BZGRUYWlsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoImNoYWluX2FkZF90YWlsIix7aW5kZXg6dCxwdDplfSl9LGNoYWluQ29ubmVjdDpmdW5jdGlvbih0LGUpe3JldHVybiByKCJjaGFpbl9jb24iLHtpbmRleDE6dCxpbmRleDI6ZX0pfSxjaGFpblJldmVyc2U6ZnVuY3Rpb24odCl7cmV0dXJuIHIoImNoYWluX3JldiIse2luZGV4OnR9KX0sY2hhaW5Kb2luOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoImNoYWluX2pvaW4iLHtpbmRleDE6dCxpbmRleDI6ZX0pfSxkb25lOmZ1bmN0aW9uKCl7cmV0dXJuIHIoImRvbmUiKX19fTt2YXIga3I9ZnVuY3Rpb24odCl7Im51bWJlciIhPXR5cGVvZiB0JiYodD0xZS0xMCk7dmFyIGU9e2Vwc2lsb246ZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlJiYodD1lKSx0fSxwb2ludEFib3ZlT3JPbkxpbmU6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPW5bMF0sbz1uWzFdLGw9clswXSxhPXJbMV0scz1lWzBdO3JldHVybihsLWkpKihlWzFdLW8pLShhLW8pKihzLWkpPj0tdH0scG9pbnRCZXR3ZWVuOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1lWzFdLW5bMV0sbz1yWzBdLW5bMF0sbD1lWzBdLW5bMF0sYT1yWzFdLW5bMV0scz1sKm8raSphO3JldHVybiEoczx0KSYmIShzLShvKm8rYSphKT4tdCl9LHBvaW50c1NhbWVYOmZ1bmN0aW9uKGUsbil7cmV0dXJuIE1hdGguYWJzKGVbMF0tblswXSk8dH0scG9pbnRzU2FtZVk6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gTWF0aC5hYnMoZVsxXS1uWzFdKTx0fSxwb2ludHNTYW1lOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUucG9pbnRzU2FtZVgodCxuKSYmZS5wb2ludHNTYW1lWSh0LG4pfSxwb2ludHNDb21wYXJlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUucG9pbnRzU2FtZVgodCxuKT9lLnBvaW50c1NhbWVZKHQsbik/MDp0WzFdPG5bMV0/LTE6MTp0WzBdPG5bMF0/LTE6MX0scG9pbnRzQ29sbGluZWFyOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1lWzBdLW5bMF0sbz1lWzFdLW5bMV0sbD1uWzBdLXJbMF0sYT1uWzFdLXJbMV07cmV0dXJuIE1hdGguYWJzKGkqYS1sKm8pPHR9LGxpbmVzSW50ZXJzZWN0OmZ1bmN0aW9uKGUsbixyLGkpe3ZhciBvPW5bMF0tZVswXSxsPW5bMV0tZVsxXSxhPWlbMF0tclswXSxzPWlbMV0tclsxXSx1PW8qcy1sKmE7aWYoTWF0aC5hYnModSk8dClyZXR1cm4hMTt2YXIgYz1lWzBdLXJbMF0sZj1lWzFdLXJbMV0saD0oYSpmLXMqYykvdSxnPShvKmYtbCpjKS91LHY9e2Fsb25nQTowLGFsb25nQjowLHB0OltlWzBdK2gqbyxlWzFdK2gqbF19O3JldHVybiB2LmFsb25nQT1oPD0tdD8tMjpoPHQ/LTE6aC0xPD0tdD8wOmgtMTx0PzE6Mix2LmFsb25nQj1nPD0tdD8tMjpnPHQ/LTE6Zy0xPD0tdD8wOmctMTx0PzE6Mix2fSxwb2ludEluc2lkZVJlZ2lvbjpmdW5jdGlvbihlLG4pe2Zvcih2YXIgcj1lWzBdLGk9ZVsxXSxvPW5bbi5sZW5ndGgtMV1bMF0sbD1uW24ubGVuZ3RoLTFdWzFdLGE9ITEscz0wO3M8bi5sZW5ndGg7cysrKXt2YXIgdT1uW3NdWzBdLGM9bltzXVsxXTtjLWk+dCE9bC1pPnQmJihvLXUpKihpLWMpLyhsLWMpK3Utcj50JiYoYT0hYSksbz11LGw9Y31yZXR1cm4gYX19O3JldHVybiBlfSxGcj17Y3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHQ9e3Jvb3Q6e3Jvb3Q6ITAsbmV4dDpudWxsfSxleGlzdHM6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPT1lJiZlIT09dC5yb290fSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10LnJvb3QubmV4dH0sZ2V0SGVhZDpmdW5jdGlvbigpe3JldHVybiB0LnJvb3QubmV4dH0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGUsbil7Zm9yKHZhciByPXQucm9vdCxpPXQucm9vdC5uZXh0O251bGwhPT1pOyl7aWYobihpKSlyZXR1cm4gZS5wcmV2PWkucHJldixlLm5leHQ9aSxpLnByZXYubmV4dD1lLHZvaWQoaS5wcmV2PWUpO3I9aSxpPWkubmV4dH1yLm5leHQ9ZSxlLnByZXY9cixlLm5leHQ9bnVsbH0sZmluZFRyYW5zaXRpb246ZnVuY3Rpb24oZSl7Zm9yKHZhciBuPXQucm9vdCxyPXQucm9vdC5uZXh0O251bGwhPT1yJiYhZShyKTspbj1yLHI9ci5uZXh0O3JldHVybntiZWZvcmU6bj09PXQucm9vdD9udWxsOm4sYWZ0ZXI6cixpbnNlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQucHJldj1uLHQubmV4dD1yLG4ubmV4dD10LG51bGwhPT1yJiYoci5wcmV2PXQpLHR9fX19O3JldHVybiB0fSxub2RlOmZ1bmN0aW9uKHQpe3JldHVybiB0LnByZXY9bnVsbCx0Lm5leHQ9bnVsbCx0LnJlbW92ZT1mdW5jdGlvbigpe3QucHJldi5uZXh0PXQubmV4dCx0Lm5leHQmJih0Lm5leHQucHJldj10LnByZXYpLHQucHJldj1udWxsLHQubmV4dD1udWxsfSx0fX07dmFyIFRyPWZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiByKHQsZSxyKXtyZXR1cm57aWQ6bj9uLnNlZ21lbnRJZCgpOi0xLHN0YXJ0OnQsZW5kOmUsbXlGaWxsOnthYm92ZTpyLm15RmlsbC5hYm92ZSxiZWxvdzpyLm15RmlsbC5iZWxvd30sb3RoZXJGaWxsOm51bGx9fXZhciBpPUZyLmNyZWF0ZSgpO2Z1bmN0aW9uIG8odCxuKXtpLmluc2VydEJlZm9yZSh0LChmdW5jdGlvbihyKXtyZXR1cm4gZnVuY3Rpb24odCxuLHIsaSxvLGwpe3ZhciBhPWUucG9pbnRzQ29tcGFyZShuLG8pO3JldHVybiAwIT09YT9hOmUucG9pbnRzU2FtZShyLGwpPzA6dCE9PWk/dD8xOi0xOmUucG9pbnRBYm92ZU9yT25MaW5lKHIsaT9vOmwsaT9sOm8pPzE6LTF9KHQuaXNTdGFydCx0LnB0LG4sci5pc1N0YXJ0LHIucHQsci5vdGhlci5wdCk8MH0pKX1mdW5jdGlvbiBsKHQsZSl7dmFyIG49ZnVuY3Rpb24odCxlKXt2YXIgbj1Gci5ub2RlKHtpc1N0YXJ0OiEwLHB0OnQuc3RhcnQsc2VnOnQscHJpbWFyeTplLG90aGVyOm51bGwsc3RhdHVzOm51bGx9KTtyZXR1cm4gbyhuLHQuZW5kKSxufSh0LGUpO3JldHVybiBmdW5jdGlvbih0LGUsbil7dmFyIHI9RnIubm9kZSh7aXNTdGFydDohMSxwdDplLmVuZCxzZWc6ZSxwcmltYXJ5Om4sb3RoZXI6dCxzdGF0dXM6bnVsbH0pO3Qub3RoZXI9cixvKHIsdC5wdCl9KG4sdCxlKSxufWZ1bmN0aW9uIGEodCxlKXt2YXIgaT1yKGUsdC5zZWcuZW5kLHQuc2VnKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtuJiZuLnNlZ21lbnRDaG9wKHQuc2VnLGUpLHQub3RoZXIucmVtb3ZlKCksdC5zZWcuZW5kPWUsdC5vdGhlci5wdD1lLG8odC5vdGhlcix0LnB0KX0odCxlKSxsKGksdC5wcmltYXJ5KX1mdW5jdGlvbiBzKHIsbyl7dmFyIGw9RnIuY3JlYXRlKCk7ZnVuY3Rpb24gcyh0KXtyZXR1cm4gbC5maW5kVHJhbnNpdGlvbigoZnVuY3Rpb24obil7dmFyIHIsaSxvLGwsYSxzO3JldHVybihyPXQsaT1uLmV2LG89ci5zZWcuc3RhcnQsbD1yLnNlZy5lbmQsYT1pLnNlZy5zdGFydCxzPWkuc2VnLmVuZCxlLnBvaW50c0NvbGxpbmVhcihvLGEscyk/ZS5wb2ludHNDb2xsaW5lYXIobCxhLHMpfHxlLnBvaW50QWJvdmVPck9uTGluZShsLGEscyk/MTotMTplLnBvaW50QWJvdmVPck9uTGluZShvLGEscyk/MTotMSk+MH0pKX1mdW5jdGlvbiB1KHQscil7dmFyIGk9dC5zZWcsbz1yLnNlZyxsPWkuc3RhcnQscz1pLmVuZCx1PW8uc3RhcnQsYz1vLmVuZDtuJiZuLmNoZWNrSW50ZXJzZWN0aW9uKGksbyk7dmFyIGY9ZS5saW5lc0ludGVyc2VjdChsLHMsdSxjKTtpZighMT09PWYpe2lmKCFlLnBvaW50c0NvbGxpbmVhcihsLHMsdSkpcmV0dXJuITE7aWYoZS5wb2ludHNTYW1lKGwsYyl8fGUucG9pbnRzU2FtZShzLHUpKXJldHVybiExO3ZhciBoPWUucG9pbnRzU2FtZShsLHUpLGc9ZS5wb2ludHNTYW1lKHMsYyk7aWYoaCYmZylyZXR1cm4gcjt2YXIgdj0haCYmZS5wb2ludEJldHdlZW4obCx1LGMpLGQ9IWcmJmUucG9pbnRCZXR3ZWVuKHMsdSxjKTtpZihoKXJldHVybiBkP2EocixzKTphKHQsYykscjt2JiYoZ3x8KGQ/YShyLHMpOmEodCxjKSksYShyLGwpKX1lbHNlIDA9PT1mLmFsb25nQSYmKC0xPT09Zi5hbG9uZ0I/YSh0LHUpOjA9PT1mLmFsb25nQj9hKHQsZi5wdCk6MT09PWYuYWxvbmdCJiZhKHQsYykpLDA9PT1mLmFsb25nQiYmKC0xPT09Zi5hbG9uZ0E/YShyLGwpOjA9PT1mLmFsb25nQT9hKHIsZi5wdCk6MT09PWYuYWxvbmdBJiZhKHIscykpO3JldHVybiExfWZvcih2YXIgYz1bXTshaS5pc0VtcHR5KCk7KXt2YXIgZj1pLmdldEhlYWQoKTtpZihuJiZuLnZlcnQoZi5wdFswXSksZi5pc1N0YXJ0KXtuJiZuLnNlZ21lbnROZXcoZi5zZWcsZi5wcmltYXJ5KTt2YXIgaD1zKGYpLGc9aC5iZWZvcmU/aC5iZWZvcmUuZXY6bnVsbCx2PWguYWZ0ZXI/aC5hZnRlci5ldjpudWxsO2Z1bmN0aW9uIGQoKXtpZihnKXt2YXIgdD11KGYsZyk7aWYodClyZXR1cm4gdH1yZXR1cm4hIXYmJnUoZix2KX1uJiZuLnRlbXBTdGF0dXMoZi5zZWcsISFnJiZnLnNlZywhIXYmJnYuc2VnKTt2YXIgcCx5PWQoKTtpZih5KXt2YXIgXztpZih0KShfPW51bGw9PT1mLnNlZy5teUZpbGwuYmVsb3d8fGYuc2VnLm15RmlsbC5hYm92ZSE9PWYuc2VnLm15RmlsbC5iZWxvdykmJih5LnNlZy5teUZpbGwuYWJvdmU9IXkuc2VnLm15RmlsbC5hYm92ZSk7ZWxzZSB5LnNlZy5vdGhlckZpbGw9Zi5zZWcubXlGaWxsO24mJm4uc2VnbWVudFVwZGF0ZSh5LnNlZyksZi5vdGhlci5yZW1vdmUoKSxmLnJlbW92ZSgpfWlmKGkuZ2V0SGVhZCgpIT09Zil7biYmbi5yZXdpbmQoZi5zZWcpO2NvbnRpbnVlfWlmKHQpXz1udWxsPT09Zi5zZWcubXlGaWxsLmJlbG93fHxmLnNlZy5teUZpbGwuYWJvdmUhPT1mLnNlZy5teUZpbGwuYmVsb3csZi5zZWcubXlGaWxsLmJlbG93PXY/di5zZWcubXlGaWxsLmFib3ZlOnIsZi5zZWcubXlGaWxsLmFib3ZlPV8/IWYuc2VnLm15RmlsbC5iZWxvdzpmLnNlZy5teUZpbGwuYmVsb3c7ZWxzZSBpZihudWxsPT09Zi5zZWcub3RoZXJGaWxsKXA9dj9mLnByaW1hcnk9PT12LnByaW1hcnk/di5zZWcub3RoZXJGaWxsLmFib3ZlOnYuc2VnLm15RmlsbC5hYm92ZTpmLnByaW1hcnk/bzpyLGYuc2VnLm90aGVyRmlsbD17YWJvdmU6cCxiZWxvdzpwfTtuJiZuLnN0YXR1cyhmLnNlZywhIWcmJmcuc2VnLCEhdiYmdi5zZWcpLGYub3RoZXIuc3RhdHVzPWguaW5zZXJ0KEZyLm5vZGUoe2V2OmZ9KSl9ZWxzZXt2YXIgbT1mLnN0YXR1cztpZihudWxsPT09bSl0aHJvdyBuZXcgRXJyb3IoIlBvbHlCb29sOiBaZXJvLWxlbmd0aCBzZWdtZW50IGRldGVjdGVkOyB5b3VyIGVwc2lsb24gaXMgcHJvYmFibHkgdG9vIHNtYWxsIG9yIHRvbyBsYXJnZSIpO2lmKGwuZXhpc3RzKG0ucHJldikmJmwuZXhpc3RzKG0ubmV4dCkmJnUobS5wcmV2LmV2LG0ubmV4dC5ldiksbiYmbi5zdGF0dXNSZW1vdmUobS5ldi5zZWcpLG0ucmVtb3ZlKCksIWYucHJpbWFyeSl7dmFyIGI9Zi5zZWcubXlGaWxsO2Yuc2VnLm15RmlsbD1mLnNlZy5vdGhlckZpbGwsZi5zZWcub3RoZXJGaWxsPWJ9Yy5wdXNoKGYuc2VnKX1pLmdldEhlYWQoKS5yZW1vdmUoKX1yZXR1cm4gbiYmbi5kb25lKCksY31yZXR1cm4gdD97YWRkUmVnaW9uOmZ1bmN0aW9uKHQpe2Zvcih2YXIgcixpLG8sYT10W3QubGVuZ3RoLTFdLHM9MDtzPHQubGVuZ3RoO3MrKyl7cj1hLGE9dFtzXTt2YXIgdT1lLnBvaW50c0NvbXBhcmUocixhKTswIT09dSYmbCgoaT11PDA/cjphLG89dTwwP2E6cix7aWQ6bj9uLnNlZ21lbnRJZCgpOi0xLHN0YXJ0OmksZW5kOm8sbXlGaWxsOnthYm92ZTpudWxsLGJlbG93Om51bGx9LG90aGVyRmlsbDpudWxsfSksITApfX0sY2FsY3VsYXRlOmZ1bmN0aW9uKHQpe3JldHVybiBzKHQsITEpfX06e2NhbGN1bGF0ZTpmdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtsKHIodC5zdGFydCx0LmVuZCx0KSwhMCl9KSksbi5mb3JFYWNoKChmdW5jdGlvbih0KXtsKHIodC5zdGFydCx0LmVuZCx0KSwhMSl9KSkscyhlLGkpfX19O3ZhciB6cj1mdW5jdGlvbih0LGUsbil7dmFyIHI9W10saT1bXTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbz10LnN0YXJ0LGw9dC5lbmQ7aWYoZS5wb2ludHNTYW1lKG8sbCkpY29uc29sZS53YXJuKCJQb2x5Qm9vbDogV2FybmluZzogWmVyby1sZW5ndGggc2VnbWVudCBkZXRlY3RlZDsgeW91ciBlcHNpbG9uIGlzIHByb2JhYmx5IHRvbyBzbWFsbCBvciB0b28gbGFyZ2UiKTtlbHNle24mJm4uY2hhaW5TdGFydCh0KTtmb3IodmFyIGE9e2luZGV4OjAsbWF0Y2hlc19oZWFkOiExLG1hdGNoZXNfcHQxOiExfSxzPXtpbmRleDowLG1hdGNoZXNfaGVhZDohMSxtYXRjaGVzX3B0MTohMX0sdT1hLGM9MDtjPHIubGVuZ3RoO2MrKyl7dmFyIGY9KHA9cltjXSlbMF07cFsxXTt2YXIgaD1wW3AubGVuZ3RoLTFdO2lmKHBbcC5sZW5ndGgtMl0sZS5wb2ludHNTYW1lKGYsbykpe2lmKEEoYywhMCwhMCkpYnJlYWt9ZWxzZSBpZihlLnBvaW50c1NhbWUoZixsKSl7aWYoQShjLCEwLCExKSlicmVha31lbHNlIGlmKGUucG9pbnRzU2FtZShoLG8pKXtpZihBKGMsITEsITApKWJyZWFrfWVsc2UgaWYoZS5wb2ludHNTYW1lKGgsbCkmJkEoYywhMSwhMSkpYnJlYWt9aWYodT09PWEpcmV0dXJuIHIucHVzaChbbyxsXSksdm9pZChuJiZuLmNoYWluTmV3KG8sbCkpO2lmKHU9PT1zKXtuJiZuLmNoYWluTWF0Y2goYS5pbmRleCk7dmFyIGc9YS5pbmRleCx2PWEubWF0Y2hlc19wdDE/bDpvLGQ9YS5tYXRjaGVzX2hlYWQscD1yW2ddLHk9ZD9wWzBdOnBbcC5sZW5ndGgtMV0sXz1kP3BbMV06cFtwLmxlbmd0aC0yXSxtPWQ/cFtwLmxlbmd0aC0xXTpwWzBdLGI9ZD9wW3AubGVuZ3RoLTJdOnBbMV07cmV0dXJuIGUucG9pbnRzQ29sbGluZWFyKF8seSx2KSYmKGQ/KG4mJm4uY2hhaW5SZW1vdmVIZWFkKGEuaW5kZXgsdikscC5zaGlmdCgpKToobiYmbi5jaGFpblJlbW92ZVRhaWwoYS5pbmRleCx2KSxwLnBvcCgpKSx5PV8pLGUucG9pbnRzU2FtZShtLHYpPyhyLnNwbGljZShnLDEpLGUucG9pbnRzQ29sbGluZWFyKGIsbSx5KSYmKGQ/KG4mJm4uY2hhaW5SZW1vdmVUYWlsKGEuaW5kZXgseSkscC5wb3AoKSk6KG4mJm4uY2hhaW5SZW1vdmVIZWFkKGEuaW5kZXgseSkscC5zaGlmdCgpKSksbiYmbi5jaGFpbkNsb3NlKGEuaW5kZXgpLHZvaWQgaS5wdXNoKHApKTp2b2lkKGQ/KG4mJm4uY2hhaW5BZGRIZWFkKGEuaW5kZXgsdikscC51bnNoaWZ0KHYpKToobiYmbi5jaGFpbkFkZFRhaWwoYS5pbmRleCx2KSxwLnB1c2godikpKX12YXIgeD1hLmluZGV4LHc9cy5pbmRleDtuJiZuLmNoYWluQ29ubmVjdCh4LHcpO3ZhciBqPXJbeF0ubGVuZ3RoPHJbd10ubGVuZ3RoO2EubWF0Y2hlc19oZWFkP3MubWF0Y2hlc19oZWFkP2o/KE8oeCksUyh4LHcpKTooTyh3KSxTKHcseCkpOlModyx4KTpzLm1hdGNoZXNfaGVhZD9TKHgsdyk6aj8oTyh4KSxTKHcseCkpOihPKHcpLFMoeCx3KSl9ZnVuY3Rpb24gQSh0LGUsbil7cmV0dXJuIHUuaW5kZXg9dCx1Lm1hdGNoZXNfaGVhZD1lLHUubWF0Y2hlc19wdDE9bix1PT09YT8odT1zLCExKToodT1udWxsLCEwKX1mdW5jdGlvbiBPKHQpe24mJm4uY2hhaW5SZXZlcnNlKHQpLHJbdF0ucmV2ZXJzZSgpfWZ1bmN0aW9uIFModCxpKXt2YXIgbz1yW3RdLGw9cltpXSxhPW9bby5sZW5ndGgtMV0scz1vW28ubGVuZ3RoLTJdLHU9bFswXSxjPWxbMV07ZS5wb2ludHNDb2xsaW5lYXIocyxhLHUpJiYobiYmbi5jaGFpblJlbW92ZVRhaWwodCxhKSxvLnBvcCgpLGE9cyksZS5wb2ludHNDb2xsaW5lYXIoYSx1LGMpJiYobiYmbi5jaGFpblJlbW92ZUhlYWQoaSx1KSxsLnNoaWZ0KCkpLG4mJm4uY2hhaW5Kb2luKHQsaSksclt0XT1vLmNvbmNhdChsKSxyLnNwbGljZShpLDEpfX0pKSxpfTtmdW5jdGlvbiAkcih0LGUsbil7dmFyIHI9W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGk9KHQubXlGaWxsLmFib3ZlPzg6MCkrKHQubXlGaWxsLmJlbG93PzQ6MCkrKHQub3RoZXJGaWxsJiZ0Lm90aGVyRmlsbC5hYm92ZT8yOjApKyh0Lm90aGVyRmlsbCYmdC5vdGhlckZpbGwuYmVsb3c/MTowKTswIT09ZVtpXSYmci5wdXNoKHtpZDpuP24uc2VnbWVudElkKCk6LTEsc3RhcnQ6dC5zdGFydCxlbmQ6dC5lbmQsbXlGaWxsOnthYm92ZToxPT09ZVtpXSxiZWxvdzoyPT09ZVtpXX0sb3RoZXJGaWxsOm51bGx9KX0pKSxuJiZuLnNlbGVjdGVkKHIpLHJ9dmFyIElyLEVyPXt1bmlvbjpmdW5jdGlvbih0LGUpe3JldHVybiAkcih0LFswLDIsMSwwLDIsMiwwLDAsMSwwLDEsMCwwLDAsMCwwXSxlKX0saW50ZXJzZWN0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuICRyKHQsWzAsMCwwLDAsMCwyLDAsMiwwLDAsMSwxLDAsMiwxLDBdLGUpfSxkaWZmZXJlbmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuICRyKHQsWzAsMCwwLDAsMiwwLDIsMCwxLDEsMCwwLDAsMSwyLDBdLGUpfSxkaWZmZXJlbmNlUmV2OmZ1bmN0aW9uKHQsZSl7cmV0dXJuICRyKHQsWzAsMiwxLDAsMCwwLDEsMSwwLDIsMCwyLDAsMCwwLDBdLGUpfSx4b3I6ZnVuY3Rpb24odCxlKXtyZXR1cm4gJHIodCxbMCwyLDEsMCwyLDAsMCwxLDEsMCwwLDIsMCwxLDIsMF0sZSl9fSxOcj1FcixScj17dG9Qb2x5Z29uOmZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbihlKXtpZihlLmxlbmd0aDw9MClyZXR1cm4gdC5zZWdtZW50cyh7aW52ZXJ0ZWQ6ITEscmVnaW9uczpbXX0pO2Z1bmN0aW9uIG4oZSl7dmFyIG49ZS5zbGljZSgwLGUubGVuZ3RoLTEpO3JldHVybiB0LnNlZ21lbnRzKHtpbnZlcnRlZDohMSxyZWdpb25zOltuXX0pfWZvcih2YXIgcj1uKGVbMF0pLGk9MTtpPGUubGVuZ3RoO2krKylyPXQuc2VsZWN0RGlmZmVyZW5jZSh0LmNvbWJpbmUocixuKGVbaV0pKSk7cmV0dXJuIHJ9aWYoIlBvbHlnb24iPT09ZS50eXBlKXJldHVybiB0LnBvbHlnb24obihlLmNvb3JkaW5hdGVzKSk7aWYoIk11bHRpUG9seWdvbiI9PT1lLnR5cGUpe2Zvcih2YXIgcj10LnNlZ21lbnRzKHtpbnZlcnRlZDohMSxyZWdpb25zOltdfSksaT0wO2k8ZS5jb29yZGluYXRlcy5sZW5ndGg7aSsrKXI9dC5zZWxlY3RVbmlvbih0LmNvbWJpbmUocixuKGUuY29vcmRpbmF0ZXNbaV0pKSk7cmV0dXJuIHQucG9seWdvbihyKX10aHJvdyBuZXcgRXJyb3IoIlBvbHlCb29sOiBDYW5ub3QgY29udmVydCBHZW9KU09OIG9iamVjdCB0byBQb2x5Qm9vbCBwb2x5Z29uIil9LGZyb21Qb2x5Z29uOmZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiByKHQsbil7cmV0dXJuIGUucG9pbnRJbnNpZGVSZWdpb24oWy41Kih0WzBdWzBdK3RbMV1bMF0pLC41Kih0WzBdWzFdK3RbMV1bMV0pXSxuKX1mdW5jdGlvbiBpKHQpe3JldHVybntyZWdpb246dCxjaGlsZHJlbjpbXX19bj10LnBvbHlnb24odC5zZWdtZW50cyhuKSk7dmFyIG89aShudWxsKTtmdW5jdGlvbiBsKHQsZSl7Zm9yKHZhciBuPTA7bjx0LmNoaWxkcmVuLmxlbmd0aDtuKyspe2lmKHIoZSwoYT10LmNoaWxkcmVuW25dKS5yZWdpb24pKXJldHVybiB2b2lkIGwoYSxlKX12YXIgbz1pKGUpO2ZvcihuPTA7bjx0LmNoaWxkcmVuLmxlbmd0aDtuKyspe3ZhciBhO3IoKGE9dC5jaGlsZHJlbltuXSkucmVnaW9uLGUpJiYoby5jaGlsZHJlbi5wdXNoKGEpLHQuY2hpbGRyZW4uc3BsaWNlKG4sMSksbi0tKX10LmNoaWxkcmVuLnB1c2gobyl9Zm9yKHZhciBhPTA7YTxuLnJlZ2lvbnMubGVuZ3RoO2ErKyl7dmFyIHM9bi5yZWdpb25zW2FdO3MubGVuZ3RoPDN8fGwobyxzKX1mdW5jdGlvbiB1KHQsZSl7Zm9yKHZhciBuPTAscj10W3QubGVuZ3RoLTFdWzBdLGk9dFt0Lmxlbmd0aC0xXVsxXSxvPVtdLGw9MDtsPHQubGVuZ3RoO2wrKyl7dmFyIGE9dFtsXVswXSxzPXRbbF1bMV07by5wdXNoKFthLHNdKSxuKz1zKnItYSppLHI9YSxpPXN9cmV0dXJuIG48MCE9PWUmJm8ucmV2ZXJzZSgpLG8ucHVzaChbb1swXVswXSxvWzBdWzFdXSksb312YXIgYz1bXTtmdW5jdGlvbiBmKHQpe3ZhciBlPVt1KHQucmVnaW9uLCExKV07Yy5wdXNoKGUpO2Zvcih2YXIgbj0wO248dC5jaGlsZHJlbi5sZW5ndGg7bisrKWUucHVzaChoKHQuY2hpbGRyZW5bbl0pKX1mdW5jdGlvbiBoKHQpe2Zvcih2YXIgZT0wO2U8dC5jaGlsZHJlbi5sZW5ndGg7ZSsrKWYodC5jaGlsZHJlbltlXSk7cmV0dXJuIHUodC5yZWdpb24sITApfWZvcihhPTA7YTxvLmNoaWxkcmVuLmxlbmd0aDthKyspZihvLmNoaWxkcmVuW2FdKTtyZXR1cm4gYy5sZW5ndGg8PTA/e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltdfToxPT1jLmxlbmd0aD97dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6Y1swXX06e3R5cGU6Ik11bHRpUG9seWdvbiIsY29vcmRpbmF0ZXM6Y319fSxDcj1ScixCcj0hMSxVcj1rcigpO2Z1bmN0aW9uIExyKHQsZSxuKXt2YXIgcj1Jci5zZWdtZW50cyh0KSxpPUlyLnNlZ21lbnRzKGUpLG89bihJci5jb21iaW5lKHIsaSkpO3JldHVybiBJci5wb2x5Z29uKG8pfUlyPXtidWlsZExvZzpmdW5jdGlvbih0KXtyZXR1cm4hMD09PXQ/QnI9UHIoKTohMT09PXQmJihCcj0hMSksITEhPT1CciYmQnIubGlzdH0sZXBzaWxvbjpmdW5jdGlvbih0KXtyZXR1cm4gVXIuZXBzaWxvbih0KX0sc2VnbWVudHM6ZnVuY3Rpb24odCl7dmFyIGU9VHIoITAsVXIsQnIpO3JldHVybiB0LnJlZ2lvbnMuZm9yRWFjaChlLmFkZFJlZ2lvbikse3NlZ21lbnRzOmUuY2FsY3VsYXRlKHQuaW52ZXJ0ZWQpLGludmVydGVkOnQuaW52ZXJ0ZWR9fSxjb21iaW5lOmZ1bmN0aW9uKHQsZSl7cmV0dXJue2NvbWJpbmVkOlRyKCExLFVyLEJyKS5jYWxjdWxhdGUodC5zZWdtZW50cyx0LmludmVydGVkLGUuc2VnbWVudHMsZS5pbnZlcnRlZCksaW52ZXJ0ZWQxOnQuaW52ZXJ0ZWQsaW52ZXJ0ZWQyOmUuaW52ZXJ0ZWR9fSxzZWxlY3RVbmlvbjpmdW5jdGlvbih0KXtyZXR1cm57c2VnbWVudHM6TnIudW5pb24odC5jb21iaW5lZCxCciksaW52ZXJ0ZWQ6dC5pbnZlcnRlZDF8fHQuaW52ZXJ0ZWQyfX0sc2VsZWN0SW50ZXJzZWN0OmZ1bmN0aW9uKHQpe3JldHVybntzZWdtZW50czpOci5pbnRlcnNlY3QodC5jb21iaW5lZCxCciksaW52ZXJ0ZWQ6dC5pbnZlcnRlZDEmJnQuaW52ZXJ0ZWQyfX0sc2VsZWN0RGlmZmVyZW5jZTpmdW5jdGlvbih0KXtyZXR1cm57c2VnbWVudHM6TnIuZGlmZmVyZW5jZSh0LmNvbWJpbmVkLEJyKSxpbnZlcnRlZDp0LmludmVydGVkMSYmIXQuaW52ZXJ0ZWQyfX0sc2VsZWN0RGlmZmVyZW5jZVJldjpmdW5jdGlvbih0KXtyZXR1cm57c2VnbWVudHM6TnIuZGlmZmVyZW5jZVJldih0LmNvbWJpbmVkLEJyKSxpbnZlcnRlZDohdC5pbnZlcnRlZDEmJnQuaW52ZXJ0ZWQyfX0sc2VsZWN0WG9yOmZ1bmN0aW9uKHQpe3JldHVybntzZWdtZW50czpOci54b3IodC5jb21iaW5lZCxCciksaW52ZXJ0ZWQ6dC5pbnZlcnRlZDEhPT10LmludmVydGVkMn19LHBvbHlnb246ZnVuY3Rpb24odCl7cmV0dXJue3JlZ2lvbnM6enIodC5zZWdtZW50cyxVcixCciksaW52ZXJ0ZWQ6dC5pbnZlcnRlZH19LHBvbHlnb25Gcm9tR2VvSlNPTjpmdW5jdGlvbih0KXtyZXR1cm4gQ3IudG9Qb2x5Z29uKElyLHQpfSxwb2x5Z29uVG9HZW9KU09OOmZ1bmN0aW9uKHQpe3JldHVybiBDci5mcm9tUG9seWdvbihJcixVcix0KX0sdW5pb246ZnVuY3Rpb24odCxlKXtyZXR1cm4gTHIodCxlLElyLnNlbGVjdFVuaW9uKX0saW50ZXJzZWN0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIExyKHQsZSxJci5zZWxlY3RJbnRlcnNlY3QpfSxkaWZmZXJlbmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIExyKHQsZSxJci5zZWxlY3REaWZmZXJlbmNlKX0sZGlmZmVyZW5jZVJldjpmdW5jdGlvbih0LGUpe3JldHVybiBMcih0LGUsSXIuc2VsZWN0RGlmZmVyZW5jZVJldil9LHhvcjpmdW5jdGlvbih0LGUpe3JldHVybiBMcih0LGUsSXIuc2VsZWN0WG9yKX19LCJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYod2luZG93LlBvbHlCb29sPUlyKTt2YXIgRHI9SXI7ZnVuY3Rpb24gSHIodCxlLG4scixpKXtsZXQgbyxsLGEscyx1PWVbMF0sYz1yWzBdLGY9MCxoPTA7Yz51PT1jPi11PyhvPXUsdT1lWysrZl0pOihvPWMsYz1yWysraF0pO2xldCBnPTA7aWYoZjx0JiZoPG4pZm9yKGM+dT09Yz4tdT8obD11K28sYT1vLShsLXUpLHU9ZVsrK2ZdKToobD1jK28sYT1vLShsLWMpLGM9clsrK2hdKSxvPWwsMCE9PWEmJihpW2crK109YSk7Zjx0JiZoPG47KWM+dT09Yz4tdT8obD1vK3Uscz1sLW8sYT1vLShsLXMpKyh1LXMpLHU9ZVsrK2ZdKToobD1vK2Mscz1sLW8sYT1vLShsLXMpKyhjLXMpLGM9clsrK2hdKSxvPWwsMCE9PWEmJihpW2crK109YSk7Zm9yKDtmPHQ7KWw9byt1LHM9bC1vLGE9by0obC1zKSsodS1zKSx1PWVbKytmXSxvPWwsMCE9PWEmJihpW2crK109YSk7Zm9yKDtoPG47KWw9bytjLHM9bC1vLGE9by0obC1zKSsoYy1zKSxjPXJbKytoXSxvPWwsMCE9PWEmJihpW2crK109YSk7cmV0dXJuIDA9PT1vJiYwIT09Z3x8KGlbZysrXT1vKSxnfWZ1bmN0aW9uIEtyKHQpe3JldHVybiBuZXcgRmxvYXQ2NEFycmF5KHQpfWNvbnN0IFhyPUtyKDQpLEpyPUtyKDgpLFlyPUtyKDEyKSxacj1LcigxNiksVnI9S3IoNCk7ZnVuY3Rpb24gV3IodCxlLG4scixpLG8pe2NvbnN0IGw9KGUtbykqKG4taSksYT0odC1pKSooci1vKSxzPWwtYTtpZigwPT09bHx8MD09PWF8fGw+MCE9YT4wKXJldHVybiBzO2NvbnN0IHU9TWF0aC5hYnMobCthKTtyZXR1cm4gTWF0aC5hYnMocyk+PTMzMzA2NjkwNzM4NzU0NzE2ZS0zMip1P3M6LWZ1bmN0aW9uKHQsZSxuLHIsaSxvLGwpe2xldCBhLHMsdSxjLGYsaCxnLHYsZCxwLHksXyxtLGIseCx3LGosQTtjb25zdCBPPXQtaSxTPW4taSxNPWUtbyxQPXItbztiPU8qUCxoPTEzNDIxNzcyOSpPLGc9aC0oaC1PKSx2PU8tZyxoPTEzNDIxNzcyOSpQLGQ9aC0oaC1QKSxwPVAtZCx4PXYqcC0oYi1nKmQtdipkLWcqcCksdz1NKlMsaD0xMzQyMTc3MjkqTSxnPWgtKGgtTSksdj1NLWcsaD0xMzQyMTc3MjkqUyxkPWgtKGgtUykscD1TLWQsaj12KnAtKHctZypkLXYqZC1nKnApLHk9eC1qLGY9eC15LFhyWzBdPXgtKHkrZikrKGYtaiksXz1iK3ksZj1fLWIsbT1iLShfLWYpKyh5LWYpLHk9bS13LGY9bS15LFhyWzFdPW0tKHkrZikrKGYtdyksQT1fK3ksZj1BLV8sWHJbMl09Xy0oQS1mKSsoeS1mKSxYclszXT1BO2xldCBrPWZ1bmN0aW9uKHQsZSl7bGV0IG49ZVswXTtmb3IobGV0IHI9MTtyPHQ7cisrKW4rPWVbcl07cmV0dXJuIG59KDQsWHIpLEY9MjIyMDQ0NjA0OTI1MDMxNDZlLTMyKmw7aWYoaz49Rnx8LWs+PUYpcmV0dXJuIGs7aWYoZj10LU8sYT10LShPK2YpKyhmLWkpLGY9bi1TLHU9bi0oUytmKSsoZi1pKSxmPWUtTSxzPWUtKE0rZikrKGYtbyksZj1yLVAsYz1yLShQK2YpKyhmLW8pLDA9PT1hJiYwPT09cyYmMD09PXUmJjA9PT1jKXJldHVybiBrO2lmKEY9MTEwOTMzNTY0Nzk2NzA0ODdlLTQ3KmwrMzMzMDY2OTA3Mzg3NTQ3MDZlLTMyKk1hdGguYWJzKGspLGsrPU8qYytQKmEtKE0qdStTKnMpLGs+PUZ8fC1rPj1GKXJldHVybiBrO2I9YSpQLGg9MTM0MjE3NzI5KmEsZz1oLShoLWEpLHY9YS1nLGg9MTM0MjE3NzI5KlAsZD1oLShoLVApLHA9UC1kLHg9dipwLShiLWcqZC12KmQtZypwKSx3PXMqUyxoPTEzNDIxNzcyOSpzLGc9aC0oaC1zKSx2PXMtZyxoPTEzNDIxNzcyOSpTLGQ9aC0oaC1TKSxwPVMtZCxqPXYqcC0ody1nKmQtdipkLWcqcCkseT14LWosZj14LXksVnJbMF09eC0oeStmKSsoZi1qKSxfPWIreSxmPV8tYixtPWItKF8tZikrKHktZikseT1tLXcsZj1tLXksVnJbMV09bS0oeStmKSsoZi13KSxBPV8reSxmPUEtXyxWclsyXT1fLShBLWYpKyh5LWYpLFZyWzNdPUE7Y29uc3QgVD1Icig0LFhyLDQsVnIsSnIpO2I9TypjLGg9MTM0MjE3NzI5Kk8sZz1oLShoLU8pLHY9Ty1nLGg9MTM0MjE3NzI5KmMsZD1oLShoLWMpLHA9Yy1kLHg9dipwLShiLWcqZC12KmQtZypwKSx3PU0qdSxoPTEzNDIxNzcyOSpNLGc9aC0oaC1NKSx2PU0tZyxoPTEzNDIxNzcyOSp1LGQ9aC0oaC11KSxwPXUtZCxqPXYqcC0ody1nKmQtdipkLWcqcCkseT14LWosZj14LXksVnJbMF09eC0oeStmKSsoZi1qKSxfPWIreSxmPV8tYixtPWItKF8tZikrKHktZikseT1tLXcsZj1tLXksVnJbMV09bS0oeStmKSsoZi13KSxBPV8reSxmPUEtXyxWclsyXT1fLShBLWYpKyh5LWYpLFZyWzNdPUE7Y29uc3Qgej1IcihULEpyLDQsVnIsWXIpO2I9YSpjLGg9MTM0MjE3NzI5KmEsZz1oLShoLWEpLHY9YS1nLGg9MTM0MjE3NzI5KmMsZD1oLShoLWMpLHA9Yy1kLHg9dipwLShiLWcqZC12KmQtZypwKSx3PXMqdSxoPTEzNDIxNzcyOSpzLGc9aC0oaC1zKSx2PXMtZyxoPTEzNDIxNzcyOSp1LGQ9aC0oaC11KSxwPXUtZCxqPXYqcC0ody1nKmQtdipkLWcqcCkseT14LWosZj14LXksVnJbMF09eC0oeStmKSsoZi1qKSxfPWIreSxmPV8tYixtPWItKF8tZikrKHktZikseT1tLXcsZj1tLXksVnJbMV09bS0oeStmKSsoZi13KSxBPV8reSxmPUEtXyxWclsyXT1fLShBLWYpKyh5LWYpLFZyWzNdPUE7Y29uc3QgJD1Icih6LFlyLDQsVnIsWnIpO3JldHVybiBaclskLTFdfSh0LGUsbixyLGksbyx1KX1jb25zdCBxcj1NYXRoLnBvdygyLC01MiksR3I9bmV3IFVpbnQzMkFycmF5KDUxMik7Y2xhc3MgUXJ7c3RhdGljIGZyb20odCxlPW9pLG49bGkpe2NvbnN0IHI9dC5sZW5ndGgsaT1uZXcgRmxvYXQ2NEFycmF5KDIqcik7Zm9yKGxldCBvPTA7bzxyO28rKyl7Y29uc3Qgcj10W29dO2lbMipvXT1lKHIpLGlbMipvKzFdPW4ocil9cmV0dXJuIG5ldyBRcihpKX1jb25zdHJ1Y3Rvcih0KXtjb25zdCBlPXQubGVuZ3RoPj4xO2lmKGU+MCYmIm51bWJlciIhPXR5cGVvZiB0WzBdKXRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgY29vcmRzIHRvIGNvbnRhaW4gbnVtYmVycy4iKTt0aGlzLmNvb3Jkcz10O2NvbnN0IG49TWF0aC5tYXgoMiplLTUsMCk7dGhpcy5fdHJpYW5nbGVzPW5ldyBVaW50MzJBcnJheSgzKm4pLHRoaXMuX2hhbGZlZGdlcz1uZXcgSW50MzJBcnJheSgzKm4pLHRoaXMuX2hhc2hTaXplPU1hdGguY2VpbChNYXRoLnNxcnQoZSkpLHRoaXMuX2h1bGxQcmV2PW5ldyBVaW50MzJBcnJheShlKSx0aGlzLl9odWxsTmV4dD1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbFRyaT1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbEhhc2g9bmV3IEludDMyQXJyYXkodGhpcy5faGFzaFNpemUpLmZpbGwoLTEpLHRoaXMuX2lkcz1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5fZGlzdHM9bmV3IEZsb2F0NjRBcnJheShlKSx0aGlzLnVwZGF0ZSgpfXVwZGF0ZSgpe2NvbnN0e2Nvb3Jkczp0LF9odWxsUHJldjplLF9odWxsTmV4dDpuLF9odWxsVHJpOnIsX2h1bGxIYXNoOml9PXRoaXMsbz10Lmxlbmd0aD4+MTtsZXQgbD0xLzAsYT0xLzAscz0tMS8wLHU9LTEvMDtmb3IobGV0IGU9MDtlPG87ZSsrKXtjb25zdCBuPXRbMiplXSxyPXRbMiplKzFdO248bCYmKGw9bikscjxhJiYoYT1yKSxuPnMmJihzPW4pLHI+dSYmKHU9ciksdGhpcy5faWRzW2VdPWV9Y29uc3QgYz0obCtzKS8yLGY9KGErdSkvMjtsZXQgaCxnLHYsZD0xLzA7Zm9yKGxldCBlPTA7ZTxvO2UrKyl7Y29uc3Qgbj10aShjLGYsdFsyKmVdLHRbMiplKzFdKTtuPGQmJihoPWUsZD1uKX1jb25zdCBwPXRbMipoXSx5PXRbMipoKzFdO2Q9MS8wO2ZvcihsZXQgZT0wO2U8bztlKyspe2lmKGU9PT1oKWNvbnRpbnVlO2NvbnN0IG49dGkocCx5LHRbMiplXSx0WzIqZSsxXSk7bjxkJiZuPjAmJihnPWUsZD1uKX1sZXQgXz10WzIqZ10sbT10WzIqZysxXSxiPTEvMDtmb3IobGV0IGU9MDtlPG87ZSsrKXtpZihlPT09aHx8ZT09PWcpY29udGludWU7Y29uc3Qgbj1uaShwLHksXyxtLHRbMiplXSx0WzIqZSsxXSk7bjxiJiYodj1lLGI9bil9bGV0IHg9dFsyKnZdLHc9dFsyKnYrMV07aWYoYj09PTEvMCl7Zm9yKGxldCBlPTA7ZTxvO2UrKyl0aGlzLl9kaXN0c1tlXT10WzIqZV0tdFswXXx8dFsyKmUrMV0tdFsxXTtyaSh0aGlzLl9pZHMsdGhpcy5fZGlzdHMsMCxvLTEpO2NvbnN0IGU9bmV3IFVpbnQzMkFycmF5KG8pO2xldCBuPTA7Zm9yKGxldCB0PTAscj0tMS8wO3Q8bzt0Kyspe2NvbnN0IGk9dGhpcy5faWRzW3RdO3RoaXMuX2Rpc3RzW2ldPnImJihlW24rK109aSxyPXRoaXMuX2Rpc3RzW2ldKX1yZXR1cm4gdGhpcy5odWxsPWUuc3ViYXJyYXkoMCxuKSx0aGlzLnRyaWFuZ2xlcz1uZXcgVWludDMyQXJyYXkoMCksdm9pZCh0aGlzLmhhbGZlZGdlcz1uZXcgVWludDMyQXJyYXkoMCkpfWlmKFdyKHAseSxfLG0seCx3KTwwKXtjb25zdCB0PWcsZT1fLG49bTtnPXYsXz14LG09dyx2PXQseD1lLHc9bn1jb25zdCBqPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXtjb25zdCBsPW4tdCxhPXItZSxzPWktdCx1PW8tZSxjPWwqbCthKmEsZj1zKnMrdSp1LGg9LjUvKGwqdS1hKnMpO3JldHVybnt4OnQrKHUqYy1hKmYpKmgseTplKyhsKmYtcypjKSpofX0ocCx5LF8sbSx4LHcpO3RoaXMuX2N4PWoueCx0aGlzLl9jeT1qLnk7Zm9yKGxldCBlPTA7ZTxvO2UrKyl0aGlzLl9kaXN0c1tlXT10aSh0WzIqZV0sdFsyKmUrMV0sai54LGoueSk7cmkodGhpcy5faWRzLHRoaXMuX2Rpc3RzLDAsby0xKSx0aGlzLl9odWxsU3RhcnQ9aDtsZXQgQT0zO25baF09ZVt2XT1nLG5bZ109ZVtoXT12LG5bdl09ZVtnXT1oLHJbaF09MCxyW2ddPTEsclt2XT0yLGkuZmlsbCgtMSksaVt0aGlzLl9oYXNoS2V5KHAseSldPWgsaVt0aGlzLl9oYXNoS2V5KF8sbSldPWcsaVt0aGlzLl9oYXNoS2V5KHgsdyldPXYsdGhpcy50cmlhbmdsZXNMZW49MCx0aGlzLl9hZGRUcmlhbmdsZShoLGcsdiwtMSwtMSwtMSk7Zm9yKGxldCBvLGwsYT0wO2E8dGhpcy5faWRzLmxlbmd0aDthKyspe2NvbnN0IHM9dGhpcy5faWRzW2FdLHU9dFsyKnNdLGM9dFsyKnMrMV07aWYoYT4wJiZNYXRoLmFicyh1LW8pPD1xciYmTWF0aC5hYnMoYy1sKTw9cXIpY29udGludWU7aWYobz11LGw9YyxzPT09aHx8cz09PWd8fHM9PT12KWNvbnRpbnVlO2xldCBmPTA7Zm9yKGxldCB0PTAsZT10aGlzLl9oYXNoS2V5KHUsYyk7dDx0aGlzLl9oYXNoU2l6ZSYmKGY9aVsoZSt0KSV0aGlzLl9oYXNoU2l6ZV0sLTE9PT1mfHxmPT09bltmXSk7dCsrKTtmPWVbZl07bGV0IGQscD1mO2Zvcig7ZD1uW3BdLFdyKHUsYyx0WzIqcF0sdFsyKnArMV0sdFsyKmRdLHRbMipkKzFdKT49MDspaWYocD1kLHA9PT1mKXtwPS0xO2JyZWFrfWlmKC0xPT09cCljb250aW51ZTtsZXQgeT10aGlzLl9hZGRUcmlhbmdsZShwLHMsbltwXSwtMSwtMSxyW3BdKTtyW3NdPXRoaXMuX2xlZ2FsaXplKHkrMikscltwXT15LEErKztsZXQgXz1uW3BdO2Zvcig7ZD1uW19dLFdyKHUsYyx0WzIqX10sdFsyKl8rMV0sdFsyKmRdLHRbMipkKzFdKTwwOyl5PXRoaXMuX2FkZFRyaWFuZ2xlKF8scyxkLHJbc10sLTEscltfXSkscltzXT10aGlzLl9sZWdhbGl6ZSh5KzIpLG5bX109XyxBLS0sXz1kO2lmKHA9PT1mKWZvcig7ZD1lW3BdLFdyKHUsYyx0WzIqZF0sdFsyKmQrMV0sdFsyKnBdLHRbMipwKzFdKTwwOyl5PXRoaXMuX2FkZFRyaWFuZ2xlKGQscyxwLC0xLHJbcF0scltkXSksdGhpcy5fbGVnYWxpemUoeSsyKSxyW2RdPXksbltwXT1wLEEtLSxwPWQ7dGhpcy5faHVsbFN0YXJ0PWVbc109cCxuW3BdPWVbX109cyxuW3NdPV8saVt0aGlzLl9oYXNoS2V5KHUsYyldPXMsaVt0aGlzLl9oYXNoS2V5KHRbMipwXSx0WzIqcCsxXSldPXB9dGhpcy5odWxsPW5ldyBVaW50MzJBcnJheShBKTtmb3IobGV0IHQ9MCxlPXRoaXMuX2h1bGxTdGFydDt0PEE7dCsrKXRoaXMuaHVsbFt0XT1lLGU9bltlXTt0aGlzLnRyaWFuZ2xlcz10aGlzLl90cmlhbmdsZXMuc3ViYXJyYXkoMCx0aGlzLnRyaWFuZ2xlc0xlbiksdGhpcy5oYWxmZWRnZXM9dGhpcy5faGFsZmVkZ2VzLnN1YmFycmF5KDAsdGhpcy50cmlhbmdsZXNMZW4pfV9oYXNoS2V5KHQsZSl7cmV0dXJuIE1hdGguZmxvb3IoZnVuY3Rpb24odCxlKXtjb25zdCBuPXQvKE1hdGguYWJzKHQpK01hdGguYWJzKGUpKTtyZXR1cm4oZT4wPzMtbjoxK24pLzR9KHQtdGhpcy5fY3gsZS10aGlzLl9jeSkqdGhpcy5faGFzaFNpemUpJXRoaXMuX2hhc2hTaXplfV9sZWdhbGl6ZSh0KXtjb25zdHtfdHJpYW5nbGVzOmUsX2hhbGZlZGdlczpuLGNvb3JkczpyfT10aGlzO2xldCBpPTAsbz0wO2Zvcig7Oyl7Y29uc3QgbD1uW3RdLGE9dC10JTM7aWYobz1hKyh0KzIpJTMsLTE9PT1sKXtpZigwPT09aSlicmVhazt0PUdyWy0taV07Y29udGludWV9Y29uc3Qgcz1sLWwlMyx1PWErKHQrMSklMyxjPXMrKGwrMiklMyxmPWVbb10saD1lW3RdLGc9ZVt1XSx2PWVbY107aWYoZWkoclsyKmZdLHJbMipmKzFdLHJbMipoXSxyWzIqaCsxXSxyWzIqZ10sclsyKmcrMV0sclsyKnZdLHJbMip2KzFdKSl7ZVt0XT12LGVbbF09Zjtjb25zdCByPW5bY107aWYoLTE9PT1yKXtsZXQgZT10aGlzLl9odWxsU3RhcnQ7ZG97aWYodGhpcy5faHVsbFRyaVtlXT09PWMpe3RoaXMuX2h1bGxUcmlbZV09dDticmVha31lPXRoaXMuX2h1bGxQcmV2W2VdfXdoaWxlKGUhPT10aGlzLl9odWxsU3RhcnQpfXRoaXMuX2xpbmsodCxyKSx0aGlzLl9saW5rKGwsbltvXSksdGhpcy5fbGluayhvLGMpO2NvbnN0IGE9cysobCsxKSUzO2k8R3IubGVuZ3RoJiYoR3JbaSsrXT1hKX1lbHNle2lmKDA9PT1pKWJyZWFrO3Q9R3JbLS1pXX19cmV0dXJuIG99X2xpbmsodCxlKXt0aGlzLl9oYWxmZWRnZXNbdF09ZSwtMSE9PWUmJih0aGlzLl9oYWxmZWRnZXNbZV09dCl9X2FkZFRyaWFuZ2xlKHQsZSxuLHIsaSxvKXtjb25zdCBsPXRoaXMudHJpYW5nbGVzTGVuO3JldHVybiB0aGlzLl90cmlhbmdsZXNbbF09dCx0aGlzLl90cmlhbmdsZXNbbCsxXT1lLHRoaXMuX3RyaWFuZ2xlc1tsKzJdPW4sdGhpcy5fbGluayhsLHIpLHRoaXMuX2xpbmsobCsxLGkpLHRoaXMuX2xpbmsobCsyLG8pLHRoaXMudHJpYW5nbGVzTGVuKz0zLGx9fWZ1bmN0aW9uIHRpKHQsZSxuLHIpe2NvbnN0IGk9dC1uLG89ZS1yO3JldHVybiBpKmkrbypvfWZ1bmN0aW9uIGVpKHQsZSxuLHIsaSxvLGwsYSl7Y29uc3Qgcz10LWwsdT1lLWEsYz1uLWwsZj1yLWEsaD1pLWwsZz1vLWEsdj1jKmMrZipmLGQ9aCpoK2cqZztyZXR1cm4gcyooZipkLXYqZyktdSooYypkLXYqaCkrKHMqcyt1KnUpKihjKmctZipoKTwwfWZ1bmN0aW9uIG5pKHQsZSxuLHIsaSxvKXtjb25zdCBsPW4tdCxhPXItZSxzPWktdCx1PW8tZSxjPWwqbCthKmEsZj1zKnMrdSp1LGg9LjUvKGwqdS1hKnMpLGc9KHUqYy1hKmYpKmgsdj0obCpmLXMqYykqaDtyZXR1cm4gZypnK3Yqdn1mdW5jdGlvbiByaSh0LGUsbixyKXtpZihyLW48PTIwKWZvcihsZXQgaT1uKzE7aTw9cjtpKyspe2NvbnN0IHI9dFtpXSxvPWVbcl07bGV0IGw9aS0xO2Zvcig7bD49biYmZVt0W2xdXT5vOyl0W2wrMV09dFtsLS1dO3RbbCsxXT1yfWVsc2V7bGV0IGk9bisxLG89cjtpaSh0LG4rcj4+MSxpKSxlW3Rbbl1dPmVbdFtyXV0mJmlpKHQsbixyKSxlW3RbaV1dPmVbdFtyXV0mJmlpKHQsaSxyKSxlW3Rbbl1dPmVbdFtpXV0mJmlpKHQsbixpKTtjb25zdCBsPXRbaV0sYT1lW2xdO2Zvcig7Oyl7ZG97aSsrfXdoaWxlKGVbdFtpXV08YSk7ZG97by0tfXdoaWxlKGVbdFtvXV0+YSk7aWYobzxpKWJyZWFrO2lpKHQsaSxvKX10W24rMV09dFtvXSx0W29dPWwsci1pKzE+PW8tbj8ocmkodCxlLGkscikscmkodCxlLG4sby0xKSk6KHJpKHQsZSxuLG8tMSkscmkodCxlLGkscikpfX1mdW5jdGlvbiBpaSh0LGUsbil7Y29uc3Qgcj10W2VdO3RbZV09dFtuXSx0W25dPXJ9ZnVuY3Rpb24gb2kodCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gbGkodCl7cmV0dXJuIHRbMV19Y2xhc3MgYWl7Y29uc3RydWN0b3IoKXt0aGlzLl94MD10aGlzLl95MD10aGlzLl94MT10aGlzLl95MT1udWxsLHRoaXMuXz0iIn1tb3ZlVG8odCxlKXt0aGlzLl8rPWBNJHt0aGlzLl94MD10aGlzLl94MT0rdH0sJHt0aGlzLl95MD10aGlzLl95MT0rZX1gfWNsb3NlUGF0aCgpe251bGwhPT10aGlzLl94MSYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX1saW5lVG8odCxlKXt0aGlzLl8rPWBMJHt0aGlzLl94MT0rdH0sJHt0aGlzLl95MT0rZX1gfWFyYyh0LGUsbil7Y29uc3Qgcj0odD0rdCkrKG49K24pLGk9ZT0rZTtpZihuPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXMiKTtudWxsPT09dGhpcy5feDE/dGhpcy5fKz1gTSR7cn0sJHtpfWA6KE1hdGguYWJzKHRoaXMuX3gxLXIpPjFlLTZ8fE1hdGguYWJzKHRoaXMuX3kxLWkpPjFlLTYpJiYodGhpcy5fKz0iTCIrcisiLCIraSksbiYmKHRoaXMuXys9YEEke259LCR7bn0sMCwxLDEsJHt0LW59LCR7ZX1BJHtufSwke259LDAsMSwxLCR7dGhpcy5feDE9cn0sJHt0aGlzLl95MT1pfWApfXJlY3QodCxlLG4scil7dGhpcy5fKz1gTSR7dGhpcy5feDA9dGhpcy5feDE9K3R9LCR7dGhpcy5feTA9dGhpcy5feTE9K2V9aCR7K259diR7K3J9aCR7LW59WmB9dmFsdWUoKXtyZXR1cm4gdGhpcy5ffHxudWxsfX1jbGFzcyBzaXtjb25zdHJ1Y3Rvcigpe3RoaXMuXz1bXX1tb3ZlVG8odCxlKXt0aGlzLl8ucHVzaChbdCxlXSl9Y2xvc2VQYXRoKCl7dGhpcy5fLnB1c2godGhpcy5fWzBdLnNsaWNlKCkpfWxpbmVUbyh0LGUpe3RoaXMuXy5wdXNoKFt0LGVdKX12YWx1ZSgpe3JldHVybiB0aGlzLl8ubGVuZ3RoP3RoaXMuXzpudWxsfX1jbGFzcyB1aXtjb25zdHJ1Y3Rvcih0LFtlLG4scixpXT1bMCwwLDk2MCw1MDBdKXtpZighKChyPStyKT49KGU9K2UpJiYoaT0raSk+PShuPStuKSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJvdW5kcyIpO3RoaXMuZGVsYXVuYXk9dCx0aGlzLl9jaXJjdW1jZW50ZXJzPW5ldyBGbG9hdDY0QXJyYXkoMip0LnBvaW50cy5sZW5ndGgpLHRoaXMudmVjdG9ycz1uZXcgRmxvYXQ2NEFycmF5KDIqdC5wb2ludHMubGVuZ3RoKSx0aGlzLnhtYXg9cix0aGlzLnhtaW49ZSx0aGlzLnltYXg9aSx0aGlzLnltaW49bix0aGlzLl9pbml0KCl9dXBkYXRlKCl7cmV0dXJuIHRoaXMuZGVsYXVuYXkudXBkYXRlKCksdGhpcy5faW5pdCgpLHRoaXN9X2luaXQoKXtjb25zdHtkZWxhdW5heTp7cG9pbnRzOnQsaHVsbDplLHRyaWFuZ2xlczpufSx2ZWN0b3JzOnJ9PXRoaXMsaT10aGlzLmNpcmN1bWNlbnRlcnM9dGhpcy5fY2lyY3VtY2VudGVycy5zdWJhcnJheSgwLG4ubGVuZ3RoLzMqMik7Zm9yKGxldCBlLHIsbz0wLGw9MCxhPW4ubGVuZ3RoO288YTtvKz0zLGwrPTIpe2NvbnN0IGE9MipuW29dLHM9MipuW28rMV0sdT0yKm5bbysyXSxjPXRbYV0sZj10W2ErMV0saD10W3NdLGc9dFtzKzFdLHY9dFt1XSxkPXRbdSsxXSxwPWgtYyx5PWctZixfPXYtYyxtPWQtZixiPTIqKHAqbS15Kl8pO2lmKE1hdGguYWJzKGIpPDFlLTkpe2xldCBpPTFlOTtjb25zdCBvPTIqblswXTtpKj1NYXRoLnNpZ24oKHRbb10tYykqbS0odFtvKzFdLWYpKl8pLGU9KGMrdikvMi1pKm0scj0oZitkKS8yK2kqX31lbHNle2NvbnN0IHQ9MS9iLG49cCpwK3kqeSxpPV8qXyttKm07ZT1jKyhtKm4teSppKSp0LHI9ZisocCppLV8qbikqdH1pW2xdPWUsaVtsKzFdPXJ9bGV0IG8sbCxhLHM9ZVtlLmxlbmd0aC0xXSx1PTQqcyxjPXRbMipzXSxmPXRbMipzKzFdO3IuZmlsbCgwKTtmb3IobGV0IG49MDtuPGUubGVuZ3RoOysrbilzPWVbbl0sbz11LGw9YyxhPWYsdT00KnMsYz10WzIqc10sZj10WzIqcysxXSxyW28rMl09clt1XT1hLWYscltvKzNdPXJbdSsxXT1jLWx9cmVuZGVyKHQpe2NvbnN0IGU9bnVsbD09dD90PW5ldyBhaTp2b2lkIDAse2RlbGF1bmF5OntoYWxmZWRnZXM6bixpbmVkZ2VzOnIsaHVsbDppfSxjaXJjdW1jZW50ZXJzOm8sdmVjdG9yczpsfT10aGlzO2lmKGkubGVuZ3RoPD0xKXJldHVybiBudWxsO2ZvcihsZXQgZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSl7Y29uc3Qgcj1uW2VdO2lmKHI8ZSljb250aW51ZTtjb25zdCBpPTIqTWF0aC5mbG9vcihlLzMpLGw9MipNYXRoLmZsb29yKHIvMyksYT1vW2ldLHM9b1tpKzFdLHU9b1tsXSxjPW9bbCsxXTt0aGlzLl9yZW5kZXJTZWdtZW50KGEscyx1LGMsdCl9bGV0IGEscz1pW2kubGVuZ3RoLTFdO2ZvcihsZXQgZT0wO2U8aS5sZW5ndGg7KytlKXthPXMscz1pW2VdO2NvbnN0IG49MipNYXRoLmZsb29yKHJbc10vMyksdT1vW25dLGM9b1tuKzFdLGY9NCphLGg9dGhpcy5fcHJvamVjdCh1LGMsbFtmKzJdLGxbZiszXSk7aCYmdGhpcy5fcmVuZGVyU2VnbWVudCh1LGMsaFswXSxoWzFdLHQpfXJldHVybiBlJiZlLnZhbHVlKCl9cmVuZGVyQm91bmRzKHQpe2NvbnN0IGU9bnVsbD09dD90PW5ldyBhaTp2b2lkIDA7cmV0dXJuIHQucmVjdCh0aGlzLnhtaW4sdGhpcy55bWluLHRoaXMueG1heC10aGlzLnhtaW4sdGhpcy55bWF4LXRoaXMueW1pbiksZSYmZS52YWx1ZSgpfXJlbmRlckNlbGwodCxlKXtjb25zdCBuPW51bGw9PWU/ZT1uZXcgYWk6dm9pZCAwLHI9dGhpcy5fY2xpcCh0KTtpZihudWxsPT09cnx8IXIubGVuZ3RoKXJldHVybjtlLm1vdmVUbyhyWzBdLHJbMV0pO2xldCBpPXIubGVuZ3RoO2Zvcig7clswXT09PXJbaS0yXSYmclsxXT09PXJbaS0xXSYmaT4xOylpLT0yO2ZvcihsZXQgdD0yO3Q8aTt0Kz0yKXJbdF09PT1yW3QtMl0mJnJbdCsxXT09PXJbdC0xXXx8ZS5saW5lVG8oclt0XSxyW3QrMV0pO3JldHVybiBlLmNsb3NlUGF0aCgpLG4mJm4udmFsdWUoKX0qY2VsbFBvbHlnb25zKCl7Y29uc3R7ZGVsYXVuYXk6e3BvaW50czp0fX09dGhpcztmb3IobGV0IGU9MCxuPXQubGVuZ3RoLzI7ZTxuOysrZSl7Y29uc3QgdD10aGlzLmNlbGxQb2x5Z29uKGUpO3QmJih0LmluZGV4PWUseWllbGQgdCl9fWNlbGxQb2x5Z29uKHQpe2NvbnN0IGU9bmV3IHNpO3JldHVybiB0aGlzLnJlbmRlckNlbGwodCxlKSxlLnZhbHVlKCl9X3JlbmRlclNlZ21lbnQodCxlLG4scixpKXtsZXQgbztjb25zdCBsPXRoaXMuX3JlZ2lvbmNvZGUodCxlKSxhPXRoaXMuX3JlZ2lvbmNvZGUobixyKTswPT09bCYmMD09PWE/KGkubW92ZVRvKHQsZSksaS5saW5lVG8obixyKSk6KG89dGhpcy5fY2xpcFNlZ21lbnQodCxlLG4scixsLGEpKSYmKGkubW92ZVRvKG9bMF0sb1sxXSksaS5saW5lVG8ob1syXSxvWzNdKSl9Y29udGFpbnModCxlLG4pe3JldHVybihlPStlKT09ZSYmKG49K24pPT1uJiZ0aGlzLmRlbGF1bmF5Ll9zdGVwKHQsZSxuKT09PXR9Km5laWdoYm9ycyh0KXtjb25zdCBlPXRoaXMuX2NsaXAodCk7aWYoZSlmb3IoY29uc3QgbiBvZiB0aGlzLmRlbGF1bmF5Lm5laWdoYm9ycyh0KSl7Y29uc3QgdD10aGlzLl9jbGlwKG4pO2lmKHQpdDpmb3IobGV0IHI9MCxpPWUubGVuZ3RoO3I8aTtyKz0yKWZvcihsZXQgbz0wLGw9dC5sZW5ndGg7bzxsO28rPTIpaWYoZVtyXT09dFtvXSYmZVtyKzFdPT10W28rMV0mJmVbKHIrMiklaV09PXRbKG8rbC0yKSVsXSYmZVsociszKSVpXT09dFsobytsLTEpJWxdKXt5aWVsZCBuO2JyZWFrIHR9fX1fY2VsbCh0KXtjb25zdHtjaXJjdW1jZW50ZXJzOmUsZGVsYXVuYXk6e2luZWRnZXM6bixoYWxmZWRnZXM6cix0cmlhbmdsZXM6aX19PXRoaXMsbz1uW3RdO2lmKC0xPT09bylyZXR1cm4gbnVsbDtjb25zdCBsPVtdO2xldCBhPW87ZG97Y29uc3Qgbj1NYXRoLmZsb29yKGEvMyk7aWYobC5wdXNoKGVbMipuXSxlWzIqbisxXSksYT1hJTM9PTI/YS0yOmErMSxpW2FdIT09dClicmVhazthPXJbYV19d2hpbGUoYSE9PW8mJi0xIT09YSk7cmV0dXJuIGx9X2NsaXAodCl7aWYoMD09PXQmJjE9PT10aGlzLmRlbGF1bmF5Lmh1bGwubGVuZ3RoKXJldHVyblt0aGlzLnhtYXgsdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWluXTtjb25zdCBlPXRoaXMuX2NlbGwodCk7aWYobnVsbD09PWUpcmV0dXJuIG51bGw7Y29uc3R7dmVjdG9yczpufT10aGlzLHI9NCp0O3JldHVybiBuW3JdfHxuW3IrMV0/dGhpcy5fY2xpcEluZmluaXRlKHQsZSxuW3JdLG5bcisxXSxuW3IrMl0sbltyKzNdKTp0aGlzLl9jbGlwRmluaXRlKHQsZSl9X2NsaXBGaW5pdGUodCxlKXtjb25zdCBuPWUubGVuZ3RoO2xldCByLGksbyxsLGE9bnVsbCxzPWVbbi0yXSx1PWVbbi0xXSxjPXRoaXMuX3JlZ2lvbmNvZGUocyx1KSxmPTA7Zm9yKGxldCBoPTA7aDxuO2grPTIpaWYocj1zLGk9dSxzPWVbaF0sdT1lW2grMV0sbz1jLGM9dGhpcy5fcmVnaW9uY29kZShzLHUpLDA9PT1vJiYwPT09YylsPWYsZj0wLGE/YS5wdXNoKHMsdSk6YT1bcyx1XTtlbHNle2xldCBlLG4saCxnLHY7aWYoMD09PW8pe2lmKG51bGw9PT0oZT10aGlzLl9jbGlwU2VnbWVudChyLGkscyx1LG8sYykpKWNvbnRpbnVlO1tuLGgsZyx2XT1lfWVsc2V7aWYobnVsbD09PShlPXRoaXMuX2NsaXBTZWdtZW50KHMsdSxyLGksYyxvKSkpY29udGludWU7W2csdixuLGhdPWUsbD1mLGY9dGhpcy5fZWRnZWNvZGUobixoKSxsJiZmJiZ0aGlzLl9lZGdlKHQsbCxmLGEsYS5sZW5ndGgpLGE/YS5wdXNoKG4saCk6YT1bbixoXX1sPWYsZj10aGlzLl9lZGdlY29kZShnLHYpLGwmJmYmJnRoaXMuX2VkZ2UodCxsLGYsYSxhLmxlbmd0aCksYT9hLnB1c2goZyx2KTphPVtnLHZdfWlmKGEpbD1mLGY9dGhpcy5fZWRnZWNvZGUoYVswXSxhWzFdKSxsJiZmJiZ0aGlzLl9lZGdlKHQsbCxmLGEsYS5sZW5ndGgpO2Vsc2UgaWYodGhpcy5jb250YWlucyh0LCh0aGlzLnhtaW4rdGhpcy54bWF4KS8yLCh0aGlzLnltaW4rdGhpcy55bWF4KS8yKSlyZXR1cm5bdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1pbl07cmV0dXJuIGF9X2NsaXBTZWdtZW50KHQsZSxuLHIsaSxvKXtmb3IoOzspe2lmKDA9PT1pJiYwPT09bylyZXR1cm5bdCxlLG4scl07aWYoaSZvKXJldHVybiBudWxsO2xldCBsLGEscz1pfHxvOzgmcz8obD10KyhuLXQpKih0aGlzLnltYXgtZSkvKHItZSksYT10aGlzLnltYXgpOjQmcz8obD10KyhuLXQpKih0aGlzLnltaW4tZSkvKHItZSksYT10aGlzLnltaW4pOjImcz8oYT1lKyhyLWUpKih0aGlzLnhtYXgtdCkvKG4tdCksbD10aGlzLnhtYXgpOihhPWUrKHItZSkqKHRoaXMueG1pbi10KS8obi10KSxsPXRoaXMueG1pbiksaT8odD1sLGU9YSxpPXRoaXMuX3JlZ2lvbmNvZGUodCxlKSk6KG49bCxyPWEsbz10aGlzLl9yZWdpb25jb2RlKG4scikpfX1fY2xpcEluZmluaXRlKHQsZSxuLHIsaSxvKXtsZXQgbCxhPUFycmF5LmZyb20oZSk7aWYoKGw9dGhpcy5fcHJvamVjdChhWzBdLGFbMV0sbixyKSkmJmEudW5zaGlmdChsWzBdLGxbMV0pLChsPXRoaXMuX3Byb2plY3QoYVthLmxlbmd0aC0yXSxhW2EubGVuZ3RoLTFdLGksbykpJiZhLnB1c2gobFswXSxsWzFdKSxhPXRoaXMuX2NsaXBGaW5pdGUodCxhKSlmb3IobGV0IGUsbj0wLHI9YS5sZW5ndGgsaT10aGlzLl9lZGdlY29kZShhW3ItMl0sYVtyLTFdKTtuPHI7bis9MillPWksaT10aGlzLl9lZGdlY29kZShhW25dLGFbbisxXSksZSYmaSYmKG49dGhpcy5fZWRnZSh0LGUsaSxhLG4pLHI9YS5sZW5ndGgpO2Vsc2UgdGhpcy5jb250YWlucyh0LCh0aGlzLnhtaW4rdGhpcy54bWF4KS8yLCh0aGlzLnltaW4rdGhpcy55bWF4KS8yKSYmKGE9W3RoaXMueG1pbix0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXhdKTtyZXR1cm4gYX1fZWRnZSh0LGUsbixyLGkpe2Zvcig7ZSE9PW47KXtsZXQgbixvO3N3aXRjaChlKXtjYXNlIDU6ZT00O2NvbnRpbnVlO2Nhc2UgNDplPTYsbj10aGlzLnhtYXgsbz10aGlzLnltaW47YnJlYWs7Y2FzZSA2OmU9Mjtjb250aW51ZTtjYXNlIDI6ZT0xMCxuPXRoaXMueG1heCxvPXRoaXMueW1heDticmVhaztjYXNlIDEwOmU9ODtjb250aW51ZTtjYXNlIDg6ZT05LG49dGhpcy54bWluLG89dGhpcy55bWF4O2JyZWFrO2Nhc2UgOTplPTE7Y29udGludWU7Y2FzZSAxOmU9NSxuPXRoaXMueG1pbixvPXRoaXMueW1pbn1yW2ldPT09biYmcltpKzFdPT09b3x8IXRoaXMuY29udGFpbnModCxuLG8pfHwoci5zcGxpY2UoaSwwLG4sbyksaSs9Mil9aWYoci5sZW5ndGg+NClmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrPTIpe2NvbnN0IGU9KHQrMiklci5sZW5ndGgsbj0odCs0KSVyLmxlbmd0aDsoclt0XT09PXJbZV0mJnJbZV09PT1yW25dfHxyW3QrMV09PT1yW2UrMV0mJnJbZSsxXT09PXJbbisxXSkmJihyLnNwbGljZShlLDIpLHQtPTIpfXJldHVybiBpfV9wcm9qZWN0KHQsZSxuLHIpe2xldCBpLG8sbCxhPTEvMDtpZihyPDApe2lmKGU8PXRoaXMueW1pbilyZXR1cm4gbnVsbDsoaT0odGhpcy55bWluLWUpL3IpPGEmJihsPXRoaXMueW1pbixvPXQrKGE9aSkqbil9ZWxzZSBpZihyPjApe2lmKGU+PXRoaXMueW1heClyZXR1cm4gbnVsbDsoaT0odGhpcy55bWF4LWUpL3IpPGEmJihsPXRoaXMueW1heCxvPXQrKGE9aSkqbil9aWYobj4wKXtpZih0Pj10aGlzLnhtYXgpcmV0dXJuIG51bGw7KGk9KHRoaXMueG1heC10KS9uKTxhJiYobz10aGlzLnhtYXgsbD1lKyhhPWkpKnIpfWVsc2UgaWYobjwwKXtpZih0PD10aGlzLnhtaW4pcmV0dXJuIG51bGw7KGk9KHRoaXMueG1pbi10KS9uKTxhJiYobz10aGlzLnhtaW4sbD1lKyhhPWkpKnIpfXJldHVybltvLGxdfV9lZGdlY29kZSh0LGUpe3JldHVybih0PT09dGhpcy54bWluPzE6dD09PXRoaXMueG1heD8yOjApfChlPT09dGhpcy55bWluPzQ6ZT09PXRoaXMueW1heD84OjApfV9yZWdpb25jb2RlKHQsZSl7cmV0dXJuKHQ8dGhpcy54bWluPzE6dD50aGlzLnhtYXg/MjowKXwoZTx0aGlzLnltaW4/NDplPnRoaXMueW1heD84OjApfX1jb25zdCBjaT0yKk1hdGguUEksZmk9TWF0aC5wb3c7ZnVuY3Rpb24gaGkodCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gZ2kodCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gdmkodCxlLG4pe3JldHVyblt0K01hdGguc2luKHQrZSkqbixlK01hdGguY29zKHQtZSkqbl19Y2xhc3MgZGl7c3RhdGljIGZyb20odCxlPWhpLG49Z2kscil7cmV0dXJuIG5ldyBkaSgibGVuZ3RoImluIHQ/ZnVuY3Rpb24odCxlLG4scil7Y29uc3QgaT10Lmxlbmd0aCxvPW5ldyBGbG9hdDY0QXJyYXkoMippKTtmb3IobGV0IGw9MDtsPGk7KytsKXtjb25zdCBpPXRbbF07b1syKmxdPWUuY2FsbChyLGksbCx0KSxvWzIqbCsxXT1uLmNhbGwocixpLGwsdCl9cmV0dXJuIG99KHQsZSxuLHIpOkZsb2F0NjRBcnJheS5mcm9tKGZ1bmN0aW9uKih0LGUsbixyKXtsZXQgaT0wO2Zvcihjb25zdCBvIG9mIHQpeWllbGQgZS5jYWxsKHIsbyxpLHQpLHlpZWxkIG4uY2FsbChyLG8saSx0KSwrK2l9KHQsZSxuLHIpKSl9Y29uc3RydWN0b3IodCl7dGhpcy5fZGVsYXVuYXRvcj1uZXcgUXIodCksdGhpcy5pbmVkZ2VzPW5ldyBJbnQzMkFycmF5KHQubGVuZ3RoLzIpLHRoaXMuX2h1bGxJbmRleD1uZXcgSW50MzJBcnJheSh0Lmxlbmd0aC8yKSx0aGlzLnBvaW50cz10aGlzLl9kZWxhdW5hdG9yLmNvb3Jkcyx0aGlzLl9pbml0KCl9dXBkYXRlKCl7cmV0dXJuIHRoaXMuX2RlbGF1bmF0b3IudXBkYXRlKCksdGhpcy5faW5pdCgpLHRoaXN9X2luaXQoKXtjb25zdCB0PXRoaXMuX2RlbGF1bmF0b3IsZT10aGlzLnBvaW50cztpZih0Lmh1bGwmJnQuaHVsbC5sZW5ndGg+MiYmZnVuY3Rpb24odCl7Y29uc3R7dHJpYW5nbGVzOmUsY29vcmRzOm59PXQ7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kz0zKXtjb25zdCByPTIqZVt0XSxpPTIqZVt0KzFdLG89MiplW3QrMl07aWYoKG5bb10tbltyXSkqKG5baSsxXS1uW3IrMV0pLShuW2ldLW5bcl0pKihuW28rMV0tbltyKzFdKT4xZS0xMClyZXR1cm4hMX1yZXR1cm4hMH0odCkpe3RoaXMuY29sbGluZWFyPUludDMyQXJyYXkuZnJvbSh7bGVuZ3RoOmUubGVuZ3RoLzJ9LCgodCxlKT0+ZSkpLnNvcnQoKCh0LG4pPT5lWzIqdF0tZVsyKm5dfHxlWzIqdCsxXS1lWzIqbisxXSkpO2NvbnN0IHQ9dGhpcy5jb2xsaW5lYXJbMF0sbj10aGlzLmNvbGxpbmVhclt0aGlzLmNvbGxpbmVhci5sZW5ndGgtMV0scj1bZVsyKnRdLGVbMip0KzFdLGVbMipuXSxlWzIqbisxXV0saT0xZS04Kk1hdGguaHlwb3QoclszXS1yWzFdLHJbMl0tclswXSk7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aC8yO3Q8bjsrK3Qpe2NvbnN0IG49dmkoZVsyKnRdLGVbMip0KzFdLGkpO2VbMip0XT1uWzBdLGVbMip0KzFdPW5bMV19dGhpcy5fZGVsYXVuYXRvcj1uZXcgUXIoZSl9ZWxzZSBkZWxldGUgdGhpcy5jb2xsaW5lYXI7Y29uc3Qgbj10aGlzLmhhbGZlZGdlcz10aGlzLl9kZWxhdW5hdG9yLmhhbGZlZGdlcyxyPXRoaXMuaHVsbD10aGlzLl9kZWxhdW5hdG9yLmh1bGwsaT10aGlzLnRyaWFuZ2xlcz10aGlzLl9kZWxhdW5hdG9yLnRyaWFuZ2xlcyxvPXRoaXMuaW5lZGdlcy5maWxsKC0xKSxsPXRoaXMuX2h1bGxJbmRleC5maWxsKC0xKTtmb3IobGV0IHQ9MCxlPW4ubGVuZ3RoO3Q8ZTsrK3Qpe2NvbnN0IGU9aVt0JTM9PTI/dC0yOnQrMV07LTEhPT1uW3RdJiYtMSE9PW9bZV18fChvW2VdPXQpfWZvcihsZXQgdD0wLGU9ci5sZW5ndGg7dDxlOysrdClsW3JbdF1dPXQ7ci5sZW5ndGg8PTImJnIubGVuZ3RoPjAmJih0aGlzLnRyaWFuZ2xlcz1uZXcgSW50MzJBcnJheSgzKS5maWxsKC0xKSx0aGlzLmhhbGZlZGdlcz1uZXcgSW50MzJBcnJheSgzKS5maWxsKC0xKSx0aGlzLnRyaWFuZ2xlc1swXT1yWzBdLG9bclswXV09MSwyPT09ci5sZW5ndGgmJihvW3JbMV1dPTAsdGhpcy50cmlhbmdsZXNbMV09clsxXSx0aGlzLnRyaWFuZ2xlc1syXT1yWzFdKSl9dm9yb25vaSh0KXtyZXR1cm4gbmV3IHVpKHRoaXMsdCl9Km5laWdoYm9ycyh0KXtjb25zdHtpbmVkZ2VzOmUsaHVsbDpuLF9odWxsSW5kZXg6cixoYWxmZWRnZXM6aSx0cmlhbmdsZXM6byxjb2xsaW5lYXI6bH09dGhpcztpZihsKXtjb25zdCBlPWwuaW5kZXhPZih0KTtyZXR1cm4gZT4wJiYoeWllbGQgbFtlLTFdKSx2b2lkKGU8bC5sZW5ndGgtMSYmKHlpZWxkIGxbZSsxXSkpfWNvbnN0IGE9ZVt0XTtpZigtMT09PWEpcmV0dXJuO2xldCBzPWEsdT0tMTtkb3tpZih5aWVsZCB1PW9bc10scz1zJTM9PTI/cy0yOnMrMSxvW3NdIT09dClyZXR1cm47aWYocz1pW3NdLC0xPT09cyl7Y29uc3QgZT1uWyhyW3RdKzEpJW4ubGVuZ3RoXTtyZXR1cm4gdm9pZChlIT09dSYmKHlpZWxkIGUpKX19d2hpbGUocyE9PWEpfWZpbmQodCxlLG49MCl7aWYoKHQ9K3QpIT10fHwoZT0rZSkhPWUpcmV0dXJuLTE7Y29uc3Qgcj1uO2xldCBpO2Zvcig7KGk9dGhpcy5fc3RlcChuLHQsZSkpPj0wJiZpIT09biYmaSE9PXI7KW49aTtyZXR1cm4gaX1fc3RlcCh0LGUsbil7Y29uc3R7aW5lZGdlczpyLGh1bGw6aSxfaHVsbEluZGV4Om8saGFsZmVkZ2VzOmwsdHJpYW5nbGVzOmEscG9pbnRzOnN9PXRoaXM7aWYoLTE9PT1yW3RdfHwhcy5sZW5ndGgpcmV0dXJuKHQrMSklKHMubGVuZ3RoPj4xKTtsZXQgdT10LGM9ZmkoZS1zWzIqdF0sMikrZmkobi1zWzIqdCsxXSwyKTtjb25zdCBmPXJbdF07bGV0IGg9Zjtkb3tsZXQgcj1hW2hdO2NvbnN0IGY9ZmkoZS1zWzIqcl0sMikrZmkobi1zWzIqcisxXSwyKTtpZihmPGMmJihjPWYsdT1yKSxoPWglMz09Mj9oLTI6aCsxLGFbaF0hPT10KWJyZWFrO2lmKGg9bFtoXSwtMT09PWgpe2lmKGg9aVsob1t0XSsxKSVpLmxlbmd0aF0saCE9PXImJmZpKGUtc1syKmhdLDIpK2ZpKG4tc1syKmgrMV0sMik8YylyZXR1cm4gaDticmVha319d2hpbGUoaCE9PWYpO3JldHVybiB1fXJlbmRlcih0KXtjb25zdCBlPW51bGw9PXQ/dD1uZXcgYWk6dm9pZCAwLHtwb2ludHM6bixoYWxmZWRnZXM6cix0cmlhbmdsZXM6aX09dGhpcztmb3IobGV0IGU9MCxvPXIubGVuZ3RoO2U8bzsrK2Upe2NvbnN0IG89cltlXTtpZihvPGUpY29udGludWU7Y29uc3QgbD0yKmlbZV0sYT0yKmlbb107dC5tb3ZlVG8obltsXSxuW2wrMV0pLHQubGluZVRvKG5bYV0sblthKzFdKX1yZXR1cm4gdGhpcy5yZW5kZXJIdWxsKHQpLGUmJmUudmFsdWUoKX1yZW5kZXJQb2ludHModCxlKXt2b2lkIDAhPT1lfHx0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5tb3ZlVG98fChlPXQsdD1udWxsKSxlPW51bGw9PWU/MjorZTtjb25zdCBuPW51bGw9PXQ/dD1uZXcgYWk6dm9pZCAwLHtwb2ludHM6cn09dGhpcztmb3IobGV0IG49MCxpPXIubGVuZ3RoO248aTtuKz0yKXtjb25zdCBpPXJbbl0sbz1yW24rMV07dC5tb3ZlVG8oaStlLG8pLHQuYXJjKGksbyxlLDAsY2kpfXJldHVybiBuJiZuLnZhbHVlKCl9cmVuZGVySHVsbCh0KXtjb25zdCBlPW51bGw9PXQ/dD1uZXcgYWk6dm9pZCAwLHtodWxsOm4scG9pbnRzOnJ9PXRoaXMsaT0yKm5bMF0sbz1uLmxlbmd0aDt0Lm1vdmVUbyhyW2ldLHJbaSsxXSk7Zm9yKGxldCBlPTE7ZTxvOysrZSl7Y29uc3QgaT0yKm5bZV07dC5saW5lVG8ocltpXSxyW2krMV0pfXJldHVybiB0LmNsb3NlUGF0aCgpLGUmJmUudmFsdWUoKX1odWxsUG9seWdvbigpe2NvbnN0IHQ9bmV3IHNpO3JldHVybiB0aGlzLnJlbmRlckh1bGwodCksdC52YWx1ZSgpfXJlbmRlclRyaWFuZ2xlKHQsZSl7Y29uc3Qgbj1udWxsPT1lP2U9bmV3IGFpOnZvaWQgMCx7cG9pbnRzOnIsdHJpYW5nbGVzOml9PXRoaXMsbz0yKmlbdCo9M10sbD0yKmlbdCsxXSxhPTIqaVt0KzJdO3JldHVybiBlLm1vdmVUbyhyW29dLHJbbysxXSksZS5saW5lVG8ocltsXSxyW2wrMV0pLGUubGluZVRvKHJbYV0sclthKzFdKSxlLmNsb3NlUGF0aCgpLG4mJm4udmFsdWUoKX0qdHJpYW5nbGVQb2x5Z29ucygpe2NvbnN0e3RyaWFuZ2xlczp0fT10aGlzO2ZvcihsZXQgZT0wLG49dC5sZW5ndGgvMztlPG47KytlKXlpZWxkIHRoaXMudHJpYW5nbGVQb2x5Z29uKGUpfXRyaWFuZ2xlUG9seWdvbih0KXtjb25zdCBlPW5ldyBzaTtyZXR1cm4gdGhpcy5yZW5kZXJUcmlhbmdsZSh0LGUpLGUudmFsdWUoKX19ZnVuY3Rpb24gcGkodCxlLG49e30pe2lmKCFMbih0KSlyZXR1cm57ZXJyOiJwc1NyYyBpcyBub3QgYW4gYXJyYXkifTtpZighQ24oZSkmJiFMbihlKSlyZXR1cm57ZXJyOiJwc1RhciBpcyBub3QgYW4gb2JqZWN0IG9yIGFycmF5In07bGV0IHI9Q24oZSk7ciYmKGU9W2VdKTtsZXQgaT1NdChuLCJrZXlYIik7VHQoaSl8fChpPSJ4Iik7bGV0IG89TXQobiwia2V5WSIpO1R0KG8pfHwobz0ieSIpO2xldCBsPU10KG4sImtleVoiKTtUdChsKXx8KGw9InoiKTtsZXQgYT1NdChuLCJzY2FsZSIpO2lmKERuKGEpfHwoYT0xKSxhPVFuKGEpLHQ9bnIodCxuKSwwPT09RW4odCkpcmV0dXJue2VycjoicHNTcmMgaGFzIG5vIGVmZmVjdGl2ZSBkYXRhIn07aWYoZT1lcihlLG4pLDA9PT1FbihlKSlyZXR1cm57ZXJyOiJwc1RhciBoYXMgbm8gZWZmZWN0aXZlIGRhdGEifTtsZXQgcz14cih0LHtzY2FsZTphfSk7dD1zLnBzO2xldCB1PXMubnYsYz1zLmludixmPVsuLi50XSxoPVsuLi50XSxnPXt9O3VlKHQsKHQ9PntsZXQgZT1gJHt0Lnh9LSR7dC55fWA7Z1tlXT10Lnp9KSk7bGV0IHYsZD1kaS5mcm9tKGgsKHQ9PnQueCksKHQ9PnQueSkpLHA9WzAsMCxhLGFdLHk9ZC52b3Jvbm9pKHApLF89KGUsbixyKT0+e2xldCBpPVsuLi50XSxvPXt4Om4seTpyLHo6MH07aS5wdXNoKG8pLGUucHVzaChvKTtsZXQgbD1kaS5mcm9tKGksKHQ9PnQueCksKHQ9PnQueSkpLnZvcm9ub2kocCksYT1pLmxlbmd0aC0xLHM9bC5jZWxsUG9seWdvbihhKSx1PU1yKHMpLGM9bnVsbDtpZih1PjApe2xldCB0PVtdLG49bC5kZWxhdW5heS5uZWlnaGJvcnMoYSkscj1uLm5leHQoKTtmb3IoOyFyLmRvbmU7KXtsZXQgZT1yLnZhbHVlO3QucHVzaChlKSxyPW4ubmV4dCgpfWxldCBpPXBuKHQsKHQ9PntsZXQgZT1bc10sbj1beS5jZWxsUG9seWdvbih0KV0scj1bXTt0cnl7cj1mdW5jdGlvbih0LGUpe2lmKCFMbih0KSlyZXR1cm4gbnVsbDtpZighTG4oZSkpcmV0dXJuIG51bGw7dD1Tcih0KSxlPVNyKGUpO2xldCBuPURyLmludGVyc2VjdCh7cmVnaW9uczp0fSx7cmVnaW9uczplfSk7cmV0dXJuIE10KG4sInJlZ2lvbnMiLFtdKX0oZSxuKX1jYXRjaCh0KXtjb25zb2xlLmxvZygicGdzMSIsZSksY29uc29sZS5sb2coInBnczIiLG4pLGNvbnNvbGUubG9nKHQpfWxldCBpPTA7aWYoMT09PUVuKHIpKXRyeXtpPU1yKHJbMF0pfWNhdGNoKHQpe2NvbnNvbGUubG9nKCJpbnRzIixyKSxjb25zb2xlLmxvZyh0KX1yZXR1cm57aWE6aSxpZHg6dH19KSk7Yz1wbihpLCh0PT50LmlhL3UqZVt0LmlkeF0ueikpLGM9X24oYyl9cmV0dXJuIGVbZS5sZW5ndGgtMV0uej1jLGN9LG09KHQsZSk9PntsZXQgbj1gJHt0fS0ke2V9YDtpZih0cihnLG4pKXJldHVybiBnW25dO2lmKHQ8cFswXXx8dD5wWzJdfHxlPHBbMV18fGU+cFszXSlyZXR1cm4gbnVsbDtsZXQgcj0oKHQsZSxuKT0+e2xldCByO3RyeXtyPV8odCxlLG4pfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpLHI9bnVsbCx0LnBvcCgpfXJldHVybiByfSkoZix0LGUpO3JldHVybiBnW25dPXIscn0sYj10PT57bGV0IGU9dC54LG49dShlLDApO2lmKCFObihuKSl0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgbnhbJHtufV1gKTtsZXQgcj10LnksYT11KHIsMSk7aWYoIU5uKGEpKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBueVske2F9XWApO2xldCBzPW0obixhKSxmPWMocywyKTtyZXR1cm4gTm4oZil8fChmPW51bGwpLHtbaV06ZSxbb106cixbbF06Zn19O2lmKHIpe2xldCB0PWVbMF07dj1iKHQpfWVsc2Ugdj1bXSx1ZShlLCh0PT57di5wdXNoKGIodCkpfSkpO3JldHVybiB2fWxldCB5aT17fSxfaT1mdW5jdGlvbih0LGUpe2xldCBuPVtdO2ZvcihsZXQgcj0wO3I8ZTtyKyspbi5wdXNoKHQpO3JldHVybiBufSxtaT1mdW5jdGlvbih0LGUpe2xldCBuPV9pKDAsZSplKTtmb3IobGV0IHI9MDtyPGU7cisrKW5bciplK3JdPXQ7cmV0dXJuIG59LGJpPWZ1bmN0aW9uKHQsZSxuLHIpe2xldCBpLG8sbD1BcnJheShuKnIpO2ZvcihpPTA7aTxuO2krKylmb3Iobz0wO288cjtvKyspbFtpKnIrb109dFtpKnIrb10rZVtpKnIrb107cmV0dXJuIGx9LHhpPWZ1bmN0aW9uKHQsZSxuLHIsaSl7bGV0IG8sbCxhLHM9QXJyYXkobippKTtmb3Iobz0wO288bjtvKyspZm9yKGw9MDtsPGk7bCsrKWZvcihzW28qaStsXT0wLGE9MDthPHI7YSsrKXNbbyppK2xdKz10W28qcithXSplW2EqaStsXTtyZXR1cm4gc30sd2k9ZnVuY3Rpb24odCxlKXtsZXQgbixyLGksbz1BcnJheShlKTtmb3Iobj0wO248ZTtuKyspb1tuXT10W24qZStuXTtmb3Iobj0wO248ZTtuKyspe2ZvcihyPTA7cjxuO3IrKylvW25dLT10W24qZStyXSp0W24qZStyXTtpZihvW25dPD0wKXJldHVybiExO2ZvcihvW25dPU1hdGguc3FydChvW25dKSxyPW4rMTtyPGU7cisrKXtmb3IoaT0wO2k8bjtpKyspdFtyKmUrbl0tPXRbciplK2ldKnRbbiplK2ldO3RbciplK25dLz1vW25dfX1mb3Iobj0wO248ZTtuKyspdFtuKmUrbl09b1tuXTtyZXR1cm4hMH0samk9ZnVuY3Rpb24odCxlKXtsZXQgbixyLGksbztmb3Iobj0wO248ZTtuKyspZm9yKHRbbiplK25dPTEvdFtuKmUrbl0scj1uKzE7cjxlO3IrKyl7Zm9yKG89MCxpPW47aTxyO2krKylvLT10W3IqZStpXSp0W2kqZStuXTt0W3IqZStuXT1vL3RbciplK3JdfWZvcihuPTA7bjxlO24rKylmb3Iocj1uKzE7cjxlO3IrKyl0W24qZStyXT0wO2ZvcihuPTA7bjxlO24rKyl7Zm9yKHRbbiplK25dKj10W24qZStuXSxpPW4rMTtpPGU7aSsrKXRbbiplK25dKz10W2kqZStuXSp0W2kqZStuXTtmb3Iocj1uKzE7cjxlO3IrKylmb3IoaT1yO2k8ZTtpKyspdFtuKmUrcl0rPXRbaSplK25dKnRbaSplK3JdfWZvcihuPTA7bjxlO24rKylmb3Iocj0wO3I8bjtyKyspdFtuKmUrcl09dFtyKmUrbl19LEFpPWZ1bmN0aW9uKHQsZSl7bGV0IG4scixpLG8sbCxhLHMsdSxjLGYsaCxnPWUsdj1BcnJheShlKmUpLGQ9QXJyYXkoZSkscD1BcnJheShlKSx5PUFycmF5KGUpO2ZvcihuPTA7bjxlO24rKylmb3Iobz0wO288ZTtvKyspdltuKmUrb109bj09PW8/MTowO2ZvcihvPTA7bzxlO28rKyl5W29dPTA7Zm9yKG49MDtuPGU7bisrKXtmb3IodT0wLG89MDtvPGU7bysrKWlmKDEhPT15W29dKWZvcihsPTA7bDxlO2wrKykwPT09eVtsXSYmTWF0aC5hYnModFtvKmUrbF0pPj11JiYodT1NYXRoLmFicyh0W28qZStsXSksaT1vLHI9bCk7aWYoKyt5W3JdLGkhPT1yKXtmb3IoYT0wO2E8ZTthKyspaD10W2kqZSthXSx0W2kqZSthXT10W3IqZSthXSx0W3IqZSthXT1oO2ZvcihhPTA7YTxnO2ErKyloPXZbaSplK2FdLHZbaSplK2FdPXZbciplK2FdLHZbciplK2FdPWh9aWYocFtuXT1pLGRbbl09ciwwPT09dFtyKmUrcl0pcmV0dXJuITE7Zm9yKGY9MS90W3IqZStyXSx0W3IqZStyXT0xLGE9MDthPGU7YSsrKXRbciplK2FdKj1mO2ZvcihhPTA7YTxnO2ErKyl2W3IqZSthXSo9Zjtmb3Iocz0wO3M8ZTtzKyspaWYocyE9PXIpe2ZvcihjPXRbcyplK3JdLHRbcyplK3JdPTAsYT0wO2E8ZTthKyspdFtzKmUrYV0tPXRbciplK2FdKmM7Zm9yKGE9MDthPGc7YSsrKXZbcyplK2FdLT12W3IqZSthXSpjfX1mb3IoYT1lLTE7YT49MDthLS0paWYocFthXSE9PWRbYV0pZm9yKGw9MDtsPGU7bCsrKWg9dFtsKmUrcFthXV0sdFtsKmUrcFthXV09dFtsKmUrZFthXV0sdFtsKmUrZFthXV09aDtyZXR1cm4hMH0sT2k9ZnVuY3Rpb24odCxlLG4scixpKXtyZXR1cm4gZSsoci1lKS9uKigxLU1hdGguZXhwKC0xL2kqTWF0aC5wb3codC9uLDIpKSl9LFNpPWZ1bmN0aW9uKHQsZSxuLHIsaSl7cmV0dXJuIGUrKHItZSkvbiooMS1NYXRoLmV4cCgtMS9pKih0L24pKSl9LE1pPWZ1bmN0aW9uKHQsZSxuLHIsaSl7cmV0dXJuIHQ+bj9lKyhyLWUpL246ZSsoci1lKS9uKih0L24qMS41LS41Kk1hdGgucG93KHQvbiwzKSl9O2Z1bmN0aW9uIFBpKHQsZSxuPXt9KXtpZighTG4odCkpcmV0dXJue2VycjoicHNTcmMgaXMgbm90IGFuIGFycmF5In07aWYoIUNuKGUpJiYhTG4oZSkpcmV0dXJue2VycjoicHNUYXIgaXMgbm90IGFuIG9iamVjdCBvciBhcnJheSJ9O2xldCByPUNuKGUpO3ImJihlPVtlXSk7bGV0IGk9TXQobiwia2V5WCIpO1R0KGkpfHwoaT0ieCIpO2xldCBvPU10KG4sImtleVkiKTtUdChvKXx8KG89InkiKTtsZXQgbD1NdChuLCJrZXlaIik7VHQobCl8fChsPSJ6Iik7bGV0IGE9TXQobiwic2NhbGUiKTtEbihhKXx8KGE9MSksYT1RbihhKTtsZXQgcz1NdChuLCJtb2RlbCIpOyJleHBvbmVudGlhbCIhPT1zJiYiZ2F1c3NpYW4iIT09cyYmInNwaGVyaWNhbCIhPT1zJiYocz0iZXhwb25lbnRpYWwiKTtsZXQgdT1NdChuLCJzaWdtYTIiKTtEbih1KXx8KHU9MCksdT1Rbih1KTtsZXQgYz1NdChuLCJhbHBoYSIpO0RuKGMpfHwoYz0xMDApLGM9UW4oYyk7bGV0IGY9TXQobiwicmV0dXJuV2l0aFZhcmlvZ3JhbSIpO2lmKGt0KGYpfHwoZj0hMSksdD1ucih0LG4pLDA9PT1Fbih0KSlyZXR1cm57ZXJyOiJwc1NyYyBoYXMgbm8gZWZmZWN0aXZlIGRhdGEifTtpZihlPWVyKGUsbiksMD09PUVuKGUpKXJldHVybntlcnI6InBzVGFyIGhhcyBubyBlZmZlY3RpdmUgZGF0YSJ9O2xldCBoPXhyKHQse3NjYWxlOmF9KTt0PWgucHM7bGV0IGc9aC5udix2PWguaW52LGQ9e307dWUodCwodD0+e2xldCBlPWAke3QueH0tJHt0Lnl9YDtkW2VdPXQuen0pKTtsZXQgcD1bXSx5PVtdLF89W107dWUodCwodD0+e3AucHVzaCh0LngpLHkucHVzaCh0LnkpLF8ucHVzaCh0LnopfSkpO2xldCBtLGI9eWkudHJhaW4oXyxwLHkscyx1LGMpLHg9dD0+e2xldCBlPXQueCxuPWcoZSwwKTtpZighTm4obikpdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG54WyR7bn1dYCk7bGV0IHI9dC55LGE9ZyhyLDEpO2lmKCFObihhKSl0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgbnlbJHthfV1gKTtsZXQgcz0oKHQsZSk9PntsZXQgbj1gJHt0fS0ke2V9YDtpZih0cihkLG4pKXJldHVybiBkW25dO2xldCByPXlpLnByZWRpY3QodCxlLGIpO3JldHVybiBkW25dPXIscn0pKG4sYSksdT12KHMsMik7cmV0dXJuIE5uKHUpfHwodT1udWxsKSx7W2ldOmUsW29dOnIsW2xdOnV9fTtpZihyKXtsZXQgdD1lWzBdO209eCh0KX1lbHNlIG09W10sdWUoZSwodD0+e20ucHVzaCh4KHQpKX0pKTtyZXR1cm4gZiYmKG09e3Jlc3VsdDptLHZhcmlvZ3JhbTpifSksbX1mdW5jdGlvbiBpbnRlcnAyKHQsZSxuPXt9KXtsZXQgcj1NdChuLCJtZXRob2QiKTsibmF0dXJhbE5laWdoYm9yIiE9PXImJiJrcmlnaW5nIiE9PXImJihyPSJuYXR1cmFsTmVpZ2hib3IiKTtsZXQgaT1NdChuLCJ1c2VTeW5jIik7a3QoaSl8fChpPSExKTtsZXQgbz0oKT0+e2xldCBpPW51bGw7dHJ5eyJuYXR1cmFsTmVpZ2hib3IiPT09cj9pPXBpKHQsZSxuKToia3JpZ2luZyI9PT1yJiYoaT1QaSh0LGUsbikpfWNhdGNoKHQpe2k9e2Vycjp0LnRvU3RyaW5nKCl9fXJldHVybiBpfTtyZXR1cm4gaT9vKCk6KGFzeW5jKCk9PntsZXQgdD1udWxsO3RyeXt0PW8oKTtsZXQgZT1NdCh0LCJlcnIiKTtyZXR1cm4gVHQoZSk/UHJvbWlzZS5yZWplY3QoZSk6dH1jYXRjaCh0KXtyZXR1cm4gY29uc29sZS5sb2codCksUHJvbWlzZS5yZWplY3QodC50b1N0cmluZygpKX19KSgpfXlpLnRyYWluPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXtsZXQgbCxhLHMsdSxjPXt0OnQseDplLHk6bixudWdnZXQ6MCxyYW5nZTowLHNpbGw6MCxBOjEvMyxuOjB9O3N3aXRjaChyKXtjYXNlImdhdXNzaWFuIjpjLm1vZGVsPU9pO2JyZWFrO2Nhc2UiZXhwb25lbnRpYWwiOmMubW9kZWw9U2k7YnJlYWs7Y2FzZSJzcGhlcmljYWwiOmMubW9kZWw9TWl9bGV0IGY9dC5sZW5ndGgsaD1BcnJheSgoZipmLWYpLzIpO2ZvcihsPTAscz0wO2w8ZjtsKyspZm9yKGE9MDthPGw7YSsrLHMrKyloW3NdPUFycmF5KDIpLGhbc11bMF09TWF0aC5wb3coTWF0aC5wb3coZVtsXS1lW2FdLDIpK01hdGgucG93KG5bbF0tblthXSwyKSwuNSksaFtzXVsxXT1NYXRoLmFicyh0W2xdLXRbYV0pO2guc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXS1lWzBdfSkpLGMucmFuZ2U9aFsoZipmLWYpLzItMV1bMF07bGV0IGc9KGYqZi1mKS8yPjMwPzMwOihmKmYtZikvMix2PWMucmFuZ2UvZyxkPV9pKDAsZykscD1faSgwLGcpO2lmKGc8MzApZm9yKHU9MDt1PGc7dSsrKWRbdV09aFt1XVswXSxwW3VdPWhbdV1bMV07ZWxzZXtmb3IobD0wLGE9MCxzPTAsdT0wO2w8ZyYmYTwoZipmLWYpLzI7bCsrLHM9MCl7Zm9yKDtoW2FdWzBdPD0obCsxKSp2JiYoZFt1XSs9aFthXVswXSxwW3VdKz1oW2FdWzFdLGErKyxzKyssIShhPj0oZipmLWYpLzIpKTspO3M+MCYmKGRbdV0vPXMscFt1XS89cyx1KyspfWlmKHU8MilyZXR1cm4gY31sZXQgeT1bXTtmb3IobD0wO2w8dTtsKyspe2xldCB0PWRbbF0sZT1wW2xdO3kucHVzaChbdCxlXSl9bGV0IF89e2RhdGE6aCxiYXJzOnl9O2Muc3ZwZD1fLGY9dSxjLnJhbmdlPWRbZi0xXS1kWzBdO2xldCBtPV9pKDEsMipmKSxiPUFycmF5KGYpLHg9Yy5BO2ZvcihsPTA7bDxmO2wrKyl7c3dpdGNoKHIpe2Nhc2UiZ2F1c3NpYW4iOm1bMipsKzFdPTEtTWF0aC5leHAoLTEveCpNYXRoLnBvdyhkW2xdL2MucmFuZ2UsMikpO2JyZWFrO2Nhc2UiZXhwb25lbnRpYWwiOm1bMipsKzFdPTEtTWF0aC5leHAoLTEveCpkW2xdL2MucmFuZ2UpO2JyZWFrO2Nhc2Uic3BoZXJpY2FsIjptWzIqbCsxXT1kW2xdL2MucmFuZ2UqMS41LS41Kk1hdGgucG93KGRbbF0vYy5yYW5nZSwzKX1iW2xdPXBbbF19bGV0IHc9ZnVuY3Rpb24odCxlLG4pe2xldCByLGksbz1BcnJheShuKmUpO2ZvcihyPTA7cjxlO3IrKylmb3IoaT0wO2k8bjtpKyspb1tpKmUrcl09dFtyKm4raV07cmV0dXJuIG99KG0sZiwyKSxqPXhpKHcsbSwyLGYsMik7aj1iaShqLG1pKDEvbywyKSwyLDIpO2xldCBBPWouc2xpY2UoMCk7d2koaiwyKT9qaShqLDIpOihBaShBLDIpLGo9QSk7bGV0IE89eGkoeGkoaix3LDIsMixmKSxiLDIsZiwxKTtjLm51Z2dldD1PWzBdLGMuc2lsbD1PWzFdKmMucmFuZ2UrYy5udWdnZXQsYy5uPWUubGVuZ3RoLGY9ZS5sZW5ndGg7bGV0IFM9QXJyYXkoZipmKTtmb3IobD0wO2w8ZjtsKyspe2ZvcihhPTA7YTxsO2ErKylTW2wqZithXT1jLm1vZGVsKE1hdGgucG93KE1hdGgucG93KGVbbF0tZVthXSwyKStNYXRoLnBvdyhuW2xdLW5bYV0sMiksLjUpLGMubnVnZ2V0LGMucmFuZ2UsYy5zaWxsLGMuQSksU1thKmYrbF09U1tsKmYrYV07U1tsKmYrbF09Yy5tb2RlbCgwLGMubnVnZ2V0LGMucmFuZ2UsYy5zaWxsLGMuQSl9bGV0IE09YmkoUyxtaShpLGYpLGYsZiksUD1NLnNsaWNlKDApO3dpKE0sZik/amkoTSxmKTooQWkoUCxmKSxNPVApO2xldCBrPU0uc2xpY2UoMCksRj14aShNLHQsZixmLDEpO3JldHVybiBjLks9ayxjLk09RixjfSx5aS5wcmVkaWN0PWZ1bmN0aW9uKHQsZSxuKXtsZXQgcixpPUFycmF5KG4ubik7Zm9yKHI9MDtyPG4ubjtyKyspaVtyXT1uLm1vZGVsKE1hdGgucG93KE1hdGgucG93KHQtbi54W3JdLDIpK01hdGgucG93KGUtbi55W3JdLDIpLC41KSxuLm51Z2dldCxuLnJhbmdlLG4uc2lsbCxuLkEpO3JldHVybiB4aShpLG4uTSwxLG4ubiwxKVswXX0seWkudmFyaWFuY2U9ZnVuY3Rpb24odCxlLG4pe2xldCByLGk9QXJyYXkobi5uKTtmb3Iocj0wO3I8bi5uO3IrKylpW3JdPW4ubW9kZWwoTWF0aC5wb3coTWF0aC5wb3codC1uLnhbcl0sMikrTWF0aC5wb3coZS1uLnlbcl0sMiksLjUpLG4ubnVnZ2V0LG4ucmFuZ2Usbi5zaWxsLG4uQSk7cmV0dXJuIG4ubW9kZWwoMCxuLm51Z2dldCxuLnJhbmdlLG4uc2lsbCxuLkEpK3hpKHhpKGksbi5LLDEsbi5uLG4ubiksaSwxLG4ubiwxKVswXX07CgpsZXQgaW5zdGFuY2UgPSBudWxsCmZ1bmN0aW9uIGluaXQoaW5wdXQpewoKICAgIC8vaW5pdAogICAgbGV0IHIKICAgIAogICAgICAgIHIgPSB7CiAgICAgICAgICAgIG1haW46IGludGVycDIKICAgICAgICB9CiAgICAgICAgCgogICAgLy9vbgogICAgCgogICAgLy9zYXZlCiAgICBpbnN0YW5jZSA9IHIKCn0KCmZ1bmN0aW9uIHNlbmRNZXNzYWdlKGRhdGEpIHsKICAgIAogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoZGF0YSkKICAgICAgICAKfQoKYXN5bmMgZnVuY3Rpb24gcnVuKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcnVuJyxkYXRhKQoKICAgIC8vbW9kZQogICAgbGV0IG1vZGUgPSBkYXRhLm1vZGUKCiAgICAvL2NoZWNrCiAgICBpZihtb2RlICE9PSAnaW5pdCcgJiYgbW9kZSAhPT0gJ2NhbGwnKXsKICAgICAgICByZXR1cm4KICAgIH0KCiAgICAvL2luaXQKICAgIGlmKG1vZGUgPT09ICdpbml0Jyl7CiAgICAgICAgCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy90eXBlCiAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKICAgIAogICAgICAgICAgICAvL2luc3RhbmNlCiAgICAgICAgICAgIGlmKHR5cGUgPT09ICdmdW5jdGlvbicpewogICAgICAgICAgICAgICAgaW5pdCguLi5pbnB1dCkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHR5cGUgPT09ICdvYmplY3QnKXsKICAgICAgICAgICAgICAgIGluc3RhbmNlID0gaW50ZXJwMgogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgIAogICAgICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgICAgICBtb2RlOiAnZW1pdCcsCiAgICAgICAgICAgICAgICBldk5hbWU6ICdlcnJvcicsCiAgICAgICAgICAgICAgICBtc2c6IGVyciwKICAgICAgICAgICAgfQogICAgICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgICAgIH0KICAgICAgICAgICAgCiAgICB9CgogICAgLy9jaGVjawogICAgaWYobW9kZSA9PT0gJ2NhbGwnKXsKICAgICAgICBsZXQgc3RhdGUgPSAnJwogICAgICAgIGxldCBtc2cgPSBudWxsCgogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vZnVuCiAgICAgICAgICAgIGxldCBmdW4gPSBpbnN0YW5jZVtkYXRhLmZ1bl0KCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAoKICAgICAgICAgICAgLy9leGVjCiAgICAgICAgICAgIGF3YWl0IGZ1biguLi5pbnB1dCkKICAgICAgICAgICAgICAgIC50aGVuKChzdWMpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nc3VjY2VzcycKICAgICAgICAgICAgICAgICAgICBtc2c9c3VjCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nZXJyb3InCiAgICAgICAgICAgICAgICAgICAgbXNnPWVycgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgICAgIHN0YXRlID0gJ2Vycm9yJwogICAgICAgICAgICBtc2cgPSBlcnIKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgIG1vZGU6ICdyZXR1cm4nLAogICAgICAgICAgICBpZDogZGF0YS5pZCwKICAgICAgICAgICAgZnVuOiBkYXRhLmZ1biwKICAgICAgICAgICAgc3RhdGUsCiAgICAgICAgICAgIG1zZywKICAgICAgICB9CiAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgIH0KCn0KCmZ1bmN0aW9uIHJlY3ZNZXNzYWdlKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcmVjdjonLCBkYXRhKQoKICAgIC8vZGF0YVJlY3YKICAgIGxldCBkYXRhUmVjdiA9IGRhdGEKCiAgICAvL3J1bgogICAgcnVuKGRhdGFSZWN2KQoKfQoKCiAgICAgICAgc2VsZi5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICByZWN2TWVzc2FnZShlLmRhdGEpCiAgICAgICAgfQogICAgICAgIAoK");function c(){var b=l();function d(l){try{var b=new Blob([l]),d=window.URL||window.webkitURL;return new Worker(d.createObjectURL(b))}catch(l){t(l)}}var c=d(X);if(!c)return t("invalid worker"),null;function G(){c?(c.terminate(),c=void 0):t("worker has been terminated")}function i(){var l={mode:"init",type:"function",input:Array.prototype.slice.call(arguments)};c.postMessage(l)}function W(){var l=Z(),d=m(),X={mode:"call",id:d,fun:"main",input:Array.prototype.slice.call(arguments)};return c.postMessage(X),b.once(d,(function(b){"success"===b.state?l.resolve(b.msg):l.reject(b.msg)})),l}function p(l){var d=l,Z=d.mode;"emit"!==Z&&"return"!==Z||("emit"===Z&&b.emit(d.evName,d.msg),"return"===Z&&b.emit(d.id,d))}function t(l){b.emit("error",l)}return c.onmessage=function(l){p(l.data)},c.onerror=t,i(Array.prototype.slice.call(arguments)),b.main=W,b.main=W,b.terminate=G,b}G=function(){var l,Z=(l=i.mark((function l(){var d,Z,m,X=arguments;return i.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return d=Array.prototype.slice.call(X),Z=c(),l.next=4,Z.main.apply(Z,b(d)).finally((function(){Z.terminate()}));case 4:return m=l.sent,l.abrupt("return",m);case 6:case"end":return l.stop()}}),l)})),function(){var b=this,Z=arguments;return new Promise((function(m,X){var c=l.apply(b,Z);function G(l){d(c,m,X,G,i,"next",l)}function i(l){d(c,m,X,G,i,"throw",l)}G(void 0)}))});return function(){return Z.apply(this,arguments)}}()}(),G}()}));return"undefined"!=typeof window&&void 0!==window.document?c:X}));