w-cluster 1.0.6 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/w-cluster.umd.js +1 -1
- package/dist/w-cluster.wk.umd.js +1 -1
- package/docs/WCluster.mjs.html +1 -1
- package/docs/examples/ex-PCA.html +1 -1
- package/docs/examples/ex-cluster-k-means.html +1 -1
- package/docs/examples/ex-cluster-k-medoids.html +1 -1
- package/docs/examples/ex-cluster-webworker-k-medoids.html +1 -1
- package/docs/global.html +1 -1
- package/docs/index.html +1 -1
- package/package.json +3 -3
- package/toolg/gDistRollup.mjs +17 -16
package/dist/w-cluster.wk.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(d,l){"object"==typeof exports&&"undefined"!=typeof module?module.exports=l(require("worker_threads")):"function"==typeof define&&define.amd?define(["worker_threads"],l):(d="undefined"!=typeof globalThis?globalThis:d||self)["w-cluster"]=l(d.worker_threads)}(this,(function(d){"use strict";function l(d){return d&&"object"==typeof d&&"default"in d?d:{default:d}}var b=l(d);function c(d){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(d){return typeof d}:function(d){return d&&"function"==typeof Symbol&&d.constructor===Symbol&&d!==Symbol.prototype?"symbol":typeof d},c(d)}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function Z(d){var l={exports:{}};return d(l,l.exports),l.exports}var X=Z((function(d,l){d.exports=function(d){function l(d,l){(null==l||l>d.length)&&(l=d.length);for(var b=0,c=new Array(l);b<l;b++)c[b]=d[b];return c}function b(d){return function(d){if(Array.isArray(d))return l(d)}(d)||function(d){if("undefined"!=typeof Symbol&&null!=d[Symbol.iterator]||null!=d["@@iterator"])return Array.from(d)}(d)||function(d,b){if(d){if("string"==typeof d)return l(d,b);var c=Object.prototype.toString.call(d).slice(8,-1);return"Object"===c&&d.constructor&&(c=d.constructor.name),"Map"===c||"Set"===c?Array.from(d):"Arguments"===c||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(c)?l(d,b):void 0}}(d)||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 Z(d,l,b,c,Z,X,G){try{var y=d[X](G),m=y.value}catch(d){return void b(d)}y.done?l(m):Promise.resolve(m).then(c,Z)}function X(d){return function(){var l=this,b=arguments;return new Promise((function(c,X){var G=d.apply(l,b);function y(d){Z(G,c,X,y,m,"next",d)}function m(d){Z(G,c,X,y,m,"throw",d)}y(void 0)}))}}function G(d){return G="function"==typeof Symbol&&"symbol"==c(Symbol.iterator)?function(d){return c(d)}:function(d){return d&&"function"==typeof Symbol&&d.constructor===Symbol&&d!==Symbol.prototype?"symbol":c(d)},G(d)}function y(d){var l={exports:{}};return d(l,l.exports),l.exports}var m,K=y((function(d){var l=function(d){var l,b=Object.prototype,c=b.hasOwnProperty,Z="function"==typeof Symbol?Symbol:{},X=Z.iterator||"@@iterator",y=Z.asyncIterator||"@@asyncIterator",m=Z.toStringTag||"@@toStringTag";function K(d,l,b){return Object.defineProperty(d,l,{value:b,enumerable:!0,configurable:!0,writable:!0}),d[l]}try{K({},"")}catch(d){K=function(d,l,b){return d[l]=b}}function p(d,l,b,c){var Z=l&&l.prototype instanceof W?l:W,X=Object.create(Z.prototype),G=new R(c||[]);return X._invoke=function(d,l,b){var c=i;return function(Z,X){if(c===I)throw new Error("Generator is already running");if(c===h){if("throw"===Z)throw X;return T()}for(b.method=Z,b.arg=X;;){var G=b.delegate;if(G){var y=S(G,b);if(y){if(y===o)continue;return y}}if("next"===b.method)b.sent=b._sent=b.arg;else if("throw"===b.method){if(c===i)throw c=h,b.arg;b.dispatchException(b.arg)}else"return"===b.method&&b.abrupt("return",b.arg);c=I;var m=t(d,l,b);if("normal"===m.type){if(c=b.done?h:u,m.arg===o)continue;return{value:m.arg,done:b.done}}"throw"===m.type&&(c=h,b.method="throw",b.arg=m.arg)}}}(d,b,G),X}function t(d,l,b){try{return{type:"normal",arg:d.call(l,b)}}catch(d){return{type:"throw",arg:d}}}d.wrap=p;var i="suspendedStart",u="suspendedYield",I="executing",h="completed",o={};function W(){}function V(){}function s(){}var H={};K(H,X,(function(){return this}));var L=Object.getPrototypeOf,C=L&&L(L(z([])));C&&C!==b&&c.call(C,X)&&(H=C);var a=s.prototype=W.prototype=Object.create(H);function n(d){["next","throw","return"].forEach((function(l){K(d,l,(function(d){return this._invoke(l,d)}))}))}function x(d,l){function b(Z,X,y,m){var K=t(d[Z],d,X);if("throw"!==K.type){var p=K.arg,i=p.value;return i&&"object"===G(i)&&c.call(i,"__await")?l.resolve(i.__await).then((function(d){b("next",d,y,m)}),(function(d){b("throw",d,y,m)})):l.resolve(i).then((function(d){p.value=d,y(p)}),(function(d){return b("throw",d,y,m)}))}m(K.arg)}var Z;this._invoke=function(d,c){function X(){return new l((function(l,Z){b(d,c,l,Z)}))}return Z=Z?Z.then(X,X):X()}}function S(d,b){var c=d.iterator[b.method];if(c===l){if(b.delegate=null,"throw"===b.method){if(d.iterator.return&&(b.method="return",b.arg=l,S(d,b),"throw"===b.method))return o;b.method="throw",b.arg=new TypeError("The iterator does not provide a 'throw' method")}return o}var Z=t(c,d.iterator,b.arg);if("throw"===Z.type)return b.method="throw",b.arg=Z.arg,b.delegate=null,o;var X=Z.arg;return X?X.done?(b[d.resultName]=X.value,b.next=d.nextLoc,"return"!==b.method&&(b.method="next",b.arg=l),b.delegate=null,o):X:(b.method="throw",b.arg=new TypeError("iterator result is not an object"),b.delegate=null,o)}function Y(d){var l={tryLoc:d[0]};1 in d&&(l.catchLoc=d[1]),2 in d&&(l.finallyLoc=d[2],l.afterLoc=d[3]),this.tryEntries.push(l)}function g(d){var l=d.completion||{};l.type="normal",delete l.arg,d.completion=l}function R(d){this.tryEntries=[{tryLoc:"root"}],d.forEach(Y,this),this.reset(!0)}function z(d){if(d){var b=d[X];if(b)return b.call(d);if("function"==typeof d.next)return d;if(!isNaN(d.length)){var Z=-1,G=function b(){for(;++Z<d.length;)if(c.call(d,Z))return b.value=d[Z],b.done=!1,b;return b.value=l,b.done=!0,b};return G.next=G}}return{next:T}}function T(){return{value:l,done:!0}}return V.prototype=s,K(a,"constructor",s),K(s,"constructor",V),V.displayName=K(s,m,"GeneratorFunction"),d.isGeneratorFunction=function(d){var l="function"==typeof d&&d.constructor;return!!l&&(l===V||"GeneratorFunction"===(l.displayName||l.name))},d.mark=function(d){return Object.setPrototypeOf?Object.setPrototypeOf(d,s):(d.__proto__=s,K(d,m,"GeneratorFunction")),d.prototype=Object.create(a),d},d.awrap=function(d){return{__await:d}},n(x.prototype),K(x.prototype,y,(function(){return this})),d.AsyncIterator=x,d.async=function(l,b,c,Z,X){void 0===X&&(X=Promise);var G=new x(p(l,b,c,Z),X);return d.isGeneratorFunction(b)?G:G.next().then((function(d){return d.done?d.value:G.next()}))},n(a),K(a,m,"Generator"),K(a,X,(function(){return this})),K(a,"toString",(function(){return"[object Generator]"})),d.keys=function(d){var l=[];for(var b in d)l.push(b);return l.reverse(),function b(){for(;l.length;){var c=l.pop();if(c in d)return b.value=c,b.done=!1,b}return b.done=!0,b}},d.values=z,R.prototype={constructor:R,reset:function(d){if(this.prev=0,this.next=0,this.sent=this._sent=l,this.done=!1,this.delegate=null,this.method="next",this.arg=l,this.tryEntries.forEach(g),!d)for(var b in this)"t"===b.charAt(0)&&c.call(this,b)&&!isNaN(+b.slice(1))&&(this[b]=l)},stop:function(){this.done=!0;var d=this.tryEntries[0].completion;if("throw"===d.type)throw d.arg;return this.rval},dispatchException:function(d){if(this.done)throw d;var b=this;function Z(c,Z){return y.type="throw",y.arg=d,b.next=c,Z&&(b.method="next",b.arg=l),!!Z}for(var X=this.tryEntries.length-1;X>=0;--X){var G=this.tryEntries[X],y=G.completion;if("root"===G.tryLoc)return Z("end");if(G.tryLoc<=this.prev){var m=c.call(G,"catchLoc"),K=c.call(G,"finallyLoc");if(m&&K){if(this.prev<G.catchLoc)return Z(G.catchLoc,!0);if(this.prev<G.finallyLoc)return Z(G.finallyLoc)}else if(m){if(this.prev<G.catchLoc)return Z(G.catchLoc,!0)}else{if(!K)throw new Error("try statement without catch or finally");if(this.prev<G.finallyLoc)return Z(G.finallyLoc)}}}},abrupt:function(d,l){for(var b=this.tryEntries.length-1;b>=0;--b){var Z=this.tryEntries[b];if(Z.tryLoc<=this.prev&&c.call(Z,"finallyLoc")&&this.prev<Z.finallyLoc){var X=Z;break}}X&&("break"===d||"continue"===d)&&X.tryLoc<=l&&l<=X.finallyLoc&&(X=null);var G=X?X.completion:{};return G.type=d,G.arg=l,X?(this.method="next",this.next=X.finallyLoc,o):this.complete(G)},complete:function(d,l){if("throw"===d.type)throw d.arg;return"break"===d.type||"continue"===d.type?this.next=d.arg:"return"===d.type?(this.rval=this.arg=d.arg,this.method="return",this.next="end"):"normal"===d.type&&l&&(this.next=l),o},finish:function(d){for(var l=this.tryEntries.length-1;l>=0;--l){var b=this.tryEntries[l];if(b.finallyLoc===d)return this.complete(b.completion,b.afterLoc),g(b),o}},catch:function(d){for(var l=this.tryEntries.length-1;l>=0;--l){var b=this.tryEntries[l];if(b.tryLoc===d){var c=b.completion;if("throw"===c.type){var Z=c.arg;g(b)}return Z}}throw new Error("illegal catch attempt")},delegateYield:function(d,b,c){return this.delegate={iterator:z(d),resultName:b,nextLoc:c},"next"===this.method&&(this.arg=l),o}},d}(d.exports);try{regeneratorRuntime=l}catch(d){"object"===("undefined"==typeof globalThis?"undefined":G(globalThis))?globalThis.regeneratorRuntime=l:Function("r","regeneratorRuntime = r")(l)}})),p=y((function(d){var l=Object.prototype.hasOwnProperty,b="~";function c(){}function Z(d,l,b){this.fn=d,this.context=l,this.once=b||!1}function X(d,l,c,X,G){if("function"!=typeof c)throw new TypeError("The listener must be a function");var y=new Z(c,X||d,G),m=b?b+l:l;return d._events[m]?d._events[m].fn?d._events[m]=[d._events[m],y]:d._events[m].push(y):(d._events[m]=y,d._eventsCount++),d}function G(d,l){0==--d._eventsCount?d._events=new c:delete d._events[l]}function y(){this._events=new c,this._eventsCount=0}Object.create&&(c.prototype=Object.create(null),(new c).__proto__||(b=!1)),y.prototype.eventNames=function(){var d,c,Z=[];if(0===this._eventsCount)return Z;for(c in d=this._events)l.call(d,c)&&Z.push(b?c.slice(1):c);return Object.getOwnPropertySymbols?Z.concat(Object.getOwnPropertySymbols(d)):Z},y.prototype.listeners=function(d){var l=b?b+d:d,c=this._events[l];if(!c)return[];if(c.fn)return[c.fn];for(var Z=0,X=c.length,G=new Array(X);Z<X;Z++)G[Z]=c[Z].fn;return G},y.prototype.listenerCount=function(d){var l=b?b+d:d,c=this._events[l];return c?c.fn?1:c.length:0},y.prototype.emit=function(d,l,c,Z,X,G){var y=b?b+d:d;if(!this._events[y])return!1;var m,K,p=this._events[y],t=arguments.length;if(p.fn){switch(p.once&&this.removeListener(d,p.fn,void 0,!0),t){case 1:return p.fn.call(p.context),!0;case 2:return p.fn.call(p.context,l),!0;case 3:return p.fn.call(p.context,l,c),!0;case 4:return p.fn.call(p.context,l,c,Z),!0;case 5:return p.fn.call(p.context,l,c,Z,X),!0;case 6:return p.fn.call(p.context,l,c,Z,X,G),!0}for(K=1,m=new Array(t-1);K<t;K++)m[K-1]=arguments[K];p.fn.apply(p.context,m)}else{var i,u=p.length;for(K=0;K<u;K++)switch(p[K].once&&this.removeListener(d,p[K].fn,void 0,!0),t){case 1:p[K].fn.call(p[K].context);break;case 2:p[K].fn.call(p[K].context,l);break;case 3:p[K].fn.call(p[K].context,l,c);break;case 4:p[K].fn.call(p[K].context,l,c,Z);break;default:if(!m)for(i=1,m=new Array(t-1);i<t;i++)m[i-1]=arguments[i];p[K].fn.apply(p[K].context,m)}}return!0},y.prototype.on=function(d,l,b){return X(this,d,l,b,!1)},y.prototype.once=function(d,l,b){return X(this,d,l,b,!0)},y.prototype.removeListener=function(d,l,c,Z){var X=b?b+d:d;if(!this._events[X])return this;if(!l)return G(this,X),this;var y=this._events[X];if(y.fn)y.fn!==l||Z&&!y.once||c&&y.context!==c||G(this,X);else{for(var m=0,K=[],p=y.length;m<p;m++)(y[m].fn!==l||Z&&!y[m].once||c&&y[m].context!==c)&&K.push(y[m]);K.length?this._events[X]=1===K.length?K[0]:K:G(this,X)}return this},y.prototype.removeAllListeners=function(d){var l;return d?(l=b?b+d:d,this._events[l]&&G(this,l)):(this._events=new c,this._eventsCount=0),this},y.prototype.off=y.prototype.removeListener,y.prototype.addListener=y.prototype.on,y.prefixed=b,y.EventEmitter=y,d.exports=y}));return function(){if("nodejs"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function l(){return new p}function c(){var d,l,b=new Promise((function(){d=arguments[0],l=arguments[1]}));return b.resolve=d,b.reject=l,b}function Z(){for(var d=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,l=[],b="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),c=b.length,Z=0;Z<d;Z++)l[Z]=b[0|Math.random()*c];return l.join("")}var G,y=(G="CgogICAgICAgIGxldCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykKICAgICAgICAKCnZhciB0PUFycmF5LmlzQXJyYXksZT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsImRlZmF1bHQiKT90LmRlZmF1bHQ6dH1mdW5jdGlvbiBuKHQpe3ZhciBlPXtleHBvcnRzOnt9fTtyZXR1cm4gdChlLGUuZXhwb3J0cyksZS5leHBvcnRzfXZhciBvPSJvYmplY3QiPT10eXBlb2YgZSYmZSYmZS5PYmplY3Q9PT1PYmplY3QmJmUscz0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLGk9b3x8c3x8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSx1PWkuU3ltYm9sLGE9T2JqZWN0LnByb3RvdHlwZSxoPWEuaGFzT3duUHJvcGVydHksbD1hLnRvU3RyaW5nLGM9dT91LnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgZj1mdW5jdGlvbih0KXt2YXIgZT1oLmNhbGwodCxjKSxyPXRbY107dHJ5e3RbY109dm9pZCAwO3ZhciBuPSEwfWNhdGNoKHQpe312YXIgbz1sLmNhbGwodCk7cmV0dXJuIG4mJihlP3RbY109cjpkZWxldGUgdFtjXSksb30sbT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBnPWZ1bmN0aW9uKHQpe3JldHVybiBtLmNhbGwodCl9LHA9dT91LnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgdz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD92b2lkIDA9PT10PyJbb2JqZWN0IFVuZGVmaW5lZF0iOiJbb2JqZWN0IE51bGxdIjpwJiZwIGluIE9iamVjdCh0KT9mKHQpOmcodCl9O3ZhciBkPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9O3ZhciBiPWZ1bmN0aW9uKHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdHx8ZCh0KSYmIltvYmplY3QgU3ltYm9sXSI9PXcodCl9LHk9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8sdj0vXlx3KiQvO3ZhciBNPWZ1bmN0aW9uKGUscil7aWYodChlKSlyZXR1cm4hMTt2YXIgbj10eXBlb2YgZTtyZXR1cm4hKCJudW1iZXIiIT1uJiYic3ltYm9sIiE9biYmImJvb2xlYW4iIT1uJiZudWxsIT1lJiYhYihlKSl8fCh2LnRlc3QoZSl8fCF5LnRlc3QoZSl8fG51bGwhPXImJmUgaW4gT2JqZWN0KHIpKX07dmFyIHg9ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9O3ZhciBFLFM9ZnVuY3Rpb24odCl7aWYoIXgodCkpcmV0dXJuITE7dmFyIGU9dyh0KTtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBBc3luY0Z1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IFByb3h5XSI9PWV9LGo9aVsiX19jb3JlLWpzX3NoYXJlZF9fIl0sXz0oRT0vW14uXSskLy5leGVjKGomJmoua2V5cyYmai5rZXlzLklFX1BST1RPfHwiIikpPyJTeW1ib2woc3JjKV8xLiIrRToiIjt2YXIgQT1mdW5jdGlvbih0KXtyZXR1cm4hIV8mJl8gaW4gdH0sQz1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7dmFyIFI9ZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7dHJ5e3JldHVybiBDLmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifSxJPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLGs9RnVuY3Rpb24ucHJvdG90eXBlLE49T2JqZWN0LnByb3RvdHlwZSxPPWsudG9TdHJpbmcsRj1OLmhhc093blByb3BlcnR5LHo9UmVnRXhwKCJeIitPLmNhbGwoRikucmVwbGFjZSgvW1xcXiQuKis/KClbXF17fXxdL2csIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7dmFyIFQ9ZnVuY3Rpb24odCl7cmV0dXJuISgheCh0KXx8QSh0KSkmJihTKHQpP3o6SSkudGVzdChSKHQpKX07dmFyIFY9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX07dmFyIFA9ZnVuY3Rpb24odCxlKXt2YXIgcj1WKHQsZSk7cmV0dXJuIFQocik/cjp2b2lkIDB9LHE9UChPYmplY3QsImNyZWF0ZSIpO3ZhciAkPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1xP3EobnVsbCk6e30sdGhpcy5zaXplPTB9O3ZhciBEPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxVPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIEw9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihxKXt2YXIgcj1lW3RdO3JldHVybiJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIj09PXI/dm9pZCAwOnJ9cmV0dXJuIFUuY2FsbChlLHQpP2VbdF06dm9pZCAwfSxCPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIEc9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gcT92b2lkIDAhPT1lW3RdOkIuY2FsbChlLHQpfTt2YXIgSz1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLHJbdF09cSYmdm9pZCAwPT09ZT8iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI6ZSx0aGlzfTtmdW5jdGlvbiBXKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fVcucHJvdG90eXBlLmNsZWFyPSQsVy5wcm90b3R5cGUuZGVsZXRlPUQsVy5wcm90b3R5cGUuZ2V0PUwsVy5wcm90b3R5cGUuaGFzPUcsVy5wcm90b3R5cGUuc2V0PUs7dmFyIFg9Vzt2YXIgSj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9O3ZhciBZPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfTt2YXIgWj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10Lmxlbmd0aDtyLS07KWlmKFkodFtyXVswXSxlKSlyZXR1cm4gcjtyZXR1cm4tMX0sSD1BcnJheS5wcm90b3R5cGUuc3BsaWNlO3ZhciBRPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1aKGUsdCk7cmV0dXJuIShyPDApJiYocj09ZS5sZW5ndGgtMT9lLnBvcCgpOkguY2FsbChlLHIsMSksLS10aGlzLnNpemUsITApfTt2YXIgdHQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPVooZSx0KTtyZXR1cm4gcjwwP3ZvaWQgMDplW3JdWzFdfTt2YXIgZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIFoodGhpcy5fX2RhdGFfXyx0KT4tMX07dmFyIHJ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXyxuPVoocix0KTtyZXR1cm4gbjwwPygrK3RoaXMuc2l6ZSxyLnB1c2goW3QsZV0pKTpyW25dWzFdPWUsdGhpc307ZnVuY3Rpb24gbnQodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19bnQucHJvdG90eXBlLmNsZWFyPUosbnQucHJvdG90eXBlLmRlbGV0ZT1RLG50LnByb3RvdHlwZS5nZXQ9dHQsbnQucHJvdG90eXBlLmhhcz1ldCxudC5wcm90b3R5cGUuc2V0PXJ0O3ZhciBvdD1udCxzdD1QKGksIk1hcCIpO3ZhciBpdD1mdW5jdGlvbigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IFgsbWFwOm5ldyhzdHx8b3QpLHN0cmluZzpuZXcgWH19O3ZhciB1dD1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09ZXx8Im51bWJlciI9PWV8fCJzeW1ib2wiPT1lfHwiYm9vbGVhbiI9PWU/Il9fcHJvdG9fXyIhPT10Om51bGw9PT10fTt2YXIgYXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10Ll9fZGF0YV9fO3JldHVybiB1dChlKT9yWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOnIubWFwfTt2YXIgaHQ9ZnVuY3Rpb24odCl7dmFyIGU9YXQodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX07dmFyIGx0PWZ1bmN0aW9uKHQpe3JldHVybiBhdCh0aGlzLHQpLmdldCh0KX07dmFyIGN0PWZ1bmN0aW9uKHQpe3JldHVybiBhdCh0aGlzLHQpLmhhcyh0KX07dmFyIGZ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9YXQodGhpcyx0KSxuPXIuc2l6ZTtyZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemUrPXIuc2l6ZT09bj8wOjEsdGhpc307ZnVuY3Rpb24gbXQodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19bXQucHJvdG90eXBlLmNsZWFyPWl0LG10LnByb3RvdHlwZS5kZWxldGU9aHQsbXQucHJvdG90eXBlLmdldD1sdCxtdC5wcm90b3R5cGUuaGFzPWN0LG10LnByb3RvdHlwZS5zZXQ9ZnQ7dmFyIGd0PW10O2Z1bmN0aW9uIHB0KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZnVuY3Rpb24iKTt2YXIgcj1mdW5jdGlvbigpe3ZhciBuPWFyZ3VtZW50cyxvPWU/ZS5hcHBseSh0aGlzLG4pOm5bMF0scz1yLmNhY2hlO2lmKHMuaGFzKG8pKXJldHVybiBzLmdldChvKTt2YXIgaT10LmFwcGx5KHRoaXMsbik7cmV0dXJuIHIuY2FjaGU9cy5zZXQobyxpKXx8cyxpfTtyZXR1cm4gci5jYWNoZT1uZXcocHQuQ2FjaGV8fGd0KSxyfXB0LkNhY2hlPWd0O3ZhciB3dD1wdDt2YXIgZHQ9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2csYnQ9L1xcKFxcKT8vZyx5dD1mdW5jdGlvbih0KXt2YXIgZT13dCh0LChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09ci5zaXplJiZyLmNsZWFyKCksdH0pKSxyPWUuY2FjaGU7cmV0dXJuIGV9KChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKGR0LChmdW5jdGlvbih0LHIsbixvKXtlLnB1c2gobj9vLnJlcGxhY2UoYnQsIiQxIik6cnx8dCl9KSksZX0pKTt2YXIgdnQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1udWxsPT10PzA6dC5sZW5ndGgsbz1BcnJheShuKTsrK3I8bjspb1tyXT1lKHRbcl0scix0KTtyZXR1cm4gb30sTXQ9dT91LnByb3RvdHlwZTp2b2lkIDAseHQ9TXQ/TXQudG9TdHJpbmc6dm9pZCAwO3ZhciBFdD1mdW5jdGlvbiBlKHIpe2lmKCJzdHJpbmciPT10eXBlb2YgcilyZXR1cm4gcjtpZih0KHIpKXJldHVybiB2dChyLGUpKyIiO2lmKGIocikpcmV0dXJuIHh0P3h0LmNhbGwocik6IiI7dmFyIG49cisiIjtyZXR1cm4iMCI9PW4mJjEvcj09LUluZmluaXR5PyItMCI6bn07dmFyIFN0PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOkV0KHQpfTt2YXIganQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gdChlKT9lOk0oZSxyKT9bZV06eXQoU3QoZSkpfTt2YXIgX3Q9ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxiKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1JbmZpbml0eT8iLTAiOmV9O3ZhciBBdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49KGU9anQoZSx0KSkubGVuZ3RoO251bGwhPXQmJnI8bjspdD10W190KGVbcisrXSldO3JldHVybiByJiZyPT1uP3Q6dm9pZCAwfTt2YXIgQ3Q9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPW51bGw9PXQ/dm9pZCAwOkF0KHQsZSk7cmV0dXJuIHZvaWQgMD09PW4/cjpufSxSdD1PYmplY3QucHJvdG90eXBlO3ZhciBJdD1mdW5jdGlvbih0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yO3JldHVybiB0PT09KCJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLnByb3RvdHlwZXx8UnQpfTt2YXIga3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQoZShyKSl9fShPYmplY3Qua2V5cyxPYmplY3QpLE50PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIE90PWZ1bmN0aW9uKHQpe2lmKCFJdCh0KSlyZXR1cm4ga3QodCk7dmFyIGU9W107Zm9yKHZhciByIGluIE9iamVjdCh0KSlOdC5jYWxsKHQscikmJiJjb25zdHJ1Y3RvciIhPXImJmUucHVzaChyKTtyZXR1cm4gZX0sRnQ9UChpLCJEYXRhVmlldyIpLHp0PVAoaSwiUHJvbWlzZSIpLFR0PVAoaSwiU2V0IiksVnQ9UChpLCJXZWFrTWFwIiksUHQ9UihGdCkscXQ9UihzdCksJHQ9Uih6dCksRHQ9UihUdCksVXQ9UihWdCksTHQ9dzsoRnQmJiJbb2JqZWN0IERhdGFWaWV3XSIhPUx0KG5ldyBGdChuZXcgQXJyYXlCdWZmZXIoMSkpKXx8c3QmJiJbb2JqZWN0IE1hcF0iIT1MdChuZXcgc3QpfHx6dCYmIltvYmplY3QgUHJvbWlzZV0iIT1MdCh6dC5yZXNvbHZlKCkpfHxUdCYmIltvYmplY3QgU2V0XSIhPUx0KG5ldyBUdCl8fFZ0JiYiW29iamVjdCBXZWFrTWFwXSIhPUx0KG5ldyBWdCkpJiYoTHQ9ZnVuY3Rpb24odCl7dmFyIGU9dyh0KSxyPSJbb2JqZWN0IE9iamVjdF0iPT1lP3QuY29uc3RydWN0b3I6dm9pZCAwLG49cj9SKHIpOiIiO2lmKG4pc3dpdGNoKG4pe2Nhc2UgUHQ6cmV0dXJuIltvYmplY3QgRGF0YVZpZXddIjtjYXNlIHF0OnJldHVybiJbb2JqZWN0IE1hcF0iO2Nhc2UgJHQ6cmV0dXJuIltvYmplY3QgUHJvbWlzZV0iO2Nhc2UgRHQ6cmV0dXJuIltvYmplY3QgU2V0XSI7Y2FzZSBVdDpyZXR1cm4iW29iamVjdCBXZWFrTWFwXSJ9cmV0dXJuIGV9KTt2YXIgQnQ9THQ7dmFyIEd0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmdD4tMSYmdCUxPT0wJiZ0PD05MDA3MTk5MjU0NzQwOTkxfTt2YXIgS3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJkd0KHQubGVuZ3RoKSYmIVModCl9O3ZhciBXdD1mdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fCF0KGUpJiZkKGUpJiYiW29iamVjdCBTdHJpbmddIj09dyhlKX07dmFyIFh0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT92b2lkIDA6ZVt0XX19LEp0PVh0KCJsZW5ndGgiKSxZdD1SZWdFeHAoIltcXHUyMDBkXFx1ZDgwMC1cXHVkZmZmXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXFx1ZmUwZVxcdWZlMGZdIik7dmFyIFp0PWZ1bmN0aW9uKHQpe3JldHVybiBZdC50ZXN0KHQpfSxIdD0iW1xcdWQ4MDAtXFx1ZGZmZl0iLFF0PSJbXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXSIsdGU9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIsZWU9IlteXFx1ZDgwMC1cXHVkZmZmXSIscmU9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLG5lPSJbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdIixvZT0iKD86IitRdCsifCIrdGUrIikiKyI/IixzZT0iW1xcdWZlMGVcXHVmZTBmXT8iK29lKygiKD86XFx1MjAwZCg/OiIrW2VlLHJlLG5lXS5qb2luKCJ8IikrIilbXFx1ZmUwZVxcdWZlMGZdPyIrb2UrIikqIiksaWU9Iig/OiIrW2VlK1F0KyI/IixRdCxyZSxuZSxIdF0uam9pbigifCIpKyIpIix1ZT1SZWdFeHAodGUrIig/PSIrdGUrIil8IitpZStzZSwiZyIpO3ZhciBhZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dWUubGFzdEluZGV4PTA7dWUudGVzdCh0KTspKytlO3JldHVybiBlfTt2YXIgaGU9ZnVuY3Rpb24odCl7cmV0dXJuIFp0KHQpP2FlKHQpOkp0KHQpfTt2YXIgbGU9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gMDtpZihLdCh0KSlyZXR1cm4gV3QodCk/aGUodCk6dC5sZW5ndGg7dmFyIGU9QnQodCk7cmV0dXJuIltvYmplY3QgTWFwXSI9PWV8fCJbb2JqZWN0IFNldF0iPT1lP3Quc2l6ZTpPdCh0KS5sZW5ndGh9O3ZhciBjZT1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR8fGQodCkmJiJbb2JqZWN0IE51bWJlcl0iPT13KHQpfTt2YXIgZmU9ZnVuY3Rpb24odCl7cmV0dXJuITA9PT10fHwhMT09PXR8fGQodCkmJiJbb2JqZWN0IEJvb2xlYW5dIj09dyh0KX07ZnVuY3Rpb24gbWUodCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBnZSh0KXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBwZSh0KXtyZXR1cm4iW29iamVjdCBTdHJpbmddIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiB3ZSh0KXtyZXR1cm4hIWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IFVuZGVmaW5lZF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVsbF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7aWYoZ2UodCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiExO3JldHVybiEwfXJldHVybiExfSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuISghcGUodCl8fCIiIT09dCl9KHQpfHwhIWZ1bmN0aW9uKHQpe3JldHVybiEhbWUodCkmJjA9PT10Lmxlbmd0aH0odCkpKSl9ZnVuY3Rpb24gZGUodCl7cmV0dXJuISFtZSh0KSYmKDAhPT10Lmxlbmd0aCYmKDEhPT10Lmxlbmd0aHx8IXdlKHRbMF0pKSl9Y29uc3QgYmU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiB5ZSh0KXtyZXR1cm4gYmUuY2FsbCh0KS5lbmRzV2l0aCgiQXJyYXldIil9ZnVuY3Rpb24gdmUodCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCF5ZSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7dmFyIHI9ZS5mcm9tSW5kZXgsbj12b2lkIDA9PT1yPzA6cixvPWUudG9JbmRleCxzPXZvaWQgMD09PW8/dC5sZW5ndGg6bztpZihuPDB8fG4+PXQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihuKSl0aHJvdyBuZXcgRXJyb3IoImZyb21JbmRleCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gbGVuZ3RoIik7aWYoczw9bnx8cz50Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIocykpdGhyb3cgbmV3IEVycm9yKCJ0b0luZGV4IG11c3QgYmUgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gZnJvbUluZGV4IGFuZCBhdCBtb3N0IGVxdWFsIHRvIGxlbmd0aCIpO2Zvcih2YXIgaT10W25dLHU9bisxO3U8czt1KyspdFt1XT5pJiYoaT10W3VdKTtyZXR1cm4gaX1mdW5jdGlvbiBNZSh0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXllKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTt2YXIgcj1lLmZyb21JbmRleCxuPXZvaWQgMD09PXI/MDpyLG89ZS50b0luZGV4LHM9dm9pZCAwPT09bz90Lmxlbmd0aDpvO2lmKG48MHx8bj49dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKG4pKXRocm93IG5ldyBFcnJvcigiZnJvbUluZGV4IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHNtYWxsZXIgdGhhbiBsZW5ndGgiKTtpZihzPD1ufHxzPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihzKSl0aHJvdyBuZXcgRXJyb3IoInRvSW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBmcm9tSW5kZXggYW5kIGF0IG1vc3QgZXF1YWwgdG8gbGVuZ3RoIik7Zm9yKHZhciBpPXRbbl0sdT1uKzE7dTxzO3UrKyl0W3VdPGkmJihpPXRbdV0pO3JldHVybiBpfWZ1bmN0aW9uIHhlKHQpe3ZhciBlLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCF5ZSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7aWYodm9pZCAwIT09ci5vdXRwdXQpe2lmKCF5ZShyLm91dHB1dCkpdGhyb3cgbmV3IFR5cGVFcnJvcigib3V0cHV0IG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5IGlmIHNwZWNpZmllZCIpO2U9ci5vdXRwdXR9ZWxzZSBlPW5ldyBBcnJheSh0Lmxlbmd0aCk7dmFyIG49TWUodCksbz12ZSh0KTtpZihuPT09byl0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluaW11bSBhbmQgbWF4aW11bSBpbnB1dCB2YWx1ZXMgYXJlIGVxdWFsLiBDYW5ub3QgcmVzY2FsZSBhIGNvbnN0YW50IGFycmF5Iik7dmFyIHM9ci5taW4saT12b2lkIDA9PT1zP3IuYXV0b01pbk1heD9uOjA6cyx1PXIubWF4LGE9dm9pZCAwPT09dT9yLmF1dG9NaW5NYXg/bzoxOnU7aWYoaT49YSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG9wdGlvbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXggb3B0aW9uIik7Zm9yKHZhciBoPShhLWkpLyhvLW4pLGw9MDtsPHQubGVuZ3RoO2wrKyllW2xdPSh0W2xdLW4pKmgraTtyZXR1cm4gZX1jb25zdCBFZT0iICIucmVwZWF0KDIpLFNlPSIgIi5yZXBlYXQoNCk7ZnVuY3Rpb24gamUodCxlPXt9KXtjb25zdHttYXhSb3dzOnI9MTUsbWF4Q29sdW1uczpuPTEwLG1heE51bVNpemU6bz04fT1lO3JldHVybmAke3QuY29uc3RydWN0b3IubmFtZX0ge1xuJHtFZX1bXG4ke1NlfSR7ZnVuY3Rpb24odCxlLHIsbil7Y29uc3R7cm93czpvLGNvbHVtbnM6c309dCxpPU1hdGgubWluKG8sZSksdT1NYXRoLm1pbihzLHIpLGE9W107Zm9yKGxldCBlPTA7ZTxpO2UrKyl7bGV0IHI9W107Zm9yKGxldCBvPTA7bzx1O28rKylyLnB1c2goX2UodC5nZXQoZSxvKSxuKSk7YS5wdXNoKGAke3Iuam9pbigiICIpfWApfXUhPT1zJiYoYVthLmxlbmd0aC0xXSs9YCAuLi4gJHtzLXJ9IG1vcmUgY29sdW1uc2ApO2khPT1vJiZhLnB1c2goYC4uLiAke28tZX0gbW9yZSByb3dzYCk7cmV0dXJuIGEuam9pbihgXG4ke1NlfWApfSh0LHIsbixvKX1cbiR7RWV9XVxuJHtFZX1yb3dzOiAke3Qucm93c31cbiR7RWV9Y29sdW1uczogJHt0LmNvbHVtbnN9XG59YH1mdW5jdGlvbiBfZSh0LGUpe2NvbnN0IHI9U3RyaW5nKHQpO2lmKHIubGVuZ3RoPD1lKXJldHVybiByLnBhZEVuZChlLCIgIik7Y29uc3Qgbj10LnRvUHJlY2lzaW9uKGUtMik7aWYobi5sZW5ndGg8PWUpcmV0dXJuIG47Y29uc3Qgbz10LnRvRXhwb25lbnRpYWwoZS0yKSxzPW8uaW5kZXhPZigiZSIpLGk9by5zbGljZShzKTtyZXR1cm4gby5zbGljZSgwLGUtaS5sZW5ndGgpK2l9ZnVuY3Rpb24gQWUodCxlLHIpe2xldCBuPXI/dC5yb3dzOnQucm93cy0xO2lmKGU8MHx8ZT5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJSb3cgaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gQ2UodCxlLHIpe2xldCBuPXI/dC5jb2x1bW5zOnQuY29sdW1ucy0xO2lmKGU8MHx8ZT5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJDb2x1bW4gaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gUmUodCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIik7cmV0dXJuIGV9ZnVuY3Rpb24gSWUodCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiByb3dzIik7cmV0dXJuIGV9ZnVuY3Rpb24ga2UodCxlLHIsbixvKXtpZig1IT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiZXhwZWN0ZWQgNCBhcmd1bWVudHMiKTtpZihPZSgic3RhcnRSb3ciLGUpLE9lKCJlbmRSb3ciLHIpLE9lKCJzdGFydENvbHVtbiIsbiksT2UoImVuZENvbHVtbiIsbyksZT5yfHxuPm98fGU8MHx8ZT49dC5yb3dzfHxyPDB8fHI+PXQucm93c3x8bjwwfHxuPj10LmNvbHVtbnN8fG88MHx8bz49dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJTdWJtYXRyaXggaW5kaWNlcyBhcmUgb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gTmUodCxlPTApe2xldCByPVtdO2ZvcihsZXQgbj0wO248dDtuKyspci5wdXNoKGUpO3JldHVybiByfWZ1bmN0aW9uIE9lKHQsZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7dH0gbXVzdCBiZSBhIG51bWJlcmApfWZ1bmN0aW9uIEZlKHQpe2lmKHQuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcigiRW1wdHkgbWF0cml4IGhhcyBubyBlbGVtZW50cyB0byBpbmRleCIpfWNsYXNzIHple3N0YXRpYyBmcm9tMURBcnJheSh0LGUscil7aWYodCplIT09ci5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImRhdGEgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGdpdmVuIGRpbWVuc2lvbnMiKTtsZXQgbj1uZXcgVmUodCxlKTtmb3IobGV0IG89MDtvPHQ7bysrKWZvcihsZXQgdD0wO3Q8ZTt0Kyspbi5zZXQobyx0LHJbbyplK3RdKTtyZXR1cm4gbn1zdGF0aWMgcm93VmVjdG9yKHQpe2xldCBlPW5ldyBWZSgxLHQubGVuZ3RoKTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyllLnNldCgwLHIsdFtyXSk7cmV0dXJuIGV9c3RhdGljIGNvbHVtblZlY3Rvcih0KXtsZXQgZT1uZXcgVmUodC5sZW5ndGgsMSk7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspZS5zZXQociwwLHRbcl0pO3JldHVybiBlfXN0YXRpYyB6ZXJvcyh0LGUpe3JldHVybiBuZXcgVmUodCxlKX1zdGF0aWMgb25lcyh0LGUpe3JldHVybiBuZXcgVmUodCxlKS5maWxsKDEpfXN0YXRpYyByYW5kKHQsZSxyPXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3JhbmRvbTpuPU1hdGgucmFuZG9tfT1yO2xldCBvPW5ldyBWZSh0LGUpO2ZvcihsZXQgcj0wO3I8dDtyKyspZm9yKGxldCB0PTA7dDxlO3QrKylvLnNldChyLHQsbigpKTtyZXR1cm4gb31zdGF0aWMgcmFuZEludCh0LGUscj17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46bj0wLG1heDpvPTFlMyxyYW5kb206cz1NYXRoLnJhbmRvbX09cjtpZighTnVtYmVyLmlzSW50ZWdlcihuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhbiBpbnRlZ2VyIik7aWYoIU51bWJlci5pc0ludGVnZXIobykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYW4gaW50ZWdlciIpO2lmKG4+PW8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXgiKTtsZXQgaT1vLW4sdT1uZXcgVmUodCxlKTtmb3IobGV0IHI9MDtyPHQ7cisrKWZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPW4rTWF0aC5yb3VuZChzKCkqaSk7dS5zZXQocix0LGUpfXJldHVybiB1fXN0YXRpYyBleWUodCxlLHIpe3ZvaWQgMD09PWUmJihlPXQpLHZvaWQgMD09PXImJihyPTEpO2xldCBuPU1hdGgubWluKHQsZSksbz10aGlzLnplcm9zKHQsZSk7Zm9yKGxldCB0PTA7dDxuO3QrKylvLnNldCh0LHQscik7cmV0dXJuIG99c3RhdGljIGRpYWcodCxlLHIpe2xldCBuPXQubGVuZ3RoO3ZvaWQgMD09PWUmJihlPW4pLHZvaWQgMD09PXImJihyPWUpO2xldCBvPU1hdGgubWluKG4sZSxyKSxzPXRoaXMuemVyb3MoZSxyKTtmb3IobGV0IGU9MDtlPG87ZSsrKXMuc2V0KGUsZSx0W2VdKTtyZXR1cm4gc31zdGF0aWMgbWluKHQsZSl7dD10aGlzLmNoZWNrTWF0cml4KHQpLGU9dGhpcy5jaGVja01hdHJpeChlKTtsZXQgcj10LnJvd3Msbj10LmNvbHVtbnMsbz1uZXcgVmUocixuKTtmb3IobGV0IHM9MDtzPHI7cysrKWZvcihsZXQgcj0wO3I8bjtyKyspby5zZXQocyxyLE1hdGgubWluKHQuZ2V0KHMsciksZS5nZXQocyxyKSkpO3JldHVybiBvfXN0YXRpYyBtYXgodCxlKXt0PXRoaXMuY2hlY2tNYXRyaXgodCksZT10aGlzLmNoZWNrTWF0cml4KGUpO2xldCByPXQucm93cyxuPXQuY29sdW1ucyxvPW5ldyB0aGlzKHIsbik7Zm9yKGxldCBzPTA7czxyO3MrKylmb3IobGV0IHI9MDtyPG47cisrKW8uc2V0KHMscixNYXRoLm1heCh0LmdldChzLHIpLGUuZ2V0KHMscikpKTtyZXR1cm4gb31zdGF0aWMgY2hlY2tNYXRyaXgodCl7cmV0dXJuIHplLmlzTWF0cml4KHQpP3Q6bmV3IFZlKHQpfXN0YXRpYyBpc01hdHJpeCh0KXtyZXR1cm4gbnVsbCE9dCYmIk1hdHJpeCI9PT10LmtsYXNzfWdldCBzaXplKCl7cmV0dXJuIHRoaXMucm93cyp0aGlzLmNvbHVtbnN9YXBwbHkodCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LmNhbGwodGhpcyxlLHIpO3JldHVybiB0aGlzfXRvMURBcnJheSgpe2xldCB0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5wdXNoKHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXRvMkRBcnJheSgpe2xldCB0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl7dC5wdXNoKFtdKTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdFtlXS5wdXNoKHRoaXMuZ2V0KGUscikpfXJldHVybiB0fXRvSlNPTigpe3JldHVybiB0aGlzLnRvMkRBcnJheSgpfWlzUm93VmVjdG9yKCl7cmV0dXJuIDE9PT10aGlzLnJvd3N9aXNDb2x1bW5WZWN0b3IoKXtyZXR1cm4gMT09PXRoaXMuY29sdW1uc31pc1ZlY3Rvcigpe3JldHVybiAxPT09dGhpcy5yb3dzfHwxPT09dGhpcy5jb2x1bW5zfWlzU3F1YXJlKCl7cmV0dXJuIHRoaXMucm93cz09PXRoaXMuY29sdW1uc31pc0VtcHR5KCl7cmV0dXJuIDA9PT10aGlzLnJvd3N8fDA9PT10aGlzLmNvbHVtbnN9aXNTeW1tZXRyaWMoKXtpZih0aGlzLmlzU3F1YXJlKCkpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPD10O2UrKylpZih0aGlzLmdldCh0LGUpIT09dGhpcy5nZXQoZSx0KSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX1pc0VjaGVsb25Gb3JtKCl7bGV0IHQ9MCxlPTAscj0tMSxuPSEwLG89ITE7Zm9yKDt0PHRoaXMucm93cyYmbjspe2ZvcihlPTAsbz0hMTtlPHRoaXMuY29sdW1ucyYmITE9PT1vOykwPT09dGhpcy5nZXQodCxlKT9lKys6MT09PXRoaXMuZ2V0KHQsZSkmJmU+cj8obz0hMCxyPWUpOihuPSExLG89ITApO3QrK31yZXR1cm4gbn1pc1JlZHVjZWRFY2hlbG9uRm9ybSgpe2xldCB0PTAsZT0wLHI9LTEsbj0hMCxvPSExO2Zvcig7dDx0aGlzLnJvd3MmJm47KXtmb3IoZT0wLG89ITE7ZTx0aGlzLmNvbHVtbnMmJiExPT09bzspMD09PXRoaXMuZ2V0KHQsZSk/ZSsrOjE9PT10aGlzLmdldCh0LGUpJiZlPnI/KG89ITAscj1lKToobj0hMSxvPSEwKTtmb3IobGV0IHI9ZSsxO3I8dGhpcy5yb3dzO3IrKykwIT09dGhpcy5nZXQodCxyKSYmKG49ITEpO3QrK31yZXR1cm4gbn1lY2hlbG9uRm9ybSgpe2xldCB0PXRoaXMuY2xvbmUoKSxlPTAscj0wO2Zvcig7ZTx0LnJvd3MmJnI8dC5jb2x1bW5zOyl7bGV0IG49ZTtmb3IobGV0IG89ZTtvPHQucm93cztvKyspdC5nZXQobyxyKT50LmdldChuLHIpJiYobj1vKTtpZigwPT09dC5nZXQobixyKSlyKys7ZWxzZXt0LnN3YXBSb3dzKGUsbik7bGV0IG89dC5nZXQoZSxyKTtmb3IobGV0IG49cjtuPHQuY29sdW1ucztuKyspdC5zZXQoZSxuLHQuZ2V0KGUsbikvbyk7Zm9yKGxldCBuPWUrMTtuPHQucm93cztuKyspe2xldCBvPXQuZ2V0KG4scikvdC5nZXQoZSxyKTt0LnNldChuLHIsMCk7Zm9yKGxldCBzPXIrMTtzPHQuY29sdW1ucztzKyspdC5zZXQobixzLHQuZ2V0KG4scyktdC5nZXQoZSxzKSpvKX1lKysscisrfX1yZXR1cm4gdH1yZWR1Y2VkRWNoZWxvbkZvcm0oKXtsZXQgdD10aGlzLmVjaGVsb25Gb3JtKCksZT10LmNvbHVtbnMscj10LnJvd3Msbj1yLTE7Zm9yKDtuPj0wOylpZigwPT09dC5tYXhSb3cobikpbi0tO2Vsc2V7bGV0IG89MCxzPSExO2Zvcig7bzxyJiYhMT09PXM7KTE9PT10LmdldChuLG8pP3M9ITA6bysrO2ZvcihsZXQgcj0wO3I8bjtyKyspe2xldCBzPXQuZ2V0KHIsbyk7Zm9yKGxldCBpPW87aTxlO2krKyl7bGV0IGU9dC5nZXQocixpKS1zKnQuZ2V0KG4saSk7dC5zZXQocixpLGUpfX1uLS19cmV0dXJuIHR9c2V0KCl7dGhyb3cgbmV3IEVycm9yKCJzZXQgbWV0aG9kIGlzIHVuaW1wbGVtZW50ZWQiKX1nZXQoKXt0aHJvdyBuZXcgRXJyb3IoImdldCBtZXRob2QgaXMgdW5pbXBsZW1lbnRlZCIpfXJlcGVhdCh0PXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3Jvd3M6ZT0xLGNvbHVtbnM6cj0xfT10O2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGUpfHxlPD0wKXRocm93IG5ldyBUeXBlRXJyb3IoInJvd3MgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTtpZighTnVtYmVyLmlzSW50ZWdlcihyKXx8cjw9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjb2x1bW5zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7bGV0IG49bmV3IFZlKHRoaXMucm93cyplLHRoaXMuY29sdW1ucypyKTtmb3IobGV0IHQ9MDt0PGU7dCsrKWZvcihsZXQgZT0wO2U8cjtlKyspbi5zZXRTdWJNYXRyaXgodGhpcyx0aGlzLnJvd3MqdCx0aGlzLmNvbHVtbnMqZSk7cmV0dXJuIG59ZmlsbCh0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0KTtyZXR1cm4gdGhpc31uZWcoKXtyZXR1cm4gdGhpcy5tdWxTKC0xKX1nZXRSb3codCl7QWUodGhpcyx0KTtsZXQgZT1bXTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspZS5wdXNoKHRoaXMuZ2V0KHQscikpO3JldHVybiBlfWdldFJvd1ZlY3Rvcih0KXtyZXR1cm4gVmUucm93VmVjdG9yKHRoaXMuZ2V0Um93KHQpKX1zZXRSb3codCxlKXtBZSh0aGlzLHQpLGU9UmUodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQodCxyLGVbcl0pO3JldHVybiB0aGlzfXN3YXBSb3dzKHQsZSl7QWUodGhpcyx0KSxBZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl7bGV0IG49dGhpcy5nZXQodCxyKTt0aGlzLnNldCh0LHIsdGhpcy5nZXQoZSxyKSksdGhpcy5zZXQoZSxyLG4pfXJldHVybiB0aGlzfWdldENvbHVtbih0KXtDZSh0aGlzLHQpO2xldCBlPVtdO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyllLnB1c2godGhpcy5nZXQocix0KSk7cmV0dXJuIGV9Z2V0Q29sdW1uVmVjdG9yKHQpe3JldHVybiBWZS5jb2x1bW5WZWN0b3IodGhpcy5nZXRDb2x1bW4odCkpfXNldENvbHVtbih0LGUpe0NlKHRoaXMsdCksZT1JZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl0aGlzLnNldChyLHQsZVtyXSk7cmV0dXJuIHRoaXN9c3dhcENvbHVtbnModCxlKXtDZSh0aGlzLHQpLENlKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXtsZXQgbj10aGlzLmdldChyLHQpO3RoaXMuc2V0KHIsdCx0aGlzLmdldChyLGUpKSx0aGlzLnNldChyLGUsbil9cmV0dXJuIHRoaXN9YWRkUm93VmVjdG9yKHQpe3Q9UmUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3Rbcl0pO3JldHVybiB0aGlzfXN1YlJvd1ZlY3Rvcih0KXt0PVJlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10W3JdKTtyZXR1cm4gdGhpc31tdWxSb3dWZWN0b3IodCl7dD1SZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdFtyXSk7cmV0dXJuIHRoaXN9ZGl2Um93VmVjdG9yKHQpe3Q9UmUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3Rbcl0pO3JldHVybiB0aGlzfWFkZENvbHVtblZlY3Rvcih0KXt0PUllKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0W2VdKTtyZXR1cm4gdGhpc31zdWJDb2x1bW5WZWN0b3IodCl7dD1JZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdFtlXSk7cmV0dXJuIHRoaXN9bXVsQ29sdW1uVmVjdG9yKHQpe3Q9SWUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnRbZV0pO3JldHVybiB0aGlzfWRpdkNvbHVtblZlY3Rvcih0KXt0PUllKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90W2VdKTtyZXR1cm4gdGhpc31tdWxSb3codCxlKXtBZSh0aGlzLHQpO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldCh0LHIsdGhpcy5nZXQodCxyKSplKTtyZXR1cm4gdGhpc31tdWxDb2x1bW4odCxlKXtDZSh0aGlzLHQpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl0aGlzLnNldChyLHQsdGhpcy5nZXQocix0KSplKTtyZXR1cm4gdGhpc31tYXgoKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCB0PXRoaXMuZ2V0KDAsMCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPnQmJih0PXRoaXMuZ2V0KGUscikpO3JldHVybiB0fW1heEluZGV4KCl7RmUodGhpcyk7bGV0IHQ9dGhpcy5nZXQoMCwwKSxlPVswLDBdO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5nZXQocixuKT50JiYodD10aGlzLmdldChyLG4pLGVbMF09cixlWzFdPW4pO3JldHVybiBlfW1pbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IHQ9dGhpcy5nZXQoMCwwKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik8dCYmKHQ9dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9bWluSW5kZXgoKXtGZSh0aGlzKTtsZXQgdD10aGlzLmdldCgwLDApLGU9WzAsMF07Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLmdldChyLG4pPHQmJih0PXRoaXMuZ2V0KHIsbiksZVswXT1yLGVbMV09bik7cmV0dXJuIGV9bWF4Um93KHQpe2lmKEFlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCh0LDApO2ZvcihsZXQgcj0xO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldCh0LHIpPmUmJihlPXRoaXMuZ2V0KHQscikpO3JldHVybiBlfW1heFJvd0luZGV4KHQpe0FlKHRoaXMsdCksRmUodGhpcyk7bGV0IGU9dGhpcy5nZXQodCwwKSxyPVt0LDBdO2ZvcihsZXQgbj0xO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLmdldCh0LG4pPmUmJihlPXRoaXMuZ2V0KHQsbiksclsxXT1uKTtyZXR1cm4gcn1taW5Sb3codCl7aWYoQWUodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KHQsMCk7Zm9yKGxldCByPTE7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KHQscik8ZSYmKGU9dGhpcy5nZXQodCxyKSk7cmV0dXJuIGV9bWluUm93SW5kZXgodCl7QWUodGhpcyx0KSxGZSh0aGlzKTtsZXQgZT10aGlzLmdldCh0LDApLHI9W3QsMF07Zm9yKGxldCBuPTE7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuZ2V0KHQsbik8ZSYmKGU9dGhpcy5nZXQodCxuKSxyWzFdPW4pO3JldHVybiByfW1heENvbHVtbih0KXtpZihDZSh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQoMCx0KTtmb3IobGV0IHI9MTtyPHRoaXMucm93cztyKyspdGhpcy5nZXQocix0KT5lJiYoZT10aGlzLmdldChyLHQpKTtyZXR1cm4gZX1tYXhDb2x1bW5JbmRleCh0KXtDZSh0aGlzLHQpLEZlKHRoaXMpO2xldCBlPXRoaXMuZ2V0KDAsdCkscj1bMCx0XTtmb3IobGV0IG49MTtuPHRoaXMucm93cztuKyspdGhpcy5nZXQobix0KT5lJiYoZT10aGlzLmdldChuLHQpLHJbMF09bik7cmV0dXJuIHJ9bWluQ29sdW1uKHQpe2lmKENlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCgwLHQpO2ZvcihsZXQgcj0xO3I8dGhpcy5yb3dzO3IrKyl0aGlzLmdldChyLHQpPGUmJihlPXRoaXMuZ2V0KHIsdCkpO3JldHVybiBlfW1pbkNvbHVtbkluZGV4KHQpe0NlKHRoaXMsdCksRmUodGhpcyk7bGV0IGU9dGhpcy5nZXQoMCx0KSxyPVswLHRdO2ZvcihsZXQgbj0xO248dGhpcy5yb3dzO24rKyl0aGlzLmdldChuLHQpPGUmJihlPXRoaXMuZ2V0KG4sdCksclswXT1uKTtyZXR1cm4gcn1kaWFnKCl7bGV0IHQ9TWF0aC5taW4odGhpcy5yb3dzLHRoaXMuY29sdW1ucyksZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaCh0aGlzLmdldChyLHIpKTtyZXR1cm4gZX1ub3JtKHQ9ImZyb2Jlbml1cyIpe2xldCBlPTA7aWYoIm1heCI9PT10KXJldHVybiB0aGlzLm1heCgpO2lmKCJmcm9iZW5pdXMiPT09dCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyllKz10aGlzLmdldCh0LHIpKnRoaXMuZ2V0KHQscik7cmV0dXJuIE1hdGguc3FydChlKX10aHJvdyBuZXcgUmFuZ2VFcnJvcihgdW5rbm93biBub3JtIHR5cGU6ICR7dH1gKX1jdW11bGF0aXZlU3VtKCl7bGV0IHQ9MDtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQrPXRoaXMuZ2V0KGUsciksdGhpcy5zZXQoZSxyLHQpO3JldHVybiB0aGlzfWRvdCh0KXt6ZS5pc01hdHJpeCh0KSYmKHQ9dC50bzFEQXJyYXkoKSk7bGV0IGU9dGhpcy50bzFEQXJyYXkoKTtpZihlLmxlbmd0aCE9PXQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJ2ZWN0b3JzIGRvIG5vdCBoYXZlIHRoZSBzYW1lIHNpemUiKTtsZXQgcj0wO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXIrPWVbbl0qdFtuXTtyZXR1cm4gcn1tbXVsKHQpe3Q9VmUuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5yb3dzLHI9dGhpcy5jb2x1bW5zLG49dC5jb2x1bW5zLG89bmV3IFZlKGUsbikscz1uZXcgRmxvYXQ2NEFycmF5KHIpO2ZvcihsZXQgaT0wO2k8bjtpKyspe2ZvcihsZXQgZT0wO2U8cjtlKyspc1tlXT10LmdldChlLGkpO2ZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPTA7Zm9yKGxldCBuPTA7bjxyO24rKyllKz10aGlzLmdldCh0LG4pKnNbbl07by5zZXQodCxpLGUpfX1yZXR1cm4gb31zdHJhc3NlbjJ4Mih0KXt0PVZlLmNoZWNrTWF0cml4KHQpO2xldCBlPW5ldyBWZSgyLDIpO2NvbnN0IHI9dGhpcy5nZXQoMCwwKSxuPXQuZ2V0KDAsMCksbz10aGlzLmdldCgwLDEpLHM9dC5nZXQoMCwxKSxpPXRoaXMuZ2V0KDEsMCksdT10LmdldCgxLDApLGE9dGhpcy5nZXQoMSwxKSxoPXQuZ2V0KDEsMSksbD0ocithKSoobitoKSxjPShpK2EpKm4sZj1yKihzLWgpLG09YSoodS1uKSxnPShyK28pKmgscD1sK20tZysoby1hKSoodStoKSx3PWYrZyxkPWMrbSxiPWwtYytmKyhpLXIpKihuK3MpO3JldHVybiBlLnNldCgwLDAscCksZS5zZXQoMCwxLHcpLGUuc2V0KDEsMCxkKSxlLnNldCgxLDEsYiksZX1zdHJhc3NlbjN4Myh0KXt0PVZlLmNoZWNrTWF0cml4KHQpO2xldCBlPW5ldyBWZSgzLDMpO2NvbnN0IHI9dGhpcy5nZXQoMCwwKSxuPXRoaXMuZ2V0KDAsMSksbz10aGlzLmdldCgwLDIpLHM9dGhpcy5nZXQoMSwwKSxpPXRoaXMuZ2V0KDEsMSksdT10aGlzLmdldCgxLDIpLGE9dGhpcy5nZXQoMiwwKSxoPXRoaXMuZ2V0KDIsMSksbD10aGlzLmdldCgyLDIpLGM9dC5nZXQoMCwwKSxmPXQuZ2V0KDAsMSksbT10LmdldCgwLDIpLGc9dC5nZXQoMSwwKSxwPXQuZ2V0KDEsMSksdz10LmdldCgxLDIpLGQ9dC5nZXQoMiwwKSxiPXQuZ2V0KDIsMSkseT10LmdldCgyLDIpLHY9KHItcykqKC1mK3ApLE09KC1yK3MraSkqKGMtZitwKSx4PShzK2kpKigtYytmKSxFPXIqYyxTPSgtcithK2gpKihjLW0rdyksaj0oLXIrYSkqKG0tdyksXz0oYStoKSooLWMrbSksQT0oLW8raCtsKSoocCtkLWIpLEM9KG8tbCkqKHAtYiksUj1vKmQsST0oaCtsKSooLWQrYiksaz0oLW8raSt1KSoodytkLXkpLE49KG8tdSkqKHcteSksTz0oaSt1KSooLWQreSksRj1FK1IrbipnLHo9KHIrbitvLXMtaS1oLWwpKnArTSt4K0UrQStSK0ksVD1FK1MrXysocituK28taS11LWEtaCkqdytSK2srTyxWPXYraSooLWMrZitnLXAtdy1kK3kpK00rRStSK2srTixQPXYrTSt4K0UrdSpiLHE9UitrK04rTytzKm0sJD1FK1MraitoKigtYyttK2ctcC13LWQrYikrQStDK1IsRD1BK0MrUitJK2EqZixVPUUrUytqK18rbCp5O3JldHVybiBlLnNldCgwLDAsRiksZS5zZXQoMCwxLHopLGUuc2V0KDAsMixUKSxlLnNldCgxLDAsViksZS5zZXQoMSwxLFApLGUuc2V0KDEsMixxKSxlLnNldCgyLDAsJCksZS5zZXQoMiwxLEQpLGUuc2V0KDIsMixVKSxlfW1tdWxTdHJhc3Nlbih0KXt0PVZlLmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMuY2xvbmUoKSxyPWUucm93cyxuPWUuY29sdW1ucyxvPXQucm93cyxzPXQuY29sdW1ucztmdW5jdGlvbiBpKHQsZSxyKXtsZXQgbj10LnJvd3Msbz10LmNvbHVtbnM7aWYobj09PWUmJm89PT1yKXJldHVybiB0O3tsZXQgbj16ZS56ZXJvcyhlLHIpO3JldHVybiBuPW4uc2V0U3ViTWF0cml4KHQsMCwwKSxufX1uIT09byYmY29uc29sZS53YXJuKGBNdWx0aXBseWluZyAke3J9IHggJHtufSBhbmQgJHtvfSB4ICR7c30gbWF0cml4OiBkaW1lbnNpb25zIGRvIG5vdCBtYXRjaC5gKTtsZXQgdT1NYXRoLm1heChyLG8pLGE9TWF0aC5tYXgobixzKTtyZXR1cm4gZT1pKGUsdSxhKSxmdW5jdGlvbiB0KGUscixuLG8pe2lmKG48PTUxMnx8bzw9NTEyKXJldHVybiBlLm1tdWwocik7biUyPT0xJiZvJTI9PTE/KGU9aShlLG4rMSxvKzEpLHI9aShyLG4rMSxvKzEpKTpuJTI9PTE/KGU9aShlLG4rMSxvKSxyPWkocixuKzEsbykpOm8lMj09MSYmKGU9aShlLG4sbysxKSxyPWkocixuLG8rMSkpO2xldCBzPXBhcnNlSW50KGUucm93cy8yLDEwKSx1PXBhcnNlSW50KGUuY29sdW1ucy8yLDEwKSxhPWUuc3ViTWF0cml4KDAscy0xLDAsdS0xKSxoPXIuc3ViTWF0cml4KDAscy0xLDAsdS0xKSxsPWUuc3ViTWF0cml4KDAscy0xLHUsZS5jb2x1bW5zLTEpLGM9ci5zdWJNYXRyaXgoMCxzLTEsdSxyLmNvbHVtbnMtMSksZj1lLnN1Yk1hdHJpeChzLGUucm93cy0xLDAsdS0xKSxtPXIuc3ViTWF0cml4KHMsci5yb3dzLTEsMCx1LTEpLGc9ZS5zdWJNYXRyaXgocyxlLnJvd3MtMSx1LGUuY29sdW1ucy0xKSxwPXIuc3ViTWF0cml4KHMsci5yb3dzLTEsdSxyLmNvbHVtbnMtMSksdz10KHplLmFkZChhLGcpLHplLmFkZChoLHApLHMsdSksZD10KHplLmFkZChmLGcpLGgscyx1KSxiPXQoYSx6ZS5zdWIoYyxwKSxzLHUpLHk9dChnLHplLnN1YihtLGgpLHMsdSksdj10KHplLmFkZChhLGwpLHAscyx1KSxNPXQoemUuc3ViKGYsYSksemUuYWRkKGgsYykscyx1KSx4PXQoemUuc3ViKGwsZyksemUuYWRkKG0scCkscyx1KSxFPXplLmFkZCh3LHkpO0Uuc3ViKHYpLEUuYWRkKHgpO2xldCBTPXplLmFkZChiLHYpLGo9emUuYWRkKGQseSksXz16ZS5zdWIodyxkKTtfLmFkZChiKSxfLmFkZChNKTtsZXQgQT16ZS56ZXJvcygyKkUucm93cywyKkUuY29sdW1ucyk7cmV0dXJuIEE9QS5zZXRTdWJNYXRyaXgoRSwwLDApLEE9QS5zZXRTdWJNYXRyaXgoUyxFLnJvd3MsMCksQT1BLnNldFN1Yk1hdHJpeChqLDAsRS5jb2x1bW5zKSxBPUEuc2V0U3ViTWF0cml4KF8sRS5yb3dzLEUuY29sdW1ucyksQS5zdWJNYXRyaXgoMCxuLTEsMCxvLTEpfShlLHQ9aSh0LHUsYSksdSxhKX1zY2FsZVJvd3ModD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46ZT0wLG1heDpyPTF9PXQ7aWYoIU51bWJlci5pc0Zpbml0ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhIG51bWJlciIpO2lmKCFOdW1iZXIuaXNGaW5pdGUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYSBudW1iZXIiKTtpZihlPj1yKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IG49bmV3IFZlKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpO2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKyl7Y29uc3Qgbz10aGlzLmdldFJvdyh0KTtvLmxlbmd0aD4wJiZ4ZShvLHttaW46ZSxtYXg6cixvdXRwdXQ6b30pLG4uc2V0Um93KHQsbyl9cmV0dXJuIG59c2NhbGVDb2x1bW5zKHQ9e30pe2lmKCJvYmplY3QiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7bWluOmU9MCxtYXg6cj0xfT10O2lmKCFOdW1iZXIuaXNGaW5pdGUoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigibWluIG11c3QgYmUgYSBudW1iZXIiKTtpZighTnVtYmVyLmlzRmluaXRlKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1heCBtdXN0IGJlIGEgbnVtYmVyIik7aWYoZT49cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCIpO2xldCBuPW5ldyBWZSh0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKTtmb3IobGV0IHQ9MDt0PHRoaXMuY29sdW1uczt0Kyspe2NvbnN0IG89dGhpcy5nZXRDb2x1bW4odCk7by5sZW5ndGgmJnhlKG8se21pbjplLG1heDpyLG91dHB1dDpvfSksbi5zZXRDb2x1bW4odCxvKX1yZXR1cm4gbn1mbGlwUm93cygpe2NvbnN0IHQ9TWF0aC5jZWlsKHRoaXMuY29sdW1ucy8yKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0O3IrKyl7bGV0IHQ9dGhpcy5nZXQoZSxyKSxuPXRoaXMuZ2V0KGUsdGhpcy5jb2x1bW5zLTEtcik7dGhpcy5zZXQoZSxyLG4pLHRoaXMuc2V0KGUsdGhpcy5jb2x1bW5zLTEtcix0KX1yZXR1cm4gdGhpc31mbGlwQ29sdW1ucygpe2NvbnN0IHQ9TWF0aC5jZWlsKHRoaXMucm93cy8yKTtmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspZm9yKGxldCByPTA7cjx0O3IrKyl7bGV0IHQ9dGhpcy5nZXQocixlKSxuPXRoaXMuZ2V0KHRoaXMucm93cy0xLXIsZSk7dGhpcy5zZXQocixlLG4pLHRoaXMuc2V0KHRoaXMucm93cy0xLXIsZSx0KX1yZXR1cm4gdGhpc31rcm9uZWNrZXJQcm9kdWN0KHQpe3Q9VmUuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5yb3dzLHI9dGhpcy5jb2x1bW5zLG49dC5yb3dzLG89dC5jb2x1bW5zLHM9bmV3IFZlKGUqbixyKm8pO2ZvcihsZXQgaT0wO2k8ZTtpKyspZm9yKGxldCBlPTA7ZTxyO2UrKylmb3IobGV0IHI9MDtyPG47cisrKWZvcihsZXQgdT0wO3U8bzt1Kyspcy5zZXQobippK3IsbyplK3UsdGhpcy5nZXQoaSxlKSp0LmdldChyLHUpKTtyZXR1cm4gc31rcm9uZWNrZXJTdW0odCl7aWYodD1WZS5jaGVja01hdHJpeCh0KSwhdGhpcy5pc1NxdWFyZSgpfHwhdC5pc1NxdWFyZSgpKXRocm93IG5ldyBFcnJvcigiS3JvbmVja2VyIFN1bSBuZWVkcyB0d28gU3F1YXJlIE1hdHJpY2VzIik7bGV0IGU9dGhpcy5yb3dzLHI9dC5yb3dzLG49dGhpcy5rcm9uZWNrZXJQcm9kdWN0KFZlLmV5ZShyLHIpKSxvPVZlLmV5ZShlLGUpLmtyb25lY2tlclByb2R1Y3QodCk7cmV0dXJuIG4uYWRkKG8pfXRyYW5zcG9zZSgpe2xldCB0PW5ldyBWZSh0aGlzLmNvbHVtbnMsdGhpcy5yb3dzKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQuc2V0KHIsZSx0aGlzLmdldChlLHIpKTtyZXR1cm4gdH1zb3J0Um93cyh0PVRlKXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspdGhpcy5zZXRSb3coZSx0aGlzLmdldFJvdyhlKS5zb3J0KHQpKTtyZXR1cm4gdGhpc31zb3J0Q29sdW1ucyh0PVRlKXtmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXRDb2x1bW4oZSx0aGlzLmdldENvbHVtbihlKS5zb3J0KHQpKTtyZXR1cm4gdGhpc31zdWJNYXRyaXgodCxlLHIsbil7a2UodGhpcyx0LGUscixuKTtsZXQgbz1uZXcgVmUoZS10KzEsbi1yKzEpO2ZvcihsZXQgcz10O3M8PWU7cysrKWZvcihsZXQgZT1yO2U8PW47ZSsrKW8uc2V0KHMtdCxlLXIsdGhpcy5nZXQocyxlKSk7cmV0dXJuIG99c3ViTWF0cml4Um93KHQsZSxyKXtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1yJiYocj10aGlzLmNvbHVtbnMtMSksZT5yfHxlPDB8fGU+PXRoaXMuY29sdW1uc3x8cjwwfHxyPj10aGlzLmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkFyZ3VtZW50IG91dCBvZiByYW5nZSIpO2xldCBuPW5ldyBWZSh0Lmxlbmd0aCxyLWUrMSk7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspZm9yKGxldCBzPWU7czw9cjtzKyspe2lmKHRbb108MHx8dFtvXT49dGhpcy5yb3dzKXRocm93IG5ldyBSYW5nZUVycm9yKGBSb3cgaW5kZXggb3V0IG9mIHJhbmdlOiAke3Rbb119YCk7bi5zZXQobyxzLWUsdGhpcy5nZXQodFtvXSxzKSl9cmV0dXJuIG59c3ViTWF0cml4Q29sdW1uKHQsZSxyKXtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1yJiYocj10aGlzLnJvd3MtMSksZT5yfHxlPDB8fGU+PXRoaXMucm93c3x8cjwwfHxyPj10aGlzLnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkFyZ3VtZW50IG91dCBvZiByYW5nZSIpO2xldCBuPW5ldyBWZShyLWUrMSx0Lmxlbmd0aCk7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspZm9yKGxldCBzPWU7czw9cjtzKyspe2lmKHRbb108MHx8dFtvXT49dGhpcy5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKGBDb2x1bW4gaW5kZXggb3V0IG9mIHJhbmdlOiAke3Rbb119YCk7bi5zZXQocy1lLG8sdGhpcy5nZXQocyx0W29dKSl9cmV0dXJuIG59c2V0U3ViTWF0cml4KHQsZSxyKXtpZigodD1WZS5jaGVja01hdHJpeCh0KSkuaXNFbXB0eSgpKXJldHVybiB0aGlzO2tlKHRoaXMsZSxlK3Qucm93cy0xLHIscit0LmNvbHVtbnMtMSk7Zm9yKGxldCBuPTA7bjx0LnJvd3M7bisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyl0aGlzLnNldChlK24scitvLHQuZ2V0KG4sbykpO3JldHVybiB0aGlzfXNlbGVjdGlvbih0LGUpeyFmdW5jdGlvbih0LGUpe2lmKCF5ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJyb3cgaW5kaWNlcyBtdXN0IGJlIGFuIGFycmF5Iik7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXTwwfHxlW3JdPj10LnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInJvdyBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKX0odGhpcyx0KSxmdW5jdGlvbih0LGUpe2lmKCF5ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjb2x1bW4gaW5kaWNlcyBtdXN0IGJlIGFuIGFycmF5Iik7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXTwwfHxlW3JdPj10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImNvbHVtbiBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKX0odGhpcyxlKTtsZXQgcj1uZXcgVmUodC5sZW5ndGgsZS5sZW5ndGgpO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtsZXQgbz10W25dO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgcz1lW3RdO3Iuc2V0KG4sdCx0aGlzLmdldChvLHMpKX19cmV0dXJuIHJ9dHJhY2UoKXtsZXQgdD1NYXRoLm1pbih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSxlPTA7Zm9yKGxldCByPTA7cjx0O3IrKyllKz10aGlzLmdldChyLHIpO3JldHVybiBlfWNsb25lKCl7bGV0IHQ9bmV3IFZlKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5zZXQoZSxyLHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXN1bSh0KXtzd2l0Y2godCl7Y2FzZSJyb3ciOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1OZSh0LnJvd3MpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IG49MDtuPHQuY29sdW1uczsrK24pZVtyXSs9dC5nZXQocixuKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSJjb2x1bW4iOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1OZSh0LmNvbHVtbnMpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IG49MDtuPHQuY29sdW1uczsrK24pZVtuXSs9dC5nZXQocixuKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSB2b2lkIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPTA7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyllKz10LmdldChyLG4pO3JldHVybiBlfSh0aGlzKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19cHJvZHVjdCh0KXtzd2l0Y2godCl7Y2FzZSJyb3ciOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1OZSh0LnJvd3MsMSk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgbj0wO248dC5jb2x1bW5zOysrbillW3JdKj10LmdldChyLG4pO3JldHVybiBlfSh0aGlzKTtjYXNlImNvbHVtbiI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPU5lKHQuY29sdW1ucywxKTtmb3IobGV0IHI9MDtyPHQucm93czsrK3IpZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7KytuKWVbbl0qPXQuZ2V0KHIsbik7cmV0dXJuIGV9KHRoaXMpO2Nhc2Ugdm9pZCAwOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT0xO2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspZSo9dC5nZXQocixuKTtyZXR1cm4gZX0odGhpcyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fW1lYW4odCl7Y29uc3QgZT10aGlzLnN1bSh0KTtzd2l0Y2godCl7Y2FzZSJyb3ciOmZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKyllW3RdLz10aGlzLmNvbHVtbnM7cmV0dXJuIGU7Y2FzZSJjb2x1bW4iOmZvcihsZXQgdD0wO3Q8dGhpcy5jb2x1bW5zO3QrKyllW3RdLz10aGlzLnJvd3M7cmV0dXJuIGU7Y2FzZSB2b2lkIDA6cmV0dXJuIGUvdGhpcy5zaXplO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX12YXJpYW5jZSh0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHt1bmJpYXNlZDpyPSEwLG1lYW46bj10aGlzLm1lYW4odCl9PWU7aWYoImJvb2xlYW4iIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJ1bmJpYXNlZCBtdXN0IGJlIGEgYm9vbGVhbiIpO3N3aXRjaCh0KXtjYXNlInJvdyI6aWYoIXllKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIm1lYW4gbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUscil7Y29uc3Qgbj10LnJvd3Msbz10LmNvbHVtbnMscz1bXTtmb3IobGV0IGk9MDtpPG47aSsrKXtsZXQgbj0wLHU9MCxhPTA7Zm9yKGxldCBlPTA7ZTxvO2UrKylhPXQuZ2V0KGksZSktcltpXSxuKz1hLHUrPWEqYTtlP3MucHVzaCgodS1uKm4vbykvKG8tMSkpOnMucHVzaCgodS1uKm4vbykvbyl9cmV0dXJuIHN9KHRoaXMscixuKTtjYXNlImNvbHVtbiI6aWYoIXllKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIm1lYW4gbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUscil7Y29uc3Qgbj10LnJvd3Msbz10LmNvbHVtbnMscz1bXTtmb3IobGV0IGk9MDtpPG87aSsrKXtsZXQgbz0wLHU9MCxhPTA7Zm9yKGxldCBlPTA7ZTxuO2UrKylhPXQuZ2V0KGUsaSktcltpXSxvKz1hLHUrPWEqYTtlP3MucHVzaCgodS1vKm8vbikvKG4tMSkpOnMucHVzaCgodS1vKm8vbikvbil9cmV0dXJuIHN9KHRoaXMscixuKTtjYXNlIHZvaWQgMDppZigibnVtYmVyIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBuPXQucm93cyxvPXQuY29sdW1ucyxzPW4qbztsZXQgaT0wLHU9MCxhPTA7Zm9yKGxldCBlPTA7ZTxuO2UrKylmb3IobGV0IG49MDtuPG87bisrKWE9dC5nZXQoZSxuKS1yLGkrPWEsdSs9YSphO3JldHVybiBlPyh1LWkqaS9zKS8ocy0xKToodS1pKmkvcykvc30odGhpcyxyLG4pO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1zdGFuZGFyZERldmlhdGlvbih0LGUpeyJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCk7Y29uc3Qgcj10aGlzLnZhcmlhbmNlKHQsZSk7aWYodm9pZCAwPT09dClyZXR1cm4gTWF0aC5zcXJ0KHIpO2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGg7dCsrKXJbdF09TWF0aC5zcXJ0KHJbdF0pO3JldHVybiByfWNlbnRlcih0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHtjZW50ZXI6cj10aGlzLm1lYW4odCl9PWU7c3dpdGNoKHQpe2Nhc2Uicm93IjppZigheWUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2VudGVyIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKXQuc2V0KHIsbix0LmdldChyLG4pLWVbcl0pfSh0aGlzLHIpLHRoaXM7Y2FzZSJjb2x1bW4iOmlmKCF5ZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspdC5zZXQocixuLHQuZ2V0KHIsbiktZVtuXSl9KHRoaXMsciksdGhpcztjYXNlIHZvaWQgMDppZigibnVtYmVyIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2VudGVyIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKXQuc2V0KHIsbix0LmdldChyLG4pLWUpfSh0aGlzLHIpLHRoaXM7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXNjYWxlKHQsZT17fSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2xldCByPWUuc2NhbGU7c3dpdGNoKHQpe2Nhc2Uicm93IjppZih2b2lkIDA9PT1yKXI9ZnVuY3Rpb24odCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQucm93cztyKyspe2xldCBuPTA7Zm9yKGxldCBlPTA7ZTx0LmNvbHVtbnM7ZSsrKW4rPU1hdGgucG93KHQuZ2V0KHIsZSksMikvKHQuY29sdW1ucy0xKTtlLnB1c2goTWF0aC5zcXJ0KG4pKX1yZXR1cm4gZX0odGhpcyk7ZWxzZSBpZigheWUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigic2NhbGUgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspdC5zZXQocixuLHQuZ2V0KHIsbikvZVtyXSl9KHRoaXMsciksdGhpcztjYXNlImNvbHVtbiI6aWYodm9pZCAwPT09cilyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9W107Zm9yKGxldCByPTA7cjx0LmNvbHVtbnM7cisrKXtsZXQgbj0wO2ZvcihsZXQgZT0wO2U8dC5yb3dzO2UrKyluKz1NYXRoLnBvdyh0LmdldChlLHIpLDIpLyh0LnJvd3MtMSk7ZS5wdXNoKE1hdGguc3FydChuKSl9cmV0dXJuIGV9KHRoaXMpO2Vsc2UgaWYoIXllKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKXQuc2V0KHIsbix0LmdldChyLG4pL2Vbbl0pfSh0aGlzLHIpLHRoaXM7Y2FzZSB2b2lkIDA6aWYodm9pZCAwPT09cilyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9dC5zaXplLTE7bGV0IHI9MDtmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspZm9yKGxldCBvPTA7bzx0LnJvd3M7bysrKXIrPU1hdGgucG93KHQuZ2V0KG8sbiksMikvZTtyZXR1cm4gTWF0aC5zcXJ0KHIpfSh0aGlzKTtlbHNlIGlmKCJudW1iZXIiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJzY2FsZSBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyl0LnNldChyLG4sdC5nZXQocixuKS9lKX0odGhpcyxyKSx0aGlzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX10b1N0cmluZyh0KXtyZXR1cm4gamUodGhpcyx0KX19ZnVuY3Rpb24gVGUodCxlKXtyZXR1cm4gdC1lfXplLnByb3RvdHlwZS5rbGFzcz0iTWF0cml4IiwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmKHplLnByb3RvdHlwZVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXT1mdW5jdGlvbigpe3JldHVybiBqZSh0aGlzKX0pLHplLnJhbmRvbT16ZS5yYW5kLHplLnJhbmRvbUludD16ZS5yYW5kSW50LHplLmRpYWdvbmFsPXplLmRpYWcsemUucHJvdG90eXBlLmRpYWdvbmFsPXplLnByb3RvdHlwZS5kaWFnLHplLmlkZW50aXR5PXplLmV5ZSx6ZS5wcm90b3R5cGUubmVnYXRlPXplLnByb3RvdHlwZS5uZWcsemUucHJvdG90eXBlLnRlbnNvclByb2R1Y3Q9emUucHJvdG90eXBlLmtyb25lY2tlclByb2R1Y3Q7Y2xhc3MgVmUgZXh0ZW5kcyB6ZXtjb25zdHJ1Y3Rvcih0LGUpe2lmKHN1cGVyKCksVmUuaXNNYXRyaXgodCkpcmV0dXJuIHQuY2xvbmUoKTtpZihOdW1iZXIuaXNJbnRlZ2VyKHQpJiZ0Pj0wKXtpZih0aGlzLmRhdGE9W10sIShOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPj0wKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJuQ29sdW1ucyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpO2ZvcihsZXQgcj0wO3I8dDtyKyspdGhpcy5kYXRhLnB1c2gobmV3IEZsb2F0NjRBcnJheShlKSl9ZWxzZXtpZigheWUodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBvciBhbiBhcnJheSIpO3tjb25zdCByPXQ7aWYoIm51bWJlciIhPXR5cGVvZihlPSh0PXIubGVuZ3RoKT9yWzBdLmxlbmd0aDowKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJEYXRhIG11c3QgYmUgYSAyRCBhcnJheSB3aXRoIGF0IGxlYXN0IG9uZSBlbGVtZW50Iik7dGhpcy5kYXRhPVtdO2ZvcihsZXQgbj0wO248dDtuKyspe2lmKHJbbl0ubGVuZ3RoIT09ZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5jb25zaXN0ZW50IGFycmF5IGRpbWVuc2lvbnMiKTt0aGlzLmRhdGEucHVzaChGbG9hdDY0QXJyYXkuZnJvbShyW25dKSl9fX10aGlzLnJvd3M9dCx0aGlzLmNvbHVtbnM9ZX1zZXQodCxlLHIpe3JldHVybiB0aGlzLmRhdGFbdF1bZV09cix0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLmRhdGFbdF1bZV19cmVtb3ZlUm93KHQpe3JldHVybiBBZSh0aGlzLHQpLHRoaXMuZGF0YS5zcGxpY2UodCwxKSx0aGlzLnJvd3MtPTEsdGhpc31hZGRSb3codCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dCx0PXRoaXMucm93cyksQWUodGhpcyx0LCEwKSxlPUZsb2F0NjRBcnJheS5mcm9tKFJlKHRoaXMsZSkpLHRoaXMuZGF0YS5zcGxpY2UodCwwLGUpLHRoaXMucm93cys9MSx0aGlzfXJlbW92ZUNvbHVtbih0KXtDZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl7Y29uc3Qgcj1uZXcgRmxvYXQ2NEFycmF5KHRoaXMuY29sdW1ucy0xKTtmb3IobGV0IG49MDtuPHQ7bisrKXJbbl09dGhpcy5kYXRhW2VdW25dO2ZvcihsZXQgbj10KzE7bjx0aGlzLmNvbHVtbnM7bisrKXJbbi0xXT10aGlzLmRhdGFbZV1bbl07dGhpcy5kYXRhW2VdPXJ9cmV0dXJuIHRoaXMuY29sdW1ucy09MSx0aGlzfWFkZENvbHVtbih0LGUpe3ZvaWQgMD09PWUmJihlPXQsdD10aGlzLmNvbHVtbnMpLENlKHRoaXMsdCwhMCksZT1JZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl7Y29uc3Qgbj1uZXcgRmxvYXQ2NEFycmF5KHRoaXMuY29sdW1ucysxKTtsZXQgbz0wO2Zvcig7bzx0O28rKyluW29dPXRoaXMuZGF0YVtyXVtvXTtmb3IobltvKytdPWVbcl07bzx0aGlzLmNvbHVtbnMrMTtvKyspbltvXT10aGlzLmRhdGFbcl1bby0xXTt0aGlzLmRhdGFbcl09bn1yZXR1cm4gdGhpcy5jb2x1bW5zKz0xLHRoaXN9fSFmdW5jdGlvbih0LGUpe3QucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5hZGRTKHQpOnRoaXMuYWRkTSh0KX0sdC5wcm90b3R5cGUuYWRkUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3QpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5hZGRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5hZGQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuYWRkKHIpfSx0LnByb3RvdHlwZS5zdWI9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuc3ViUyh0KTp0aGlzLnN1Yk0odCl9LHQucHJvdG90eXBlLnN1YlM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuc3ViTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuc3ViPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnN1YihyKX0sdC5wcm90b3R5cGUuc3VidHJhY3Q9dC5wcm90b3R5cGUuc3ViLHQucHJvdG90eXBlLnN1YnRyYWN0Uz10LnByb3RvdHlwZS5zdWJTLHQucHJvdG90eXBlLnN1YnRyYWN0TT10LnByb3RvdHlwZS5zdWJNLHQuc3VidHJhY3Q9dC5zdWIsdC5wcm90b3R5cGUubXVsPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLm11bFModCk6dGhpcy5tdWxNKHQpfSx0LnByb3RvdHlwZS5tdWxTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm11bE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lm11bD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5tdWwocil9LHQucHJvdG90eXBlLm11bHRpcGx5PXQucHJvdG90eXBlLm11bCx0LnByb3RvdHlwZS5tdWx0aXBseVM9dC5wcm90b3R5cGUubXVsUyx0LnByb3RvdHlwZS5tdWx0aXBseU09dC5wcm90b3R5cGUubXVsTSx0Lm11bHRpcGx5PXQubXVsLHQucHJvdG90eXBlLmRpdj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5kaXZTKHQpOnRoaXMuZGl2TSh0KX0sdC5wcm90b3R5cGUuZGl2Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3QpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5kaXZNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5kaXY9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuZGl2KHIpfSx0LnByb3RvdHlwZS5kaXZpZGU9dC5wcm90b3R5cGUuZGl2LHQucHJvdG90eXBlLmRpdmlkZVM9dC5wcm90b3R5cGUuZGl2Uyx0LnByb3RvdHlwZS5kaXZpZGVNPXQucHJvdG90eXBlLmRpdk0sdC5kaXZpZGU9dC5kaXYsdC5wcm90b3R5cGUubW9kPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLm1vZFModCk6dGhpcy5tb2RNKHQpfSx0LnByb3RvdHlwZS5tb2RTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikldCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm1vZE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJXQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lm1vZD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5tb2Qocil9LHQucHJvdG90eXBlLm1vZHVsdXM9dC5wcm90b3R5cGUubW9kLHQucHJvdG90eXBlLm1vZHVsdXNTPXQucHJvdG90eXBlLm1vZFMsdC5wcm90b3R5cGUubW9kdWx1c009dC5wcm90b3R5cGUubW9kTSx0Lm1vZHVsdXM9dC5tb2QsdC5wcm90b3R5cGUuYW5kPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmFuZFModCk6dGhpcy5hbmRNKHQpfSx0LnByb3RvdHlwZS5hbmRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikmdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmFuZE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmFuZD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5hbmQocil9LHQucHJvdG90eXBlLm9yPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLm9yUyh0KTp0aGlzLm9yTSh0KX0sdC5wcm90b3R5cGUub3JTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscil8dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm9yTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscil8dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQub3I9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkub3Iocil9LHQucHJvdG90eXBlLnhvcj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy54b3JTKHQpOnRoaXMueG9yTSh0KX0sdC5wcm90b3R5cGUueG9yUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpXnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS54b3JNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKV50LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC54b3I9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkueG9yKHIpfSx0LnByb3RvdHlwZS5sZWZ0U2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMubGVmdFNoaWZ0Uyh0KTp0aGlzLmxlZnRTaGlmdE0odCl9LHQucHJvdG90eXBlLmxlZnRTaGlmdFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKTw8dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmxlZnRTaGlmdE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPDx0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5sZWZ0U2hpZnQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkubGVmdFNoaWZ0KHIpfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRTKHQpOnRoaXMuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdE0odCl9LHQucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+PnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+PnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdChyKX0sdC5wcm90b3R5cGUucmlnaHRTaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5yaWdodFNoaWZ0Uyh0KTp0aGlzLnJpZ2h0U2hpZnRNKHQpfSx0LnByb3RvdHlwZS5yaWdodFNoaWZ0Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj4+dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnJpZ2h0U2hpZnRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+PnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LnJpZ2h0U2hpZnQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkucmlnaHRTaGlmdChyKX0sdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0PXQucHJvdG90eXBlLnJpZ2h0U2hpZnQsdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0Uz10LnByb3RvdHlwZS5yaWdodFNoaWZ0Uyx0LnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnRNPXQucHJvdG90eXBlLnJpZ2h0U2hpZnRNLHQuemVyb0ZpbGxSaWdodFNoaWZ0PXQucmlnaHRTaGlmdCx0LnByb3RvdHlwZS5ub3Q9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSx+dGhpcy5nZXQodCxlKSk7cmV0dXJuIHRoaXN9LHQubm90PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5ub3QoKX0sdC5wcm90b3R5cGUuYWJzPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hYnModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFicz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYWJzKCl9LHQucHJvdG90eXBlLmFjb3M9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFjb3ModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFjb3M9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFjb3MoKX0sdC5wcm90b3R5cGUuYWNvc2g9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFjb3NoKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hY29zaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYWNvc2goKX0sdC5wcm90b3R5cGUuYXNpbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXNpbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXNpbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXNpbigpfSx0LnByb3RvdHlwZS5hc2luaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXNpbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFzaW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hc2luaCgpfSx0LnByb3RvdHlwZS5hdGFuPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hdGFuKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hdGFuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hdGFuKCl9LHQucHJvdG90eXBlLmF0YW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hdGFuaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXRhbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmF0YW5oKCl9LHQucHJvdG90eXBlLmNicnQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNicnQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNicnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNicnQoKX0sdC5wcm90b3R5cGUuY2VpbD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2VpbCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY2VpbD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY2VpbCgpfSx0LnByb3RvdHlwZS5jbHozMj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2x6MzIodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNsejMyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jbHozMigpfSx0LnByb3RvdHlwZS5jb3M9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNvcyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY29zPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jb3MoKX0sdC5wcm90b3R5cGUuY29zaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY29zaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY29zaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY29zaCgpfSx0LnByb3RvdHlwZS5leHA9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmV4cCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZXhwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5leHAoKX0sdC5wcm90b3R5cGUuZXhwbTE9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmV4cG0xKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5leHBtMT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZXhwbTEoKX0sdC5wcm90b3R5cGUuZmxvb3I9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmZsb29yKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5mbG9vcj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZmxvb3IoKX0sdC5wcm90b3R5cGUuZnJvdW5kPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5mcm91bmQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmZyb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZnJvdW5kKCl9LHQucHJvdG90eXBlLmxvZz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2c9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZygpfSx0LnByb3RvdHlwZS5sb2cxcD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMXAodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZzFwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2cxcCgpfSx0LnByb3RvdHlwZS5sb2cxMD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMTAodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZzEwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2cxMCgpfSx0LnByb3RvdHlwZS5sb2cyPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cyKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2cyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2cyKCl9LHQucHJvdG90eXBlLnJvdW5kPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5yb3VuZCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnJvdW5kKCl9LHQucHJvdG90eXBlLnNpZ249ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpZ24odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNpZ249ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNpZ24oKX0sdC5wcm90b3R5cGUuc2luPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zaW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNpbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc2luKCl9LHQucHJvdG90eXBlLnNpbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNpbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNpbmgoKX0sdC5wcm90b3R5cGUuc3FydD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc3FydCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc3FydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc3FydCgpfSx0LnByb3RvdHlwZS50YW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnRhbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQudGFuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS50YW4oKX0sdC5wcm90b3R5cGUudGFuaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudGFuaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQudGFuaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkudGFuaCgpfSx0LnByb3RvdHlwZS50cnVuYz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudHJ1bmModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnRydW5jPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS50cnVuYygpfSx0LnBvdz1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5wb3cocil9LHQucHJvdG90eXBlLnBvdz1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5wb3dTKHQpOnRoaXMucG93TSh0KX0sdC5wcm90b3R5cGUucG93Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscixNYXRoLnBvdyh0aGlzLmdldChlLHIpLHQpKTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUucG93TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLE1hdGgucG93KHRoaXMuZ2V0KGUsciksdC5nZXQoZSxyKSkpO3JldHVybiB0aGlzfX0oemUsVmUpO2NsYXNzIFBlIGV4dGVuZHMgemV7Y29uc3RydWN0b3IodCxlLHIpe3N1cGVyKCksdGhpcy5tYXRyaXg9dCx0aGlzLnJvd3M9ZSx0aGlzLmNvbHVtbnM9cn19Y2xhc3MgcWUgZXh0ZW5kcyBQZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LHQuY29sdW1ucyx0LnJvd3MpfXNldCh0LGUscil7cmV0dXJuIHRoaXMubWF0cml4LnNldChlLHQsciksdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5tYXRyaXguZ2V0KGUsdCl9fWNsYXNzICRlIGV4dGVuZHMgemV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmRhdGE9dCx0aGlzLnJvd3M9dC5sZW5ndGgsdGhpcy5jb2x1bW5zPXRbMF0ubGVuZ3RofXNldCh0LGUscil7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXT1yLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXX19ZnVuY3Rpb24gRGUodCxlKXtsZXQgcj0wO3JldHVybiBNYXRoLmFicyh0KT5NYXRoLmFicyhlKT8ocj1lL3QsTWF0aC5hYnModCkqTWF0aC5zcXJ0KDErcipyKSk6MCE9PWU/KHI9dC9lLE1hdGguYWJzKGUpKk1hdGguc3FydCgxK3IqcikpOjB9Y2xhc3MgVWV7Y29uc3RydWN0b3IodCxlPXt9KXtpZigodD0kZS5jaGVja01hdHJpeCh0KSkuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IG11c3QgYmUgbm9uLWVtcHR5Iik7bGV0IHI9dC5yb3dzLG49dC5jb2x1bW5zO2NvbnN0e2NvbXB1dGVMZWZ0U2luZ3VsYXJWZWN0b3JzOm89ITAsY29tcHV0ZVJpZ2h0U2luZ3VsYXJWZWN0b3JzOnM9ITAsYXV0b1RyYW5zcG9zZTppPSExfT1lO2xldCB1LGE9Qm9vbGVhbihvKSxoPUJvb2xlYW4ocyksbD0hMTtpZihyPG4paWYoaSl7dT10LnRyYW5zcG9zZSgpLHI9dS5yb3dzLG49dS5jb2x1bW5zLGw9ITA7bGV0IGU9YTthPWgsaD1lfWVsc2UgdT10LmNsb25lKCksY29uc29sZS53YXJuKCJDb21wdXRpbmcgU1ZEIG9uIGEgbWF0cml4IHdpdGggbW9yZSBjb2x1bW5zIHRoYW4gcm93cy4gQ29uc2lkZXIgZW5hYmxpbmcgYXV0b1RyYW5zcG9zZSIpO2Vsc2UgdT10LmNsb25lKCk7bGV0IGM9TWF0aC5taW4ocixuKSxmPU1hdGgubWluKHIrMSxuKSxtPW5ldyBGbG9hdDY0QXJyYXkoZiksZz1uZXcgVmUocixjKSxwPW5ldyBWZShuLG4pLHc9bmV3IEZsb2F0NjRBcnJheShuKSxkPW5ldyBGbG9hdDY0QXJyYXkociksYj1uZXcgRmxvYXQ2NEFycmF5KGYpO2ZvcihsZXQgdD0wO3Q8Zjt0KyspYlt0XT10O2xldCB5PU1hdGgubWluKHItMSxuKSx2PU1hdGgubWF4KDAsTWF0aC5taW4obi0yLHIpKSxNPU1hdGgubWF4KHksdik7Zm9yKGxldCB0PTA7dDxNO3QrKyl7aWYodDx5KXttW3RdPTA7Zm9yKGxldCBlPXQ7ZTxyO2UrKyltW3RdPURlKG1bdF0sdS5nZXQoZSx0KSk7aWYoMCE9PW1bdF0pe3UuZ2V0KHQsdCk8MCYmKG1bdF09LW1bdF0pO2ZvcihsZXQgZT10O2U8cjtlKyspdS5zZXQoZSx0LHUuZ2V0KGUsdCkvbVt0XSk7dS5zZXQodCx0LHUuZ2V0KHQsdCkrMSl9bVt0XT0tbVt0XX1mb3IobGV0IGU9dCsxO2U8bjtlKyspe2lmKHQ8eSYmMCE9PW1bdF0pe2xldCBuPTA7Zm9yKGxldCBvPXQ7bzxyO28rKyluKz11LmdldChvLHQpKnUuZ2V0KG8sZSk7bj0tbi91LmdldCh0LHQpO2ZvcihsZXQgbz10O288cjtvKyspdS5zZXQobyxlLHUuZ2V0KG8sZSkrbip1LmdldChvLHQpKX13W2VdPXUuZ2V0KHQsZSl9aWYoYSYmdDx5KWZvcihsZXQgZT10O2U8cjtlKyspZy5zZXQoZSx0LHUuZ2V0KGUsdCkpO2lmKHQ8dil7d1t0XT0wO2ZvcihsZXQgZT10KzE7ZTxuO2UrKyl3W3RdPURlKHdbdF0sd1tlXSk7aWYoMCE9PXdbdF0pe3dbdCsxXTwwJiYod1t0XT0wLXdbdF0pO2ZvcihsZXQgZT10KzE7ZTxuO2UrKyl3W2VdLz13W3RdO3dbdCsxXSs9MX1pZih3W3RdPS13W3RdLHQrMTxyJiYwIT09d1t0XSl7Zm9yKGxldCBlPXQrMTtlPHI7ZSsrKWRbZV09MDtmb3IobGV0IGU9dCsxO2U8cjtlKyspZm9yKGxldCByPXQrMTtyPG47cisrKWRbZV0rPXdbcl0qdS5nZXQoZSxyKTtmb3IobGV0IGU9dCsxO2U8bjtlKyspe2xldCBuPS13W2VdL3dbdCsxXTtmb3IobGV0IG89dCsxO288cjtvKyspdS5zZXQobyxlLHUuZ2V0KG8sZSkrbipkW29dKX19aWYoaClmb3IobGV0IGU9dCsxO2U8bjtlKyspcC5zZXQoZSx0LHdbZV0pfX1sZXQgeD1NYXRoLm1pbihuLHIrMSk7aWYoeTxuJiYobVt5XT11LmdldCh5LHkpKSxyPHgmJihtW3gtMV09MCksdisxPHgmJih3W3ZdPXUuZ2V0KHYseC0xKSksd1t4LTFdPTAsYSl7Zm9yKGxldCB0PXk7dDxjO3QrKyl7Zm9yKGxldCBlPTA7ZTxyO2UrKylnLnNldChlLHQsMCk7Zy5zZXQodCx0LDEpfWZvcihsZXQgdD15LTE7dD49MDt0LS0paWYoMCE9PW1bdF0pe2ZvcihsZXQgZT10KzE7ZTxjO2UrKyl7bGV0IG49MDtmb3IobGV0IG89dDtvPHI7bysrKW4rPWcuZ2V0KG8sdCkqZy5nZXQobyxlKTtuPS1uL2cuZ2V0KHQsdCk7Zm9yKGxldCBvPXQ7bzxyO28rKylnLnNldChvLGUsZy5nZXQobyxlKStuKmcuZ2V0KG8sdCkpfWZvcihsZXQgZT10O2U8cjtlKyspZy5zZXQoZSx0LC1nLmdldChlLHQpKTtnLnNldCh0LHQsMStnLmdldCh0LHQpKTtmb3IobGV0IGU9MDtlPHQtMTtlKyspZy5zZXQoZSx0LDApfWVsc2V7Zm9yKGxldCBlPTA7ZTxyO2UrKylnLnNldChlLHQsMCk7Zy5zZXQodCx0LDEpfX1pZihoKWZvcihsZXQgdD1uLTE7dD49MDt0LS0pe2lmKHQ8diYmMCE9PXdbdF0pZm9yKGxldCBlPXQrMTtlPG47ZSsrKXtsZXQgcj0wO2ZvcihsZXQgbz10KzE7bzxuO28rKylyKz1wLmdldChvLHQpKnAuZ2V0KG8sZSk7cj0tci9wLmdldCh0KzEsdCk7Zm9yKGxldCBvPXQrMTtvPG47bysrKXAuc2V0KG8sZSxwLmdldChvLGUpK3IqcC5nZXQobyx0KSl9Zm9yKGxldCBlPTA7ZTxuO2UrKylwLnNldChlLHQsMCk7cC5zZXQodCx0LDEpfWxldCBFPXgtMSxTPU51bWJlci5FUFNJTE9OO2Zvcig7eD4wOyl7bGV0IHQsZTtmb3IodD14LTI7dD49LTEmJi0xIT09dDt0LS0pe2NvbnN0IGU9TnVtYmVyLk1JTl9WQUxVRStTKk1hdGguYWJzKG1bdF0rTWF0aC5hYnMobVt0KzFdKSk7aWYoTWF0aC5hYnMod1t0XSk8PWV8fE51bWJlci5pc05hTih3W3RdKSl7d1t0XT0wO2JyZWFrfX1pZih0PT09eC0yKWU9NDtlbHNle2xldCByO2ZvcihyPXgtMTtyPj10JiZyIT09dDtyLS0pe2xldCBlPShyIT09eD9NYXRoLmFicyh3W3JdKTowKSsociE9PXQrMT9NYXRoLmFicyh3W3ItMV0pOjApO2lmKE1hdGguYWJzKG1bcl0pPD1TKmUpe21bcl09MDticmVha319cj09PXQ/ZT0zOnI9PT14LTE/ZT0xOihlPTIsdD1yKX1zd2l0Y2godCsrLGUpe2Nhc2UgMTp7bGV0IGU9d1t4LTJdO3dbeC0yXT0wO2ZvcihsZXQgcj14LTI7cj49dDtyLS0pe2xldCBvPURlKG1bcl0sZSkscz1tW3JdL28saT1lL287aWYobVtyXT1vLHIhPT10JiYoZT0taSp3W3ItMV0sd1tyLTFdPXMqd1tyLTFdKSxoKWZvcihsZXQgdD0wO3Q8bjt0Kyspbz1zKnAuZ2V0KHQscikraSpwLmdldCh0LHgtMSkscC5zZXQodCx4LTEsLWkqcC5nZXQodCxyKStzKnAuZ2V0KHQseC0xKSkscC5zZXQodCxyLG8pfWJyZWFrfWNhc2UgMjp7bGV0IGU9d1t0LTFdO3dbdC0xXT0wO2ZvcihsZXQgbj10O248eDtuKyspe2xldCBvPURlKG1bbl0sZSkscz1tW25dL28saT1lL287aWYobVtuXT1vLGU9LWkqd1tuXSx3W25dPXMqd1tuXSxhKWZvcihsZXQgZT0wO2U8cjtlKyspbz1zKmcuZ2V0KGUsbikraSpnLmdldChlLHQtMSksZy5zZXQoZSx0LTEsLWkqZy5nZXQoZSxuKStzKmcuZ2V0KGUsdC0xKSksZy5zZXQoZSxuLG8pfWJyZWFrfWNhc2UgMzp7Y29uc3QgZT1NYXRoLm1heChNYXRoLmFicyhtW3gtMV0pLE1hdGguYWJzKG1beC0yXSksTWF0aC5hYnMod1t4LTJdKSxNYXRoLmFicyhtW3RdKSxNYXRoLmFicyh3W3RdKSksbz1tW3gtMV0vZSxzPW1beC0yXS9lLGk9d1t4LTJdL2UsdT1tW3RdL2UsbD13W3RdL2UsYz0oKHMrbykqKHMtbykraSppKS8yLGY9byppKihvKmkpO2xldCBkPTA7MD09PWMmJjA9PT1mfHwoZD1jPDA/MC1NYXRoLnNxcnQoYypjK2YpOk1hdGguc3FydChjKmMrZiksZD1mLyhjK2QpKTtsZXQgYj0odStvKSoodS1vKStkLHk9dSpsO2ZvcihsZXQgZT10O2U8eC0xO2UrKyl7bGV0IG89RGUoYix5KTswPT09byYmKG89TnVtYmVyLk1JTl9WQUxVRSk7bGV0IHM9Yi9vLGk9eS9vO2lmKGUhPT10JiYod1tlLTFdPW8pLGI9cyptW2VdK2kqd1tlXSx3W2VdPXMqd1tlXS1pKm1bZV0seT1pKm1bZSsxXSxtW2UrMV09cyptW2UrMV0saClmb3IobGV0IHQ9MDt0PG47dCsrKW89cypwLmdldCh0LGUpK2kqcC5nZXQodCxlKzEpLHAuc2V0KHQsZSsxLC1pKnAuZ2V0KHQsZSkrcypwLmdldCh0LGUrMSkpLHAuc2V0KHQsZSxvKTtpZihvPURlKGIseSksMD09PW8mJihvPU51bWJlci5NSU5fVkFMVUUpLHM9Yi9vLGk9eS9vLG1bZV09byxiPXMqd1tlXStpKm1bZSsxXSxtW2UrMV09LWkqd1tlXStzKm1bZSsxXSx5PWkqd1tlKzFdLHdbZSsxXT1zKndbZSsxXSxhJiZlPHItMSlmb3IobGV0IHQ9MDt0PHI7dCsrKW89cypnLmdldCh0LGUpK2kqZy5nZXQodCxlKzEpLGcuc2V0KHQsZSsxLC1pKmcuZ2V0KHQsZSkrcypnLmdldCh0LGUrMSkpLGcuc2V0KHQsZSxvKX13W3gtMl09YjticmVha31jYXNlIDQ6aWYobVt0XTw9MCYmKG1bdF09bVt0XTwwPy1tW3RdOjAsaCkpZm9yKGxldCBlPTA7ZTw9RTtlKyspcC5zZXQoZSx0LC1wLmdldChlLHQpKTtmb3IoO3Q8RSYmIShtW3RdPj1tW3QrMV0pOyl7bGV0IGU9bVt0XTtpZihtW3RdPW1bdCsxXSxtW3QrMV09ZSxoJiZ0PG4tMSlmb3IobGV0IHI9MDtyPG47cisrKWU9cC5nZXQocix0KzEpLHAuc2V0KHIsdCsxLHAuZ2V0KHIsdCkpLHAuc2V0KHIsdCxlKTtpZihhJiZ0PHItMSlmb3IobGV0IG49MDtuPHI7bisrKWU9Zy5nZXQobix0KzEpLGcuc2V0KG4sdCsxLGcuZ2V0KG4sdCkpLGcuc2V0KG4sdCxlKTt0Kyt9eC0tfX1pZihsKXtsZXQgdD1wO3A9ZyxnPXR9dGhpcy5tPXIsdGhpcy5uPW4sdGhpcy5zPW0sdGhpcy5VPWcsdGhpcy5WPXB9c29sdmUodCl7bGV0IGU9dCxyPXRoaXMudGhyZXNob2xkLG49dGhpcy5zLmxlbmd0aCxvPVZlLnplcm9zKG4sbik7Zm9yKGxldCB0PTA7dDxuO3QrKylNYXRoLmFicyh0aGlzLnNbdF0pPD1yP28uc2V0KHQsdCwwKTpvLnNldCh0LHQsMS90aGlzLnNbdF0pO2xldCBzPXRoaXMuVSxpPXRoaXMucmlnaHRTaW5ndWxhclZlY3RvcnMsdT1pLm1tdWwobyksYT1pLnJvd3MsaD1zLnJvd3MsbD1WZS56ZXJvcyhhLGgpO2ZvcihsZXQgdD0wO3Q8YTt0KyspZm9yKGxldCBlPTA7ZTxoO2UrKyl7bGV0IHI9MDtmb3IobGV0IG89MDtvPG47bysrKXIrPXUuZ2V0KHQsbykqcy5nZXQoZSxvKTtsLnNldCh0LGUscil9cmV0dXJuIGwubW11bChlKX1zb2x2ZUZvckRpYWdvbmFsKHQpe3JldHVybiB0aGlzLnNvbHZlKFZlLmRpYWcodCkpfWludmVyc2UoKXtsZXQgdD10aGlzLlYsZT10aGlzLnRocmVzaG9sZCxyPXQucm93cyxuPXQuY29sdW1ucyxvPW5ldyBWZShyLHRoaXMucy5sZW5ndGgpO2ZvcihsZXQgcz0wO3M8cjtzKyspZm9yKGxldCByPTA7cjxuO3IrKylNYXRoLmFicyh0aGlzLnNbcl0pPmUmJm8uc2V0KHMscix0LmdldChzLHIpL3RoaXMuc1tyXSk7bGV0IHM9dGhpcy5VLGk9cy5yb3dzLHU9cy5jb2x1bW5zLGE9bmV3IFZlKHIsaSk7Zm9yKGxldCB0PTA7dDxyO3QrKylmb3IobGV0IGU9MDtlPGk7ZSsrKXtsZXQgcj0wO2ZvcihsZXQgbj0wO248dTtuKyspcis9by5nZXQodCxuKSpzLmdldChlLG4pO2Euc2V0KHQsZSxyKX1yZXR1cm4gYX1nZXQgY29uZGl0aW9uKCl7cmV0dXJuIHRoaXMuc1swXS90aGlzLnNbTWF0aC5taW4odGhpcy5tLHRoaXMubiktMV19Z2V0IG5vcm0yKCl7cmV0dXJuIHRoaXMuc1swXX1nZXQgcmFuaygpe2xldCB0PU1hdGgubWF4KHRoaXMubSx0aGlzLm4pKnRoaXMuc1swXSpOdW1iZXIuRVBTSUxPTixlPTAscj10aGlzLnM7Zm9yKGxldCBuPTAsbz1yLmxlbmd0aDtuPG87bisrKXJbbl0+dCYmZSsrO3JldHVybiBlfWdldCBkaWFnb25hbCgpe3JldHVybiBBcnJheS5mcm9tKHRoaXMucyl9Z2V0IHRocmVzaG9sZCgpe3JldHVybiBOdW1iZXIuRVBTSUxPTi8yKk1hdGgubWF4KHRoaXMubSx0aGlzLm4pKnRoaXMuc1swXX1nZXQgbGVmdFNpbmd1bGFyVmVjdG9ycygpe3JldHVybiB0aGlzLlV9Z2V0IHJpZ2h0U2luZ3VsYXJWZWN0b3JzKCl7cmV0dXJuIHRoaXMuVn1nZXQgZGlhZ29uYWxNYXRyaXgoKXtyZXR1cm4gVmUuZGlhZyh0aGlzLnMpfX1jbGFzcyBMZXtjb25zdHJ1Y3Rvcih0LGU9e30pe2NvbnN0e2Fzc3VtZVN5bW1ldHJpYzpyPSExfT1lO2lmKCEodD0kZS5jaGVja01hdHJpeCh0KSkuaXNTcXVhcmUoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBpcyBub3QgYSBzcXVhcmUgbWF0cml4Iik7aWYodC5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggbXVzdCBiZSBub24tZW1wdHkiKTtsZXQgbixvLHM9dC5jb2x1bW5zLGk9bmV3IFZlKHMscyksdT1uZXcgRmxvYXQ2NEFycmF5KHMpLGE9bmV3IEZsb2F0NjRBcnJheShzKSxoPXQsbD0hMTtpZihsPSEhcnx8dC5pc1N5bW1ldHJpYygpLGwpe2ZvcihuPTA7bjxzO24rKylmb3Iobz0wO288cztvKyspaS5zZXQobixvLGguZ2V0KG4sbykpOyFmdW5jdGlvbih0LGUscixuKXtsZXQgbyxzLGksdSxhLGgsbCxjO2ZvcihhPTA7YTx0O2ErKylyW2FdPW4uZ2V0KHQtMSxhKTtmb3IodT10LTE7dT4wO3UtLSl7Zm9yKGM9MCxpPTAsaD0wO2g8dTtoKyspYys9TWF0aC5hYnMocltoXSk7aWYoMD09PWMpZm9yKGVbdV09clt1LTFdLGE9MDthPHU7YSsrKXJbYV09bi5nZXQodS0xLGEpLG4uc2V0KHUsYSwwKSxuLnNldChhLHUsMCk7ZWxzZXtmb3IoaD0wO2g8dTtoKyspcltoXS89YyxpKz1yW2hdKnJbaF07Zm9yKG89clt1LTFdLHM9TWF0aC5zcXJ0KGkpLG8+MCYmKHM9LXMpLGVbdV09YypzLGktPW8qcyxyW3UtMV09by1zLGE9MDthPHU7YSsrKWVbYV09MDtmb3IoYT0wO2E8dTthKyspe2ZvcihvPXJbYV0sbi5zZXQoYSx1LG8pLHM9ZVthXStuLmdldChhLGEpKm8saD1hKzE7aDw9dS0xO2grKylzKz1uLmdldChoLGEpKnJbaF0sZVtoXSs9bi5nZXQoaCxhKSpvO2VbYV09c31mb3Iobz0wLGE9MDthPHU7YSsrKWVbYV0vPWksbys9ZVthXSpyW2FdO2ZvcihsPW8vKGkraSksYT0wO2E8dTthKyspZVthXS09bCpyW2FdO2ZvcihhPTA7YTx1O2ErKyl7Zm9yKG89clthXSxzPWVbYV0saD1hO2g8PXUtMTtoKyspbi5zZXQoaCxhLG4uZ2V0KGgsYSktKG8qZVtoXStzKnJbaF0pKTtyW2FdPW4uZ2V0KHUtMSxhKSxuLnNldCh1LGEsMCl9fXJbdV09aX1mb3IodT0wO3U8dC0xO3UrKyl7aWYobi5zZXQodC0xLHUsbi5nZXQodSx1KSksbi5zZXQodSx1LDEpLGk9clt1KzFdLDAhPT1pKXtmb3IoaD0wO2g8PXU7aCsrKXJbaF09bi5nZXQoaCx1KzEpL2k7Zm9yKGE9MDthPD11O2ErKyl7Zm9yKHM9MCxoPTA7aDw9dTtoKyspcys9bi5nZXQoaCx1KzEpKm4uZ2V0KGgsYSk7Zm9yKGg9MDtoPD11O2grKyluLnNldChoLGEsbi5nZXQoaCxhKS1zKnJbaF0pfX1mb3IoaD0wO2g8PXU7aCsrKW4uc2V0KGgsdSsxLDApfWZvcihhPTA7YTx0O2ErKylyW2FdPW4uZ2V0KHQtMSxhKSxuLnNldCh0LTEsYSwwKTtuLnNldCh0LTEsdC0xLDEpLGVbMF09MH0ocyxhLHUsaSksZnVuY3Rpb24odCxlLHIsbil7bGV0IG8scyxpLHUsYSxoLGwsYyxmLG0sZyxwLHcsZCxiLHk7Zm9yKGk9MTtpPHQ7aSsrKWVbaS0xXT1lW2ldO2VbdC0xXT0wO2xldCB2PTAsTT0wLHg9TnVtYmVyLkVQU0lMT047Zm9yKGg9MDtoPHQ7aCsrKXtmb3IoTT1NYXRoLm1heChNLE1hdGguYWJzKHJbaF0pK01hdGguYWJzKGVbaF0pKSxsPWg7bDx0JiYhKE1hdGguYWJzKGVbbF0pPD14Kk0pOylsKys7aWYobD5oKWRve2ZvcihvPXJbaF0sYz0ocltoKzFdLW8pLygyKmVbaF0pLGY9RGUoYywxKSxjPDAmJihmPS1mKSxyW2hdPWVbaF0vKGMrZikscltoKzFdPWVbaF0qKGMrZiksbT1yW2grMV0scz1vLXJbaF0saT1oKzI7aTx0O2krKylyW2ldLT1zO2Zvcih2Kz1zLGM9cltsXSxnPTEscD1nLHc9ZyxkPWVbaCsxXSxiPTAseT0wLGk9bC0xO2k+PWg7aS0tKWZvcih3PXAscD1nLHk9YixvPWcqZVtpXSxzPWcqYyxmPURlKGMsZVtpXSksZVtpKzFdPWIqZixiPWVbaV0vZixnPWMvZixjPWcqcltpXS1iKm8scltpKzFdPXMrYiooZypvK2IqcltpXSksYT0wO2E8dDthKyspcz1uLmdldChhLGkrMSksbi5zZXQoYSxpKzEsYipuLmdldChhLGkpK2cqcyksbi5zZXQoYSxpLGcqbi5nZXQoYSxpKS1iKnMpO2M9LWIqeSp3KmQqZVtoXS9tLGVbaF09YipjLHJbaF09ZypjfXdoaWxlKE1hdGguYWJzKGVbaF0pPngqTSk7cltoXT1yW2hdK3YsZVtoXT0wfWZvcihpPTA7aTx0LTE7aSsrKXtmb3IoYT1pLGM9cltpXSx1PWkrMTt1PHQ7dSsrKXJbdV08YyYmKGE9dSxjPXJbdV0pO2lmKGEhPT1pKWZvcihyW2FdPXJbaV0scltpXT1jLHU9MDt1PHQ7dSsrKWM9bi5nZXQodSxpKSxuLnNldCh1LGksbi5nZXQodSxhKSksbi5zZXQodSxhLGMpfX0ocyxhLHUsaSl9ZWxzZXtsZXQgdD1uZXcgVmUocyxzKSxlPW5ldyBGbG9hdDY0QXJyYXkocyk7Zm9yKG89MDtvPHM7bysrKWZvcihuPTA7bjxzO24rKyl0LnNldChuLG8saC5nZXQobixvKSk7IWZ1bmN0aW9uKHQsZSxyLG4pe2xldCBvLHMsaSx1LGEsaCxsLGM9MCxmPXQtMTtmb3IoaD1jKzE7aDw9Zi0xO2grKyl7Zm9yKGw9MCx1PWg7dTw9Zjt1KyspbCs9TWF0aC5hYnMoZS5nZXQodSxoLTEpKTtpZigwIT09bCl7Zm9yKGk9MCx1PWY7dT49aDt1LS0pclt1XT1lLmdldCh1LGgtMSkvbCxpKz1yW3VdKnJbdV07Zm9yKHM9TWF0aC5zcXJ0KGkpLHJbaF0+MCYmKHM9LXMpLGktPXJbaF0qcyxyW2hdPXJbaF0tcyxhPWg7YTx0O2ErKyl7Zm9yKG89MCx1PWY7dT49aDt1LS0pbys9clt1XSplLmdldCh1LGEpO2ZvcihvLz1pLHU9aDt1PD1mO3UrKyllLnNldCh1LGEsZS5nZXQodSxhKS1vKnJbdV0pfWZvcih1PTA7dTw9Zjt1Kyspe2ZvcihvPTAsYT1mO2E+PWg7YS0tKW8rPXJbYV0qZS5nZXQodSxhKTtmb3Ioby89aSxhPWg7YTw9ZjthKyspZS5zZXQodSxhLGUuZ2V0KHUsYSktbypyW2FdKX1yW2hdPWwqcltoXSxlLnNldChoLGgtMSxsKnMpfX1mb3IodT0wO3U8dDt1KyspZm9yKGE9MDthPHQ7YSsrKW4uc2V0KHUsYSx1PT09YT8xOjApO2ZvcihoPWYtMTtoPj1jKzE7aC0tKWlmKDAhPT1lLmdldChoLGgtMSkpe2Zvcih1PWgrMTt1PD1mO3UrKylyW3VdPWUuZ2V0KHUsaC0xKTtmb3IoYT1oO2E8PWY7YSsrKXtmb3Iocz0wLHU9aDt1PD1mO3UrKylzKz1yW3VdKm4uZ2V0KHUsYSk7Zm9yKHM9cy9yW2hdL2UuZ2V0KGgsaC0xKSx1PWg7dTw9Zjt1Kyspbi5zZXQodSxhLG4uZ2V0KHUsYSkrcypyW3VdKX19fShzLHQsZSxpKSxmdW5jdGlvbih0LGUscixuLG8pe2xldCBzLGksdSxhLGgsbCxjLGYsbSxnLHAsdyxkLGIseSx2PXQtMSxNPTAseD10LTEsRT1OdW1iZXIuRVBTSUxPTixTPTAsaj0wLF89MCxBPTAsQz0wLFI9MCxJPTAsaz0wO2ZvcihzPTA7czx0O3MrKylmb3IoKHM8TXx8cz54KSYmKHJbc109by5nZXQocyxzKSxlW3NdPTApLGk9TWF0aC5tYXgocy0xLDApO2k8dDtpKyspais9TWF0aC5hYnMoby5nZXQocyxpKSk7Zm9yKDt2Pj1NOyl7Zm9yKGE9djthPk0mJihSPU1hdGguYWJzKG8uZ2V0KGEtMSxhLTEpKStNYXRoLmFicyhvLmdldChhLGEpKSwwPT09UiYmKFI9aiksIShNYXRoLmFicyhvLmdldChhLGEtMSkpPEUqUikpOylhLS07aWYoYT09PXYpby5zZXQodix2LG8uZ2V0KHYsdikrUyksclt2XT1vLmdldCh2LHYpLGVbdl09MCx2LS0saz0wO2Vsc2UgaWYoYT09PXYtMSl7aWYoYz1vLmdldCh2LHYtMSkqby5nZXQodi0xLHYpLF89KG8uZ2V0KHYtMSx2LTEpLW8uZ2V0KHYsdikpLzIsQT1fKl8rYyxJPU1hdGguc3FydChNYXRoLmFicyhBKSksby5zZXQodix2LG8uZ2V0KHYsdikrUyksby5zZXQodi0xLHYtMSxvLmdldCh2LTEsdi0xKStTKSxmPW8uZ2V0KHYsdiksQT49MCl7Zm9yKEk9Xz49MD9fK0k6Xy1JLHJbdi0xXT1mK0ksclt2XT1yW3YtMV0sMCE9PUkmJihyW3ZdPWYtYy9JKSxlW3YtMV09MCxlW3ZdPTAsZj1vLmdldCh2LHYtMSksUj1NYXRoLmFicyhmKStNYXRoLmFicyhJKSxfPWYvUixBPUkvUixDPU1hdGguc3FydChfKl8rQSpBKSxfLz1DLEEvPUMsaT12LTE7aTx0O2krKylJPW8uZ2V0KHYtMSxpKSxvLnNldCh2LTEsaSxBKkkrXypvLmdldCh2LGkpKSxvLnNldCh2LGksQSpvLmdldCh2LGkpLV8qSSk7Zm9yKHM9MDtzPD12O3MrKylJPW8uZ2V0KHMsdi0xKSxvLnNldChzLHYtMSxBKkkrXypvLmdldChzLHYpKSxvLnNldChzLHYsQSpvLmdldChzLHYpLV8qSSk7Zm9yKHM9TTtzPD14O3MrKylJPW4uZ2V0KHMsdi0xKSxuLnNldChzLHYtMSxBKkkrXypuLmdldChzLHYpKSxuLnNldChzLHYsQSpuLmdldChzLHYpLV8qSSl9ZWxzZSByW3YtMV09ZitfLHJbdl09ZitfLGVbdi0xXT1JLGVbdl09LUk7di09MixrPTB9ZWxzZXtpZihmPW8uZ2V0KHYsdiksbT0wLGM9MCxhPHYmJihtPW8uZ2V0KHYtMSx2LTEpLGM9by5nZXQodix2LTEpKm8uZ2V0KHYtMSx2KSksMTA9PT1rKXtmb3IoUys9ZixzPU07czw9djtzKyspby5zZXQocyxzLG8uZ2V0KHMscyktZik7Uj1NYXRoLmFicyhvLmdldCh2LHYtMSkpK01hdGguYWJzKG8uZ2V0KHYtMSx2LTIpKSxmPW09Ljc1KlIsYz0tLjQzNzUqUipSfWlmKDMwPT09ayYmKFI9KG0tZikvMixSPVIqUitjLFI+MCkpe2ZvcihSPU1hdGguc3FydChSKSxtPGYmJihSPS1SKSxSPWYtYy8oKG0tZikvMitSKSxzPU07czw9djtzKyspby5zZXQocyxzLG8uZ2V0KHMscyktUik7Uys9UixmPW09Yz0uOTY0fWZvcihrKz0xLGg9di0yO2g+PWEmJihJPW8uZ2V0KGgsaCksQz1mLUksUj1tLUksXz0oQypSLWMpL28uZ2V0KGgrMSxoKStvLmdldChoLGgrMSksQT1vLmdldChoKzEsaCsxKS1JLUMtUixDPW8uZ2V0KGgrMixoKzEpLFI9TWF0aC5hYnMoXykrTWF0aC5hYnMoQSkrTWF0aC5hYnMoQyksXy89UixBLz1SLEMvPVIsaCE9PWEpJiYhKE1hdGguYWJzKG8uZ2V0KGgsaC0xKSkqKE1hdGguYWJzKEEpK01hdGguYWJzKEMpKTxFKihNYXRoLmFicyhfKSooTWF0aC5hYnMoby5nZXQoaC0xLGgtMSkpK01hdGguYWJzKEkpK01hdGguYWJzKG8uZ2V0KGgrMSxoKzEpKSkpKTspaC0tO2ZvcihzPWgrMjtzPD12O3MrKylvLnNldChzLHMtMiwwKSxzPmgrMiYmby5zZXQocyxzLTMsMCk7Zm9yKHU9aDt1PD12LTEmJihiPXUhPT12LTEsdSE9PWgmJihfPW8uZ2V0KHUsdS0xKSxBPW8uZ2V0KHUrMSx1LTEpLEM9Yj9vLmdldCh1KzIsdS0xKTowLGY9TWF0aC5hYnMoXykrTWF0aC5hYnMoQSkrTWF0aC5hYnMoQyksMCE9PWYmJihfLz1mLEEvPWYsQy89ZikpLDAhPT1mKTt1KyspaWYoUj1NYXRoLnNxcnQoXypfK0EqQStDKkMpLF88MCYmKFI9LVIpLDAhPT1SKXtmb3IodSE9PWg/by5zZXQodSx1LTEsLVIqZik6YSE9PWgmJm8uc2V0KHUsdS0xLC1vLmdldCh1LHUtMSkpLF8rPVIsZj1fL1IsbT1BL1IsST1DL1IsQS89XyxDLz1fLGk9dTtpPHQ7aSsrKV89by5nZXQodSxpKStBKm8uZ2V0KHUrMSxpKSxiJiYoXys9QypvLmdldCh1KzIsaSksby5zZXQodSsyLGksby5nZXQodSsyLGkpLV8qSSkpLG8uc2V0KHUsaSxvLmdldCh1LGkpLV8qZiksby5zZXQodSsxLGksby5nZXQodSsxLGkpLV8qbSk7Zm9yKHM9MDtzPD1NYXRoLm1pbih2LHUrMyk7cysrKV89ZipvLmdldChzLHUpK20qby5nZXQocyx1KzEpLGImJihfKz1JKm8uZ2V0KHMsdSsyKSxvLnNldChzLHUrMixvLmdldChzLHUrMiktXypDKSksby5zZXQocyx1LG8uZ2V0KHMsdSktXyksby5zZXQocyx1KzEsby5nZXQocyx1KzEpLV8qQSk7Zm9yKHM9TTtzPD14O3MrKylfPWYqbi5nZXQocyx1KSttKm4uZ2V0KHMsdSsxKSxiJiYoXys9SSpuLmdldChzLHUrMiksbi5zZXQocyx1KzIsbi5nZXQocyx1KzIpLV8qQykpLG4uc2V0KHMsdSxuLmdldChzLHUpLV8pLG4uc2V0KHMsdSsxLG4uZ2V0KHMsdSsxKS1fKkEpfX19aWYoMD09PWopcmV0dXJuO2Zvcih2PXQtMTt2Pj0wO3YtLSlpZihfPXJbdl0sQT1lW3ZdLDA9PT1BKWZvcihhPXYsby5zZXQodix2LDEpLHM9di0xO3M+PTA7cy0tKXtmb3IoYz1vLmdldChzLHMpLV8sQz0wLGk9YTtpPD12O2krKylDKz1vLmdldChzLGkpKm8uZ2V0KGksdik7aWYoZVtzXTwwKUk9YyxSPUM7ZWxzZSBpZihhPXMsMD09PWVbc10/by5zZXQocyx2LDAhPT1jPy1DL2M6LUMvKEUqaikpOihmPW8uZ2V0KHMscysxKSxtPW8uZ2V0KHMrMSxzKSxBPShyW3NdLV8pKihyW3NdLV8pK2Vbc10qZVtzXSxsPShmKlItSSpDKS9BLG8uc2V0KHMsdixsKSxvLnNldChzKzEsdixNYXRoLmFicyhmKT5NYXRoLmFicyhJKT8oLUMtYypsKS9mOigtUi1tKmwpL0kpKSxsPU1hdGguYWJzKG8uZ2V0KHMsdikpLEUqbCpsPjEpZm9yKGk9cztpPD12O2krKylvLnNldChpLHYsby5nZXQoaSx2KS9sKX1lbHNlIGlmKEE8MClmb3IoYT12LTEsTWF0aC5hYnMoby5nZXQodix2LTEpKT5NYXRoLmFicyhvLmdldCh2LTEsdikpPyhvLnNldCh2LTEsdi0xLEEvby5nZXQodix2LTEpKSxvLnNldCh2LTEsdiwtKG8uZ2V0KHYsdiktXykvby5nZXQodix2LTEpKSk6KHk9QmUoMCwtby5nZXQodi0xLHYpLG8uZ2V0KHYtMSx2LTEpLV8sQSksby5zZXQodi0xLHYtMSx5WzBdKSxvLnNldCh2LTEsdix5WzFdKSksby5zZXQodix2LTEsMCksby5zZXQodix2LDEpLHM9di0yO3M+PTA7cy0tKXtmb3IoZz0wLHA9MCxpPWE7aTw9djtpKyspZys9by5nZXQocyxpKSpvLmdldChpLHYtMSkscCs9by5nZXQocyxpKSpvLmdldChpLHYpO2lmKGM9by5nZXQocyxzKS1fLGVbc108MClJPWMsQz1nLFI9cDtlbHNlIGlmKGE9cywwPT09ZVtzXT8oeT1CZSgtZywtcCxjLEEpLG8uc2V0KHMsdi0xLHlbMF0pLG8uc2V0KHMsdix5WzFdKSk6KGY9by5nZXQocyxzKzEpLG09by5nZXQocysxLHMpLHc9KHJbc10tXykqKHJbc10tXykrZVtzXSplW3NdLUEqQSxkPTIqKHJbc10tXykqQSwwPT09dyYmMD09PWQmJih3PUUqaiooTWF0aC5hYnMoYykrTWF0aC5hYnMoQSkrTWF0aC5hYnMoZikrTWF0aC5hYnMobSkrTWF0aC5hYnMoSSkpKSx5PUJlKGYqQy1JKmcrQSpwLGYqUi1JKnAtQSpnLHcsZCksby5zZXQocyx2LTEseVswXSksby5zZXQocyx2LHlbMV0pLE1hdGguYWJzKGYpPk1hdGguYWJzKEkpK01hdGguYWJzKEEpPyhvLnNldChzKzEsdi0xLCgtZy1jKm8uZ2V0KHMsdi0xKStBKm8uZ2V0KHMsdikpL2YpLG8uc2V0KHMrMSx2LCgtcC1jKm8uZ2V0KHMsdiktQSpvLmdldChzLHYtMSkpL2YpKTooeT1CZSgtQy1tKm8uZ2V0KHMsdi0xKSwtUi1tKm8uZ2V0KHMsdiksSSxBKSxvLnNldChzKzEsdi0xLHlbMF0pLG8uc2V0KHMrMSx2LHlbMV0pKSksbD1NYXRoLm1heChNYXRoLmFicyhvLmdldChzLHYtMSkpLE1hdGguYWJzKG8uZ2V0KHMsdikpKSxFKmwqbD4xKWZvcihpPXM7aTw9djtpKyspby5zZXQoaSx2LTEsby5nZXQoaSx2LTEpL2wpLG8uc2V0KGksdixvLmdldChpLHYpL2wpfWZvcihzPTA7czx0O3MrKylpZihzPE18fHM+eClmb3IoaT1zO2k8dDtpKyspbi5zZXQocyxpLG8uZ2V0KHMsaSkpO2ZvcihpPXQtMTtpPj1NO2ktLSlmb3Iocz1NO3M8PXg7cysrKXtmb3IoST0wLHU9TTt1PD1NYXRoLm1pbihpLHgpO3UrKylJKz1uLmdldChzLHUpKm8uZ2V0KHUsaSk7bi5zZXQocyxpLEkpfX0ocyxhLHUsaSx0KX10aGlzLm49cyx0aGlzLmU9YSx0aGlzLmQ9dSx0aGlzLlY9aX1nZXQgcmVhbEVpZ2VudmFsdWVzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5kKX1nZXQgaW1hZ2luYXJ5RWlnZW52YWx1ZXMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmUpfWdldCBlaWdlbnZlY3Rvck1hdHJpeCgpe3JldHVybiB0aGlzLlZ9Z2V0IGRpYWdvbmFsTWF0cml4KCl7bGV0IHQsZSxyPXRoaXMubixuPXRoaXMuZSxvPXRoaXMuZCxzPW5ldyBWZShyLHIpO2Zvcih0PTA7dDxyO3QrKyl7Zm9yKGU9MDtlPHI7ZSsrKXMuc2V0KHQsZSwwKTtzLnNldCh0LHQsb1t0XSksblt0XT4wP3Muc2V0KHQsdCsxLG5bdF0pOm5bdF08MCYmcy5zZXQodCx0LTEsblt0XSl9cmV0dXJuIHN9fWZ1bmN0aW9uIEJlKHQsZSxyLG4pe2xldCBvLHM7cmV0dXJuIE1hdGguYWJzKHIpPk1hdGguYWJzKG4pPyhvPW4vcixzPXIrbypuLFsodCtvKmUpL3MsKGUtbyp0KS9zXSk6KG89ci9uLHM9bitvKnIsWyhvKnQrZSkvcywobyplLXQpL3NdKX1jbGFzcyBHZXtjb25zdHJ1Y3Rvcih0LGU9e30pe3Q9JGUuY2hlY2tNYXRyaXgodCk7bGV0e1k6cn09ZTtjb25zdHtzY2FsZVNjb3JlczpuPSExLG1heEl0ZXJhdGlvbnM6bz0xZTMsdGVybWluYXRpb25Dcml0ZXJpYTpzPTFlLTEwfT1lO2xldCBpO2lmKHIpe2lmKHI9eWUocikmJiJudW1iZXIiPT10eXBlb2YgclswXT9WZS5jb2x1bW5WZWN0b3Iocik6JGUuY2hlY2tNYXRyaXgociksci5yb3dzIT09dC5yb3dzKXRocm93IG5ldyBFcnJvcigiWSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cyBhcyBYIik7aT1yLmdldENvbHVtblZlY3RvcigwKX1lbHNlIGk9dC5nZXRDb2x1bW5WZWN0b3IoMCk7bGV0IHUsYSxoLGwsYz0xO2ZvcihsZXQgZT0wO2U8byYmYz5zO2UrKyloPXQudHJhbnNwb3NlKCkubW11bChpKS5kaXYoaS50cmFuc3Bvc2UoKS5tbXVsKGkpLmdldCgwLDApKSxoPWguZGl2KGgubm9ybSgpKSx1PXQubW11bChoKS5kaXYoaC50cmFuc3Bvc2UoKS5tbXVsKGgpLmdldCgwLDApKSxlPjAmJihjPXUuY2xvbmUoKS5zdWIobCkucG93KDIpLnN1bSgpKSxsPXUuY2xvbmUoKSxyPyhhPXIudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKSxhPWEuZGl2KGEubm9ybSgpKSxpPXIubW11bChhKS5kaXYoYS50cmFuc3Bvc2UoKS5tbXVsKGEpLmdldCgwLDApKSk6aT11O2lmKHIpe2xldCBlPXQudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKTtlPWUuZGl2KGUubm9ybSgpKTtsZXQgbj10LmNsb25lKCkuc3ViKHUuY2xvbmUoKS5tbXVsKGUudHJhbnNwb3NlKCkpKSxvPWkudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKSxzPXIuY2xvbmUoKS5zdWIodS5jbG9uZSgpLm11bFMoby5nZXQoMCwwKSkubW11bChhLnRyYW5zcG9zZSgpKSk7dGhpcy50PXUsdGhpcy5wPWUudHJhbnNwb3NlKCksdGhpcy53PWgudHJhbnNwb3NlKCksdGhpcy5xPWEsdGhpcy51PWksdGhpcy5zPXUudHJhbnNwb3NlKCkubW11bCh1KSx0aGlzLnhSZXNpZHVhbD1uLHRoaXMueVJlc2lkdWFsPXMsdGhpcy5iZXRhcz1vfWVsc2UgdGhpcy53PWgudHJhbnNwb3NlKCksdGhpcy5zPXUudHJhbnNwb3NlKCkubW11bCh1KS5zcXJ0KCksdGhpcy50PW4/dS5jbG9uZSgpLmRpdih0aGlzLnMuZ2V0KDAsMCkpOnUsdGhpcy54UmVzaWR1YWw9dC5zdWIodS5tbXVsKGgudHJhbnNwb3NlKCkpKX19Y2xhc3MgS2V7Y29uc3RydWN0b3IodCxlPXt9KXtpZighMD09PXQpe2NvbnN0IHQ9ZTtyZXR1cm4gdGhpcy5jZW50ZXI9dC5jZW50ZXIsdGhpcy5zY2FsZT10LnNjYWxlLHRoaXMubWVhbnM9dC5tZWFucyx0aGlzLnN0ZGV2cz10LnN0ZGV2cyx0aGlzLlU9VmUuY2hlY2tNYXRyaXgodC5VKSx0aGlzLlM9dC5TLHRoaXMuUj10LlIsdm9pZCh0aGlzLmV4Y2x1ZGVkRmVhdHVyZXM9dC5leGNsdWRlZEZlYXR1cmVzfHxbXSl9dD1uZXcgVmUodCk7Y29uc3R7aXNDb3ZhcmlhbmNlTWF0cml4OnI9ITEsbWV0aG9kOm49IlNWRCIsbkNvbXBOSVBBTFM6bz0yLGNlbnRlcjpzPSEwLHNjYWxlOmk9ITEsaWdub3JlWmVyb1ZhcmlhbmNlOnU9ITF9PWU7aWYodGhpcy5jZW50ZXI9cyx0aGlzLnNjYWxlPWksdGhpcy5tZWFucz1udWxsLHRoaXMuc3RkZXZzPW51bGwsdGhpcy5leGNsdWRlZEZlYXR1cmVzPVtdLHIpdGhpcy5fY29tcHV0ZUZyb21Db3ZhcmlhbmNlTWF0cml4KHQpO2Vsc2Ugc3dpdGNoKHRoaXMuX2FkanVzdCh0LHUpLG4pe2Nhc2UiY292YXJpYW5jZU1hdHJpeCI6e2NvbnN0IGU9bmV3IHFlKHQpLm1tdWwodCkuZGl2KHQucm93cy0xKTt0aGlzLl9jb21wdXRlRnJvbUNvdmFyaWFuY2VNYXRyaXgoZSk7YnJlYWt9Y2FzZSJOSVBBTFMiOnRoaXMuX2NvbXB1dGVXaXRoTklQQUxTKHQsbyk7YnJlYWs7Y2FzZSJTVkQiOntjb25zdCBlPW5ldyBVZSh0LHtjb21wdXRlTGVmdFNpbmd1bGFyVmVjdG9yczohMSxjb21wdXRlUmlnaHRTaW5ndWxhclZlY3RvcnM6ITAsYXV0b1RyYW5zcG9zZTohMH0pO3RoaXMuVT1lLnJpZ2h0U2luZ3VsYXJWZWN0b3JzO2NvbnN0IHI9ZS5kaWFnb25hbCxuPVtdO2Zvcihjb25zdCBlIG9mIHIpbi5wdXNoKGUqZS8odC5yb3dzLTEpKTt0aGlzLlM9bjticmVha31kZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5rbm93biBtZXRob2Q6ICR7bn1gKX19c3RhdGljIGxvYWQodCl7aWYoInN0cmluZyIhPXR5cGVvZiB0Lm5hbWUpdGhyb3cgbmV3IFR5cGVFcnJvcigibW9kZWwgbXVzdCBoYXZlIGEgbmFtZSBwcm9wZXJ0eSIpO2lmKCJQQ0EiIT09dC5uYW1lKXRocm93IG5ldyBSYW5nZUVycm9yKGBpbnZhbGlkIG1vZGVsOiAke3QubmFtZX1gKTtyZXR1cm4gbmV3IEtlKCEwLHQpfXByZWRpY3QodCxlPXt9KXtjb25zdHtuQ29tcG9uZW50czpyPXRoaXMuVS5jb2x1bW5zfT1lO2lmKHQ9bmV3IFZlKHQpLHRoaXMuY2VudGVyJiYodC5zdWJSb3dWZWN0b3IodGhpcy5tZWFucyksdGhpcy5zY2FsZSkpe2ZvcihsZXQgZSBvZiB0aGlzLmV4Y2x1ZGVkRmVhdHVyZXMpdC5yZW1vdmVDb2x1bW4oZSk7dC5kaXZSb3dWZWN0b3IodGhpcy5zdGRldnMpfWxldCBuPXQubW11bCh0aGlzLlUpO3JldHVybiBuLnN1Yk1hdHJpeCgwLG4ucm93cy0xLDAsci0xKX1pbnZlcnQodCl7bGV0IGU9KHQ9VmUuY2hlY2tNYXRyaXgodCkpLm1tdWwodGhpcy5VLnRyYW5zcG9zZSgpKTtyZXR1cm4gdGhpcy5jZW50ZXImJih0aGlzLnNjYWxlJiZlLm11bFJvd1ZlY3Rvcih0aGlzLnN0ZGV2cyksZS5hZGRSb3dWZWN0b3IodGhpcy5tZWFucykpLGV9Z2V0RXhwbGFpbmVkVmFyaWFuY2UoKXtsZXQgdD0wO2Zvcihjb25zdCBlIG9mIHRoaXMuUyl0Kz1lO3JldHVybiB0aGlzLlMubWFwKChlPT5lL3QpKX1nZXRDdW11bGF0aXZlVmFyaWFuY2UoKXtsZXQgdD10aGlzLmdldEV4cGxhaW5lZFZhcmlhbmNlKCk7Zm9yKGxldCBlPTE7ZTx0Lmxlbmd0aDtlKyspdFtlXSs9dFtlLTFdO3JldHVybiB0fWdldEVpZ2VudmVjdG9ycygpe3JldHVybiB0aGlzLlV9Z2V0RWlnZW52YWx1ZXMoKXtyZXR1cm4gdGhpcy5TfWdldFN0YW5kYXJkRGV2aWF0aW9ucygpe3JldHVybiB0aGlzLlMubWFwKCh0PT5NYXRoLnNxcnQodCkpKX1nZXRMb2FkaW5ncygpe3JldHVybiB0aGlzLlUudHJhbnNwb3NlKCl9dG9KU09OKCl7cmV0dXJue25hbWU6IlBDQSIsY2VudGVyOnRoaXMuY2VudGVyLHNjYWxlOnRoaXMuc2NhbGUsbWVhbnM6dGhpcy5tZWFucyxzdGRldnM6dGhpcy5zdGRldnMsVTp0aGlzLlUsUzp0aGlzLlMsZXhjbHVkZWRGZWF0dXJlczp0aGlzLmV4Y2x1ZGVkRmVhdHVyZXN9fV9hZGp1c3QodCxlKXtpZih0aGlzLmNlbnRlcil7Y29uc3Qgcj10Lm1lYW4oImNvbHVtbiIpLG49dGhpcy5zY2FsZT90LnN0YW5kYXJkRGV2aWF0aW9uKCJjb2x1bW4iLHttZWFuOnJ9KTpudWxsO2lmKHRoaXMubWVhbnM9cix0LnN1YlJvd1ZlY3RvcihyKSx0aGlzLnNjYWxlKXtmb3IobGV0IHI9MDtyPG4ubGVuZ3RoO3IrKylpZigwPT09bltyXSl7aWYoIWUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYENhbm5vdCBzY2FsZSB0aGUgZGF0YXNldCAoc3RhbmRhcmQgZGV2aWF0aW9uIGlzIHplcm8gYXQgaW5kZXggJHtyfWApO3QucmVtb3ZlQ29sdW1uKHIpLG4uc3BsaWNlKHIsMSksdGhpcy5leGNsdWRlZEZlYXR1cmVzLnB1c2gociksci0tfXRoaXMuc3RkZXZzPW4sdC5kaXZSb3dWZWN0b3Iobil9fX1fY29tcHV0ZUZyb21Db3ZhcmlhbmNlTWF0cml4KHQpe2NvbnN0IGU9bmV3IExlKHQse2Fzc3VtZVN5bW1ldHJpYzohMH0pO3RoaXMuVT1lLmVpZ2VudmVjdG9yTWF0cml4LHRoaXMuVS5mbGlwUm93cygpLHRoaXMuUz1lLnJlYWxFaWdlbnZhbHVlcyx0aGlzLlMucmV2ZXJzZSgpfV9jb21wdXRlV2l0aE5JUEFMUyh0LGUpe3RoaXMuVT1uZXcgVmUoZSx0LmNvbHVtbnMpLHRoaXMuUz1bXTtsZXQgcj10O2ZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPW5ldyBHZShyKTt0aGlzLlUuc2V0Um93KHQsZS53LnRyYW5zcG9zZSgpKSx0aGlzLlMucHVzaChNYXRoLnBvdyhlLnMuZ2V0KDAsMCksMikpLHI9ZS54UmVzaWR1YWx9dGhpcy5VPXRoaXMuVS50cmFuc3Bvc2UoKX19ZnVuY3Rpb24gV2UodCxlPXt9KXtpZighZGUodCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBlZmYuIGFycmF5Iik7bGV0IHI9Q3QoZSwic2NhbGUiKTtmZShyKXx8KHI9ITApO2xldCBuPUN0KGUsIm5Db21wTklQQUxTIik7Y2Uobil8fChuPTIpO2xldCBvPWxlKEN0KHQsMCxbXSkpO2lmKDA9PT1vKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBkaW1lbnNpb24gb2YgZGF0YSIpO2lmKG4+byl0aHJvdyBuZXcgRXJyb3IoIm5Db21wTklQQUxTIGlzIG1vcmUgdGhhbiB0aGUgZGltZW5zaW9uIG9mIGRhdGEiKTtsZXQgcz1uZXcgS2UodCx7bWV0aG9kOiJOSVBBTFMiLHNjYWxlOnIsbkNvbXBOSVBBTFM6bn0pLGk9cy5wcmVkaWN0KHQpO3JldHVybiBzLmludmVydChpKS50b0pTT04oKX12YXIgWGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7KytyPG4mJiExIT09ZSh0W3JdLHIsdCk7KTtyZXR1cm4gdH07dmFyIEplPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLHIsbil7Zm9yKHZhciBvPS0xLHM9T2JqZWN0KGUpLGk9bihlKSx1PWkubGVuZ3RoO3UtLTspe3ZhciBhPWlbdD91Oisrb107aWYoITE9PT1yKHNbYV0sYSxzKSlicmVha31yZXR1cm4gZX19KCk7dmFyIFllPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG49QXJyYXkodCk7KytyPHQ7KW5bcl09ZShyKTtyZXR1cm4gbn07dmFyIFplPWZ1bmN0aW9uKHQpe3JldHVybiBkKHQpJiYiW29iamVjdCBBcmd1bWVudHNdIj09dyh0KX0sSGU9T2JqZWN0LnByb3RvdHlwZSxRZT1IZS5oYXNPd25Qcm9wZXJ0eSx0cj1IZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxlcj1aZShmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP1plOmZ1bmN0aW9uKHQpe3JldHVybiBkKHQpJiZRZS5jYWxsKHQsImNhbGxlZSIpJiYhdHIuY2FsbCh0LCJjYWxsZWUiKX07dmFyIHJyPWZ1bmN0aW9uKCl7cmV0dXJuITF9LG5yPW4oKGZ1bmN0aW9uKHQsZSl7dmFyIHI9ZSYmIWUubm9kZVR5cGUmJmUsbj1yJiZ0JiYhdC5ub2RlVHlwZSYmdCxvPW4mJm4uZXhwb3J0cz09PXI/aS5CdWZmZXI6dm9pZCAwLHM9KG8/by5pc0J1ZmZlcjp2b2lkIDApfHxycjt0LmV4cG9ydHM9c30pKSxvcj0vXig/OjB8WzEtOV1cZCopJC87dmFyIHNyPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuISEoZT1udWxsPT1lPzkwMDcxOTkyNTQ3NDA5OTE6ZSkmJigibnVtYmVyIj09cnx8InN5bWJvbCIhPXImJm9yLnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8ZX0saXI9e307aXJbIltvYmplY3QgRmxvYXQzMkFycmF5XSJdPWlyWyJbb2JqZWN0IEZsb2F0NjRBcnJheV0iXT1pclsiW29iamVjdCBJbnQ4QXJyYXldIl09aXJbIltvYmplY3QgSW50MTZBcnJheV0iXT1pclsiW29iamVjdCBJbnQzMkFycmF5XSJdPWlyWyJbb2JqZWN0IFVpbnQ4QXJyYXldIl09aXJbIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIl09aXJbIltvYmplY3QgVWludDE2QXJyYXldIl09aXJbIltvYmplY3QgVWludDMyQXJyYXldIl09ITAsaXJbIltvYmplY3QgQXJndW1lbnRzXSJdPWlyWyJbb2JqZWN0IEFycmF5XSJdPWlyWyJbb2JqZWN0IEFycmF5QnVmZmVyXSJdPWlyWyJbb2JqZWN0IEJvb2xlYW5dIl09aXJbIltvYmplY3QgRGF0YVZpZXddIl09aXJbIltvYmplY3QgRGF0ZV0iXT1pclsiW29iamVjdCBFcnJvcl0iXT1pclsiW29iamVjdCBGdW5jdGlvbl0iXT1pclsiW29iamVjdCBNYXBdIl09aXJbIltvYmplY3QgTnVtYmVyXSJdPWlyWyJbb2JqZWN0IE9iamVjdF0iXT1pclsiW29iamVjdCBSZWdFeHBdIl09aXJbIltvYmplY3QgU2V0XSJdPWlyWyJbb2JqZWN0IFN0cmluZ10iXT1pclsiW29iamVjdCBXZWFrTWFwXSJdPSExO3ZhciB1cj1mdW5jdGlvbih0KXtyZXR1cm4gZCh0KSYmR3QodC5sZW5ndGgpJiYhIWlyW3codCldfTt2YXIgYXI9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX0saHI9bigoZnVuY3Rpb24odCxlKXt2YXIgcj1lJiYhZS5ub2RlVHlwZSYmZSxuPXImJnQmJiF0Lm5vZGVUeXBlJiZ0LHM9biYmbi5leHBvcnRzPT09ciYmby5wcm9jZXNzLGk9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9biYmbi5yZXF1aXJlJiZuLnJlcXVpcmUoInV0aWwiKS50eXBlcztyZXR1cm4gdHx8cyYmcy5iaW5kaW5nJiZzLmJpbmRpbmcoInV0aWwiKX1jYXRjaCh0KXt9fSgpO3QuZXhwb3J0cz1pfSkpLGxyPWhyJiZoci5pc1R5cGVkQXJyYXksY3I9bHI/YXIobHIpOnVyLGZyPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIG1yPWZ1bmN0aW9uKGUscil7dmFyIG49dChlKSxvPSFuJiZlcihlKSxzPSFuJiYhbyYmbnIoZSksaT0hbiYmIW8mJiFzJiZjcihlKSx1PW58fG98fHN8fGksYT11P1llKGUubGVuZ3RoLFN0cmluZyk6W10saD1hLmxlbmd0aDtmb3IodmFyIGwgaW4gZSkhciYmIWZyLmNhbGwoZSxsKXx8dSYmKCJsZW5ndGgiPT1sfHxzJiYoIm9mZnNldCI9PWx8fCJwYXJlbnQiPT1sKXx8aSYmKCJidWZmZXIiPT1sfHwiYnl0ZUxlbmd0aCI9PWx8fCJieXRlT2Zmc2V0Ij09bCl8fHNyKGwsaCkpfHxhLnB1c2gobCk7cmV0dXJuIGF9O3ZhciBncj1mdW5jdGlvbih0KXtyZXR1cm4gS3QodCk/bXIodCk6T3QodCl9O3ZhciBwcj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihyLG4pe2lmKG51bGw9PXIpcmV0dXJuIHI7aWYoIUt0KHIpKXJldHVybiB0KHIsbik7Zm9yKHZhciBvPXIubGVuZ3RoLHM9ZT9vOi0xLGk9T2JqZWN0KHIpOyhlP3MtLTorK3M8bykmJiExIT09bihpW3NdLHMsaSk7KTtyZXR1cm4gcn19KChmdW5jdGlvbih0LGUpe3JldHVybiB0JiZKZSh0LGUsZ3IpfSkpO3ZhciB3cj1mdW5jdGlvbih0KXtyZXR1cm4gdH07dmFyIGRyPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6d3J9O3ZhciBicj1mdW5jdGlvbihlLHIpe3JldHVybih0KGUpP1hlOnByKShlLGRyKHIpKX07dmFyIHlyPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1uZXcgb3QsdGhpcy5zaXplPTB9O3ZhciB2cj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9ZS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1lLnNpemUscn07dmFyIE1yPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldCh0KX07dmFyIHhyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX07dmFyIEVyPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztpZihyIGluc3RhbmNlb2Ygb3Qpe3ZhciBuPXIuX19kYXRhX187aWYoIXN0fHxuLmxlbmd0aDwxOTkpcmV0dXJuIG4ucHVzaChbdCxlXSksdGhpcy5zaXplPSsrci5zaXplLHRoaXM7cj10aGlzLl9fZGF0YV9fPW5ldyBndChuKX1yZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemU9ci5zaXplLHRoaXN9O2Z1bmN0aW9uIFNyKHQpe3ZhciBlPXRoaXMuX19kYXRhX189bmV3IG90KHQpO3RoaXMuc2l6ZT1lLnNpemV9U3IucHJvdG90eXBlLmNsZWFyPXlyLFNyLnByb3RvdHlwZS5kZWxldGU9dnIsU3IucHJvdG90eXBlLmdldD1NcixTci5wcm90b3R5cGUuaGFzPXhyLFNyLnByb3RvdHlwZS5zZXQ9RXI7dmFyIGpyPVNyO3ZhciBfcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5zZXQodCwiX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyIpLHRoaXN9O3ZhciBBcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9O2Z1bmN0aW9uIENyKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBndDsrK2U8cjspdGhpcy5hZGQodFtlXSl9Q3IucHJvdG90eXBlLmFkZD1Dci5wcm90b3R5cGUucHVzaD1fcixDci5wcm90b3R5cGUuaGFzPUFyO3ZhciBScj1Dcjt2YXIgSXI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7KytyPG47KWlmKGUodFtyXSxyLHQpKXJldHVybiEwO3JldHVybiExfTt2YXIga3I9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5oYXMoZSl9O3ZhciBOcj1mdW5jdGlvbih0LGUscixuLG8scyl7dmFyIGk9MSZyLHU9dC5sZW5ndGgsYT1lLmxlbmd0aDtpZih1IT1hJiYhKGkmJmE+dSkpcmV0dXJuITE7dmFyIGg9cy5nZXQodCksbD1zLmdldChlKTtpZihoJiZsKXJldHVybiBoPT1lJiZsPT10O3ZhciBjPS0xLGY9ITAsbT0yJnI/bmV3IFJyOnZvaWQgMDtmb3Iocy5zZXQodCxlKSxzLnNldChlLHQpOysrYzx1Oyl7dmFyIGc9dFtjXSxwPWVbY107aWYobil2YXIgdz1pP24ocCxnLGMsZSx0LHMpOm4oZyxwLGMsdCxlLHMpO2lmKHZvaWQgMCE9PXcpe2lmKHcpY29udGludWU7Zj0hMTticmVha31pZihtKXtpZighSXIoZSwoZnVuY3Rpb24odCxlKXtpZigha3IobSxlKSYmKGc9PT10fHxvKGcsdCxyLG4scykpKXJldHVybiBtLnB1c2goZSl9KSkpe2Y9ITE7YnJlYWt9fWVsc2UgaWYoZyE9PXAmJiFvKGcscCxyLG4scykpe2Y9ITE7YnJlYWt9fXJldHVybiBzLmRlbGV0ZSh0KSxzLmRlbGV0ZShlKSxmfSxPcj1pLlVpbnQ4QXJyYXk7dmFyIEZyPWZ1bmN0aW9uKHQpe3ZhciBlPS0xLHI9QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LG4pe3JbKytlXT1bbix0XX0pKSxyfTt2YXIgenI9ZnVuY3Rpb24odCl7dmFyIGU9LTEscj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3JbKytlXT10fSkpLHJ9LFRyPXU/dS5wcm90b3R5cGU6dm9pZCAwLFZyPVRyP1RyLnZhbHVlT2Y6dm9pZCAwO3ZhciBQcj1mdW5jdGlvbih0LGUscixuLG8scyxpKXtzd2l0Y2gocil7Y2FzZSJbb2JqZWN0IERhdGFWaWV3XSI6aWYodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fHQuYnl0ZU9mZnNldCE9ZS5ieXRlT2Zmc2V0KXJldHVybiExO3Q9dC5idWZmZXIsZT1lLmJ1ZmZlcjtjYXNlIltvYmplY3QgQXJyYXlCdWZmZXJdIjpyZXR1cm4hKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHwhcyhuZXcgT3IodCksbmV3IE9yKGUpKSk7Y2FzZSJbb2JqZWN0IEJvb2xlYW5dIjpjYXNlIltvYmplY3QgRGF0ZV0iOmNhc2UiW29iamVjdCBOdW1iZXJdIjpyZXR1cm4gWSgrdCwrZSk7Y2FzZSJbb2JqZWN0IEVycm9yXSI6cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIltvYmplY3QgUmVnRXhwXSI6Y2FzZSJbb2JqZWN0IFN0cmluZ10iOnJldHVybiB0PT1lKyIiO2Nhc2UiW29iamVjdCBNYXBdIjp2YXIgdT1GcjtjYXNlIltvYmplY3QgU2V0XSI6dmFyIGE9MSZuO2lmKHV8fCh1PXpyKSx0LnNpemUhPWUuc2l6ZSYmIWEpcmV0dXJuITE7dmFyIGg9aS5nZXQodCk7aWYoaClyZXR1cm4gaD09ZTtufD0yLGkuc2V0KHQsZSk7dmFyIGw9TnIodSh0KSx1KGUpLG4sbyxzLGkpO3JldHVybiBpLmRlbGV0ZSh0KSxsO2Nhc2UiW29iamVjdCBTeW1ib2xdIjppZihWcilyZXR1cm4gVnIuY2FsbCh0KT09VnIuY2FsbChlKX1yZXR1cm4hMX07dmFyIHFyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG49ZS5sZW5ndGgsbz10Lmxlbmd0aDsrK3I8bjspdFtvK3JdPWVbcl07cmV0dXJuIHR9O3ZhciAkcj1mdW5jdGlvbihlLHIsbil7dmFyIG89cihlKTtyZXR1cm4gdChlKT9vOnFyKG8sbihlKSl9O3ZhciBEcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aCxvPTAscz1bXTsrK3I8bjspe3ZhciBpPXRbcl07ZShpLHIsdCkmJihzW28rK109aSl9cmV0dXJuIHN9O3ZhciBVcj1mdW5jdGlvbigpe3JldHVybltdfSxMcj1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLEJyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsR3I9QnI/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9T2JqZWN0KHQpLERyKEJyKHQpLChmdW5jdGlvbihlKXtyZXR1cm4gTHIuY2FsbCh0LGUpfSkpKX06VXI7dmFyIEtyPWZ1bmN0aW9uKHQpe3JldHVybiAkcih0LGdyLEdyKX0sV3I9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgWHI9ZnVuY3Rpb24odCxlLHIsbixvLHMpe3ZhciBpPTEmcix1PUtyKHQpLGE9dS5sZW5ndGg7aWYoYSE9S3IoZSkubGVuZ3RoJiYhaSlyZXR1cm4hMTtmb3IodmFyIGg9YTtoLS07KXt2YXIgbD11W2hdO2lmKCEoaT9sIGluIGU6V3IuY2FsbChlLGwpKSlyZXR1cm4hMX12YXIgYz1zLmdldCh0KSxmPXMuZ2V0KGUpO2lmKGMmJmYpcmV0dXJuIGM9PWUmJmY9PXQ7dmFyIG09ITA7cy5zZXQodCxlKSxzLnNldChlLHQpO2Zvcih2YXIgZz1pOysraDxhOyl7dmFyIHA9dFtsPXVbaF1dLHc9ZVtsXTtpZihuKXZhciBkPWk/bih3LHAsbCxlLHQscyk6bihwLHcsbCx0LGUscyk7aWYoISh2b2lkIDA9PT1kP3A9PT13fHxvKHAsdyxyLG4scyk6ZCkpe209ITE7YnJlYWt9Z3x8KGc9ImNvbnN0cnVjdG9yIj09bCl9aWYobSYmIWcpe3ZhciBiPXQuY29uc3RydWN0b3IseT1lLmNvbnN0cnVjdG9yO2I9PXl8fCEoImNvbnN0cnVjdG9yImluIHQpfHwhKCJjb25zdHJ1Y3RvciJpbiBlKXx8ImZ1bmN0aW9uIj09dHlwZW9mIGImJmIgaW5zdGFuY2VvZiBiJiYiZnVuY3Rpb24iPT10eXBlb2YgeSYmeSBpbnN0YW5jZW9mIHl8fChtPSExKX1yZXR1cm4gcy5kZWxldGUodCkscy5kZWxldGUoZSksbX0sSnI9IltvYmplY3QgT2JqZWN0XSIsWXI9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgWnI9ZnVuY3Rpb24oZSxyLG4sbyxzLGkpe3ZhciB1PXQoZSksYT10KHIpLGg9dT8iW29iamVjdCBBcnJheV0iOkJ0KGUpLGw9YT8iW29iamVjdCBBcnJheV0iOkJ0KHIpLGM9KGg9IltvYmplY3QgQXJndW1lbnRzXSI9PWg/SnI6aCk9PUpyLGY9KGw9IltvYmplY3QgQXJndW1lbnRzXSI9PWw/SnI6bCk9PUpyLG09aD09bDtpZihtJiZucihlKSl7aWYoIW5yKHIpKXJldHVybiExO3U9ITAsYz0hMX1pZihtJiYhYylyZXR1cm4gaXx8KGk9bmV3IGpyKSx1fHxjcihlKT9OcihlLHIsbixvLHMsaSk6UHIoZSxyLGgsbixvLHMsaSk7aWYoISgxJm4pKXt2YXIgZz1jJiZZci5jYWxsKGUsIl9fd3JhcHBlZF9fIikscD1mJiZZci5jYWxsKHIsIl9fd3JhcHBlZF9fIik7aWYoZ3x8cCl7dmFyIHc9Zz9lLnZhbHVlKCk6ZSxkPXA/ci52YWx1ZSgpOnI7cmV0dXJuIGl8fChpPW5ldyBqcikscyh3LGQsbixvLGkpfX1yZXR1cm4hIW0mJihpfHwoaT1uZXcganIpLFhyKGUscixuLG8scyxpKSl9O3ZhciBIcj1mdW5jdGlvbiB0KGUscixuLG8scyl7cmV0dXJuIGU9PT1yfHwobnVsbD09ZXx8bnVsbD09cnx8IWQoZSkmJiFkKHIpP2UhPWUmJnIhPXI6WnIoZSxyLG4sbyx0LHMpKX07dmFyIFFyPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBvPXIubGVuZ3RoLHM9byxpPSFuO2lmKG51bGw9PXQpcmV0dXJuIXM7Zm9yKHQ9T2JqZWN0KHQpO28tLTspe3ZhciB1PXJbb107aWYoaSYmdVsyXT91WzFdIT09dFt1WzBdXTohKHVbMF1pbiB0KSlyZXR1cm4hMX1mb3IoOysrbzxzOyl7dmFyIGE9KHU9cltvXSlbMF0saD10W2FdLGw9dVsxXTtpZihpJiZ1WzJdKXtpZih2b2lkIDA9PT1oJiYhKGEgaW4gdCkpcmV0dXJuITF9ZWxzZXt2YXIgYz1uZXcganI7aWYobil2YXIgZj1uKGgsbCxhLHQsZSxjKTtpZighKHZvaWQgMD09PWY/SHIobCxoLDMsbixjKTpmKSlyZXR1cm4hMX19cmV0dXJuITB9O3ZhciB0bj1mdW5jdGlvbih0KXtyZXR1cm4gdD09dCYmIXgodCl9O3ZhciBlbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9Z3IodCkscj1lLmxlbmd0aDtyLS07KXt2YXIgbj1lW3JdLG89dFtuXTtlW3JdPVtuLG8sdG4obyldfXJldHVybiBlfTt2YXIgcm49ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIG51bGwhPXImJihyW3RdPT09ZSYmKHZvaWQgMCE9PWV8fHQgaW4gT2JqZWN0KHIpKSl9fTt2YXIgbm49ZnVuY3Rpb24odCl7dmFyIGU9ZW4odCk7cmV0dXJuIDE9PWUubGVuZ3RoJiZlWzBdWzJdP3JuKGVbMF1bMF0sZVswXVsxXSk6ZnVuY3Rpb24ocil7cmV0dXJuIHI9PT10fHxRcihyLHQsZSl9fTt2YXIgb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmZSBpbiBPYmplY3QodCl9O3ZhciBzbj1mdW5jdGlvbihlLHIsbil7Zm9yKHZhciBvPS0xLHM9KHI9anQocixlKSkubGVuZ3RoLGk9ITE7KytvPHM7KXt2YXIgdT1fdChyW29dKTtpZighKGk9bnVsbCE9ZSYmbihlLHUpKSlicmVhaztlPWVbdV19cmV0dXJuIGl8fCsrbyE9cz9pOiEhKHM9bnVsbD09ZT8wOmUubGVuZ3RoKSYmR3QocykmJnNyKHUscykmJih0KGUpfHxlcihlKSl9O3ZhciB1bj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZzbih0LGUsb24pfTt2YXIgYW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gTSh0KSYmdG4oZSk/cm4oX3QodCksZSk6ZnVuY3Rpb24ocil7dmFyIG49Q3Qocix0KTtyZXR1cm4gdm9pZCAwPT09biYmbj09PWU/dW4ocix0KTpIcihlLG4sMyl9fTt2YXIgaG49ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBBdChlLHQpfX07dmFyIGxuPWZ1bmN0aW9uKHQpe3JldHVybiBNKHQpP1h0KF90KHQpKTpobih0KX07dmFyIGNuPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bnVsbD09ZT93cjoib2JqZWN0Ij09dHlwZW9mIGU/dChlKT9hbihlWzBdLGVbMV0pOm5uKGUpOmxuKGUpfTt2YXIgZm49ZnVuY3Rpb24odCxlKXt2YXIgcj0tMSxuPUt0KHQpP0FycmF5KHQubGVuZ3RoKTpbXTtyZXR1cm4gcHIodCwoZnVuY3Rpb24odCxvLHMpe25bKytyXT1lKHQsbyxzKX0pKSxufTt2YXIgbW49ZnVuY3Rpb24oZSxyKXtyZXR1cm4odChlKT92dDpmbikoZSxjbihyKSl9O3ZhciBnbj1mdW5jdGlvbih0LGUpe3JldHVybiB2dChlLChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKX07dmFyIHBuPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1tdOmduKHQsZ3IodCkpfTtmdW5jdGlvbiB3bih0KXtyZXR1cm4hKCFwZSh0KXx8IiI9PT10KX1mdW5jdGlvbiBkbih0KXtsZXQgZT0hMTtyZXR1cm4gd24odCk/ZT0haXNOYU4oTnVtYmVyKHQpKTpmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdW1iZXJdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCkmJihlPSEwKSxlfWZ1bmN0aW9uIGJuKHQsZSl7aWYoIWdlKHQpKXJldHVybnt9O2lmKCFkZShlKSlyZXR1cm57fTtsZXQgcj17fTtyZXR1cm4gYnIoZSwoZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKHQsZSl7cmV0dXJuISFnZSh0KSYmISghd24oZSkmJiFkbihlKSkmJmUgaW4gdH0pKHQsZSkmJihyW2VdPUN0KHQsZSkpfSkpLHJ9dmFyIHluPS9ccy87dmFyIHZuPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS0mJnluLnRlc3QodC5jaGFyQXQoZSkpOyk7cmV0dXJuIGV9LE1uPS9eXHMrLzt2YXIgeG49ZnVuY3Rpb24odCl7cmV0dXJuIHQ/dC5zbGljZSgwLHZuKHQpKzEpLnJlcGxhY2UoTW4sIiIpOnR9LEVuPS9eWy0rXTB4WzAtOWEtZl0rJC9pLFNuPS9eMGJbMDFdKyQvaSxqbj0vXjBvWzAtN10rJC9pLF9uPXBhcnNlSW50O3ZhciBBbj1mdW5jdGlvbih0KXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYoYih0KSlyZXR1cm4gTmFOO2lmKHgodCkpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PXgoZSk/ZSsiIjplfWlmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gMD09PXQ/dDordDt0PXhuKHQpO3ZhciByPVNuLnRlc3QodCk7cmV0dXJuIHJ8fGpuLnRlc3QodCk/X24odC5zbGljZSgyKSxyPzI6OCk6RW4udGVzdCh0KT9OYU46K3R9O3ZhciBDbj1mdW5jdGlvbih0KXtyZXR1cm4gdD9JbmZpbml0eT09PSh0PUFuKHQpKXx8LUluZmluaXR5PT09dD8xNzk3NjkzMTM0ODYyMzE1N2UyOTIqKHQ8MD8tMToxKTp0PT10P3Q6MDowPT09dD90OjB9O3ZhciBSbj1mdW5jdGlvbih0KXt2YXIgZT1Dbih0KSxyPWUlMTtyZXR1cm4gZT09ZT9yP2UtcjplOjB9LEluPWkuaXNGaW5pdGUsa249TWF0aC5taW47dmFyIE5uPWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGhbdF07cmV0dXJuIGZ1bmN0aW9uKHQscil7aWYodD1Bbih0KSwocj1udWxsPT1yPzA6a24oUm4ociksMjkyKSkmJkluKHQpKXt2YXIgbj0oU3QodCkrImUiKS5zcGxpdCgiZSIpLG89ZShuWzBdKyJlIisoK25bMV0rcikpO3JldHVybisoKG49KFN0KG8pKyJlIikuc3BsaXQoImUiKSlbMF0rImUiKygrblsxXS1yKSl9cmV0dXJuIGUodCl9fSgicm91bmQiKTtmdW5jdGlvbiBPbih0KXtpZighZG4odCkpcmV0dXJuIDA7dD1mdW5jdGlvbih0KXtyZXR1cm4gZG4odCk/Q24odCk6MH0odCk7bGV0IGU9Tm4odCk7cmV0dXJuIjAiPT09U3RyaW5nKGUpPzA6ZX12YXIgRm49QXJyYXkucHJvdG90eXBlLmpvaW47dmFyIHpuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/IiI6Rm4uY2FsbCh0LGUpfTtjbGFzcyBUbntjb25zdHJ1Y3Rvcih0KXt0aGlzLmdldENvc3Q9KCk9PnRoaXMuRWxlbWVudHMubWFwKCh0PT50LkRpc3RhbmNlRnJvbU1lZG9pZCkpLnJlZHVjZSgoKHQsZSk9PnQrZSksMCksdGhpcy5maW5kQmVzdE1lZG9pZElkeD10PT50aGlzLkVsZW1lbnRzLm1hcCgoZT0+dGhpcy5jYWxjQ29zdEZvckdpdmVuRWxlbWVudEFzTWVkb2lkKGUsdCkpKS5yZWR1Y2UoKCh0LGUscixuKT0+ZS5Db3N0SWZNYWRlTWVkb2lkPG5bdF0uQ29zdElmTWFkZU1lZG9pZD9yOnQpLDApLHRoaXMuY2FsY0Nvc3RGb3JHaXZlbkVsZW1lbnRBc01lZG9pZD0odCxlKT0+KHtDb3N0SWZNYWRlTWVkb2lkOm5ldyBUbih7RWxlbWVudHM6dGhpcy5FbGVtZW50cy5tYXAoKHI9Pih7RGlzdGFuY2VGcm9tTWVkb2lkOmUoci5FbGVtZW50LHQuRWxlbWVudCksRWxlbWVudDpyLkVsZW1lbnR9KSkpLE1lZG9pZDp0LkVsZW1lbnR9KS5nZXRDb3N0KCksRWxlbWVudDp0fSksdGhpcy5FbGVtZW50cz10LkVsZW1lbnRzLHRoaXMuTWVkb2lkPXQuTWVkb2lkfX12YXIgVm49VG4sUG49T2JqZWN0LmRlZmluZVByb3BlcnR5KHtDbHVzdGVyOlZufSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSkscW49T2JqZWN0LmRlZmluZVByb3BlcnR5KHtkaXN0YW5jZToodCxlKT0+e2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgaW5wdXRzIG11c3QgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb24iKTtjb25zdCByPUFycmF5LmZyb20odC5rZXlzKCkpLm1hcCgocj0+TWF0aC5wb3coTWF0aC5hYnModFtyXS1lW3JdKSwyKSkpLnJlZHVjZSgoKHQsZSk9PnQrZSksMCk7cmV0dXJuIE1hdGguc3FydChyKX19LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSwkbj1PYmplY3QuZGVmaW5lUHJvcGVydHkoe2tHdEVsZW1lbnRBcnJMZW5ndGg6ImsgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkifSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y2xhc3MgRG57Y29uc3RydWN0b3IodCxlLHIpe3RoaXMuRWxlbWVudHM9dCx0aGlzLks9ZSx0aGlzLkRpc3RhbmNlRm49cix0aGlzLk9wdGltaXNhdGlvbkNvbXBsZXRlZD0hMSx0aGlzLml0ZXJhdGU9KCk9Pnt0aGlzLkl0ZXJhdGlvbkNvdW50KyssdGhpcy5DbHVzdGVyc3x8dGhpcy5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcygpO2NvbnN0IHQ9dGhpcy5NZWRvaWRzLGU9dGhpcy5DbHVzdGVycyxyPXRoaXMuY2FsY3VsYXRlQ3VycmVudENvc3QoKTtsZXQgbj1yO2ZvcihsZXQgdD0wO3Q8dGhpcy5NZWRvaWRzLmxlbmd0aDt0Kyspe2NvbnN0IGU9dD0+MD09PXRoaXMuTWVkb2lkcy5maWx0ZXIoKGU9PjA9PT10aGlzLkRpc3RhbmNlRm4odCxlKSkpLmxlbmd0aDtmb3IoY29uc3QgciBvZiB0aGlzLkVsZW1lbnRzLmZpbHRlcihlKSl7Y29uc3QgZT10aGlzLk1lZG9pZHMuc2xpY2UoKTtlW3RdPXI7Y29uc3Qgbz1uZXcgRG4odGhpcy5FbGVtZW50cy5zbGljZSgpLHRoaXMuSyx0aGlzLkRpc3RhbmNlRm4pO28uTWVkb2lkcz1lLG8uYWxsb2NhdGVUb0NsdXN0ZXJzQXJvdW5kQ3VycmVudE1lZG9pZHMoKTtjb25zdCBzPW8uY2FsY3VsYXRlQ3VycmVudENvc3QoKTtzPG4mJihuPXMsdGhpcy5DbHVzdGVycz1vLkNsdXN0ZXJzLHRoaXMuTWVkb2lkcz1lKX19cmV0dXJuIHRoaXMuY2FsY3VsYXRlQ3VycmVudENvc3QoKTxyfHwodGhpcy5DbHVzdGVycz1lLHRoaXMuTWVkb2lkcz10LHRoaXMuT3B0aW1pc2F0aW9uQ29tcGxldGVkPSEwLCExKX0sdGhpcy5nZXRDbHVzdGVyZWREYXRhPSgpPT4odGhpcy5PcHRpbWlzYXRpb25Db21wbGV0ZWR8fHRoaXMucnVuVG9Db21wbGV0aW9uKCksdGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuRWxlbWVudHMubWFwKCh0PT50LkVsZW1lbnQpKSkpKSx0aGlzLnJ1blRvQ29tcGxldGlvbj0oKT0+e2Zvcig7dGhpcy5pdGVyYXRlKCk7KTt9LHRoaXMuYWxsb2NhdGVUb0NsdXN0ZXJzQXJvdW5kQ3VycmVudE1lZG9pZHM9KCk9Pnt0aGlzLkNsdXN0ZXJzPW5ldyBBcnJheSx0aGlzLk1lZG9pZHMuZm9yRWFjaCgodD0+e3RoaXMuQ2x1c3RlcnMucHVzaChuZXcgUG4uQ2x1c3Rlcih7RWxlbWVudHM6W10sTWVkb2lkOnR9KSl9KSksdGhpcy5FbGVtZW50cy5mb3JFYWNoKCgodCxlKT0+e2NvbnN0IHI9dGhpcy5maW5kRGlzdGFuY2VzKHRoaXMuQ2x1c3RlcnMubWFwKCh0PT50Lk1lZG9pZCkpLHQpLG49ci5yZWR1Y2UoKCh0LGUscixuKT0+ZTxuW3RdP3I6dCksMCk7dGhpcy5DbHVzdGVyc1tuXS5FbGVtZW50cy5wdXNoKHtEaXN0YW5jZUZyb21NZWRvaWQ6cltuXSxFbGVtZW50OnR9KX0pKX0sdGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdD0oKT0+dGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuZ2V0Q29zdCgpKSkucmVkdWNlKCgodCxlKT0+dCtlKSwwKSx0aGlzLmZpbmREaXN0YW5jZXM9KHQsZSk9PnQubWFwKCh0PT50aGlzLkRpc3RhbmNlRm4odCxlKSkpLHRoaXMuc2VsZWN0SW5pdGlhbE1lZG9pZHM9KCk9PntpZih0aGlzLks+PXRoaXMuRWxlbWVudHMubGVuZ3RoKXRocm93ICRuLmtHdEVsZW1lbnRBcnJMZW5ndGg7Y29uc3QgdD1bXSxlPSh0LGUpPT57Zm9yKGNvbnN0IHIgb2YgZSlpZigwPT09dGhpcy5EaXN0YW5jZUZuKHIsdCkpcmV0dXJuITE7cmV0dXJuITB9O2xldCByPTA7Zm9yKDtyPHRoaXMuRWxlbWVudHMubGVuZ3RoJiZ0Lmxlbmd0aDx0aGlzLks7KWUodGhpcy5FbGVtZW50c1tyXSx0KSYmdC5wdXNoKHRoaXMuRWxlbWVudHNbcl0pLHIrKztyZXR1cm4gdH0sdGhpcy5EaXN0YW5jZUZuPXRoaXMuRGlzdGFuY2VGbnx8cW4uZGlzdGFuY2UsdGhpcy5NZWRvaWRzPXRoaXMuc2VsZWN0SW5pdGlhbE1lZG9pZHMoKSx0aGlzLkl0ZXJhdGlvbkNvdW50PTB9Z2V0IE9wdGltaXNhdGlvblN0YXJ0ZWQoKXtyZXR1cm4gdGhpcy5JdGVyYXRpb25Db3VudD4wfX1Ebi5jbHVzdGVyRWxlbWVudHM9KHQsZSxyKT0+e0RuLmdldEluc3RhbmNlKHQsZSxyKTtyZXR1cm4gbmV3IEFycmF5fSxEbi5nZXRJbnN0YW5jZT0odCxlLHIpPT5uZXcgRG4odCxlLHIpO3ZhciBVbj1EbixMbj1PYmplY3QuZGVmaW5lUHJvcGVydHkoe0NsdXN0ZXJlcjpVbn0sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLEJuPXIobigoZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKHQpe2Zvcih2YXIgciBpbiB0KWUuaGFzT3duUHJvcGVydHkocil8fChlW3JdPXRbcl0pfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxyKFBuKSxyKExuKX0pKSk7ZnVuY3Rpb24gR24odCxlKXtsZXQgcj0wO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXIrPSh0W25dLWVbbl0pKih0W25dLWVbbl0pO3JldHVybiByfWNvbnN0IEtuPXtkaXN0YW5jZUZ1bmN0aW9uOkdufTtmdW5jdGlvbiBXbih0LGUscj1Lbil7Y29uc3Qgbj1yLmRpc3RhbmNlRnVuY3Rpb258fEtuLmRpc3RhbmNlRnVuY3Rpb24sbz1yLnNpbWlsYXJpdHlGdW5jdGlvbnx8S24uc2ltaWxhcml0eUZ1bmN0aW9uO2xldCBzPS0xO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBvKXtsZXQgcj1OdW1iZXIuTUlOX1ZBTFVFO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCBpPW8oZSx0W25dKTtpPnImJihyPWkscz1uKX19ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoIkEgc2ltaWxhcml0eSBvciBkaXN0YW5jZSBmdW5jdGlvbiBpdCdzIHJlcXVpcmVkIik7e2xldCByPU51bWJlci5NQVhfVkFMVUU7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGk9bihlLHRbb10pO2k8ciYmKHI9aSxzPW8pfX19cmV0dXJuIHN9ZnVuY3Rpb24gWG4odCxlLHIsbil7Zm9yKHZhciBvPTA7bzx0Lmxlbmd0aDtvKyspcltvXT1XbihlLHRbb10se2Rpc3RhbmNlRnVuY3Rpb246bn0pO3JldHVybiByfWZ1bmN0aW9uIEpuKHQsZSl7Y29uc3Qgcj02NTUzNSYodD4+Pj0wKTtyZXR1cm4oKHQtcikqKGU+Pj49MCk+Pj4wKStyKmU+Pj4wfWNsYXNzIFlue2NvbnN0cnVjdG9yKHQ9RGF0ZS5ub3coKSl7dGhpcy5zdGF0ZT1uZXcgVWludDMyQXJyYXkoNCksdGhpcy5pbml0KHQpLHRoaXMucmFuZG9tPXRoaXMuZ2V0RmxvYXQuYmluZCh0aGlzKX1nZXRVaW50MzIoKXtyZXR1cm4gdGhpcy5uZXh0U3RhdGUoKSx0aGlzLnN0YXRlWzNdK3RoaXMuc3RhdGVbMl0+Pj4wfWdldEZsb2F0KCl7cmV0dXJuIDUuOTYwNDY0NDc3NTM5MDYzZS04Kih0aGlzLmdldFVpbnQzMigpPj4+OCl9aW5pdCh0KXtpZighTnVtYmVyLmlzSW50ZWdlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzZWVkIG11c3QgYmUgYW4gaW50ZWdlciIpO3RoaXMuc3RhdGVbMF09dCx0aGlzLnN0YXRlWzFdPTAsdGhpcy5zdGF0ZVsyXT0wLHRoaXMuc3RhdGVbM109MDtmb3IobGV0IHQ9MTt0PDg7dCsrKXRoaXMuc3RhdGVbMyZ0XV49dCtKbigxODEyNDMzMjUzLHRoaXMuc3RhdGVbdC0xJjNdXnRoaXMuc3RhdGVbdC0xJjNdPj4+MzA+Pj4wKT4+PjA7dGhpcy5wZXJpb2RDZXJ0aWZpY2F0aW9uKCk7Zm9yKGxldCB0PTA7dDw4O3QrKyl0aGlzLm5leHRTdGF0ZSgpfXBlcmlvZENlcnRpZmljYXRpb24oKXswPT09dGhpcy5zdGF0ZVswXSYmMD09PXRoaXMuc3RhdGVbMV0mJjA9PT10aGlzLnN0YXRlWzJdJiYwPT09dGhpcy5zdGF0ZVszXSYmKHRoaXMuc3RhdGVbMF09ODgsdGhpcy5zdGF0ZVsxXT04Myx0aGlzLnN0YXRlWzJdPTY1LHRoaXMuc3RhdGVbM109NjgpfW5leHRTdGF0ZSgpe2xldCB0PXRoaXMuc3RhdGVbMF07dF49dDw8MTUsdF49dD4+PjE4LHRePXRoaXMuc3RhdGVbM108PDExLHRoaXMuc3RhdGVbMF09dGhpcy5zdGF0ZVsxXSx0aGlzLnN0YXRlWzFdPXRoaXMuc3RhdGVbMl0sdGhpcy5zdGF0ZVsyXT10aGlzLnN0YXRlWzNdLHRoaXMuc3RhdGVbM109dH19ZnVuY3Rpb24gWm4odCxlPXt9LHI9TWF0aC5yYW5kb20pe2NvbnN0e3NpemU6bj0xLHJlcGxhY2U6bz0hMSxwcm9iYWJpbGl0aWVzOnN9PWU7bGV0IGksdTtpZihpPSJudW1iZXIiPT10eXBlb2YgdD9mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHIpO3JldHVybiBlfSh0KTp0LnNsaWNlKCkscyl7aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJjaG9pY2Ugd2l0aCBwcm9iYWJpbGl0aWVzIGFuZCBubyByZXBsYWNlbWVudCBpcyBub3QgaW1wbGVtZW50ZWQiKTtpZihzLmxlbmd0aCE9PWkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGhlIGxlbmd0aCBvZiBwcm9iYWJpbGl0aWVzIG9wdGlvbiBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBjaG9pY2VzIik7dT1bc1swXV07Zm9yKGxldCB0PTE7dDxzLmxlbmd0aDt0KyspdVt0XT11W3QtMV0rc1t0XTtpZihNYXRoLmFicygxLXVbdS5sZW5ndGgtMV0pPjFlLTgpdGhyb3cgbmV3IEVycm9yKGBwcm9iYWJpbGl0aWVzIHNob3VsZCBzdW0gdG8gMSwgYnV0IGluc3RlYWQgc3VtcyB0byAke3VbdS5sZW5ndGgtMV19YCl9aWYoITE9PT1vJiZuPmkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigic2l6ZSBvcHRpb24gaXMgdG9vIGxhcmdlIik7Y29uc3QgYT1bXTtmb3IobGV0IHQ9MDt0PG47dCsrKXtjb25zdCB0PUhuKGkubGVuZ3RoLHIsdSk7YS5wdXNoKGlbdF0pLG98fGkuc3BsaWNlKHQsMSl9cmV0dXJuIGF9ZnVuY3Rpb24gSG4odCxlLHIpe2NvbnN0IG49ZSgpO2lmKHIpe2xldCB0PTA7Zm9yKDtuPnJbdF07KXQrKztyZXR1cm4gdH1yZXR1cm4gTWF0aC5mbG9vcihuKnQpfWNsYXNzIFFue2NvbnN0cnVjdG9yKHQ9TWF0aC5yYW5kb20pe2lmKCJudW1iZXIiPT10eXBlb2YgdCl7Y29uc3QgZT1uZXcgWW4odCk7dGhpcy5yYW5kb21HZW5lcmF0b3I9ZS5yYW5kb219ZWxzZSB0aGlzLnJhbmRvbUdlbmVyYXRvcj10fWNob2ljZSh0LGUpe3JldHVybiBabih0LGUsdGhpcy5yYW5kb21HZW5lcmF0b3IpfXJhbmRvbSgpe3JldHVybiB0aGlzLnJhbmRvbUdlbmVyYXRvcigpfXJhbmRJbnQodCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dCx0PTApLHQrTWF0aC5mbG9vcih0aGlzLnJhbmRvbUdlbmVyYXRvcigpKihlLXQpKX1yYW5kb21TYW1wbGUodCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaCh0aGlzLnJhbmRvbSgpKTtyZXR1cm4gZX19ZnVuY3Rpb24gdG8odCxlKXtjb25zdCByPW5ldyBWZSh0LnJvd3MsZS5yb3dzKTtmb3IobGV0IG49MDtuPHQucm93cztuKyspZm9yKGxldCBvPTA7bzxlLnJvd3M7bysrKXIuc2V0KG4sbyxHbih0LmdldFJvdyhuKSxlLmdldFJvdyhvKSkpO3JldHVybiByfWZ1bmN0aW9uIGVvKHQpe2xldCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHIpO3JldHVybiBlfWZ1bmN0aW9uIHJvKHQpe2xldCBlPVt0WzBdXTtmb3IobGV0IHI9MTtyPHQubGVuZ3RoO3IrKyllW3JdPWVbci0xXSt0W3JdO3JldHVybiBlfWNvbnN0IG5vPVN5bWJvbCgiZGlzdGFuY2UiKTtjbGFzcyBvb3tjb25zdHJ1Y3Rvcih0LGUscixuLG8pe3RoaXMuY2x1c3RlcnM9dCx0aGlzLmNlbnRyb2lkcz1lLHRoaXMuY29udmVyZ2VkPXIsdGhpcy5pdGVyYXRpb25zPW4sdGhpc1tub109b31uZWFyZXN0KHQpe2NvbnN0IGU9bmV3IEFycmF5KHQubGVuZ3RoKTtyZXR1cm4gWG4odCx0aGlzLmNlbnRyb2lkcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNlbnRyb2lkfSkpLGUsdGhpc1tub10pfWNvbXB1dGVJbmZvcm1hdGlvbih0KXtmb3IodmFyIGU9dGhpcy5jZW50cm9pZHMubWFwKChmdW5jdGlvbih0KXtyZXR1cm57Y2VudHJvaWQ6dCxlcnJvcjowLHNpemU6MH19KSkscj0wO3I8dC5sZW5ndGg7cisrKWVbdGhpcy5jbHVzdGVyc1tyXV0uZXJyb3IrPXRoaXNbbm9dKHRbcl0sdGhpcy5jZW50cm9pZHNbdGhpcy5jbHVzdGVyc1tyXV0pLGVbdGhpcy5jbHVzdGVyc1tyXV0uc2l6ZSsrO2Zvcih2YXIgbj0wO248dGhpcy5jZW50cm9pZHMubGVuZ3RoO24rKyllW25dLnNpemU/ZVtuXS5lcnJvci89ZVtuXS5zaXplOmVbbl0uZXJyb3I9bnVsbDtyZXR1cm4gbmV3IG9vKHRoaXMuY2x1c3RlcnMsZSx0aGlzLmNvbnZlcmdlZCx0aGlzLml0ZXJhdGlvbnMsdGhpc1tub10pfX1jb25zdCBzbz17bWF4SXRlcmF0aW9uczoxMDAsdG9sZXJhbmNlOjFlLTYsd2l0aEl0ZXJhdGlvbnM6ITEsaW5pdGlhbGl6YXRpb246ImttZWFucysrIixkaXN0YW5jZUZ1bmN0aW9uOkdufTtmdW5jdGlvbiBpbyh0LGUscixuLG8scyl7dmFyIGk9ZnVuY3Rpb24odCxlLHIsbil7Y29uc3Qgbz1lWzBdLmxlbmd0aDtmb3IodmFyIHM9bmV3IEFycmF5KG4pLGk9bmV3IEFycmF5KG4pLHU9MDt1PG47dSsrKXtzW3VdPW5ldyBBcnJheShvKSxpW3VdPTA7Zm9yKHZhciBhPTA7YTxvO2ErKylzW3VdW2FdPTB9Zm9yKHZhciBoPTA7aDxlLmxlbmd0aDtoKyspe2lbcltoXV0rKztmb3IodmFyIGw9MDtsPG87bCsrKXNbcltoXV1bbF0rPWVbaF1bbF19Zm9yKHZhciBjPTA7YzxuO2MrKylmb3IodmFyIGY9MDtmPG87ZisrKWlbY10/c1tjXVtmXS89aVtjXTpzW2NdW2ZdPXRbY11bZl07cmV0dXJuIHN9KHQsZSxyPVhuKGUsdCxyLG8uZGlzdGFuY2VGdW5jdGlvbiksbiksdT1mdW5jdGlvbih0LGUscixuKXtmb3IodmFyIG89MDtvPHQubGVuZ3RoO28rKylpZihyKHRbb10sZVtvXSk+bilyZXR1cm4hMTtyZXR1cm4hMH0oaSx0LG8uZGlzdGFuY2VGdW5jdGlvbixvLnRvbGVyYW5jZSk7cmV0dXJuIG5ldyBvbyhyLGksdSxzLG8uZGlzdGFuY2VGdW5jdGlvbil9ZnVuY3Rpb24gdW8odCxlLHIpe2lmKHI9T2JqZWN0LmFzc2lnbih7fSxzbyxyKSxlPD0wfHxlPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihlKSl0aHJvdyBuZXcgRXJyb3IoIksgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBwb2ludHMiKTt2YXIgbjtpZihBcnJheS5pc0FycmF5KHIuaW5pdGlhbGl6YXRpb24pKXtpZihyLmluaXRpYWxpemF0aW9uLmxlbmd0aCE9PWUpdGhyb3cgbmV3IEVycm9yKCJUaGUgaW5pdGlhbCBjZW50ZXJzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyBLIik7bj1yLmluaXRpYWxpemF0aW9ufWVsc2Ugc3dpdGNoKHIuaW5pdGlhbGl6YXRpb24pe2Nhc2Uia21lYW5zKysiOm49ZnVuY3Rpb24odCxlLHI9e30pe2NvbnN0IG49KHQ9bmV3IFZlKHQpKS5yb3dzLG89bmV3IFFuKHIuc2VlZCkscz1bXSxpPXIubG9jYWxUcmlhbHN8fDIrTWF0aC5mbG9vcihNYXRoLmxvZyhlKSksdT1vLnJhbmRJbnQobik7cy5wdXNoKHQuZ2V0Um93KHUpKTtsZXQgYT1uZXcgVmUoMSx0LnJvd3MpO2ZvcihsZXQgZT0wO2U8dC5yb3dzO2UrKylhLnNldCgwLGUsR24odC5nZXRSb3coZSksc1swXSkpO2xldCBoPVtybyhhLmdldFJvdygwKSldO2NvbnN0IGw9MS9oWzBdW24tMV07bGV0IGM9VmUubXVsKGEsbCk7Zm9yKGxldCByPTE7cjxlO3IrKyl7Y29uc3QgZT1vLmNob2ljZShuLHtyZXBsYWNlOiEwLHNpemU6aSxwcm9iYWJpbGl0aWVzOmNbMF19KSx1PXRvKHQuc2VsZWN0aW9uKGUsZW8odC5jb2x1bW5zKSksdCk7bGV0IGwsZixtO2ZvcihsZXQgdD0wO3Q8aTt0Kyspe2NvbnN0IHI9VmUubWluKGEsW3UuZ2V0Um93KHQpXSksbj1yLnN1bSgpOyh2b2lkIDA9PT1sfHxuPGYpJiYobD1lW3RdLGY9bixtPXIpfXNbcl09dC5nZXRSb3cobCksYT1tLGg9W3JvKGEuZ2V0Um93KDApKV0sYz1WZS5tdWwoYSwxL2hbMF1bbi0xXSl9cmV0dXJuIHN9KHQsZSxyKTticmVhaztjYXNlInJhbmRvbSI6bj1mdW5jdGlvbih0LGUscil7cmV0dXJuIG5ldyBRbihyKS5jaG9pY2UodCx7c2l6ZTplfSl9KHQsZSxyLnNlZWQpO2JyZWFrO2Nhc2UibW9zdERpc3RhbnQiOm49ZnVuY3Rpb24odCxlLHIsbil7Y29uc3Qgbz1uZXcgUW4obik7dmFyIHM9bmV3IEFycmF5KGUpO2lmKHNbMF09TWF0aC5mbG9vcihvLnJhbmRvbSgpKnQubGVuZ3RoKSxlPjEpe2Zvcih2YXIgaT17ZGlzdDotMSxpbmRleDotMX0sdT0wO3U8dC5sZW5ndGg7Kyt1KXJbc1swXV1bdV0+aS5kaXN0JiYoaS5kaXN0PXJbc1swXV1bdV0saS5pbmRleD11KTtpZihzWzFdPWkuaW5kZXgsZT4yKWZvcih2YXIgYT0yO2E8ZTsrK2Epe2Zvcih2YXIgaD17ZGlzdDotMSxpbmRleDotMX0sbD0wO2w8dC5sZW5ndGg7KytsKXtmb3IodmFyIGM9e2Rpc3Q6TnVtYmVyLk1BWF9WQUxVRSxpbmRleDotMX0sZj0wO2Y8YTsrK2YpcltmXVtsXTxjLmRpc3QmJi0xPT09cy5pbmRleE9mKGwpJiYoYz17ZGlzdDpyW2ZdW2xdLGluZGV4Omx9KTtjLmRpc3QhPT1OdW1iZXIuTUFYX1ZBTFVFJiZjLmRpc3Q+aC5kaXN0JiYoaD1PYmplY3QuYXNzaWduKHt9LGMpKX1zW2FdPWguaW5kZXh9fXJldHVybiBzLm1hcCgoZT0+dFtlXSkpfSh0LGUsZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KHQubGVuZ3RoKSxuPTA7bjx0Lmxlbmd0aDsrK24pZm9yKHZhciBvPW47bzx0Lmxlbmd0aDsrK28pe3Jbbl18fChyW25dPW5ldyBBcnJheSh0Lmxlbmd0aCkpLHJbb118fChyW29dPW5ldyBBcnJheSh0Lmxlbmd0aCkpO2NvbnN0IHM9ZSh0W25dLHRbb10pO3Jbbl1bb109cyxyW29dW25dPXN9cmV0dXJuIHJ9KHQsci5kaXN0YW5jZUZ1bmN0aW9uKSxyLnNlZWQpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGluaXRpYWxpemF0aW9uIG1ldGhvZDogIiR7ci5pbml0aWFsaXphdGlvbn0iYCl9MD09PXIubWF4SXRlcmF0aW9ucyYmKHIubWF4SXRlcmF0aW9ucz1OdW1iZXIuTUFYX1ZBTFVFKTt2YXIgbz1uZXcgQXJyYXkodC5sZW5ndGgpO2lmKHIud2l0aEl0ZXJhdGlvbnMpcmV0dXJuIGZ1bmN0aW9uKih0LGUscixuLG8pe2Zvcih2YXIgcyxpPSExLHU9MDshaSYmdTxvLm1heEl0ZXJhdGlvbnM7KXM9aW8odCxlLHIsbixvLCsrdSkseWllbGQgcy5jb21wdXRlSW5mb3JtYXRpb24oZSksaT1zLmNvbnZlcmdlZCx0PXMuY2VudHJvaWRzfShuLHQsbyxlLHIpO2Zvcih2YXIgcyxpPSExLHU9MDshaSYmdTxyLm1heEl0ZXJhdGlvbnM7KWk9KHM9aW8obix0LG8sZSxyLCsrdSkpLmNvbnZlcmdlZCxuPXMuY2VudHJvaWRzO3JldHVybiBzLmNvbXB1dGVJbmZvcm1hdGlvbih0KX1mdW5jdGlvbiBhbyh0LGU9e30pe2xldCByPUN0KGUsImtOdW1iZXIiKTtyPWRuKHIpP09uKHIpOjI7bGV0IG4sbz1DdChlLCJtb2RlIik7aWYoImstbWVkb2lkcyIhPT1vJiYiay1tZWFucyIhPT1vJiYobz0iay1tZWRvaWRzIiksImstbWVkb2lkcyI9PT1vKW49ZnVuY3Rpb24odCxlKXtsZXQgcj17fTtmdW5jdGlvbiBuKHQpe3JldHVybiB6bih0LCI6Iil9YnIodCwoKHQsZSk9PntsZXQgbz1uKHQpO3Jbb109ZX0pKTtsZXQgbz1Cbi5DbHVzdGVyZXIuZ2V0SW5zdGFuY2UodCxlKS5nZXRDbHVzdGVyZWREYXRhKCk7cmV0dXJuIG89bW4obywodD0+bW4odCwodD0+e2xldCBlPW4odCk7cmV0dXJuIHJbZV19KSkpKSxvfSh0LHIpO2Vsc2V7aWYoImstbWVhbnMiIT09byl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgbW9kZSIpO249ZnVuY3Rpb24odCxlKXtsZXQgcj11byh0LGUpLG49e307cmV0dXJuIGJyKHIuY2x1c3RlcnMsKCh0LGUpPT57blt0XXx8KG5bdF09W10pLG5bdF0ucHVzaChlKX0pKSxwbihuKX0odCxyKX1yZXR1cm4gbn1mdW5jdGlvbiBobyh0LGU9e30pe2lmKCFkZSh0KSl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IGVmZi4gYXJyYXkiKTtsZXQgcj1DdChlLCJrTnVtYmVyIik7cj1kbihyKT9PbihyKToyO2xldCBuPUN0KGUsIm5Db21wTklQQUxTIik7bj1kbihuKT9PbihuKToyO2xldCBvPUN0KGUsIm1vZGUiKSxzPSIiLGk9bGUodCksdT0wLGE9MDtpZihicih0LCh0PT57IWZ1bmN0aW9uKHQpe2lmKGdlKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMDtyZXR1cm4hMX1yZXR1cm4hMX0odCk/ZGUodCkmJihhKz0xKTp1Kz0xfSkpLHU9PT1pKXM9Im9iaiI7ZWxzZXtpZihhIT09aSl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IG9mIHRoZSBzYW1lIHR5cGUiKTtzPSJtYXQifWxldCBoLGw9bnVsbDsib2JqIj09PXM/KGw9ZnVuY3Rpb24odCl7bGV0IGU9e307YnIodCwodD0+e2JyKHQsKCh0LHIpPT57ZVtyXXx8KGVbcl09MCksMD09PWVbcl0mJmRuKHQpJiYoZVtyXT0xKSwxIT09ZVtyXXx8ZG4odCl8fChlW3JdPS0xKX0pKX0pKTtsZXQgcj1bXTtyZXR1cm4gYnIoZSwoKHQsZSk9PnsxPT09dCYmci5wdXNoKGUpfSkpLHJ9KHQpLGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbW4odCwodD0+e2xldCByPWJuKHQsZSk7cmV0dXJuIHBuKHIpfSkpfSh0LGwpKTpoPXQ7bGV0IGM9V2UoaCx7bkNvbXBOSVBBTFM6bn0pLGY9YW8oYyx7a051bWJlcjpyLG1vZGU6b30pLG09bW4oZiwodD0+bW4odCwodD0+Y1t0XSkpKSk7cmV0dXJue2tleXM6bCxnaW5kczpmLGdsdGR0Om1uKGYsKGU9Pm1uKGUsKGU9PnRbZV0pKSkpLGdtYXQ6bX19bGV0IFdDbHVzdGVyPXtQQ0E6YXN5bmMgZnVuY3Rpb24odCxlPXt9KXtyZXR1cm4gV2UodCxlKX0sY2x1c3Rlcjphc3luYyBmdW5jdGlvbih0LGU9e30pe3RyeXtyZXR1cm4gaG8odCxlKX1jYXRjaCh0KXtyZXR1cm4gUHJvbWlzZS5yZWplY3QodCl9fX07ZXhwb3J0e1dDbHVzdGVyIGFzIGRlZmF1bHR9OwoKCmxldCBpbnN0YW5jZSA9IG51bGwKZnVuY3Rpb24gaW5pdChpbnB1dCl7CgogICAgLy9pbml0CiAgICBsZXQgcgogICAgCiAgICAgICAgciA9IFdDbHVzdGVyKC4uLmlucHV0KQogICAgICAgIAoKICAgIC8vb24KICAgIAoKICAgIC8vc2F2ZQogICAgaW5zdGFuY2UgPSByCgp9CgpmdW5jdGlvbiBzZW5kTWVzc2FnZShkYXRhKSB7CiAgICAKICAgICAgICBwYXJlbnRQb3J0LnBvc3RNZXNzYWdlKGRhdGEpCiAgICAgICAgCn0KCmFzeW5jIGZ1bmN0aW9uIHJ1bihkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJ1bicsZGF0YSkKCiAgICAvL21vZGUKICAgIGxldCBtb2RlID0gZGF0YS5tb2RlCgogICAgLy9jaGVjawogICAgaWYobW9kZSAhPT0gJ2luaXQnICYmIG1vZGUgIT09ICdjYWxsJyl7CiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgLy9pbml0CiAgICBpZihtb2RlID09PSAnaW5pdCcpewogICAgICAgIAogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vdHlwZQogICAgICAgICAgICBsZXQgdHlwZSA9IGRhdGEudHlwZQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CiAgICAKICAgICAgICAgICAgLy9pbnN0YW5jZQogICAgICAgICAgICBpZih0eXBlID09PSAnZnVuY3Rpb24nKXsKICAgICAgICAgICAgICAgIGluaXQoLi4uaW5wdXQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZih0eXBlID09PSAnb2JqZWN0Jyl7CiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IFdDbHVzdGVyCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgCiAgICAgICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgICAgIG1vZGU6ICdlbWl0JywKICAgICAgICAgICAgICAgIGV2TmFtZTogJ2Vycm9yJywKICAgICAgICAgICAgICAgIG1zZzogZXJyLAogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICAgICAgfQogICAgICAgICAgICAKICAgIH0KCiAgICAvL2NoZWNrCiAgICBpZihtb2RlID09PSAnY2FsbCcpewogICAgICAgIGxldCBzdGF0ZSA9ICcnCiAgICAgICAgbGV0IG1zZyA9IG51bGwKCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy9mdW4KICAgICAgICAgICAgbGV0IGZ1biA9IGluc3RhbmNlW2RhdGEuZnVuXQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CgogICAgICAgICAgICAvL2V4ZWMKICAgICAgICAgICAgYXdhaXQgZnVuKC4uLmlucHV0KQogICAgICAgICAgICAgICAgLnRoZW4oKHN1YykgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdzdWNjZXNzJwogICAgICAgICAgICAgICAgICAgIG1zZz1zdWMKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdlcnJvcicKICAgICAgICAgICAgICAgICAgICBtc2c9ZXJyCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAgICAgc3RhdGUgPSAnZXJyb3InCiAgICAgICAgICAgIG1zZyA9IGVycgogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgbW9kZTogJ3JldHVybicsCiAgICAgICAgICAgIGlkOiBkYXRhLmlkLAogICAgICAgICAgICBmdW46IGRhdGEuZnVuLAogICAgICAgICAgICBzdGF0ZSwKICAgICAgICAgICAgbXNnLAogICAgICAgIH0KICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgfQoKfQoKZnVuY3Rpb24gcmVjdk1lc3NhZ2UoZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciByZWN2OicsIGRhdGEpCgogICAgLy9kYXRhUmVjdgogICAgbGV0IGRhdGFSZWN2ID0gZGF0YQoKICAgIC8vcnVuCiAgICBydW4oZGF0YVJlY3YpCgp9CgoKICAgICAgICBwYXJlbnRQb3J0Lm9uKCdtZXNzYWdlJywgcmVjdk1lc3NhZ2UpCiAgICAgICAgCgo=",Buffer.from(G,"base64").toString("utf8"));function t(){var b=l();function X(l){try{return new d.Worker(l,{eval:!0})}catch(d){u(d)}}var G=X(y);if(!G)return u("invalid worker"),null;function m(){G?(G.terminate(),G=void 0):u("worker has been terminated")}function K(){var d={mode:"init",type:"object",input:Array.prototype.slice.call(arguments)};G.postMessage(d)}function p(){var d=c(),l=Z(),X={mode:"call",id:l,fun:"PCA",input:Array.prototype.slice.call(arguments)};return G.postMessage(X),b.once(l,(function(l){"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d}function t(){var d=c(),l=Z(),X={mode:"call",id:l,fun:"cluster",input:Array.prototype.slice.call(arguments)};return G.postMessage(X),b.once(l,(function(l){"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d}function i(d){var l=d,c=l.mode;"emit"!==c&&"return"!==c||("emit"===c&&b.emit(l.evName,l.msg),"return"===c&&b.emit(l.id,l))}function u(d){b.emit("error",d)}return G.on("message",i),G.on("error",u),K(Array.prototype.slice.call(arguments)),b.PCA=p,b.cluster=t,b.terminate=m,b}var i,u,I={PCA:(u=X(K.mark((function d(){var l,c,Z,X=arguments;return K.wrap((function(d){for(;;)switch(d.prev=d.next){case 0:return l=Array.prototype.slice.call(X),c=t(),d.next=4,c.PCA.apply(c,b(l)).finally((function(){c.terminate()}));case 4:return Z=d.sent,d.abrupt("return",Z);case 6:case"end":return d.stop()}}),d)}))),function(){return u.apply(this,arguments)}),cluster:(i=X(K.mark((function d(){var l,c,Z,X=arguments;return K.wrap((function(d){for(;;)switch(d.prev=d.next){case 0:return l=Array.prototype.slice.call(X),c=t(),d.next=4,c.cluster.apply(c,b(l)).finally((function(){c.terminate()}));case 4:return Z=d.sent,d.abrupt("return",Z);case 6:case"end":return d.stop()}}),d)}))),function(){return i.apply(this,arguments)})};for(var h in m=l(),I){var o=I[h];m[h]=o}}(),m}(b.default)})),G=Z((function(d,l){d.exports=function(){function d(d,l){(null==l||l>d.length)&&(l=d.length);for(var b=0,c=new Array(l);b<l;b++)c[b]=d[b];return c}function l(l){return function(l){if(Array.isArray(l))return d(l)}(l)||function(d){if("undefined"!=typeof Symbol&&null!=d[Symbol.iterator]||null!=d["@@iterator"])return Array.from(d)}(l)||function(l,b){if(l){if("string"==typeof l)return d(l,b);var c=Object.prototype.toString.call(l).slice(8,-1);return"Object"===c&&l.constructor&&(c=l.constructor.name),"Map"===c||"Set"===c?Array.from(l):"Arguments"===c||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(c)?d(l,b):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 b(d,l,b,c,Z,X,G){try{var y=d[X](G),m=y.value}catch(d){return void b(d)}y.done?l(m):Promise.resolve(m).then(c,Z)}function Z(d){return function(){var l=this,c=arguments;return new Promise((function(Z,X){var G=d.apply(l,c);function y(d){b(G,Z,X,y,m,"next",d)}function m(d){b(G,Z,X,y,m,"throw",d)}y(void 0)}))}}function X(d){return X="function"==typeof Symbol&&"symbol"==c(Symbol.iterator)?function(d){return c(d)}:function(d){return d&&"function"==typeof Symbol&&d.constructor===Symbol&&d!==Symbol.prototype?"symbol":c(d)},X(d)}function G(d){var l={exports:{}};return d(l,l.exports),l.exports}var y,m,K=G((function(d){var l=function(d){var l,b=Object.prototype,c=b.hasOwnProperty,Z="function"==typeof Symbol?Symbol:{},G=Z.iterator||"@@iterator",y=Z.asyncIterator||"@@asyncIterator",m=Z.toStringTag||"@@toStringTag";function K(d,l,b){return Object.defineProperty(d,l,{value:b,enumerable:!0,configurable:!0,writable:!0}),d[l]}try{K({},"")}catch(d){K=function(d,l,b){return d[l]=b}}function p(d,l,b,c){var Z=l&&l.prototype instanceof W?l:W,X=Object.create(Z.prototype),G=new R(c||[]);return X._invoke=function(d,l,b){var c=i;return function(Z,X){if(c===I)throw new Error("Generator is already running");if(c===h){if("throw"===Z)throw X;return T()}for(b.method=Z,b.arg=X;;){var G=b.delegate;if(G){var y=S(G,b);if(y){if(y===o)continue;return y}}if("next"===b.method)b.sent=b._sent=b.arg;else if("throw"===b.method){if(c===i)throw c=h,b.arg;b.dispatchException(b.arg)}else"return"===b.method&&b.abrupt("return",b.arg);c=I;var m=t(d,l,b);if("normal"===m.type){if(c=b.done?h:u,m.arg===o)continue;return{value:m.arg,done:b.done}}"throw"===m.type&&(c=h,b.method="throw",b.arg=m.arg)}}}(d,b,G),X}function t(d,l,b){try{return{type:"normal",arg:d.call(l,b)}}catch(d){return{type:"throw",arg:d}}}d.wrap=p;var i="suspendedStart",u="suspendedYield",I="executing",h="completed",o={};function W(){}function V(){}function s(){}var H={};K(H,G,(function(){return this}));var L=Object.getPrototypeOf,C=L&&L(L(z([])));C&&C!==b&&c.call(C,G)&&(H=C);var a=s.prototype=W.prototype=Object.create(H);function n(d){["next","throw","return"].forEach((function(l){K(d,l,(function(d){return this._invoke(l,d)}))}))}function x(d,l){function b(Z,G,y,m){var K=t(d[Z],d,G);if("throw"!==K.type){var p=K.arg,i=p.value;return i&&"object"===X(i)&&c.call(i,"__await")?l.resolve(i.__await).then((function(d){b("next",d,y,m)}),(function(d){b("throw",d,y,m)})):l.resolve(i).then((function(d){p.value=d,y(p)}),(function(d){return b("throw",d,y,m)}))}m(K.arg)}var Z;this._invoke=function(d,c){function X(){return new l((function(l,Z){b(d,c,l,Z)}))}return Z=Z?Z.then(X,X):X()}}function S(d,b){var c=d.iterator[b.method];if(c===l){if(b.delegate=null,"throw"===b.method){if(d.iterator.return&&(b.method="return",b.arg=l,S(d,b),"throw"===b.method))return o;b.method="throw",b.arg=new TypeError("The iterator does not provide a 'throw' method")}return o}var Z=t(c,d.iterator,b.arg);if("throw"===Z.type)return b.method="throw",b.arg=Z.arg,b.delegate=null,o;var X=Z.arg;return X?X.done?(b[d.resultName]=X.value,b.next=d.nextLoc,"return"!==b.method&&(b.method="next",b.arg=l),b.delegate=null,o):X:(b.method="throw",b.arg=new TypeError("iterator result is not an object"),b.delegate=null,o)}function Y(d){var l={tryLoc:d[0]};1 in d&&(l.catchLoc=d[1]),2 in d&&(l.finallyLoc=d[2],l.afterLoc=d[3]),this.tryEntries.push(l)}function g(d){var l=d.completion||{};l.type="normal",delete l.arg,d.completion=l}function R(d){this.tryEntries=[{tryLoc:"root"}],d.forEach(Y,this),this.reset(!0)}function z(d){if(d){var b=d[G];if(b)return b.call(d);if("function"==typeof d.next)return d;if(!isNaN(d.length)){var Z=-1,X=function b(){for(;++Z<d.length;)if(c.call(d,Z))return b.value=d[Z],b.done=!1,b;return b.value=l,b.done=!0,b};return X.next=X}}return{next:T}}function T(){return{value:l,done:!0}}return V.prototype=s,K(a,"constructor",s),K(s,"constructor",V),V.displayName=K(s,m,"GeneratorFunction"),d.isGeneratorFunction=function(d){var l="function"==typeof d&&d.constructor;return!!l&&(l===V||"GeneratorFunction"===(l.displayName||l.name))},d.mark=function(d){return Object.setPrototypeOf?Object.setPrototypeOf(d,s):(d.__proto__=s,K(d,m,"GeneratorFunction")),d.prototype=Object.create(a),d},d.awrap=function(d){return{__await:d}},n(x.prototype),K(x.prototype,y,(function(){return this})),d.AsyncIterator=x,d.async=function(l,b,c,Z,X){void 0===X&&(X=Promise);var G=new x(p(l,b,c,Z),X);return d.isGeneratorFunction(b)?G:G.next().then((function(d){return d.done?d.value:G.next()}))},n(a),K(a,m,"Generator"),K(a,G,(function(){return this})),K(a,"toString",(function(){return"[object Generator]"})),d.keys=function(d){var l=[];for(var b in d)l.push(b);return l.reverse(),function b(){for(;l.length;){var c=l.pop();if(c in d)return b.value=c,b.done=!1,b}return b.done=!0,b}},d.values=z,R.prototype={constructor:R,reset:function(d){if(this.prev=0,this.next=0,this.sent=this._sent=l,this.done=!1,this.delegate=null,this.method="next",this.arg=l,this.tryEntries.forEach(g),!d)for(var b in this)"t"===b.charAt(0)&&c.call(this,b)&&!isNaN(+b.slice(1))&&(this[b]=l)},stop:function(){this.done=!0;var d=this.tryEntries[0].completion;if("throw"===d.type)throw d.arg;return this.rval},dispatchException:function(d){if(this.done)throw d;var b=this;function Z(c,Z){return y.type="throw",y.arg=d,b.next=c,Z&&(b.method="next",b.arg=l),!!Z}for(var X=this.tryEntries.length-1;X>=0;--X){var G=this.tryEntries[X],y=G.completion;if("root"===G.tryLoc)return Z("end");if(G.tryLoc<=this.prev){var m=c.call(G,"catchLoc"),K=c.call(G,"finallyLoc");if(m&&K){if(this.prev<G.catchLoc)return Z(G.catchLoc,!0);if(this.prev<G.finallyLoc)return Z(G.finallyLoc)}else if(m){if(this.prev<G.catchLoc)return Z(G.catchLoc,!0)}else{if(!K)throw new Error("try statement without catch or finally");if(this.prev<G.finallyLoc)return Z(G.finallyLoc)}}}},abrupt:function(d,l){for(var b=this.tryEntries.length-1;b>=0;--b){var Z=this.tryEntries[b];if(Z.tryLoc<=this.prev&&c.call(Z,"finallyLoc")&&this.prev<Z.finallyLoc){var X=Z;break}}X&&("break"===d||"continue"===d)&&X.tryLoc<=l&&l<=X.finallyLoc&&(X=null);var G=X?X.completion:{};return G.type=d,G.arg=l,X?(this.method="next",this.next=X.finallyLoc,o):this.complete(G)},complete:function(d,l){if("throw"===d.type)throw d.arg;return"break"===d.type||"continue"===d.type?this.next=d.arg:"return"===d.type?(this.rval=this.arg=d.arg,this.method="return",this.next="end"):"normal"===d.type&&l&&(this.next=l),o},finish:function(d){for(var l=this.tryEntries.length-1;l>=0;--l){var b=this.tryEntries[l];if(b.finallyLoc===d)return this.complete(b.completion,b.afterLoc),g(b),o}},catch:function(d){for(var l=this.tryEntries.length-1;l>=0;--l){var b=this.tryEntries[l];if(b.tryLoc===d){var c=b.completion;if("throw"===c.type){var Z=c.arg;g(b)}return Z}}throw new Error("illegal catch attempt")},delegateYield:function(d,b,c){return this.delegate={iterator:z(d),resultName:b,nextLoc:c},"next"===this.method&&(this.arg=l),o}},d}(d.exports);try{regeneratorRuntime=l}catch(d){"object"===("undefined"==typeof globalThis?"undefined":X(globalThis))?globalThis.regeneratorRuntime=l:Function("r","regeneratorRuntime = r")(l)}})),p="function"==typeof atob,t="function"==typeof Buffer,i="function"==typeof TextDecoder?new TextDecoder:void 0,u=("function"==typeof TextEncoder&&new TextEncoder,Array.prototype.slice.call("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=")),I=(y={},u.forEach((function(d,l){return y[d]=l})),y),h=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,o=String.fromCharCode.bind(String),W="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):function(d){var l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(d){return d};return new Uint8Array(Array.prototype.slice.call(d,0).map(l))},V=function(d){return d.replace(/[^A-Za-z0-9\+\/]/g,"")},s=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,H=function(d){switch(d.length){case 4:var l=((7&d.charCodeAt(0))<<18|(63&d.charCodeAt(1))<<12|(63&d.charCodeAt(2))<<6|63&d.charCodeAt(3))-65536;return o(55296+(l>>>10))+o(56320+(1023&l));case 3:return o((15&d.charCodeAt(0))<<12|(63&d.charCodeAt(1))<<6|63&d.charCodeAt(2));default:return o((31&d.charCodeAt(0))<<6|63&d.charCodeAt(1))}},L=function(d){return d.replace(s,H)},C=function(d){if(d=d.replace(/\s+/g,""),!h.test(d))throw new TypeError("malformed base64.");d+="==".slice(2-(3&d.length));for(var l,b,c,Z="",X=0;X<d.length;)l=I[d.charAt(X++)]<<18|I[d.charAt(X++)]<<12|(b=I[d.charAt(X++)])<<6|(c=I[d.charAt(X++)]),Z+=64===b?o(l>>16&255):64===c?o(l>>16&255,l>>8&255):o(l>>16&255,l>>8&255,255&l);return Z},a=p?function(d){return atob(V(d))}:t?function(d){return Buffer.from(d,"base64").toString("binary")}:C,n=t?function(d){return W(Buffer.from(d,"base64"))}:function(d){return W(a(d),(function(d){return d.charCodeAt(0)}))},x=t?function(d){return Buffer.from(d,"base64").toString("utf8")}:i?function(d){return i.decode(n(d))}:function(d){return L(a(d))},S=function(d){return V(d.replace(/[-_]/g,(function(d){return"-"==d?"+":"/"})))},Y=function(d){return x(S(d))},g=Y,R=G((function(d){var l=Object.prototype.hasOwnProperty,b="~";function c(){}function Z(d,l,b){this.fn=d,this.context=l,this.once=b||!1}function X(d,l,c,X,G){if("function"!=typeof c)throw new TypeError("The listener must be a function");var y=new Z(c,X||d,G),m=b?b+l:l;return d._events[m]?d._events[m].fn?d._events[m]=[d._events[m],y]:d._events[m].push(y):(d._events[m]=y,d._eventsCount++),d}function G(d,l){0==--d._eventsCount?d._events=new c:delete d._events[l]}function y(){this._events=new c,this._eventsCount=0}Object.create&&(c.prototype=Object.create(null),(new c).__proto__||(b=!1)),y.prototype.eventNames=function(){var d,c,Z=[];if(0===this._eventsCount)return Z;for(c in d=this._events)l.call(d,c)&&Z.push(b?c.slice(1):c);return Object.getOwnPropertySymbols?Z.concat(Object.getOwnPropertySymbols(d)):Z},y.prototype.listeners=function(d){var l=b?b+d:d,c=this._events[l];if(!c)return[];if(c.fn)return[c.fn];for(var Z=0,X=c.length,G=new Array(X);Z<X;Z++)G[Z]=c[Z].fn;return G},y.prototype.listenerCount=function(d){var l=b?b+d:d,c=this._events[l];return c?c.fn?1:c.length:0},y.prototype.emit=function(d,l,c,Z,X,G){var y=b?b+d:d;if(!this._events[y])return!1;var m,K,p=this._events[y],t=arguments.length;if(p.fn){switch(p.once&&this.removeListener(d,p.fn,void 0,!0),t){case 1:return p.fn.call(p.context),!0;case 2:return p.fn.call(p.context,l),!0;case 3:return p.fn.call(p.context,l,c),!0;case 4:return p.fn.call(p.context,l,c,Z),!0;case 5:return p.fn.call(p.context,l,c,Z,X),!0;case 6:return p.fn.call(p.context,l,c,Z,X,G),!0}for(K=1,m=new Array(t-1);K<t;K++)m[K-1]=arguments[K];p.fn.apply(p.context,m)}else{var i,u=p.length;for(K=0;K<u;K++)switch(p[K].once&&this.removeListener(d,p[K].fn,void 0,!0),t){case 1:p[K].fn.call(p[K].context);break;case 2:p[K].fn.call(p[K].context,l);break;case 3:p[K].fn.call(p[K].context,l,c);break;case 4:p[K].fn.call(p[K].context,l,c,Z);break;default:if(!m)for(i=1,m=new Array(t-1);i<t;i++)m[i-1]=arguments[i];p[K].fn.apply(p[K].context,m)}}return!0},y.prototype.on=function(d,l,b){return X(this,d,l,b,!1)},y.prototype.once=function(d,l,b){return X(this,d,l,b,!0)},y.prototype.removeListener=function(d,l,c,Z){var X=b?b+d:d;if(!this._events[X])return this;if(!l)return G(this,X),this;var y=this._events[X];if(y.fn)y.fn!==l||Z&&!y.once||c&&y.context!==c||G(this,X);else{for(var m=0,K=[],p=y.length;m<p;m++)(y[m].fn!==l||Z&&!y[m].once||c&&y[m].context!==c)&&K.push(y[m]);K.length?this._events[X]=1===K.length?K[0]:K:G(this,X)}return this},y.prototype.removeAllListeners=function(d){var l;return d?(l=b?b+d:d,this._events[l]&&G(this,l)):(this._events=new c,this._eventsCount=0),this},y.prototype.off=y.prototype.removeListener,y.prototype.addListener=y.prototype.on,y.prefixed=b,y.EventEmitter=y,d.exports=y}));return function(){if("browser"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function d(){return new R}function b(){var d,l,b=new Promise((function(){d=arguments[0],l=arguments[1]}));return b.resolve=d,b.reject=l,b}function c(){for(var d=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,l=[],b="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),c=b.length,Z=0;Z<d;Z++)l[Z]=b[0|Math.random()*c];return l.join("")}var X=g("CgoKdmFyIHQ9QXJyYXkuaXNBcnJheSxlPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fWZ1bmN0aW9uIG4odCl7dmFyIGU9e2V4cG9ydHM6e319O3JldHVybiB0KGUsZS5leHBvcnRzKSxlLmV4cG9ydHN9dmFyIG89Im9iamVjdCI9PXR5cGVvZiBlJiZlJiZlLk9iamVjdD09PU9iamVjdCYmZSxzPSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsaT1vfHxzfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLHU9aS5TeW1ib2wsYT1PYmplY3QucHJvdG90eXBlLGg9YS5oYXNPd25Qcm9wZXJ0eSxsPWEudG9TdHJpbmcsYz11P3UudG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBmPWZ1bmN0aW9uKHQpe3ZhciBlPWguY2FsbCh0LGMpLHI9dFtjXTt0cnl7dFtjXT12b2lkIDA7dmFyIG49ITB9Y2F0Y2godCl7fXZhciBvPWwuY2FsbCh0KTtyZXR1cm4gbiYmKGU/dFtjXT1yOmRlbGV0ZSB0W2NdKSxvfSxtPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dmFyIGc9ZnVuY3Rpb24odCl7cmV0dXJuIG0uY2FsbCh0KX0scD11P3UudG9TdHJpbmdUYWc6dm9pZCAwO3ZhciB3PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMD09PXQ/IltvYmplY3QgVW5kZWZpbmVkXSI6IltvYmplY3QgTnVsbF0iOnAmJnAgaW4gT2JqZWN0KHQpP2YodCk6Zyh0KX07dmFyIGQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH07dmFyIGI9ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxkKHQpJiYiW29iamVjdCBTeW1ib2xdIj09dyh0KX0seT0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyx2PS9eXHcqJC87dmFyIE09ZnVuY3Rpb24oZSxyKXtpZih0KGUpKXJldHVybiExO3ZhciBuPXR5cGVvZiBlO3JldHVybiEoIm51bWJlciIhPW4mJiJzeW1ib2wiIT1uJiYiYm9vbGVhbiIhPW4mJm51bGwhPWUmJiFiKGUpKXx8KHYudGVzdChlKXx8IXkudGVzdChlKXx8bnVsbCE9ciYmZSBpbiBPYmplY3QocikpfTt2YXIgeD1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX07dmFyIEUsUz1mdW5jdGlvbih0KXtpZigheCh0KSlyZXR1cm4hMTt2YXIgZT13KHQpO3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgUHJveHldIj09ZX0saj1pWyJfX2NvcmUtanNfc2hhcmVkX18iXSxfPShFPS9bXi5dKyQvLmV4ZWMoaiYmai5rZXlzJiZqLmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIitFOiIiO3ZhciBBPWZ1bmN0aW9uKHQpe3JldHVybiEhXyYmXyBpbiB0fSxDPUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZzt2YXIgUj1mdW5jdGlvbih0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIEMuY2FsbCh0KX1jYXRjaCh0KXt9dHJ5e3JldHVybiB0KyIifWNhdGNoKHQpe319cmV0dXJuIiJ9LEk9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8saz1GdW5jdGlvbi5wcm90b3R5cGUsTj1PYmplY3QucHJvdG90eXBlLE89ay50b1N0cmluZyxGPU4uaGFzT3duUHJvcGVydHksej1SZWdFeHAoIl4iK08uY2FsbChGKS5yZXBsYWNlKC9bXFxeJC4qKz8oKVtcXXt9fF0vZywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt2YXIgVD1mdW5jdGlvbih0KXtyZXR1cm4hKCF4KHQpfHxBKHQpKSYmKFModCk/ejpJKS50ZXN0KFIodCkpfTt2YXIgVj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfTt2YXIgUD1mdW5jdGlvbih0LGUpe3ZhciByPVYodCxlKTtyZXR1cm4gVChyKT9yOnZvaWQgMH0scT1QKE9iamVjdCwiY3JlYXRlIik7dmFyICQ9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPXE/cShudWxsKTp7fSx0aGlzLnNpemU9MH07dmFyIEQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LFU9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgTD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKHEpe3ZhciByPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09cj92b2lkIDA6cn1yZXR1cm4gVS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9LEI9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgRz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBxP3ZvaWQgMCE9PWVbdF06Qi5jYWxsKGUsdCl9O3ZhciBLPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsclt0XT1xJiZ2b2lkIDA9PT1lPyJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjplLHRoaXN9O2Z1bmN0aW9uIFcodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19Vy5wcm90b3R5cGUuY2xlYXI9JCxXLnByb3RvdHlwZS5kZWxldGU9RCxXLnByb3RvdHlwZS5nZXQ9TCxXLnByb3RvdHlwZS5oYXM9RyxXLnByb3RvdHlwZS5zZXQ9Szt2YXIgWD1XO3ZhciBKPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH07dmFyIFk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHQhPXQmJmUhPWV9O3ZhciBaPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXQubGVuZ3RoO3ItLTspaWYoWSh0W3JdWzBdLGUpKXJldHVybiByO3JldHVybi0xfSxIPUFycmF5LnByb3RvdHlwZS5zcGxpY2U7dmFyIFE9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPVooZSx0KTtyZXR1cm4hKHI8MCkmJihyPT1lLmxlbmd0aC0xP2UucG9wKCk6SC5jYWxsKGUsciwxKSwtLXRoaXMuc2l6ZSwhMCl9O3ZhciB0dD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9WihlLHQpO3JldHVybiByPDA/dm9pZCAwOmVbcl1bMV19O3ZhciBldD1mdW5jdGlvbih0KXtyZXR1cm4gWih0aGlzLl9fZGF0YV9fLHQpPi0xfTt2YXIgcnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fLG49WihyLHQpO3JldHVybiBuPDA/KCsrdGhpcy5zaXplLHIucHVzaChbdCxlXSkpOnJbbl1bMV09ZSx0aGlzfTtmdW5jdGlvbiBudCh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1udC5wcm90b3R5cGUuY2xlYXI9SixudC5wcm90b3R5cGUuZGVsZXRlPVEsbnQucHJvdG90eXBlLmdldD10dCxudC5wcm90b3R5cGUuaGFzPWV0LG50LnByb3RvdHlwZS5zZXQ9cnQ7dmFyIG90PW50LHN0PVAoaSwiTWFwIik7dmFyIGl0PWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgWCxtYXA6bmV3KHN0fHxvdCksc3RyaW5nOm5ldyBYfX07dmFyIHV0PWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiJzdHJpbmciPT1lfHwibnVtYmVyIj09ZXx8InN5bWJvbCI9PWV8fCJib29sZWFuIj09ZT8iX19wcm90b19fIiE9PXQ6bnVsbD09PXR9O3ZhciBhdD1mdW5jdGlvbih0LGUpe3ZhciByPXQuX19kYXRhX187cmV0dXJuIHV0KGUpP3JbInN0cmluZyI9PXR5cGVvZiBlPyJzdHJpbmciOiJoYXNoIl06ci5tYXB9O3ZhciBodD1mdW5jdGlvbih0KXt2YXIgZT1hdCh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfTt2YXIgbHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGF0KHRoaXMsdCkuZ2V0KHQpfTt2YXIgY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGF0KHRoaXMsdCkuaGFzKHQpfTt2YXIgZnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1hdCh0aGlzLHQpLG49ci5zaXplO3JldHVybiByLnNldCh0LGUpLHRoaXMuc2l6ZSs9ci5zaXplPT1uPzA6MSx0aGlzfTtmdW5jdGlvbiBtdCh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1tdC5wcm90b3R5cGUuY2xlYXI9aXQsbXQucHJvdG90eXBlLmRlbGV0ZT1odCxtdC5wcm90b3R5cGUuZ2V0PWx0LG10LnByb3RvdHlwZS5oYXM9Y3QsbXQucHJvdG90eXBlLnNldD1mdDt2YXIgZ3Q9bXQ7ZnVuY3Rpb24gcHQodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBmdW5jdGlvbiIpO3ZhciByPWZ1bmN0aW9uKCl7dmFyIG49YXJndW1lbnRzLG89ZT9lLmFwcGx5KHRoaXMsbik6blswXSxzPXIuY2FjaGU7aWYocy5oYXMobykpcmV0dXJuIHMuZ2V0KG8pO3ZhciBpPXQuYXBwbHkodGhpcyxuKTtyZXR1cm4gci5jYWNoZT1zLnNldChvLGkpfHxzLGl9O3JldHVybiByLmNhY2hlPW5ldyhwdC5DYWNoZXx8Z3QpLHJ9cHQuQ2FjaGU9Z3Q7dmFyIHd0PXB0O3ZhciBkdD0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxidD0vXFwoXFwpPy9nLHl0PWZ1bmN0aW9uKHQpe3ZhciBlPXd0KHQsKGZ1bmN0aW9uKHQpe3JldHVybiA1MDA9PT1yLnNpemUmJnIuY2xlYXIoKSx0fSkpLHI9ZS5jYWNoZTtyZXR1cm4gZX0oKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoZHQsKGZ1bmN0aW9uKHQscixuLG8pe2UucHVzaChuP28ucmVwbGFjZShidCwiJDEiKTpyfHx0KX0pKSxlfSkpO3ZhciB2dD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aCxvPUFycmF5KG4pOysrcjxuOylvW3JdPWUodFtyXSxyLHQpO3JldHVybiBvfSxNdD11P3UucHJvdG90eXBlOnZvaWQgMCx4dD1NdD9NdC50b1N0cmluZzp2b2lkIDA7dmFyIEV0PWZ1bmN0aW9uIGUocil7aWYoInN0cmluZyI9PXR5cGVvZiByKXJldHVybiByO2lmKHQocikpcmV0dXJuIHZ0KHIsZSkrIiI7aWYoYihyKSlyZXR1cm4geHQ/eHQuY2FsbChyKToiIjt2YXIgbj1yKyIiO3JldHVybiIwIj09biYmMS9yPT0tSW5maW5pdHk/Ii0wIjpufTt2YXIgU3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/IiI6RXQodCl9O3ZhciBqdD1mdW5jdGlvbihlLHIpe3JldHVybiB0KGUpP2U6TShlLHIpP1tlXTp5dChTdChlKSl9O3ZhciBfdD1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fGIodCkpcmV0dXJuIHQ7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LUluZmluaXR5PyItMCI6ZX07dmFyIEF0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsbj0oZT1qdChlLHQpKS5sZW5ndGg7bnVsbCE9dCYmcjxuOyl0PXRbX3QoZVtyKytdKV07cmV0dXJuIHImJnI9PW4/dDp2b2lkIDB9O3ZhciBDdD1mdW5jdGlvbih0LGUscil7dmFyIG49bnVsbD09dD92b2lkIDA6QXQodCxlKTtyZXR1cm4gdm9pZCAwPT09bj9yOm59LFJ0PU9iamVjdC5wcm90b3R5cGU7dmFyIEl0PWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuY29uc3RydWN0b3I7cmV0dXJuIHQ9PT0oImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUucHJvdG90eXBlfHxSdCl9O3ZhciBrdD1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gdChlKHIpKX19KE9iamVjdC5rZXlzLE9iamVjdCksTnQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgT3Q9ZnVuY3Rpb24odCl7aWYoIUl0KHQpKXJldHVybiBrdCh0KTt2YXIgZT1bXTtmb3IodmFyIHIgaW4gT2JqZWN0KHQpKU50LmNhbGwodCxyKSYmImNvbnN0cnVjdG9yIiE9ciYmZS5wdXNoKHIpO3JldHVybiBlfSxGdD1QKGksIkRhdGFWaWV3IiksenQ9UChpLCJQcm9taXNlIiksVHQ9UChpLCJTZXQiKSxWdD1QKGksIldlYWtNYXAiKSxQdD1SKEZ0KSxxdD1SKHN0KSwkdD1SKHp0KSxEdD1SKFR0KSxVdD1SKFZ0KSxMdD13OyhGdCYmIltvYmplY3QgRGF0YVZpZXddIiE9THQobmV3IEZ0KG5ldyBBcnJheUJ1ZmZlcigxKSkpfHxzdCYmIltvYmplY3QgTWFwXSIhPUx0KG5ldyBzdCl8fHp0JiYiW29iamVjdCBQcm9taXNlXSIhPUx0KHp0LnJlc29sdmUoKSl8fFR0JiYiW29iamVjdCBTZXRdIiE9THQobmV3IFR0KXx8VnQmJiJbb2JqZWN0IFdlYWtNYXBdIiE9THQobmV3IFZ0KSkmJihMdD1mdW5jdGlvbih0KXt2YXIgZT13KHQpLHI9IltvYmplY3QgT2JqZWN0XSI9PWU/dC5jb25zdHJ1Y3Rvcjp2b2lkIDAsbj1yP1Iocik6IiI7aWYobilzd2l0Y2gobil7Y2FzZSBQdDpyZXR1cm4iW29iamVjdCBEYXRhVmlld10iO2Nhc2UgcXQ6cmV0dXJuIltvYmplY3QgTWFwXSI7Y2FzZSAkdDpyZXR1cm4iW29iamVjdCBQcm9taXNlXSI7Y2FzZSBEdDpyZXR1cm4iW29iamVjdCBTZXRdIjtjYXNlIFV0OnJldHVybiJbb2JqZWN0IFdlYWtNYXBdIn1yZXR1cm4gZX0pO3ZhciBCdD1MdDt2YXIgR3Q9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PTkwMDcxOTkyNTQ3NDA5OTF9O3ZhciBLdD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmR3QodC5sZW5ndGgpJiYhUyh0KX07dmFyIFd0PWZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZXx8IXQoZSkmJmQoZSkmJiJbb2JqZWN0IFN0cmluZ10iPT13KGUpfTt2YXIgWHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3ZvaWQgMDplW3RdfX0sSnQ9WHQoImxlbmd0aCIpLFl0PVJlZ0V4cCgiW1xcdTIwMGRcXHVkODAwLVxcdWRmZmZcXHUwMzAwLVxcdTAzNmZcXHVmZTIwLVxcdWZlMmZcXHUyMGQwLVxcdTIwZmZcXHVmZTBlXFx1ZmUwZl0iKTt2YXIgWnQ9ZnVuY3Rpb24odCl7cmV0dXJuIFl0LnRlc3QodCl9LEh0PSJbXFx1ZDgwMC1cXHVkZmZmXSIsUXQ9IltcXHUwMzAwLVxcdTAzNmZcXHVmZTIwLVxcdWZlMmZcXHUyMGQwLVxcdTIwZmZdIix0ZT0iXFx1ZDgzY1tcXHVkZmZiLVxcdWRmZmZdIixlZT0iW15cXHVkODAwLVxcdWRmZmZdIixyZT0iKD86XFx1ZDgzY1tcXHVkZGU2LVxcdWRkZmZdKXsyfSIsbmU9IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLG9lPSIoPzoiK1F0KyJ8Iit0ZSsiKSIrIj8iLHNlPSJbXFx1ZmUwZVxcdWZlMGZdPyIrb2UrKCIoPzpcXHUyMDBkKD86IitbZWUscmUsbmVdLmpvaW4oInwiKSsiKVtcXHVmZTBlXFx1ZmUwZl0/IitvZSsiKSoiKSxpZT0iKD86IitbZWUrUXQrIj8iLFF0LHJlLG5lLEh0XS5qb2luKCJ8IikrIikiLHVlPVJlZ0V4cCh0ZSsiKD89Iit0ZSsiKXwiK2llK3NlLCJnIik7dmFyIGFlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT11ZS5sYXN0SW5kZXg9MDt1ZS50ZXN0KHQpOykrK2U7cmV0dXJuIGV9O3ZhciBoZT1mdW5jdGlvbih0KXtyZXR1cm4gWnQodCk/YWUodCk6SnQodCl9O3ZhciBsZT1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiAwO2lmKEt0KHQpKXJldHVybiBXdCh0KT9oZSh0KTp0Lmxlbmd0aDt2YXIgZT1CdCh0KTtyZXR1cm4iW29iamVjdCBNYXBdIj09ZXx8IltvYmplY3QgU2V0XSI9PWU/dC5zaXplOk90KHQpLmxlbmd0aH07dmFyIGNlPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdHx8ZCh0KSYmIltvYmplY3QgTnVtYmVyXSI9PXcodCl9O3ZhciBmZT1mdW5jdGlvbih0KXtyZXR1cm4hMD09PXR8fCExPT09dHx8ZCh0KSYmIltvYmplY3QgQm9vbGVhbl0iPT13KHQpfTtmdW5jdGlvbiBtZSh0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIGdlKHQpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIHBlKHQpe3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIHdlKHQpe3JldHVybiEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgVW5kZWZpbmVkXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdWxsXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtpZihnZSh0KSl7Zm9yKGxldCBlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9KHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4hKCFwZSh0KXx8IiIhPT10KX0odCl8fCEhZnVuY3Rpb24odCl7cmV0dXJuISFtZSh0KSYmMD09PXQubGVuZ3RofSh0KSkpKX1mdW5jdGlvbiBkZSh0KXtyZXR1cm4hIW1lKHQpJiYoMCE9PXQubGVuZ3RoJiYoMSE9PXQubGVuZ3RofHwhd2UodFswXSkpKX1jb25zdCBiZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIHllKHQpe3JldHVybiBiZS5jYWxsKHQpLmVuZHNXaXRoKCJBcnJheV0iKX1mdW5jdGlvbiB2ZSh0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXllKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTt2YXIgcj1lLmZyb21JbmRleCxuPXZvaWQgMD09PXI/MDpyLG89ZS50b0luZGV4LHM9dm9pZCAwPT09bz90Lmxlbmd0aDpvO2lmKG48MHx8bj49dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKG4pKXRocm93IG5ldyBFcnJvcigiZnJvbUluZGV4IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHNtYWxsZXIgdGhhbiBsZW5ndGgiKTtpZihzPD1ufHxzPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihzKSl0aHJvdyBuZXcgRXJyb3IoInRvSW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBmcm9tSW5kZXggYW5kIGF0IG1vc3QgZXF1YWwgdG8gbGVuZ3RoIik7Zm9yKHZhciBpPXRbbl0sdT1uKzE7dTxzO3UrKyl0W3VdPmkmJihpPXRbdV0pO3JldHVybiBpfWZ1bmN0aW9uIE1lKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZigheWUodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBiZSBhbiBhcnJheSIpO2lmKDA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IG5vdCBiZSBlbXB0eSIpO3ZhciByPWUuZnJvbUluZGV4LG49dm9pZCAwPT09cj8wOnIsbz1lLnRvSW5kZXgscz12b2lkIDA9PT1vP3QubGVuZ3RoOm87aWYobjwwfHxuPj10Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIobikpdGhyb3cgbmV3IEVycm9yKCJmcm9tSW5kZXggbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc21hbGxlciB0aGFuIGxlbmd0aCIpO2lmKHM8PW58fHM+dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKHMpKXRocm93IG5ldyBFcnJvcigidG9JbmRleCBtdXN0IGJlIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIGZyb21JbmRleCBhbmQgYXQgbW9zdCBlcXVhbCB0byBsZW5ndGgiKTtmb3IodmFyIGk9dFtuXSx1PW4rMTt1PHM7dSsrKXRbdV08aSYmKGk9dFt1XSk7cmV0dXJuIGl9ZnVuY3Rpb24geGUodCl7dmFyIGUscj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXllKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTtpZih2b2lkIDAhPT1yLm91dHB1dCl7aWYoIXllKHIub3V0cHV0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvdXRwdXQgb3B0aW9uIG11c3QgYmUgYW4gYXJyYXkgaWYgc3BlY2lmaWVkIik7ZT1yLm91dHB1dH1lbHNlIGU9bmV3IEFycmF5KHQubGVuZ3RoKTt2YXIgbj1NZSh0KSxvPXZlKHQpO2lmKG49PT1vKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW5pbXVtIGFuZCBtYXhpbXVtIGlucHV0IHZhbHVlcyBhcmUgZXF1YWwuIENhbm5vdCByZXNjYWxlIGEgY29uc3RhbnQgYXJyYXkiKTt2YXIgcz1yLm1pbixpPXZvaWQgMD09PXM/ci5hdXRvTWluTWF4P246MDpzLHU9ci5tYXgsYT12b2lkIDA9PT11P3IuYXV0b01pbk1heD9vOjE6dTtpZihpPj1hKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gb3B0aW9uIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCBvcHRpb24iKTtmb3IodmFyIGg9KGEtaSkvKG8tbiksbD0wO2w8dC5sZW5ndGg7bCsrKWVbbF09KHRbbF0tbikqaCtpO3JldHVybiBlfWNvbnN0IEVlPSIgIi5yZXBlYXQoMiksU2U9IiAiLnJlcGVhdCg0KTtmdW5jdGlvbiBqZSh0LGU9e30pe2NvbnN0e21heFJvd3M6cj0xNSxtYXhDb2x1bW5zOm49MTAsbWF4TnVtU2l6ZTpvPTh9PWU7cmV0dXJuYCR7dC5jb25zdHJ1Y3Rvci5uYW1lfSB7XG4ke0VlfVtcbiR7U2V9JHtmdW5jdGlvbih0LGUscixuKXtjb25zdHtyb3dzOm8sY29sdW1uczpzfT10LGk9TWF0aC5taW4obyxlKSx1PU1hdGgubWluKHMsciksYT1bXTtmb3IobGV0IGU9MDtlPGk7ZSsrKXtsZXQgcj1bXTtmb3IobGV0IG89MDtvPHU7bysrKXIucHVzaChfZSh0LmdldChlLG8pLG4pKTthLnB1c2goYCR7ci5qb2luKCIgIil9YCl9dSE9PXMmJihhW2EubGVuZ3RoLTFdKz1gIC4uLiAke3Mtcn0gbW9yZSBjb2x1bW5zYCk7aSE9PW8mJmEucHVzaChgLi4uICR7by1lfSBtb3JlIHJvd3NgKTtyZXR1cm4gYS5qb2luKGBcbiR7U2V9YCl9KHQscixuLG8pfVxuJHtFZX1dXG4ke0VlfXJvd3M6ICR7dC5yb3dzfVxuJHtFZX1jb2x1bW5zOiAke3QuY29sdW1uc31cbn1gfWZ1bmN0aW9uIF9lKHQsZSl7Y29uc3Qgcj1TdHJpbmcodCk7aWYoci5sZW5ndGg8PWUpcmV0dXJuIHIucGFkRW5kKGUsIiAiKTtjb25zdCBuPXQudG9QcmVjaXNpb24oZS0yKTtpZihuLmxlbmd0aDw9ZSlyZXR1cm4gbjtjb25zdCBvPXQudG9FeHBvbmVudGlhbChlLTIpLHM9by5pbmRleE9mKCJlIiksaT1vLnNsaWNlKHMpO3JldHVybiBvLnNsaWNlKDAsZS1pLmxlbmd0aCkraX1mdW5jdGlvbiBBZSh0LGUscil7bGV0IG49cj90LnJvd3M6dC5yb3dzLTE7aWYoZTwwfHxlPm4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlJvdyBpbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBDZSh0LGUscil7bGV0IG49cj90LmNvbHVtbnM6dC5jb2x1bW5zLTE7aWYoZTwwfHxlPm4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBSZSh0LGUpe2lmKGUudG8xREFycmF5JiYoZT1lLnRvMURBcnJheSgpKSxlLmxlbmd0aCE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9yIHNpemUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMiKTtyZXR1cm4gZX1mdW5jdGlvbiBJZSh0LGUpe2lmKGUudG8xREFycmF5JiYoZT1lLnRvMURBcnJheSgpKSxlLmxlbmd0aCE9PXQucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9yIHNpemUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHJvd3MiKTtyZXR1cm4gZX1mdW5jdGlvbiBrZSh0LGUscixuLG8pe2lmKDUhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJleHBlY3RlZCA0IGFyZ3VtZW50cyIpO2lmKE9lKCJzdGFydFJvdyIsZSksT2UoImVuZFJvdyIsciksT2UoInN0YXJ0Q29sdW1uIixuKSxPZSgiZW5kQ29sdW1uIixvKSxlPnJ8fG4+b3x8ZTwwfHxlPj10LnJvd3N8fHI8MHx8cj49dC5yb3dzfHxuPDB8fG4+PXQuY29sdW1uc3x8bzwwfHxvPj10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlN1Ym1hdHJpeCBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBOZSh0LGU9MCl7bGV0IHI9W107Zm9yKGxldCBuPTA7bjx0O24rKylyLnB1c2goZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gT2UodCxlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0fSBtdXN0IGJlIGEgbnVtYmVyYCl9ZnVuY3Rpb24gRmUodCl7aWYodC5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJFbXB0eSBtYXRyaXggaGFzIG5vIGVsZW1lbnRzIHRvIGluZGV4Iil9Y2xhc3MgemV7c3RhdGljIGZyb20xREFycmF5KHQsZSxyKXtpZih0KmUhPT1yLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiZGF0YSBsZW5ndGggZG9lcyBub3QgbWF0Y2ggZ2l2ZW4gZGltZW5zaW9ucyIpO2xldCBuPW5ldyBWZSh0LGUpO2ZvcihsZXQgbz0wO288dDtvKyspZm9yKGxldCB0PTA7dDxlO3QrKyluLnNldChvLHQscltvKmUrdF0pO3JldHVybiBufXN0YXRpYyByb3dWZWN0b3IodCl7bGV0IGU9bmV3IFZlKDEsdC5sZW5ndGgpO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKWUuc2V0KDAscix0W3JdKTtyZXR1cm4gZX1zdGF0aWMgY29sdW1uVmVjdG9yKHQpe2xldCBlPW5ldyBWZSh0Lmxlbmd0aCwxKTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyllLnNldChyLDAsdFtyXSk7cmV0dXJuIGV9c3RhdGljIHplcm9zKHQsZSl7cmV0dXJuIG5ldyBWZSh0LGUpfXN0YXRpYyBvbmVzKHQsZSl7cmV0dXJuIG5ldyBWZSh0LGUpLmZpbGwoMSl9c3RhdGljIHJhbmQodCxlLHI9e30pe2lmKCJvYmplY3QiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7cmFuZG9tOm49TWF0aC5yYW5kb219PXI7bGV0IG89bmV3IFZlKHQsZSk7Zm9yKGxldCByPTA7cjx0O3IrKylmb3IobGV0IHQ9MDt0PGU7dCsrKW8uc2V0KHIsdCxuKCkpO3JldHVybiBvfXN0YXRpYyByYW5kSW50KHQsZSxyPXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e21pbjpuPTAsbWF4Om89MWUzLHJhbmRvbTpzPU1hdGgucmFuZG9tfT1yO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIm1pbiBtdXN0IGJlIGFuIGludGVnZXIiKTtpZighTnVtYmVyLmlzSW50ZWdlcihvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggbXVzdCBiZSBhbiBpbnRlZ2VyIik7aWYobj49byl0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCIpO2xldCBpPW8tbix1PW5ldyBWZSh0LGUpO2ZvcihsZXQgcj0wO3I8dDtyKyspZm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9bitNYXRoLnJvdW5kKHMoKSppKTt1LnNldChyLHQsZSl9cmV0dXJuIHV9c3RhdGljIGV5ZSh0LGUscil7dm9pZCAwPT09ZSYmKGU9dCksdm9pZCAwPT09ciYmKHI9MSk7bGV0IG49TWF0aC5taW4odCxlKSxvPXRoaXMuemVyb3ModCxlKTtmb3IobGV0IHQ9MDt0PG47dCsrKW8uc2V0KHQsdCxyKTtyZXR1cm4gb31zdGF0aWMgZGlhZyh0LGUscil7bGV0IG49dC5sZW5ndGg7dm9pZCAwPT09ZSYmKGU9biksdm9pZCAwPT09ciYmKHI9ZSk7bGV0IG89TWF0aC5taW4obixlLHIpLHM9dGhpcy56ZXJvcyhlLHIpO2ZvcihsZXQgZT0wO2U8bztlKyspcy5zZXQoZSxlLHRbZV0pO3JldHVybiBzfXN0YXRpYyBtaW4odCxlKXt0PXRoaXMuY2hlY2tNYXRyaXgodCksZT10aGlzLmNoZWNrTWF0cml4KGUpO2xldCByPXQucm93cyxuPXQuY29sdW1ucyxvPW5ldyBWZShyLG4pO2ZvcihsZXQgcz0wO3M8cjtzKyspZm9yKGxldCByPTA7cjxuO3IrKylvLnNldChzLHIsTWF0aC5taW4odC5nZXQocyxyKSxlLmdldChzLHIpKSk7cmV0dXJuIG99c3RhdGljIG1heCh0LGUpe3Q9dGhpcy5jaGVja01hdHJpeCh0KSxlPXRoaXMuY2hlY2tNYXRyaXgoZSk7bGV0IHI9dC5yb3dzLG49dC5jb2x1bW5zLG89bmV3IHRoaXMocixuKTtmb3IobGV0IHM9MDtzPHI7cysrKWZvcihsZXQgcj0wO3I8bjtyKyspby5zZXQocyxyLE1hdGgubWF4KHQuZ2V0KHMsciksZS5nZXQocyxyKSkpO3JldHVybiBvfXN0YXRpYyBjaGVja01hdHJpeCh0KXtyZXR1cm4gemUuaXNNYXRyaXgodCk/dDpuZXcgVmUodCl9c3RhdGljIGlzTWF0cml4KHQpe3JldHVybiBudWxsIT10JiYiTWF0cml4Ij09PXQua2xhc3N9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy5yb3dzKnRoaXMuY29sdW1uc31hcHBseSh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24iKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQuY2FsbCh0aGlzLGUscik7cmV0dXJuIHRoaXN9dG8xREFycmF5KCl7bGV0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LnB1c2godGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9dG8yREFycmF5KCl7bGV0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXt0LnB1c2goW10pO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0W2VdLnB1c2godGhpcy5nZXQoZSxyKSl9cmV0dXJuIHR9dG9KU09OKCl7cmV0dXJuIHRoaXMudG8yREFycmF5KCl9aXNSb3dWZWN0b3IoKXtyZXR1cm4gMT09PXRoaXMucm93c31pc0NvbHVtblZlY3Rvcigpe3JldHVybiAxPT09dGhpcy5jb2x1bW5zfWlzVmVjdG9yKCl7cmV0dXJuIDE9PT10aGlzLnJvd3N8fDE9PT10aGlzLmNvbHVtbnN9aXNTcXVhcmUoKXtyZXR1cm4gdGhpcy5yb3dzPT09dGhpcy5jb2x1bW5zfWlzRW1wdHkoKXtyZXR1cm4gMD09PXRoaXMucm93c3x8MD09PXRoaXMuY29sdW1uc31pc1N5bW1ldHJpYygpe2lmKHRoaXMuaXNTcXVhcmUoKSl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8PXQ7ZSsrKWlmKHRoaXMuZ2V0KHQsZSkhPT10aGlzLmdldChlLHQpKXJldHVybiExO3JldHVybiEwfXJldHVybiExfWlzRWNoZWxvbkZvcm0oKXtsZXQgdD0wLGU9MCxyPS0xLG49ITAsbz0hMTtmb3IoO3Q8dGhpcy5yb3dzJiZuOyl7Zm9yKGU9MCxvPSExO2U8dGhpcy5jb2x1bW5zJiYhMT09PW87KTA9PT10aGlzLmdldCh0LGUpP2UrKzoxPT09dGhpcy5nZXQodCxlKSYmZT5yPyhvPSEwLHI9ZSk6KG49ITEsbz0hMCk7dCsrfXJldHVybiBufWlzUmVkdWNlZEVjaGVsb25Gb3JtKCl7bGV0IHQ9MCxlPTAscj0tMSxuPSEwLG89ITE7Zm9yKDt0PHRoaXMucm93cyYmbjspe2ZvcihlPTAsbz0hMTtlPHRoaXMuY29sdW1ucyYmITE9PT1vOykwPT09dGhpcy5nZXQodCxlKT9lKys6MT09PXRoaXMuZ2V0KHQsZSkmJmU+cj8obz0hMCxyPWUpOihuPSExLG89ITApO2ZvcihsZXQgcj1lKzE7cjx0aGlzLnJvd3M7cisrKTAhPT10aGlzLmdldCh0LHIpJiYobj0hMSk7dCsrfXJldHVybiBufWVjaGVsb25Gb3JtKCl7bGV0IHQ9dGhpcy5jbG9uZSgpLGU9MCxyPTA7Zm9yKDtlPHQucm93cyYmcjx0LmNvbHVtbnM7KXtsZXQgbj1lO2ZvcihsZXQgbz1lO288dC5yb3dzO28rKyl0LmdldChvLHIpPnQuZ2V0KG4scikmJihuPW8pO2lmKDA9PT10LmdldChuLHIpKXIrKztlbHNle3Quc3dhcFJvd3MoZSxuKTtsZXQgbz10LmdldChlLHIpO2ZvcihsZXQgbj1yO248dC5jb2x1bW5zO24rKyl0LnNldChlLG4sdC5nZXQoZSxuKS9vKTtmb3IobGV0IG49ZSsxO248dC5yb3dzO24rKyl7bGV0IG89dC5nZXQobixyKS90LmdldChlLHIpO3Quc2V0KG4sciwwKTtmb3IobGV0IHM9cisxO3M8dC5jb2x1bW5zO3MrKyl0LnNldChuLHMsdC5nZXQobixzKS10LmdldChlLHMpKm8pfWUrKyxyKyt9fXJldHVybiB0fXJlZHVjZWRFY2hlbG9uRm9ybSgpe2xldCB0PXRoaXMuZWNoZWxvbkZvcm0oKSxlPXQuY29sdW1ucyxyPXQucm93cyxuPXItMTtmb3IoO24+PTA7KWlmKDA9PT10Lm1heFJvdyhuKSluLS07ZWxzZXtsZXQgbz0wLHM9ITE7Zm9yKDtvPHImJiExPT09czspMT09PXQuZ2V0KG4sbyk/cz0hMDpvKys7Zm9yKGxldCByPTA7cjxuO3IrKyl7bGV0IHM9dC5nZXQocixvKTtmb3IobGV0IGk9bztpPGU7aSsrKXtsZXQgZT10LmdldChyLGkpLXMqdC5nZXQobixpKTt0LnNldChyLGksZSl9fW4tLX1yZXR1cm4gdH1zZXQoKXt0aHJvdyBuZXcgRXJyb3IoInNldCBtZXRob2QgaXMgdW5pbXBsZW1lbnRlZCIpfWdldCgpe3Rocm93IG5ldyBFcnJvcigiZ2V0IG1ldGhvZCBpcyB1bmltcGxlbWVudGVkIil9cmVwZWF0KHQ9e30pe2lmKCJvYmplY3QiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7cm93czplPTEsY29sdW1uczpyPTF9PXQ7aWYoIU51bWJlci5pc0ludGVnZXIoZSl8fGU8PTApdGhyb3cgbmV3IFR5cGVFcnJvcigicm93cyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHIpfHxyPD0wKXRocm93IG5ldyBUeXBlRXJyb3IoImNvbHVtbnMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTtsZXQgbj1uZXcgVmUodGhpcy5yb3dzKmUsdGhpcy5jb2x1bW5zKnIpO2ZvcihsZXQgdD0wO3Q8ZTt0KyspZm9yKGxldCBlPTA7ZTxyO2UrKyluLnNldFN1Yk1hdHJpeCh0aGlzLHRoaXMucm93cyp0LHRoaXMuY29sdW1ucyplKTtyZXR1cm4gbn1maWxsKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHQpO3JldHVybiB0aGlzfW5lZygpe3JldHVybiB0aGlzLm11bFMoLTEpfWdldFJvdyh0KXtBZSh0aGlzLHQpO2xldCBlPVtdO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyllLnB1c2godGhpcy5nZXQodCxyKSk7cmV0dXJuIGV9Z2V0Um93VmVjdG9yKHQpe3JldHVybiBWZS5yb3dWZWN0b3IodGhpcy5nZXRSb3codCkpfXNldFJvdyh0LGUpe0FlKHRoaXMsdCksZT1SZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldCh0LHIsZVtyXSk7cmV0dXJuIHRoaXN9c3dhcFJvd3ModCxlKXtBZSh0aGlzLHQpLEFlKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXtsZXQgbj10aGlzLmdldCh0LHIpO3RoaXMuc2V0KHQscix0aGlzLmdldChlLHIpKSx0aGlzLnNldChlLHIsbil9cmV0dXJuIHRoaXN9Z2V0Q29sdW1uKHQpe0NlKHRoaXMsdCk7bGV0IGU9W107Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKWUucHVzaCh0aGlzLmdldChyLHQpKTtyZXR1cm4gZX1nZXRDb2x1bW5WZWN0b3IodCl7cmV0dXJuIFZlLmNvbHVtblZlY3Rvcih0aGlzLmdldENvbHVtbih0KSl9c2V0Q29sdW1uKHQsZSl7Q2UodGhpcyx0KSxlPUllKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXRoaXMuc2V0KHIsdCxlW3JdKTtyZXR1cm4gdGhpc31zd2FwQ29sdW1ucyh0LGUpe0NlKHRoaXMsdCksQ2UodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspe2xldCBuPXRoaXMuZ2V0KHIsdCk7dGhpcy5zZXQocix0LHRoaXMuZ2V0KHIsZSkpLHRoaXMuc2V0KHIsZSxuKX1yZXR1cm4gdGhpc31hZGRSb3dWZWN0b3IodCl7dD1SZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdFtyXSk7cmV0dXJuIHRoaXN9c3ViUm93VmVjdG9yKHQpe3Q9UmUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXRbcl0pO3JldHVybiB0aGlzfW11bFJvd1ZlY3Rvcih0KXt0PVJlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0W3JdKTtyZXR1cm4gdGhpc31kaXZSb3dWZWN0b3IodCl7dD1SZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdFtyXSk7cmV0dXJuIHRoaXN9YWRkQ29sdW1uVmVjdG9yKHQpe3Q9SWUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3RbZV0pO3JldHVybiB0aGlzfXN1YkNvbHVtblZlY3Rvcih0KXt0PUllKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10W2VdKTtyZXR1cm4gdGhpc31tdWxDb2x1bW5WZWN0b3IodCl7dD1JZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdFtlXSk7cmV0dXJuIHRoaXN9ZGl2Q29sdW1uVmVjdG9yKHQpe3Q9SWUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3RbZV0pO3JldHVybiB0aGlzfW11bFJvdyh0LGUpe0FlKHRoaXMsdCk7Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KHQscix0aGlzLmdldCh0LHIpKmUpO3JldHVybiB0aGlzfW11bENvbHVtbih0LGUpe0NlKHRoaXMsdCk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXRoaXMuc2V0KHIsdCx0aGlzLmdldChyLHQpKmUpO3JldHVybiB0aGlzfW1heCgpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IHQ9dGhpcy5nZXQoMCwwKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik+dCYmKHQ9dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9bWF4SW5kZXgoKXtGZSh0aGlzKTtsZXQgdD10aGlzLmdldCgwLDApLGU9WzAsMF07Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLmdldChyLG4pPnQmJih0PXRoaXMuZ2V0KHIsbiksZVswXT1yLGVbMV09bik7cmV0dXJuIGV9bWluKCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgdD10aGlzLmdldCgwLDApO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQoZSxyKTx0JiYodD10aGlzLmdldChlLHIpKTtyZXR1cm4gdH1taW5JbmRleCgpe0ZlKHRoaXMpO2xldCB0PXRoaXMuZ2V0KDAsMCksZT1bMCwwXTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuZ2V0KHIsbik8dCYmKHQ9dGhpcy5nZXQocixuKSxlWzBdPXIsZVsxXT1uKTtyZXR1cm4gZX1tYXhSb3codCl7aWYoQWUodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KHQsMCk7Zm9yKGxldCByPTE7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KHQscik+ZSYmKGU9dGhpcy5nZXQodCxyKSk7cmV0dXJuIGV9bWF4Um93SW5kZXgodCl7QWUodGhpcyx0KSxGZSh0aGlzKTtsZXQgZT10aGlzLmdldCh0LDApLHI9W3QsMF07Zm9yKGxldCBuPTE7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuZ2V0KHQsbik+ZSYmKGU9dGhpcy5nZXQodCxuKSxyWzFdPW4pO3JldHVybiByfW1pblJvdyh0KXtpZihBZSh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQodCwwKTtmb3IobGV0IHI9MTtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQodCxyKTxlJiYoZT10aGlzLmdldCh0LHIpKTtyZXR1cm4gZX1taW5Sb3dJbmRleCh0KXtBZSh0aGlzLHQpLEZlKHRoaXMpO2xldCBlPXRoaXMuZ2V0KHQsMCkscj1bdCwwXTtmb3IobGV0IG49MTtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5nZXQodCxuKTxlJiYoZT10aGlzLmdldCh0LG4pLHJbMV09bik7cmV0dXJuIHJ9bWF4Q29sdW1uKHQpe2lmKENlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCgwLHQpO2ZvcihsZXQgcj0xO3I8dGhpcy5yb3dzO3IrKyl0aGlzLmdldChyLHQpPmUmJihlPXRoaXMuZ2V0KHIsdCkpO3JldHVybiBlfW1heENvbHVtbkluZGV4KHQpe0NlKHRoaXMsdCksRmUodGhpcyk7bGV0IGU9dGhpcy5nZXQoMCx0KSxyPVswLHRdO2ZvcihsZXQgbj0xO248dGhpcy5yb3dzO24rKyl0aGlzLmdldChuLHQpPmUmJihlPXRoaXMuZ2V0KG4sdCksclswXT1uKTtyZXR1cm4gcn1taW5Db2x1bW4odCl7aWYoQ2UodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KDAsdCk7Zm9yKGxldCByPTE7cjx0aGlzLnJvd3M7cisrKXRoaXMuZ2V0KHIsdCk8ZSYmKGU9dGhpcy5nZXQocix0KSk7cmV0dXJuIGV9bWluQ29sdW1uSW5kZXgodCl7Q2UodGhpcyx0KSxGZSh0aGlzKTtsZXQgZT10aGlzLmdldCgwLHQpLHI9WzAsdF07Zm9yKGxldCBuPTE7bjx0aGlzLnJvd3M7bisrKXRoaXMuZ2V0KG4sdCk8ZSYmKGU9dGhpcy5nZXQobix0KSxyWzBdPW4pO3JldHVybiByfWRpYWcoKXtsZXQgdD1NYXRoLm1pbih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSxlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHRoaXMuZ2V0KHIscikpO3JldHVybiBlfW5vcm0odD0iZnJvYmVuaXVzIil7bGV0IGU9MDtpZigibWF4Ij09PXQpcmV0dXJuIHRoaXMubWF4KCk7aWYoImZyb2Jlbml1cyI9PT10KXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKWUrPXRoaXMuZ2V0KHQscikqdGhpcy5nZXQodCxyKTtyZXR1cm4gTWF0aC5zcXJ0KGUpfXRocm93IG5ldyBSYW5nZUVycm9yKGB1bmtub3duIG5vcm0gdHlwZTogJHt0fWApfWN1bXVsYXRpdmVTdW0oKXtsZXQgdD0wO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdCs9dGhpcy5nZXQoZSxyKSx0aGlzLnNldChlLHIsdCk7cmV0dXJuIHRoaXN9ZG90KHQpe3plLmlzTWF0cml4KHQpJiYodD10LnRvMURBcnJheSgpKTtsZXQgZT10aGlzLnRvMURBcnJheSgpO2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvcnMgZG8gbm90IGhhdmUgdGhlIHNhbWUgc2l6ZSIpO2xldCByPTA7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspcis9ZVtuXSp0W25dO3JldHVybiByfW1tdWwodCl7dD1WZS5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLnJvd3Mscj10aGlzLmNvbHVtbnMsbj10LmNvbHVtbnMsbz1uZXcgVmUoZSxuKSxzPW5ldyBGbG9hdDY0QXJyYXkocik7Zm9yKGxldCBpPTA7aTxuO2krKyl7Zm9yKGxldCBlPTA7ZTxyO2UrKylzW2VdPXQuZ2V0KGUsaSk7Zm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9MDtmb3IobGV0IG49MDtuPHI7bisrKWUrPXRoaXMuZ2V0KHQsbikqc1tuXTtvLnNldCh0LGksZSl9fXJldHVybiBvfXN0cmFzc2VuMngyKHQpe3Q9VmUuY2hlY2tNYXRyaXgodCk7bGV0IGU9bmV3IFZlKDIsMik7Y29uc3Qgcj10aGlzLmdldCgwLDApLG49dC5nZXQoMCwwKSxvPXRoaXMuZ2V0KDAsMSkscz10LmdldCgwLDEpLGk9dGhpcy5nZXQoMSwwKSx1PXQuZ2V0KDEsMCksYT10aGlzLmdldCgxLDEpLGg9dC5nZXQoMSwxKSxsPShyK2EpKihuK2gpLGM9KGkrYSkqbixmPXIqKHMtaCksbT1hKih1LW4pLGc9KHIrbykqaCxwPWwrbS1nKyhvLWEpKih1K2gpLHc9ZitnLGQ9YyttLGI9bC1jK2YrKGktcikqKG4rcyk7cmV0dXJuIGUuc2V0KDAsMCxwKSxlLnNldCgwLDEsdyksZS5zZXQoMSwwLGQpLGUuc2V0KDEsMSxiKSxlfXN0cmFzc2VuM3gzKHQpe3Q9VmUuY2hlY2tNYXRyaXgodCk7bGV0IGU9bmV3IFZlKDMsMyk7Y29uc3Qgcj10aGlzLmdldCgwLDApLG49dGhpcy5nZXQoMCwxKSxvPXRoaXMuZ2V0KDAsMikscz10aGlzLmdldCgxLDApLGk9dGhpcy5nZXQoMSwxKSx1PXRoaXMuZ2V0KDEsMiksYT10aGlzLmdldCgyLDApLGg9dGhpcy5nZXQoMiwxKSxsPXRoaXMuZ2V0KDIsMiksYz10LmdldCgwLDApLGY9dC5nZXQoMCwxKSxtPXQuZ2V0KDAsMiksZz10LmdldCgxLDApLHA9dC5nZXQoMSwxKSx3PXQuZ2V0KDEsMiksZD10LmdldCgyLDApLGI9dC5nZXQoMiwxKSx5PXQuZ2V0KDIsMiksdj0oci1zKSooLWYrcCksTT0oLXIrcytpKSooYy1mK3ApLHg9KHMraSkqKC1jK2YpLEU9cipjLFM9KC1yK2EraCkqKGMtbSt3KSxqPSgtcithKSoobS13KSxfPShhK2gpKigtYyttKSxBPSgtbytoK2wpKihwK2QtYiksQz0oby1sKSoocC1iKSxSPW8qZCxJPShoK2wpKigtZCtiKSxrPSgtbytpK3UpKih3K2QteSksTj0oby11KSoody15KSxPPShpK3UpKigtZCt5KSxGPUUrUituKmcsej0ocituK28tcy1pLWgtbCkqcCtNK3grRStBK1IrSSxUPUUrUytfKyhyK24rby1pLXUtYS1oKSp3K1IraytPLFY9ditpKigtYytmK2ctcC13LWQreSkrTStFK1IraytOLFA9ditNK3grRSt1KmIscT1SK2srTitPK3MqbSwkPUUrUytqK2gqKC1jK20rZy1wLXctZCtiKStBK0MrUixEPUErQytSK0krYSpmLFU9RStTK2orXytsKnk7cmV0dXJuIGUuc2V0KDAsMCxGKSxlLnNldCgwLDEseiksZS5zZXQoMCwyLFQpLGUuc2V0KDEsMCxWKSxlLnNldCgxLDEsUCksZS5zZXQoMSwyLHEpLGUuc2V0KDIsMCwkKSxlLnNldCgyLDEsRCksZS5zZXQoMiwyLFUpLGV9bW11bFN0cmFzc2VuKHQpe3Q9VmUuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5jbG9uZSgpLHI9ZS5yb3dzLG49ZS5jb2x1bW5zLG89dC5yb3dzLHM9dC5jb2x1bW5zO2Z1bmN0aW9uIGkodCxlLHIpe2xldCBuPXQucm93cyxvPXQuY29sdW1ucztpZihuPT09ZSYmbz09PXIpcmV0dXJuIHQ7e2xldCBuPXplLnplcm9zKGUscik7cmV0dXJuIG49bi5zZXRTdWJNYXRyaXgodCwwLDApLG59fW4hPT1vJiZjb25zb2xlLndhcm4oYE11bHRpcGx5aW5nICR7cn0geCAke259IGFuZCAke299IHggJHtzfSBtYXRyaXg6IGRpbWVuc2lvbnMgZG8gbm90IG1hdGNoLmApO2xldCB1PU1hdGgubWF4KHIsbyksYT1NYXRoLm1heChuLHMpO3JldHVybiBlPWkoZSx1LGEpLGZ1bmN0aW9uIHQoZSxyLG4sbyl7aWYobjw9NTEyfHxvPD01MTIpcmV0dXJuIGUubW11bChyKTtuJTI9PTEmJm8lMj09MT8oZT1pKGUsbisxLG8rMSkscj1pKHIsbisxLG8rMSkpOm4lMj09MT8oZT1pKGUsbisxLG8pLHI9aShyLG4rMSxvKSk6byUyPT0xJiYoZT1pKGUsbixvKzEpLHI9aShyLG4sbysxKSk7bGV0IHM9cGFyc2VJbnQoZS5yb3dzLzIsMTApLHU9cGFyc2VJbnQoZS5jb2x1bW5zLzIsMTApLGE9ZS5zdWJNYXRyaXgoMCxzLTEsMCx1LTEpLGg9ci5zdWJNYXRyaXgoMCxzLTEsMCx1LTEpLGw9ZS5zdWJNYXRyaXgoMCxzLTEsdSxlLmNvbHVtbnMtMSksYz1yLnN1Yk1hdHJpeCgwLHMtMSx1LHIuY29sdW1ucy0xKSxmPWUuc3ViTWF0cml4KHMsZS5yb3dzLTEsMCx1LTEpLG09ci5zdWJNYXRyaXgocyxyLnJvd3MtMSwwLHUtMSksZz1lLnN1Yk1hdHJpeChzLGUucm93cy0xLHUsZS5jb2x1bW5zLTEpLHA9ci5zdWJNYXRyaXgocyxyLnJvd3MtMSx1LHIuY29sdW1ucy0xKSx3PXQoemUuYWRkKGEsZyksemUuYWRkKGgscCkscyx1KSxkPXQoemUuYWRkKGYsZyksaCxzLHUpLGI9dChhLHplLnN1YihjLHApLHMsdSkseT10KGcsemUuc3ViKG0saCkscyx1KSx2PXQoemUuYWRkKGEsbCkscCxzLHUpLE09dCh6ZS5zdWIoZixhKSx6ZS5hZGQoaCxjKSxzLHUpLHg9dCh6ZS5zdWIobCxnKSx6ZS5hZGQobSxwKSxzLHUpLEU9emUuYWRkKHcseSk7RS5zdWIodiksRS5hZGQoeCk7bGV0IFM9emUuYWRkKGIsdiksaj16ZS5hZGQoZCx5KSxfPXplLnN1Yih3LGQpO18uYWRkKGIpLF8uYWRkKE0pO2xldCBBPXplLnplcm9zKDIqRS5yb3dzLDIqRS5jb2x1bW5zKTtyZXR1cm4gQT1BLnNldFN1Yk1hdHJpeChFLDAsMCksQT1BLnNldFN1Yk1hdHJpeChTLEUucm93cywwKSxBPUEuc2V0U3ViTWF0cml4KGosMCxFLmNvbHVtbnMpLEE9QS5zZXRTdWJNYXRyaXgoXyxFLnJvd3MsRS5jb2x1bW5zKSxBLnN1Yk1hdHJpeCgwLG4tMSwwLG8tMSl9KGUsdD1pKHQsdSxhKSx1LGEpfXNjYWxlUm93cyh0PXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e21pbjplPTAsbWF4OnI9MX09dDtpZighTnVtYmVyLmlzRmluaXRlKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1pbiBtdXN0IGJlIGEgbnVtYmVyIik7aWYoIU51bWJlci5pc0Zpbml0ZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggbXVzdCBiZSBhIG51bWJlciIpO2lmKGU+PXIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXgiKTtsZXQgbj1uZXcgVmUodGhpcy5yb3dzLHRoaXMuY29sdW1ucyk7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKXtjb25zdCBvPXRoaXMuZ2V0Um93KHQpO28ubGVuZ3RoPjAmJnhlKG8se21pbjplLG1heDpyLG91dHB1dDpvfSksbi5zZXRSb3codCxvKX1yZXR1cm4gbn1zY2FsZUNvbHVtbnModD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46ZT0wLG1heDpyPTF9PXQ7aWYoIU51bWJlci5pc0Zpbml0ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhIG51bWJlciIpO2lmKCFOdW1iZXIuaXNGaW5pdGUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYSBudW1iZXIiKTtpZihlPj1yKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IG49bmV3IFZlKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpO2ZvcihsZXQgdD0wO3Q8dGhpcy5jb2x1bW5zO3QrKyl7Y29uc3Qgbz10aGlzLmdldENvbHVtbih0KTtvLmxlbmd0aCYmeGUobyx7bWluOmUsbWF4OnIsb3V0cHV0Om99KSxuLnNldENvbHVtbih0LG8pfXJldHVybiBufWZsaXBSb3dzKCl7Y29uc3QgdD1NYXRoLmNlaWwodGhpcy5jb2x1bW5zLzIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHQ7cisrKXtsZXQgdD10aGlzLmdldChlLHIpLG49dGhpcy5nZXQoZSx0aGlzLmNvbHVtbnMtMS1yKTt0aGlzLnNldChlLHIsbiksdGhpcy5zZXQoZSx0aGlzLmNvbHVtbnMtMS1yLHQpfXJldHVybiB0aGlzfWZsaXBDb2x1bW5zKCl7Y29uc3QgdD1NYXRoLmNlaWwodGhpcy5yb3dzLzIpO2ZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKylmb3IobGV0IHI9MDtyPHQ7cisrKXtsZXQgdD10aGlzLmdldChyLGUpLG49dGhpcy5nZXQodGhpcy5yb3dzLTEtcixlKTt0aGlzLnNldChyLGUsbiksdGhpcy5zZXQodGhpcy5yb3dzLTEtcixlLHQpfXJldHVybiB0aGlzfWtyb25lY2tlclByb2R1Y3QodCl7dD1WZS5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLnJvd3Mscj10aGlzLmNvbHVtbnMsbj10LnJvd3Msbz10LmNvbHVtbnMscz1uZXcgVmUoZSpuLHIqbyk7Zm9yKGxldCBpPTA7aTxlO2krKylmb3IobGV0IGU9MDtlPHI7ZSsrKWZvcihsZXQgcj0wO3I8bjtyKyspZm9yKGxldCB1PTA7dTxvO3UrKylzLnNldChuKmkrcixvKmUrdSx0aGlzLmdldChpLGUpKnQuZ2V0KHIsdSkpO3JldHVybiBzfWtyb25lY2tlclN1bSh0KXtpZih0PVZlLmNoZWNrTWF0cml4KHQpLCF0aGlzLmlzU3F1YXJlKCl8fCF0LmlzU3F1YXJlKCkpdGhyb3cgbmV3IEVycm9yKCJLcm9uZWNrZXIgU3VtIG5lZWRzIHR3byBTcXVhcmUgTWF0cmljZXMiKTtsZXQgZT10aGlzLnJvd3Mscj10LnJvd3Msbj10aGlzLmtyb25lY2tlclByb2R1Y3QoVmUuZXllKHIscikpLG89VmUuZXllKGUsZSkua3JvbmVja2VyUHJvZHVjdCh0KTtyZXR1cm4gbi5hZGQobyl9dHJhbnNwb3NlKCl7bGV0IHQ9bmV3IFZlKHRoaXMuY29sdW1ucyx0aGlzLnJvd3MpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5zZXQocixlLHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXNvcnRSb3dzKHQ9VGUpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl0aGlzLnNldFJvdyhlLHRoaXMuZ2V0Um93KGUpLnNvcnQodCkpO3JldHVybiB0aGlzfXNvcnRDb2x1bW5zKHQ9VGUpe2ZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldENvbHVtbihlLHRoaXMuZ2V0Q29sdW1uKGUpLnNvcnQodCkpO3JldHVybiB0aGlzfXN1Yk1hdHJpeCh0LGUscixuKXtrZSh0aGlzLHQsZSxyLG4pO2xldCBvPW5ldyBWZShlLXQrMSxuLXIrMSk7Zm9yKGxldCBzPXQ7czw9ZTtzKyspZm9yKGxldCBlPXI7ZTw9bjtlKyspby5zZXQocy10LGUtcix0aGlzLmdldChzLGUpKTtyZXR1cm4gb31zdWJNYXRyaXhSb3codCxlLHIpe2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXRoaXMuY29sdW1ucy0xKSxlPnJ8fGU8MHx8ZT49dGhpcy5jb2x1bW5zfHxyPDB8fHI+PXRoaXMuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIik7bGV0IG49bmV3IFZlKHQubGVuZ3RoLHItZSsxKTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKylmb3IobGV0IHM9ZTtzPD1yO3MrKyl7aWYodFtvXTwwfHx0W29dPj10aGlzLnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFJvdyBpbmRleCBvdXQgb2YgcmFuZ2U6ICR7dFtvXX1gKTtuLnNldChvLHMtZSx0aGlzLmdldCh0W29dLHMpKX1yZXR1cm4gbn1zdWJNYXRyaXhDb2x1bW4odCxlLHIpe2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXRoaXMucm93cy0xKSxlPnJ8fGU8MHx8ZT49dGhpcy5yb3dzfHxyPDB8fHI+PXRoaXMucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIik7bGV0IG49bmV3IFZlKHItZSsxLHQubGVuZ3RoKTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKylmb3IobGV0IHM9ZTtzPD1yO3MrKyl7aWYodFtvXTwwfHx0W29dPj10aGlzLmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYENvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2U6ICR7dFtvXX1gKTtuLnNldChzLWUsbyx0aGlzLmdldChzLHRbb10pKX1yZXR1cm4gbn1zZXRTdWJNYXRyaXgodCxlLHIpe2lmKCh0PVZlLmNoZWNrTWF0cml4KHQpKS5pc0VtcHR5KCkpcmV0dXJuIHRoaXM7a2UodGhpcyxlLGUrdC5yb3dzLTEscixyK3QuY29sdW1ucy0xKTtmb3IobGV0IG49MDtuPHQucm93cztuKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXRoaXMuc2V0KGUrbixyK28sdC5nZXQobixvKSk7cmV0dXJuIHRoaXN9c2VsZWN0aW9uKHQsZSl7IWZ1bmN0aW9uKHQsZSl7aWYoIXllKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoInJvdyBpbmRpY2VzIG11c3QgYmUgYW4gYXJyYXkiKTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdPDB8fGVbcl0+PXQucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigicm93IGluZGljZXMgYXJlIG91dCBvZiByYW5nZSIpfSh0aGlzLHQpLGZ1bmN0aW9uKHQsZSl7aWYoIXllKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoImNvbHVtbiBpbmRpY2VzIG11c3QgYmUgYW4gYXJyYXkiKTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdPDB8fGVbcl0+PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiY29sdW1uIGluZGljZXMgYXJlIG91dCBvZiByYW5nZSIpfSh0aGlzLGUpO2xldCByPW5ldyBWZSh0Lmxlbmd0aCxlLmxlbmd0aCk7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2xldCBvPXRbbl07Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCBzPWVbdF07ci5zZXQobix0LHRoaXMuZ2V0KG8scykpfX1yZXR1cm4gcn10cmFjZSgpe2xldCB0PU1hdGgubWluKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpLGU9MDtmb3IobGV0IHI9MDtyPHQ7cisrKWUrPXRoaXMuZ2V0KHIscik7cmV0dXJuIGV9Y2xvbmUoKXtsZXQgdD1uZXcgVmUodGhpcy5yb3dzLHRoaXMuY29sdW1ucyk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LnNldChlLHIsdGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9c3VtKHQpe3N3aXRjaCh0KXtjYXNlInJvdyI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPU5lKHQucm93cyk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgbj0wO248dC5jb2x1bW5zOysrbillW3JdKz10LmdldChyLG4pO3JldHVybiBlfSh0aGlzKTtjYXNlImNvbHVtbiI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPU5lKHQuY29sdW1ucyk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgbj0wO248dC5jb2x1bW5zOysrbillW25dKz10LmdldChyLG4pO3JldHVybiBlfSh0aGlzKTtjYXNlIHZvaWQgMDpyZXR1cm4gZnVuY3Rpb24odCl7bGV0IGU9MDtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKWUrPXQuZ2V0KHIsbik7cmV0dXJuIGV9KHRoaXMpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1wcm9kdWN0KHQpe3N3aXRjaCh0KXtjYXNlInJvdyI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPU5lKHQucm93cywxKTtmb3IobGV0IHI9MDtyPHQucm93czsrK3IpZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7KytuKWVbcl0qPXQuZ2V0KHIsbik7cmV0dXJuIGV9KHRoaXMpO2Nhc2UiY29sdW1uIjpyZXR1cm4gZnVuY3Rpb24odCl7bGV0IGU9TmUodC5jb2x1bW5zLDEpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IG49MDtuPHQuY29sdW1uczsrK24pZVtuXSo9dC5nZXQocixuKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSB2b2lkIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPTE7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyllKj10LmdldChyLG4pO3JldHVybiBlfSh0aGlzKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19bWVhbih0KXtjb25zdCBlPXRoaXMuc3VtKHQpO3N3aXRjaCh0KXtjYXNlInJvdyI6Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWVbdF0vPXRoaXMuY29sdW1ucztyZXR1cm4gZTtjYXNlImNvbHVtbiI6Zm9yKGxldCB0PTA7dDx0aGlzLmNvbHVtbnM7dCsrKWVbdF0vPXRoaXMucm93cztyZXR1cm4gZTtjYXNlIHZvaWQgMDpyZXR1cm4gZS90aGlzLnNpemU7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXZhcmlhbmNlKHQsZT17fSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3VuYmlhc2VkOnI9ITAsbWVhbjpuPXRoaXMubWVhbih0KX09ZTtpZigiYm9vbGVhbiIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoInVuYmlhc2VkIG11c3QgYmUgYSBib29sZWFuIik7c3dpdGNoKHQpe2Nhc2Uicm93IjppZigheWUobikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBuPXQucm93cyxvPXQuY29sdW1ucyxzPVtdO2ZvcihsZXQgaT0wO2k8bjtpKyspe2xldCBuPTAsdT0wLGE9MDtmb3IobGV0IGU9MDtlPG87ZSsrKWE9dC5nZXQoaSxlKS1yW2ldLG4rPWEsdSs9YSphO2U/cy5wdXNoKCh1LW4qbi9vKS8oby0xKSk6cy5wdXNoKCh1LW4qbi9vKS9vKX1yZXR1cm4gc30odGhpcyxyLG4pO2Nhc2UiY29sdW1uIjppZigheWUobikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBuPXQucm93cyxvPXQuY29sdW1ucyxzPVtdO2ZvcihsZXQgaT0wO2k8bztpKyspe2xldCBvPTAsdT0wLGE9MDtmb3IobGV0IGU9MDtlPG47ZSsrKWE9dC5nZXQoZSxpKS1yW2ldLG8rPWEsdSs9YSphO2U/cy5wdXNoKCh1LW8qby9uKS8obi0xKSk6cy5wdXNoKCh1LW8qby9uKS9uKX1yZXR1cm4gc30odGhpcyxyLG4pO2Nhc2Ugdm9pZCAwOmlmKCJudW1iZXIiIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJtZWFuIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe2NvbnN0IG49dC5yb3dzLG89dC5jb2x1bW5zLHM9bipvO2xldCBpPTAsdT0wLGE9MDtmb3IobGV0IGU9MDtlPG47ZSsrKWZvcihsZXQgbj0wO248bztuKyspYT10LmdldChlLG4pLXIsaSs9YSx1Kz1hKmE7cmV0dXJuIGU/KHUtaSppL3MpLyhzLTEpOih1LWkqaS9zKS9zfSh0aGlzLHIsbik7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXN0YW5kYXJkRGV2aWF0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKTtjb25zdCByPXRoaXMudmFyaWFuY2UodCxlKTtpZih2b2lkIDA9PT10KXJldHVybiBNYXRoLnNxcnQocik7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0Kyspclt0XT1NYXRoLnNxcnQoclt0XSk7cmV0dXJuIHJ9Y2VudGVyKHQsZT17fSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e2NlbnRlcjpyPXRoaXMubWVhbih0KX09ZTtzd2l0Y2godCl7Y2FzZSJyb3ciOmlmKCF5ZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspdC5zZXQocixuLHQuZ2V0KHIsbiktZVtyXSl9KHRoaXMsciksdGhpcztjYXNlImNvbHVtbiI6aWYoIXllKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoImNlbnRlciBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyl0LnNldChyLG4sdC5nZXQocixuKS1lW25dKX0odGhpcyxyKSx0aGlzO2Nhc2Ugdm9pZCAwOmlmKCJudW1iZXIiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspdC5zZXQocixuLHQuZ2V0KHIsbiktZSl9KHRoaXMsciksdGhpcztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19c2NhbGUodCxlPXt9KXtpZigib2JqZWN0Ij09dHlwZW9mIHQmJihlPXQsdD12b2lkIDApLCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7bGV0IHI9ZS5zY2FsZTtzd2l0Y2godCl7Y2FzZSJyb3ciOmlmKHZvaWQgMD09PXIpcj1mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKyl7bGV0IG49MDtmb3IobGV0IGU9MDtlPHQuY29sdW1ucztlKyspbis9TWF0aC5wb3codC5nZXQocixlKSwyKS8odC5jb2x1bW5zLTEpO2UucHVzaChNYXRoLnNxcnQobikpfXJldHVybiBlfSh0aGlzKTtlbHNlIGlmKCF5ZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzY2FsZSBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyl0LnNldChyLG4sdC5nZXQocixuKS9lW3JdKX0odGhpcyxyKSx0aGlzO2Nhc2UiY29sdW1uIjppZih2b2lkIDA9PT1yKXI9ZnVuY3Rpb24odCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQuY29sdW1ucztyKyspe2xldCBuPTA7Zm9yKGxldCBlPTA7ZTx0LnJvd3M7ZSsrKW4rPU1hdGgucG93KHQuZ2V0KGUsciksMikvKHQucm93cy0xKTtlLnB1c2goTWF0aC5zcXJ0KG4pKX1yZXR1cm4gZX0odGhpcyk7ZWxzZSBpZigheWUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigic2NhbGUgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspdC5zZXQocixuLHQuZ2V0KHIsbikvZVtuXSl9KHRoaXMsciksdGhpcztjYXNlIHZvaWQgMDppZih2b2lkIDA9PT1yKXI9ZnVuY3Rpb24odCl7Y29uc3QgZT10LnNpemUtMTtsZXQgcj0wO2ZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKylmb3IobGV0IG89MDtvPHQucm93cztvKyspcis9TWF0aC5wb3codC5nZXQobyxuKSwyKS9lO3JldHVybiBNYXRoLnNxcnQocil9KHRoaXMpO2Vsc2UgaWYoIm51bWJlciIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKXQuc2V0KHIsbix0LmdldChyLG4pL2UpfSh0aGlzLHIpLHRoaXM7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXRvU3RyaW5nKHQpe3JldHVybiBqZSh0aGlzLHQpfX1mdW5jdGlvbiBUZSh0LGUpe3JldHVybiB0LWV9emUucHJvdG90eXBlLmtsYXNzPSJNYXRyaXgiLCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiYoemUucHJvdG90eXBlW1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tIildPWZ1bmN0aW9uKCl7cmV0dXJuIGplKHRoaXMpfSksemUucmFuZG9tPXplLnJhbmQsemUucmFuZG9tSW50PXplLnJhbmRJbnQsemUuZGlhZ29uYWw9emUuZGlhZyx6ZS5wcm90b3R5cGUuZGlhZ29uYWw9emUucHJvdG90eXBlLmRpYWcsemUuaWRlbnRpdHk9emUuZXllLHplLnByb3RvdHlwZS5uZWdhdGU9emUucHJvdG90eXBlLm5lZyx6ZS5wcm90b3R5cGUudGVuc29yUHJvZHVjdD16ZS5wcm90b3R5cGUua3JvbmVja2VyUHJvZHVjdDtjbGFzcyBWZSBleHRlbmRzIHple2NvbnN0cnVjdG9yKHQsZSl7aWYoc3VwZXIoKSxWZS5pc01hdHJpeCh0KSlyZXR1cm4gdC5jbG9uZSgpO2lmKE51bWJlci5pc0ludGVnZXIodCkmJnQ+PTApe2lmKHRoaXMuZGF0YT1bXSwhKE51bWJlci5pc0ludGVnZXIoZSkmJmU+PTApKXRocm93IG5ldyBUeXBlRXJyb3IoIm5Db2x1bW5zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7Zm9yKGxldCByPTA7cjx0O3IrKyl0aGlzLmRhdGEucHVzaChuZXcgRmxvYXQ2NEFycmF5KGUpKX1lbHNle2lmKCF5ZSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIG9yIGFuIGFycmF5Iik7e2NvbnN0IHI9dDtpZigibnVtYmVyIiE9dHlwZW9mKGU9KHQ9ci5sZW5ndGgpP3JbMF0ubGVuZ3RoOjApKXRocm93IG5ldyBUeXBlRXJyb3IoIkRhdGEgbXVzdCBiZSBhIDJEIGFycmF5IHdpdGggYXQgbGVhc3Qgb25lIGVsZW1lbnQiKTt0aGlzLmRhdGE9W107Zm9yKGxldCBuPTA7bjx0O24rKyl7aWYocltuXS5sZW5ndGghPT1lKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmNvbnNpc3RlbnQgYXJyYXkgZGltZW5zaW9ucyIpO3RoaXMuZGF0YS5wdXNoKEZsb2F0NjRBcnJheS5mcm9tKHJbbl0pKX19fXRoaXMucm93cz10LHRoaXMuY29sdW1ucz1lfXNldCh0LGUscil7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXT1yLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXX1yZW1vdmVSb3codCl7cmV0dXJuIEFlKHRoaXMsdCksdGhpcy5kYXRhLnNwbGljZSh0LDEpLHRoaXMucm93cy09MSx0aGlzfWFkZFJvdyh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10LHQ9dGhpcy5yb3dzKSxBZSh0aGlzLHQsITApLGU9RmxvYXQ2NEFycmF5LmZyb20oUmUodGhpcyxlKSksdGhpcy5kYXRhLnNwbGljZSh0LDAsZSksdGhpcy5yb3dzKz0xLHRoaXN9cmVtb3ZlQ29sdW1uKHQpe0NlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXtjb25zdCByPW5ldyBGbG9hdDY0QXJyYXkodGhpcy5jb2x1bW5zLTEpO2ZvcihsZXQgbj0wO248dDtuKyspcltuXT10aGlzLmRhdGFbZV1bbl07Zm9yKGxldCBuPXQrMTtuPHRoaXMuY29sdW1ucztuKyspcltuLTFdPXRoaXMuZGF0YVtlXVtuXTt0aGlzLmRhdGFbZV09cn1yZXR1cm4gdGhpcy5jb2x1bW5zLT0xLHRoaXN9YWRkQ29sdW1uKHQsZSl7dm9pZCAwPT09ZSYmKGU9dCx0PXRoaXMuY29sdW1ucyksQ2UodGhpcyx0LCEwKSxlPUllKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXtjb25zdCBuPW5ldyBGbG9hdDY0QXJyYXkodGhpcy5jb2x1bW5zKzEpO2xldCBvPTA7Zm9yKDtvPHQ7bysrKW5bb109dGhpcy5kYXRhW3JdW29dO2ZvcihuW28rK109ZVtyXTtvPHRoaXMuY29sdW1ucysxO28rKyluW29dPXRoaXMuZGF0YVtyXVtvLTFdO3RoaXMuZGF0YVtyXT1ufXJldHVybiB0aGlzLmNvbHVtbnMrPTEsdGhpc319IWZ1bmN0aW9uKHQsZSl7dC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmFkZFModCk6dGhpcy5hZGRNKHQpfSx0LnByb3RvdHlwZS5hZGRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmFkZE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3QuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmFkZD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5hZGQocil9LHQucHJvdG90eXBlLnN1Yj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5zdWJTKHQpOnRoaXMuc3ViTSh0KX0sdC5wcm90b3R5cGUuc3ViUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5zdWJNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5zdWI9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuc3ViKHIpfSx0LnByb3RvdHlwZS5zdWJ0cmFjdD10LnByb3RvdHlwZS5zdWIsdC5wcm90b3R5cGUuc3VidHJhY3RTPXQucHJvdG90eXBlLnN1YlMsdC5wcm90b3R5cGUuc3VidHJhY3RNPXQucHJvdG90eXBlLnN1Yk0sdC5zdWJ0cmFjdD10LnN1Yix0LnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMubXVsUyh0KTp0aGlzLm11bE0odCl9LHQucHJvdG90eXBlLm11bFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubXVsTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQubXVsPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLm11bChyKX0sdC5wcm90b3R5cGUubXVsdGlwbHk9dC5wcm90b3R5cGUubXVsLHQucHJvdG90eXBlLm11bHRpcGx5Uz10LnByb3RvdHlwZS5tdWxTLHQucHJvdG90eXBlLm11bHRpcGx5TT10LnByb3RvdHlwZS5tdWxNLHQubXVsdGlwbHk9dC5tdWwsdC5wcm90b3R5cGUuZGl2PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmRpdlModCk6dGhpcy5kaXZNKHQpfSx0LnByb3RvdHlwZS5kaXZTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmRpdk09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3QuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmRpdj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5kaXYocil9LHQucHJvdG90eXBlLmRpdmlkZT10LnByb3RvdHlwZS5kaXYsdC5wcm90b3R5cGUuZGl2aWRlUz10LnByb3RvdHlwZS5kaXZTLHQucHJvdG90eXBlLmRpdmlkZU09dC5wcm90b3R5cGUuZGl2TSx0LmRpdmlkZT10LmRpdix0LnByb3RvdHlwZS5tb2Q9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMubW9kUyh0KTp0aGlzLm1vZE0odCl9LHQucHJvdG90eXBlLm1vZFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSV0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubW9kTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikldC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQubW9kPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLm1vZChyKX0sdC5wcm90b3R5cGUubW9kdWx1cz10LnByb3RvdHlwZS5tb2QsdC5wcm90b3R5cGUubW9kdWx1c1M9dC5wcm90b3R5cGUubW9kUyx0LnByb3RvdHlwZS5tb2R1bHVzTT10LnByb3RvdHlwZS5tb2RNLHQubW9kdWx1cz10Lm1vZCx0LnByb3RvdHlwZS5hbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuYW5kUyh0KTp0aGlzLmFuZE0odCl9LHQucHJvdG90eXBlLmFuZFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSZ0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuYW5kTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikmdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuYW5kPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmFuZChyKX0sdC5wcm90b3R5cGUub3I9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMub3JTKHQpOnRoaXMub3JNKHQpfSx0LnByb3RvdHlwZS5vclM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKXx0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUub3JNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKXx0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5vcj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5vcihyKX0sdC5wcm90b3R5cGUueG9yPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnhvclModCk6dGhpcy54b3JNKHQpfSx0LnByb3RvdHlwZS54b3JTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciledCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnhvck09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpXnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lnhvcj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS54b3Iocil9LHQucHJvdG90eXBlLmxlZnRTaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5sZWZ0U2hpZnRTKHQpOnRoaXMubGVmdFNoaWZ0TSh0KX0sdC5wcm90b3R5cGUubGVmdFNoaWZ0Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPDx0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubGVmdFNoaWZ0TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik8PHQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmxlZnRTaGlmdD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5sZWZ0U2hpZnQocil9LHQucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdFModCk6dGhpcy5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0TSh0KX0sdC5wcm90b3R5cGUuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0KHIpfSx0LnByb3RvdHlwZS5yaWdodFNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnJpZ2h0U2hpZnRTKHQpOnRoaXMucmlnaHRTaGlmdE0odCl9LHQucHJvdG90eXBlLnJpZ2h0U2hpZnRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+Pj50KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUucmlnaHRTaGlmdE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj4+dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQucmlnaHRTaGlmdD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5yaWdodFNoaWZ0KHIpfSx0LnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnQ9dC5wcm90b3R5cGUucmlnaHRTaGlmdCx0LnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnRTPXQucHJvdG90eXBlLnJpZ2h0U2hpZnRTLHQucHJvdG90eXBlLnplcm9GaWxsUmlnaHRTaGlmdE09dC5wcm90b3R5cGUucmlnaHRTaGlmdE0sdC56ZXJvRmlsbFJpZ2h0U2hpZnQ9dC5yaWdodFNoaWZ0LHQucHJvdG90eXBlLm5vdD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLH50aGlzLmdldCh0LGUpKTtyZXR1cm4gdGhpc30sdC5ub3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLm5vdCgpfSx0LnByb3RvdHlwZS5hYnM9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFicyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYWJzPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hYnMoKX0sdC5wcm90b3R5cGUuYWNvcz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWNvcyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYWNvcz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYWNvcygpfSx0LnByb3RvdHlwZS5hY29zaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWNvc2godGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFjb3NoPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hY29zaCgpfSx0LnByb3RvdHlwZS5hc2luPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hc2luKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hc2luPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hc2luKCl9LHQucHJvdG90eXBlLmFzaW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hc2luaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXNpbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFzaW5oKCl9LHQucHJvdG90eXBlLmF0YW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmF0YW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmF0YW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmF0YW4oKX0sdC5wcm90b3R5cGUuYXRhbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmF0YW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hdGFuaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXRhbmgoKX0sdC5wcm90b3R5cGUuY2JydD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2JydCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY2JydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY2JydCgpfSx0LnByb3RvdHlwZS5jZWlsPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jZWlsKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jZWlsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jZWlsKCl9LHQucHJvdG90eXBlLmNsejMyPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jbHozMih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY2x6MzI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNsejMyKCl9LHQucHJvdG90eXBlLmNvcz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY29zKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jb3M9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNvcygpfSx0LnByb3RvdHlwZS5jb3NoPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jb3NoKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jb3NoPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jb3NoKCl9LHQucHJvdG90eXBlLmV4cD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZXhwKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5leHA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmV4cCgpfSx0LnByb3RvdHlwZS5leHBtMT1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZXhwbTEodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmV4cG0xPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5leHBtMSgpfSx0LnByb3RvdHlwZS5mbG9vcj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZmxvb3IodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmZsb29yPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5mbG9vcigpfSx0LnByb3RvdHlwZS5mcm91bmQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmZyb3VuZCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5mcm91bmQoKX0sdC5wcm90b3R5cGUubG9nPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2codGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nKCl9LHQucHJvdG90eXBlLmxvZzFwPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cxcCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMXA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZzFwKCl9LHQucHJvdG90eXBlLmxvZzEwPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cxMCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMTA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZzEwKCl9LHQucHJvdG90eXBlLmxvZzI9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZzIodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZzI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZzIoKX0sdC5wcm90b3R5cGUucm91bmQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnJvdW5kKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkucm91bmQoKX0sdC5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2lnbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc2lnbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc2lnbigpfSx0LnByb3RvdHlwZS5zaW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc2luPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zaW4oKX0sdC5wcm90b3R5cGUuc2luaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2luaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc2luaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc2luaCgpfSx0LnByb3RvdHlwZS5zcXJ0PWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zcXJ0KHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zcXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zcXJ0KCl9LHQucHJvdG90eXBlLnRhbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudGFuKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC50YW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnRhbigpfSx0LnByb3RvdHlwZS50YW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50YW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC50YW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS50YW5oKCl9LHQucHJvdG90eXBlLnRydW5jPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50cnVuYyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQudHJ1bmM9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnRydW5jKCl9LHQucG93PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnBvdyhyKX0sdC5wcm90b3R5cGUucG93PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnBvd1ModCk6dGhpcy5wb3dNKHQpfSx0LnByb3RvdHlwZS5wb3dTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLE1hdGgucG93KHRoaXMuZ2V0KGUsciksdCkpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5wb3dNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsTWF0aC5wb3codGhpcy5nZXQoZSxyKSx0LmdldChlLHIpKSk7cmV0dXJuIHRoaXN9fSh6ZSxWZSk7Y2xhc3MgUGUgZXh0ZW5kcyB6ZXtjb25zdHJ1Y3Rvcih0LGUscil7c3VwZXIoKSx0aGlzLm1hdHJpeD10LHRoaXMucm93cz1lLHRoaXMuY29sdW1ucz1yfX1jbGFzcyBxZSBleHRlbmRzIFBle2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsdC5jb2x1bW5zLHQucm93cyl9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KGUsdCxyKSx0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQoZSx0KX19Y2xhc3MgJGUgZXh0ZW5kcyB6ZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuZGF0YT10LHRoaXMucm93cz10Lmxlbmd0aCx0aGlzLmNvbHVtbnM9dFswXS5sZW5ndGh9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdPXIsdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdfX1mdW5jdGlvbiBEZSh0LGUpe2xldCByPTA7cmV0dXJuIE1hdGguYWJzKHQpPk1hdGguYWJzKGUpPyhyPWUvdCxNYXRoLmFicyh0KSpNYXRoLnNxcnQoMStyKnIpKTowIT09ZT8ocj10L2UsTWF0aC5hYnMoZSkqTWF0aC5zcXJ0KDErcipyKSk6MH1jbGFzcyBVZXtjb25zdHJ1Y3Rvcih0LGU9e30pe2lmKCh0PSRlLmNoZWNrTWF0cml4KHQpKS5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggbXVzdCBiZSBub24tZW1wdHkiKTtsZXQgcj10LnJvd3Msbj10LmNvbHVtbnM7Y29uc3R7Y29tcHV0ZUxlZnRTaW5ndWxhclZlY3RvcnM6bz0hMCxjb21wdXRlUmlnaHRTaW5ndWxhclZlY3RvcnM6cz0hMCxhdXRvVHJhbnNwb3NlOmk9ITF9PWU7bGV0IHUsYT1Cb29sZWFuKG8pLGg9Qm9vbGVhbihzKSxsPSExO2lmKHI8bilpZihpKXt1PXQudHJhbnNwb3NlKCkscj11LnJvd3Msbj11LmNvbHVtbnMsbD0hMDtsZXQgZT1hO2E9aCxoPWV9ZWxzZSB1PXQuY2xvbmUoKSxjb25zb2xlLndhcm4oIkNvbXB1dGluZyBTVkQgb24gYSBtYXRyaXggd2l0aCBtb3JlIGNvbHVtbnMgdGhhbiByb3dzLiBDb25zaWRlciBlbmFibGluZyBhdXRvVHJhbnNwb3NlIik7ZWxzZSB1PXQuY2xvbmUoKTtsZXQgYz1NYXRoLm1pbihyLG4pLGY9TWF0aC5taW4ocisxLG4pLG09bmV3IEZsb2F0NjRBcnJheShmKSxnPW5ldyBWZShyLGMpLHA9bmV3IFZlKG4sbiksdz1uZXcgRmxvYXQ2NEFycmF5KG4pLGQ9bmV3IEZsb2F0NjRBcnJheShyKSxiPW5ldyBGbG9hdDY0QXJyYXkoZik7Zm9yKGxldCB0PTA7dDxmO3QrKyliW3RdPXQ7bGV0IHk9TWF0aC5taW4oci0xLG4pLHY9TWF0aC5tYXgoMCxNYXRoLm1pbihuLTIscikpLE09TWF0aC5tYXgoeSx2KTtmb3IobGV0IHQ9MDt0PE07dCsrKXtpZih0PHkpe21bdF09MDtmb3IobGV0IGU9dDtlPHI7ZSsrKW1bdF09RGUobVt0XSx1LmdldChlLHQpKTtpZigwIT09bVt0XSl7dS5nZXQodCx0KTwwJiYobVt0XT0tbVt0XSk7Zm9yKGxldCBlPXQ7ZTxyO2UrKyl1LnNldChlLHQsdS5nZXQoZSx0KS9tW3RdKTt1LnNldCh0LHQsdS5nZXQodCx0KSsxKX1tW3RdPS1tW3RdfWZvcihsZXQgZT10KzE7ZTxuO2UrKyl7aWYodDx5JiYwIT09bVt0XSl7bGV0IG49MDtmb3IobGV0IG89dDtvPHI7bysrKW4rPXUuZ2V0KG8sdCkqdS5nZXQobyxlKTtuPS1uL3UuZ2V0KHQsdCk7Zm9yKGxldCBvPXQ7bzxyO28rKyl1LnNldChvLGUsdS5nZXQobyxlKStuKnUuZ2V0KG8sdCkpfXdbZV09dS5nZXQodCxlKX1pZihhJiZ0PHkpZm9yKGxldCBlPXQ7ZTxyO2UrKylnLnNldChlLHQsdS5nZXQoZSx0KSk7aWYodDx2KXt3W3RdPTA7Zm9yKGxldCBlPXQrMTtlPG47ZSsrKXdbdF09RGUod1t0XSx3W2VdKTtpZigwIT09d1t0XSl7d1t0KzFdPDAmJih3W3RdPTAtd1t0XSk7Zm9yKGxldCBlPXQrMTtlPG47ZSsrKXdbZV0vPXdbdF07d1t0KzFdKz0xfWlmKHdbdF09LXdbdF0sdCsxPHImJjAhPT13W3RdKXtmb3IobGV0IGU9dCsxO2U8cjtlKyspZFtlXT0wO2ZvcihsZXQgZT10KzE7ZTxyO2UrKylmb3IobGV0IHI9dCsxO3I8bjtyKyspZFtlXSs9d1tyXSp1LmdldChlLHIpO2ZvcihsZXQgZT10KzE7ZTxuO2UrKyl7bGV0IG49LXdbZV0vd1t0KzFdO2ZvcihsZXQgbz10KzE7bzxyO28rKyl1LnNldChvLGUsdS5nZXQobyxlKStuKmRbb10pfX1pZihoKWZvcihsZXQgZT10KzE7ZTxuO2UrKylwLnNldChlLHQsd1tlXSl9fWxldCB4PU1hdGgubWluKG4scisxKTtpZih5PG4mJihtW3ldPXUuZ2V0KHkseSkpLHI8eCYmKG1beC0xXT0wKSx2KzE8eCYmKHdbdl09dS5nZXQodix4LTEpKSx3W3gtMV09MCxhKXtmb3IobGV0IHQ9eTt0PGM7dCsrKXtmb3IobGV0IGU9MDtlPHI7ZSsrKWcuc2V0KGUsdCwwKTtnLnNldCh0LHQsMSl9Zm9yKGxldCB0PXktMTt0Pj0wO3QtLSlpZigwIT09bVt0XSl7Zm9yKGxldCBlPXQrMTtlPGM7ZSsrKXtsZXQgbj0wO2ZvcihsZXQgbz10O288cjtvKyspbis9Zy5nZXQobyx0KSpnLmdldChvLGUpO249LW4vZy5nZXQodCx0KTtmb3IobGV0IG89dDtvPHI7bysrKWcuc2V0KG8sZSxnLmdldChvLGUpK24qZy5nZXQobyx0KSl9Zm9yKGxldCBlPXQ7ZTxyO2UrKylnLnNldChlLHQsLWcuZ2V0KGUsdCkpO2cuc2V0KHQsdCwxK2cuZ2V0KHQsdCkpO2ZvcihsZXQgZT0wO2U8dC0xO2UrKylnLnNldChlLHQsMCl9ZWxzZXtmb3IobGV0IGU9MDtlPHI7ZSsrKWcuc2V0KGUsdCwwKTtnLnNldCh0LHQsMSl9fWlmKGgpZm9yKGxldCB0PW4tMTt0Pj0wO3QtLSl7aWYodDx2JiYwIT09d1t0XSlmb3IobGV0IGU9dCsxO2U8bjtlKyspe2xldCByPTA7Zm9yKGxldCBvPXQrMTtvPG47bysrKXIrPXAuZ2V0KG8sdCkqcC5nZXQobyxlKTtyPS1yL3AuZ2V0KHQrMSx0KTtmb3IobGV0IG89dCsxO288bjtvKyspcC5zZXQobyxlLHAuZ2V0KG8sZSkrcipwLmdldChvLHQpKX1mb3IobGV0IGU9MDtlPG47ZSsrKXAuc2V0KGUsdCwwKTtwLnNldCh0LHQsMSl9bGV0IEU9eC0xLFM9TnVtYmVyLkVQU0lMT047Zm9yKDt4PjA7KXtsZXQgdCxlO2Zvcih0PXgtMjt0Pj0tMSYmLTEhPT10O3QtLSl7Y29uc3QgZT1OdW1iZXIuTUlOX1ZBTFVFK1MqTWF0aC5hYnMobVt0XStNYXRoLmFicyhtW3QrMV0pKTtpZihNYXRoLmFicyh3W3RdKTw9ZXx8TnVtYmVyLmlzTmFOKHdbdF0pKXt3W3RdPTA7YnJlYWt9fWlmKHQ9PT14LTIpZT00O2Vsc2V7bGV0IHI7Zm9yKHI9eC0xO3I+PXQmJnIhPT10O3ItLSl7bGV0IGU9KHIhPT14P01hdGguYWJzKHdbcl0pOjApKyhyIT09dCsxP01hdGguYWJzKHdbci0xXSk6MCk7aWYoTWF0aC5hYnMobVtyXSk8PVMqZSl7bVtyXT0wO2JyZWFrfX1yPT09dD9lPTM6cj09PXgtMT9lPTE6KGU9Mix0PXIpfXN3aXRjaCh0KyssZSl7Y2FzZSAxOntsZXQgZT13W3gtMl07d1t4LTJdPTA7Zm9yKGxldCByPXgtMjtyPj10O3ItLSl7bGV0IG89RGUobVtyXSxlKSxzPW1bcl0vbyxpPWUvbztpZihtW3JdPW8sciE9PXQmJihlPS1pKndbci0xXSx3W3ItMV09cyp3W3ItMV0pLGgpZm9yKGxldCB0PTA7dDxuO3QrKylvPXMqcC5nZXQodCxyKStpKnAuZ2V0KHQseC0xKSxwLnNldCh0LHgtMSwtaSpwLmdldCh0LHIpK3MqcC5nZXQodCx4LTEpKSxwLnNldCh0LHIsbyl9YnJlYWt9Y2FzZSAyOntsZXQgZT13W3QtMV07d1t0LTFdPTA7Zm9yKGxldCBuPXQ7bjx4O24rKyl7bGV0IG89RGUobVtuXSxlKSxzPW1bbl0vbyxpPWUvbztpZihtW25dPW8sZT0taSp3W25dLHdbbl09cyp3W25dLGEpZm9yKGxldCBlPTA7ZTxyO2UrKylvPXMqZy5nZXQoZSxuKStpKmcuZ2V0KGUsdC0xKSxnLnNldChlLHQtMSwtaSpnLmdldChlLG4pK3MqZy5nZXQoZSx0LTEpKSxnLnNldChlLG4sbyl9YnJlYWt9Y2FzZSAzOntjb25zdCBlPU1hdGgubWF4KE1hdGguYWJzKG1beC0xXSksTWF0aC5hYnMobVt4LTJdKSxNYXRoLmFicyh3W3gtMl0pLE1hdGguYWJzKG1bdF0pLE1hdGguYWJzKHdbdF0pKSxvPW1beC0xXS9lLHM9bVt4LTJdL2UsaT13W3gtMl0vZSx1PW1bdF0vZSxsPXdbdF0vZSxjPSgocytvKSoocy1vKStpKmkpLzIsZj1vKmkqKG8qaSk7bGV0IGQ9MDswPT09YyYmMD09PWZ8fChkPWM8MD8wLU1hdGguc3FydChjKmMrZik6TWF0aC5zcXJ0KGMqYytmKSxkPWYvKGMrZCkpO2xldCBiPSh1K28pKih1LW8pK2QseT11Kmw7Zm9yKGxldCBlPXQ7ZTx4LTE7ZSsrKXtsZXQgbz1EZShiLHkpOzA9PT1vJiYobz1OdW1iZXIuTUlOX1ZBTFVFKTtsZXQgcz1iL28saT15L287aWYoZSE9PXQmJih3W2UtMV09byksYj1zKm1bZV0raSp3W2VdLHdbZV09cyp3W2VdLWkqbVtlXSx5PWkqbVtlKzFdLG1bZSsxXT1zKm1bZSsxXSxoKWZvcihsZXQgdD0wO3Q8bjt0Kyspbz1zKnAuZ2V0KHQsZSkraSpwLmdldCh0LGUrMSkscC5zZXQodCxlKzEsLWkqcC5nZXQodCxlKStzKnAuZ2V0KHQsZSsxKSkscC5zZXQodCxlLG8pO2lmKG89RGUoYix5KSwwPT09byYmKG89TnVtYmVyLk1JTl9WQUxVRSkscz1iL28saT15L28sbVtlXT1vLGI9cyp3W2VdK2kqbVtlKzFdLG1bZSsxXT0taSp3W2VdK3MqbVtlKzFdLHk9aSp3W2UrMV0sd1tlKzFdPXMqd1tlKzFdLGEmJmU8ci0xKWZvcihsZXQgdD0wO3Q8cjt0Kyspbz1zKmcuZ2V0KHQsZSkraSpnLmdldCh0LGUrMSksZy5zZXQodCxlKzEsLWkqZy5nZXQodCxlKStzKmcuZ2V0KHQsZSsxKSksZy5zZXQodCxlLG8pfXdbeC0yXT1iO2JyZWFrfWNhc2UgNDppZihtW3RdPD0wJiYobVt0XT1tW3RdPDA/LW1bdF06MCxoKSlmb3IobGV0IGU9MDtlPD1FO2UrKylwLnNldChlLHQsLXAuZ2V0KGUsdCkpO2Zvcig7dDxFJiYhKG1bdF0+PW1bdCsxXSk7KXtsZXQgZT1tW3RdO2lmKG1bdF09bVt0KzFdLG1bdCsxXT1lLGgmJnQ8bi0xKWZvcihsZXQgcj0wO3I8bjtyKyspZT1wLmdldChyLHQrMSkscC5zZXQocix0KzEscC5nZXQocix0KSkscC5zZXQocix0LGUpO2lmKGEmJnQ8ci0xKWZvcihsZXQgbj0wO248cjtuKyspZT1nLmdldChuLHQrMSksZy5zZXQobix0KzEsZy5nZXQobix0KSksZy5zZXQobix0LGUpO3QrK314LS19fWlmKGwpe2xldCB0PXA7cD1nLGc9dH10aGlzLm09cix0aGlzLm49bix0aGlzLnM9bSx0aGlzLlU9Zyx0aGlzLlY9cH1zb2x2ZSh0KXtsZXQgZT10LHI9dGhpcy50aHJlc2hvbGQsbj10aGlzLnMubGVuZ3RoLG89VmUuemVyb3MobixuKTtmb3IobGV0IHQ9MDt0PG47dCsrKU1hdGguYWJzKHRoaXMuc1t0XSk8PXI/by5zZXQodCx0LDApOm8uc2V0KHQsdCwxL3RoaXMuc1t0XSk7bGV0IHM9dGhpcy5VLGk9dGhpcy5yaWdodFNpbmd1bGFyVmVjdG9ycyx1PWkubW11bChvKSxhPWkucm93cyxoPXMucm93cyxsPVZlLnplcm9zKGEsaCk7Zm9yKGxldCB0PTA7dDxhO3QrKylmb3IobGV0IGU9MDtlPGg7ZSsrKXtsZXQgcj0wO2ZvcihsZXQgbz0wO288bjtvKyspcis9dS5nZXQodCxvKSpzLmdldChlLG8pO2wuc2V0KHQsZSxyKX1yZXR1cm4gbC5tbXVsKGUpfXNvbHZlRm9yRGlhZ29uYWwodCl7cmV0dXJuIHRoaXMuc29sdmUoVmUuZGlhZyh0KSl9aW52ZXJzZSgpe2xldCB0PXRoaXMuVixlPXRoaXMudGhyZXNob2xkLHI9dC5yb3dzLG49dC5jb2x1bW5zLG89bmV3IFZlKHIsdGhpcy5zLmxlbmd0aCk7Zm9yKGxldCBzPTA7czxyO3MrKylmb3IobGV0IHI9MDtyPG47cisrKU1hdGguYWJzKHRoaXMuc1tyXSk+ZSYmby5zZXQocyxyLHQuZ2V0KHMscikvdGhpcy5zW3JdKTtsZXQgcz10aGlzLlUsaT1zLnJvd3MsdT1zLmNvbHVtbnMsYT1uZXcgVmUocixpKTtmb3IobGV0IHQ9MDt0PHI7dCsrKWZvcihsZXQgZT0wO2U8aTtlKyspe2xldCByPTA7Zm9yKGxldCBuPTA7bjx1O24rKylyKz1vLmdldCh0LG4pKnMuZ2V0KGUsbik7YS5zZXQodCxlLHIpfXJldHVybiBhfWdldCBjb25kaXRpb24oKXtyZXR1cm4gdGhpcy5zWzBdL3RoaXMuc1tNYXRoLm1pbih0aGlzLm0sdGhpcy5uKS0xXX1nZXQgbm9ybTIoKXtyZXR1cm4gdGhpcy5zWzBdfWdldCByYW5rKCl7bGV0IHQ9TWF0aC5tYXgodGhpcy5tLHRoaXMubikqdGhpcy5zWzBdKk51bWJlci5FUFNJTE9OLGU9MCxyPXRoaXMucztmb3IobGV0IG49MCxvPXIubGVuZ3RoO248bztuKyspcltuXT50JiZlKys7cmV0dXJuIGV9Z2V0IGRpYWdvbmFsKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5zKX1nZXQgdGhyZXNob2xkKCl7cmV0dXJuIE51bWJlci5FUFNJTE9OLzIqTWF0aC5tYXgodGhpcy5tLHRoaXMubikqdGhpcy5zWzBdfWdldCBsZWZ0U2luZ3VsYXJWZWN0b3JzKCl7cmV0dXJuIHRoaXMuVX1nZXQgcmlnaHRTaW5ndWxhclZlY3RvcnMoKXtyZXR1cm4gdGhpcy5WfWdldCBkaWFnb25hbE1hdHJpeCgpe3JldHVybiBWZS5kaWFnKHRoaXMucyl9fWNsYXNzIExle2NvbnN0cnVjdG9yKHQsZT17fSl7Y29uc3R7YXNzdW1lU3ltbWV0cmljOnI9ITF9PWU7aWYoISh0PSRlLmNoZWNrTWF0cml4KHQpKS5pc1NxdWFyZSgpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IGlzIG5vdCBhIHNxdWFyZSBtYXRyaXgiKTtpZih0LmlzRW1wdHkoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBtdXN0IGJlIG5vbi1lbXB0eSIpO2xldCBuLG8scz10LmNvbHVtbnMsaT1uZXcgVmUocyxzKSx1PW5ldyBGbG9hdDY0QXJyYXkocyksYT1uZXcgRmxvYXQ2NEFycmF5KHMpLGg9dCxsPSExO2lmKGw9ISFyfHx0LmlzU3ltbWV0cmljKCksbCl7Zm9yKG49MDtuPHM7bisrKWZvcihvPTA7bzxzO28rKylpLnNldChuLG8saC5nZXQobixvKSk7IWZ1bmN0aW9uKHQsZSxyLG4pe2xldCBvLHMsaSx1LGEsaCxsLGM7Zm9yKGE9MDthPHQ7YSsrKXJbYV09bi5nZXQodC0xLGEpO2Zvcih1PXQtMTt1PjA7dS0tKXtmb3IoYz0wLGk9MCxoPTA7aDx1O2grKyljKz1NYXRoLmFicyhyW2hdKTtpZigwPT09Yylmb3IoZVt1XT1yW3UtMV0sYT0wO2E8dTthKyspclthXT1uLmdldCh1LTEsYSksbi5zZXQodSxhLDApLG4uc2V0KGEsdSwwKTtlbHNle2ZvcihoPTA7aDx1O2grKylyW2hdLz1jLGkrPXJbaF0qcltoXTtmb3Iobz1yW3UtMV0scz1NYXRoLnNxcnQoaSksbz4wJiYocz0tcyksZVt1XT1jKnMsaS09bypzLHJbdS0xXT1vLXMsYT0wO2E8dTthKyspZVthXT0wO2ZvcihhPTA7YTx1O2ErKyl7Zm9yKG89clthXSxuLnNldChhLHUsbykscz1lW2FdK24uZ2V0KGEsYSkqbyxoPWErMTtoPD11LTE7aCsrKXMrPW4uZ2V0KGgsYSkqcltoXSxlW2hdKz1uLmdldChoLGEpKm87ZVthXT1zfWZvcihvPTAsYT0wO2E8dTthKyspZVthXS89aSxvKz1lW2FdKnJbYV07Zm9yKGw9by8oaStpKSxhPTA7YTx1O2ErKyllW2FdLT1sKnJbYV07Zm9yKGE9MDthPHU7YSsrKXtmb3Iobz1yW2FdLHM9ZVthXSxoPWE7aDw9dS0xO2grKyluLnNldChoLGEsbi5nZXQoaCxhKS0obyplW2hdK3MqcltoXSkpO3JbYV09bi5nZXQodS0xLGEpLG4uc2V0KHUsYSwwKX19clt1XT1pfWZvcih1PTA7dTx0LTE7dSsrKXtpZihuLnNldCh0LTEsdSxuLmdldCh1LHUpKSxuLnNldCh1LHUsMSksaT1yW3UrMV0sMCE9PWkpe2ZvcihoPTA7aDw9dTtoKyspcltoXT1uLmdldChoLHUrMSkvaTtmb3IoYT0wO2E8PXU7YSsrKXtmb3Iocz0wLGg9MDtoPD11O2grKylzKz1uLmdldChoLHUrMSkqbi5nZXQoaCxhKTtmb3IoaD0wO2g8PXU7aCsrKW4uc2V0KGgsYSxuLmdldChoLGEpLXMqcltoXSl9fWZvcihoPTA7aDw9dTtoKyspbi5zZXQoaCx1KzEsMCl9Zm9yKGE9MDthPHQ7YSsrKXJbYV09bi5nZXQodC0xLGEpLG4uc2V0KHQtMSxhLDApO24uc2V0KHQtMSx0LTEsMSksZVswXT0wfShzLGEsdSxpKSxmdW5jdGlvbih0LGUscixuKXtsZXQgbyxzLGksdSxhLGgsbCxjLGYsbSxnLHAsdyxkLGIseTtmb3IoaT0xO2k8dDtpKyspZVtpLTFdPWVbaV07ZVt0LTFdPTA7bGV0IHY9MCxNPTAseD1OdW1iZXIuRVBTSUxPTjtmb3IoaD0wO2g8dDtoKyspe2ZvcihNPU1hdGgubWF4KE0sTWF0aC5hYnMocltoXSkrTWF0aC5hYnMoZVtoXSkpLGw9aDtsPHQmJiEoTWF0aC5hYnMoZVtsXSk8PXgqTSk7KWwrKztpZihsPmgpZG97Zm9yKG89cltoXSxjPShyW2grMV0tbykvKDIqZVtoXSksZj1EZShjLDEpLGM8MCYmKGY9LWYpLHJbaF09ZVtoXS8oYytmKSxyW2grMV09ZVtoXSooYytmKSxtPXJbaCsxXSxzPW8tcltoXSxpPWgrMjtpPHQ7aSsrKXJbaV0tPXM7Zm9yKHYrPXMsYz1yW2xdLGc9MSxwPWcsdz1nLGQ9ZVtoKzFdLGI9MCx5PTAsaT1sLTE7aT49aDtpLS0pZm9yKHc9cCxwPWcseT1iLG89ZyplW2ldLHM9ZypjLGY9RGUoYyxlW2ldKSxlW2krMV09YipmLGI9ZVtpXS9mLGc9Yy9mLGM9ZypyW2ldLWIqbyxyW2krMV09cytiKihnKm8rYipyW2ldKSxhPTA7YTx0O2ErKylzPW4uZ2V0KGEsaSsxKSxuLnNldChhLGkrMSxiKm4uZ2V0KGEsaSkrZypzKSxuLnNldChhLGksZypuLmdldChhLGkpLWIqcyk7Yz0tYip5KncqZCplW2hdL20sZVtoXT1iKmMscltoXT1nKmN9d2hpbGUoTWF0aC5hYnMoZVtoXSk+eCpNKTtyW2hdPXJbaF0rdixlW2hdPTB9Zm9yKGk9MDtpPHQtMTtpKyspe2ZvcihhPWksYz1yW2ldLHU9aSsxO3U8dDt1Kyspclt1XTxjJiYoYT11LGM9clt1XSk7aWYoYSE9PWkpZm9yKHJbYV09cltpXSxyW2ldPWMsdT0wO3U8dDt1KyspYz1uLmdldCh1LGkpLG4uc2V0KHUsaSxuLmdldCh1LGEpKSxuLnNldCh1LGEsYyl9fShzLGEsdSxpKX1lbHNle2xldCB0PW5ldyBWZShzLHMpLGU9bmV3IEZsb2F0NjRBcnJheShzKTtmb3Iobz0wO288cztvKyspZm9yKG49MDtuPHM7bisrKXQuc2V0KG4sbyxoLmdldChuLG8pKTshZnVuY3Rpb24odCxlLHIsbil7bGV0IG8scyxpLHUsYSxoLGwsYz0wLGY9dC0xO2ZvcihoPWMrMTtoPD1mLTE7aCsrKXtmb3IobD0wLHU9aDt1PD1mO3UrKylsKz1NYXRoLmFicyhlLmdldCh1LGgtMSkpO2lmKDAhPT1sKXtmb3IoaT0wLHU9Zjt1Pj1oO3UtLSlyW3VdPWUuZ2V0KHUsaC0xKS9sLGkrPXJbdV0qclt1XTtmb3Iocz1NYXRoLnNxcnQoaSkscltoXT4wJiYocz0tcyksaS09cltoXSpzLHJbaF09cltoXS1zLGE9aDthPHQ7YSsrKXtmb3Iobz0wLHU9Zjt1Pj1oO3UtLSlvKz1yW3VdKmUuZ2V0KHUsYSk7Zm9yKG8vPWksdT1oO3U8PWY7dSsrKWUuc2V0KHUsYSxlLmdldCh1LGEpLW8qclt1XSl9Zm9yKHU9MDt1PD1mO3UrKyl7Zm9yKG89MCxhPWY7YT49aDthLS0pbys9clthXSplLmdldCh1LGEpO2ZvcihvLz1pLGE9aDthPD1mO2ErKyllLnNldCh1LGEsZS5nZXQodSxhKS1vKnJbYV0pfXJbaF09bCpyW2hdLGUuc2V0KGgsaC0xLGwqcyl9fWZvcih1PTA7dTx0O3UrKylmb3IoYT0wO2E8dDthKyspbi5zZXQodSxhLHU9PT1hPzE6MCk7Zm9yKGg9Zi0xO2g+PWMrMTtoLS0paWYoMCE9PWUuZ2V0KGgsaC0xKSl7Zm9yKHU9aCsxO3U8PWY7dSsrKXJbdV09ZS5nZXQodSxoLTEpO2ZvcihhPWg7YTw9ZjthKyspe2ZvcihzPTAsdT1oO3U8PWY7dSsrKXMrPXJbdV0qbi5nZXQodSxhKTtmb3Iocz1zL3JbaF0vZS5nZXQoaCxoLTEpLHU9aDt1PD1mO3UrKyluLnNldCh1LGEsbi5nZXQodSxhKStzKnJbdV0pfX19KHMsdCxlLGkpLGZ1bmN0aW9uKHQsZSxyLG4sbyl7bGV0IHMsaSx1LGEsaCxsLGMsZixtLGcscCx3LGQsYix5LHY9dC0xLE09MCx4PXQtMSxFPU51bWJlci5FUFNJTE9OLFM9MCxqPTAsXz0wLEE9MCxDPTAsUj0wLEk9MCxrPTA7Zm9yKHM9MDtzPHQ7cysrKWZvcigoczxNfHxzPngpJiYocltzXT1vLmdldChzLHMpLGVbc109MCksaT1NYXRoLm1heChzLTEsMCk7aTx0O2krKylqKz1NYXRoLmFicyhvLmdldChzLGkpKTtmb3IoO3Y+PU07KXtmb3IoYT12O2E+TSYmKFI9TWF0aC5hYnMoby5nZXQoYS0xLGEtMSkpK01hdGguYWJzKG8uZ2V0KGEsYSkpLDA9PT1SJiYoUj1qKSwhKE1hdGguYWJzKG8uZ2V0KGEsYS0xKSk8RSpSKSk7KWEtLTtpZihhPT09dilvLnNldCh2LHYsby5nZXQodix2KStTKSxyW3ZdPW8uZ2V0KHYsdiksZVt2XT0wLHYtLSxrPTA7ZWxzZSBpZihhPT09di0xKXtpZihjPW8uZ2V0KHYsdi0xKSpvLmdldCh2LTEsdiksXz0oby5nZXQodi0xLHYtMSktby5nZXQodix2KSkvMixBPV8qXytjLEk9TWF0aC5zcXJ0KE1hdGguYWJzKEEpKSxvLnNldCh2LHYsby5nZXQodix2KStTKSxvLnNldCh2LTEsdi0xLG8uZ2V0KHYtMSx2LTEpK1MpLGY9by5nZXQodix2KSxBPj0wKXtmb3IoST1fPj0wP18rSTpfLUksclt2LTFdPWYrSSxyW3ZdPXJbdi0xXSwwIT09SSYmKHJbdl09Zi1jL0kpLGVbdi0xXT0wLGVbdl09MCxmPW8uZ2V0KHYsdi0xKSxSPU1hdGguYWJzKGYpK01hdGguYWJzKEkpLF89Zi9SLEE9SS9SLEM9TWF0aC5zcXJ0KF8qXytBKkEpLF8vPUMsQS89QyxpPXYtMTtpPHQ7aSsrKUk9by5nZXQodi0xLGkpLG8uc2V0KHYtMSxpLEEqSStfKm8uZ2V0KHYsaSkpLG8uc2V0KHYsaSxBKm8uZ2V0KHYsaSktXypJKTtmb3Iocz0wO3M8PXY7cysrKUk9by5nZXQocyx2LTEpLG8uc2V0KHMsdi0xLEEqSStfKm8uZ2V0KHMsdikpLG8uc2V0KHMsdixBKm8uZ2V0KHMsdiktXypJKTtmb3Iocz1NO3M8PXg7cysrKUk9bi5nZXQocyx2LTEpLG4uc2V0KHMsdi0xLEEqSStfKm4uZ2V0KHMsdikpLG4uc2V0KHMsdixBKm4uZ2V0KHMsdiktXypJKX1lbHNlIHJbdi0xXT1mK18sclt2XT1mK18sZVt2LTFdPUksZVt2XT0tSTt2LT0yLGs9MH1lbHNle2lmKGY9by5nZXQodix2KSxtPTAsYz0wLGE8diYmKG09by5nZXQodi0xLHYtMSksYz1vLmdldCh2LHYtMSkqby5nZXQodi0xLHYpKSwxMD09PWspe2ZvcihTKz1mLHM9TTtzPD12O3MrKylvLnNldChzLHMsby5nZXQocyxzKS1mKTtSPU1hdGguYWJzKG8uZ2V0KHYsdi0xKSkrTWF0aC5hYnMoby5nZXQodi0xLHYtMikpLGY9bT0uNzUqUixjPS0uNDM3NSpSKlJ9aWYoMzA9PT1rJiYoUj0obS1mKS8yLFI9UipSK2MsUj4wKSl7Zm9yKFI9TWF0aC5zcXJ0KFIpLG08ZiYmKFI9LVIpLFI9Zi1jLygobS1mKS8yK1IpLHM9TTtzPD12O3MrKylvLnNldChzLHMsby5nZXQocyxzKS1SKTtTKz1SLGY9bT1jPS45NjR9Zm9yKGsrPTEsaD12LTI7aD49YSYmKEk9by5nZXQoaCxoKSxDPWYtSSxSPW0tSSxfPShDKlItYykvby5nZXQoaCsxLGgpK28uZ2V0KGgsaCsxKSxBPW8uZ2V0KGgrMSxoKzEpLUktQy1SLEM9by5nZXQoaCsyLGgrMSksUj1NYXRoLmFicyhfKStNYXRoLmFicyhBKStNYXRoLmFicyhDKSxfLz1SLEEvPVIsQy89UixoIT09YSkmJiEoTWF0aC5hYnMoby5nZXQoaCxoLTEpKSooTWF0aC5hYnMoQSkrTWF0aC5hYnMoQykpPEUqKE1hdGguYWJzKF8pKihNYXRoLmFicyhvLmdldChoLTEsaC0xKSkrTWF0aC5hYnMoSSkrTWF0aC5hYnMoby5nZXQoaCsxLGgrMSkpKSkpOyloLS07Zm9yKHM9aCsyO3M8PXY7cysrKW8uc2V0KHMscy0yLDApLHM+aCsyJiZvLnNldChzLHMtMywwKTtmb3IodT1oO3U8PXYtMSYmKGI9dSE9PXYtMSx1IT09aCYmKF89by5nZXQodSx1LTEpLEE9by5nZXQodSsxLHUtMSksQz1iP28uZ2V0KHUrMix1LTEpOjAsZj1NYXRoLmFicyhfKStNYXRoLmFicyhBKStNYXRoLmFicyhDKSwwIT09ZiYmKF8vPWYsQS89ZixDLz1mKSksMCE9PWYpO3UrKylpZihSPU1hdGguc3FydChfKl8rQSpBK0MqQyksXzwwJiYoUj0tUiksMCE9PVIpe2Zvcih1IT09aD9vLnNldCh1LHUtMSwtUipmKTphIT09aCYmby5zZXQodSx1LTEsLW8uZ2V0KHUsdS0xKSksXys9UixmPV8vUixtPUEvUixJPUMvUixBLz1fLEMvPV8saT11O2k8dDtpKyspXz1vLmdldCh1LGkpK0Eqby5nZXQodSsxLGkpLGImJihfKz1DKm8uZ2V0KHUrMixpKSxvLnNldCh1KzIsaSxvLmdldCh1KzIsaSktXypJKSksby5zZXQodSxpLG8uZ2V0KHUsaSktXypmKSxvLnNldCh1KzEsaSxvLmdldCh1KzEsaSktXyptKTtmb3Iocz0wO3M8PU1hdGgubWluKHYsdSszKTtzKyspXz1mKm8uZ2V0KHMsdSkrbSpvLmdldChzLHUrMSksYiYmKF8rPUkqby5nZXQocyx1KzIpLG8uc2V0KHMsdSsyLG8uZ2V0KHMsdSsyKS1fKkMpKSxvLnNldChzLHUsby5nZXQocyx1KS1fKSxvLnNldChzLHUrMSxvLmdldChzLHUrMSktXypBKTtmb3Iocz1NO3M8PXg7cysrKV89ZipuLmdldChzLHUpK20qbi5nZXQocyx1KzEpLGImJihfKz1JKm4uZ2V0KHMsdSsyKSxuLnNldChzLHUrMixuLmdldChzLHUrMiktXypDKSksbi5zZXQocyx1LG4uZ2V0KHMsdSktXyksbi5zZXQocyx1KzEsbi5nZXQocyx1KzEpLV8qQSl9fX1pZigwPT09ailyZXR1cm47Zm9yKHY9dC0xO3Y+PTA7di0tKWlmKF89clt2XSxBPWVbdl0sMD09PUEpZm9yKGE9dixvLnNldCh2LHYsMSkscz12LTE7cz49MDtzLS0pe2ZvcihjPW8uZ2V0KHMscyktXyxDPTAsaT1hO2k8PXY7aSsrKUMrPW8uZ2V0KHMsaSkqby5nZXQoaSx2KTtpZihlW3NdPDApST1jLFI9QztlbHNlIGlmKGE9cywwPT09ZVtzXT9vLnNldChzLHYsMCE9PWM/LUMvYzotQy8oRSpqKSk6KGY9by5nZXQocyxzKzEpLG09by5nZXQocysxLHMpLEE9KHJbc10tXykqKHJbc10tXykrZVtzXSplW3NdLGw9KGYqUi1JKkMpL0Esby5zZXQocyx2LGwpLG8uc2V0KHMrMSx2LE1hdGguYWJzKGYpPk1hdGguYWJzKEkpPygtQy1jKmwpL2Y6KC1SLW0qbCkvSSkpLGw9TWF0aC5hYnMoby5nZXQocyx2KSksRSpsKmw+MSlmb3IoaT1zO2k8PXY7aSsrKW8uc2V0KGksdixvLmdldChpLHYpL2wpfWVsc2UgaWYoQTwwKWZvcihhPXYtMSxNYXRoLmFicyhvLmdldCh2LHYtMSkpPk1hdGguYWJzKG8uZ2V0KHYtMSx2KSk/KG8uc2V0KHYtMSx2LTEsQS9vLmdldCh2LHYtMSkpLG8uc2V0KHYtMSx2LC0oby5nZXQodix2KS1fKS9vLmdldCh2LHYtMSkpKTooeT1CZSgwLC1vLmdldCh2LTEsdiksby5nZXQodi0xLHYtMSktXyxBKSxvLnNldCh2LTEsdi0xLHlbMF0pLG8uc2V0KHYtMSx2LHlbMV0pKSxvLnNldCh2LHYtMSwwKSxvLnNldCh2LHYsMSkscz12LTI7cz49MDtzLS0pe2ZvcihnPTAscD0wLGk9YTtpPD12O2krKylnKz1vLmdldChzLGkpKm8uZ2V0KGksdi0xKSxwKz1vLmdldChzLGkpKm8uZ2V0KGksdik7aWYoYz1vLmdldChzLHMpLV8sZVtzXTwwKUk9YyxDPWcsUj1wO2Vsc2UgaWYoYT1zLDA9PT1lW3NdPyh5PUJlKC1nLC1wLGMsQSksby5zZXQocyx2LTEseVswXSksby5zZXQocyx2LHlbMV0pKTooZj1vLmdldChzLHMrMSksbT1vLmdldChzKzEscyksdz0ocltzXS1fKSoocltzXS1fKStlW3NdKmVbc10tQSpBLGQ9MioocltzXS1fKSpBLDA9PT13JiYwPT09ZCYmKHc9RSpqKihNYXRoLmFicyhjKStNYXRoLmFicyhBKStNYXRoLmFicyhmKStNYXRoLmFicyhtKStNYXRoLmFicyhJKSkpLHk9QmUoZipDLUkqZytBKnAsZipSLUkqcC1BKmcsdyxkKSxvLnNldChzLHYtMSx5WzBdKSxvLnNldChzLHYseVsxXSksTWF0aC5hYnMoZik+TWF0aC5hYnMoSSkrTWF0aC5hYnMoQSk/KG8uc2V0KHMrMSx2LTEsKC1nLWMqby5nZXQocyx2LTEpK0Eqby5nZXQocyx2KSkvZiksby5zZXQocysxLHYsKC1wLWMqby5nZXQocyx2KS1BKm8uZ2V0KHMsdi0xKSkvZikpOih5PUJlKC1DLW0qby5nZXQocyx2LTEpLC1SLW0qby5nZXQocyx2KSxJLEEpLG8uc2V0KHMrMSx2LTEseVswXSksby5zZXQocysxLHYseVsxXSkpKSxsPU1hdGgubWF4KE1hdGguYWJzKG8uZ2V0KHMsdi0xKSksTWF0aC5hYnMoby5nZXQocyx2KSkpLEUqbCpsPjEpZm9yKGk9cztpPD12O2krKylvLnNldChpLHYtMSxvLmdldChpLHYtMSkvbCksby5zZXQoaSx2LG8uZ2V0KGksdikvbCl9Zm9yKHM9MDtzPHQ7cysrKWlmKHM8TXx8cz54KWZvcihpPXM7aTx0O2krKyluLnNldChzLGksby5nZXQocyxpKSk7Zm9yKGk9dC0xO2k+PU07aS0tKWZvcihzPU07czw9eDtzKyspe2ZvcihJPTAsdT1NO3U8PU1hdGgubWluKGkseCk7dSsrKUkrPW4uZ2V0KHMsdSkqby5nZXQodSxpKTtuLnNldChzLGksSSl9fShzLGEsdSxpLHQpfXRoaXMubj1zLHRoaXMuZT1hLHRoaXMuZD11LHRoaXMuVj1pfWdldCByZWFsRWlnZW52YWx1ZXMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmQpfWdldCBpbWFnaW5hcnlFaWdlbnZhbHVlcygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuZSl9Z2V0IGVpZ2VudmVjdG9yTWF0cml4KCl7cmV0dXJuIHRoaXMuVn1nZXQgZGlhZ29uYWxNYXRyaXgoKXtsZXQgdCxlLHI9dGhpcy5uLG49dGhpcy5lLG89dGhpcy5kLHM9bmV3IFZlKHIscik7Zm9yKHQ9MDt0PHI7dCsrKXtmb3IoZT0wO2U8cjtlKyspcy5zZXQodCxlLDApO3Muc2V0KHQsdCxvW3RdKSxuW3RdPjA/cy5zZXQodCx0KzEsblt0XSk6blt0XTwwJiZzLnNldCh0LHQtMSxuW3RdKX1yZXR1cm4gc319ZnVuY3Rpb24gQmUodCxlLHIsbil7bGV0IG8scztyZXR1cm4gTWF0aC5hYnMocik+TWF0aC5hYnMobik/KG89bi9yLHM9citvKm4sWyh0K28qZSkvcywoZS1vKnQpL3NdKToobz1yL24scz1uK28qcixbKG8qdCtlKS9zLChvKmUtdCkvc10pfWNsYXNzIEdle2NvbnN0cnVjdG9yKHQsZT17fSl7dD0kZS5jaGVja01hdHJpeCh0KTtsZXR7WTpyfT1lO2NvbnN0e3NjYWxlU2NvcmVzOm49ITEsbWF4SXRlcmF0aW9uczpvPTFlMyx0ZXJtaW5hdGlvbkNyaXRlcmlhOnM9MWUtMTB9PWU7bGV0IGk7aWYocil7aWYocj15ZShyKSYmIm51bWJlciI9PXR5cGVvZiByWzBdP1ZlLmNvbHVtblZlY3RvcihyKTokZS5jaGVja01hdHJpeChyKSxyLnJvd3MhPT10LnJvd3MpdGhyb3cgbmV3IEVycm9yKCJZIHNob3VsZCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiByb3dzIGFzIFgiKTtpPXIuZ2V0Q29sdW1uVmVjdG9yKDApfWVsc2UgaT10LmdldENvbHVtblZlY3RvcigwKTtsZXQgdSxhLGgsbCxjPTE7Zm9yKGxldCBlPTA7ZTxvJiZjPnM7ZSsrKWg9dC50cmFuc3Bvc2UoKS5tbXVsKGkpLmRpdihpLnRyYW5zcG9zZSgpLm1tdWwoaSkuZ2V0KDAsMCkpLGg9aC5kaXYoaC5ub3JtKCkpLHU9dC5tbXVsKGgpLmRpdihoLnRyYW5zcG9zZSgpLm1tdWwoaCkuZ2V0KDAsMCkpLGU+MCYmKGM9dS5jbG9uZSgpLnN1YihsKS5wb3coMikuc3VtKCkpLGw9dS5jbG9uZSgpLHI/KGE9ci50cmFuc3Bvc2UoKS5tbXVsKHUpLmRpdih1LnRyYW5zcG9zZSgpLm1tdWwodSkuZ2V0KDAsMCkpLGE9YS5kaXYoYS5ub3JtKCkpLGk9ci5tbXVsKGEpLmRpdihhLnRyYW5zcG9zZSgpLm1tdWwoYSkuZ2V0KDAsMCkpKTppPXU7aWYocil7bGV0IGU9dC50cmFuc3Bvc2UoKS5tbXVsKHUpLmRpdih1LnRyYW5zcG9zZSgpLm1tdWwodSkuZ2V0KDAsMCkpO2U9ZS5kaXYoZS5ub3JtKCkpO2xldCBuPXQuY2xvbmUoKS5zdWIodS5jbG9uZSgpLm1tdWwoZS50cmFuc3Bvc2UoKSkpLG89aS50cmFuc3Bvc2UoKS5tbXVsKHUpLmRpdih1LnRyYW5zcG9zZSgpLm1tdWwodSkuZ2V0KDAsMCkpLHM9ci5jbG9uZSgpLnN1Yih1LmNsb25lKCkubXVsUyhvLmdldCgwLDApKS5tbXVsKGEudHJhbnNwb3NlKCkpKTt0aGlzLnQ9dSx0aGlzLnA9ZS50cmFuc3Bvc2UoKSx0aGlzLnc9aC50cmFuc3Bvc2UoKSx0aGlzLnE9YSx0aGlzLnU9aSx0aGlzLnM9dS50cmFuc3Bvc2UoKS5tbXVsKHUpLHRoaXMueFJlc2lkdWFsPW4sdGhpcy55UmVzaWR1YWw9cyx0aGlzLmJldGFzPW99ZWxzZSB0aGlzLnc9aC50cmFuc3Bvc2UoKSx0aGlzLnM9dS50cmFuc3Bvc2UoKS5tbXVsKHUpLnNxcnQoKSx0aGlzLnQ9bj91LmNsb25lKCkuZGl2KHRoaXMucy5nZXQoMCwwKSk6dSx0aGlzLnhSZXNpZHVhbD10LnN1Yih1Lm1tdWwoaC50cmFuc3Bvc2UoKSkpfX1jbGFzcyBLZXtjb25zdHJ1Y3Rvcih0LGU9e30pe2lmKCEwPT09dCl7Y29uc3QgdD1lO3JldHVybiB0aGlzLmNlbnRlcj10LmNlbnRlcix0aGlzLnNjYWxlPXQuc2NhbGUsdGhpcy5tZWFucz10Lm1lYW5zLHRoaXMuc3RkZXZzPXQuc3RkZXZzLHRoaXMuVT1WZS5jaGVja01hdHJpeCh0LlUpLHRoaXMuUz10LlMsdGhpcy5SPXQuUix2b2lkKHRoaXMuZXhjbHVkZWRGZWF0dXJlcz10LmV4Y2x1ZGVkRmVhdHVyZXN8fFtdKX10PW5ldyBWZSh0KTtjb25zdHtpc0NvdmFyaWFuY2VNYXRyaXg6cj0hMSxtZXRob2Q6bj0iU1ZEIixuQ29tcE5JUEFMUzpvPTIsY2VudGVyOnM9ITAsc2NhbGU6aT0hMSxpZ25vcmVaZXJvVmFyaWFuY2U6dT0hMX09ZTtpZih0aGlzLmNlbnRlcj1zLHRoaXMuc2NhbGU9aSx0aGlzLm1lYW5zPW51bGwsdGhpcy5zdGRldnM9bnVsbCx0aGlzLmV4Y2x1ZGVkRmVhdHVyZXM9W10scil0aGlzLl9jb21wdXRlRnJvbUNvdmFyaWFuY2VNYXRyaXgodCk7ZWxzZSBzd2l0Y2godGhpcy5fYWRqdXN0KHQsdSksbil7Y2FzZSJjb3ZhcmlhbmNlTWF0cml4Ijp7Y29uc3QgZT1uZXcgcWUodCkubW11bCh0KS5kaXYodC5yb3dzLTEpO3RoaXMuX2NvbXB1dGVGcm9tQ292YXJpYW5jZU1hdHJpeChlKTticmVha31jYXNlIk5JUEFMUyI6dGhpcy5fY29tcHV0ZVdpdGhOSVBBTFModCxvKTticmVhaztjYXNlIlNWRCI6e2NvbnN0IGU9bmV3IFVlKHQse2NvbXB1dGVMZWZ0U2luZ3VsYXJWZWN0b3JzOiExLGNvbXB1dGVSaWdodFNpbmd1bGFyVmVjdG9yczohMCxhdXRvVHJhbnNwb3NlOiEwfSk7dGhpcy5VPWUucmlnaHRTaW5ndWxhclZlY3RvcnM7Y29uc3Qgcj1lLmRpYWdvbmFsLG49W107Zm9yKGNvbnN0IGUgb2YgciluLnB1c2goZSplLyh0LnJvd3MtMSkpO3RoaXMuUz1uO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bmtub3duIG1ldGhvZDogJHtufWApfX1zdGF0aWMgbG9hZCh0KXtpZigic3RyaW5nIiE9dHlwZW9mIHQubmFtZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtb2RlbCBtdXN0IGhhdmUgYSBuYW1lIHByb3BlcnR5Iik7aWYoIlBDQSIhPT10Lm5hbWUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYGludmFsaWQgbW9kZWw6ICR7dC5uYW1lfWApO3JldHVybiBuZXcgS2UoITAsdCl9cHJlZGljdCh0LGU9e30pe2NvbnN0e25Db21wb25lbnRzOnI9dGhpcy5VLmNvbHVtbnN9PWU7aWYodD1uZXcgVmUodCksdGhpcy5jZW50ZXImJih0LnN1YlJvd1ZlY3Rvcih0aGlzLm1lYW5zKSx0aGlzLnNjYWxlKSl7Zm9yKGxldCBlIG9mIHRoaXMuZXhjbHVkZWRGZWF0dXJlcyl0LnJlbW92ZUNvbHVtbihlKTt0LmRpdlJvd1ZlY3Rvcih0aGlzLnN0ZGV2cyl9bGV0IG49dC5tbXVsKHRoaXMuVSk7cmV0dXJuIG4uc3ViTWF0cml4KDAsbi5yb3dzLTEsMCxyLTEpfWludmVydCh0KXtsZXQgZT0odD1WZS5jaGVja01hdHJpeCh0KSkubW11bCh0aGlzLlUudHJhbnNwb3NlKCkpO3JldHVybiB0aGlzLmNlbnRlciYmKHRoaXMuc2NhbGUmJmUubXVsUm93VmVjdG9yKHRoaXMuc3RkZXZzKSxlLmFkZFJvd1ZlY3Rvcih0aGlzLm1lYW5zKSksZX1nZXRFeHBsYWluZWRWYXJpYW5jZSgpe2xldCB0PTA7Zm9yKGNvbnN0IGUgb2YgdGhpcy5TKXQrPWU7cmV0dXJuIHRoaXMuUy5tYXAoKGU9PmUvdCkpfWdldEN1bXVsYXRpdmVWYXJpYW5jZSgpe2xldCB0PXRoaXMuZ2V0RXhwbGFpbmVkVmFyaWFuY2UoKTtmb3IobGV0IGU9MTtlPHQubGVuZ3RoO2UrKyl0W2VdKz10W2UtMV07cmV0dXJuIHR9Z2V0RWlnZW52ZWN0b3JzKCl7cmV0dXJuIHRoaXMuVX1nZXRFaWdlbnZhbHVlcygpe3JldHVybiB0aGlzLlN9Z2V0U3RhbmRhcmREZXZpYXRpb25zKCl7cmV0dXJuIHRoaXMuUy5tYXAoKHQ9Pk1hdGguc3FydCh0KSkpfWdldExvYWRpbmdzKCl7cmV0dXJuIHRoaXMuVS50cmFuc3Bvc2UoKX10b0pTT04oKXtyZXR1cm57bmFtZToiUENBIixjZW50ZXI6dGhpcy5jZW50ZXIsc2NhbGU6dGhpcy5zY2FsZSxtZWFuczp0aGlzLm1lYW5zLHN0ZGV2czp0aGlzLnN0ZGV2cyxVOnRoaXMuVSxTOnRoaXMuUyxleGNsdWRlZEZlYXR1cmVzOnRoaXMuZXhjbHVkZWRGZWF0dXJlc319X2FkanVzdCh0LGUpe2lmKHRoaXMuY2VudGVyKXtjb25zdCByPXQubWVhbigiY29sdW1uIiksbj10aGlzLnNjYWxlP3Quc3RhbmRhcmREZXZpYXRpb24oImNvbHVtbiIse21lYW46cn0pOm51bGw7aWYodGhpcy5tZWFucz1yLHQuc3ViUm93VmVjdG9yKHIpLHRoaXMuc2NhbGUpe2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cisrKWlmKDA9PT1uW3JdKXtpZighZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQ2Fubm90IHNjYWxlIHRoZSBkYXRhc2V0IChzdGFuZGFyZCBkZXZpYXRpb24gaXMgemVybyBhdCBpbmRleCAke3J9YCk7dC5yZW1vdmVDb2x1bW4ociksbi5zcGxpY2UociwxKSx0aGlzLmV4Y2x1ZGVkRmVhdHVyZXMucHVzaChyKSxyLS19dGhpcy5zdGRldnM9bix0LmRpdlJvd1ZlY3RvcihuKX19fV9jb21wdXRlRnJvbUNvdmFyaWFuY2VNYXRyaXgodCl7Y29uc3QgZT1uZXcgTGUodCx7YXNzdW1lU3ltbWV0cmljOiEwfSk7dGhpcy5VPWUuZWlnZW52ZWN0b3JNYXRyaXgsdGhpcy5VLmZsaXBSb3dzKCksdGhpcy5TPWUucmVhbEVpZ2VudmFsdWVzLHRoaXMuUy5yZXZlcnNlKCl9X2NvbXB1dGVXaXRoTklQQUxTKHQsZSl7dGhpcy5VPW5ldyBWZShlLHQuY29sdW1ucyksdGhpcy5TPVtdO2xldCByPXQ7Zm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9bmV3IEdlKHIpO3RoaXMuVS5zZXRSb3codCxlLncudHJhbnNwb3NlKCkpLHRoaXMuUy5wdXNoKE1hdGgucG93KGUucy5nZXQoMCwwKSwyKSkscj1lLnhSZXNpZHVhbH10aGlzLlU9dGhpcy5VLnRyYW5zcG9zZSgpfX1mdW5jdGlvbiBXZSh0LGU9e30pe2lmKCFkZSh0KSl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IGVmZi4gYXJyYXkiKTtsZXQgcj1DdChlLCJzY2FsZSIpO2ZlKHIpfHwocj0hMCk7bGV0IG49Q3QoZSwibkNvbXBOSVBBTFMiKTtjZShuKXx8KG49Mik7bGV0IG89bGUoQ3QodCwwLFtdKSk7aWYoMD09PW8pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGRpbWVuc2lvbiBvZiBkYXRhIik7aWYobj5vKXRocm93IG5ldyBFcnJvcigibkNvbXBOSVBBTFMgaXMgbW9yZSB0aGFuIHRoZSBkaW1lbnNpb24gb2YgZGF0YSIpO2xldCBzPW5ldyBLZSh0LHttZXRob2Q6Ik5JUEFMUyIsc2NhbGU6cixuQ29tcE5JUEFMUzpufSksaT1zLnByZWRpY3QodCk7cmV0dXJuIHMuaW52ZXJ0KGkpLnRvSlNPTigpfXZhciBYZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK3I8biYmITEhPT1lKHRbcl0scix0KTspO3JldHVybiB0fTt2YXIgSmU9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUscixuKXtmb3IodmFyIG89LTEscz1PYmplY3QoZSksaT1uKGUpLHU9aS5sZW5ndGg7dS0tOyl7dmFyIGE9aVt0P3U6KytvXTtpZighMT09PXIoc1thXSxhLHMpKWJyZWFrfXJldHVybiBlfX0oKTt2YXIgWWU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1BcnJheSh0KTsrK3I8dDspbltyXT1lKHIpO3JldHVybiBufTt2YXIgWmU9ZnVuY3Rpb24odCl7cmV0dXJuIGQodCkmJiJbb2JqZWN0IEFyZ3VtZW50c10iPT13KHQpfSxIZT1PYmplY3QucHJvdG90eXBlLFFlPUhlLmhhc093blByb3BlcnR5LHRyPUhlLnByb3BlcnR5SXNFbnVtZXJhYmxlLGVyPVplKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/WmU6ZnVuY3Rpb24odCl7cmV0dXJuIGQodCkmJlFlLmNhbGwodCwiY2FsbGVlIikmJiF0ci5jYWxsKHQsImNhbGxlZSIpfTt2YXIgcnI9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbnI9bigoZnVuY3Rpb24odCxlKXt2YXIgcj1lJiYhZS5ub2RlVHlwZSYmZSxuPXImJnQmJiF0Lm5vZGVUeXBlJiZ0LG89biYmbi5leHBvcnRzPT09cj9pLkJ1ZmZlcjp2b2lkIDAscz0obz9vLmlzQnVmZmVyOnZvaWQgMCl8fHJyO3QuZXhwb3J0cz1zfSkpLG9yPS9eKD86MHxbMS05XVxkKikkLzt2YXIgc3I9ZnVuY3Rpb24odCxlKXt2YXIgcj10eXBlb2YgdDtyZXR1cm4hIShlPW51bGw9PWU/OTAwNzE5OTI1NDc0MDk5MTplKSYmKCJudW1iZXIiPT1yfHwic3ltYm9sIiE9ciYmb3IudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxlfSxpcj17fTtpclsiW29iamVjdCBGbG9hdDMyQXJyYXldIl09aXJbIltvYmplY3QgRmxvYXQ2NEFycmF5XSJdPWlyWyJbb2JqZWN0IEludDhBcnJheV0iXT1pclsiW29iamVjdCBJbnQxNkFycmF5XSJdPWlyWyJbb2JqZWN0IEludDMyQXJyYXldIl09aXJbIltvYmplY3QgVWludDhBcnJheV0iXT1pclsiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iXT1pclsiW29iamVjdCBVaW50MTZBcnJheV0iXT1pclsiW29iamVjdCBVaW50MzJBcnJheV0iXT0hMCxpclsiW29iamVjdCBBcmd1bWVudHNdIl09aXJbIltvYmplY3QgQXJyYXldIl09aXJbIltvYmplY3QgQXJyYXlCdWZmZXJdIl09aXJbIltvYmplY3QgQm9vbGVhbl0iXT1pclsiW29iamVjdCBEYXRhVmlld10iXT1pclsiW29iamVjdCBEYXRlXSJdPWlyWyJbb2JqZWN0IEVycm9yXSJdPWlyWyJbb2JqZWN0IEZ1bmN0aW9uXSJdPWlyWyJbb2JqZWN0IE1hcF0iXT1pclsiW29iamVjdCBOdW1iZXJdIl09aXJbIltvYmplY3QgT2JqZWN0XSJdPWlyWyJbb2JqZWN0IFJlZ0V4cF0iXT1pclsiW29iamVjdCBTZXRdIl09aXJbIltvYmplY3QgU3RyaW5nXSJdPWlyWyJbb2JqZWN0IFdlYWtNYXBdIl09ITE7dmFyIHVyPWZ1bmN0aW9uKHQpe3JldHVybiBkKHQpJiZHdCh0Lmxlbmd0aCkmJiEhaXJbdyh0KV19O3ZhciBhcj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fSxocj1uKChmdW5jdGlvbih0LGUpe3ZhciByPWUmJiFlLm5vZGVUeXBlJiZlLG49ciYmdCYmIXQubm9kZVR5cGUmJnQscz1uJiZuLmV4cG9ydHM9PT1yJiZvLnByb2Nlc3MsaT1mdW5jdGlvbigpe3RyeXt2YXIgdD1uJiZuLnJlcXVpcmUmJm4ucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiB0fHxzJiZzLmJpbmRpbmcmJnMuYmluZGluZygidXRpbCIpfWNhdGNoKHQpe319KCk7dC5leHBvcnRzPWl9KSksbHI9aHImJmhyLmlzVHlwZWRBcnJheSxjcj1scj9hcihscik6dXIsZnI9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgbXI9ZnVuY3Rpb24oZSxyKXt2YXIgbj10KGUpLG89IW4mJmVyKGUpLHM9IW4mJiFvJiZucihlKSxpPSFuJiYhbyYmIXMmJmNyKGUpLHU9bnx8b3x8c3x8aSxhPXU/WWUoZS5sZW5ndGgsU3RyaW5nKTpbXSxoPWEubGVuZ3RoO2Zvcih2YXIgbCBpbiBlKSFyJiYhZnIuY2FsbChlLGwpfHx1JiYoImxlbmd0aCI9PWx8fHMmJigib2Zmc2V0Ij09bHx8InBhcmVudCI9PWwpfHxpJiYoImJ1ZmZlciI9PWx8fCJieXRlTGVuZ3RoIj09bHx8ImJ5dGVPZmZzZXQiPT1sKXx8c3IobCxoKSl8fGEucHVzaChsKTtyZXR1cm4gYX07dmFyIGdyPWZ1bmN0aW9uKHQpe3JldHVybiBLdCh0KT9tcih0KTpPdCh0KX07dmFyIHByPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIsbil7aWYobnVsbD09cilyZXR1cm4gcjtpZighS3QocikpcmV0dXJuIHQocixuKTtmb3IodmFyIG89ci5sZW5ndGgscz1lP286LTEsaT1PYmplY3Qocik7KGU/cy0tOisrczxvKSYmITEhPT1uKGlbc10scyxpKTspO3JldHVybiByfX0oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJkplKHQsZSxncil9KSk7dmFyIHdyPWZ1bmN0aW9uKHQpe3JldHVybiB0fTt2YXIgZHI9ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp3cn07dmFyIGJyPWZ1bmN0aW9uKGUscil7cmV0dXJuKHQoZSk/WGU6cHIpKGUsZHIocikpfTt2YXIgeXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPW5ldyBvdCx0aGlzLnNpemU9MH07dmFyIHZyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1lLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplPWUuc2l6ZSxyfTt2YXIgTXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KHQpfTt2YXIgeHI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfTt2YXIgRXI9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fO2lmKHIgaW5zdGFuY2VvZiBvdCl7dmFyIG49ci5fX2RhdGFfXztpZighc3R8fG4ubGVuZ3RoPDE5OSlyZXR1cm4gbi5wdXNoKFt0LGVdKSx0aGlzLnNpemU9KytyLnNpemUsdGhpcztyPXRoaXMuX19kYXRhX189bmV3IGd0KG4pfXJldHVybiByLnNldCh0LGUpLHRoaXMuc2l6ZT1yLnNpemUsdGhpc307ZnVuY3Rpb24gU3IodCl7dmFyIGU9dGhpcy5fX2RhdGFfXz1uZXcgb3QodCk7dGhpcy5zaXplPWUuc2l6ZX1Tci5wcm90b3R5cGUuY2xlYXI9eXIsU3IucHJvdG90eXBlLmRlbGV0ZT12cixTci5wcm90b3R5cGUuZ2V0PU1yLFNyLnByb3RvdHlwZS5oYXM9eHIsU3IucHJvdG90eXBlLnNldD1Fcjt2YXIganI9U3I7dmFyIF9yPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LCJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIiksdGhpc307dmFyIEFyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX07ZnVuY3Rpb24gQ3IodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuX19kYXRhX189bmV3IGd0OysrZTxyOyl0aGlzLmFkZCh0W2VdKX1Dci5wcm90b3R5cGUuYWRkPUNyLnByb3RvdHlwZS5wdXNoPV9yLENyLnByb3RvdHlwZS5oYXM9QXI7dmFyIFJyPUNyO3ZhciBJcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK3I8bjspaWYoZSh0W3JdLHIsdCkpcmV0dXJuITA7cmV0dXJuITF9O3ZhciBrcj1mdW5jdGlvbih0LGUpe3JldHVybiB0LmhhcyhlKX07dmFyIE5yPWZ1bmN0aW9uKHQsZSxyLG4sbyxzKXt2YXIgaT0xJnIsdT10Lmxlbmd0aCxhPWUubGVuZ3RoO2lmKHUhPWEmJiEoaSYmYT51KSlyZXR1cm4hMTt2YXIgaD1zLmdldCh0KSxsPXMuZ2V0KGUpO2lmKGgmJmwpcmV0dXJuIGg9PWUmJmw9PXQ7dmFyIGM9LTEsZj0hMCxtPTImcj9uZXcgUnI6dm9pZCAwO2ZvcihzLnNldCh0LGUpLHMuc2V0KGUsdCk7KytjPHU7KXt2YXIgZz10W2NdLHA9ZVtjXTtpZihuKXZhciB3PWk/bihwLGcsYyxlLHQscyk6bihnLHAsYyx0LGUscyk7aWYodm9pZCAwIT09dyl7aWYodyljb250aW51ZTtmPSExO2JyZWFrfWlmKG0pe2lmKCFJcihlLChmdW5jdGlvbih0LGUpe2lmKCFrcihtLGUpJiYoZz09PXR8fG8oZyx0LHIsbixzKSkpcmV0dXJuIG0ucHVzaChlKX0pKSl7Zj0hMTticmVha319ZWxzZSBpZihnIT09cCYmIW8oZyxwLHIsbixzKSl7Zj0hMTticmVha319cmV0dXJuIHMuZGVsZXRlKHQpLHMuZGVsZXRlKGUpLGZ9LE9yPWkuVWludDhBcnJheTt2YXIgRnI9ZnVuY3Rpb24odCl7dmFyIGU9LTEscj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQsbil7clsrK2VdPVtuLHRdfSkpLHJ9O3ZhciB6cj1mdW5jdGlvbih0KXt2YXIgZT0tMSxyPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7clsrK2VdPXR9KSkscn0sVHI9dT91LnByb3RvdHlwZTp2b2lkIDAsVnI9VHI/VHIudmFsdWVPZjp2b2lkIDA7dmFyIFByPWZ1bmN0aW9uKHQsZSxyLG4sbyxzLGkpe3N3aXRjaChyKXtjYXNlIltvYmplY3QgRGF0YVZpZXddIjppZih0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8dC5ieXRlT2Zmc2V0IT1lLmJ5dGVPZmZzZXQpcmV0dXJuITE7dD10LmJ1ZmZlcixlPWUuYnVmZmVyO2Nhc2UiW29iamVjdCBBcnJheUJ1ZmZlcl0iOnJldHVybiEodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fCFzKG5ldyBPcih0KSxuZXcgT3IoZSkpKTtjYXNlIltvYmplY3QgQm9vbGVhbl0iOmNhc2UiW29iamVjdCBEYXRlXSI6Y2FzZSJbb2JqZWN0IE51bWJlcl0iOnJldHVybiBZKCt0LCtlKTtjYXNlIltvYmplY3QgRXJyb3JdIjpyZXR1cm4gdC5uYW1lPT1lLm5hbWUmJnQubWVzc2FnZT09ZS5tZXNzYWdlO2Nhc2UiW29iamVjdCBSZWdFeHBdIjpjYXNlIltvYmplY3QgU3RyaW5nXSI6cmV0dXJuIHQ9PWUrIiI7Y2FzZSJbb2JqZWN0IE1hcF0iOnZhciB1PUZyO2Nhc2UiW29iamVjdCBTZXRdIjp2YXIgYT0xJm47aWYodXx8KHU9enIpLHQuc2l6ZSE9ZS5zaXplJiYhYSlyZXR1cm4hMTt2YXIgaD1pLmdldCh0KTtpZihoKXJldHVybiBoPT1lO258PTIsaS5zZXQodCxlKTt2YXIgbD1Ocih1KHQpLHUoZSksbixvLHMsaSk7cmV0dXJuIGkuZGVsZXRlKHQpLGw7Y2FzZSJbb2JqZWN0IFN5bWJvbF0iOmlmKFZyKXJldHVybiBWci5jYWxsKHQpPT1Wci5jYWxsKGUpfXJldHVybiExfTt2YXIgcXI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1lLmxlbmd0aCxvPXQubGVuZ3RoOysrcjxuOyl0W28rcl09ZVtyXTtyZXR1cm4gdH07dmFyICRyPWZ1bmN0aW9uKGUscixuKXt2YXIgbz1yKGUpO3JldHVybiB0KGUpP286cXIobyxuKGUpKX07dmFyIERyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoLG89MCxzPVtdOysrcjxuOyl7dmFyIGk9dFtyXTtlKGkscix0KSYmKHNbbysrXT1pKX1yZXR1cm4gc307dmFyIFVyPWZ1bmN0aW9uKCl7cmV0dXJuW119LExyPU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsQnI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxHcj1Ccj9mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXToodD1PYmplY3QodCksRHIoQnIodCksKGZ1bmN0aW9uKGUpe3JldHVybiBMci5jYWxsKHQsZSl9KSkpfTpVcjt2YXIgS3I9ZnVuY3Rpb24odCl7cmV0dXJuICRyKHQsZ3IsR3IpfSxXcj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBYcj1mdW5jdGlvbih0LGUscixuLG8scyl7dmFyIGk9MSZyLHU9S3IodCksYT11Lmxlbmd0aDtpZihhIT1LcihlKS5sZW5ndGgmJiFpKXJldHVybiExO2Zvcih2YXIgaD1hO2gtLTspe3ZhciBsPXVbaF07aWYoIShpP2wgaW4gZTpXci5jYWxsKGUsbCkpKXJldHVybiExfXZhciBjPXMuZ2V0KHQpLGY9cy5nZXQoZSk7aWYoYyYmZilyZXR1cm4gYz09ZSYmZj09dDt2YXIgbT0hMDtzLnNldCh0LGUpLHMuc2V0KGUsdCk7Zm9yKHZhciBnPWk7KytoPGE7KXt2YXIgcD10W2w9dVtoXV0sdz1lW2xdO2lmKG4pdmFyIGQ9aT9uKHcscCxsLGUsdCxzKTpuKHAsdyxsLHQsZSxzKTtpZighKHZvaWQgMD09PWQ/cD09PXd8fG8ocCx3LHIsbixzKTpkKSl7bT0hMTticmVha31nfHwoZz0iY29uc3RydWN0b3IiPT1sKX1pZihtJiYhZyl7dmFyIGI9dC5jb25zdHJ1Y3Rvcix5PWUuY29uc3RydWN0b3I7Yj09eXx8ISgiY29uc3RydWN0b3IiaW4gdCl8fCEoImNvbnN0cnVjdG9yImluIGUpfHwiZnVuY3Rpb24iPT10eXBlb2YgYiYmYiBpbnN0YW5jZW9mIGImJiJmdW5jdGlvbiI9PXR5cGVvZiB5JiZ5IGluc3RhbmNlb2YgeXx8KG09ITEpfXJldHVybiBzLmRlbGV0ZSh0KSxzLmRlbGV0ZShlKSxtfSxKcj0iW29iamVjdCBPYmplY3RdIixZcj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBacj1mdW5jdGlvbihlLHIsbixvLHMsaSl7dmFyIHU9dChlKSxhPXQociksaD11PyJbb2JqZWN0IEFycmF5XSI6QnQoZSksbD1hPyJbb2JqZWN0IEFycmF5XSI6QnQociksYz0oaD0iW29iamVjdCBBcmd1bWVudHNdIj09aD9KcjpoKT09SnIsZj0obD0iW29iamVjdCBBcmd1bWVudHNdIj09bD9KcjpsKT09SnIsbT1oPT1sO2lmKG0mJm5yKGUpKXtpZighbnIocikpcmV0dXJuITE7dT0hMCxjPSExfWlmKG0mJiFjKXJldHVybiBpfHwoaT1uZXcganIpLHV8fGNyKGUpP05yKGUscixuLG8scyxpKTpQcihlLHIsaCxuLG8scyxpKTtpZighKDEmbikpe3ZhciBnPWMmJllyLmNhbGwoZSwiX193cmFwcGVkX18iKSxwPWYmJllyLmNhbGwociwiX193cmFwcGVkX18iKTtpZihnfHxwKXt2YXIgdz1nP2UudmFsdWUoKTplLGQ9cD9yLnZhbHVlKCk6cjtyZXR1cm4gaXx8KGk9bmV3IGpyKSxzKHcsZCxuLG8saSl9fXJldHVybiEhbSYmKGl8fChpPW5ldyBqciksWHIoZSxyLG4sbyxzLGkpKX07dmFyIEhyPWZ1bmN0aW9uIHQoZSxyLG4sbyxzKXtyZXR1cm4gZT09PXJ8fChudWxsPT1lfHxudWxsPT1yfHwhZChlKSYmIWQocik/ZSE9ZSYmciE9cjpacihlLHIsbixvLHQscykpfTt2YXIgUXI9ZnVuY3Rpb24odCxlLHIsbil7dmFyIG89ci5sZW5ndGgscz1vLGk9IW47aWYobnVsbD09dClyZXR1cm4hcztmb3IodD1PYmplY3QodCk7by0tOyl7dmFyIHU9cltvXTtpZihpJiZ1WzJdP3VbMV0hPT10W3VbMF1dOiEodVswXWluIHQpKXJldHVybiExfWZvcig7KytvPHM7KXt2YXIgYT0odT1yW29dKVswXSxoPXRbYV0sbD11WzFdO2lmKGkmJnVbMl0pe2lmKHZvaWQgMD09PWgmJiEoYSBpbiB0KSlyZXR1cm4hMX1lbHNle3ZhciBjPW5ldyBqcjtpZihuKXZhciBmPW4oaCxsLGEsdCxlLGMpO2lmKCEodm9pZCAwPT09Zj9IcihsLGgsMyxuLGMpOmYpKXJldHVybiExfX1yZXR1cm4hMH07dmFyIHRuPWZ1bmN0aW9uKHQpe3JldHVybiB0PT10JiYheCh0KX07dmFyIGVuPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1ncih0KSxyPWUubGVuZ3RoO3ItLTspe3ZhciBuPWVbcl0sbz10W25dO2Vbcl09W24sbyx0bihvKV19cmV0dXJuIGV9O3ZhciBybj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gbnVsbCE9ciYmKHJbdF09PT1lJiYodm9pZCAwIT09ZXx8dCBpbiBPYmplY3QocikpKX19O3ZhciBubj1mdW5jdGlvbih0KXt2YXIgZT1lbih0KTtyZXR1cm4gMT09ZS5sZW5ndGgmJmVbMF1bMl0/cm4oZVswXVswXSxlWzBdWzFdKTpmdW5jdGlvbihyKXtyZXR1cm4gcj09PXR8fFFyKHIsdCxlKX19O3ZhciBvbj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZlIGluIE9iamVjdCh0KX07dmFyIHNuPWZ1bmN0aW9uKGUscixuKXtmb3IodmFyIG89LTEscz0ocj1qdChyLGUpKS5sZW5ndGgsaT0hMTsrK288czspe3ZhciB1PV90KHJbb10pO2lmKCEoaT1udWxsIT1lJiZuKGUsdSkpKWJyZWFrO2U9ZVt1XX1yZXR1cm4gaXx8KytvIT1zP2k6ISEocz1udWxsPT1lPzA6ZS5sZW5ndGgpJiZHdChzKSYmc3IodSxzKSYmKHQoZSl8fGVyKGUpKX07dmFyIHVuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPXQmJnNuKHQsZSxvbil9O3ZhciBhbj1mdW5jdGlvbih0LGUpe3JldHVybiBNKHQpJiZ0bihlKT9ybihfdCh0KSxlKTpmdW5jdGlvbihyKXt2YXIgbj1DdChyLHQpO3JldHVybiB2b2lkIDA9PT1uJiZuPT09ZT91bihyLHQpOkhyKGUsbiwzKX19O3ZhciBobj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIEF0KGUsdCl9fTt2YXIgbG49ZnVuY3Rpb24odCl7cmV0dXJuIE0odCk/WHQoX3QodCkpOmhuKHQpfTt2YXIgY249ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpudWxsPT1lP3dyOiJvYmplY3QiPT10eXBlb2YgZT90KGUpP2FuKGVbMF0sZVsxXSk6bm4oZSk6bG4oZSl9O3ZhciBmbj1mdW5jdGlvbih0LGUpe3ZhciByPS0xLG49S3QodCk/QXJyYXkodC5sZW5ndGgpOltdO3JldHVybiBwcih0LChmdW5jdGlvbih0LG8scyl7blsrK3JdPWUodCxvLHMpfSkpLG59O3ZhciBtbj1mdW5jdGlvbihlLHIpe3JldHVybih0KGUpP3Z0OmZuKShlLGNuKHIpKX07dmFyIGduPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZ0KGUsKGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSkpfTt2YXIgcG49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106Z24odCxncih0KSl9O2Z1bmN0aW9uIHduKHQpe3JldHVybiEoIXBlKHQpfHwiIj09PXQpfWZ1bmN0aW9uIGRuKHQpe2xldCBlPSExO3JldHVybiB3bih0KT9lPSFpc05hTihOdW1iZXIodCkpOmZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IE51bWJlcl0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KSYmKGU9ITApLGV9ZnVuY3Rpb24gYm4odCxlKXtpZighZ2UodCkpcmV0dXJue307aWYoIWRlKGUpKXJldHVybnt9O2xldCByPXt9O3JldHVybiBicihlLChmdW5jdGlvbihlKXsoZnVuY3Rpb24odCxlKXtyZXR1cm4hIWdlKHQpJiYhKCF3bihlKSYmIWRuKGUpKSYmZSBpbiB0fSkodCxlKSYmKHJbZV09Q3QodCxlKSl9KSkscn12YXIgeW49L1xzLzt2YXIgdm49ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoO2UtLSYmeW4udGVzdCh0LmNoYXJBdChlKSk7KTtyZXR1cm4gZX0sTW49L15ccysvO3ZhciB4bj1mdW5jdGlvbih0KXtyZXR1cm4gdD90LnNsaWNlKDAsdm4odCkrMSkucmVwbGFjZShNbiwiIik6dH0sRW49L15bLStdMHhbMC05YS1mXSskL2ksU249L14wYlswMV0rJC9pLGpuPS9eMG9bMC03XSskL2ksX249cGFyc2VJbnQ7dmFyIEFuPWZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdDtpZihiKHQpKXJldHVybiBOYU47aWYoeCh0KSl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQudmFsdWVPZj90LnZhbHVlT2YoKTp0O3Q9eChlKT9lKyIiOmV9aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiAwPT09dD90Oit0O3Q9eG4odCk7dmFyIHI9U24udGVzdCh0KTtyZXR1cm4gcnx8am4udGVzdCh0KT9fbih0LnNsaWNlKDIpLHI/Mjo4KTpFbi50ZXN0KHQpP05hTjordH07dmFyIENuPWZ1bmN0aW9uKHQpe3JldHVybiB0P0luZmluaXR5PT09KHQ9QW4odCkpfHwtSW5maW5pdHk9PT10PzE3OTc2OTMxMzQ4NjIzMTU3ZTI5MioodDwwPy0xOjEpOnQ9PXQ/dDowOjA9PT10P3Q6MH07dmFyIFJuPWZ1bmN0aW9uKHQpe3ZhciBlPUNuKHQpLHI9ZSUxO3JldHVybiBlPT1lP3I/ZS1yOmU6MH0sSW49aS5pc0Zpbml0ZSxrbj1NYXRoLm1pbjt2YXIgTm49ZnVuY3Rpb24odCl7dmFyIGU9TWF0aFt0XTtyZXR1cm4gZnVuY3Rpb24odCxyKXtpZih0PUFuKHQpLChyPW51bGw9PXI/MDprbihSbihyKSwyOTIpKSYmSW4odCkpe3ZhciBuPShTdCh0KSsiZSIpLnNwbGl0KCJlIiksbz1lKG5bMF0rImUiKygrblsxXStyKSk7cmV0dXJuKygobj0oU3QobykrImUiKS5zcGxpdCgiZSIpKVswXSsiZSIrKCtuWzFdLXIpKX1yZXR1cm4gZSh0KX19KCJyb3VuZCIpO2Z1bmN0aW9uIE9uKHQpe2lmKCFkbih0KSlyZXR1cm4gMDt0PWZ1bmN0aW9uKHQpe3JldHVybiBkbih0KT9Dbih0KTowfSh0KTtsZXQgZT1Obih0KTtyZXR1cm4iMCI9PT1TdHJpbmcoZSk/MDplfXZhciBGbj1BcnJheS5wcm90b3R5cGUuam9pbjt2YXIgem49ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD8iIjpGbi5jYWxsKHQsZSl9O2NsYXNzIFRue2NvbnN0cnVjdG9yKHQpe3RoaXMuZ2V0Q29zdD0oKT0+dGhpcy5FbGVtZW50cy5tYXAoKHQ9PnQuRGlzdGFuY2VGcm9tTWVkb2lkKSkucmVkdWNlKCgodCxlKT0+dCtlKSwwKSx0aGlzLmZpbmRCZXN0TWVkb2lkSWR4PXQ9PnRoaXMuRWxlbWVudHMubWFwKChlPT50aGlzLmNhbGNDb3N0Rm9yR2l2ZW5FbGVtZW50QXNNZWRvaWQoZSx0KSkpLnJlZHVjZSgoKHQsZSxyLG4pPT5lLkNvc3RJZk1hZGVNZWRvaWQ8blt0XS5Db3N0SWZNYWRlTWVkb2lkP3I6dCksMCksdGhpcy5jYWxjQ29zdEZvckdpdmVuRWxlbWVudEFzTWVkb2lkPSh0LGUpPT4oe0Nvc3RJZk1hZGVNZWRvaWQ6bmV3IFRuKHtFbGVtZW50czp0aGlzLkVsZW1lbnRzLm1hcCgocj0+KHtEaXN0YW5jZUZyb21NZWRvaWQ6ZShyLkVsZW1lbnQsdC5FbGVtZW50KSxFbGVtZW50OnIuRWxlbWVudH0pKSksTWVkb2lkOnQuRWxlbWVudH0pLmdldENvc3QoKSxFbGVtZW50OnR9KSx0aGlzLkVsZW1lbnRzPXQuRWxlbWVudHMsdGhpcy5NZWRvaWQ9dC5NZWRvaWR9fXZhciBWbj1UbixQbj1PYmplY3QuZGVmaW5lUHJvcGVydHkoe0NsdXN0ZXI6Vm59LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxxbj1PYmplY3QuZGVmaW5lUHJvcGVydHkoe2Rpc3RhbmNlOih0LGUpPT57aWYodC5sZW5ndGghPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRoZSBpbnB1dHMgbXVzdCBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbiIpO2NvbnN0IHI9QXJyYXkuZnJvbSh0LmtleXMoKSkubWFwKChyPT5NYXRoLnBvdyhNYXRoLmFicyh0W3JdLWVbcl0pLDIpKSkucmVkdWNlKCgodCxlKT0+dCtlKSwwKTtyZXR1cm4gTWF0aC5zcXJ0KHIpfX0sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLCRuPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7a0d0RWxlbWVudEFyckxlbmd0aDoiayBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpbnB1dCBhcnJheSJ9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjbGFzcyBEbntjb25zdHJ1Y3Rvcih0LGUscil7dGhpcy5FbGVtZW50cz10LHRoaXMuSz1lLHRoaXMuRGlzdGFuY2VGbj1yLHRoaXMuT3B0aW1pc2F0aW9uQ29tcGxldGVkPSExLHRoaXMuaXRlcmF0ZT0oKT0+e3RoaXMuSXRlcmF0aW9uQ291bnQrKyx0aGlzLkNsdXN0ZXJzfHx0aGlzLmFsbG9jYXRlVG9DbHVzdGVyc0Fyb3VuZEN1cnJlbnRNZWRvaWRzKCk7Y29uc3QgdD10aGlzLk1lZG9pZHMsZT10aGlzLkNsdXN0ZXJzLHI9dGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdCgpO2xldCBuPXI7Zm9yKGxldCB0PTA7dDx0aGlzLk1lZG9pZHMubGVuZ3RoO3QrKyl7Y29uc3QgZT10PT4wPT09dGhpcy5NZWRvaWRzLmZpbHRlcigoZT0+MD09PXRoaXMuRGlzdGFuY2VGbih0LGUpKSkubGVuZ3RoO2Zvcihjb25zdCByIG9mIHRoaXMuRWxlbWVudHMuZmlsdGVyKGUpKXtjb25zdCBlPXRoaXMuTWVkb2lkcy5zbGljZSgpO2VbdF09cjtjb25zdCBvPW5ldyBEbih0aGlzLkVsZW1lbnRzLnNsaWNlKCksdGhpcy5LLHRoaXMuRGlzdGFuY2VGbik7by5NZWRvaWRzPWUsby5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcygpO2NvbnN0IHM9by5jYWxjdWxhdGVDdXJyZW50Q29zdCgpO3M8biYmKG49cyx0aGlzLkNsdXN0ZXJzPW8uQ2x1c3RlcnMsdGhpcy5NZWRvaWRzPWUpfX1yZXR1cm4gdGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdCgpPHJ8fCh0aGlzLkNsdXN0ZXJzPWUsdGhpcy5NZWRvaWRzPXQsdGhpcy5PcHRpbWlzYXRpb25Db21wbGV0ZWQ9ITAsITEpfSx0aGlzLmdldENsdXN0ZXJlZERhdGE9KCk9Pih0aGlzLk9wdGltaXNhdGlvbkNvbXBsZXRlZHx8dGhpcy5ydW5Ub0NvbXBsZXRpb24oKSx0aGlzLkNsdXN0ZXJzLm1hcCgodD0+dC5FbGVtZW50cy5tYXAoKHQ9PnQuRWxlbWVudCkpKSkpLHRoaXMucnVuVG9Db21wbGV0aW9uPSgpPT57Zm9yKDt0aGlzLml0ZXJhdGUoKTspO30sdGhpcy5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcz0oKT0+e3RoaXMuQ2x1c3RlcnM9bmV3IEFycmF5LHRoaXMuTWVkb2lkcy5mb3JFYWNoKCh0PT57dGhpcy5DbHVzdGVycy5wdXNoKG5ldyBQbi5DbHVzdGVyKHtFbGVtZW50czpbXSxNZWRvaWQ6dH0pKX0pKSx0aGlzLkVsZW1lbnRzLmZvckVhY2goKCh0LGUpPT57Y29uc3Qgcj10aGlzLmZpbmREaXN0YW5jZXModGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuTWVkb2lkKSksdCksbj1yLnJlZHVjZSgoKHQsZSxyLG4pPT5lPG5bdF0/cjp0KSwwKTt0aGlzLkNsdXN0ZXJzW25dLkVsZW1lbnRzLnB1c2goe0Rpc3RhbmNlRnJvbU1lZG9pZDpyW25dLEVsZW1lbnQ6dH0pfSkpfSx0aGlzLmNhbGN1bGF0ZUN1cnJlbnRDb3N0PSgpPT50aGlzLkNsdXN0ZXJzLm1hcCgodD0+dC5nZXRDb3N0KCkpKS5yZWR1Y2UoKCh0LGUpPT50K2UpLDApLHRoaXMuZmluZERpc3RhbmNlcz0odCxlKT0+dC5tYXAoKHQ9PnRoaXMuRGlzdGFuY2VGbih0LGUpKSksdGhpcy5zZWxlY3RJbml0aWFsTWVkb2lkcz0oKT0+e2lmKHRoaXMuSz49dGhpcy5FbGVtZW50cy5sZW5ndGgpdGhyb3cgJG4ua0d0RWxlbWVudEFyckxlbmd0aDtjb25zdCB0PVtdLGU9KHQsZSk9Pntmb3IoY29uc3QgciBvZiBlKWlmKDA9PT10aGlzLkRpc3RhbmNlRm4ocix0KSlyZXR1cm4hMTtyZXR1cm4hMH07bGV0IHI9MDtmb3IoO3I8dGhpcy5FbGVtZW50cy5sZW5ndGgmJnQubGVuZ3RoPHRoaXMuSzspZSh0aGlzLkVsZW1lbnRzW3JdLHQpJiZ0LnB1c2godGhpcy5FbGVtZW50c1tyXSkscisrO3JldHVybiB0fSx0aGlzLkRpc3RhbmNlRm49dGhpcy5EaXN0YW5jZUZufHxxbi5kaXN0YW5jZSx0aGlzLk1lZG9pZHM9dGhpcy5zZWxlY3RJbml0aWFsTWVkb2lkcygpLHRoaXMuSXRlcmF0aW9uQ291bnQ9MH1nZXQgT3B0aW1pc2F0aW9uU3RhcnRlZCgpe3JldHVybiB0aGlzLkl0ZXJhdGlvbkNvdW50PjB9fURuLmNsdXN0ZXJFbGVtZW50cz0odCxlLHIpPT57RG4uZ2V0SW5zdGFuY2UodCxlLHIpO3JldHVybiBuZXcgQXJyYXl9LERuLmdldEluc3RhbmNlPSh0LGUscik9Pm5ldyBEbih0LGUscik7dmFyIFVuPURuLExuPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7Q2x1c3RlcmVyOlVufSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksQm49cihuKChmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIodCl7Zm9yKHZhciByIGluIHQpZS5oYXNPd25Qcm9wZXJ0eShyKXx8KGVbcl09dFtyXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHIoUG4pLHIoTG4pfSkpKTtmdW5jdGlvbiBHbih0LGUpe2xldCByPTA7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspcis9KHRbbl0tZVtuXSkqKHRbbl0tZVtuXSk7cmV0dXJuIHJ9Y29uc3QgS249e2Rpc3RhbmNlRnVuY3Rpb246R259O2Z1bmN0aW9uIFduKHQsZSxyPUtuKXtjb25zdCBuPXIuZGlzdGFuY2VGdW5jdGlvbnx8S24uZGlzdGFuY2VGdW5jdGlvbixvPXIuc2ltaWxhcml0eUZ1bmN0aW9ufHxLbi5zaW1pbGFyaXR5RnVuY3Rpb247bGV0IHM9LTE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG8pe2xldCByPU51bWJlci5NSU5fVkFMVUU7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IGk9byhlLHRbbl0pO2k+ciYmKHI9aSxzPW4pfX1lbHNle2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcigiQSBzaW1pbGFyaXR5IG9yIGRpc3RhbmNlIGZ1bmN0aW9uIGl0J3MgcmVxdWlyZWQiKTt7bGV0IHI9TnVtYmVyLk1BWF9WQUxVRTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Y29uc3QgaT1uKGUsdFtvXSk7aTxyJiYocj1pLHM9byl9fX1yZXR1cm4gc31mdW5jdGlvbiBYbih0LGUscixuKXtmb3IodmFyIG89MDtvPHQubGVuZ3RoO28rKylyW29dPVduKGUsdFtvXSx7ZGlzdGFuY2VGdW5jdGlvbjpufSk7cmV0dXJuIHJ9ZnVuY3Rpb24gSm4odCxlKXtjb25zdCByPTY1NTM1Jih0Pj4+PTApO3JldHVybigodC1yKSooZT4+Pj0wKT4+PjApK3IqZT4+PjB9Y2xhc3MgWW57Y29uc3RydWN0b3IodD1EYXRlLm5vdygpKXt0aGlzLnN0YXRlPW5ldyBVaW50MzJBcnJheSg0KSx0aGlzLmluaXQodCksdGhpcy5yYW5kb209dGhpcy5nZXRGbG9hdC5iaW5kKHRoaXMpfWdldFVpbnQzMigpe3JldHVybiB0aGlzLm5leHRTdGF0ZSgpLHRoaXMuc3RhdGVbM10rdGhpcy5zdGF0ZVsyXT4+PjB9Z2V0RmxvYXQoKXtyZXR1cm4gNS45NjA0NjQ0Nzc1MzkwNjNlLTgqKHRoaXMuZ2V0VWludDMyKCk+Pj44KX1pbml0KHQpe2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoInNlZWQgbXVzdCBiZSBhbiBpbnRlZ2VyIik7dGhpcy5zdGF0ZVswXT10LHRoaXMuc3RhdGVbMV09MCx0aGlzLnN0YXRlWzJdPTAsdGhpcy5zdGF0ZVszXT0wO2ZvcihsZXQgdD0xO3Q8ODt0KyspdGhpcy5zdGF0ZVszJnRdXj10K0puKDE4MTI0MzMyNTMsdGhpcy5zdGF0ZVt0LTEmM11edGhpcy5zdGF0ZVt0LTEmM10+Pj4zMD4+PjApPj4+MDt0aGlzLnBlcmlvZENlcnRpZmljYXRpb24oKTtmb3IobGV0IHQ9MDt0PDg7dCsrKXRoaXMubmV4dFN0YXRlKCl9cGVyaW9kQ2VydGlmaWNhdGlvbigpezA9PT10aGlzLnN0YXRlWzBdJiYwPT09dGhpcy5zdGF0ZVsxXSYmMD09PXRoaXMuc3RhdGVbMl0mJjA9PT10aGlzLnN0YXRlWzNdJiYodGhpcy5zdGF0ZVswXT04OCx0aGlzLnN0YXRlWzFdPTgzLHRoaXMuc3RhdGVbMl09NjUsdGhpcy5zdGF0ZVszXT02OCl9bmV4dFN0YXRlKCl7bGV0IHQ9dGhpcy5zdGF0ZVswXTt0Xj10PDwxNSx0Xj10Pj4+MTgsdF49dGhpcy5zdGF0ZVszXTw8MTEsdGhpcy5zdGF0ZVswXT10aGlzLnN0YXRlWzFdLHRoaXMuc3RhdGVbMV09dGhpcy5zdGF0ZVsyXSx0aGlzLnN0YXRlWzJdPXRoaXMuc3RhdGVbM10sdGhpcy5zdGF0ZVszXT10fX1mdW5jdGlvbiBabih0LGU9e30scj1NYXRoLnJhbmRvbSl7Y29uc3R7c2l6ZTpuPTEscmVwbGFjZTpvPSExLHByb2JhYmlsaXRpZXM6c309ZTtsZXQgaSx1O2lmKGk9Im51bWJlciI9PXR5cGVvZiB0P2Z1bmN0aW9uKHQpe2NvbnN0IGU9W107Zm9yKGxldCByPTA7cjx0O3IrKyllLnB1c2gocik7cmV0dXJuIGV9KHQpOnQuc2xpY2UoKSxzKXtpZighbyl0aHJvdyBuZXcgRXJyb3IoImNob2ljZSB3aXRoIHByb2JhYmlsaXRpZXMgYW5kIG5vIHJlcGxhY2VtZW50IGlzIG5vdCBpbXBsZW1lbnRlZCIpO2lmKHMubGVuZ3RoIT09aS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgbGVuZ3RoIG9mIHByb2JhYmlsaXRpZXMgb3B0aW9uIHNob3VsZCBiZSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGNob2ljZXMiKTt1PVtzWzBdXTtmb3IobGV0IHQ9MTt0PHMubGVuZ3RoO3QrKyl1W3RdPXVbdC0xXStzW3RdO2lmKE1hdGguYWJzKDEtdVt1Lmxlbmd0aC0xXSk+MWUtOCl0aHJvdyBuZXcgRXJyb3IoYHByb2JhYmlsaXRpZXMgc2hvdWxkIHN1bSB0byAxLCBidXQgaW5zdGVhZCBzdW1zIHRvICR7dVt1Lmxlbmd0aC0xXX1gKX1pZighMT09PW8mJm4+aS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzaXplIG9wdGlvbiBpcyB0b28gbGFyZ2UiKTtjb25zdCBhPVtdO2ZvcihsZXQgdD0wO3Q8bjt0Kyspe2NvbnN0IHQ9SG4oaS5sZW5ndGgscix1KTthLnB1c2goaVt0XSksb3x8aS5zcGxpY2UodCwxKX1yZXR1cm4gYX1mdW5jdGlvbiBIbih0LGUscil7Y29uc3Qgbj1lKCk7aWYocil7bGV0IHQ9MDtmb3IoO24+clt0XTspdCsrO3JldHVybiB0fXJldHVybiBNYXRoLmZsb29yKG4qdCl9Y2xhc3MgUW57Y29uc3RydWN0b3IodD1NYXRoLnJhbmRvbSl7aWYoIm51bWJlciI9PXR5cGVvZiB0KXtjb25zdCBlPW5ldyBZbih0KTt0aGlzLnJhbmRvbUdlbmVyYXRvcj1lLnJhbmRvbX1lbHNlIHRoaXMucmFuZG9tR2VuZXJhdG9yPXR9Y2hvaWNlKHQsZSl7cmV0dXJuIFpuKHQsZSx0aGlzLnJhbmRvbUdlbmVyYXRvcil9cmFuZG9tKCl7cmV0dXJuIHRoaXMucmFuZG9tR2VuZXJhdG9yKCl9cmFuZEludCh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10LHQ9MCksdCtNYXRoLmZsb29yKHRoaXMucmFuZG9tR2VuZXJhdG9yKCkqKGUtdCkpfXJhbmRvbVNhbXBsZSh0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHRoaXMucmFuZG9tKCkpO3JldHVybiBlfX1mdW5jdGlvbiB0byh0LGUpe2NvbnN0IHI9bmV3IFZlKHQucm93cyxlLnJvd3MpO2ZvcihsZXQgbj0wO248dC5yb3dzO24rKylmb3IobGV0IG89MDtvPGUucm93cztvKyspci5zZXQobixvLEduKHQuZ2V0Um93KG4pLGUuZ2V0Um93KG8pKSk7cmV0dXJuIHJ9ZnVuY3Rpb24gZW8odCl7bGV0IGU9W107Zm9yKGxldCByPTA7cjx0O3IrKyllLnB1c2gocik7cmV0dXJuIGV9ZnVuY3Rpb24gcm8odCl7bGV0IGU9W3RbMF1dO2ZvcihsZXQgcj0xO3I8dC5sZW5ndGg7cisrKWVbcl09ZVtyLTFdK3Rbcl07cmV0dXJuIGV9Y29uc3Qgbm89U3ltYm9sKCJkaXN0YW5jZSIpO2NsYXNzIG9ve2NvbnN0cnVjdG9yKHQsZSxyLG4sbyl7dGhpcy5jbHVzdGVycz10LHRoaXMuY2VudHJvaWRzPWUsdGhpcy5jb252ZXJnZWQ9cix0aGlzLml0ZXJhdGlvbnM9bix0aGlzW25vXT1vfW5lYXJlc3QodCl7Y29uc3QgZT1uZXcgQXJyYXkodC5sZW5ndGgpO3JldHVybiBYbih0LHRoaXMuY2VudHJvaWRzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2VudHJvaWR9KSksZSx0aGlzW25vXSl9Y29tcHV0ZUluZm9ybWF0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmNlbnRyb2lkcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybntjZW50cm9pZDp0LGVycm9yOjAsc2l6ZTowfX0pKSxyPTA7cjx0Lmxlbmd0aDtyKyspZVt0aGlzLmNsdXN0ZXJzW3JdXS5lcnJvcis9dGhpc1tub10odFtyXSx0aGlzLmNlbnRyb2lkc1t0aGlzLmNsdXN0ZXJzW3JdXSksZVt0aGlzLmNsdXN0ZXJzW3JdXS5zaXplKys7Zm9yKHZhciBuPTA7bjx0aGlzLmNlbnRyb2lkcy5sZW5ndGg7bisrKWVbbl0uc2l6ZT9lW25dLmVycm9yLz1lW25dLnNpemU6ZVtuXS5lcnJvcj1udWxsO3JldHVybiBuZXcgb28odGhpcy5jbHVzdGVycyxlLHRoaXMuY29udmVyZ2VkLHRoaXMuaXRlcmF0aW9ucyx0aGlzW25vXSl9fWNvbnN0IHNvPXttYXhJdGVyYXRpb25zOjEwMCx0b2xlcmFuY2U6MWUtNix3aXRoSXRlcmF0aW9uczohMSxpbml0aWFsaXphdGlvbjoia21lYW5zKysiLGRpc3RhbmNlRnVuY3Rpb246R259O2Z1bmN0aW9uIGlvKHQsZSxyLG4sbyxzKXt2YXIgaT1mdW5jdGlvbih0LGUscixuKXtjb25zdCBvPWVbMF0ubGVuZ3RoO2Zvcih2YXIgcz1uZXcgQXJyYXkobiksaT1uZXcgQXJyYXkobiksdT0wO3U8bjt1Kyspe3NbdV09bmV3IEFycmF5KG8pLGlbdV09MDtmb3IodmFyIGE9MDthPG87YSsrKXNbdV1bYV09MH1mb3IodmFyIGg9MDtoPGUubGVuZ3RoO2grKyl7aVtyW2hdXSsrO2Zvcih2YXIgbD0wO2w8bztsKyspc1tyW2hdXVtsXSs9ZVtoXVtsXX1mb3IodmFyIGM9MDtjPG47YysrKWZvcih2YXIgZj0wO2Y8bztmKyspaVtjXT9zW2NdW2ZdLz1pW2NdOnNbY11bZl09dFtjXVtmXTtyZXR1cm4gc30odCxlLHI9WG4oZSx0LHIsby5kaXN0YW5jZUZ1bmN0aW9uKSxuKSx1PWZ1bmN0aW9uKHQsZSxyLG4pe2Zvcih2YXIgbz0wO288dC5sZW5ndGg7bysrKWlmKHIodFtvXSxlW29dKT5uKXJldHVybiExO3JldHVybiEwfShpLHQsby5kaXN0YW5jZUZ1bmN0aW9uLG8udG9sZXJhbmNlKTtyZXR1cm4gbmV3IG9vKHIsaSx1LHMsby5kaXN0YW5jZUZ1bmN0aW9uKX1mdW5jdGlvbiB1byh0LGUscil7aWYocj1PYmplY3QuYXNzaWduKHt9LHNvLHIpLGU8PTB8fGU+dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKGUpKXRocm93IG5ldyBFcnJvcigiSyBzaG91bGQgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHNtYWxsZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHBvaW50cyIpO3ZhciBuO2lmKEFycmF5LmlzQXJyYXkoci5pbml0aWFsaXphdGlvbikpe2lmKHIuaW5pdGlhbGl6YXRpb24ubGVuZ3RoIT09ZSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBpbml0aWFsIGNlbnRlcnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIEsiKTtuPXIuaW5pdGlhbGl6YXRpb259ZWxzZSBzd2l0Y2goci5pbml0aWFsaXphdGlvbil7Y2FzZSJrbWVhbnMrKyI6bj1mdW5jdGlvbih0LGUscj17fSl7Y29uc3Qgbj0odD1uZXcgVmUodCkpLnJvd3Msbz1uZXcgUW4oci5zZWVkKSxzPVtdLGk9ci5sb2NhbFRyaWFsc3x8MitNYXRoLmZsb29yKE1hdGgubG9nKGUpKSx1PW8ucmFuZEludChuKTtzLnB1c2godC5nZXRSb3codSkpO2xldCBhPW5ldyBWZSgxLHQucm93cyk7Zm9yKGxldCBlPTA7ZTx0LnJvd3M7ZSsrKWEuc2V0KDAsZSxHbih0LmdldFJvdyhlKSxzWzBdKSk7bGV0IGg9W3JvKGEuZ2V0Um93KDApKV07Y29uc3QgbD0xL2hbMF1bbi0xXTtsZXQgYz1WZS5tdWwoYSxsKTtmb3IobGV0IHI9MTtyPGU7cisrKXtjb25zdCBlPW8uY2hvaWNlKG4se3JlcGxhY2U6ITAsc2l6ZTppLHByb2JhYmlsaXRpZXM6Y1swXX0pLHU9dG8odC5zZWxlY3Rpb24oZSxlbyh0LmNvbHVtbnMpKSx0KTtsZXQgbCxmLG07Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgcj1WZS5taW4oYSxbdS5nZXRSb3codCldKSxuPXIuc3VtKCk7KHZvaWQgMD09PWx8fG48ZikmJihsPWVbdF0sZj1uLG09cil9c1tyXT10LmdldFJvdyhsKSxhPW0saD1bcm8oYS5nZXRSb3coMCkpXSxjPVZlLm11bChhLDEvaFswXVtuLTFdKX1yZXR1cm4gc30odCxlLHIpO2JyZWFrO2Nhc2UicmFuZG9tIjpuPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gbmV3IFFuKHIpLmNob2ljZSh0LHtzaXplOmV9KX0odCxlLHIuc2VlZCk7YnJlYWs7Y2FzZSJtb3N0RGlzdGFudCI6bj1mdW5jdGlvbih0LGUscixuKXtjb25zdCBvPW5ldyBRbihuKTt2YXIgcz1uZXcgQXJyYXkoZSk7aWYoc1swXT1NYXRoLmZsb29yKG8ucmFuZG9tKCkqdC5sZW5ndGgpLGU+MSl7Zm9yKHZhciBpPXtkaXN0Oi0xLGluZGV4Oi0xfSx1PTA7dTx0Lmxlbmd0aDsrK3UpcltzWzBdXVt1XT5pLmRpc3QmJihpLmRpc3Q9cltzWzBdXVt1XSxpLmluZGV4PXUpO2lmKHNbMV09aS5pbmRleCxlPjIpZm9yKHZhciBhPTI7YTxlOysrYSl7Zm9yKHZhciBoPXtkaXN0Oi0xLGluZGV4Oi0xfSxsPTA7bDx0Lmxlbmd0aDsrK2wpe2Zvcih2YXIgYz17ZGlzdDpOdW1iZXIuTUFYX1ZBTFVFLGluZGV4Oi0xfSxmPTA7ZjxhOysrZilyW2ZdW2xdPGMuZGlzdCYmLTE9PT1zLmluZGV4T2YobCkmJihjPXtkaXN0OnJbZl1bbF0saW5kZXg6bH0pO2MuZGlzdCE9PU51bWJlci5NQVhfVkFMVUUmJmMuZGlzdD5oLmRpc3QmJihoPU9iamVjdC5hc3NpZ24oe30sYykpfXNbYV09aC5pbmRleH19cmV0dXJuIHMubWFwKChlPT50W2VdKSl9KHQsZSxmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1uZXcgQXJyYXkodC5sZW5ndGgpLG49MDtuPHQubGVuZ3RoOysrbilmb3IodmFyIG89bjtvPHQubGVuZ3RoOysrbyl7cltuXXx8KHJbbl09bmV3IEFycmF5KHQubGVuZ3RoKSkscltvXXx8KHJbb109bmV3IEFycmF5KHQubGVuZ3RoKSk7Y29uc3Qgcz1lKHRbbl0sdFtvXSk7cltuXVtvXT1zLHJbb11bbl09c31yZXR1cm4gcn0odCxyLmRpc3RhbmNlRnVuY3Rpb24pLHIuc2VlZCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gaW5pdGlhbGl6YXRpb24gbWV0aG9kOiAiJHtyLmluaXRpYWxpemF0aW9ufSJgKX0wPT09ci5tYXhJdGVyYXRpb25zJiYoci5tYXhJdGVyYXRpb25zPU51bWJlci5NQVhfVkFMVUUpO3ZhciBvPW5ldyBBcnJheSh0Lmxlbmd0aCk7aWYoci53aXRoSXRlcmF0aW9ucylyZXR1cm4gZnVuY3Rpb24qKHQsZSxyLG4sbyl7Zm9yKHZhciBzLGk9ITEsdT0wOyFpJiZ1PG8ubWF4SXRlcmF0aW9uczspcz1pbyh0LGUscixuLG8sKyt1KSx5aWVsZCBzLmNvbXB1dGVJbmZvcm1hdGlvbihlKSxpPXMuY29udmVyZ2VkLHQ9cy5jZW50cm9pZHN9KG4sdCxvLGUscik7Zm9yKHZhciBzLGk9ITEsdT0wOyFpJiZ1PHIubWF4SXRlcmF0aW9uczspaT0ocz1pbyhuLHQsbyxlLHIsKyt1KSkuY29udmVyZ2VkLG49cy5jZW50cm9pZHM7cmV0dXJuIHMuY29tcHV0ZUluZm9ybWF0aW9uKHQpfWZ1bmN0aW9uIGFvKHQsZT17fSl7bGV0IHI9Q3QoZSwia051bWJlciIpO3I9ZG4ocik/T24ocik6MjtsZXQgbixvPUN0KGUsIm1vZGUiKTtpZigiay1tZWRvaWRzIiE9PW8mJiJrLW1lYW5zIiE9PW8mJihvPSJrLW1lZG9pZHMiKSwiay1tZWRvaWRzIj09PW8pbj1mdW5jdGlvbih0LGUpe2xldCByPXt9O2Z1bmN0aW9uIG4odCl7cmV0dXJuIHpuKHQsIjoiKX1icih0LCgodCxlKT0+e2xldCBvPW4odCk7cltvXT1lfSkpO2xldCBvPUJuLkNsdXN0ZXJlci5nZXRJbnN0YW5jZSh0LGUpLmdldENsdXN0ZXJlZERhdGEoKTtyZXR1cm4gbz1tbihvLCh0PT5tbih0LCh0PT57bGV0IGU9bih0KTtyZXR1cm4gcltlXX0pKSkpLG99KHQscik7ZWxzZXtpZigiay1tZWFucyIhPT1vKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBtb2RlIik7bj1mdW5jdGlvbih0LGUpe2xldCByPXVvKHQsZSksbj17fTtyZXR1cm4gYnIoci5jbHVzdGVycywoKHQsZSk9PntuW3RdfHwoblt0XT1bXSksblt0XS5wdXNoKGUpfSkpLHBuKG4pfSh0LHIpfXJldHVybiBufWZ1bmN0aW9uIGhvKHQsZT17fSl7aWYoIWRlKHQpKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3QgZWZmLiBhcnJheSIpO2xldCByPUN0KGUsImtOdW1iZXIiKTtyPWRuKHIpP09uKHIpOjI7bGV0IG49Q3QoZSwibkNvbXBOSVBBTFMiKTtuPWRuKG4pP09uKG4pOjI7bGV0IG89Q3QoZSwibW9kZSIpLHM9IiIsaT1sZSh0KSx1PTAsYT0wO2lmKGJyKHQsKHQ9PnshZnVuY3Rpb24odCl7aWYoZ2UodCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiEwO3JldHVybiExfXJldHVybiExfSh0KT9kZSh0KSYmKGErPTEpOnUrPTF9KSksdT09PWkpcz0ib2JqIjtlbHNle2lmKGEhPT1pKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3Qgb2YgdGhlIHNhbWUgdHlwZSIpO3M9Im1hdCJ9bGV0IGgsbD1udWxsOyJvYmoiPT09cz8obD1mdW5jdGlvbih0KXtsZXQgZT17fTticih0LCh0PT57YnIodCwoKHQscik9PntlW3JdfHwoZVtyXT0wKSwwPT09ZVtyXSYmZG4odCkmJihlW3JdPTEpLDEhPT1lW3JdfHxkbih0KXx8KGVbcl09LTEpfSkpfSkpO2xldCByPVtdO3JldHVybiBicihlLCgodCxlKT0+ezE9PT10JiZyLnB1c2goZSl9KSkscn0odCksaD1mdW5jdGlvbih0LGUpe3JldHVybiBtbih0LCh0PT57bGV0IHI9Ym4odCxlKTtyZXR1cm4gcG4ocil9KSl9KHQsbCkpOmg9dDtsZXQgYz1XZShoLHtuQ29tcE5JUEFMUzpufSksZj1hbyhjLHtrTnVtYmVyOnIsbW9kZTpvfSksbT1tbihmLCh0PT5tbih0LCh0PT5jW3RdKSkpKTtyZXR1cm57a2V5czpsLGdpbmRzOmYsZ2x0ZHQ6bW4oZiwoZT0+bW4oZSwoZT0+dFtlXSkpKSksZ21hdDptfX1sZXQgV0NsdXN0ZXI9e1BDQTphc3luYyBmdW5jdGlvbih0LGU9e30pe3JldHVybiBXZSh0LGUpfSxjbHVzdGVyOmFzeW5jIGZ1bmN0aW9uKHQsZT17fSl7dHJ5e3JldHVybiBobyh0LGUpfWNhdGNoKHQpe3JldHVybiBQcm9taXNlLnJlamVjdCh0KX19fTtleHBvcnR7V0NsdXN0ZXIgYXMgZGVmYXVsdH07CgoKbGV0IGluc3RhbmNlID0gbnVsbApmdW5jdGlvbiBpbml0KGlucHV0KXsKCiAgICAvL2luaXQKICAgIGxldCByCiAgICAKICAgICAgICByID0gV0NsdXN0ZXIoLi4uaW5wdXQpCiAgICAgICAgCgogICAgLy9vbgogICAgCgogICAgLy9zYXZlCiAgICBpbnN0YW5jZSA9IHIKCn0KCmZ1bmN0aW9uIHNlbmRNZXNzYWdlKGRhdGEpIHsKICAgIAogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoZGF0YSkKICAgICAgICAKfQoKYXN5bmMgZnVuY3Rpb24gcnVuKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcnVuJyxkYXRhKQoKICAgIC8vbW9kZQogICAgbGV0IG1vZGUgPSBkYXRhLm1vZGUKCiAgICAvL2NoZWNrCiAgICBpZihtb2RlICE9PSAnaW5pdCcgJiYgbW9kZSAhPT0gJ2NhbGwnKXsKICAgICAgICByZXR1cm4KICAgIH0KCiAgICAvL2luaXQKICAgIGlmKG1vZGUgPT09ICdpbml0Jyl7CiAgICAgICAgCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy90eXBlCiAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKICAgIAogICAgICAgICAgICAvL2luc3RhbmNlCiAgICAgICAgICAgIGlmKHR5cGUgPT09ICdmdW5jdGlvbicpewogICAgICAgICAgICAgICAgaW5pdCguLi5pbnB1dCkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHR5cGUgPT09ICdvYmplY3QnKXsKICAgICAgICAgICAgICAgIGluc3RhbmNlID0gV0NsdXN0ZXIKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAKICAgICAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICAgICAgbW9kZTogJ2VtaXQnLAogICAgICAgICAgICAgICAgZXZOYW1lOiAnZXJyb3InLAogICAgICAgICAgICAgICAgbXNnOiBlcnIsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgICAgICB9CiAgICAgICAgICAgIAogICAgfQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgPT09ICdjYWxsJyl7CiAgICAgICAgbGV0IHN0YXRlID0gJycKICAgICAgICBsZXQgbXNnID0gbnVsbAoKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL2Z1bgogICAgICAgICAgICBsZXQgZnVuID0gaW5zdGFuY2VbZGF0YS5mdW5dCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKCiAgICAgICAgICAgIC8vZXhlYwogICAgICAgICAgICBhd2FpdCBmdW4oLi4uaW5wdXQpCiAgICAgICAgICAgICAgICAudGhlbigoc3VjKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J3N1Y2Nlc3MnCiAgICAgICAgICAgICAgICAgICAgbXNnPXN1YwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J2Vycm9yJwogICAgICAgICAgICAgICAgICAgIG1zZz1lcnIKICAgICAgICAgICAgICAgIH0pCgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgICAgICBzdGF0ZSA9ICdlcnJvcicKICAgICAgICAgICAgbXNnID0gZXJyCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICBtb2RlOiAncmV0dXJuJywKICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgIGZ1bjogZGF0YS5mdW4sCiAgICAgICAgICAgIHN0YXRlLAogICAgICAgICAgICBtc2csCiAgICAgICAgfQogICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICB9Cgp9CgpmdW5jdGlvbiByZWN2TWVzc2FnZShkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJlY3Y6JywgZGF0YSkKCiAgICAvL2RhdGFSZWN2CiAgICBsZXQgZGF0YVJlY3YgPSBkYXRhCgogICAgLy9ydW4KICAgIHJ1bihkYXRhUmVjdikKCn0KCgogICAgICAgIHNlbGYub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgcmVjdk1lc3NhZ2UoZS5kYXRhKQogICAgICAgIH0KICAgICAgICAKCg==");function G(){var l=d();function Z(d){try{var l=new Blob([d]),b=window.URL||window.webkitURL;return new Worker(b.createObjectURL(l))}catch(d){i(d)}}var G=Z(X);if(!G)return i("invalid worker"),null;function y(){G?(G.terminate(),G=void 0):i("worker has been terminated")}function m(){var d={mode:"init",type:"object",input:Array.prototype.slice.call(arguments)};G.postMessage(d)}function K(){var d=b(),Z=c(),X={mode:"call",id:Z,fun:"PCA",input:Array.prototype.slice.call(arguments)};return G.postMessage(X),l.once(Z,(function(l){"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d}function p(){var d=b(),Z=c(),X={mode:"call",id:Z,fun:"cluster",input:Array.prototype.slice.call(arguments)};return G.postMessage(X),l.once(Z,(function(l){"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d}function t(d){var b=d,c=b.mode;"emit"!==c&&"return"!==c||("emit"===c&&l.emit(b.evName,b.msg),"return"===c&&l.emit(b.id,b))}function i(d){l.emit("error",d)}return G.onmessage=function(d){t(d.data)},G.onerror=i,m(Array.prototype.slice.call(arguments)),l.PCA=K,l.cluster=p,l.terminate=y,l}var y,p,t={PCA:(p=Z(K.mark((function d(){var b,c,Z,X=arguments;return K.wrap((function(d){for(;;)switch(d.prev=d.next){case 0:return b=Array.prototype.slice.call(X),c=G(),d.next=4,c.PCA.apply(c,l(b)).finally((function(){c.terminate()}));case 4:return Z=d.sent,d.abrupt("return",Z);case 6:case"end":return d.stop()}}),d)}))),function(){return p.apply(this,arguments)}),cluster:(y=Z(K.mark((function d(){var b,c,Z,X=arguments;return K.wrap((function(d){for(;;)switch(d.prev=d.next){case 0:return b=Array.prototype.slice.call(X),c=G(),d.next=4,c.cluster.apply(c,l(b)).finally((function(){c.terminate()}));case 4:return Z=d.sent,d.abrupt("return",Z);case 6:case"end":return d.stop()}}),d)}))),function(){return y.apply(this,arguments)})};for(var i in m=d(),t){var u=t[i];m[i]=u}}(),m}()}));return"undefined"!=typeof window&&void 0!==window.document?G:X}));
|
|
1
|
+
!function(d,l){"object"==typeof exports&&"undefined"!=typeof module?module.exports=l(require("worker_threads")):"function"==typeof define&&define.amd?define(["worker_threads"],l):(d="undefined"!=typeof globalThis?globalThis:d||self)["w-cluster"]=l(d.worker_threads)}(this,(function(d){"use strict";function l(d){return d&&"object"==typeof d&&"default"in d?d:{default:d}}var c=l(d);function b(d){return b="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(d){return typeof d}:function(d){return d&&"function"==typeof Symbol&&d.constructor===Symbol&&d!==Symbol.prototype?"symbol":typeof d},b(d)}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function Z(d){var l={exports:{}};return d(l,l.exports),l.exports}var X=Z((function(d,l){d.exports=function(d){function l(d,l){(null==l||l>d.length)&&(l=d.length);for(var c=0,b=new Array(l);c<l;c++)b[c]=d[c];return b}function c(d){return function(d){if(Array.isArray(d))return l(d)}(d)||function(d){if("undefined"!=typeof Symbol&&null!=d[Symbol.iterator]||null!=d["@@iterator"])return Array.from(d)}(d)||function(d,c){if(d){if("string"==typeof d)return l(d,c);var b=Object.prototype.toString.call(d).slice(8,-1);return"Object"===b&&d.constructor&&(b=d.constructor.name),"Map"===b||"Set"===b?Array.from(d):"Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b)?l(d,c):void 0}}(d)||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 Z(d,l,c,b,Z,X,G){try{var y=d[X](G),m=y.value}catch(d){return void c(d)}y.done?l(m):Promise.resolve(m).then(b,Z)}function X(d){return function(){var l=this,c=arguments;return new Promise((function(b,X){var G=d.apply(l,c);function y(d){Z(G,b,X,y,m,"next",d)}function m(d){Z(G,b,X,y,m,"throw",d)}y(void 0)}))}}function G(d){return G="function"==typeof Symbol&&"symbol"==b(Symbol.iterator)?function(d){return b(d)}:function(d){return d&&"function"==typeof Symbol&&d.constructor===Symbol&&d!==Symbol.prototype?"symbol":b(d)},G(d)}function y(d){var l={exports:{}};return d(l,l.exports),l.exports}var m,K=y((function(d){var l=function(d){var l,c=Object.prototype,b=c.hasOwnProperty,Z="function"==typeof Symbol?Symbol:{},X=Z.iterator||"@@iterator",y=Z.asyncIterator||"@@asyncIterator",m=Z.toStringTag||"@@toStringTag";function K(d,l,c){return Object.defineProperty(d,l,{value:c,enumerable:!0,configurable:!0,writable:!0}),d[l]}try{K({},"")}catch(d){K=function(d,l,c){return d[l]=c}}function p(d,l,c,b){var Z=l&&l.prototype instanceof W?l:W,X=Object.create(Z.prototype),G=new R(b||[]);return X._invoke=function(d,l,c){var b=i;return function(Z,X){if(b===I)throw new Error("Generator is already running");if(b===o){if("throw"===Z)throw X;return T()}for(c.method=Z,c.arg=X;;){var G=c.delegate;if(G){var y=S(G,c);if(y){if(y===h)continue;return y}}if("next"===c.method)c.sent=c._sent=c.arg;else if("throw"===c.method){if(b===i)throw b=o,c.arg;c.dispatchException(c.arg)}else"return"===c.method&&c.abrupt("return",c.arg);b=I;var m=t(d,l,c);if("normal"===m.type){if(b=c.done?o:u,m.arg===h)continue;return{value:m.arg,done:c.done}}"throw"===m.type&&(b=o,c.method="throw",c.arg=m.arg)}}}(d,c,G),X}function t(d,l,c){try{return{type:"normal",arg:d.call(l,c)}}catch(d){return{type:"throw",arg:d}}}d.wrap=p;var i="suspendedStart",u="suspendedYield",I="executing",o="completed",h={};function W(){}function V(){}function s(){}var H={};K(H,X,(function(){return this}));var L=Object.getPrototypeOf,C=L&&L(L(z([])));C&&C!==c&&b.call(C,X)&&(H=C);var a=s.prototype=W.prototype=Object.create(H);function n(d){["next","throw","return"].forEach((function(l){K(d,l,(function(d){return this._invoke(l,d)}))}))}function x(d,l){function c(Z,X,y,m){var K=t(d[Z],d,X);if("throw"!==K.type){var p=K.arg,i=p.value;return i&&"object"===G(i)&&b.call(i,"__await")?l.resolve(i.__await).then((function(d){c("next",d,y,m)}),(function(d){c("throw",d,y,m)})):l.resolve(i).then((function(d){p.value=d,y(p)}),(function(d){return c("throw",d,y,m)}))}m(K.arg)}var Z;this._invoke=function(d,b){function X(){return new l((function(l,Z){c(d,b,l,Z)}))}return Z=Z?Z.then(X,X):X()}}function S(d,c){var b=d.iterator[c.method];if(b===l){if(c.delegate=null,"throw"===c.method){if(d.iterator.return&&(c.method="return",c.arg=l,S(d,c),"throw"===c.method))return h;c.method="throw",c.arg=new TypeError("The iterator does not provide a 'throw' method")}return h}var Z=t(b,d.iterator,c.arg);if("throw"===Z.type)return c.method="throw",c.arg=Z.arg,c.delegate=null,h;var X=Z.arg;return X?X.done?(c[d.resultName]=X.value,c.next=d.nextLoc,"return"!==c.method&&(c.method="next",c.arg=l),c.delegate=null,h):X:(c.method="throw",c.arg=new TypeError("iterator result is not an object"),c.delegate=null,h)}function Y(d){var l={tryLoc:d[0]};1 in d&&(l.catchLoc=d[1]),2 in d&&(l.finallyLoc=d[2],l.afterLoc=d[3]),this.tryEntries.push(l)}function g(d){var l=d.completion||{};l.type="normal",delete l.arg,d.completion=l}function R(d){this.tryEntries=[{tryLoc:"root"}],d.forEach(Y,this),this.reset(!0)}function z(d){if(d){var c=d[X];if(c)return c.call(d);if("function"==typeof d.next)return d;if(!isNaN(d.length)){var Z=-1,G=function c(){for(;++Z<d.length;)if(b.call(d,Z))return c.value=d[Z],c.done=!1,c;return c.value=l,c.done=!0,c};return G.next=G}}return{next:T}}function T(){return{value:l,done:!0}}return V.prototype=s,K(a,"constructor",s),K(s,"constructor",V),V.displayName=K(s,m,"GeneratorFunction"),d.isGeneratorFunction=function(d){var l="function"==typeof d&&d.constructor;return!!l&&(l===V||"GeneratorFunction"===(l.displayName||l.name))},d.mark=function(d){return Object.setPrototypeOf?Object.setPrototypeOf(d,s):(d.__proto__=s,K(d,m,"GeneratorFunction")),d.prototype=Object.create(a),d},d.awrap=function(d){return{__await:d}},n(x.prototype),K(x.prototype,y,(function(){return this})),d.AsyncIterator=x,d.async=function(l,c,b,Z,X){void 0===X&&(X=Promise);var G=new x(p(l,c,b,Z),X);return d.isGeneratorFunction(c)?G:G.next().then((function(d){return d.done?d.value:G.next()}))},n(a),K(a,m,"Generator"),K(a,X,(function(){return this})),K(a,"toString",(function(){return"[object Generator]"})),d.keys=function(d){var l=[];for(var c in d)l.push(c);return l.reverse(),function c(){for(;l.length;){var b=l.pop();if(b in d)return c.value=b,c.done=!1,c}return c.done=!0,c}},d.values=z,R.prototype={constructor:R,reset:function(d){if(this.prev=0,this.next=0,this.sent=this._sent=l,this.done=!1,this.delegate=null,this.method="next",this.arg=l,this.tryEntries.forEach(g),!d)for(var c in this)"t"===c.charAt(0)&&b.call(this,c)&&!isNaN(+c.slice(1))&&(this[c]=l)},stop:function(){this.done=!0;var d=this.tryEntries[0].completion;if("throw"===d.type)throw d.arg;return this.rval},dispatchException:function(d){if(this.done)throw d;var c=this;function Z(b,Z){return y.type="throw",y.arg=d,c.next=b,Z&&(c.method="next",c.arg=l),!!Z}for(var X=this.tryEntries.length-1;X>=0;--X){var G=this.tryEntries[X],y=G.completion;if("root"===G.tryLoc)return Z("end");if(G.tryLoc<=this.prev){var m=b.call(G,"catchLoc"),K=b.call(G,"finallyLoc");if(m&&K){if(this.prev<G.catchLoc)return Z(G.catchLoc,!0);if(this.prev<G.finallyLoc)return Z(G.finallyLoc)}else if(m){if(this.prev<G.catchLoc)return Z(G.catchLoc,!0)}else{if(!K)throw new Error("try statement without catch or finally");if(this.prev<G.finallyLoc)return Z(G.finallyLoc)}}}},abrupt:function(d,l){for(var c=this.tryEntries.length-1;c>=0;--c){var Z=this.tryEntries[c];if(Z.tryLoc<=this.prev&&b.call(Z,"finallyLoc")&&this.prev<Z.finallyLoc){var X=Z;break}}X&&("break"===d||"continue"===d)&&X.tryLoc<=l&&l<=X.finallyLoc&&(X=null);var G=X?X.completion:{};return G.type=d,G.arg=l,X?(this.method="next",this.next=X.finallyLoc,h):this.complete(G)},complete:function(d,l){if("throw"===d.type)throw d.arg;return"break"===d.type||"continue"===d.type?this.next=d.arg:"return"===d.type?(this.rval=this.arg=d.arg,this.method="return",this.next="end"):"normal"===d.type&&l&&(this.next=l),h},finish:function(d){for(var l=this.tryEntries.length-1;l>=0;--l){var c=this.tryEntries[l];if(c.finallyLoc===d)return this.complete(c.completion,c.afterLoc),g(c),h}},catch:function(d){for(var l=this.tryEntries.length-1;l>=0;--l){var c=this.tryEntries[l];if(c.tryLoc===d){var b=c.completion;if("throw"===b.type){var Z=b.arg;g(c)}return Z}}throw new Error("illegal catch attempt")},delegateYield:function(d,c,b){return this.delegate={iterator:z(d),resultName:c,nextLoc:b},"next"===this.method&&(this.arg=l),h}},d}(d.exports);try{regeneratorRuntime=l}catch(d){"object"===("undefined"==typeof globalThis?"undefined":G(globalThis))?globalThis.regeneratorRuntime=l:Function("r","regeneratorRuntime = r")(l)}})),p=y((function(d){var l=Object.prototype.hasOwnProperty,c="~";function b(){}function Z(d,l,c){this.fn=d,this.context=l,this.once=c||!1}function X(d,l,b,X,G){if("function"!=typeof b)throw new TypeError("The listener must be a function");var y=new Z(b,X||d,G),m=c?c+l:l;return d._events[m]?d._events[m].fn?d._events[m]=[d._events[m],y]:d._events[m].push(y):(d._events[m]=y,d._eventsCount++),d}function G(d,l){0==--d._eventsCount?d._events=new b:delete d._events[l]}function y(){this._events=new b,this._eventsCount=0}Object.create&&(b.prototype=Object.create(null),(new b).__proto__||(c=!1)),y.prototype.eventNames=function(){var d,b,Z=[];if(0===this._eventsCount)return Z;for(b in d=this._events)l.call(d,b)&&Z.push(c?b.slice(1):b);return Object.getOwnPropertySymbols?Z.concat(Object.getOwnPropertySymbols(d)):Z},y.prototype.listeners=function(d){var l=c?c+d:d,b=this._events[l];if(!b)return[];if(b.fn)return[b.fn];for(var Z=0,X=b.length,G=new Array(X);Z<X;Z++)G[Z]=b[Z].fn;return G},y.prototype.listenerCount=function(d){var l=c?c+d:d,b=this._events[l];return b?b.fn?1:b.length:0},y.prototype.emit=function(d,l,b,Z,X,G){var y=c?c+d:d;if(!this._events[y])return!1;var m,K,p=this._events[y],t=arguments.length;if(p.fn){switch(p.once&&this.removeListener(d,p.fn,void 0,!0),t){case 1:return p.fn.call(p.context),!0;case 2:return p.fn.call(p.context,l),!0;case 3:return p.fn.call(p.context,l,b),!0;case 4:return p.fn.call(p.context,l,b,Z),!0;case 5:return p.fn.call(p.context,l,b,Z,X),!0;case 6:return p.fn.call(p.context,l,b,Z,X,G),!0}for(K=1,m=new Array(t-1);K<t;K++)m[K-1]=arguments[K];p.fn.apply(p.context,m)}else{var i,u=p.length;for(K=0;K<u;K++)switch(p[K].once&&this.removeListener(d,p[K].fn,void 0,!0),t){case 1:p[K].fn.call(p[K].context);break;case 2:p[K].fn.call(p[K].context,l);break;case 3:p[K].fn.call(p[K].context,l,b);break;case 4:p[K].fn.call(p[K].context,l,b,Z);break;default:if(!m)for(i=1,m=new Array(t-1);i<t;i++)m[i-1]=arguments[i];p[K].fn.apply(p[K].context,m)}}return!0},y.prototype.on=function(d,l,c){return X(this,d,l,c,!1)},y.prototype.once=function(d,l,c){return X(this,d,l,c,!0)},y.prototype.removeListener=function(d,l,b,Z){var X=c?c+d:d;if(!this._events[X])return this;if(!l)return G(this,X),this;var y=this._events[X];if(y.fn)y.fn!==l||Z&&!y.once||b&&y.context!==b||G(this,X);else{for(var m=0,K=[],p=y.length;m<p;m++)(y[m].fn!==l||Z&&!y[m].once||b&&y[m].context!==b)&&K.push(y[m]);K.length?this._events[X]=1===K.length?K[0]:K:G(this,X)}return this},y.prototype.removeAllListeners=function(d){var l;return d?(l=c?c+d:d,this._events[l]&&G(this,l)):(this._events=new b,this._eventsCount=0),this},y.prototype.off=y.prototype.removeListener,y.prototype.addListener=y.prototype.on,y.prefixed=c,y.EventEmitter=y,d.exports=y}));return function(){if("nodejs"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function l(){return new p}function b(){var d,l,c=new Promise((function(){d=arguments[0],l=arguments[1]}));return c.resolve=d,c.reject=l,c}function Z(){for(var d=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,l=[],c="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),b=c.length,Z=0;Z<d;Z++)l[Z]=c[0|Math.random()*b];return l.join("")}var G,y=(G="CgogICAgICAgIGxldCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykKICAgICAgICAKCnZhciB0PUFycmF5LmlzQXJyYXksZT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsImRlZmF1bHQiKT90LmRlZmF1bHQ6dH1mdW5jdGlvbiBuKHQpe3ZhciBlPXtleHBvcnRzOnt9fTtyZXR1cm4gdChlLGUuZXhwb3J0cyksZS5leHBvcnRzfXZhciBvPSJvYmplY3QiPT10eXBlb2YgZSYmZSYmZS5PYmplY3Q9PT1PYmplY3QmJmUscz0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLGk9b3x8c3x8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSx1PWkuU3ltYm9sLGE9T2JqZWN0LnByb3RvdHlwZSxoPWEuaGFzT3duUHJvcGVydHksbD1hLnRvU3RyaW5nLGM9dT91LnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgZj1mdW5jdGlvbih0KXt2YXIgZT1oLmNhbGwodCxjKSxyPXRbY107dHJ5e3RbY109dm9pZCAwO3ZhciBuPSEwfWNhdGNoKHQpe312YXIgbz1sLmNhbGwodCk7cmV0dXJuIG4mJihlP3RbY109cjpkZWxldGUgdFtjXSksb30sbT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBnPWZ1bmN0aW9uKHQpe3JldHVybiBtLmNhbGwodCl9LHA9dT91LnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgdz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD92b2lkIDA9PT10PyJbb2JqZWN0IFVuZGVmaW5lZF0iOiJbb2JqZWN0IE51bGxdIjpwJiZwIGluIE9iamVjdCh0KT9mKHQpOmcodCl9O3ZhciBkPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9O3ZhciBiPWZ1bmN0aW9uKHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdHx8ZCh0KSYmIltvYmplY3QgU3ltYm9sXSI9PXcodCl9LHk9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8sdj0vXlx3KiQvO3ZhciBNPWZ1bmN0aW9uKGUscil7aWYodChlKSlyZXR1cm4hMTt2YXIgbj10eXBlb2YgZTtyZXR1cm4hKCJudW1iZXIiIT1uJiYic3ltYm9sIiE9biYmImJvb2xlYW4iIT1uJiZudWxsIT1lJiYhYihlKSl8fCh2LnRlc3QoZSl8fCF5LnRlc3QoZSl8fG51bGwhPXImJmUgaW4gT2JqZWN0KHIpKX07dmFyIHg9ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9O3ZhciBFLFM9ZnVuY3Rpb24odCl7aWYoIXgodCkpcmV0dXJuITE7dmFyIGU9dyh0KTtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBBc3luY0Z1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IFByb3h5XSI9PWV9LGo9aVsiX19jb3JlLWpzX3NoYXJlZF9fIl0sXz0oRT0vW14uXSskLy5leGVjKGomJmoua2V5cyYmai5rZXlzLklFX1BST1RPfHwiIikpPyJTeW1ib2woc3JjKV8xLiIrRToiIjt2YXIgQT1mdW5jdGlvbih0KXtyZXR1cm4hIV8mJl8gaW4gdH0sQz1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7dmFyIFI9ZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7dHJ5e3JldHVybiBDLmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifSxJPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLGs9RnVuY3Rpb24ucHJvdG90eXBlLE49T2JqZWN0LnByb3RvdHlwZSxPPWsudG9TdHJpbmcsRj1OLmhhc093blByb3BlcnR5LHo9UmVnRXhwKCJeIitPLmNhbGwoRikucmVwbGFjZSgvW1xcXiQuKis/KClbXF17fXxdL2csIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7dmFyIFQ9ZnVuY3Rpb24odCl7cmV0dXJuISgheCh0KXx8QSh0KSkmJihTKHQpP3o6SSkudGVzdChSKHQpKX07dmFyIFY9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX07dmFyIFA9ZnVuY3Rpb24odCxlKXt2YXIgcj1WKHQsZSk7cmV0dXJuIFQocik/cjp2b2lkIDB9LHE9UChPYmplY3QsImNyZWF0ZSIpO3ZhciAkPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1xP3EobnVsbCk6e30sdGhpcy5zaXplPTB9O3ZhciBEPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxVPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIEw9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihxKXt2YXIgcj1lW3RdO3JldHVybiJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIj09PXI/dm9pZCAwOnJ9cmV0dXJuIFUuY2FsbChlLHQpP2VbdF06dm9pZCAwfSxCPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIEc9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gcT92b2lkIDAhPT1lW3RdOkIuY2FsbChlLHQpfTt2YXIgSz1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLHJbdF09cSYmdm9pZCAwPT09ZT8iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI6ZSx0aGlzfTtmdW5jdGlvbiBXKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fVcucHJvdG90eXBlLmNsZWFyPSQsVy5wcm90b3R5cGUuZGVsZXRlPUQsVy5wcm90b3R5cGUuZ2V0PUwsVy5wcm90b3R5cGUuaGFzPUcsVy5wcm90b3R5cGUuc2V0PUs7dmFyIFg9Vzt2YXIgSj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9O3ZhciBZPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfTt2YXIgWj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10Lmxlbmd0aDtyLS07KWlmKFkodFtyXVswXSxlKSlyZXR1cm4gcjtyZXR1cm4tMX0sSD1BcnJheS5wcm90b3R5cGUuc3BsaWNlO3ZhciBRPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1aKGUsdCk7cmV0dXJuIShyPDApJiYocj09ZS5sZW5ndGgtMT9lLnBvcCgpOkguY2FsbChlLHIsMSksLS10aGlzLnNpemUsITApfTt2YXIgdHQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPVooZSx0KTtyZXR1cm4gcjwwP3ZvaWQgMDplW3JdWzFdfTt2YXIgZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIFoodGhpcy5fX2RhdGFfXyx0KT4tMX07dmFyIHJ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXyxuPVoocix0KTtyZXR1cm4gbjwwPygrK3RoaXMuc2l6ZSxyLnB1c2goW3QsZV0pKTpyW25dWzFdPWUsdGhpc307ZnVuY3Rpb24gbnQodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19bnQucHJvdG90eXBlLmNsZWFyPUosbnQucHJvdG90eXBlLmRlbGV0ZT1RLG50LnByb3RvdHlwZS5nZXQ9dHQsbnQucHJvdG90eXBlLmhhcz1ldCxudC5wcm90b3R5cGUuc2V0PXJ0O3ZhciBvdD1udCxzdD1QKGksIk1hcCIpO3ZhciBpdD1mdW5jdGlvbigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IFgsbWFwOm5ldyhzdHx8b3QpLHN0cmluZzpuZXcgWH19O3ZhciB1dD1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09ZXx8Im51bWJlciI9PWV8fCJzeW1ib2wiPT1lfHwiYm9vbGVhbiI9PWU/Il9fcHJvdG9fXyIhPT10Om51bGw9PT10fTt2YXIgYXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10Ll9fZGF0YV9fO3JldHVybiB1dChlKT9yWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOnIubWFwfTt2YXIgaHQ9ZnVuY3Rpb24odCl7dmFyIGU9YXQodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX07dmFyIGx0PWZ1bmN0aW9uKHQpe3JldHVybiBhdCh0aGlzLHQpLmdldCh0KX07dmFyIGN0PWZ1bmN0aW9uKHQpe3JldHVybiBhdCh0aGlzLHQpLmhhcyh0KX07dmFyIGZ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9YXQodGhpcyx0KSxuPXIuc2l6ZTtyZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemUrPXIuc2l6ZT09bj8wOjEsdGhpc307ZnVuY3Rpb24gbXQodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19bXQucHJvdG90eXBlLmNsZWFyPWl0LG10LnByb3RvdHlwZS5kZWxldGU9aHQsbXQucHJvdG90eXBlLmdldD1sdCxtdC5wcm90b3R5cGUuaGFzPWN0LG10LnByb3RvdHlwZS5zZXQ9ZnQ7dmFyIGd0PW10O2Z1bmN0aW9uIHB0KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZnVuY3Rpb24iKTt2YXIgcj1mdW5jdGlvbigpe3ZhciBuPWFyZ3VtZW50cyxvPWU/ZS5hcHBseSh0aGlzLG4pOm5bMF0scz1yLmNhY2hlO2lmKHMuaGFzKG8pKXJldHVybiBzLmdldChvKTt2YXIgaT10LmFwcGx5KHRoaXMsbik7cmV0dXJuIHIuY2FjaGU9cy5zZXQobyxpKXx8cyxpfTtyZXR1cm4gci5jYWNoZT1uZXcocHQuQ2FjaGV8fGd0KSxyfXB0LkNhY2hlPWd0O3ZhciB3dD1wdDt2YXIgZHQ9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2csYnQ9L1xcKFxcKT8vZyx5dD1mdW5jdGlvbih0KXt2YXIgZT13dCh0LChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09ci5zaXplJiZyLmNsZWFyKCksdH0pKSxyPWUuY2FjaGU7cmV0dXJuIGV9KChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKGR0LChmdW5jdGlvbih0LHIsbixvKXtlLnB1c2gobj9vLnJlcGxhY2UoYnQsIiQxIik6cnx8dCl9KSksZX0pKTt2YXIgdnQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1udWxsPT10PzA6dC5sZW5ndGgsbz1BcnJheShuKTsrK3I8bjspb1tyXT1lKHRbcl0scix0KTtyZXR1cm4gb30sTXQ9dT91LnByb3RvdHlwZTp2b2lkIDAseHQ9TXQ/TXQudG9TdHJpbmc6dm9pZCAwO3ZhciBFdD1mdW5jdGlvbiBlKHIpe2lmKCJzdHJpbmciPT10eXBlb2YgcilyZXR1cm4gcjtpZih0KHIpKXJldHVybiB2dChyLGUpKyIiO2lmKGIocikpcmV0dXJuIHh0P3h0LmNhbGwocik6IiI7dmFyIG49cisiIjtyZXR1cm4iMCI9PW4mJjEvcj09LUluZmluaXR5PyItMCI6bn07dmFyIFN0PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOkV0KHQpfTt2YXIganQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gdChlKT9lOk0oZSxyKT9bZV06eXQoU3QoZSkpfTt2YXIgX3Q9ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxiKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1JbmZpbml0eT8iLTAiOmV9O3ZhciBBdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49KGU9anQoZSx0KSkubGVuZ3RoO251bGwhPXQmJnI8bjspdD10W190KGVbcisrXSldO3JldHVybiByJiZyPT1uP3Q6dm9pZCAwfTt2YXIgQ3Q9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPW51bGw9PXQ/dm9pZCAwOkF0KHQsZSk7cmV0dXJuIHZvaWQgMD09PW4/cjpufSxSdD1PYmplY3QucHJvdG90eXBlO3ZhciBJdD1mdW5jdGlvbih0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yO3JldHVybiB0PT09KCJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLnByb3RvdHlwZXx8UnQpfTt2YXIga3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQoZShyKSl9fShPYmplY3Qua2V5cyxPYmplY3QpLE50PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIE90PWZ1bmN0aW9uKHQpe2lmKCFJdCh0KSlyZXR1cm4ga3QodCk7dmFyIGU9W107Zm9yKHZhciByIGluIE9iamVjdCh0KSlOdC5jYWxsKHQscikmJiJjb25zdHJ1Y3RvciIhPXImJmUucHVzaChyKTtyZXR1cm4gZX0sRnQ9UChpLCJEYXRhVmlldyIpLHp0PVAoaSwiUHJvbWlzZSIpLFR0PVAoaSwiU2V0IiksVnQ9UChpLCJXZWFrTWFwIiksUHQ9UihGdCkscXQ9UihzdCksJHQ9Uih6dCksRHQ9UihUdCksVXQ9UihWdCksTHQ9dzsoRnQmJiJbb2JqZWN0IERhdGFWaWV3XSIhPUx0KG5ldyBGdChuZXcgQXJyYXlCdWZmZXIoMSkpKXx8c3QmJiJbb2JqZWN0IE1hcF0iIT1MdChuZXcgc3QpfHx6dCYmIltvYmplY3QgUHJvbWlzZV0iIT1MdCh6dC5yZXNvbHZlKCkpfHxUdCYmIltvYmplY3QgU2V0XSIhPUx0KG5ldyBUdCl8fFZ0JiYiW29iamVjdCBXZWFrTWFwXSIhPUx0KG5ldyBWdCkpJiYoTHQ9ZnVuY3Rpb24odCl7dmFyIGU9dyh0KSxyPSJbb2JqZWN0IE9iamVjdF0iPT1lP3QuY29uc3RydWN0b3I6dm9pZCAwLG49cj9SKHIpOiIiO2lmKG4pc3dpdGNoKG4pe2Nhc2UgUHQ6cmV0dXJuIltvYmplY3QgRGF0YVZpZXddIjtjYXNlIHF0OnJldHVybiJbb2JqZWN0IE1hcF0iO2Nhc2UgJHQ6cmV0dXJuIltvYmplY3QgUHJvbWlzZV0iO2Nhc2UgRHQ6cmV0dXJuIltvYmplY3QgU2V0XSI7Y2FzZSBVdDpyZXR1cm4iW29iamVjdCBXZWFrTWFwXSJ9cmV0dXJuIGV9KTt2YXIgQnQ9THQ7dmFyIEd0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmdD4tMSYmdCUxPT0wJiZ0PD05MDA3MTk5MjU0NzQwOTkxfTt2YXIgS3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJkd0KHQubGVuZ3RoKSYmIVModCl9O3ZhciBXdD1mdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fCF0KGUpJiZkKGUpJiYiW29iamVjdCBTdHJpbmddIj09dyhlKX07dmFyIFh0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT92b2lkIDA6ZVt0XX19LEp0PVh0KCJsZW5ndGgiKSxZdD1SZWdFeHAoIltcXHUyMDBkXFx1ZDgwMC1cXHVkZmZmXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXFx1ZmUwZVxcdWZlMGZdIik7dmFyIFp0PWZ1bmN0aW9uKHQpe3JldHVybiBZdC50ZXN0KHQpfSxIdD0iW1xcdWQ4MDAtXFx1ZGZmZl0iLFF0PSJbXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXSIsdGU9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIsZWU9IlteXFx1ZDgwMC1cXHVkZmZmXSIscmU9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLG5lPSJbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdIixvZT0iKD86IitRdCsifCIrdGUrIikiKyI/IixzZT0iW1xcdWZlMGVcXHVmZTBmXT8iK29lKygiKD86XFx1MjAwZCg/OiIrW2VlLHJlLG5lXS5qb2luKCJ8IikrIilbXFx1ZmUwZVxcdWZlMGZdPyIrb2UrIikqIiksaWU9Iig/OiIrW2VlK1F0KyI/IixRdCxyZSxuZSxIdF0uam9pbigifCIpKyIpIix1ZT1SZWdFeHAodGUrIig/PSIrdGUrIil8IitpZStzZSwiZyIpO3ZhciBhZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dWUubGFzdEluZGV4PTA7dWUudGVzdCh0KTspKytlO3JldHVybiBlfTt2YXIgaGU9ZnVuY3Rpb24odCl7cmV0dXJuIFp0KHQpP2FlKHQpOkp0KHQpfTt2YXIgbGU9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gMDtpZihLdCh0KSlyZXR1cm4gV3QodCk/aGUodCk6dC5sZW5ndGg7dmFyIGU9QnQodCk7cmV0dXJuIltvYmplY3QgTWFwXSI9PWV8fCJbb2JqZWN0IFNldF0iPT1lP3Quc2l6ZTpPdCh0KS5sZW5ndGh9O3ZhciBjZT1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR8fGQodCkmJiJbb2JqZWN0IE51bWJlcl0iPT13KHQpfTt2YXIgZmU9ZnVuY3Rpb24odCl7cmV0dXJuITA9PT10fHwhMT09PXR8fGQodCkmJiJbb2JqZWN0IEJvb2xlYW5dIj09dyh0KX07ZnVuY3Rpb24gbWUodCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBnZSh0KXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBwZSh0KXtyZXR1cm4iW29iamVjdCBTdHJpbmddIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiB3ZSh0KXtyZXR1cm4hIWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IFVuZGVmaW5lZF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVsbF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7aWYoZ2UodCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiExO3JldHVybiEwfXJldHVybiExfSh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuISghcGUodCl8fCIiIT09dCl9KHQpfHwhIWZ1bmN0aW9uKHQpe3JldHVybiEhbWUodCkmJjA9PT10Lmxlbmd0aH0odCkpKSl9ZnVuY3Rpb24gZGUodCl7cmV0dXJuISFtZSh0KSYmKDAhPT10Lmxlbmd0aCYmKDEhPT10Lmxlbmd0aHx8IXdlKHRbMF0pKSl9Y29uc3QgYmU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiB5ZSh0KXtyZXR1cm4gYmUuY2FsbCh0KS5lbmRzV2l0aCgiQXJyYXldIil9ZnVuY3Rpb24gdmUodCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCF5ZSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7dmFyIHI9ZS5mcm9tSW5kZXgsbj12b2lkIDA9PT1yPzA6cixvPWUudG9JbmRleCxzPXZvaWQgMD09PW8/dC5sZW5ndGg6bztpZihuPDB8fG4+PXQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihuKSl0aHJvdyBuZXcgRXJyb3IoImZyb21JbmRleCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gbGVuZ3RoIik7aWYoczw9bnx8cz50Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIocykpdGhyb3cgbmV3IEVycm9yKCJ0b0luZGV4IG11c3QgYmUgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gZnJvbUluZGV4IGFuZCBhdCBtb3N0IGVxdWFsIHRvIGxlbmd0aCIpO2Zvcih2YXIgaT10W25dLHU9bisxO3U8czt1KyspdFt1XT5pJiYoaT10W3VdKTtyZXR1cm4gaX1mdW5jdGlvbiBNZSh0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXllKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTt2YXIgcj1lLmZyb21JbmRleCxuPXZvaWQgMD09PXI/MDpyLG89ZS50b0luZGV4LHM9dm9pZCAwPT09bz90Lmxlbmd0aDpvO2lmKG48MHx8bj49dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKG4pKXRocm93IG5ldyBFcnJvcigiZnJvbUluZGV4IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHNtYWxsZXIgdGhhbiBsZW5ndGgiKTtpZihzPD1ufHxzPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihzKSl0aHJvdyBuZXcgRXJyb3IoInRvSW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBmcm9tSW5kZXggYW5kIGF0IG1vc3QgZXF1YWwgdG8gbGVuZ3RoIik7Zm9yKHZhciBpPXRbbl0sdT1uKzE7dTxzO3UrKyl0W3VdPGkmJihpPXRbdV0pO3JldHVybiBpfWZ1bmN0aW9uIHhlKHQpe3ZhciBlLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCF5ZSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7aWYodm9pZCAwIT09ci5vdXRwdXQpe2lmKCF5ZShyLm91dHB1dCkpdGhyb3cgbmV3IFR5cGVFcnJvcigib3V0cHV0IG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5IGlmIHNwZWNpZmllZCIpO2U9ci5vdXRwdXR9ZWxzZSBlPW5ldyBBcnJheSh0Lmxlbmd0aCk7dmFyIG49TWUodCksbz12ZSh0KTtpZihuPT09byl0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluaW11bSBhbmQgbWF4aW11bSBpbnB1dCB2YWx1ZXMgYXJlIGVxdWFsLiBDYW5ub3QgcmVzY2FsZSBhIGNvbnN0YW50IGFycmF5Iik7dmFyIHM9ci5taW4saT12b2lkIDA9PT1zP3IuYXV0b01pbk1heD9uOjA6cyx1PXIubWF4LGE9dm9pZCAwPT09dT9yLmF1dG9NaW5NYXg/bzoxOnU7aWYoaT49YSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG9wdGlvbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXggb3B0aW9uIik7Zm9yKHZhciBoPShhLWkpLyhvLW4pLGw9MDtsPHQubGVuZ3RoO2wrKyllW2xdPSh0W2xdLW4pKmgraTtyZXR1cm4gZX1jb25zdCBFZT0iICIucmVwZWF0KDIpLFNlPSIgIi5yZXBlYXQoNCk7ZnVuY3Rpb24gamUodCxlPXt9KXtjb25zdHttYXhSb3dzOnI9MTUsbWF4Q29sdW1uczpuPTEwLG1heE51bVNpemU6bz04fT1lO3JldHVybmAke3QuY29uc3RydWN0b3IubmFtZX0ge1xuJHtFZX1bXG4ke1NlfSR7ZnVuY3Rpb24odCxlLHIsbil7Y29uc3R7cm93czpvLGNvbHVtbnM6c309dCxpPU1hdGgubWluKG8sZSksdT1NYXRoLm1pbihzLHIpLGE9W107Zm9yKGxldCBlPTA7ZTxpO2UrKyl7bGV0IHI9W107Zm9yKGxldCBvPTA7bzx1O28rKylyLnB1c2goX2UodC5nZXQoZSxvKSxuKSk7YS5wdXNoKGAke3Iuam9pbigiICIpfWApfXUhPT1zJiYoYVthLmxlbmd0aC0xXSs9YCAuLi4gJHtzLXJ9IG1vcmUgY29sdW1uc2ApO2khPT1vJiZhLnB1c2goYC4uLiAke28tZX0gbW9yZSByb3dzYCk7cmV0dXJuIGEuam9pbihgXG4ke1NlfWApfSh0LHIsbixvKX1cbiR7RWV9XVxuJHtFZX1yb3dzOiAke3Qucm93c31cbiR7RWV9Y29sdW1uczogJHt0LmNvbHVtbnN9XG59YH1mdW5jdGlvbiBfZSh0LGUpe2NvbnN0IHI9U3RyaW5nKHQpO2lmKHIubGVuZ3RoPD1lKXJldHVybiByLnBhZEVuZChlLCIgIik7Y29uc3Qgbj10LnRvUHJlY2lzaW9uKGUtMik7aWYobi5sZW5ndGg8PWUpcmV0dXJuIG47Y29uc3Qgbz10LnRvRXhwb25lbnRpYWwoZS0yKSxzPW8uaW5kZXhPZigiZSIpLGk9by5zbGljZShzKTtyZXR1cm4gby5zbGljZSgwLGUtaS5sZW5ndGgpK2l9ZnVuY3Rpb24gQWUodCxlLHIpe2xldCBuPXI/dC5yb3dzOnQucm93cy0xO2lmKGU8MHx8ZT5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJSb3cgaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gQ2UodCxlLHIpe2xldCBuPXI/dC5jb2x1bW5zOnQuY29sdW1ucy0xO2lmKGU8MHx8ZT5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJDb2x1bW4gaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gUmUodCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIik7cmV0dXJuIGV9ZnVuY3Rpb24gSWUodCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiByb3dzIik7cmV0dXJuIGV9ZnVuY3Rpb24ga2UodCxlLHIsbixvKXtpZig1IT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiZXhwZWN0ZWQgNCBhcmd1bWVudHMiKTtpZihPZSgic3RhcnRSb3ciLGUpLE9lKCJlbmRSb3ciLHIpLE9lKCJzdGFydENvbHVtbiIsbiksT2UoImVuZENvbHVtbiIsbyksZT5yfHxuPm98fGU8MHx8ZT49dC5yb3dzfHxyPDB8fHI+PXQucm93c3x8bjwwfHxuPj10LmNvbHVtbnN8fG88MHx8bz49dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJTdWJtYXRyaXggaW5kaWNlcyBhcmUgb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gTmUodCxlPTApe2xldCByPVtdO2ZvcihsZXQgbj0wO248dDtuKyspci5wdXNoKGUpO3JldHVybiByfWZ1bmN0aW9uIE9lKHQsZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7dH0gbXVzdCBiZSBhIG51bWJlcmApfWZ1bmN0aW9uIEZlKHQpe2lmKHQuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcigiRW1wdHkgbWF0cml4IGhhcyBubyBlbGVtZW50cyB0byBpbmRleCIpfWNsYXNzIHple3N0YXRpYyBmcm9tMURBcnJheSh0LGUscil7aWYodCplIT09ci5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImRhdGEgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGdpdmVuIGRpbWVuc2lvbnMiKTtsZXQgbj1uZXcgVmUodCxlKTtmb3IobGV0IG89MDtvPHQ7bysrKWZvcihsZXQgdD0wO3Q8ZTt0Kyspbi5zZXQobyx0LHJbbyplK3RdKTtyZXR1cm4gbn1zdGF0aWMgcm93VmVjdG9yKHQpe2xldCBlPW5ldyBWZSgxLHQubGVuZ3RoKTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyllLnNldCgwLHIsdFtyXSk7cmV0dXJuIGV9c3RhdGljIGNvbHVtblZlY3Rvcih0KXtsZXQgZT1uZXcgVmUodC5sZW5ndGgsMSk7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspZS5zZXQociwwLHRbcl0pO3JldHVybiBlfXN0YXRpYyB6ZXJvcyh0LGUpe3JldHVybiBuZXcgVmUodCxlKX1zdGF0aWMgb25lcyh0LGUpe3JldHVybiBuZXcgVmUodCxlKS5maWxsKDEpfXN0YXRpYyByYW5kKHQsZSxyPXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3JhbmRvbTpuPU1hdGgucmFuZG9tfT1yO2xldCBvPW5ldyBWZSh0LGUpO2ZvcihsZXQgcj0wO3I8dDtyKyspZm9yKGxldCB0PTA7dDxlO3QrKylvLnNldChyLHQsbigpKTtyZXR1cm4gb31zdGF0aWMgcmFuZEludCh0LGUscj17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46bj0wLG1heDpvPTFlMyxyYW5kb206cz1NYXRoLnJhbmRvbX09cjtpZighTnVtYmVyLmlzSW50ZWdlcihuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhbiBpbnRlZ2VyIik7aWYoIU51bWJlci5pc0ludGVnZXIobykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYW4gaW50ZWdlciIpO2lmKG4+PW8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXgiKTtsZXQgaT1vLW4sdT1uZXcgVmUodCxlKTtmb3IobGV0IHI9MDtyPHQ7cisrKWZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPW4rTWF0aC5yb3VuZChzKCkqaSk7dS5zZXQocix0LGUpfXJldHVybiB1fXN0YXRpYyBleWUodCxlLHIpe3ZvaWQgMD09PWUmJihlPXQpLHZvaWQgMD09PXImJihyPTEpO2xldCBuPU1hdGgubWluKHQsZSksbz10aGlzLnplcm9zKHQsZSk7Zm9yKGxldCB0PTA7dDxuO3QrKylvLnNldCh0LHQscik7cmV0dXJuIG99c3RhdGljIGRpYWcodCxlLHIpe2xldCBuPXQubGVuZ3RoO3ZvaWQgMD09PWUmJihlPW4pLHZvaWQgMD09PXImJihyPWUpO2xldCBvPU1hdGgubWluKG4sZSxyKSxzPXRoaXMuemVyb3MoZSxyKTtmb3IobGV0IGU9MDtlPG87ZSsrKXMuc2V0KGUsZSx0W2VdKTtyZXR1cm4gc31zdGF0aWMgbWluKHQsZSl7dD10aGlzLmNoZWNrTWF0cml4KHQpLGU9dGhpcy5jaGVja01hdHJpeChlKTtsZXQgcj10LnJvd3Msbj10LmNvbHVtbnMsbz1uZXcgVmUocixuKTtmb3IobGV0IHM9MDtzPHI7cysrKWZvcihsZXQgcj0wO3I8bjtyKyspby5zZXQocyxyLE1hdGgubWluKHQuZ2V0KHMsciksZS5nZXQocyxyKSkpO3JldHVybiBvfXN0YXRpYyBtYXgodCxlKXt0PXRoaXMuY2hlY2tNYXRyaXgodCksZT10aGlzLmNoZWNrTWF0cml4KGUpO2xldCByPXQucm93cyxuPXQuY29sdW1ucyxvPW5ldyB0aGlzKHIsbik7Zm9yKGxldCBzPTA7czxyO3MrKylmb3IobGV0IHI9MDtyPG47cisrKW8uc2V0KHMscixNYXRoLm1heCh0LmdldChzLHIpLGUuZ2V0KHMscikpKTtyZXR1cm4gb31zdGF0aWMgY2hlY2tNYXRyaXgodCl7cmV0dXJuIHplLmlzTWF0cml4KHQpP3Q6bmV3IFZlKHQpfXN0YXRpYyBpc01hdHJpeCh0KXtyZXR1cm4gbnVsbCE9dCYmIk1hdHJpeCI9PT10LmtsYXNzfWdldCBzaXplKCl7cmV0dXJuIHRoaXMucm93cyp0aGlzLmNvbHVtbnN9YXBwbHkodCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LmNhbGwodGhpcyxlLHIpO3JldHVybiB0aGlzfXRvMURBcnJheSgpe2xldCB0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5wdXNoKHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXRvMkRBcnJheSgpe2xldCB0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl7dC5wdXNoKFtdKTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdFtlXS5wdXNoKHRoaXMuZ2V0KGUscikpfXJldHVybiB0fXRvSlNPTigpe3JldHVybiB0aGlzLnRvMkRBcnJheSgpfWlzUm93VmVjdG9yKCl7cmV0dXJuIDE9PT10aGlzLnJvd3N9aXNDb2x1bW5WZWN0b3IoKXtyZXR1cm4gMT09PXRoaXMuY29sdW1uc31pc1ZlY3Rvcigpe3JldHVybiAxPT09dGhpcy5yb3dzfHwxPT09dGhpcy5jb2x1bW5zfWlzU3F1YXJlKCl7cmV0dXJuIHRoaXMucm93cz09PXRoaXMuY29sdW1uc31pc0VtcHR5KCl7cmV0dXJuIDA9PT10aGlzLnJvd3N8fDA9PT10aGlzLmNvbHVtbnN9aXNTeW1tZXRyaWMoKXtpZih0aGlzLmlzU3F1YXJlKCkpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPD10O2UrKylpZih0aGlzLmdldCh0LGUpIT09dGhpcy5nZXQoZSx0KSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX1pc0VjaGVsb25Gb3JtKCl7bGV0IHQ9MCxlPTAscj0tMSxuPSEwLG89ITE7Zm9yKDt0PHRoaXMucm93cyYmbjspe2ZvcihlPTAsbz0hMTtlPHRoaXMuY29sdW1ucyYmITE9PT1vOykwPT09dGhpcy5nZXQodCxlKT9lKys6MT09PXRoaXMuZ2V0KHQsZSkmJmU+cj8obz0hMCxyPWUpOihuPSExLG89ITApO3QrK31yZXR1cm4gbn1pc1JlZHVjZWRFY2hlbG9uRm9ybSgpe2xldCB0PTAsZT0wLHI9LTEsbj0hMCxvPSExO2Zvcig7dDx0aGlzLnJvd3MmJm47KXtmb3IoZT0wLG89ITE7ZTx0aGlzLmNvbHVtbnMmJiExPT09bzspMD09PXRoaXMuZ2V0KHQsZSk/ZSsrOjE9PT10aGlzLmdldCh0LGUpJiZlPnI/KG89ITAscj1lKToobj0hMSxvPSEwKTtmb3IobGV0IHI9ZSsxO3I8dGhpcy5yb3dzO3IrKykwIT09dGhpcy5nZXQodCxyKSYmKG49ITEpO3QrK31yZXR1cm4gbn1lY2hlbG9uRm9ybSgpe2xldCB0PXRoaXMuY2xvbmUoKSxlPTAscj0wO2Zvcig7ZTx0LnJvd3MmJnI8dC5jb2x1bW5zOyl7bGV0IG49ZTtmb3IobGV0IG89ZTtvPHQucm93cztvKyspdC5nZXQobyxyKT50LmdldChuLHIpJiYobj1vKTtpZigwPT09dC5nZXQobixyKSlyKys7ZWxzZXt0LnN3YXBSb3dzKGUsbik7bGV0IG89dC5nZXQoZSxyKTtmb3IobGV0IG49cjtuPHQuY29sdW1ucztuKyspdC5zZXQoZSxuLHQuZ2V0KGUsbikvbyk7Zm9yKGxldCBuPWUrMTtuPHQucm93cztuKyspe2xldCBvPXQuZ2V0KG4scikvdC5nZXQoZSxyKTt0LnNldChuLHIsMCk7Zm9yKGxldCBzPXIrMTtzPHQuY29sdW1ucztzKyspdC5zZXQobixzLHQuZ2V0KG4scyktdC5nZXQoZSxzKSpvKX1lKysscisrfX1yZXR1cm4gdH1yZWR1Y2VkRWNoZWxvbkZvcm0oKXtsZXQgdD10aGlzLmVjaGVsb25Gb3JtKCksZT10LmNvbHVtbnMscj10LnJvd3Msbj1yLTE7Zm9yKDtuPj0wOylpZigwPT09dC5tYXhSb3cobikpbi0tO2Vsc2V7bGV0IG89MCxzPSExO2Zvcig7bzxyJiYhMT09PXM7KTE9PT10LmdldChuLG8pP3M9ITA6bysrO2ZvcihsZXQgcj0wO3I8bjtyKyspe2xldCBzPXQuZ2V0KHIsbyk7Zm9yKGxldCBpPW87aTxlO2krKyl7bGV0IGU9dC5nZXQocixpKS1zKnQuZ2V0KG4saSk7dC5zZXQocixpLGUpfX1uLS19cmV0dXJuIHR9c2V0KCl7dGhyb3cgbmV3IEVycm9yKCJzZXQgbWV0aG9kIGlzIHVuaW1wbGVtZW50ZWQiKX1nZXQoKXt0aHJvdyBuZXcgRXJyb3IoImdldCBtZXRob2QgaXMgdW5pbXBsZW1lbnRlZCIpfXJlcGVhdCh0PXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3Jvd3M6ZT0xLGNvbHVtbnM6cj0xfT10O2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGUpfHxlPD0wKXRocm93IG5ldyBUeXBlRXJyb3IoInJvd3MgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTtpZighTnVtYmVyLmlzSW50ZWdlcihyKXx8cjw9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjb2x1bW5zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7bGV0IG49bmV3IFZlKHRoaXMucm93cyplLHRoaXMuY29sdW1ucypyKTtmb3IobGV0IHQ9MDt0PGU7dCsrKWZvcihsZXQgZT0wO2U8cjtlKyspbi5zZXRTdWJNYXRyaXgodGhpcyx0aGlzLnJvd3MqdCx0aGlzLmNvbHVtbnMqZSk7cmV0dXJuIG59ZmlsbCh0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0KTtyZXR1cm4gdGhpc31uZWcoKXtyZXR1cm4gdGhpcy5tdWxTKC0xKX1nZXRSb3codCl7QWUodGhpcyx0KTtsZXQgZT1bXTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspZS5wdXNoKHRoaXMuZ2V0KHQscikpO3JldHVybiBlfWdldFJvd1ZlY3Rvcih0KXtyZXR1cm4gVmUucm93VmVjdG9yKHRoaXMuZ2V0Um93KHQpKX1zZXRSb3codCxlKXtBZSh0aGlzLHQpLGU9UmUodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQodCxyLGVbcl0pO3JldHVybiB0aGlzfXN3YXBSb3dzKHQsZSl7QWUodGhpcyx0KSxBZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl7bGV0IG49dGhpcy5nZXQodCxyKTt0aGlzLnNldCh0LHIsdGhpcy5nZXQoZSxyKSksdGhpcy5zZXQoZSxyLG4pfXJldHVybiB0aGlzfWdldENvbHVtbih0KXtDZSh0aGlzLHQpO2xldCBlPVtdO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyllLnB1c2godGhpcy5nZXQocix0KSk7cmV0dXJuIGV9Z2V0Q29sdW1uVmVjdG9yKHQpe3JldHVybiBWZS5jb2x1bW5WZWN0b3IodGhpcy5nZXRDb2x1bW4odCkpfXNldENvbHVtbih0LGUpe0NlKHRoaXMsdCksZT1JZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl0aGlzLnNldChyLHQsZVtyXSk7cmV0dXJuIHRoaXN9c3dhcENvbHVtbnModCxlKXtDZSh0aGlzLHQpLENlKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXtsZXQgbj10aGlzLmdldChyLHQpO3RoaXMuc2V0KHIsdCx0aGlzLmdldChyLGUpKSx0aGlzLnNldChyLGUsbil9cmV0dXJuIHRoaXN9YWRkUm93VmVjdG9yKHQpe3Q9UmUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3Rbcl0pO3JldHVybiB0aGlzfXN1YlJvd1ZlY3Rvcih0KXt0PVJlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10W3JdKTtyZXR1cm4gdGhpc31tdWxSb3dWZWN0b3IodCl7dD1SZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdFtyXSk7cmV0dXJuIHRoaXN9ZGl2Um93VmVjdG9yKHQpe3Q9UmUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3Rbcl0pO3JldHVybiB0aGlzfWFkZENvbHVtblZlY3Rvcih0KXt0PUllKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0W2VdKTtyZXR1cm4gdGhpc31zdWJDb2x1bW5WZWN0b3IodCl7dD1JZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdFtlXSk7cmV0dXJuIHRoaXN9bXVsQ29sdW1uVmVjdG9yKHQpe3Q9SWUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnRbZV0pO3JldHVybiB0aGlzfWRpdkNvbHVtblZlY3Rvcih0KXt0PUllKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90W2VdKTtyZXR1cm4gdGhpc31tdWxSb3codCxlKXtBZSh0aGlzLHQpO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldCh0LHIsdGhpcy5nZXQodCxyKSplKTtyZXR1cm4gdGhpc31tdWxDb2x1bW4odCxlKXtDZSh0aGlzLHQpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl0aGlzLnNldChyLHQsdGhpcy5nZXQocix0KSplKTtyZXR1cm4gdGhpc31tYXgoKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCB0PXRoaXMuZ2V0KDAsMCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldChlLHIpPnQmJih0PXRoaXMuZ2V0KGUscikpO3JldHVybiB0fW1heEluZGV4KCl7RmUodGhpcyk7bGV0IHQ9dGhpcy5nZXQoMCwwKSxlPVswLDBdO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5nZXQocixuKT50JiYodD10aGlzLmdldChyLG4pLGVbMF09cixlWzFdPW4pO3JldHVybiBlfW1pbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IHQ9dGhpcy5nZXQoMCwwKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik8dCYmKHQ9dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9bWluSW5kZXgoKXtGZSh0aGlzKTtsZXQgdD10aGlzLmdldCgwLDApLGU9WzAsMF07Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLmdldChyLG4pPHQmJih0PXRoaXMuZ2V0KHIsbiksZVswXT1yLGVbMV09bik7cmV0dXJuIGV9bWF4Um93KHQpe2lmKEFlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCh0LDApO2ZvcihsZXQgcj0xO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLmdldCh0LHIpPmUmJihlPXRoaXMuZ2V0KHQscikpO3JldHVybiBlfW1heFJvd0luZGV4KHQpe0FlKHRoaXMsdCksRmUodGhpcyk7bGV0IGU9dGhpcy5nZXQodCwwKSxyPVt0LDBdO2ZvcihsZXQgbj0xO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLmdldCh0LG4pPmUmJihlPXRoaXMuZ2V0KHQsbiksclsxXT1uKTtyZXR1cm4gcn1taW5Sb3codCl7aWYoQWUodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KHQsMCk7Zm9yKGxldCByPTE7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KHQscik8ZSYmKGU9dGhpcy5nZXQodCxyKSk7cmV0dXJuIGV9bWluUm93SW5kZXgodCl7QWUodGhpcyx0KSxGZSh0aGlzKTtsZXQgZT10aGlzLmdldCh0LDApLHI9W3QsMF07Zm9yKGxldCBuPTE7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuZ2V0KHQsbik8ZSYmKGU9dGhpcy5nZXQodCxuKSxyWzFdPW4pO3JldHVybiByfW1heENvbHVtbih0KXtpZihDZSh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQoMCx0KTtmb3IobGV0IHI9MTtyPHRoaXMucm93cztyKyspdGhpcy5nZXQocix0KT5lJiYoZT10aGlzLmdldChyLHQpKTtyZXR1cm4gZX1tYXhDb2x1bW5JbmRleCh0KXtDZSh0aGlzLHQpLEZlKHRoaXMpO2xldCBlPXRoaXMuZ2V0KDAsdCkscj1bMCx0XTtmb3IobGV0IG49MTtuPHRoaXMucm93cztuKyspdGhpcy5nZXQobix0KT5lJiYoZT10aGlzLmdldChuLHQpLHJbMF09bik7cmV0dXJuIHJ9bWluQ29sdW1uKHQpe2lmKENlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCgwLHQpO2ZvcihsZXQgcj0xO3I8dGhpcy5yb3dzO3IrKyl0aGlzLmdldChyLHQpPGUmJihlPXRoaXMuZ2V0KHIsdCkpO3JldHVybiBlfW1pbkNvbHVtbkluZGV4KHQpe0NlKHRoaXMsdCksRmUodGhpcyk7bGV0IGU9dGhpcy5nZXQoMCx0KSxyPVswLHRdO2ZvcihsZXQgbj0xO248dGhpcy5yb3dzO24rKyl0aGlzLmdldChuLHQpPGUmJihlPXRoaXMuZ2V0KG4sdCksclswXT1uKTtyZXR1cm4gcn1kaWFnKCl7bGV0IHQ9TWF0aC5taW4odGhpcy5yb3dzLHRoaXMuY29sdW1ucyksZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaCh0aGlzLmdldChyLHIpKTtyZXR1cm4gZX1ub3JtKHQ9ImZyb2Jlbml1cyIpe2xldCBlPTA7aWYoIm1heCI9PT10KXJldHVybiB0aGlzLm1heCgpO2lmKCJmcm9iZW5pdXMiPT09dCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyllKz10aGlzLmdldCh0LHIpKnRoaXMuZ2V0KHQscik7cmV0dXJuIE1hdGguc3FydChlKX10aHJvdyBuZXcgUmFuZ2VFcnJvcihgdW5rbm93biBub3JtIHR5cGU6ICR7dH1gKX1jdW11bGF0aXZlU3VtKCl7bGV0IHQ9MDtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQrPXRoaXMuZ2V0KGUsciksdGhpcy5zZXQoZSxyLHQpO3JldHVybiB0aGlzfWRvdCh0KXt6ZS5pc01hdHJpeCh0KSYmKHQ9dC50bzFEQXJyYXkoKSk7bGV0IGU9dGhpcy50bzFEQXJyYXkoKTtpZihlLmxlbmd0aCE9PXQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJ2ZWN0b3JzIGRvIG5vdCBoYXZlIHRoZSBzYW1lIHNpemUiKTtsZXQgcj0wO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXIrPWVbbl0qdFtuXTtyZXR1cm4gcn1tbXVsKHQpe3Q9VmUuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5yb3dzLHI9dGhpcy5jb2x1bW5zLG49dC5jb2x1bW5zLG89bmV3IFZlKGUsbikscz1uZXcgRmxvYXQ2NEFycmF5KHIpO2ZvcihsZXQgaT0wO2k8bjtpKyspe2ZvcihsZXQgZT0wO2U8cjtlKyspc1tlXT10LmdldChlLGkpO2ZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPTA7Zm9yKGxldCBuPTA7bjxyO24rKyllKz10aGlzLmdldCh0LG4pKnNbbl07by5zZXQodCxpLGUpfX1yZXR1cm4gb31zdHJhc3NlbjJ4Mih0KXt0PVZlLmNoZWNrTWF0cml4KHQpO2xldCBlPW5ldyBWZSgyLDIpO2NvbnN0IHI9dGhpcy5nZXQoMCwwKSxuPXQuZ2V0KDAsMCksbz10aGlzLmdldCgwLDEpLHM9dC5nZXQoMCwxKSxpPXRoaXMuZ2V0KDEsMCksdT10LmdldCgxLDApLGE9dGhpcy5nZXQoMSwxKSxoPXQuZ2V0KDEsMSksbD0ocithKSoobitoKSxjPShpK2EpKm4sZj1yKihzLWgpLG09YSoodS1uKSxnPShyK28pKmgscD1sK20tZysoby1hKSoodStoKSx3PWYrZyxkPWMrbSxiPWwtYytmKyhpLXIpKihuK3MpO3JldHVybiBlLnNldCgwLDAscCksZS5zZXQoMCwxLHcpLGUuc2V0KDEsMCxkKSxlLnNldCgxLDEsYiksZX1zdHJhc3NlbjN4Myh0KXt0PVZlLmNoZWNrTWF0cml4KHQpO2xldCBlPW5ldyBWZSgzLDMpO2NvbnN0IHI9dGhpcy5nZXQoMCwwKSxuPXRoaXMuZ2V0KDAsMSksbz10aGlzLmdldCgwLDIpLHM9dGhpcy5nZXQoMSwwKSxpPXRoaXMuZ2V0KDEsMSksdT10aGlzLmdldCgxLDIpLGE9dGhpcy5nZXQoMiwwKSxoPXRoaXMuZ2V0KDIsMSksbD10aGlzLmdldCgyLDIpLGM9dC5nZXQoMCwwKSxmPXQuZ2V0KDAsMSksbT10LmdldCgwLDIpLGc9dC5nZXQoMSwwKSxwPXQuZ2V0KDEsMSksdz10LmdldCgxLDIpLGQ9dC5nZXQoMiwwKSxiPXQuZ2V0KDIsMSkseT10LmdldCgyLDIpLHY9KHItcykqKC1mK3ApLE09KC1yK3MraSkqKGMtZitwKSx4PShzK2kpKigtYytmKSxFPXIqYyxTPSgtcithK2gpKihjLW0rdyksaj0oLXIrYSkqKG0tdyksXz0oYStoKSooLWMrbSksQT0oLW8raCtsKSoocCtkLWIpLEM9KG8tbCkqKHAtYiksUj1vKmQsST0oaCtsKSooLWQrYiksaz0oLW8raSt1KSoodytkLXkpLE49KG8tdSkqKHcteSksTz0oaSt1KSooLWQreSksRj1FK1IrbipnLHo9KHIrbitvLXMtaS1oLWwpKnArTSt4K0UrQStSK0ksVD1FK1MrXysocituK28taS11LWEtaCkqdytSK2srTyxWPXYraSooLWMrZitnLXAtdy1kK3kpK00rRStSK2srTixQPXYrTSt4K0UrdSpiLHE9UitrK04rTytzKm0sJD1FK1MraitoKigtYyttK2ctcC13LWQrYikrQStDK1IsRD1BK0MrUitJK2EqZixVPUUrUytqK18rbCp5O3JldHVybiBlLnNldCgwLDAsRiksZS5zZXQoMCwxLHopLGUuc2V0KDAsMixUKSxlLnNldCgxLDAsViksZS5zZXQoMSwxLFApLGUuc2V0KDEsMixxKSxlLnNldCgyLDAsJCksZS5zZXQoMiwxLEQpLGUuc2V0KDIsMixVKSxlfW1tdWxTdHJhc3Nlbih0KXt0PVZlLmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMuY2xvbmUoKSxyPWUucm93cyxuPWUuY29sdW1ucyxvPXQucm93cyxzPXQuY29sdW1ucztmdW5jdGlvbiBpKHQsZSxyKXtsZXQgbj10LnJvd3Msbz10LmNvbHVtbnM7aWYobj09PWUmJm89PT1yKXJldHVybiB0O3tsZXQgbj16ZS56ZXJvcyhlLHIpO3JldHVybiBuPW4uc2V0U3ViTWF0cml4KHQsMCwwKSxufX1uIT09byYmY29uc29sZS53YXJuKGBNdWx0aXBseWluZyAke3J9IHggJHtufSBhbmQgJHtvfSB4ICR7c30gbWF0cml4OiBkaW1lbnNpb25zIGRvIG5vdCBtYXRjaC5gKTtsZXQgdT1NYXRoLm1heChyLG8pLGE9TWF0aC5tYXgobixzKTtyZXR1cm4gZT1pKGUsdSxhKSxmdW5jdGlvbiB0KGUscixuLG8pe2lmKG48PTUxMnx8bzw9NTEyKXJldHVybiBlLm1tdWwocik7biUyPT0xJiZvJTI9PTE/KGU9aShlLG4rMSxvKzEpLHI9aShyLG4rMSxvKzEpKTpuJTI9PTE/KGU9aShlLG4rMSxvKSxyPWkocixuKzEsbykpOm8lMj09MSYmKGU9aShlLG4sbysxKSxyPWkocixuLG8rMSkpO2xldCBzPXBhcnNlSW50KGUucm93cy8yLDEwKSx1PXBhcnNlSW50KGUuY29sdW1ucy8yLDEwKSxhPWUuc3ViTWF0cml4KDAscy0xLDAsdS0xKSxoPXIuc3ViTWF0cml4KDAscy0xLDAsdS0xKSxsPWUuc3ViTWF0cml4KDAscy0xLHUsZS5jb2x1bW5zLTEpLGM9ci5zdWJNYXRyaXgoMCxzLTEsdSxyLmNvbHVtbnMtMSksZj1lLnN1Yk1hdHJpeChzLGUucm93cy0xLDAsdS0xKSxtPXIuc3ViTWF0cml4KHMsci5yb3dzLTEsMCx1LTEpLGc9ZS5zdWJNYXRyaXgocyxlLnJvd3MtMSx1LGUuY29sdW1ucy0xKSxwPXIuc3ViTWF0cml4KHMsci5yb3dzLTEsdSxyLmNvbHVtbnMtMSksdz10KHplLmFkZChhLGcpLHplLmFkZChoLHApLHMsdSksZD10KHplLmFkZChmLGcpLGgscyx1KSxiPXQoYSx6ZS5zdWIoYyxwKSxzLHUpLHk9dChnLHplLnN1YihtLGgpLHMsdSksdj10KHplLmFkZChhLGwpLHAscyx1KSxNPXQoemUuc3ViKGYsYSksemUuYWRkKGgsYykscyx1KSx4PXQoemUuc3ViKGwsZyksemUuYWRkKG0scCkscyx1KSxFPXplLmFkZCh3LHkpO0Uuc3ViKHYpLEUuYWRkKHgpO2xldCBTPXplLmFkZChiLHYpLGo9emUuYWRkKGQseSksXz16ZS5zdWIodyxkKTtfLmFkZChiKSxfLmFkZChNKTtsZXQgQT16ZS56ZXJvcygyKkUucm93cywyKkUuY29sdW1ucyk7cmV0dXJuIEE9QS5zZXRTdWJNYXRyaXgoRSwwLDApLEE9QS5zZXRTdWJNYXRyaXgoUyxFLnJvd3MsMCksQT1BLnNldFN1Yk1hdHJpeChqLDAsRS5jb2x1bW5zKSxBPUEuc2V0U3ViTWF0cml4KF8sRS5yb3dzLEUuY29sdW1ucyksQS5zdWJNYXRyaXgoMCxuLTEsMCxvLTEpfShlLHQ9aSh0LHUsYSksdSxhKX1zY2FsZVJvd3ModD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46ZT0wLG1heDpyPTF9PXQ7aWYoIU51bWJlci5pc0Zpbml0ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhIG51bWJlciIpO2lmKCFOdW1iZXIuaXNGaW5pdGUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYSBudW1iZXIiKTtpZihlPj1yKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IG49bmV3IFZlKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpO2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKyl7Y29uc3Qgbz10aGlzLmdldFJvdyh0KTtvLmxlbmd0aD4wJiZ4ZShvLHttaW46ZSxtYXg6cixvdXRwdXQ6b30pLG4uc2V0Um93KHQsbyl9cmV0dXJuIG59c2NhbGVDb2x1bW5zKHQ9e30pe2lmKCJvYmplY3QiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7bWluOmU9MCxtYXg6cj0xfT10O2lmKCFOdW1iZXIuaXNGaW5pdGUoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigibWluIG11c3QgYmUgYSBudW1iZXIiKTtpZighTnVtYmVyLmlzRmluaXRlKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1heCBtdXN0IGJlIGEgbnVtYmVyIik7aWYoZT49cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCIpO2xldCBuPW5ldyBWZSh0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKTtmb3IobGV0IHQ9MDt0PHRoaXMuY29sdW1uczt0Kyspe2NvbnN0IG89dGhpcy5nZXRDb2x1bW4odCk7by5sZW5ndGgmJnhlKG8se21pbjplLG1heDpyLG91dHB1dDpvfSksbi5zZXRDb2x1bW4odCxvKX1yZXR1cm4gbn1mbGlwUm93cygpe2NvbnN0IHQ9TWF0aC5jZWlsKHRoaXMuY29sdW1ucy8yKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0O3IrKyl7bGV0IHQ9dGhpcy5nZXQoZSxyKSxuPXRoaXMuZ2V0KGUsdGhpcy5jb2x1bW5zLTEtcik7dGhpcy5zZXQoZSxyLG4pLHRoaXMuc2V0KGUsdGhpcy5jb2x1bW5zLTEtcix0KX1yZXR1cm4gdGhpc31mbGlwQ29sdW1ucygpe2NvbnN0IHQ9TWF0aC5jZWlsKHRoaXMucm93cy8yKTtmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspZm9yKGxldCByPTA7cjx0O3IrKyl7bGV0IHQ9dGhpcy5nZXQocixlKSxuPXRoaXMuZ2V0KHRoaXMucm93cy0xLXIsZSk7dGhpcy5zZXQocixlLG4pLHRoaXMuc2V0KHRoaXMucm93cy0xLXIsZSx0KX1yZXR1cm4gdGhpc31rcm9uZWNrZXJQcm9kdWN0KHQpe3Q9VmUuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5yb3dzLHI9dGhpcy5jb2x1bW5zLG49dC5yb3dzLG89dC5jb2x1bW5zLHM9bmV3IFZlKGUqbixyKm8pO2ZvcihsZXQgaT0wO2k8ZTtpKyspZm9yKGxldCBlPTA7ZTxyO2UrKylmb3IobGV0IHI9MDtyPG47cisrKWZvcihsZXQgdT0wO3U8bzt1Kyspcy5zZXQobippK3IsbyplK3UsdGhpcy5nZXQoaSxlKSp0LmdldChyLHUpKTtyZXR1cm4gc31rcm9uZWNrZXJTdW0odCl7aWYodD1WZS5jaGVja01hdHJpeCh0KSwhdGhpcy5pc1NxdWFyZSgpfHwhdC5pc1NxdWFyZSgpKXRocm93IG5ldyBFcnJvcigiS3JvbmVja2VyIFN1bSBuZWVkcyB0d28gU3F1YXJlIE1hdHJpY2VzIik7bGV0IGU9dGhpcy5yb3dzLHI9dC5yb3dzLG49dGhpcy5rcm9uZWNrZXJQcm9kdWN0KFZlLmV5ZShyLHIpKSxvPVZlLmV5ZShlLGUpLmtyb25lY2tlclByb2R1Y3QodCk7cmV0dXJuIG4uYWRkKG8pfXRyYW5zcG9zZSgpe2xldCB0PW5ldyBWZSh0aGlzLmNvbHVtbnMsdGhpcy5yb3dzKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQuc2V0KHIsZSx0aGlzLmdldChlLHIpKTtyZXR1cm4gdH1zb3J0Um93cyh0PVRlKXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspdGhpcy5zZXRSb3coZSx0aGlzLmdldFJvdyhlKS5zb3J0KHQpKTtyZXR1cm4gdGhpc31zb3J0Q29sdW1ucyh0PVRlKXtmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXRDb2x1bW4oZSx0aGlzLmdldENvbHVtbihlKS5zb3J0KHQpKTtyZXR1cm4gdGhpc31zdWJNYXRyaXgodCxlLHIsbil7a2UodGhpcyx0LGUscixuKTtsZXQgbz1uZXcgVmUoZS10KzEsbi1yKzEpO2ZvcihsZXQgcz10O3M8PWU7cysrKWZvcihsZXQgZT1yO2U8PW47ZSsrKW8uc2V0KHMtdCxlLXIsdGhpcy5nZXQocyxlKSk7cmV0dXJuIG99c3ViTWF0cml4Um93KHQsZSxyKXtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1yJiYocj10aGlzLmNvbHVtbnMtMSksZT5yfHxlPDB8fGU+PXRoaXMuY29sdW1uc3x8cjwwfHxyPj10aGlzLmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkFyZ3VtZW50IG91dCBvZiByYW5nZSIpO2xldCBuPW5ldyBWZSh0Lmxlbmd0aCxyLWUrMSk7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspZm9yKGxldCBzPWU7czw9cjtzKyspe2lmKHRbb108MHx8dFtvXT49dGhpcy5yb3dzKXRocm93IG5ldyBSYW5nZUVycm9yKGBSb3cgaW5kZXggb3V0IG9mIHJhbmdlOiAke3Rbb119YCk7bi5zZXQobyxzLWUsdGhpcy5nZXQodFtvXSxzKSl9cmV0dXJuIG59c3ViTWF0cml4Q29sdW1uKHQsZSxyKXtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1yJiYocj10aGlzLnJvd3MtMSksZT5yfHxlPDB8fGU+PXRoaXMucm93c3x8cjwwfHxyPj10aGlzLnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkFyZ3VtZW50IG91dCBvZiByYW5nZSIpO2xldCBuPW5ldyBWZShyLWUrMSx0Lmxlbmd0aCk7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspZm9yKGxldCBzPWU7czw9cjtzKyspe2lmKHRbb108MHx8dFtvXT49dGhpcy5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKGBDb2x1bW4gaW5kZXggb3V0IG9mIHJhbmdlOiAke3Rbb119YCk7bi5zZXQocy1lLG8sdGhpcy5nZXQocyx0W29dKSl9cmV0dXJuIG59c2V0U3ViTWF0cml4KHQsZSxyKXtpZigodD1WZS5jaGVja01hdHJpeCh0KSkuaXNFbXB0eSgpKXJldHVybiB0aGlzO2tlKHRoaXMsZSxlK3Qucm93cy0xLHIscit0LmNvbHVtbnMtMSk7Zm9yKGxldCBuPTA7bjx0LnJvd3M7bisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyl0aGlzLnNldChlK24scitvLHQuZ2V0KG4sbykpO3JldHVybiB0aGlzfXNlbGVjdGlvbih0LGUpeyFmdW5jdGlvbih0LGUpe2lmKCF5ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJyb3cgaW5kaWNlcyBtdXN0IGJlIGFuIGFycmF5Iik7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXTwwfHxlW3JdPj10LnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInJvdyBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKX0odGhpcyx0KSxmdW5jdGlvbih0LGUpe2lmKCF5ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjb2x1bW4gaW5kaWNlcyBtdXN0IGJlIGFuIGFycmF5Iik7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXTwwfHxlW3JdPj10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImNvbHVtbiBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKX0odGhpcyxlKTtsZXQgcj1uZXcgVmUodC5sZW5ndGgsZS5sZW5ndGgpO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtsZXQgbz10W25dO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgcz1lW3RdO3Iuc2V0KG4sdCx0aGlzLmdldChvLHMpKX19cmV0dXJuIHJ9dHJhY2UoKXtsZXQgdD1NYXRoLm1pbih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSxlPTA7Zm9yKGxldCByPTA7cjx0O3IrKyllKz10aGlzLmdldChyLHIpO3JldHVybiBlfWNsb25lKCl7bGV0IHQ9bmV3IFZlKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5zZXQoZSxyLHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXN1bSh0KXtzd2l0Y2godCl7Y2FzZSJyb3ciOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1OZSh0LnJvd3MpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IG49MDtuPHQuY29sdW1uczsrK24pZVtyXSs9dC5nZXQocixuKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSJjb2x1bW4iOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1OZSh0LmNvbHVtbnMpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IG49MDtuPHQuY29sdW1uczsrK24pZVtuXSs9dC5nZXQocixuKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSB2b2lkIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPTA7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyllKz10LmdldChyLG4pO3JldHVybiBlfSh0aGlzKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19cHJvZHVjdCh0KXtzd2l0Y2godCl7Y2FzZSJyb3ciOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT1OZSh0LnJvd3MsMSk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgbj0wO248dC5jb2x1bW5zOysrbillW3JdKj10LmdldChyLG4pO3JldHVybiBlfSh0aGlzKTtjYXNlImNvbHVtbiI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPU5lKHQuY29sdW1ucywxKTtmb3IobGV0IHI9MDtyPHQucm93czsrK3IpZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7KytuKWVbbl0qPXQuZ2V0KHIsbik7cmV0dXJuIGV9KHRoaXMpO2Nhc2Ugdm9pZCAwOnJldHVybiBmdW5jdGlvbih0KXtsZXQgZT0xO2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspZSo9dC5nZXQocixuKTtyZXR1cm4gZX0odGhpcyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fW1lYW4odCl7Y29uc3QgZT10aGlzLnN1bSh0KTtzd2l0Y2godCl7Y2FzZSJyb3ciOmZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKyllW3RdLz10aGlzLmNvbHVtbnM7cmV0dXJuIGU7Y2FzZSJjb2x1bW4iOmZvcihsZXQgdD0wO3Q8dGhpcy5jb2x1bW5zO3QrKyllW3RdLz10aGlzLnJvd3M7cmV0dXJuIGU7Y2FzZSB2b2lkIDA6cmV0dXJuIGUvdGhpcy5zaXplO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX12YXJpYW5jZSh0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHt1bmJpYXNlZDpyPSEwLG1lYW46bj10aGlzLm1lYW4odCl9PWU7aWYoImJvb2xlYW4iIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJ1bmJpYXNlZCBtdXN0IGJlIGEgYm9vbGVhbiIpO3N3aXRjaCh0KXtjYXNlInJvdyI6aWYoIXllKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIm1lYW4gbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUscil7Y29uc3Qgbj10LnJvd3Msbz10LmNvbHVtbnMscz1bXTtmb3IobGV0IGk9MDtpPG47aSsrKXtsZXQgbj0wLHU9MCxhPTA7Zm9yKGxldCBlPTA7ZTxvO2UrKylhPXQuZ2V0KGksZSktcltpXSxuKz1hLHUrPWEqYTtlP3MucHVzaCgodS1uKm4vbykvKG8tMSkpOnMucHVzaCgodS1uKm4vbykvbyl9cmV0dXJuIHN9KHRoaXMscixuKTtjYXNlImNvbHVtbiI6aWYoIXllKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIm1lYW4gbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUscil7Y29uc3Qgbj10LnJvd3Msbz10LmNvbHVtbnMscz1bXTtmb3IobGV0IGk9MDtpPG87aSsrKXtsZXQgbz0wLHU9MCxhPTA7Zm9yKGxldCBlPTA7ZTxuO2UrKylhPXQuZ2V0KGUsaSktcltpXSxvKz1hLHUrPWEqYTtlP3MucHVzaCgodS1vKm8vbikvKG4tMSkpOnMucHVzaCgodS1vKm8vbikvbil9cmV0dXJuIHN9KHRoaXMscixuKTtjYXNlIHZvaWQgMDppZigibnVtYmVyIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBuPXQucm93cyxvPXQuY29sdW1ucyxzPW4qbztsZXQgaT0wLHU9MCxhPTA7Zm9yKGxldCBlPTA7ZTxuO2UrKylmb3IobGV0IG49MDtuPG87bisrKWE9dC5nZXQoZSxuKS1yLGkrPWEsdSs9YSphO3JldHVybiBlPyh1LWkqaS9zKS8ocy0xKToodS1pKmkvcykvc30odGhpcyxyLG4pO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1zdGFuZGFyZERldmlhdGlvbih0LGUpeyJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCk7Y29uc3Qgcj10aGlzLnZhcmlhbmNlKHQsZSk7aWYodm9pZCAwPT09dClyZXR1cm4gTWF0aC5zcXJ0KHIpO2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGg7dCsrKXJbdF09TWF0aC5zcXJ0KHJbdF0pO3JldHVybiByfWNlbnRlcih0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHtjZW50ZXI6cj10aGlzLm1lYW4odCl9PWU7c3dpdGNoKHQpe2Nhc2Uicm93IjppZigheWUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2VudGVyIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKXQuc2V0KHIsbix0LmdldChyLG4pLWVbcl0pfSh0aGlzLHIpLHRoaXM7Y2FzZSJjb2x1bW4iOmlmKCF5ZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspdC5zZXQocixuLHQuZ2V0KHIsbiktZVtuXSl9KHRoaXMsciksdGhpcztjYXNlIHZvaWQgMDppZigibnVtYmVyIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2VudGVyIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKXQuc2V0KHIsbix0LmdldChyLG4pLWUpfSh0aGlzLHIpLHRoaXM7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXNjYWxlKHQsZT17fSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2xldCByPWUuc2NhbGU7c3dpdGNoKHQpe2Nhc2Uicm93IjppZih2b2lkIDA9PT1yKXI9ZnVuY3Rpb24odCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQucm93cztyKyspe2xldCBuPTA7Zm9yKGxldCBlPTA7ZTx0LmNvbHVtbnM7ZSsrKW4rPU1hdGgucG93KHQuZ2V0KHIsZSksMikvKHQuY29sdW1ucy0xKTtlLnB1c2goTWF0aC5zcXJ0KG4pKX1yZXR1cm4gZX0odGhpcyk7ZWxzZSBpZigheWUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigic2NhbGUgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspdC5zZXQocixuLHQuZ2V0KHIsbikvZVtyXSl9KHRoaXMsciksdGhpcztjYXNlImNvbHVtbiI6aWYodm9pZCAwPT09cilyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9W107Zm9yKGxldCByPTA7cjx0LmNvbHVtbnM7cisrKXtsZXQgbj0wO2ZvcihsZXQgZT0wO2U8dC5yb3dzO2UrKyluKz1NYXRoLnBvdyh0LmdldChlLHIpLDIpLyh0LnJvd3MtMSk7ZS5wdXNoKE1hdGguc3FydChuKSl9cmV0dXJuIGV9KHRoaXMpO2Vsc2UgaWYoIXllKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKXQuc2V0KHIsbix0LmdldChyLG4pL2Vbbl0pfSh0aGlzLHIpLHRoaXM7Y2FzZSB2b2lkIDA6aWYodm9pZCAwPT09cilyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9dC5zaXplLTE7bGV0IHI9MDtmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspZm9yKGxldCBvPTA7bzx0LnJvd3M7bysrKXIrPU1hdGgucG93KHQuZ2V0KG8sbiksMikvZTtyZXR1cm4gTWF0aC5zcXJ0KHIpfSh0aGlzKTtlbHNlIGlmKCJudW1iZXIiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJzY2FsZSBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyl0LnNldChyLG4sdC5nZXQocixuKS9lKX0odGhpcyxyKSx0aGlzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX10b1N0cmluZyh0KXtyZXR1cm4gamUodGhpcyx0KX19ZnVuY3Rpb24gVGUodCxlKXtyZXR1cm4gdC1lfXplLnByb3RvdHlwZS5rbGFzcz0iTWF0cml4IiwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmKHplLnByb3RvdHlwZVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXT1mdW5jdGlvbigpe3JldHVybiBqZSh0aGlzKX0pLHplLnJhbmRvbT16ZS5yYW5kLHplLnJhbmRvbUludD16ZS5yYW5kSW50LHplLmRpYWdvbmFsPXplLmRpYWcsemUucHJvdG90eXBlLmRpYWdvbmFsPXplLnByb3RvdHlwZS5kaWFnLHplLmlkZW50aXR5PXplLmV5ZSx6ZS5wcm90b3R5cGUubmVnYXRlPXplLnByb3RvdHlwZS5uZWcsemUucHJvdG90eXBlLnRlbnNvclByb2R1Y3Q9emUucHJvdG90eXBlLmtyb25lY2tlclByb2R1Y3Q7Y2xhc3MgVmUgZXh0ZW5kcyB6ZXtjb25zdHJ1Y3Rvcih0LGUpe2lmKHN1cGVyKCksVmUuaXNNYXRyaXgodCkpcmV0dXJuIHQuY2xvbmUoKTtpZihOdW1iZXIuaXNJbnRlZ2VyKHQpJiZ0Pj0wKXtpZih0aGlzLmRhdGE9W10sIShOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPj0wKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJuQ29sdW1ucyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpO2ZvcihsZXQgcj0wO3I8dDtyKyspdGhpcy5kYXRhLnB1c2gobmV3IEZsb2F0NjRBcnJheShlKSl9ZWxzZXtpZigheWUodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBvciBhbiBhcnJheSIpO3tjb25zdCByPXQ7aWYoIm51bWJlciIhPXR5cGVvZihlPSh0PXIubGVuZ3RoKT9yWzBdLmxlbmd0aDowKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJEYXRhIG11c3QgYmUgYSAyRCBhcnJheSB3aXRoIGF0IGxlYXN0IG9uZSBlbGVtZW50Iik7dGhpcy5kYXRhPVtdO2ZvcihsZXQgbj0wO248dDtuKyspe2lmKHJbbl0ubGVuZ3RoIT09ZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5jb25zaXN0ZW50IGFycmF5IGRpbWVuc2lvbnMiKTt0aGlzLmRhdGEucHVzaChGbG9hdDY0QXJyYXkuZnJvbShyW25dKSl9fX10aGlzLnJvd3M9dCx0aGlzLmNvbHVtbnM9ZX1zZXQodCxlLHIpe3JldHVybiB0aGlzLmRhdGFbdF1bZV09cix0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLmRhdGFbdF1bZV19cmVtb3ZlUm93KHQpe3JldHVybiBBZSh0aGlzLHQpLHRoaXMuZGF0YS5zcGxpY2UodCwxKSx0aGlzLnJvd3MtPTEsdGhpc31hZGRSb3codCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dCx0PXRoaXMucm93cyksQWUodGhpcyx0LCEwKSxlPUZsb2F0NjRBcnJheS5mcm9tKFJlKHRoaXMsZSkpLHRoaXMuZGF0YS5zcGxpY2UodCwwLGUpLHRoaXMucm93cys9MSx0aGlzfXJlbW92ZUNvbHVtbih0KXtDZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl7Y29uc3Qgcj1uZXcgRmxvYXQ2NEFycmF5KHRoaXMuY29sdW1ucy0xKTtmb3IobGV0IG49MDtuPHQ7bisrKXJbbl09dGhpcy5kYXRhW2VdW25dO2ZvcihsZXQgbj10KzE7bjx0aGlzLmNvbHVtbnM7bisrKXJbbi0xXT10aGlzLmRhdGFbZV1bbl07dGhpcy5kYXRhW2VdPXJ9cmV0dXJuIHRoaXMuY29sdW1ucy09MSx0aGlzfWFkZENvbHVtbih0LGUpe3ZvaWQgMD09PWUmJihlPXQsdD10aGlzLmNvbHVtbnMpLENlKHRoaXMsdCwhMCksZT1JZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5yb3dzO3IrKyl7Y29uc3Qgbj1uZXcgRmxvYXQ2NEFycmF5KHRoaXMuY29sdW1ucysxKTtsZXQgbz0wO2Zvcig7bzx0O28rKyluW29dPXRoaXMuZGF0YVtyXVtvXTtmb3IobltvKytdPWVbcl07bzx0aGlzLmNvbHVtbnMrMTtvKyspbltvXT10aGlzLmRhdGFbcl1bby0xXTt0aGlzLmRhdGFbcl09bn1yZXR1cm4gdGhpcy5jb2x1bW5zKz0xLHRoaXN9fSFmdW5jdGlvbih0LGUpe3QucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5hZGRTKHQpOnRoaXMuYWRkTSh0KX0sdC5wcm90b3R5cGUuYWRkUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3QpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5hZGRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSt0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5hZGQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuYWRkKHIpfSx0LnByb3RvdHlwZS5zdWI9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuc3ViUyh0KTp0aGlzLnN1Yk0odCl9LHQucHJvdG90eXBlLnN1YlM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuc3ViTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciktdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuc3ViPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnN1YihyKX0sdC5wcm90b3R5cGUuc3VidHJhY3Q9dC5wcm90b3R5cGUuc3ViLHQucHJvdG90eXBlLnN1YnRyYWN0Uz10LnByb3RvdHlwZS5zdWJTLHQucHJvdG90eXBlLnN1YnRyYWN0TT10LnByb3RvdHlwZS5zdWJNLHQuc3VidHJhY3Q9dC5zdWIsdC5wcm90b3R5cGUubXVsPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLm11bFModCk6dGhpcy5tdWxNKHQpfSx0LnByb3RvdHlwZS5tdWxTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm11bE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpKnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lm11bD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5tdWwocil9LHQucHJvdG90eXBlLm11bHRpcGx5PXQucHJvdG90eXBlLm11bCx0LnByb3RvdHlwZS5tdWx0aXBseVM9dC5wcm90b3R5cGUubXVsUyx0LnByb3RvdHlwZS5tdWx0aXBseU09dC5wcm90b3R5cGUubXVsTSx0Lm11bHRpcGx5PXQubXVsLHQucHJvdG90eXBlLmRpdj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5kaXZTKHQpOnRoaXMuZGl2TSh0KX0sdC5wcm90b3R5cGUuZGl2Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3QpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5kaXZNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS90LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5kaXY9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuZGl2KHIpfSx0LnByb3RvdHlwZS5kaXZpZGU9dC5wcm90b3R5cGUuZGl2LHQucHJvdG90eXBlLmRpdmlkZVM9dC5wcm90b3R5cGUuZGl2Uyx0LnByb3RvdHlwZS5kaXZpZGVNPXQucHJvdG90eXBlLmRpdk0sdC5kaXZpZGU9dC5kaXYsdC5wcm90b3R5cGUubW9kPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLm1vZFModCk6dGhpcy5tb2RNKHQpfSx0LnByb3RvdHlwZS5tb2RTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikldCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm1vZE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJXQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lm1vZD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5tb2Qocil9LHQucHJvdG90eXBlLm1vZHVsdXM9dC5wcm90b3R5cGUubW9kLHQucHJvdG90eXBlLm1vZHVsdXNTPXQucHJvdG90eXBlLm1vZFMsdC5wcm90b3R5cGUubW9kdWx1c009dC5wcm90b3R5cGUubW9kTSx0Lm1vZHVsdXM9dC5tb2QsdC5wcm90b3R5cGUuYW5kPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmFuZFModCk6dGhpcy5hbmRNKHQpfSx0LnByb3RvdHlwZS5hbmRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikmdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmFuZE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpJnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmFuZD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5hbmQocil9LHQucHJvdG90eXBlLm9yPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLm9yUyh0KTp0aGlzLm9yTSh0KX0sdC5wcm90b3R5cGUub3JTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscil8dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm9yTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscil8dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQub3I9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkub3Iocil9LHQucHJvdG90eXBlLnhvcj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy54b3JTKHQpOnRoaXMueG9yTSh0KX0sdC5wcm90b3R5cGUueG9yUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpXnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS54b3JNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKV50LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC54b3I9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkueG9yKHIpfSx0LnByb3RvdHlwZS5sZWZ0U2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMubGVmdFNoaWZ0Uyh0KTp0aGlzLmxlZnRTaGlmdE0odCl9LHQucHJvdG90eXBlLmxlZnRTaGlmdFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKTw8dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmxlZnRTaGlmdE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPDx0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5sZWZ0U2hpZnQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkubGVmdFNoaWZ0KHIpfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRTKHQpOnRoaXMuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdE0odCl9LHQucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+PnQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+PnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdChyKX0sdC5wcm90b3R5cGUucmlnaHRTaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5yaWdodFNoaWZ0Uyh0KTp0aGlzLnJpZ2h0U2hpZnRNKHQpfSx0LnByb3RvdHlwZS5yaWdodFNoaWZ0Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj4+dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnJpZ2h0U2hpZnRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+PnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LnJpZ2h0U2hpZnQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkucmlnaHRTaGlmdChyKX0sdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0PXQucHJvdG90eXBlLnJpZ2h0U2hpZnQsdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0Uz10LnByb3RvdHlwZS5yaWdodFNoaWZ0Uyx0LnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnRNPXQucHJvdG90eXBlLnJpZ2h0U2hpZnRNLHQuemVyb0ZpbGxSaWdodFNoaWZ0PXQucmlnaHRTaGlmdCx0LnByb3RvdHlwZS5ub3Q9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSx+dGhpcy5nZXQodCxlKSk7cmV0dXJuIHRoaXN9LHQubm90PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5ub3QoKX0sdC5wcm90b3R5cGUuYWJzPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hYnModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFicz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYWJzKCl9LHQucHJvdG90eXBlLmFjb3M9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFjb3ModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFjb3M9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFjb3MoKX0sdC5wcm90b3R5cGUuYWNvc2g9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFjb3NoKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hY29zaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYWNvc2goKX0sdC5wcm90b3R5cGUuYXNpbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXNpbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXNpbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXNpbigpfSx0LnByb3RvdHlwZS5hc2luaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXNpbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFzaW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hc2luaCgpfSx0LnByb3RvdHlwZS5hdGFuPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hdGFuKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hdGFuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hdGFuKCl9LHQucHJvdG90eXBlLmF0YW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hdGFuaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXRhbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmF0YW5oKCl9LHQucHJvdG90eXBlLmNicnQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNicnQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNicnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNicnQoKX0sdC5wcm90b3R5cGUuY2VpbD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2VpbCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY2VpbD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY2VpbCgpfSx0LnByb3RvdHlwZS5jbHozMj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2x6MzIodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNsejMyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jbHozMigpfSx0LnByb3RvdHlwZS5jb3M9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmNvcyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY29zPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jb3MoKX0sdC5wcm90b3R5cGUuY29zaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY29zaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY29zaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY29zaCgpfSx0LnByb3RvdHlwZS5leHA9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmV4cCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZXhwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5leHAoKX0sdC5wcm90b3R5cGUuZXhwbTE9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmV4cG0xKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5leHBtMT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZXhwbTEoKX0sdC5wcm90b3R5cGUuZmxvb3I9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmZsb29yKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5mbG9vcj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZmxvb3IoKX0sdC5wcm90b3R5cGUuZnJvdW5kPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5mcm91bmQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmZyb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuZnJvdW5kKCl9LHQucHJvdG90eXBlLmxvZz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2c9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZygpfSx0LnByb3RvdHlwZS5sb2cxcD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMXAodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZzFwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2cxcCgpfSx0LnByb3RvdHlwZS5sb2cxMD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMTAodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZzEwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2cxMCgpfSx0LnByb3RvdHlwZS5sb2cyPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cyKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5sb2cyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5sb2cyKCl9LHQucHJvdG90eXBlLnJvdW5kPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5yb3VuZCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnJvdW5kKCl9LHQucHJvdG90eXBlLnNpZ249ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpZ24odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNpZ249ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNpZ24oKX0sdC5wcm90b3R5cGUuc2luPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zaW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNpbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc2luKCl9LHQucHJvdG90eXBlLnNpbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpbmgodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNpbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnNpbmgoKX0sdC5wcm90b3R5cGUuc3FydD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc3FydCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc3FydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc3FydCgpfSx0LnByb3RvdHlwZS50YW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnRhbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQudGFuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS50YW4oKX0sdC5wcm90b3R5cGUudGFuaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudGFuaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQudGFuaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkudGFuaCgpfSx0LnByb3RvdHlwZS50cnVuYz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudHJ1bmModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnRydW5jPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS50cnVuYygpfSx0LnBvdz1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5wb3cocil9LHQucHJvdG90eXBlLnBvdz1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5wb3dTKHQpOnRoaXMucG93TSh0KX0sdC5wcm90b3R5cGUucG93Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscixNYXRoLnBvdyh0aGlzLmdldChlLHIpLHQpKTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUucG93TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLE1hdGgucG93KHRoaXMuZ2V0KGUsciksdC5nZXQoZSxyKSkpO3JldHVybiB0aGlzfX0oemUsVmUpO2NsYXNzIFBlIGV4dGVuZHMgemV7Y29uc3RydWN0b3IodCxlLHIpe3N1cGVyKCksdGhpcy5tYXRyaXg9dCx0aGlzLnJvd3M9ZSx0aGlzLmNvbHVtbnM9cn19Y2xhc3MgcWUgZXh0ZW5kcyBQZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LHQuY29sdW1ucyx0LnJvd3MpfXNldCh0LGUscil7cmV0dXJuIHRoaXMubWF0cml4LnNldChlLHQsciksdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5tYXRyaXguZ2V0KGUsdCl9fWNsYXNzICRlIGV4dGVuZHMgemV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmRhdGE9dCx0aGlzLnJvd3M9dC5sZW5ndGgsdGhpcy5jb2x1bW5zPXRbMF0ubGVuZ3RofXNldCh0LGUscil7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXT1yLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXX19ZnVuY3Rpb24gRGUodCxlKXtsZXQgcj0wO3JldHVybiBNYXRoLmFicyh0KT5NYXRoLmFicyhlKT8ocj1lL3QsTWF0aC5hYnModCkqTWF0aC5zcXJ0KDErcipyKSk6MCE9PWU/KHI9dC9lLE1hdGguYWJzKGUpKk1hdGguc3FydCgxK3IqcikpOjB9Y2xhc3MgVWV7Y29uc3RydWN0b3IodCxlPXt9KXtpZigodD0kZS5jaGVja01hdHJpeCh0KSkuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IG11c3QgYmUgbm9uLWVtcHR5Iik7bGV0IHI9dC5yb3dzLG49dC5jb2x1bW5zO2NvbnN0e2NvbXB1dGVMZWZ0U2luZ3VsYXJWZWN0b3JzOm89ITAsY29tcHV0ZVJpZ2h0U2luZ3VsYXJWZWN0b3JzOnM9ITAsYXV0b1RyYW5zcG9zZTppPSExfT1lO2xldCB1LGE9Qm9vbGVhbihvKSxoPUJvb2xlYW4ocyksbD0hMTtpZihyPG4paWYoaSl7dT10LnRyYW5zcG9zZSgpLHI9dS5yb3dzLG49dS5jb2x1bW5zLGw9ITA7bGV0IGU9YTthPWgsaD1lfWVsc2UgdT10LmNsb25lKCksY29uc29sZS53YXJuKCJDb21wdXRpbmcgU1ZEIG9uIGEgbWF0cml4IHdpdGggbW9yZSBjb2x1bW5zIHRoYW4gcm93cy4gQ29uc2lkZXIgZW5hYmxpbmcgYXV0b1RyYW5zcG9zZSIpO2Vsc2UgdT10LmNsb25lKCk7bGV0IGM9TWF0aC5taW4ocixuKSxmPU1hdGgubWluKHIrMSxuKSxtPW5ldyBGbG9hdDY0QXJyYXkoZiksZz1uZXcgVmUocixjKSxwPW5ldyBWZShuLG4pLHc9bmV3IEZsb2F0NjRBcnJheShuKSxkPW5ldyBGbG9hdDY0QXJyYXkociksYj1uZXcgRmxvYXQ2NEFycmF5KGYpO2ZvcihsZXQgdD0wO3Q8Zjt0KyspYlt0XT10O2xldCB5PU1hdGgubWluKHItMSxuKSx2PU1hdGgubWF4KDAsTWF0aC5taW4obi0yLHIpKSxNPU1hdGgubWF4KHksdik7Zm9yKGxldCB0PTA7dDxNO3QrKyl7aWYodDx5KXttW3RdPTA7Zm9yKGxldCBlPXQ7ZTxyO2UrKyltW3RdPURlKG1bdF0sdS5nZXQoZSx0KSk7aWYoMCE9PW1bdF0pe3UuZ2V0KHQsdCk8MCYmKG1bdF09LW1bdF0pO2ZvcihsZXQgZT10O2U8cjtlKyspdS5zZXQoZSx0LHUuZ2V0KGUsdCkvbVt0XSk7dS5zZXQodCx0LHUuZ2V0KHQsdCkrMSl9bVt0XT0tbVt0XX1mb3IobGV0IGU9dCsxO2U8bjtlKyspe2lmKHQ8eSYmMCE9PW1bdF0pe2xldCBuPTA7Zm9yKGxldCBvPXQ7bzxyO28rKyluKz11LmdldChvLHQpKnUuZ2V0KG8sZSk7bj0tbi91LmdldCh0LHQpO2ZvcihsZXQgbz10O288cjtvKyspdS5zZXQobyxlLHUuZ2V0KG8sZSkrbip1LmdldChvLHQpKX13W2VdPXUuZ2V0KHQsZSl9aWYoYSYmdDx5KWZvcihsZXQgZT10O2U8cjtlKyspZy5zZXQoZSx0LHUuZ2V0KGUsdCkpO2lmKHQ8dil7d1t0XT0wO2ZvcihsZXQgZT10KzE7ZTxuO2UrKyl3W3RdPURlKHdbdF0sd1tlXSk7aWYoMCE9PXdbdF0pe3dbdCsxXTwwJiYod1t0XT0wLXdbdF0pO2ZvcihsZXQgZT10KzE7ZTxuO2UrKyl3W2VdLz13W3RdO3dbdCsxXSs9MX1pZih3W3RdPS13W3RdLHQrMTxyJiYwIT09d1t0XSl7Zm9yKGxldCBlPXQrMTtlPHI7ZSsrKWRbZV09MDtmb3IobGV0IGU9dCsxO2U8cjtlKyspZm9yKGxldCByPXQrMTtyPG47cisrKWRbZV0rPXdbcl0qdS5nZXQoZSxyKTtmb3IobGV0IGU9dCsxO2U8bjtlKyspe2xldCBuPS13W2VdL3dbdCsxXTtmb3IobGV0IG89dCsxO288cjtvKyspdS5zZXQobyxlLHUuZ2V0KG8sZSkrbipkW29dKX19aWYoaClmb3IobGV0IGU9dCsxO2U8bjtlKyspcC5zZXQoZSx0LHdbZV0pfX1sZXQgeD1NYXRoLm1pbihuLHIrMSk7aWYoeTxuJiYobVt5XT11LmdldCh5LHkpKSxyPHgmJihtW3gtMV09MCksdisxPHgmJih3W3ZdPXUuZ2V0KHYseC0xKSksd1t4LTFdPTAsYSl7Zm9yKGxldCB0PXk7dDxjO3QrKyl7Zm9yKGxldCBlPTA7ZTxyO2UrKylnLnNldChlLHQsMCk7Zy5zZXQodCx0LDEpfWZvcihsZXQgdD15LTE7dD49MDt0LS0paWYoMCE9PW1bdF0pe2ZvcihsZXQgZT10KzE7ZTxjO2UrKyl7bGV0IG49MDtmb3IobGV0IG89dDtvPHI7bysrKW4rPWcuZ2V0KG8sdCkqZy5nZXQobyxlKTtuPS1uL2cuZ2V0KHQsdCk7Zm9yKGxldCBvPXQ7bzxyO28rKylnLnNldChvLGUsZy5nZXQobyxlKStuKmcuZ2V0KG8sdCkpfWZvcihsZXQgZT10O2U8cjtlKyspZy5zZXQoZSx0LC1nLmdldChlLHQpKTtnLnNldCh0LHQsMStnLmdldCh0LHQpKTtmb3IobGV0IGU9MDtlPHQtMTtlKyspZy5zZXQoZSx0LDApfWVsc2V7Zm9yKGxldCBlPTA7ZTxyO2UrKylnLnNldChlLHQsMCk7Zy5zZXQodCx0LDEpfX1pZihoKWZvcihsZXQgdD1uLTE7dD49MDt0LS0pe2lmKHQ8diYmMCE9PXdbdF0pZm9yKGxldCBlPXQrMTtlPG47ZSsrKXtsZXQgcj0wO2ZvcihsZXQgbz10KzE7bzxuO28rKylyKz1wLmdldChvLHQpKnAuZ2V0KG8sZSk7cj0tci9wLmdldCh0KzEsdCk7Zm9yKGxldCBvPXQrMTtvPG47bysrKXAuc2V0KG8sZSxwLmdldChvLGUpK3IqcC5nZXQobyx0KSl9Zm9yKGxldCBlPTA7ZTxuO2UrKylwLnNldChlLHQsMCk7cC5zZXQodCx0LDEpfWxldCBFPXgtMSxTPU51bWJlci5FUFNJTE9OO2Zvcig7eD4wOyl7bGV0IHQsZTtmb3IodD14LTI7dD49LTEmJi0xIT09dDt0LS0pe2NvbnN0IGU9TnVtYmVyLk1JTl9WQUxVRStTKk1hdGguYWJzKG1bdF0rTWF0aC5hYnMobVt0KzFdKSk7aWYoTWF0aC5hYnMod1t0XSk8PWV8fE51bWJlci5pc05hTih3W3RdKSl7d1t0XT0wO2JyZWFrfX1pZih0PT09eC0yKWU9NDtlbHNle2xldCByO2ZvcihyPXgtMTtyPj10JiZyIT09dDtyLS0pe2xldCBlPShyIT09eD9NYXRoLmFicyh3W3JdKTowKSsociE9PXQrMT9NYXRoLmFicyh3W3ItMV0pOjApO2lmKE1hdGguYWJzKG1bcl0pPD1TKmUpe21bcl09MDticmVha319cj09PXQ/ZT0zOnI9PT14LTE/ZT0xOihlPTIsdD1yKX1zd2l0Y2godCsrLGUpe2Nhc2UgMTp7bGV0IGU9d1t4LTJdO3dbeC0yXT0wO2ZvcihsZXQgcj14LTI7cj49dDtyLS0pe2xldCBvPURlKG1bcl0sZSkscz1tW3JdL28saT1lL287aWYobVtyXT1vLHIhPT10JiYoZT0taSp3W3ItMV0sd1tyLTFdPXMqd1tyLTFdKSxoKWZvcihsZXQgdD0wO3Q8bjt0Kyspbz1zKnAuZ2V0KHQscikraSpwLmdldCh0LHgtMSkscC5zZXQodCx4LTEsLWkqcC5nZXQodCxyKStzKnAuZ2V0KHQseC0xKSkscC5zZXQodCxyLG8pfWJyZWFrfWNhc2UgMjp7bGV0IGU9d1t0LTFdO3dbdC0xXT0wO2ZvcihsZXQgbj10O248eDtuKyspe2xldCBvPURlKG1bbl0sZSkscz1tW25dL28saT1lL287aWYobVtuXT1vLGU9LWkqd1tuXSx3W25dPXMqd1tuXSxhKWZvcihsZXQgZT0wO2U8cjtlKyspbz1zKmcuZ2V0KGUsbikraSpnLmdldChlLHQtMSksZy5zZXQoZSx0LTEsLWkqZy5nZXQoZSxuKStzKmcuZ2V0KGUsdC0xKSksZy5zZXQoZSxuLG8pfWJyZWFrfWNhc2UgMzp7Y29uc3QgZT1NYXRoLm1heChNYXRoLmFicyhtW3gtMV0pLE1hdGguYWJzKG1beC0yXSksTWF0aC5hYnMod1t4LTJdKSxNYXRoLmFicyhtW3RdKSxNYXRoLmFicyh3W3RdKSksbz1tW3gtMV0vZSxzPW1beC0yXS9lLGk9d1t4LTJdL2UsdT1tW3RdL2UsbD13W3RdL2UsYz0oKHMrbykqKHMtbykraSppKS8yLGY9byppKihvKmkpO2xldCBkPTA7MD09PWMmJjA9PT1mfHwoZD1jPDA/MC1NYXRoLnNxcnQoYypjK2YpOk1hdGguc3FydChjKmMrZiksZD1mLyhjK2QpKTtsZXQgYj0odStvKSoodS1vKStkLHk9dSpsO2ZvcihsZXQgZT10O2U8eC0xO2UrKyl7bGV0IG89RGUoYix5KTswPT09byYmKG89TnVtYmVyLk1JTl9WQUxVRSk7bGV0IHM9Yi9vLGk9eS9vO2lmKGUhPT10JiYod1tlLTFdPW8pLGI9cyptW2VdK2kqd1tlXSx3W2VdPXMqd1tlXS1pKm1bZV0seT1pKm1bZSsxXSxtW2UrMV09cyptW2UrMV0saClmb3IobGV0IHQ9MDt0PG47dCsrKW89cypwLmdldCh0LGUpK2kqcC5nZXQodCxlKzEpLHAuc2V0KHQsZSsxLC1pKnAuZ2V0KHQsZSkrcypwLmdldCh0LGUrMSkpLHAuc2V0KHQsZSxvKTtpZihvPURlKGIseSksMD09PW8mJihvPU51bWJlci5NSU5fVkFMVUUpLHM9Yi9vLGk9eS9vLG1bZV09byxiPXMqd1tlXStpKm1bZSsxXSxtW2UrMV09LWkqd1tlXStzKm1bZSsxXSx5PWkqd1tlKzFdLHdbZSsxXT1zKndbZSsxXSxhJiZlPHItMSlmb3IobGV0IHQ9MDt0PHI7dCsrKW89cypnLmdldCh0LGUpK2kqZy5nZXQodCxlKzEpLGcuc2V0KHQsZSsxLC1pKmcuZ2V0KHQsZSkrcypnLmdldCh0LGUrMSkpLGcuc2V0KHQsZSxvKX13W3gtMl09YjticmVha31jYXNlIDQ6aWYobVt0XTw9MCYmKG1bdF09bVt0XTwwPy1tW3RdOjAsaCkpZm9yKGxldCBlPTA7ZTw9RTtlKyspcC5zZXQoZSx0LC1wLmdldChlLHQpKTtmb3IoO3Q8RSYmIShtW3RdPj1tW3QrMV0pOyl7bGV0IGU9bVt0XTtpZihtW3RdPW1bdCsxXSxtW3QrMV09ZSxoJiZ0PG4tMSlmb3IobGV0IHI9MDtyPG47cisrKWU9cC5nZXQocix0KzEpLHAuc2V0KHIsdCsxLHAuZ2V0KHIsdCkpLHAuc2V0KHIsdCxlKTtpZihhJiZ0PHItMSlmb3IobGV0IG49MDtuPHI7bisrKWU9Zy5nZXQobix0KzEpLGcuc2V0KG4sdCsxLGcuZ2V0KG4sdCkpLGcuc2V0KG4sdCxlKTt0Kyt9eC0tfX1pZihsKXtsZXQgdD1wO3A9ZyxnPXR9dGhpcy5tPXIsdGhpcy5uPW4sdGhpcy5zPW0sdGhpcy5VPWcsdGhpcy5WPXB9c29sdmUodCl7bGV0IGU9dCxyPXRoaXMudGhyZXNob2xkLG49dGhpcy5zLmxlbmd0aCxvPVZlLnplcm9zKG4sbik7Zm9yKGxldCB0PTA7dDxuO3QrKylNYXRoLmFicyh0aGlzLnNbdF0pPD1yP28uc2V0KHQsdCwwKTpvLnNldCh0LHQsMS90aGlzLnNbdF0pO2xldCBzPXRoaXMuVSxpPXRoaXMucmlnaHRTaW5ndWxhclZlY3RvcnMsdT1pLm1tdWwobyksYT1pLnJvd3MsaD1zLnJvd3MsbD1WZS56ZXJvcyhhLGgpO2ZvcihsZXQgdD0wO3Q8YTt0KyspZm9yKGxldCBlPTA7ZTxoO2UrKyl7bGV0IHI9MDtmb3IobGV0IG89MDtvPG47bysrKXIrPXUuZ2V0KHQsbykqcy5nZXQoZSxvKTtsLnNldCh0LGUscil9cmV0dXJuIGwubW11bChlKX1zb2x2ZUZvckRpYWdvbmFsKHQpe3JldHVybiB0aGlzLnNvbHZlKFZlLmRpYWcodCkpfWludmVyc2UoKXtsZXQgdD10aGlzLlYsZT10aGlzLnRocmVzaG9sZCxyPXQucm93cyxuPXQuY29sdW1ucyxvPW5ldyBWZShyLHRoaXMucy5sZW5ndGgpO2ZvcihsZXQgcz0wO3M8cjtzKyspZm9yKGxldCByPTA7cjxuO3IrKylNYXRoLmFicyh0aGlzLnNbcl0pPmUmJm8uc2V0KHMscix0LmdldChzLHIpL3RoaXMuc1tyXSk7bGV0IHM9dGhpcy5VLGk9cy5yb3dzLHU9cy5jb2x1bW5zLGE9bmV3IFZlKHIsaSk7Zm9yKGxldCB0PTA7dDxyO3QrKylmb3IobGV0IGU9MDtlPGk7ZSsrKXtsZXQgcj0wO2ZvcihsZXQgbj0wO248dTtuKyspcis9by5nZXQodCxuKSpzLmdldChlLG4pO2Euc2V0KHQsZSxyKX1yZXR1cm4gYX1nZXQgY29uZGl0aW9uKCl7cmV0dXJuIHRoaXMuc1swXS90aGlzLnNbTWF0aC5taW4odGhpcy5tLHRoaXMubiktMV19Z2V0IG5vcm0yKCl7cmV0dXJuIHRoaXMuc1swXX1nZXQgcmFuaygpe2xldCB0PU1hdGgubWF4KHRoaXMubSx0aGlzLm4pKnRoaXMuc1swXSpOdW1iZXIuRVBTSUxPTixlPTAscj10aGlzLnM7Zm9yKGxldCBuPTAsbz1yLmxlbmd0aDtuPG87bisrKXJbbl0+dCYmZSsrO3JldHVybiBlfWdldCBkaWFnb25hbCgpe3JldHVybiBBcnJheS5mcm9tKHRoaXMucyl9Z2V0IHRocmVzaG9sZCgpe3JldHVybiBOdW1iZXIuRVBTSUxPTi8yKk1hdGgubWF4KHRoaXMubSx0aGlzLm4pKnRoaXMuc1swXX1nZXQgbGVmdFNpbmd1bGFyVmVjdG9ycygpe3JldHVybiB0aGlzLlV9Z2V0IHJpZ2h0U2luZ3VsYXJWZWN0b3JzKCl7cmV0dXJuIHRoaXMuVn1nZXQgZGlhZ29uYWxNYXRyaXgoKXtyZXR1cm4gVmUuZGlhZyh0aGlzLnMpfX1jbGFzcyBMZXtjb25zdHJ1Y3Rvcih0LGU9e30pe2NvbnN0e2Fzc3VtZVN5bW1ldHJpYzpyPSExfT1lO2lmKCEodD0kZS5jaGVja01hdHJpeCh0KSkuaXNTcXVhcmUoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBpcyBub3QgYSBzcXVhcmUgbWF0cml4Iik7aWYodC5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggbXVzdCBiZSBub24tZW1wdHkiKTtsZXQgbixvLHM9dC5jb2x1bW5zLGk9bmV3IFZlKHMscyksdT1uZXcgRmxvYXQ2NEFycmF5KHMpLGE9bmV3IEZsb2F0NjRBcnJheShzKSxoPXQsbD0hMTtpZihsPSEhcnx8dC5pc1N5bW1ldHJpYygpLGwpe2ZvcihuPTA7bjxzO24rKylmb3Iobz0wO288cztvKyspaS5zZXQobixvLGguZ2V0KG4sbykpOyFmdW5jdGlvbih0LGUscixuKXtsZXQgbyxzLGksdSxhLGgsbCxjO2ZvcihhPTA7YTx0O2ErKylyW2FdPW4uZ2V0KHQtMSxhKTtmb3IodT10LTE7dT4wO3UtLSl7Zm9yKGM9MCxpPTAsaD0wO2g8dTtoKyspYys9TWF0aC5hYnMocltoXSk7aWYoMD09PWMpZm9yKGVbdV09clt1LTFdLGE9MDthPHU7YSsrKXJbYV09bi5nZXQodS0xLGEpLG4uc2V0KHUsYSwwKSxuLnNldChhLHUsMCk7ZWxzZXtmb3IoaD0wO2g8dTtoKyspcltoXS89YyxpKz1yW2hdKnJbaF07Zm9yKG89clt1LTFdLHM9TWF0aC5zcXJ0KGkpLG8+MCYmKHM9LXMpLGVbdV09YypzLGktPW8qcyxyW3UtMV09by1zLGE9MDthPHU7YSsrKWVbYV09MDtmb3IoYT0wO2E8dTthKyspe2ZvcihvPXJbYV0sbi5zZXQoYSx1LG8pLHM9ZVthXStuLmdldChhLGEpKm8saD1hKzE7aDw9dS0xO2grKylzKz1uLmdldChoLGEpKnJbaF0sZVtoXSs9bi5nZXQoaCxhKSpvO2VbYV09c31mb3Iobz0wLGE9MDthPHU7YSsrKWVbYV0vPWksbys9ZVthXSpyW2FdO2ZvcihsPW8vKGkraSksYT0wO2E8dTthKyspZVthXS09bCpyW2FdO2ZvcihhPTA7YTx1O2ErKyl7Zm9yKG89clthXSxzPWVbYV0saD1hO2g8PXUtMTtoKyspbi5zZXQoaCxhLG4uZ2V0KGgsYSktKG8qZVtoXStzKnJbaF0pKTtyW2FdPW4uZ2V0KHUtMSxhKSxuLnNldCh1LGEsMCl9fXJbdV09aX1mb3IodT0wO3U8dC0xO3UrKyl7aWYobi5zZXQodC0xLHUsbi5nZXQodSx1KSksbi5zZXQodSx1LDEpLGk9clt1KzFdLDAhPT1pKXtmb3IoaD0wO2g8PXU7aCsrKXJbaF09bi5nZXQoaCx1KzEpL2k7Zm9yKGE9MDthPD11O2ErKyl7Zm9yKHM9MCxoPTA7aDw9dTtoKyspcys9bi5nZXQoaCx1KzEpKm4uZ2V0KGgsYSk7Zm9yKGg9MDtoPD11O2grKyluLnNldChoLGEsbi5nZXQoaCxhKS1zKnJbaF0pfX1mb3IoaD0wO2g8PXU7aCsrKW4uc2V0KGgsdSsxLDApfWZvcihhPTA7YTx0O2ErKylyW2FdPW4uZ2V0KHQtMSxhKSxuLnNldCh0LTEsYSwwKTtuLnNldCh0LTEsdC0xLDEpLGVbMF09MH0ocyxhLHUsaSksZnVuY3Rpb24odCxlLHIsbil7bGV0IG8scyxpLHUsYSxoLGwsYyxmLG0sZyxwLHcsZCxiLHk7Zm9yKGk9MTtpPHQ7aSsrKWVbaS0xXT1lW2ldO2VbdC0xXT0wO2xldCB2PTAsTT0wLHg9TnVtYmVyLkVQU0lMT047Zm9yKGg9MDtoPHQ7aCsrKXtmb3IoTT1NYXRoLm1heChNLE1hdGguYWJzKHJbaF0pK01hdGguYWJzKGVbaF0pKSxsPWg7bDx0JiYhKE1hdGguYWJzKGVbbF0pPD14Kk0pOylsKys7aWYobD5oKWRve2ZvcihvPXJbaF0sYz0ocltoKzFdLW8pLygyKmVbaF0pLGY9RGUoYywxKSxjPDAmJihmPS1mKSxyW2hdPWVbaF0vKGMrZikscltoKzFdPWVbaF0qKGMrZiksbT1yW2grMV0scz1vLXJbaF0saT1oKzI7aTx0O2krKylyW2ldLT1zO2Zvcih2Kz1zLGM9cltsXSxnPTEscD1nLHc9ZyxkPWVbaCsxXSxiPTAseT0wLGk9bC0xO2k+PWg7aS0tKWZvcih3PXAscD1nLHk9YixvPWcqZVtpXSxzPWcqYyxmPURlKGMsZVtpXSksZVtpKzFdPWIqZixiPWVbaV0vZixnPWMvZixjPWcqcltpXS1iKm8scltpKzFdPXMrYiooZypvK2IqcltpXSksYT0wO2E8dDthKyspcz1uLmdldChhLGkrMSksbi5zZXQoYSxpKzEsYipuLmdldChhLGkpK2cqcyksbi5zZXQoYSxpLGcqbi5nZXQoYSxpKS1iKnMpO2M9LWIqeSp3KmQqZVtoXS9tLGVbaF09YipjLHJbaF09ZypjfXdoaWxlKE1hdGguYWJzKGVbaF0pPngqTSk7cltoXT1yW2hdK3YsZVtoXT0wfWZvcihpPTA7aTx0LTE7aSsrKXtmb3IoYT1pLGM9cltpXSx1PWkrMTt1PHQ7dSsrKXJbdV08YyYmKGE9dSxjPXJbdV0pO2lmKGEhPT1pKWZvcihyW2FdPXJbaV0scltpXT1jLHU9MDt1PHQ7dSsrKWM9bi5nZXQodSxpKSxuLnNldCh1LGksbi5nZXQodSxhKSksbi5zZXQodSxhLGMpfX0ocyxhLHUsaSl9ZWxzZXtsZXQgdD1uZXcgVmUocyxzKSxlPW5ldyBGbG9hdDY0QXJyYXkocyk7Zm9yKG89MDtvPHM7bysrKWZvcihuPTA7bjxzO24rKyl0LnNldChuLG8saC5nZXQobixvKSk7IWZ1bmN0aW9uKHQsZSxyLG4pe2xldCBvLHMsaSx1LGEsaCxsLGM9MCxmPXQtMTtmb3IoaD1jKzE7aDw9Zi0xO2grKyl7Zm9yKGw9MCx1PWg7dTw9Zjt1KyspbCs9TWF0aC5hYnMoZS5nZXQodSxoLTEpKTtpZigwIT09bCl7Zm9yKGk9MCx1PWY7dT49aDt1LS0pclt1XT1lLmdldCh1LGgtMSkvbCxpKz1yW3VdKnJbdV07Zm9yKHM9TWF0aC5zcXJ0KGkpLHJbaF0+MCYmKHM9LXMpLGktPXJbaF0qcyxyW2hdPXJbaF0tcyxhPWg7YTx0O2ErKyl7Zm9yKG89MCx1PWY7dT49aDt1LS0pbys9clt1XSplLmdldCh1LGEpO2ZvcihvLz1pLHU9aDt1PD1mO3UrKyllLnNldCh1LGEsZS5nZXQodSxhKS1vKnJbdV0pfWZvcih1PTA7dTw9Zjt1Kyspe2ZvcihvPTAsYT1mO2E+PWg7YS0tKW8rPXJbYV0qZS5nZXQodSxhKTtmb3Ioby89aSxhPWg7YTw9ZjthKyspZS5zZXQodSxhLGUuZ2V0KHUsYSktbypyW2FdKX1yW2hdPWwqcltoXSxlLnNldChoLGgtMSxsKnMpfX1mb3IodT0wO3U8dDt1KyspZm9yKGE9MDthPHQ7YSsrKW4uc2V0KHUsYSx1PT09YT8xOjApO2ZvcihoPWYtMTtoPj1jKzE7aC0tKWlmKDAhPT1lLmdldChoLGgtMSkpe2Zvcih1PWgrMTt1PD1mO3UrKylyW3VdPWUuZ2V0KHUsaC0xKTtmb3IoYT1oO2E8PWY7YSsrKXtmb3Iocz0wLHU9aDt1PD1mO3UrKylzKz1yW3VdKm4uZ2V0KHUsYSk7Zm9yKHM9cy9yW2hdL2UuZ2V0KGgsaC0xKSx1PWg7dTw9Zjt1Kyspbi5zZXQodSxhLG4uZ2V0KHUsYSkrcypyW3VdKX19fShzLHQsZSxpKSxmdW5jdGlvbih0LGUscixuLG8pe2xldCBzLGksdSxhLGgsbCxjLGYsbSxnLHAsdyxkLGIseSx2PXQtMSxNPTAseD10LTEsRT1OdW1iZXIuRVBTSUxPTixTPTAsaj0wLF89MCxBPTAsQz0wLFI9MCxJPTAsaz0wO2ZvcihzPTA7czx0O3MrKylmb3IoKHM8TXx8cz54KSYmKHJbc109by5nZXQocyxzKSxlW3NdPTApLGk9TWF0aC5tYXgocy0xLDApO2k8dDtpKyspais9TWF0aC5hYnMoby5nZXQocyxpKSk7Zm9yKDt2Pj1NOyl7Zm9yKGE9djthPk0mJihSPU1hdGguYWJzKG8uZ2V0KGEtMSxhLTEpKStNYXRoLmFicyhvLmdldChhLGEpKSwwPT09UiYmKFI9aiksIShNYXRoLmFicyhvLmdldChhLGEtMSkpPEUqUikpOylhLS07aWYoYT09PXYpby5zZXQodix2LG8uZ2V0KHYsdikrUyksclt2XT1vLmdldCh2LHYpLGVbdl09MCx2LS0saz0wO2Vsc2UgaWYoYT09PXYtMSl7aWYoYz1vLmdldCh2LHYtMSkqby5nZXQodi0xLHYpLF89KG8uZ2V0KHYtMSx2LTEpLW8uZ2V0KHYsdikpLzIsQT1fKl8rYyxJPU1hdGguc3FydChNYXRoLmFicyhBKSksby5zZXQodix2LG8uZ2V0KHYsdikrUyksby5zZXQodi0xLHYtMSxvLmdldCh2LTEsdi0xKStTKSxmPW8uZ2V0KHYsdiksQT49MCl7Zm9yKEk9Xz49MD9fK0k6Xy1JLHJbdi0xXT1mK0ksclt2XT1yW3YtMV0sMCE9PUkmJihyW3ZdPWYtYy9JKSxlW3YtMV09MCxlW3ZdPTAsZj1vLmdldCh2LHYtMSksUj1NYXRoLmFicyhmKStNYXRoLmFicyhJKSxfPWYvUixBPUkvUixDPU1hdGguc3FydChfKl8rQSpBKSxfLz1DLEEvPUMsaT12LTE7aTx0O2krKylJPW8uZ2V0KHYtMSxpKSxvLnNldCh2LTEsaSxBKkkrXypvLmdldCh2LGkpKSxvLnNldCh2LGksQSpvLmdldCh2LGkpLV8qSSk7Zm9yKHM9MDtzPD12O3MrKylJPW8uZ2V0KHMsdi0xKSxvLnNldChzLHYtMSxBKkkrXypvLmdldChzLHYpKSxvLnNldChzLHYsQSpvLmdldChzLHYpLV8qSSk7Zm9yKHM9TTtzPD14O3MrKylJPW4uZ2V0KHMsdi0xKSxuLnNldChzLHYtMSxBKkkrXypuLmdldChzLHYpKSxuLnNldChzLHYsQSpuLmdldChzLHYpLV8qSSl9ZWxzZSByW3YtMV09ZitfLHJbdl09ZitfLGVbdi0xXT1JLGVbdl09LUk7di09MixrPTB9ZWxzZXtpZihmPW8uZ2V0KHYsdiksbT0wLGM9MCxhPHYmJihtPW8uZ2V0KHYtMSx2LTEpLGM9by5nZXQodix2LTEpKm8uZ2V0KHYtMSx2KSksMTA9PT1rKXtmb3IoUys9ZixzPU07czw9djtzKyspby5zZXQocyxzLG8uZ2V0KHMscyktZik7Uj1NYXRoLmFicyhvLmdldCh2LHYtMSkpK01hdGguYWJzKG8uZ2V0KHYtMSx2LTIpKSxmPW09Ljc1KlIsYz0tLjQzNzUqUipSfWlmKDMwPT09ayYmKFI9KG0tZikvMixSPVIqUitjLFI+MCkpe2ZvcihSPU1hdGguc3FydChSKSxtPGYmJihSPS1SKSxSPWYtYy8oKG0tZikvMitSKSxzPU07czw9djtzKyspby5zZXQocyxzLG8uZ2V0KHMscyktUik7Uys9UixmPW09Yz0uOTY0fWZvcihrKz0xLGg9di0yO2g+PWEmJihJPW8uZ2V0KGgsaCksQz1mLUksUj1tLUksXz0oQypSLWMpL28uZ2V0KGgrMSxoKStvLmdldChoLGgrMSksQT1vLmdldChoKzEsaCsxKS1JLUMtUixDPW8uZ2V0KGgrMixoKzEpLFI9TWF0aC5hYnMoXykrTWF0aC5hYnMoQSkrTWF0aC5hYnMoQyksXy89UixBLz1SLEMvPVIsaCE9PWEpJiYhKE1hdGguYWJzKG8uZ2V0KGgsaC0xKSkqKE1hdGguYWJzKEEpK01hdGguYWJzKEMpKTxFKihNYXRoLmFicyhfKSooTWF0aC5hYnMoby5nZXQoaC0xLGgtMSkpK01hdGguYWJzKEkpK01hdGguYWJzKG8uZ2V0KGgrMSxoKzEpKSkpKTspaC0tO2ZvcihzPWgrMjtzPD12O3MrKylvLnNldChzLHMtMiwwKSxzPmgrMiYmby5zZXQocyxzLTMsMCk7Zm9yKHU9aDt1PD12LTEmJihiPXUhPT12LTEsdSE9PWgmJihfPW8uZ2V0KHUsdS0xKSxBPW8uZ2V0KHUrMSx1LTEpLEM9Yj9vLmdldCh1KzIsdS0xKTowLGY9TWF0aC5hYnMoXykrTWF0aC5hYnMoQSkrTWF0aC5hYnMoQyksMCE9PWYmJihfLz1mLEEvPWYsQy89ZikpLDAhPT1mKTt1KyspaWYoUj1NYXRoLnNxcnQoXypfK0EqQStDKkMpLF88MCYmKFI9LVIpLDAhPT1SKXtmb3IodSE9PWg/by5zZXQodSx1LTEsLVIqZik6YSE9PWgmJm8uc2V0KHUsdS0xLC1vLmdldCh1LHUtMSkpLF8rPVIsZj1fL1IsbT1BL1IsST1DL1IsQS89XyxDLz1fLGk9dTtpPHQ7aSsrKV89by5nZXQodSxpKStBKm8uZ2V0KHUrMSxpKSxiJiYoXys9QypvLmdldCh1KzIsaSksby5zZXQodSsyLGksby5nZXQodSsyLGkpLV8qSSkpLG8uc2V0KHUsaSxvLmdldCh1LGkpLV8qZiksby5zZXQodSsxLGksby5nZXQodSsxLGkpLV8qbSk7Zm9yKHM9MDtzPD1NYXRoLm1pbih2LHUrMyk7cysrKV89ZipvLmdldChzLHUpK20qby5nZXQocyx1KzEpLGImJihfKz1JKm8uZ2V0KHMsdSsyKSxvLnNldChzLHUrMixvLmdldChzLHUrMiktXypDKSksby5zZXQocyx1LG8uZ2V0KHMsdSktXyksby5zZXQocyx1KzEsby5nZXQocyx1KzEpLV8qQSk7Zm9yKHM9TTtzPD14O3MrKylfPWYqbi5nZXQocyx1KSttKm4uZ2V0KHMsdSsxKSxiJiYoXys9SSpuLmdldChzLHUrMiksbi5zZXQocyx1KzIsbi5nZXQocyx1KzIpLV8qQykpLG4uc2V0KHMsdSxuLmdldChzLHUpLV8pLG4uc2V0KHMsdSsxLG4uZ2V0KHMsdSsxKS1fKkEpfX19aWYoMD09PWopcmV0dXJuO2Zvcih2PXQtMTt2Pj0wO3YtLSlpZihfPXJbdl0sQT1lW3ZdLDA9PT1BKWZvcihhPXYsby5zZXQodix2LDEpLHM9di0xO3M+PTA7cy0tKXtmb3IoYz1vLmdldChzLHMpLV8sQz0wLGk9YTtpPD12O2krKylDKz1vLmdldChzLGkpKm8uZ2V0KGksdik7aWYoZVtzXTwwKUk9YyxSPUM7ZWxzZSBpZihhPXMsMD09PWVbc10/by5zZXQocyx2LDAhPT1jPy1DL2M6LUMvKEUqaikpOihmPW8uZ2V0KHMscysxKSxtPW8uZ2V0KHMrMSxzKSxBPShyW3NdLV8pKihyW3NdLV8pK2Vbc10qZVtzXSxsPShmKlItSSpDKS9BLG8uc2V0KHMsdixsKSxvLnNldChzKzEsdixNYXRoLmFicyhmKT5NYXRoLmFicyhJKT8oLUMtYypsKS9mOigtUi1tKmwpL0kpKSxsPU1hdGguYWJzKG8uZ2V0KHMsdikpLEUqbCpsPjEpZm9yKGk9cztpPD12O2krKylvLnNldChpLHYsby5nZXQoaSx2KS9sKX1lbHNlIGlmKEE8MClmb3IoYT12LTEsTWF0aC5hYnMoby5nZXQodix2LTEpKT5NYXRoLmFicyhvLmdldCh2LTEsdikpPyhvLnNldCh2LTEsdi0xLEEvby5nZXQodix2LTEpKSxvLnNldCh2LTEsdiwtKG8uZ2V0KHYsdiktXykvby5nZXQodix2LTEpKSk6KHk9QmUoMCwtby5nZXQodi0xLHYpLG8uZ2V0KHYtMSx2LTEpLV8sQSksby5zZXQodi0xLHYtMSx5WzBdKSxvLnNldCh2LTEsdix5WzFdKSksby5zZXQodix2LTEsMCksby5zZXQodix2LDEpLHM9di0yO3M+PTA7cy0tKXtmb3IoZz0wLHA9MCxpPWE7aTw9djtpKyspZys9by5nZXQocyxpKSpvLmdldChpLHYtMSkscCs9by5nZXQocyxpKSpvLmdldChpLHYpO2lmKGM9by5nZXQocyxzKS1fLGVbc108MClJPWMsQz1nLFI9cDtlbHNlIGlmKGE9cywwPT09ZVtzXT8oeT1CZSgtZywtcCxjLEEpLG8uc2V0KHMsdi0xLHlbMF0pLG8uc2V0KHMsdix5WzFdKSk6KGY9by5nZXQocyxzKzEpLG09by5nZXQocysxLHMpLHc9KHJbc10tXykqKHJbc10tXykrZVtzXSplW3NdLUEqQSxkPTIqKHJbc10tXykqQSwwPT09dyYmMD09PWQmJih3PUUqaiooTWF0aC5hYnMoYykrTWF0aC5hYnMoQSkrTWF0aC5hYnMoZikrTWF0aC5hYnMobSkrTWF0aC5hYnMoSSkpKSx5PUJlKGYqQy1JKmcrQSpwLGYqUi1JKnAtQSpnLHcsZCksby5zZXQocyx2LTEseVswXSksby5zZXQocyx2LHlbMV0pLE1hdGguYWJzKGYpPk1hdGguYWJzKEkpK01hdGguYWJzKEEpPyhvLnNldChzKzEsdi0xLCgtZy1jKm8uZ2V0KHMsdi0xKStBKm8uZ2V0KHMsdikpL2YpLG8uc2V0KHMrMSx2LCgtcC1jKm8uZ2V0KHMsdiktQSpvLmdldChzLHYtMSkpL2YpKTooeT1CZSgtQy1tKm8uZ2V0KHMsdi0xKSwtUi1tKm8uZ2V0KHMsdiksSSxBKSxvLnNldChzKzEsdi0xLHlbMF0pLG8uc2V0KHMrMSx2LHlbMV0pKSksbD1NYXRoLm1heChNYXRoLmFicyhvLmdldChzLHYtMSkpLE1hdGguYWJzKG8uZ2V0KHMsdikpKSxFKmwqbD4xKWZvcihpPXM7aTw9djtpKyspby5zZXQoaSx2LTEsby5nZXQoaSx2LTEpL2wpLG8uc2V0KGksdixvLmdldChpLHYpL2wpfWZvcihzPTA7czx0O3MrKylpZihzPE18fHM+eClmb3IoaT1zO2k8dDtpKyspbi5zZXQocyxpLG8uZ2V0KHMsaSkpO2ZvcihpPXQtMTtpPj1NO2ktLSlmb3Iocz1NO3M8PXg7cysrKXtmb3IoST0wLHU9TTt1PD1NYXRoLm1pbihpLHgpO3UrKylJKz1uLmdldChzLHUpKm8uZ2V0KHUsaSk7bi5zZXQocyxpLEkpfX0ocyxhLHUsaSx0KX10aGlzLm49cyx0aGlzLmU9YSx0aGlzLmQ9dSx0aGlzLlY9aX1nZXQgcmVhbEVpZ2VudmFsdWVzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5kKX1nZXQgaW1hZ2luYXJ5RWlnZW52YWx1ZXMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmUpfWdldCBlaWdlbnZlY3Rvck1hdHJpeCgpe3JldHVybiB0aGlzLlZ9Z2V0IGRpYWdvbmFsTWF0cml4KCl7bGV0IHQsZSxyPXRoaXMubixuPXRoaXMuZSxvPXRoaXMuZCxzPW5ldyBWZShyLHIpO2Zvcih0PTA7dDxyO3QrKyl7Zm9yKGU9MDtlPHI7ZSsrKXMuc2V0KHQsZSwwKTtzLnNldCh0LHQsb1t0XSksblt0XT4wP3Muc2V0KHQsdCsxLG5bdF0pOm5bdF08MCYmcy5zZXQodCx0LTEsblt0XSl9cmV0dXJuIHN9fWZ1bmN0aW9uIEJlKHQsZSxyLG4pe2xldCBvLHM7cmV0dXJuIE1hdGguYWJzKHIpPk1hdGguYWJzKG4pPyhvPW4vcixzPXIrbypuLFsodCtvKmUpL3MsKGUtbyp0KS9zXSk6KG89ci9uLHM9bitvKnIsWyhvKnQrZSkvcywobyplLXQpL3NdKX1jbGFzcyBHZXtjb25zdHJ1Y3Rvcih0LGU9e30pe3Q9JGUuY2hlY2tNYXRyaXgodCk7bGV0e1k6cn09ZTtjb25zdHtzY2FsZVNjb3JlczpuPSExLG1heEl0ZXJhdGlvbnM6bz0xZTMsdGVybWluYXRpb25Dcml0ZXJpYTpzPTFlLTEwfT1lO2xldCBpO2lmKHIpe2lmKHI9eWUocikmJiJudW1iZXIiPT10eXBlb2YgclswXT9WZS5jb2x1bW5WZWN0b3Iocik6JGUuY2hlY2tNYXRyaXgociksci5yb3dzIT09dC5yb3dzKXRocm93IG5ldyBFcnJvcigiWSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cyBhcyBYIik7aT1yLmdldENvbHVtblZlY3RvcigwKX1lbHNlIGk9dC5nZXRDb2x1bW5WZWN0b3IoMCk7bGV0IHUsYSxoLGwsYz0xO2ZvcihsZXQgZT0wO2U8byYmYz5zO2UrKyloPXQudHJhbnNwb3NlKCkubW11bChpKS5kaXYoaS50cmFuc3Bvc2UoKS5tbXVsKGkpLmdldCgwLDApKSxoPWguZGl2KGgubm9ybSgpKSx1PXQubW11bChoKS5kaXYoaC50cmFuc3Bvc2UoKS5tbXVsKGgpLmdldCgwLDApKSxlPjAmJihjPXUuY2xvbmUoKS5zdWIobCkucG93KDIpLnN1bSgpKSxsPXUuY2xvbmUoKSxyPyhhPXIudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKSxhPWEuZGl2KGEubm9ybSgpKSxpPXIubW11bChhKS5kaXYoYS50cmFuc3Bvc2UoKS5tbXVsKGEpLmdldCgwLDApKSk6aT11O2lmKHIpe2xldCBlPXQudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKTtlPWUuZGl2KGUubm9ybSgpKTtsZXQgbj10LmNsb25lKCkuc3ViKHUuY2xvbmUoKS5tbXVsKGUudHJhbnNwb3NlKCkpKSxvPWkudHJhbnNwb3NlKCkubW11bCh1KS5kaXYodS50cmFuc3Bvc2UoKS5tbXVsKHUpLmdldCgwLDApKSxzPXIuY2xvbmUoKS5zdWIodS5jbG9uZSgpLm11bFMoby5nZXQoMCwwKSkubW11bChhLnRyYW5zcG9zZSgpKSk7dGhpcy50PXUsdGhpcy5wPWUudHJhbnNwb3NlKCksdGhpcy53PWgudHJhbnNwb3NlKCksdGhpcy5xPWEsdGhpcy51PWksdGhpcy5zPXUudHJhbnNwb3NlKCkubW11bCh1KSx0aGlzLnhSZXNpZHVhbD1uLHRoaXMueVJlc2lkdWFsPXMsdGhpcy5iZXRhcz1vfWVsc2UgdGhpcy53PWgudHJhbnNwb3NlKCksdGhpcy5zPXUudHJhbnNwb3NlKCkubW11bCh1KS5zcXJ0KCksdGhpcy50PW4/dS5jbG9uZSgpLmRpdih0aGlzLnMuZ2V0KDAsMCkpOnUsdGhpcy54UmVzaWR1YWw9dC5zdWIodS5tbXVsKGgudHJhbnNwb3NlKCkpKX19Y2xhc3MgS2V7Y29uc3RydWN0b3IodCxlPXt9KXtpZighMD09PXQpe2NvbnN0IHQ9ZTtyZXR1cm4gdGhpcy5jZW50ZXI9dC5jZW50ZXIsdGhpcy5zY2FsZT10LnNjYWxlLHRoaXMubWVhbnM9dC5tZWFucyx0aGlzLnN0ZGV2cz10LnN0ZGV2cyx0aGlzLlU9VmUuY2hlY2tNYXRyaXgodC5VKSx0aGlzLlM9dC5TLHRoaXMuUj10LlIsdm9pZCh0aGlzLmV4Y2x1ZGVkRmVhdHVyZXM9dC5leGNsdWRlZEZlYXR1cmVzfHxbXSl9dD1uZXcgVmUodCk7Y29uc3R7aXNDb3ZhcmlhbmNlTWF0cml4OnI9ITEsbWV0aG9kOm49IlNWRCIsbkNvbXBOSVBBTFM6bz0yLGNlbnRlcjpzPSEwLHNjYWxlOmk9ITEsaWdub3JlWmVyb1ZhcmlhbmNlOnU9ITF9PWU7aWYodGhpcy5jZW50ZXI9cyx0aGlzLnNjYWxlPWksdGhpcy5tZWFucz1udWxsLHRoaXMuc3RkZXZzPW51bGwsdGhpcy5leGNsdWRlZEZlYXR1cmVzPVtdLHIpdGhpcy5fY29tcHV0ZUZyb21Db3ZhcmlhbmNlTWF0cml4KHQpO2Vsc2Ugc3dpdGNoKHRoaXMuX2FkanVzdCh0LHUpLG4pe2Nhc2UiY292YXJpYW5jZU1hdHJpeCI6e2NvbnN0IGU9bmV3IHFlKHQpLm1tdWwodCkuZGl2KHQucm93cy0xKTt0aGlzLl9jb21wdXRlRnJvbUNvdmFyaWFuY2VNYXRyaXgoZSk7YnJlYWt9Y2FzZSJOSVBBTFMiOnRoaXMuX2NvbXB1dGVXaXRoTklQQUxTKHQsbyk7YnJlYWs7Y2FzZSJTVkQiOntjb25zdCBlPW5ldyBVZSh0LHtjb21wdXRlTGVmdFNpbmd1bGFyVmVjdG9yczohMSxjb21wdXRlUmlnaHRTaW5ndWxhclZlY3RvcnM6ITAsYXV0b1RyYW5zcG9zZTohMH0pO3RoaXMuVT1lLnJpZ2h0U2luZ3VsYXJWZWN0b3JzO2NvbnN0IHI9ZS5kaWFnb25hbCxuPVtdO2Zvcihjb25zdCBlIG9mIHIpbi5wdXNoKGUqZS8odC5yb3dzLTEpKTt0aGlzLlM9bjticmVha31kZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5rbm93biBtZXRob2Q6ICR7bn1gKX19c3RhdGljIGxvYWQodCl7aWYoInN0cmluZyIhPXR5cGVvZiB0Lm5hbWUpdGhyb3cgbmV3IFR5cGVFcnJvcigibW9kZWwgbXVzdCBoYXZlIGEgbmFtZSBwcm9wZXJ0eSIpO2lmKCJQQ0EiIT09dC5uYW1lKXRocm93IG5ldyBSYW5nZUVycm9yKGBpbnZhbGlkIG1vZGVsOiAke3QubmFtZX1gKTtyZXR1cm4gbmV3IEtlKCEwLHQpfXByZWRpY3QodCxlPXt9KXtjb25zdHtuQ29tcG9uZW50czpyPXRoaXMuVS5jb2x1bW5zfT1lO2lmKHQ9bmV3IFZlKHQpLHRoaXMuY2VudGVyJiYodC5zdWJSb3dWZWN0b3IodGhpcy5tZWFucyksdGhpcy5zY2FsZSkpe2ZvcihsZXQgZSBvZiB0aGlzLmV4Y2x1ZGVkRmVhdHVyZXMpdC5yZW1vdmVDb2x1bW4oZSk7dC5kaXZSb3dWZWN0b3IodGhpcy5zdGRldnMpfWxldCBuPXQubW11bCh0aGlzLlUpO3JldHVybiBuLnN1Yk1hdHJpeCgwLG4ucm93cy0xLDAsci0xKX1pbnZlcnQodCl7bGV0IGU9KHQ9VmUuY2hlY2tNYXRyaXgodCkpLm1tdWwodGhpcy5VLnRyYW5zcG9zZSgpKTtyZXR1cm4gdGhpcy5jZW50ZXImJih0aGlzLnNjYWxlJiZlLm11bFJvd1ZlY3Rvcih0aGlzLnN0ZGV2cyksZS5hZGRSb3dWZWN0b3IodGhpcy5tZWFucykpLGV9Z2V0RXhwbGFpbmVkVmFyaWFuY2UoKXtsZXQgdD0wO2Zvcihjb25zdCBlIG9mIHRoaXMuUyl0Kz1lO3JldHVybiB0aGlzLlMubWFwKChlPT5lL3QpKX1nZXRDdW11bGF0aXZlVmFyaWFuY2UoKXtsZXQgdD10aGlzLmdldEV4cGxhaW5lZFZhcmlhbmNlKCk7Zm9yKGxldCBlPTE7ZTx0Lmxlbmd0aDtlKyspdFtlXSs9dFtlLTFdO3JldHVybiB0fWdldEVpZ2VudmVjdG9ycygpe3JldHVybiB0aGlzLlV9Z2V0RWlnZW52YWx1ZXMoKXtyZXR1cm4gdGhpcy5TfWdldFN0YW5kYXJkRGV2aWF0aW9ucygpe3JldHVybiB0aGlzLlMubWFwKCh0PT5NYXRoLnNxcnQodCkpKX1nZXRMb2FkaW5ncygpe3JldHVybiB0aGlzLlUudHJhbnNwb3NlKCl9dG9KU09OKCl7cmV0dXJue25hbWU6IlBDQSIsY2VudGVyOnRoaXMuY2VudGVyLHNjYWxlOnRoaXMuc2NhbGUsbWVhbnM6dGhpcy5tZWFucyxzdGRldnM6dGhpcy5zdGRldnMsVTp0aGlzLlUsUzp0aGlzLlMsZXhjbHVkZWRGZWF0dXJlczp0aGlzLmV4Y2x1ZGVkRmVhdHVyZXN9fV9hZGp1c3QodCxlKXtpZih0aGlzLmNlbnRlcil7Y29uc3Qgcj10Lm1lYW4oImNvbHVtbiIpLG49dGhpcy5zY2FsZT90LnN0YW5kYXJkRGV2aWF0aW9uKCJjb2x1bW4iLHttZWFuOnJ9KTpudWxsO2lmKHRoaXMubWVhbnM9cix0LnN1YlJvd1ZlY3RvcihyKSx0aGlzLnNjYWxlKXtmb3IobGV0IHI9MDtyPG4ubGVuZ3RoO3IrKylpZigwPT09bltyXSl7aWYoIWUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYENhbm5vdCBzY2FsZSB0aGUgZGF0YXNldCAoc3RhbmRhcmQgZGV2aWF0aW9uIGlzIHplcm8gYXQgaW5kZXggJHtyfWApO3QucmVtb3ZlQ29sdW1uKHIpLG4uc3BsaWNlKHIsMSksdGhpcy5leGNsdWRlZEZlYXR1cmVzLnB1c2gociksci0tfXRoaXMuc3RkZXZzPW4sdC5kaXZSb3dWZWN0b3Iobil9fX1fY29tcHV0ZUZyb21Db3ZhcmlhbmNlTWF0cml4KHQpe2NvbnN0IGU9bmV3IExlKHQse2Fzc3VtZVN5bW1ldHJpYzohMH0pO3RoaXMuVT1lLmVpZ2VudmVjdG9yTWF0cml4LHRoaXMuVS5mbGlwUm93cygpLHRoaXMuUz1lLnJlYWxFaWdlbnZhbHVlcyx0aGlzLlMucmV2ZXJzZSgpfV9jb21wdXRlV2l0aE5JUEFMUyh0LGUpe3RoaXMuVT1uZXcgVmUoZSx0LmNvbHVtbnMpLHRoaXMuUz1bXTtsZXQgcj10O2ZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPW5ldyBHZShyKTt0aGlzLlUuc2V0Um93KHQsZS53LnRyYW5zcG9zZSgpKSx0aGlzLlMucHVzaChNYXRoLnBvdyhlLnMuZ2V0KDAsMCksMikpLHI9ZS54UmVzaWR1YWx9dGhpcy5VPXRoaXMuVS50cmFuc3Bvc2UoKX19ZnVuY3Rpb24gV2UodCxlPXt9KXtpZighZGUodCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBlZmYuIGFycmF5Iik7bGV0IHI9Q3QoZSwic2NhbGUiKTtmZShyKXx8KHI9ITApO2xldCBuPUN0KGUsIm5Db21wTklQQUxTIik7Y2Uobil8fChuPTIpO2xldCBvPWxlKEN0KHQsMCxbXSkpO2lmKDA9PT1vKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBkaW1lbnNpb24gb2YgZGF0YSIpO2lmKG4+byl0aHJvdyBuZXcgRXJyb3IoIm5Db21wTklQQUxTIGlzIG1vcmUgdGhhbiB0aGUgZGltZW5zaW9uIG9mIGRhdGEiKTtsZXQgcz1uZXcgS2UodCx7bWV0aG9kOiJOSVBBTFMiLHNjYWxlOnIsbkNvbXBOSVBBTFM6bn0pLGk9cy5wcmVkaWN0KHQpO3JldHVybiBzLmludmVydChpKS50b0pTT04oKX12YXIgWGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7KytyPG4mJiExIT09ZSh0W3JdLHIsdCk7KTtyZXR1cm4gdH07dmFyIEplPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLHIsbil7Zm9yKHZhciBvPS0xLHM9T2JqZWN0KGUpLGk9bihlKSx1PWkubGVuZ3RoO3UtLTspe3ZhciBhPWlbdD91Oisrb107aWYoITE9PT1yKHNbYV0sYSxzKSlicmVha31yZXR1cm4gZX19KCk7dmFyIFllPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG49QXJyYXkodCk7KytyPHQ7KW5bcl09ZShyKTtyZXR1cm4gbn07dmFyIFplPWZ1bmN0aW9uKHQpe3JldHVybiBkKHQpJiYiW29iamVjdCBBcmd1bWVudHNdIj09dyh0KX0sSGU9T2JqZWN0LnByb3RvdHlwZSxRZT1IZS5oYXNPd25Qcm9wZXJ0eSx0cj1IZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxlcj1aZShmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP1plOmZ1bmN0aW9uKHQpe3JldHVybiBkKHQpJiZRZS5jYWxsKHQsImNhbGxlZSIpJiYhdHIuY2FsbCh0LCJjYWxsZWUiKX07dmFyIHJyPWZ1bmN0aW9uKCl7cmV0dXJuITF9LG5yPW4oKGZ1bmN0aW9uKHQsZSl7dmFyIHI9ZSYmIWUubm9kZVR5cGUmJmUsbj1yJiZ0JiYhdC5ub2RlVHlwZSYmdCxvPW4mJm4uZXhwb3J0cz09PXI/aS5CdWZmZXI6dm9pZCAwLHM9KG8/by5pc0J1ZmZlcjp2b2lkIDApfHxycjt0LmV4cG9ydHM9c30pKSxvcj0vXig/OjB8WzEtOV1cZCopJC87dmFyIHNyPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuISEoZT1udWxsPT1lPzkwMDcxOTkyNTQ3NDA5OTE6ZSkmJigibnVtYmVyIj09cnx8InN5bWJvbCIhPXImJm9yLnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8ZX0saXI9e307aXJbIltvYmplY3QgRmxvYXQzMkFycmF5XSJdPWlyWyJbb2JqZWN0IEZsb2F0NjRBcnJheV0iXT1pclsiW29iamVjdCBJbnQ4QXJyYXldIl09aXJbIltvYmplY3QgSW50MTZBcnJheV0iXT1pclsiW29iamVjdCBJbnQzMkFycmF5XSJdPWlyWyJbb2JqZWN0IFVpbnQ4QXJyYXldIl09aXJbIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIl09aXJbIltvYmplY3QgVWludDE2QXJyYXldIl09aXJbIltvYmplY3QgVWludDMyQXJyYXldIl09ITAsaXJbIltvYmplY3QgQXJndW1lbnRzXSJdPWlyWyJbb2JqZWN0IEFycmF5XSJdPWlyWyJbb2JqZWN0IEFycmF5QnVmZmVyXSJdPWlyWyJbb2JqZWN0IEJvb2xlYW5dIl09aXJbIltvYmplY3QgRGF0YVZpZXddIl09aXJbIltvYmplY3QgRGF0ZV0iXT1pclsiW29iamVjdCBFcnJvcl0iXT1pclsiW29iamVjdCBGdW5jdGlvbl0iXT1pclsiW29iamVjdCBNYXBdIl09aXJbIltvYmplY3QgTnVtYmVyXSJdPWlyWyJbb2JqZWN0IE9iamVjdF0iXT1pclsiW29iamVjdCBSZWdFeHBdIl09aXJbIltvYmplY3QgU2V0XSJdPWlyWyJbb2JqZWN0IFN0cmluZ10iXT1pclsiW29iamVjdCBXZWFrTWFwXSJdPSExO3ZhciB1cj1mdW5jdGlvbih0KXtyZXR1cm4gZCh0KSYmR3QodC5sZW5ndGgpJiYhIWlyW3codCldfTt2YXIgYXI9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX0saHI9bigoZnVuY3Rpb24odCxlKXt2YXIgcj1lJiYhZS5ub2RlVHlwZSYmZSxuPXImJnQmJiF0Lm5vZGVUeXBlJiZ0LHM9biYmbi5leHBvcnRzPT09ciYmby5wcm9jZXNzLGk9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9biYmbi5yZXF1aXJlJiZuLnJlcXVpcmUoInV0aWwiKS50eXBlcztyZXR1cm4gdHx8cyYmcy5iaW5kaW5nJiZzLmJpbmRpbmcoInV0aWwiKX1jYXRjaCh0KXt9fSgpO3QuZXhwb3J0cz1pfSkpLGxyPWhyJiZoci5pc1R5cGVkQXJyYXksY3I9bHI/YXIobHIpOnVyLGZyPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIG1yPWZ1bmN0aW9uKGUscil7dmFyIG49dChlKSxvPSFuJiZlcihlKSxzPSFuJiYhbyYmbnIoZSksaT0hbiYmIW8mJiFzJiZjcihlKSx1PW58fG98fHN8fGksYT11P1llKGUubGVuZ3RoLFN0cmluZyk6W10saD1hLmxlbmd0aDtmb3IodmFyIGwgaW4gZSkhciYmIWZyLmNhbGwoZSxsKXx8dSYmKCJsZW5ndGgiPT1sfHxzJiYoIm9mZnNldCI9PWx8fCJwYXJlbnQiPT1sKXx8aSYmKCJidWZmZXIiPT1sfHwiYnl0ZUxlbmd0aCI9PWx8fCJieXRlT2Zmc2V0Ij09bCl8fHNyKGwsaCkpfHxhLnB1c2gobCk7cmV0dXJuIGF9O3ZhciBncj1mdW5jdGlvbih0KXtyZXR1cm4gS3QodCk/bXIodCk6T3QodCl9O3ZhciBwcj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihyLG4pe2lmKG51bGw9PXIpcmV0dXJuIHI7aWYoIUt0KHIpKXJldHVybiB0KHIsbik7Zm9yKHZhciBvPXIubGVuZ3RoLHM9ZT9vOi0xLGk9T2JqZWN0KHIpOyhlP3MtLTorK3M8bykmJiExIT09bihpW3NdLHMsaSk7KTtyZXR1cm4gcn19KChmdW5jdGlvbih0LGUpe3JldHVybiB0JiZKZSh0LGUsZ3IpfSkpO3ZhciB3cj1mdW5jdGlvbih0KXtyZXR1cm4gdH07dmFyIGRyPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6d3J9O3ZhciBicj1mdW5jdGlvbihlLHIpe3JldHVybih0KGUpP1hlOnByKShlLGRyKHIpKX07dmFyIHlyPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1uZXcgb3QsdGhpcy5zaXplPTB9O3ZhciB2cj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9ZS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1lLnNpemUscn07dmFyIE1yPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldCh0KX07dmFyIHhyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX07dmFyIEVyPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztpZihyIGluc3RhbmNlb2Ygb3Qpe3ZhciBuPXIuX19kYXRhX187aWYoIXN0fHxuLmxlbmd0aDwxOTkpcmV0dXJuIG4ucHVzaChbdCxlXSksdGhpcy5zaXplPSsrci5zaXplLHRoaXM7cj10aGlzLl9fZGF0YV9fPW5ldyBndChuKX1yZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemU9ci5zaXplLHRoaXN9O2Z1bmN0aW9uIFNyKHQpe3ZhciBlPXRoaXMuX19kYXRhX189bmV3IG90KHQpO3RoaXMuc2l6ZT1lLnNpemV9U3IucHJvdG90eXBlLmNsZWFyPXlyLFNyLnByb3RvdHlwZS5kZWxldGU9dnIsU3IucHJvdG90eXBlLmdldD1NcixTci5wcm90b3R5cGUuaGFzPXhyLFNyLnByb3RvdHlwZS5zZXQ9RXI7dmFyIGpyPVNyO3ZhciBfcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5zZXQodCwiX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyIpLHRoaXN9O3ZhciBBcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9O2Z1bmN0aW9uIENyKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBndDsrK2U8cjspdGhpcy5hZGQodFtlXSl9Q3IucHJvdG90eXBlLmFkZD1Dci5wcm90b3R5cGUucHVzaD1fcixDci5wcm90b3R5cGUuaGFzPUFyO3ZhciBScj1Dcjt2YXIgSXI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7KytyPG47KWlmKGUodFtyXSxyLHQpKXJldHVybiEwO3JldHVybiExfTt2YXIga3I9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5oYXMoZSl9O3ZhciBOcj1mdW5jdGlvbih0LGUscixuLG8scyl7dmFyIGk9MSZyLHU9dC5sZW5ndGgsYT1lLmxlbmd0aDtpZih1IT1hJiYhKGkmJmE+dSkpcmV0dXJuITE7dmFyIGg9cy5nZXQodCksbD1zLmdldChlKTtpZihoJiZsKXJldHVybiBoPT1lJiZsPT10O3ZhciBjPS0xLGY9ITAsbT0yJnI/bmV3IFJyOnZvaWQgMDtmb3Iocy5zZXQodCxlKSxzLnNldChlLHQpOysrYzx1Oyl7dmFyIGc9dFtjXSxwPWVbY107aWYobil2YXIgdz1pP24ocCxnLGMsZSx0LHMpOm4oZyxwLGMsdCxlLHMpO2lmKHZvaWQgMCE9PXcpe2lmKHcpY29udGludWU7Zj0hMTticmVha31pZihtKXtpZighSXIoZSwoZnVuY3Rpb24odCxlKXtpZigha3IobSxlKSYmKGc9PT10fHxvKGcsdCxyLG4scykpKXJldHVybiBtLnB1c2goZSl9KSkpe2Y9ITE7YnJlYWt9fWVsc2UgaWYoZyE9PXAmJiFvKGcscCxyLG4scykpe2Y9ITE7YnJlYWt9fXJldHVybiBzLmRlbGV0ZSh0KSxzLmRlbGV0ZShlKSxmfSxPcj1pLlVpbnQ4QXJyYXk7dmFyIEZyPWZ1bmN0aW9uKHQpe3ZhciBlPS0xLHI9QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LG4pe3JbKytlXT1bbix0XX0pKSxyfTt2YXIgenI9ZnVuY3Rpb24odCl7dmFyIGU9LTEscj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3JbKytlXT10fSkpLHJ9LFRyPXU/dS5wcm90b3R5cGU6dm9pZCAwLFZyPVRyP1RyLnZhbHVlT2Y6dm9pZCAwO3ZhciBQcj1mdW5jdGlvbih0LGUscixuLG8scyxpKXtzd2l0Y2gocil7Y2FzZSJbb2JqZWN0IERhdGFWaWV3XSI6aWYodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fHQuYnl0ZU9mZnNldCE9ZS5ieXRlT2Zmc2V0KXJldHVybiExO3Q9dC5idWZmZXIsZT1lLmJ1ZmZlcjtjYXNlIltvYmplY3QgQXJyYXlCdWZmZXJdIjpyZXR1cm4hKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHwhcyhuZXcgT3IodCksbmV3IE9yKGUpKSk7Y2FzZSJbb2JqZWN0IEJvb2xlYW5dIjpjYXNlIltvYmplY3QgRGF0ZV0iOmNhc2UiW29iamVjdCBOdW1iZXJdIjpyZXR1cm4gWSgrdCwrZSk7Y2FzZSJbb2JqZWN0IEVycm9yXSI6cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIltvYmplY3QgUmVnRXhwXSI6Y2FzZSJbb2JqZWN0IFN0cmluZ10iOnJldHVybiB0PT1lKyIiO2Nhc2UiW29iamVjdCBNYXBdIjp2YXIgdT1GcjtjYXNlIltvYmplY3QgU2V0XSI6dmFyIGE9MSZuO2lmKHV8fCh1PXpyKSx0LnNpemUhPWUuc2l6ZSYmIWEpcmV0dXJuITE7dmFyIGg9aS5nZXQodCk7aWYoaClyZXR1cm4gaD09ZTtufD0yLGkuc2V0KHQsZSk7dmFyIGw9TnIodSh0KSx1KGUpLG4sbyxzLGkpO3JldHVybiBpLmRlbGV0ZSh0KSxsO2Nhc2UiW29iamVjdCBTeW1ib2xdIjppZihWcilyZXR1cm4gVnIuY2FsbCh0KT09VnIuY2FsbChlKX1yZXR1cm4hMX07dmFyIHFyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG49ZS5sZW5ndGgsbz10Lmxlbmd0aDsrK3I8bjspdFtvK3JdPWVbcl07cmV0dXJuIHR9O3ZhciAkcj1mdW5jdGlvbihlLHIsbil7dmFyIG89cihlKTtyZXR1cm4gdChlKT9vOnFyKG8sbihlKSl9O3ZhciBEcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aCxvPTAscz1bXTsrK3I8bjspe3ZhciBpPXRbcl07ZShpLHIsdCkmJihzW28rK109aSl9cmV0dXJuIHN9O3ZhciBVcj1mdW5jdGlvbigpe3JldHVybltdfSxMcj1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLEJyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsR3I9QnI/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9T2JqZWN0KHQpLERyKEJyKHQpLChmdW5jdGlvbihlKXtyZXR1cm4gTHIuY2FsbCh0LGUpfSkpKX06VXI7dmFyIEtyPWZ1bmN0aW9uKHQpe3JldHVybiAkcih0LGdyLEdyKX0sV3I9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgWHI9ZnVuY3Rpb24odCxlLHIsbixvLHMpe3ZhciBpPTEmcix1PUtyKHQpLGE9dS5sZW5ndGg7aWYoYSE9S3IoZSkubGVuZ3RoJiYhaSlyZXR1cm4hMTtmb3IodmFyIGg9YTtoLS07KXt2YXIgbD11W2hdO2lmKCEoaT9sIGluIGU6V3IuY2FsbChlLGwpKSlyZXR1cm4hMX12YXIgYz1zLmdldCh0KSxmPXMuZ2V0KGUpO2lmKGMmJmYpcmV0dXJuIGM9PWUmJmY9PXQ7dmFyIG09ITA7cy5zZXQodCxlKSxzLnNldChlLHQpO2Zvcih2YXIgZz1pOysraDxhOyl7dmFyIHA9dFtsPXVbaF1dLHc9ZVtsXTtpZihuKXZhciBkPWk/bih3LHAsbCxlLHQscyk6bihwLHcsbCx0LGUscyk7aWYoISh2b2lkIDA9PT1kP3A9PT13fHxvKHAsdyxyLG4scyk6ZCkpe209ITE7YnJlYWt9Z3x8KGc9ImNvbnN0cnVjdG9yIj09bCl9aWYobSYmIWcpe3ZhciBiPXQuY29uc3RydWN0b3IseT1lLmNvbnN0cnVjdG9yO2I9PXl8fCEoImNvbnN0cnVjdG9yImluIHQpfHwhKCJjb25zdHJ1Y3RvciJpbiBlKXx8ImZ1bmN0aW9uIj09dHlwZW9mIGImJmIgaW5zdGFuY2VvZiBiJiYiZnVuY3Rpb24iPT10eXBlb2YgeSYmeSBpbnN0YW5jZW9mIHl8fChtPSExKX1yZXR1cm4gcy5kZWxldGUodCkscy5kZWxldGUoZSksbX0sSnI9IltvYmplY3QgT2JqZWN0XSIsWXI9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgWnI9ZnVuY3Rpb24oZSxyLG4sbyxzLGkpe3ZhciB1PXQoZSksYT10KHIpLGg9dT8iW29iamVjdCBBcnJheV0iOkJ0KGUpLGw9YT8iW29iamVjdCBBcnJheV0iOkJ0KHIpLGM9KGg9IltvYmplY3QgQXJndW1lbnRzXSI9PWg/SnI6aCk9PUpyLGY9KGw9IltvYmplY3QgQXJndW1lbnRzXSI9PWw/SnI6bCk9PUpyLG09aD09bDtpZihtJiZucihlKSl7aWYoIW5yKHIpKXJldHVybiExO3U9ITAsYz0hMX1pZihtJiYhYylyZXR1cm4gaXx8KGk9bmV3IGpyKSx1fHxjcihlKT9OcihlLHIsbixvLHMsaSk6UHIoZSxyLGgsbixvLHMsaSk7aWYoISgxJm4pKXt2YXIgZz1jJiZZci5jYWxsKGUsIl9fd3JhcHBlZF9fIikscD1mJiZZci5jYWxsKHIsIl9fd3JhcHBlZF9fIik7aWYoZ3x8cCl7dmFyIHc9Zz9lLnZhbHVlKCk6ZSxkPXA/ci52YWx1ZSgpOnI7cmV0dXJuIGl8fChpPW5ldyBqcikscyh3LGQsbixvLGkpfX1yZXR1cm4hIW0mJihpfHwoaT1uZXcganIpLFhyKGUscixuLG8scyxpKSl9O3ZhciBIcj1mdW5jdGlvbiB0KGUscixuLG8scyl7cmV0dXJuIGU9PT1yfHwobnVsbD09ZXx8bnVsbD09cnx8IWQoZSkmJiFkKHIpP2UhPWUmJnIhPXI6WnIoZSxyLG4sbyx0LHMpKX07dmFyIFFyPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBvPXIubGVuZ3RoLHM9byxpPSFuO2lmKG51bGw9PXQpcmV0dXJuIXM7Zm9yKHQ9T2JqZWN0KHQpO28tLTspe3ZhciB1PXJbb107aWYoaSYmdVsyXT91WzFdIT09dFt1WzBdXTohKHVbMF1pbiB0KSlyZXR1cm4hMX1mb3IoOysrbzxzOyl7dmFyIGE9KHU9cltvXSlbMF0saD10W2FdLGw9dVsxXTtpZihpJiZ1WzJdKXtpZih2b2lkIDA9PT1oJiYhKGEgaW4gdCkpcmV0dXJuITF9ZWxzZXt2YXIgYz1uZXcganI7aWYobil2YXIgZj1uKGgsbCxhLHQsZSxjKTtpZighKHZvaWQgMD09PWY/SHIobCxoLDMsbixjKTpmKSlyZXR1cm4hMX19cmV0dXJuITB9O3ZhciB0bj1mdW5jdGlvbih0KXtyZXR1cm4gdD09dCYmIXgodCl9O3ZhciBlbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9Z3IodCkscj1lLmxlbmd0aDtyLS07KXt2YXIgbj1lW3JdLG89dFtuXTtlW3JdPVtuLG8sdG4obyldfXJldHVybiBlfTt2YXIgcm49ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIG51bGwhPXImJihyW3RdPT09ZSYmKHZvaWQgMCE9PWV8fHQgaW4gT2JqZWN0KHIpKSl9fTt2YXIgbm49ZnVuY3Rpb24odCl7dmFyIGU9ZW4odCk7cmV0dXJuIDE9PWUubGVuZ3RoJiZlWzBdWzJdP3JuKGVbMF1bMF0sZVswXVsxXSk6ZnVuY3Rpb24ocil7cmV0dXJuIHI9PT10fHxRcihyLHQsZSl9fTt2YXIgb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmZSBpbiBPYmplY3QodCl9O3ZhciBzbj1mdW5jdGlvbihlLHIsbil7Zm9yKHZhciBvPS0xLHM9KHI9anQocixlKSkubGVuZ3RoLGk9ITE7KytvPHM7KXt2YXIgdT1fdChyW29dKTtpZighKGk9bnVsbCE9ZSYmbihlLHUpKSlicmVhaztlPWVbdV19cmV0dXJuIGl8fCsrbyE9cz9pOiEhKHM9bnVsbD09ZT8wOmUubGVuZ3RoKSYmR3QocykmJnNyKHUscykmJih0KGUpfHxlcihlKSl9O3ZhciB1bj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZzbih0LGUsb24pfTt2YXIgYW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gTSh0KSYmdG4oZSk/cm4oX3QodCksZSk6ZnVuY3Rpb24ocil7dmFyIG49Q3Qocix0KTtyZXR1cm4gdm9pZCAwPT09biYmbj09PWU/dW4ocix0KTpIcihlLG4sMyl9fTt2YXIgaG49ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBBdChlLHQpfX07dmFyIGxuPWZ1bmN0aW9uKHQpe3JldHVybiBNKHQpP1h0KF90KHQpKTpobih0KX07dmFyIGNuPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bnVsbD09ZT93cjoib2JqZWN0Ij09dHlwZW9mIGU/dChlKT9hbihlWzBdLGVbMV0pOm5uKGUpOmxuKGUpfTt2YXIgZm49ZnVuY3Rpb24odCxlKXt2YXIgcj0tMSxuPUt0KHQpP0FycmF5KHQubGVuZ3RoKTpbXTtyZXR1cm4gcHIodCwoZnVuY3Rpb24odCxvLHMpe25bKytyXT1lKHQsbyxzKX0pKSxufTt2YXIgbW49ZnVuY3Rpb24oZSxyKXtyZXR1cm4odChlKT92dDpmbikoZSxjbihyKSl9O3ZhciBnbj1mdW5jdGlvbih0LGUpe3JldHVybiB2dChlLChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKX07dmFyIHBuPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1tdOmduKHQsZ3IodCkpfTtmdW5jdGlvbiB3bih0KXtyZXR1cm4hKCFwZSh0KXx8IiI9PT10KX1mdW5jdGlvbiBkbih0KXtsZXQgZT0hMTtyZXR1cm4gd24odCk/ZT0haXNOYU4oTnVtYmVyKHQpKTpmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdW1iZXJdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX0odCkmJihlPSEwKSxlfWZ1bmN0aW9uIGJuKHQsZSl7aWYoIWdlKHQpKXJldHVybnt9O2lmKCFkZShlKSlyZXR1cm57fTtsZXQgcj17fTtyZXR1cm4gYnIoZSwoZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKHQsZSl7cmV0dXJuISFnZSh0KSYmISghd24oZSkmJiFkbihlKSkmJmUgaW4gdH0pKHQsZSkmJihyW2VdPUN0KHQsZSkpfSkpLHJ9dmFyIHluPS9ccy87dmFyIHZuPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS0mJnluLnRlc3QodC5jaGFyQXQoZSkpOyk7cmV0dXJuIGV9LE1uPS9eXHMrLzt2YXIgeG49ZnVuY3Rpb24odCl7cmV0dXJuIHQ/dC5zbGljZSgwLHZuKHQpKzEpLnJlcGxhY2UoTW4sIiIpOnR9LEVuPS9eWy0rXTB4WzAtOWEtZl0rJC9pLFNuPS9eMGJbMDFdKyQvaSxqbj0vXjBvWzAtN10rJC9pLF9uPXBhcnNlSW50O3ZhciBBbj1mdW5jdGlvbih0KXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYoYih0KSlyZXR1cm4gTmFOO2lmKHgodCkpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PXgoZSk/ZSsiIjplfWlmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gMD09PXQ/dDordDt0PXhuKHQpO3ZhciByPVNuLnRlc3QodCk7cmV0dXJuIHJ8fGpuLnRlc3QodCk/X24odC5zbGljZSgyKSxyPzI6OCk6RW4udGVzdCh0KT9OYU46K3R9O3ZhciBDbj1mdW5jdGlvbih0KXtyZXR1cm4gdD9JbmZpbml0eT09PSh0PUFuKHQpKXx8LUluZmluaXR5PT09dD8xNzk3NjkzMTM0ODYyMzE1N2UyOTIqKHQ8MD8tMToxKTp0PT10P3Q6MDowPT09dD90OjB9O3ZhciBSbj1mdW5jdGlvbih0KXt2YXIgZT1Dbih0KSxyPWUlMTtyZXR1cm4gZT09ZT9yP2UtcjplOjB9LEluPWkuaXNGaW5pdGUsa249TWF0aC5taW47dmFyIE5uPWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGhbdF07cmV0dXJuIGZ1bmN0aW9uKHQscil7aWYodD1Bbih0KSwocj1udWxsPT1yPzA6a24oUm4ociksMjkyKSkmJkluKHQpKXt2YXIgbj0oU3QodCkrImUiKS5zcGxpdCgiZSIpLG89ZShuWzBdKyJlIisoK25bMV0rcikpO3JldHVybisoKG49KFN0KG8pKyJlIikuc3BsaXQoImUiKSlbMF0rImUiKygrblsxXS1yKSl9cmV0dXJuIGUodCl9fSgicm91bmQiKTtmdW5jdGlvbiBPbih0KXtpZighZG4odCkpcmV0dXJuIDA7dD1mdW5jdGlvbih0KXtyZXR1cm4gZG4odCk/Q24odCk6MH0odCk7bGV0IGU9Tm4odCk7cmV0dXJuIjAiPT09U3RyaW5nKGUpPzA6ZX12YXIgRm49QXJyYXkucHJvdG90eXBlLmpvaW47dmFyIHpuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/IiI6Rm4uY2FsbCh0LGUpfTtjbGFzcyBUbntjb25zdHJ1Y3Rvcih0KXt0aGlzLmdldENvc3Q9KCk9PnRoaXMuRWxlbWVudHMubWFwKCh0PT50LkRpc3RhbmNlRnJvbU1lZG9pZCkpLnJlZHVjZSgoKHQsZSk9PnQrZSksMCksdGhpcy5maW5kQmVzdE1lZG9pZElkeD10PT50aGlzLkVsZW1lbnRzLm1hcCgoZT0+dGhpcy5jYWxjQ29zdEZvckdpdmVuRWxlbWVudEFzTWVkb2lkKGUsdCkpKS5yZWR1Y2UoKCh0LGUscixuKT0+ZS5Db3N0SWZNYWRlTWVkb2lkPG5bdF0uQ29zdElmTWFkZU1lZG9pZD9yOnQpLDApLHRoaXMuY2FsY0Nvc3RGb3JHaXZlbkVsZW1lbnRBc01lZG9pZD0odCxlKT0+KHtDb3N0SWZNYWRlTWVkb2lkOm5ldyBUbih7RWxlbWVudHM6dGhpcy5FbGVtZW50cy5tYXAoKHI9Pih7RGlzdGFuY2VGcm9tTWVkb2lkOmUoci5FbGVtZW50LHQuRWxlbWVudCksRWxlbWVudDpyLkVsZW1lbnR9KSkpLE1lZG9pZDp0LkVsZW1lbnR9KS5nZXRDb3N0KCksRWxlbWVudDp0fSksdGhpcy5FbGVtZW50cz10LkVsZW1lbnRzLHRoaXMuTWVkb2lkPXQuTWVkb2lkfX12YXIgVm49VG4sUG49T2JqZWN0LmRlZmluZVByb3BlcnR5KHtDbHVzdGVyOlZufSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSkscW49T2JqZWN0LmRlZmluZVByb3BlcnR5KHtkaXN0YW5jZToodCxlKT0+e2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgaW5wdXRzIG11c3QgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb24iKTtjb25zdCByPUFycmF5LmZyb20odC5rZXlzKCkpLm1hcCgocj0+TWF0aC5wb3coTWF0aC5hYnModFtyXS1lW3JdKSwyKSkpLnJlZHVjZSgoKHQsZSk9PnQrZSksMCk7cmV0dXJuIE1hdGguc3FydChyKX19LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSwkbj1PYmplY3QuZGVmaW5lUHJvcGVydHkoe2tHdEVsZW1lbnRBcnJMZW5ndGg6ImsgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkifSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y2xhc3MgRG57Y29uc3RydWN0b3IodCxlLHIpe3RoaXMuRWxlbWVudHM9dCx0aGlzLks9ZSx0aGlzLkRpc3RhbmNlRm49cix0aGlzLk9wdGltaXNhdGlvbkNvbXBsZXRlZD0hMSx0aGlzLml0ZXJhdGU9KCk9Pnt0aGlzLkl0ZXJhdGlvbkNvdW50KyssdGhpcy5DbHVzdGVyc3x8dGhpcy5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcygpO2NvbnN0IHQ9dGhpcy5NZWRvaWRzLGU9dGhpcy5DbHVzdGVycyxyPXRoaXMuY2FsY3VsYXRlQ3VycmVudENvc3QoKTtsZXQgbj1yO2ZvcihsZXQgdD0wO3Q8dGhpcy5NZWRvaWRzLmxlbmd0aDt0Kyspe2NvbnN0IGU9dD0+MD09PXRoaXMuTWVkb2lkcy5maWx0ZXIoKGU9PjA9PT10aGlzLkRpc3RhbmNlRm4odCxlKSkpLmxlbmd0aDtmb3IoY29uc3QgciBvZiB0aGlzLkVsZW1lbnRzLmZpbHRlcihlKSl7Y29uc3QgZT10aGlzLk1lZG9pZHMuc2xpY2UoKTtlW3RdPXI7Y29uc3Qgbz1uZXcgRG4odGhpcy5FbGVtZW50cy5zbGljZSgpLHRoaXMuSyx0aGlzLkRpc3RhbmNlRm4pO28uTWVkb2lkcz1lLG8uYWxsb2NhdGVUb0NsdXN0ZXJzQXJvdW5kQ3VycmVudE1lZG9pZHMoKTtjb25zdCBzPW8uY2FsY3VsYXRlQ3VycmVudENvc3QoKTtzPG4mJihuPXMsdGhpcy5DbHVzdGVycz1vLkNsdXN0ZXJzLHRoaXMuTWVkb2lkcz1lKX19cmV0dXJuIHRoaXMuY2FsY3VsYXRlQ3VycmVudENvc3QoKTxyfHwodGhpcy5DbHVzdGVycz1lLHRoaXMuTWVkb2lkcz10LHRoaXMuT3B0aW1pc2F0aW9uQ29tcGxldGVkPSEwLCExKX0sdGhpcy5nZXRDbHVzdGVyZWREYXRhPSgpPT4odGhpcy5PcHRpbWlzYXRpb25Db21wbGV0ZWR8fHRoaXMucnVuVG9Db21wbGV0aW9uKCksdGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuRWxlbWVudHMubWFwKCh0PT50LkVsZW1lbnQpKSkpKSx0aGlzLnJ1blRvQ29tcGxldGlvbj0oKT0+e2Zvcig7dGhpcy5pdGVyYXRlKCk7KTt9LHRoaXMuYWxsb2NhdGVUb0NsdXN0ZXJzQXJvdW5kQ3VycmVudE1lZG9pZHM9KCk9Pnt0aGlzLkNsdXN0ZXJzPW5ldyBBcnJheSx0aGlzLk1lZG9pZHMuZm9yRWFjaCgodD0+e3RoaXMuQ2x1c3RlcnMucHVzaChuZXcgUG4uQ2x1c3Rlcih7RWxlbWVudHM6W10sTWVkb2lkOnR9KSl9KSksdGhpcy5FbGVtZW50cy5mb3JFYWNoKCgodCxlKT0+e2NvbnN0IHI9dGhpcy5maW5kRGlzdGFuY2VzKHRoaXMuQ2x1c3RlcnMubWFwKCh0PT50Lk1lZG9pZCkpLHQpLG49ci5yZWR1Y2UoKCh0LGUscixuKT0+ZTxuW3RdP3I6dCksMCk7dGhpcy5DbHVzdGVyc1tuXS5FbGVtZW50cy5wdXNoKHtEaXN0YW5jZUZyb21NZWRvaWQ6cltuXSxFbGVtZW50OnR9KX0pKX0sdGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdD0oKT0+dGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuZ2V0Q29zdCgpKSkucmVkdWNlKCgodCxlKT0+dCtlKSwwKSx0aGlzLmZpbmREaXN0YW5jZXM9KHQsZSk9PnQubWFwKCh0PT50aGlzLkRpc3RhbmNlRm4odCxlKSkpLHRoaXMuc2VsZWN0SW5pdGlhbE1lZG9pZHM9KCk9PntpZih0aGlzLks+PXRoaXMuRWxlbWVudHMubGVuZ3RoKXRocm93ICRuLmtHdEVsZW1lbnRBcnJMZW5ndGg7Y29uc3QgdD1bXSxlPSh0LGUpPT57Zm9yKGNvbnN0IHIgb2YgZSlpZigwPT09dGhpcy5EaXN0YW5jZUZuKHIsdCkpcmV0dXJuITE7cmV0dXJuITB9O2xldCByPTA7Zm9yKDtyPHRoaXMuRWxlbWVudHMubGVuZ3RoJiZ0Lmxlbmd0aDx0aGlzLks7KWUodGhpcy5FbGVtZW50c1tyXSx0KSYmdC5wdXNoKHRoaXMuRWxlbWVudHNbcl0pLHIrKztyZXR1cm4gdH0sdGhpcy5EaXN0YW5jZUZuPXRoaXMuRGlzdGFuY2VGbnx8cW4uZGlzdGFuY2UsdGhpcy5NZWRvaWRzPXRoaXMuc2VsZWN0SW5pdGlhbE1lZG9pZHMoKSx0aGlzLkl0ZXJhdGlvbkNvdW50PTB9Z2V0IE9wdGltaXNhdGlvblN0YXJ0ZWQoKXtyZXR1cm4gdGhpcy5JdGVyYXRpb25Db3VudD4wfX1Ebi5jbHVzdGVyRWxlbWVudHM9KHQsZSxyKT0+e0RuLmdldEluc3RhbmNlKHQsZSxyKTtyZXR1cm4gbmV3IEFycmF5fSxEbi5nZXRJbnN0YW5jZT0odCxlLHIpPT5uZXcgRG4odCxlLHIpO3ZhciBVbj1EbixMbj1PYmplY3QuZGVmaW5lUHJvcGVydHkoe0NsdXN0ZXJlcjpVbn0sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLEJuPXIobigoZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKHQpe2Zvcih2YXIgciBpbiB0KWUuaGFzT3duUHJvcGVydHkocil8fChlW3JdPXRbcl0pfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxyKFBuKSxyKExuKX0pKSk7ZnVuY3Rpb24gR24odCxlKXtsZXQgcj0wO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXIrPSh0W25dLWVbbl0pKih0W25dLWVbbl0pO3JldHVybiByfWNvbnN0IEtuPXtkaXN0YW5jZUZ1bmN0aW9uOkdufTtmdW5jdGlvbiBXbih0LGUscj1Lbil7Y29uc3Qgbj1yLmRpc3RhbmNlRnVuY3Rpb258fEtuLmRpc3RhbmNlRnVuY3Rpb24sbz1yLnNpbWlsYXJpdHlGdW5jdGlvbnx8S24uc2ltaWxhcml0eUZ1bmN0aW9uO2xldCBzPS0xO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBvKXtsZXQgcj1OdW1iZXIuTUlOX1ZBTFVFO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCBpPW8oZSx0W25dKTtpPnImJihyPWkscz1uKX19ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoIkEgc2ltaWxhcml0eSBvciBkaXN0YW5jZSBmdW5jdGlvbiBpdCdzIHJlcXVpcmVkIik7e2xldCByPU51bWJlci5NQVhfVkFMVUU7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGk9bihlLHRbb10pO2k8ciYmKHI9aSxzPW8pfX19cmV0dXJuIHN9ZnVuY3Rpb24gWG4odCxlLHIsbil7Zm9yKHZhciBvPTA7bzx0Lmxlbmd0aDtvKyspcltvXT1XbihlLHRbb10se2Rpc3RhbmNlRnVuY3Rpb246bn0pO3JldHVybiByfWZ1bmN0aW9uIEpuKHQsZSl7Y29uc3Qgcj02NTUzNSYodD4+Pj0wKTtyZXR1cm4oKHQtcikqKGU+Pj49MCk+Pj4wKStyKmU+Pj4wfWNsYXNzIFlue2NvbnN0cnVjdG9yKHQ9RGF0ZS5ub3coKSl7dGhpcy5zdGF0ZT1uZXcgVWludDMyQXJyYXkoNCksdGhpcy5pbml0KHQpLHRoaXMucmFuZG9tPXRoaXMuZ2V0RmxvYXQuYmluZCh0aGlzKX1nZXRVaW50MzIoKXtyZXR1cm4gdGhpcy5uZXh0U3RhdGUoKSx0aGlzLnN0YXRlWzNdK3RoaXMuc3RhdGVbMl0+Pj4wfWdldEZsb2F0KCl7cmV0dXJuIDUuOTYwNDY0NDc3NTM5MDYzZS04Kih0aGlzLmdldFVpbnQzMigpPj4+OCl9aW5pdCh0KXtpZighTnVtYmVyLmlzSW50ZWdlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzZWVkIG11c3QgYmUgYW4gaW50ZWdlciIpO3RoaXMuc3RhdGVbMF09dCx0aGlzLnN0YXRlWzFdPTAsdGhpcy5zdGF0ZVsyXT0wLHRoaXMuc3RhdGVbM109MDtmb3IobGV0IHQ9MTt0PDg7dCsrKXRoaXMuc3RhdGVbMyZ0XV49dCtKbigxODEyNDMzMjUzLHRoaXMuc3RhdGVbdC0xJjNdXnRoaXMuc3RhdGVbdC0xJjNdPj4+MzA+Pj4wKT4+PjA7dGhpcy5wZXJpb2RDZXJ0aWZpY2F0aW9uKCk7Zm9yKGxldCB0PTA7dDw4O3QrKyl0aGlzLm5leHRTdGF0ZSgpfXBlcmlvZENlcnRpZmljYXRpb24oKXswPT09dGhpcy5zdGF0ZVswXSYmMD09PXRoaXMuc3RhdGVbMV0mJjA9PT10aGlzLnN0YXRlWzJdJiYwPT09dGhpcy5zdGF0ZVszXSYmKHRoaXMuc3RhdGVbMF09ODgsdGhpcy5zdGF0ZVsxXT04Myx0aGlzLnN0YXRlWzJdPTY1LHRoaXMuc3RhdGVbM109NjgpfW5leHRTdGF0ZSgpe2xldCB0PXRoaXMuc3RhdGVbMF07dF49dDw8MTUsdF49dD4+PjE4LHRePXRoaXMuc3RhdGVbM108PDExLHRoaXMuc3RhdGVbMF09dGhpcy5zdGF0ZVsxXSx0aGlzLnN0YXRlWzFdPXRoaXMuc3RhdGVbMl0sdGhpcy5zdGF0ZVsyXT10aGlzLnN0YXRlWzNdLHRoaXMuc3RhdGVbM109dH19ZnVuY3Rpb24gWm4odCxlPXt9LHI9TWF0aC5yYW5kb20pe2NvbnN0e3NpemU6bj0xLHJlcGxhY2U6bz0hMSxwcm9iYWJpbGl0aWVzOnN9PWU7bGV0IGksdTtpZihpPSJudW1iZXIiPT10eXBlb2YgdD9mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHIpO3JldHVybiBlfSh0KTp0LnNsaWNlKCkscyl7aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJjaG9pY2Ugd2l0aCBwcm9iYWJpbGl0aWVzIGFuZCBubyByZXBsYWNlbWVudCBpcyBub3QgaW1wbGVtZW50ZWQiKTtpZihzLmxlbmd0aCE9PWkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGhlIGxlbmd0aCBvZiBwcm9iYWJpbGl0aWVzIG9wdGlvbiBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBjaG9pY2VzIik7dT1bc1swXV07Zm9yKGxldCB0PTE7dDxzLmxlbmd0aDt0KyspdVt0XT11W3QtMV0rc1t0XTtpZihNYXRoLmFicygxLXVbdS5sZW5ndGgtMV0pPjFlLTgpdGhyb3cgbmV3IEVycm9yKGBwcm9iYWJpbGl0aWVzIHNob3VsZCBzdW0gdG8gMSwgYnV0IGluc3RlYWQgc3VtcyB0byAke3VbdS5sZW5ndGgtMV19YCl9aWYoITE9PT1vJiZuPmkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigic2l6ZSBvcHRpb24gaXMgdG9vIGxhcmdlIik7Y29uc3QgYT1bXTtmb3IobGV0IHQ9MDt0PG47dCsrKXtjb25zdCB0PUhuKGkubGVuZ3RoLHIsdSk7YS5wdXNoKGlbdF0pLG98fGkuc3BsaWNlKHQsMSl9cmV0dXJuIGF9ZnVuY3Rpb24gSG4odCxlLHIpe2NvbnN0IG49ZSgpO2lmKHIpe2xldCB0PTA7Zm9yKDtuPnJbdF07KXQrKztyZXR1cm4gdH1yZXR1cm4gTWF0aC5mbG9vcihuKnQpfWNsYXNzIFFue2NvbnN0cnVjdG9yKHQ9TWF0aC5yYW5kb20pe2lmKCJudW1iZXIiPT10eXBlb2YgdCl7Y29uc3QgZT1uZXcgWW4odCk7dGhpcy5yYW5kb21HZW5lcmF0b3I9ZS5yYW5kb219ZWxzZSB0aGlzLnJhbmRvbUdlbmVyYXRvcj10fWNob2ljZSh0LGUpe3JldHVybiBabih0LGUsdGhpcy5yYW5kb21HZW5lcmF0b3IpfXJhbmRvbSgpe3JldHVybiB0aGlzLnJhbmRvbUdlbmVyYXRvcigpfXJhbmRJbnQodCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dCx0PTApLHQrTWF0aC5mbG9vcih0aGlzLnJhbmRvbUdlbmVyYXRvcigpKihlLXQpKX1yYW5kb21TYW1wbGUodCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQ7cisrKWUucHVzaCh0aGlzLnJhbmRvbSgpKTtyZXR1cm4gZX19ZnVuY3Rpb24gdG8odCxlKXtjb25zdCByPW5ldyBWZSh0LnJvd3MsZS5yb3dzKTtmb3IobGV0IG49MDtuPHQucm93cztuKyspZm9yKGxldCBvPTA7bzxlLnJvd3M7bysrKXIuc2V0KG4sbyxHbih0LmdldFJvdyhuKSxlLmdldFJvdyhvKSkpO3JldHVybiByfWZ1bmN0aW9uIGVvKHQpe2xldCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHIpO3JldHVybiBlfWZ1bmN0aW9uIHJvKHQpe2xldCBlPVt0WzBdXTtmb3IobGV0IHI9MTtyPHQubGVuZ3RoO3IrKyllW3JdPWVbci0xXSt0W3JdO3JldHVybiBlfWNvbnN0IG5vPVN5bWJvbCgiZGlzdGFuY2UiKTtjbGFzcyBvb3tjb25zdHJ1Y3Rvcih0LGUscixuLG8pe3RoaXMuY2x1c3RlcnM9dCx0aGlzLmNlbnRyb2lkcz1lLHRoaXMuY29udmVyZ2VkPXIsdGhpcy5pdGVyYXRpb25zPW4sdGhpc1tub109b31uZWFyZXN0KHQpe2NvbnN0IGU9bmV3IEFycmF5KHQubGVuZ3RoKTtyZXR1cm4gWG4odCx0aGlzLmNlbnRyb2lkcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNlbnRyb2lkfSkpLGUsdGhpc1tub10pfWNvbXB1dGVJbmZvcm1hdGlvbih0KXtmb3IodmFyIGU9dGhpcy5jZW50cm9pZHMubWFwKChmdW5jdGlvbih0KXtyZXR1cm57Y2VudHJvaWQ6dCxlcnJvcjowLHNpemU6MH19KSkscj0wO3I8dC5sZW5ndGg7cisrKWVbdGhpcy5jbHVzdGVyc1tyXV0uZXJyb3IrPXRoaXNbbm9dKHRbcl0sdGhpcy5jZW50cm9pZHNbdGhpcy5jbHVzdGVyc1tyXV0pLGVbdGhpcy5jbHVzdGVyc1tyXV0uc2l6ZSsrO2Zvcih2YXIgbj0wO248dGhpcy5jZW50cm9pZHMubGVuZ3RoO24rKyllW25dLnNpemU/ZVtuXS5lcnJvci89ZVtuXS5zaXplOmVbbl0uZXJyb3I9bnVsbDtyZXR1cm4gbmV3IG9vKHRoaXMuY2x1c3RlcnMsZSx0aGlzLmNvbnZlcmdlZCx0aGlzLml0ZXJhdGlvbnMsdGhpc1tub10pfX1jb25zdCBzbz17bWF4SXRlcmF0aW9uczoxMDAsdG9sZXJhbmNlOjFlLTYsd2l0aEl0ZXJhdGlvbnM6ITEsaW5pdGlhbGl6YXRpb246ImttZWFucysrIixkaXN0YW5jZUZ1bmN0aW9uOkdufTtmdW5jdGlvbiBpbyh0LGUscixuLG8scyl7dmFyIGk9ZnVuY3Rpb24odCxlLHIsbil7Y29uc3Qgbz1lWzBdLmxlbmd0aDtmb3IodmFyIHM9bmV3IEFycmF5KG4pLGk9bmV3IEFycmF5KG4pLHU9MDt1PG47dSsrKXtzW3VdPW5ldyBBcnJheShvKSxpW3VdPTA7Zm9yKHZhciBhPTA7YTxvO2ErKylzW3VdW2FdPTB9Zm9yKHZhciBoPTA7aDxlLmxlbmd0aDtoKyspe2lbcltoXV0rKztmb3IodmFyIGw9MDtsPG87bCsrKXNbcltoXV1bbF0rPWVbaF1bbF19Zm9yKHZhciBjPTA7YzxuO2MrKylmb3IodmFyIGY9MDtmPG87ZisrKWlbY10/c1tjXVtmXS89aVtjXTpzW2NdW2ZdPXRbY11bZl07cmV0dXJuIHN9KHQsZSxyPVhuKGUsdCxyLG8uZGlzdGFuY2VGdW5jdGlvbiksbiksdT1mdW5jdGlvbih0LGUscixuKXtmb3IodmFyIG89MDtvPHQubGVuZ3RoO28rKylpZihyKHRbb10sZVtvXSk+bilyZXR1cm4hMTtyZXR1cm4hMH0oaSx0LG8uZGlzdGFuY2VGdW5jdGlvbixvLnRvbGVyYW5jZSk7cmV0dXJuIG5ldyBvbyhyLGksdSxzLG8uZGlzdGFuY2VGdW5jdGlvbil9ZnVuY3Rpb24gdW8odCxlLHIpe2lmKHI9T2JqZWN0LmFzc2lnbih7fSxzbyxyKSxlPD0wfHxlPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihlKSl0aHJvdyBuZXcgRXJyb3IoIksgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBwb2ludHMiKTt2YXIgbjtpZihBcnJheS5pc0FycmF5KHIuaW5pdGlhbGl6YXRpb24pKXtpZihyLmluaXRpYWxpemF0aW9uLmxlbmd0aCE9PWUpdGhyb3cgbmV3IEVycm9yKCJUaGUgaW5pdGlhbCBjZW50ZXJzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyBLIik7bj1yLmluaXRpYWxpemF0aW9ufWVsc2Ugc3dpdGNoKHIuaW5pdGlhbGl6YXRpb24pe2Nhc2Uia21lYW5zKysiOm49ZnVuY3Rpb24odCxlLHI9e30pe2NvbnN0IG49KHQ9bmV3IFZlKHQpKS5yb3dzLG89bmV3IFFuKHIuc2VlZCkscz1bXSxpPXIubG9jYWxUcmlhbHN8fDIrTWF0aC5mbG9vcihNYXRoLmxvZyhlKSksdT1vLnJhbmRJbnQobik7cy5wdXNoKHQuZ2V0Um93KHUpKTtsZXQgYT1uZXcgVmUoMSx0LnJvd3MpO2ZvcihsZXQgZT0wO2U8dC5yb3dzO2UrKylhLnNldCgwLGUsR24odC5nZXRSb3coZSksc1swXSkpO2xldCBoPVtybyhhLmdldFJvdygwKSldO2NvbnN0IGw9MS9oWzBdW24tMV07bGV0IGM9VmUubXVsKGEsbCk7Zm9yKGxldCByPTE7cjxlO3IrKyl7Y29uc3QgZT1vLmNob2ljZShuLHtyZXBsYWNlOiEwLHNpemU6aSxwcm9iYWJpbGl0aWVzOmNbMF19KSx1PXRvKHQuc2VsZWN0aW9uKGUsZW8odC5jb2x1bW5zKSksdCk7bGV0IGwsZixtO2ZvcihsZXQgdD0wO3Q8aTt0Kyspe2NvbnN0IHI9VmUubWluKGEsW3UuZ2V0Um93KHQpXSksbj1yLnN1bSgpOyh2b2lkIDA9PT1sfHxuPGYpJiYobD1lW3RdLGY9bixtPXIpfXNbcl09dC5nZXRSb3cobCksYT1tLGg9W3JvKGEuZ2V0Um93KDApKV0sYz1WZS5tdWwoYSwxL2hbMF1bbi0xXSl9cmV0dXJuIHN9KHQsZSxyKTticmVhaztjYXNlInJhbmRvbSI6bj1mdW5jdGlvbih0LGUscil7cmV0dXJuIG5ldyBRbihyKS5jaG9pY2UodCx7c2l6ZTplfSl9KHQsZSxyLnNlZWQpO2JyZWFrO2Nhc2UibW9zdERpc3RhbnQiOm49ZnVuY3Rpb24odCxlLHIsbil7Y29uc3Qgbz1uZXcgUW4obik7dmFyIHM9bmV3IEFycmF5KGUpO2lmKHNbMF09TWF0aC5mbG9vcihvLnJhbmRvbSgpKnQubGVuZ3RoKSxlPjEpe2Zvcih2YXIgaT17ZGlzdDotMSxpbmRleDotMX0sdT0wO3U8dC5sZW5ndGg7Kyt1KXJbc1swXV1bdV0+aS5kaXN0JiYoaS5kaXN0PXJbc1swXV1bdV0saS5pbmRleD11KTtpZihzWzFdPWkuaW5kZXgsZT4yKWZvcih2YXIgYT0yO2E8ZTsrK2Epe2Zvcih2YXIgaD17ZGlzdDotMSxpbmRleDotMX0sbD0wO2w8dC5sZW5ndGg7KytsKXtmb3IodmFyIGM9e2Rpc3Q6TnVtYmVyLk1BWF9WQUxVRSxpbmRleDotMX0sZj0wO2Y8YTsrK2YpcltmXVtsXTxjLmRpc3QmJi0xPT09cy5pbmRleE9mKGwpJiYoYz17ZGlzdDpyW2ZdW2xdLGluZGV4Omx9KTtjLmRpc3QhPT1OdW1iZXIuTUFYX1ZBTFVFJiZjLmRpc3Q+aC5kaXN0JiYoaD1PYmplY3QuYXNzaWduKHt9LGMpKX1zW2FdPWguaW5kZXh9fXJldHVybiBzLm1hcCgoZT0+dFtlXSkpfSh0LGUsZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KHQubGVuZ3RoKSxuPTA7bjx0Lmxlbmd0aDsrK24pZm9yKHZhciBvPW47bzx0Lmxlbmd0aDsrK28pe3Jbbl18fChyW25dPW5ldyBBcnJheSh0Lmxlbmd0aCkpLHJbb118fChyW29dPW5ldyBBcnJheSh0Lmxlbmd0aCkpO2NvbnN0IHM9ZSh0W25dLHRbb10pO3Jbbl1bb109cyxyW29dW25dPXN9cmV0dXJuIHJ9KHQsci5kaXN0YW5jZUZ1bmN0aW9uKSxyLnNlZWQpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGluaXRpYWxpemF0aW9uIG1ldGhvZDogIiR7ci5pbml0aWFsaXphdGlvbn0iYCl9MD09PXIubWF4SXRlcmF0aW9ucyYmKHIubWF4SXRlcmF0aW9ucz1OdW1iZXIuTUFYX1ZBTFVFKTt2YXIgbz1uZXcgQXJyYXkodC5sZW5ndGgpO2lmKHIud2l0aEl0ZXJhdGlvbnMpcmV0dXJuIGZ1bmN0aW9uKih0LGUscixuLG8pe2Zvcih2YXIgcyxpPSExLHU9MDshaSYmdTxvLm1heEl0ZXJhdGlvbnM7KXM9aW8odCxlLHIsbixvLCsrdSkseWllbGQgcy5jb21wdXRlSW5mb3JtYXRpb24oZSksaT1zLmNvbnZlcmdlZCx0PXMuY2VudHJvaWRzfShuLHQsbyxlLHIpO2Zvcih2YXIgcyxpPSExLHU9MDshaSYmdTxyLm1heEl0ZXJhdGlvbnM7KWk9KHM9aW8obix0LG8sZSxyLCsrdSkpLmNvbnZlcmdlZCxuPXMuY2VudHJvaWRzO3JldHVybiBzLmNvbXB1dGVJbmZvcm1hdGlvbih0KX1mdW5jdGlvbiBhbyh0LGU9e30pe2xldCByPUN0KGUsImtOdW1iZXIiKTtyPWRuKHIpP09uKHIpOjI7bGV0IG4sbz1DdChlLCJtb2RlIik7aWYoImstbWVkb2lkcyIhPT1vJiYiay1tZWFucyIhPT1vJiYobz0iay1tZWRvaWRzIiksImstbWVkb2lkcyI9PT1vKW49ZnVuY3Rpb24odCxlKXtsZXQgcj17fTtmdW5jdGlvbiBuKHQpe3JldHVybiB6bih0LCI6Iil9YnIodCwoKHQsZSk9PntsZXQgbz1uKHQpO3Jbb109ZX0pKTtsZXQgbz1Cbi5DbHVzdGVyZXIuZ2V0SW5zdGFuY2UodCxlKS5nZXRDbHVzdGVyZWREYXRhKCk7cmV0dXJuIG89bW4obywodD0+bW4odCwodD0+e2xldCBlPW4odCk7cmV0dXJuIHJbZV19KSkpKSxvfSh0LHIpO2Vsc2V7aWYoImstbWVhbnMiIT09byl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgbW9kZSIpO249ZnVuY3Rpb24odCxlKXtsZXQgcj11byh0LGUpLG49e307cmV0dXJuIGJyKHIuY2x1c3RlcnMsKCh0LGUpPT57blt0XXx8KG5bdF09W10pLG5bdF0ucHVzaChlKX0pKSxwbihuKX0odCxyKX1yZXR1cm4gbn1mdW5jdGlvbiBobyh0LGU9e30pe2lmKCFkZSh0KSl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IGVmZi4gYXJyYXkiKTtsZXQgcj1DdChlLCJrTnVtYmVyIik7cj1kbihyKT9PbihyKToyO2xldCBuPUN0KGUsIm5Db21wTklQQUxTIik7bj1kbihuKT9PbihuKToyO2xldCBvPUN0KGUsIm1vZGUiKSxzPSIiLGk9bGUodCksdT0wLGE9MDtpZihicih0LCh0PT57IWZ1bmN0aW9uKHQpe2lmKGdlKHQpKXtmb3IobGV0IGUgaW4gdClyZXR1cm4hMDtyZXR1cm4hMX1yZXR1cm4hMX0odCk/ZGUodCkmJihhKz0xKTp1Kz0xfSkpLHU9PT1pKXM9Im9iaiI7ZWxzZXtpZihhIT09aSl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IG9mIHRoZSBzYW1lIHR5cGUiKTtzPSJtYXQifWxldCBoLGw9bnVsbDsib2JqIj09PXM/KGw9ZnVuY3Rpb24odCl7bGV0IGU9e307YnIodCwodD0+e2JyKHQsKCh0LHIpPT57ZVtyXXx8KGVbcl09MCksMD09PWVbcl0mJmRuKHQpJiYoZVtyXT0xKSwxIT09ZVtyXXx8ZG4odCl8fChlW3JdPS0xKX0pKX0pKTtsZXQgcj1bXTtyZXR1cm4gYnIoZSwoKHQsZSk9PnsxPT09dCYmci5wdXNoKGUpfSkpLHJ9KHQpLGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbW4odCwodD0+e2xldCByPWJuKHQsZSk7cmV0dXJuIHBuKHIpfSkpfSh0LGwpKTpoPXQ7bGV0IGM9V2UoaCx7bkNvbXBOSVBBTFM6bn0pLGY9YW8oYyx7a051bWJlcjpyLG1vZGU6b30pLG09bW4oZiwodD0+bW4odCwodD0+Y1t0XSkpKSk7cmV0dXJue2tleXM6bCxnaW5kczpmLGdsdGR0Om1uKGYsKGU9Pm1uKGUsKGU9PnRbZV0pKSkpLGdtYXQ6bX19bGV0IFdDbHVzdGVyPXtQQ0E6YXN5bmMgZnVuY3Rpb24odCxlPXt9KXtyZXR1cm4gV2UodCxlKX0sY2x1c3Rlcjphc3luYyBmdW5jdGlvbih0LGU9e30pe3RyeXtyZXR1cm4gaG8odCxlKX1jYXRjaCh0KXtyZXR1cm4gUHJvbWlzZS5yZWplY3QodCl9fX07CgpsZXQgaW5zdGFuY2UgPSBudWxsCmZ1bmN0aW9uIGluaXQoaW5wdXQpewoKICAgIC8vaW5pdAogICAgbGV0IHIKICAgIAogICAgICAgIHIgPSBXQ2x1c3RlciguLi5pbnB1dCkKICAgICAgICAKCiAgICAvL29uCiAgICAKCiAgICAvL3NhdmUKICAgIGluc3RhbmNlID0gcgoKfQoKZnVuY3Rpb24gc2VuZE1lc3NhZ2UoZGF0YSkgewogICAgCiAgICAgICAgcGFyZW50UG9ydC5wb3N0TWVzc2FnZShkYXRhKQogICAgICAgIAp9Cgphc3luYyBmdW5jdGlvbiBydW4oZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciBydW4nLGRhdGEpCgogICAgLy9tb2RlCiAgICBsZXQgbW9kZSA9IGRhdGEubW9kZQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgIT09ICdpbml0JyAmJiBtb2RlICE9PSAnY2FsbCcpewogICAgICAgIHJldHVybgogICAgfQoKICAgIC8vaW5pdAogICAgaWYobW9kZSA9PT0gJ2luaXQnKXsKICAgICAgICAKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL3R5cGUKICAgICAgICAgICAgbGV0IHR5cGUgPSBkYXRhLnR5cGUKCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAogICAgCiAgICAgICAgICAgIC8vaW5zdGFuY2UKICAgICAgICAgICAgaWYodHlwZSA9PT0gJ2Z1bmN0aW9uJyl7CiAgICAgICAgICAgICAgICBpbml0KC4uLmlucHV0KQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYodHlwZSA9PT0gJ29iamVjdCcpewogICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBXQ2x1c3RlcgogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgIAogICAgICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgICAgICBtb2RlOiAnZW1pdCcsCiAgICAgICAgICAgICAgICBldk5hbWU6ICdlcnJvcicsCiAgICAgICAgICAgICAgICBtc2c6IGVyciwKICAgICAgICAgICAgfQogICAgICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgICAgIH0KICAgICAgICAgICAgCiAgICB9CgogICAgLy9jaGVjawogICAgaWYobW9kZSA9PT0gJ2NhbGwnKXsKICAgICAgICBsZXQgc3RhdGUgPSAnJwogICAgICAgIGxldCBtc2cgPSBudWxsCgogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vZnVuCiAgICAgICAgICAgIGxldCBmdW4gPSBpbnN0YW5jZVtkYXRhLmZ1bl0KCiAgICAgICAgICAgIC8vaW5wdXQKICAgICAgICAgICAgbGV0IGlucHV0ID0gZGF0YS5pbnB1dAoKICAgICAgICAgICAgLy9leGVjCiAgICAgICAgICAgIGF3YWl0IGZ1biguLi5pbnB1dCkKICAgICAgICAgICAgICAgIC50aGVuKChzdWMpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nc3VjY2VzcycKICAgICAgICAgICAgICAgICAgICBtc2c9c3VjCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nZXJyb3InCiAgICAgICAgICAgICAgICAgICAgbXNnPWVycgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgICAgIHN0YXRlID0gJ2Vycm9yJwogICAgICAgICAgICBtc2cgPSBlcnIKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgIGxldCByZXMgPSB7CiAgICAgICAgICAgIG1vZGU6ICdyZXR1cm4nLAogICAgICAgICAgICBpZDogZGF0YS5pZCwKICAgICAgICAgICAgZnVuOiBkYXRhLmZ1biwKICAgICAgICAgICAgc3RhdGUsCiAgICAgICAgICAgIG1zZywKICAgICAgICB9CiAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgIH0KCn0KCmZ1bmN0aW9uIHJlY3ZNZXNzYWdlKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcmVjdjonLCBkYXRhKQoKICAgIC8vZGF0YVJlY3YKICAgIGxldCBkYXRhUmVjdiA9IGRhdGEKCiAgICAvL3J1bgogICAgcnVuKGRhdGFSZWN2KQoKfQoKCiAgICAgICAgcGFyZW50UG9ydC5vbignbWVzc2FnZScsIHJlY3ZNZXNzYWdlKQogICAgICAgIAoK",Buffer.from(G,"base64").toString("utf8"));function t(){var c=l();function X(l){try{return new d.Worker(l,{eval:!0})}catch(d){u(d)}}var G=X(y);if(!G)return u("invalid worker"),null;function m(){G?(G.terminate(),G=void 0):u("worker has been terminated")}function K(){var d={mode:"init",type:"object",input:Array.prototype.slice.call(arguments)};G.postMessage(d)}function p(){var d=b(),l=Z(),X={mode:"call",id:l,fun:"PCA",input:Array.prototype.slice.call(arguments)};return G.postMessage(X),c.once(l,(function(l){"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d}function t(){var d=b(),l=Z(),X={mode:"call",id:l,fun:"cluster",input:Array.prototype.slice.call(arguments)};return G.postMessage(X),c.once(l,(function(l){"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d}function i(d){var l=d,b=l.mode;"emit"!==b&&"return"!==b||("emit"===b&&c.emit(l.evName,l.msg),"return"===b&&c.emit(l.id,l))}function u(d){c.emit("error",d)}return G.on("message",i),G.on("error",u),K(Array.prototype.slice.call(arguments)),c.PCA=p,c.cluster=t,c.terminate=m,c}var i,u,I={PCA:(u=X(K.mark((function d(){var l,b,Z,X=arguments;return K.wrap((function(d){for(;;)switch(d.prev=d.next){case 0:return l=Array.prototype.slice.call(X),b=t(),d.next=4,b.PCA.apply(b,c(l)).finally((function(){b.terminate()}));case 4:return Z=d.sent,d.abrupt("return",Z);case 6:case"end":return d.stop()}}),d)}))),function(){return u.apply(this,arguments)}),cluster:(i=X(K.mark((function d(){var l,b,Z,X=arguments;return K.wrap((function(d){for(;;)switch(d.prev=d.next){case 0:return l=Array.prototype.slice.call(X),b=t(),d.next=4,b.cluster.apply(b,c(l)).finally((function(){b.terminate()}));case 4:return Z=d.sent,d.abrupt("return",Z);case 6:case"end":return d.stop()}}),d)}))),function(){return i.apply(this,arguments)})};for(var o in m=l(),I){var h=I[o];m[o]=h}}(),m}(c.default)})),G=Z((function(d,l){d.exports=function(){function d(d,l){(null==l||l>d.length)&&(l=d.length);for(var c=0,b=new Array(l);c<l;c++)b[c]=d[c];return b}function l(l){return function(l){if(Array.isArray(l))return d(l)}(l)||function(d){if("undefined"!=typeof Symbol&&null!=d[Symbol.iterator]||null!=d["@@iterator"])return Array.from(d)}(l)||function(l,c){if(l){if("string"==typeof l)return d(l,c);var b=Object.prototype.toString.call(l).slice(8,-1);return"Object"===b&&l.constructor&&(b=l.constructor.name),"Map"===b||"Set"===b?Array.from(l):"Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b)?d(l,c):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 c(d,l,c,b,Z,X,G){try{var y=d[X](G),m=y.value}catch(d){return void c(d)}y.done?l(m):Promise.resolve(m).then(b,Z)}function Z(d){return function(){var l=this,b=arguments;return new Promise((function(Z,X){var G=d.apply(l,b);function y(d){c(G,Z,X,y,m,"next",d)}function m(d){c(G,Z,X,y,m,"throw",d)}y(void 0)}))}}function X(d){return X="function"==typeof Symbol&&"symbol"==b(Symbol.iterator)?function(d){return b(d)}:function(d){return d&&"function"==typeof Symbol&&d.constructor===Symbol&&d!==Symbol.prototype?"symbol":b(d)},X(d)}function G(d){var l={exports:{}};return d(l,l.exports),l.exports}var y,m,K=G((function(d){var l=function(d){var l,c=Object.prototype,b=c.hasOwnProperty,Z="function"==typeof Symbol?Symbol:{},G=Z.iterator||"@@iterator",y=Z.asyncIterator||"@@asyncIterator",m=Z.toStringTag||"@@toStringTag";function K(d,l,c){return Object.defineProperty(d,l,{value:c,enumerable:!0,configurable:!0,writable:!0}),d[l]}try{K({},"")}catch(d){K=function(d,l,c){return d[l]=c}}function p(d,l,c,b){var Z=l&&l.prototype instanceof W?l:W,X=Object.create(Z.prototype),G=new R(b||[]);return X._invoke=function(d,l,c){var b=i;return function(Z,X){if(b===I)throw new Error("Generator is already running");if(b===o){if("throw"===Z)throw X;return T()}for(c.method=Z,c.arg=X;;){var G=c.delegate;if(G){var y=S(G,c);if(y){if(y===h)continue;return y}}if("next"===c.method)c.sent=c._sent=c.arg;else if("throw"===c.method){if(b===i)throw b=o,c.arg;c.dispatchException(c.arg)}else"return"===c.method&&c.abrupt("return",c.arg);b=I;var m=t(d,l,c);if("normal"===m.type){if(b=c.done?o:u,m.arg===h)continue;return{value:m.arg,done:c.done}}"throw"===m.type&&(b=o,c.method="throw",c.arg=m.arg)}}}(d,c,G),X}function t(d,l,c){try{return{type:"normal",arg:d.call(l,c)}}catch(d){return{type:"throw",arg:d}}}d.wrap=p;var i="suspendedStart",u="suspendedYield",I="executing",o="completed",h={};function W(){}function V(){}function s(){}var H={};K(H,G,(function(){return this}));var L=Object.getPrototypeOf,C=L&&L(L(z([])));C&&C!==c&&b.call(C,G)&&(H=C);var a=s.prototype=W.prototype=Object.create(H);function n(d){["next","throw","return"].forEach((function(l){K(d,l,(function(d){return this._invoke(l,d)}))}))}function x(d,l){function c(Z,G,y,m){var K=t(d[Z],d,G);if("throw"!==K.type){var p=K.arg,i=p.value;return i&&"object"===X(i)&&b.call(i,"__await")?l.resolve(i.__await).then((function(d){c("next",d,y,m)}),(function(d){c("throw",d,y,m)})):l.resolve(i).then((function(d){p.value=d,y(p)}),(function(d){return c("throw",d,y,m)}))}m(K.arg)}var Z;this._invoke=function(d,b){function X(){return new l((function(l,Z){c(d,b,l,Z)}))}return Z=Z?Z.then(X,X):X()}}function S(d,c){var b=d.iterator[c.method];if(b===l){if(c.delegate=null,"throw"===c.method){if(d.iterator.return&&(c.method="return",c.arg=l,S(d,c),"throw"===c.method))return h;c.method="throw",c.arg=new TypeError("The iterator does not provide a 'throw' method")}return h}var Z=t(b,d.iterator,c.arg);if("throw"===Z.type)return c.method="throw",c.arg=Z.arg,c.delegate=null,h;var X=Z.arg;return X?X.done?(c[d.resultName]=X.value,c.next=d.nextLoc,"return"!==c.method&&(c.method="next",c.arg=l),c.delegate=null,h):X:(c.method="throw",c.arg=new TypeError("iterator result is not an object"),c.delegate=null,h)}function Y(d){var l={tryLoc:d[0]};1 in d&&(l.catchLoc=d[1]),2 in d&&(l.finallyLoc=d[2],l.afterLoc=d[3]),this.tryEntries.push(l)}function g(d){var l=d.completion||{};l.type="normal",delete l.arg,d.completion=l}function R(d){this.tryEntries=[{tryLoc:"root"}],d.forEach(Y,this),this.reset(!0)}function z(d){if(d){var c=d[G];if(c)return c.call(d);if("function"==typeof d.next)return d;if(!isNaN(d.length)){var Z=-1,X=function c(){for(;++Z<d.length;)if(b.call(d,Z))return c.value=d[Z],c.done=!1,c;return c.value=l,c.done=!0,c};return X.next=X}}return{next:T}}function T(){return{value:l,done:!0}}return V.prototype=s,K(a,"constructor",s),K(s,"constructor",V),V.displayName=K(s,m,"GeneratorFunction"),d.isGeneratorFunction=function(d){var l="function"==typeof d&&d.constructor;return!!l&&(l===V||"GeneratorFunction"===(l.displayName||l.name))},d.mark=function(d){return Object.setPrototypeOf?Object.setPrototypeOf(d,s):(d.__proto__=s,K(d,m,"GeneratorFunction")),d.prototype=Object.create(a),d},d.awrap=function(d){return{__await:d}},n(x.prototype),K(x.prototype,y,(function(){return this})),d.AsyncIterator=x,d.async=function(l,c,b,Z,X){void 0===X&&(X=Promise);var G=new x(p(l,c,b,Z),X);return d.isGeneratorFunction(c)?G:G.next().then((function(d){return d.done?d.value:G.next()}))},n(a),K(a,m,"Generator"),K(a,G,(function(){return this})),K(a,"toString",(function(){return"[object Generator]"})),d.keys=function(d){var l=[];for(var c in d)l.push(c);return l.reverse(),function c(){for(;l.length;){var b=l.pop();if(b in d)return c.value=b,c.done=!1,c}return c.done=!0,c}},d.values=z,R.prototype={constructor:R,reset:function(d){if(this.prev=0,this.next=0,this.sent=this._sent=l,this.done=!1,this.delegate=null,this.method="next",this.arg=l,this.tryEntries.forEach(g),!d)for(var c in this)"t"===c.charAt(0)&&b.call(this,c)&&!isNaN(+c.slice(1))&&(this[c]=l)},stop:function(){this.done=!0;var d=this.tryEntries[0].completion;if("throw"===d.type)throw d.arg;return this.rval},dispatchException:function(d){if(this.done)throw d;var c=this;function Z(b,Z){return y.type="throw",y.arg=d,c.next=b,Z&&(c.method="next",c.arg=l),!!Z}for(var X=this.tryEntries.length-1;X>=0;--X){var G=this.tryEntries[X],y=G.completion;if("root"===G.tryLoc)return Z("end");if(G.tryLoc<=this.prev){var m=b.call(G,"catchLoc"),K=b.call(G,"finallyLoc");if(m&&K){if(this.prev<G.catchLoc)return Z(G.catchLoc,!0);if(this.prev<G.finallyLoc)return Z(G.finallyLoc)}else if(m){if(this.prev<G.catchLoc)return Z(G.catchLoc,!0)}else{if(!K)throw new Error("try statement without catch or finally");if(this.prev<G.finallyLoc)return Z(G.finallyLoc)}}}},abrupt:function(d,l){for(var c=this.tryEntries.length-1;c>=0;--c){var Z=this.tryEntries[c];if(Z.tryLoc<=this.prev&&b.call(Z,"finallyLoc")&&this.prev<Z.finallyLoc){var X=Z;break}}X&&("break"===d||"continue"===d)&&X.tryLoc<=l&&l<=X.finallyLoc&&(X=null);var G=X?X.completion:{};return G.type=d,G.arg=l,X?(this.method="next",this.next=X.finallyLoc,h):this.complete(G)},complete:function(d,l){if("throw"===d.type)throw d.arg;return"break"===d.type||"continue"===d.type?this.next=d.arg:"return"===d.type?(this.rval=this.arg=d.arg,this.method="return",this.next="end"):"normal"===d.type&&l&&(this.next=l),h},finish:function(d){for(var l=this.tryEntries.length-1;l>=0;--l){var c=this.tryEntries[l];if(c.finallyLoc===d)return this.complete(c.completion,c.afterLoc),g(c),h}},catch:function(d){for(var l=this.tryEntries.length-1;l>=0;--l){var c=this.tryEntries[l];if(c.tryLoc===d){var b=c.completion;if("throw"===b.type){var Z=b.arg;g(c)}return Z}}throw new Error("illegal catch attempt")},delegateYield:function(d,c,b){return this.delegate={iterator:z(d),resultName:c,nextLoc:b},"next"===this.method&&(this.arg=l),h}},d}(d.exports);try{regeneratorRuntime=l}catch(d){"object"===("undefined"==typeof globalThis?"undefined":X(globalThis))?globalThis.regeneratorRuntime=l:Function("r","regeneratorRuntime = r")(l)}})),p="function"==typeof atob,t="function"==typeof Buffer,i="function"==typeof TextDecoder?new TextDecoder:void 0,u=("function"==typeof TextEncoder&&new TextEncoder,Array.prototype.slice.call("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=")),I=(y={},u.forEach((function(d,l){return y[d]=l})),y),o=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,h=String.fromCharCode.bind(String),W="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):function(d){var l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(d){return d};return new Uint8Array(Array.prototype.slice.call(d,0).map(l))},V=function(d){return d.replace(/[^A-Za-z0-9\+\/]/g,"")},s=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,H=function(d){switch(d.length){case 4:var l=((7&d.charCodeAt(0))<<18|(63&d.charCodeAt(1))<<12|(63&d.charCodeAt(2))<<6|63&d.charCodeAt(3))-65536;return h(55296+(l>>>10))+h(56320+(1023&l));case 3:return h((15&d.charCodeAt(0))<<12|(63&d.charCodeAt(1))<<6|63&d.charCodeAt(2));default:return h((31&d.charCodeAt(0))<<6|63&d.charCodeAt(1))}},L=function(d){return d.replace(s,H)},C=function(d){if(d=d.replace(/\s+/g,""),!o.test(d))throw new TypeError("malformed base64.");d+="==".slice(2-(3&d.length));for(var l,c,b,Z="",X=0;X<d.length;)l=I[d.charAt(X++)]<<18|I[d.charAt(X++)]<<12|(c=I[d.charAt(X++)])<<6|(b=I[d.charAt(X++)]),Z+=64===c?h(l>>16&255):64===b?h(l>>16&255,l>>8&255):h(l>>16&255,l>>8&255,255&l);return Z},a=p?function(d){return atob(V(d))}:t?function(d){return Buffer.from(d,"base64").toString("binary")}:C,n=t?function(d){return W(Buffer.from(d,"base64"))}:function(d){return W(a(d),(function(d){return d.charCodeAt(0)}))},x=t?function(d){return Buffer.from(d,"base64").toString("utf8")}:i?function(d){return i.decode(n(d))}:function(d){return L(a(d))},S=function(d){return V(d.replace(/[-_]/g,(function(d){return"-"==d?"+":"/"})))},Y=function(d){return x(S(d))},g=Y,R=G((function(d){var l=Object.prototype.hasOwnProperty,c="~";function b(){}function Z(d,l,c){this.fn=d,this.context=l,this.once=c||!1}function X(d,l,b,X,G){if("function"!=typeof b)throw new TypeError("The listener must be a function");var y=new Z(b,X||d,G),m=c?c+l:l;return d._events[m]?d._events[m].fn?d._events[m]=[d._events[m],y]:d._events[m].push(y):(d._events[m]=y,d._eventsCount++),d}function G(d,l){0==--d._eventsCount?d._events=new b:delete d._events[l]}function y(){this._events=new b,this._eventsCount=0}Object.create&&(b.prototype=Object.create(null),(new b).__proto__||(c=!1)),y.prototype.eventNames=function(){var d,b,Z=[];if(0===this._eventsCount)return Z;for(b in d=this._events)l.call(d,b)&&Z.push(c?b.slice(1):b);return Object.getOwnPropertySymbols?Z.concat(Object.getOwnPropertySymbols(d)):Z},y.prototype.listeners=function(d){var l=c?c+d:d,b=this._events[l];if(!b)return[];if(b.fn)return[b.fn];for(var Z=0,X=b.length,G=new Array(X);Z<X;Z++)G[Z]=b[Z].fn;return G},y.prototype.listenerCount=function(d){var l=c?c+d:d,b=this._events[l];return b?b.fn?1:b.length:0},y.prototype.emit=function(d,l,b,Z,X,G){var y=c?c+d:d;if(!this._events[y])return!1;var m,K,p=this._events[y],t=arguments.length;if(p.fn){switch(p.once&&this.removeListener(d,p.fn,void 0,!0),t){case 1:return p.fn.call(p.context),!0;case 2:return p.fn.call(p.context,l),!0;case 3:return p.fn.call(p.context,l,b),!0;case 4:return p.fn.call(p.context,l,b,Z),!0;case 5:return p.fn.call(p.context,l,b,Z,X),!0;case 6:return p.fn.call(p.context,l,b,Z,X,G),!0}for(K=1,m=new Array(t-1);K<t;K++)m[K-1]=arguments[K];p.fn.apply(p.context,m)}else{var i,u=p.length;for(K=0;K<u;K++)switch(p[K].once&&this.removeListener(d,p[K].fn,void 0,!0),t){case 1:p[K].fn.call(p[K].context);break;case 2:p[K].fn.call(p[K].context,l);break;case 3:p[K].fn.call(p[K].context,l,b);break;case 4:p[K].fn.call(p[K].context,l,b,Z);break;default:if(!m)for(i=1,m=new Array(t-1);i<t;i++)m[i-1]=arguments[i];p[K].fn.apply(p[K].context,m)}}return!0},y.prototype.on=function(d,l,c){return X(this,d,l,c,!1)},y.prototype.once=function(d,l,c){return X(this,d,l,c,!0)},y.prototype.removeListener=function(d,l,b,Z){var X=c?c+d:d;if(!this._events[X])return this;if(!l)return G(this,X),this;var y=this._events[X];if(y.fn)y.fn!==l||Z&&!y.once||b&&y.context!==b||G(this,X);else{for(var m=0,K=[],p=y.length;m<p;m++)(y[m].fn!==l||Z&&!y[m].once||b&&y[m].context!==b)&&K.push(y[m]);K.length?this._events[X]=1===K.length?K[0]:K:G(this,X)}return this},y.prototype.removeAllListeners=function(d){var l;return d?(l=c?c+d:d,this._events[l]&&G(this,l)):(this._events=new b,this._eventsCount=0),this},y.prototype.off=y.prototype.removeListener,y.prototype.addListener=y.prototype.on,y.prefixed=c,y.EventEmitter=y,d.exports=y}));return function(){if("browser"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function d(){return new R}function c(){var d,l,c=new Promise((function(){d=arguments[0],l=arguments[1]}));return c.resolve=d,c.reject=l,c}function b(){for(var d=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,l=[],c="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),b=c.length,Z=0;Z<d;Z++)l[Z]=c[0|Math.random()*b];return l.join("")}var X=g("CgoKdmFyIHQ9QXJyYXkuaXNBcnJheSxlPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fWZ1bmN0aW9uIG4odCl7dmFyIGU9e2V4cG9ydHM6e319O3JldHVybiB0KGUsZS5leHBvcnRzKSxlLmV4cG9ydHN9dmFyIG89Im9iamVjdCI9PXR5cGVvZiBlJiZlJiZlLk9iamVjdD09PU9iamVjdCYmZSxzPSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsaT1vfHxzfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLHU9aS5TeW1ib2wsYT1PYmplY3QucHJvdG90eXBlLGg9YS5oYXNPd25Qcm9wZXJ0eSxsPWEudG9TdHJpbmcsYz11P3UudG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBmPWZ1bmN0aW9uKHQpe3ZhciBlPWguY2FsbCh0LGMpLHI9dFtjXTt0cnl7dFtjXT12b2lkIDA7dmFyIG49ITB9Y2F0Y2godCl7fXZhciBvPWwuY2FsbCh0KTtyZXR1cm4gbiYmKGU/dFtjXT1yOmRlbGV0ZSB0W2NdKSxvfSxtPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dmFyIGc9ZnVuY3Rpb24odCl7cmV0dXJuIG0uY2FsbCh0KX0scD11P3UudG9TdHJpbmdUYWc6dm9pZCAwO3ZhciB3PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMD09PXQ/IltvYmplY3QgVW5kZWZpbmVkXSI6IltvYmplY3QgTnVsbF0iOnAmJnAgaW4gT2JqZWN0KHQpP2YodCk6Zyh0KX07dmFyIGQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH07dmFyIGI9ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxkKHQpJiYiW29iamVjdCBTeW1ib2xdIj09dyh0KX0seT0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyx2PS9eXHcqJC87dmFyIE09ZnVuY3Rpb24oZSxyKXtpZih0KGUpKXJldHVybiExO3ZhciBuPXR5cGVvZiBlO3JldHVybiEoIm51bWJlciIhPW4mJiJzeW1ib2wiIT1uJiYiYm9vbGVhbiIhPW4mJm51bGwhPWUmJiFiKGUpKXx8KHYudGVzdChlKXx8IXkudGVzdChlKXx8bnVsbCE9ciYmZSBpbiBPYmplY3QocikpfTt2YXIgeD1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX07dmFyIEUsUz1mdW5jdGlvbih0KXtpZigheCh0KSlyZXR1cm4hMTt2YXIgZT13KHQpO3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgUHJveHldIj09ZX0saj1pWyJfX2NvcmUtanNfc2hhcmVkX18iXSxfPShFPS9bXi5dKyQvLmV4ZWMoaiYmai5rZXlzJiZqLmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIitFOiIiO3ZhciBBPWZ1bmN0aW9uKHQpe3JldHVybiEhXyYmXyBpbiB0fSxDPUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZzt2YXIgUj1mdW5jdGlvbih0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIEMuY2FsbCh0KX1jYXRjaCh0KXt9dHJ5e3JldHVybiB0KyIifWNhdGNoKHQpe319cmV0dXJuIiJ9LEk9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8saz1GdW5jdGlvbi5wcm90b3R5cGUsTj1PYmplY3QucHJvdG90eXBlLE89ay50b1N0cmluZyxGPU4uaGFzT3duUHJvcGVydHksej1SZWdFeHAoIl4iK08uY2FsbChGKS5yZXBsYWNlKC9bXFxeJC4qKz8oKVtcXXt9fF0vZywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt2YXIgVD1mdW5jdGlvbih0KXtyZXR1cm4hKCF4KHQpfHxBKHQpKSYmKFModCk/ejpJKS50ZXN0KFIodCkpfTt2YXIgVj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfTt2YXIgUD1mdW5jdGlvbih0LGUpe3ZhciByPVYodCxlKTtyZXR1cm4gVChyKT9yOnZvaWQgMH0scT1QKE9iamVjdCwiY3JlYXRlIik7dmFyICQ9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPXE/cShudWxsKTp7fSx0aGlzLnNpemU9MH07dmFyIEQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LFU9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgTD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKHEpe3ZhciByPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09cj92b2lkIDA6cn1yZXR1cm4gVS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9LEI9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgRz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBxP3ZvaWQgMCE9PWVbdF06Qi5jYWxsKGUsdCl9O3ZhciBLPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsclt0XT1xJiZ2b2lkIDA9PT1lPyJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjplLHRoaXN9O2Z1bmN0aW9uIFcodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19Vy5wcm90b3R5cGUuY2xlYXI9JCxXLnByb3RvdHlwZS5kZWxldGU9RCxXLnByb3RvdHlwZS5nZXQ9TCxXLnByb3RvdHlwZS5oYXM9RyxXLnByb3RvdHlwZS5zZXQ9Szt2YXIgWD1XO3ZhciBKPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH07dmFyIFk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHQhPXQmJmUhPWV9O3ZhciBaPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXQubGVuZ3RoO3ItLTspaWYoWSh0W3JdWzBdLGUpKXJldHVybiByO3JldHVybi0xfSxIPUFycmF5LnByb3RvdHlwZS5zcGxpY2U7dmFyIFE9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPVooZSx0KTtyZXR1cm4hKHI8MCkmJihyPT1lLmxlbmd0aC0xP2UucG9wKCk6SC5jYWxsKGUsciwxKSwtLXRoaXMuc2l6ZSwhMCl9O3ZhciB0dD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9WihlLHQpO3JldHVybiByPDA/dm9pZCAwOmVbcl1bMV19O3ZhciBldD1mdW5jdGlvbih0KXtyZXR1cm4gWih0aGlzLl9fZGF0YV9fLHQpPi0xfTt2YXIgcnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fLG49WihyLHQpO3JldHVybiBuPDA/KCsrdGhpcy5zaXplLHIucHVzaChbdCxlXSkpOnJbbl1bMV09ZSx0aGlzfTtmdW5jdGlvbiBudCh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1udC5wcm90b3R5cGUuY2xlYXI9SixudC5wcm90b3R5cGUuZGVsZXRlPVEsbnQucHJvdG90eXBlLmdldD10dCxudC5wcm90b3R5cGUuaGFzPWV0LG50LnByb3RvdHlwZS5zZXQ9cnQ7dmFyIG90PW50LHN0PVAoaSwiTWFwIik7dmFyIGl0PWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgWCxtYXA6bmV3KHN0fHxvdCksc3RyaW5nOm5ldyBYfX07dmFyIHV0PWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiJzdHJpbmciPT1lfHwibnVtYmVyIj09ZXx8InN5bWJvbCI9PWV8fCJib29sZWFuIj09ZT8iX19wcm90b19fIiE9PXQ6bnVsbD09PXR9O3ZhciBhdD1mdW5jdGlvbih0LGUpe3ZhciByPXQuX19kYXRhX187cmV0dXJuIHV0KGUpP3JbInN0cmluZyI9PXR5cGVvZiBlPyJzdHJpbmciOiJoYXNoIl06ci5tYXB9O3ZhciBodD1mdW5jdGlvbih0KXt2YXIgZT1hdCh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfTt2YXIgbHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGF0KHRoaXMsdCkuZ2V0KHQpfTt2YXIgY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGF0KHRoaXMsdCkuaGFzKHQpfTt2YXIgZnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1hdCh0aGlzLHQpLG49ci5zaXplO3JldHVybiByLnNldCh0LGUpLHRoaXMuc2l6ZSs9ci5zaXplPT1uPzA6MSx0aGlzfTtmdW5jdGlvbiBtdCh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1tdC5wcm90b3R5cGUuY2xlYXI9aXQsbXQucHJvdG90eXBlLmRlbGV0ZT1odCxtdC5wcm90b3R5cGUuZ2V0PWx0LG10LnByb3RvdHlwZS5oYXM9Y3QsbXQucHJvdG90eXBlLnNldD1mdDt2YXIgZ3Q9bXQ7ZnVuY3Rpb24gcHQodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBmdW5jdGlvbiIpO3ZhciByPWZ1bmN0aW9uKCl7dmFyIG49YXJndW1lbnRzLG89ZT9lLmFwcGx5KHRoaXMsbik6blswXSxzPXIuY2FjaGU7aWYocy5oYXMobykpcmV0dXJuIHMuZ2V0KG8pO3ZhciBpPXQuYXBwbHkodGhpcyxuKTtyZXR1cm4gci5jYWNoZT1zLnNldChvLGkpfHxzLGl9O3JldHVybiByLmNhY2hlPW5ldyhwdC5DYWNoZXx8Z3QpLHJ9cHQuQ2FjaGU9Z3Q7dmFyIHd0PXB0O3ZhciBkdD0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxidD0vXFwoXFwpPy9nLHl0PWZ1bmN0aW9uKHQpe3ZhciBlPXd0KHQsKGZ1bmN0aW9uKHQpe3JldHVybiA1MDA9PT1yLnNpemUmJnIuY2xlYXIoKSx0fSkpLHI9ZS5jYWNoZTtyZXR1cm4gZX0oKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoZHQsKGZ1bmN0aW9uKHQscixuLG8pe2UucHVzaChuP28ucmVwbGFjZShidCwiJDEiKTpyfHx0KX0pKSxlfSkpO3ZhciB2dD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aCxvPUFycmF5KG4pOysrcjxuOylvW3JdPWUodFtyXSxyLHQpO3JldHVybiBvfSxNdD11P3UucHJvdG90eXBlOnZvaWQgMCx4dD1NdD9NdC50b1N0cmluZzp2b2lkIDA7dmFyIEV0PWZ1bmN0aW9uIGUocil7aWYoInN0cmluZyI9PXR5cGVvZiByKXJldHVybiByO2lmKHQocikpcmV0dXJuIHZ0KHIsZSkrIiI7aWYoYihyKSlyZXR1cm4geHQ/eHQuY2FsbChyKToiIjt2YXIgbj1yKyIiO3JldHVybiIwIj09biYmMS9yPT0tSW5maW5pdHk/Ii0wIjpufTt2YXIgU3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/IiI6RXQodCl9O3ZhciBqdD1mdW5jdGlvbihlLHIpe3JldHVybiB0KGUpP2U6TShlLHIpP1tlXTp5dChTdChlKSl9O3ZhciBfdD1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fGIodCkpcmV0dXJuIHQ7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LUluZmluaXR5PyItMCI6ZX07dmFyIEF0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsbj0oZT1qdChlLHQpKS5sZW5ndGg7bnVsbCE9dCYmcjxuOyl0PXRbX3QoZVtyKytdKV07cmV0dXJuIHImJnI9PW4/dDp2b2lkIDB9O3ZhciBDdD1mdW5jdGlvbih0LGUscil7dmFyIG49bnVsbD09dD92b2lkIDA6QXQodCxlKTtyZXR1cm4gdm9pZCAwPT09bj9yOm59LFJ0PU9iamVjdC5wcm90b3R5cGU7dmFyIEl0PWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuY29uc3RydWN0b3I7cmV0dXJuIHQ9PT0oImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUucHJvdG90eXBlfHxSdCl9O3ZhciBrdD1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gdChlKHIpKX19KE9iamVjdC5rZXlzLE9iamVjdCksTnQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgT3Q9ZnVuY3Rpb24odCl7aWYoIUl0KHQpKXJldHVybiBrdCh0KTt2YXIgZT1bXTtmb3IodmFyIHIgaW4gT2JqZWN0KHQpKU50LmNhbGwodCxyKSYmImNvbnN0cnVjdG9yIiE9ciYmZS5wdXNoKHIpO3JldHVybiBlfSxGdD1QKGksIkRhdGFWaWV3IiksenQ9UChpLCJQcm9taXNlIiksVHQ9UChpLCJTZXQiKSxWdD1QKGksIldlYWtNYXAiKSxQdD1SKEZ0KSxxdD1SKHN0KSwkdD1SKHp0KSxEdD1SKFR0KSxVdD1SKFZ0KSxMdD13OyhGdCYmIltvYmplY3QgRGF0YVZpZXddIiE9THQobmV3IEZ0KG5ldyBBcnJheUJ1ZmZlcigxKSkpfHxzdCYmIltvYmplY3QgTWFwXSIhPUx0KG5ldyBzdCl8fHp0JiYiW29iamVjdCBQcm9taXNlXSIhPUx0KHp0LnJlc29sdmUoKSl8fFR0JiYiW29iamVjdCBTZXRdIiE9THQobmV3IFR0KXx8VnQmJiJbb2JqZWN0IFdlYWtNYXBdIiE9THQobmV3IFZ0KSkmJihMdD1mdW5jdGlvbih0KXt2YXIgZT13KHQpLHI9IltvYmplY3QgT2JqZWN0XSI9PWU/dC5jb25zdHJ1Y3Rvcjp2b2lkIDAsbj1yP1Iocik6IiI7aWYobilzd2l0Y2gobil7Y2FzZSBQdDpyZXR1cm4iW29iamVjdCBEYXRhVmlld10iO2Nhc2UgcXQ6cmV0dXJuIltvYmplY3QgTWFwXSI7Y2FzZSAkdDpyZXR1cm4iW29iamVjdCBQcm9taXNlXSI7Y2FzZSBEdDpyZXR1cm4iW29iamVjdCBTZXRdIjtjYXNlIFV0OnJldHVybiJbb2JqZWN0IFdlYWtNYXBdIn1yZXR1cm4gZX0pO3ZhciBCdD1MdDt2YXIgR3Q9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PTkwMDcxOTkyNTQ3NDA5OTF9O3ZhciBLdD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmR3QodC5sZW5ndGgpJiYhUyh0KX07dmFyIFd0PWZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZXx8IXQoZSkmJmQoZSkmJiJbb2JqZWN0IFN0cmluZ10iPT13KGUpfTt2YXIgWHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3ZvaWQgMDplW3RdfX0sSnQ9WHQoImxlbmd0aCIpLFl0PVJlZ0V4cCgiW1xcdTIwMGRcXHVkODAwLVxcdWRmZmZcXHUwMzAwLVxcdTAzNmZcXHVmZTIwLVxcdWZlMmZcXHUyMGQwLVxcdTIwZmZcXHVmZTBlXFx1ZmUwZl0iKTt2YXIgWnQ9ZnVuY3Rpb24odCl7cmV0dXJuIFl0LnRlc3QodCl9LEh0PSJbXFx1ZDgwMC1cXHVkZmZmXSIsUXQ9IltcXHUwMzAwLVxcdTAzNmZcXHVmZTIwLVxcdWZlMmZcXHUyMGQwLVxcdTIwZmZdIix0ZT0iXFx1ZDgzY1tcXHVkZmZiLVxcdWRmZmZdIixlZT0iW15cXHVkODAwLVxcdWRmZmZdIixyZT0iKD86XFx1ZDgzY1tcXHVkZGU2LVxcdWRkZmZdKXsyfSIsbmU9IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLG9lPSIoPzoiK1F0KyJ8Iit0ZSsiKSIrIj8iLHNlPSJbXFx1ZmUwZVxcdWZlMGZdPyIrb2UrKCIoPzpcXHUyMDBkKD86IitbZWUscmUsbmVdLmpvaW4oInwiKSsiKVtcXHVmZTBlXFx1ZmUwZl0/IitvZSsiKSoiKSxpZT0iKD86IitbZWUrUXQrIj8iLFF0LHJlLG5lLEh0XS5qb2luKCJ8IikrIikiLHVlPVJlZ0V4cCh0ZSsiKD89Iit0ZSsiKXwiK2llK3NlLCJnIik7dmFyIGFlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT11ZS5sYXN0SW5kZXg9MDt1ZS50ZXN0KHQpOykrK2U7cmV0dXJuIGV9O3ZhciBoZT1mdW5jdGlvbih0KXtyZXR1cm4gWnQodCk/YWUodCk6SnQodCl9O3ZhciBsZT1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiAwO2lmKEt0KHQpKXJldHVybiBXdCh0KT9oZSh0KTp0Lmxlbmd0aDt2YXIgZT1CdCh0KTtyZXR1cm4iW29iamVjdCBNYXBdIj09ZXx8IltvYmplY3QgU2V0XSI9PWU/dC5zaXplOk90KHQpLmxlbmd0aH07dmFyIGNlPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdHx8ZCh0KSYmIltvYmplY3QgTnVtYmVyXSI9PXcodCl9O3ZhciBmZT1mdW5jdGlvbih0KXtyZXR1cm4hMD09PXR8fCExPT09dHx8ZCh0KSYmIltvYmplY3QgQm9vbGVhbl0iPT13KHQpfTtmdW5jdGlvbiBtZSh0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIGdlKHQpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIHBlKHQpe3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIHdlKHQpe3JldHVybiEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgVW5kZWZpbmVkXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdWxsXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtpZihnZSh0KSl7Zm9yKGxldCBlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9KHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4hKCFwZSh0KXx8IiIhPT10KX0odCl8fCEhZnVuY3Rpb24odCl7cmV0dXJuISFtZSh0KSYmMD09PXQubGVuZ3RofSh0KSkpKX1mdW5jdGlvbiBkZSh0KXtyZXR1cm4hIW1lKHQpJiYoMCE9PXQubGVuZ3RoJiYoMSE9PXQubGVuZ3RofHwhd2UodFswXSkpKX1jb25zdCBiZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIHllKHQpe3JldHVybiBiZS5jYWxsKHQpLmVuZHNXaXRoKCJBcnJheV0iKX1mdW5jdGlvbiB2ZSh0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXllKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTt2YXIgcj1lLmZyb21JbmRleCxuPXZvaWQgMD09PXI/MDpyLG89ZS50b0luZGV4LHM9dm9pZCAwPT09bz90Lmxlbmd0aDpvO2lmKG48MHx8bj49dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKG4pKXRocm93IG5ldyBFcnJvcigiZnJvbUluZGV4IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHNtYWxsZXIgdGhhbiBsZW5ndGgiKTtpZihzPD1ufHxzPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihzKSl0aHJvdyBuZXcgRXJyb3IoInRvSW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBmcm9tSW5kZXggYW5kIGF0IG1vc3QgZXF1YWwgdG8gbGVuZ3RoIik7Zm9yKHZhciBpPXRbbl0sdT1uKzE7dTxzO3UrKyl0W3VdPmkmJihpPXRbdV0pO3JldHVybiBpfWZ1bmN0aW9uIE1lKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZigheWUodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBiZSBhbiBhcnJheSIpO2lmKDA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IG5vdCBiZSBlbXB0eSIpO3ZhciByPWUuZnJvbUluZGV4LG49dm9pZCAwPT09cj8wOnIsbz1lLnRvSW5kZXgscz12b2lkIDA9PT1vP3QubGVuZ3RoOm87aWYobjwwfHxuPj10Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIobikpdGhyb3cgbmV3IEVycm9yKCJmcm9tSW5kZXggbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc21hbGxlciB0aGFuIGxlbmd0aCIpO2lmKHM8PW58fHM+dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKHMpKXRocm93IG5ldyBFcnJvcigidG9JbmRleCBtdXN0IGJlIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIGZyb21JbmRleCBhbmQgYXQgbW9zdCBlcXVhbCB0byBsZW5ndGgiKTtmb3IodmFyIGk9dFtuXSx1PW4rMTt1PHM7dSsrKXRbdV08aSYmKGk9dFt1XSk7cmV0dXJuIGl9ZnVuY3Rpb24geGUodCl7dmFyIGUscj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXllKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTtpZih2b2lkIDAhPT1yLm91dHB1dCl7aWYoIXllKHIub3V0cHV0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvdXRwdXQgb3B0aW9uIG11c3QgYmUgYW4gYXJyYXkgaWYgc3BlY2lmaWVkIik7ZT1yLm91dHB1dH1lbHNlIGU9bmV3IEFycmF5KHQubGVuZ3RoKTt2YXIgbj1NZSh0KSxvPXZlKHQpO2lmKG49PT1vKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW5pbXVtIGFuZCBtYXhpbXVtIGlucHV0IHZhbHVlcyBhcmUgZXF1YWwuIENhbm5vdCByZXNjYWxlIGEgY29uc3RhbnQgYXJyYXkiKTt2YXIgcz1yLm1pbixpPXZvaWQgMD09PXM/ci5hdXRvTWluTWF4P246MDpzLHU9ci5tYXgsYT12b2lkIDA9PT11P3IuYXV0b01pbk1heD9vOjE6dTtpZihpPj1hKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gb3B0aW9uIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCBvcHRpb24iKTtmb3IodmFyIGg9KGEtaSkvKG8tbiksbD0wO2w8dC5sZW5ndGg7bCsrKWVbbF09KHRbbF0tbikqaCtpO3JldHVybiBlfWNvbnN0IEVlPSIgIi5yZXBlYXQoMiksU2U9IiAiLnJlcGVhdCg0KTtmdW5jdGlvbiBqZSh0LGU9e30pe2NvbnN0e21heFJvd3M6cj0xNSxtYXhDb2x1bW5zOm49MTAsbWF4TnVtU2l6ZTpvPTh9PWU7cmV0dXJuYCR7dC5jb25zdHJ1Y3Rvci5uYW1lfSB7XG4ke0VlfVtcbiR7U2V9JHtmdW5jdGlvbih0LGUscixuKXtjb25zdHtyb3dzOm8sY29sdW1uczpzfT10LGk9TWF0aC5taW4obyxlKSx1PU1hdGgubWluKHMsciksYT1bXTtmb3IobGV0IGU9MDtlPGk7ZSsrKXtsZXQgcj1bXTtmb3IobGV0IG89MDtvPHU7bysrKXIucHVzaChfZSh0LmdldChlLG8pLG4pKTthLnB1c2goYCR7ci5qb2luKCIgIil9YCl9dSE9PXMmJihhW2EubGVuZ3RoLTFdKz1gIC4uLiAke3Mtcn0gbW9yZSBjb2x1bW5zYCk7aSE9PW8mJmEucHVzaChgLi4uICR7by1lfSBtb3JlIHJvd3NgKTtyZXR1cm4gYS5qb2luKGBcbiR7U2V9YCl9KHQscixuLG8pfVxuJHtFZX1dXG4ke0VlfXJvd3M6ICR7dC5yb3dzfVxuJHtFZX1jb2x1bW5zOiAke3QuY29sdW1uc31cbn1gfWZ1bmN0aW9uIF9lKHQsZSl7Y29uc3Qgcj1TdHJpbmcodCk7aWYoci5sZW5ndGg8PWUpcmV0dXJuIHIucGFkRW5kKGUsIiAiKTtjb25zdCBuPXQudG9QcmVjaXNpb24oZS0yKTtpZihuLmxlbmd0aDw9ZSlyZXR1cm4gbjtjb25zdCBvPXQudG9FeHBvbmVudGlhbChlLTIpLHM9by5pbmRleE9mKCJlIiksaT1vLnNsaWNlKHMpO3JldHVybiBvLnNsaWNlKDAsZS1pLmxlbmd0aCkraX1mdW5jdGlvbiBBZSh0LGUscil7bGV0IG49cj90LnJvd3M6dC5yb3dzLTE7aWYoZTwwfHxlPm4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlJvdyBpbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBDZSh0LGUscil7bGV0IG49cj90LmNvbHVtbnM6dC5jb2x1bW5zLTE7aWYoZTwwfHxlPm4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBSZSh0LGUpe2lmKGUudG8xREFycmF5JiYoZT1lLnRvMURBcnJheSgpKSxlLmxlbmd0aCE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9yIHNpemUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMiKTtyZXR1cm4gZX1mdW5jdGlvbiBJZSh0LGUpe2lmKGUudG8xREFycmF5JiYoZT1lLnRvMURBcnJheSgpKSxlLmxlbmd0aCE9PXQucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9yIHNpemUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHJvd3MiKTtyZXR1cm4gZX1mdW5jdGlvbiBrZSh0LGUscixuLG8pe2lmKDUhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJleHBlY3RlZCA0IGFyZ3VtZW50cyIpO2lmKE9lKCJzdGFydFJvdyIsZSksT2UoImVuZFJvdyIsciksT2UoInN0YXJ0Q29sdW1uIixuKSxPZSgiZW5kQ29sdW1uIixvKSxlPnJ8fG4+b3x8ZTwwfHxlPj10LnJvd3N8fHI8MHx8cj49dC5yb3dzfHxuPDB8fG4+PXQuY29sdW1uc3x8bzwwfHxvPj10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlN1Ym1hdHJpeCBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBOZSh0LGU9MCl7bGV0IHI9W107Zm9yKGxldCBuPTA7bjx0O24rKylyLnB1c2goZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gT2UodCxlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0fSBtdXN0IGJlIGEgbnVtYmVyYCl9ZnVuY3Rpb24gRmUodCl7aWYodC5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJFbXB0eSBtYXRyaXggaGFzIG5vIGVsZW1lbnRzIHRvIGluZGV4Iil9Y2xhc3MgemV7c3RhdGljIGZyb20xREFycmF5KHQsZSxyKXtpZih0KmUhPT1yLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiZGF0YSBsZW5ndGggZG9lcyBub3QgbWF0Y2ggZ2l2ZW4gZGltZW5zaW9ucyIpO2xldCBuPW5ldyBWZSh0LGUpO2ZvcihsZXQgbz0wO288dDtvKyspZm9yKGxldCB0PTA7dDxlO3QrKyluLnNldChvLHQscltvKmUrdF0pO3JldHVybiBufXN0YXRpYyByb3dWZWN0b3IodCl7bGV0IGU9bmV3IFZlKDEsdC5sZW5ndGgpO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKWUuc2V0KDAscix0W3JdKTtyZXR1cm4gZX1zdGF0aWMgY29sdW1uVmVjdG9yKHQpe2xldCBlPW5ldyBWZSh0Lmxlbmd0aCwxKTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyllLnNldChyLDAsdFtyXSk7cmV0dXJuIGV9c3RhdGljIHplcm9zKHQsZSl7cmV0dXJuIG5ldyBWZSh0LGUpfXN0YXRpYyBvbmVzKHQsZSl7cmV0dXJuIG5ldyBWZSh0LGUpLmZpbGwoMSl9c3RhdGljIHJhbmQodCxlLHI9e30pe2lmKCJvYmplY3QiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7cmFuZG9tOm49TWF0aC5yYW5kb219PXI7bGV0IG89bmV3IFZlKHQsZSk7Zm9yKGxldCByPTA7cjx0O3IrKylmb3IobGV0IHQ9MDt0PGU7dCsrKW8uc2V0KHIsdCxuKCkpO3JldHVybiBvfXN0YXRpYyByYW5kSW50KHQsZSxyPXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e21pbjpuPTAsbWF4Om89MWUzLHJhbmRvbTpzPU1hdGgucmFuZG9tfT1yO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIm1pbiBtdXN0IGJlIGFuIGludGVnZXIiKTtpZighTnVtYmVyLmlzSW50ZWdlcihvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggbXVzdCBiZSBhbiBpbnRlZ2VyIik7aWYobj49byl0aHJvdyBuZXcgUmFuZ2VFcnJvcigibWluIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCIpO2xldCBpPW8tbix1PW5ldyBWZSh0LGUpO2ZvcihsZXQgcj0wO3I8dDtyKyspZm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9bitNYXRoLnJvdW5kKHMoKSppKTt1LnNldChyLHQsZSl9cmV0dXJuIHV9c3RhdGljIGV5ZSh0LGUscil7dm9pZCAwPT09ZSYmKGU9dCksdm9pZCAwPT09ciYmKHI9MSk7bGV0IG49TWF0aC5taW4odCxlKSxvPXRoaXMuemVyb3ModCxlKTtmb3IobGV0IHQ9MDt0PG47dCsrKW8uc2V0KHQsdCxyKTtyZXR1cm4gb31zdGF0aWMgZGlhZyh0LGUscil7bGV0IG49dC5sZW5ndGg7dm9pZCAwPT09ZSYmKGU9biksdm9pZCAwPT09ciYmKHI9ZSk7bGV0IG89TWF0aC5taW4obixlLHIpLHM9dGhpcy56ZXJvcyhlLHIpO2ZvcihsZXQgZT0wO2U8bztlKyspcy5zZXQoZSxlLHRbZV0pO3JldHVybiBzfXN0YXRpYyBtaW4odCxlKXt0PXRoaXMuY2hlY2tNYXRyaXgodCksZT10aGlzLmNoZWNrTWF0cml4KGUpO2xldCByPXQucm93cyxuPXQuY29sdW1ucyxvPW5ldyBWZShyLG4pO2ZvcihsZXQgcz0wO3M8cjtzKyspZm9yKGxldCByPTA7cjxuO3IrKylvLnNldChzLHIsTWF0aC5taW4odC5nZXQocyxyKSxlLmdldChzLHIpKSk7cmV0dXJuIG99c3RhdGljIG1heCh0LGUpe3Q9dGhpcy5jaGVja01hdHJpeCh0KSxlPXRoaXMuY2hlY2tNYXRyaXgoZSk7bGV0IHI9dC5yb3dzLG49dC5jb2x1bW5zLG89bmV3IHRoaXMocixuKTtmb3IobGV0IHM9MDtzPHI7cysrKWZvcihsZXQgcj0wO3I8bjtyKyspby5zZXQocyxyLE1hdGgubWF4KHQuZ2V0KHMsciksZS5nZXQocyxyKSkpO3JldHVybiBvfXN0YXRpYyBjaGVja01hdHJpeCh0KXtyZXR1cm4gemUuaXNNYXRyaXgodCk/dDpuZXcgVmUodCl9c3RhdGljIGlzTWF0cml4KHQpe3JldHVybiBudWxsIT10JiYiTWF0cml4Ij09PXQua2xhc3N9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy5yb3dzKnRoaXMuY29sdW1uc31hcHBseSh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24iKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXQuY2FsbCh0aGlzLGUscik7cmV0dXJuIHRoaXN9dG8xREFycmF5KCl7bGV0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LnB1c2godGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9dG8yREFycmF5KCl7bGV0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXt0LnB1c2goW10pO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0W2VdLnB1c2godGhpcy5nZXQoZSxyKSl9cmV0dXJuIHR9dG9KU09OKCl7cmV0dXJuIHRoaXMudG8yREFycmF5KCl9aXNSb3dWZWN0b3IoKXtyZXR1cm4gMT09PXRoaXMucm93c31pc0NvbHVtblZlY3Rvcigpe3JldHVybiAxPT09dGhpcy5jb2x1bW5zfWlzVmVjdG9yKCl7cmV0dXJuIDE9PT10aGlzLnJvd3N8fDE9PT10aGlzLmNvbHVtbnN9aXNTcXVhcmUoKXtyZXR1cm4gdGhpcy5yb3dzPT09dGhpcy5jb2x1bW5zfWlzRW1wdHkoKXtyZXR1cm4gMD09PXRoaXMucm93c3x8MD09PXRoaXMuY29sdW1uc31pc1N5bW1ldHJpYygpe2lmKHRoaXMuaXNTcXVhcmUoKSl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8PXQ7ZSsrKWlmKHRoaXMuZ2V0KHQsZSkhPT10aGlzLmdldChlLHQpKXJldHVybiExO3JldHVybiEwfXJldHVybiExfWlzRWNoZWxvbkZvcm0oKXtsZXQgdD0wLGU9MCxyPS0xLG49ITAsbz0hMTtmb3IoO3Q8dGhpcy5yb3dzJiZuOyl7Zm9yKGU9MCxvPSExO2U8dGhpcy5jb2x1bW5zJiYhMT09PW87KTA9PT10aGlzLmdldCh0LGUpP2UrKzoxPT09dGhpcy5nZXQodCxlKSYmZT5yPyhvPSEwLHI9ZSk6KG49ITEsbz0hMCk7dCsrfXJldHVybiBufWlzUmVkdWNlZEVjaGVsb25Gb3JtKCl7bGV0IHQ9MCxlPTAscj0tMSxuPSEwLG89ITE7Zm9yKDt0PHRoaXMucm93cyYmbjspe2ZvcihlPTAsbz0hMTtlPHRoaXMuY29sdW1ucyYmITE9PT1vOykwPT09dGhpcy5nZXQodCxlKT9lKys6MT09PXRoaXMuZ2V0KHQsZSkmJmU+cj8obz0hMCxyPWUpOihuPSExLG89ITApO2ZvcihsZXQgcj1lKzE7cjx0aGlzLnJvd3M7cisrKTAhPT10aGlzLmdldCh0LHIpJiYobj0hMSk7dCsrfXJldHVybiBufWVjaGVsb25Gb3JtKCl7bGV0IHQ9dGhpcy5jbG9uZSgpLGU9MCxyPTA7Zm9yKDtlPHQucm93cyYmcjx0LmNvbHVtbnM7KXtsZXQgbj1lO2ZvcihsZXQgbz1lO288dC5yb3dzO28rKyl0LmdldChvLHIpPnQuZ2V0KG4scikmJihuPW8pO2lmKDA9PT10LmdldChuLHIpKXIrKztlbHNle3Quc3dhcFJvd3MoZSxuKTtsZXQgbz10LmdldChlLHIpO2ZvcihsZXQgbj1yO248dC5jb2x1bW5zO24rKyl0LnNldChlLG4sdC5nZXQoZSxuKS9vKTtmb3IobGV0IG49ZSsxO248dC5yb3dzO24rKyl7bGV0IG89dC5nZXQobixyKS90LmdldChlLHIpO3Quc2V0KG4sciwwKTtmb3IobGV0IHM9cisxO3M8dC5jb2x1bW5zO3MrKyl0LnNldChuLHMsdC5nZXQobixzKS10LmdldChlLHMpKm8pfWUrKyxyKyt9fXJldHVybiB0fXJlZHVjZWRFY2hlbG9uRm9ybSgpe2xldCB0PXRoaXMuZWNoZWxvbkZvcm0oKSxlPXQuY29sdW1ucyxyPXQucm93cyxuPXItMTtmb3IoO24+PTA7KWlmKDA9PT10Lm1heFJvdyhuKSluLS07ZWxzZXtsZXQgbz0wLHM9ITE7Zm9yKDtvPHImJiExPT09czspMT09PXQuZ2V0KG4sbyk/cz0hMDpvKys7Zm9yKGxldCByPTA7cjxuO3IrKyl7bGV0IHM9dC5nZXQocixvKTtmb3IobGV0IGk9bztpPGU7aSsrKXtsZXQgZT10LmdldChyLGkpLXMqdC5nZXQobixpKTt0LnNldChyLGksZSl9fW4tLX1yZXR1cm4gdH1zZXQoKXt0aHJvdyBuZXcgRXJyb3IoInNldCBtZXRob2QgaXMgdW5pbXBsZW1lbnRlZCIpfWdldCgpe3Rocm93IG5ldyBFcnJvcigiZ2V0IG1ldGhvZCBpcyB1bmltcGxlbWVudGVkIil9cmVwZWF0KHQ9e30pe2lmKCJvYmplY3QiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7cm93czplPTEsY29sdW1uczpyPTF9PXQ7aWYoIU51bWJlci5pc0ludGVnZXIoZSl8fGU8PTApdGhyb3cgbmV3IFR5cGVFcnJvcigicm93cyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHIpfHxyPD0wKXRocm93IG5ldyBUeXBlRXJyb3IoImNvbHVtbnMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTtsZXQgbj1uZXcgVmUodGhpcy5yb3dzKmUsdGhpcy5jb2x1bW5zKnIpO2ZvcihsZXQgdD0wO3Q8ZTt0KyspZm9yKGxldCBlPTA7ZTxyO2UrKyluLnNldFN1Yk1hdHJpeCh0aGlzLHRoaXMucm93cyp0LHRoaXMuY29sdW1ucyplKTtyZXR1cm4gbn1maWxsKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHQpO3JldHVybiB0aGlzfW5lZygpe3JldHVybiB0aGlzLm11bFMoLTEpfWdldFJvdyh0KXtBZSh0aGlzLHQpO2xldCBlPVtdO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyllLnB1c2godGhpcy5nZXQodCxyKSk7cmV0dXJuIGV9Z2V0Um93VmVjdG9yKHQpe3JldHVybiBWZS5yb3dWZWN0b3IodGhpcy5nZXRSb3codCkpfXNldFJvdyh0LGUpe0FlKHRoaXMsdCksZT1SZSh0aGlzLGUpO2ZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldCh0LHIsZVtyXSk7cmV0dXJuIHRoaXN9c3dhcFJvd3ModCxlKXtBZSh0aGlzLHQpLEFlKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXtsZXQgbj10aGlzLmdldCh0LHIpO3RoaXMuc2V0KHQscix0aGlzLmdldChlLHIpKSx0aGlzLnNldChlLHIsbil9cmV0dXJuIHRoaXN9Z2V0Q29sdW1uKHQpe0NlKHRoaXMsdCk7bGV0IGU9W107Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKWUucHVzaCh0aGlzLmdldChyLHQpKTtyZXR1cm4gZX1nZXRDb2x1bW5WZWN0b3IodCl7cmV0dXJuIFZlLmNvbHVtblZlY3Rvcih0aGlzLmdldENvbHVtbih0KSl9c2V0Q29sdW1uKHQsZSl7Q2UodGhpcyx0KSxlPUllKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXRoaXMuc2V0KHIsdCxlW3JdKTtyZXR1cm4gdGhpc31zd2FwQ29sdW1ucyh0LGUpe0NlKHRoaXMsdCksQ2UodGhpcyxlKTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspe2xldCBuPXRoaXMuZ2V0KHIsdCk7dGhpcy5zZXQocix0LHRoaXMuZ2V0KHIsZSkpLHRoaXMuc2V0KHIsZSxuKX1yZXR1cm4gdGhpc31hZGRSb3dWZWN0b3IodCl7dD1SZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdFtyXSk7cmV0dXJuIHRoaXN9c3ViUm93VmVjdG9yKHQpe3Q9UmUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXRbcl0pO3JldHVybiB0aGlzfW11bFJvd1ZlY3Rvcih0KXt0PVJlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0W3JdKTtyZXR1cm4gdGhpc31kaXZSb3dWZWN0b3IodCl7dD1SZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdFtyXSk7cmV0dXJuIHRoaXN9YWRkQ29sdW1uVmVjdG9yKHQpe3Q9SWUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3RbZV0pO3JldHVybiB0aGlzfXN1YkNvbHVtblZlY3Rvcih0KXt0PUllKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10W2VdKTtyZXR1cm4gdGhpc31tdWxDb2x1bW5WZWN0b3IodCl7dD1JZSh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdFtlXSk7cmV0dXJuIHRoaXN9ZGl2Q29sdW1uVmVjdG9yKHQpe3Q9SWUodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3RbZV0pO3JldHVybiB0aGlzfW11bFJvdyh0LGUpe0FlKHRoaXMsdCk7Zm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KHQscix0aGlzLmdldCh0LHIpKmUpO3JldHVybiB0aGlzfW11bENvbHVtbih0LGUpe0NlKHRoaXMsdCk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXRoaXMuc2V0KHIsdCx0aGlzLmdldChyLHQpKmUpO3JldHVybiB0aGlzfW1heCgpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IHQ9dGhpcy5nZXQoMCwwKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KGUscik+dCYmKHQ9dGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9bWF4SW5kZXgoKXtGZSh0aGlzKTtsZXQgdD10aGlzLmdldCgwLDApLGU9WzAsMF07Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLmdldChyLG4pPnQmJih0PXRoaXMuZ2V0KHIsbiksZVswXT1yLGVbMV09bik7cmV0dXJuIGV9bWluKCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgdD10aGlzLmdldCgwLDApO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQoZSxyKTx0JiYodD10aGlzLmdldChlLHIpKTtyZXR1cm4gdH1taW5JbmRleCgpe0ZlKHRoaXMpO2xldCB0PXRoaXMuZ2V0KDAsMCksZT1bMCwwXTtmb3IobGV0IHI9MDtyPHRoaXMucm93cztyKyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuZ2V0KHIsbik8dCYmKHQ9dGhpcy5nZXQocixuKSxlWzBdPXIsZVsxXT1uKTtyZXR1cm4gZX1tYXhSb3codCl7aWYoQWUodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KHQsMCk7Zm9yKGxldCByPTE7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuZ2V0KHQscik+ZSYmKGU9dGhpcy5nZXQodCxyKSk7cmV0dXJuIGV9bWF4Um93SW5kZXgodCl7QWUodGhpcyx0KSxGZSh0aGlzKTtsZXQgZT10aGlzLmdldCh0LDApLHI9W3QsMF07Zm9yKGxldCBuPTE7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuZ2V0KHQsbik+ZSYmKGU9dGhpcy5nZXQodCxuKSxyWzFdPW4pO3JldHVybiByfW1pblJvdyh0KXtpZihBZSh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQodCwwKTtmb3IobGV0IHI9MTtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5nZXQodCxyKTxlJiYoZT10aGlzLmdldCh0LHIpKTtyZXR1cm4gZX1taW5Sb3dJbmRleCh0KXtBZSh0aGlzLHQpLEZlKHRoaXMpO2xldCBlPXRoaXMuZ2V0KHQsMCkscj1bdCwwXTtmb3IobGV0IG49MTtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5nZXQodCxuKTxlJiYoZT10aGlzLmdldCh0LG4pLHJbMV09bik7cmV0dXJuIHJ9bWF4Q29sdW1uKHQpe2lmKENlKHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCgwLHQpO2ZvcihsZXQgcj0xO3I8dGhpcy5yb3dzO3IrKyl0aGlzLmdldChyLHQpPmUmJihlPXRoaXMuZ2V0KHIsdCkpO3JldHVybiBlfW1heENvbHVtbkluZGV4KHQpe0NlKHRoaXMsdCksRmUodGhpcyk7bGV0IGU9dGhpcy5nZXQoMCx0KSxyPVswLHRdO2ZvcihsZXQgbj0xO248dGhpcy5yb3dzO24rKyl0aGlzLmdldChuLHQpPmUmJihlPXRoaXMuZ2V0KG4sdCksclswXT1uKTtyZXR1cm4gcn1taW5Db2x1bW4odCl7aWYoQ2UodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KDAsdCk7Zm9yKGxldCByPTE7cjx0aGlzLnJvd3M7cisrKXRoaXMuZ2V0KHIsdCk8ZSYmKGU9dGhpcy5nZXQocix0KSk7cmV0dXJuIGV9bWluQ29sdW1uSW5kZXgodCl7Q2UodGhpcyx0KSxGZSh0aGlzKTtsZXQgZT10aGlzLmdldCgwLHQpLHI9WzAsdF07Zm9yKGxldCBuPTE7bjx0aGlzLnJvd3M7bisrKXRoaXMuZ2V0KG4sdCk8ZSYmKGU9dGhpcy5nZXQobix0KSxyWzBdPW4pO3JldHVybiByfWRpYWcoKXtsZXQgdD1NYXRoLm1pbih0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKSxlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHRoaXMuZ2V0KHIscikpO3JldHVybiBlfW5vcm0odD0iZnJvYmVuaXVzIil7bGV0IGU9MDtpZigibWF4Ij09PXQpcmV0dXJuIHRoaXMubWF4KCk7aWYoImZyb2Jlbml1cyI9PT10KXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKWUrPXRoaXMuZ2V0KHQscikqdGhpcy5nZXQodCxyKTtyZXR1cm4gTWF0aC5zcXJ0KGUpfXRocm93IG5ldyBSYW5nZUVycm9yKGB1bmtub3duIG5vcm0gdHlwZTogJHt0fWApfWN1bXVsYXRpdmVTdW0oKXtsZXQgdD0wO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdCs9dGhpcy5nZXQoZSxyKSx0aGlzLnNldChlLHIsdCk7cmV0dXJuIHRoaXN9ZG90KHQpe3plLmlzTWF0cml4KHQpJiYodD10LnRvMURBcnJheSgpKTtsZXQgZT10aGlzLnRvMURBcnJheSgpO2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvcnMgZG8gbm90IGhhdmUgdGhlIHNhbWUgc2l6ZSIpO2xldCByPTA7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspcis9ZVtuXSp0W25dO3JldHVybiByfW1tdWwodCl7dD1WZS5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLnJvd3Mscj10aGlzLmNvbHVtbnMsbj10LmNvbHVtbnMsbz1uZXcgVmUoZSxuKSxzPW5ldyBGbG9hdDY0QXJyYXkocik7Zm9yKGxldCBpPTA7aTxuO2krKyl7Zm9yKGxldCBlPTA7ZTxyO2UrKylzW2VdPXQuZ2V0KGUsaSk7Zm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9MDtmb3IobGV0IG49MDtuPHI7bisrKWUrPXRoaXMuZ2V0KHQsbikqc1tuXTtvLnNldCh0LGksZSl9fXJldHVybiBvfXN0cmFzc2VuMngyKHQpe3Q9VmUuY2hlY2tNYXRyaXgodCk7bGV0IGU9bmV3IFZlKDIsMik7Y29uc3Qgcj10aGlzLmdldCgwLDApLG49dC5nZXQoMCwwKSxvPXRoaXMuZ2V0KDAsMSkscz10LmdldCgwLDEpLGk9dGhpcy5nZXQoMSwwKSx1PXQuZ2V0KDEsMCksYT10aGlzLmdldCgxLDEpLGg9dC5nZXQoMSwxKSxsPShyK2EpKihuK2gpLGM9KGkrYSkqbixmPXIqKHMtaCksbT1hKih1LW4pLGc9KHIrbykqaCxwPWwrbS1nKyhvLWEpKih1K2gpLHc9ZitnLGQ9YyttLGI9bC1jK2YrKGktcikqKG4rcyk7cmV0dXJuIGUuc2V0KDAsMCxwKSxlLnNldCgwLDEsdyksZS5zZXQoMSwwLGQpLGUuc2V0KDEsMSxiKSxlfXN0cmFzc2VuM3gzKHQpe3Q9VmUuY2hlY2tNYXRyaXgodCk7bGV0IGU9bmV3IFZlKDMsMyk7Y29uc3Qgcj10aGlzLmdldCgwLDApLG49dGhpcy5nZXQoMCwxKSxvPXRoaXMuZ2V0KDAsMikscz10aGlzLmdldCgxLDApLGk9dGhpcy5nZXQoMSwxKSx1PXRoaXMuZ2V0KDEsMiksYT10aGlzLmdldCgyLDApLGg9dGhpcy5nZXQoMiwxKSxsPXRoaXMuZ2V0KDIsMiksYz10LmdldCgwLDApLGY9dC5nZXQoMCwxKSxtPXQuZ2V0KDAsMiksZz10LmdldCgxLDApLHA9dC5nZXQoMSwxKSx3PXQuZ2V0KDEsMiksZD10LmdldCgyLDApLGI9dC5nZXQoMiwxKSx5PXQuZ2V0KDIsMiksdj0oci1zKSooLWYrcCksTT0oLXIrcytpKSooYy1mK3ApLHg9KHMraSkqKC1jK2YpLEU9cipjLFM9KC1yK2EraCkqKGMtbSt3KSxqPSgtcithKSoobS13KSxfPShhK2gpKigtYyttKSxBPSgtbytoK2wpKihwK2QtYiksQz0oby1sKSoocC1iKSxSPW8qZCxJPShoK2wpKigtZCtiKSxrPSgtbytpK3UpKih3K2QteSksTj0oby11KSoody15KSxPPShpK3UpKigtZCt5KSxGPUUrUituKmcsej0ocituK28tcy1pLWgtbCkqcCtNK3grRStBK1IrSSxUPUUrUytfKyhyK24rby1pLXUtYS1oKSp3K1IraytPLFY9ditpKigtYytmK2ctcC13LWQreSkrTStFK1IraytOLFA9ditNK3grRSt1KmIscT1SK2srTitPK3MqbSwkPUUrUytqK2gqKC1jK20rZy1wLXctZCtiKStBK0MrUixEPUErQytSK0krYSpmLFU9RStTK2orXytsKnk7cmV0dXJuIGUuc2V0KDAsMCxGKSxlLnNldCgwLDEseiksZS5zZXQoMCwyLFQpLGUuc2V0KDEsMCxWKSxlLnNldCgxLDEsUCksZS5zZXQoMSwyLHEpLGUuc2V0KDIsMCwkKSxlLnNldCgyLDEsRCksZS5zZXQoMiwyLFUpLGV9bW11bFN0cmFzc2VuKHQpe3Q9VmUuY2hlY2tNYXRyaXgodCk7bGV0IGU9dGhpcy5jbG9uZSgpLHI9ZS5yb3dzLG49ZS5jb2x1bW5zLG89dC5yb3dzLHM9dC5jb2x1bW5zO2Z1bmN0aW9uIGkodCxlLHIpe2xldCBuPXQucm93cyxvPXQuY29sdW1ucztpZihuPT09ZSYmbz09PXIpcmV0dXJuIHQ7e2xldCBuPXplLnplcm9zKGUscik7cmV0dXJuIG49bi5zZXRTdWJNYXRyaXgodCwwLDApLG59fW4hPT1vJiZjb25zb2xlLndhcm4oYE11bHRpcGx5aW5nICR7cn0geCAke259IGFuZCAke299IHggJHtzfSBtYXRyaXg6IGRpbWVuc2lvbnMgZG8gbm90IG1hdGNoLmApO2xldCB1PU1hdGgubWF4KHIsbyksYT1NYXRoLm1heChuLHMpO3JldHVybiBlPWkoZSx1LGEpLGZ1bmN0aW9uIHQoZSxyLG4sbyl7aWYobjw9NTEyfHxvPD01MTIpcmV0dXJuIGUubW11bChyKTtuJTI9PTEmJm8lMj09MT8oZT1pKGUsbisxLG8rMSkscj1pKHIsbisxLG8rMSkpOm4lMj09MT8oZT1pKGUsbisxLG8pLHI9aShyLG4rMSxvKSk6byUyPT0xJiYoZT1pKGUsbixvKzEpLHI9aShyLG4sbysxKSk7bGV0IHM9cGFyc2VJbnQoZS5yb3dzLzIsMTApLHU9cGFyc2VJbnQoZS5jb2x1bW5zLzIsMTApLGE9ZS5zdWJNYXRyaXgoMCxzLTEsMCx1LTEpLGg9ci5zdWJNYXRyaXgoMCxzLTEsMCx1LTEpLGw9ZS5zdWJNYXRyaXgoMCxzLTEsdSxlLmNvbHVtbnMtMSksYz1yLnN1Yk1hdHJpeCgwLHMtMSx1LHIuY29sdW1ucy0xKSxmPWUuc3ViTWF0cml4KHMsZS5yb3dzLTEsMCx1LTEpLG09ci5zdWJNYXRyaXgocyxyLnJvd3MtMSwwLHUtMSksZz1lLnN1Yk1hdHJpeChzLGUucm93cy0xLHUsZS5jb2x1bW5zLTEpLHA9ci5zdWJNYXRyaXgocyxyLnJvd3MtMSx1LHIuY29sdW1ucy0xKSx3PXQoemUuYWRkKGEsZyksemUuYWRkKGgscCkscyx1KSxkPXQoemUuYWRkKGYsZyksaCxzLHUpLGI9dChhLHplLnN1YihjLHApLHMsdSkseT10KGcsemUuc3ViKG0saCkscyx1KSx2PXQoemUuYWRkKGEsbCkscCxzLHUpLE09dCh6ZS5zdWIoZixhKSx6ZS5hZGQoaCxjKSxzLHUpLHg9dCh6ZS5zdWIobCxnKSx6ZS5hZGQobSxwKSxzLHUpLEU9emUuYWRkKHcseSk7RS5zdWIodiksRS5hZGQoeCk7bGV0IFM9emUuYWRkKGIsdiksaj16ZS5hZGQoZCx5KSxfPXplLnN1Yih3LGQpO18uYWRkKGIpLF8uYWRkKE0pO2xldCBBPXplLnplcm9zKDIqRS5yb3dzLDIqRS5jb2x1bW5zKTtyZXR1cm4gQT1BLnNldFN1Yk1hdHJpeChFLDAsMCksQT1BLnNldFN1Yk1hdHJpeChTLEUucm93cywwKSxBPUEuc2V0U3ViTWF0cml4KGosMCxFLmNvbHVtbnMpLEE9QS5zZXRTdWJNYXRyaXgoXyxFLnJvd3MsRS5jb2x1bW5zKSxBLnN1Yk1hdHJpeCgwLG4tMSwwLG8tMSl9KGUsdD1pKHQsdSxhKSx1LGEpfXNjYWxlUm93cyh0PXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e21pbjplPTAsbWF4OnI9MX09dDtpZighTnVtYmVyLmlzRmluaXRlKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1pbiBtdXN0IGJlIGEgbnVtYmVyIik7aWYoIU51bWJlci5pc0Zpbml0ZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggbXVzdCBiZSBhIG51bWJlciIpO2lmKGU+PXIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXgiKTtsZXQgbj1uZXcgVmUodGhpcy5yb3dzLHRoaXMuY29sdW1ucyk7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKXtjb25zdCBvPXRoaXMuZ2V0Um93KHQpO28ubGVuZ3RoPjAmJnhlKG8se21pbjplLG1heDpyLG91dHB1dDpvfSksbi5zZXRSb3codCxvKX1yZXR1cm4gbn1zY2FsZUNvbHVtbnModD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46ZT0wLG1heDpyPTF9PXQ7aWYoIU51bWJlci5pc0Zpbml0ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhIG51bWJlciIpO2lmKCFOdW1iZXIuaXNGaW5pdGUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYSBudW1iZXIiKTtpZihlPj1yKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IG49bmV3IFZlKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpO2ZvcihsZXQgdD0wO3Q8dGhpcy5jb2x1bW5zO3QrKyl7Y29uc3Qgbz10aGlzLmdldENvbHVtbih0KTtvLmxlbmd0aCYmeGUobyx7bWluOmUsbWF4OnIsb3V0cHV0Om99KSxuLnNldENvbHVtbih0LG8pfXJldHVybiBufWZsaXBSb3dzKCl7Y29uc3QgdD1NYXRoLmNlaWwodGhpcy5jb2x1bW5zLzIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHQ7cisrKXtsZXQgdD10aGlzLmdldChlLHIpLG49dGhpcy5nZXQoZSx0aGlzLmNvbHVtbnMtMS1yKTt0aGlzLnNldChlLHIsbiksdGhpcy5zZXQoZSx0aGlzLmNvbHVtbnMtMS1yLHQpfXJldHVybiB0aGlzfWZsaXBDb2x1bW5zKCl7Y29uc3QgdD1NYXRoLmNlaWwodGhpcy5yb3dzLzIpO2ZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKylmb3IobGV0IHI9MDtyPHQ7cisrKXtsZXQgdD10aGlzLmdldChyLGUpLG49dGhpcy5nZXQodGhpcy5yb3dzLTEtcixlKTt0aGlzLnNldChyLGUsbiksdGhpcy5zZXQodGhpcy5yb3dzLTEtcixlLHQpfXJldHVybiB0aGlzfWtyb25lY2tlclByb2R1Y3QodCl7dD1WZS5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLnJvd3Mscj10aGlzLmNvbHVtbnMsbj10LnJvd3Msbz10LmNvbHVtbnMscz1uZXcgVmUoZSpuLHIqbyk7Zm9yKGxldCBpPTA7aTxlO2krKylmb3IobGV0IGU9MDtlPHI7ZSsrKWZvcihsZXQgcj0wO3I8bjtyKyspZm9yKGxldCB1PTA7dTxvO3UrKylzLnNldChuKmkrcixvKmUrdSx0aGlzLmdldChpLGUpKnQuZ2V0KHIsdSkpO3JldHVybiBzfWtyb25lY2tlclN1bSh0KXtpZih0PVZlLmNoZWNrTWF0cml4KHQpLCF0aGlzLmlzU3F1YXJlKCl8fCF0LmlzU3F1YXJlKCkpdGhyb3cgbmV3IEVycm9yKCJLcm9uZWNrZXIgU3VtIG5lZWRzIHR3byBTcXVhcmUgTWF0cmljZXMiKTtsZXQgZT10aGlzLnJvd3Mscj10LnJvd3Msbj10aGlzLmtyb25lY2tlclByb2R1Y3QoVmUuZXllKHIscikpLG89VmUuZXllKGUsZSkua3JvbmVja2VyUHJvZHVjdCh0KTtyZXR1cm4gbi5hZGQobyl9dHJhbnNwb3NlKCl7bGV0IHQ9bmV3IFZlKHRoaXMuY29sdW1ucyx0aGlzLnJvd3MpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdC5zZXQocixlLHRoaXMuZ2V0KGUscikpO3JldHVybiB0fXNvcnRSb3dzKHQ9VGUpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl0aGlzLnNldFJvdyhlLHRoaXMuZ2V0Um93KGUpLnNvcnQodCkpO3JldHVybiB0aGlzfXNvcnRDb2x1bW5zKHQ9VGUpe2ZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldENvbHVtbihlLHRoaXMuZ2V0Q29sdW1uKGUpLnNvcnQodCkpO3JldHVybiB0aGlzfXN1Yk1hdHJpeCh0LGUscixuKXtrZSh0aGlzLHQsZSxyLG4pO2xldCBvPW5ldyBWZShlLXQrMSxuLXIrMSk7Zm9yKGxldCBzPXQ7czw9ZTtzKyspZm9yKGxldCBlPXI7ZTw9bjtlKyspby5zZXQocy10LGUtcix0aGlzLmdldChzLGUpKTtyZXR1cm4gb31zdWJNYXRyaXhSb3codCxlLHIpe2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXRoaXMuY29sdW1ucy0xKSxlPnJ8fGU8MHx8ZT49dGhpcy5jb2x1bW5zfHxyPDB8fHI+PXRoaXMuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIik7bGV0IG49bmV3IFZlKHQubGVuZ3RoLHItZSsxKTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKylmb3IobGV0IHM9ZTtzPD1yO3MrKyl7aWYodFtvXTwwfHx0W29dPj10aGlzLnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFJvdyBpbmRleCBvdXQgb2YgcmFuZ2U6ICR7dFtvXX1gKTtuLnNldChvLHMtZSx0aGlzLmdldCh0W29dLHMpKX1yZXR1cm4gbn1zdWJNYXRyaXhDb2x1bW4odCxlLHIpe2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXRoaXMucm93cy0xKSxlPnJ8fGU8MHx8ZT49dGhpcy5yb3dzfHxyPDB8fHI+PXRoaXMucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIik7bGV0IG49bmV3IFZlKHItZSsxLHQubGVuZ3RoKTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKylmb3IobGV0IHM9ZTtzPD1yO3MrKyl7aWYodFtvXTwwfHx0W29dPj10aGlzLmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYENvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2U6ICR7dFtvXX1gKTtuLnNldChzLWUsbyx0aGlzLmdldChzLHRbb10pKX1yZXR1cm4gbn1zZXRTdWJNYXRyaXgodCxlLHIpe2lmKCh0PVZlLmNoZWNrTWF0cml4KHQpKS5pc0VtcHR5KCkpcmV0dXJuIHRoaXM7a2UodGhpcyxlLGUrdC5yb3dzLTEscixyK3QuY29sdW1ucy0xKTtmb3IobGV0IG49MDtuPHQucm93cztuKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXRoaXMuc2V0KGUrbixyK28sdC5nZXQobixvKSk7cmV0dXJuIHRoaXN9c2VsZWN0aW9uKHQsZSl7IWZ1bmN0aW9uKHQsZSl7aWYoIXllKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoInJvdyBpbmRpY2VzIG11c3QgYmUgYW4gYXJyYXkiKTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdPDB8fGVbcl0+PXQucm93cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigicm93IGluZGljZXMgYXJlIG91dCBvZiByYW5nZSIpfSh0aGlzLHQpLGZ1bmN0aW9uKHQsZSl7aWYoIXllKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoImNvbHVtbiBpbmRpY2VzIG11c3QgYmUgYW4gYXJyYXkiKTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdPDB8fGVbcl0+PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiY29sdW1uIGluZGljZXMgYXJlIG91dCBvZiByYW5nZSIpfSh0aGlzLGUpO2xldCByPW5ldyBWZSh0Lmxlbmd0aCxlLmxlbmd0aCk7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2xldCBvPXRbbl07Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCBzPWVbdF07ci5zZXQobix0LHRoaXMuZ2V0KG8scykpfX1yZXR1cm4gcn10cmFjZSgpe2xldCB0PU1hdGgubWluKHRoaXMucm93cyx0aGlzLmNvbHVtbnMpLGU9MDtmb3IobGV0IHI9MDtyPHQ7cisrKWUrPXRoaXMuZ2V0KHIscik7cmV0dXJuIGV9Y2xvbmUoKXtsZXQgdD1uZXcgVmUodGhpcy5yb3dzLHRoaXMuY29sdW1ucyk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0LnNldChlLHIsdGhpcy5nZXQoZSxyKSk7cmV0dXJuIHR9c3VtKHQpe3N3aXRjaCh0KXtjYXNlInJvdyI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPU5lKHQucm93cyk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgbj0wO248dC5jb2x1bW5zOysrbillW3JdKz10LmdldChyLG4pO3JldHVybiBlfSh0aGlzKTtjYXNlImNvbHVtbiI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPU5lKHQuY29sdW1ucyk7Zm9yKGxldCByPTA7cjx0LnJvd3M7KytyKWZvcihsZXQgbj0wO248dC5jb2x1bW5zOysrbillW25dKz10LmdldChyLG4pO3JldHVybiBlfSh0aGlzKTtjYXNlIHZvaWQgMDpyZXR1cm4gZnVuY3Rpb24odCl7bGV0IGU9MDtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKWUrPXQuZ2V0KHIsbik7cmV0dXJuIGV9KHRoaXMpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1wcm9kdWN0KHQpe3N3aXRjaCh0KXtjYXNlInJvdyI6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPU5lKHQucm93cywxKTtmb3IobGV0IHI9MDtyPHQucm93czsrK3IpZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7KytuKWVbcl0qPXQuZ2V0KHIsbik7cmV0dXJuIGV9KHRoaXMpO2Nhc2UiY29sdW1uIjpyZXR1cm4gZnVuY3Rpb24odCl7bGV0IGU9TmUodC5jb2x1bW5zLDEpO2ZvcihsZXQgcj0wO3I8dC5yb3dzOysrcilmb3IobGV0IG49MDtuPHQuY29sdW1uczsrK24pZVtuXSo9dC5nZXQocixuKTtyZXR1cm4gZX0odGhpcyk7Y2FzZSB2b2lkIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe2xldCBlPTE7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyllKj10LmdldChyLG4pO3JldHVybiBlfSh0aGlzKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19bWVhbih0KXtjb25zdCBlPXRoaXMuc3VtKHQpO3N3aXRjaCh0KXtjYXNlInJvdyI6Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWVbdF0vPXRoaXMuY29sdW1ucztyZXR1cm4gZTtjYXNlImNvbHVtbiI6Zm9yKGxldCB0PTA7dDx0aGlzLmNvbHVtbnM7dCsrKWVbdF0vPXRoaXMucm93cztyZXR1cm4gZTtjYXNlIHZvaWQgMDpyZXR1cm4gZS90aGlzLnNpemU7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXZhcmlhbmNlKHQsZT17fSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3VuYmlhc2VkOnI9ITAsbWVhbjpuPXRoaXMubWVhbih0KX09ZTtpZigiYm9vbGVhbiIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoInVuYmlhc2VkIG11c3QgYmUgYSBib29sZWFuIik7c3dpdGNoKHQpe2Nhc2Uicm93IjppZigheWUobikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBuPXQucm93cyxvPXQuY29sdW1ucyxzPVtdO2ZvcihsZXQgaT0wO2k8bjtpKyspe2xldCBuPTAsdT0wLGE9MDtmb3IobGV0IGU9MDtlPG87ZSsrKWE9dC5nZXQoaSxlKS1yW2ldLG4rPWEsdSs9YSphO2U/cy5wdXNoKCh1LW4qbi9vKS8oby0xKSk6cy5wdXNoKCh1LW4qbi9vKS9vKX1yZXR1cm4gc30odGhpcyxyLG4pO2Nhc2UiY29sdW1uIjppZigheWUobikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtjb25zdCBuPXQucm93cyxvPXQuY29sdW1ucyxzPVtdO2ZvcihsZXQgaT0wO2k8bztpKyspe2xldCBvPTAsdT0wLGE9MDtmb3IobGV0IGU9MDtlPG47ZSsrKWE9dC5nZXQoZSxpKS1yW2ldLG8rPWEsdSs9YSphO2U/cy5wdXNoKCh1LW8qby9uKS8obi0xKSk6cy5wdXNoKCh1LW8qby9uKS9uKX1yZXR1cm4gc30odGhpcyxyLG4pO2Nhc2Ugdm9pZCAwOmlmKCJudW1iZXIiIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJtZWFuIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe2NvbnN0IG49dC5yb3dzLG89dC5jb2x1bW5zLHM9bipvO2xldCBpPTAsdT0wLGE9MDtmb3IobGV0IGU9MDtlPG47ZSsrKWZvcihsZXQgbj0wO248bztuKyspYT10LmdldChlLG4pLXIsaSs9YSx1Kz1hKmE7cmV0dXJuIGU/KHUtaSppL3MpLyhzLTEpOih1LWkqaS9zKS9zfSh0aGlzLHIsbik7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXN0YW5kYXJkRGV2aWF0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKTtjb25zdCByPXRoaXMudmFyaWFuY2UodCxlKTtpZih2b2lkIDA9PT10KXJldHVybiBNYXRoLnNxcnQocik7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0Kyspclt0XT1NYXRoLnNxcnQoclt0XSk7cmV0dXJuIHJ9Y2VudGVyKHQsZT17fSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYoZT10LHQ9dm9pZCAwKSwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e2NlbnRlcjpyPXRoaXMubWVhbih0KX09ZTtzd2l0Y2godCl7Y2FzZSJyb3ciOmlmKCF5ZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspdC5zZXQocixuLHQuZ2V0KHIsbiktZVtyXSl9KHRoaXMsciksdGhpcztjYXNlImNvbHVtbiI6aWYoIXllKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoImNlbnRlciBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyl0LnNldChyLG4sdC5nZXQocixuKS1lW25dKX0odGhpcyxyKSx0aGlzO2Nhc2Ugdm9pZCAwOmlmKCJudW1iZXIiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspdC5zZXQocixuLHQuZ2V0KHIsbiktZSl9KHRoaXMsciksdGhpcztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcHRpb246ICR7dH1gKX19c2NhbGUodCxlPXt9KXtpZigib2JqZWN0Ij09dHlwZW9mIHQmJihlPXQsdD12b2lkIDApLCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7bGV0IHI9ZS5zY2FsZTtzd2l0Y2godCl7Y2FzZSJyb3ciOmlmKHZvaWQgMD09PXIpcj1mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKyl7bGV0IG49MDtmb3IobGV0IGU9MDtlPHQuY29sdW1ucztlKyspbis9TWF0aC5wb3codC5nZXQocixlKSwyKS8odC5jb2x1bW5zLTEpO2UucHVzaChNYXRoLnNxcnQobikpfXJldHVybiBlfSh0aGlzKTtlbHNlIGlmKCF5ZShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzY2FsZSBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByPTA7cjx0LnJvd3M7cisrKWZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyl0LnNldChyLG4sdC5nZXQocixuKS9lW3JdKX0odGhpcyxyKSx0aGlzO2Nhc2UiY29sdW1uIjppZih2b2lkIDA9PT1yKXI9ZnVuY3Rpb24odCl7Y29uc3QgZT1bXTtmb3IobGV0IHI9MDtyPHQuY29sdW1ucztyKyspe2xldCBuPTA7Zm9yKGxldCBlPTA7ZTx0LnJvd3M7ZSsrKW4rPU1hdGgucG93KHQuZ2V0KGUsciksMikvKHQucm93cy0xKTtlLnB1c2goTWF0aC5zcXJ0KG4pKX1yZXR1cm4gZX0odGhpcyk7ZWxzZSBpZigheWUocikpdGhyb3cgbmV3IFR5cGVFcnJvcigic2NhbGUgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBmdW5jdGlvbih0LGUpe2ZvcihsZXQgcj0wO3I8dC5yb3dzO3IrKylmb3IobGV0IG49MDtuPHQuY29sdW1ucztuKyspdC5zZXQocixuLHQuZ2V0KHIsbikvZVtuXSl9KHRoaXMsciksdGhpcztjYXNlIHZvaWQgMDppZih2b2lkIDA9PT1yKXI9ZnVuY3Rpb24odCl7Y29uc3QgZT10LnNpemUtMTtsZXQgcj0wO2ZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKylmb3IobGV0IG89MDtvPHQucm93cztvKyspcis9TWF0aC5wb3codC5nZXQobyxuKSwyKS9lO3JldHVybiBNYXRoLnNxcnQocil9KHRoaXMpO2Vsc2UgaWYoIm51bWJlciIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IobGV0IHI9MDtyPHQucm93cztyKyspZm9yKGxldCBuPTA7bjx0LmNvbHVtbnM7bisrKXQuc2V0KHIsbix0LmdldChyLG4pL2UpfSh0aGlzLHIpLHRoaXM7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXRvU3RyaW5nKHQpe3JldHVybiBqZSh0aGlzLHQpfX1mdW5jdGlvbiBUZSh0LGUpe3JldHVybiB0LWV9emUucHJvdG90eXBlLmtsYXNzPSJNYXRyaXgiLCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiYoemUucHJvdG90eXBlW1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tIildPWZ1bmN0aW9uKCl7cmV0dXJuIGplKHRoaXMpfSksemUucmFuZG9tPXplLnJhbmQsemUucmFuZG9tSW50PXplLnJhbmRJbnQsemUuZGlhZ29uYWw9emUuZGlhZyx6ZS5wcm90b3R5cGUuZGlhZ29uYWw9emUucHJvdG90eXBlLmRpYWcsemUuaWRlbnRpdHk9emUuZXllLHplLnByb3RvdHlwZS5uZWdhdGU9emUucHJvdG90eXBlLm5lZyx6ZS5wcm90b3R5cGUudGVuc29yUHJvZHVjdD16ZS5wcm90b3R5cGUua3JvbmVja2VyUHJvZHVjdDtjbGFzcyBWZSBleHRlbmRzIHple2NvbnN0cnVjdG9yKHQsZSl7aWYoc3VwZXIoKSxWZS5pc01hdHJpeCh0KSlyZXR1cm4gdC5jbG9uZSgpO2lmKE51bWJlci5pc0ludGVnZXIodCkmJnQ+PTApe2lmKHRoaXMuZGF0YT1bXSwhKE51bWJlci5pc0ludGVnZXIoZSkmJmU+PTApKXRocm93IG5ldyBUeXBlRXJyb3IoIm5Db2x1bW5zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7Zm9yKGxldCByPTA7cjx0O3IrKyl0aGlzLmRhdGEucHVzaChuZXcgRmxvYXQ2NEFycmF5KGUpKX1lbHNle2lmKCF5ZSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIG9yIGFuIGFycmF5Iik7e2NvbnN0IHI9dDtpZigibnVtYmVyIiE9dHlwZW9mKGU9KHQ9ci5sZW5ndGgpP3JbMF0ubGVuZ3RoOjApKXRocm93IG5ldyBUeXBlRXJyb3IoIkRhdGEgbXVzdCBiZSBhIDJEIGFycmF5IHdpdGggYXQgbGVhc3Qgb25lIGVsZW1lbnQiKTt0aGlzLmRhdGE9W107Zm9yKGxldCBuPTA7bjx0O24rKyl7aWYocltuXS5sZW5ndGghPT1lKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmNvbnNpc3RlbnQgYXJyYXkgZGltZW5zaW9ucyIpO3RoaXMuZGF0YS5wdXNoKEZsb2F0NjRBcnJheS5mcm9tKHJbbl0pKX19fXRoaXMucm93cz10LHRoaXMuY29sdW1ucz1lfXNldCh0LGUscil7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXT1yLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXX1yZW1vdmVSb3codCl7cmV0dXJuIEFlKHRoaXMsdCksdGhpcy5kYXRhLnNwbGljZSh0LDEpLHRoaXMucm93cy09MSx0aGlzfWFkZFJvdyh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10LHQ9dGhpcy5yb3dzKSxBZSh0aGlzLHQsITApLGU9RmxvYXQ2NEFycmF5LmZyb20oUmUodGhpcyxlKSksdGhpcy5kYXRhLnNwbGljZSh0LDAsZSksdGhpcy5yb3dzKz0xLHRoaXN9cmVtb3ZlQ29sdW1uKHQpe0NlKHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXtjb25zdCByPW5ldyBGbG9hdDY0QXJyYXkodGhpcy5jb2x1bW5zLTEpO2ZvcihsZXQgbj0wO248dDtuKyspcltuXT10aGlzLmRhdGFbZV1bbl07Zm9yKGxldCBuPXQrMTtuPHRoaXMuY29sdW1ucztuKyspcltuLTFdPXRoaXMuZGF0YVtlXVtuXTt0aGlzLmRhdGFbZV09cn1yZXR1cm4gdGhpcy5jb2x1bW5zLT0xLHRoaXN9YWRkQ29sdW1uKHQsZSl7dm9pZCAwPT09ZSYmKGU9dCx0PXRoaXMuY29sdW1ucyksQ2UodGhpcyx0LCEwKSxlPUllKHRoaXMsZSk7Zm9yKGxldCByPTA7cjx0aGlzLnJvd3M7cisrKXtjb25zdCBuPW5ldyBGbG9hdDY0QXJyYXkodGhpcy5jb2x1bW5zKzEpO2xldCBvPTA7Zm9yKDtvPHQ7bysrKW5bb109dGhpcy5kYXRhW3JdW29dO2ZvcihuW28rK109ZVtyXTtvPHRoaXMuY29sdW1ucysxO28rKyluW29dPXRoaXMuZGF0YVtyXVtvLTFdO3RoaXMuZGF0YVtyXT1ufXJldHVybiB0aGlzLmNvbHVtbnMrPTEsdGhpc319IWZ1bmN0aW9uKHQsZSl7dC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmFkZFModCk6dGhpcy5hZGRNKHQpfSx0LnByb3RvdHlwZS5hZGRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikrdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmFkZE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpK3QuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmFkZD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5hZGQocil9LHQucHJvdG90eXBlLnN1Yj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5zdWJTKHQpOnRoaXMuc3ViTSh0KX0sdC5wcm90b3R5cGUuc3ViUz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpLXQpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5zdWJNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKS10LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5zdWI9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbmV3IGUodCkuc3ViKHIpfSx0LnByb3RvdHlwZS5zdWJ0cmFjdD10LnByb3RvdHlwZS5zdWIsdC5wcm90b3R5cGUuc3VidHJhY3RTPXQucHJvdG90eXBlLnN1YlMsdC5wcm90b3R5cGUuc3VidHJhY3RNPXQucHJvdG90eXBlLnN1Yk0sdC5zdWJ0cmFjdD10LnN1Yix0LnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMubXVsUyh0KTp0aGlzLm11bE0odCl9LHQucHJvdG90eXBlLm11bFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSp0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubXVsTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikqdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQubXVsPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLm11bChyKX0sdC5wcm90b3R5cGUubXVsdGlwbHk9dC5wcm90b3R5cGUubXVsLHQucHJvdG90eXBlLm11bHRpcGx5Uz10LnByb3RvdHlwZS5tdWxTLHQucHJvdG90eXBlLm11bHRpcGx5TT10LnByb3RvdHlwZS5tdWxNLHQubXVsdGlwbHk9dC5tdWwsdC5wcm90b3R5cGUuZGl2PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLmRpdlModCk6dGhpcy5kaXZNKHQpfSx0LnByb3RvdHlwZS5kaXZTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikvdCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmRpdk09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpL3QuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmRpdj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5kaXYocil9LHQucHJvdG90eXBlLmRpdmlkZT10LnByb3RvdHlwZS5kaXYsdC5wcm90b3R5cGUuZGl2aWRlUz10LnByb3RvdHlwZS5kaXZTLHQucHJvdG90eXBlLmRpdmlkZU09dC5wcm90b3R5cGUuZGl2TSx0LmRpdmlkZT10LmRpdix0LnByb3RvdHlwZS5tb2Q9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMubW9kUyh0KTp0aGlzLm1vZE0odCl9LHQucHJvdG90eXBlLm1vZFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSV0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubW9kTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikldC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQubW9kPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLm1vZChyKX0sdC5wcm90b3R5cGUubW9kdWx1cz10LnByb3RvdHlwZS5tb2QsdC5wcm90b3R5cGUubW9kdWx1c1M9dC5wcm90b3R5cGUubW9kUyx0LnByb3RvdHlwZS5tb2R1bHVzTT10LnByb3RvdHlwZS5tb2RNLHQubW9kdWx1cz10Lm1vZCx0LnByb3RvdHlwZS5hbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuYW5kUyh0KTp0aGlzLmFuZE0odCl9LHQucHJvdG90eXBlLmFuZFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKSZ0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuYW5kTT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscikmdC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuYW5kPWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLmFuZChyKX0sdC5wcm90b3R5cGUub3I9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMub3JTKHQpOnRoaXMub3JNKHQpfSx0LnByb3RvdHlwZS5vclM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKXx0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUub3JNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKXx0LmdldChlLHIpKTtyZXR1cm4gdGhpc30sdC5vcj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5vcihyKX0sdC5wcm90b3R5cGUueG9yPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnhvclModCk6dGhpcy54b3JNKHQpfSx0LnByb3RvdHlwZS54b3JTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUsciledCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnhvck09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpXnQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0Lnhvcj1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS54b3Iocil9LHQucHJvdG90eXBlLmxlZnRTaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy5sZWZ0U2hpZnRTKHQpOnRoaXMubGVmdFNoaWZ0TSh0KX0sdC5wcm90b3R5cGUubGVmdFNoaWZ0Uz1mdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPDx0KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubGVmdFNoaWZ0TT1mdW5jdGlvbih0KXtpZih0PWUuY2hlY2tNYXRyaXgodCksdGhpcy5yb3dzIT09dC5yb3dzfHx0aGlzLmNvbHVtbnMhPT10LmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik8PHQuZ2V0KGUscikpO3JldHVybiB0aGlzfSx0LmxlZnRTaGlmdD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5sZWZ0U2hpZnQocil9LHQucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdFModCk6dGhpcy5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0TSh0KX0sdC5wcm90b3R5cGUuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdFM9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+dCk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsdGhpcy5nZXQoZSxyKT4+dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0KHIpfSx0LnByb3RvdHlwZS5yaWdodFNoaWZ0PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnJpZ2h0U2hpZnRTKHQpOnRoaXMucmlnaHRTaGlmdE0odCl9LHQucHJvdG90eXBlLnJpZ2h0U2hpZnRTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLHRoaXMuZ2V0KGUscik+Pj50KTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUucmlnaHRTaGlmdE09ZnVuY3Rpb24odCl7aWYodD1lLmNoZWNrTWF0cml4KHQpLHRoaXMucm93cyE9PXQucm93c3x8dGhpcy5jb2x1bW5zIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCByPTA7cjx0aGlzLmNvbHVtbnM7cisrKXRoaXMuc2V0KGUscix0aGlzLmdldChlLHIpPj4+dC5nZXQoZSxyKSk7cmV0dXJuIHRoaXN9LHQucmlnaHRTaGlmdD1mdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZSh0KS5yaWdodFNoaWZ0KHIpfSx0LnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnQ9dC5wcm90b3R5cGUucmlnaHRTaGlmdCx0LnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnRTPXQucHJvdG90eXBlLnJpZ2h0U2hpZnRTLHQucHJvdG90eXBlLnplcm9GaWxsUmlnaHRTaGlmdE09dC5wcm90b3R5cGUucmlnaHRTaGlmdE0sdC56ZXJvRmlsbFJpZ2h0U2hpZnQ9dC5yaWdodFNoaWZ0LHQucHJvdG90eXBlLm5vdD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLH50aGlzLmdldCh0LGUpKTtyZXR1cm4gdGhpc30sdC5ub3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLm5vdCgpfSx0LnByb3RvdHlwZS5hYnM9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFicyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYWJzPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hYnMoKX0sdC5wcm90b3R5cGUuYWNvcz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWNvcyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYWNvcz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYWNvcygpfSx0LnByb3RvdHlwZS5hY29zaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWNvc2godGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFjb3NoPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hY29zaCgpfSx0LnByb3RvdHlwZS5hc2luPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hc2luKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hc2luPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5hc2luKCl9LHQucHJvdG90eXBlLmFzaW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hc2luaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXNpbmg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmFzaW5oKCl9LHQucHJvdG90eXBlLmF0YW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmF0YW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmF0YW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmF0YW4oKX0sdC5wcm90b3R5cGUuYXRhbmg9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmF0YW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hdGFuaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuYXRhbmgoKX0sdC5wcm90b3R5cGUuY2JydD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2JydCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY2JydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuY2JydCgpfSx0LnByb3RvdHlwZS5jZWlsPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jZWlsKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jZWlsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jZWlsKCl9LHQucHJvdG90eXBlLmNsejMyPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jbHozMih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuY2x6MzI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNsejMyKCl9LHQucHJvdG90eXBlLmNvcz1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY29zKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jb3M9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmNvcygpfSx0LnByb3RvdHlwZS5jb3NoPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jb3NoKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jb3NoPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5jb3NoKCl9LHQucHJvdG90eXBlLmV4cD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZXhwKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5leHA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmV4cCgpfSx0LnByb3RvdHlwZS5leHBtMT1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZXhwbTEodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmV4cG0xPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5leHBtMSgpfSx0LnByb3RvdHlwZS5mbG9vcj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZmxvb3IodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmZsb29yPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5mbG9vcigpfSx0LnByb3RvdHlwZS5mcm91bmQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmZyb3VuZCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5mcm91bmQoKX0sdC5wcm90b3R5cGUubG9nPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2codGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkubG9nKCl9LHQucHJvdG90eXBlLmxvZzFwPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cxcCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMXA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZzFwKCl9LHQucHJvdG90eXBlLmxvZzEwPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cxMCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMTA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZzEwKCl9LHQucHJvdG90eXBlLmxvZzI9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZzIodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZzI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLmxvZzIoKX0sdC5wcm90b3R5cGUucm91bmQ9ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnJvdW5kKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkucm91bmQoKX0sdC5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2lnbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc2lnbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc2lnbigpfSx0LnByb3RvdHlwZS5zaW49ZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc2luPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zaW4oKX0sdC5wcm90b3R5cGUuc2luaD1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2luaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc2luaD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCkuc2luaCgpfSx0LnByb3RvdHlwZS5zcXJ0PWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5zcXJ0KHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zcXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS5zcXJ0KCl9LHQucHJvdG90eXBlLnRhbj1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudGFuKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC50YW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnRhbigpfSx0LnByb3RvdHlwZS50YW5oPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50YW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC50YW5oPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KS50YW5oKCl9LHQucHJvdG90eXBlLnRydW5jPWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50cnVuYyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQudHJ1bmM9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpLnRydW5jKCl9LHQucG93PWZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBlKHQpLnBvdyhyKX0sdC5wcm90b3R5cGUucG93PWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnBvd1ModCk6dGhpcy5wb3dNKHQpfSx0LnByb3RvdHlwZS5wb3dTPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IHI9MDtyPHRoaXMuY29sdW1ucztyKyspdGhpcy5zZXQoZSxyLE1hdGgucG93KHRoaXMuZ2V0KGUsciksdCkpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5wb3dNPWZ1bmN0aW9uKHQpe2lmKHQ9ZS5jaGVja01hdHJpeCh0KSx0aGlzLnJvd3MhPT10LnJvd3N8fHRoaXMuY29sdW1ucyE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgcj0wO3I8dGhpcy5jb2x1bW5zO3IrKyl0aGlzLnNldChlLHIsTWF0aC5wb3codGhpcy5nZXQoZSxyKSx0LmdldChlLHIpKSk7cmV0dXJuIHRoaXN9fSh6ZSxWZSk7Y2xhc3MgUGUgZXh0ZW5kcyB6ZXtjb25zdHJ1Y3Rvcih0LGUscil7c3VwZXIoKSx0aGlzLm1hdHJpeD10LHRoaXMucm93cz1lLHRoaXMuY29sdW1ucz1yfX1jbGFzcyBxZSBleHRlbmRzIFBle2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsdC5jb2x1bW5zLHQucm93cyl9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KGUsdCxyKSx0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQoZSx0KX19Y2xhc3MgJGUgZXh0ZW5kcyB6ZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuZGF0YT10LHRoaXMucm93cz10Lmxlbmd0aCx0aGlzLmNvbHVtbnM9dFswXS5sZW5ndGh9c2V0KHQsZSxyKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdPXIsdGhpc31nZXQodCxlKXtyZXR1cm4gdGhpcy5kYXRhW3RdW2VdfX1mdW5jdGlvbiBEZSh0LGUpe2xldCByPTA7cmV0dXJuIE1hdGguYWJzKHQpPk1hdGguYWJzKGUpPyhyPWUvdCxNYXRoLmFicyh0KSpNYXRoLnNxcnQoMStyKnIpKTowIT09ZT8ocj10L2UsTWF0aC5hYnMoZSkqTWF0aC5zcXJ0KDErcipyKSk6MH1jbGFzcyBVZXtjb25zdHJ1Y3Rvcih0LGU9e30pe2lmKCh0PSRlLmNoZWNrTWF0cml4KHQpKS5pc0VtcHR5KCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggbXVzdCBiZSBub24tZW1wdHkiKTtsZXQgcj10LnJvd3Msbj10LmNvbHVtbnM7Y29uc3R7Y29tcHV0ZUxlZnRTaW5ndWxhclZlY3RvcnM6bz0hMCxjb21wdXRlUmlnaHRTaW5ndWxhclZlY3RvcnM6cz0hMCxhdXRvVHJhbnNwb3NlOmk9ITF9PWU7bGV0IHUsYT1Cb29sZWFuKG8pLGg9Qm9vbGVhbihzKSxsPSExO2lmKHI8bilpZihpKXt1PXQudHJhbnNwb3NlKCkscj11LnJvd3Msbj11LmNvbHVtbnMsbD0hMDtsZXQgZT1hO2E9aCxoPWV9ZWxzZSB1PXQuY2xvbmUoKSxjb25zb2xlLndhcm4oIkNvbXB1dGluZyBTVkQgb24gYSBtYXRyaXggd2l0aCBtb3JlIGNvbHVtbnMgdGhhbiByb3dzLiBDb25zaWRlciBlbmFibGluZyBhdXRvVHJhbnNwb3NlIik7ZWxzZSB1PXQuY2xvbmUoKTtsZXQgYz1NYXRoLm1pbihyLG4pLGY9TWF0aC5taW4ocisxLG4pLG09bmV3IEZsb2F0NjRBcnJheShmKSxnPW5ldyBWZShyLGMpLHA9bmV3IFZlKG4sbiksdz1uZXcgRmxvYXQ2NEFycmF5KG4pLGQ9bmV3IEZsb2F0NjRBcnJheShyKSxiPW5ldyBGbG9hdDY0QXJyYXkoZik7Zm9yKGxldCB0PTA7dDxmO3QrKyliW3RdPXQ7bGV0IHk9TWF0aC5taW4oci0xLG4pLHY9TWF0aC5tYXgoMCxNYXRoLm1pbihuLTIscikpLE09TWF0aC5tYXgoeSx2KTtmb3IobGV0IHQ9MDt0PE07dCsrKXtpZih0PHkpe21bdF09MDtmb3IobGV0IGU9dDtlPHI7ZSsrKW1bdF09RGUobVt0XSx1LmdldChlLHQpKTtpZigwIT09bVt0XSl7dS5nZXQodCx0KTwwJiYobVt0XT0tbVt0XSk7Zm9yKGxldCBlPXQ7ZTxyO2UrKyl1LnNldChlLHQsdS5nZXQoZSx0KS9tW3RdKTt1LnNldCh0LHQsdS5nZXQodCx0KSsxKX1tW3RdPS1tW3RdfWZvcihsZXQgZT10KzE7ZTxuO2UrKyl7aWYodDx5JiYwIT09bVt0XSl7bGV0IG49MDtmb3IobGV0IG89dDtvPHI7bysrKW4rPXUuZ2V0KG8sdCkqdS5nZXQobyxlKTtuPS1uL3UuZ2V0KHQsdCk7Zm9yKGxldCBvPXQ7bzxyO28rKyl1LnNldChvLGUsdS5nZXQobyxlKStuKnUuZ2V0KG8sdCkpfXdbZV09dS5nZXQodCxlKX1pZihhJiZ0PHkpZm9yKGxldCBlPXQ7ZTxyO2UrKylnLnNldChlLHQsdS5nZXQoZSx0KSk7aWYodDx2KXt3W3RdPTA7Zm9yKGxldCBlPXQrMTtlPG47ZSsrKXdbdF09RGUod1t0XSx3W2VdKTtpZigwIT09d1t0XSl7d1t0KzFdPDAmJih3W3RdPTAtd1t0XSk7Zm9yKGxldCBlPXQrMTtlPG47ZSsrKXdbZV0vPXdbdF07d1t0KzFdKz0xfWlmKHdbdF09LXdbdF0sdCsxPHImJjAhPT13W3RdKXtmb3IobGV0IGU9dCsxO2U8cjtlKyspZFtlXT0wO2ZvcihsZXQgZT10KzE7ZTxyO2UrKylmb3IobGV0IHI9dCsxO3I8bjtyKyspZFtlXSs9d1tyXSp1LmdldChlLHIpO2ZvcihsZXQgZT10KzE7ZTxuO2UrKyl7bGV0IG49LXdbZV0vd1t0KzFdO2ZvcihsZXQgbz10KzE7bzxyO28rKyl1LnNldChvLGUsdS5nZXQobyxlKStuKmRbb10pfX1pZihoKWZvcihsZXQgZT10KzE7ZTxuO2UrKylwLnNldChlLHQsd1tlXSl9fWxldCB4PU1hdGgubWluKG4scisxKTtpZih5PG4mJihtW3ldPXUuZ2V0KHkseSkpLHI8eCYmKG1beC0xXT0wKSx2KzE8eCYmKHdbdl09dS5nZXQodix4LTEpKSx3W3gtMV09MCxhKXtmb3IobGV0IHQ9eTt0PGM7dCsrKXtmb3IobGV0IGU9MDtlPHI7ZSsrKWcuc2V0KGUsdCwwKTtnLnNldCh0LHQsMSl9Zm9yKGxldCB0PXktMTt0Pj0wO3QtLSlpZigwIT09bVt0XSl7Zm9yKGxldCBlPXQrMTtlPGM7ZSsrKXtsZXQgbj0wO2ZvcihsZXQgbz10O288cjtvKyspbis9Zy5nZXQobyx0KSpnLmdldChvLGUpO249LW4vZy5nZXQodCx0KTtmb3IobGV0IG89dDtvPHI7bysrKWcuc2V0KG8sZSxnLmdldChvLGUpK24qZy5nZXQobyx0KSl9Zm9yKGxldCBlPXQ7ZTxyO2UrKylnLnNldChlLHQsLWcuZ2V0KGUsdCkpO2cuc2V0KHQsdCwxK2cuZ2V0KHQsdCkpO2ZvcihsZXQgZT0wO2U8dC0xO2UrKylnLnNldChlLHQsMCl9ZWxzZXtmb3IobGV0IGU9MDtlPHI7ZSsrKWcuc2V0KGUsdCwwKTtnLnNldCh0LHQsMSl9fWlmKGgpZm9yKGxldCB0PW4tMTt0Pj0wO3QtLSl7aWYodDx2JiYwIT09d1t0XSlmb3IobGV0IGU9dCsxO2U8bjtlKyspe2xldCByPTA7Zm9yKGxldCBvPXQrMTtvPG47bysrKXIrPXAuZ2V0KG8sdCkqcC5nZXQobyxlKTtyPS1yL3AuZ2V0KHQrMSx0KTtmb3IobGV0IG89dCsxO288bjtvKyspcC5zZXQobyxlLHAuZ2V0KG8sZSkrcipwLmdldChvLHQpKX1mb3IobGV0IGU9MDtlPG47ZSsrKXAuc2V0KGUsdCwwKTtwLnNldCh0LHQsMSl9bGV0IEU9eC0xLFM9TnVtYmVyLkVQU0lMT047Zm9yKDt4PjA7KXtsZXQgdCxlO2Zvcih0PXgtMjt0Pj0tMSYmLTEhPT10O3QtLSl7Y29uc3QgZT1OdW1iZXIuTUlOX1ZBTFVFK1MqTWF0aC5hYnMobVt0XStNYXRoLmFicyhtW3QrMV0pKTtpZihNYXRoLmFicyh3W3RdKTw9ZXx8TnVtYmVyLmlzTmFOKHdbdF0pKXt3W3RdPTA7YnJlYWt9fWlmKHQ9PT14LTIpZT00O2Vsc2V7bGV0IHI7Zm9yKHI9eC0xO3I+PXQmJnIhPT10O3ItLSl7bGV0IGU9KHIhPT14P01hdGguYWJzKHdbcl0pOjApKyhyIT09dCsxP01hdGguYWJzKHdbci0xXSk6MCk7aWYoTWF0aC5hYnMobVtyXSk8PVMqZSl7bVtyXT0wO2JyZWFrfX1yPT09dD9lPTM6cj09PXgtMT9lPTE6KGU9Mix0PXIpfXN3aXRjaCh0KyssZSl7Y2FzZSAxOntsZXQgZT13W3gtMl07d1t4LTJdPTA7Zm9yKGxldCByPXgtMjtyPj10O3ItLSl7bGV0IG89RGUobVtyXSxlKSxzPW1bcl0vbyxpPWUvbztpZihtW3JdPW8sciE9PXQmJihlPS1pKndbci0xXSx3W3ItMV09cyp3W3ItMV0pLGgpZm9yKGxldCB0PTA7dDxuO3QrKylvPXMqcC5nZXQodCxyKStpKnAuZ2V0KHQseC0xKSxwLnNldCh0LHgtMSwtaSpwLmdldCh0LHIpK3MqcC5nZXQodCx4LTEpKSxwLnNldCh0LHIsbyl9YnJlYWt9Y2FzZSAyOntsZXQgZT13W3QtMV07d1t0LTFdPTA7Zm9yKGxldCBuPXQ7bjx4O24rKyl7bGV0IG89RGUobVtuXSxlKSxzPW1bbl0vbyxpPWUvbztpZihtW25dPW8sZT0taSp3W25dLHdbbl09cyp3W25dLGEpZm9yKGxldCBlPTA7ZTxyO2UrKylvPXMqZy5nZXQoZSxuKStpKmcuZ2V0KGUsdC0xKSxnLnNldChlLHQtMSwtaSpnLmdldChlLG4pK3MqZy5nZXQoZSx0LTEpKSxnLnNldChlLG4sbyl9YnJlYWt9Y2FzZSAzOntjb25zdCBlPU1hdGgubWF4KE1hdGguYWJzKG1beC0xXSksTWF0aC5hYnMobVt4LTJdKSxNYXRoLmFicyh3W3gtMl0pLE1hdGguYWJzKG1bdF0pLE1hdGguYWJzKHdbdF0pKSxvPW1beC0xXS9lLHM9bVt4LTJdL2UsaT13W3gtMl0vZSx1PW1bdF0vZSxsPXdbdF0vZSxjPSgocytvKSoocy1vKStpKmkpLzIsZj1vKmkqKG8qaSk7bGV0IGQ9MDswPT09YyYmMD09PWZ8fChkPWM8MD8wLU1hdGguc3FydChjKmMrZik6TWF0aC5zcXJ0KGMqYytmKSxkPWYvKGMrZCkpO2xldCBiPSh1K28pKih1LW8pK2QseT11Kmw7Zm9yKGxldCBlPXQ7ZTx4LTE7ZSsrKXtsZXQgbz1EZShiLHkpOzA9PT1vJiYobz1OdW1iZXIuTUlOX1ZBTFVFKTtsZXQgcz1iL28saT15L287aWYoZSE9PXQmJih3W2UtMV09byksYj1zKm1bZV0raSp3W2VdLHdbZV09cyp3W2VdLWkqbVtlXSx5PWkqbVtlKzFdLG1bZSsxXT1zKm1bZSsxXSxoKWZvcihsZXQgdD0wO3Q8bjt0Kyspbz1zKnAuZ2V0KHQsZSkraSpwLmdldCh0LGUrMSkscC5zZXQodCxlKzEsLWkqcC5nZXQodCxlKStzKnAuZ2V0KHQsZSsxKSkscC5zZXQodCxlLG8pO2lmKG89RGUoYix5KSwwPT09byYmKG89TnVtYmVyLk1JTl9WQUxVRSkscz1iL28saT15L28sbVtlXT1vLGI9cyp3W2VdK2kqbVtlKzFdLG1bZSsxXT0taSp3W2VdK3MqbVtlKzFdLHk9aSp3W2UrMV0sd1tlKzFdPXMqd1tlKzFdLGEmJmU8ci0xKWZvcihsZXQgdD0wO3Q8cjt0Kyspbz1zKmcuZ2V0KHQsZSkraSpnLmdldCh0LGUrMSksZy5zZXQodCxlKzEsLWkqZy5nZXQodCxlKStzKmcuZ2V0KHQsZSsxKSksZy5zZXQodCxlLG8pfXdbeC0yXT1iO2JyZWFrfWNhc2UgNDppZihtW3RdPD0wJiYobVt0XT1tW3RdPDA/LW1bdF06MCxoKSlmb3IobGV0IGU9MDtlPD1FO2UrKylwLnNldChlLHQsLXAuZ2V0KGUsdCkpO2Zvcig7dDxFJiYhKG1bdF0+PW1bdCsxXSk7KXtsZXQgZT1tW3RdO2lmKG1bdF09bVt0KzFdLG1bdCsxXT1lLGgmJnQ8bi0xKWZvcihsZXQgcj0wO3I8bjtyKyspZT1wLmdldChyLHQrMSkscC5zZXQocix0KzEscC5nZXQocix0KSkscC5zZXQocix0LGUpO2lmKGEmJnQ8ci0xKWZvcihsZXQgbj0wO248cjtuKyspZT1nLmdldChuLHQrMSksZy5zZXQobix0KzEsZy5nZXQobix0KSksZy5zZXQobix0LGUpO3QrK314LS19fWlmKGwpe2xldCB0PXA7cD1nLGc9dH10aGlzLm09cix0aGlzLm49bix0aGlzLnM9bSx0aGlzLlU9Zyx0aGlzLlY9cH1zb2x2ZSh0KXtsZXQgZT10LHI9dGhpcy50aHJlc2hvbGQsbj10aGlzLnMubGVuZ3RoLG89VmUuemVyb3MobixuKTtmb3IobGV0IHQ9MDt0PG47dCsrKU1hdGguYWJzKHRoaXMuc1t0XSk8PXI/by5zZXQodCx0LDApOm8uc2V0KHQsdCwxL3RoaXMuc1t0XSk7bGV0IHM9dGhpcy5VLGk9dGhpcy5yaWdodFNpbmd1bGFyVmVjdG9ycyx1PWkubW11bChvKSxhPWkucm93cyxoPXMucm93cyxsPVZlLnplcm9zKGEsaCk7Zm9yKGxldCB0PTA7dDxhO3QrKylmb3IobGV0IGU9MDtlPGg7ZSsrKXtsZXQgcj0wO2ZvcihsZXQgbz0wO288bjtvKyspcis9dS5nZXQodCxvKSpzLmdldChlLG8pO2wuc2V0KHQsZSxyKX1yZXR1cm4gbC5tbXVsKGUpfXNvbHZlRm9yRGlhZ29uYWwodCl7cmV0dXJuIHRoaXMuc29sdmUoVmUuZGlhZyh0KSl9aW52ZXJzZSgpe2xldCB0PXRoaXMuVixlPXRoaXMudGhyZXNob2xkLHI9dC5yb3dzLG49dC5jb2x1bW5zLG89bmV3IFZlKHIsdGhpcy5zLmxlbmd0aCk7Zm9yKGxldCBzPTA7czxyO3MrKylmb3IobGV0IHI9MDtyPG47cisrKU1hdGguYWJzKHRoaXMuc1tyXSk+ZSYmby5zZXQocyxyLHQuZ2V0KHMscikvdGhpcy5zW3JdKTtsZXQgcz10aGlzLlUsaT1zLnJvd3MsdT1zLmNvbHVtbnMsYT1uZXcgVmUocixpKTtmb3IobGV0IHQ9MDt0PHI7dCsrKWZvcihsZXQgZT0wO2U8aTtlKyspe2xldCByPTA7Zm9yKGxldCBuPTA7bjx1O24rKylyKz1vLmdldCh0LG4pKnMuZ2V0KGUsbik7YS5zZXQodCxlLHIpfXJldHVybiBhfWdldCBjb25kaXRpb24oKXtyZXR1cm4gdGhpcy5zWzBdL3RoaXMuc1tNYXRoLm1pbih0aGlzLm0sdGhpcy5uKS0xXX1nZXQgbm9ybTIoKXtyZXR1cm4gdGhpcy5zWzBdfWdldCByYW5rKCl7bGV0IHQ9TWF0aC5tYXgodGhpcy5tLHRoaXMubikqdGhpcy5zWzBdKk51bWJlci5FUFNJTE9OLGU9MCxyPXRoaXMucztmb3IobGV0IG49MCxvPXIubGVuZ3RoO248bztuKyspcltuXT50JiZlKys7cmV0dXJuIGV9Z2V0IGRpYWdvbmFsKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5zKX1nZXQgdGhyZXNob2xkKCl7cmV0dXJuIE51bWJlci5FUFNJTE9OLzIqTWF0aC5tYXgodGhpcy5tLHRoaXMubikqdGhpcy5zWzBdfWdldCBsZWZ0U2luZ3VsYXJWZWN0b3JzKCl7cmV0dXJuIHRoaXMuVX1nZXQgcmlnaHRTaW5ndWxhclZlY3RvcnMoKXtyZXR1cm4gdGhpcy5WfWdldCBkaWFnb25hbE1hdHJpeCgpe3JldHVybiBWZS5kaWFnKHRoaXMucyl9fWNsYXNzIExle2NvbnN0cnVjdG9yKHQsZT17fSl7Y29uc3R7YXNzdW1lU3ltbWV0cmljOnI9ITF9PWU7aWYoISh0PSRlLmNoZWNrTWF0cml4KHQpKS5pc1NxdWFyZSgpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IGlzIG5vdCBhIHNxdWFyZSBtYXRyaXgiKTtpZih0LmlzRW1wdHkoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBtdXN0IGJlIG5vbi1lbXB0eSIpO2xldCBuLG8scz10LmNvbHVtbnMsaT1uZXcgVmUocyxzKSx1PW5ldyBGbG9hdDY0QXJyYXkocyksYT1uZXcgRmxvYXQ2NEFycmF5KHMpLGg9dCxsPSExO2lmKGw9ISFyfHx0LmlzU3ltbWV0cmljKCksbCl7Zm9yKG49MDtuPHM7bisrKWZvcihvPTA7bzxzO28rKylpLnNldChuLG8saC5nZXQobixvKSk7IWZ1bmN0aW9uKHQsZSxyLG4pe2xldCBvLHMsaSx1LGEsaCxsLGM7Zm9yKGE9MDthPHQ7YSsrKXJbYV09bi5nZXQodC0xLGEpO2Zvcih1PXQtMTt1PjA7dS0tKXtmb3IoYz0wLGk9MCxoPTA7aDx1O2grKyljKz1NYXRoLmFicyhyW2hdKTtpZigwPT09Yylmb3IoZVt1XT1yW3UtMV0sYT0wO2E8dTthKyspclthXT1uLmdldCh1LTEsYSksbi5zZXQodSxhLDApLG4uc2V0KGEsdSwwKTtlbHNle2ZvcihoPTA7aDx1O2grKylyW2hdLz1jLGkrPXJbaF0qcltoXTtmb3Iobz1yW3UtMV0scz1NYXRoLnNxcnQoaSksbz4wJiYocz0tcyksZVt1XT1jKnMsaS09bypzLHJbdS0xXT1vLXMsYT0wO2E8dTthKyspZVthXT0wO2ZvcihhPTA7YTx1O2ErKyl7Zm9yKG89clthXSxuLnNldChhLHUsbykscz1lW2FdK24uZ2V0KGEsYSkqbyxoPWErMTtoPD11LTE7aCsrKXMrPW4uZ2V0KGgsYSkqcltoXSxlW2hdKz1uLmdldChoLGEpKm87ZVthXT1zfWZvcihvPTAsYT0wO2E8dTthKyspZVthXS89aSxvKz1lW2FdKnJbYV07Zm9yKGw9by8oaStpKSxhPTA7YTx1O2ErKyllW2FdLT1sKnJbYV07Zm9yKGE9MDthPHU7YSsrKXtmb3Iobz1yW2FdLHM9ZVthXSxoPWE7aDw9dS0xO2grKyluLnNldChoLGEsbi5nZXQoaCxhKS0obyplW2hdK3MqcltoXSkpO3JbYV09bi5nZXQodS0xLGEpLG4uc2V0KHUsYSwwKX19clt1XT1pfWZvcih1PTA7dTx0LTE7dSsrKXtpZihuLnNldCh0LTEsdSxuLmdldCh1LHUpKSxuLnNldCh1LHUsMSksaT1yW3UrMV0sMCE9PWkpe2ZvcihoPTA7aDw9dTtoKyspcltoXT1uLmdldChoLHUrMSkvaTtmb3IoYT0wO2E8PXU7YSsrKXtmb3Iocz0wLGg9MDtoPD11O2grKylzKz1uLmdldChoLHUrMSkqbi5nZXQoaCxhKTtmb3IoaD0wO2g8PXU7aCsrKW4uc2V0KGgsYSxuLmdldChoLGEpLXMqcltoXSl9fWZvcihoPTA7aDw9dTtoKyspbi5zZXQoaCx1KzEsMCl9Zm9yKGE9MDthPHQ7YSsrKXJbYV09bi5nZXQodC0xLGEpLG4uc2V0KHQtMSxhLDApO24uc2V0KHQtMSx0LTEsMSksZVswXT0wfShzLGEsdSxpKSxmdW5jdGlvbih0LGUscixuKXtsZXQgbyxzLGksdSxhLGgsbCxjLGYsbSxnLHAsdyxkLGIseTtmb3IoaT0xO2k8dDtpKyspZVtpLTFdPWVbaV07ZVt0LTFdPTA7bGV0IHY9MCxNPTAseD1OdW1iZXIuRVBTSUxPTjtmb3IoaD0wO2g8dDtoKyspe2ZvcihNPU1hdGgubWF4KE0sTWF0aC5hYnMocltoXSkrTWF0aC5hYnMoZVtoXSkpLGw9aDtsPHQmJiEoTWF0aC5hYnMoZVtsXSk8PXgqTSk7KWwrKztpZihsPmgpZG97Zm9yKG89cltoXSxjPShyW2grMV0tbykvKDIqZVtoXSksZj1EZShjLDEpLGM8MCYmKGY9LWYpLHJbaF09ZVtoXS8oYytmKSxyW2grMV09ZVtoXSooYytmKSxtPXJbaCsxXSxzPW8tcltoXSxpPWgrMjtpPHQ7aSsrKXJbaV0tPXM7Zm9yKHYrPXMsYz1yW2xdLGc9MSxwPWcsdz1nLGQ9ZVtoKzFdLGI9MCx5PTAsaT1sLTE7aT49aDtpLS0pZm9yKHc9cCxwPWcseT1iLG89ZyplW2ldLHM9ZypjLGY9RGUoYyxlW2ldKSxlW2krMV09YipmLGI9ZVtpXS9mLGc9Yy9mLGM9ZypyW2ldLWIqbyxyW2krMV09cytiKihnKm8rYipyW2ldKSxhPTA7YTx0O2ErKylzPW4uZ2V0KGEsaSsxKSxuLnNldChhLGkrMSxiKm4uZ2V0KGEsaSkrZypzKSxuLnNldChhLGksZypuLmdldChhLGkpLWIqcyk7Yz0tYip5KncqZCplW2hdL20sZVtoXT1iKmMscltoXT1nKmN9d2hpbGUoTWF0aC5hYnMoZVtoXSk+eCpNKTtyW2hdPXJbaF0rdixlW2hdPTB9Zm9yKGk9MDtpPHQtMTtpKyspe2ZvcihhPWksYz1yW2ldLHU9aSsxO3U8dDt1Kyspclt1XTxjJiYoYT11LGM9clt1XSk7aWYoYSE9PWkpZm9yKHJbYV09cltpXSxyW2ldPWMsdT0wO3U8dDt1KyspYz1uLmdldCh1LGkpLG4uc2V0KHUsaSxuLmdldCh1LGEpKSxuLnNldCh1LGEsYyl9fShzLGEsdSxpKX1lbHNle2xldCB0PW5ldyBWZShzLHMpLGU9bmV3IEZsb2F0NjRBcnJheShzKTtmb3Iobz0wO288cztvKyspZm9yKG49MDtuPHM7bisrKXQuc2V0KG4sbyxoLmdldChuLG8pKTshZnVuY3Rpb24odCxlLHIsbil7bGV0IG8scyxpLHUsYSxoLGwsYz0wLGY9dC0xO2ZvcihoPWMrMTtoPD1mLTE7aCsrKXtmb3IobD0wLHU9aDt1PD1mO3UrKylsKz1NYXRoLmFicyhlLmdldCh1LGgtMSkpO2lmKDAhPT1sKXtmb3IoaT0wLHU9Zjt1Pj1oO3UtLSlyW3VdPWUuZ2V0KHUsaC0xKS9sLGkrPXJbdV0qclt1XTtmb3Iocz1NYXRoLnNxcnQoaSkscltoXT4wJiYocz0tcyksaS09cltoXSpzLHJbaF09cltoXS1zLGE9aDthPHQ7YSsrKXtmb3Iobz0wLHU9Zjt1Pj1oO3UtLSlvKz1yW3VdKmUuZ2V0KHUsYSk7Zm9yKG8vPWksdT1oO3U8PWY7dSsrKWUuc2V0KHUsYSxlLmdldCh1LGEpLW8qclt1XSl9Zm9yKHU9MDt1PD1mO3UrKyl7Zm9yKG89MCxhPWY7YT49aDthLS0pbys9clthXSplLmdldCh1LGEpO2ZvcihvLz1pLGE9aDthPD1mO2ErKyllLnNldCh1LGEsZS5nZXQodSxhKS1vKnJbYV0pfXJbaF09bCpyW2hdLGUuc2V0KGgsaC0xLGwqcyl9fWZvcih1PTA7dTx0O3UrKylmb3IoYT0wO2E8dDthKyspbi5zZXQodSxhLHU9PT1hPzE6MCk7Zm9yKGg9Zi0xO2g+PWMrMTtoLS0paWYoMCE9PWUuZ2V0KGgsaC0xKSl7Zm9yKHU9aCsxO3U8PWY7dSsrKXJbdV09ZS5nZXQodSxoLTEpO2ZvcihhPWg7YTw9ZjthKyspe2ZvcihzPTAsdT1oO3U8PWY7dSsrKXMrPXJbdV0qbi5nZXQodSxhKTtmb3Iocz1zL3JbaF0vZS5nZXQoaCxoLTEpLHU9aDt1PD1mO3UrKyluLnNldCh1LGEsbi5nZXQodSxhKStzKnJbdV0pfX19KHMsdCxlLGkpLGZ1bmN0aW9uKHQsZSxyLG4sbyl7bGV0IHMsaSx1LGEsaCxsLGMsZixtLGcscCx3LGQsYix5LHY9dC0xLE09MCx4PXQtMSxFPU51bWJlci5FUFNJTE9OLFM9MCxqPTAsXz0wLEE9MCxDPTAsUj0wLEk9MCxrPTA7Zm9yKHM9MDtzPHQ7cysrKWZvcigoczxNfHxzPngpJiYocltzXT1vLmdldChzLHMpLGVbc109MCksaT1NYXRoLm1heChzLTEsMCk7aTx0O2krKylqKz1NYXRoLmFicyhvLmdldChzLGkpKTtmb3IoO3Y+PU07KXtmb3IoYT12O2E+TSYmKFI9TWF0aC5hYnMoby5nZXQoYS0xLGEtMSkpK01hdGguYWJzKG8uZ2V0KGEsYSkpLDA9PT1SJiYoUj1qKSwhKE1hdGguYWJzKG8uZ2V0KGEsYS0xKSk8RSpSKSk7KWEtLTtpZihhPT09dilvLnNldCh2LHYsby5nZXQodix2KStTKSxyW3ZdPW8uZ2V0KHYsdiksZVt2XT0wLHYtLSxrPTA7ZWxzZSBpZihhPT09di0xKXtpZihjPW8uZ2V0KHYsdi0xKSpvLmdldCh2LTEsdiksXz0oby5nZXQodi0xLHYtMSktby5nZXQodix2KSkvMixBPV8qXytjLEk9TWF0aC5zcXJ0KE1hdGguYWJzKEEpKSxvLnNldCh2LHYsby5nZXQodix2KStTKSxvLnNldCh2LTEsdi0xLG8uZ2V0KHYtMSx2LTEpK1MpLGY9by5nZXQodix2KSxBPj0wKXtmb3IoST1fPj0wP18rSTpfLUksclt2LTFdPWYrSSxyW3ZdPXJbdi0xXSwwIT09SSYmKHJbdl09Zi1jL0kpLGVbdi0xXT0wLGVbdl09MCxmPW8uZ2V0KHYsdi0xKSxSPU1hdGguYWJzKGYpK01hdGguYWJzKEkpLF89Zi9SLEE9SS9SLEM9TWF0aC5zcXJ0KF8qXytBKkEpLF8vPUMsQS89QyxpPXYtMTtpPHQ7aSsrKUk9by5nZXQodi0xLGkpLG8uc2V0KHYtMSxpLEEqSStfKm8uZ2V0KHYsaSkpLG8uc2V0KHYsaSxBKm8uZ2V0KHYsaSktXypJKTtmb3Iocz0wO3M8PXY7cysrKUk9by5nZXQocyx2LTEpLG8uc2V0KHMsdi0xLEEqSStfKm8uZ2V0KHMsdikpLG8uc2V0KHMsdixBKm8uZ2V0KHMsdiktXypJKTtmb3Iocz1NO3M8PXg7cysrKUk9bi5nZXQocyx2LTEpLG4uc2V0KHMsdi0xLEEqSStfKm4uZ2V0KHMsdikpLG4uc2V0KHMsdixBKm4uZ2V0KHMsdiktXypJKX1lbHNlIHJbdi0xXT1mK18sclt2XT1mK18sZVt2LTFdPUksZVt2XT0tSTt2LT0yLGs9MH1lbHNle2lmKGY9by5nZXQodix2KSxtPTAsYz0wLGE8diYmKG09by5nZXQodi0xLHYtMSksYz1vLmdldCh2LHYtMSkqby5nZXQodi0xLHYpKSwxMD09PWspe2ZvcihTKz1mLHM9TTtzPD12O3MrKylvLnNldChzLHMsby5nZXQocyxzKS1mKTtSPU1hdGguYWJzKG8uZ2V0KHYsdi0xKSkrTWF0aC5hYnMoby5nZXQodi0xLHYtMikpLGY9bT0uNzUqUixjPS0uNDM3NSpSKlJ9aWYoMzA9PT1rJiYoUj0obS1mKS8yLFI9UipSK2MsUj4wKSl7Zm9yKFI9TWF0aC5zcXJ0KFIpLG08ZiYmKFI9LVIpLFI9Zi1jLygobS1mKS8yK1IpLHM9TTtzPD12O3MrKylvLnNldChzLHMsby5nZXQocyxzKS1SKTtTKz1SLGY9bT1jPS45NjR9Zm9yKGsrPTEsaD12LTI7aD49YSYmKEk9by5nZXQoaCxoKSxDPWYtSSxSPW0tSSxfPShDKlItYykvby5nZXQoaCsxLGgpK28uZ2V0KGgsaCsxKSxBPW8uZ2V0KGgrMSxoKzEpLUktQy1SLEM9by5nZXQoaCsyLGgrMSksUj1NYXRoLmFicyhfKStNYXRoLmFicyhBKStNYXRoLmFicyhDKSxfLz1SLEEvPVIsQy89UixoIT09YSkmJiEoTWF0aC5hYnMoby5nZXQoaCxoLTEpKSooTWF0aC5hYnMoQSkrTWF0aC5hYnMoQykpPEUqKE1hdGguYWJzKF8pKihNYXRoLmFicyhvLmdldChoLTEsaC0xKSkrTWF0aC5hYnMoSSkrTWF0aC5hYnMoby5nZXQoaCsxLGgrMSkpKSkpOyloLS07Zm9yKHM9aCsyO3M8PXY7cysrKW8uc2V0KHMscy0yLDApLHM+aCsyJiZvLnNldChzLHMtMywwKTtmb3IodT1oO3U8PXYtMSYmKGI9dSE9PXYtMSx1IT09aCYmKF89by5nZXQodSx1LTEpLEE9by5nZXQodSsxLHUtMSksQz1iP28uZ2V0KHUrMix1LTEpOjAsZj1NYXRoLmFicyhfKStNYXRoLmFicyhBKStNYXRoLmFicyhDKSwwIT09ZiYmKF8vPWYsQS89ZixDLz1mKSksMCE9PWYpO3UrKylpZihSPU1hdGguc3FydChfKl8rQSpBK0MqQyksXzwwJiYoUj0tUiksMCE9PVIpe2Zvcih1IT09aD9vLnNldCh1LHUtMSwtUipmKTphIT09aCYmby5zZXQodSx1LTEsLW8uZ2V0KHUsdS0xKSksXys9UixmPV8vUixtPUEvUixJPUMvUixBLz1fLEMvPV8saT11O2k8dDtpKyspXz1vLmdldCh1LGkpK0Eqby5nZXQodSsxLGkpLGImJihfKz1DKm8uZ2V0KHUrMixpKSxvLnNldCh1KzIsaSxvLmdldCh1KzIsaSktXypJKSksby5zZXQodSxpLG8uZ2V0KHUsaSktXypmKSxvLnNldCh1KzEsaSxvLmdldCh1KzEsaSktXyptKTtmb3Iocz0wO3M8PU1hdGgubWluKHYsdSszKTtzKyspXz1mKm8uZ2V0KHMsdSkrbSpvLmdldChzLHUrMSksYiYmKF8rPUkqby5nZXQocyx1KzIpLG8uc2V0KHMsdSsyLG8uZ2V0KHMsdSsyKS1fKkMpKSxvLnNldChzLHUsby5nZXQocyx1KS1fKSxvLnNldChzLHUrMSxvLmdldChzLHUrMSktXypBKTtmb3Iocz1NO3M8PXg7cysrKV89ZipuLmdldChzLHUpK20qbi5nZXQocyx1KzEpLGImJihfKz1JKm4uZ2V0KHMsdSsyKSxuLnNldChzLHUrMixuLmdldChzLHUrMiktXypDKSksbi5zZXQocyx1LG4uZ2V0KHMsdSktXyksbi5zZXQocyx1KzEsbi5nZXQocyx1KzEpLV8qQSl9fX1pZigwPT09ailyZXR1cm47Zm9yKHY9dC0xO3Y+PTA7di0tKWlmKF89clt2XSxBPWVbdl0sMD09PUEpZm9yKGE9dixvLnNldCh2LHYsMSkscz12LTE7cz49MDtzLS0pe2ZvcihjPW8uZ2V0KHMscyktXyxDPTAsaT1hO2k8PXY7aSsrKUMrPW8uZ2V0KHMsaSkqby5nZXQoaSx2KTtpZihlW3NdPDApST1jLFI9QztlbHNlIGlmKGE9cywwPT09ZVtzXT9vLnNldChzLHYsMCE9PWM/LUMvYzotQy8oRSpqKSk6KGY9by5nZXQocyxzKzEpLG09by5nZXQocysxLHMpLEE9KHJbc10tXykqKHJbc10tXykrZVtzXSplW3NdLGw9KGYqUi1JKkMpL0Esby5zZXQocyx2LGwpLG8uc2V0KHMrMSx2LE1hdGguYWJzKGYpPk1hdGguYWJzKEkpPygtQy1jKmwpL2Y6KC1SLW0qbCkvSSkpLGw9TWF0aC5hYnMoby5nZXQocyx2KSksRSpsKmw+MSlmb3IoaT1zO2k8PXY7aSsrKW8uc2V0KGksdixvLmdldChpLHYpL2wpfWVsc2UgaWYoQTwwKWZvcihhPXYtMSxNYXRoLmFicyhvLmdldCh2LHYtMSkpPk1hdGguYWJzKG8uZ2V0KHYtMSx2KSk/KG8uc2V0KHYtMSx2LTEsQS9vLmdldCh2LHYtMSkpLG8uc2V0KHYtMSx2LC0oby5nZXQodix2KS1fKS9vLmdldCh2LHYtMSkpKTooeT1CZSgwLC1vLmdldCh2LTEsdiksby5nZXQodi0xLHYtMSktXyxBKSxvLnNldCh2LTEsdi0xLHlbMF0pLG8uc2V0KHYtMSx2LHlbMV0pKSxvLnNldCh2LHYtMSwwKSxvLnNldCh2LHYsMSkscz12LTI7cz49MDtzLS0pe2ZvcihnPTAscD0wLGk9YTtpPD12O2krKylnKz1vLmdldChzLGkpKm8uZ2V0KGksdi0xKSxwKz1vLmdldChzLGkpKm8uZ2V0KGksdik7aWYoYz1vLmdldChzLHMpLV8sZVtzXTwwKUk9YyxDPWcsUj1wO2Vsc2UgaWYoYT1zLDA9PT1lW3NdPyh5PUJlKC1nLC1wLGMsQSksby5zZXQocyx2LTEseVswXSksby5zZXQocyx2LHlbMV0pKTooZj1vLmdldChzLHMrMSksbT1vLmdldChzKzEscyksdz0ocltzXS1fKSoocltzXS1fKStlW3NdKmVbc10tQSpBLGQ9MioocltzXS1fKSpBLDA9PT13JiYwPT09ZCYmKHc9RSpqKihNYXRoLmFicyhjKStNYXRoLmFicyhBKStNYXRoLmFicyhmKStNYXRoLmFicyhtKStNYXRoLmFicyhJKSkpLHk9QmUoZipDLUkqZytBKnAsZipSLUkqcC1BKmcsdyxkKSxvLnNldChzLHYtMSx5WzBdKSxvLnNldChzLHYseVsxXSksTWF0aC5hYnMoZik+TWF0aC5hYnMoSSkrTWF0aC5hYnMoQSk/KG8uc2V0KHMrMSx2LTEsKC1nLWMqby5nZXQocyx2LTEpK0Eqby5nZXQocyx2KSkvZiksby5zZXQocysxLHYsKC1wLWMqby5nZXQocyx2KS1BKm8uZ2V0KHMsdi0xKSkvZikpOih5PUJlKC1DLW0qby5nZXQocyx2LTEpLC1SLW0qby5nZXQocyx2KSxJLEEpLG8uc2V0KHMrMSx2LTEseVswXSksby5zZXQocysxLHYseVsxXSkpKSxsPU1hdGgubWF4KE1hdGguYWJzKG8uZ2V0KHMsdi0xKSksTWF0aC5hYnMoby5nZXQocyx2KSkpLEUqbCpsPjEpZm9yKGk9cztpPD12O2krKylvLnNldChpLHYtMSxvLmdldChpLHYtMSkvbCksby5zZXQoaSx2LG8uZ2V0KGksdikvbCl9Zm9yKHM9MDtzPHQ7cysrKWlmKHM8TXx8cz54KWZvcihpPXM7aTx0O2krKyluLnNldChzLGksby5nZXQocyxpKSk7Zm9yKGk9dC0xO2k+PU07aS0tKWZvcihzPU07czw9eDtzKyspe2ZvcihJPTAsdT1NO3U8PU1hdGgubWluKGkseCk7dSsrKUkrPW4uZ2V0KHMsdSkqby5nZXQodSxpKTtuLnNldChzLGksSSl9fShzLGEsdSxpLHQpfXRoaXMubj1zLHRoaXMuZT1hLHRoaXMuZD11LHRoaXMuVj1pfWdldCByZWFsRWlnZW52YWx1ZXMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmQpfWdldCBpbWFnaW5hcnlFaWdlbnZhbHVlcygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuZSl9Z2V0IGVpZ2VudmVjdG9yTWF0cml4KCl7cmV0dXJuIHRoaXMuVn1nZXQgZGlhZ29uYWxNYXRyaXgoKXtsZXQgdCxlLHI9dGhpcy5uLG49dGhpcy5lLG89dGhpcy5kLHM9bmV3IFZlKHIscik7Zm9yKHQ9MDt0PHI7dCsrKXtmb3IoZT0wO2U8cjtlKyspcy5zZXQodCxlLDApO3Muc2V0KHQsdCxvW3RdKSxuW3RdPjA/cy5zZXQodCx0KzEsblt0XSk6blt0XTwwJiZzLnNldCh0LHQtMSxuW3RdKX1yZXR1cm4gc319ZnVuY3Rpb24gQmUodCxlLHIsbil7bGV0IG8scztyZXR1cm4gTWF0aC5hYnMocik+TWF0aC5hYnMobik/KG89bi9yLHM9citvKm4sWyh0K28qZSkvcywoZS1vKnQpL3NdKToobz1yL24scz1uK28qcixbKG8qdCtlKS9zLChvKmUtdCkvc10pfWNsYXNzIEdle2NvbnN0cnVjdG9yKHQsZT17fSl7dD0kZS5jaGVja01hdHJpeCh0KTtsZXR7WTpyfT1lO2NvbnN0e3NjYWxlU2NvcmVzOm49ITEsbWF4SXRlcmF0aW9uczpvPTFlMyx0ZXJtaW5hdGlvbkNyaXRlcmlhOnM9MWUtMTB9PWU7bGV0IGk7aWYocil7aWYocj15ZShyKSYmIm51bWJlciI9PXR5cGVvZiByWzBdP1ZlLmNvbHVtblZlY3RvcihyKTokZS5jaGVja01hdHJpeChyKSxyLnJvd3MhPT10LnJvd3MpdGhyb3cgbmV3IEVycm9yKCJZIHNob3VsZCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiByb3dzIGFzIFgiKTtpPXIuZ2V0Q29sdW1uVmVjdG9yKDApfWVsc2UgaT10LmdldENvbHVtblZlY3RvcigwKTtsZXQgdSxhLGgsbCxjPTE7Zm9yKGxldCBlPTA7ZTxvJiZjPnM7ZSsrKWg9dC50cmFuc3Bvc2UoKS5tbXVsKGkpLmRpdihpLnRyYW5zcG9zZSgpLm1tdWwoaSkuZ2V0KDAsMCkpLGg9aC5kaXYoaC5ub3JtKCkpLHU9dC5tbXVsKGgpLmRpdihoLnRyYW5zcG9zZSgpLm1tdWwoaCkuZ2V0KDAsMCkpLGU+MCYmKGM9dS5jbG9uZSgpLnN1YihsKS5wb3coMikuc3VtKCkpLGw9dS5jbG9uZSgpLHI/KGE9ci50cmFuc3Bvc2UoKS5tbXVsKHUpLmRpdih1LnRyYW5zcG9zZSgpLm1tdWwodSkuZ2V0KDAsMCkpLGE9YS5kaXYoYS5ub3JtKCkpLGk9ci5tbXVsKGEpLmRpdihhLnRyYW5zcG9zZSgpLm1tdWwoYSkuZ2V0KDAsMCkpKTppPXU7aWYocil7bGV0IGU9dC50cmFuc3Bvc2UoKS5tbXVsKHUpLmRpdih1LnRyYW5zcG9zZSgpLm1tdWwodSkuZ2V0KDAsMCkpO2U9ZS5kaXYoZS5ub3JtKCkpO2xldCBuPXQuY2xvbmUoKS5zdWIodS5jbG9uZSgpLm1tdWwoZS50cmFuc3Bvc2UoKSkpLG89aS50cmFuc3Bvc2UoKS5tbXVsKHUpLmRpdih1LnRyYW5zcG9zZSgpLm1tdWwodSkuZ2V0KDAsMCkpLHM9ci5jbG9uZSgpLnN1Yih1LmNsb25lKCkubXVsUyhvLmdldCgwLDApKS5tbXVsKGEudHJhbnNwb3NlKCkpKTt0aGlzLnQ9dSx0aGlzLnA9ZS50cmFuc3Bvc2UoKSx0aGlzLnc9aC50cmFuc3Bvc2UoKSx0aGlzLnE9YSx0aGlzLnU9aSx0aGlzLnM9dS50cmFuc3Bvc2UoKS5tbXVsKHUpLHRoaXMueFJlc2lkdWFsPW4sdGhpcy55UmVzaWR1YWw9cyx0aGlzLmJldGFzPW99ZWxzZSB0aGlzLnc9aC50cmFuc3Bvc2UoKSx0aGlzLnM9dS50cmFuc3Bvc2UoKS5tbXVsKHUpLnNxcnQoKSx0aGlzLnQ9bj91LmNsb25lKCkuZGl2KHRoaXMucy5nZXQoMCwwKSk6dSx0aGlzLnhSZXNpZHVhbD10LnN1Yih1Lm1tdWwoaC50cmFuc3Bvc2UoKSkpfX1jbGFzcyBLZXtjb25zdHJ1Y3Rvcih0LGU9e30pe2lmKCEwPT09dCl7Y29uc3QgdD1lO3JldHVybiB0aGlzLmNlbnRlcj10LmNlbnRlcix0aGlzLnNjYWxlPXQuc2NhbGUsdGhpcy5tZWFucz10Lm1lYW5zLHRoaXMuc3RkZXZzPXQuc3RkZXZzLHRoaXMuVT1WZS5jaGVja01hdHJpeCh0LlUpLHRoaXMuUz10LlMsdGhpcy5SPXQuUix2b2lkKHRoaXMuZXhjbHVkZWRGZWF0dXJlcz10LmV4Y2x1ZGVkRmVhdHVyZXN8fFtdKX10PW5ldyBWZSh0KTtjb25zdHtpc0NvdmFyaWFuY2VNYXRyaXg6cj0hMSxtZXRob2Q6bj0iU1ZEIixuQ29tcE5JUEFMUzpvPTIsY2VudGVyOnM9ITAsc2NhbGU6aT0hMSxpZ25vcmVaZXJvVmFyaWFuY2U6dT0hMX09ZTtpZih0aGlzLmNlbnRlcj1zLHRoaXMuc2NhbGU9aSx0aGlzLm1lYW5zPW51bGwsdGhpcy5zdGRldnM9bnVsbCx0aGlzLmV4Y2x1ZGVkRmVhdHVyZXM9W10scil0aGlzLl9jb21wdXRlRnJvbUNvdmFyaWFuY2VNYXRyaXgodCk7ZWxzZSBzd2l0Y2godGhpcy5fYWRqdXN0KHQsdSksbil7Y2FzZSJjb3ZhcmlhbmNlTWF0cml4Ijp7Y29uc3QgZT1uZXcgcWUodCkubW11bCh0KS5kaXYodC5yb3dzLTEpO3RoaXMuX2NvbXB1dGVGcm9tQ292YXJpYW5jZU1hdHJpeChlKTticmVha31jYXNlIk5JUEFMUyI6dGhpcy5fY29tcHV0ZVdpdGhOSVBBTFModCxvKTticmVhaztjYXNlIlNWRCI6e2NvbnN0IGU9bmV3IFVlKHQse2NvbXB1dGVMZWZ0U2luZ3VsYXJWZWN0b3JzOiExLGNvbXB1dGVSaWdodFNpbmd1bGFyVmVjdG9yczohMCxhdXRvVHJhbnNwb3NlOiEwfSk7dGhpcy5VPWUucmlnaHRTaW5ndWxhclZlY3RvcnM7Y29uc3Qgcj1lLmRpYWdvbmFsLG49W107Zm9yKGNvbnN0IGUgb2YgciluLnB1c2goZSplLyh0LnJvd3MtMSkpO3RoaXMuUz1uO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bmtub3duIG1ldGhvZDogJHtufWApfX1zdGF0aWMgbG9hZCh0KXtpZigic3RyaW5nIiE9dHlwZW9mIHQubmFtZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtb2RlbCBtdXN0IGhhdmUgYSBuYW1lIHByb3BlcnR5Iik7aWYoIlBDQSIhPT10Lm5hbWUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYGludmFsaWQgbW9kZWw6ICR7dC5uYW1lfWApO3JldHVybiBuZXcgS2UoITAsdCl9cHJlZGljdCh0LGU9e30pe2NvbnN0e25Db21wb25lbnRzOnI9dGhpcy5VLmNvbHVtbnN9PWU7aWYodD1uZXcgVmUodCksdGhpcy5jZW50ZXImJih0LnN1YlJvd1ZlY3Rvcih0aGlzLm1lYW5zKSx0aGlzLnNjYWxlKSl7Zm9yKGxldCBlIG9mIHRoaXMuZXhjbHVkZWRGZWF0dXJlcyl0LnJlbW92ZUNvbHVtbihlKTt0LmRpdlJvd1ZlY3Rvcih0aGlzLnN0ZGV2cyl9bGV0IG49dC5tbXVsKHRoaXMuVSk7cmV0dXJuIG4uc3ViTWF0cml4KDAsbi5yb3dzLTEsMCxyLTEpfWludmVydCh0KXtsZXQgZT0odD1WZS5jaGVja01hdHJpeCh0KSkubW11bCh0aGlzLlUudHJhbnNwb3NlKCkpO3JldHVybiB0aGlzLmNlbnRlciYmKHRoaXMuc2NhbGUmJmUubXVsUm93VmVjdG9yKHRoaXMuc3RkZXZzKSxlLmFkZFJvd1ZlY3Rvcih0aGlzLm1lYW5zKSksZX1nZXRFeHBsYWluZWRWYXJpYW5jZSgpe2xldCB0PTA7Zm9yKGNvbnN0IGUgb2YgdGhpcy5TKXQrPWU7cmV0dXJuIHRoaXMuUy5tYXAoKGU9PmUvdCkpfWdldEN1bXVsYXRpdmVWYXJpYW5jZSgpe2xldCB0PXRoaXMuZ2V0RXhwbGFpbmVkVmFyaWFuY2UoKTtmb3IobGV0IGU9MTtlPHQubGVuZ3RoO2UrKyl0W2VdKz10W2UtMV07cmV0dXJuIHR9Z2V0RWlnZW52ZWN0b3JzKCl7cmV0dXJuIHRoaXMuVX1nZXRFaWdlbnZhbHVlcygpe3JldHVybiB0aGlzLlN9Z2V0U3RhbmRhcmREZXZpYXRpb25zKCl7cmV0dXJuIHRoaXMuUy5tYXAoKHQ9Pk1hdGguc3FydCh0KSkpfWdldExvYWRpbmdzKCl7cmV0dXJuIHRoaXMuVS50cmFuc3Bvc2UoKX10b0pTT04oKXtyZXR1cm57bmFtZToiUENBIixjZW50ZXI6dGhpcy5jZW50ZXIsc2NhbGU6dGhpcy5zY2FsZSxtZWFuczp0aGlzLm1lYW5zLHN0ZGV2czp0aGlzLnN0ZGV2cyxVOnRoaXMuVSxTOnRoaXMuUyxleGNsdWRlZEZlYXR1cmVzOnRoaXMuZXhjbHVkZWRGZWF0dXJlc319X2FkanVzdCh0LGUpe2lmKHRoaXMuY2VudGVyKXtjb25zdCByPXQubWVhbigiY29sdW1uIiksbj10aGlzLnNjYWxlP3Quc3RhbmRhcmREZXZpYXRpb24oImNvbHVtbiIse21lYW46cn0pOm51bGw7aWYodGhpcy5tZWFucz1yLHQuc3ViUm93VmVjdG9yKHIpLHRoaXMuc2NhbGUpe2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cisrKWlmKDA9PT1uW3JdKXtpZighZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQ2Fubm90IHNjYWxlIHRoZSBkYXRhc2V0IChzdGFuZGFyZCBkZXZpYXRpb24gaXMgemVybyBhdCBpbmRleCAke3J9YCk7dC5yZW1vdmVDb2x1bW4ociksbi5zcGxpY2UociwxKSx0aGlzLmV4Y2x1ZGVkRmVhdHVyZXMucHVzaChyKSxyLS19dGhpcy5zdGRldnM9bix0LmRpdlJvd1ZlY3RvcihuKX19fV9jb21wdXRlRnJvbUNvdmFyaWFuY2VNYXRyaXgodCl7Y29uc3QgZT1uZXcgTGUodCx7YXNzdW1lU3ltbWV0cmljOiEwfSk7dGhpcy5VPWUuZWlnZW52ZWN0b3JNYXRyaXgsdGhpcy5VLmZsaXBSb3dzKCksdGhpcy5TPWUucmVhbEVpZ2VudmFsdWVzLHRoaXMuUy5yZXZlcnNlKCl9X2NvbXB1dGVXaXRoTklQQUxTKHQsZSl7dGhpcy5VPW5ldyBWZShlLHQuY29sdW1ucyksdGhpcy5TPVtdO2xldCByPXQ7Zm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9bmV3IEdlKHIpO3RoaXMuVS5zZXRSb3codCxlLncudHJhbnNwb3NlKCkpLHRoaXMuUy5wdXNoKE1hdGgucG93KGUucy5nZXQoMCwwKSwyKSkscj1lLnhSZXNpZHVhbH10aGlzLlU9dGhpcy5VLnRyYW5zcG9zZSgpfX1mdW5jdGlvbiBXZSh0LGU9e30pe2lmKCFkZSh0KSl0aHJvdyBuZXcgRXJyb3IoImRhdGEgaXMgbm90IGVmZi4gYXJyYXkiKTtsZXQgcj1DdChlLCJzY2FsZSIpO2ZlKHIpfHwocj0hMCk7bGV0IG49Q3QoZSwibkNvbXBOSVBBTFMiKTtjZShuKXx8KG49Mik7bGV0IG89bGUoQ3QodCwwLFtdKSk7aWYoMD09PW8pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGRpbWVuc2lvbiBvZiBkYXRhIik7aWYobj5vKXRocm93IG5ldyBFcnJvcigibkNvbXBOSVBBTFMgaXMgbW9yZSB0aGFuIHRoZSBkaW1lbnNpb24gb2YgZGF0YSIpO2xldCBzPW5ldyBLZSh0LHttZXRob2Q6Ik5JUEFMUyIsc2NhbGU6cixuQ29tcE5JUEFMUzpufSksaT1zLnByZWRpY3QodCk7cmV0dXJuIHMuaW52ZXJ0KGkpLnRvSlNPTigpfXZhciBYZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK3I8biYmITEhPT1lKHRbcl0scix0KTspO3JldHVybiB0fTt2YXIgSmU9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUscixuKXtmb3IodmFyIG89LTEscz1PYmplY3QoZSksaT1uKGUpLHU9aS5sZW5ndGg7dS0tOyl7dmFyIGE9aVt0P3U6KytvXTtpZighMT09PXIoc1thXSxhLHMpKWJyZWFrfXJldHVybiBlfX0oKTt2YXIgWWU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1BcnJheSh0KTsrK3I8dDspbltyXT1lKHIpO3JldHVybiBufTt2YXIgWmU9ZnVuY3Rpb24odCl7cmV0dXJuIGQodCkmJiJbb2JqZWN0IEFyZ3VtZW50c10iPT13KHQpfSxIZT1PYmplY3QucHJvdG90eXBlLFFlPUhlLmhhc093blByb3BlcnR5LHRyPUhlLnByb3BlcnR5SXNFbnVtZXJhYmxlLGVyPVplKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/WmU6ZnVuY3Rpb24odCl7cmV0dXJuIGQodCkmJlFlLmNhbGwodCwiY2FsbGVlIikmJiF0ci5jYWxsKHQsImNhbGxlZSIpfTt2YXIgcnI9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbnI9bigoZnVuY3Rpb24odCxlKXt2YXIgcj1lJiYhZS5ub2RlVHlwZSYmZSxuPXImJnQmJiF0Lm5vZGVUeXBlJiZ0LG89biYmbi5leHBvcnRzPT09cj9pLkJ1ZmZlcjp2b2lkIDAscz0obz9vLmlzQnVmZmVyOnZvaWQgMCl8fHJyO3QuZXhwb3J0cz1zfSkpLG9yPS9eKD86MHxbMS05XVxkKikkLzt2YXIgc3I9ZnVuY3Rpb24odCxlKXt2YXIgcj10eXBlb2YgdDtyZXR1cm4hIShlPW51bGw9PWU/OTAwNzE5OTI1NDc0MDk5MTplKSYmKCJudW1iZXIiPT1yfHwic3ltYm9sIiE9ciYmb3IudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxlfSxpcj17fTtpclsiW29iamVjdCBGbG9hdDMyQXJyYXldIl09aXJbIltvYmplY3QgRmxvYXQ2NEFycmF5XSJdPWlyWyJbb2JqZWN0IEludDhBcnJheV0iXT1pclsiW29iamVjdCBJbnQxNkFycmF5XSJdPWlyWyJbb2JqZWN0IEludDMyQXJyYXldIl09aXJbIltvYmplY3QgVWludDhBcnJheV0iXT1pclsiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iXT1pclsiW29iamVjdCBVaW50MTZBcnJheV0iXT1pclsiW29iamVjdCBVaW50MzJBcnJheV0iXT0hMCxpclsiW29iamVjdCBBcmd1bWVudHNdIl09aXJbIltvYmplY3QgQXJyYXldIl09aXJbIltvYmplY3QgQXJyYXlCdWZmZXJdIl09aXJbIltvYmplY3QgQm9vbGVhbl0iXT1pclsiW29iamVjdCBEYXRhVmlld10iXT1pclsiW29iamVjdCBEYXRlXSJdPWlyWyJbb2JqZWN0IEVycm9yXSJdPWlyWyJbb2JqZWN0IEZ1bmN0aW9uXSJdPWlyWyJbb2JqZWN0IE1hcF0iXT1pclsiW29iamVjdCBOdW1iZXJdIl09aXJbIltvYmplY3QgT2JqZWN0XSJdPWlyWyJbb2JqZWN0IFJlZ0V4cF0iXT1pclsiW29iamVjdCBTZXRdIl09aXJbIltvYmplY3QgU3RyaW5nXSJdPWlyWyJbb2JqZWN0IFdlYWtNYXBdIl09ITE7dmFyIHVyPWZ1bmN0aW9uKHQpe3JldHVybiBkKHQpJiZHdCh0Lmxlbmd0aCkmJiEhaXJbdyh0KV19O3ZhciBhcj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fSxocj1uKChmdW5jdGlvbih0LGUpe3ZhciByPWUmJiFlLm5vZGVUeXBlJiZlLG49ciYmdCYmIXQubm9kZVR5cGUmJnQscz1uJiZuLmV4cG9ydHM9PT1yJiZvLnByb2Nlc3MsaT1mdW5jdGlvbigpe3RyeXt2YXIgdD1uJiZuLnJlcXVpcmUmJm4ucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiB0fHxzJiZzLmJpbmRpbmcmJnMuYmluZGluZygidXRpbCIpfWNhdGNoKHQpe319KCk7dC5leHBvcnRzPWl9KSksbHI9aHImJmhyLmlzVHlwZWRBcnJheSxjcj1scj9hcihscik6dXIsZnI9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgbXI9ZnVuY3Rpb24oZSxyKXt2YXIgbj10KGUpLG89IW4mJmVyKGUpLHM9IW4mJiFvJiZucihlKSxpPSFuJiYhbyYmIXMmJmNyKGUpLHU9bnx8b3x8c3x8aSxhPXU/WWUoZS5sZW5ndGgsU3RyaW5nKTpbXSxoPWEubGVuZ3RoO2Zvcih2YXIgbCBpbiBlKSFyJiYhZnIuY2FsbChlLGwpfHx1JiYoImxlbmd0aCI9PWx8fHMmJigib2Zmc2V0Ij09bHx8InBhcmVudCI9PWwpfHxpJiYoImJ1ZmZlciI9PWx8fCJieXRlTGVuZ3RoIj09bHx8ImJ5dGVPZmZzZXQiPT1sKXx8c3IobCxoKSl8fGEucHVzaChsKTtyZXR1cm4gYX07dmFyIGdyPWZ1bmN0aW9uKHQpe3JldHVybiBLdCh0KT9tcih0KTpPdCh0KX07dmFyIHByPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIsbil7aWYobnVsbD09cilyZXR1cm4gcjtpZighS3QocikpcmV0dXJuIHQocixuKTtmb3IodmFyIG89ci5sZW5ndGgscz1lP286LTEsaT1PYmplY3Qocik7KGU/cy0tOisrczxvKSYmITEhPT1uKGlbc10scyxpKTspO3JldHVybiByfX0oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJkplKHQsZSxncil9KSk7dmFyIHdyPWZ1bmN0aW9uKHQpe3JldHVybiB0fTt2YXIgZHI9ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp3cn07dmFyIGJyPWZ1bmN0aW9uKGUscil7cmV0dXJuKHQoZSk/WGU6cHIpKGUsZHIocikpfTt2YXIgeXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPW5ldyBvdCx0aGlzLnNpemU9MH07dmFyIHZyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1lLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplPWUuc2l6ZSxyfTt2YXIgTXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KHQpfTt2YXIgeHI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfTt2YXIgRXI9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fO2lmKHIgaW5zdGFuY2VvZiBvdCl7dmFyIG49ci5fX2RhdGFfXztpZighc3R8fG4ubGVuZ3RoPDE5OSlyZXR1cm4gbi5wdXNoKFt0LGVdKSx0aGlzLnNpemU9KytyLnNpemUsdGhpcztyPXRoaXMuX19kYXRhX189bmV3IGd0KG4pfXJldHVybiByLnNldCh0LGUpLHRoaXMuc2l6ZT1yLnNpemUsdGhpc307ZnVuY3Rpb24gU3IodCl7dmFyIGU9dGhpcy5fX2RhdGFfXz1uZXcgb3QodCk7dGhpcy5zaXplPWUuc2l6ZX1Tci5wcm90b3R5cGUuY2xlYXI9eXIsU3IucHJvdG90eXBlLmRlbGV0ZT12cixTci5wcm90b3R5cGUuZ2V0PU1yLFNyLnByb3RvdHlwZS5oYXM9eHIsU3IucHJvdG90eXBlLnNldD1Fcjt2YXIganI9U3I7dmFyIF9yPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LCJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIiksdGhpc307dmFyIEFyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX07ZnVuY3Rpb24gQ3IodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuX19kYXRhX189bmV3IGd0OysrZTxyOyl0aGlzLmFkZCh0W2VdKX1Dci5wcm90b3R5cGUuYWRkPUNyLnByb3RvdHlwZS5wdXNoPV9yLENyLnByb3RvdHlwZS5oYXM9QXI7dmFyIFJyPUNyO3ZhciBJcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK3I8bjspaWYoZSh0W3JdLHIsdCkpcmV0dXJuITA7cmV0dXJuITF9O3ZhciBrcj1mdW5jdGlvbih0LGUpe3JldHVybiB0LmhhcyhlKX07dmFyIE5yPWZ1bmN0aW9uKHQsZSxyLG4sbyxzKXt2YXIgaT0xJnIsdT10Lmxlbmd0aCxhPWUubGVuZ3RoO2lmKHUhPWEmJiEoaSYmYT51KSlyZXR1cm4hMTt2YXIgaD1zLmdldCh0KSxsPXMuZ2V0KGUpO2lmKGgmJmwpcmV0dXJuIGg9PWUmJmw9PXQ7dmFyIGM9LTEsZj0hMCxtPTImcj9uZXcgUnI6dm9pZCAwO2ZvcihzLnNldCh0LGUpLHMuc2V0KGUsdCk7KytjPHU7KXt2YXIgZz10W2NdLHA9ZVtjXTtpZihuKXZhciB3PWk/bihwLGcsYyxlLHQscyk6bihnLHAsYyx0LGUscyk7aWYodm9pZCAwIT09dyl7aWYodyljb250aW51ZTtmPSExO2JyZWFrfWlmKG0pe2lmKCFJcihlLChmdW5jdGlvbih0LGUpe2lmKCFrcihtLGUpJiYoZz09PXR8fG8oZyx0LHIsbixzKSkpcmV0dXJuIG0ucHVzaChlKX0pKSl7Zj0hMTticmVha319ZWxzZSBpZihnIT09cCYmIW8oZyxwLHIsbixzKSl7Zj0hMTticmVha319cmV0dXJuIHMuZGVsZXRlKHQpLHMuZGVsZXRlKGUpLGZ9LE9yPWkuVWludDhBcnJheTt2YXIgRnI9ZnVuY3Rpb24odCl7dmFyIGU9LTEscj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQsbil7clsrK2VdPVtuLHRdfSkpLHJ9O3ZhciB6cj1mdW5jdGlvbih0KXt2YXIgZT0tMSxyPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7clsrK2VdPXR9KSkscn0sVHI9dT91LnByb3RvdHlwZTp2b2lkIDAsVnI9VHI/VHIudmFsdWVPZjp2b2lkIDA7dmFyIFByPWZ1bmN0aW9uKHQsZSxyLG4sbyxzLGkpe3N3aXRjaChyKXtjYXNlIltvYmplY3QgRGF0YVZpZXddIjppZih0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8dC5ieXRlT2Zmc2V0IT1lLmJ5dGVPZmZzZXQpcmV0dXJuITE7dD10LmJ1ZmZlcixlPWUuYnVmZmVyO2Nhc2UiW29iamVjdCBBcnJheUJ1ZmZlcl0iOnJldHVybiEodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fCFzKG5ldyBPcih0KSxuZXcgT3IoZSkpKTtjYXNlIltvYmplY3QgQm9vbGVhbl0iOmNhc2UiW29iamVjdCBEYXRlXSI6Y2FzZSJbb2JqZWN0IE51bWJlcl0iOnJldHVybiBZKCt0LCtlKTtjYXNlIltvYmplY3QgRXJyb3JdIjpyZXR1cm4gdC5uYW1lPT1lLm5hbWUmJnQubWVzc2FnZT09ZS5tZXNzYWdlO2Nhc2UiW29iamVjdCBSZWdFeHBdIjpjYXNlIltvYmplY3QgU3RyaW5nXSI6cmV0dXJuIHQ9PWUrIiI7Y2FzZSJbb2JqZWN0IE1hcF0iOnZhciB1PUZyO2Nhc2UiW29iamVjdCBTZXRdIjp2YXIgYT0xJm47aWYodXx8KHU9enIpLHQuc2l6ZSE9ZS5zaXplJiYhYSlyZXR1cm4hMTt2YXIgaD1pLmdldCh0KTtpZihoKXJldHVybiBoPT1lO258PTIsaS5zZXQodCxlKTt2YXIgbD1Ocih1KHQpLHUoZSksbixvLHMsaSk7cmV0dXJuIGkuZGVsZXRlKHQpLGw7Y2FzZSJbb2JqZWN0IFN5bWJvbF0iOmlmKFZyKXJldHVybiBWci5jYWxsKHQpPT1Wci5jYWxsKGUpfXJldHVybiExfTt2YXIgcXI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1lLmxlbmd0aCxvPXQubGVuZ3RoOysrcjxuOyl0W28rcl09ZVtyXTtyZXR1cm4gdH07dmFyICRyPWZ1bmN0aW9uKGUscixuKXt2YXIgbz1yKGUpO3JldHVybiB0KGUpP286cXIobyxuKGUpKX07dmFyIERyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoLG89MCxzPVtdOysrcjxuOyl7dmFyIGk9dFtyXTtlKGkscix0KSYmKHNbbysrXT1pKX1yZXR1cm4gc307dmFyIFVyPWZ1bmN0aW9uKCl7cmV0dXJuW119LExyPU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsQnI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxHcj1Ccj9mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXToodD1PYmplY3QodCksRHIoQnIodCksKGZ1bmN0aW9uKGUpe3JldHVybiBMci5jYWxsKHQsZSl9KSkpfTpVcjt2YXIgS3I9ZnVuY3Rpb24odCl7cmV0dXJuICRyKHQsZ3IsR3IpfSxXcj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBYcj1mdW5jdGlvbih0LGUscixuLG8scyl7dmFyIGk9MSZyLHU9S3IodCksYT11Lmxlbmd0aDtpZihhIT1LcihlKS5sZW5ndGgmJiFpKXJldHVybiExO2Zvcih2YXIgaD1hO2gtLTspe3ZhciBsPXVbaF07aWYoIShpP2wgaW4gZTpXci5jYWxsKGUsbCkpKXJldHVybiExfXZhciBjPXMuZ2V0KHQpLGY9cy5nZXQoZSk7aWYoYyYmZilyZXR1cm4gYz09ZSYmZj09dDt2YXIgbT0hMDtzLnNldCh0LGUpLHMuc2V0KGUsdCk7Zm9yKHZhciBnPWk7KytoPGE7KXt2YXIgcD10W2w9dVtoXV0sdz1lW2xdO2lmKG4pdmFyIGQ9aT9uKHcscCxsLGUsdCxzKTpuKHAsdyxsLHQsZSxzKTtpZighKHZvaWQgMD09PWQ/cD09PXd8fG8ocCx3LHIsbixzKTpkKSl7bT0hMTticmVha31nfHwoZz0iY29uc3RydWN0b3IiPT1sKX1pZihtJiYhZyl7dmFyIGI9dC5jb25zdHJ1Y3Rvcix5PWUuY29uc3RydWN0b3I7Yj09eXx8ISgiY29uc3RydWN0b3IiaW4gdCl8fCEoImNvbnN0cnVjdG9yImluIGUpfHwiZnVuY3Rpb24iPT10eXBlb2YgYiYmYiBpbnN0YW5jZW9mIGImJiJmdW5jdGlvbiI9PXR5cGVvZiB5JiZ5IGluc3RhbmNlb2YgeXx8KG09ITEpfXJldHVybiBzLmRlbGV0ZSh0KSxzLmRlbGV0ZShlKSxtfSxKcj0iW29iamVjdCBPYmplY3RdIixZcj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBacj1mdW5jdGlvbihlLHIsbixvLHMsaSl7dmFyIHU9dChlKSxhPXQociksaD11PyJbb2JqZWN0IEFycmF5XSI6QnQoZSksbD1hPyJbb2JqZWN0IEFycmF5XSI6QnQociksYz0oaD0iW29iamVjdCBBcmd1bWVudHNdIj09aD9KcjpoKT09SnIsZj0obD0iW29iamVjdCBBcmd1bWVudHNdIj09bD9KcjpsKT09SnIsbT1oPT1sO2lmKG0mJm5yKGUpKXtpZighbnIocikpcmV0dXJuITE7dT0hMCxjPSExfWlmKG0mJiFjKXJldHVybiBpfHwoaT1uZXcganIpLHV8fGNyKGUpP05yKGUscixuLG8scyxpKTpQcihlLHIsaCxuLG8scyxpKTtpZighKDEmbikpe3ZhciBnPWMmJllyLmNhbGwoZSwiX193cmFwcGVkX18iKSxwPWYmJllyLmNhbGwociwiX193cmFwcGVkX18iKTtpZihnfHxwKXt2YXIgdz1nP2UudmFsdWUoKTplLGQ9cD9yLnZhbHVlKCk6cjtyZXR1cm4gaXx8KGk9bmV3IGpyKSxzKHcsZCxuLG8saSl9fXJldHVybiEhbSYmKGl8fChpPW5ldyBqciksWHIoZSxyLG4sbyxzLGkpKX07dmFyIEhyPWZ1bmN0aW9uIHQoZSxyLG4sbyxzKXtyZXR1cm4gZT09PXJ8fChudWxsPT1lfHxudWxsPT1yfHwhZChlKSYmIWQocik/ZSE9ZSYmciE9cjpacihlLHIsbixvLHQscykpfTt2YXIgUXI9ZnVuY3Rpb24odCxlLHIsbil7dmFyIG89ci5sZW5ndGgscz1vLGk9IW47aWYobnVsbD09dClyZXR1cm4hcztmb3IodD1PYmplY3QodCk7by0tOyl7dmFyIHU9cltvXTtpZihpJiZ1WzJdP3VbMV0hPT10W3VbMF1dOiEodVswXWluIHQpKXJldHVybiExfWZvcig7KytvPHM7KXt2YXIgYT0odT1yW29dKVswXSxoPXRbYV0sbD11WzFdO2lmKGkmJnVbMl0pe2lmKHZvaWQgMD09PWgmJiEoYSBpbiB0KSlyZXR1cm4hMX1lbHNle3ZhciBjPW5ldyBqcjtpZihuKXZhciBmPW4oaCxsLGEsdCxlLGMpO2lmKCEodm9pZCAwPT09Zj9IcihsLGgsMyxuLGMpOmYpKXJldHVybiExfX1yZXR1cm4hMH07dmFyIHRuPWZ1bmN0aW9uKHQpe3JldHVybiB0PT10JiYheCh0KX07dmFyIGVuPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1ncih0KSxyPWUubGVuZ3RoO3ItLTspe3ZhciBuPWVbcl0sbz10W25dO2Vbcl09W24sbyx0bihvKV19cmV0dXJuIGV9O3ZhciBybj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gbnVsbCE9ciYmKHJbdF09PT1lJiYodm9pZCAwIT09ZXx8dCBpbiBPYmplY3QocikpKX19O3ZhciBubj1mdW5jdGlvbih0KXt2YXIgZT1lbih0KTtyZXR1cm4gMT09ZS5sZW5ndGgmJmVbMF1bMl0/cm4oZVswXVswXSxlWzBdWzFdKTpmdW5jdGlvbihyKXtyZXR1cm4gcj09PXR8fFFyKHIsdCxlKX19O3ZhciBvbj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZlIGluIE9iamVjdCh0KX07dmFyIHNuPWZ1bmN0aW9uKGUscixuKXtmb3IodmFyIG89LTEscz0ocj1qdChyLGUpKS5sZW5ndGgsaT0hMTsrK288czspe3ZhciB1PV90KHJbb10pO2lmKCEoaT1udWxsIT1lJiZuKGUsdSkpKWJyZWFrO2U9ZVt1XX1yZXR1cm4gaXx8KytvIT1zP2k6ISEocz1udWxsPT1lPzA6ZS5sZW5ndGgpJiZHdChzKSYmc3IodSxzKSYmKHQoZSl8fGVyKGUpKX07dmFyIHVuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPXQmJnNuKHQsZSxvbil9O3ZhciBhbj1mdW5jdGlvbih0LGUpe3JldHVybiBNKHQpJiZ0bihlKT9ybihfdCh0KSxlKTpmdW5jdGlvbihyKXt2YXIgbj1DdChyLHQpO3JldHVybiB2b2lkIDA9PT1uJiZuPT09ZT91bihyLHQpOkhyKGUsbiwzKX19O3ZhciBobj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIEF0KGUsdCl9fTt2YXIgbG49ZnVuY3Rpb24odCl7cmV0dXJuIE0odCk/WHQoX3QodCkpOmhuKHQpfTt2YXIgY249ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpudWxsPT1lP3dyOiJvYmplY3QiPT10eXBlb2YgZT90KGUpP2FuKGVbMF0sZVsxXSk6bm4oZSk6bG4oZSl9O3ZhciBmbj1mdW5jdGlvbih0LGUpe3ZhciByPS0xLG49S3QodCk/QXJyYXkodC5sZW5ndGgpOltdO3JldHVybiBwcih0LChmdW5jdGlvbih0LG8scyl7blsrK3JdPWUodCxvLHMpfSkpLG59O3ZhciBtbj1mdW5jdGlvbihlLHIpe3JldHVybih0KGUpP3Z0OmZuKShlLGNuKHIpKX07dmFyIGduPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZ0KGUsKGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSkpfTt2YXIgcG49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106Z24odCxncih0KSl9O2Z1bmN0aW9uIHduKHQpe3JldHVybiEoIXBlKHQpfHwiIj09PXQpfWZ1bmN0aW9uIGRuKHQpe2xldCBlPSExO3JldHVybiB3bih0KT9lPSFpc05hTihOdW1iZXIodCkpOmZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IE51bWJlcl0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KSYmKGU9ITApLGV9ZnVuY3Rpb24gYm4odCxlKXtpZighZ2UodCkpcmV0dXJue307aWYoIWRlKGUpKXJldHVybnt9O2xldCByPXt9O3JldHVybiBicihlLChmdW5jdGlvbihlKXsoZnVuY3Rpb24odCxlKXtyZXR1cm4hIWdlKHQpJiYhKCF3bihlKSYmIWRuKGUpKSYmZSBpbiB0fSkodCxlKSYmKHJbZV09Q3QodCxlKSl9KSkscn12YXIgeW49L1xzLzt2YXIgdm49ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoO2UtLSYmeW4udGVzdCh0LmNoYXJBdChlKSk7KTtyZXR1cm4gZX0sTW49L15ccysvO3ZhciB4bj1mdW5jdGlvbih0KXtyZXR1cm4gdD90LnNsaWNlKDAsdm4odCkrMSkucmVwbGFjZShNbiwiIik6dH0sRW49L15bLStdMHhbMC05YS1mXSskL2ksU249L14wYlswMV0rJC9pLGpuPS9eMG9bMC03XSskL2ksX249cGFyc2VJbnQ7dmFyIEFuPWZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdDtpZihiKHQpKXJldHVybiBOYU47aWYoeCh0KSl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQudmFsdWVPZj90LnZhbHVlT2YoKTp0O3Q9eChlKT9lKyIiOmV9aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiAwPT09dD90Oit0O3Q9eG4odCk7dmFyIHI9U24udGVzdCh0KTtyZXR1cm4gcnx8am4udGVzdCh0KT9fbih0LnNsaWNlKDIpLHI/Mjo4KTpFbi50ZXN0KHQpP05hTjordH07dmFyIENuPWZ1bmN0aW9uKHQpe3JldHVybiB0P0luZmluaXR5PT09KHQ9QW4odCkpfHwtSW5maW5pdHk9PT10PzE3OTc2OTMxMzQ4NjIzMTU3ZTI5MioodDwwPy0xOjEpOnQ9PXQ/dDowOjA9PT10P3Q6MH07dmFyIFJuPWZ1bmN0aW9uKHQpe3ZhciBlPUNuKHQpLHI9ZSUxO3JldHVybiBlPT1lP3I/ZS1yOmU6MH0sSW49aS5pc0Zpbml0ZSxrbj1NYXRoLm1pbjt2YXIgTm49ZnVuY3Rpb24odCl7dmFyIGU9TWF0aFt0XTtyZXR1cm4gZnVuY3Rpb24odCxyKXtpZih0PUFuKHQpLChyPW51bGw9PXI/MDprbihSbihyKSwyOTIpKSYmSW4odCkpe3ZhciBuPShTdCh0KSsiZSIpLnNwbGl0KCJlIiksbz1lKG5bMF0rImUiKygrblsxXStyKSk7cmV0dXJuKygobj0oU3QobykrImUiKS5zcGxpdCgiZSIpKVswXSsiZSIrKCtuWzFdLXIpKX1yZXR1cm4gZSh0KX19KCJyb3VuZCIpO2Z1bmN0aW9uIE9uKHQpe2lmKCFkbih0KSlyZXR1cm4gMDt0PWZ1bmN0aW9uKHQpe3JldHVybiBkbih0KT9Dbih0KTowfSh0KTtsZXQgZT1Obih0KTtyZXR1cm4iMCI9PT1TdHJpbmcoZSk/MDplfXZhciBGbj1BcnJheS5wcm90b3R5cGUuam9pbjt2YXIgem49ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD8iIjpGbi5jYWxsKHQsZSl9O2NsYXNzIFRue2NvbnN0cnVjdG9yKHQpe3RoaXMuZ2V0Q29zdD0oKT0+dGhpcy5FbGVtZW50cy5tYXAoKHQ9PnQuRGlzdGFuY2VGcm9tTWVkb2lkKSkucmVkdWNlKCgodCxlKT0+dCtlKSwwKSx0aGlzLmZpbmRCZXN0TWVkb2lkSWR4PXQ9PnRoaXMuRWxlbWVudHMubWFwKChlPT50aGlzLmNhbGNDb3N0Rm9yR2l2ZW5FbGVtZW50QXNNZWRvaWQoZSx0KSkpLnJlZHVjZSgoKHQsZSxyLG4pPT5lLkNvc3RJZk1hZGVNZWRvaWQ8blt0XS5Db3N0SWZNYWRlTWVkb2lkP3I6dCksMCksdGhpcy5jYWxjQ29zdEZvckdpdmVuRWxlbWVudEFzTWVkb2lkPSh0LGUpPT4oe0Nvc3RJZk1hZGVNZWRvaWQ6bmV3IFRuKHtFbGVtZW50czp0aGlzLkVsZW1lbnRzLm1hcCgocj0+KHtEaXN0YW5jZUZyb21NZWRvaWQ6ZShyLkVsZW1lbnQsdC5FbGVtZW50KSxFbGVtZW50OnIuRWxlbWVudH0pKSksTWVkb2lkOnQuRWxlbWVudH0pLmdldENvc3QoKSxFbGVtZW50OnR9KSx0aGlzLkVsZW1lbnRzPXQuRWxlbWVudHMsdGhpcy5NZWRvaWQ9dC5NZWRvaWR9fXZhciBWbj1UbixQbj1PYmplY3QuZGVmaW5lUHJvcGVydHkoe0NsdXN0ZXI6Vm59LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxxbj1PYmplY3QuZGVmaW5lUHJvcGVydHkoe2Rpc3RhbmNlOih0LGUpPT57aWYodC5sZW5ndGghPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRoZSBpbnB1dHMgbXVzdCBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbiIpO2NvbnN0IHI9QXJyYXkuZnJvbSh0LmtleXMoKSkubWFwKChyPT5NYXRoLnBvdyhNYXRoLmFicyh0W3JdLWVbcl0pLDIpKSkucmVkdWNlKCgodCxlKT0+dCtlKSwwKTtyZXR1cm4gTWF0aC5zcXJ0KHIpfX0sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLCRuPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7a0d0RWxlbWVudEFyckxlbmd0aDoiayBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpbnB1dCBhcnJheSJ9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjbGFzcyBEbntjb25zdHJ1Y3Rvcih0LGUscil7dGhpcy5FbGVtZW50cz10LHRoaXMuSz1lLHRoaXMuRGlzdGFuY2VGbj1yLHRoaXMuT3B0aW1pc2F0aW9uQ29tcGxldGVkPSExLHRoaXMuaXRlcmF0ZT0oKT0+e3RoaXMuSXRlcmF0aW9uQ291bnQrKyx0aGlzLkNsdXN0ZXJzfHx0aGlzLmFsbG9jYXRlVG9DbHVzdGVyc0Fyb3VuZEN1cnJlbnRNZWRvaWRzKCk7Y29uc3QgdD10aGlzLk1lZG9pZHMsZT10aGlzLkNsdXN0ZXJzLHI9dGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdCgpO2xldCBuPXI7Zm9yKGxldCB0PTA7dDx0aGlzLk1lZG9pZHMubGVuZ3RoO3QrKyl7Y29uc3QgZT10PT4wPT09dGhpcy5NZWRvaWRzLmZpbHRlcigoZT0+MD09PXRoaXMuRGlzdGFuY2VGbih0LGUpKSkubGVuZ3RoO2Zvcihjb25zdCByIG9mIHRoaXMuRWxlbWVudHMuZmlsdGVyKGUpKXtjb25zdCBlPXRoaXMuTWVkb2lkcy5zbGljZSgpO2VbdF09cjtjb25zdCBvPW5ldyBEbih0aGlzLkVsZW1lbnRzLnNsaWNlKCksdGhpcy5LLHRoaXMuRGlzdGFuY2VGbik7by5NZWRvaWRzPWUsby5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcygpO2NvbnN0IHM9by5jYWxjdWxhdGVDdXJyZW50Q29zdCgpO3M8biYmKG49cyx0aGlzLkNsdXN0ZXJzPW8uQ2x1c3RlcnMsdGhpcy5NZWRvaWRzPWUpfX1yZXR1cm4gdGhpcy5jYWxjdWxhdGVDdXJyZW50Q29zdCgpPHJ8fCh0aGlzLkNsdXN0ZXJzPWUsdGhpcy5NZWRvaWRzPXQsdGhpcy5PcHRpbWlzYXRpb25Db21wbGV0ZWQ9ITAsITEpfSx0aGlzLmdldENsdXN0ZXJlZERhdGE9KCk9Pih0aGlzLk9wdGltaXNhdGlvbkNvbXBsZXRlZHx8dGhpcy5ydW5Ub0NvbXBsZXRpb24oKSx0aGlzLkNsdXN0ZXJzLm1hcCgodD0+dC5FbGVtZW50cy5tYXAoKHQ9PnQuRWxlbWVudCkpKSkpLHRoaXMucnVuVG9Db21wbGV0aW9uPSgpPT57Zm9yKDt0aGlzLml0ZXJhdGUoKTspO30sdGhpcy5hbGxvY2F0ZVRvQ2x1c3RlcnNBcm91bmRDdXJyZW50TWVkb2lkcz0oKT0+e3RoaXMuQ2x1c3RlcnM9bmV3IEFycmF5LHRoaXMuTWVkb2lkcy5mb3JFYWNoKCh0PT57dGhpcy5DbHVzdGVycy5wdXNoKG5ldyBQbi5DbHVzdGVyKHtFbGVtZW50czpbXSxNZWRvaWQ6dH0pKX0pKSx0aGlzLkVsZW1lbnRzLmZvckVhY2goKCh0LGUpPT57Y29uc3Qgcj10aGlzLmZpbmREaXN0YW5jZXModGhpcy5DbHVzdGVycy5tYXAoKHQ9PnQuTWVkb2lkKSksdCksbj1yLnJlZHVjZSgoKHQsZSxyLG4pPT5lPG5bdF0/cjp0KSwwKTt0aGlzLkNsdXN0ZXJzW25dLkVsZW1lbnRzLnB1c2goe0Rpc3RhbmNlRnJvbU1lZG9pZDpyW25dLEVsZW1lbnQ6dH0pfSkpfSx0aGlzLmNhbGN1bGF0ZUN1cnJlbnRDb3N0PSgpPT50aGlzLkNsdXN0ZXJzLm1hcCgodD0+dC5nZXRDb3N0KCkpKS5yZWR1Y2UoKCh0LGUpPT50K2UpLDApLHRoaXMuZmluZERpc3RhbmNlcz0odCxlKT0+dC5tYXAoKHQ9PnRoaXMuRGlzdGFuY2VGbih0LGUpKSksdGhpcy5zZWxlY3RJbml0aWFsTWVkb2lkcz0oKT0+e2lmKHRoaXMuSz49dGhpcy5FbGVtZW50cy5sZW5ndGgpdGhyb3cgJG4ua0d0RWxlbWVudEFyckxlbmd0aDtjb25zdCB0PVtdLGU9KHQsZSk9Pntmb3IoY29uc3QgciBvZiBlKWlmKDA9PT10aGlzLkRpc3RhbmNlRm4ocix0KSlyZXR1cm4hMTtyZXR1cm4hMH07bGV0IHI9MDtmb3IoO3I8dGhpcy5FbGVtZW50cy5sZW5ndGgmJnQubGVuZ3RoPHRoaXMuSzspZSh0aGlzLkVsZW1lbnRzW3JdLHQpJiZ0LnB1c2godGhpcy5FbGVtZW50c1tyXSkscisrO3JldHVybiB0fSx0aGlzLkRpc3RhbmNlRm49dGhpcy5EaXN0YW5jZUZufHxxbi5kaXN0YW5jZSx0aGlzLk1lZG9pZHM9dGhpcy5zZWxlY3RJbml0aWFsTWVkb2lkcygpLHRoaXMuSXRlcmF0aW9uQ291bnQ9MH1nZXQgT3B0aW1pc2F0aW9uU3RhcnRlZCgpe3JldHVybiB0aGlzLkl0ZXJhdGlvbkNvdW50PjB9fURuLmNsdXN0ZXJFbGVtZW50cz0odCxlLHIpPT57RG4uZ2V0SW5zdGFuY2UodCxlLHIpO3JldHVybiBuZXcgQXJyYXl9LERuLmdldEluc3RhbmNlPSh0LGUscik9Pm5ldyBEbih0LGUscik7dmFyIFVuPURuLExuPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7Q2x1c3RlcmVyOlVufSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksQm49cihuKChmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIodCl7Zm9yKHZhciByIGluIHQpZS5oYXNPd25Qcm9wZXJ0eShyKXx8KGVbcl09dFtyXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHIoUG4pLHIoTG4pfSkpKTtmdW5jdGlvbiBHbih0LGUpe2xldCByPTA7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspcis9KHRbbl0tZVtuXSkqKHRbbl0tZVtuXSk7cmV0dXJuIHJ9Y29uc3QgS249e2Rpc3RhbmNlRnVuY3Rpb246R259O2Z1bmN0aW9uIFduKHQsZSxyPUtuKXtjb25zdCBuPXIuZGlzdGFuY2VGdW5jdGlvbnx8S24uZGlzdGFuY2VGdW5jdGlvbixvPXIuc2ltaWxhcml0eUZ1bmN0aW9ufHxLbi5zaW1pbGFyaXR5RnVuY3Rpb247bGV0IHM9LTE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG8pe2xldCByPU51bWJlci5NSU5fVkFMVUU7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IGk9byhlLHRbbl0pO2k+ciYmKHI9aSxzPW4pfX1lbHNle2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcigiQSBzaW1pbGFyaXR5IG9yIGRpc3RhbmNlIGZ1bmN0aW9uIGl0J3MgcmVxdWlyZWQiKTt7bGV0IHI9TnVtYmVyLk1BWF9WQUxVRTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Y29uc3QgaT1uKGUsdFtvXSk7aTxyJiYocj1pLHM9byl9fX1yZXR1cm4gc31mdW5jdGlvbiBYbih0LGUscixuKXtmb3IodmFyIG89MDtvPHQubGVuZ3RoO28rKylyW29dPVduKGUsdFtvXSx7ZGlzdGFuY2VGdW5jdGlvbjpufSk7cmV0dXJuIHJ9ZnVuY3Rpb24gSm4odCxlKXtjb25zdCByPTY1NTM1Jih0Pj4+PTApO3JldHVybigodC1yKSooZT4+Pj0wKT4+PjApK3IqZT4+PjB9Y2xhc3MgWW57Y29uc3RydWN0b3IodD1EYXRlLm5vdygpKXt0aGlzLnN0YXRlPW5ldyBVaW50MzJBcnJheSg0KSx0aGlzLmluaXQodCksdGhpcy5yYW5kb209dGhpcy5nZXRGbG9hdC5iaW5kKHRoaXMpfWdldFVpbnQzMigpe3JldHVybiB0aGlzLm5leHRTdGF0ZSgpLHRoaXMuc3RhdGVbM10rdGhpcy5zdGF0ZVsyXT4+PjB9Z2V0RmxvYXQoKXtyZXR1cm4gNS45NjA0NjQ0Nzc1MzkwNjNlLTgqKHRoaXMuZ2V0VWludDMyKCk+Pj44KX1pbml0KHQpe2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoInNlZWQgbXVzdCBiZSBhbiBpbnRlZ2VyIik7dGhpcy5zdGF0ZVswXT10LHRoaXMuc3RhdGVbMV09MCx0aGlzLnN0YXRlWzJdPTAsdGhpcy5zdGF0ZVszXT0wO2ZvcihsZXQgdD0xO3Q8ODt0KyspdGhpcy5zdGF0ZVszJnRdXj10K0puKDE4MTI0MzMyNTMsdGhpcy5zdGF0ZVt0LTEmM11edGhpcy5zdGF0ZVt0LTEmM10+Pj4zMD4+PjApPj4+MDt0aGlzLnBlcmlvZENlcnRpZmljYXRpb24oKTtmb3IobGV0IHQ9MDt0PDg7dCsrKXRoaXMubmV4dFN0YXRlKCl9cGVyaW9kQ2VydGlmaWNhdGlvbigpezA9PT10aGlzLnN0YXRlWzBdJiYwPT09dGhpcy5zdGF0ZVsxXSYmMD09PXRoaXMuc3RhdGVbMl0mJjA9PT10aGlzLnN0YXRlWzNdJiYodGhpcy5zdGF0ZVswXT04OCx0aGlzLnN0YXRlWzFdPTgzLHRoaXMuc3RhdGVbMl09NjUsdGhpcy5zdGF0ZVszXT02OCl9bmV4dFN0YXRlKCl7bGV0IHQ9dGhpcy5zdGF0ZVswXTt0Xj10PDwxNSx0Xj10Pj4+MTgsdF49dGhpcy5zdGF0ZVszXTw8MTEsdGhpcy5zdGF0ZVswXT10aGlzLnN0YXRlWzFdLHRoaXMuc3RhdGVbMV09dGhpcy5zdGF0ZVsyXSx0aGlzLnN0YXRlWzJdPXRoaXMuc3RhdGVbM10sdGhpcy5zdGF0ZVszXT10fX1mdW5jdGlvbiBabih0LGU9e30scj1NYXRoLnJhbmRvbSl7Y29uc3R7c2l6ZTpuPTEscmVwbGFjZTpvPSExLHByb2JhYmlsaXRpZXM6c309ZTtsZXQgaSx1O2lmKGk9Im51bWJlciI9PXR5cGVvZiB0P2Z1bmN0aW9uKHQpe2NvbnN0IGU9W107Zm9yKGxldCByPTA7cjx0O3IrKyllLnB1c2gocik7cmV0dXJuIGV9KHQpOnQuc2xpY2UoKSxzKXtpZighbyl0aHJvdyBuZXcgRXJyb3IoImNob2ljZSB3aXRoIHByb2JhYmlsaXRpZXMgYW5kIG5vIHJlcGxhY2VtZW50IGlzIG5vdCBpbXBsZW1lbnRlZCIpO2lmKHMubGVuZ3RoIT09aS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgbGVuZ3RoIG9mIHByb2JhYmlsaXRpZXMgb3B0aW9uIHNob3VsZCBiZSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGNob2ljZXMiKTt1PVtzWzBdXTtmb3IobGV0IHQ9MTt0PHMubGVuZ3RoO3QrKyl1W3RdPXVbdC0xXStzW3RdO2lmKE1hdGguYWJzKDEtdVt1Lmxlbmd0aC0xXSk+MWUtOCl0aHJvdyBuZXcgRXJyb3IoYHByb2JhYmlsaXRpZXMgc2hvdWxkIHN1bSB0byAxLCBidXQgaW5zdGVhZCBzdW1zIHRvICR7dVt1Lmxlbmd0aC0xXX1gKX1pZighMT09PW8mJm4+aS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzaXplIG9wdGlvbiBpcyB0b28gbGFyZ2UiKTtjb25zdCBhPVtdO2ZvcihsZXQgdD0wO3Q8bjt0Kyspe2NvbnN0IHQ9SG4oaS5sZW5ndGgscix1KTthLnB1c2goaVt0XSksb3x8aS5zcGxpY2UodCwxKX1yZXR1cm4gYX1mdW5jdGlvbiBIbih0LGUscil7Y29uc3Qgbj1lKCk7aWYocil7bGV0IHQ9MDtmb3IoO24+clt0XTspdCsrO3JldHVybiB0fXJldHVybiBNYXRoLmZsb29yKG4qdCl9Y2xhc3MgUW57Y29uc3RydWN0b3IodD1NYXRoLnJhbmRvbSl7aWYoIm51bWJlciI9PXR5cGVvZiB0KXtjb25zdCBlPW5ldyBZbih0KTt0aGlzLnJhbmRvbUdlbmVyYXRvcj1lLnJhbmRvbX1lbHNlIHRoaXMucmFuZG9tR2VuZXJhdG9yPXR9Y2hvaWNlKHQsZSl7cmV0dXJuIFpuKHQsZSx0aGlzLnJhbmRvbUdlbmVyYXRvcil9cmFuZG9tKCl7cmV0dXJuIHRoaXMucmFuZG9tR2VuZXJhdG9yKCl9cmFuZEludCh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10LHQ9MCksdCtNYXRoLmZsb29yKHRoaXMucmFuZG9tR2VuZXJhdG9yKCkqKGUtdCkpfXJhbmRvbVNhbXBsZSh0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dDtyKyspZS5wdXNoKHRoaXMucmFuZG9tKCkpO3JldHVybiBlfX1mdW5jdGlvbiB0byh0LGUpe2NvbnN0IHI9bmV3IFZlKHQucm93cyxlLnJvd3MpO2ZvcihsZXQgbj0wO248dC5yb3dzO24rKylmb3IobGV0IG89MDtvPGUucm93cztvKyspci5zZXQobixvLEduKHQuZ2V0Um93KG4pLGUuZ2V0Um93KG8pKSk7cmV0dXJuIHJ9ZnVuY3Rpb24gZW8odCl7bGV0IGU9W107Zm9yKGxldCByPTA7cjx0O3IrKyllLnB1c2gocik7cmV0dXJuIGV9ZnVuY3Rpb24gcm8odCl7bGV0IGU9W3RbMF1dO2ZvcihsZXQgcj0xO3I8dC5sZW5ndGg7cisrKWVbcl09ZVtyLTFdK3Rbcl07cmV0dXJuIGV9Y29uc3Qgbm89U3ltYm9sKCJkaXN0YW5jZSIpO2NsYXNzIG9ve2NvbnN0cnVjdG9yKHQsZSxyLG4sbyl7dGhpcy5jbHVzdGVycz10LHRoaXMuY2VudHJvaWRzPWUsdGhpcy5jb252ZXJnZWQ9cix0aGlzLml0ZXJhdGlvbnM9bix0aGlzW25vXT1vfW5lYXJlc3QodCl7Y29uc3QgZT1uZXcgQXJyYXkodC5sZW5ndGgpO3JldHVybiBYbih0LHRoaXMuY2VudHJvaWRzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2VudHJvaWR9KSksZSx0aGlzW25vXSl9Y29tcHV0ZUluZm9ybWF0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmNlbnRyb2lkcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybntjZW50cm9pZDp0LGVycm9yOjAsc2l6ZTowfX0pKSxyPTA7cjx0Lmxlbmd0aDtyKyspZVt0aGlzLmNsdXN0ZXJzW3JdXS5lcnJvcis9dGhpc1tub10odFtyXSx0aGlzLmNlbnRyb2lkc1t0aGlzLmNsdXN0ZXJzW3JdXSksZVt0aGlzLmNsdXN0ZXJzW3JdXS5zaXplKys7Zm9yKHZhciBuPTA7bjx0aGlzLmNlbnRyb2lkcy5sZW5ndGg7bisrKWVbbl0uc2l6ZT9lW25dLmVycm9yLz1lW25dLnNpemU6ZVtuXS5lcnJvcj1udWxsO3JldHVybiBuZXcgb28odGhpcy5jbHVzdGVycyxlLHRoaXMuY29udmVyZ2VkLHRoaXMuaXRlcmF0aW9ucyx0aGlzW25vXSl9fWNvbnN0IHNvPXttYXhJdGVyYXRpb25zOjEwMCx0b2xlcmFuY2U6MWUtNix3aXRoSXRlcmF0aW9uczohMSxpbml0aWFsaXphdGlvbjoia21lYW5zKysiLGRpc3RhbmNlRnVuY3Rpb246R259O2Z1bmN0aW9uIGlvKHQsZSxyLG4sbyxzKXt2YXIgaT1mdW5jdGlvbih0LGUscixuKXtjb25zdCBvPWVbMF0ubGVuZ3RoO2Zvcih2YXIgcz1uZXcgQXJyYXkobiksaT1uZXcgQXJyYXkobiksdT0wO3U8bjt1Kyspe3NbdV09bmV3IEFycmF5KG8pLGlbdV09MDtmb3IodmFyIGE9MDthPG87YSsrKXNbdV1bYV09MH1mb3IodmFyIGg9MDtoPGUubGVuZ3RoO2grKyl7aVtyW2hdXSsrO2Zvcih2YXIgbD0wO2w8bztsKyspc1tyW2hdXVtsXSs9ZVtoXVtsXX1mb3IodmFyIGM9MDtjPG47YysrKWZvcih2YXIgZj0wO2Y8bztmKyspaVtjXT9zW2NdW2ZdLz1pW2NdOnNbY11bZl09dFtjXVtmXTtyZXR1cm4gc30odCxlLHI9WG4oZSx0LHIsby5kaXN0YW5jZUZ1bmN0aW9uKSxuKSx1PWZ1bmN0aW9uKHQsZSxyLG4pe2Zvcih2YXIgbz0wO288dC5sZW5ndGg7bysrKWlmKHIodFtvXSxlW29dKT5uKXJldHVybiExO3JldHVybiEwfShpLHQsby5kaXN0YW5jZUZ1bmN0aW9uLG8udG9sZXJhbmNlKTtyZXR1cm4gbmV3IG9vKHIsaSx1LHMsby5kaXN0YW5jZUZ1bmN0aW9uKX1mdW5jdGlvbiB1byh0LGUscil7aWYocj1PYmplY3QuYXNzaWduKHt9LHNvLHIpLGU8PTB8fGU+dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKGUpKXRocm93IG5ldyBFcnJvcigiSyBzaG91bGQgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHNtYWxsZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHBvaW50cyIpO3ZhciBuO2lmKEFycmF5LmlzQXJyYXkoci5pbml0aWFsaXphdGlvbikpe2lmKHIuaW5pdGlhbGl6YXRpb24ubGVuZ3RoIT09ZSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBpbml0aWFsIGNlbnRlcnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIEsiKTtuPXIuaW5pdGlhbGl6YXRpb259ZWxzZSBzd2l0Y2goci5pbml0aWFsaXphdGlvbil7Y2FzZSJrbWVhbnMrKyI6bj1mdW5jdGlvbih0LGUscj17fSl7Y29uc3Qgbj0odD1uZXcgVmUodCkpLnJvd3Msbz1uZXcgUW4oci5zZWVkKSxzPVtdLGk9ci5sb2NhbFRyaWFsc3x8MitNYXRoLmZsb29yKE1hdGgubG9nKGUpKSx1PW8ucmFuZEludChuKTtzLnB1c2godC5nZXRSb3codSkpO2xldCBhPW5ldyBWZSgxLHQucm93cyk7Zm9yKGxldCBlPTA7ZTx0LnJvd3M7ZSsrKWEuc2V0KDAsZSxHbih0LmdldFJvdyhlKSxzWzBdKSk7bGV0IGg9W3JvKGEuZ2V0Um93KDApKV07Y29uc3QgbD0xL2hbMF1bbi0xXTtsZXQgYz1WZS5tdWwoYSxsKTtmb3IobGV0IHI9MTtyPGU7cisrKXtjb25zdCBlPW8uY2hvaWNlKG4se3JlcGxhY2U6ITAsc2l6ZTppLHByb2JhYmlsaXRpZXM6Y1swXX0pLHU9dG8odC5zZWxlY3Rpb24oZSxlbyh0LmNvbHVtbnMpKSx0KTtsZXQgbCxmLG07Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgcj1WZS5taW4oYSxbdS5nZXRSb3codCldKSxuPXIuc3VtKCk7KHZvaWQgMD09PWx8fG48ZikmJihsPWVbdF0sZj1uLG09cil9c1tyXT10LmdldFJvdyhsKSxhPW0saD1bcm8oYS5nZXRSb3coMCkpXSxjPVZlLm11bChhLDEvaFswXVtuLTFdKX1yZXR1cm4gc30odCxlLHIpO2JyZWFrO2Nhc2UicmFuZG9tIjpuPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gbmV3IFFuKHIpLmNob2ljZSh0LHtzaXplOmV9KX0odCxlLHIuc2VlZCk7YnJlYWs7Y2FzZSJtb3N0RGlzdGFudCI6bj1mdW5jdGlvbih0LGUscixuKXtjb25zdCBvPW5ldyBRbihuKTt2YXIgcz1uZXcgQXJyYXkoZSk7aWYoc1swXT1NYXRoLmZsb29yKG8ucmFuZG9tKCkqdC5sZW5ndGgpLGU+MSl7Zm9yKHZhciBpPXtkaXN0Oi0xLGluZGV4Oi0xfSx1PTA7dTx0Lmxlbmd0aDsrK3UpcltzWzBdXVt1XT5pLmRpc3QmJihpLmRpc3Q9cltzWzBdXVt1XSxpLmluZGV4PXUpO2lmKHNbMV09aS5pbmRleCxlPjIpZm9yKHZhciBhPTI7YTxlOysrYSl7Zm9yKHZhciBoPXtkaXN0Oi0xLGluZGV4Oi0xfSxsPTA7bDx0Lmxlbmd0aDsrK2wpe2Zvcih2YXIgYz17ZGlzdDpOdW1iZXIuTUFYX1ZBTFVFLGluZGV4Oi0xfSxmPTA7ZjxhOysrZilyW2ZdW2xdPGMuZGlzdCYmLTE9PT1zLmluZGV4T2YobCkmJihjPXtkaXN0OnJbZl1bbF0saW5kZXg6bH0pO2MuZGlzdCE9PU51bWJlci5NQVhfVkFMVUUmJmMuZGlzdD5oLmRpc3QmJihoPU9iamVjdC5hc3NpZ24oe30sYykpfXNbYV09aC5pbmRleH19cmV0dXJuIHMubWFwKChlPT50W2VdKSl9KHQsZSxmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1uZXcgQXJyYXkodC5sZW5ndGgpLG49MDtuPHQubGVuZ3RoOysrbilmb3IodmFyIG89bjtvPHQubGVuZ3RoOysrbyl7cltuXXx8KHJbbl09bmV3IEFycmF5KHQubGVuZ3RoKSkscltvXXx8KHJbb109bmV3IEFycmF5KHQubGVuZ3RoKSk7Y29uc3Qgcz1lKHRbbl0sdFtvXSk7cltuXVtvXT1zLHJbb11bbl09c31yZXR1cm4gcn0odCxyLmRpc3RhbmNlRnVuY3Rpb24pLHIuc2VlZCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gaW5pdGlhbGl6YXRpb24gbWV0aG9kOiAiJHtyLmluaXRpYWxpemF0aW9ufSJgKX0wPT09ci5tYXhJdGVyYXRpb25zJiYoci5tYXhJdGVyYXRpb25zPU51bWJlci5NQVhfVkFMVUUpO3ZhciBvPW5ldyBBcnJheSh0Lmxlbmd0aCk7aWYoci53aXRoSXRlcmF0aW9ucylyZXR1cm4gZnVuY3Rpb24qKHQsZSxyLG4sbyl7Zm9yKHZhciBzLGk9ITEsdT0wOyFpJiZ1PG8ubWF4SXRlcmF0aW9uczspcz1pbyh0LGUscixuLG8sKyt1KSx5aWVsZCBzLmNvbXB1dGVJbmZvcm1hdGlvbihlKSxpPXMuY29udmVyZ2VkLHQ9cy5jZW50cm9pZHN9KG4sdCxvLGUscik7Zm9yKHZhciBzLGk9ITEsdT0wOyFpJiZ1PHIubWF4SXRlcmF0aW9uczspaT0ocz1pbyhuLHQsbyxlLHIsKyt1KSkuY29udmVyZ2VkLG49cy5jZW50cm9pZHM7cmV0dXJuIHMuY29tcHV0ZUluZm9ybWF0aW9uKHQpfWZ1bmN0aW9uIGFvKHQsZT17fSl7bGV0IHI9Q3QoZSwia051bWJlciIpO3I9ZG4ocik/T24ocik6MjtsZXQgbixvPUN0KGUsIm1vZGUiKTtpZigiay1tZWRvaWRzIiE9PW8mJiJrLW1lYW5zIiE9PW8mJihvPSJrLW1lZG9pZHMiKSwiay1tZWRvaWRzIj09PW8pbj1mdW5jdGlvbih0LGUpe2xldCByPXt9O2Z1bmN0aW9uIG4odCl7cmV0dXJuIHpuKHQsIjoiKX1icih0LCgodCxlKT0+e2xldCBvPW4odCk7cltvXT1lfSkpO2xldCBvPUJuLkNsdXN0ZXJlci5nZXRJbnN0YW5jZSh0LGUpLmdldENsdXN0ZXJlZERhdGEoKTtyZXR1cm4gbz1tbihvLCh0PT5tbih0LCh0PT57bGV0IGU9bih0KTtyZXR1cm4gcltlXX0pKSkpLG99KHQscik7ZWxzZXtpZigiay1tZWFucyIhPT1vKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBtb2RlIik7bj1mdW5jdGlvbih0LGUpe2xldCByPXVvKHQsZSksbj17fTtyZXR1cm4gYnIoci5jbHVzdGVycywoKHQsZSk9PntuW3RdfHwoblt0XT1bXSksblt0XS5wdXNoKGUpfSkpLHBuKG4pfSh0LHIpfXJldHVybiBufWZ1bmN0aW9uIGhvKHQsZT17fSl7aWYoIWRlKHQpKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3QgZWZmLiBhcnJheSIpO2xldCByPUN0KGUsImtOdW1iZXIiKTtyPWRuKHIpP09uKHIpOjI7bGV0IG49Q3QoZSwibkNvbXBOSVBBTFMiKTtuPWRuKG4pP09uKG4pOjI7bGV0IG89Q3QoZSwibW9kZSIpLHM9IiIsaT1sZSh0KSx1PTAsYT0wO2lmKGJyKHQsKHQ9PnshZnVuY3Rpb24odCl7aWYoZ2UodCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiEwO3JldHVybiExfXJldHVybiExfSh0KT9kZSh0KSYmKGErPTEpOnUrPTF9KSksdT09PWkpcz0ib2JqIjtlbHNle2lmKGEhPT1pKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3Qgb2YgdGhlIHNhbWUgdHlwZSIpO3M9Im1hdCJ9bGV0IGgsbD1udWxsOyJvYmoiPT09cz8obD1mdW5jdGlvbih0KXtsZXQgZT17fTticih0LCh0PT57YnIodCwoKHQscik9PntlW3JdfHwoZVtyXT0wKSwwPT09ZVtyXSYmZG4odCkmJihlW3JdPTEpLDEhPT1lW3JdfHxkbih0KXx8KGVbcl09LTEpfSkpfSkpO2xldCByPVtdO3JldHVybiBicihlLCgodCxlKT0+ezE9PT10JiZyLnB1c2goZSl9KSkscn0odCksaD1mdW5jdGlvbih0LGUpe3JldHVybiBtbih0LCh0PT57bGV0IHI9Ym4odCxlKTtyZXR1cm4gcG4ocil9KSl9KHQsbCkpOmg9dDtsZXQgYz1XZShoLHtuQ29tcE5JUEFMUzpufSksZj1hbyhjLHtrTnVtYmVyOnIsbW9kZTpvfSksbT1tbihmLCh0PT5tbih0LCh0PT5jW3RdKSkpKTtyZXR1cm57a2V5czpsLGdpbmRzOmYsZ2x0ZHQ6bW4oZiwoZT0+bW4oZSwoZT0+dFtlXSkpKSksZ21hdDptfX1sZXQgV0NsdXN0ZXI9e1BDQTphc3luYyBmdW5jdGlvbih0LGU9e30pe3JldHVybiBXZSh0LGUpfSxjbHVzdGVyOmFzeW5jIGZ1bmN0aW9uKHQsZT17fSl7dHJ5e3JldHVybiBobyh0LGUpfWNhdGNoKHQpe3JldHVybiBQcm9taXNlLnJlamVjdCh0KX19fTsKCmxldCBpbnN0YW5jZSA9IG51bGwKZnVuY3Rpb24gaW5pdChpbnB1dCl7CgogICAgLy9pbml0CiAgICBsZXQgcgogICAgCiAgICAgICAgciA9IFdDbHVzdGVyKC4uLmlucHV0KQogICAgICAgIAoKICAgIC8vb24KICAgIAoKICAgIC8vc2F2ZQogICAgaW5zdGFuY2UgPSByCgp9CgpmdW5jdGlvbiBzZW5kTWVzc2FnZShkYXRhKSB7CiAgICAKICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKGRhdGEpCiAgICAgICAgCn0KCmFzeW5jIGZ1bmN0aW9uIHJ1bihkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJ1bicsZGF0YSkKCiAgICAvL21vZGUKICAgIGxldCBtb2RlID0gZGF0YS5tb2RlCgogICAgLy9jaGVjawogICAgaWYobW9kZSAhPT0gJ2luaXQnICYmIG1vZGUgIT09ICdjYWxsJyl7CiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgLy9pbml0CiAgICBpZihtb2RlID09PSAnaW5pdCcpewogICAgICAgIAogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vdHlwZQogICAgICAgICAgICBsZXQgdHlwZSA9IGRhdGEudHlwZQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CiAgICAKICAgICAgICAgICAgLy9pbnN0YW5jZQogICAgICAgICAgICBpZih0eXBlID09PSAnZnVuY3Rpb24nKXsKICAgICAgICAgICAgICAgIGluaXQoLi4uaW5wdXQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZih0eXBlID09PSAnb2JqZWN0Jyl7CiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IFdDbHVzdGVyCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgCiAgICAgICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgICAgIG1vZGU6ICdlbWl0JywKICAgICAgICAgICAgICAgIGV2TmFtZTogJ2Vycm9yJywKICAgICAgICAgICAgICAgIG1zZzogZXJyLAogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICAgICAgfQogICAgICAgICAgICAKICAgIH0KCiAgICAvL2NoZWNrCiAgICBpZihtb2RlID09PSAnY2FsbCcpewogICAgICAgIGxldCBzdGF0ZSA9ICcnCiAgICAgICAgbGV0IG1zZyA9IG51bGwKCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy9mdW4KICAgICAgICAgICAgbGV0IGZ1biA9IGluc3RhbmNlW2RhdGEuZnVuXQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CgogICAgICAgICAgICAvL2V4ZWMKICAgICAgICAgICAgYXdhaXQgZnVuKC4uLmlucHV0KQogICAgICAgICAgICAgICAgLnRoZW4oKHN1YykgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdzdWNjZXNzJwogICAgICAgICAgICAgICAgICAgIG1zZz1zdWMKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdlcnJvcicKICAgICAgICAgICAgICAgICAgICBtc2c9ZXJyCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAgICAgc3RhdGUgPSAnZXJyb3InCiAgICAgICAgICAgIG1zZyA9IGVycgogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgbW9kZTogJ3JldHVybicsCiAgICAgICAgICAgIGlkOiBkYXRhLmlkLAogICAgICAgICAgICBmdW46IGRhdGEuZnVuLAogICAgICAgICAgICBzdGF0ZSwKICAgICAgICAgICAgbXNnLAogICAgICAgIH0KICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgfQoKfQoKZnVuY3Rpb24gcmVjdk1lc3NhZ2UoZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciByZWN2OicsIGRhdGEpCgogICAgLy9kYXRhUmVjdgogICAgbGV0IGRhdGFSZWN2ID0gZGF0YQoKICAgIC8vcnVuCiAgICBydW4oZGF0YVJlY3YpCgp9CgoKICAgICAgICBzZWxmLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHJlY3ZNZXNzYWdlKGUuZGF0YSkKICAgICAgICB9CiAgICAgICAgCgo=");function G(){var l=d();function Z(d){try{var l=new Blob([d]),c=window.URL||window.webkitURL;return new Worker(c.createObjectURL(l))}catch(d){i(d)}}var G=Z(X);if(!G)return i("invalid worker"),null;function y(){G?(G.terminate(),G=void 0):i("worker has been terminated")}function m(){var d={mode:"init",type:"object",input:Array.prototype.slice.call(arguments)};G.postMessage(d)}function K(){var d=c(),Z=b(),X={mode:"call",id:Z,fun:"PCA",input:Array.prototype.slice.call(arguments)};return G.postMessage(X),l.once(Z,(function(l){"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d}function p(){var d=c(),Z=b(),X={mode:"call",id:Z,fun:"cluster",input:Array.prototype.slice.call(arguments)};return G.postMessage(X),l.once(Z,(function(l){"success"===l.state?d.resolve(l.msg):d.reject(l.msg)})),d}function t(d){var c=d,b=c.mode;"emit"!==b&&"return"!==b||("emit"===b&&l.emit(c.evName,c.msg),"return"===b&&l.emit(c.id,c))}function i(d){l.emit("error",d)}return G.onmessage=function(d){t(d.data)},G.onerror=i,m(Array.prototype.slice.call(arguments)),l.PCA=K,l.cluster=p,l.terminate=y,l}var y,p,t={PCA:(p=Z(K.mark((function d(){var c,b,Z,X=arguments;return K.wrap((function(d){for(;;)switch(d.prev=d.next){case 0:return c=Array.prototype.slice.call(X),b=G(),d.next=4,b.PCA.apply(b,l(c)).finally((function(){b.terminate()}));case 4:return Z=d.sent,d.abrupt("return",Z);case 6:case"end":return d.stop()}}),d)}))),function(){return p.apply(this,arguments)}),cluster:(y=Z(K.mark((function d(){var c,b,Z,X=arguments;return K.wrap((function(d){for(;;)switch(d.prev=d.next){case 0:return c=Array.prototype.slice.call(X),b=G(),d.next=4,b.cluster.apply(b,l(c)).finally((function(){b.terminate()}));case 4:return Z=d.sent,d.abrupt("return",Z);case 6:case"end":return d.stop()}}),d)}))),function(){return y.apply(this,arguments)})};for(var i in m=d(),t){var u=t[i];m[i]=u}}(),m}()}));return"undefined"!=typeof window&&void 0!==window.document?G:X}));
|